More trip planner testing with colors
[busui.git] / labs / openlayers / lib / OpenLayers / Layer / HTTPRequest.js
blob:a/labs/openlayers/lib/OpenLayers/Layer/HTTPRequest.js -> blob:b/labs/openlayers/lib/OpenLayers/Layer/HTTPRequest.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/Layer.js
  */
   
  /**
  * Class: OpenLayers.Layer.HTTPRequest
  *
  * Inherits from:
  * - <OpenLayers.Layer>
  */
  OpenLayers.Layer.HTTPRequest = OpenLayers.Class(OpenLayers.Layer, {
   
  /**
  * Constant: URL_HASH_FACTOR
  * {Float} Used to hash URL param strings for multi-WMS server selection.
  * Set to the Golden Ratio per Knuth's recommendation.
  */
  URL_HASH_FACTOR: (Math.sqrt(5) - 1) / 2,
   
  /**
  * Property: url
  * {Array(String) or String} This is either an array of url strings or
  * a single url string.
  */
  url: null,
   
  /**
  * Property: params
  * {Object} Hashtable of key/value parameters
  */
  params: null,
   
  /**
  * APIProperty: reproject
  * *Deprecated*. See http://trac.openlayers.org/wiki/SpatialMercator
  * for information on the replacement for this functionality.
  * {Boolean} Whether layer should reproject itself based on base layer
  * locations. This allows reprojection onto commercial layers.
  * Default is false: Most layers can't reproject, but layers
  * which can create non-square geographic pixels can, like WMS.
  *
  */
  reproject: false,
   
  /**
  * Constructor: OpenLayers.Layer.HTTPRequest
  *
  * Parameters:
  * name - {String}
  * url - {Array(String) or String}
  * params - {Object}
  * options - {Object} Hashtable of extra options to tag onto the layer
  */
  initialize: function(name, url, params, options) {
  var newArguments = arguments;
  newArguments = [name, options];
  OpenLayers.Layer.prototype.initialize.apply(this, newArguments);
  this.url = url;
  this.params = OpenLayers.Util.extend( {}, params);
  },
   
  /**
  * APIMethod: destroy
  */
  destroy: function() {
  this.url = null;
  this.params = null;
  OpenLayers.Layer.prototype.destroy.apply(this, arguments);
  },
   
  /**
  * APIMethod: clone
  *
  * Parameters:
  * obj - {Object}
  *
  * Returns:
  * {<OpenLayers.Layer.HTTPRequest>} An exact clone of this
  * <OpenLayers.Layer.HTTPRequest>
  */
  clone: function (obj) {
   
  if (obj == null) {
  obj = new OpenLayers.Layer.HTTPRequest(this.name,
  this.url,
  this.params,
  this.getOptions());
  }
   
  //get all additions from superclasses
  obj = OpenLayers.Layer.prototype.clone.apply(this, [obj]);
   
  // copy/set any non-init, non-simple values here
   
  return obj;
  },
   
  /**
  * APIMethod: setUrl
  *
  * Parameters:
  * newUrl - {String}
  */
  setUrl: function(newUrl) {
  this.url = newUrl;
  },
   
  /**
  * APIMethod: mergeNewParams
  *
  * Parameters:
  * newParams - {Object}
  *
  * Returns:
  * redrawn: {Boolean} whether the layer was actually redrawn.
  */
  mergeNewParams:function(newParams) {
  this.params = OpenLayers.Util.extend(this.params, newParams);
  var ret = this.redraw();
  if(this.map != null) {
  this.map.events.triggerEvent("changelayer", {
  layer: this,
  property: "params"
  });
  }
  return ret;
  },
   
  /**
  * APIMethod: redraw
  * Redraws the layer. Returns true if the layer was redrawn, false if not.
  *
  * Parameters:
  * force - {Boolean} Force redraw by adding random parameter.
  *
  * Returns:
  * {Boolean} The layer was redrawn.
  */
  redraw: function(force) {
  if (force) {
  return this.mergeNewParams({"_olSalt": Math.random()});
  } else {
  return OpenLayers.Layer.prototype.redraw.apply(this, []);
  }
  },
   
  /**
  * Method: selectUrl
  * selectUrl() implements the standard floating-point multiplicative
  * hash function described by Knuth, and hashes the contents of the
  * given param string into a float between 0 and 1. This float is then
  * scaled to the size of the provided urls array, and used to select
  * a URL.
  *
  * Parameters:
  * paramString - {String}
  * urls - {Array(String)}
  *
  * Returns:
  * {String} An entry from the urls array, deterministically selected based
  * on the paramString.
  */
  selectUrl: function(paramString, urls) {
  var product = 1;
  for (var i=0, len=paramString.length; i<len; i++) {
  product *= paramString.charCodeAt(i) * this.URL_HASH_FACTOR;
  product -= Math.floor(product);
  }
  return urls[Math.floor(product * urls.length)];
  },
   
  /**
  * Method: getFullRequestString
  * Combine url with layer's params and these newParams.
  *
  * does checking on the serverPath variable, allowing for cases when it
  * is supplied with trailing ? or &, as well as cases where not.
  *
  * return in formatted string like this:
  * "server?key1=value1&key2=value2&key3=value3"
  *
  * WARNING: The altUrl parameter is deprecated and will be removed in 3.0.
  *
  * Parameters:
  * newParams - {Object}
  * altUrl - {String} Use this as the url instead of the layer's url
  *
  * Returns:
  * {String}
  */
  getFullRequestString:function(newParams, altUrl) {
   
  // if not altUrl passed in, use layer's url
  var url = altUrl || this.url;
   
  // create a new params hashtable with all the layer params and the
  // new params together. then convert to string
  var allParams = OpenLayers.Util.extend({}, this.params);
  allParams = OpenLayers.Util.extend(allParams, newParams);
  var paramsString = OpenLayers.Util.getParameterString(allParams);
   
  // if url is not a string, it should be an array of strings,
  // in which case we will deterministically select one of them in
  // order to evenly distribute requests to different urls.
  //
  if (url instanceof Array) {
  url = this.selectUrl(paramsString, url);
  }
   
  // ignore parameters that are already in the url search string
  var urlParams =
  OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(url));
  for(var key in allParams) {
  if(key.toUpperCase() in urlParams) {
  delete allParams[key];
  }
  }
  paramsString = OpenLayers.Util.getParameterString(allParams);
   
  return OpenLayers.Util.urlAppend(url, paramsString);
  },
   
  CLASS_NAME: "OpenLayers.Layer.HTTPRequest"
  });