More trip planner testing with colors
[busui.git] / labs / openlayers / lib / OpenLayers / Feature.js
blob:a/labs/openlayers/lib/OpenLayers/Feature.js -> blob:b/labs/openlayers/lib/OpenLayers/Feature.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/Util.js
  * @requires OpenLayers/Marker.js
  * @requires OpenLayers/Popup/AnchoredBubble.js
  */
   
  /**
  * Class: OpenLayers.Feature
  * Features are combinations of geography and attributes. The OpenLayers.Feature
  * class specifically combines a marker and a lonlat.
  */
  OpenLayers.Feature = OpenLayers.Class({
   
  /**
  * Property: layer
  * {<OpenLayers.Layer>}
  */
  layer: null,
   
  /**
  * Property: id
  * {String}
  */
  id: null,
   
  /**
  * Property: lonlat
  * {<OpenLayers.LonLat>}
  */
  lonlat: null,
   
  /**
  * Property: data
  * {Object}
  */
  data: null,
   
  /**
  * Property: marker
  * {<OpenLayers.Marker>}
  */
  marker: null,
   
  /**
  * APIProperty: popupClass
  * {<OpenLayers.Class>} The class which will be used to instantiate
  * a new Popup. Default is <OpenLayers.Popup.AnchoredBubble>.
  */
  popupClass: OpenLayers.Popup.AnchoredBubble,
   
  /**
  * Property: popup
  * {<OpenLayers.Popup>}
  */
  popup: null,
   
  /**
  * Constructor: OpenLayers.Feature
  * Constructor for features.
  *
  * Parameters:
  * layer - {<OpenLayers.Layer>}
  * lonlat - {<OpenLayers.LonLat>}
  * data - {Object}
  *
  * Returns:
  * {<OpenLayers.Feature>}
  */
  initialize: function(layer, lonlat, data) {
  this.layer = layer;
  this.lonlat = lonlat;
  this.data = (data != null) ? data : {};
  this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
  },
   
  /**
  * Method: destroy
  * nullify references to prevent circular references and memory leaks
  */
  destroy: function() {
   
  //remove the popup from the map
  if ((this.layer != null) && (this.layer.map != null)) {
  if (this.popup != null) {
  this.layer.map.removePopup(this.popup);
  }
  }
  // remove the marker from the layer
  if (this.layer != null && this.marker != null) {
  this.layer.removeMarker(this.marker);
  }
   
  this.layer = null;
  this.id = null;
  this.lonlat = null;
  this.data = null;
  if (this.marker != null) {
  this.destroyMarker(this.marker);
  this.marker = null;
  }
  if (this.popup != null) {
  this.destroyPopup(this.popup);
  this.popup = null;
  }
  },
   
  /**
  * Method: onScreen
  *
  * Returns:
  * {Boolean} Whether or not the feature is currently visible on screen
  * (based on its 'lonlat' property)
  */
  onScreen:function() {
   
  var onScreen = false;
  if ((this.layer != null) && (this.layer.map != null)) {
  var screenBounds = this.layer.map.getExtent();
  onScreen = screenBounds.containsLonLat(this.lonlat);
  }
  return onScreen;
  },
   
   
  /**
  * Method: createMarker
  * Based on the data associated with the Feature, create and return a marker object.
  *
  * Returns:
  * {<OpenLayers.Marker>} A Marker Object created from the 'lonlat' and 'icon' properties
  * set in this.data. If no 'lonlat' is set, returns null. If no
  * 'icon' is set, OpenLayers.Marker() will load the default image.
  *
  * Note - this.marker is set to return value
  *
  */
  createMarker: function() {
   
  if (this.lonlat != null) {
  this.marker = new OpenLayers.Marker(this.lonlat, this.data.icon);
  }
  return this.marker;
  },
   
  /**
  * Method: destroyMarker
  * Destroys marker.
  * If user overrides the createMarker() function, s/he should be able
  * to also specify an alternative function for destroying it
  */
  destroyMarker: function() {
  this.marker.destroy();
  },
   
  /**
  * Method: createPopup
  * Creates a popup object created from the 'lonlat', 'popupSize',
  * and 'popupContentHTML' properties set in this.data. It uses
  * this.marker.icon as default anchor.
  *
  * If no 'lonlat' is set, returns null.
  * If no this.marker has been created, no anchor is sent.
  *
  * Note - the returned popup object is 'owned' by the feature, so you
  * cannot use the popup's destroy method to discard the popup.
  * Instead, you must use the feature's destroyPopup
  *
  * Note - this.popup is set to return value
  *
  * Parameters:
  * closeBox - {Boolean} create popup with closebox or not
  *
  * Returns:
  * {<OpenLayers.Popup>} Returns the created popup, which is also set
  * as 'popup' property of this feature. Will be of whatever type
  * specified by this feature's 'popupClass' property, but must be
  * of type <OpenLayers.Popup>.
  *
  */
  createPopup: function(closeBox) {
   
  if (this.lonlat != null) {
   
  var id = this.id + "_popup";
  var anchor = (this.marker) ? this.marker.icon : null;
   
  if (!this.popup) {
  this.popup = new this.popupClass(id,
  this.lonlat,
  this.data.popupSize,
  this.data.popupContentHTML,
  anchor,
  closeBox);
  }
  if (this.data.overflow != null) {
  this.popup.contentDiv.style.overflow = this.data.overflow;
  }
   
  this.popup.feature = this;
  }
  return this.popup;
  },
   
   
  /**
  * Method: destroyPopup
  * Destroys the popup created via createPopup.
  *
  * As with the marker, if user overrides the createPopup() function, s/he
  * should also be able to override the destruction
  */
  destroyPopup: function() {
  if (this.popup) {
  this.popup.feature = null;
  this.popup.destroy();
  this.popup = null;
  }
  },
   
  CLASS_NAME: "OpenLayers.Feature"
  });