text: /*
   * Extends the event handling code with double tap support for mobile browsers.
   */
  
  L.extend(L.DomEvent, {
  
  	_touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',
  	_touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',
  
  	// inspired by Zepto touch code by Thomas Fuchs
  	addDoubleTapListener: function (obj, handler, id) {
  		var last, touch,
  		    doubleTap = false,
  		    delay = 250;
  
  		function onTouchStart(e) {
  			var count;
  
  			if (L.Browser.pointer) {
  				count = L.DomEvent._pointersCount;
  			} else {
  				count = e.touches.length;
  			}
  
  			if (count > 1) { return; }
  
  			var now = Date.now(),
  			    delta = now - (last || now);
  
  			touch = e.touches ? e.touches[0] : e;
  			doubleTap = (delta > 0 && delta <= delay);
  			last = now;
  		}
  
  		function onTouchEnd() {
  			if (doubleTap) {
  				if (L.Browser.pointer) {
  					// work around .type being readonly with MSPointer* events
  					var newTouch = {},
  						prop, i;
  
  					for (i in touch) {
  						prop = touch[i];
  						newTouch[i] = prop && prop.bind ? prop.bind(touch) : prop;
  					}
  					touch = newTouch;
  				}
  				touch.type = 'dblclick';
  				handler(touch);
  				last = null;
  			}
  		}
  
  		var pre = '_leaflet_',
  		    touchstart = this._touchstart,
  		    touchend = this._touchend;
  
  		obj[pre + touchstart + id] = onTouchStart;
  		obj[pre + touchend + id] = onTouchEnd;
  
  		obj.addEventListener(touchstart, onTouchStart, false);
  		obj.addEventListener(touchend, onTouchEnd, false);
  		return this;
  	},
  
  	removeDoubleTapListener: function (obj, id) {
  		var pre = '_leaflet_',
  		    touchend = obj[pre + this._touchend + id];
  
  		obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false);
  		obj.removeEventListener(this._touchend, touchend, false);
  
  		return this;
  	}
  });
  