More trip planner testing with colors
[busui.git] / labs / openlayers / lib / OpenLayers / Util.js
blob:a/labs/openlayers/lib/OpenLayers/Util.js -> blob:b/labs/openlayers/lib/OpenLayers/Util.js
  /* 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;