[OpenLayers-Commits] r12009 - in sandbox/tschaub/editing: . build doc examples lib lib/OpenLayers lib/OpenLayers/Control lib/OpenLayers/Format/CSWGetRecords lib/OpenLayers/Format/Filter lib/OpenLayers/Format/WFSCapabilities lib/OpenLayers/Format/WMSCapabilities lib/OpenLayers/Handler lib/OpenLayers/Lang lib/OpenLayers/Layer lib/OpenLayers/Renderer lib/OpenLayers/Tile tests tests/Control tests/Format/CSWGetRecords tests/Format/Filter tests/Format/WMSCapabilities tests/Handler tests/Layer tests/Renderer tests/Tile theme/default tools

commits-20090109 at openlayers.org commits-20090109 at openlayers.org
Wed May 25 14:53:35 EDT 2011


Author: tschaub
Date: 2011-05-25 11:53:34 -0700 (Wed, 25 May 2011)
New Revision: 12009

Added:
   sandbox/tschaub/editing/examples/google-ng.html
   sandbox/tschaub/editing/examples/google-ng.js
   sandbox/tschaub/editing/lib/OpenLayers/Lang/lt.js
   sandbox/tschaub/editing/lib/OpenLayers/Layer/GoogleNG.js
   sandbox/tschaub/editing/lib/OpenLayers/Tile/Google.js
   sandbox/tschaub/editing/tests/Control/EditingToolbar.html
   sandbox/tschaub/editing/tests/Layer/GoogleNG.html
   sandbox/tschaub/editing/tests/Tile/Google.html
   sandbox/tschaub/editing/tools/branch.sh
   sandbox/tschaub/editing/tools/rc.sh
Removed:
   sandbox/tschaub/editing/news.txt
Modified:
   sandbox/tschaub/editing/
   sandbox/tschaub/editing/build/license.txt
   sandbox/tschaub/editing/doc/authors.txt
   sandbox/tschaub/editing/examples/google-v3.html
   sandbox/tschaub/editing/examples/navtoolbar-alwaysZoom.html
   sandbox/tschaub/editing/examples/wfs-protocol-transactions.html
   sandbox/tschaub/editing/examples/wfs-protocol-transactions.js
   sandbox/tschaub/editing/examples/wfs-snap-split.html
   sandbox/tschaub/editing/lib/OpenLayers.js
   sandbox/tschaub/editing/lib/OpenLayers/Control/EditingToolbar.js
   sandbox/tschaub/editing/lib/OpenLayers/Control/NavToolbar.js
   sandbox/tschaub/editing/lib/OpenLayers/Control/Navigation.js
   sandbox/tschaub/editing/lib/OpenLayers/Control/Panel.js
   sandbox/tschaub/editing/lib/OpenLayers/Control/TransformFeature.js
   sandbox/tschaub/editing/lib/OpenLayers/Events.js
   sandbox/tschaub/editing/lib/OpenLayers/Format/CSWGetRecords/v2_0_2.js
   sandbox/tschaub/editing/lib/OpenLayers/Format/Filter/v1_0_0.js
   sandbox/tschaub/editing/lib/OpenLayers/Format/Filter/v1_1_0.js
   sandbox/tschaub/editing/lib/OpenLayers/Format/WFSCapabilities/v1_0_0.js
   sandbox/tschaub/editing/lib/OpenLayers/Format/WMSCapabilities/v1.js
   sandbox/tschaub/editing/lib/OpenLayers/Handler/Feature.js
   sandbox/tschaub/editing/lib/OpenLayers/Handler/Path.js
   sandbox/tschaub/editing/lib/OpenLayers/Handler/Point.js
   sandbox/tschaub/editing/lib/OpenLayers/Layer/Bing.js
   sandbox/tschaub/editing/lib/OpenLayers/Layer/WMS.js
   sandbox/tschaub/editing/lib/OpenLayers/Renderer/Canvas.js
   sandbox/tschaub/editing/lib/OpenLayers/Tile.js
   sandbox/tschaub/editing/lib/OpenLayers/Util.js
   sandbox/tschaub/editing/license.txt
   sandbox/tschaub/editing/tests/Control/NavToolbar.html
   sandbox/tschaub/editing/tests/Control/Navigation.html
   sandbox/tschaub/editing/tests/Control/Panel.html
   sandbox/tschaub/editing/tests/Control/TransformFeature.html
   sandbox/tschaub/editing/tests/Format/CSWGetRecords/v2_0_2.html
   sandbox/tschaub/editing/tests/Format/CSWGetRecords/v2_0_2.js
   sandbox/tschaub/editing/tests/Format/Filter/v1_1_0.html
   sandbox/tschaub/editing/tests/Format/WMSCapabilities/v1_1_1.html
   sandbox/tschaub/editing/tests/Handler/Feature.html
   sandbox/tschaub/editing/tests/Handler/Path.html
   sandbox/tschaub/editing/tests/Handler/Polygon.html
   sandbox/tschaub/editing/tests/Layer/Vector.html
   sandbox/tschaub/editing/tests/Layer/WMS.html
   sandbox/tschaub/editing/tests/Renderer/Canvas.html
   sandbox/tschaub/editing/tests/Util.html
   sandbox/tschaub/editing/tests/list-tests.html
   sandbox/tschaub/editing/theme/default/style.css
   sandbox/tschaub/editing/tools/release.sh
Log:
Merge r11940:12008 from trunk.


Property changes on: sandbox/tschaub/editing
___________________________________________________________________
Modified: svn:mergeinfo
   - /sandbox/roberthl/openlayers:9745-9748
   + /sandbox/roberthl/openlayers:9745-9748
/trunk/openlayers:11940-12008

Modified: sandbox/tschaub/editing/build/license.txt
===================================================================
--- sandbox/tschaub/editing/build/license.txt	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/build/license.txt	2011-05-25 18:53:34 UTC (rev 12009)
@@ -2,7 +2,7 @@
 
   OpenLayers.js -- OpenLayers Map Viewer Library
 
-  Copyright 2005-2011 OpenLayers Contributors, released under the Clear BSD
+  Copyright 2005-2011 OpenLayers Contributors, released under the FreeBSD
   license. Please see http://svn.openlayers.org/trunk/openlayers/license.txt
   for the full text of the license.
 

Modified: sandbox/tschaub/editing/doc/authors.txt
===================================================================
--- sandbox/tschaub/editing/doc/authors.txt	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/doc/authors.txt	2011-05-25 18:53:34 UTC (rev 12009)
@@ -1,8 +1,11 @@
 OpenLayers contributors:
 
+Antoine Abt
 Mike Adair
 Jeff Adams
 Seb Benthall
+Bruno Binet
+Stéphane Brunner
 Howard Butler
 Bertil Chaupis                                                               
 John Cole
@@ -17,7 +20,9 @@
 Pierre Giraud
 Ivan Grcic
 Andreas Hocevar
+Marc Jansen
 Ian Johnson
+Frédéric Junod
 Eric Lemoine
 Philip Lindsay
 Martijn van Oosterhout

Copied: sandbox/tschaub/editing/examples/google-ng.html (from rev 12008, trunk/openlayers/examples/google-ng.html)
===================================================================
--- sandbox/tschaub/editing/examples/google-ng.html	                        (rev 0)
+++ sandbox/tschaub/editing/examples/google-ng.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+    <head>
+    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" />
+    <meta name="apple-mobile-web-app-capable" content="yes" />
+        <title>OpenLayers Google NG 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">
+        <style type="text/css">
+        .olControlAttribution {
+            left: 5px;
+            right: inherit;
+            bottom: 5px; 
+        }
+        </style>
+        <script src="http://maps.google.com/maps/api/js?v=3.5&amp;sensor=false"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="google-ng.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Google NG Layer Example</h1>
+        <div id="tags">
+            Google, api key, apikey
+        </div>
+        <p id="shortdesc">
+            Demonstrate use of tiles from the Google Maps v3 API.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>
+                If you use OpenLayers.Layer.GoogleNG, the getTile method of the
+                GMaps v3 API's MapType is used to load tiles.  This allows for
+                better integration than interacting with a whole map generated
+                by a google.maps.Map instance, as done with
+                OpenLayers.Layer.Google.  See the
+                <a href="google-ng.js" target="_blank">google-ng.js source</a> 
+                to see how this is done.
+            </p>
+        </div>
+    </body>
+</html>

Copied: sandbox/tschaub/editing/examples/google-ng.js (from rev 12008, trunk/openlayers/examples/google-ng.js)
===================================================================
--- sandbox/tschaub/editing/examples/google-ng.js	                        (rev 0)
+++ sandbox/tschaub/editing/examples/google-ng.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -0,0 +1,28 @@
+var map;
+
+function init() {
+    map = new OpenLayers.Map('map');
+    map.addControl(new OpenLayers.Control.LayerSwitcher());
+    
+    var gphy = new OpenLayers.Layer.GoogleNG(
+        {type: google.maps.MapTypeId.TERRAIN}
+    );
+    var gmap = new OpenLayers.Layer.GoogleNG(
+        // ROADMAP, the default
+    );
+    var ghyb = new OpenLayers.Layer.GoogleNG(
+        {type: google.maps.MapTypeId.HYBRID}
+    );
+    var gsat = new OpenLayers.Layer.GoogleNG(
+        {type: google.maps.MapTypeId.SATELLITE}
+    );
+
+    map.addLayers([gphy, gmap, ghyb, gsat]);
+
+    // GoogleNG 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);
+}

Modified: sandbox/tschaub/editing/examples/google-v3.html
===================================================================
--- sandbox/tschaub/editing/examples/google-v3.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/examples/google-v3.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -7,7 +7,7 @@
         <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?v=3.3&amp;sensor=false"></script>
+        <script src="http://maps.google.com/maps/api/js?v=3.5&amp;sensor=false"></script>
         <script src="../lib/OpenLayers.js"></script>
         <script src="google-v3.js"></script>
     </head>

Modified: sandbox/tschaub/editing/examples/navtoolbar-alwaysZoom.html
===================================================================
--- sandbox/tschaub/editing/examples/navtoolbar-alwaysZoom.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/examples/navtoolbar-alwaysZoom.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -47,7 +47,7 @@
 				     */
 				    draw: function() {
 				        var div = OpenLayers.Control.Panel.prototype.draw.apply(this, arguments);
-				        this.activateControl(this.controls[0]);
+                        this.defaultControl = this.controls[0];
 				        return div;
 				    }
 				});

Modified: sandbox/tschaub/editing/examples/wfs-protocol-transactions.html
===================================================================
--- sandbox/tschaub/editing/examples/wfs-protocol-transactions.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/examples/wfs-protocol-transactions.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -85,10 +85,13 @@
             <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.
+                save your changes.
             </p>
             <p>
+                To deactivate "drawing" or "modifying" depress the
+                corresponding button.
+            </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>        

Modified: sandbox/tschaub/editing/examples/wfs-protocol-transactions.js
===================================================================
--- sandbox/tschaub/editing/examples/wfs-protocol-transactions.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/examples/wfs-protocol-transactions.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -43,7 +43,8 @@
         maxExtent: new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508),
         restrictedExtent: extent,
         controls: [
-            new OpenLayers.Control.PanZoom()
+            new OpenLayers.Control.PanZoom(),
+            new OpenLayers.Control.Navigation()
         ]
     });
     var gphy = new OpenLayers.Layer.Google(
@@ -69,12 +70,9 @@
    
     map.addLayers([gphy, wfs]);
 
-    var panel = new OpenLayers.Control.Panel(
-        {'displayClass': 'customEditingToolbar'}
-    );
-    
-    var navigate = new OpenLayers.Control.Navigation({
-        title: "Pan Map"
+    var panel = new OpenLayers.Control.Panel({
+        displayClass: 'customEditingToolbar',
+        allowDepress: true
     });
     
     var draw = new OpenLayers.Control.DrawFeature(
@@ -104,8 +102,7 @@
         displayClass: "olControlSaveFeatures"
     });
 
-    panel.addControls([navigate, save, del, edit, draw]);
-    panel.defaultControl = navigate;
+    panel.addControls([save, del, edit, draw]);
     map.addControl(panel);
     map.zoomToExtent(extent, true);
 }

Modified: sandbox/tschaub/editing/examples/wfs-snap-split.html
===================================================================
--- sandbox/tschaub/editing/examples/wfs-snap-split.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/examples/wfs-snap-split.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -107,7 +107,8 @@
                 projection: new OpenLayers.Projection("EPSG:900913"),
                 units: "m",
                 controls: [
-                    new OpenLayers.Control.PanZoom()
+                    new OpenLayers.Control.PanZoom(),
+                    new OpenLayers.Control.Navigation()
                 ]
             });
 
