/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full * text of the license. */ OpenLayers.Events = Class.create(); OpenLayers.Events.prototype = { // Array: supported events BROWSER_EVENTS: [ "mouseover", "mouseout", "mousedown", "mouseup", "mousemove", "click", "dblclick", "resize", "focus", "blur" ], // hash of Array(Function): events listener functions listeners: null, // Object: the code object issuing application events object: null, // DOMElement: the DOM element receiving browser events div: null, // Array: list of support application events eventTypes: null, /** * @param {OpenLayers.Map} map * @param {DOMElement} div */ initialize: function (object, div, eventTypes) { this.listeners = {}; this.object = object; this.div = div; this.eventTypes = eventTypes; if (eventTypes) { for (var i = 0; i < this.eventTypes.length; i++) { // create a listener list for every custom application event this.listeners[ this.eventTypes[i] ] = []; } } for (var i = 0; i < this.BROWSER_EVENTS.length; i++) { var eventType = this.BROWSER_EVENTS[i]; // every browser event has a corresponding application event // (whether it's listened for or not). this.listeners[ eventType ] = []; Event.observe(div, eventType, this.handleBrowserEvent.bindAsEventListener(this)); } // disable dragstart in IE so that mousedown/move/up works normally Event.observe(div, "dragstart", Event.stop); }, /** * @param {str} type * @param {Object} obj * @param {Function} func */ register: function (type, obj, func) { if (func == null) { obj = this.object; func = obj; } var listeners = this.listeners[type]; listeners.push( {obj: obj, func: func} ); }, unregister: function (type, obj, func) { var listeners = this.listeners[type]; for (var i = 0; i < listeners.length; i++) { if (listeners[i].obj == obj && listeners[i].type == type) { listeners.splice(i, 1); break; } } }, remove: function(type) { this.listeners[type].pop(); }, /** * @param {event} evt */ handleBrowserEvent: function (evt) { evt.xy = this.getMousePosition(evt); this.triggerEvent(evt.type, evt) }, /** * @param {event} evt * * @return {OpenLayers.Pixel} */ getMousePosition: function (evt) { if (!this.div.offsets) { this.div.offsets = Position.page(this.div); } return new OpenLayers.Pixel( evt.clientX - this.div.offsets[0], evt.clientY - this.div.offsets[1]); }, /** * @param {str} type * @param {event} evt */ triggerEvent: function (type, evt) { if (evt == null) { evt = {}; } evt.object = this.object; evt.div = this.div; var listeners = this.listeners[type]; for (var i = 0; i < listeners.length; i++) { var callback = listeners[i]; var continueChain = callback.func.call(callback.obj, evt); if (continueChain != null && !continueChain) break; } } };