/* 
  * jQuery delegate plug-in v1.0 
  * 
  * Copyright (c) 2007 Jörn Zaefferer 
  * 
  * $Id$ 
  * 
  * Dual licensed under the MIT and GPL licenses: 
  *   http://www.opensource.org/licenses/mit-license.php 
  *   http://www.gnu.org/licenses/gpl.html 
  */ 
  
 // provides cross-browser focusin and focusout events 
 // IE has native support, in other browsers, use event caputuring (neither bubbles) 
  
 // provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation 
 // handler is only called when $(event.target).is(delegate), in the scope of the jQuery-object for event.target  
  
 // provides triggerEvent(type: String, target: Element) to trigger delegated events 
 ;(function($) { 
         $.extend($.event.special, { 
                 focusin: { 
                         setup: function() { 
                                 if ($.browser.msie) 
                                         return false; 
                                 this.addEventListener("focus", $.event.special.focusin.handler, true); 
                         }, 
                         teardown: function() { 
                                 if ($.browser.msie) 
                                         return false; 
                                 this.removeEventListener("focus", $.event.special.focusin.handler, true); 
                         }, 
                         handler: function(event) { 
                                 var args = Array.prototype.slice.call( arguments, 1 ); 
                                 args.unshift($.extend($.event.fix(event), { type: "focusin" })); 
                                 return $.event.handle.apply(this, args); 
                         } 
                 }, 
                 focusout: { 
                         setup: function() { 
                                 if ($.browser.msie) 
                                         return false; 
                                 this.addEventListener("blur", $.event.special.focusout.handler, true); 
                         }, 
                         teardown: function() { 
                                 if ($.browser.msie) 
                                         return false; 
                                 this.removeEventListener("blur", $.event.special.focusout.handler, true); 
                         }, 
                         handler: function(event) { 
                                 var args = Array.prototype.slice.call( arguments, 1 ); 
                                 args.unshift($.extend($.event.fix(event), { type: "focusout" })); 
                                 return $.event.handle.apply(this, args); 
                         } 
                 } 
         }); 
         $.extend($.fn, { 
                 delegate: function(type, delegate, handler) { 
                         return this.bind(type, function(event) { 
                                 var target = $(event.target); 
                                 if (target.is(delegate)) { 
                                         return handler.apply(target, arguments); 
                                 } 
                         }); 
                 }, 
                 triggerEvent: function(type, target) { 
                         return this.triggerHandler(type, [jQuery.event.fix({ type: type, target: target })]); 
                 } 
         }) 
 })(jQuery);  