@@ -203,9 +204,10 @@
             split.activate();
 
             // add some editing tools to a panel
-            var panel = new OpenLayers.Control.Panel(
-                {displayClass: 'customEditingToolbar'}
-            );
+            var panel = new OpenLayers.Control.Panel({
+                displayClass: 'customEditingToolbar',
+                allowDepress: true
+            });
             var draw = new OpenLayers.Control.DrawFeature(
                 wfs, OpenLayers.Handler.Path,
                 {
@@ -233,11 +235,9 @@
 
 
             panel.addControls([
-                new OpenLayers.Control.Navigation(),
                 save, del, modify, draw
             ]);
             
-            panel.defaultControl = panel.controls[0];
             map.addControl(panel);
             map.setCenter(new OpenLayers.LonLat(-11561460.5, 5541773), 15);
         }
@@ -280,8 +280,9 @@
         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>
+        save your changes.</p>
+        <p>To deactivate "drawing" or "modifying" depress the corresponding
+        button.</p>
     </div>
 
 </body>

Modified: sandbox/tschaub/editing/lib/OpenLayers/Control/EditingToolbar.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Control/EditingToolbar.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Control/EditingToolbar.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -55,7 +55,9 @@
      */
     draw: function() {
         var div = OpenLayers.Control.Panel.prototype.draw.apply(this, arguments);
-        this.activateControl(this.controls[0]);
+        if (this.defaultControl === null) {
+            this.defaultControl = this.controls[0];
+        }
         return div;
     },
 

Modified: sandbox/tschaub/editing/lib/OpenLayers/Control/NavToolbar.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Control/NavToolbar.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Control/NavToolbar.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -47,7 +47,9 @@
      */
     draw: function() {
         var div = OpenLayers.Control.Panel.prototype.draw.apply(this, arguments);
-        this.activateControl(this.controls[0]);
+        if (this.defaultControl === null) {
+            this.defaultControl = this.controls[0];
+        }
         return div;
     },
 

Modified: sandbox/tschaub/editing/lib/OpenLayers/Control/Navigation.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Control/Navigation.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Control/Navigation.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -38,6 +38,18 @@
     dragPanOptions: null,
 
     /**
+     * Property: pinchZoom
+     * {<OpenLayers.Control.PinchZoom>}
+     */
+    pinchZoom: null,
+
+    /**
+     * APIProperty: pinchZoomOptions
+     * {Object} Options passed to the PinchZoom control.
+     */
+    pinchZoomOptions: null,
+
+    /**
      * APIProperty: documentDrag
      * {Boolean} Allow panning of the map by dragging outside map viewport.
      *     Default is false.
@@ -124,6 +136,12 @@
             this.zoomBox.destroy();
         }
         this.zoomBox = null;
+
+        if (this.pinchZoom) {
+            this.pinchZoom.destroy();
+        }
+        this.pinchZoom = null;
+
         OpenLayers.Control.prototype.destroy.apply(this,arguments);
     },
     
@@ -139,6 +157,9 @@
         if (this.zoomBoxEnabled) {
             this.zoomBox.activate();
         }
+        if (this.pinchZoom) {
+            this.pinchZoom.activate();
+        }
         return OpenLayers.Control.prototype.activate.apply(this,arguments);
     },
 
@@ -146,6 +167,9 @@
      * Method: deactivate
      */
     deactivate: function() {
+        if (this.pinchZoom) {
+            this.pinchZoom.deactivate();
+        }
         this.zoomBox.deactivate();
         this.dragPan.deactivate();
         this.handlers.click.deactivate();
@@ -188,6 +212,11 @@
                                     this, {"up"  : this.wheelUp,
                                            "down": this.wheelDown},
                                     this.mouseWheelOptions );
+        if (OpenLayers.Control.PinchZoom) {
+            this.pinchZoom = new OpenLayers.Control.PinchZoom(
+                OpenLayers.Util.extend(
+                    {map: this.map}, this.pinchZoomOptions));
+        }
     },
 
     /**

Modified: sandbox/tschaub/editing/lib/OpenLayers/Control/Panel.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Control/Panel.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Control/Panel.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -47,6 +47,14 @@
     saveState: false,
       
     /**
+     * APIProperty: allowDepress
+     * {Boolean} If is true the <OpenLayers.Control.TYPE_TOOL> controls can 
+     *     be deactivated by clicking the icon that represents them.  Default 
+     *     is false.
+     */
+    allowDepress: false,
+    
+    /**
      * Property: activeState
      * {Object} stores the active state of this panel's controls.
      */
@@ -199,15 +207,19 @@
             }
             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();
+        if (this.allowDepress && control.active) {
+            control.deactivate();
+        } else {
+            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();
         }
-        control.activate();
     },
 
     /**

Modified: sandbox/tschaub/editing/lib/OpenLayers/Control/TransformFeature.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Control/TransformFeature.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Control/TransformFeature.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -232,6 +232,9 @@
             this.dragControl.deactivate();
             deactivated = true;
         }
+        if (deactivated) {
+        	this.unsetFeature();
+        }
         return deactivated;
     },
     
@@ -265,13 +268,15 @@
             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) {
+        var cont = this.events.triggerEvent("beforesetfeature",
+            {feature: feature}
+        );
+        if (cont === false) {
             return;
         }
 
@@ -303,10 +308,26 @@
         
         delete this._setfeature;
 
-        this.events.triggerEvent("setfeature", evt);
+        this.events.triggerEvent("setfeature", {feature: feature});
     },
     
     /**
+     * APIMethod: unsetFeature
+     * Remove the transformation box off any feature.
+     * If the control is active, it will be deactivated first.
+     */
+    unsetFeature: function() {
+    	if (this.active) {
+    		this.deactivate();
+    	} else {
+	    	this.feature = null;
+	    	this.rotation = 0;
+	    	this.scale = 1;
+	    	this.ratio = 1;
+    	}
+    },
+    
+    /**
      * Method: createBox
      * Creates the box with all handles and transformation handles.
      */

Modified: sandbox/tschaub/editing/lib/OpenLayers/Events.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Events.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Events.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -588,7 +588,7 @@
      * Example use:
      * (code)
      * // register a single listener for the "loadstart" event
-     * events.on({"loadstart", loadStartListener});
+     * events.on({"loadstart": loadStartListener});
      *
      * // this is equivalent to the following
      * events.register("loadstart", undefined, loadStartListener);
@@ -602,7 +602,7 @@
      *
      * // this is equivalent to the following
      * events.register("loadstart", object, loadStartListener);
-     * events.register("loadstart", object, loadEndListener);
+     * events.register("loadend", object, loadEndListener);
      * (end)
      *
      * Parameters:
@@ -695,7 +695,7 @@
      * Example use:
      * (code)
      * // unregister a single listener for the "loadstart" event
-     * events.un({"loadstart", loadStartListener});
+     * events.un({"loadstart": loadStartListener});
      *
      * // this is equivalent to the following
      * events.unregister("loadstart", undefined, loadStartListener);
@@ -709,7 +709,7 @@
      *
      * // this is equivalent to the following
      * events.unregister("loadstart", object, loadStartListener);
