bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith/**
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * Adds support for a "hover" event. The event provides a convenience wrapper
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * for subscribing separately to mouseenter and mouseleave. The signature for
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * subscribing to the event is</p>
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith *
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * <pre><code>node.on("hover", overFn, outFn);
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * node.delegate("hover", overFn, outFn, ".filterSelector");
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * Y.on("hover", overFn, outFn, ".targetSelector");
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * Y.delegate("hover", overFn, outFn, "#container", ".filterSelector");
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * </code></pre>
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith *
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * <p>Additionally, for compatibility with a more typical subscription
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * signature, the following are also supported:</p>
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith *
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * <pre><code>Y.on("hover", overFn, ".targetSelector", outFn);
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * Y.delegate("hover", overFn, "#container", outFn, ".filterSelector");
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * </code></pre>
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith *
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * @module event
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith * @submodule event-hover
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith */
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smithvar isFunction = Y.Lang.isFunction,
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith noop = function () {},
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith conf = {
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith processArgs: function (args) {
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith // Y.delegate('hover', over, out, '#container', '.filter')
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith // comes in as ['hover', over, out, '#container', '.filter'], but
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith // node.delegate('hover', over, out, '.filter')
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith // comes in as ['hover', over, containerEl, out, '.filter']
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith var i = isFunction(args[2]) ? 2 : 3;
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith return (isFunction(args[i])) ? args.splice(i,1)[0] : noop;
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith },
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith on: function (node, sub, notifier, filter) {
15ddc967c5d429ed2983719db23b453794ab0338Luke Smith var args = (sub.args) ? sub.args.slice() : [];
15ddc967c5d429ed2983719db23b453794ab0338Luke Smith
15ddc967c5d429ed2983719db23b453794ab0338Luke Smith args.unshift(null);
15ddc967c5d429ed2983719db23b453794ab0338Luke Smith
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith sub._detach = node[(filter) ? "delegate" : "on"]({
d3493226019e9b97a9141fbf8320e8680144af7eLuke Smith mouseenter: function (e) {
d3493226019e9b97a9141fbf8320e8680144af7eLuke Smith e.phase = 'over';
d3493226019e9b97a9141fbf8320e8680144af7eLuke Smith notifier.fire(e);
d3493226019e9b97a9141fbf8320e8680144af7eLuke Smith },
d3493226019e9b97a9141fbf8320e8680144af7eLuke Smith mouseleave: function (e) {
d3493226019e9b97a9141fbf8320e8680144af7eLuke Smith var thisObj = sub.context || this;
d3493226019e9b97a9141fbf8320e8680144af7eLuke Smith
15ddc967c5d429ed2983719db23b453794ab0338Luke Smith args[0] = e;
15ddc967c5d429ed2983719db23b453794ab0338Luke Smith
d3493226019e9b97a9141fbf8320e8680144af7eLuke Smith e.type = 'hover';
d3493226019e9b97a9141fbf8320e8680144af7eLuke Smith e.phase = 'out';
15ddc967c5d429ed2983719db23b453794ab0338Luke Smith sub._extra.apply(thisObj, args);
d3493226019e9b97a9141fbf8320e8680144af7eLuke Smith }
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith }, filter);
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith },
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith detach: function (node, sub, notifier) {
d3493226019e9b97a9141fbf8320e8680144af7eLuke Smith sub._detach.detach();
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith }
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith };
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smithconf.delegate = conf.on;
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smithconf.detachDelegate = conf.detach;
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke Smith
bea4478bf62936f0e478e02fff1a4ccf68d584daLuke SmithY.Event.define("hover", conf);