summaryrefslogtreecommitdiff
path: root/misc/openlayers/lib/deprecated.js
diff options
context:
space:
mode:
Diffstat (limited to 'misc/openlayers/lib/deprecated.js')
-rw-r--r--misc/openlayers/lib/deprecated.js5842
1 files changed, 0 insertions, 5842 deletions
diff --git a/misc/openlayers/lib/deprecated.js b/misc/openlayers/lib/deprecated.js
deleted file mode 100644
index a492faa..0000000
--- a/misc/openlayers/lib/deprecated.js
+++ /dev/null
@@ -1,5842 +0,0 @@
-/**
- * @requires OpenLayers/BaseTypes/Class.js
- * @requires OpenLayers/Util.js
- * @requires OpenLayers/Control.js
- * @requires OpenLayers/Format.js
- * @requires OpenLayers/Request.js
- * @requires OpenLayers/Layer/WMS.js
- * @requires OpenLayers/Layer/MapServer.js
- * @requires OpenLayers/Tile.js
- * @requires OpenLayers/Request/XMLHttpRequest.js
- * @requires OpenLayers/Layer/Vector.js
- * @requires OpenLayers/Layer/Markers.js
- * @requires OpenLayers/Console.js
- * @requires OpenLayers/Lang.js
- * @requires OpenLayers/Feature.js
- * @requires OpenLayers/Layer/EventPane.js
- * @requires OpenLayers/Layer/FixedZoomLevels.js
- * @requires OpenLayers/Layer/SphericalMercator.js
- * @requires OpenLayers/Protocol.js
- * @requires OpenLayers/Format/JSON.js
- * @requires OpenLayers/Format/WKT.js
- * @requires OpenLayers/Format/XML.js
- * @requires OpenLayers/Geometry.js
- * @requires OpenLayers/Renderer/Elements.js
- * @requires OpenLayers/Popup/Anchored.js
- * @requires Rico/Corner.js
- */
-
-/**
- * About: Deprecated
- * The deprecated.js script includes all methods, properties, and constructors
- * that are not supported as part of the long-term API. If you use any of
- * these, you have to explicitly include this script in your application.
- *
- * For example:
- * (code)
- * <script src="deprecated.js" type="text/javascript"></script>
- * (end)
- *
- * You are strongly encouraged to avoid using deprecated functionality. The
- * documentation here should point you to the supported alternatives.
- */
-
-/**
- * Namespace: OpenLayers.Class
- */
-
-/**
- * Property: isPrototype
- * *Deprecated*. This is no longer needed and will be removed at 3.0.
- */
-OpenLayers.Class.isPrototype = function () {};
-
-/**
- * APIFunction: OpenLayers.create
- * *Deprecated*. Old method to create an OpenLayers style class. Use the
- * <OpenLayers.Class> constructor instead.
- *
- * Returns:
- * An OpenLayers class
- */
-OpenLayers.Class.create = function() {
- return function() {
- if (arguments && arguments[0] != OpenLayers.Class.isPrototype) {
- this.initialize.apply(this, arguments);
- }
- };
-};
-
-/**
- * APIFunction: inherit
- * *Deprecated*. Old method to inherit from one or more OpenLayers style
- * classes. Use the <OpenLayers.Class> constructor instead.
- *
- * Parameters:
- * class - One or more classes can be provided as arguments
- *
- * Returns:
- * An object prototype
- */
-OpenLayers.Class.inherit = function (P) {
- var C = function() {
- P.call(this);
- };
- var newArgs = [C].concat(Array.prototype.slice.call(arguments));
- OpenLayers.inherit.apply(null, newArgs);
- return C.prototype;
-};
-
-/**
- * Namespace: OpenLayers.Util
- */
-
-/**
- * Function: clearArray
- * *Deprecated*. This function will disappear in 3.0.
- * Please use "array.length = 0" instead.
- *
- * Parameters:
- * array - {Array}
- */
-OpenLayers.Util.clearArray = function(array) {
- OpenLayers.Console.warn(
- OpenLayers.i18n(
- "methodDeprecated", {'newMethod': 'array = []'}
- )
- );
- array.length = 0;
-};
-
-/**
- * Function: setOpacity
- * *Deprecated*. This function has been deprecated. Instead, please use
- * <OpenLayers.Util.modifyDOMElement>
- * or
- * <OpenLayers.Util.modifyAlphaImageDiv>
- *
- * Set the opacity of a DOM Element
- * Note that for this function to work in IE, elements must "have layout"
- * according to:
- * http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/haslayout.asp
- *
- * Parameters:
- * element - {DOMElement} Set the opacity on this DOM element
- * opacity - {Float} Opacity value (0.0 - 1.0)
- */
-OpenLayers.Util.setOpacity = function(element, opacity) {
- OpenLayers.Util.modifyDOMElement(element, null, null, null,
- null, null, null, opacity);
-};
-
-/**
- * Function: safeStopPropagation
- * *Deprecated*. This function has been deprecated. Please use directly
- * <OpenLayers.Event.stop> passing 'true' as the 2nd
- * argument (preventDefault)
- *
- * Safely stop the propagation of an event *without* preventing
- * the default browser action from occurring.
- *
- * Parameters:
- * evt - {Event}
- */
-OpenLayers.Util.safeStopPropagation = function(evt) {
- OpenLayers.Event.stop(evt, true);
-};
-
-/**
- * Function: getArgs
- * *Deprecated*. Will be removed in 3.0. Please use instead
- * <OpenLayers.Util.getParameters>
- *
- * Parameters:
- * url - {String} Optional url used to extract the query string.
- * If null, query string is taken from page location.
- *
- * Returns:
- * {Object} An object of key/value pairs from the query string.
- */
-OpenLayers.Util.getArgs = function(url) {
- OpenLayers.Console.warn(
- OpenLayers.i18n(
- "methodDeprecated", {'newMethod': 'OpenLayers.Util.getParameters'}
- )
- );
- return OpenLayers.Util.getParameters(url);
-};
-
-/**
- * Maintain existing definition of $.
- *
- * The use of our $-method is deprecated and the mapping of
- * OpenLayers.Util.getElement will eventually be removed. Do not depend on
- * window.$ being defined by OpenLayers.
- */
-if(typeof window.$ === "undefined") {
- window.$ = OpenLayers.Util.getElement;
-}
-
-/**
- * Namespace: OpenLayers.Ajax
- */
-
-/**
- * Function: OpenLayers.nullHandler
- * @param {} request
- */
-OpenLayers.nullHandler = function(request) {
- OpenLayers.Console.userError(OpenLayers.i18n("unhandledRequest", {'statusText':request.statusText}));
-};
-
-/**
- * APIFunction: OpenLayers.loadURL
- * Background load a document.
- * *Deprecated*. Use <OpenLayers.Request.GET> method instead.
- *
- * Parameters:
- * uri - {String} URI of source doc
- * params - {String} or {Object} GET params. Either a string in the form
- * "?hello=world&foo=bar" (do not forget the leading question mark)
- * or an object in the form {'hello': 'world', 'foo': 'bar}
- * caller - {Object} object which gets callbacks
- * onComplete - {Function} Optional callback for success. The callback
- * will be called with this set to caller and will receive the request
- * object as an argument. Note that if you do not specify an onComplete
- * function, <OpenLayers.nullHandler> will be called (which pops up a
- * user friendly error message dialog).
- * onFailure - {Function} Optional callback for failure. In the event of
- * a failure, the callback will be called with this set to caller and will
- * receive the request object as an argument. Note that if you do not
- * specify an onComplete function, <OpenLayers.nullHandler> will be called
- * (which pops up a user friendly error message dialog).
- *
- * Returns:
- * {<OpenLayers.Request.XMLHttpRequest>} The request object. To abort loading,
- * call request.abort().
- */
-OpenLayers.loadURL = function(uri, params, caller,
- onComplete, onFailure) {
-
- if(typeof params == 'string') {
- params = OpenLayers.Util.getParameters(params);
- }
- var success = (onComplete) ? onComplete : OpenLayers.nullHandler;
- var failure = (onFailure) ? onFailure : OpenLayers.nullHandler;
-
- return OpenLayers.Request.GET({
- url: uri, params: params,
- success: success, failure: failure, scope: caller
- });
-};
-
-/**
- * Function: OpenLayers.parseXMLString
- * Parse XML into a doc structure
- *
- * Parameters:
- * text - {String}
- *
- * Returns:
- * {?} Parsed AJAX Responsev
- */
-OpenLayers.parseXMLString = function(text) {
-
- //MS sucks, if the server is bad it dies
- var index = text.indexOf('<');
- if (index > 0) {
- text = text.substring(index);
- }
-
- var ajaxResponse = OpenLayers.Util.Try(
- function() {
- var xmldom = new ActiveXObject('Microsoft.XMLDOM');
- xmldom.loadXML(text);
- return xmldom;
- },
- function() {
- return new DOMParser().parseFromString(text, 'text/xml');
- },
- function() {
- var req = new XMLHttpRequest();
- req.open("GET", "data:" + "text/xml" +
- ";charset=utf-8," + encodeURIComponent(text), false);
- if (req.overrideMimeType) {
- req.overrideMimeType("text/xml");
- }
- req.send(null);
- return req.responseXML;
- }
- );
-
- return ajaxResponse;
-};
-
-OpenLayers.Ajax = {
-
- /**
- * Method: emptyFunction
- */
- emptyFunction: function () {},
-
- /**
- * Method: getTransport
- *
- * Returns:
- * {Object} Transport mechanism for whichever browser we're in, or false if
- * none available.
- */
- getTransport: function() {
- return OpenLayers.Util.Try(
- function() {return new XMLHttpRequest();},
- function() {return new ActiveXObject('Msxml2.XMLHTTP');},
- function() {return new ActiveXObject('Microsoft.XMLHTTP');}
- ) || false;
- },
-
- /**
- * Property: activeRequestCount
- * {Integer}
- */
- activeRequestCount: 0
-};
-
-/**
- * Namespace: OpenLayers.Ajax.Responders
- * {Object}
- */
-OpenLayers.Ajax.Responders = {
-
- /**
- * Property: responders
- * {Array}
- */
- responders: [],
-
- /**
- * Method: register
- *
- * Parameters:
- * responderToAdd - {?}
- */
- register: function(responderToAdd) {
- for (var i = 0; i < this.responders.length; i++){
- if (responderToAdd == this.responders[i]){
- return;
- }
- }
- this.responders.push(responderToAdd);
- },
-
- /**
- * Method: unregister
- *
- * Parameters:
- * responderToRemove - {?}
- */
- unregister: function(responderToRemove) {
- OpenLayers.Util.removeItem(this.reponders, responderToRemove);
- },
-
- /**
- * Method: dispatch
- *
- * Parameters:
- * callback - {?}
- * request - {?}
- * transport - {?}
- */
- dispatch: function(callback, request, transport) {
- var responder;
- for (var i = 0; i < this.responders.length; i++) {
- responder = this.responders[i];
-
- if (responder[callback] &&
- typeof responder[callback] == 'function') {
- try {
- responder[callback].apply(responder,
- [request, transport]);
- } catch (e) {}
- }
- }
- }
-};
-
-OpenLayers.Ajax.Responders.register({
- /**
- * Function: onCreate
- */
- onCreate: function() {
- OpenLayers.Ajax.activeRequestCount++;
- },
-
- /**
- * Function: onComplete
- */
- onComplete: function() {
- OpenLayers.Ajax.activeRequestCount--;
- }
-});
-
-/**
- * Class: OpenLayers.Ajax.Base
- */
-OpenLayers.Ajax.Base = OpenLayers.Class({
-
- /**
- * Constructor: OpenLayers.Ajax.Base
- *
- * Parameters:
- * options - {Object}
- */
- initialize: function(options) {
- this.options = {
- method: 'post',
- asynchronous: true,
- contentType: 'application/xml',
- parameters: ''
- };
- OpenLayers.Util.extend(this.options, options || {});
-
- this.options.method = this.options.method.toLowerCase();
-
- if (typeof this.options.parameters == 'string') {
- this.options.parameters =
- OpenLayers.Util.getParameters(this.options.parameters);
- }
- }
-});
-
-/**
- * Class: OpenLayers.Ajax.Request
- * *Deprecated*. Use <OpenLayers.Request> method instead.
- *
- * Inherit:
- * - <OpenLayers.Ajax.Base>
- */
-OpenLayers.Ajax.Request = OpenLayers.Class(OpenLayers.Ajax.Base, {
-
- /**
- * Property: _complete
- *
- * {Boolean}
- */
- _complete: false,
-
- /**
- * Constructor: OpenLayers.Ajax.Request
- *
- * Parameters:
- * url - {String}
- * options - {Object}
- */
- initialize: function(url, options) {
- OpenLayers.Ajax.Base.prototype.initialize.apply(this, [options]);
-
- if (OpenLayers.ProxyHost && OpenLayers.String.startsWith(url, "http")) {
- url = OpenLayers.ProxyHost + encodeURIComponent(url);
- }
-
- this.transport = OpenLayers.Ajax.getTransport();
- this.request(url);
- },
-
- /**
- * Method: request
- *
- * Parameters:
- * url - {String}
- */
- request: function(url) {
- this.url = url;
- this.method = this.options.method;
- var params = OpenLayers.Util.extend({}, this.options.parameters);
-
- if (this.method != 'get' && this.method != 'post') {
- // simulate other verbs over post
- params['_method'] = this.method;
- this.method = 'post';
- }
-
- this.parameters = params;
-
- if (params = OpenLayers.Util.getParameterString(params)) {
- // when GET, append parameters to URL
- if (this.method == 'get') {
- this.url += ((this.url.indexOf('?') > -1) ? '&' : '?') + params;
- } else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
- params += '&_=';
- }
- }
- try {
- var response = new OpenLayers.Ajax.Response(this);
- if (this.options.onCreate) {
- this.options.onCreate(response);
- }
-
- OpenLayers.Ajax.Responders.dispatch('onCreate',
- this,
- response);
-
- this.transport.open(this.method.toUpperCase(),
- this.url,
- this.options.asynchronous);
-
- if (this.options.asynchronous) {
- window.setTimeout(
- OpenLayers.Function.bind(this.respondToReadyState, this, 1),
- 10);
- }
-
- this.transport.onreadystatechange =
- OpenLayers.Function.bind(this.onStateChange, this);
- this.setRequestHeaders();
-
- this.body = this.method == 'post' ?
- (this.options.postBody || params) : null;
- this.transport.send(this.body);
-
- // Force Firefox to handle ready state 4 for synchronous requests
- if (!this.options.asynchronous &&
- this.transport.overrideMimeType) {
- this.onStateChange();
- }
- } catch (e) {
- this.dispatchException(e);
- }
- },
-
- /**
- * Method: onStateChange
- */
- onStateChange: function() {
- var readyState = this.transport.readyState;
- if (readyState > 1 && !((readyState == 4) && this._complete)) {
- this.respondToReadyState(this.transport.readyState);
- }
- },
-
- /**
- * Method: setRequestHeaders
- */
- setRequestHeaders: function() {
- var headers = {
- 'X-Requested-With': 'XMLHttpRequest',
- 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*',
- 'OpenLayers': true
- };
-
- if (this.method == 'post') {
- headers['Content-type'] = this.options.contentType +
- (this.options.encoding ? '; charset=' + this.options.encoding : '');
-
- /* Force "Connection: close" for older Mozilla browsers to work
- * around a bug where XMLHttpRequest sends an incorrect
- * Content-length header. See Mozilla Bugzilla #246651.
- */
- if (this.transport.overrideMimeType &&
- (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) {
- headers['Connection'] = 'close';
- }
- }
- // user-defined headers
- if (typeof this.options.requestHeaders == 'object') {
- var extras = this.options.requestHeaders;
-
- if (typeof extras.push == 'function') {
- for (var i = 0, length = extras.length; i < length; i += 2) {
- headers[extras[i]] = extras[i+1];
- }
- } else {
- for (var i in extras) {
- headers[i] = extras[i];
- }
- }
- }
-
- for (var name in headers) {
- this.transport.setRequestHeader(name, headers[name]);
- }
- },
-
- /**
- * Method: success
- *
- * Returns:
- * {Boolean} -
- */
- success: function() {
- var status = this.getStatus();
- return !status || (status >=200 && status < 300);
- },
-
- /**
- * Method: getStatus
- *
- * Returns:
- * {Integer} - Status
- */
- getStatus: function() {
- try {
- return this.transport.status || 0;
- } catch (e) {
- return 0;
- }
- },
-
- /**
- * Method: respondToReadyState
- *
- * Parameters:
- * readyState - {?}
- */
- respondToReadyState: function(readyState) {
- var state = OpenLayers.Ajax.Request.Events[readyState];
- var response = new OpenLayers.Ajax.Response(this);
-
- if (state == 'Complete') {
- try {
- this._complete = true;
- (this.options['on' + response.status] ||
- this.options['on' + (this.success() ? 'Success' : 'Failure')] ||
- OpenLayers.Ajax.emptyFunction)(response);
- } catch (e) {
- this.dispatchException(e);
- }
-
- var contentType = response.getHeader('Content-type');
- }
-
- try {
- (this.options['on' + state] ||
- OpenLayers.Ajax.emptyFunction)(response);
- OpenLayers.Ajax.Responders.dispatch('on' + state,
- this,
- response);
- } catch (e) {
- this.dispatchException(e);
- }
-
- if (state == 'Complete') {
- // avoid memory leak in MSIE: clean up
- this.transport.onreadystatechange = OpenLayers.Ajax.emptyFunction;
- }
- },
-
- /**
- * Method: getHeader
- *
- * Parameters:
- * name - {String} Header name
- *
- * Returns:
- * {?} - response header for the given name
- */
- getHeader: function(name) {
- try {
- return this.transport.getResponseHeader(name);
- } catch (e) {
- return null;
- }
- },
-
- /**
- * Method: dispatchException
- * If the optional onException function is set, execute it
- * and then dispatch the call to any other listener registered
- * for onException.
- *
- * If no optional onException function is set, we suspect that
- * the user may have also not used
- * OpenLayers.Ajax.Responders.register to register a listener
- * for the onException call. To make sure that something
- * gets done with this exception, only dispatch the call if there
- * are listeners.
- *
- * If you explicitly want to swallow exceptions, set
- * request.options.onException to an empty function (function(){})
- * or register an empty function with <OpenLayers.Ajax.Responders>
- * for onException.
- *
- * Parameters:
- * exception - {?}
- */
- dispatchException: function(exception) {
- var handler = this.options.onException;
- if(handler) {
- // call options.onException and alert any other listeners
- handler(this, exception);
- OpenLayers.Ajax.Responders.dispatch('onException', this, exception);
- } else {
- // check if there are any other listeners
- var listener = false;
- var responders = OpenLayers.Ajax.Responders.responders;
- for (var i = 0; i < responders.length; i++) {
- if(responders[i].onException) {
- listener = true;
- break;
- }
- }
- if(listener) {
- // call all listeners
- OpenLayers.Ajax.Responders.dispatch('onException', this, exception);
- } else {
- // let the exception through
- throw exception;
- }
- }
- }
-});
-
-/**
- * Property: Events
- * {Array(String)}
- */
-OpenLayers.Ajax.Request.Events =
- ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
-
-/**
- * Class: OpenLayers.Ajax.Response
- */
-OpenLayers.Ajax.Response = OpenLayers.Class({
-
- /**
- * Property: status
- *
- * {Integer}
- */
- status: 0,
-
-
- /**
- * Property: statusText
- *
- * {String}
- */
- statusText: '',
-
- /**
- * Constructor: OpenLayers.Ajax.Response
- *
- * Parameters:
- * request - {Object}
- */
- initialize: function(request) {
- this.request = request;
- var transport = this.transport = request.transport,
- readyState = this.readyState = transport.readyState;
-
- if ((readyState > 2 &&
- !(!!(window.attachEvent && !window.opera))) ||
- readyState == 4) {
- this.status = this.getStatus();
- this.statusText = this.getStatusText();
- this.responseText = transport.responseText == null ?
- '' : String(transport.responseText);
- }
-
- if(readyState == 4) {
- var xml = transport.responseXML;
- this.responseXML = xml === undefined ? null : xml;
- }
- },
-
- /**
- * Method: getStatus
- */
- getStatus: OpenLayers.Ajax.Request.prototype.getStatus,
-
- /**
- * Method: getStatustext
- *
- * Returns:
- * {String} - statusText
- */
- getStatusText: function() {
- try {
- return this.transport.statusText || '';
- } catch (e) {
- return '';
- }
- },
-
- /**
- * Method: getHeader
- */
- getHeader: OpenLayers.Ajax.Request.prototype.getHeader,
-
- /**
- * Method: getResponseHeader
- *
- * Returns:
- * {?} - response header for given name
- */
- getResponseHeader: function(name) {
- return this.transport.getResponseHeader(name);
- }
-});
-
-
-/**
- * Function: getElementsByTagNameNS
- *
- * Parameters:
- * parentnode - {?}
- * nsuri - {?}
- * nsprefix - {?}
- * tagname - {?}
- *
- * Returns:
- * {?}
- */
-OpenLayers.Ajax.getElementsByTagNameNS = function(parentnode, nsuri,
- nsprefix, tagname) {
- var elem = null;
- if (parentnode.getElementsByTagNameNS) {
- elem = parentnode.getElementsByTagNameNS(nsuri, tagname);
- } else {
- elem = parentnode.getElementsByTagName(nsprefix + ':' + tagname);
- }
- return elem;
-};
-
-
-/**
- * Function: serializeXMLToString
- * Wrapper function around XMLSerializer, which doesn't exist/work in
- * IE/Safari. We need to come up with a way to serialize in those browser:
- * for now, these browsers will just fail. #535, #536
- *
- * Parameters:
- * xmldom {XMLNode} xml dom to serialize
- *
- * Returns:
- * {?}
- */
-OpenLayers.Ajax.serializeXMLToString = function(xmldom) {
- var serializer = new XMLSerializer();
- var data = serializer.serializeToString(xmldom);
- return data;
-};
-
-/**
- * Namespace: OpenLayers.Element
- */
-OpenLayers.Util.extend(OpenLayers.Element, {
-
- /**
- * APIFunction: hide
- * *Deprecated*. Hide element(s) passed in
- *
- * Parameters:
- * element - {DOMElement} Actually user can pass any number of elements
- */
- hide: function() {
- OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated", {
- newMethod: "element.style.display = 'none';"
- }));
-
- for (var i=0, len=arguments.length; i<len; i++) {
- var element = OpenLayers.Util.getElement(arguments[i]);
- if (element) {
- element.style.display = 'none';
- }
- }
- },
-
- /**
- * APIFunction: show
- * *Deprecated*. Show element(s) passed in
- *
- * Parameters:
- * element - {DOMElement} Actually user can pass any number of elements
- */
- show: function() {
- OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated", {
- newMethod: "element.style.display = '';"
- }));
-
- for (var i=0, len=arguments.length; i<len; i++) {
- var element = OpenLayers.Util.getElement(arguments[i]);
- if (element) {
- element.style.display = '';
- }
- }
- },
-
- /**
- * APIFunction: getDimensions
- * *Deprecated*. Returns dimensions of the element passed in.
- *
- * Parameters:
- * element - {DOMElement}
- *
- * Returns:
- * {Object} Object with 'width' and 'height' properties which are the
- * dimensions of the element passed in.
- */
- getDimensions: function(element) {
- element = OpenLayers.Util.getElement(element);
- if (OpenLayers.Element.getStyle(element, 'display') != 'none') {
- return {width: element.offsetWidth, height: element.offsetHeight};
- }
-
- // All *Width and *Height properties give 0 on elements with display none,
- // so enable the element temporarily
- var els = element.style;
- var originalVisibility = els.visibility;
- var originalPosition = els.position;
- var originalDisplay = els.display;
- els.visibility = 'hidden';
- els.position = 'absolute';
- els.display = '';
- var originalWidth = element.clientWidth;
- var originalHeight = element.clientHeight;
- els.display = originalDisplay;
- els.position = originalPosition;
- els.visibility = originalVisibility;
- return {width: originalWidth, height: originalHeight};
- }
-
-});
-
-if (!String.prototype.startsWith) {
- /**
- * APIMethod: String.startsWith
- * *Deprecated*. Whether or not a string starts with another string.
- *
- * Parameters:
- * sStart - {String} The string we're testing for.
- *
- * Returns:
- * {Boolean} Whether or not this string starts with the string passed in.
- */
- String.prototype.startsWith = function(sStart) {
- OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",
- {'newMethod':'OpenLayers.String.startsWith'}));
- return OpenLayers.String.startsWith(this, sStart);
- };
-}
-
-if (!String.prototype.contains) {
- /**
- * APIMethod: String.contains
- * *Deprecated*. Whether or not a string contains another string.
- *
- * Parameters:
- * str - {String} The string that we're testing for.
- *
- * Returns:
- * {Boolean} Whether or not this string contains with the string passed in.
- */
- String.prototype.contains = function(str) {
- OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",
- {'newMethod':'OpenLayers.String.contains'}));
- return OpenLayers.String.contains(this, str);
- };
-}
-
-if (!String.prototype.trim) {
- /**
- * APIMethod: String.trim
- * *Deprecated*. Removes leading and trailing whitespace characters from a string.
- *
- * Returns:
- * {String} A trimmed version of the string - all leading and
- * trailing spaces removed
- */
- String.prototype.trim = function() {
- OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",
- {'newMethod':'OpenLayers.String.trim'}));
- return OpenLayers.String.trim(this);
- };
-}
-
-if (!String.prototype.camelize) {
- /**
- * APIMethod: String.camelize
- * *Deprecated*. Camel-case a hyphenated string.
- * Ex. "chicken-head" becomes "chickenHead", and
- * "-chicken-head" becomes "ChickenHead".
- *
- * Returns:
- * {String} The string, camelized
- */
- String.prototype.camelize = function() {
- OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",
- {'newMethod':'OpenLayers.String.camelize'}));
- return OpenLayers.String.camelize(this);
- };
-}
-
-if (!Function.prototype.bind) {
- /**
- * APIMethod: Function.bind
- * *Deprecated*. Bind a function to an object.
- * Method to easily create closures with 'this' altered.
- *
- * Parameters:
- * object - {Object} the this parameter
- *
- * Returns:
- * {Function} A closure with 'this' altered to the first
- * argument.
- */
- Function.prototype.bind = function() {
- OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",
- {'newMethod':'OpenLayers.Function.bind'}));
- // new function takes the same arguments with this function up front
- Array.prototype.unshift.apply(arguments, [this]);
- return OpenLayers.Function.bind.apply(null, arguments);
- };
-}
-
-if (!Function.prototype.bindAsEventListener) {
- /**
- * APIMethod: Function.bindAsEventListener
- * *Deprecated*. Bind a function to an object, and configure it to receive the
- * event object as first parameter when called.
- *
- * Parameters:
- * object - {Object} A reference to this.
- *
- * Returns:
- * {Function}
- */
- Function.prototype.bindAsEventListener = function(object) {
- OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",
- {'newMethod':'OpenLayers.Function.bindAsEventListener'}));
- return OpenLayers.Function.bindAsEventListener(this, object);
- };
-}
-
-// FIXME: Remove this in 3.0. In 3.0, Event.stop will no longer be provided
-// by OpenLayers.
-if (window.Event) {
- OpenLayers.Util.applyDefaults(window.Event, OpenLayers.Event);
-} else {
- var Event = OpenLayers.Event;
-}
-
-/**
- * Namespace: OpenLayers.Tile
- */
-OpenLayers.Util.extend(OpenLayers.Tile.prototype, {
- /**
- * Method: getBoundsFromBaseLayer
- * Take the pixel locations of the corner of the tile, and pass them to
- * the base layer and ask for the location of those pixels, so that
- * displaying tiles over Google works fine.
- *
- * Parameters:
- * position - {<OpenLayers.Pixel>}
- *
- * Returns:
- * bounds - {<OpenLayers.Bounds>}
- */
- getBoundsFromBaseLayer: function(position) {
- var msg = OpenLayers.i18n('reprojectDeprecated',
- {'layerName':this.layer.name});
- OpenLayers.Console.warn(msg);
- var topLeft = this.layer.map.getLonLatFromLayerPx(position);
- var bottomRightPx = position.clone();
- bottomRightPx.x += this.size.w;
- bottomRightPx.y += this.size.h;
- var bottomRight = this.layer.map.getLonLatFromLayerPx(bottomRightPx);
- // Handle the case where the base layer wraps around the date line.
- // Google does this, and it breaks WMS servers to request bounds in
- // that fashion.
- if (topLeft.lon > bottomRight.lon) {
- if (topLeft.lon < 0) {
- topLeft.lon = -180 - (topLeft.lon+180);
- } else {
- bottomRight.lon = 180+bottomRight.lon+180;
- }
- }
- var bounds = new OpenLayers.Bounds(topLeft.lon,
- bottomRight.lat,
- bottomRight.lon,
- topLeft.lat);
- return bounds;
- }
-});
-
-/**
- * Class: OpenLayers.Control.MouseDefaults
- * This class is DEPRECATED in 2.4 and will be removed by 3.0.
- * If you need this functionality, use <OpenLayers.Control.Navigation>
- * instead!!!
- *
- * Inherits from:
- * - <OpenLayers.Control>
- */
-OpenLayers.Control.MouseDefaults = OpenLayers.Class(OpenLayers.Control, {
-
- /** WARNING WARNING WARNING!!!
- This class is DEPRECATED in 2.4 and will be removed by 3.0.
- If you need this functionality, use Control.Navigation instead!!! */
-
- /**
- * Property: performedDrag
- * {Boolean}
- */
- performedDrag: false,
-
- /**
- * Property: wheelObserver
- * {Function}
- */
- wheelObserver: null,
-
- /**
- * Constructor: OpenLayers.Control.MouseDefaults
- */
- initialize: function() {
- OpenLayers.Control.prototype.initialize.apply(this, arguments);
- },
-
- /**
- * APIMethod: destroy
- */
- destroy: function() {
-
- if (this.handler) {
- this.handler.destroy();
- }
- this.handler = null;
-
- this.map.events.un({
- "click": this.defaultClick,
- "dblclick": this.defaultDblClick,
- "mousedown": this.defaultMouseDown,
- "mouseup": this.defaultMouseUp,
- "mousemove": this.defaultMouseMove,
- "mouseout": this.defaultMouseOut,
- scope: this
- });
-
- //unregister mousewheel events specifically on the window and document
- OpenLayers.Event.stopObserving(window, "DOMMouseScroll",
- this.wheelObserver);
- OpenLayers.Event.stopObserving(window, "mousewheel",
- this.wheelObserver);
- OpenLayers.Event.stopObserving(document, "mousewheel",
- this.wheelObserver);
- this.wheelObserver = null;
-
- OpenLayers.Control.prototype.destroy.apply(this, arguments);
- },
-
- /**
- * Method: draw
- */
- draw: function() {
- this.map.events.on({
- "click": this.defaultClick,
- "dblclick": this.defaultDblClick,
- "mousedown": this.defaultMouseDown,
- "mouseup": this.defaultMouseUp,
- "mousemove": this.defaultMouseMove,
- "mouseout": this.defaultMouseOut,
- scope: this
- });
-
- this.registerWheelEvents();
-
- },
-
- /**
- * Method: registerWheelEvents
- */
- registerWheelEvents: function() {
-
- this.wheelObserver = OpenLayers.Function.bindAsEventListener(
- this.onWheelEvent, this
- );
-
- //register mousewheel events specifically on the window and document
- OpenLayers.Event.observe(window, "DOMMouseScroll", this.wheelObserver);
- OpenLayers.Event.observe(window, "mousewheel", this.wheelObserver);
- OpenLayers.Event.observe(document, "mousewheel", this.wheelObserver);
- },
-
- /**
- * Method: defaultClick
- *
- * Parameters:
- * evt - {Event}
- *
- * Returns:
- * {Boolean}
- */
- defaultClick: function (evt) {
- if (!OpenLayers.Event.isLeftClick(evt)) {
- return;
- }
- var notAfterDrag = !this.performedDrag;
- this.performedDrag = false;
- return notAfterDrag;
- },
-
- /**
- * Method: defaultDblClick
- *
- * Parameters:
- * evt - {Event}
- */
- defaultDblClick: function (evt) {
- var newCenter = this.map.getLonLatFromViewPortPx( evt.xy );
- this.map.setCenter(newCenter, this.map.zoom + 1);
- OpenLayers.Event.stop(evt);
- return false;
- },
-
- /**
- * Method: defaultMouseDown
- *
- * Parameters:
- * evt - {Event}
- */
- defaultMouseDown: function (evt) {
- if (!OpenLayers.Event.isLeftClick(evt)) {
- return;
- }
- this.mouseDragStart = evt.xy.clone();
- this.performedDrag = false;
- if (evt.shiftKey) {
- this.map.div.style.cursor = "crosshair";
- this.zoomBox = OpenLayers.Util.createDiv('zoomBox',
- this.mouseDragStart,
- null,
- null,
- "absolute",
- "2px solid red");
- this.zoomBox.style.backgroundColor = "white";
- this.zoomBox.style.filter = "alpha(opacity=50)"; // IE
- this.zoomBox.style.opacity = "0.50";
- this.zoomBox.style.fontSize = "1px";
- this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
- this.map.viewPortDiv.appendChild(this.zoomBox);
- }
- document.onselectstart = OpenLayers.Function.False;
- OpenLayers.Event.stop(evt);
- },
-
- /**
- * Method: defaultMouseMove
- *
- * Parameters:
- * evt - {Event}
- */
- defaultMouseMove: function (evt) {
- // record the mouse position, used in onWheelEvent
- this.mousePosition = evt.xy.clone();
-
- if (this.mouseDragStart != null) {
- if (this.zoomBox) {
- var deltaX = Math.abs(this.mouseDragStart.x - evt.xy.x);
- var deltaY = Math.abs(this.mouseDragStart.y - evt.xy.y);
- this.zoomBox.style.width = Math.max(1, deltaX) + "px";
- this.zoomBox.style.height = Math.max(1, deltaY) + "px";
- if (evt.xy.x < this.mouseDragStart.x) {
- this.zoomBox.style.left = evt.xy.x+"px";
- }
- if (evt.xy.y < this.mouseDragStart.y) {
- this.zoomBox.style.top = evt.xy.y+"px";
- }
- } else {
- var deltaX = this.mouseDragStart.x - evt.xy.x;
- var deltaY = this.mouseDragStart.y - evt.xy.y;
- var size = this.map.getSize();
- var newXY = new OpenLayers.Pixel(size.w / 2 + deltaX,
- size.h / 2 + deltaY);
- var newCenter = this.map.getLonLatFromViewPortPx( newXY );
- this.map.setCenter(newCenter, null, true);
- this.mouseDragStart = evt.xy.clone();
- this.map.div.style.cursor = "move";
- }
- this.performedDrag = true;
- }
- },
-
- /**
- * Method: defaultMouseUp
- *
- * Parameters:
- * evt - {<OpenLayers.Event>}
- */
- defaultMouseUp: function (evt) {
- if (!OpenLayers.Event.isLeftClick(evt)) {
- return;
- }
- if (this.zoomBox) {
- this.zoomBoxEnd(evt);
- } else {
- if (this.performedDrag) {
- this.map.setCenter(this.map.center);
- }
- }
- document.onselectstart=null;
- this.mouseDragStart = null;
- this.map.div.style.cursor = "";
- },
-
- /**
- * Method: defaultMouseOut
- *
- * Parameters:
- * evt - {Event}
- */
- defaultMouseOut: function (evt) {
- if (this.mouseDragStart != null &&
- OpenLayers.Util.mouseLeft(evt, this.map.viewPortDiv)) {
- if (this.zoomBox) {
- this.removeZoomBox();
- }
- this.mouseDragStart = null;
- }
- },
-
-
- /**
- * Method: defaultWheelUp
- * User spun scroll wheel up
- *
- */
- defaultWheelUp: function(evt) {
- if (this.map.getZoom() <= this.map.getNumZoomLevels()) {
- this.map.setCenter(this.map.getLonLatFromPixel(evt.xy),
- this.map.getZoom() + 1);
- }
- },
-
- /**
- * Method: defaultWheelDown
- * User spun scroll wheel down
- */
- defaultWheelDown: function(evt) {
- if (this.map.getZoom() > 0) {
- this.map.setCenter(this.map.getLonLatFromPixel(evt.xy),
- this.map.getZoom() - 1);
- }
- },
-
- /**
- * Method: zoomBoxEnd
- * Zoombox function.
- */
- zoomBoxEnd: function(evt) {
- if (this.mouseDragStart != null) {
- if (Math.abs(this.mouseDragStart.x - evt.xy.x) > 5 ||
- Math.abs(this.mouseDragStart.y - evt.xy.y) > 5) {
- var start = this.map.getLonLatFromViewPortPx( this.mouseDragStart );
- var end = this.map.getLonLatFromViewPortPx( evt.xy );
- var top = Math.max(start.lat, end.lat);
- var bottom = Math.min(start.lat, end.lat);
- var left = Math.min(start.lon, end.lon);
- var right = Math.max(start.lon, end.lon);
- var bounds = new OpenLayers.Bounds(left, bottom, right, top);
- this.map.zoomToExtent(bounds);
- } else {
- var end = this.map.getLonLatFromViewPortPx( evt.xy );
- this.map.setCenter(new OpenLayers.LonLat(
- (end.lon),
- (end.lat)
- ), this.map.getZoom() + 1);
- }
- this.removeZoomBox();
- }
- },
-
- /**
- * Method: removeZoomBox
- * Remove the zoombox from the screen and nullify our reference to it.
- */
- removeZoomBox: function() {
- this.map.viewPortDiv.removeChild(this.zoomBox);
- this.zoomBox = null;
- },
-
-
-/**
- * Mouse ScrollWheel code thanks to http://adomas.org/javascript-mouse-wheel/
- */
-
-
- /**
- * Method: onWheelEvent
- * Catch the wheel event and handle it xbrowserly
- *
- * Parameters:
- * e - {Event}
- */
- onWheelEvent: function(e){
-
- // first determine whether or not the wheeling was inside the map
- var inMap = false;
- var elem = OpenLayers.Event.element(e);
- while(elem != null) {
- if (this.map && elem == this.map.div) {
- inMap = true;
- break;
- }
- elem = elem.parentNode;
- }
-
- if (inMap) {
-
- var delta = 0;
- if (!e) {
- e = window.event;
- }
- if (e.wheelDelta) {
- delta = e.wheelDelta/120;
- if (window.opera && window.opera.version() < 9.2) {
- delta = -delta;
- }
- } else if (e.detail) {
- delta = -e.detail / 3;
- }
- if (delta) {
- // add the mouse position to the event because mozilla has a bug
- // with clientX and clientY (see https://bugzilla.mozilla.org/show_bug.cgi?id=352179)
- // getLonLatFromViewPortPx(e) returns wrong values
- e.xy = this.mousePosition;
-
- if (delta < 0) {
- this.defaultWheelDown(e);
- } else {
- this.defaultWheelUp(e);
- }
- }
-
- //only wheel the map, not the window
- OpenLayers.Event.stop(e);
- }
- },
-
- CLASS_NAME: "OpenLayers.Control.MouseDefaults"
-});
-
-/**
- * Class: OpenLayers.Control.MouseToolbar
- * This class is DEPRECATED in 2.4 and will be removed by 3.0.
- * If you need this functionality, use <OpenLayers.Control.NavToolbar>
- * instead!!!
- */
-OpenLayers.Control.MouseToolbar = OpenLayers.Class(
- OpenLayers.Control.MouseDefaults, {
-
- /**
- * Property: mode
- */
- mode: null,
- /**
- * Property: buttons
- */
- buttons: null,
-
- /**
- * APIProperty: direction
- * {String} 'vertical' or 'horizontal'
- */
- direction: "vertical",
-
- /**
- * Property: buttonClicked
- * {String}
- */
- buttonClicked: null,
-
- /**
- * Constructor: OpenLayers.Control.MouseToolbar
- *
- * Parameters:
- * position - {<OpenLayers.Pixel>}
- * direction - {String}
- */
- initialize: function(position, direction) {
- OpenLayers.Control.prototype.initialize.apply(this, arguments);
- this.position = new OpenLayers.Pixel(OpenLayers.Control.MouseToolbar.X,
- OpenLayers.Control.MouseToolbar.Y);
- if (position) {
- this.position = position;
- }
- if (direction) {
- this.direction = direction;
- }
- this.measureDivs = [];
- },
-
- /**
- * APIMethod: destroy
- */
- destroy: function() {
- for( var btnId in this.buttons) {
- var btn = this.buttons[btnId];
- btn.map = null;
- btn.events.destroy();
- }
- OpenLayers.Control.MouseDefaults.prototype.destroy.apply(this,
- arguments);
- },
-
- /**
- * Method: draw
- */
- draw: function() {
- OpenLayers.Control.prototype.draw.apply(this, arguments);
- OpenLayers.Control.MouseDefaults.prototype.draw.apply(this, arguments);
- this.buttons = {};
- var sz = new OpenLayers.Size(28,28);
- var centered = new OpenLayers.Pixel(OpenLayers.Control.MouseToolbar.X,0);
- this._addButton("zoombox", "drag-rectangle-off.png", "drag-rectangle-on.png", centered, sz, "Shift->Drag to zoom to area");
- centered = centered.add((this.direction == "vertical" ? 0 : sz.w), (this.direction == "vertical" ? sz.h : 0));
- this._addButton("pan", "panning-hand-off.png", "panning-hand-on.png", centered, sz, "Drag the map to pan.");
- centered = centered.add((this.direction == "vertical" ? 0 : sz.w), (this.direction == "vertical" ? sz.h : 0));
- this.switchModeTo("pan");
-
- return this.div;
- },
-
- /**
- * Method: _addButton
- */
- _addButton:function(id, img, activeImg, xy, sz, title) {
- var imgLocation = OpenLayers.Util.getImageLocation(img);
- var activeImgLocation = OpenLayers.Util.getImageLocation(activeImg);
- // var btn = new ol.AlphaImage("_"+id, imgLocation, xy, sz);
- var btn = OpenLayers.Util.createAlphaImageDiv(
- "OpenLayers_Control_MouseToolbar_" + id,
- xy, sz, imgLocation, "absolute");
-
- //we want to add the outer div
- this.div.appendChild(btn);
- btn.imgLocation = imgLocation;
- btn.activeImgLocation = activeImgLocation;
-
- btn.events = new OpenLayers.Events(this, btn, null, true);
- btn.events.on({
- "mousedown": this.buttonDown,
- "mouseup": this.buttonUp,
- "dblclick": OpenLayers.Event.stop,
- scope: this
- });
- btn.action = id;
- btn.title = title;
- btn.alt = title;
- btn.map = this.map;
-
- //we want to remember/reference the outer div
- this.buttons[id] = btn;
- return btn;
- },
-
- /**
- * Method: buttonDown
- *
- * Parameters:
- * evt - {Event}
- */
- buttonDown: function(evt) {
- if (!OpenLayers.Event.isLeftClick(evt)) {
- return;
- }
- this.buttonClicked = evt.element.action;
- OpenLayers.Event.stop(evt);
- },
-
- /**
- * Method: buttonUp
- *
- * Parameters:
- * evt - {Event}
- */
- buttonUp: function(evt) {
- if (!OpenLayers.Event.isLeftClick(evt)) {
- return;
- }
- if (this.buttonClicked != null) {
- if (this.buttonClicked == evt.element.action) {
- this.switchModeTo(evt.element.action);
- }
- OpenLayers.Event.stop(evt);
- this.buttonClicked = null;
- }
- },
-
- /**
- * Method: defaultDblClick
- *
- * Parameters:
- * evt - {Event}
- */
- defaultDblClick: function (evt) {
- this.switchModeTo("pan");
- this.performedDrag = false;
- var newCenter = this.map.getLonLatFromViewPortPx( evt.xy );
- this.map.setCenter(newCenter, this.map.zoom + 1);
- OpenLayers.Event.stop(evt);
- return false;
- },
-
- /**
- * Method: defaultMouseDown
- *
- * Parameters:
- * evt - {Event}
- */
- defaultMouseDown: function (evt) {
- if (!OpenLayers.Event.isLeftClick(evt)) {
- return;
- }
- this.mouseDragStart = evt.xy.clone();
- this.performedDrag = false;
- this.startViaKeyboard = false;
- if (evt.shiftKey && this.mode !="zoombox") {
- this.switchModeTo("zoombox");
- this.startViaKeyboard = true;
- } else if (evt.altKey && this.mode !="measure") {
- this.switchModeTo("measure");
- } else if (!this.mode) {
- this.switchModeTo("pan");
- }
-
- switch (this.mode) {
- case "zoombox":
- this.map.div.style.cursor = "crosshair";
- this.zoomBox = OpenLayers.Util.createDiv('zoomBox',
- this.mouseDragStart,
- null,
- null,
- "absolute",
- "2px solid red");
- this.zoomBox.style.backgroundColor = "white";
- this.zoomBox.style.filter = "alpha(opacity=50)"; // IE
- this.zoomBox.style.opacity = "0.50";
- this.zoomBox.style.fontSize = "1px";
- this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
- this.map.viewPortDiv.appendChild(this.zoomBox);
- this.performedDrag = true;
- break;
- case "measure":
- var distance = "";
- if (this.measureStart) {
- var measureEnd = this.map.getLonLatFromViewPortPx(this.mouseDragStart);
- distance = OpenLayers.Util.distVincenty(this.measureStart, measureEnd);
- distance = Math.round(distance * 100) / 100;
- distance = distance + "km";
- this.measureStartBox = this.measureBox;
- }
- this.measureStart = this.map.getLonLatFromViewPortPx(this.mouseDragStart);;
- this.measureBox = OpenLayers.Util.createDiv(null,
- this.mouseDragStart.add(
- -2-parseInt(this.map.layerContainerDiv.style.left),
- -2-parseInt(this.map.layerContainerDiv.style.top)),
- null,
- null,
- "absolute");
- this.measureBox.style.width="4px";
- this.measureBox.style.height="4px";
- this.measureBox.style.fontSize = "1px";
- this.measureBox.style.backgroundColor="red";
- this.measureBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
- this.map.layerContainerDiv.appendChild(this.measureBox);
- if (distance) {
- this.measureBoxDistance = OpenLayers.Util.createDiv(null,
- this.mouseDragStart.add(
- -2-parseInt(this.map.layerContainerDiv.style.left),
- 2-parseInt(this.map.layerContainerDiv.style.top)),
- null,
- null,
- "absolute");
-
- this.measureBoxDistance.innerHTML = distance;
- this.measureBoxDistance.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
- this.map.layerContainerDiv.appendChild(this.measureBoxDistance);
- this.measureDivs.push(this.measureBoxDistance);
- }
- this.measureBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
- this.map.layerContainerDiv.appendChild(this.measureBox);
- this.measureDivs.push(this.measureBox);
- break;
- default:
- this.map.div.style.cursor = "move";
- break;
- }
- document.onselectstart = OpenLayers.Function.False;
- OpenLayers.Event.stop(evt);
- },
-
- /**
- * Method: switchModeTo
- *
- * Parameters:
- * mode - {String}
- */
- switchModeTo: function(mode) {
- if (mode != this.mode) {
-
-
- if (this.mode && this.buttons[this.mode]) {
- OpenLayers.Util.modifyAlphaImageDiv(this.buttons[this.mode], null, null, null, this.buttons[this.mode].imgLocation);
- }
- if (this.mode == "measure" && mode != "measure") {
- for(var i=0, len=this.measureDivs.length; i<len; i++) {
- if (this.measureDivs[i]) {
- this.map.layerContainerDiv.removeChild(this.measureDivs[i]);
- }
- }
- this.measureDivs = [];
- this.measureStart = null;
- }
- this.mode = mode;
- if (this.buttons[mode]) {
- OpenLayers.Util.modifyAlphaImageDiv(this.buttons[mode], null, null, null, this.buttons[mode].activeImgLocation);
- }
- switch (this.mode) {
- case "zoombox":
- this.map.div.style.cursor = "crosshair";
- break;
- default:
- this.map.div.style.cursor = "";
- break;
- }
-
- }
- },
-
- /**
- * Method: leaveMode
- */
- leaveMode: function() {
- this.switchModeTo("pan");
- },
-
- /**
- * Method: defaultMouseMove
- *
- * Parameters:
- * evt - {Event}
- */
- defaultMouseMove: function (evt) {
- if (this.mouseDragStart != null) {
- switch (this.mode) {
- case "zoombox":
- var deltaX = Math.abs(this.mouseDragStart.x - evt.xy.x);
- var deltaY = Math.abs(this.mouseDragStart.y - evt.xy.y);
- this.zoomBox.style.width = Math.max(1, deltaX) + "px";
- this.zoomBox.style.height = Math.max(1, deltaY) + "px";
- if (evt.xy.x < this.mouseDragStart.x) {
- this.zoomBox.style.left = evt.xy.x+"px";
- }
- if (evt.xy.y < this.mouseDragStart.y) {
- this.zoomBox.style.top = evt.xy.y+"px";
- }
- break;
- default:
- var deltaX = this.mouseDragStart.x - evt.xy.x;
- var deltaY = this.mouseDragStart.y - evt.xy.y;
- var size = this.map.getSize();
- var newXY = new OpenLayers.Pixel(size.w / 2 + deltaX,
- size.h / 2 + deltaY);
- var newCenter = this.map.getLonLatFromViewPortPx( newXY );
- this.map.setCenter(newCenter, null, true);
- this.mouseDragStart = evt.xy.clone();
- }
- this.performedDrag = true;
- }
- },
-
- /**
- * Method: defaultMouseUp
- *
- * Parameters:
- * evt - {Event}
- */
- defaultMouseUp: function (evt) {
- if (!OpenLayers.Event.isLeftClick(evt)) {
- return;
- }
- switch (this.mode) {
- case "zoombox":
- this.zoomBoxEnd(evt);
- if (this.startViaKeyboard) {
- this.leaveMode();
- }
- break;
- case "pan":
- if (this.performedDrag) {
- this.map.setCenter(this.map.center);
- }
- }
- document.onselectstart = null;
- this.mouseDragStart = null;
- this.map.div.style.cursor = "default";
- },
-
- /**
- * Method: defaultMouseOut
- *
- * Parameters:
- * evt - {Event}
- */
- defaultMouseOut: function (evt) {
- if (this.mouseDragStart != null
- && OpenLayers.Util.mouseLeft(evt, this.map.viewPortDiv)) {
- if (this.zoomBox) {
- this.removeZoomBox();
- if (this.startViaKeyboard) {
- this.leaveMode();
- }
- }
- this.mouseDragStart = null;
- this.map.div.style.cursor = "default";
- }
- },
-
- /**
- * Method: defaultClick
- *
- * Parameters:
- * evt - {Event}
- */
- defaultClick: function (evt) {
- if (this.performedDrag) {
- this.performedDrag = false;
- return false;
- }
- },
-
- CLASS_NAME: "OpenLayers.Control.MouseToolbar"
-});
-
-OpenLayers.Control.MouseToolbar.X = 6;
-OpenLayers.Control.MouseToolbar.Y = 300;
-
-/**
- * Class: OpenLayers.Layer.Grid
- */
-
-OpenLayers.Util.extend(OpenLayers.Layer.Grid.prototype, {
-
- /**
- * Method: getGridBounds
- * Deprecated. This function will be removed in 3.0. Please use
- * getTilesBounds() instead.
- *
- * Returns:
- * {<OpenLayers.Bounds>} A Bounds object representing the bounds of all the
- * currently loaded tiles (including those partially or not at all seen
- * onscreen)
- */
- getGridBounds: function() {
- var msg = "The getGridBounds() function is deprecated. It will be " +
- "removed in 3.0. Please use getTilesBounds() instead.";
- OpenLayers.Console.warn(msg);
- return this.getTilesBounds();
- }
-});
-
-/**
- * Class: OpenLayers.Format.XML
- */
-OpenLayers.Util.extend(OpenLayers.Format.XML.prototype, {
-
- /**
- * APIMethod: concatChildValues
- * *Deprecated*. Use <getChildValue> instead.
- *
- * Concatenate the value of all child nodes if any exist, or return an
- * optional default string. Returns an empty string if no children
- * exist and no default value is supplied. Not optimized for large
- * numbers of child nodes.
- *
- * Parameters:
- * node - {DOMElement} The element used to look for child values.
- * def - {String} Optional string to return in the event that no
- * child exist.
- *
- * Returns:
- * {String} The concatenated value of all child nodes of the given node.
- */
- concatChildValues: function(node, def) {
- var value = "";
- var child = node.firstChild;
- var childValue;
- while(child) {
- childValue = child.nodeValue;
- if(childValue) {
- value += childValue;
- }
- child = child.nextSibling;
- }
- if(value == "" && def != undefined) {
- value = def;
- }
- return value;
- }
-
-});
-
-/**
- * Class: OpenLayers.Layer.WMS.Post
- * Instances of OpenLayers.Layer.WMS.Post are used to retrieve data from OGC
- * Web Mapping Services via HTTP-POST (application/x-www-form-urlencoded).
- * Create a new WMS layer with the <OpenLayers.Layer.WMS.Post> constructor.
- *
- * *Deprecated*. Instead of this layer, use <OpenLayers.Layer.WMS> with
- * <OpenLayers.Tile.Image.maxGetUrlLength> configured in the layer's
- * <OpenLayers.Layer.WMS.tileOptions>.
- *
- * Inherits from:
- * - <OpenLayers.Layer.WMS>
- */
-OpenLayers.Layer.WMS.Post = OpenLayers.Class(OpenLayers.Layer.WMS, {
-
- /**
- * APIProperty: unsupportedBrowsers
- * {Array} Array with browsers, which should use the HTTP-GET protocol
- * instead of HTTP-POST for fetching tiles from a WMS .
- * Defaults to ["mozilla", "firefox", "opera"], because Opera is not able
- * to show transparent images in IFrames and Firefox/Mozilla has some ugly
- * effects of viewport-shaking when panning the map. Both browsers, Opera
- * and Firefox/Mozilla, have no problem with long urls, which is the reason
- * for using POST instead of GET. The strings to pass to this array are
- * the ones returned by <OpenLayers.BROWSER_NAME>.
- */
- unsupportedBrowsers: ["mozilla", "firefox", "opera"],
-
- /**
- * Property: SUPPORTED_TRANSITIONS
- * {Array}
- * no supported transitions for this type of layer, because it is not
- * possible to modify the initialized tiles (iframes)
- */
- SUPPORTED_TRANSITIONS: [],
-
- /**
- * Property: usePost
- * {Boolean}
- */
- usePost: null,
-
- /**
- * Constructor: OpenLayers.Layer.WMS.Post
- * Creates a new WMS layer object.
- *
- * Example:
- * (code)
- * var wms = new OpenLayers.Layer.WMS.Post(
- * "NASA Global Mosaic",
- * "http://wms.jpl.nasa.gov/wms.cgi",
- * {layers: "modis, global_mosaic"});
- * (end)
- *
- * Parameters:
- * name - {String} A name for the layer
- * url - {String} Base url for the WMS
- * (e.g. http://wms.jpl.nasa.gov/wms.cgi)
- * params - {Object} An object with key/value pairs representing the
- * GetMap query string parameters and parameter values.
- * options - {Object} Hashtable of extra options to tag onto the layer.
- */
- initialize: function(name, url, params, options) {
- var newArguments = [];
- newArguments.push(name, url, params, options);
- OpenLayers.Layer.WMS.prototype.initialize.apply(this, newArguments);
-
- this.usePost = OpenLayers.Util.indexOf(
- this.unsupportedBrowsers, OpenLayers.BROWSER_NAME) == -1;
- },
-
- /**
- * Method: addTile
- * addTile creates a tile, initializes it and adds it as iframe to the
- * layer div.
- *
- * Parameters:
- * bounds - {<OpenLayers.Bounds>}
- * position - {<OpenLayers.Pixel>}
- *
- * Returns:
- * {<OpenLayers.Tile.Image.IFrame>} The added OpenLayers.Tile.Image.IFrame
- */
- addTile: function(bounds,position) {
- return new OpenLayers.Tile.Image(
- this, position, bounds, null, this.tileSize, {
- maxGetUrlLength: this.usePost ? 0 : null
- });
- },
-
- CLASS_NAME: 'OpenLayers.Layer.WMS.Post'
-});
-
-/**
- * Class: OpenLayers.Layer.WMS.Untiled
- * *Deprecated*. To be removed in 3.0. Instead use OpenLayers.Layer.WMS and
- * pass the option 'singleTile' as true.
- *
- * Inherits from:
- * - <OpenLayers.Layer.WMS>
- */
-OpenLayers.Layer.WMS.Untiled = OpenLayers.Class(OpenLayers.Layer.WMS, {
-
- /**
- * APIProperty: singleTile
- * {singleTile} Always true for untiled.
- */
- singleTile: true,
-
- /**
- * Constructor: OpenLayers.Layer.WMS.Untiled
- *
- * Parameters:
- * name - {String}
- * url - {String}
- * params - {Object}
- * options - {Object}
- */
- initialize: function(name, url, params, options) {
- OpenLayers.Layer.WMS.prototype.initialize.apply(this, arguments);
-
- var msg = "The OpenLayers.Layer.WMS.Untiled class is deprecated and " +
- "will be removed in 3.0. Instead, you should use the " +
- "normal OpenLayers.Layer.WMS class, passing it the option " +
- "'singleTile' as true.";
- OpenLayers.Console.warn(msg);
- },
-
- /**
- * Method: clone
- * Create a clone of this layer
- *
- * Returns:
- * {<OpenLayers.Layer.WMS.Untiled>} An exact clone of this layer
- */
- clone: function (obj) {
-
- if (obj == null) {
- obj = new OpenLayers.Layer.WMS.Untiled(this.name,
- this.url,
- this.params,
- this.getOptions());
- }
-
- //get all additions from superclasses
- obj = OpenLayers.Layer.WMS.prototype.clone.apply(this, [obj]);
-
- // copy/set any non-init, non-simple values here
-
- return obj;
- },
-
- CLASS_NAME: "OpenLayers.Layer.WMS.Untiled"
-});
-
-/**
- * Class: OpenLayers.Layer.MapServer.Untiled
- * *Deprecated*. To be removed in 3.0. Instead use OpenLayers.Layer.MapServer
- * and pass the option 'singleTile' as true.
- *
- * Inherits from:
- * - <OpenLayers.Layer.MapServer>
- */
-OpenLayers.Layer.MapServer.Untiled = OpenLayers.Class(OpenLayers.Layer.MapServer, {
-
- /**
- * APIProperty: singleTile
- * {singleTile} Always true for untiled.
- */
- singleTile: true,
-
- /**
- * Constructor: OpenLayers.Layer.MapServer.Untiled
- *
- * Parameters:
- * name - {String}
- * url - {String}
- * params - {Object}
- * options - {Object}
- */
- initialize: function(name, url, params, options) {
- OpenLayers.Layer.MapServer.prototype.initialize.apply(this, arguments);
-
- var msg = "The OpenLayers.Layer.MapServer.Untiled class is deprecated and " +
- "will be removed in 3.0. Instead, you should use the " +
- "normal OpenLayers.Layer.MapServer class, passing it the option " +
- "'singleTile' as true.";
- OpenLayers.Console.warn(msg);
- },
-
- /**
- * Method: clone
- * Create a clone of this layer
- *
- * Returns:
- * {<OpenLayers.Layer.MapServer.Untiled>} An exact clone of this layer
- */
- clone: function (obj) {
-
- if (obj == null) {
- obj = new OpenLayers.Layer.MapServer.Untiled(this.name,
- this.url,
- this.params,
- this.getOptions());
- }
-
- //get all additions from superclasses
- obj = OpenLayers.Layer.MapServer.prototype.clone.apply(this, [obj]);
-
- // copy/set any non-init, non-simple values here
-
- return obj;
- },
-
- CLASS_NAME: "OpenLayers.Layer.MapServer.Untiled"
-});
-
-/**
- * Class: OpenLayers.Tile.WFS
- * Instances of OpenLayers.Tile.WFS are used to manage the image tiles
- * used by various layers. Create a new image tile with the
- * <OpenLayers.Tile.WFS> constructor.
- *
- * Inherits from:
- * - <OpenLayers.Tile>
- */
-OpenLayers.Tile.WFS = OpenLayers.Class(OpenLayers.Tile, {
-
- /**
- * Property: features
- * {Array(<OpenLayers.Feature>)} list of features in this tile
- */
- features: null,
-
- /**
- * Property: url
- * {String}
- */
- url: null,
-
- /**
- * Property: request
- * {<OpenLayers.Request.XMLHttpRequest>}
- */
- request: null,
-
- /** TBD 3.0 - reorder the parameters to the init function to put URL
- * as last, so we can continue to call tile.initialize()
- * without changing the arguments.
- *
- * Constructor: OpenLayers.Tile.WFS
- * Constructor for a new <OpenLayers.Tile.WFS> instance.
- *
- * Parameters:
- * layer - {<OpenLayers.Layer>} layer that the tile will go in.
- * position - {<OpenLayers.Pixel>}
- * bounds - {<OpenLayers.Bounds>}
- * url - {<String>}
- * size - {<OpenLayers.Size>}
- */
- initialize: function(layer, position, bounds, url, size) {
- OpenLayers.Tile.prototype.initialize.apply(this, arguments);
- this.url = url;
- this.features = [];
- },
-
- /**
- * APIMethod: destroy
- * nullify references to prevent circular references and memory leaks
- */
- destroy: function() {
- OpenLayers.Tile.prototype.destroy.apply(this, arguments);
- this.destroyAllFeatures();
- this.features = null;
- this.url = null;
- if(this.request) {
- this.request.abort();
- //this.request.destroy();
- this.request = null;
- }
- },
-
- /**
- * Method: clear
- * Clear the tile of any bounds/position-related data so that it can
- * be reused in a new location.
- */
- clear: function() {
- this.destroyAllFeatures();
- },
-
- /**
- * Method: draw
- * Check that a tile should be drawn, and load features for it.
- */
- draw:function() {
- if (OpenLayers.Tile.prototype.draw.apply(this, arguments)) {
- if (this.isLoading) {
- //if already loading, send 'reload' instead of 'loadstart'.
- this.events.triggerEvent("reload");
- } else {
- this.isLoading = true;
- this.events.triggerEvent("loadstart");
- }
- this.loadFeaturesForRegion(this.requestSuccess);
- }
- },
-
- /**
- * Method: loadFeaturesForRegion
- * Abort any pending requests and issue another request for data.
- *
- * Input are function pointers for what to do on success and failure.
- *
- * Parameters:
- * success - {function}
- * failure - {function}
- */
- loadFeaturesForRegion:function(success, failure) {
- if(this.request) {
- this.request.abort();
- }
- this.request = OpenLayers.Request.GET({
- url: this.url,
- success: success,
- failure: failure,
- scope: this
- });
- },
-
- /**
- * Method: requestSuccess
- * Called on return from request succcess. Adds results via
- * layer.addFeatures in vector mode, addResults otherwise.
- *
- * Parameters:
- * request - {<OpenLayers.Request.XMLHttpRequest>}
- */
- requestSuccess:function(request) {
- if (this.features) {
- var doc = request.responseXML;
- if (!doc || !doc.documentElement) {
- doc = request.responseText;
- }
- if (this.layer.vectorMode) {
- this.layer.addFeatures(this.layer.formatObject.read(doc));
- } else {
- var xml = new OpenLayers.Format.XML();
- if (typeof doc == "string") {
- doc = xml.read(doc);
- }
- var resultFeatures = xml.getElementsByTagNameNS(
- doc, "http://www.opengis.net/gml", "featureMember"
- );
- this.addResults(resultFeatures);
- }
- }
- if (this.events) {
- this.events.triggerEvent("loadend");
- }
-
- //request produced with success, we can delete the request object.
- //this.request.destroy();
- this.request = null;
- },
-
- /**
- * Method: addResults
- * Construct new feature via layer featureClass constructor, and add to
- * this.features.
- *
- * Parameters:
- * results - {Object}
- */
- addResults: function(results) {
- for (var i=0; i < results.length; i++) {
- var feature = new this.layer.featureClass(this.layer,
- results[i]);
- this.features.push(feature);
- }
- },
-
-
- /**
- * Method: destroyAllFeatures
- * Iterate through and call destroy() on each feature, removing it from
- * the local array
- */
- destroyAllFeatures: function() {
- while(this.features.length > 0) {
- var feature = this.features.shift();
- feature.destroy();
- }
- },
-
- CLASS_NAME: "OpenLayers.Tile.WFS"
- }
-);
-
-/**
- * Class: OpenLayers.Feature.WFS
- * WFS handling class, for use as a featureClass on the WFS layer for handling
- * 'point' WFS types. Good for subclassing when creating a custom WFS like
- * XML application.
- *
- * Inherits from:
- * - <OpenLayers.Feature>
- */
-OpenLayers.Feature.WFS = OpenLayers.Class(OpenLayers.Feature, {
-
- /**
- * Constructor: OpenLayers.Feature.WFS
- * Create a WFS feature.
- *
- * Parameters:
- * layer - {<OpenLayers.Layer>}
- * xmlNode - {XMLNode}
- */
- initialize: function(layer, xmlNode) {
- var newArguments = arguments;
- var data = this.processXMLNode(xmlNode);
- newArguments = new Array(layer, data.lonlat, data);
- OpenLayers.Feature.prototype.initialize.apply(this, newArguments);
- this.createMarker();
- this.layer.addMarker(this.marker);
- },
-
- /**
- * Method: destroy
- * nullify references to prevent circular references and memory leaks
- */
- destroy: function() {
- if (this.marker != null) {
- this.layer.removeMarker(this.marker);
- }
- OpenLayers.Feature.prototype.destroy.apply(this, arguments);
- },
-
- /**
- * Method: processXMLNode
- * When passed an xmlNode, parses it for a GML point, and passes
- * back an object describing that point.
- *
- * For subclasses of Feature.WFS, this is the feature to change.
- *
- * Parameters:
- * xmlNode - {XMLNode}
- *
- * Returns:
- * {Object} Data Object with 'id', 'lonlat', and private properties set
- */
- processXMLNode: function(xmlNode) {
- //this should be overridden by subclasses
- // must return an Object with 'id' and 'lonlat' values set
- var point = OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, "http://www.opengis.net/gml", "gml", "Point");
- var text = OpenLayers.Util.getXmlNodeValue(OpenLayers.Ajax.getElementsByTagNameNS(point[0], "http://www.opengis.net/gml","gml", "coordinates")[0]);
- var floats = text.split(",");
- return {lonlat: new OpenLayers.LonLat(parseFloat(floats[0]),
- parseFloat(floats[1])),
- id: null};
-
- },
-
- CLASS_NAME: "OpenLayers.Feature.WFS"
-});
-
-
-/**
- * Class: OpenLayers.Layer.WFS
- * *Deprecated*. To be removed in 3.0. Instead use OpenLayers.Layer.Vector
- * with a Protocol.WFS and one or more Strategies.
- *
- * Inherits from:
- * - <OpenLayers.Layer.Vector>
- * - <OpenLayers.Layer.Markers>
- */
-OpenLayers.Layer.WFS = OpenLayers.Class(
- OpenLayers.Layer.Vector, OpenLayers.Layer.Markers, {
-
- /**
- * APIProperty: isBaseLayer
- * {Boolean} WFS layer is not a base layer by default.
- */
- isBaseLayer: false,
-
- /**
- * Property: tile
- * {<OpenLayers.Tile.WFS>}
- */
- tile: null,
-
- /**
- * APIProperty: ratio
- * {Float} The ratio property determines the size of the serverside query
- * relative to the map viewport size. By default, we load an area twice
- * as big as the map, to allow for panning without immediately reload.
- * Setting this to 1 will cause the area of the WFS request to match
- * the map area exactly. It is recommended to set this to some number
- * at least slightly larger than 1, otherwise accidental clicks can
- * cause a data reload, by moving the map only 1 pixel.
- */
- ratio: 2,
-
- /**
- * Property: DEFAULT_PARAMS
- * {Object} Hashtable of default key/value parameters
- */
- DEFAULT_PARAMS: { service: "WFS",
- version: "1.0.0",
- request: "GetFeature"
- },
-
- /**
- * APIProperty: featureClass
- * {<OpenLayers.Feature>} If featureClass is defined, an old-style markers
- * based WFS layer is created instead of a new-style vector layer. If
- * sent, this should be a subclass of OpenLayers.Feature
- */
- featureClass: null,
-
- /**
- * APIProperty: format
- * {<OpenLayers.Format>} The format you want the data to be parsed with.
- * Must be passed in the constructor. Should be a class, not an instance.
- * This option can only be used if no featureClass is passed / vectorMode
- * is false: if a featureClass is passed, then this parameter is ignored.
- */
- format: null,
-
- /**
- * Property: formatObject
- * {<OpenLayers.Format>} Internally created/managed format object, used by
- * the Tile to parse data.
- */
- formatObject: null,
-
- /**
- * APIProperty: formatOptions
- * {Object} Hash of options which should be passed to the format when it is
- * created. Must be passed in the constructor.
- */
- formatOptions: null,
-
- /**
- * Property: vectorMode
- * {Boolean} Should be calculated automatically. Determines whether the
- * layer is in vector mode or marker mode.
- */
- vectorMode: true,
-
- /**
- * APIProperty: encodeBBOX
- * {Boolean} Should the BBOX commas be encoded? The WMS spec says 'no',
- * but some services want it that way. Default false.
- */
- encodeBBOX: false,
-
- /**
- * APIProperty: extractAttributes
- * {Boolean} Should the WFS layer parse attributes from the retrieved
- * GML? Defaults to false. If enabled, parsing is slower, but
- * attributes are available in the attributes property of
- * layer features.
- */
- extractAttributes: false,
-
- /**
- * Constructor: OpenLayers.Layer.WFS
- *
- * Parameters:
- * name - {String}
- * url - {String}
- * params - {Object}
- * options - {Object} Hashtable of extra options to tag onto the layer
- */
- initialize: function(name, url, params, options) {
- if (options == undefined) { options = {}; }
-
- if (options.featureClass ||
- !OpenLayers.Layer.Vector ||
- !OpenLayers.Feature.Vector) {
- this.vectorMode = false;
- }
-
- // Uppercase params
- params = OpenLayers.Util.upperCaseObject(params);
-
- // Turn off error reporting, browsers like Safari may work
- // depending on the setup, and we don't want an unneccesary alert.
- OpenLayers.Util.extend(options, {'reportError': false});
- var newArguments = [];
- newArguments.push(name, options);
- OpenLayers.Layer.Vector.prototype.initialize.apply(this, newArguments);
- if (!this.renderer || !this.vectorMode) {
- this.vectorMode = false;
- if (!options.featureClass) {
- options.featureClass = OpenLayers.Feature.WFS;
- }
- OpenLayers.Layer.Markers.prototype.initialize.apply(this,
- newArguments);
- }
-
- if (this.params && this.params.typename && !this.options.typename) {
- this.options.typename = this.params.typename;
- }
-
- if (!this.options.geometry_column) {
- this.options.geometry_column = "the_geom";
- }
-
- this.params = OpenLayers.Util.applyDefaults(
- params,
- OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS)
- );
- this.url = url;
- },
-
-
- /**
- * APIMethod: destroy
- */
- destroy: function() {
- if (this.vectorMode) {
- OpenLayers.Layer.Vector.prototype.destroy.apply(this, arguments);
- } else {
- OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments);
- }
- if (this.tile) {
- this.tile.destroy();
- }
- this.tile = null;
-
- this.ratio = null;
- this.featureClass = null;
- this.format = null;
-
- if (this.formatObject && this.formatObject.destroy) {
- this.formatObject.destroy();
- }
- this.formatObject = null;
-
- this.formatOptions = null;
- this.vectorMode = null;
- this.encodeBBOX = null;
- this.extractAttributes = null;
- },
-
- /**
- * Method: setMap
- *
- * Parameters:
- * map - {<OpenLayers.Map>}
- */
- setMap: function(map) {
- if (this.vectorMode) {
- OpenLayers.Layer.Vector.prototype.setMap.apply(this, arguments);
-
- var options = {
- 'extractAttributes': this.extractAttributes
- };
-
- OpenLayers.Util.extend(options, this.formatOptions);
- if (this.map && !this.projection.equals(this.map.getProjectionObject())) {
- options.externalProjection = this.projection;
- options.internalProjection = this.map.getProjectionObject();
- }
-
- this.formatObject = this.format ? new this.format(options) : new OpenLayers.Format.GML(options);
- } else {
- OpenLayers.Layer.Markers.prototype.setMap.apply(this, arguments);
- }
- },
-
- /**
- * Method: moveTo
- *
- * Parameters:
- * bounds - {<OpenLayers.Bounds>}
- * zoomChanged - {Boolean}
- * dragging - {Boolean}
- */
- moveTo:function(bounds, zoomChanged, dragging) {
- if (this.vectorMode) {
- OpenLayers.Layer.Vector.prototype.moveTo.apply(this, arguments);
- } else {
- OpenLayers.Layer.Markers.prototype.moveTo.apply(this, arguments);
- }
-
- // don't load wfs features while dragging, wait for drag end
- if (dragging) {
- // TBD try to hide the vector layer while dragging
- // this.setVisibility(false);
- // this will probably help for panning performances
- return false;
- }
-
- if ( zoomChanged ) {
- if (this.vectorMode) {
- this.renderer.clear();
- }
- }
-
- //DEPRECATED - REMOVE IN 3.0
- // don't load data if current zoom level doesn't match
- if (this.options.minZoomLevel) {
- OpenLayers.Console.warn(OpenLayers.i18n('minZoomLevelError'));
-
- if (this.map.getZoom() < this.options.minZoomLevel) {
- return null;
- }
- }
-
- if (bounds == null) {
- bounds = this.map.getExtent();
- }
-
- var firstRendering = (this.tile == null);
-
- //does the new bounds to which we need to move fall outside of the
- // current tile's bounds?
- var outOfBounds = (!firstRendering &&
- !this.tile.bounds.containsBounds(bounds));
-
- if (zoomChanged || firstRendering || (!dragging && outOfBounds)) {
- //determine new tile bounds
- var center = bounds.getCenterLonLat();
- var tileWidth = bounds.getWidth() * this.ratio;
- var tileHeight = bounds.getHeight() * this.ratio;
- var tileBounds =
- new OpenLayers.Bounds(center.lon - (tileWidth / 2),
- center.lat - (tileHeight / 2),
- center.lon + (tileWidth / 2),
- center.lat + (tileHeight / 2));
-
- //determine new tile size
- var tileSize = this.map.getSize();
- tileSize.w = tileSize.w * this.ratio;
- tileSize.h = tileSize.h * this.ratio;
-
- //determine new position (upper left corner of new bounds)
- var ul = new OpenLayers.LonLat(tileBounds.left, tileBounds.top);
- var pos = this.map.getLayerPxFromLonLat(ul);
-
- //formulate request url string
- var url = this.getFullRequestString();
-
- var params = null;
-
- // Cant combine "filter" and "BBOX". This is a cheap hack to help
- // people out who can't migrate to the WFS protocol immediately.
- var filter = this.params.filter || this.params.FILTER;
- if (filter) {
- params = {FILTER: filter};
- }
- else {
- params = {BBOX: this.encodeBBOX ? tileBounds.toBBOX()
- : tileBounds.toArray()};
- }
-
- if (this.map && !this.projection.equals(this.map.getProjectionObject())) {
- var projectedBounds = tileBounds.clone();
- projectedBounds.transform(this.map.getProjectionObject(),
- this.projection);
- if (!filter){
- params.BBOX = this.encodeBBOX ? projectedBounds.toBBOX()
- : projectedBounds.toArray();
- }
- }
-
- url += "&" + OpenLayers.Util.getParameterString(params);
-
- if (!this.tile) {
- this.tile = new OpenLayers.Tile.WFS(this, pos, tileBounds,
- url, tileSize);
- this.addTileMonitoringHooks(this.tile);
- this.tile.draw();
- } else {
- if (this.vectorMode) {
- this.destroyFeatures();
- this.renderer.clear();
- } else {
- this.clearMarkers();
- }
- this.removeTileMonitoringHooks(this.tile);
- this.tile.destroy();
-
- this.tile = null;
- this.tile = new OpenLayers.Tile.WFS(this, pos, tileBounds,
- url, tileSize);
- this.addTileMonitoringHooks(this.tile);
- this.tile.draw();
- }
- }
- },
-
- /**
- * Method: addTileMonitoringHooks
- * This function takes a tile as input and adds the appropriate hooks to
- * the tile so that the layer can keep track of the loading tile
- * (making sure to check that the tile is always the layer's current
- * tile before taking any action).
- *
- * Parameters:
- * tile - {<OpenLayers.Tile>}
- */
- addTileMonitoringHooks: function(tile) {
- tile.onLoadStart = function() {
- //if this is the the layer's current tile, then trigger
- // a 'loadstart'
- if (this == this.layer.tile) {
- this.layer.events.triggerEvent("loadstart");
- }
- };
- tile.events.register("loadstart", tile, tile.onLoadStart);
-
- tile.onLoadEnd = function() {
- //if this is the the layer's current tile, then trigger
- // a 'tileloaded' and 'loadend'
- if (this == this.layer.tile) {
- this.layer.events.triggerEvent("tileloaded");
- this.layer.events.triggerEvent("loadend");
- }
- };
- tile.events.register("loadend", tile, tile.onLoadEnd);
- tile.events.register("unload", tile, tile.onLoadEnd);
- },
-
- /**
- * Method: removeTileMonitoringHooks
- * This function takes a tile as input and removes the tile hooks
- * that were added in addTileMonitoringHooks()
- *
- * Parameters:
- * tile - {<OpenLayers.Tile>}
- */
- removeTileMonitoringHooks: function(tile) {
- tile.unload();
- tile.events.un({
- "loadstart": tile.onLoadStart,
- "loadend": tile.onLoadEnd,
- "unload": tile.onLoadEnd,
- scope: tile
- });
- },
-
- /**
- * Method: onMapResize
- * Call the onMapResize method of the appropriate parent class.
- */
- onMapResize: function() {
- if(this.vectorMode) {
- OpenLayers.Layer.Vector.prototype.onMapResize.apply(this,
- arguments);
- } else {
- OpenLayers.Layer.Markers.prototype.onMapResize.apply(this,
- arguments);
- }
- },
-
- /**
- * Method: display
- * Call the display method of the appropriate parent class.
- */
- display: function() {
- if(this.vectorMode) {
- OpenLayers.Layer.Vector.prototype.display.apply(this,
- arguments);
- } else {
- OpenLayers.Layer.Markers.prototype.display.apply(this,
- arguments);
- }
- },
-
- /**
- * APIMethod: mergeNewParams
- * Modify parameters for the layer and redraw.
- *
- * Parameters:
- * newParams - {Object}
- */
- mergeNewParams:function(newParams) {
- var upperParams = OpenLayers.Util.upperCaseObject(newParams);
- var newArguments = [upperParams];
- return OpenLayers.Layer.HTTPRequest.prototype.mergeNewParams.apply(this,
- newArguments);
- },
-
- /**
- * APIMethod: clone
- *
- * Parameters:
- * obj - {Object}
- *
- * Returns:
- * {<OpenLayers.Layer.WFS>} An exact clone of this OpenLayers.Layer.WFS
- */
- clone: function (obj) {
-
- if (obj == null) {
- obj = new OpenLayers.Layer.WFS(this.name,
- this.url,
- this.params,
- this.getOptions());
- }
-
- //get all additions from superclasses
- if (this.vectorMode) {
- obj = OpenLayers.Layer.Vector.prototype.clone.apply(this, [obj]);
- } else {
- obj = OpenLayers.Layer.Markers.prototype.clone.apply(this, [obj]);
- }
-
- // copy/set any non-init, non-simple values here
-
- return obj;
- },
-
- /**
- * APIMethod: getFullRequestString
- * combine the layer's url with its params and these newParams.
- *
- * Add the SRS parameter from 'projection' -- this is probably
- * more eloquently done via a setProjection() method, but this
- * works for now and always.
- *
- * Parameters:
- * newParams - {Object}
- * altUrl - {String} Use this as the url instead of the layer's url
- */
- getFullRequestString:function(newParams, altUrl) {
- var projectionCode = this.projection.getCode() || this.map.getProjection();
- this.params.SRS = (projectionCode == "none") ? null : projectionCode;
-
- return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(
- this, arguments);
- },
-
- /**
- * APIMethod: commit
- * Write out the data to a WFS server.
- */
- commit: function() {
- if (!this.writer) {
- var options = {};
- if (this.map && !this.projection.equals(this.map.getProjectionObject())) {
- options.externalProjection = this.projection;
- options.internalProjection = this.map.getProjectionObject();
- }
-
- this.writer = new OpenLayers.Format.WFS(options,this);
- }
-
- var data = this.writer.write(this.features);
-
- OpenLayers.Request.POST({
- url: this.url,
- data: data,
- success: this.commitSuccess,
- failure: this.commitFailure,
- scope: this
- });
- },
-
- /**
- * Method: commitSuccess
- * Called when the Ajax request returns a response
- *
- * Parameters:
- * response - {XmlNode} from server
- */
- commitSuccess: function(request) {
- var response = request.responseText;
- if (response.indexOf('SUCCESS') != -1) {
- this.commitReport(OpenLayers.i18n("commitSuccess", {'response':response}));
-
- for(var i = 0; i < this.features.length; i++) {
- this.features[i].state = null;
- }
- // TBD redraw the layer or reset the state of features
- // foreach features: set state to null
- } else if (response.indexOf('FAILED') != -1 ||
- response.indexOf('Exception') != -1) {
- this.commitReport(OpenLayers.i18n("commitFailed", {'response':response}));
- }
- },
-
- /**
- * Method: commitFailure
- * Called when the Ajax request fails
- *
- * Parameters:
- * response - {XmlNode} from server
- */
- commitFailure: function(request) {},
-
- /**
- * APIMethod: commitReport
- * Called with a 'success' message if the commit succeeded, otherwise
- * a failure message, and the full request text as a second parameter.
- * Override this function to provide custom transaction reporting.
- *
- * string - {String} reporting string
- * response - {String} full XML response
- */
- commitReport: function(string, response) {
- OpenLayers.Console.userError(string);
- },
-
-
- /**
- * APIMethod: refresh
- * Refreshes all the features of the layer
- */
- refresh: function() {
- if (this.tile) {
- if (this.vectorMode) {
- this.renderer.clear();
- this.features.length = 0;
- } else {
- this.clearMarkers();
- this.markers.length = 0;
- }
- this.tile.draw();
- }
- },
-
- /**
- * APIMethod: getDataExtent
- * Calculates the max extent which includes all of the layer data.
- *
- * Returns:
- * {<OpenLayers.Bounds>}
- */
- getDataExtent: function () {
- var extent;
- //get all additions from superclasses
- if (this.vectorMode) {
- extent = OpenLayers.Layer.Vector.prototype.getDataExtent.apply(this);
- } else {
- extent = OpenLayers.Layer.Markers.prototype.getDataExtent.apply(this);
- }
-
- return extent;
- },
-
- /**
- * APIMethod: setOpacity
- * Call the setOpacity method of the appropriate parent class to set the
- * opacity.
- *
- * Parameters:
- * opacity - {Float}
- */
- setOpacity: function (opacity) {
- if (this.vectorMode) {
- OpenLayers.Layer.Vector.prototype.setOpacity.apply(this, [opacity]);
- } else {
- OpenLayers.Layer.Markers.prototype.setOpacity.apply(this, [opacity]);
- }
- },
-
- CLASS_NAME: "OpenLayers.Layer.WFS"
-});
-
-/**
- * Class: OpenLayers.Layer.VirtualEarth
- * *Deprecated*. Use <OpenLayers.Layer.Bing> instead.
- *
- * Instances of OpenLayers.Layer.VirtualEarth are used to display the data from
- * the Bing Maps AJAX Control (see e.g.
- * http://msdn.microsoft.com/library/bb429619.aspx). Create a VirtualEarth
- * layer with the <OpenLayers.Layer.VirtualEarth> constructor.
- *
- * Inherits from:
- * - <OpenLayers.Layer.EventPane>
- * - <OpenLayers.Layer.FixedZoomLevels>
- */
-OpenLayers.Layer.VirtualEarth = OpenLayers.Class(
- OpenLayers.Layer.EventPane,
- OpenLayers.Layer.FixedZoomLevels, {
-
- /**
- * Constant: MIN_ZOOM_LEVEL
- * {Integer} 1
- */
- MIN_ZOOM_LEVEL: 1,
-
- /**
- * Constant: MAX_ZOOM_LEVEL
- * {Integer} 19
- */
- MAX_ZOOM_LEVEL: 19,
-
- /**
- * Constant: RESOLUTIONS
- * {Array(Float)} Hardcode these resolutions so that they are more closely
- * tied with the standard wms projection
- */
- RESOLUTIONS: [
- 1.40625,
- 0.703125,
- 0.3515625,
- 0.17578125,
- 0.087890625,
- 0.0439453125,
- 0.02197265625,
- 0.010986328125,
- 0.0054931640625,
- 0.00274658203125,
- 0.001373291015625,
- 0.0006866455078125,
- 0.00034332275390625,
- 0.000171661376953125,
- 0.0000858306884765625,
- 0.00004291534423828125,
- 0.00002145767211914062,
- 0.00001072883605957031,
- 0.00000536441802978515
- ],
-
- /**
- * APIProperty: type
- * {VEMapType}
- */
- type: null,
-
- /**
- * APIProperty: wrapDateLine
- * {Boolean} Allow user to pan forever east/west. Default is true.
- * Setting this to false only restricts panning if
- * <sphericalMercator> is true.
- */
- wrapDateLine: true,
-
- /**
- * APIProperty: sphericalMercator
- * {Boolean} Should the map act as a mercator-projected map? This will
- * cause all interactions with the map to be in the actual map
- * projection, which allows support for vector drawing, overlaying
- * other maps, etc.
- */
- sphericalMercator: false,
-
- /**
- * APIProperty: animationEnabled
- * {Boolean} If set to true, the transition between zoom levels will be
- * animated. Set to false to match the zooming experience of other
- * layer types. Default is true.
- */
- animationEnabled: true,
-
- /**
- * Constructor: OpenLayers.Layer.VirtualEarth
- * Creates a new instance of a OpenLayers.Layer.VirtualEarth. If you use an
- * instance of OpenLayers.Layer.VirtualEarth in you map, you should set
- * the <OpenLayers.Map> option restrictedExtent to a meaningful value,
- * e.g.:
- * (code)
- * var map = new OpenLayers.Map( 'map', {
- * // other map options
- * restrictedExtent : OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508)
- * } );
- *
- * var veLayer = new OpenLayers.Layer.VirtualEarth (
- * "Virtual Earth Layer"
- * );
- *
- * map.addLayer( veLayer );
- * (end)
- *
- * Parameters:
- * name - {String}
- * options - {Object}
- */
- initialize: function(name, options) {
- OpenLayers.Layer.EventPane.prototype.initialize.apply(this, arguments);
- OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,
- arguments);
- if(this.sphericalMercator) {
- OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator);
- this.initMercatorParameters();
- }
- },
-
- /**
- * Method: loadMapObject
- */
- loadMapObject:function() {
-
- // create div and set to same size as map
- var veDiv = OpenLayers.Util.createDiv(this.name);
- var sz = this.map.getSize();
- veDiv.style.width = sz.w + "px";
- veDiv.style.height = sz.h + "px";
- this.div.appendChild(veDiv);
-
- try { // crash prevention
- this.mapObject = new VEMap(this.name);
- } catch (e) { }
-
- if (this.mapObject != null) {
- try { // this is to catch a Mozilla bug without falling apart
-
- // The fourth argument is whether the map is 'fixed' -- not
- // draggable. See:
- // http://blogs.msdn.com/virtualearth/archive/2007/09/28/locking-a-virtual-earth-map.aspx
- //
- this.mapObject.LoadMap(null, null, this.type, true);
- this.mapObject.AttachEvent("onmousedown", OpenLayers.Function.True);
-
- } catch (e) { }
- this.mapObject.HideDashboard();
- if(typeof this.mapObject.SetAnimationEnabled == "function") {
- this.mapObject.SetAnimationEnabled(this.animationEnabled);
- }
- }
-
- //can we do smooth panning? this is an unpublished method, so we need
- // to be careful
- if ( !this.mapObject ||
- !this.mapObject.vemapcontrol ||
- !this.mapObject.vemapcontrol.PanMap ||
- (typeof this.mapObject.vemapcontrol.PanMap != "function")) {
-
- this.dragPanMapObject = null;
- }
-
- },
-
- /**
- * Method: onMapResize
- */
- onMapResize: function() {
- this.mapObject.Resize(this.map.size.w, this.map.size.h);
- },
-
- /**
- * APIMethod: getWarningHTML
- *
- * Returns:
- * {String} String with information on why layer is broken, how to get
- * it working.
- */
- getWarningHTML:function() {
- return OpenLayers.i18n(
- "getLayerWarning", {'layerType':'VE', 'layerLib':'VirtualEarth'}
- );
- },
-
-
-
- /************************************
- * *
- * MapObject Interface Controls *
- * *
- ************************************/
-
-
- // Get&Set Center, Zoom
-
- /**
- * APIMethod: setMapObjectCenter
- * Set the mapObject to the specified center and zoom
- *
- * Parameters:
- * center - {Object} MapObject LonLat format
- * zoom - {int} MapObject zoom format
- */
- setMapObjectCenter: function(center, zoom) {
- this.mapObject.SetCenterAndZoom(center, zoom);
- },
-
- /**
- * APIMethod: getMapObjectCenter
- *
- * Returns:
- * {Object} The mapObject's current center in Map Object format
- */
- getMapObjectCenter: function() {
- return this.mapObject.GetCenter();
- },
-
- /**
- * APIMethod: dragPanMapObject
- *
- * Parameters:
- * dX - {Integer}
- * dY - {Integer}
- */
- dragPanMapObject: function(dX, dY) {
- this.mapObject.vemapcontrol.PanMap(dX, -dY);
- },
-
- /**
- * APIMethod: getMapObjectZoom
- *
- * Returns:
- * {Integer} The mapObject's current zoom, in Map Object format
- */
- getMapObjectZoom: function() {
- return this.mapObject.GetZoomLevel();
- },
-
-
- // LonLat - Pixel Translation
-
- /**
- * APIMethod: getMapObjectLonLatFromMapObjectPixel
- *
- * Parameters:
- * moPixel - {Object} MapObject Pixel format
- *
- * Returns:
- * {Object} MapObject LonLat translated from MapObject Pixel
- */
- getMapObjectLonLatFromMapObjectPixel: function(moPixel) {
- //the conditional here is to test if we are running the v6 of VE
- return (typeof VEPixel != 'undefined')
- ? this.mapObject.PixelToLatLong(moPixel)
- : this.mapObject.PixelToLatLong(moPixel.x, moPixel.y);
- },
-
- /**
- * APIMethod: getMapObjectPixelFromMapObjectLonLat
- *
- * Parameters:
- * moLonLat - {Object} MapObject LonLat format
- *
- * Returns:
- * {Object} MapObject Pixel transtlated from MapObject LonLat
- */
- getMapObjectPixelFromMapObjectLonLat: function(moLonLat) {
- return this.mapObject.LatLongToPixel(moLonLat);
- },
-
-
- /************************************
- * *
- * MapObject Primitives *
- * *
- ************************************/
-
-
- // LonLat
-
- /**
- * APIMethod: getLongitudeFromMapObjectLonLat
- *
- * Parameters:
- * moLonLat - {Object} MapObject LonLat format
- *
- * Returns:
- * {Float} Longitude of the given MapObject LonLat
- */
- getLongitudeFromMapObjectLonLat: function(moLonLat) {
- return this.sphericalMercator ?
- this.forwardMercator(moLonLat.Longitude, moLonLat.Latitude).lon :
- moLonLat.Longitude;
- },
-
- /**
- * APIMethod: getLatitudeFromMapObjectLonLat
- *
- * Parameters:
- * moLonLat - {Object} MapObject LonLat format
- *
- * Returns:
- * {Float} Latitude of the given MapObject LonLat
- */
- getLatitudeFromMapObjectLonLat: function(moLonLat) {
- return this.sphericalMercator ?
- this.forwardMercator(moLonLat.Longitude, moLonLat.Latitude).lat :
- moLonLat.Latitude;
- },
-
- /**
- * APIMethod: getMapObjectLonLatFromLonLat
- *
- * Parameters:
- * lon - {Float}
- * lat - {Float}
- *
- * Returns:
- * {Object} MapObject LonLat built from lon and lat params
- */
- getMapObjectLonLatFromLonLat: function(lon, lat) {
- var veLatLong;
- if(this.sphericalMercator) {
- var lonlat = this.inverseMercator(lon, lat);
- veLatLong = new VELatLong(lonlat.lat, lonlat.lon);
- } else {
- veLatLong = new VELatLong(lat, lon);
- }
- return veLatLong;
- },
-
- // Pixel
-
- /**
- * APIMethod: getXFromMapObjectPixel
- *
- * Parameters:
- * moPixel - {Object} MapObject Pixel format
- *
- * Returns:
- * {Integer} X value of the MapObject Pixel
- */
- getXFromMapObjectPixel: function(moPixel) {
- return moPixel.x;
- },
-
- /**
- * APIMethod: getYFromMapObjectPixel
- *
- * Parameters:
- * moPixel - {Object} MapObject Pixel format
- *
- * Returns:
- * {Integer} Y value of the MapObject Pixel
- */
- getYFromMapObjectPixel: function(moPixel) {
- return moPixel.y;
- },
-
- /**
- * APIMethod: getMapObjectPixelFromXY
- *
- * Parameters:
- * x - {Integer}
- * y - {Integer}
- *
- * Returns:
- * {Object} MapObject Pixel from x and y parameters
- */
- getMapObjectPixelFromXY: function(x, y) {
- //the conditional here is to test if we are running the v6 of VE
- return (typeof VEPixel != 'undefined') ? new VEPixel(x, y)
- : new Msn.VE.Pixel(x, y);
- },
-
- CLASS_NAME: "OpenLayers.Layer.VirtualEarth"
-});
-
-/*
- * Copyright 2007, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. Neither the name of Google Inc. nor the names of its contributors may be
- * used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Sets up google.gears.*, which is *the only* supported way to access Gears.
- *
- * Circumvent this file at your own risk!
- *
- * In the future, Gears may automatically define google.gears.* without this
- * file. Gears may use these objects to transparently fix bugs and compatibility
- * issues. Applications that use the code below will continue to work seamlessly
- * when that happens.
- */
-
-(function() {
- // We are already defined. Hooray!
- if (window.google && google.gears) {
- return;
- }
-
- var factory = null;
-
- // Firefox
- if (typeof GearsFactory != 'undefined') {
- factory = new GearsFactory();
- } else {
- // IE
- try {
- factory = new ActiveXObject('Gears.Factory');
- // privateSetGlobalObject is only required and supported on WinCE.
- if (factory.getBuildInfo().indexOf('ie_mobile') != -1) {
- factory.privateSetGlobalObject(this);
- }
- } catch (e) {
- // Safari
- if ((typeof navigator.mimeTypes != 'undefined')
- && navigator.mimeTypes["application/x-googlegears"]) {
- factory = document.createElement("object");
- factory.style.display = "none";
- factory.width = 0;
- factory.height = 0;
- factory.type = "application/x-googlegears";
- document.documentElement.appendChild(factory);
- }
- }
- }
-
- // *Do not* define any objects if Gears is not installed. This mimics the
- // behavior of Gears defining the objects in the future.
- if (!factory) {
- return;
- }
-
- // Now set up the objects, being careful not to overwrite anything.
- //
- // Note: In Internet Explorer for Windows Mobile, you can't add properties to
- // the window object. However, global objects are automatically added as
- // properties of the window object in all browsers.
- if (!window.google) {
- google = {};
- }
-
- if (!google.gears) {
- google.gears = {factory: factory};
- }
-})();
-
-/**
- * Class: OpenLayers.Protocol.SQL
- * Abstract SQL protocol class. Not to be instantiated directly. Use
- * one of the SQL protocol subclasses instead.
- *
- * Inherits from:
- * - <OpenLayers.Protocol>
- */
-OpenLayers.Protocol.SQL = OpenLayers.Class(OpenLayers.Protocol, {
-
- /**
- * APIProperty: databaseName
- * {String}
- */
- databaseName: 'ol',
-
- /**
- * APIProperty: tableName
- * Name of the database table into which Features should be saved.
- */
- tableName: "ol_vector_features",
-
- /**
- * Property: postReadFiltering
- * {Boolean} Whether the filter (if there's one) must be applied after
- * the features have been read from the database; for example the
- * BBOX strategy passes the read method a BBOX spatial filter, if
- * postReadFiltering is true every feature read from the database
- * will go through the BBOX spatial filter, which can be costly;
- * defaults to true.
- */
- postReadFiltering: true,
-
- /**
- * Constructor: OpenLayers.Protocol.SQL
- */
- initialize: function(options) {
- OpenLayers.Protocol.prototype.initialize.apply(this, [options]);
- },
-
- /**
- * APIMethod: destroy
- * Clean up the protocol.
- */
- destroy: function() {
- OpenLayers.Protocol.prototype.destroy.apply(this);
- },
-
- /**
- * APIMethod: supported
- * This should be overridden by specific subclasses
- *
- * Returns:
- * {Boolean} Whether or not the browser supports the SQL backend
- */
- supported: function() {
- return false;
- },
-
- /**
- * Method: evaluateFilter
- * If postReadFiltering is true evaluate the filter against the feature
- * and return the result of the evaluation, otherwise return true.
- *
- * Parameters:
- * {<OpenLayers.Feature.Vector>} The feature.
- * {<OpenLayers.Filter>} The filter.
- *
- * Returns:
- * {Boolean} true if postReadFiltering if false, the result of the
- * filter evaluation otherwise.
- */
- evaluateFilter: function(feature, filter) {
- return filter && this.postReadFiltering ?
- filter.evaluate(feature) : true;
- },
-
- CLASS_NAME: "OpenLayers.Protocol.SQL"
-});
-
-/**
- * Class: OpenLayers.Protocol.SQL.Gears
- * This Protocol stores feature in the browser via the Gears Database module
- * <http://code.google.com/apis/gears/api_database.html>.
- *
- * The main advantage is that all the read, create, update and delete operations
- * can be done offline.
- *
- * Inherits from:
- * - <OpenLayers.Protocol.SQL>
- */
-OpenLayers.Protocol.SQL.Gears = OpenLayers.Class(OpenLayers.Protocol.SQL, {
-
- /**
- * Property: FID_PREFIX
- * {String}
- */
- FID_PREFIX: '__gears_fid__',
-
- /**
- * Property: NULL_GEOMETRY
- * {String}
- */
- NULL_GEOMETRY: '__gears_null_geometry__',
-
- /**
- * Property: NULL_FEATURE_STATE
- * {String}
- */
- NULL_FEATURE_STATE: '__gears_null_feature_state__',
-
- /**
- * Property: jsonParser
- * {<OpenLayers.Format.JSON>}
- */
- jsonParser: null,
-
- /**
- * Property: wktParser
- * {<OpenLayers.Format.WKT>}
- */
- wktParser: null,
-
- /**
- * Property: fidRegExp
- * {RegExp} Regular expression to know whether a feature was
- * created in offline mode.
- */
- fidRegExp: null,
-
- /**
- * Property: saveFeatureState
- * {Boolean} Whether to save the feature state (<OpenLayers.State>)
- * into the database, defaults to true.
- */
- saveFeatureState: true,
-
- /**
- * Property: typeOfFid
- * {String} The type of the feature identifier, either "number" or
- * "string", defaults to "string".
- */
- typeOfFid: "string",
-
- /**
- * Property: db
- * {GearsDatabase}
- */
- db: null,
-
- /**
- * Constructor: OpenLayers.Protocol.SQL.Gears
- */
- initialize: function(options) {
- if (!this.supported()) {
- return;
- }
- OpenLayers.Protocol.SQL.prototype.initialize.apply(this, [options]);
- this.jsonParser = new OpenLayers.Format.JSON();
- this.wktParser = new OpenLayers.Format.WKT();
-
- this.fidRegExp = new RegExp('^' + this.FID_PREFIX);
- this.initializeDatabase();
-
-
- },
-
- /**
- * Method: initializeDatabase
- */
- initializeDatabase: function() {
- this.db = google.gears.factory.create('beta.database');
- this.db.open(this.databaseName);
- this.db.execute(
- "CREATE TABLE IF NOT EXISTS " + this.tableName +
- " (fid TEXT UNIQUE, geometry TEXT, properties TEXT," +
- " state TEXT)");
- },
-
- /**
- * APIMethod: destroy
- * Clean up the protocol.
- */
- destroy: function() {
- this.db.close();
- this.db = null;
-
- this.jsonParser = null;
- this.wktParser = null;
-
- OpenLayers.Protocol.SQL.prototype.destroy.apply(this);
- },
-
- /**
- * APIMethod: supported
- * Determine whether a browser supports Gears
- *
- * Returns:
- * {Boolean} The browser supports Gears
- */
- supported: function() {
- return !!(window.google && google.gears);
- },
-
- /**
- * APIMethod: read
- * Read all features from the database and return a
- * <OpenLayers.Protocol.Response> instance. If the options parameter
- * contains a callback attribute, the function is called with the response
- * as a parameter.
- *
- * Parameters:
- * options - {Object} Optional object for configuring the request; it
- * can have the {Boolean} property "noFeatureStateReset" which
- * specifies if the state of features read from the Gears
- * database must be reset to null, if "noFeatureStateReset"
- * is undefined or false then each feature's state is reset
- * to null, if "noFeatureStateReset" is true the feature state
- * is preserved.
- *
- * Returns:
- * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
- * object.
- */
- read: function(options) {
- OpenLayers.Protocol.prototype.read.apply(this, arguments);
- options = OpenLayers.Util.applyDefaults(options, this.options);
-
- var feature, features = [];
- var rs = this.db.execute("SELECT * FROM " + this.tableName);
- while (rs.isValidRow()) {
- feature = this.unfreezeFeature(rs);
- if (this.evaluateFilter(feature, options.filter)) {
- if (!options.noFeatureStateReset) {
- feature.state = null;
- }
- features.push(feature);
- }
- rs.next();
- }
- rs.close();
-
- var resp = new OpenLayers.Protocol.Response({
- code: OpenLayers.Protocol.Response.SUCCESS,
- requestType: "read",
- features: features
- });
-
- if (options && options.callback) {
- options.callback.call(options.scope, resp);
- }
-
- return resp;
- },
-
- /**
- * Method: unfreezeFeature
- *
- * Parameters:
- * row - {ResultSet}
- *
- * Returns:
- * {<OpenLayers.Feature.Vector>}
- */
- unfreezeFeature: function(row) {
- var feature;
- var wkt = row.fieldByName('geometry');
- if (wkt == this.NULL_GEOMETRY) {
- feature = new OpenLayers.Feature.Vector();
- } else {
- feature = this.wktParser.read(wkt);
- }
-
- feature.attributes = this.jsonParser.read(
- row.fieldByName('properties'));
-
- feature.fid = this.extractFidFromField(row.fieldByName('fid'));
-
- var state = row.fieldByName('state');
- if (state == this.NULL_FEATURE_STATE) {
- state = null;
- }
- feature.state = state;
-
- return feature;
- },
-
- /**
- * Method: extractFidFromField
- *
- * Parameters:
- * field - {String}
- *
- * Returns
- * {String} or {Number} The fid.
- */
- extractFidFromField: function(field) {
- if (!field.match(this.fidRegExp) && this.typeOfFid == "number") {
- field = parseFloat(field);
- }
- return field;
- },
-
- /**
- * APIMethod: create
- * Create new features into the database.
- *
- * Parameters:
- * features - {Array({<OpenLayers.Feature.Vector>})} or
- * {<OpenLayers.Feature.Vector>} The features to create in
- * the database.
- * options - {Object} Optional object for configuring the request.
- *
- * Returns:
- * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
- * object.
- */
- create: function(features, options) {
- options = OpenLayers.Util.applyDefaults(options, this.options);
-
- var resp = this.createOrUpdate(features);
- resp.requestType = "create";
-
- if (options && options.callback) {
- options.callback.call(options.scope, resp);
- }
-
- return resp;
- },
-
- /**
- * APIMethod: update
- * Construct a request updating modified feature.
- *
- * Parameters:
- * features - {Array({<OpenLayers.Feature.Vector>})} or
- * {<OpenLayers.Feature.Vector>} The features to update in
- * the database.
- * options - {Object} Optional object for configuring the request.
- *
- * Returns:
- * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
- * object.
- */
- update: function(features, options) {
- options = OpenLayers.Util.applyDefaults(options, this.options);
-
- var resp = this.createOrUpdate(features);
- resp.requestType = "update";
-
- if (options && options.callback) {
- options.callback.call(options.scope, resp);
- }
-
- return resp;
- },
-
- /**
- * Method: createOrUpdate
- * Construct a request for updating or creating features in the
- * database.
- *
- * Parameters:
- * features - {Array({<OpenLayers.Feature.Vector>})} or
- * {<OpenLayers.Feature.Vector>} The feature to create or update
- * in the database.
- *
- * Returns:
- * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
- * object.
- */
- createOrUpdate: function(features) {
- if (!(OpenLayers.Util.isArray(features))) {
- features = [features];
- }
-
- var i, len = features.length, feature;
- var insertedFeatures = new Array(len);
-
- for (i = 0; i < len; i++) {
- feature = features[i];
- var params = this.freezeFeature(feature);
- this.db.execute(
- "REPLACE INTO " + this.tableName +
- " (fid, geometry, properties, state)" +
- " VALUES (?, ?, ?, ?)",
- params);
-
- var clone = feature.clone();
- clone.fid = this.extractFidFromField(params[0]);
- insertedFeatures[i] = clone;
- }
-
- return new OpenLayers.Protocol.Response({
- code: OpenLayers.Protocol.Response.SUCCESS,
- features: insertedFeatures,
- reqFeatures: features
- });
- },
-
- /**
- * Method: freezeFeature
- *
- * Parameters:
- * feature - {<OpenLayers.Feature.Vector>}
- * state - {String} The feature state to store in the database.
- *
- * Returns:
- * {Array}
- */
- freezeFeature: function(feature) {
- // 2 notes:
- // - fid might not be a string
- // - getFeatureStateForFreeze needs the feature fid to it's stored
- // in the feature here
- feature.fid = feature.fid != null ?
- "" + feature.fid : OpenLayers.Util.createUniqueID(this.FID_PREFIX);
-
- var geometry = feature.geometry != null ?
- feature.geometry.toString() : this.NULL_GEOMETRY;
-
- var properties = this.jsonParser.write(feature.attributes);
-
- var state = this.getFeatureStateForFreeze(feature);
-
- return [feature.fid, geometry, properties, state];
- },
-
- /**
- * Method: getFeatureStateForFreeze
- * Get the state of the feature to store into the database.
- *
- * Parameters:
- * feature - {<OpenLayers.Feature.Vector>} The feature.
- *
- * Returns
- * {String} The state
- */
- getFeatureStateForFreeze: function(feature) {
- var state;
- if (!this.saveFeatureState) {
- state = this.NULL_FEATURE_STATE;
- } else if (this.createdOffline(feature)) {
- // if the feature was created in offline mode, its
- // state must remain INSERT
- state = OpenLayers.State.INSERT;
- } else {
- state = feature.state;
- }
- return state;
- },
-
- /**
- * APIMethod: delete
- * Delete features from the database.
- *
- * Parameters:
- * features - {Array({<OpenLayers.Feature.Vector>})} or
- * {<OpenLayers.Feature.Vector>}
- * options - {Object} Optional object for configuring the request.
- * This object is modified and should not be reused.
- *
- * Returns:
- * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
- * object.
- */
- "delete": function(features, options) {
- if (!(OpenLayers.Util.isArray(features))) {
- features = [features];
- }
-
- options = OpenLayers.Util.applyDefaults(options, this.options);
-
- var i, len, feature;
- for (i = 0, len = features.length; i < len; i++) {
- feature = features[i];
-
- // if saveFeatureState is set to true and if the feature wasn't created
- // in offline mode we don't delete it in the database but just update
- // it state column
- if (this.saveFeatureState && !this.createdOffline(feature)) {
- var toDelete = feature.clone();
- toDelete.fid = feature.fid;
- if (toDelete.geometry) {
- toDelete.geometry.destroy();
- toDelete.geometry = null;
- }
- toDelete.state = feature.state;
- this.createOrUpdate(toDelete);
- } else {
- this.db.execute(
- "DELETE FROM " + this.tableName +
- " WHERE fid = ?", [feature.fid]);
- }
- }
-
- var resp = new OpenLayers.Protocol.Response({
- code: OpenLayers.Protocol.Response.SUCCESS,
- requestType: "delete",
- reqFeatures: features
- });
-
- if (options && options.callback) {
- options.callback.call(options.scope, resp);
- }
-
- return resp;
- },
-
- /**
- * Method: createdOffline
- * Returns true if the feature had a feature id when it was created in
- * the Gears database, false otherwise; this is determined by
- * checking the form of the feature's fid value.
- *
- * Parameters:
- * feature - {<OpenLayers.Feature.Vector>}
- *
- * Returns:
- * {Boolean}
- */
- createdOffline: function(feature) {
- return (typeof feature.fid == "string" &&
- !!(feature.fid.match(this.fidRegExp)));
- },
-
- /**
- * APIMethod: commit
- * Go over the features and for each take action
- * based on the feature state. Possible actions are create,
- * update and delete.
- *
- * Parameters:
- * features - {Array({<OpenLayers.Feature.Vector>})}
- * options - {Object} Object whose possible keys are "create", "update",
- * "delete", "callback" and "scope", the values referenced by the
- * first three are objects as passed to the "create", "update", and
- * "delete" methods, the value referenced by the "callback" key is
- * a function which is called when the commit operation is complete
- * using the scope referenced by the "scope" key.
- *
- * Returns:
- * {Array({<OpenLayers.Protocol.Response>})} An array of
- * <OpenLayers.Protocol.Response> objects, one per request made
- * to the database.
- */
- commit: function(features, options) {
- var opt, resp = [], nRequests = 0, nResponses = 0;
-
- function callback(resp) {
- if (++nResponses < nRequests) {
- resp.last = false;
- }
- this.callUserCallback(options, resp);
- }
-
- var feature, toCreate = [], toUpdate = [], toDelete = [];
- for (var i = features.length - 1; i >= 0; i--) {
- feature = features[i];
- switch (feature.state) {
- case OpenLayers.State.INSERT:
- toCreate.push(feature);
- break;
- case OpenLayers.State.UPDATE:
- toUpdate.push(feature);
- break;
- case OpenLayers.State.DELETE:
- toDelete.push(feature);
- break;
- }
- }
- if (toCreate.length > 0) {
- nRequests++;
- opt = OpenLayers.Util.applyDefaults(
- {"callback": callback, "scope": this},
- options.create
- );
- resp.push(this.create(toCreate, opt));
- }
- if (toUpdate.length > 0) {
- nRequests++;
- opt = OpenLayers.Util.applyDefaults(
- {"callback": callback, "scope": this},
- options.update
- );
- resp.push(this.update(toUpdate, opt));
- }
- if (toDelete.length > 0) {
- nRequests++;
- opt = OpenLayers.Util.applyDefaults(
- {"callback": callback, "scope": this},
- options["delete"]
- );
- resp.push(this["delete"](toDelete, opt));
- }
-
- return resp;
- },
-
- /**
- * Method: clear
- * Removes all rows of the table.
- */
- clear: function() {
- this.db.execute("DELETE FROM " + this.tableName);
- },
-
- /**
- * Method: callUserCallback
- * This method is called from within commit each time a request is made
- * to the database, it is responsible for calling the user-supplied
- * callbacks.
- *
- * Parameters:
- * options - {Object} The map of options passed to the commit call.
- * resp - {<OpenLayers.Protocol.Response>}
- */
- callUserCallback: function(options, resp) {
- var opt = options[resp.requestType];
- if (opt && opt.callback) {
- opt.callback.call(opt.scope, resp);
- }
- if (resp.last && options.callback) {
- options.callback.call(options.scope);
- }
- },
-
- CLASS_NAME: "OpenLayers.Protocol.SQL.Gears"
-});
-
-/**
- * Class: OpenLayers.Layer.Yahoo
- *
- * Inherits from:
- * - <OpenLayers.Layer.EventPane>
- * - <OpenLayers.Layer.FixedZoomLevels>
- */
-OpenLayers.Layer.Yahoo = OpenLayers.Class(
- OpenLayers.Layer.EventPane, OpenLayers.Layer.FixedZoomLevels, {
-
- /**
- * Constant: MIN_ZOOM_LEVEL
- * {Integer} 0
- */
- MIN_ZOOM_LEVEL: 0,
-
- /**
- * Constant: MAX_ZOOM_LEVEL
- * {Integer} 17
- */
- MAX_ZOOM_LEVEL: 17,
-
- /**
- * Constant: RESOLUTIONS
- * {Array(Float)} Hardcode these resolutions so that they are more closely
- * tied with the standard wms projection
- */
- RESOLUTIONS: [
- 1.40625,
- 0.703125,
- 0.3515625,
- 0.17578125,
- 0.087890625,
- 0.0439453125,
- 0.02197265625,
- 0.010986328125,
- 0.0054931640625,
- 0.00274658203125,
- 0.001373291015625,
- 0.0006866455078125,
- 0.00034332275390625,
- 0.000171661376953125,
- 0.0000858306884765625,
- 0.00004291534423828125,
- 0.00002145767211914062,
- 0.00001072883605957031
- ],
-
- /**
- * APIProperty: type
- * {YahooMapType}
- */
- type: null,
-
- /**
- * APIProperty: wrapDateLine
- * {Boolean} Allow user to pan forever east/west. Default is true.
- * Setting this to false only restricts panning if
- * <sphericalMercator> is true.
- */
- wrapDateLine: true,
-
- /**
- * APIProperty: sphericalMercator
- * {Boolean} Should the map act as a mercator-projected map? This will
- * cause all interactions with the map to be in the actual map projection,
- * which allows support for vector drawing, overlaying other maps, etc.
- */
- sphericalMercator: false,
-
- /**
- * Constructor: OpenLayers.Layer.Yahoo
- *
- * Parameters:
- * name - {String}
- * options - {Object}
- */
- initialize: function(name, options) {
- OpenLayers.Layer.EventPane.prototype.initialize.apply(this, arguments);
- OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,
- arguments);
- if(this.sphericalMercator) {
- OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator);
- this.initMercatorParameters();
- }
- },
-
- /**
- * Method: loadMapObject
- */
- loadMapObject:function() {
- try { //do not crash!
- var size = this.getMapObjectSizeFromOLSize(this.map.getSize());
- this.mapObject = new YMap(this.div, this.type, size);
- this.mapObject.disableKeyControls();
- this.mapObject.disableDragMap();
-
- //can we do smooth panning? (moveByXY is not an API function)
- if ( !this.mapObject.moveByXY ||
- (typeof this.mapObject.moveByXY != "function" ) ) {
-
- this.dragPanMapObject = null;
- }
- } catch(e) {}
- },
-
- /**
- * Method: onMapResize
- *
- */
- onMapResize: function() {
- try {
- var size = this.getMapObjectSizeFromOLSize(this.map.getSize());
- this.mapObject.resizeTo(size);
- } catch(e) {}
- },
-
-
- /**
- * APIMethod: setMap
- * Overridden from EventPane because we need to remove this yahoo event
- * pane which prohibits our drag and drop, and we can only do this
- * once the map has been loaded and centered.
- *
- * Parameters:
- * map - {<OpenLayers.Map>}
- */
- setMap: function(map) {
- OpenLayers.Layer.EventPane.prototype.setMap.apply(this, arguments);
-
- this.map.events.register("moveend", this, this.fixYahooEventPane);
- },
-
- /**
- * Method: fixYahooEventPane
- * The map has been centered, so the mysterious yahoo eventpane has been
- * added. we remove it so that it doesnt mess with *our* event pane.
- */
- fixYahooEventPane: function() {
- var yahooEventPane = OpenLayers.Util.getElement("ygddfdiv");
- if (yahooEventPane != null) {
- if (yahooEventPane.parentNode != null) {
- yahooEventPane.parentNode.removeChild(yahooEventPane);
- }
- this.map.events.unregister("moveend", this,
- this.fixYahooEventPane);
- }
- },
-
- /**
- * APIMethod: getWarningHTML
- *
- * Returns:
- * {String} String with information on why layer is broken, how to get
- * it working.
- */
- getWarningHTML:function() {
- return OpenLayers.i18n(
- "getLayerWarning", {'layerType':'Yahoo', 'layerLib':'Yahoo'}
- );
- },
-
- /********************************************************/
- /* */
- /* Translation Functions */
- /* */
- /* The following functions translate GMaps and OL */
- /* formats for Pixel, LonLat, Bounds, and Zoom */
- /* */
- /********************************************************/
-
-
- //
- // TRANSLATION: MapObject Zoom <-> OpenLayers Zoom
- //
-
- /**
- * APIMethod: getOLZoomFromMapObjectZoom
- *
- * Parameters:
- * gZoom - {Integer}
- *
- * Returns:
- * {Integer} An OpenLayers Zoom level, translated from the passed in gZoom
- * Returns null if null value is passed in.
- */
- getOLZoomFromMapObjectZoom: function(moZoom) {
- var zoom = null;
- if (moZoom != null) {
- zoom = OpenLayers.Layer.FixedZoomLevels.prototype.getOLZoomFromMapObjectZoom.apply(this, [moZoom]);
- zoom = 18 - zoom;
- }
- return zoom;
- },
-
- /**
- * APIMethod: getMapObjectZoomFromOLZoom
- *
- * Parameters:
- * olZoom - {Integer}
- *
- * Returns:
- * {Integer} A MapObject level, translated from the passed in olZoom
- * Returns null if null value is passed in
- */
- getMapObjectZoomFromOLZoom: function(olZoom) {
- var zoom = null;
- if (olZoom != null) {
- zoom = OpenLayers.Layer.FixedZoomLevels.prototype.getMapObjectZoomFromOLZoom.apply(this, [olZoom]);
- zoom = 18 - zoom;
- }
- return zoom;
- },
-
- /************************************
- * *
- * MapObject Interface Controls *
- * *
- ************************************/
-
-
- // Get&Set Center, Zoom
-
- /**
- * APIMethod: setMapObjectCenter
- * Set the mapObject to the specified center and zoom
- *
- * Parameters:
- * center - {Object} MapObject LonLat format
- * zoom - {int} MapObject zoom format
- */
- setMapObjectCenter: function(center, zoom) {
- this.mapObject.drawZoomAndCenter(center, zoom);
- },
-
- /**
- * APIMethod: getMapObjectCenter
- *
- * Returns:
- * {Object} The mapObject's current center in Map Object format
- */
- getMapObjectCenter: function() {
- return this.mapObject.getCenterLatLon();
- },
-
- /**
- * APIMethod: dragPanMapObject
- *
- * Parameters:
- * dX - {Integer}
- * dY - {Integer}
- */
- dragPanMapObject: function(dX, dY) {
- this.mapObject.moveByXY({
- 'x': -dX,
- 'y': dY
- });
- },
-
- /**
- * APIMethod: getMapObjectZoom
- *
- * Returns:
- * {Integer} The mapObject's current zoom, in Map Object format
- */
- getMapObjectZoom: function() {
- return this.mapObject.getZoomLevel();
- },
-
-
- // LonLat - Pixel Translation
-
- /**
- * APIMethod: getMapObjectLonLatFromMapObjectPixel
- *
- * Parameters:
- * moPixel - {Object} MapObject Pixel format
- *
- * Returns:
- * {Object} MapObject LonLat translated from MapObject Pixel
- */
- getMapObjectLonLatFromMapObjectPixel: function(moPixel) {
- return this.mapObject.convertXYLatLon(moPixel);
- },
-
- /**
- * APIMethod: getMapObjectPixelFromMapObjectLonLat
- *
- * Parameters:
- * moLonLat - {Object} MapObject LonLat format
- *
- * Returns:
- * {Object} MapObject Pixel transtlated from MapObject LonLat
- */
- getMapObjectPixelFromMapObjectLonLat: function(moLonLat) {
- return this.mapObject.convertLatLonXY(moLonLat);
- },
-
-
- /************************************
- * *
- * MapObject Primitives *
- * *
- ************************************/
-
-
- // LonLat
-
- /**
- * APIMethod: getLongitudeFromMapObjectLonLat
- *
- * Parameters:
- * moLonLat - {Object} MapObject LonLat format
- *
- * Returns:
- * {Float} Longitude of the given MapObject LonLat
- */
- getLongitudeFromMapObjectLonLat: function(moLonLat) {
- return this.sphericalMercator ?
- this.forwardMercator(moLonLat.Lon, moLonLat.Lat).lon :
- moLonLat.Lon;
- },
-
- /**
- * APIMethod: getLatitudeFromMapObjectLonLat
- *
- * Parameters:
- * moLonLat - {Object} MapObject LonLat format
- *
- * Returns:
- * {Float} Latitude of the given MapObject LonLat
- */
- getLatitudeFromMapObjectLonLat: function(moLonLat) {
- return this.sphericalMercator ?
- this.forwardMercator(moLonLat.Lon, moLonLat.Lat).lat :
- moLonLat.Lat;
- },
-
- /**
- * APIMethod: getMapObjectLonLatFromLonLat
- *
- * Parameters:
- * lon - {Float}
- * lat - {Float}
- *
- * Returns:
- * {Object} MapObject LonLat built from lon and lat params
- */
- getMapObjectLonLatFromLonLat: function(lon, lat) {
- var yLatLong;
- if(this.sphericalMercator) {
- var lonlat = this.inverseMercator(lon, lat);
- yLatLong = new YGeoPoint(lonlat.lat, lonlat.lon);
- } else {
- yLatLong = new YGeoPoint(lat, lon);
- }
- return yLatLong;
- },
-
- // Pixel
-
- /**
- * APIMethod: getXFromMapObjectPixel
- *
- * Parameters:
- * moPixel - {Object} MapObject Pixel format
- *
- * Returns:
- * {Integer} X value of the MapObject Pixel
- */
- getXFromMapObjectPixel: function(moPixel) {
- return moPixel.x;
- },
-
- /**
- * APIMethod: getYFromMapObjectPixel
- *
- * Parameters:
- * moPixel - {Object} MapObject Pixel format
- *
- * Returns:
- * {Integer} Y value of the MapObject Pixel
- */
- getYFromMapObjectPixel: function(moPixel) {
- return moPixel.y;
- },
-
- /**
- * APIMethod: getMapObjectPixelFromXY
- *
- * Parameters:
- * x - {Integer}
- * y - {Integer}
- *
- * Returns:
- * {Object} MapObject Pixel from x and y parameters
- */
- getMapObjectPixelFromXY: function(x, y) {
- return new YCoordPoint(x, y);
- },
-
- // Size
-
- /**
- * APIMethod: getMapObjectSizeFromOLSize
- *
- * Parameters:
- * olSize - {<OpenLayers.Size>}
- *
- * Returns:
- * {Object} MapObject Size from olSize parameter
- */
- getMapObjectSizeFromOLSize: function(olSize) {
- return new YSize(olSize.w, olSize.h);
- },
-
- CLASS_NAME: "OpenLayers.Layer.Yahoo"
-});
-
-/**
- * Class: OpenLayers.Layer.GML
- * Create a vector layer by parsing a GML file. The GML file is
- * passed in as a parameter.
- * *Deprecated*. To be removed in 3.0. Instead use OpenLayers.Layer.Vector
- * with Protocol.HTTP and Strategy.Fixed. Provide the protocol with a
- * format parameter to get the parser you want for your data.
- *
- * Inherits from:
- * - <OpenLayers.Layer.Vector>
- */
-OpenLayers.Layer.GML = OpenLayers.Class(OpenLayers.Layer.Vector, {
-
- /**
- * Property: loaded
- * {Boolean} Flag for whether the GML data has been loaded yet.
- */
- loaded: false,
-
- /**
- * APIProperty: format
- * {<OpenLayers.Format>} The format you want the data to be parsed with.
- */
- format: null,
-
- /**
- * APIProperty: formatOptions
- * {Object} Hash of options which should be passed to the format when it is
- * created. Must be passed in the constructor.
- */
- formatOptions: null,
-
- /**
- * Constructor: OpenLayers.Layer.GML
- * Load and parse a single file on the web, according to the format
- * provided via the 'format' option, defaulting to GML.
- *
- * Parameters:
- * name - {String}
- * url - {String} URL of a GML file.
- * options - {Object} Hashtable of extra options to tag onto the layer.
- */
- initialize: function(name, url, options) {
- var newArguments = [];
- newArguments.push(name, options);
- OpenLayers.Layer.Vector.prototype.initialize.apply(this, newArguments);
- this.url = url;
- },
-
- /**
- * APIMethod: setVisibility
- * Set the visibility flag for the layer and hide/show&redraw accordingly.
- * Fire event unless otherwise specified
- * GML will be loaded if the layer is being made visible for the first
- * time.
- *
- * Parameters:
- * visible - {Boolean} Whether or not to display the layer
- * (if in range)
- * noEvent - {Boolean}
- */
- setVisibility: function(visibility, noEvent) {
- OpenLayers.Layer.Vector.prototype.setVisibility.apply(this, arguments);
- if(this.visibility && !this.loaded){
- // Load the GML
- this.loadGML();
- }
- },
-
- /**
- * Method: moveTo
- * If layer is visible and GML has not been loaded, load GML, then load GML
- * and call OpenLayers.Layer.Vector.moveTo() to redraw at the new location.
- *
- * Parameters:
- * bounds - {Object}
- * zoomChanged - {Object}
- * minor - {Object}
- */
- moveTo:function(bounds, zoomChanged, minor) {
- OpenLayers.Layer.Vector.prototype.moveTo.apply(this, arguments);
- // Wait until initialisation is complete before loading GML
- // otherwise we can get a race condition where the root HTML DOM is
- // loaded after the GML is paited.
- // See http://trac.openlayers.org/ticket/404
- if(this.visibility && !this.loaded){
- this.loadGML();
- }
- },
-
- /**
- * Method: loadGML
- */
- loadGML: function() {
- if (!this.loaded) {
- this.events.triggerEvent("loadstart");
- OpenLayers.Request.GET({
- url: this.url,
- success: this.requestSuccess,
- failure: this.requestFailure,
- scope: this
- });
- this.loaded = true;
- }
- },
-
- /**
- * Method: setUrl
- * Change the URL and reload the GML
- *
- * Parameters:
- * url - {String} URL of a GML file.
- */
- setUrl:function(url) {
- this.url = url;
- this.destroyFeatures();
- this.loaded = false;
- this.loadGML();
- },
-
- /**
- * Method: requestSuccess
- * Process GML after it has been loaded.
- * Called by initialize() and loadUrl() after the GML has been loaded.
- *
- * Parameters:
- * request - {String}
- */
- requestSuccess:function(request) {
- var doc = request.responseXML;
-
- if (!doc || !doc.documentElement) {
- doc = request.responseText;
- }
-
- var options = {};
-
- OpenLayers.Util.extend(options, this.formatOptions);
- if (this.map && !this.projection.equals(this.map.getProjectionObject())) {
- options.externalProjection = this.projection;
- options.internalProjection = this.map.getProjectionObject();
- }
-
- var gml = this.format ? new this.format(options) : new OpenLayers.Format.GML(options);
- this.addFeatures(gml.read(doc));
- this.events.triggerEvent("loadend");
- },
-
- /**
- * Method: requestFailure
- * Process a failed loading of GML.
- * Called by initialize() and loadUrl() if there was a problem loading GML.
- *
- * Parameters:
- * request - {String}
- */
- requestFailure: function(request) {
- OpenLayers.Console.userError('Error in loading GML file ' + this.url);
- this.events.triggerEvent("loadend");
- },
-
- CLASS_NAME: "OpenLayers.Layer.GML"
-});
-
-/**
- * Class: OpenLayers.Geometry.Rectangle
- * This class is *not supported*, and probably isn't what you're looking for.
- * Instead, most users probably want something like:
- * (code)
- * var poly = new OpenLayers.Bounds(0,0,10,10).toGeometry();
- * (end)
- * This will create a rectangular Polygon geometry.
- *
- * Inherits:
- * - <OpenLayers.Geometry>
- */
-
-OpenLayers.Geometry.Rectangle = OpenLayers.Class(OpenLayers.Geometry, {
-
- /**
- * Property: x
- * {Float}
- */
- x: null,
-
- /**
- * Property: y
- * {Float}
- */
- y: null,
-
- /**
- * Property: width
- * {Float}
- */
- width: null,
-
- /**
- * Property: height
- * {Float}
- */
- height: null,
-
- /**
- * Constructor: OpenLayers.Geometry.Rectangle
- *
- * Parameters:
- * points - {Array(<OpenLayers.Geometry.Point>)}
- */
- initialize: function(x, y, width, height) {
- OpenLayers.Geometry.prototype.initialize.apply(this, arguments);
-
- this.x = x;
- this.y = y;
-
- this.width = width;
- this.height = height;
- },
-
- /**
- * Method: calculateBounds
- * Recalculate the bounds for the geometry.
- */
- calculateBounds: function() {
- this.bounds = new OpenLayers.Bounds(this.x, this.y,
- this.x + this.width,
- this.y + this.height);
- },
-
-
- /**
- * APIMethod: getLength
- *
- * Returns:
- * {Float} The length of the geometry
- */
- getLength: function() {
- var length = (2 * this.width) + (2 * this.height);
- return length;
- },
-
- /**
- * APIMethod: getArea
- *
- * Returns:
- * {Float} The area of the geometry
- */
- getArea: function() {
- var area = this.width * this.height;
- return area;
- },
-
- CLASS_NAME: "OpenLayers.Geometry.Rectangle"
-});
-
-/**
- * Class: OpenLayers.Renderer.NG
- *
- * Inherits from:
- * - <OpenLayers.Renderer.Elements>
- */
-OpenLayers.Renderer.NG = OpenLayers.Class(OpenLayers.Renderer.Elements, {
-
- /**
- * Constant: labelNodeType
- * {String} The node type for text label containers. To be defined by
- * subclasses.
- */
- labelNodeType: null,
-
- /**
- * Constructor: OpenLayers.Renderer.NG
- *
- * Parameters:
- * containerID - {String}
- * options - {Object} options for this renderer. Supported options are:
- * * yOrdering - {Boolean} Whether to use y-ordering
- * * zIndexing - {Boolean} Whether to use z-indexing. Will be ignored
- * if yOrdering is set to true.
- */
-
- /**
- * Method: updateDimensions
- * To be extended by subclasses - here we set positioning related styles
- * on HTML elements, subclasses have to do the same for renderer specific
- * elements (e.g. viewBox, width and height of the rendererRoot)
- *
- * Parameters:
- * zoomChanged - {Boolean} Has the zoom changed? If so, subclasses may have
- * to update feature styles/dimensions.
- */
- updateDimensions: function(zoomChanged) {
- var mapExtent = this.map.getExtent();
- var renderExtent = mapExtent.scale(3);
- this.setExtent(renderExtent, true);
- var res = this.getResolution();
- var div = this.rendererRoot.parentNode;
- var layerLeft = parseFloat(div.parentNode.style.left);
- var layerTop = parseFloat(div.parentNode.style.top);
- div.style.left = ((renderExtent.left - mapExtent.left) / res - layerLeft) + "px";
- div.style.top = ((mapExtent.top - renderExtent.top) / res - layerTop) + "px";
- },
-
- /**
- * Method: resize
- */
- setSize: function() {
- this.map.getExtent() && this.updateDimensions();
- },
-
- /**
- * Method: drawFeature
- * Draw the feature. The optional style argument can be used
- * to override the feature's own style. This method should only
- * be called from layer.drawFeature().
- *
- * Parameters:
- * feature - {<OpenLayers.Feature.Vector>}
- * style - {<Object>}
- *
- * Returns:
- * {Boolean} true if the feature has been drawn completely, false if not,
- * undefined if the feature had no geometry
- */
- drawFeature: function(feature, style) {
- if(style == null) {
- style = feature.style;
- }
- if (feature.geometry) {
- var rendered = this.drawGeometry(feature.geometry, style, feature.id);
- if(rendered !== false && style.label) {
- var location = feature.geometry.getCentroid();
- this.drawText(feature.id, style, location);
- } else {
- this.removeText(feature.id);
- }
- return rendered;
- }
- },
-
- /**
- * Method: drawText
- * Function for drawing text labels.
- * This method is only called by the renderer itself.
- *
- * Parameters:
- * featureId - {String|DOMElement}
- * style - {Object}
- * location - {<OpenLayers.Geometry.Point>}, will be modified inline
- *
- * Returns:
- * {DOMElement} container holding the text label (to be populated by
- * subclasses)
- */
- drawText: function(featureId, style, location) {
- var label;
- if (typeof featureId !== "string") {
- label = featureId;
- } else {
- label = this.nodeFactory(featureId + this.LABEL_ID_SUFFIX, this.labelNodeType);
- label._featureId = featureId;
- }
- label._style = style;
- label._x = location.x;
- label._y = location.y;
- if(style.labelXOffset || style.labelYOffset) {
- var xOffset = isNaN(style.labelXOffset) ? 0 : style.labelXOffset;
- var yOffset = isNaN(style.labelYOffset) ? 0 : style.labelYOffset;
- var res = this.getResolution();
- location.move(xOffset*res, yOffset*res);
- }
-
- if(label.parentNode !== this.textRoot) {
- this.textRoot.appendChild(label);
- }
-
- return label;
- },
-
- CLASS_NAME: "OpenLayers.Renderer.NG"
-});
-
-// Monkey-patching Layer.Vector for Renderer.NG support
-(function() {
- var moveTo = OpenLayers.Layer.Vector.prototype.moveTo;
- OpenLayers.Layer.Vector.prototype.moveTo = function(bounds, zoomChanged, dragging) {
- if (OpenLayers.Renderer.NG && this.renderer instanceof OpenLayers.Renderer.NG) {
- OpenLayers.Layer.prototype.moveTo.apply(this, arguments);
- dragging || this.renderer.updateDimensions(zoomChanged);
- if (!this.drawn) {
- this.drawn = true;
- var feature;
- for(var i=0, len=this.features.length; i<len; i++) {
- this.renderer.locked = (i !== (len - 1));
- feature = this.features[i];
- this.drawFeature(feature);
- }
- }
- } else {
- moveTo.apply(this, arguments);
- }
- }
- var redraw = OpenLayers.Layer.Vector.prototype.redraw;
- OpenLayers.Layer.Vector.prototype.redraw = function() {
- if (OpenLayers.Renderer.NG && this.renderer instanceof OpenLayers.Renderer.NG) {
- this.drawn = false;
- }
- redraw.apply(this, arguments);
- }
-})();
-
-/**
- * Class: OpenLayers.Renderer.SVG2
- *
- * Inherits from:
- * - <OpenLayers.Renderer.NG>
- */
-OpenLayers.Renderer.SVG2 = OpenLayers.Class(OpenLayers.Renderer.NG, {
-
- /**
- * Property: xmlns
- * {String}
- */
- xmlns: "http://www.w3.org/2000/svg",
-
- /**
- * Property: xlinkns
- * {String}
- */
- xlinkns: "http://www.w3.org/1999/xlink",
-
- /**
- * Property: symbolMetrics
- * {Object} Cache for symbol metrics according to their svg coordinate
- * space. This is an object keyed by the symbol's id, and values are
- * an object with size, x and y properties.
- */
- symbolMetrics: null,
-
- /**
- * Constant: labelNodeType
- * {String} The node type for text label containers.
- */
- labelNodeType: "g",
-
- /**
- * Constructor: OpenLayers.Renderer.SVG2
- *
- * Parameters:
- * containerID - {String}
- */
- initialize: function(containerID) {
- if (!this.supported()) {
- return;
- }
- OpenLayers.Renderer.Elements.prototype.initialize.apply(this,
- arguments);
-
- this.symbolMetrics = {};
- },
-
- /**
- * APIMethod: supported
- *
- * Returns:
- * {Boolean} Whether or not the browser supports the SVG renderer
- */
- supported: function() {
- var svgFeature = "http://www.w3.org/TR/SVG11/feature#";
- return (document.implementation &&
- (document.implementation.hasFeature("org.w3c.svg", "1.0") ||
- document.implementation.hasFeature(svgFeature + "SVG", "1.1") ||
- document.implementation.hasFeature(svgFeature + "BasicStructure", "1.1") ));
- },
-
- /**
- * Method: updateDimensions
- *
- * Parameters:
- * zoomChanged - {Boolean}
- */
- updateDimensions: function(zoomChanged) {
- OpenLayers.Renderer.NG.prototype.updateDimensions.apply(this, arguments);
-
- var res = this.getResolution();
-
- var width = this.extent.getWidth();
- var height = this.extent.getHeight();
-
- var extentString = [
- this.extent.left,
- -this.extent.top,
- width,
- height
- ].join(" ");
- this.rendererRoot.setAttributeNS(null, "viewBox", extentString);
- this.rendererRoot.setAttributeNS(null, "width", width / res);
- this.rendererRoot.setAttributeNS(null, "height", height / res);
-
- if (zoomChanged === true) {
- // update styles for the new resolution
- var i, len;
- var nodes = this.vectorRoot.childNodes;
- for (i=0, len=nodes.length; i<len; ++i) {
- this.setStyle(nodes[i]);
- }
- var textNodes = this.textRoot.childNodes;
- var label;
- for (i=0, len=textNodes.length; i<len; ++i) {
- label = textNodes[i];
- this.drawText(label, label._style,
- new OpenLayers.Geometry.Point(label._x, label._y)
- );
- }
- }
- },
-
- /**
- * Method: getNodeType
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>}
- * style - {Object}
- *
- * Returns:
- * {String} The corresponding node type for the specified geometry
- */
- getNodeType: function(geometry, style) {
- var nodeType = null;
- switch (geometry.CLASS_NAME) {
- case "OpenLayers.Geometry.Point":
- if (style.externalGraphic) {
- nodeType = "image";
- } else if (this.isComplexSymbol(style.graphicName)) {
- nodeType = "svg";
- } else {
- nodeType = "circle";
- }
- break;
- case "OpenLayers.Geometry.Rectangle":
- nodeType = "rect";
- break;
- case "OpenLayers.Geometry.LineString":
- nodeType = "polyline";
- break;
- case "OpenLayers.Geometry.LinearRing":
- nodeType = "polygon";
- break;
- case "OpenLayers.Geometry.Polygon":
- case "OpenLayers.Geometry.Curve":
- nodeType = "path";
- break;
- default:
- break;
- }
- return nodeType;
- },
-
- /**
- * Method: setStyle
- * Use to set all the style attributes to a SVG node.
- *
- * Takes care to adjust stroke width and point radius to be
- * resolution-relative
- *
- * Parameters:
- * node - {SVGDomElement} An SVG element to decorate
- * style - {Object}
- * options - {Object} Currently supported options include
- * 'isFilled' {Boolean} and
- * 'isStroked' {Boolean}
- */
- setStyle: function(node, style, options) {
- style = style || node._style;
- options = options || node._options;
- var resolution = this.getResolution();
- var r = node._radius;
- var widthFactor = resolution;
- if (node._geometryClass == "OpenLayers.Geometry.Point" && r) {
- node.style.visibility = "";
- if (style.graphic === false) {
- node.style.visibility = "hidden";
- } else if (style.externalGraphic) {
-
- if (style.graphicTitle) {
- node.setAttributeNS(null, "title", style.graphicTitle);
- //Standards-conformant SVG
- // Prevent duplicate nodes. See issue https://github.com/openlayers/openlayers/issues/92
- var titleNode = node.getElementsByTagName("title");
- if (titleNode.length > 0) {
- titleNode[0].firstChild.textContent = style.graphicTitle;
- } else {
- var label = this.nodeFactory(null, "title");
- label.textContent = style.graphicTitle;
- node.appendChild(label);
- }
- }
- if (style.graphicWidth && style.graphicHeight) {
- node.setAttributeNS(null, "preserveAspectRatio", "none");
- }
- var width = style.graphicWidth || style.graphicHeight;
- var height = style.graphicHeight || style.graphicWidth;
- width = width ? width : style.pointRadius*2;
- height = height ? height : style.pointRadius*2;
- width *= resolution;
- height *= resolution;
-
- var xOffset = (style.graphicXOffset != undefined) ?
- style.graphicXOffset * resolution : -(0.5 * width);
- var yOffset = (style.graphicYOffset != undefined) ?
- style.graphicYOffset * resolution : -(0.5 * height);
-
- var opacity = style.graphicOpacity || style.fillOpacity;
-
- node.setAttributeNS(null, "x", node._x + xOffset);
- node.setAttributeNS(null, "y", node._y + yOffset);
- node.setAttributeNS(null, "width", width);
- node.setAttributeNS(null, "height", height);
- node.setAttributeNS(this.xlinkns, "href", style.externalGraphic);
- node.setAttributeNS(null, "style", "opacity: "+opacity);
- node.onclick = OpenLayers.Renderer.SVG2.preventDefault;
- } else if (this.isComplexSymbol(style.graphicName)) {
- // the symbol viewBox is three times as large as the symbol
- var offset = style.pointRadius * 3 * resolution;
- var size = offset * 2;
- var src = this.importSymbol(style.graphicName);
- widthFactor = this.symbolMetrics[src.id].size * 3 / size * resolution;
-
- // remove the node from the dom before we modify it. This
- // prevents various rendering issues in Safari and FF
- var parent = node.parentNode;
- var nextSibling = node.nextSibling;
- if(parent) {
- parent.removeChild(node);
- }
-
- // The more appropriate way to implement this would be use/defs,
- // but due to various issues in several browsers, it is safer to
- // copy the symbols instead of referencing them.
- // See e.g. ticket http://trac.osgeo.org/openlayers/ticket/2985
- // and this email thread
- // http://osgeo-org.1803224.n2.nabble.com/Select-Control-Ctrl-click-on-Feature-with-a-graphicName-opens-new-browser-window-tc5846039.html
- node.firstChild && node.removeChild(node.firstChild);
- node.appendChild(src.firstChild.cloneNode(true));
- node.setAttributeNS(null, "viewBox", src.getAttributeNS(null, "viewBox"));
-
- node.setAttributeNS(null, "width", size);
- node.setAttributeNS(null, "height", size);
- node.setAttributeNS(null, "x", node._x - offset);
- node.setAttributeNS(null, "y", node._y - offset);
-
- // now that the node has all its new properties, insert it
- // back into the dom where it was
- if(nextSibling) {
- parent.insertBefore(node, nextSibling);
- } else if(parent) {
- parent.appendChild(node);
- }
- } else {
- node.setAttributeNS(null, "r", style.pointRadius * resolution);
- }
-
- var rotation = style.rotation;
- if (rotation !== undefined || node._rotation !== undefined) {
- node._rotation = rotation;
- rotation |= 0;
- if (node.nodeName !== "svg") {
- node.setAttributeNS(null, "transform",
- ["rotate(", rotation, node._x, node._y, ")"].join(" ")
- );
- } else {
- var metrics = this.symbolMetrics[src.id];
- node.firstChild.setAttributeNS(null, "transform",
- ["rotate(", rotation, metrics.x, metrics.y, ")"].join(" ")
- );
- }
- }
- }
-
- if (options.isFilled) {
- node.setAttributeNS(null, "fill", style.fillColor);
- node.setAttributeNS(null, "fill-opacity", style.fillOpacity);
- } else {
- node.setAttributeNS(null, "fill", "none");
- }
-
- if (options.isStroked) {
- node.setAttributeNS(null, "stroke", style.strokeColor);
- node.setAttributeNS(null, "stroke-opacity", style.strokeOpacity);
- node.setAttributeNS(null, "stroke-width", style.strokeWidth * widthFactor);
- node.setAttributeNS(null, "stroke-linecap", style.strokeLinecap || "round");
- // Hard-coded linejoin for now, to make it look the same as in VML.
- // There is no strokeLinejoin property yet for symbolizers.
- node.setAttributeNS(null, "stroke-linejoin", "round");
- style.strokeDashstyle && node.setAttributeNS(null,
- "stroke-dasharray", this.dashStyle(style, widthFactor));
- } else {
- node.setAttributeNS(null, "stroke", "none");
- }
-
- if (style.pointerEvents) {
- node.setAttributeNS(null, "pointer-events", style.pointerEvents);
- }
-
- if (style.cursor != null) {
- node.setAttributeNS(null, "cursor", style.cursor);
- }
-
- return node;
- },
-
- /**
- * Method: dashStyle
- *
- * Parameters:
- * style - {Object}
- * widthFactor - {Number}
- *
- * Returns:
- * {String} A SVG compliant 'stroke-dasharray' value
- */
- dashStyle: function(style, widthFactor) {
- var w = style.strokeWidth * widthFactor;
- var str = style.strokeDashstyle;
- switch (str) {
- case 'solid':
- return 'none';
- case 'dot':
- return [widthFactor, 4 * w].join();
- case 'dash':
- return [4 * w, 4 * w].join();
- case 'dashdot':
- return [4 * w, 4 * w, widthFactor, 4 * w].join();
- case 'longdash':
- return [8 * w, 4 * w].join();
- case 'longdashdot':
- return [8 * w, 4 * w, widthFactor, 4 * w].join();
- default:
- var parts = OpenLayers.String.trim(str).split(/\s+/g);
- for (var i=0, ii=parts.length; i<ii; i++) {
- parts[i] = parts[i] * widthFactor;
- }
- return parts.join();
- }
- },
-
- /**
- * Method: createNode
- *
- * Parameters:
- * type - {String} Kind of node to draw
- * id - {String} Id for node
- *
- * Returns:
- * {DOMElement} A new node of the given type and id
- */
- createNode: function(type, id) {
- var node = document.createElementNS(this.xmlns, type);
- if (id) {
- node.setAttributeNS(null, "id", id);
- }
- return node;
- },
-
- /**
- * Method: nodeTypeCompare
- *
- * Parameters:
- * node - {SVGDomElement} An SVG element
- * type - {String} Kind of node
- *
- * Returns:
- * {Boolean} Whether or not the specified node is of the specified type
- */
- nodeTypeCompare: function(node, type) {
- return (type == node.nodeName);
- },
-
- /**
- * Method: createRenderRoot
- *
- * Returns:
- * {DOMElement} The specific render engine's root element
- */
- createRenderRoot: function() {
- return this.nodeFactory(this.container.id + "_svgRoot", "svg");
- },
-
- /**
- * Method: createRoot
- *
- * Parameters:
- * suffix - {String} suffix to append to the id
- *
- * Returns:
- * {DOMElement}
- */
- createRoot: function(suffix) {
- return this.nodeFactory(this.container.id + suffix, "g");
- },
-
- /**
- * Method: createDefs
- *
- * Returns:
- * {DOMElement} The element to which we'll add the symbol definitions
- */
- createDefs: function() {
- var defs = this.nodeFactory(this.container.id + "_defs", "defs");
- this.rendererRoot.appendChild(defs);
- return defs;
- },
-
- /**************************************
- * *
- * GEOMETRY DRAWING FUNCTIONS *
- * *
- **************************************/
-
- /**
- * Method: drawPoint
- * This method is only called by the renderer itself.
- *
- * Parameters:
- * node - {DOMElement}
- * geometry - {<OpenLayers.Geometry>}
- *
- * Returns:
- * {DOMElement} or false if the renderer could not draw the point
- */
- drawPoint: function(node, geometry) {
- return this.drawCircle(node, geometry, 1);
- },
-
- /**
- * Method: drawCircle
- * This method is only called by the renderer itself.
- *
- * Parameters:
- * node - {DOMElement}
- * geometry - {<OpenLayers.Geometry>}
- * radius - {Float}
- *
- * Returns:
- * {DOMElement} or false if the renderer could not draw the circle
- */
- drawCircle: function(node, geometry, radius) {
- var x = geometry.x;
- var y = -geometry.y;
- node.setAttributeNS(null, "cx", x);
- node.setAttributeNS(null, "cy", y);
- node._x = x;
- node._y = y;
- node._radius = radius;
- return node;
- },
-
- /**
- * Method: drawLineString
- * This method is only called by the renderer itself.
- *
- * Parameters:
- * node - {DOMElement}
- * geometry - {<OpenLayers.Geometry>}
- *
- * Returns:
- * {DOMElement} or null if the renderer could not draw all components of
- * the linestring, or false if nothing could be drawn
- */
- drawLineString: function(node, geometry) {
- var path = this.getComponentsString(geometry.components);
- node.setAttributeNS(null, "points", path);
- return node;
- },
-
- /**
- * Method: drawLinearRing
- * This method is only called by the renderer itself.
- *
- * Parameters:
- * node - {DOMElement}
- * geometry - {<OpenLayers.Geometry>}
- *
- * Returns:
- * {DOMElement} or null if the renderer could not draw all components
- * of the linear ring, or false if nothing could be drawn
- */
- drawLinearRing: function(node, geometry) {
- var path = this.getComponentsString(geometry.components);
- node.setAttributeNS(null, "points", path);
- return node;
- },
-
- /**
- * Method: drawPolygon
- * This method is only called by the renderer itself.
- *
- * Parameters:
- * node - {DOMElement}
- * geometry - {<OpenLayers.Geometry>}
- *
- * Returns:
- * {DOMElement} or null if the renderer could not draw all components
- * of the polygon, or false if nothing could be drawn
- */
- drawPolygon: function(node, geometry) {
- var d = [];
- var draw = true;
- var complete = true;
- var linearRingResult, path;
- for (var j=0, len=geometry.components.length; j<len; j++) {
- d.push("M");
- path = this.getComponentsString(
- geometry.components[j].components, " ");
- d.push(path);
- }
- d.push("z");
- node.setAttributeNS(null, "d", d.join(" "));
- node.setAttributeNS(null, "fill-rule", "evenodd");
- return node;
- },
-
- /**
- * Method: drawRectangle
- * This method is only called by the renderer itself.
- *
- * Parameters:
- * node - {DOMElement}
- * geometry - {<OpenLayers.Geometry>}
- *
- * Returns:
- * {DOMElement} or false if the renderer could not draw the rectangle
- */
- drawRectangle: function(node, geometry) {
- node.setAttributeNS(null, "x", geometry.x);
- node.setAttributeNS(null, "y", -geometry.y);
- node.setAttributeNS(null, "width", geometry.width);
- node.setAttributeNS(null, "height", geometry.height);
- return node;
- },
-
- /**
- * Method: drawText
- * Function for drawing text labels.
- * This method is only called by the renderer itself.
- *
- * Parameters:
- * featureId - {String|DOMElement}
- * style - {Object}
- * location - {<OpenLayers.Geometry.Point>}, will be modified inline
- *
- * Returns:
- * {DOMElement} container holding the text label
- */
- drawText: function(featureId, style, location) {
- var g = OpenLayers.Renderer.NG.prototype.drawText.apply(this, arguments);
- var text = g.firstChild ||
- this.nodeFactory(featureId + this.LABEL_ID_SUFFIX + "_text", "text");
-
- var res = this.getResolution();
- text.setAttributeNS(null, "x", location.x / res);
- text.setAttributeNS(null, "y", - location.y / res);
- g.setAttributeNS(null, "transform", "scale(" + res + ")");
-
- if (style.fontColor) {
- text.setAttributeNS(null, "fill", style.fontColor);
- }
- if (style.fontOpacity) {
- text.setAttributeNS(null, "opacity", style.fontOpacity);
- }
- if (style.fontFamily) {
- text.setAttributeNS(null, "font-family", style.fontFamily);
- }
- if (style.fontSize) {
- text.setAttributeNS(null, "font-size", style.fontSize);
- }
- if (style.fontWeight) {
- text.setAttributeNS(null, "font-weight", style.fontWeight);
- }
- if (style.fontStyle) {
- text.setAttributeNS(null, "font-style", style.fontStyle);
- }
- if (style.labelSelect === true) {
- text.setAttributeNS(null, "pointer-events", "visible");
- text._featureId = featureId;
- } else {
- text.setAttributeNS(null, "pointer-events", "none");
- }
- var align = style.labelAlign || OpenLayers.Renderer.defaultSymbolizer.labelAlign;
- text.setAttributeNS(null, "text-anchor",
- OpenLayers.Renderer.SVG2.LABEL_ALIGN[align[0]] || "middle");
-
- if (OpenLayers.IS_GECKO === true) {
- text.setAttributeNS(null, "dominant-baseline",
- OpenLayers.Renderer.SVG2.LABEL_ALIGN[align[1]] || "central");
- }
-
- var labelRows = style.label.split('\n');
- var numRows = labelRows.length;
- while (text.childNodes.length > numRows) {
- text.removeChild(text.lastChild);
- }
- for (var i = 0; i < numRows; i++) {
- var tspan = text.childNodes[i] ||
- this.nodeFactory(featureId + this.LABEL_ID_SUFFIX + "_tspan_" + i, "tspan");
- if (style.labelSelect === true) {
- tspan._featureId = featureId;
- }
- if (OpenLayers.IS_GECKO === false) {
- tspan.setAttributeNS(null, "baseline-shift",
- OpenLayers.Renderer.SVG2.LABEL_VSHIFT[align[1]] || "-35%");
- }
- tspan.setAttribute("x", location.x / res);
- if (i == 0) {
- var vfactor = OpenLayers.Renderer.SVG2.LABEL_VFACTOR[align[1]];
- if (vfactor == null) {
- vfactor = -.5;
- }
- tspan.setAttribute("dy", (vfactor*(numRows-1)) + "em");
- } else {
- tspan.setAttribute("dy", "1em");
- }
- tspan.textContent = (labelRows[i] === '') ? ' ' : labelRows[i];
- if (!tspan.parentNode) {
- text.appendChild(tspan);
- }
- }
-
- if (!text.parentNode) {
- g.appendChild(text);
- }
-
- return g;
- },
-
- /**
- * Method: getComponentString
- *
- * Parameters:
- * components - {Array(<OpenLayers.Geometry.Point>)} Array of points
- * separator - {String} character between coordinate pairs. Defaults to ","
- *
- * Returns:
- * {Object} hash with properties "path" (the string created from the
- * components and "complete" (false if the renderer was unable to
- * draw all components)
- */
- getComponentsString: function(components, separator) {
- var len = components.length;
- var strings = new Array(len);
- for (var i=0; i<len; i++) {
- strings[i] = this.getShortString(components[i]);
- }
-
- return strings.join(separator || ",");
- },
-
- /**
- * Method: getShortString
- *
- * Parameters:
- * point - {<OpenLayers.Geometry.Point>}
- *
- * Returns:
- * {String} or false if point is outside the valid range
- */
- getShortString: function(point) {
- return point.x + "," + (-point.y);
- },
-
- /**
- * Method: importSymbol
- * add a new symbol definition from the rendererer's symbol hash
- *
- * Parameters:
- * graphicName - {String} name of the symbol to import
- *
- * Returns:
- * {DOMElement} - the imported symbol
- */
- importSymbol: function (graphicName) {
- if (!this.defs) {
- // create svg defs tag
- this.defs = this.createDefs();
- }
- var id = this.container.id + "-" + graphicName;
-
- // check if symbol already exists in the defs
- var existing = document.getElementById(id);
- if (existing != null) {
- return existing;
- }
-
- var symbol = OpenLayers.Renderer.symbol[graphicName];
- if (!symbol) {
- throw new Error(graphicName + ' is not a valid symbol name');
- }
-
- var symbolNode = this.nodeFactory(id, "symbol");
- var node = this.nodeFactory(null, "polygon");
- symbolNode.appendChild(node);
- var symbolExtent = new OpenLayers.Bounds(
- Number.MAX_VALUE, Number.MAX_VALUE, 0, 0);
-
- var points = [];
- var x,y;
- for (var i=0, len=symbol.length; i<len; i=i+2) {
- x = symbol[i];
- y = symbol[i+1];
- symbolExtent.left = Math.min(symbolExtent.left, x);
- symbolExtent.bottom = Math.min(symbolExtent.bottom, y);
- symbolExtent.right = Math.max(symbolExtent.right, x);
- symbolExtent.top = Math.max(symbolExtent.top, y);
- points.push(x, ",", y);
- }
-
- node.setAttributeNS(null, "points", points.join(" "));
-
- var width = symbolExtent.getWidth();
- var height = symbolExtent.getHeight();
- // create a viewBox three times as large as the symbol itself,
- // to allow for strokeWidth being displayed correctly at the corners.
- var viewBox = [symbolExtent.left - width,
- symbolExtent.bottom - height, width * 3, height * 3];
- symbolNode.setAttributeNS(null, "viewBox", viewBox.join(" "));
- this.symbolMetrics[id] = {
- size: Math.max(width, height),
- x: symbolExtent.getCenterLonLat().lon,
- y: symbolExtent.getCenterLonLat().lat
- };
-
- this.defs.appendChild(symbolNode);
- return symbolNode;
- },
-
- /**
- * Method: getFeatureIdFromEvent
- *
- * Parameters:
- * evt - {Object} An <OpenLayers.Event> object
- *
- * Returns:
- * {String} A feature id or undefined.
- */
- getFeatureIdFromEvent: function(evt) {
- var featureId = OpenLayers.Renderer.Elements.prototype.getFeatureIdFromEvent.apply(this, arguments);
- if(!featureId) {
- var target = evt.target;
- featureId = target.parentNode && target != this.rendererRoot ?
- target.parentNode._featureId : undefined;
- }
- return featureId;
- },
-
- CLASS_NAME: "OpenLayers.Renderer.SVG2"
-});
-
-/**
- * Constant: OpenLayers.Renderer.SVG2.LABEL_ALIGN
- * {Object}
- */
-OpenLayers.Renderer.SVG2.LABEL_ALIGN = {
- "l": "start",
- "r": "end",
- "b": "bottom",
- "t": "hanging"
-};
-
-/**
- * Constant: OpenLayers.Renderer.SVG2.LABEL_VSHIFT
- * {Object}
- */
-OpenLayers.Renderer.SVG2.LABEL_VSHIFT = {
- // according to
- // http://www.w3.org/Graphics/SVG/Test/20061213/htmlObjectHarness/full-text-align-02-b.html
- // a baseline-shift of -70% shifts the text exactly from the
- // bottom to the top of the baseline, so -35% moves the text to
- // the center of the baseline.
- "t": "-70%",
- "b": "0"
-};
-
-/**
- * Constant: OpenLayers.Renderer.SVG2.LABEL_VFACTOR
- * {Object}
- */
-OpenLayers.Renderer.SVG2.LABEL_VFACTOR = {
- "t": 0,
- "b": -1
-};
-
-/**
- * Function: OpenLayers.Renderer.SVG2.preventDefault
- * Used to prevent default events (especially opening images in a new tab on
- * ctrl-click) from being executed for externalGraphic and graphicName symbols
- */
-OpenLayers.Renderer.SVG2.preventDefault = function(e) {
- e.preventDefault && e.preventDefault();
-};
-
-/**
- * Class: OpenLayers.Popup.AnchoredBubble
- * This class is *deprecated*. Use {<OpenLayers.Popup.Anchored>} and
- * round corners using CSS3's border-radius property.
- *
- * Inherits from:
- * - <OpenLayers.Popup.Anchored>
- */
-OpenLayers.Popup.AnchoredBubble = OpenLayers.Class(OpenLayers.Popup.Anchored, {
-
- /**
- * Property: rounded
- * {Boolean} Has the popup been rounded yet?
- */
- rounded: false,
-
- /**
- * Constructor: OpenLayers.Popup.AnchoredBubble
- *
- * Parameters:
- * id - {String}
- * lonlat - {<OpenLayers.LonLat>}
- * contentSize - {<OpenLayers.Size>}
- * contentHTML - {String}
- * anchor - {Object} Object to which we'll anchor the popup. Must expose
- * a 'size' (<OpenLayers.Size>) and 'offset' (<OpenLayers.Pixel>)
- * (Note that this is generally an <OpenLayers.Icon>).
- * closeBox - {Boolean}
- * closeBoxCallback - {Function} Function to be called on closeBox click.
- */
- initialize:function(id, lonlat, contentSize, contentHTML, anchor, closeBox,
- closeBoxCallback) {
-
- this.padding = new OpenLayers.Bounds(
- 0, OpenLayers.Popup.AnchoredBubble.CORNER_SIZE,
- 0, OpenLayers.Popup.AnchoredBubble.CORNER_SIZE
- );
- OpenLayers.Popup.Anchored.prototype.initialize.apply(this, arguments);
- },
-
- /**
- * Method: draw
- *
- * Parameters:
- * px - {<OpenLayers.Pixel>}
- *
- * Returns:
- * {DOMElement} Reference to a div that contains the drawn popup.
- */
- draw: function(px) {
-
- OpenLayers.Popup.Anchored.prototype.draw.apply(this, arguments);
-
- this.setContentHTML();
-
- //set the popup color and opacity
- this.setBackgroundColor();
- this.setOpacity();
-
- return this.div;
- },
-
- /**
- * Method: updateRelativePosition
- * The popup has been moved to a new relative location, in which case
- * we will want to re-do the rico corners.
- */
- updateRelativePosition: function() {
- this.setRicoCorners();
- },
-
- /**
- * APIMethod: setSize
- *
- * Parameters:
- * contentSize - {<OpenLayers.Size>} the new size for the popup's
- * contents div (in pixels).
- */
- setSize:function(contentSize) {
- OpenLayers.Popup.Anchored.prototype.setSize.apply(this, arguments);
-
- this.setRicoCorners();
- },
-
- /**
- * APIMethod: setBackgroundColor
- *
- * Parameters:
- * color - {String}
- */
- setBackgroundColor:function(color) {
- if (color != undefined) {
- this.backgroundColor = color;
- }
-
- if (this.div != null) {
- if (this.contentDiv != null) {
- this.div.style.background = "transparent";
- OpenLayers.Rico.Corner.changeColor(this.groupDiv,
- this.backgroundColor);
- }
- }
- },
-
- /**
- * APIMethod: setOpacity
- *
- * Parameters:
- * opacity - {float}
- */
- setOpacity:function(opacity) {
- OpenLayers.Popup.Anchored.prototype.setOpacity.call(this, opacity);
-
- if (this.div != null) {
- if (this.groupDiv != null) {
- OpenLayers.Rico.Corner.changeOpacity(this.groupDiv,
- this.opacity);
- }
- }
- },
-
- /**
- * Method: setBorder
- * Always sets border to 0. Bubble Popups can not have a border.
- *
- * Parameters:
- * border - {Integer}
- */
- setBorder:function(border) {
- this.border = 0;
- },
-
- /**
- * Method: setRicoCorners
- * Update RICO corners according to the popup's current relative postion.
- */
- setRicoCorners:function() {
-
- var corners = this.getCornersToRound(this.relativePosition);
- var options = {corners: corners,
- color: this.backgroundColor,
- bgColor: "transparent",
- blend: false};
-
- if (!this.rounded) {
- OpenLayers.Rico.Corner.round(this.div, options);
- this.rounded = true;
- } else {
- OpenLayers.Rico.Corner.reRound(this.groupDiv, options);
- //set the popup color and opacity
- this.setBackgroundColor();
- this.setOpacity();
- }
- },
-
- /**
- * Method: getCornersToRound
- *
- * Returns:
- * {String} The proper corners string ("tr tl bl br") for rico to round.
- */
- getCornersToRound:function() {
-
- var corners = ['tl', 'tr', 'bl', 'br'];
-
- //we want to round all the corners _except_ the opposite one.
- var corner = OpenLayers.Bounds.oppositeQuadrant(this.relativePosition);
- OpenLayers.Util.removeItem(corners, corner);
-
- return corners.join(" ");
- },
-
- CLASS_NAME: "OpenLayers.Popup.AnchoredBubble"
-});
-
-/**
- * Constant: CORNER_SIZE
- * {Integer} 5. Border space for the RICO corners.
- */
-OpenLayers.Popup.AnchoredBubble.CORNER_SIZE = 5;