-     * events.unregister("loadstart", object, loadEndListener);
+     * events.unregister("loadend", object, loadEndListener);
      * (end)
      */
     un: function(object) {

Modified: sandbox/tschaub/editing/lib/OpenLayers/Format/CSWGetRecords/v2_0_2.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Format/CSWGetRecords/v2_0_2.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Format/CSWGetRecords/v2_0_2.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -27,12 +27,14 @@
      * {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"
+        geonet: "http://www.fao.org/geonetwork",
+        ogc: "http://www.opengis.net/ogc",
+        ows: "http://www.opengis.net/ows",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
     },
     
     /**
@@ -232,8 +234,19 @@
                 var record = {type: "Record"};
                 this.readChildNodes(node, record);
                 obj.records.push(record);
+            },
+            "*": function(node, obj) {
+                var name = node.localName || node.nodeName.split(":").pop();
+                obj[name] = this.getChildValue(node);
             }
         },
+        "geonet": {
+            "info": function(node, obj) {
+                var gninfo = {};
+                this.readChildNodes(node, gninfo);
+                obj.gninfo = gninfo;
+            }
+        },
         "dc": {
             // audience, contributor, coverage, creator, date, description, format,
             // identifier, language, provenance, publisher, relation, rights,
@@ -389,14 +402,13 @@
                         node
                     );
                 }
-                //TODO: not implemented in ogc filters?
-                //if (options.SortBy) {
-                    //this.writeNode(
-                        //"ogc:SortBy",
-                        //options.SortBy,
-                        //node
-                    //);
-                //}
+                if (options.SortBy) {
+                    this.writeNode(
+                        "ogc:SortBy",
+                        options.SortBy,
+                        node
+                    );
+                }
                 return node;
             },
             "ElementName": function(options) {
@@ -433,7 +445,8 @@
                 }
                 return node;
             }
-        }
+        },
+        "ogc": OpenLayers.Format.Filter.v1_1_0.prototype.writers["ogc"]
     },
    
     CLASS_NAME: "OpenLayers.Format.CSWGetRecords.v2_0_2" 

Modified: sandbox/tschaub/editing/lib/OpenLayers/Format/Filter/v1_0_0.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Format/Filter/v1_0_0.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Format/Filter/v1_0_0.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -130,11 +130,10 @@
                     box.setAttribute("srsName", filter.projection);
                 }
                 return node;
-            }}, OpenLayers.Format.Filter.v1.prototype.writers["ogc"]),
-            
+            }
+        }, OpenLayers.Format.Filter.v1.prototype.writers["ogc"]),
         "gml": OpenLayers.Format.GML.v2.prototype.writers["gml"],
         "feature": OpenLayers.Format.GML.v2.prototype.writers["feature"]
-        
     },
 
     /**

Modified: sandbox/tschaub/editing/lib/OpenLayers/Format/Filter/v1_1_0.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Format/Filter/v1_1_0.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Format/Filter/v1_1_0.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -146,8 +146,39 @@
                 }
                 node.appendChild(box); 
                 return node;
-            }}, OpenLayers.Format.Filter.v1.prototype.writers["ogc"]),
-            
+            },
+            "SortBy": function(sortProperties) {
+                var node = this.createElementNSPlus("ogc:SortBy");
+                for (var i=0,l=sortProperties.length;i<l;i++) {
+                    this.writeNode(
+                        "ogc:SortProperty",
+                        sortProperties[i],
+                        node
+                    );
+                }
+                return node;
+            }, 
+            "SortProperty": function(sortProperty) {
+                var node = this.createElementNSPlus("ogc:SortProperty");
+                this.writeNode(
+                    "ogc:PropertyName",
+                    sortProperty,
+                    node
+                );
+                this.writeNode(
+                    "ogc:SortOrder",
+                    (sortProperty.order == 'DESC') ? 'DESC' : 'ASC',
+                    node
+                );
+                return node;
+            },
+            "SortOrder": function(value) {
+                var node = this.createElementNSPlus("ogc:SortOrder", {
+                    value: value
+                });
+                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"]
     },

Modified: sandbox/tschaub/editing/lib/OpenLayers/Format/WFSCapabilities/v1_0_0.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Format/WFSCapabilities/v1_0_0.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Format/WFSCapabilities/v1_0_0.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -9,7 +9,7 @@
 
 /**
  * Class: OpenLayers.Format.WFSCapabilities/v1_0_0
- * Read WMS Capabilities version 1.0.0.
+ * Read WFS Capabilities version 1.0.0.
  * 
  * Inherits from:
  *  - <OpenLayers.Format.WFSCapabilities>

Modified: sandbox/tschaub/editing/lib/OpenLayers/Format/WMSCapabilities/v1.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Format/WMSCapabilities/v1.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Format/WMSCapabilities/v1.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -303,14 +303,17 @@
                 this.readChildNodes(node, obj);
             },
             "Get": function(node, obj) {
-                this.readChildNodes(node, obj);
+                obj.get = {};
+                this.readChildNodes(node, obj.get);
             },
             "Post": function(node, obj) {
-                this.readChildNodes(node, obj);
+                obj.post = {};
+                this.readChildNodes(node, obj.post);
             },
             "GetMap": function(node, obj) {
                 obj.getmap = {formats: []};
                 this.readChildNodes(node, obj.getmap);
+                obj.getmap.href = obj.getmap.get.href || obj.getmap.post.href; // backwards compatibility
             },
             "GetFeatureInfo": function(node, obj) {
                 obj.getfeatureinfo = {formats: []};

Modified: sandbox/tschaub/editing/lib/OpenLayers/Handler/Feature.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Handler/Feature.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Handler/Feature.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -147,7 +147,8 @@
                 scope: this
             });
         }
-        return this.mousedown(evt);
+        return OpenLayers.Event.isMultiTouch(evt) ?
+                true : this.mousedown(evt);
     },
 
     /**
@@ -271,7 +272,7 @@
         var type = evt.type;
         var handled = false;
         var previouslyIn = !!(this.feature); // previously in a feature
-        var click = (type == "click" || type == "dblclick");
+        var click = (type == "click" || type == "dblclick" || type == "touchstart");
         this.feature = this.layer.getFeatureFromEvent(evt);
         if(this.feature && !this.feature.layer) {
             // feature has been destroyed
@@ -282,7 +283,7 @@
             this.lastFeature = null;
         }
         if(this.feature) {
-            if(evt.type === "touchstart") {
+            if(type === "touchstart") {
                 // stop the event to prevent Android Webkit from
                 // "flashing" the map div
                 OpenLayers.Event.stop(evt);

Modified: sandbox/tschaub/editing/lib/OpenLayers/Handler/Path.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Handler/Path.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Handler/Path.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -36,6 +36,14 @@
     maxVertices: null,
 
     /**
+     * Property: doubleTouchTolerance
+     * {Number} Maximum number of pixels between two touches for
+     *     the gesture to be considered a "finalize feature" action.
+     *     Default is 20.
+     */
+    doubleTouchTolerance: 20,
+
+    /**
      * 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.
@@ -319,9 +327,9 @@
      */
     touchstart: function(evt) {
         if (this.timerId &&
-            this.passesTolerance(this.lastTouchPx, evt.xy, this.dblclickTolerance)) {
+            this.passesTolerance(this.lastTouchPx, evt.xy,
+                                 this.doubleTouchTolerance)) {
             // double-tap, finalize the geometry
-            this.lastTouchPx = evt.xy; // for up() to detect dblclick and do nothing
             this.finishGeometry();
             window.clearTimeout(this.timerId);
             this.timerId = null;
@@ -355,7 +363,9 @@
         if(this.freehandMode(evt)) {
             stopDown = true;
         }
-        if (!this.touch && (!this.lastDown || !this.passesTolerance(this.lastDown, evt.xy, this.pixelTolerance))) {
+        if (!this.touch && (!this.lastDown ||
+                            !this.passesTolerance(this.lastDown, evt.xy,
+                                                  this.pixelTolerance))) {
             this.modifyFeature(evt.xy, !!this.lastUp);
         }
         this.mouseDown = true;
@@ -401,13 +411,13 @@
      * {Boolean} Allow event propagation
      */
     up: function (evt) {
-        if (this.mouseDown && (!this.lastUp || !this.passesTolerance(
-                this.lastUp, evt.xy, this.dblclickTolerance))) {
+        if (this.mouseDown && (!this.lastUp || !this.lastUp.equals(evt.xy))) {
             if(this.stoppedDown && this.freehandMode(evt)) {
                 this.removePoint();
                 this.finalize();
             } else {
-                if (this.passesTolerance(this.lastDown, evt.xy, this.pixelTolerance)) {
+                if (this.passesTolerance(this.lastDown, evt.xy,
+                                         this.pixelTolerance)) {
                     if (this.touch) {
                         this.modifyFeature(evt.xy);
                     }

Modified: sandbox/tschaub/editing/lib/OpenLayers/Handler/Point.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Handler/Point.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Handler/Point.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -107,13 +107,6 @@
     pixelTolerance: 5,
 
     /**
-     * APIProperty: dblclickTolerance
-     * {Number} Maximum number of pixels between two touchend for an
-     *     event to be considered a dblclick.  Default is 20.
-     */
-    dblclickTolerance: 20,
-
-    /**
      * Property: touch
      * {Boolean} Indcates the support of touch events.
      */
@@ -526,8 +519,7 @@
             return true;
         }
         // ignore double-clicks
-        if (this.lastUp && this.passesTolerance(this.lastUp, evt.xy,
-                                                this.dblclickTolerance)) {
+        if (this.lastUp && this.lastUp.equals(evt.xy)) {
             return true;
         }
         if (this.lastDown && this.passesTolerance(this.lastDown, evt.xy,
@@ -564,13 +556,9 @@
     /**
      * 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, <pixelTolerance> and <dblclickTolerance> will have no effect
-     * here (this method will always return true).
      *
      * Returns:
-     * {Boolean} The click is within the pixel tolerance (if specified).
+     * {Boolean} The event is within the pixel tolerance (if specified).
      */
     passesTolerance: function(pixel1, pixel2, tolerance) {
         var passes = true;

Copied: sandbox/tschaub/editing/lib/OpenLayers/Lang/lt.js (from rev 12008, trunk/openlayers/lib/OpenLayers/Lang/lt.js)
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Lang/lt.js	                        (rev 0)
+++ sandbox/tschaub/editing/lib/OpenLayers/Lang/lt.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -0,0 +1,82 @@
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["lt"]
+ * Dictionary for Lithuanian.  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['lt'] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Neapdorota užklausa gražino ${statusText}",
+
+    'permalink': "Pastovi nuoroda",
+
+    'overlays': "Papildomi sluoksniai",
+
+    'baseLayer': "Pagrindinis sluoksnis",
+
+    'sameProjection':
+	"Apžvalginis žemėlapis veikia tik tada, kai jis yra tos pačios projekcijos kaip ir pagrindinis",
+
+    'readNotImplemented': "Skaitymas nėra įgyvendintas.",
+
+    'writeNotImplemented': "Rašymas nėra įgyvendintas.",
+
+    'noFID': "Negaliu atnaujinti objekto, kuris neturi FID.",
+
+    'errorLoadingGML': "Klaida užkraunant GML failą ${url}",
+
+    'browserNotSupported':
+	"Jūsų naršyklė nemoka parodyti vektorių. Šiuo metu galima naudotis tokiais rodymo varikliais:\n{renderers}",
+
+    'componentShouldBe': "addFeatures : komponentas turi būti ${geomType}",
+
+    // console message
+    'getFeatureError':
+	"getFeatureFromEvent buvo iškviestas sluoksniui, kuris neturi priskirto paišymo variklio. Tai paprastai nutinka, kai jūs pašalinate sluoksnį, bet paliekate su juo susijusį [handler]",
+
+    'commitSuccess': "WFS Tranzakcija: PAVYKO ${response}",
+
+    'commitFailed': "WFS Tranzakcija: ŽLUGO ${response}",
+
+    'scale': "Mastelis = 1 : ${scaleDenom}",
+    
+    //labels for the graticule control
+    'W': 'V',
+    'E': 'R',
+    'N': 'Š',
+    'S': 'P',
+    'graticule': 'Tinklelis',
+
+    // console message
+    'layerAlreadyAdded':
+        "Bandėte pridėti prie žemėlapio sluoksnį ${layerName}, tačiau jis jau yra pridėtas",
+
+    // console message
+    'methodDeprecated':
+	"Šis metodas yra pasenęs ir 3.0 versijoje bus pašalintas. " +
+	"Prašome naudoti ${newMethod}.",
+
+    // console message
+    'boundsAddError': "Add funkcijai reikia pateikti tiek x, tiek y reikšmes.",
+
+    // console message
+    'lonlatAddError': "Add funkcijai reikia pateikti tiek lon, tiek lat reikšmes",
+
+    // console message
+    'pixelAddError': "Add funkcijai būtina perduoti tiek x, tiek y reikšmes.",
+
+    // console message
+    'unsupportedGeometryType': "Nepalaikomas geometrijos tipas: ${geomType}",
+
+    // console message
+    'pagePositionFailed':
+        "OpenLayers.Util.pagePosition žlugo: elementas su id ${elemId} gali būti neteisingoje vietoje.",
+
+    // **** end ****
+    'end': ''
+    
+});

Modified: sandbox/tschaub/editing/lib/OpenLayers/Layer/Bing.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Layer/Bing.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Layer/Bing.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -11,7 +11,9 @@
  * Class: OpenLayers.Layer.Bing
  * Bing layer using direct tile access as provided by Bing Maps REST Services.
  * See http://msdn.microsoft.com/en-us/library/ff701713.aspx for more
- * information.
+ * information. Note: Terms of Service compliant use requires the map to be
+ * configured with an <OpenLayers.Control.Attribution> control and the
+ * attribution placed on or near the map.
  * 
  * Inherits from:
  *  - <OpenLayers.Layer.XYZ>

Copied: sandbox/tschaub/editing/lib/OpenLayers/Layer/GoogleNG.js (from rev 12008, trunk/openlayers/lib/OpenLayers/Layer/GoogleNG.js)
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Layer/GoogleNG.js	                        (rev 0)
+++ sandbox/tschaub/editing/lib/OpenLayers/Layer/GoogleNG.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -0,0 +1,239 @@
+/* Copyright (c) 2006-2011 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/XYZ.js
+ */
+
+/** 
+ * Class: OpenLayers.Layer.GoogleNG
+ * Google layer using <OpenLayers.Tile.Google> tiles. Note: Terms of Service
+ * compliant use requires the map to be configured with an
+ * <OpenLayers.Control.Attribution> control and the attribution placed on or
+ * near the map.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.XYZ>
+ */
+OpenLayers.Layer.GoogleNG = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+
+    /**
+     * Property: SUPPORTED_TRANSITIONS
+     * {Array} An immutable (that means don't change it!) list of supported 
+     *     transitionEffect values. This layer type supports none.
+     */
+    SUPPORTED_TRANSITIONS: [],
+    
+    /**
+     * Property: attributionTemplate
+     * {String}
+     */
+    attributionTemplate: '<span class="olGoogleAttribution ${mapType}">' +
+         '<div><a target="_blank" href="http://maps.google.com/maps?' +
+         'll=${center}&z=${zoom}&t=${t}"><img width="62" height="24" ' +
+         'src="http://maps.gstatic.com/mapfiles/google_white.png"/></a>' +
+         '</div><a style="white-space: nowrap" target="_blank" ' +
+         'href="http://maps.google.com/maps/api/staticmap?sensor=true' +
+         '&center=${center}&zoom=${zoom}&size=${size}&maptype=${mapType}">' +
+         'Map data</a> - <a style="white-space: nowrap" target="_blank" ' +
+         'href="http://www.google.com/help/terms_maps.html">' +
+         'Terms of Use</a></span>',
+    
+    /**
+     * Property: mapTypes
+     * {Object} mapping of {google.maps.MapTypeId} to the t param of
+     * http://maps.google.com/maps? permalinks
+     */
+    mapTypes: {
+        "roadmap": "m",
+        "satellite": "k",
+        "hybrid": "h",
+        "terrain": "p"
+    },
+    
+    /**
+     * Property: mapObject
+     * {google.maps.Map} Shared GMaps instance - will be set on the prototype
+     * upon instantiation of the 1st GoogleNG layer
+     */
+    mapObject: null,
+
+    /**
+     * APIProperty: type
+     * {google.maps.MapTypeId} See
+     * http://code.google.com/apis/maps/documentation/javascript/reference.html#MapTypeId
+     */
+    type: null,
+    
+    /**
+     * Constructor: OpenLayers.Layer.GoogleNG
+     * Create a new GoogleNG layer. Requires the GMaps v3 JavaScript API script
+     * included in the html document.
+     *
+     * Example:
+     * (code)
+     * var terrain = new OpenLayers.Layer.GoogleNG({
+     *     name: "Google Terrain",
+     *     type: google.maps.MapTypeId.TERRAIN
+     * });
+     * (end)
+     *
+     * Parameters:
+     * options - {Object} Configuration properties for the layer.
+     *
+     * Required configuration properties:
+     * type - {google.maps.MapTypeId} The layer identifier.  See
+     *     http://code.google.com/apis/maps/documentation/javascript/reference.html#MapTypeId
+     *     for valid types.
+     *
+     * Any other documented layer properties can be provided in the config object.
+     */
+    initialize: function(options) {
+        options = OpenLayers.Util.applyDefaults({
+            sphericalMercator: true
+        }, options);
+
+        if (!options.type) {
+            options.type = google.maps.MapTypeId.ROADMAP;
+        }
+        var newArgs = [options.name, null, options];
+        OpenLayers.Layer.XYZ.prototype.initialize.apply(this, newArgs);
+        
+        this.options.numZoomLevels = options.numZoomLevels;
+        if (!this.mapObject) {
+            OpenLayers.Layer.GoogleNG.prototype.mapObject =
+                new google.maps.Map(document.createElement("div"));
+        }
+        if (this.mapObject.mapTypes[this.type]) {
+            this.initLayer();
+        } else {
+            google.maps.event.addListenerOnce(
+                this.mapObject, 
+                "idle", 
+                OpenLayers.Function.bind(this.initLayer, this)
+            );
+        }
+    },
+
+    /**
+     * Method: initLayer
+     *
+     * Sets layer properties according to the metadata provided by the API
+     */
+    initLayer: function() {
+        var mapType = this.mapObject.mapTypes[this.type];
+        if (!this.name) {
+            this.setName("Google " + mapType.name);
+        }
+        
+        var numZoomLevels = mapType.maxZoom + 1;
+        if (this.options.numZoomLevels != null) {
+            numZoomLevels = Math.min(numZoomLevels, this.options.numZoomLevels);
+        }
+        var restrictedMinZoom;
+        if (this.restrictedMinZoom || mapType.minZoom) {
+            restrictedMinZoom = Math.max(
+                mapType.minZoom || 0, this.restrictedMinZoom || 0
+            );
+        }
+        
+        this.addOptions({
+            restrictedMinZoom: restrictedMinZoom,
+            numZoomLevels: numZoomLevels,
+            tileSize: new OpenLayers.Size(
+                mapType.tileSize.width, mapType.tileSize.height
+            )
+        });
+        // redraw to populate tiles with content
+        this.redraw();
+    },
+
+    /**
+     * APIMethod: addTile
+     * Create a tile, initialize it, and add it to the layer div. 
+     *
+     * Parameters
+     * bounds - {<OpenLayers.Bounds>}
+     * position - {<OpenLayers.Pixel>}
+     *
+     * Returns:
+     * {<OpenLayers.Tile.Google>} The added OpenLayers.Tile.Google
+     */
+    addTile:function(bounds, position) {
+        return new OpenLayers.Tile.Google(
+            this, position, bounds, this.tileOptions
+        );
+    },
+    
+    /**
+     * Method: updateAttribution
+     * Updates the attribution using the <attributionTemplate>
+     */
+    updateAttribution: function() {
+        var center = this.map.getCenter();
+        center && center.transform(
+            this.map.getProjectionObject(),
+            new OpenLayers.Projection("EPSG:4326")
+        );
+        var size = this.map.getSize();
+        this.attribution = OpenLayers.String.format(this.attributionTemplate, {
+            center: center ? center.lat + "," + center.lon : "",
+            zoom: this.map.getZoom(),
+            size: size.w + "x" + size.h,
+            t: this.mapTypes[this.type],
+            mapType: this.type
+        });
+        this.map && this.map.events.triggerEvent("changelayer", {layer: this});
+    },
+
+    /**
+     * Method: setMap
+     */
+    setMap: function() {
+        OpenLayers.Layer.XYZ.prototype.setMap.apply(this, arguments);
+
+        this.updateAttribution();
+        this.map.events.register("moveend", this, this.updateAttribution);
+    },
+    
+    /**
+     * Method: removeMap
+     */
+    removeMap: function() {
+        OpenLayers.Layer.XYZ.prototype.removeMap.apply(this, arguments);
+        this.map.events.unregister("moveend", this, this.updateAttribution);
+    },
+        
+    /**
+     * APIMethod: clone
+     * 
+     * Parameters:
+     * obj - {Object}
+     * 
+     * Returns:
+     * {<OpenLayers.Layer.GoogleNG>} An exact clone of this
+     * <OpenLayers.Layer.GoogleNG>
+     */
+    clone: function(obj) {
+        if (obj == null) {
+            obj = new OpenLayers.Layer.GoogleNG(this.options);
+        }
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.XYZ.prototype.clone.apply(this, [obj]);
+        // copy/set any non-init, non-simple values here
+        return obj;
+    },
+    
+    /**
+     * Method: destroy
+     */
+    destroy: function() {
+        this.map &&
+            this.map.events.unregister("moveend", this, this.updateAttribution);
+        OpenLayers.Layer.XYZ.prototype.destroy.apply(this, arguments);
+    },
+    
+    CLASS_NAME: "OpenLayers.Layer.GoogleNG"
+});
\ No newline at end of file

Modified: sandbox/tschaub/editing/lib/OpenLayers/Layer/WMS.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Layer/WMS.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Layer/WMS.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -245,6 +245,10 @@
         } else {
             this.params.SRS = value;
         }
+        
+        if (typeof this.params.TRANSPARENT == "boolean") {
+            newParams.TRANSPARENT = this.params.TRANSPARENT ? "TRUE" : "FALSE";
+        }
 
         return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(
                                                     this, arguments);

Modified: sandbox/tschaub/editing/lib/OpenLayers/Renderer/Canvas.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Renderer/Canvas.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Renderer/Canvas.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -145,8 +145,12 @@
             if (rendered) {
                 // keep track of what we have rendered for redraw
                 this.features[feature.id] = [feature, style];
-                this.pendingRedraw = true;
             }
+            else {
+                // remove from features tracked for redraw
+                delete(this.features[feature.id]);
+            }
+            this.pendingRedraw = true;
         }
         if (this.pendingRedraw && !this.locked) {
             this.redraw();
@@ -228,8 +232,8 @@
             var p0 = pt[0];
             var p1 = pt[1];
             if(!isNaN(p0) && !isNaN(p1)) {
-                var x = p0 + xOffset;
-                var y = p1 + yOffset;
+                var x = (p0 + xOffset) | 0;
+                var y = (p1 + yOffset) | 0;
                 var canvas = this.canvas;
                 canvas.globalAlpha = opacity;
                 var factor = OpenLayers.Renderer.Canvas.drawImageScaleFactor ||

Copied: sandbox/tschaub/editing/lib/OpenLayers/Tile/Google.js (from rev 12008, trunk/openlayers/lib/OpenLayers/Tile/Google.js)
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Tile/Google.js	                        (rev 0)
+++ sandbox/tschaub/editing/lib/OpenLayers/Tile/Google.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -0,0 +1,151 @@
+/* Copyright (c) 2006-2011 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/Util.js
+ * @requires OpenLayers/Console.js
+ * @requires OpenLayers/Lang.js
+ */
+
+/*
+ * Class: OpenLayers.Tile.Google
+ * Instances of OpenLayers.Tile.Google are used to manage the tiles created
+ * by google.maps.MapType (see
+ * http://code.google.com/apis/maps/documentation/javascript/reference.html#MapType).
+ *
+ * Inherits from:
+ *  - <OpenLayers.Tile>
+ */
+OpenLayers.Tile.Google = OpenLayers.Class(OpenLayers.Tile, {
+    
+    /**
+     * Property: node
+     * {DOMElement} The tile node from the MapType's getTile method
+     */
+    node: null,
+        
+    /** 
+     * Constructor: OpenLayers.Tile.Google
+     * Constructor for a new <OpenLayers.Tile.Google> instance.
+     * 
+     * Parameters:
+     * layer - {<OpenLayers.Layer>} layer that the tile will go in.
+     * position - {<OpenLayers.Pixel>}
+     * bounds - {<OpenLayers.Bounds>}
+     * options - {Object}
+     */   
+    initialize: function(layer, position, bounds, options) {
+        OpenLayers.Tile.prototype.initialize.apply(this, [
+            layer, position, bounds, null, null, options
+        ]);
+    },
+
+    /** 
+     * APIMethod: destroy
+     * Nullify references to prevent circular references and memory leaks.
+     */
+    destroy:function() {
+        this.node && this.clear();
+        this.node = null;
+        OpenLayers.Tile.prototype.destroy.apply(this, arguments);
+    },
+    
+    /**
+     * Method: clone
+     *
+     * Parameters:
+     * obj - {<OpenLayers.Tile>} The tile to be cloned
+     *
+     * Returns:
+     * {<OpenLayers.Tile>} An exact clone of this <OpenLayers.Tile.Google>
+     */
+    clone: function (obj) {
+        if (obj == null) {
+            obj = new OpenLayers.Tile.Google(this.layer, 
+                                      this.position, 
+                                      this.bounds);
+        } 
+        
+        // catch any randomly tagged-on properties
+        OpenLayers.Util.applyDefaults(obj, this);
+        
+        obj.node = null;
+        
+        return obj;
+    },
+
+    /**
+     * Method: draw
+     * Check that a tile should be drawn, and draw it.
+     * 
+     * Returns:
+     * {Boolean} Always returns true.
+     */
+    draw: function() {
+        var layerType = this.layer.mapObject.mapTypes[this.layer.type];
+        if (layerType && OpenLayers.Tile.prototype.draw.apply(this, arguments)) {
+            var xyz = this.layer.getXYZ(this.bounds);
+            var point = new google.maps.Point(xyz.x, xyz.y);
+
+            // The hybrid tile consists of two images. For some reason, we have
+            // to make sure that the satellite image loads first, otherwise we
+            // occasionally get blank tiles for one of the two images. This is
+            // done by requesting the tile for just the satellite mapType
+            // first, before requesting the hybrid one.
+            //TODO revisit this - it may be a temporary issue with GMaps
+            var tempTile;
+            if (this.layer.type === google.maps.MapTypeId.HYBRID) {
+                tempTile = layerType.getTile(point, xyz.z, document);
+            }
+            
+            this.node = layerType.getTile(point, xyz.z, document);
+                        
+            this.isLoading = true;
+            this.events.triggerEvent("loadstart");
+
+            this.layer.div.appendChild(this.node);
+            
+            // We only modify what we need to - we expect the size to be set
+            // by getTile, and we have a test that will fail if this changes.
+            OpenLayers.Util.modifyDOMElement(
+                this.node, null, this.position, null, "absolute"
+            );  
+            
+            // The images inside the node returned from getTile seem to be
+            // preloaded already, so registering onload events on these images
+            // won't work. Instead, we trigger the loadend event immediately
+            // in the next cycle.
+            window.setTimeout(OpenLayers.Function.bind(function() {
+                this.isLoading = false;
+                // check for this.events - we may be destroyed already
+                this.events && this.events.triggerEvent("loadend"); 
+
+                // see hybrid tile issue above
+                //TODO revisit this - it may be a temporary issue with GMaps
+                if (tempTile) {
+                    layerType.releaseTile(tempTile);
+                }
+            }, this), 0);
+        }
+        return true;
+    },
+    
+    /** 
+     * 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() {
+        if (this.node) {
+            this.node.parentNode &&
+                this.node.parentNode.removeChild(this.node);
+            this.layer.mapObject.mapTypes[this.layer.type].releaseTile(this.node);
+        }
+    },
+    
+    CLASS_NAME: "OpenLayers.Tile.Google"
+});

Modified: sandbox/tschaub/editing/lib/OpenLayers/Tile.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Tile.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Tile.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -103,7 +103,9 @@
         this.position = position.clone();
         this.bounds = bounds.clone();
         this.url = url;
-        this.size = size.clone();
+        if (size) {
+            this.size = size.clone();
+        }
 
         //give the tile a unique id based on its BBOX.
         this.id = OpenLayers.Util.createUniqueID("Tile_");

Modified: sandbox/tschaub/editing/lib/OpenLayers/Util.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers/Util.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers/Util.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -1301,7 +1301,7 @@
 };
 
 /**
- * Function: pagePositon
+ * Function: pagePosition
  * Calculates the position of an element on the page (see
  * http://code.google.com/p/doctype/wiki/ArticlePageOffset)
  *

Modified: sandbox/tschaub/editing/lib/OpenLayers.js
===================================================================
--- sandbox/tschaub/editing/lib/OpenLayers.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/lib/OpenLayers.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -120,6 +120,7 @@
                 "OpenLayers/Marker/Box.js",
                 "OpenLayers/Popup.js",
                 "OpenLayers/Tile.js",
+                "OpenLayers/Tile/Google.js",
                 "OpenLayers/Tile/Image.js",
                 "OpenLayers/Tile/Image/IFrame.js",
                 "OpenLayers/Tile/WFS.js",
@@ -152,6 +153,7 @@
                 "OpenLayers/Layer/Boxes.js",
                 "OpenLayers/Layer/XYZ.js",
                 "OpenLayers/Layer/Bing.js",
+                "OpenLayers/Layer/GoogleNG.js",
                 "OpenLayers/Layer/TMS.js",
                 "OpenLayers/Layer/TileCache.js",
                 "OpenLayers/Layer/Zoomify.js",

Modified: sandbox/tschaub/editing/license.txt
===================================================================
--- sandbox/tschaub/editing/license.txt	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/license.txt	2011-05-25 18:53:34 UTC (rev 12009)
@@ -1,38 +1,31 @@
 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-2011 OpenLayers Contributors. See authors.txt for
-  full list.
 
-All rights reserved.
+Copyright 2005-2011 OpenLayers Contributors. All rights reserved. See
+authors.txt for full list.
 
-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:
+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.
+ 1. 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.
+ 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.
 
- * 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.
+THIS SOFTWARE IS PROVIDED BY OPENLAYERS 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 COPYRIGHT HOLDER 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.
 
-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.
+The views and conclusions contained in the software and documentation are those
+of the authors and should not be interpreted as representing official policies,
+either expressed or implied, of OpenLayers Contributors.
\ No newline at end of file

Deleted: sandbox/tschaub/editing/news.txt
===================================================================
--- sandbox/tschaub/editing/news.txt	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/news.txt	2011-05-25 18:53:34 UTC (rev 12009)
@@ -1,54 +0,0 @@
-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.

Copied: sandbox/tschaub/editing/tests/Control/EditingToolbar.html (from rev 12008, trunk/openlayers/tests/Control/EditingToolbar.html)
===================================================================
--- sandbox/tschaub/editing/tests/Control/EditingToolbar.html	                        (rev 0)
+++ sandbox/tschaub/editing/tests/Control/EditingToolbar.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -0,0 +1,30 @@
+<html>
+<head>
+  <script src="../OLLoader.js"></script>
+  <script type="text/javascript">
+    function test_ctor_draw(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map('map');
+        var vLayer = new OpenLayers.Layer.Vector();
+        map.addLayer(vLayer);
+        
+        var editingToolbar = new OpenLayers.Control.EditingToolbar(vLayer);
+        map.addControl(editingToolbar);
+        
+        t.ok(editingToolbar instanceof OpenLayers.Control.EditingToolbar,
+                "new OpenLayers.Control.EditingToolbar returns object" );
+        t.ok(editingToolbar.controls[0] instanceof OpenLayers.Control.Navigation,
+                "EditingToolbar contains Control.Navigation object" );
+        t.eq(editingToolbar.controls[0].active, true,
+                "First control is active" );
+        t.eq(editingToolbar.controls.length, 4,
+                "EditingToolbar contains 4 Controls" );
+        
+        map.destroy();
+    }
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>

Modified: sandbox/tschaub/editing/tests/Control/NavToolbar.html
===================================================================
--- sandbox/tschaub/editing/tests/Control/NavToolbar.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Control/NavToolbar.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -25,7 +25,18 @@
         // t.eq( control.div.style.top, "6px", "Control div top located correctly by default");
 
     }
+    
+    function test_Control_NavToolbar_defaultControl (t) {
+        t.plan( 1 );
+        var map = new OpenLayers.Map('map');
 
+        var nav = new OpenLayers.Control.NavToolbar();
+        map.addControl(nav);
+        
+        t.eq(nav.controls[0].active, true, "First control is active" );
+        
+        map.destroy();
+    }
   </script>
 </head>
 <body>

Modified: sandbox/tschaub/editing/tests/Control/Navigation.html
===================================================================
--- sandbox/tschaub/editing/tests/Control/Navigation.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Control/Navigation.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -18,8 +18,26 @@
         OpenLayers.Control.prototype.initialize = temp;
     }
 
+    function test_draw(t) {
+        t.plan(5);
+        var map = new OpenLayers.Map({div: 'map', controls: []});
+        var control = new OpenLayers.Control.Navigation();
+        map.addControl(control);
+        t.ok(control.handlers.click instanceof OpenLayers.Handler.Click,
+             "click handler set in instance");
+        t.ok(control.dragPan instanceof OpenLayers.Control.DragPan,
+             "drag pan control set in instance");
+        t.ok(control.zoomBox instanceof OpenLayers.Control.ZoomBox,
+             "zoom box control set in instance");
+        t.ok(control.handlers.wheel instanceof OpenLayers.Handler.MouseWheel,
+             "mousewheel handler set in instance");
+        t.ok(control.pinchZoom instanceof OpenLayers.Control.PinchZoom,
+             "pinch zoom control set in instance");
+        map.destroy();
+    }
+
     function test_Control_Navigation_destroy (t) {
-        t.plan(10);
+        t.plan(12);
         
         var temp = OpenLayers.Control.prototype.destroy;
         OpenLayers.Control.prototype.destroy = function() {
@@ -46,6 +64,11 @@
                     t.ok(true, "zoomBox destroyed");
                 }
             },
+            'pinchZoom': {
+                'destroy': function() {
+                    t.ok(true, "pinchZoom destroyed");
+                }
+            },
             handlers: {
                 'wheel': {
                     'destroy': function() {
@@ -66,6 +89,7 @@
 
         t.eq(control.dragPan, null, "'dragPan' set to null");
         t.eq(control.zoomBox, null, "'zoomBox' set to null");
+        t.eq(control.pinchZoom, null, "'pinchZoom' set to null");
         t.eq(control.handlers, null, "handlers set to null");
 
         OpenLayers.Control.prototype.destroy = temp;

Modified: sandbox/tschaub/editing/tests/Control/Panel.html
===================================================================
--- sandbox/tschaub/editing/tests/Control/Panel.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Control/Panel.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -247,6 +247,7 @@
         t.ok(!controlNoDeactive.active, "Tool control autoActivate:true is not active");
         
     }
+
     function test_Control_Panel_deactivate (t) {
         t.plan(2);
         var map = new OpenLayers.Map('map');
@@ -262,6 +263,31 @@
 
         map.destroy();
     }
+
+    function test_allowDepress (t) { 
+        t.plan(2); 
+        var map = new OpenLayers.Map('map');
+
+        var panel = new OpenLayers.Control.Panel();
+        panel.addControls([new OpenLayers.Control(),new OpenLayers.Control()]);
+        map.addControl(panel);
+        
+        var control1 = panel.controls[1]
+        
+        panel.activateControl(control1);
+        
+        panel.allowDepress = false;
+        panel.activateControl(control1);
+        t.eq(control1.active, true,
+            "control1 remains active after calling again activateControl when allowDepress = false");
+        panel.allowDepress = true;
+        panel.activateControl(control1);
+        t.eq(control1.active, false,
+            "control1 is inactive after calling again activateControl when allowDepress = true");
+
+        // panel.deactivate();
+        map.destroy();
+    }
   </script>
 </head>
 <body>

Modified: sandbox/tschaub/editing/tests/Control/TransformFeature.html
===================================================================
--- sandbox/tschaub/editing/tests/Control/TransformFeature.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Control/TransformFeature.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -54,7 +54,7 @@
     }
     
     function test_setFeature(t) {
-        t.plan(4);
+        t.plan(6);
         var map = new OpenLayers.Map("map", {allOverlays: true});
         var layer = new OpenLayers.Layer.Vector();
         var feature = new OpenLayers.Feature.Vector(
@@ -64,8 +64,16 @@
         map.setCenter(new OpenLayers.LonLat(0, 0), 18);
         var control = new OpenLayers.Control.TransformFeature(layer);
         map.addControl(control);
+        var log = [];
+        control.events.on({
+            "beforesetfeature": function(e) { log.push(e); },
+            "setfeature": function(e) { log.push(e); }
+        });
         control.setFeature(feature);
         
+        t.eq(log[0].type, "beforesetfeature", "beforesetfeature event fired with correct event type");
+        t.eq(log[1].type, "setfeature", "setfeature event fired with correct event type");
+        
         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");

Modified: sandbox/tschaub/editing/tests/Format/CSWGetRecords/v2_0_2.html
===================================================================
--- sandbox/tschaub/editing/tests/Format/CSWGetRecords/v2_0_2.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Format/CSWGetRecords/v2_0_2.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -41,10 +41,10 @@
     
     function test_read(t) {
         
-        t.plan(14);
+        t.plan(16);
         
         var obj = format.read(csw_response);
-        
+                
         var searchStatus = obj.SearchStatus;
         var searchResults = obj.SearchResults;
         var records = obj.records;
@@ -72,6 +72,10 @@
         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");
         
+        // test gninfo
+        testRecord = records[1];
+        t.ok(testRecord.gninfo, "object contains gninfo properties");
+        t.eq(testRecord.gninfo.schema, "iso19139", "check value for schema property in record.gninfo");
     }
     
     </script> 

Modified: sandbox/tschaub/editing/tests/Format/CSWGetRecords/v2_0_2.js
===================================================================
--- sandbox/tschaub/editing/tests/Format/CSWGetRecords/v2_0_2.js	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Format/CSWGetRecords/v2_0_2.js	2011-05-25 18:53:34 UTC (rev 12009)
@@ -37,6 +37,10 @@
         '<ows:LowerCorner>51.1 -34.6</ows:LowerCorner>' +
         '<ows:UpperCorner>-17.3 38.2</ows:UpperCorner>' +
       '</ows:BoundingBox>' +
+      '<geonet:info xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gml="http://www.opengis.net/gml">' +
+        '<id>859</id>' +
+        '<schema>iso19139</schema>' +
+      '</geonet:info>' +
     '</csw:BriefRecord>' +
   '</csw:SearchResults>' +
 '</csw:GetRecordsResponse>'

Modified: sandbox/tschaub/editing/tests/Format/Filter/v1_1_0.html
===================================================================
--- sandbox/tschaub/editing/tests/Format/Filter/v1_1_0.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Format/Filter/v1_1_0.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -336,7 +336,32 @@
         return new OpenLayers.Format.XML().read(xml).documentElement;
     }
 
-
+    function test_SortBy(t) {
+        t.plan(1);
+    
+        var out =
+            '<ogc:SortBy xmlns:ogc="http://www.opengis.net/ogc">'+
+                '<ogc:SortProperty>'+
+                    '<ogc:PropertyName>Title</ogc:PropertyName>'+
+                    '<ogc:SortOrder>ASC</ogc:SortOrder>'+
+                '</ogc:SortProperty>'+
+                '<ogc:SortProperty>'+
+                    '<ogc:PropertyName>Relevance</ogc:PropertyName>'+
+                    '<ogc:SortOrder>DESC</ogc:SortOrder>'+
+                '</ogc:SortProperty>'+
+            '</ogc:SortBy>';
+        
+        var parser = new OpenLayers.Format.Filter.v1_1_0();
+        var node = parser.writers['ogc'].SortBy.call(parser, [{
+            "property": 'Title',
+            "order": "ASC"
+        },{
+            "property": 'Relevance',
+            "order": "DESC"
+        }]);
+        
+        t.xml_eq(node, out, "Check SortBy");
+    }
     </script> 
 </head> 
 <body>

Modified: sandbox/tschaub/editing/tests/Format/WMSCapabilities/v1_1_1.html
===================================================================
--- sandbox/tschaub/editing/tests/Format/WMSCapabilities/v1_1_1.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Format/WMSCapabilities/v1_1_1.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -5,7 +5,7 @@
     
     function test_read(t) {
         
-        t.plan(15);
+        t.plan(17);
 
         var xml = document.getElementById("gssample").firstChild.nodeValue;
         var doc = new OpenLayers.Format.XML().read(xml);
@@ -22,6 +22,16 @@
             "http://publicus.opengeo.org:80/geoserver/wms?SERVICE=WMS&",
             "getmap href parsed"
         );
+        t.eq(
+            getmap.get.href,
+            getmap.href,
+            "getmap.get.href parsed"
+        );
+        t.eq(
+            getmap.post,
+            undefined,
+            "getmap.post not available"
+        );
         
         t.ok(capability.layers, "layers parsed");
         t.eq(capability.layers.length, 22, "correct number of layers parsed");
@@ -422,12 +432,16 @@
       <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" />
+             xlink:href="http://hostname:port/path/get" />
           </Get>
+          <Post>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname:port/path/post" />
+          </Post>
         </HTTP>
       </DCPType>
     </GetMap>

Modified: sandbox/tschaub/editing/tests/Handler/Feature.html
===================================================================
--- sandbox/tschaub/editing/tests/Handler/Feature.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Handler/Feature.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -123,7 +123,7 @@
     }
 
     function test_callbacks(t) {
-        t.plan(13);
+        t.plan(14);
         
         var map = new OpenLayers.Map('map', {controls: []});
         var control = new OpenLayers.Control();
@@ -235,6 +235,12 @@
         evtPx.type = "touchstart";
         map.events.triggerEvent('touchstart', evtPx);
 
+        // test touchstart on the same feature
+        // 'click' callback should be called
+        callbacks['click'] = getCallback('click (touch)', newFeature);
+        evtPx.type = "touchstart";
+        map.events.triggerEvent('touchstart', evtPx);
+
         // test touchstart in new feature and out of last feature
         // both 'click' and 'clickout' callbacks should be called
         lastFeature = newFeature;
@@ -582,6 +588,64 @@
         t.eq(clicks, 0, "click callback does not trigger when tolerance is reached");
     }
 
+    function test_multitouch_canvas(t) {
+        var supported = OpenLayers.Renderer.Canvas.prototype.supported();
+        if (!supported) { t.plan(0); return; }
+
+        t.plan(1);
+
+        // set up
+
+        var log;
+
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.Vector('vectors', {
+            renderers: ['Canvas'],
+            isBaseLayer: true
+        });
+        map.addLayer(layer);
+
+        var control = new OpenLayers.Control();
+        var handler = new OpenLayers.Handler.Feature(control, layer,
+                {click: function() { log++; }});
+        control.handler = handler;
+        map.addControl(control);
+        control.activate();
+
+        var feature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(0, 0));
+        layer.addFeatures(feature);
+
+        map.zoomToMaxExtent();
+
+        // test
+
+        // mock getMousePosition on the events object to make
+        // sure scrolls, offsets and leftop do not interfere
+        map.events.getMousePosition = function(evt) {
+            return new OpenLayers.Pixel(evt.clientX,
+                                        evt.clientY);
+        };
+
+        log = 0;
+        var evt = {
+            type: 'touchstart',
+            touches: [{
+                clientX: 100,
+                clientY: 75
+            }, {
+                clientX: 200,
+                clientY: 75
+            }]
+        };
+        map.events.handleBrowserEvent(evt);
+        t.eq(log, 0, "no feature selection when multi-touching");
+
+        // tear down
+
+        map.destroy();
+    }
+
   </script>
 </head>
 <body>

Modified: sandbox/tschaub/editing/tests/Handler/Path.html
===================================================================
--- sandbox/tschaub/editing/tests/Handler/Path.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Handler/Path.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -179,8 +179,7 @@
             }
         },
         {
-            pixelTolerance: 0,
-            dblclickTolerance: 0
+            pixelTolerance: 0
         });
         control.handler = handler;
         map.addControl(control);
@@ -577,10 +576,10 @@
     // added here each a non-working sequence is found.
     //
 
-    // stopDown:true, stopUp:true
+    // stopDown:true, stopUp:true, pixelTolerance:1
     // a) click on (0, 0)
-    // b) mousedown on (0.5, 0.5)
-    // c) mouseup on (1, 1)
+    // b) mousedown on (1, 1)
+    // c) mouseup on (2, 2)
     // d) dblclick on (10, 10)
     function test_sequence1(t) {
         t.plan(1);
@@ -595,7 +594,7 @@
         var control = new OpenLayers.Control({});
         var handler = new OpenLayers.Handler.Path(control,
             {done: function(g) { log.geometry = g; }},
-            {stopDown: true, stopUp: true}
+            {stopDown: true, stopUp: true, pixelTolerance: 1}
         );
         control.handler = handler;
         map.addControl(control);
@@ -611,16 +610,16 @@
             {type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
         handler.mouseup(
             {type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
-        // b) mousedown on (0.5, 0.5)
+        // b) mousedown on (1, 1)
         handler.mousemove(
-            {type: "mousemove", xy: new OpenLayers.Pixel(0.5, 0.5)});
+            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
         handler.mousedown(
-            {type: "mousedown", xy: new OpenLayers.Pixel(0.5, 0.5)});
-        // c) mouseup on (1, 1)
+            {type: "mousedown", xy: new OpenLayers.Pixel(1, 1)});
+        // c) mouseup on (2, 2)
         handler.mousemove(
-            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
+            {type: "mousemove", xy: new OpenLayers.Pixel(2, 2)});
         handler.mouseup(
-            {type: "mouseup", xy: new OpenLayers.Pixel(1, 1)});
+            {type: "mouseup", xy: new OpenLayers.Pixel(2, 2)});
         // d) dblclick on (10, 10)
         handler.mousemove(
             {type: "mousemove", xy: new OpenLayers.Pixel(10, 10)});
@@ -637,10 +636,10 @@
             ]), "geometry is correct");
     }
 
-    // stopDown:false, stopUp:false
+    // stopDown:false, stopUp:false, pixelTolerance:1
     // a) click on (0, 0)
-    // b) mousedown on (0.5, 0.5)
-    // c) mouseup on (1, 1)
+    // b) mousedown on (1, 1)
+    // c) mouseup on (2, 2)
     // d) dblclick on (10, 10)
     function test_sequence2(t) {
         t.plan(1);
@@ -655,7 +654,7 @@
         var control = new OpenLayers.Control({});
         var handler = new OpenLayers.Handler.Path(control,
             {done: function(g) { log.geometry = g; }},
-            {stopDown: false, stopUp: false}
+            {stopDown: false, stopUp: false, pixelTolerance: 1}
         );
         control.handler = handler;
         map.addControl(control);
@@ -671,16 +670,16 @@
             {type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
         handler.mouseup(
             {type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
-        // b) mousedown on (0.5, 0.5)
+        // b) mousedown on (1, 1)
         handler.mousemove(
-            {type: "mousemove", xy: new OpenLayers.Pixel(0.5, 0.5)});
+            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
         handler.mousedown(
-            {type: "mousedown", xy: new OpenLayers.Pixel(0.5, 0.5)});
-        // c) mouseup on (1, 1)
+            {type: "mousedown", xy: new OpenLayers.Pixel(1, 1)});
+        // c) mouseup on (2, 2)
         handler.mousemove(
-            {type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
+            {type: "mousemove", xy: new OpenLayers.Pixel(2, 2)});
         handler.mouseup(
-            {type: "mouseup", xy: new OpenLayers.Pixel(1, 1)});
+            {type: "mouseup", xy: new OpenLayers.Pixel(2, 2)});
         // d) dblclick on (10, 10)
         handler.mousemove(
             {type: "mousemove", xy: new OpenLayers.Pixel(10, 10)});
@@ -714,8 +713,7 @@
         var control = new OpenLayers.Control({});
         var handler = new OpenLayers.Handler.Path(control, {},
         {
-            pixelTolerance: 0,
-            dblclickTolerance: 0
+            pixelTolerance: 0
         });
         control.handler = handler;
         map.addControl(control);
@@ -819,7 +817,7 @@
     // a) tap
     // c) doubletap
     function test_touch_sequence1(t) {
-        t.plan(17);
+        t.plan(19);
 
         // set up
 
@@ -841,7 +839,7 @@
                 log = {type: 'modify', geometry: g, feature: f};
             }
         }, {
-            dblclickTolerance: 2
+            doubleTouchTolerance: 2
         });
         control.handler = handler;
         map.addControl(control);
@@ -888,6 +886,10 @@
                 new OpenLayers.Geometry.Point(-149, 75),  // (1, 0)
                 new OpenLayers.Geometry.Point(-140, 65)   // (10, 10)
             ]), "[touchstart] final geometry is correct");
+        log = null;
+        ret = handler.touchend({});
+        t.ok(ret, '[touchend] event propagates');
+        t.eq(log, null, '[touchend] feature not finalized or modified');
 
         // tear down
 
@@ -898,7 +900,7 @@
     // b) tap-move
     // c) doubletap
     function test_touch_sequence2(t) {
-        t.plan(23);
+        t.plan(25);
 
         // set up
 
@@ -920,7 +922,7 @@
                 log = {type: 'modify', geometry: g, feature: f};
             }
         }, {
-            dblclickTolerance: 2
+            doubleTouchTolerance: 2
         });
         control.handler = handler;
         map.addControl(control);
@@ -979,6 +981,10 @@
                 new OpenLayers.Geometry.Point(-149, 75),  // (1, 0)
                 new OpenLayers.Geometry.Point(-140, 65)   // (10, 10)
             ]), "[touchstart] final geometry is correct");
+        log = null;
+        ret = handler.touchend({});
+        t.ok(ret, '[touchend] event propagates');
+        t.eq(log, null, '[touchend] feature not finalized or modified');
 
         // tear down
 

Modified: sandbox/tschaub/editing/tests/Handler/Polygon.html
===================================================================
--- sandbox/tschaub/editing/tests/Handler/Polygon.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Handler/Polygon.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -170,8 +170,7 @@
             }
         },
         {
-            pixelTolerance: 0,
-            dblclickTolerance: 0
+            pixelTolerance: 0
         });
         control.handler = handler;
         map.addControl(control);
@@ -563,8 +562,7 @@
             OpenLayers.Handler.Polygon,
             {handlerOptions: {
                 holeModifier: "altKey",
-                pixelTolerance: 0,
-                dblclickTolerance: 0
+                pixelTolerance: 0
             }}
         );
         map.addControl(draw);
@@ -780,7 +778,7 @@
         var handler = new OpenLayers.Handler.Polygon(control,
             {done: function(g) { log.geometry = g; }},
             {stopDown: true, stopUp: true,
-            pixelTolerance: 0, dblclickTolerance: 0}
+            pixelTolerance: 0}
         );
         control.handler = handler;
         map.addControl(control);
@@ -852,7 +850,7 @@
         var handler = new OpenLayers.Handler.Polygon(control,
             {done: function(g) { log.geometry = g; }},
             {stopDown: false, stopUp: false,
-            pixelTolerance: 0, dblclickTolerance: 0}
+            pixelTolerance: 0}
         );
         control.handler = handler;
         map.addControl(control);
@@ -908,7 +906,7 @@
     // b) tap
     // c) doubletap
     function test_touch_sequence1(t) {
-        t.plan(24);
+        t.plan(26);
 
         // set up
 
@@ -930,7 +928,7 @@
                 log = {type: 'modify', geometry: g, feature: f};
             }
         }, {
-            dblclickTolerance: 2
+            doubleTouchTolerance: 2
         });
         control.handler = handler;
         map.addControl(control);
@@ -994,6 +992,10 @@
                     new OpenLayers.Geometry.Point(-140, 65)  // (10, 10)
                 ])
             ]), "[touchstart] geometry is correct");
+        log = null;
+        ret = handler.touchend({});
+        t.ok(ret, '[touchend] event propagates');
+        t.eq(log, null, '[touchend] feature not finalized or modified');
 
         // tear down
 
@@ -1005,7 +1007,7 @@
     // c) tap
     // d) doubletap
     function test_touch_sequence2(t) {
-        t.plan(30);
+        t.plan(32);
 
         // set up
 
@@ -1027,7 +1029,7 @@
                 log = {type: 'modify', geometry: g, feature: f};
             }
         }, {
-            dblclickTolerance: 2
+            doubleTouchTolerance: 2
         });
         control.handler = handler;
         map.addControl(control);
@@ -1103,6 +1105,10 @@
                     new OpenLayers.Geometry.Point(-140, 65)  // (10, 10)
                 ])
             ]), "[touchstart] geometry is correct");
+        log = null;
+        ret = handler.touchend({});
+        t.ok(ret, '[touchend] event propagates');
+        t.eq(log, null, '[touchend] feature not finalized or modified');
 
         // tear down
 

Copied: sandbox/tschaub/editing/tests/Layer/GoogleNG.html (from rev 12008, trunk/openlayers/tests/Layer/GoogleNG.html)
===================================================================
--- sandbox/tschaub/editing/tests/Layer/GoogleNG.html	                        (rev 0)
+++ sandbox/tschaub/editing/tests/Layer/GoogleNG.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -0,0 +1,96 @@
+<html>
+<head>
+  <script src="http://maps.google.com/maps/api/js?sensor=false&v=3.5"></script>
+  <script src="../OLLoader.js"></script>
+  <script type="text/javascript">
+    var map, layer; 
+
+    function test_constructor(t) {
+        t.plan(2);
+                       
+        layer = new OpenLayers.Layer.GoogleNG({type: google.maps.MapTypeId.HYBRID});
+        t.ok(layer instanceof OpenLayers.Layer.GoogleNG, "returns OpenLayers.Layer.GoogleNG object" );
+        t.eq(layer.type, google.maps.MapTypeId.HYBRID, "Layer type set");
+    }
+    
+    function test_initLayer(t) {
+        t.plan(6);
+
+        map = new OpenLayers.Map("map");
+        var log = {};
+        layer = new OpenLayers.Layer.GoogleNG({
+            numZoomLevels: 10,
+            restrictedMinZoom: 2,
+            initLayer: function() {
+                log[layer.id] = true;
+                OpenLayers.Layer.GoogleNG.prototype.initLayer.apply(this, arguments);
+            }
+        });
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        var map2 = new OpenLayers.Map("map2");
+        var layer2 = new OpenLayers.Layer.GoogleNG({
+            numZoomLevels: 24,
+            initLayer: function() {
+                log[layer2.id] = true;
+                var origMinZoom = layer2.mapObject.mapTypes[layer2.type].minZoom;
+                // pretend the API reports a minZoom of 1
+                layer2.mapObject.mapTypes[layer2.type].minZoom = 1;
+                OpenLayers.Layer.GoogleNG.prototype.initLayer.apply(this, arguments);
+                layer2.mapObject.mapTypes[layer2.type].minZoom = origMinZoom;
+            }
+        });
+        map2.addLayer(layer2);
+        map2.zoomToMaxExtent();
+        
+        t.delay_call(1, function() {
+            t.eq(log[layer.id], true, "initLayer called for 1st layer");
+            t.eq(log[layer2.id], true, "initLayer called for 2nd layer");
+            
+            t.eq(layer.numZoomLevels, 10, "numZoomLevels from configuration takes precedence if lower");
+            t.eq(layer2.numZoomLevels, layer2.mapObject.mapTypes[layer2.type].maxZoom+1, "numZoomLevels from API takes precedence if lower");
+
+            t.eq(layer.restrictedMinZoom, 2, "restrictedMinZoom from configuration takes precedence if higher");
+            t.eq(layer2.restrictedMinZoom, 1, "restrictedMinZoom from API takes precedence if higher");
+
+            map.destroy();
+            map2.destroy();            
+        });
+    }
+    
+    function test_attribution(t) {
+        t.plan(3);
+        
+        var log = [];
+        map = new OpenLayers.Map("map");
+        layer = new OpenLayers.Layer.GoogleNG({type: google.maps.MapTypeId.HYBRID});
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        t.delay_call(1, function() {
+            t.ok(layer.attribution.indexOf('olGoogleAttribution hybrid') !== -1, "Attribution has the correct css class");
+            t.ok(layer.attribution.indexOf('?ll=0,0&z=0&t=h"') != -1, "maps.google.com link has correct parameters");
+            t.ok(layer.attribution.indexOf('&center=0,0&zoom=0&size=500x550&maptype=hybrid') != -1 , "Attribution has correct map data link");
+            map.destroy();
+        });
+    }
+
+    function test_clone(t) {
+        t.plan(2);
+        
+        var clone;
+        
+        layer = new OpenLayers.Layer.GoogleNG({type: google.maps.MapTypeId.HYBRID});
+        clone = layer.clone();
+        t.ok(clone instanceof OpenLayers.Layer.GoogleNG, "clone is a Layer.GoogleNG instance");
+        t.eq(clone.type, google.maps.MapTypeId.HYBRID, "with the correct map type");
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+<div id="map2" style="width:500px;height:550px"></div>
+</body>
+</html>

Modified: sandbox/tschaub/editing/tests/Layer/Vector.html
===================================================================
--- sandbox/tschaub/editing/tests/Layer/Vector.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Layer/Vector.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -685,9 +685,12 @@
                              "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.BROWSER_NAME == "opera" || OpenLayers.BROWSER_NAME == "safari") ? "" : ';'),
-                             "graphicOpacity correctly set");
+                // we use startsWith here as some browsers (at least Safari 3 and FireFox 4)
+                // do not append a semi-colon to the opacity string
+                t.ok(OpenLayers.String.startsWith(
+                            root.firstChild.getAttributeNS(null, 'style'),
+                            "opacity: " + customStyle5.graphicOpacity.toString()),
+                     "graphicOpacity correctly set");
                 feature.style = customStyle6;
                 layer.drawFeature(feature);
                 var x = geometryX / renderer.getResolution() + renderer.left;

Modified: sandbox/tschaub/editing/tests/Layer/WMS.html
===================================================================
--- sandbox/tschaub/editing/tests/Layer/WMS.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Layer/WMS.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -80,13 +80,11 @@
         var tParams = OpenLayers.Util.extend({},
                         OpenLayers.Util.upperCaseObject(params));
         tParams = OpenLayers.Util.extend(tParams, {
-            SERVICE: "WMS", VERSION: "1.1.1",
-            REQUEST: "GetMap", STYLES: "",
-            SRS: "EPSG:4326", BBOX: [1,2,3,4],
+            BBOX: [1,2,3,4],
             WIDTH: "256", HEIGHT: "256"
         });
         t.eq( img.src,
-             url + "?" + OpenLayers.Util.getParameterString(tParams),
+             layer.getFullRequestString(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" );
@@ -97,7 +95,7 @@
         else
             t.ok( firstChild instanceof HTMLElement, "div first child is an image object" );
         t.eq( firstChild.src,
-             url + "?" + OpenLayers.Util.getParameterString(tParams),
+             layer.getFullRequestString(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();
@@ -118,13 +116,11 @@
         var tParams = OpenLayers.Util.extend({},
                         OpenLayers.Util.upperCaseObject(params));
         tParams = OpenLayers.Util.extend(tParams, {
-            SERVICE: "WMS", VERSION: "1.1.1",
-            REQUEST: "GetMap", STYLES: "",
-            SRS: "EPSG:4326", BBOX: "1,2,3,4",
+            BBOX: "1,2,3,4",
             WIDTH: "256", HEIGHT: "256"
         });
         t.eq( img.src,
-             url + "?" + OpenLayers.Util.getParameterString(tParams),
+             layer.getFullRequestString(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" );
@@ -135,7 +131,7 @@
         else
             t.ok( firstChild instanceof HTMLElement, "div first child is an image object" );
         t.eq( firstChild.src,
-             url + "?" + OpenLayers.Util.getParameterString(tParams),
+             layer.getFullRequestString(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();
@@ -544,8 +540,30 @@
         map.destroy();
 
     }
+    
+    function test_transparent(t) {
+        t.plan(5);
+        var map = new OpenLayers.Map("map", {allOverlays: true});
+        var layer = new OpenLayers.Layer.WMS(
+            "OpenLayers WMS",
+            "http://myserver.org/wms?",
+            {layers: 'mylayer', transparent: true}
+        );
+        map.addLayer(layer);
 
+        t.eq(typeof layer.params.TRANSPARENT, "boolean", "transparent param is boolean");
+        t.ok(layer.getFullRequestString({}).indexOf("TRANSPARENT=TRUE") != -1, "Boolean transparent param value is uppercase TRUE");
+        layer.mergeNewParams({transparent: false});
+        t.ok(layer.getFullRequestString({}).indexOf("TRANSPARENT=FALSE") != -1, "Boolean transparent param value is uppercase FALSE");
 
+        layer.mergeNewParams({transparent: "true"});
+        t.eq(typeof layer.params.TRANSPARENT, "string", "transparent param is string");
+        t.ok(layer.getFullRequestString({}).indexOf("TRANSPARENT=true") != -1, "transparent param value passed as provided if String");
+        
+        map.destroy();
+    }
+
+
   </script>
 </head>
 <body>

Modified: sandbox/tschaub/editing/tests/Renderer/Canvas.html
===================================================================
--- sandbox/tschaub/editing/tests/Renderer/Canvas.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Renderer/Canvas.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -171,7 +171,7 @@
             {display: "none"}
         );
         t.eq(exp, false, "c) drawFeature returns false");
-        t.eq(count, 0, "c) redraw is not called when drawing a feature with display 'none'");
+        t.eq(count, 1, "c) redraw is called when drawing a feature with display 'none'");
         renderer.clear();
 
         // d) draw a point feature outside renderer extent
@@ -180,7 +180,7 @@
             new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(-1000, 0)), {}
         );
         t.eq(exp, false, "d) drawFeature returns false");
-        t.eq(count, 0, "d) redraw is not called when drawing a feature outside renderer extent");
+        t.eq(count, 1, "d) redraw is called when drawing a feature outside renderer extent");
         renderer.clear();
         
         map.destroy();

Copied: sandbox/tschaub/editing/tests/Tile/Google.html (from rev 12008, trunk/openlayers/tests/Tile/Google.html)
===================================================================
--- sandbox/tschaub/editing/tests/Tile/Google.html	                        (rev 0)
+++ sandbox/tschaub/editing/tests/Tile/Google.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -0,0 +1,74 @@
+<html>
+<head>
+  <script src="http://maps.google.com/maps/api/js?sensor=false&v=3.5"></script>
+  <script src="../OLLoader.js"></script>
+  <script type="text/javascript">
+    var tile; 
+    var layer = new OpenLayers.Layer.GoogleNG(); 
+    var position = new OpenLayers.Pixel(20,30);
+    var bounds = new OpenLayers.Bounds(1,2,3,4);
+
+    
+    function test_constructor (t) {
+        t.plan( 4 );
+        
+        tile = new OpenLayers.Tile.Google(layer, position, bounds);
+    
+        t.ok( tile instanceof OpenLayers.Tile.Google, "new OpenLayers.Tile.Google 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");
+    }
+
+    function test_clone (t) {
+        t.plan( 5 );
+        
+        tile = new OpenLayers.Tile.Google(layer, position, bounds);
+        tile.node = document.createElement("div");
+        var clone = tile.clone();
+    
+        t.ok( clone instanceof OpenLayers.Tile.Google, "OpenLayers.Tile.Google.clone returns Tile.Google 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.ok( !clone.node, "node not cloned");
+    }
+    
+    function test_draw (t) {
+        t.plan( 5 );
+
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);  
+
+        tile = new OpenLayers.Tile.Google(layer, position, bounds);
+
+        tile.events.register("loadstart", this, function() { 
+            t.ok(true, "loadstart triggered");
+        });
+        tile.events.register("loadend", this, function() { 
+            t.ok(true, "loadend triggered");
+        });
+
+        t.delay_call(1, function() {
+            //this should trigger a "loadstart" event
+            tile.draw();
+
+            t.ok( tile.node, "tile.draw creates a node");
+            // The two tests below will fail when getTile doesn't set the tile size
+            t.eq( tile.node.style.width, layer.tileSize.w+"px", "Image width is correct" );
+            t.eq( tile.node.style.height, layer.tileSize.h+"px", "Image height is correct" );
+        });       
+        t.delay_call(2, function() {
+            map.removeLayer(layer);
+            map.destroy();
+            /* wait until "loadend" fires */
+        });        
+        
+    }
+        
+  </script>
+</head>
+<body>
+<div id="map" style="height:550px;width:500px"></div>
+</body>
+</html>
\ No newline at end of file

Modified: sandbox/tschaub/editing/tests/Util.html
===================================================================
--- sandbox/tschaub/editing/tests/Util.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/Util.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -121,8 +121,9 @@
         var prop = (OpenLayers.BROWSER_NAME == '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.BROWSER_NAME == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+        //Some non-IE browsers don't return the alpha string for this value, which is okay
+        var filterString = div.style.filter.match(/^alpha/) != null ? 
+                               'alpha(opacity=' + (opacity * 100) + ')' : div.style.filter;
         t.eq( div.style.filter, filterString, "element.style.filter set correctly");
 
         //test defaults
@@ -190,8 +191,9 @@
         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.BROWSER_NAME == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+        //Some non-IE browsers don't return the alpha string for this value, which is okay
+        var filterString = image.style.filter.match(/^alpha/) != null ? 
+                               'alpha(opacity=' + (opacity * 100) + ')' : image.style.filter;
         t.eq( image.style.filter, filterString, "element.style.filter set correctly");
 
         //test defaults
@@ -381,8 +383,9 @@
         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.BROWSER_NAME == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+            //Some non-IE browsers don't return the alpha string for this value, which is okay
+            var filterString = imageDiv.style.filter.match(/^alpha/) != null ? 
+                                   'alpha(opacity=' + (opacity * 100) + ')' : imageDiv.style.filter;
         }        
         t.eq( imageDiv.style.filter, filterString, "element.style.filter set correctly");
 
@@ -449,8 +452,9 @@
 
         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.BROWSER_NAME == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+        //Some non-IE browsers don't return the alpha string for this value, which is okay
+        var filterString = element.style.filter.match(/^alpha/) != null ? 
+                               'alpha(opacity=' + (opacity * 100) + ')' : element.style.filter;
         t.eq(element.style.filter, filterString, 
              "element.style.filter set correctly when opacity = " + opacity);
 
@@ -459,8 +463,9 @@
     
         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.BROWSER_NAME == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+        //Some non-IE browsers don't return the alpha string for this value, which is okay
+        var filterString = element.style.filter.match(/^alpha/) != null ? 
+                               'alpha(opacity=' + (opacity * 100) + ')' : element.style.filter;
         t.eq(element.style.filter, filterString, 
              "element.style.filter not changed if the value is incorrect");
 
@@ -469,8 +474,9 @@
     
         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.BROWSER_NAME == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+        //Some non-IE browsers don't return the alpha string for this value, which is okay
+        var filterString = element.style.filter.match(/^alpha/) != null ? 
+                               'alpha(opacity=' + (opacity * 100) + ')' : element.style.filter;
         t.eq(element.style.filter, filterString, 
              "element.style.filter not changed if the value is incorrect");
 
@@ -521,8 +527,9 @@
         var prop = (OpenLayers.BROWSER_NAME == '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.BROWSER_NAME == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+        //Some non-IE browsers don't return the alpha string for this value, which is okay
+        var filterString = element.style.filter.match(/^alpha/) != null ? 
+                               'alpha(opacity=' + (opacity * 100) + ')' : element.style.filter;
         t.eq( element.style.filter, filterString, "element.style.filter set correctly");
     }
 
@@ -565,8 +572,9 @@
             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.BROWSER_NAME == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+            //Some non-IE browsers don't return the alpha string for this value, which is okay
+            var filterString = imageDiv.style.filter.match(/^alpha/) != null ? 
+                                   'alpha(opacity=' + (opacity * 100) + ')' : imageDiv.style.filter;
             t.ok( image.nodeName == "IMG", "createImage creates a valid HTMLImageElement" );
         }
         t.eq( imageDiv.style.filter, filterString, "element.style.filter set correctly");

Modified: sandbox/tschaub/editing/tests/list-tests.html
===================================================================
--- sandbox/tschaub/editing/tests/list-tests.html	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tests/list-tests.html	2011-05-25 18:53:34 UTC (rev 12009)
@@ -15,6 +15,7 @@
     <li>Control/DragFeature.html</li>
     <li>Control/DragPan.html</li>
     <li>Control/DrawFeature.html</li>
+    <li>Control/EditingToolbar.html</li>
     <li>Control/Geolocate.html</li>
     <li>Control/GetFeature.html</li>
     <li>Control/Graticule.html</li>
@@ -143,6 +144,7 @@
     <li>Layer/GML.html</li>
     <li>Layer/Google.html</li>
     <li>Layer/Google/v3.html</li>
+    <li>Layer/GoogleNG.html</li>
     <li>Layer/Grid.html</li>
     <li>Layer/HTTPRequest.html</li>
     <li>Layer/Image.html</li>
@@ -212,6 +214,7 @@
     <li>Symbolizer/Raster.html</li>
     <li>Symbolizer/Text.html</li>
     <li>Tile.html</li>
+    <li>Tile/Google.html</li>
     <li>Tile/Image.html</li>
     <li>Tile/Image/IFrame.html</li>
     <li>Tile/WFS.html</li>

Modified: sandbox/tschaub/editing/theme/default/style.css
===================================================================
--- sandbox/tschaub/editing/theme/default/style.css	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/theme/default/style.css	2011-05-25 18:53:34 UTC (rev 12009)
@@ -355,6 +355,19 @@
     color: #333;
 }
 
+.olGoogleAttribution.hybrid, .olGoogleAttribution.satellite {
+    color: #DDD;
+}
+.olGoogleAttribution {
+    color: #333;
+}
+span.olGoogleAttribution a {
+    color: #77C;
+}
+span.olGoogleAttribution.hybrid a, span.olGoogleAttribution.satellite a {
+    color: white;
+}
+
 /**
  * Editing and navigation icons.
  * (using the editing_tool_bar.png sprint image)

Copied: sandbox/tschaub/editing/tools/branch.sh (from rev 12008, trunk/openlayers/tools/branch.sh)
===================================================================
--- sandbox/tschaub/editing/tools/branch.sh	                        (rev 0)
+++ sandbox/tschaub/editing/tools/branch.sh	2011-05-25 18:53:34 UTC (rev 12009)
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+RELEASE=$1
+
+svn copy -m "Branching for the $RELEASE release" http://svn.openlayers.org/trunk/openlayers http://svn.openlayers.org/branches/openlayers/$RELEASE

Copied: sandbox/tschaub/editing/tools/rc.sh (from rev 12008, trunk/openlayers/tools/rc.sh)
===================================================================
--- sandbox/tschaub/editing/tools/rc.sh	                        (rev 0)
+++ sandbox/tschaub/editing/tools/rc.sh	2011-05-25 18:53:34 UTC (rev 12009)
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+RELEASE=$1
+RC=$2
+
+svn co http://svn.openlayers.org/branches/openlayers/$RELEASE
+cd $RELEASE
+sed -i -e "s/OpenLayers.VERSION_NUMBER=.*/OpenLayers.VERSION_NUMBER=\"Release $1-$2\";/" lib/OpenLayers.js 
+sed -i -e "s/VERSION_NUMBER: .*,/VERSION_NUMBER: \"Release $1-$2\",/" lib/OpenLayers/SingleFile.js
+svn diff;
+sleep 10;
+svn ci -m "Updating version numbers for $1-$2".
+svn cp -m "Tagging the $1-$2 release." http://svn.openlayers.org/branches/openlayers/$1 http://svn.openlayers.org/tags/openlayers/release-$1-$2

Modified: sandbox/tschaub/editing/tools/release.sh
===================================================================
--- sandbox/tschaub/editing/tools/release.sh	2011-05-25 16:00:59 UTC (rev 12008)
+++ sandbox/tschaub/editing/tools/release.sh	2011-05-25 18:53:34 UTC (rev 12009)
@@ -24,17 +24,17 @@
 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
+mkdir /osgeo/openlayers/docs/api/$VERSION
+cp OpenLayers.js /osgeo/openlayers/docs/api/$VERSION
+cp -a img/ /osgeo/openlayers/docs/api/$VERSION
+cp -a theme/ /osgeo/openlayers/docs/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
+naturaldocs -i OpenLayers-$VERSION/lib -o HTML OpenLayers-$VERSION/doc/devdocs -p OpenLayers-$VERSION/doc_config -s Small OL
+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 
+cp OpenLayers-$VERSION.* /osgeo/openlayers/docs/download 



More information about the Commits mailing list