/*!
* jQuery.hook v1.0
*
* Copyright (c) 2009 Aaron Heckmann
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*/
/**
* Provides the ability to hook into any jQuery.fn[method]
* with onbeforeMETHOD, onMETHOD, and onafterMETHOD. 
*
* Pass in a string or array of method names you want 
* to hook with onbefore, on, or onafter. 
*
* Example: 
* 	jQuery.hook('show');
*	jQuery(selector).bind('onbeforeshow', function (e) { alert(e.type);});
*   jQuery(selector).show() -> alerts 'onbeforeshow'
*
*   jQuery.hook(['show','hide']);
*   jQuery(selector)
*       .bind('onbeforeshow', function (e) { alert(e.type);})
*       .bind('onshow', function (e) { alert(e.type);})
*       .bind('onaftershow', function (e) { alert(e.type);})
*       .bind('onafterhide', function (e) { alert("The element is now hidden.");});
*   jQuery(selector).show().hide()
*        -> alerts 'onbeforeshow' then alerts 'onshow', then alerts 'onaftershow',
*             then after the element is hidden alerts 'The element is now hidden.'
*
*
* You can also unhook what you've hooked into by calling jQuery.unhook() passing
* in your string or array of method names to unhook.
*
*/
;(function($){
	$.hook = function (fns) {
		fns = typeof fns === 'string' ? 
			fns.split(' ') : 
			$.makeArray(fns)
		;
		
		jQuery.each( fns, function (i, method) {
			var old = $.fn[ method ];
			
			if ( old && !old.__hookold ) {
				
				$.fn[ method ] = function () {
					this.triggerHandler('onbefore'+method);
					this.triggerHandler('on'+method);
					var ret = old.apply(this, arguments);
					this.triggerHandler('onafter'+method);
					return ret;
				};
				
				$.fn[ method ].__hookold = old;
				
			}
		});	
			
	};
	
	$.unhook = function (fns) {
		fns = typeof fns === 'string' ? 
			fns.split(' ') : 
			$.makeArray(fns)
		;
		
		jQuery.each( $.makeArray(fns), function (i, method) {
			var cur = $.fn[ method ];
			
			if ( cur && cur.__hookold ) {				
				$.fn[ method ] = cur.__hookold;			
			}
		});
		
	};
})(jQuery);
