From 67ced536c06f2ef1e2bed0a64aac4a9a8abd2e63 Mon Sep 17 00:00:00 2001 From: Schuyler Erle Date: Thu, 5 Oct 2006 14:50:47 +0000 Subject: [PATCH] Merged r1559:r1587 from source:/sandbox/crschmidt/noprototype. OpenLayers is now Prototype-free(tm). git-svn-id: http://svn.openlayers.org/trunk/openlayers@1588 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- build/license.txt | 4 +- lib/OpenLayers.js | 6 +- lib/OpenLayers/Ajax.js | 198 ++- lib/OpenLayers/BaseTypes.js | 149 +- lib/OpenLayers/Control.js | 4 +- lib/OpenLayers/Control/KeyboardDefaults.js | 14 +- lib/OpenLayers/Control/LayerSwitcher.js | 31 +- lib/OpenLayers/Control/MouseDefaults.js | 24 +- lib/OpenLayers/Control/MouseToolbar.js | 24 +- lib/OpenLayers/Control/PanZoom.js | 10 +- lib/OpenLayers/Control/PanZoomBar.js | 22 +- lib/OpenLayers/Control/Permalink.js | 4 +- lib/OpenLayers/Control/Scale.js | 4 +- lib/OpenLayers/Events.js | 130 +- lib/OpenLayers/Feature.js | 2 +- lib/OpenLayers/Feature/WFS.js | 4 +- lib/OpenLayers/Icon.js | 2 +- lib/OpenLayers/Layer.js | 10 +- lib/OpenLayers/Layer/Boxes.js | 4 +- lib/OpenLayers/Layer/Canvas.js | 4 +- lib/OpenLayers/Layer/EventPane.js | 4 +- lib/OpenLayers/Layer/FixedZoomLevels.js | 2 +- lib/OpenLayers/Layer/GeoRSS.js | 8 +- lib/OpenLayers/Layer/Google.js | 6 +- lib/OpenLayers/Layer/Grid.js | 4 +- lib/OpenLayers/Layer/HTTPRequest.js | 12 +- lib/OpenLayers/Layer/KaMap.js | 4 +- lib/OpenLayers/Layer/MapServer.js | 8 +- lib/OpenLayers/Layer/Markers.js | 4 +- lib/OpenLayers/Layer/MultiMap.js | 4 +- lib/OpenLayers/Layer/Text.js | 6 +- lib/OpenLayers/Layer/VirtualEarth.js | 6 +- lib/OpenLayers/Layer/WFS.js | 6 +- lib/OpenLayers/Layer/WMS.js | 4 +- lib/OpenLayers/Layer/WMS/Untiled.js | 4 +- lib/OpenLayers/Layer/WorldWind.js | 4 +- lib/OpenLayers/Layer/Yahoo.js | 4 +- lib/OpenLayers/Map.js | 10 +- lib/OpenLayers/Marker.js | 2 +- lib/OpenLayers/Marker/Box.js | 4 +- lib/OpenLayers/Popup.js | 10 +- lib/OpenLayers/Popup/Anchored.js | 4 +- lib/OpenLayers/Popup/AnchoredBubble.js | 4 +- lib/OpenLayers/Tile.js | 2 +- lib/OpenLayers/Tile/Image.js | 4 +- lib/OpenLayers/Tile/WFS.js | 4 +- lib/OpenLayers/Util.js | 80 +- lib/Prototype.js | 1781 -------------------- lib/Rico/Color.js | 2 +- lib/Rico/Corner.js | 2 +- tests/test_Layer_WMS.html | 2 +- 51 files changed, 688 insertions(+), 1963 deletions(-) delete mode 100644 lib/Prototype.js diff --git a/build/license.txt b/build/license.txt index 440b22ffa9..6601d6c732 100644 --- a/build/license.txt +++ b/build/license.txt @@ -13,7 +13,9 @@ */ -/* Prototype JavaScript framework, version 1.4.0 +/* Contains portions of Prototype.js: + * + * Prototype JavaScript framework, version 1.4.0 * (c) 2005 Sam Stephenson * * Prototype is freely distributable under the terms of an MIT-style license. diff --git a/lib/OpenLayers.js b/lib/OpenLayers.js index f71ebed1f2..265e758be2 100644 --- a/lib/OpenLayers.js +++ b/lib/OpenLayers.js @@ -48,11 +48,11 @@ if (typeof(_OPENLAYERS_SFL_) == "undefined") { */ (function() { var jsfiles=new Array( - "Prototype.js", - "Rico/Corner.js", - "Rico/Color.js", "OpenLayers/BaseTypes.js", "OpenLayers/Util.js", + "OpenLayers/Prototype.js", + "Rico/Corner.js", + "Rico/Color.js", "OpenLayers/Ajax.js", "OpenLayers/Events.js", "OpenLayers/Map.js", diff --git a/lib/OpenLayers/Ajax.js b/lib/OpenLayers/Ajax.js index 565cfe895d..9cda5cdcb7 100644 --- a/lib/OpenLayers/Ajax.js +++ b/lib/OpenLayers/Ajax.js @@ -60,7 +60,7 @@ OpenLayers.loadURL = function(uri, params, caller, : OpenLayers.nullHandler; // from prototype.js - new Ajax.Request(uri, + new OpenLayers.Ajax.Request(uri, { method: 'get', parameters: params, onComplete: success, @@ -83,7 +83,7 @@ OpenLayers.parseXMLString = function(text) { text = text.substring(index); } - var ajaxResponse = Try.these( + var ajaxResponse = OpenLayers.Util.Try( function() { var xmldom = new ActiveXObject('Microsoft.XMLDOM'); xmldom.loadXML(text); @@ -106,3 +106,197 @@ OpenLayers.parseXMLString = function(text) { return ajaxResponse; }; + +OpenLayers.Ajax = { + emptyFunction: function () {}, + + getTransport: function() { + return OpenLayers.Util.Try( + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')}, + function() {return new XMLHttpRequest()} + ) || false; + }, + + activeRequestCount: 0 +}; + +OpenLayers.Ajax.Responders = { + responders: [], + + register: function(responderToAdd) { + for (var i = 0; i < this.responders.length; i++) + if (responderToAdd == this.responders[i]) + return; + this.responders.push(responderToAdd); + }, + + dispatch: function(callback, request, transport, json) { + for (var i = 0; i < this.responders.length; i++) { + responder = this.responders[i]; + if (responder[callback] && typeof responder[callback] == 'function') { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) {} + } + } + } +}; + +OpenLayers.Ajax.Responders.register({ + onCreate: function() { + OpenLayers.Ajax.activeRequestCount++; + }, + + onComplete: function() { + OpenLayers.Ajax.activeRequestCount--; + } +}); + +OpenLayers.Ajax.Base = function() {}; +OpenLayers.Ajax.Base.prototype = { + setOptions: function(options) { + this.options = { + method: 'post', + asynchronous: true, + parameters: '' + } + OpenLayers.Util.extend(this.options, options || {}); + }, + + responseIsSuccess: function() { + return this.transport.status == undefined + || this.transport.status == 0 + || (this.transport.status >= 200 && this.transport.status < 300); + }, + + responseIsFailure: function() { + return !this.responseIsSuccess(); + } +} + +OpenLayers.Ajax.Request = OpenLayers.Class.create(); +OpenLayers.Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + +OpenLayers.Ajax.Request.prototype = OpenLayers.Util.extend(new OpenLayers.Ajax.Base(), { + initialize: function(url, options) { + this.transport = OpenLayers.Ajax.getTransport(); + this.setOptions(options); + this.request(url); + }, + + request: function(url) { + var parameters = this.options.parameters || ''; + if (parameters.length > 0) parameters += '&_='; + + try { + this.url = url; + if (this.options.method == 'get' && parameters.length > 0) + this.url += (this.url.match(/\?/) ? '&' : '?') + parameters; + + OpenLayers.Ajax.Responders.dispatch('onCreate', this, this.transport); + + this.transport.open(this.options.method, this.url, + this.options.asynchronous); + + if (this.options.asynchronous) { + this.transport.onreadystatechange = this.onStateChange.bind(this); + setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); + } + + this.setRequestHeaders(); + + var body = this.options.postBody ? this.options.postBody : parameters; + this.transport.send(this.options.method == 'post' ? body : null); + + } catch (e) { + this.dispatchException(e); + } + }, + + setRequestHeaders: function() { + var requestHeaders = + ['X-Requested-With', 'XMLHttpRequest', + 'X-Prototype-Version', 'OpenLayers']; + + if (this.options.method == 'post') { + requestHeaders.push('Content-type', + 'application/x-www-form-urlencoded'); + + /* Force "Connection: close" for Mozilla browsers to work around + * a bug where XMLHttpReqeuest sends an incorrect Content-length + * header. See Mozilla Bugzilla #246651. + */ + if (this.transport.overrideMimeType) + requestHeaders.push('Connection', 'close'); + } + + if (this.options.requestHeaders) + requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); + + for (var i = 0; i < requestHeaders.length; i += 2) + this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState != 1) + this.respondToReadyState(this.transport.readyState); + }, + + header: function(name) { + try { + return this.transport.getResponseHeader(name); + } catch (e) {} + }, + + evalJSON: function() { + try { + return eval(this.header('X-JSON')); + } catch (e) {} + }, + + evalResponse: function() { + try { + return eval(this.transport.responseText); + } catch (e) { + this.dispatchException(e); + } + }, + + respondToReadyState: function(readyState) { + var event = OpenLayers.Ajax.Request.Events[readyState]; + var transport = this.transport, json = this.evalJSON(); + + if (event == 'Complete') { + try { + (this.options['on' + this.transport.status] + || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')] + || OpenLayers.Ajax.emptyFunction)(transport, json); + } catch (e) { + this.dispatchException(e); + } + + if ((this.header('Content-type') || '').match(/^text\/javascript/i)) + this.evalResponse(); + } + + try { + (this.options['on' + event] || OpenLayers.Ajax.emptyFunction)(transport, json); + OpenLayers.Ajax.Responders.dispatch('on' + event, this, transport, json); + } catch (e) { + this.dispatchException(e); + } + + /* Avoid memory leak in MSIE: clean up the oncomplete event handler */ + if (event == 'Complete') + this.transport.onreadystatechange = OpenLayers.Ajax.emptyFunction; + }, + + dispatchException: function(exception) { + (this.options.onException || OpenLayers.Ajax.emptyFunction)(this, exception); + OpenLayers.Ajax.Responders.dispatch('onException', this, exception); + } +}); + diff --git a/lib/OpenLayers/BaseTypes.js b/lib/OpenLayers/BaseTypes.js index 369018738d..408e6335e4 100644 --- a/lib/OpenLayers/BaseTypes.js +++ b/lib/OpenLayers/BaseTypes.js @@ -2,6 +2,14 @@ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full * text of the license. */ +/* OpenLayers.Class metaclass */ +OpenLayers.Class = { + create: function() { + return function() { + this.initialize.apply(this, arguments); + } + } +}; /********************* * * @@ -9,13 +17,12 @@ * * *********************/ - /** * @class * * This class represents a screen coordinate, in x and y coordinates */ -OpenLayers.Pixel = Class.create(); +OpenLayers.Pixel = OpenLayers.Class.create(); OpenLayers.Pixel.prototype = { /** @type float */ @@ -106,7 +113,7 @@ OpenLayers.Pixel.prototype = { * * This class represents a width and height pair */ -OpenLayers.Size = Class.create(); +OpenLayers.Size = OpenLayers.Class.create(); OpenLayers.Size.prototype = { /** @type float */ @@ -177,7 +184,7 @@ OpenLayers.Size.prototype = { * * This class represents a longitude and latitude pair */ -OpenLayers.LonLat = Class.create(); +OpenLayers.LonLat = OpenLayers.Class.create(); OpenLayers.LonLat.prototype = { /** @type float */ @@ -290,7 +297,7 @@ OpenLayers.LonLat.fromString = function(str) { * This class represents a bounding box. * Data stored as left, bottom, right, top floats */ -OpenLayers.Bounds = Class.create(); +OpenLayers.Bounds = OpenLayers.Class.create(); OpenLayers.Bounds.prototype = { /** @type float */ @@ -652,7 +659,88 @@ OpenLayers.Bounds.oppositeQuadrant = function(quadrant) { }; +/********************* + * * + * ELEMENT * + * * + *********************/ +OpenLayers.Element = { + visible: function(element) { + return $(element).style.display != 'none'; + }, + + toggle: function() { + for (var i = 0; i < arguments.length; i++) { + var element = $(arguments[i]); + OpenLayers.Element[OpenLayers.Element.visible(element) ? 'hide' : 'show'](element); + } + }, + + hide: function() { + for (var i = 0; i < arguments.length; i++) { + var element = $(arguments[i]); + element.style.display = 'none'; + } + }, + + show: function() { + for (var i = 0; i < arguments.length; i++) { + var element = $(arguments[i]); + element.style.display = ''; + } + }, + + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + }, + + getHeight: function(element) { + element = $(element); + return element.offsetHeight; + }, + + getDimensions: function(element) { + element = $(element); + if (OpenLayers.Element.getStyle(element, 'display') != 'none') + return {width: element.offsetWidth, height: element.offsetHeight}; + + // All *Width and *Height properties give 0 on elements with display none, + // so enable the element temporarily + var els = element.style; + var originalVisibility = els.visibility; + var originalPosition = els.position; + els.visibility = 'hidden'; + els.position = 'absolute'; + els.display = ''; + var originalWidth = element.clientWidth; + var originalHeight = element.clientHeight; + els.display = 'none'; + els.position = originalPosition; + els.visibility = originalVisibility; + return {width: originalWidth, height: originalHeight}; + }, + + getStyle: function(element, style) { + element = $(element); + var value = element.style[style.camelize()]; + if (!value) { + if (document.defaultView && document.defaultView.getComputedStyle) { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css.getPropertyValue(style) : null; + } else if (element.currentStyle) { + value = element.currentStyle[style.camelize()]; + } + } + + if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) + if (OpenLayers.Element.getStyle(element, 'position') == 'static') value = 'auto'; + + return value == 'auto' ? null : value; + } + +}; /********************* * * @@ -660,8 +748,6 @@ OpenLayers.Bounds.oppositeQuadrant = function(quadrant) { * * *********************/ - - /** * @param {String} sStart * @@ -703,6 +789,28 @@ String.prototype.trim = function() { }; +String.indexOf = function(object) { + for (var i = 0; i < this.length; i++) + if (this[i] == object) return i; + return -1; +}; + +String.prototype.camelize = function() { + var oStringList = this.split('-'); + if (oStringList.length == 1) return oStringList[0]; + + var camelizedString = this.indexOf('-') == 0 + ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) + : oStringList[0]; + + for (var i = 1, len = oStringList.length; i < len; i++) { + var s = oStringList[i]; + camelizedString += s.charAt(0).toUpperCase() + s.substring(1); + } + + return camelizedString; +}; + /********************* @@ -756,8 +864,6 @@ Array.prototype.clear = function() { * * *********************/ - - /** NOTE: Works only with integer values does *not* work with floats! * * @param {int} sig @@ -774,3 +880,28 @@ Number.prototype.limitSigDigs = function(sig) { } return parseInt(number); } + + +/********************* + * * + * FUNCTION * + * * + *********************/ + +Function.prototype.bind = function() { + var __method = this, args = [], object = arguments[0]; + for (var i = 1; i < arguments.length; i++) + args.push(arguments[i]); + return function(moreargs) { + for (var i = 0; i < arguments.length; i++) + args.push(arguments[i]); + return __method.apply(object, args); + } +}; + +Function.prototype.bindAsEventListener = function(object) { + var __method = this; + return function(event) { + return __method.call(object, event || window.event); + } +}; diff --git a/lib/OpenLayers/Control.js b/lib/OpenLayers/Control.js index 2df61bf144..8e4867b3e1 100644 --- a/lib/OpenLayers/Control.js +++ b/lib/OpenLayers/Control.js @@ -5,7 +5,7 @@ /** * @class */ -OpenLayers.Control = Class.create(); +OpenLayers.Control = OpenLayers.Class.create(); OpenLayers.Control.prototype = { /** @type String */ @@ -30,7 +30,7 @@ OpenLayers.Control.prototype = { * @param {Object} options */ initialize: function (options) { - Object.extend(this, options); + OpenLayers.Util.extend(this, options); this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_"); }, diff --git a/lib/OpenLayers/Control/KeyboardDefaults.js b/lib/OpenLayers/Control/KeyboardDefaults.js index ac2ec1e877..6032fcff5f 100644 --- a/lib/OpenLayers/Control/KeyboardDefaults.js +++ b/lib/OpenLayers/Control/KeyboardDefaults.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Control.js */ -OpenLayers.Control.KeyboardDefaults = Class.create(); +OpenLayers.Control.KeyboardDefaults = OpenLayers.Class.create(); OpenLayers.Control.KeyboardDefaults.prototype = - Object.extend( new OpenLayers.Control(), { + OpenLayers.Util.extend( new OpenLayers.Control(), { /** @type int */ slideFactor: 50, @@ -25,7 +25,7 @@ OpenLayers.Control.KeyboardDefaults.prototype = * */ draw: function() { - Event.observe(document, + OpenLayers.Event.observe(document, 'keypress', this.defaultKeyDown.bind(this)); }, @@ -35,16 +35,16 @@ OpenLayers.Control.KeyboardDefaults.prototype = */ defaultKeyDown: function (evt) { switch(evt.keyCode) { - case Event.KEY_LEFT: + case OpenLayers.Event.KEY_LEFT: this.map.pan(-50, 0); break; - case Event.KEY_RIGHT: + case OpenLayers.Event.KEY_RIGHT: this.map.pan(50, 0); break; - case Event.KEY_UP: + case OpenLayers.Event.KEY_UP: this.map.pan(0, -50); break; - case Event.KEY_DOWN: + case OpenLayers.Event.KEY_DOWN: this.map.pan(0, 50); break; } diff --git a/lib/OpenLayers/Control/LayerSwitcher.js b/lib/OpenLayers/Control/LayerSwitcher.js index 05cf7500b8..d5acfa9add 100644 --- a/lib/OpenLayers/Control/LayerSwitcher.js +++ b/lib/OpenLayers/Control/LayerSwitcher.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Control.js */ -OpenLayers.Control.LayerSwitcher = Class.create(); +OpenLayers.Control.LayerSwitcher = OpenLayers.Class.create(); OpenLayers.Control.LayerSwitcher.prototype = - Object.extend( new OpenLayers.Control(), { + OpenLayers.Util.extend( new OpenLayers.Control(), { /** @type String */ activeColor: "darkblue", @@ -129,10 +129,11 @@ OpenLayers.Control.LayerSwitcher.prototype = inputElem.defaultChecked = checked; inputElem.layer = layer; inputElem.control = this; + if (!baseLayer && !layer.inRange()) { inputElem.disabled = true; } - Event.observe(inputElem, "mouseup", + OpenLayers.Event.observe(inputElem, "mouseup", this.onInputClick.bindAsEventListener(inputElem)); // create span @@ -142,7 +143,7 @@ OpenLayers.Control.LayerSwitcher.prototype = } labelSpan.innerHTML = layer.name; labelSpan.style.verticalAlign = (baseLayer) ? "bottom" : "baseline"; - Event.observe(labelSpan, "click", + OpenLayers.Event.observe(labelSpan, "click", this.onInputClick.bindAsEventListener(inputElem)); // create line break var br = document.createElement("br"); @@ -185,7 +186,7 @@ OpenLayers.Control.LayerSwitcher.prototype = this.control.updateMap(); } } - Event.stop(e); + OpenLayers.Event.stop(e); }, /** Need to update the map accordingly whenever user clicks in either of @@ -237,7 +238,7 @@ OpenLayers.Control.LayerSwitcher.prototype = this.showControls(false); if (e != null) { - Event.stop(e); + OpenLayers.Event.stop(e); } }, @@ -254,7 +255,7 @@ OpenLayers.Control.LayerSwitcher.prototype = this.showControls(true); if (e != null) { - Event.stop(e); + OpenLayers.Event.stop(e); } }, @@ -292,13 +293,13 @@ OpenLayers.Control.LayerSwitcher.prototype = this.div.style.color = "white"; this.div.style.backgroundColor = "transparent"; - Event.observe(this.div, "mouseup", + OpenLayers.Event.observe(this.div, "mouseup", this.mouseUp.bindAsEventListener(this)); - Event.observe(this.div, "click", + OpenLayers.Event.observe(this.div, "click", this.ignoreEvent); - Event.observe(this.div, "mousedown", + OpenLayers.Event.observe(this.div, "mousedown", this.mouseDown.bindAsEventListener(this)); - Event.observe(this.div, "dblclick", this.ignoreEvent); + OpenLayers.Event.observe(this.div, "dblclick", this.ignoreEvent); // layers list div @@ -325,7 +326,7 @@ OpenLayers.Control.LayerSwitcher.prototype = this.baseLayersDiv = document.createElement("div"); this.baseLayersDiv.style.paddingLeft = "10px"; - /*Event.observe(this.baseLayersDiv, "click", + /*OpenLayers.Event.observe(this.baseLayersDiv, "click", this.onLayerClick.bindAsEventListener(this)); */ @@ -375,7 +376,7 @@ OpenLayers.Control.LayerSwitcher.prototype = this.maximizeDiv.style.right = "0px"; this.maximizeDiv.style.left = ""; this.maximizeDiv.style.display = "none"; - Event.observe(this.maximizeDiv, + OpenLayers.Event.observe(this.maximizeDiv, "click", this.maximizeControl.bindAsEventListener(this)); @@ -394,7 +395,7 @@ OpenLayers.Control.LayerSwitcher.prototype = this.minimizeDiv.style.right = "0px"; this.minimizeDiv.style.left = ""; this.minimizeDiv.style.display = "none"; - Event.observe(this.minimizeDiv, + OpenLayers.Event.observe(this.minimizeDiv, "click", this.minimizeControl.bindAsEventListener(this)); @@ -407,7 +408,7 @@ OpenLayers.Control.LayerSwitcher.prototype = * @param {Event} evt */ ignoreEvent: function(evt) { - Event.stop(evt); + OpenLayers.Event.stop(evt); }, /** Register a local 'mouseDown' flag so that we'll know whether or not diff --git a/lib/OpenLayers/Control/MouseDefaults.js b/lib/OpenLayers/Control/MouseDefaults.js index 7dbacbc95e..7acf97c488 100644 --- a/lib/OpenLayers/Control/MouseDefaults.js +++ b/lib/OpenLayers/Control/MouseDefaults.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Control.js */ -OpenLayers.Control.MouseDefaults = Class.create(); +OpenLayers.Control.MouseDefaults = OpenLayers.Class.create(); OpenLayers.Control.MouseDefaults.prototype = - Object.extend( new OpenLayers.Control(), { + OpenLayers.Util.extend( new OpenLayers.Control(), { /** @type Boolean */ performedDrag: false, @@ -21,11 +21,11 @@ OpenLayers.Control.MouseDefaults.prototype = OpenLayers.Control.prototype.initialize.apply(this, arguments); //register mousewheel events specifically on the window and document - Event.observe(window, "DOMMouseScroll", + OpenLayers.Event.observe(window, "DOMMouseScroll", this.onWheelEvent.bindAsEventListener(this)); - Event.observe(window, "mousewheel", + OpenLayers.Event.observe(window, "mousewheel", this.onWheelEvent.bindAsEventListener(this)); - Event.observe(document, "mousewheel", + OpenLayers.Event.observe(document, "mousewheel", this.onWheelEvent.bindAsEventListener(this)); }, @@ -47,7 +47,7 @@ OpenLayers.Control.MouseDefaults.prototype = * @type Boolean */ defaultClick: function (evt) { - if (!Event.isLeftClick(evt)) return; + if (!OpenLayers.Event.isLeftClick(evt)) return; var notAfterDrag = !this.performedDrag; this.performedDrag = false; return notAfterDrag; @@ -59,7 +59,7 @@ OpenLayers.Control.MouseDefaults.prototype = defaultDblClick: function (evt) { var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); this.map.setCenter(newCenter, this.map.zoom + 1); - Event.stop(evt); + OpenLayers.Event.stop(evt); return false; }, @@ -67,7 +67,7 @@ OpenLayers.Control.MouseDefaults.prototype = * @param {Event} evt */ defaultMouseDown: function (evt) { - if (!Event.isLeftClick(evt)) return; + if (!OpenLayers.Event.isLeftClick(evt)) return; this.mouseDragStart = evt.xy.clone(); this.performedDrag = false; if (evt.shiftKey) { @@ -86,7 +86,7 @@ OpenLayers.Control.MouseDefaults.prototype = this.map.viewPortDiv.appendChild(this.zoomBox); } document.onselectstart=function() { return false; } - Event.stop(evt); + OpenLayers.Event.stop(evt); }, /** @@ -124,7 +124,7 @@ OpenLayers.Control.MouseDefaults.prototype = * @param {Event} evt */ defaultMouseUp: function (evt) { - if (!Event.isLeftClick(evt)) return; + if (!OpenLayers.Event.isLeftClick(evt)) return; if (this.zoomBox) { this.zoomBoxEnd(evt); } else { @@ -217,7 +217,7 @@ OpenLayers.Control.MouseDefaults.prototype = // first determine whether or not the wheeling was inside the map var inMap = false; - var elem = Event.element(e); + var elem = OpenLayers.Event.element(e); while(elem != null) { if (this.map && elem == this.map.div) { inMap = true; @@ -249,7 +249,7 @@ OpenLayers.Control.MouseDefaults.prototype = } //only wheel the map, not the window - Event.stop(e); + OpenLayers.Event.stop(e); } }, diff --git a/lib/OpenLayers/Control/MouseToolbar.js b/lib/OpenLayers/Control/MouseToolbar.js index 7939b3300d..312f14277a 100644 --- a/lib/OpenLayers/Control/MouseToolbar.js +++ b/lib/OpenLayers/Control/MouseToolbar.js @@ -8,12 +8,12 @@ * @requires OpenLayers/Control.js * @requires OpenLayers/Control/MouseDefaults.js */ -OpenLayers.Control.MouseToolbar = Class.create(); +OpenLayers.Control.MouseToolbar = OpenLayers.Class.create(); OpenLayers.Control.MouseToolbar.X = 6; OpenLayers.Control.MouseToolbar.Y = 300; OpenLayers.Control.MouseToolbar.prototype = - Object.extend( new OpenLayers.Control(), - Object.extend( new OpenLayers.Control.MouseDefaults(), { + OpenLayers.Util.extend( new OpenLayers.Control(), + OpenLayers.Util.extend( new OpenLayers.Control.MouseDefaults(), { mode: null, @@ -68,7 +68,7 @@ OpenLayers.Control.MouseToolbar.prototype = btn.events = new OpenLayers.Events(this, btn, null, true); btn.events.register("mousedown", this, this.buttonDown); btn.events.register("mouseup", this, this.buttonUp); - btn.events.register("dblclick", this, Event.stop); + btn.events.register("dblclick", this, OpenLayers.Event.stop); btn.action = id; btn.title = title; btn.alt = title; @@ -83,21 +83,21 @@ OpenLayers.Control.MouseToolbar.prototype = * @param {Event} evt */ buttonDown: function(evt) { - if (!Event.isLeftClick(evt)) return; + if (!OpenLayers.Event.isLeftClick(evt)) return; this.buttonClicked = evt.element.action; - Event.stop(evt); + OpenLayers.Event.stop(evt); }, /** * @param {Event} evt */ buttonUp: function(evt) { - if (!Event.isLeftClick(evt)) return; + if (!OpenLayers.Event.isLeftClick(evt)) return; if (this.buttonClicked != null) { if (this.buttonClicked == evt.element.action) { this.switchModeTo(evt.element.action); } - Event.stop(evt); + OpenLayers.Event.stop(evt); this.buttonClicked = null; } }, @@ -110,7 +110,7 @@ OpenLayers.Control.MouseToolbar.prototype = this.performedDrag = false; var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); this.map.setCenter(newCenter, this.map.zoom + 1); - Event.stop(evt); + OpenLayers.Event.stop(evt); return false; }, @@ -118,7 +118,7 @@ OpenLayers.Control.MouseToolbar.prototype = * @param {Event} evt */ defaultMouseDown: function (evt) { - if (!Event.isLeftClick(evt)) return; + if (!OpenLayers.Event.isLeftClick(evt)) return; this.mouseDragStart = evt.xy.clone(); this.performedDrag = false; this.startViaKeyboard = false; @@ -194,7 +194,7 @@ OpenLayers.Control.MouseToolbar.prototype = break; } document.onselectstart = function() { return false; } - Event.stop(evt); + OpenLayers.Event.stop(evt); }, switchModeTo: function(mode) { @@ -269,7 +269,7 @@ OpenLayers.Control.MouseToolbar.prototype = * @param {Event} evt */ defaultMouseUp: function (evt) { - if (!Event.isLeftClick(evt)) return; + if (!OpenLayers.Event.isLeftClick(evt)) return; switch (this.mode) { case "zoombox": this.zoomBoxEnd(evt); diff --git a/lib/OpenLayers/Control/PanZoom.js b/lib/OpenLayers/Control/PanZoom.js index 518c836c31..1241c95aa6 100644 --- a/lib/OpenLayers/Control/PanZoom.js +++ b/lib/OpenLayers/Control/PanZoom.js @@ -7,11 +7,11 @@ * * @requires OpenLayers/Control.js */ -OpenLayers.Control.PanZoom = Class.create(); +OpenLayers.Control.PanZoom = OpenLayers.Class.create(); OpenLayers.Control.PanZoom.X = 4; OpenLayers.Control.PanZoom.Y = 4; OpenLayers.Control.PanZoom.prototype = - Object.extend( new OpenLayers.Control(), { + OpenLayers.Util.extend( new OpenLayers.Control(), { /** @type int */ slideFactor: 50, @@ -101,7 +101,7 @@ OpenLayers.Control.PanZoom.prototype = * @type Boolean */ doubleClick: function (evt) { - Event.stop(evt); + OpenLayers.Event.stop(evt); return false; }, @@ -109,7 +109,7 @@ OpenLayers.Control.PanZoom.prototype = * @param {Event} evt */ buttonDown: function (evt) { - if (!Event.isLeftClick(evt)) return; + if (!OpenLayers.Event.isLeftClick(evt)) return; switch (this.action) { case "panup": @@ -135,7 +135,7 @@ OpenLayers.Control.PanZoom.prototype = break; } - Event.stop(evt); + OpenLayers.Event.stop(evt); }, /** diff --git a/lib/OpenLayers/Control/PanZoomBar.js b/lib/OpenLayers/Control/PanZoomBar.js index 6706a37365..1795a93e9d 100644 --- a/lib/OpenLayers/Control/PanZoomBar.js +++ b/lib/OpenLayers/Control/PanZoomBar.js @@ -7,11 +7,11 @@ * * @requires OpenLayers/Control/PanZoom.js */ -OpenLayers.Control.PanZoomBar = Class.create(); +OpenLayers.Control.PanZoomBar = OpenLayers.Class.create(); OpenLayers.Control.PanZoomBar.X = 4; OpenLayers.Control.PanZoomBar.Y = 4; OpenLayers.Control.PanZoomBar.prototype = - Object.extend( new OpenLayers.Control.PanZoom(), { + OpenLayers.Util.extend( new OpenLayers.Control.PanZoom(), { /** @type Array(...) */ buttons: null, @@ -147,12 +147,12 @@ OpenLayers.Control.PanZoomBar.prototype = * and sets the zoom level appropriately. */ divClick: function (evt) { - if (!Event.isLeftClick(evt)) return; + if (!OpenLayers.Event.isLeftClick(evt)) return; var y = evt.xy.y; - var top = Position.page(evt.object)[1]; + var top = OpenLayers.Util.pagePosition(evt.object)[1]; var levels = Math.floor((y - top)/this.zoomStopHeight); this.map.zoomTo((this.map.getNumZoomLevels() -1) - levels); - Event.stop(evt); + OpenLayers.Event.stop(evt); }, /* @@ -160,13 +160,13 @@ OpenLayers.Control.PanZoomBar.prototype = * event listener for clicks on the slider */ zoomBarDown:function(evt) { - if (!Event.isLeftClick(evt)) return; + if (!OpenLayers.Event.isLeftClick(evt)) return; this.map.events.register("mousemove", this, this.passEventToSlider); this.map.events.register("mouseup", this, this.passEventToSlider); this.mouseDragStart = evt.xy.clone(); this.zoomStart = evt.xy.clone(); this.div.style.cursor = "move"; - Event.stop(evt); + OpenLayers.Event.stop(evt); }, /* @@ -178,14 +178,14 @@ OpenLayers.Control.PanZoomBar.prototype = zoomBarDrag:function(evt) { if (this.mouseDragStart != null) { var deltaY = this.mouseDragStart.y - evt.xy.y - var offsets = Position.page(this.zoombarDiv); + var offsets = OpenLayers.Util.pagePosition(this.zoombarDiv); if ((evt.clientY - offsets[1]) > 0 && (evt.clientY - offsets[1]) < parseInt(this.zoombarDiv.style.height) - 2) { var newTop = parseInt(this.slider.style.top) - deltaY; this.slider.style.top = newTop+"px"; } this.mouseDragStart = evt.xy.clone(); - Event.stop(evt); + OpenLayers.Event.stop(evt); } }, @@ -195,7 +195,7 @@ OpenLayers.Control.PanZoomBar.prototype = * and switch to it. */ zoomBarUp:function(evt) { - if (!Event.isLeftClick(evt)) return; + if (!OpenLayers.Event.isLeftClick(evt)) return; if (this.zoomStart) { this.div.style.cursor="default"; this.map.events.unregister("mouseup", this, this.passEventToSlider); @@ -204,7 +204,7 @@ OpenLayers.Control.PanZoomBar.prototype = this.map.zoomTo(this.map.zoom + Math.round(deltaY/this.zoomStopHeight)); this.moveZoomBar(); this.mouseDragStart = null; - Event.stop(evt); + OpenLayers.Event.stop(evt); } }, diff --git a/lib/OpenLayers/Control/Permalink.js b/lib/OpenLayers/Control/Permalink.js index 07989be2b0..0c57a0a9b5 100644 --- a/lib/OpenLayers/Control/Permalink.js +++ b/lib/OpenLayers/Control/Permalink.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Control.js */ -OpenLayers.Control.Permalink = Class.create(); +OpenLayers.Control.Permalink = OpenLayers.Class.create(); OpenLayers.Control.Permalink.prototype = - Object.extend( new OpenLayers.Control(), { + OpenLayers.Util.extend( new OpenLayers.Control(), { /** @type DOMElement */ element: null, diff --git a/lib/OpenLayers/Control/Scale.js b/lib/OpenLayers/Control/Scale.js index 95bc2ee745..5663bfdae9 100644 --- a/lib/OpenLayers/Control/Scale.js +++ b/lib/OpenLayers/Control/Scale.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Control.js */ -OpenLayers.Control.Scale = Class.create(); +OpenLayers.Control.Scale = OpenLayers.Class.create(); OpenLayers.Control.Scale.prototype = - Object.extend( new OpenLayers.Control(), { + OpenLayers.Util.extend( new OpenLayers.Control(), { /** @type DOMElement */ element: null, diff --git a/lib/OpenLayers/Events.js b/lib/OpenLayers/Events.js index 5212f2491b..0312bbdba3 100644 --- a/lib/OpenLayers/Events.js +++ b/lib/OpenLayers/Events.js @@ -2,10 +2,121 @@ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full * text of the license. */ +OpenLayers.Event = { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + + element: function(event) { + return event.target || event.srcElement; + }, + + isLeftClick: function(event) { + return (((event.which) && (event.which == 1)) || + ((event.button) && (event.button == 1))); + }, + + pointerX: function(event) { + return event.pageX || (event.clientX + + (document.documentElement.scrollLeft || document.body.scrollLeft)); + }, + + pointerY: function(event) { + return event.pageY || (event.clientY + + (document.documentElement.scrollTop || document.body.scrollTop)); + }, + + stop: function(event) { + if (event.preventDefault) { + event.preventDefault(); + event.stopPropagation(); + } else { + event.returnValue = false; + event.cancelBubble = true; + } + }, + + // find the first node with the given tagName, starting from the + // node the event was triggered on; traverses the DOM upwards + findElement: function(event, tagName) { + var element = OpenLayers.Event.element(event); + while (element.parentNode && (!element.tagName || + (element.tagName.toUpperCase() != tagName.toUpperCase()))) + element = element.parentNode; + return element; + }, + + observers: false, + + _observeAndCache: function(element, name, observer, useCapture) { + if (!this.observers) this.observers = []; + if (element.addEventListener) { + this.observers.push([element, name, observer, useCapture]); + element.addEventListener(name, observer, useCapture); + } else if (element.attachEvent) { + this.observers.push([element, name, observer, useCapture]); + element.attachEvent('on' + name, observer); + } + }, + + unloadCache: function() { + if (!OpenLayers.Event.observers) return; + for (var i = 0; i < OpenLayers.Event.observers.length; i++) { + OpenLayers.Event.stopObserving.apply(this, OpenLayers.Event.observers[i]); + OpenLayers.Event.observers[i][0] = null; + } + OpenLayers.Event.observers = false; + }, + + observe: function(elementParam, name, observer, useCapture) { + var element = $(elementParam); + useCapture = useCapture || false; + + if (name == 'keypress' && + (navigator.appVersion.match(/Konqueror|Safari|KHTML/) + || element.attachEvent)) + name = 'keydown'; + + this._observeAndCache(element, name, observer, useCapture); + }, + + stopObserving: function(elementParam, name, observer, useCapture) { + var element = $(elementParam); + useCapture = useCapture || false; + + if (name == 'keypress' && + (navigator.appVersion.match(/Konqueror|Safari|KHTML/) + || element.detachEvent)) + name = 'keydown'; + + if (element.removeEventListener) { + element.removeEventListener(name, observer, useCapture); + } else if (element.detachEvent) { + element.detachEvent('on' + name, observer); + } + } +}; +/* prevent memory leaks in IE */ +OpenLayers.Event.observe(window, 'unload', OpenLayers.Event.unloadCache, false); + +if (window.Event) { + OpenLayers.Util.extend(window.Event, OpenLayers.Event); +} else { + var Event = OpenLayers.Event; +} + + + /** * @class */ -OpenLayers.Events = Class.create(); +OpenLayers.Events = OpenLayers.Class.create(); OpenLayers.Events.prototype = { /** @final @type Array: supported events */ @@ -29,7 +140,6 @@ OpenLayers.Events.prototype = { /** @type Array: list of support application events */ eventTypes: null, - /** * @constructor * @@ -72,11 +182,11 @@ OpenLayers.Events.prototype = { this.listeners[eventType] = new Array(); // use Prototype to register the event cross-browser - Event.observe(element, eventType, + OpenLayers.Event.observe(element, eventType, this.handleBrowserEvent.bindAsEventListener(this)); } // disable dragstart in IE so that mousedown/move/up works normally - Event.observe(element, "dragstart", Event.stop); + OpenLayers.Event.observe(element, "dragstart", OpenLayers.Event.stop); }, /** @@ -180,7 +290,7 @@ OpenLayers.Events.prototype = { } // don't fall through to other DOM elements if (!this.fallThrough) { - Event.stop(evt); + OpenLayers.Event.stop(evt); } } }, @@ -208,12 +318,14 @@ OpenLayers.Events.prototype = { */ getMousePosition: function (evt) { if (!this.element.offsets) { - this.element.offsets = Position.page(this.element); + this.element.offsets = OpenLayers.Util.pagePosition(this.element); } return new OpenLayers.Pixel( - (evt.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)) - this.element.offsets[0], - (evt.clientY + (document.documentElement.scrollTop || document.body.scrollTop)) - this.element.offsets[1] - ); + (evt.clientX + (document.documentElement.scrollLeft + || document.body.scrollLeft)) - this.element.offsets[0], + (evt.clientY + (document.documentElement.scrollTop + || document.body.scrollTop)) - this.element.offsets[1] + ); }, /** @final @type String */ diff --git a/lib/OpenLayers/Feature.js b/lib/OpenLayers/Feature.js index 0f3cb5760b..10715ce808 100644 --- a/lib/OpenLayers/Feature.js +++ b/lib/OpenLayers/Feature.js @@ -7,7 +7,7 @@ * * @requires OpenLayers/Util.js */ -OpenLayers.Feature = Class.create(); +OpenLayers.Feature = OpenLayers.Class.create(); OpenLayers.Feature.prototype= { /** @type OpenLayers.Events */ diff --git a/lib/OpenLayers/Feature/WFS.js b/lib/OpenLayers/Feature/WFS.js index efd573b172..26f2bea931 100644 --- a/lib/OpenLayers/Feature/WFS.js +++ b/lib/OpenLayers/Feature/WFS.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Feature.js */ -OpenLayers.Feature.WFS = Class.create(); +OpenLayers.Feature.WFS = OpenLayers.Class.create(); OpenLayers.Feature.WFS.prototype = - Object.extend( new OpenLayers.Feature(), { + OpenLayers.Util.extend( new OpenLayers.Feature(), { /** * @constructor diff --git a/lib/OpenLayers/Icon.js b/lib/OpenLayers/Icon.js index 2c3d8cb9ef..c541ce173a 100644 --- a/lib/OpenLayers/Icon.js +++ b/lib/OpenLayers/Icon.js @@ -5,7 +5,7 @@ /** * @class */ -OpenLayers.Icon = Class.create(); +OpenLayers.Icon = OpenLayers.Class.create(); OpenLayers.Icon.prototype = { /** image url diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index 89650b670f..079a3a83d9 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -5,7 +5,7 @@ /** * @class */ -OpenLayers.Layer = Class.create(); +OpenLayers.Layer = OpenLayers.Class.create(); OpenLayers.Layer.prototype = { /** @type String */ @@ -99,10 +99,10 @@ OpenLayers.Layer.prototype = { if (arguments.length > 0) { //store a copy of the custom options for later cloning - this.options = Object.extend(new Object(), options); + this.options = OpenLayers.Util.extend(new Object(), options); //add options to layer - Object.extend(this, this.options); + OpenLayers.Util.extend(this, this.options); this.name = name; @@ -166,10 +166,10 @@ OpenLayers.Layer.prototype = { addOptions: function (newOptions) { // update our copy for clone - Object.extend(this.options, newOptions); + OpenLayers.Util.extend(this.options, newOptions); // add new options to this - Object.extend(this, this.options); + OpenLayers.Util.extend(this, this.options); }, /** diff --git a/lib/OpenLayers/Layer/Boxes.js b/lib/OpenLayers/Layer/Boxes.js index d63a7f8b1c..75d73d65b3 100644 --- a/lib/OpenLayers/Layer/Boxes.js +++ b/lib/OpenLayers/Layer/Boxes.js @@ -8,9 +8,9 @@ * @requires OpenLayers/Layer.js * @requires OpenLayers/Layer/Markers.js */ -OpenLayers.Layer.Boxes = Class.create(); +OpenLayers.Layer.Boxes = OpenLayers.Class.create(); OpenLayers.Layer.Boxes.prototype = - Object.extend( new OpenLayers.Layer.Markers(), { + OpenLayers.Util.extend( new OpenLayers.Layer.Markers(), { initialize: function () { OpenLayers.Layer.Markers.prototype.initialize.apply(this, arguments); diff --git a/lib/OpenLayers/Layer/Canvas.js b/lib/OpenLayers/Layer/Canvas.js index b65605f8c4..9ff0fc5f91 100644 --- a/lib/OpenLayers/Layer/Canvas.js +++ b/lib/OpenLayers/Layer/Canvas.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Layer.js */ -OpenLayers.Layer.Canvas = Class.create(); +OpenLayers.Layer.Canvas = OpenLayers.Class.create(); OpenLayers.Layer.Canvas.prototype = - Object.extend( new OpenLayers.Layer(), { + OpenLayers.Util.extend( new OpenLayers.Layer(), { /** Canvas layer is never a base layer. * diff --git a/lib/OpenLayers/Layer/EventPane.js b/lib/OpenLayers/Layer/EventPane.js index 4d7ef493e8..091dc14eb5 100644 --- a/lib/OpenLayers/Layer/EventPane.js +++ b/lib/OpenLayers/Layer/EventPane.js @@ -8,9 +8,9 @@ * @requires OpenLayers/Layer.js * @requires OpenLayers/Util.js */ -OpenLayers.Layer.EventPane = Class.create(); +OpenLayers.Layer.EventPane = OpenLayers.Class.create(); OpenLayers.Layer.EventPane.prototype = - Object.extend(new OpenLayers.Layer, { + OpenLayers.Util.extend(new OpenLayers.Layer, { /** EventPaned layers are always base layers, by necessity. * diff --git a/lib/OpenLayers/Layer/FixedZoomLevels.js b/lib/OpenLayers/Layer/FixedZoomLevels.js index 55d6498a62..6d08cf4bd4 100644 --- a/lib/OpenLayers/Layer/FixedZoomLevels.js +++ b/lib/OpenLayers/Layer/FixedZoomLevels.js @@ -44,7 +44,7 @@ * * @class */ -OpenLayers.Layer.FixedZoomLevels = Class.create(); +OpenLayers.Layer.FixedZoomLevels = OpenLayers.Class.create(); OpenLayers.Layer.FixedZoomLevels.prototype = { /********************************************************/ diff --git a/lib/OpenLayers/Layer/GeoRSS.js b/lib/OpenLayers/Layer/GeoRSS.js index 48cbf565b3..3570d2d8fb 100644 --- a/lib/OpenLayers/Layer/GeoRSS.js +++ b/lib/OpenLayers/Layer/GeoRSS.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Layer/Markers.js */ -OpenLayers.Layer.GeoRSS = Class.create(); +OpenLayers.Layer.GeoRSS = OpenLayers.Class.create(); OpenLayers.Layer.GeoRSS.prototype = - Object.extend( new OpenLayers.Layer.Markers(), { + OpenLayers.Util.extend( new OpenLayers.Layer.Markers(), { /** store url of text file * @type str */ @@ -130,7 +130,7 @@ OpenLayers.Layer.GeoRSS.prototype = } if (!sameMarkerClicked) { var popup = this.createPopup(); - Event.observe(popup.div, "click", + OpenLayers.Event.observe(popup.div, "click", function() { for(var i=0; i < this.layer.map.popups.length; i++) { this.layer.map.removePopup(this.layer.map.popups[i]); @@ -138,7 +138,7 @@ OpenLayers.Layer.GeoRSS.prototype = }.bindAsEventListener(this)); this.layer.map.addPopup(popup); } - Event.stop(evt); + OpenLayers.Event.stop(evt); }, /** diff --git a/lib/OpenLayers/Layer/Google.js b/lib/OpenLayers/Layer/Google.js index f5df94ea8e..74304b8161 100644 --- a/lib/OpenLayers/Layer/Google.js +++ b/lib/OpenLayers/Layer/Google.js @@ -10,10 +10,10 @@ * * @requires OpenLayers/Layer/EventPane.js */ -OpenLayers.Layer.Google = Class.create(); +OpenLayers.Layer.Google = OpenLayers.Class.create(); OpenLayers.Layer.Google.prototype = - Object.extend( new OpenLayers.Layer.EventPane(), - Object.extend( new OpenLayers.Layer.FixedZoomLevels(), { + OpenLayers.Util.extend( new OpenLayers.Layer.EventPane(), + OpenLayers.Util.extend( new OpenLayers.Layer.FixedZoomLevels(), { /** @type Boolean */ isFixed: true, diff --git a/lib/OpenLayers/Layer/Grid.js b/lib/OpenLayers/Layer/Grid.js index 3ca1574fb3..46b65d19b8 100644 --- a/lib/OpenLayers/Layer/Grid.js +++ b/lib/OpenLayers/Layer/Grid.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Layer/HTTPRequest.js */ -OpenLayers.Layer.Grid = Class.create(); +OpenLayers.Layer.Grid = OpenLayers.Class.create(); OpenLayers.Layer.Grid.prototype = - Object.extend( new OpenLayers.Layer.HTTPRequest(), { + OpenLayers.Util.extend( new OpenLayers.Layer.HTTPRequest(), { /** @type OpenLayers.Size */ tileSize: null, diff --git a/lib/OpenLayers/Layer/HTTPRequest.js b/lib/OpenLayers/Layer/HTTPRequest.js index d3e8e14747..715a2dc18b 100644 --- a/lib/OpenLayers/Layer/HTTPRequest.js +++ b/lib/OpenLayers/Layer/HTTPRequest.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Layer.js */ -OpenLayers.Layer.HTTPRequest = Class.create(); +OpenLayers.Layer.HTTPRequest = OpenLayers.Class.create(); OpenLayers.Layer.HTTPRequest.prototype = - Object.extend( new OpenLayers.Layer(), { + OpenLayers.Util.extend( new OpenLayers.Layer(), { /** @type String */ url: null, @@ -33,7 +33,7 @@ OpenLayers.Layer.HTTPRequest.prototype = } OpenLayers.Layer.prototype.initialize.apply(this, newArguments); this.url = url; - this.params = Object.extend( new Object(), params); + this.params = OpenLayers.Util.extend( new Object(), params); }, /** @@ -79,7 +79,7 @@ OpenLayers.Layer.HTTPRequest.prototype = * @param {Object} newParams */ mergeNewParams:function(newParams) { - this.params = Object.extend(this.params, newParams); + this.params = OpenLayers.Util.extend(this.params, newParams); }, @@ -106,8 +106,8 @@ OpenLayers.Layer.HTTPRequest.prototype = // create a new params hashtable with all the layer params and the // new params together. then convert to string - var allParams = Object.extend(new Object(), this.params); - var allParams = Object.extend(allParams, newParams); + var allParams = OpenLayers.Util.extend(new Object(), this.params); + var allParams = OpenLayers.Util.extend(allParams, newParams); var paramsString = OpenLayers.Util.getParameterString(allParams); if (paramsString != "") { diff --git a/lib/OpenLayers/Layer/KaMap.js b/lib/OpenLayers/Layer/KaMap.js index ba024cbf36..2eef24d1b2 100644 --- a/lib/OpenLayers/Layer/KaMap.js +++ b/lib/OpenLayers/Layer/KaMap.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Layer/Grid.js */ -OpenLayers.Layer.KaMap = Class.create(); +OpenLayers.Layer.KaMap = OpenLayers.Class.create(); OpenLayers.Layer.KaMap.prototype = - Object.extend( new OpenLayers.Layer.Grid(), { + OpenLayers.Util.extend( new OpenLayers.Layer.Grid(), { /** KaMap Layer is always a base layer * diff --git a/lib/OpenLayers/Layer/MapServer.js b/lib/OpenLayers/Layer/MapServer.js index 3f0cb7d799..c9a1350b81 100644 --- a/lib/OpenLayers/Layer/MapServer.js +++ b/lib/OpenLayers/Layer/MapServer.js @@ -5,9 +5,9 @@ /** * @class */ -OpenLayers.Layer.MapServer = Class.create(); +OpenLayers.Layer.MapServer = OpenLayers.Class.create(); OpenLayers.Layer.MapServer.prototype = - Object.extend( new OpenLayers.Layer.Grid(), { + OpenLayers.Util.extend( new OpenLayers.Layer.Grid(), { /** @final @type hash */ DEFAULT_PARAMS: { @@ -57,8 +57,8 @@ OpenLayers.Layer.MapServer.prototype = */ clone: function (name, params) { var mergedParams = {}; - Object.extend(mergedParams, this.params); - Object.extend(mergedParams, params); + OpenLayers.Util.extend(mergedParams, this.params); + OpenLayers.Util.extend(mergedParams, params); var obj = new OpenLayers.Layer.MapServer(name, this.url, mergedParams); obj.setTileSize(this.tileSize); return obj; diff --git a/lib/OpenLayers/Layer/Markers.js b/lib/OpenLayers/Layer/Markers.js index ce7a0c25cb..cbfd1925d3 100644 --- a/lib/OpenLayers/Layer/Markers.js +++ b/lib/OpenLayers/Layer/Markers.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Layer.js */ -OpenLayers.Layer.Markers = Class.create(); +OpenLayers.Layer.Markers = OpenLayers.Class.create(); OpenLayers.Layer.Markers.prototype = - Object.extend( new OpenLayers.Layer(), { + OpenLayers.Util.extend( new OpenLayers.Layer(), { /** Markers layer is never a base layer. * diff --git a/lib/OpenLayers/Layer/MultiMap.js b/lib/OpenLayers/Layer/MultiMap.js index b5f5714a59..393bcc23e6 100644 --- a/lib/OpenLayers/Layer/MultiMap.js +++ b/lib/OpenLayers/Layer/MultiMap.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Layer/EventPane.js */ -OpenLayers.Layer.MultiMap = Class.create(); +OpenLayers.Layer.MultiMap = OpenLayers.Class.create(); OpenLayers.Layer.MultiMap.prototype = - Object.extend( new OpenLayers.Layer.EventPane(), { + OpenLayers.Util.extend( new OpenLayers.Layer.EventPane(), { /** @type MMMap */ multimap: null, diff --git a/lib/OpenLayers/Layer/Text.js b/lib/OpenLayers/Layer/Text.js index 5fccb8a714..a8a171db97 100644 --- a/lib/OpenLayers/Layer/Text.js +++ b/lib/OpenLayers/Layer/Text.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Layer/Markers.js */ -OpenLayers.Layer.Text = Class.create(); +OpenLayers.Layer.Text = OpenLayers.Class.create(); OpenLayers.Layer.Text.prototype = - Object.extend( new OpenLayers.Layer.Markers(), { + OpenLayers.Util.extend( new OpenLayers.Layer.Markers(), { /** store url of text file - this should be specified in the * "options" hashtable @@ -145,7 +145,7 @@ OpenLayers.Layer.Text.prototype = if (!sameMarkerClicked) { this.layer.map.addPopup(this.createPopup()); } - Event.stop(evt); + OpenLayers.Event.stop(evt); }, /** diff --git a/lib/OpenLayers/Layer/VirtualEarth.js b/lib/OpenLayers/Layer/VirtualEarth.js index 270be22190..65986a9477 100644 --- a/lib/OpenLayers/Layer/VirtualEarth.js +++ b/lib/OpenLayers/Layer/VirtualEarth.js @@ -7,10 +7,10 @@ * * @requires OpenLayers/Layer/EventPane.js */ -OpenLayers.Layer.VirtualEarth = Class.create(); +OpenLayers.Layer.VirtualEarth = OpenLayers.Class.create(); OpenLayers.Layer.VirtualEarth.prototype = - Object.extend( new OpenLayers.Layer.EventPane(), - Object.extend( new OpenLayers.Layer.FixedZoomLevels(), { + OpenLayers.Util.extend( new OpenLayers.Layer.EventPane(), + OpenLayers.Util.extend( new OpenLayers.Layer.FixedZoomLevels(), { /** @type VEMap */ vemap: null, diff --git a/lib/OpenLayers/Layer/WFS.js b/lib/OpenLayers/Layer/WFS.js index 43e2f70d63..5235b2c3b4 100644 --- a/lib/OpenLayers/Layer/WFS.js +++ b/lib/OpenLayers/Layer/WFS.js @@ -8,10 +8,10 @@ * @requires OpenLayers/Layer/Grid.js * @requires OpenLayers/Layer/Markers.js */ -OpenLayers.Layer.WFS = Class.create(); +OpenLayers.Layer.WFS = OpenLayers.Class.create(); OpenLayers.Layer.WFS.prototype = - Object.extend(new OpenLayers.Layer.Grid(), - Object.extend(new OpenLayers.Layer.Markers(), { + OpenLayers.Util.extend(new OpenLayers.Layer.Grid(), + OpenLayers.Util.extend(new OpenLayers.Layer.Markers(), { /** WFS layer is never a base layer. * diff --git a/lib/OpenLayers/Layer/WMS.js b/lib/OpenLayers/Layer/WMS.js index b1cabef880..4cc494e318 100644 --- a/lib/OpenLayers/Layer/WMS.js +++ b/lib/OpenLayers/Layer/WMS.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Layer/Grid.js */ -OpenLayers.Layer.WMS = Class.create(); +OpenLayers.Layer.WMS = OpenLayers.Class.create(); OpenLayers.Layer.WMS.prototype = - Object.extend( new OpenLayers.Layer.Grid(), { + OpenLayers.Util.extend( new OpenLayers.Layer.Grid(), { /** Hashtable of default parameter key/value pairs * @final @type Object */ diff --git a/lib/OpenLayers/Layer/WMS/Untiled.js b/lib/OpenLayers/Layer/WMS/Untiled.js index 93fa34a9e0..9cf400172c 100644 --- a/lib/OpenLayers/Layer/WMS/Untiled.js +++ b/lib/OpenLayers/Layer/WMS/Untiled.js @@ -8,9 +8,9 @@ * @requires OpenLayers/Layer/HTTPRequest.js * @requires OpenLayers/Layer/WMS.js */ -OpenLayers.Layer.WMS.Untiled = Class.create(); +OpenLayers.Layer.WMS.Untiled = OpenLayers.Class.create(); OpenLayers.Layer.WMS.Untiled.prototype = - Object.extend( new OpenLayers.Layer.HTTPRequest(), { + OpenLayers.Util.extend( new OpenLayers.Layer.HTTPRequest(), { /** Hashtable of default parameter key/value pairs * @final @type Object */ diff --git a/lib/OpenLayers/Layer/WorldWind.js b/lib/OpenLayers/Layer/WorldWind.js index 2264bb62ea..7138b2d0e8 100644 --- a/lib/OpenLayers/Layer/WorldWind.js +++ b/lib/OpenLayers/Layer/WorldWind.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Layer/Grid.js */ -OpenLayers.Layer.WorldWind = Class.create(); +OpenLayers.Layer.WorldWind = OpenLayers.Class.create(); OpenLayers.Layer.WorldWind.prototype = - Object.extend( new OpenLayers.Layer.Grid(), { + OpenLayers.Util.extend( new OpenLayers.Layer.Grid(), { DEFAULT_PARAMS: { }, diff --git a/lib/OpenLayers/Layer/Yahoo.js b/lib/OpenLayers/Layer/Yahoo.js index 84121a5c1e..6b104ab872 100644 --- a/lib/OpenLayers/Layer/Yahoo.js +++ b/lib/OpenLayers/Layer/Yahoo.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Layer/EventPane.js */ -OpenLayers.Layer.Yahoo = Class.create(); +OpenLayers.Layer.Yahoo = OpenLayers.Class.create(); OpenLayers.Layer.Yahoo.prototype = - Object.extend( new OpenLayers.Layer.EventPane(), { + OpenLayers.Util.extend( new OpenLayers.Layer.EventPane(), { /** @type YMap */ yahoomap: null, diff --git a/lib/OpenLayers/Map.js b/lib/OpenLayers/Map.js index 1e5ae3279a..08ed33e5de 100644 --- a/lib/OpenLayers/Map.js +++ b/lib/OpenLayers/Map.js @@ -8,7 +8,7 @@ * @requires OpenLayers/Util.js * @requires OpenLayers/Events.js */ -OpenLayers.Map = Class.create(); +OpenLayers.Map = OpenLayers.Class.create(); OpenLayers.Map.TILE_WIDTH = 256; OpenLayers.Map.TILE_HEIGHT = 256; OpenLayers.Map.prototype = { @@ -152,7 +152,7 @@ OpenLayers.Map.prototype = { // Else updateSize on catching the window's resize // Note that this is ok, as updateSize() does nothing if the // map's size has not actually changed. - Event.observe(window, 'resize', + OpenLayers.Event.observe(window, 'resize', this.updateSize.bindAsEventListener(this)); } @@ -173,7 +173,7 @@ OpenLayers.Map.prototype = { this.popups = new Array(); // always call map.destroy() - Event.observe(window, + OpenLayers.Event.observe(window, 'unload', this.destroy.bindAsEventListener(this)); @@ -213,7 +213,7 @@ OpenLayers.Map.prototype = { // now add the options declared by the user // (these will override defaults) - Object.extend(this, options); + OpenLayers.Util.extend(this, options); }, /** @@ -513,7 +513,7 @@ OpenLayers.Map.prototype = { // Workaround for the fact that hidden elements return 0 for size. if (size.w == 0 && size.h == 0) { - var dim = Element.getDimensions(this.div); + var dim = OpenLayers.Element.getDimensions(this.div); size.w = dim.width; size.h = dim.height; } diff --git a/lib/OpenLayers/Marker.js b/lib/OpenLayers/Marker.js index a362e28734..70a59d907a 100644 --- a/lib/OpenLayers/Marker.js +++ b/lib/OpenLayers/Marker.js @@ -5,7 +5,7 @@ /** * @class */ -OpenLayers.Marker = Class.create(); +OpenLayers.Marker = OpenLayers.Class.create(); OpenLayers.Marker.prototype = { /** @type OpenLayers.Icon */ diff --git a/lib/OpenLayers/Marker/Box.js b/lib/OpenLayers/Marker/Box.js index e5766c0d83..6bf8552ed5 100644 --- a/lib/OpenLayers/Marker/Box.js +++ b/lib/OpenLayers/Marker/Box.js @@ -7,8 +7,8 @@ * * @requires OpenLayers/Marker.js */ -OpenLayers.Marker.Box = Class.create(); -OpenLayers.Marker.Box.prototype = Object.extend( new OpenLayers.Marker(), { +OpenLayers.Marker.Box = OpenLayers.Class.create(); +OpenLayers.Marker.Box.prototype = OpenLayers.Util.extend( new OpenLayers.Marker(), { /** @type OpenLayers.LonLat */ bounds: null, diff --git a/lib/OpenLayers/Popup.js b/lib/OpenLayers/Popup.js index 429fba4a71..7b1e42f4fb 100644 --- a/lib/OpenLayers/Popup.js +++ b/lib/OpenLayers/Popup.js @@ -5,7 +5,7 @@ /** * @class */ -OpenLayers.Popup = Class.create(); +OpenLayers.Popup = OpenLayers.Class.create(); OpenLayers.Popup.WIDTH = 200; OpenLayers.Popup.HEIGHT = 200; @@ -137,28 +137,28 @@ OpenLayers.Popup.prototype = { * @type Boolean */ visible: function() { - return Element.visible(this.div); + return OpenLayers.Element.visible(this.div); }, /** * */ toggle: function() { - Element.toggle(this.div); + OpenLayers.Element.toggle(this.div); }, /** * */ show: function() { - Element.show(this.div); + OpenLayers.Element.show(this.div); }, /** * */ hide: function() { - Element.hide(this.div); + OpenLayers.Element.hide(this.div); }, /** diff --git a/lib/OpenLayers/Popup/Anchored.js b/lib/OpenLayers/Popup/Anchored.js index e6fc1abb4c..490f2ffce0 100644 --- a/lib/OpenLayers/Popup/Anchored.js +++ b/lib/OpenLayers/Popup/Anchored.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Popup.js */ -OpenLayers.Popup.Anchored = Class.create(); +OpenLayers.Popup.Anchored = OpenLayers.Class.create(); OpenLayers.Popup.Anchored.prototype = - Object.extend( new OpenLayers.Popup(), { + OpenLayers.Util.extend( new OpenLayers.Popup(), { /** "lr", "ll", "tr", "tl" - relative position of the popup. * @type String */ diff --git a/lib/OpenLayers/Popup/AnchoredBubble.js b/lib/OpenLayers/Popup/AnchoredBubble.js index fa32c161da..1dea84a142 100644 --- a/lib/OpenLayers/Popup/AnchoredBubble.js +++ b/lib/OpenLayers/Popup/AnchoredBubble.js @@ -7,13 +7,13 @@ * * @requires OpenLayers/Popup/Anchored.js */ -OpenLayers.Popup.AnchoredBubble = Class.create(); +OpenLayers.Popup.AnchoredBubble = OpenLayers.Class.create(); //Border space for the rico corners OpenLayers.Popup.AnchoredBubble.CORNER_SIZE = 5; OpenLayers.Popup.AnchoredBubble.prototype = - Object.extend( new OpenLayers.Popup.Anchored(), { + OpenLayers.Util.extend( new OpenLayers.Popup.Anchored(), { /** @type DOMElement */ contentDiv:null, diff --git a/lib/OpenLayers/Tile.js b/lib/OpenLayers/Tile.js index abc893ac50..4305f533f8 100644 --- a/lib/OpenLayers/Tile.js +++ b/lib/OpenLayers/Tile.js @@ -11,7 +11,7 @@ * size - but do not add themselves to the layer div automatically, for * example. */ -OpenLayers.Tile = Class.create(); +OpenLayers.Tile = OpenLayers.Class.create(); OpenLayers.Tile.prototype = { /** @type String */ diff --git a/lib/OpenLayers/Tile/Image.js b/lib/OpenLayers/Tile/Image.js index 39b2029048..46b781f8d6 100644 --- a/lib/OpenLayers/Tile/Image.js +++ b/lib/OpenLayers/Tile/Image.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Tile.js */ -OpenLayers.Tile.Image = Class.create(); +OpenLayers.Tile.Image = OpenLayers.Class.create(); OpenLayers.Tile.Image.prototype = - Object.extend( new OpenLayers.Tile(), { + OpenLayers.Util.extend( new OpenLayers.Tile(), { /** @type DOMElement img */ imgDiv: null, diff --git a/lib/OpenLayers/Tile/WFS.js b/lib/OpenLayers/Tile/WFS.js index 215f89d2e5..1524136c2f 100644 --- a/lib/OpenLayers/Tile/WFS.js +++ b/lib/OpenLayers/Tile/WFS.js @@ -7,9 +7,9 @@ * * @requires OpenLayers/Tile.js */ -OpenLayers.Tile.WFS = Class.create(); +OpenLayers.Tile.WFS = OpenLayers.Class.create(); OpenLayers.Tile.WFS.prototype = - Object.extend( new OpenLayers.Tile(), { + OpenLayers.Util.extend( new OpenLayers.Tile(), { /** @type Array(OpenLayers.Feature)*/ features: null, diff --git a/lib/OpenLayers/Util.js b/lib/OpenLayers/Util.js index df2442ccc1..ea3e346ca2 100644 --- a/lib/OpenLayers/Util.js +++ b/lib/OpenLayers/Util.js @@ -7,6 +7,34 @@ */ OpenLayers.Util = new Object(); +/* from Prototype.js */ +if ($ == null) { + var $ = function () { + var elements = new Array(); + + for (var i = 0; i < arguments.length; i++) { + var element = arguments[i]; + if (typeof element == 'string') + element = document.getElementById(element); + + if (arguments.length == 1) + return element; + + elements.push(element); + } + + return elements; + } +} + +/* from Prototype.js */ +OpenLayers.Util.extend = function(destination, source) { + for (property in source) { + destination[property] = source[property]; + } + return destination; +}; + /** * @param {String} id * @param {OpenLayers.Pixel} px @@ -105,9 +133,9 @@ OpenLayers.Util.createImage = function(id, px, sz, imgURL, position, border, if(delayDisplay) { image.style.display = "none"; - Event.observe(image, "load", + OpenLayers.Event.observe(image, "load", OpenLayers.Util.onImageLoad.bindAsEventListener(image)); - Event.observe(image, "error", + OpenLayers.Event.observe(image, "error", OpenLayers.Util.onImageLoadError.bindAsEventListener(image)); } @@ -244,9 +272,9 @@ OpenLayers.Util.createAlphaImageDiv = function(id, px, sz, imgURL, if (delayDisplay) { img.style.display = "none"; - Event.observe(img, "load", + OpenLayers.Event.observe(img, "load", OpenLayers.Util.onImageLoad.bindAsEventListener(div)); - Event.observe(img, "error", + OpenLayers.Event.observe(img, "error", OpenLayers.Util.onImageLoadError.bindAsEventListener(div)); } @@ -275,7 +303,7 @@ OpenLayers.Util.upperCaseObject = function (object) { }; /** Takes a hashtable and copies any keys that don't exist from -* another hashtable, by analogy with Object.extend() from +* another hashtable, by analogy with OpenLayers.Util.extend() from * Prototype.js. * * @param {Object} to @@ -318,6 +346,21 @@ OpenLayers.Util.getImagesLocation = function() { return OpenLayers._getScriptLocation() + "img/"; }; +/* Originally from Prototype */ + +OpenLayers.Util.Try = function() { + var returnValue; + + for (var i = 0; i < arguments.length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) {} + } + + return returnValue; +} /** These could/should be made namespace aware? @@ -328,7 +371,7 @@ OpenLayers.Util.getImagesLocation = function() { * @return {Array} */ OpenLayers.Util.getNodes=function(p, tagName) { - var nodes = Try.these( + var nodes = OpenLayers.Util.Try( function () { return OpenLayers.Util._getNodes(p.documentElement.childNodes, tagName); @@ -392,7 +435,7 @@ OpenLayers.Util.getTagText = function (parent, item, index) { */ OpenLayers.Util.getXmlNodeValue = function(node) { var val = null; - Try.these( + OpenLayers.Util.Try( function() { val = node.text; if (!val) @@ -573,3 +616,26 @@ OpenLayers.Util.safeStopPropagation = function(evt) { } evt.cancelBubble = true; }; + +OpenLayers.Util.pagePosition = function(forElement) { + var valueT = 0, valueL = 0; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + // Safari fix + if (element.offsetParent==document.body) + if (OpenLayers.Element.getStyle(element,'position')=='absolute') break; + + } while (element = element.offsetParent); + + element = forElement; + do { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } while (element = element.parentNode); + + return [valueL, valueT]; +}; diff --git a/lib/Prototype.js b/lib/Prototype.js deleted file mode 100644 index 07baf10309..0000000000 --- a/lib/Prototype.js +++ /dev/null @@ -1,1781 +0,0 @@ -/* Prototype JavaScript framework, version 1.4.0 - * (c) 2005 Sam Stephenson - * - * Prototype is freely distributable under the terms of an MIT-style license. - * For details, see the Prototype web site: http://prototype.conio.net/ - * -/*--------------------------------------------------------------------------*/ - -var Prototype = { - Version: '1.4.0', - ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)', - - emptyFunction: function() {}, - K: function(x) {return x} -} - -var Class = { - create: function() { - return function() { - this.initialize.apply(this, arguments); - } - } -} - -var Abstract = new Object(); - -Object.extend = function(destination, source) { - for (property in source) { - destination[property] = source[property]; - } - return destination; -} - -Object.inspect = function(object) { - try { - if (object == undefined) return 'undefined'; - if (object == null) return 'null'; - return object.inspect ? object.inspect() : object.toString(); - } catch (e) { - if (e instanceof RangeError) return '...'; - throw e; - } -} - -Function.prototype.bind = function() { - var __method = this, args = $A(arguments), object = args.shift(); - return function() { - return __method.apply(object, args.concat($A(arguments))); - } -} - -Function.prototype.bindAsEventListener = function(object) { - var __method = this; - return function(event) { - return __method.call(object, event || window.event); - } -} - -Object.extend(Number.prototype, { - toColorPart: function() { - var digits = this.toString(16); - if (this < 16) return '0' + digits; - return digits; - }, - - succ: function() { - return this + 1; - }, - - times: function(iterator) { - $R(0, this, true).each(iterator); - return this; - } -}); - -var Try = { - these: function() { - var returnValue; - - for (var i = 0; i < arguments.length; i++) { - var lambda = arguments[i]; - try { - returnValue = lambda(); - break; - } catch (e) {} - } - - return returnValue; - } -} - -/*--------------------------------------------------------------------------*/ - -var PeriodicalExecuter = Class.create(); -PeriodicalExecuter.prototype = { - initialize: function(callback, frequency) { - this.callback = callback; - this.frequency = frequency; - this.currentlyExecuting = false; - - this.registerCallback(); - }, - - registerCallback: function() { - setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - onTimerEvent: function() { - if (!this.currentlyExecuting) { - try { - this.currentlyExecuting = true; - this.callback(); - } finally { - this.currentlyExecuting = false; - } - } - } -} - -/*--------------------------------------------------------------------------*/ - -function $() { - var elements = new Array(); - - for (var i = 0; i < arguments.length; i++) { - var element = arguments[i]; - if (typeof element == 'string') - element = document.getElementById(element); - - if (arguments.length == 1) - return element; - - elements.push(element); - } - - return elements; -} -Object.extend(String.prototype, { - stripTags: function() { - return this.replace(/<\/?[^>]+>/gi, ''); - }, - - stripScripts: function() { - return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); - }, - - extractScripts: function() { - var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); - var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); - return (this.match(matchAll) || []).map(function(scriptTag) { - return (scriptTag.match(matchOne) || ['', ''])[1]; - }); - }, - - evalScripts: function() { - return this.extractScripts().map(eval); - }, - - escapeHTML: function() { - var div = document.createElement('div'); - var text = document.createTextNode(this); - div.appendChild(text); - return div.innerHTML; - }, - - unescapeHTML: function() { - var div = document.createElement('div'); - div.innerHTML = this.stripTags(); - return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; - }, - - toQueryParams: function() { - var pairs = this.match(/^\??(.*)$/)[1].split('&'); - return pairs.inject({}, function(params, pairString) { - var pair = pairString.split('='); - params[pair[0]] = pair[1]; - return params; - }); - }, - - toArray: function() { - return this.split(''); - }, - - camelize: function() { - var oStringList = this.split('-'); - if (oStringList.length == 1) return oStringList[0]; - - var camelizedString = this.indexOf('-') == 0 - ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) - : oStringList[0]; - - for (var i = 1, len = oStringList.length; i < len; i++) { - var s = oStringList[i]; - camelizedString += s.charAt(0).toUpperCase() + s.substring(1); - } - - return camelizedString; - }, - - inspect: function() { - return "'" + this.replace('\\', '\\\\').replace("'", '\\\'') + "'"; - } -}); - -String.prototype.parseQuery = String.prototype.toQueryParams; - -var $break = new Object(); -var $continue = new Object(); - -var Enumerable = { - each: function(iterator) { - var index = 0; - try { - this._each(function(value) { - try { - iterator(value, index++); - } catch (e) { - if (e != $continue) throw e; - } - }); - } catch (e) { - if (e != $break) throw e; - } - }, - - all: function(iterator) { - var result = true; - this.each(function(value, index) { - result = result && !!(iterator || Prototype.K)(value, index); - if (!result) throw $break; - }); - return result; - }, - - any: function(iterator) { - var result = true; - this.each(function(value, index) { - if (result = !!(iterator || Prototype.K)(value, index)) - throw $break; - }); - return result; - }, - - collect: function(iterator) { - var results = []; - this.each(function(value, index) { - results.push(iterator(value, index)); - }); - return results; - }, - - detect: function (iterator) { - var result; - this.each(function(value, index) { - if (iterator(value, index)) { - result = value; - throw $break; - } - }); - return result; - }, - - findAll: function(iterator) { - var results = []; - this.each(function(value, index) { - if (iterator(value, index)) - results.push(value); - }); - return results; - }, - - grep: function(pattern, iterator) { - var results = []; - this.each(function(value, index) { - var stringValue = value.toString(); - if (stringValue.match(pattern)) - results.push((iterator || Prototype.K)(value, index)); - }) - return results; - }, - - include: function(object) { - var found = false; - this.each(function(value) { - if (value == object) { - found = true; - throw $break; - } - }); - return found; - }, - - inject: function(memo, iterator) { - this.each(function(value, index) { - memo = iterator(memo, value, index); - }); - return memo; - }, - - invoke: function(method) { - var args = $A(arguments).slice(1); - return this.collect(function(value) { - return value[method].apply(value, args); - }); - }, - - max: function(iterator) { - var result; - this.each(function(value, index) { - value = (iterator || Prototype.K)(value, index); - if (value >= (result || value)) - result = value; - }); - return result; - }, - - min: function(iterator) { - var result; - this.each(function(value, index) { - value = (iterator || Prototype.K)(value, index); - if (value <= (result || value)) - result = value; - }); - return result; - }, - - partition: function(iterator) { - var trues = [], falses = []; - this.each(function(value, index) { - ((iterator || Prototype.K)(value, index) ? - trues : falses).push(value); - }); - return [trues, falses]; - }, - - pluck: function(property) { - var results = []; - this.each(function(value, index) { - results.push(value[property]); - }); - return results; - }, - - reject: function(iterator) { - var results = []; - this.each(function(value, index) { - if (!iterator(value, index)) - results.push(value); - }); - return results; - }, - - sortBy: function(iterator) { - return this.collect(function(value, index) { - return {value: value, criteria: iterator(value, index)}; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }).pluck('value'); - }, - - toArray: function() { - return this.collect(Prototype.K); - }, - - zip: function() { - var iterator = Prototype.K, args = $A(arguments); - if (typeof args.last() == 'function') - iterator = args.pop(); - - var collections = [this].concat(args).map($A); - return this.map(function(value, index) { - iterator(value = collections.pluck(index)); - return value; - }); - }, - - inspect: function() { - return '#'; - } -} - -Object.extend(Enumerable, { - map: Enumerable.collect, - find: Enumerable.detect, - select: Enumerable.findAll, - member: Enumerable.include, - entries: Enumerable.toArray -}); -var $A = Array.from = function(iterable) { - if (!iterable) return []; - if (iterable.toArray) { - return iterable.toArray(); - } else { - var results = []; - for (var i = 0; i < iterable.length; i++) - results.push(iterable[i]); - return results; - } -} - -Object.extend(Array.prototype, Enumerable); - -Array.prototype._reverse = Array.prototype.reverse; - -Object.extend(Array.prototype, { - _each: function(iterator) { - for (var i = 0; i < this.length; i++) - iterator(this[i]); - }, - - clear: function() { - this.length = 0; - return this; - }, - - first: function() { - return this[0]; - }, - - last: function() { - return this[this.length - 1]; - }, - - compact: function() { - return this.select(function(value) { - return value != undefined || value != null; - }); - }, - - flatten: function() { - return this.inject([], function(array, value) { - return array.concat(value.constructor == Array ? - value.flatten() : [value]); - }); - }, - - without: function() { - var values = $A(arguments); - return this.select(function(value) { - return !values.include(value); - }); - }, - - indexOf: function(object) { - for (var i = 0; i < this.length; i++) - if (this[i] == object) return i; - return -1; - }, - - reverse: function(inline) { - return (inline !== false ? this : this.toArray())._reverse(); - }, - - shift: function() { - var result = this[0]; - for (var i = 0; i < this.length - 1; i++) - this[i] = this[i + 1]; - this.length--; - return result; - }, - - inspect: function() { - return '[' + this.map(Object.inspect).join(', ') + ']'; - } -}); -var Hash = { - _each: function(iterator) { - for (key in this) { - var value = this[key]; - if (typeof value == 'function') continue; - - var pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - }, - - keys: function() { - return this.pluck('key'); - }, - - values: function() { - return this.pluck('value'); - }, - - merge: function(hash) { - return $H(hash).inject($H(this), function(mergedHash, pair) { - mergedHash[pair.key] = pair.value; - return mergedHash; - }); - }, - - toQueryString: function() { - return this.map(function(pair) { - return pair.map(encodeURIComponent).join('='); - }).join('&'); - }, - - inspect: function() { - return '#'; - } -} - -function $H(object) { - var hash = Object.extend({}, object || {}); - Object.extend(hash, Enumerable); - Object.extend(hash, Hash); - return hash; -} -ObjectRange = Class.create(); -Object.extend(ObjectRange.prototype, Enumerable); -Object.extend(ObjectRange.prototype, { - initialize: function(start, end, exclusive) { - this.start = start; - this.end = end; - this.exclusive = exclusive; - }, - - _each: function(iterator) { - var value = this.start; - do { - iterator(value); - value = value.succ(); - } while (this.include(value)); - }, - - include: function(value) { - if (value < this.start) - return false; - if (this.exclusive) - return value < this.end; - return value <= this.end; - } -}); - -var $R = function(start, end, exclusive) { - return new ObjectRange(start, end, exclusive); -} - -var Ajax = { - getTransport: function() { - return Try.these( - function() {return new ActiveXObject('Msxml2.XMLHTTP')}, - function() {return new ActiveXObject('Microsoft.XMLHTTP')}, - function() {return new XMLHttpRequest()} - ) || false; - }, - - activeRequestCount: 0 -} - -Ajax.Responders = { - responders: [], - - _each: function(iterator) { - this.responders._each(iterator); - }, - - register: function(responderToAdd) { - if (!this.include(responderToAdd)) - this.responders.push(responderToAdd); - }, - - unregister: function(responderToRemove) { - this.responders = this.responders.without(responderToRemove); - }, - - dispatch: function(callback, request, transport, json) { - this.each(function(responder) { - if (responder[callback] && typeof responder[callback] == 'function') { - try { - responder[callback].apply(responder, [request, transport, json]); - } catch (e) {} - } - }); - } -}; - -Object.extend(Ajax.Responders, Enumerable); - -Ajax.Responders.register({ - onCreate: function() { - Ajax.activeRequestCount++; - }, - - onComplete: function() { - Ajax.activeRequestCount--; - } -}); - -Ajax.Base = function() {}; -Ajax.Base.prototype = { - setOptions: function(options) { - this.options = { - method: 'post', - asynchronous: true, - parameters: '' - } - Object.extend(this.options, options || {}); - }, - - responseIsSuccess: function() { - return this.transport.status == undefined - || this.transport.status == 0 - || (this.transport.status >= 200 && this.transport.status < 300); - }, - - responseIsFailure: function() { - return !this.responseIsSuccess(); - } -} - -Ajax.Request = Class.create(); -Ajax.Request.Events = - ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - -Ajax.Request.prototype = Object.extend(new Ajax.Base(), { - initialize: function(url, options) { - this.transport = Ajax.getTransport(); - this.setOptions(options); - this.request(url); - }, - - request: function(url) { - var parameters = this.options.parameters || ''; - if (parameters.length > 0) parameters += '&_='; - - try { - this.url = url; - if (this.options.method == 'get' && parameters.length > 0) - this.url += (this.url.match(/\?/) ? '&' : '?') + parameters; - - Ajax.Responders.dispatch('onCreate', this, this.transport); - - this.transport.open(this.options.method, this.url, - this.options.asynchronous); - - if (this.options.asynchronous) { - this.transport.onreadystatechange = this.onStateChange.bind(this); - setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); - } - - this.setRequestHeaders(); - - var body = this.options.postBody ? this.options.postBody : parameters; - this.transport.send(this.options.method == 'post' ? body : null); - - } catch (e) { - this.dispatchException(e); - } - }, - - setRequestHeaders: function() { - var requestHeaders = - ['X-Requested-With', 'XMLHttpRequest', - 'X-Prototype-Version', Prototype.Version]; - - if (this.options.method == 'post') { - requestHeaders.push('Content-type', - 'application/x-www-form-urlencoded'); - - /* Force "Connection: close" for Mozilla browsers to work around - * a bug where XMLHttpReqeuest sends an incorrect Content-length - * header. See Mozilla Bugzilla #246651. - */ - if (this.transport.overrideMimeType) - requestHeaders.push('Connection', 'close'); - } - - if (this.options.requestHeaders) - requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); - - for (var i = 0; i < requestHeaders.length; i += 2) - this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); - }, - - onStateChange: function() { - var readyState = this.transport.readyState; - if (readyState != 1) - this.respondToReadyState(this.transport.readyState); - }, - - header: function(name) { - try { - return this.transport.getResponseHeader(name); - } catch (e) {} - }, - - evalJSON: function() { - try { - return eval(this.header('X-JSON')); - } catch (e) {} - }, - - evalResponse: function() { - try { - return eval(this.transport.responseText); - } catch (e) { - this.dispatchException(e); - } - }, - - respondToReadyState: function(readyState) { - var event = Ajax.Request.Events[readyState]; - var transport = this.transport, json = this.evalJSON(); - - if (event == 'Complete') { - try { - (this.options['on' + this.transport.status] - || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')] - || Prototype.emptyFunction)(transport, json); - } catch (e) { - this.dispatchException(e); - } - - if ((this.header('Content-type') || '').match(/^text\/javascript/i)) - this.evalResponse(); - } - - try { - (this.options['on' + event] || Prototype.emptyFunction)(transport, json); - Ajax.Responders.dispatch('on' + event, this, transport, json); - } catch (e) { - this.dispatchException(e); - } - - /* Avoid memory leak in MSIE: clean up the oncomplete event handler */ - if (event == 'Complete') - this.transport.onreadystatechange = Prototype.emptyFunction; - }, - - dispatchException: function(exception) { - (this.options.onException || Prototype.emptyFunction)(this, exception); - Ajax.Responders.dispatch('onException', this, exception); - } -}); - -Ajax.Updater = Class.create(); - -Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { - initialize: function(container, url, options) { - this.containers = { - success: container.success ? $(container.success) : $(container), - failure: container.failure ? $(container.failure) : - (container.success ? null : $(container)) - } - - this.transport = Ajax.getTransport(); - this.setOptions(options); - - var onComplete = this.options.onComplete || Prototype.emptyFunction; - this.options.onComplete = (function(transport, object) { - this.updateContent(); - onComplete(transport, object); - }).bind(this); - - this.request(url); - }, - - updateContent: function() { - var receiver = this.responseIsSuccess() ? - this.containers.success : this.containers.failure; - var response = this.transport.responseText; - - if (!this.options.evalScripts) - response = response.stripScripts(); - - if (receiver) { - if (this.options.insertion) { - new this.options.insertion(receiver, response); - } else { - Element.update(receiver, response); - } - } - - if (this.responseIsSuccess()) { - if (this.onComplete) - setTimeout(this.onComplete.bind(this), 10); - } - } -}); - -Ajax.PeriodicalUpdater = Class.create(); -Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { - initialize: function(container, url, options) { - this.setOptions(options); - this.onComplete = this.options.onComplete; - - this.frequency = (this.options.frequency || 2); - this.decay = (this.options.decay || 1); - - this.updater = {}; - this.container = container; - this.url = url; - - this.start(); - }, - - start: function() { - this.options.onComplete = this.updateComplete.bind(this); - this.onTimerEvent(); - }, - - stop: function() { - this.updater.onComplete = undefined; - clearTimeout(this.timer); - (this.onComplete || Prototype.emptyFunction).apply(this, arguments); - }, - - updateComplete: function(request) { - if (this.options.decay) { - this.decay = (request.responseText == this.lastText ? - this.decay * this.options.decay : 1); - - this.lastText = request.responseText; - } - this.timer = setTimeout(this.onTimerEvent.bind(this), - this.decay * this.frequency * 1000); - }, - - onTimerEvent: function() { - this.updater = new Ajax.Updater(this.container, this.url, this.options); - } -}); -document.getElementsByClassName = function(className, parentElement) { - var children = ($(parentElement) || document.body).getElementsByTagName('*'); - return $A(children).inject([], function(elements, child) { - if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) - elements.push(child); - return elements; - }); -} - -/*--------------------------------------------------------------------------*/ - -if (!window.Element) { - var Element = new Object(); -} - -Object.extend(Element, { - visible: function(element) { - return $(element).style.display != 'none'; - }, - - toggle: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - Element[Element.visible(element) ? 'hide' : 'show'](element); - } - }, - - hide: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - element.style.display = 'none'; - } - }, - - show: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - element.style.display = ''; - } - }, - - remove: function(element) { - element = $(element); - element.parentNode.removeChild(element); - }, - - update: function(element, html) { - $(element).innerHTML = html.stripScripts(); - setTimeout(function() {html.evalScripts()}, 10); - }, - - getHeight: function(element) { - element = $(element); - return element.offsetHeight; - }, - - classNames: function(element) { - return new Element.ClassNames(element); - }, - - hasClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).include(className); - }, - - addClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).add(className); - }, - - removeClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).remove(className); - }, - - // removes whitespace-only text node children - cleanWhitespace: function(element) { - element = $(element); - for (var i = 0; i < element.childNodes.length; i++) { - var node = element.childNodes[i]; - if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) - Element.remove(node); - } - }, - - empty: function(element) { - return $(element).innerHTML.match(/^\s*$/); - }, - - scrollTo: function(element) { - element = $(element); - var x = element.x ? element.x : element.offsetLeft, - y = element.y ? element.y : element.offsetTop; - window.scrollTo(x, y); - }, - - getStyle: function(element, style) { - element = $(element); - var value = element.style[style.camelize()]; - if (!value) { - if (document.defaultView && document.defaultView.getComputedStyle) { - var css = document.defaultView.getComputedStyle(element, null); - value = css ? css.getPropertyValue(style) : null; - } else if (element.currentStyle) { - value = element.currentStyle[style.camelize()]; - } - } - - if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) - if (Element.getStyle(element, 'position') == 'static') value = 'auto'; - - return value == 'auto' ? null : value; - }, - - setStyle: function(element, style) { - element = $(element); - for (name in style) - element.style[name.camelize()] = style[name]; - }, - - getDimensions: function(element) { - element = $(element); - if (Element.getStyle(element, 'display') != 'none') - return {width: element.offsetWidth, height: element.offsetHeight}; - - // All *Width and *Height properties give 0 on elements with display none, - // so enable the element temporarily - var els = element.style; - var originalVisibility = els.visibility; - var originalPosition = els.position; - els.visibility = 'hidden'; - els.position = 'absolute'; - els.display = ''; - var originalWidth = element.clientWidth; - var originalHeight = element.clientHeight; - els.display = 'none'; - els.position = originalPosition; - els.visibility = originalVisibility; - return {width: originalWidth, height: originalHeight}; - }, - - makePositioned: function(element) { - element = $(element); - var pos = Element.getStyle(element, 'position'); - if (pos == 'static' || !pos) { - element._madePositioned = true; - element.style.position = 'relative'; - // Opera returns the offset relative to the positioning context, when an - // element is position relative but top and left have not been defined - if (window.opera) { - element.style.top = 0; - element.style.left = 0; - } - } - }, - - undoPositioned: function(element) { - element = $(element); - if (element._madePositioned) { - element._madePositioned = undefined; - element.style.position = - element.style.top = - element.style.left = - element.style.bottom = - element.style.right = ''; - } - }, - - makeClipping: function(element) { - element = $(element); - if (element._overflow) return; - element._overflow = element.style.overflow; - if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') - element.style.overflow = 'hidden'; - }, - - undoClipping: function(element) { - element = $(element); - if (element._overflow) return; - element.style.overflow = element._overflow; - element._overflow = undefined; - } -}); - -var Toggle = new Object(); -Toggle.display = Element.toggle; - -/*--------------------------------------------------------------------------*/ - -Abstract.Insertion = function(adjacency) { - this.adjacency = adjacency; -} - -Abstract.Insertion.prototype = { - initialize: function(element, content) { - this.element = $(element); - this.content = content.stripScripts(); - - if (this.adjacency && this.element.insertAdjacentHTML) { - try { - this.element.insertAdjacentHTML(this.adjacency, this.content); - } catch (e) { - if (this.element.tagName.toLowerCase() == 'tbody') { - this.insertContent(this.contentFromAnonymousTable()); - } else { - throw e; - } - } - } else { - this.range = this.element.ownerDocument.createRange(); - if (this.initializeRange) this.initializeRange(); - this.insertContent([this.range.createContextualFragment(this.content)]); - } - - setTimeout(function() {content.evalScripts()}, 10); - }, - - contentFromAnonymousTable: function() { - var div = document.createElement('div'); - div.innerHTML = '' + this.content + '
'; - return $A(div.childNodes[0].childNodes[0].childNodes); - } -} - -var Insertion = new Object(); - -Insertion.Before = Class.create(); -Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { - initializeRange: function() { - this.range.setStartBefore(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.parentNode.insertBefore(fragment, this.element); - }).bind(this)); - } -}); - -Insertion.Top = Class.create(); -Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { - initializeRange: function() { - this.range.selectNodeContents(this.element); - this.range.collapse(true); - }, - - insertContent: function(fragments) { - fragments.reverse(false).each((function(fragment) { - this.element.insertBefore(fragment, this.element.firstChild); - }).bind(this)); - } -}); - -Insertion.Bottom = Class.create(); -Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { - initializeRange: function() { - this.range.selectNodeContents(this.element); - this.range.collapse(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.appendChild(fragment); - }).bind(this)); - } -}); - -Insertion.After = Class.create(); -Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { - initializeRange: function() { - this.range.setStartAfter(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.parentNode.insertBefore(fragment, - this.element.nextSibling); - }).bind(this)); - } -}); - -/*--------------------------------------------------------------------------*/ - -Element.ClassNames = Class.create(); -Element.ClassNames.prototype = { - initialize: function(element) { - this.element = $(element); - }, - - _each: function(iterator) { - this.element.className.split(/\s+/).select(function(name) { - return name.length > 0; - })._each(iterator); - }, - - set: function(className) { - this.element.className = className; - }, - - add: function(classNameToAdd) { - if (this.include(classNameToAdd)) return; - this.set(this.toArray().concat(classNameToAdd).join(' ')); - }, - - remove: function(classNameToRemove) { - if (!this.include(classNameToRemove)) return; - this.set(this.select(function(className) { - return className != classNameToRemove; - }).join(' ')); - }, - - toString: function() { - return this.toArray().join(' '); - } -} - -Object.extend(Element.ClassNames.prototype, Enumerable); -var Field = { - clear: function() { - for (var i = 0; i < arguments.length; i++) - $(arguments[i]).value = ''; - }, - - focus: function(element) { - $(element).focus(); - }, - - present: function() { - for (var i = 0; i < arguments.length; i++) - if ($(arguments[i]).value == '') return false; - return true; - }, - - select: function(element) { - $(element).select(); - }, - - activate: function(element) { - element = $(element); - element.focus(); - if (element.select) - element.select(); - } -} - -/*--------------------------------------------------------------------------*/ - -var Form = { - serialize: function(form) { - var elements = Form.getElements($(form)); - var queryComponents = new Array(); - - for (var i = 0; i < elements.length; i++) { - var queryComponent = Form.Element.serialize(elements[i]); - if (queryComponent) - queryComponents.push(queryComponent); - } - - return queryComponents.join('&'); - }, - - getElements: function(form) { - form = $(form); - var elements = new Array(); - - for (tagName in Form.Element.Serializers) { - var tagElements = form.getElementsByTagName(tagName); - for (var j = 0; j < tagElements.length; j++) - elements.push(tagElements[j]); - } - return elements; - }, - - getInputs: function(form, typeName, name) { - form = $(form); - var inputs = form.getElementsByTagName('input'); - - if (!typeName && !name) - return inputs; - - var matchingInputs = new Array(); - for (var i = 0; i < inputs.length; i++) { - var input = inputs[i]; - if ((typeName && input.type != typeName) || - (name && input.name != name)) - continue; - matchingInputs.push(input); - } - - return matchingInputs; - }, - - disable: function(form) { - var elements = Form.getElements(form); - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - element.blur(); - element.disabled = 'true'; - } - }, - - enable: function(form) { - var elements = Form.getElements(form); - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - element.disabled = ''; - } - }, - - findFirstElement: function(form) { - return Form.getElements(form).find(function(element) { - return element.type != 'hidden' && !element.disabled && - ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); - }); - }, - - focusFirstElement: function(form) { - Field.activate(Form.findFirstElement(form)); - }, - - reset: function(form) { - $(form).reset(); - } -} - -Form.Element = { - serialize: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - var parameter = Form.Element.Serializers[method](element); - - if (parameter) { - var key = encodeURIComponent(parameter[0]); - if (key.length == 0) return; - - if (parameter[1].constructor != Array) - parameter[1] = [parameter[1]]; - - return parameter[1].map(function(value) { - return key + '=' + encodeURIComponent(value); - }).join('&'); - } - }, - - getValue: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - var parameter = Form.Element.Serializers[method](element); - - if (parameter) - return parameter[1]; - } -} - -Form.Element.Serializers = { - input: function(element) { - switch (element.type.toLowerCase()) { - case 'submit': - case 'hidden': - case 'password': - case 'text': - return Form.Element.Serializers.textarea(element); - case 'checkbox': - case 'radio': - return Form.Element.Serializers.inputSelector(element); - } - return false; - }, - - inputSelector: function(element) { - if (element.checked) - return [element.name, element.value]; - }, - - textarea: function(element) { - return [element.name, element.value]; - }, - - select: function(element) { - return Form.Element.Serializers[element.type == 'select-one' ? - 'selectOne' : 'selectMany'](element); - }, - - selectOne: function(element) { - var value = '', opt, index = element.selectedIndex; - if (index >= 0) { - opt = element.options[index]; - value = opt.value; - if (!value && !('value' in opt)) - value = opt.text; - } - return [element.name, value]; - }, - - selectMany: function(element) { - var value = new Array(); - for (var i = 0; i < element.length; i++) { - var opt = element.options[i]; - if (opt.selected) { - var optValue = opt.value; - if (!optValue && !('value' in opt)) - optValue = opt.text; - value.push(optValue); - } - } - return [element.name, value]; - } -} - -/*--------------------------------------------------------------------------*/ - -var $F = Form.Element.getValue; - -/*--------------------------------------------------------------------------*/ - -Abstract.TimedObserver = function() {} -Abstract.TimedObserver.prototype = { - initialize: function(element, frequency, callback) { - this.frequency = frequency; - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - this.registerCallback(); - }, - - registerCallback: function() { - setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - onTimerEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - } -} - -Form.Element.Observer = Class.create(); -Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.Observer = Class.create(); -Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { - getValue: function() { - return Form.serialize(this.element); - } -}); - -/*--------------------------------------------------------------------------*/ - -Abstract.EventObserver = function() {} -Abstract.EventObserver.prototype = { - initialize: function(element, callback) { - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - if (this.element.tagName.toLowerCase() == 'form') - this.registerFormCallbacks(); - else - this.registerCallback(this.element); - }, - - onElementEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - }, - - registerFormCallbacks: function() { - var elements = Form.getElements(this.element); - for (var i = 0; i < elements.length; i++) - this.registerCallback(elements[i]); - }, - - registerCallback: function(element) { - if (element.type) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - Event.observe(element, 'click', this.onElementEvent.bind(this)); - break; - case 'password': - case 'text': - case 'textarea': - case 'select-one': - case 'select-multiple': - Event.observe(element, 'change', this.onElementEvent.bind(this)); - break; - } - } - } -} - -Form.Element.EventObserver = Class.create(); -Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.EventObserver = Class.create(); -Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { - getValue: function() { - return Form.serialize(this.element); - } -}); -if (!window.Event) { - var Event = new Object(); -} - -Object.extend(Event, { - KEY_BACKSPACE: 8, - KEY_TAB: 9, - KEY_RETURN: 13, - KEY_ESC: 27, - KEY_LEFT: 37, - KEY_UP: 38, - KEY_RIGHT: 39, - KEY_DOWN: 40, - KEY_DELETE: 46, - - element: function(event) { - return event.target || event.srcElement; - }, - - isLeftClick: function(event) { - return (((event.which) && (event.which == 1)) || - ((event.button) && (event.button == 1))); - }, - - pointerX: function(event) { - return event.pageX || (event.clientX + - (document.documentElement.scrollLeft || document.body.scrollLeft)); - }, - - pointerY: function(event) { - return event.pageY || (event.clientY + - (document.documentElement.scrollTop || document.body.scrollTop)); - }, - - stop: function(event) { - if (event.preventDefault) { - event.preventDefault(); - event.stopPropagation(); - } else { - event.returnValue = false; - event.cancelBubble = true; - } - }, - - // find the first node with the given tagName, starting from the - // node the event was triggered on; traverses the DOM upwards - findElement: function(event, tagName) { - var element = Event.element(event); - while (element.parentNode && (!element.tagName || - (element.tagName.toUpperCase() != tagName.toUpperCase()))) - element = element.parentNode; - return element; - }, - - observers: false, - - _observeAndCache: function(element, name, observer, useCapture) { - if (!this.observers) this.observers = []; - if (element.addEventListener) { - this.observers.push([element, name, observer, useCapture]); - element.addEventListener(name, observer, useCapture); - } else if (element.attachEvent) { - this.observers.push([element, name, observer, useCapture]); - element.attachEvent('on' + name, observer); - } - }, - - unloadCache: function() { - if (!Event.observers) return; - for (var i = 0; i < Event.observers.length; i++) { - Event.stopObserving.apply(this, Event.observers[i]); - Event.observers[i][0] = null; - } - Event.observers = false; - }, - - observe: function(elementParam, name, observer, useCapture) { - var element = $(elementParam); - useCapture = useCapture || false; - - if (name == 'keypress' && - (navigator.appVersion.match(/Konqueror|Safari|KHTML/) - || element.attachEvent)) - name = 'keydown'; - - this._observeAndCache(element, name, observer, useCapture); - }, - - stopObserving: function(elementParam, name, observer, useCapture) { - var element = $(elementParam); - useCapture = useCapture || false; - - if (name == 'keypress' && - (navigator.appVersion.match(/Konqueror|Safari|KHTML/) - || element.detachEvent)) - name = 'keydown'; - - if (element.removeEventListener) { - element.removeEventListener(name, observer, useCapture); - } else if (element.detachEvent) { - element.detachEvent('on' + name, observer); - } - } -}); - -/* prevent memory leaks in IE */ -Event.observe(window, 'unload', Event.unloadCache, false); -var Position = { - // set to true if needed, warning: firefox performance problems - // NOT neeeded for page scrolling, only if draggable contained in - // scrollable elements - includeScrollOffsets: false, - - // must be called before calling withinIncludingScrolloffset, every time the - // page is scrolled - prepare: function() { - this.deltaX = window.pageXOffset - || document.documentElement.scrollLeft - || document.body.scrollLeft - || 0; - this.deltaY = window.pageYOffset - || document.documentElement.scrollTop - || document.body.scrollTop - || 0; - }, - - realOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.scrollTop || 0; - valueL += element.scrollLeft || 0; - element = element.parentNode; - } while (element); - return [valueL, valueT]; - }, - - cumulativeOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - return [valueL, valueT]; - }, - - positionedOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - if (element) { - p = Element.getStyle(element, 'position'); - if (p == 'relative' || p == 'absolute') break; - } - } while (element); - return [valueL, valueT]; - }, - - offsetParent: function(element) { - if (element.offsetParent) return element.offsetParent; - if (element == document.body) return element; - - while ((element = element.parentNode) && element != document.body) - if (Element.getStyle(element, 'position') != 'static') - return element; - - return document.body; - }, - - // caches x/y coordinate pair to use with overlap - within: function(element, x, y) { - if (this.includeScrollOffsets) - return this.withinIncludingScrolloffsets(element, x, y); - this.xcomp = x; - this.ycomp = y; - this.offset = this.cumulativeOffset(element); - - return (y >= this.offset[1] && - y < this.offset[1] + element.offsetHeight && - x >= this.offset[0] && - x < this.offset[0] + element.offsetWidth); - }, - - withinIncludingScrolloffsets: function(element, x, y) { - var offsetcache = this.realOffset(element); - - this.xcomp = x + offsetcache[0] - this.deltaX; - this.ycomp = y + offsetcache[1] - this.deltaY; - this.offset = this.cumulativeOffset(element); - - return (this.ycomp >= this.offset[1] && - this.ycomp < this.offset[1] + element.offsetHeight && - this.xcomp >= this.offset[0] && - this.xcomp < this.offset[0] + element.offsetWidth); - }, - - // within must be called directly before - overlap: function(mode, element) { - if (!mode) return 0; - if (mode == 'vertical') - return ((this.offset[1] + element.offsetHeight) - this.ycomp) / - element.offsetHeight; - if (mode == 'horizontal') - return ((this.offset[0] + element.offsetWidth) - this.xcomp) / - element.offsetWidth; - }, - - clone: function(source, target) { - source = $(source); - target = $(target); - target.style.position = 'absolute'; - var offsets = this.cumulativeOffset(source); - target.style.top = offsets[1] + 'px'; - target.style.left = offsets[0] + 'px'; - target.style.width = source.offsetWidth + 'px'; - target.style.height = source.offsetHeight + 'px'; - }, - - page: function(forElement) { - var valueT = 0, valueL = 0; - - var element = forElement; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - - // Safari fix - if (element.offsetParent==document.body) - if (Element.getStyle(element,'position')=='absolute') break; - - } while (element = element.offsetParent); - - element = forElement; - do { - valueT -= element.scrollTop || 0; - valueL -= element.scrollLeft || 0; - } while (element = element.parentNode); - - return [valueL, valueT]; - }, - - clone: function(source, target) { - var options = Object.extend({ - setLeft: true, - setTop: true, - setWidth: true, - setHeight: true, - offsetTop: 0, - offsetLeft: 0 - }, arguments[2] || {}) - - // find page position of source - source = $(source); - var p = Position.page(source); - - // find coordinate system to use - target = $(target); - var delta = [0, 0]; - var parent = null; - // delta [0,0] will do fine with position: fixed elements, - // position:absolute needs offsetParent deltas - if (Element.getStyle(target,'position') == 'absolute') { - parent = Position.offsetParent(target); - delta = Position.page(parent); - } - - // correct by body offsets (fixes Safari) - if (parent == document.body) { - delta[0] -= document.body.offsetLeft; - delta[1] -= document.body.offsetTop; - } - - // set position - if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; - if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; - if(options.setWidth) target.style.width = source.offsetWidth + 'px'; - if(options.setHeight) target.style.height = source.offsetHeight + 'px'; - }, - - absolutize: function(element) { - element = $(element); - if (element.style.position == 'absolute') return; - Position.prepare(); - - var offsets = Position.positionedOffset(element); - var top = offsets[1]; - var left = offsets[0]; - var width = element.clientWidth; - var height = element.clientHeight; - - element._originalLeft = left - parseFloat(element.style.left || 0); - element._originalTop = top - parseFloat(element.style.top || 0); - element._originalWidth = element.style.width; - element._originalHeight = element.style.height; - - element.style.position = 'absolute'; - element.style.top = top + 'px';; - element.style.left = left + 'px';; - element.style.width = width + 'px';; - element.style.height = height + 'px';; - }, - - relativize: function(element) { - element = $(element); - if (element.style.position == 'relative') return; - Position.prepare(); - - element.style.position = 'relative'; - var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); - var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.height = element._originalHeight; - element.style.width = element._originalWidth; - } -} - -// Safari returns margins on body which is incorrect if the child is absolutely -// positioned. For performance reasons, redefine Position.cumulativeOffset for -// KHTML/WebKit only. -if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { - Position.cumulativeOffset = function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - if (element.offsetParent == document.body) - if (Element.getStyle(element, 'position') == 'absolute') break; - - element = element.offsetParent; - } while (element); - - return [valueL, valueT]; - } -} diff --git a/lib/Rico/Color.js b/lib/Rico/Color.js index e61ae2942b..a07819f7c8 100644 --- a/lib/Rico/Color.js +++ b/lib/Rico/Color.js @@ -1,4 +1,4 @@ -Rico.Color = Class.create(); +Rico.Color = OpenLayers.Class.create(); Rico.Color.prototype = { diff --git a/lib/Rico/Corner.js b/lib/Rico/Corner.js index b996b85a98..1e549f7009 100644 --- a/lib/Rico/Corner.js +++ b/lib/Rico/Corner.js @@ -188,7 +188,7 @@ Rico.Corner = { border : false, compact : false } - Object.extend(this.options, options || {}); + OpenLayers.Util.extend(this.options, options || {}); this.options.numSlices = this.options.compact ? 2 : 4; if ( this._isTransparent() ) diff --git a/tests/test_Layer_WMS.html b/tests/test_Layer_WMS.html index d702dab1d1..5990022d25 100644 --- a/tests/test_Layer_WMS.html +++ b/tests/test_Layer_WMS.html @@ -99,7 +99,7 @@ t.ok( layer.isBaseLayer, "baselayer is true by default"); - var newParams = Object.extend(new Object(), params); + var newParams = OpenLayers.Util.extend(new Object(), params); newParams.transparent = "true"; layer = new OpenLayers.Layer.WMS(name, url, newParams);