/*
 * 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);
