|
/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for |
|
* full list of contributors). Published under the Clear BSD license. |
|
* See http://svn.openlayers.org/trunk/openlayers/license.txt for the |
|
* full text of the license. */ |
|
|
|
/** |
|
* @requires OpenLayers/Console.js |
|
*/ |
|
|
|
/** |
|
* Namespace: Util |
|
*/ |
|
OpenLayers.Util = {}; |
|
|
|
/** |
|
* Function: getElement |
|
* This is the old $() from prototype |
|
*/ |
|
OpenLayers.Util.getElement = function() { |
|
var elements = []; |
|
|
|
for (var i=0, len=arguments.length; i<len; i++) { |
|
var element = arguments[i]; |
|
if (typeof element == 'string') { |
|
element = document.getElementById(element); |
|
} |
|
if (arguments.length == 1) { |
|
return element; |
|
} |
|
elements.push(element); |
|
} |
|
return elements; |
|
}; |
|
|
|
/** |
|
* Function: isElement |
|
* A cross-browser implementation of "e instanceof Element". |
|
* |
|
* Parameters: |
|
* o - {Object} The object to test. |
|
* |
|
* Returns: |
|
* {Boolean} |
|
*/ |
|
OpenLayers.Util.isElement = function(o) { |
|
return !!(o && o.nodeType === 1); |
|
}; |
|
|
|
/** |
|
* Maintain existing definition of $. |
|
*/ |
|
if(typeof window.$ === "undefined") { |
|
window.$ = OpenLayers.Util.getElement; |
|
} |
|
|
|
/** |
|
* APIFunction: extend |
|
* Copy all properties of a source object to a destination object. Modifies |
|
* the passed in destination object. Any properties on the source object |
|
* that are set to undefined will not be (re)set on the destination object. |
|
* |
|
* Parameters: |
|
* destination - {Object} The object that will be modified |
|
* source - {Object} The object with properties to be set on the destination |
|
* |
|
* Returns: |
|
* {Object} The destination object. |
|
*/ |
|
OpenLayers.Util.extend = function(destination, source) { |
|
destination = destination || {}; |
|
if(source) { |
|
for(var property in source) { |
|
var value = source[property]; |
|
if(value !== undefined) { |
|
destination[property] = value; |
|
} |
|
} |
|
|
|
/** |
|
* IE doesn't include the toString property when iterating over an object's |
|
* properties with the for(property in object) syntax. Explicitly check if |
|
* the source has its own toString property. |
|
*/ |
|
|
|
/* |
|
* FF/Windows < 2.0.0.13 reports "Illegal operation on WrappedNative |
|
* prototype object" when calling hawOwnProperty if the source object |
|
* is an instance of window.Event. |
|
*/ |
|
|
|
var sourceIsEvt = typeof window.Event == "function" |
|
&& source instanceof window.Event; |
|
|
|
if(!sourceIsEvt |
|
&& source.hasOwnProperty && source.hasOwnProperty('toString')) { |
|
destination.toString = source.toString; |
|
} |
|
} |
|
return destination; |
|
}; |
|
|
|
|
|
/** |
|
* Function: removeItem |
|
* Remove an object from an array. Iterates through the array |
|
* to find the item, then removes it. |
|
* |
|
* Parameters: |
|
* array - {Array} |
|
* item - {Object} |
|
* |
|
* Return |
|
* {Array} A reference to the array |
|
*/ |
|
OpenLayers.Util.removeItem = function(array, item) { |
|
for(var i = array.length - 1; i >= 0; i--) { |
|
if(array[i] == item) { |
|
array.splice(i,1); |
|
//break;more than once?? |
|
} |
|
} |
|
return array; |
|
}; |
|
|
|
/** |
|
* Function: clearArray |
|
* *Deprecated*. This function will disappear in 3.0. |
|
* Please use "array.length = 0" instead. |
|
* |
|
* Parameters: |
|
* array - {Array} |
|
*/ |
|
OpenLayers.Util.clearArray = function(array) { |
|
OpenLayers.Console.warn( |
|
OpenLayers.i18n( |
|
"methodDeprecated", {'newMethod': 'array = []'} |
|
) |
|
); |
|
array.length = 0; |
|
}; |
|
|
|
/** |
|
* Function: indexOf |
|
* Seems to exist already in FF, but not in MOZ. |
|
* |
|
* Parameters: |
|
* array - {Array} |
|
* obj - {Object} |
|
* |
|
* Returns: |
|
* {Integer} The index at, which the first object was found in the array. |
|
* If not found, returns -1. |
|
*/ |
|
OpenLayers.Util.indexOf = function(array, obj) { |
|
// use the build-in function if available. |
|
if (typeof array.indexOf == "function") { |
|
return array.indexOf(obj); |
|
} else { |
|
for (var i = 0, len = array.length; i < len; i++) { |
|
if (array[i] == obj) { |
|
return i; |
|
} |
|
} |
|
return -1; |
|
} |
|
}; |
|
|
|
|
|
|
|
/** |
|
* Function: modifyDOMElement |
|
* |
|
* Modifies many properties of a DOM element all at once. Passing in |
|
* null to an individual parameter will avoid setting the attribute. |
|
* |
|
* Parameters: |
|
* id - {String} The element id attribute to set. |
|
* px - {<OpenLayers.Pixel>} The left and top style position. |
|
* sz - {<OpenLayers.Size>} The width and height style attributes. |
|
* position - {String} The position attribute. eg: absolute, |
|
* relative, etc. |
|
* border - {String} The style.border attribute. eg: |
|
* solid black 2px |
|
* overflow - {String} The style.overview attribute. |
|
* opacity - {Float} Fractional value (0.0 - 1.0) |
|
*/ |
|
OpenLayers.Util.modifyDOMElement = function(element, id, px, sz, position, |
|
border, overflow, opacity) { |
|
|
|
if (id) { |
|
element.id = id; |
|
} |
|
if (px) { |
|
element.style.left = px.x + "px"; |
|
element.style.top = px.y + "px"; |
|
} |
|
if (sz) { |
|
element.style.width = sz.w + "px"; |
|
element.style.height = sz.h + "px"; |
|
} |
|
if (position) { |
|
element.style.position = position; |
|
} |
|
if (border) { |
|
element.style.border = border; |
|
} |
|
if (overflow) { |
|
element.style.overflow = overflow; |
|
} |
|
if (parseFloat(opacity) >= 0.0 && parseFloat(opacity) < 1.0) { |
|
element.style.filter = 'alpha(opacity=' + (opacity * 100) + ')'; |
|
element.style.opacity = opacity; |
|
} else if (parseFloat(opacity) == 1.0) { |
|
element.style.filter = ''; |
|
element.style.opacity = ''; |
|
} |
|
}; |
|
|
|
/** |
|
* Function: createDiv |
|
* Creates a new div and optionally set some standard attributes. |
|
* Null may be passed to each parameter if you do not wish to |
|
* set a particular attribute. |
|
* Note - zIndex is NOT set on the resulting div. |
|
* |
|
* Parameters: |
|
* id - {String} An identifier for this element. If no id is |
|
* passed an identifier will be created |
|
* automatically. |
|
* px - {<OpenLayers.Pixel>} The element left and top position. |
|
* sz - {<OpenLayers.Size>} The element width and height. |
|
* imgURL - {String} A url pointing to an image to use as a |
|
* background image. |
|
* position - {String} The style.position value. eg: absolute, |
|
* relative etc. |
|
* border - {String} The the style.border value. |
|
* eg: 2px solid black |
|
* overflow - {String} The style.overflow value. Eg. hidden |
|
* opacity - {Float} Fractional value (0.0 - 1.0) |
|
* |
|
* Returns: |
|
* {DOMElement} A DOM Div created with the specified attributes. |
|
*/ |
|
OpenLayers.Util.createDiv = function(id, px, sz, imgURL, position, |
|
border, overflow, opacity) { |
|
|
|
var dom = document.createElement('div'); |
|
|
|
if (imgURL) { |
|
dom.style.backgroundImage = 'url(' + imgURL + ')'; |
|
} |
|
|
|
//set generic properties |
|
if (!id) { |
|
id = OpenLayers.Util.createUniqueID("OpenLayersDiv"); |
|
} |
|
if (!position) { |
|
position = "absolute"; |
|
} |
|
OpenLayers.Util.modifyDOMElement(dom, id, px, sz, position, |
|
border, overflow, opacity); |
|
|
|
return dom; |
|
}; |
|
|
|
/** |
|
* Function: createImage |
|
* Creates an img element with specific attribute values. |
|
* |
|
* Parameters: |
|
* id - {String} The id field for the img. If none assigned one will be |
|
* automatically generated. |
|
* px - {<OpenLayers.Pixel>} The left and top positions. |
|
* sz - {<OpenLayers.Size>} The style.width and style.height values. |
|
* imgURL - {String} The url to use as the image source. |
|
* position - {String} The style.position value. |
|
* border - {String} The border to place around the image. |
|
* opacity - {Float} Fractional value (0.0 - 1.0) |
|
* delayDisplay - {Boolean} If true waits until the image has been |
|
* loaded. |
|
* |
|
* Returns: |
|
* {DOMElement} A DOM Image created with the specified attributes. |
|
*/ |
|
OpenLayers.Util.createImage = function(id, px, sz, imgURL, position, border, |
|
opacity, delayDisplay) { |
|
|
|
var image = document.createElement("img"); |
|
|
|
//set generic properties |
|
if (!id) { |
|
id = OpenLayers.Util.createUniqueID("OpenLayersDiv"); |
|
} |
|
if (!position) { |
|
position = "relative"; |
|
} |
|
OpenLayers.Util.modifyDOMElement(image, id, px, sz, position, |
|
border, null, opacity); |
|
|
|
if(delayDisplay) { |
|
image.style.display = "none"; |
|
OpenLayers.Event.observe(image, "load", |
|
OpenLayers.Function.bind(OpenLayers.Util.onImageLoad, image)); |
|
OpenLayers.Event.observe(image, "error", |
|
OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError, image)); |
|
|
|
} |
|
|
|
//set special properties |
|
image.style.alt = id; |
|
image.galleryImg = "no"; |
|
if (imgURL) { |
|
image.src = imgURL; |
|
} |
|
|
|
|
|
|
|
return image; |
|
}; |
|
|
|
/** |
|
* Function: setOpacity |
|
* *Deprecated*. This function has been deprecated. Instead, please use |
|
* <OpenLayers.Util.modifyDOMElement> |
|
* or |
|
* <OpenLayers.Util.modifyAlphaImageDiv> |
|
* |
|
* Set the opacity of a DOM Element |
|
* Note that for this function to work in IE, elements must "have layout" |
|
* according to: |
|
* http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/haslayout.asp |
|
* |
|
* Parameters: |
|
* element - {DOMElement} Set the opacity on this DOM element |
|
* opacity - {Float} Opacity value (0.0 - 1.0) |
|
*/ |
|
OpenLayers.Util.setOpacity = function(element, opacity) { |
|
OpenLayers.Util.modifyDOMElement(element, null, null, null, |
|
null, null, null, opacity); |
|
}; |
|
|
|
/** |
|
* Function: onImageLoad |
|
* Bound to image load events. For all images created with <createImage> or |
|
* <createAlphaImageDiv>, this function will be bound to the load event. |
|
*/ |
|
OpenLayers.Util.onImageLoad = function() { |
|
// The complex check here is to solve issues described in #480. |
|
// Every time a map view changes, it increments the 'viewRequestID' |
|
// property. As the requests for the images for the new map view are sent |
|
// out, they are tagged with this unique viewRequestID. |
|
// |
|
// If an image has no viewRequestID property set, we display it regardless, |
|
// but if it does have a viewRequestID property, we check that it matches |
|
// the viewRequestID set on the map. |
|
// |
|
// If the viewRequestID on the map has changed, that means that the user |
|
// has changed the map view since this specific request was sent out, and |
|
// therefore this tile does not need to be displayed (so we do not execute |
|
// this code that turns its display on). |
|
// |
|
if (!this.viewRequestID || |
|
(this.map && this.viewRequestID == this.map.viewRequestID)) { |
|
this.style.display = ""; |
|
} |
|
OpenLayers.Element.removeClass(this, "olImageLoadError"); |
|
}; |
|
|
|
/** |
|
* Property: IMAGE_RELOAD_ATTEMPTS |
|
* {Integer} How many times should we try to reload an image before giving up? |
|
* Default is 0 |
|
*/ |
|
OpenLayers.IMAGE_RELOAD_ATTEMPTS = 0; |
|
|
|
/** |
|
* Function: onImageLoadError |
|
*/ |
|
OpenLayers.Util.onImageLoadError = function() { |
|
this._attempts = (this._attempts) ? (this._attempts + 1) : 1; |
|
if (this._attempts <= OpenLayers.IMAGE_RELOAD_ATTEMPTS) { |
|
var urls = this.urls; |
|