More trip planner testing with colors
[busui.git] / labs / openlayers / lib / OpenLayers / Handler / Hover.js
blob:a/labs/openlayers/lib/OpenLayers/Handler/Hover.js -> blob:b/labs/openlayers/lib/OpenLayers/Handler/Hover.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/Handler.js
  */
   
  /**
  * Class: OpenLayers.Handler.Hover
  * The hover handler is to be used to emulate mouseovers on objects
  * on the map that aren't DOM elements. For example one can use
  * this handler to send WMS/GetFeatureInfo requests as the user
  * moves the mouve over the map.
  *
  * Inherits from:
  * - <OpenLayers.Handler>
  */
  OpenLayers.Handler.Hover = OpenLayers.Class(OpenLayers.Handler, {
   
  /**
  * APIProperty: delay
  * {Integer} - Number of milliseconds between mousemoves before
  * the event is considered a hover. Default is 500.
  */
  delay: 500,
   
  /**
  * APIProperty: pixelTolerance
  * {Integer} - Maximum number of pixels between mousemoves for
  * an event to be considered a hover. Default is null.
  */
  pixelTolerance: null,
   
  /**
  * APIProperty: stopMove
  * {Boolean} - Stop other listeners from being notified on mousemoves.
  * Default is false.
  */
  stopMove: false,
   
  /**
  * Property: px
  * {<OpenLayers.Pixel>} - The location of the last mousemove, expressed
  * in pixels.
  */
  px: null,
   
  /**
  * Property: timerId
  * {Number} - The id of the timer.
  */
  timerId: null,
   
  /**
  * Constructor: OpenLayers.Handler.Hover
  * Construct a hover handler.
  *
  * Parameters:
  * control - {<OpenLayers.Control>} The control that initialized this
  * handler. The control is assumed to have a valid map property; that
  * map is used in the handler's own setMap method.
  * callbacks - {Object} An object with keys corresponding to callbacks
  * that will be called by the handler. The callbacks should
  * expect to receive a single argument, the event. Callbacks for
  * 'move', the mouse is moving, and 'pause', the mouse is pausing,
  * are supported.
  * options - {Object} An optional object whose properties will be set on
  * the handler.
  */
  initialize: function(control, callbacks, options) {
  OpenLayers.Handler.prototype.initialize.apply(this, arguments);
  },
   
  /**
  * Method: mousemove
  * Called when the mouse moves on the map.
  *
  * Parameters:
  * evt - {<OpenLayers.Event>}
  *
  * Returns:
  * {Boolean} Continue propagating this event.
  */
  mousemove: function(evt) {
  if(this.passesTolerance(evt.xy)) {
  this.clearTimer();
  this.callback('move', [evt]);
  this.px = evt.xy;
  // clone the evt so original properties can be accessed even
  // if the browser deletes them during the delay
  evt = OpenLayers.Util.extend({}, evt);
  this.timerId = window.setTimeout(
  OpenLayers.Function.bind(this.delayedCall, this, evt),
  this.delay
  );
  }
  return !this.stopMove;
  },
   
  /**
  * Method: mouseout
  * Called when the mouse goes out of the map.
  *
  * Parameters:
  * evt - {<OpenLayers.Event>}
  *
  * Returns:
  * {Boolean} Continue propagating this event.
  */
  mouseout: function(evt) {
  if (OpenLayers.Util.mouseLeft(evt, this.map.div)) {
  this.clearTimer();
  this.callback('move', [evt]);
  }
  return true;
  },
   
  /**
  * Method: passesTolerance
  * Determine whether the mouse move is within the optional pixel tolerance.
  *
  * Parameters:
  * px - {<OpenLayers.Pixel>}
  *
  * Returns:
  * {Boolean} The mouse move is within the pixel tolerance.
  */
  passesTolerance: function(px) {
  var passes = true;
  if(this.pixelTolerance && this.px) {
  var dpx = Math.sqrt(
  Math.pow(this.px.x - px.x, 2) +
  Math.pow(this.px.y - px.y, 2)
  );
  if(dpx < this.pixelTolerance) {
  passes = false;
  }
  }
  return passes;
  },
   
  /**
  * Method: clearTimer
  * Clear the timer and set <timerId> to null.
  */
  clearTimer: function() {
  if(this.timerId != null) {
  window.clearTimeout(this.timerId);
  this.timerId = null;
  }
  },
   
  /**
  * Method: delayedCall
  * Triggers pause callback.
  *
  * Parameters:
  * evt - {<OpenLayers.Event>}
  */
  delayedCall: function(evt) {
  this.callback('pause', [evt]);
  },
   
  /**
  * APIMethod: deactivate
  * Deactivate the handler.
  *
  * Returns:
  * {Boolean} The handler was successfully deactivated.
  */
  deactivate: function() {
  var deactivated = false;
  if(OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
  this.clearTimer();
  deactivated = true;
  }
  return deactivated;
  },
   
  CLASS_NAME: "OpenLayers.Handler.Hover"
  });