(function( $ ){
	
	$.fn.clickHold = function( callback ) {
		
		var intervalTimer;
		
		return this.mousedown(function(){
			callback();
			intervalTimer = setInterval(function(){ callback(); }, 100);
		}).bind('mouseup mouseout', function(){
			clearInterval(intervalTimer);
		});
		
	}
	
})( jQuery );
(function( $ ){
	
	$.fn.clickHold = function( callback, completeCallback ) {
		
		var intervalTimer;
		var active;
		
		return this.mousedown(function(){
			active = true;
			callback();
			intervalTimer = setInterval(function(){ callback(); }, 100);
		}).bind('mouseup mouseout', function(){
			if(active)
			{
				active = false;
				clearInterval(intervalTimer);
				
				if(typeof completeCallback !== 'undefined')
				{
					completeCallback();
				}
			}
		});
		
	}
	
})( jQuery );
Exit bind() being called twice - once on mouseup, again on mouseout so added active flag to prevent double-running Added completeCallback - gets executed on mouseup/mouseout
Exit bind() being called twice - once on mouseup, again on mouseout so added active flag to prevent double-running
Added completeCallback - gets executed on mouseup/mouseout
