More trip planner testing with colors
[busui.git] / labs / openlayers / lib / OpenLayers / Tile / Image / IFrame.js
blob:a/labs/openlayers/lib/OpenLayers/Tile/Image/IFrame.js -> blob:b/labs/openlayers/lib/OpenLayers/Tile/Image/IFrame.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/Tile/Image.js
  */
   
  /**
  * Class: OpenLayers.Tile.Image.IFrame
  * Instances of OpenLayers.Tile.Image.IFrame are used to manage the image tiles
  * used by Layer.WMS.Post loaded via HTTP-POST-protocol. Create a new image
  * tile with the <OpenLayers.Tile.Image.IFrame> constructor.
  *
  * Inherits from:
  * - <OpenLayers.Tile.Image>
  */
  OpenLayers.Tile.Image.IFrame = OpenLayers.Class(OpenLayers.Tile.Image, {
   
  /**
  * Property: layerAlphaHack
  * {Boolean} Always false for an instance.
  */
   
  /**
  * Constructor: OpenLayers.Tile.Image.IFrame
  * Constructor for a new <OpenLayers.Tile.Image.IFrame> instance.
  *
  * Parameters:
  * layer - {<OpenLayers.Layer>} layer that the tile will go in.
  * position - {<OpenLayers.Pixel>}
  * bounds - {<OpenLayers.Bounds>}
  * size - {<OpenLayers.Size>}
  */
  initialize: function(layer, position, bounds, url, size) {
  OpenLayers.Tile.Image.prototype.initialize.apply(this, arguments);
  this.layerAlphaHack = false;
  },
   
  /**
  * Method: destroy
  * nullify references to prevent circular references and memory leaks
  */
  destroy: function() {
  if(this.imgDiv != null) {
  // unregister the "load" handler
  OpenLayers.Event.stopObservingElement(this.imgDiv.firstChild);
  }
  OpenLayers.Tile.Image.prototype.destroy.apply(this, arguments);
  },
   
  /**
  * Method: clear
  * Removes the iframe from DOM (avoids back-button problems).
  */
  clear: function() {
  if(this.imgDiv) {
  var iFrame = this.imgDiv.firstChild;
  OpenLayers.Event.stopObservingElement(iFrame);
  this.imgDiv.removeChild(iFrame);
  }
  },
   
  /**
  * Method: clone
  *
  * Parameters:
  * obj - {<OpenLayers.Tile.Image.IFrame>} The tile to be cloned
  *
  * Returns:
  * {<OpenLayers.Tile.Image.IFrame>} An exact clone of this
  * <OpenLayers.Tile.Image.IFrame>
  */
  clone: function (obj) {
  if (obj == null) {
  obj = new OpenLayers.Tile.Image.IFrame(
  this.layer, this.position, this.bounds, this.url, this.size);
  }
   
  //pick up properties from superclass
  obj = OpenLayers.Tile.Image.prototype.clone.apply(this, [obj]);
   
  return obj;
  },
   
  /**
  * Method: renderTile
  */
  renderTile: function() {
  if(OpenLayers.Tile.Image.prototype.renderTile.apply(this, arguments)) {
  // create a html form and add it temporary to the layer div
  var form = this.createRequestForm();
  this.imgDiv.appendChild(form);
   
  // submit the form (means fetching the image)
  form.submit();
  this.imgDiv.removeChild(form);
  }
  },
   
  /**
  * Method: initImgDiv
  * Creates the imgDiv property on the tile.
  */
  initImgDiv: function() {
  this.imgDiv = this.createImgDiv();
   
  OpenLayers.Util.modifyDOMElement(this.imgDiv, this.id, null,
  this.layer.getImageSize(), "relative");
  this.imgDiv.className = 'olTileImage';
   
  this.frame.appendChild(this.imgDiv);
  this.layer.div.appendChild(this.frame);
   
  if(this.layer.opacity != null) {
   
  OpenLayers.Util.modifyDOMElement(this.imgDiv, null, null, null,
  null, null, null,
  this.layer.opacity);
  }
   
  // we need this reference to check back the viewRequestID
  this.imgDiv.map = this.layer.map;
  },
   
  /**
  * Method: createImgDiv
  * Creates a div with iframe.and eventPane
  *
  * Returns:
  * {DOMElement}
  */
  createImgDiv: function() {
  var eventPane = document.createElement("div");
   
  if(OpenLayers.Util.getBrowserName() == "msie") {
  // IE cannot handle events on elements without backgroundcolor. So we
  // use this little hack to make elements transparent
  eventPane.style.backgroundColor = '#FFFFFF';
  eventPane.style.filter = 'chroma(color=#FFFFFF)';
  }
   
  OpenLayers.Util.modifyDOMElement(eventPane, null,
  new OpenLayers.Pixel(0,0), this.layer.getImageSize(), "absolute");
   
  var imgDiv = document.createElement("div");
  imgDiv.appendChild(eventPane);
  return imgDiv;
  },
   
  /**
  * Method: createIFrame
  * Create the IFrame which shows the image.
  *
  * Returns:
  * {DOMElement} Iframe
  */
  createIFrame: function() {
  var id = this.id+'_iFrame';
  var iframe;
  if(OpenLayers.Util.getBrowserName() == "msie") {
  // InternetExplorer does not set the name attribute of an iFrame
  // properly via DOM manipulation, so we need to do it on our own with
  // this hack.
  iframe = document.createElement('<iframe name="'+id+'">');
   
  // IFrames in InternetExplorer are not transparent, if you set the
  // backgroundColor transparent. This is a workarround to get
  // transparent iframes.
  iframe.style.backgroundColor = '#FFFFFF';
  iframe.style.filter = 'chroma(color=#FFFFFF)';
  }
  else {
  iframe = document.createElement('iframe');
  iframe.style.backgroundColor = 'transparent';
   
  // iframe.name needs to be an unique id, otherwise it
  // could happen that other iframes are overwritten.
  iframe.name = id;
  }
  iframe.id = id;
   
  // some special properties to avoid scaling the images and scrollbars
  // in the iframe
  iframe.scrolling = 'no';
  iframe.marginWidth = '0px';
  iframe.marginHeight = '0px';
  iframe.frameBorder = '0';
   
  OpenLayers.Util.modifyDOMElement(iframe, id,
  new OpenLayers.Pixel(0,0), this.layer.getImageSize(), "absolute");
   
  //bind a listener to the onload of the iframe so that we
  // can register when a tile has finished loading.
  var onload = function() {
  this.show();
  //normally isLoading should always be true here but there are some
  // right funky conditions where loading and then reloading a tile
  // with the same url *really*fast*. this check prevents sending
  // a 'loadend' if the msg has already been sent
  //
  if (this.isLoading) {
  this.isLoading = false;
  this.events.triggerEvent("loadend");
  }
  };
  OpenLayers.Event.observe(iframe, 'load',
  OpenLayers.Function.bind(onload, this));
   
  return iframe;
  },
   
  /**
  * Method: createRequestForm
  * Create the html <form> element with width, height, bbox and all
  * parameters specified in the layer params.
  *
  * Returns:
  * {DOMElement} The form element which sends the HTTP-POST request to the
  * WMS.
  */
  createRequestForm: function() {
  // creation of the form element
  var form = document.createElement('form');
  form.method = 'POST';
  var cacheId = this.layer.params["_OLSALT"];
  cacheId = (cacheId ? cacheId + "_" : "") + this.bounds.toBBOX();
  form.action = OpenLayers.Util.urlAppend(this.layer.url, cacheId);
   
  // insert the iframe, which has been removed to avoid back-button
  // problems
  this.imgDiv.insertBefore(this.createIFrame(), this.imgDiv.firstChild);
   
  form.target = this.id+'_iFrame';
   
  // adding all parameters in layer params as hidden fields to the html
  // form element
  var imageSize = this.layer.getImageSize();
  var params = OpenLayers.Util.extend(
  {
  "BBOX": this.encodeBBOX ? this.bounds.toBBOX() :
  this.bounds.toArray(),
  "WIDTH": imageSize.w,
  "HEIGHT": imageSize.h
  }, this.layer.params);
   
  for(var par in params) {
  var field = document.createElement('input');
  field.type = 'hidden';
  field.name = par;
  field.value = params[par];
  form.appendChild(field);
  }
   
  return form;
  },
   
  CLASS_NAME: "OpenLayers.Tile.Image.IFrame"
  }
  );