More trip planner testing with colors
[busui.git] / labs / openlayers / lib / OpenLayers / Control / MouseDefaults.js
blob:a/labs/openlayers/lib/OpenLayers/Control/MouseDefaults.js -> blob:b/labs/openlayers/lib/OpenLayers/Control/MouseDefaults.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/Control.js
  */
   
  /**
  * Class: OpenLayers.Control.MouseDefaults
  * This class is DEPRECATED in 2.4 and will be removed by 3.0.
  * If you need this functionality, use <OpenLayers.Control.Navigation>
  * instead!!!
  *
  * This class is DEPRECATED in 2.4 and will be removed by 3.0.
  * If you need this functionality, use Control.Navigation instead!!!
  *
  * Inherits from:
  * - <OpenLayers.Control>
  */
  OpenLayers.Control.MouseDefaults = OpenLayers.Class(OpenLayers.Control, {
   
  /** WARNING WARNING WARNING!!!
  This class is DEPRECATED in 2.4 and will be removed by 3.0.
  If you need this functionality, use Control.Navigation instead!!! */
   
  /**
  * Property: performedDrag
  * {Boolean}
  */
  performedDrag: false,
   
  /**
  * Property: wheelObserver
  * {Function}
  */
  wheelObserver: null,
   
  /**
  * Constructor: OpenLayers.Control.MouseDefaults
  */
  initialize: function() {
  OpenLayers.Control.prototype.initialize.apply(this, arguments);
  },
   
  /**
  * APIMethod: destroy
  */
  destroy: function() {
   
  if (this.handler) {
  this.handler.destroy();
  }
  this.handler = null;
   
  this.map.events.un({
  "click": this.defaultClick,
  "dblclick": this.defaultDblClick,
  "mousedown": this.defaultMouseDown,
  "mouseup": this.defaultMouseUp,
  "mousemove": this.defaultMouseMove,
  "mouseout": this.defaultMouseOut,
  scope: this
  });
   
  //unregister mousewheel events specifically on the window and document
  OpenLayers.Event.stopObserving(window, "DOMMouseScroll",
  this.wheelObserver);
  OpenLayers.Event.stopObserving(window, "mousewheel",
  this.wheelObserver);
  OpenLayers.Event.stopObserving(document, "mousewheel",
  this.wheelObserver);
  this.wheelObserver = null;
   
  OpenLayers.Control.prototype.destroy.apply(this, arguments);
  },
   
  /**
  * Method: draw
  */
  draw: function() {
  this.map.events.on({
  "click": this.defaultClick,
  "dblclick": this.defaultDblClick,
  "mousedown": this.defaultMouseDown,
  "mouseup": this.defaultMouseUp,
  "mousemove": this.defaultMouseMove,
  "mouseout": this.defaultMouseOut,
  scope: this
  });
   
  this.registerWheelEvents();
   
  },
   
  /**
  * Method: registerWheelEvents
  */
  registerWheelEvents: function() {
   
  this.wheelObserver = OpenLayers.Function.bindAsEventListener(
  this.onWheelEvent, this
  );
   
  //register mousewheel events specifically on the window and document
  OpenLayers.Event.observe(window, "DOMMouseScroll", this.wheelObserver);
  OpenLayers.Event.observe(window, "mousewheel", this.wheelObserver);
  OpenLayers.Event.observe(document, "mousewheel", this.wheelObserver);
  },
   
  /**
  * Method: defaultClick
  *
  * Parameters:
  * evt - {Event}
  *
  * Returns:
  * {Boolean}
  */
  defaultClick: function (evt) {
  if (!OpenLayers.Event.isLeftClick(evt)) {
  return;
  }
  var notAfterDrag = !this.performedDrag;
  this.performedDrag = false;
  return notAfterDrag;
  },
   
  /**
  * Method: defaultDblClick
  *
  * Parameters:
  * evt - {Event}
  */
  defaultDblClick: function (evt) {
  var newCenter = this.map.getLonLatFromViewPortPx( evt.xy );
  this.map.setCenter(newCenter, this.map.zoom + 1);
  OpenLayers.Event.stop(evt);
  return false;
  },
   
  /**
  * Method: defaultMouseDown
  *
  * Parameters:
  * evt - {Event}
  */
  defaultMouseDown: function (evt) {
  if (!OpenLayers.Event.isLeftClick(evt)) {
  return;
  }
  this.mouseDragStart = evt.xy.clone();
  this.performedDrag = false;
  if (evt.shiftKey) {
  this.map.div.style.cursor = "crosshair";
  this.zoomBox = OpenLayers.Util.createDiv('zoomBox',
  this.mouseDragStart,
  null,
  null,
  "absolute",
  "2px solid red");
  this.zoomBox.style.backgroundColor = "white";
  this.zoomBox.style.filter = "alpha(opacity=50)"; // IE
  this.zoomBox.style.opacity = "0.50";
  this.zoomBox.style.fontSize = "1px";
  this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
  this.map.viewPortDiv.appendChild(this.zoomBox);
  }
  document.onselectstart = OpenLayers.Function.False;
  OpenLayers.Event.stop(evt);
  },
   
  /**
  * Method: defaultMouseMove
  *
  * Parameters:
  * evt - {Event}
  */
  defaultMouseMove: function (evt) {
  // record the mouse position, used in onWheelEvent
  this.mousePosition = evt.xy.clone();
   
  if (this.mouseDragStart != null) {
  if (this.zoomBox) {
  var deltaX = Math.abs(this.mouseDragStart.x - evt.xy.x);
  var deltaY = Math.abs(this.mouseDragStart.y - evt.xy.y);
  this.zoomBox.style.width = Math.max(1, deltaX) + "px";
  this.zoomBox.style.height = Math.max(1, deltaY) + "px";
  if (evt.xy.x < this.mouseDragStart.x) {
  this.zoomBox.style.left = evt.xy.x+"px";
  }
  if (evt.xy.y < this.mouseDragStart.y) {
  this.zoomBox.style.top = evt.xy.y+"px";
  }
  } else {
  var deltaX = this.mouseDragStart.x - evt.xy.x;
  var deltaY = this.mouseDragStart.y - evt.xy.y;
  var size = this.map.getSize();
  var newXY = new OpenLayers.Pixel(size.w / 2 + deltaX,
  size.h / 2 + deltaY);
  var newCenter = this.map.getLonLatFromViewPortPx( newXY );
  this.map.setCenter(newCenter, null, true);
  this.mouseDragStart = evt.xy.clone();
  this.map.div.style.cursor = "move";
  }
  this.performedDrag = true;
  }
  },
   
  /**
  * Method: defaultMouseUp
  *
  * Parameters:
  * evt - {<OpenLayers.Event>}
  */
  defaultMouseUp: function (evt) {
  if (!OpenLayers.Event.isLeftClick(evt)) {
  return;
  }
  if (this.zoomBox) {
  this.zoomBoxEnd(evt);
  } else {
  if (this.performedDrag) {
  this.map.setCenter(this.map.center);
  }
  }
  document.onselectstart=null;
  this.mouseDragStart = null;
  this.map.div.style.cursor = "";
  },
   
  /**
  * Method: defaultMouseOut
  *
  * Parameters:
  * evt - {Event}
  */
  defaultMouseOut: function (evt) {
  if (this.mouseDragStart != null &&
  OpenLayers.Util.mouseLeft(evt, this.map.div)) {
  if (this.zoomBox) {
  this.removeZoomBox();
  }
  this.mouseDragStart = null;
  }
  },
   
   
  /**
  * Method: defaultWheelUp
  * User spun scroll wheel up
  *
  */
  defaultWheelUp: function(evt) {
  if (this.map.getZoom() <= this.map.getNumZoomLevels()) {
  this.map.setCenter(this.map.getLonLatFromPixel(evt.xy),
  this.map.getZoom() + 1);
  }
  },
   
  /**
  * Method: defaultWheelDown
  * User spun scroll wheel down
  */
  defaultWheelDown: function(evt) {
  if (this.map.getZoom() > 0) {
  this.map.setCenter(this.map.getLonLatFromPixel(evt.xy),
  this.map.getZoom() - 1);
  }
  },
   
  /**
  * Method: zoomBoxEnd
  * Zoombox function.
  */
  zoomBoxEnd: function(evt) {
  if (this.mouseDragStart != null) {
  if (Math.abs(this.mouseDragStart.x - evt.xy.x) > 5 ||
  Math.abs(this.mouseDragStart.y - evt.xy.y) > 5) {
  var start = this.map.getLonLatFromViewPortPx( this.mouseDragStart );
  var end = this.map.getLonLatFromViewPortPx( evt.xy );
  var top = Math.max(start.lat, end.lat);
  var bottom = Math.min(start.lat, end.lat);
  var left = Math.min(start.lon, end.lon);
  var right = Math.max(start.lon, end.lon);
  var bounds = new OpenLayers.Bounds(left, bottom, right, top);
  this.map.zoomToExtent(bounds);
  } else {
  var end = this.map.getLonLatFromViewPortPx( evt.xy );
  this.map.setCenter(new OpenLayers.LonLat(
  (end.lon),
  (end.lat)
  ), this.map.getZoom() + 1);
  }
  this.removeZoomBox();
  }
  },
   
  /**
  * Method: removeZoomBox
  * Remove the zoombox from the screen and nullify our reference to it.
  */
  removeZoomBox: function() {
  this.map.viewPortDiv.removeChild(this.zoomBox);
  this.zoomBox = null;
  },
   
   
  /**
  * Mouse ScrollWheel code thanks to http://adomas.org/javascript-mouse-wheel/
  */
   
   
  /**
  * Method: onWheelEvent
  * Catch the wheel event and handle it xbrowserly
  *
  * Parameters:
  * e - {Event}
  */
  onWheelEvent: function(e){
   
  // first determine whether or not the wheeling was inside the map
  var inMap = false;
  var elem = OpenLayers.Event.element(e);
  while(elem != null) {
  if (this.map && elem == this.map.div) {
  inMap = true;
  break;
  }
  elem = elem.parentNode;
  }
   
  if (inMap) {
   
  var delta = 0;
  if (!e) {
  e = window.event;
  }
  if (e.wheelDelta) {
  delta = e.wheelDelta/120;
  if (window.opera && window.opera.version() < 9.2) {
  delta = -delta;
  }
  } else if (e.detail) {
  delta = -e.detail / 3;
  }
  if (delta) {
  // add the mouse position to the event because mozilla has a bug
  // with clientX and clientY (see https://bugzilla.mozilla.org/show_bug.cgi?id=352179)
  // getLonLatFromViewPortPx(e) returns wrong values
  e.xy = this.mousePosition;
   
  if (delta < 0) {
  this.defaultWheelDown(e);
  } else {
  this.defaultWheelUp(e);
  }
  }
   
  //only wheel the map, not the window
  OpenLayers.Event.stop(e);
  }
  },
   
  CLASS_NAME: "OpenLayers.Control.MouseDefaults"
  });