L.Evented.addInitHook( function () {
    this._singleClickTimeout = null;
    this.on( 'click', this._scheduleSingleClick, this );
    this.on( 'dbclick dragstart zoomstart', this._cancelSingleClick, this );
});

L.Evented.include({
    
    _cancelSingleClick : function(){
        // This timeout is key to workaround an issue where double-click events
        // are fired in this order on some touch browsers: ['click', 'dblclick', 'click']
        // instead of ['click', 'click', 'dblclick']
        setTimeout( this._clearSingleClickTimeout.bind(this), 0 );
    },
    
    _scheduleSingleClick: function(e) {
        this._clearSingleClickTimeout();
	
        this._singleClickTimeout = setTimeout(
            this._fireSingleClick.bind(this, e),
            (this.options.singleClickTimeout || 500)
        );
    },
    
    _fireSingleClick: function(e){
        if ( !e.originalEvent._stopped ) {
            this.fire( 'singleclick', L.Util.extend( e, { type : 'singleclick' } ) );
        }
    },

    _clearSingleClickTimeout: function(){
	if (this._singleClickTimeout != null) {
	    clearTimeout( this._singleClickTimeout );
	    this._singleClickTimeout = null;
	}
    }
});
