diff --git a/build/build.py b/build/build.py
index 9ac625411d..d268663504 100755
--- a/build/build.py
+++ b/build/build.py
@@ -14,12 +14,12 @@ if len(sys.argv) > 1:
if len(sys.argv) > 2:
outputFilename = sys.argv[2]
-print "Adding license file."
-merged = file("license.txt").read()
print "Merging libraries."
-merged += mergejs.run(sourceDirectory, None, configFilename)
+merged = mergejs.run(sourceDirectory, None, configFilename)
print "Compressing."
minimized = jsmin.jsmin(merged)
+print "Adding license file."
+minimized = file("license.txt").read() + minimized
print "Writing to %s." % outputFilename
file(outputFilename, "w").write(minimized)
diff --git a/lib/OpenLayers/Control/OverviewMap.js b/lib/OpenLayers/Control/OverviewMap.js
index 0097ae87a7..be413614e0 100644
--- a/lib/OpenLayers/Control/OverviewMap.js
+++ b/lib/OpenLayers/Control/OverviewMap.js
@@ -133,7 +133,6 @@ OpenLayers.Control.OverviewMap.prototype =
OpenLayers.Event.stop(e);
});
this.rectEvents = new OpenLayers.Events(this, this.extentRectangle);
- this.rectEvents.register('mouseover', this, this.rectMouseOver);
this.rectEvents.register('mouseout', this, this.rectMouseOut);
this.rectEvents.register('mousedown', this, this.rectMouseDown);
this.rectEvents.register('mousemove', this, this.rectMouseMove);
@@ -147,8 +146,7 @@ OpenLayers.Control.OverviewMap.prototype =
// Optionally add min/max buttons if the control will go in the
// map viewport.
- if(!this.div.parentNode ||
- (this.div.parentNode.className == 'olMapViewport')) {
+ if(!this.outsideViewport) {
this.div.className = 'olControlOverviewMapContainer';
var imgLocation = OpenLayers.Util.getImagesLocation();
// maximize button div
@@ -187,7 +185,9 @@ OpenLayers.Control.OverviewMap.prototype =
// show the overview map
this.element.style.display = '';
}
-
+ if(this.map.getExtent()) {
+ this.update();
+ }
return this.div;
},
@@ -196,22 +196,24 @@ OpenLayers.Control.OverviewMap.prototype =
this.map.events.unregister("changebaselayer", this, this.baseLayerDraw);
},
- /**
- * @param {OpenLayers.Event} evt
- */
- rectMouseOver: function (evt) {
- this.extentRectangle.style.cursor = 'move';
- },
-
/**
* @param {OpenLayers.Event} evt
*/
rectMouseOut: function (evt) {
- this.extentRectangle.style.cursor = 'default';
if(this.rectDragStart != null) {
if(this.performedRectDrag) {
- this.updateMapToRect();
- }
+ this.rectMouseMove(evt);
+ var rectPxBounds = this.getRectPxBounds();
+ // if we're off of the overview map, update the main map
+ // otherwise, keep moving the rect
+ if((rectPxBounds.top <= 0) || (rectPxBounds.left <= 0) ||
+ (rectPxBounds.bottom >= this.size.h - this.hComp) ||
+ (rectPxBounds.right >= this.size.w - this.wComp)) {
+ this.updateMapToRect();
+ } else {
+ return;
+ }
+ }
document.onselectstart = null;
this.rectDragStart = null;
}
diff --git a/lib/OpenLayers/Events.js b/lib/OpenLayers/Events.js
index ac6151139e..17afdfff3b 100644
--- a/lib/OpenLayers/Events.js
+++ b/lib/OpenLayers/Events.js
@@ -272,7 +272,10 @@ OpenLayers.Events.prototype = {
evt.element = this.element;
// execute all callbacks registered for specified type
- var listeners = this.listeners[type];
+ // get a clone of the listeners array to
+ // allow for splicing during callbacks
+ var listeners = (this.listeners[type]) ?
+ this.listeners[type].slice() : null;
if ((listeners != null) && (listeners.length > 0)) {
for (var i = 0; i < listeners.length; i++) {
var callback = listeners[i];
diff --git a/lib/OpenLayers/Map.js b/lib/OpenLayers/Map.js
index 68b4ccfd28..6e2dbf809b 100644
--- a/lib/OpenLayers/Map.js
+++ b/lib/OpenLayers/Map.js
@@ -431,16 +431,19 @@ OpenLayers.Map.prototype = {
* @param {Boolean} noEvent
*/
setBaseLayer: function(newBaseLayer, noEvent) {
- var oldBaseLayer = this.baseLayer;
+ var oldExtent = null;
+ if(this.baseLayer) {
+ oldExtent = this.baseLayer.getExtent();
+ }
- if (newBaseLayer != oldBaseLayer) {
+ if (newBaseLayer != this.baseLayer) {
// is newBaseLayer an already loaded layer?
if (OpenLayers.Util.indexOf(this.layers, newBaseLayer) != -1) {
// make the old base layer invisible
- if (oldBaseLayer != null) {
- oldBaseLayer.setVisibility(false, noEvent);
+ if (this.baseLayer != null) {
+ this.baseLayer.setVisibility(false, noEvent);
}
// set new baselayer and make it visible
@@ -450,10 +453,10 @@ OpenLayers.Map.prototype = {
//redraw all layers
var center = this.getCenter();
if (center != null) {
- if (oldBaseLayer == null) {
+ if (oldExtent == null) {
this.setCenter(center);
} else {
- this.zoomToExtent(oldBaseLayer.getExtent());
+ this.zoomToExtent(oldExtent);
}
}
@@ -480,11 +483,13 @@ OpenLayers.Map.prototype = {
* @param {OpenLayers.Pixel} px
*/
addControlToMap: function (control, px) {
+ // If a control doesn't have a div at this point, it belongs in the
+ // viewport.
+ control.outsideViewport = (control.div != null);
control.setMap(this);
var div = control.draw(px);
if (div) {
- // only elements without parents should be appended to the viewport
- if(!div.parentNode) {
+ if(!control.outsideViewport) {
div.style.zIndex = this.Z_INDEX_BASE['Control'] +
this.controls.length;
this.viewPortDiv.appendChild( div );
diff --git a/lib/OpenLayers/Marker.js b/lib/OpenLayers/Marker.js
index c370e828cc..3192096c59 100644
--- a/lib/OpenLayers/Marker.js
+++ b/lib/OpenLayers/Marker.js
@@ -126,7 +126,11 @@ OpenLayers.Marker.prototype = {
OpenLayers.Marker.defaultIcon = function() {
var url = OpenLayers.Util.getImagesLocation() + "marker.png";
var size = new OpenLayers.Size(21, 25);
- return new OpenLayers.Icon(url, size);
+ var calculateOffset = function(size) {
+ return new OpenLayers.Pixel(-(size.w/2), -size.h);
+ };
+
+ return new OpenLayers.Icon(url, size, null, calculateOffset);
};
diff --git a/lib/OpenLayers/Tile/Image.js b/lib/OpenLayers/Tile/Image.js
index 113e5add5c..6539e933ed 100644
--- a/lib/OpenLayers/Tile/Image.js
+++ b/lib/OpenLayers/Tile/Image.js
@@ -117,12 +117,14 @@ OpenLayers.Tile.Image.prototype =
this.imgDiv.className = 'olTileImage';
- /* checkImgURL *should* pretty predictably get called after the
- createImage / createAlphaImageDiv onLoad handler */
+ /* checkImgURL used to be used to called as a work around, but it
+ ended up hiding problems instead of solving them and broke things
+ like relative URLs. See discussion on the dev list:
+ http://openlayers.org/pipermail/dev/2007-January/000205.html
OpenLayers.Event.observe( this.imgDiv, "load",
this.checkImgURL.bindAsEventListener(this) );
-
+ */
this.layer.div.appendChild(this.imgDiv);
if(this.layer.opacity != null) {
@@ -139,6 +141,14 @@ OpenLayers.Tile.Image.prototype =
* the imgDiv display to 'none', as either (a) it will be reset to visible
* when the new URL loads in the image, or (b) we don't want to display
* this tile after all because its new bounds are outside our maxExtent.
+ *
+ * This function should no longer be neccesary with the improvements to
+ * Grid.js in OpenLayers 2.3. The lack of a good isEquivilantURL function
+ * caused problems in 2.2, but it's possible that with the improved
+ * isEquivilant URL function, this might be neccesary at some point.
+ *
+ * See discussion in the thread at
+ * http://openlayers.org/pipermail/dev/2007-January/000205.html
*
* @private
*/
diff --git a/lib/OpenLayers/Util.js b/lib/OpenLayers/Util.js
index 84f1a538ab..e58a096869 100644
--- a/lib/OpenLayers/Util.js
+++ b/lib/OpenLayers/Util.js
@@ -568,11 +568,10 @@ OpenLayers.Util.distVincenty=function(p1, p2) {
*/
OpenLayers.Util.getArgs = function(url) {
if(url == null) {
- var query = window.location.search.substring(1);
- } else {
- var query = (url.indexOf('?') == -1) ?
- '' : url.substring(url.indexOf('?') + 1);
+ url = window.location.href;
}
+ var query = (url.indexOf('?') != -1) ? url.substring(url.indexOf('?') + 1) : '';
+
var args = new Object();
pairs = query.split(/[&;]/);
for(var i = 0; i < pairs.length; ++i) {
@@ -747,11 +746,36 @@ OpenLayers.Util.isEquivalentUrl = function(url1, url2, options) {
urlObj1 = OpenLayers.Util.createUrlObject(url1, options);
urlObj2 = OpenLayers.Util.createUrlObject(url2, options);
- //compare keys (host, port, etc)
+ //compare all keys (host, port, etc)
for(var key in urlObj1) {
- if ( (key != "args") && (urlObj1[key] != urlObj2[key]) ) {
- return false;
+ if (options.test) {
+ alert(key + "\n1:" + urlObj1[key] + "\n2:" + urlObj2[key]);
}
+ var val1 = urlObj1[key];
+ var val2 = urlObj2[key];
+
+ switch(key) {
+ case "args":
+ //do nothing, they'll be treated below
+ break;
+ case "host":
+ case "port":
+ case "protocol":
+ if ((val1 == "") || (val2 == "")) {
+ //these will be blank for relative urls, so no need to
+ // compare them here -- call break.
+ //
+ break;
+ }
+ // otherwise continue with default compare
+ //
+ default:
+ if ( (key != "args") && (urlObj1[key] != urlObj2[key]) ) {
+ return false;
+ }
+ break;
+ }
+
}
// compare search args - irrespective of order
@@ -789,18 +813,8 @@ OpenLayers.Util.createUrlObject = function(url, options) {
}
var a = document.createElement('a');
-
a.href = url;
- //protocol
- urlObject.protocol = a.protocol;
-
- //pathname (this part allows for relative <-> absolute comparison)
- urlObject.pathname = a.pathname;
-
- //hash
- urlObject.hash = (options.ignoreHash) ? "" : a.hash;
-
//host (without port)
urlObject.host = a.host;
var port = a.port;
@@ -808,13 +822,104 @@ OpenLayers.Util.createUrlObject = function(url, options) {
var newHostLength = urlObject.host.length - (port.length);
urlObject.host = urlObject.host.substring(0, newHostLength);
}
-
+
+ //protocol
+ urlObject.protocol = a.protocol;
+
//port
urlObject.port = ((port == "80") && (options.ignorePort80)) ? "" : port;
+ //hash
+ urlObject.hash = (options.ignoreHash) ? "" : a.hash;
+
//args
- urlObject.args = OpenLayers.Util.getArgs(a.search);
+ var queryString = a.search;
+ if (!queryString) {
+ var qMark = url.indexOf("?");
+ queryString = (qMark != -1) ? url.substr(qMark) : "";
+ }
+ urlObject.args = OpenLayers.Util.getArgs(queryString);
+
+
+ //pathname (this part allows for relative <-> absolute comparison)
+ if ( ((urlObject.protocol == "file:") && (url.indexOf("file:") != -1)) ||
+ ((urlObject.protocol != "file:") && (urlObject.host != "")) ) {
+
+ urlObject.pathname = a.pathname;
+
+ //Test to see if the pathname includes the arguments (Opera)
+ var qIndex = urlObject.pathname.indexOf("?");
+ if (qIndex != -1) {
+ urlObject.pathname = urlObject.pathname.substring(0, qIndex);
+ }
+
+ } else {
+ var relStr = OpenLayers.Util.removeTail(url);
+
+ var backs = 0;
+ do {
+ var index = relStr.indexOf("../");
+
+ if (index == 0) {
+ backs++
+ relStr = relStr.substr(3);
+ } else if (index >= 0) {
+ var prevChunk = relStr.substr(0,index - 1);
+
+ var slash = prevChunk.indexOf("/");
+ prevChunk = (slash != -1) ? prevChunk.substr(0, slash +1)
+ : "";
+
+ var postChunk = relStr.substr(index + 3);
+ relStr = prevChunk + postChunk;
+ }
+ } while(index != -1)
+
+ var windowAnchor = document.createElement("a");
+ var windowUrl = window.location.href;
+ if (options.ignoreCase) {
+ windowUrl = windowUrl.toLowerCase();
+ }
+ windowAnchor.href = windowUrl;
+
+ //set protocol of window
+ urlObject.protocol = windowAnchor.protocol;
+
+ var splitter = (windowAnchor.pathname.indexOf("/") != -1) ? "/" : "\\";
+ var dirs = windowAnchor.pathname.split(splitter);
+ dirs.pop(); //remove filename
+ while ((backs > 0) && (dirs.length > 0)) {
+ dirs.pop();
+ backs--;
+ }
+ relStr = dirs.join("/") + "/"+ relStr;
+ urlObject.pathname = relStr;
+ }
+
+ if ((urlObject.protocol == "file:") || (urlObject.protocol == "")) {
+ urlObject.host = "localhost";
+ }
return urlObject;
};
-
\ No newline at end of file
+
+/**
+ * @param {String} url
+ *
+ * @returns The string with all queryString and Hash removed
+ * @type String
+ */
+OpenLayers.Util.removeTail = function(url) {
+ var head = null;
+
+ var qMark = url.indexOf("?");
+ var hashMark = url.indexOf("#");
+
+ if (qMark == -1) {
+ head = (hashMark != -1) ? url.substr(0,hashMark) : url;
+ } else {
+ head = (hashMark != -1) ? url.substr(0,Math.min(qMark, hashMark))
+ : url.substr(0, qMark);
+ }
+ return head;
+};
\ No newline at end of file
diff --git a/tests/test_Icon.html b/tests/test_Icon.html
index c93d3e31db..5aaba8cd8f 100644
--- a/tests/test_Icon.html
+++ b/tests/test_Icon.html
@@ -24,16 +24,14 @@
t.eq( cloned.url, "b", "cloned.url does change when edited" );
}
- function test_02_Marker_setOpacity(t) {
+ function test_03_Marker_setOpacity(t) {
t.plan( 2 );
icon = new OpenLayers.Icon("a",new OpenLayers.Size(5,6));
-
t.ok(!icon.imageDiv.style.opacity, "default icon has no opacity");
icon.setOpacity(0.5);
-
- t.eq(icon.imageDiv.style.opacity + "", "0.5", "icon.setOpacity() works");
+ t.eq(parseFloat(icon.imageDiv.style.opacity), 0.5, "icon.setOpacity() works");
}
// -->
diff --git a/tests/test_Layer_EventPane.html b/tests/test_Layer_EventPane.html
index fc100d63fd..6e6efb21cf 100644
--- a/tests/test_Layer_EventPane.html
+++ b/tests/test_Layer_EventPane.html
@@ -3,6 +3,7 @@