src/cm/media/js/lib/yui/yui3.0.0/build/event/event-delegate-debug.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 0 40c8f766c9b8
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
/*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
Code licensed under the BSD License:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
http://developer.yahoo.net/yui/license.txt
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
version: 3.0.0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
build: 1549
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
YUI.add('event-delegate', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
 * Adds event delegation support to the library.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
 * 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
 * @module event
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
 * @submodule event-delegate
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
var Event = Y.Event,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
	Lang = Y.Lang,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
	delegates = {},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
	specialTypes = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
		mouseenter: "mouseover",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
		mouseleave: "mouseout"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
	},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
	resolveTextNode = function(n) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
	    try {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
	        if (n && 3 == n.nodeType) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
	            return n.parentNode;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
	        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
	    } catch(e) { }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
	    return n;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
	},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
    delegateHandler = function(delegateKey, e, el) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
        var target = resolveTextNode((e.target || e.srcElement)), 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
            tests  = delegates[delegateKey],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
            spec, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
			ename,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
			matched,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
			fn,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
			ev;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
		var getMatch = function(el, selector, container) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
			
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
			var returnVal;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
			
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
			if (!el || el === container) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
				returnVal = false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
			else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
				returnVal = Y.Selector.test(el, selector) ? el: getMatch(el.parentNode, selector, container);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
			
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
			return returnVal;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
			
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
		};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
        for (spec in tests) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
            if (tests.hasOwnProperty(spec)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
                ename  = tests[spec];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
				fn	= tests.fn;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
				matched = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
				if (Y.Selector.test(target, spec, el)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
					matched = target;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
				}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
				else if (Y.Selector.test(target, ((spec.replace(/,/gi, " *,")) + " *"), el)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
						
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
					//	The target is a descendant of an element matching 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
					//	the selector, so crawl up to find the ancestor that 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
					//	matches the selector
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
					
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
					matched = getMatch(target, spec, el);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
					
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
				}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
				if (matched) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
                    if (!ev) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
                        ev = new Y.DOMEventFacade(e, el);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
                        ev.container = ev.currentTarget;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
                    ev.currentTarget = Y.Node.get(matched);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
					Y.publish(ename, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
			               contextFn: function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
			                   return ev.currentTarget;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
			               }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
			           });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
					if (fn) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
						fn(ev, ename);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
					}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
					else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
                    	Y.fire(ename, ev);								
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
					}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
					
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
				}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
	attach = function (type, key, element) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
		var focusMethods = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
				focus: Event._attachFocus,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
				blur: Event._attachBlur
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
			},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
			attachFn = focusMethods[type],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
			args = [type, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
			function (e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
	            delegateHandler(key, (e || window.event), element);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
			}, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
			element];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
		if (attachFn) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
			return attachFn(args, { capture: true, facade: false });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
		}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
		else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
			return Event._attach(args, { facade: false });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
		}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
	},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
    sanitize = Y.cached(function(str) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
        return str.replace(/[|,:]/g, '~');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
    });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
 * Sets up event delegation on a container element.  The delegated event
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
 * will use a supplied selector to test if the target or one of the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
 * descendants of the target match it.  The supplied callback function 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
 * will only be executed if a match was encountered, and, in fact, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
 * will be executed for each element that matches if you supply an 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
 * ambiguous selector.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
 * The event object for the delegated event is supplied to the callback
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
 * function.  It is modified slightly in order to support all properties
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
 * that may be needed for event delegation.  'currentTarget' is set to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
 * the element that matched the delegation specifcation.  'container' is
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
 * set to the element that the listener is bound to (this normally would
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
 * be the 'currentTarget').
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
 * @event delegate
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
 * @param type {string} 'delegate'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
 * @param fn {function} the callback function to execute.  This function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
 * will be provided the event object for the delegated event.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
 * @param el {string|node} the element that is the delegation container
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
 * @param delegateType {string} the event type to delegate
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
 * @param spec {string} a selector that must match the target of the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
 * event.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
 * @param context optional argument that specifies what 'this' refers to.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   168
 * @param args* 0..n additional arguments to pass on to the callback function.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   169
 * These arguments will be added after the event object.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
 * @return {EventHandle} the detach handle
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
 * @for YUI
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
 * @deprecated use Y.delegate
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
Y.Env.evt.plugins.delegate = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
    on: function(type, fn, el, delegateType, spec) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
        Y.log('delegate event is deprecated, use Y.delegate()', 'warn', 'deprecated');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
		var args = Y.Array(arguments, 0, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
		args.splice(3, 1);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
		args[0] = delegateType;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   186
		return Y.delegate.apply(Y, args);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   187
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   188
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   191
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   192
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   193
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
 * Sets up event delegation on a container element.  The delegated event
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
 * will use a supplied selector to test if the target or one of the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   196
 * descendants of the target match it.  The supplied callback function 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
 * will only be executed if a match was encountered, and, in fact, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
 * will be executed for each element that matches if you supply an 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   199
 * ambiguous selector.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   200
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   201
 * The event object for the delegated event is supplied to the callback
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   202
 * function.  It is modified slightly in order to support all properties
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
 * that may be needed for event delegation.  'currentTarget' is set to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
 * the element that matched the delegation specifcation.  'container' is
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
 * set to the element that the listener is bound to (this normally would
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
 * be the 'currentTarget').
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   208
 * @method delegate
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
 * @param type {string} the event type to delegate
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
 * @param fn {function} the callback function to execute.  This function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
 * will be provided the event object for the delegated event.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
 * @param el {string|node} the element that is the delegation container
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
 * @param spec {string} a selector that must match the target of the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   214
 * event.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   215
 * @param context optional argument that specifies what 'this' refers to.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   216
 * @param args* 0..n additional arguments to pass on to the callback function.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   217
 * These arguments will be added after the event object.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   218
 * @return {EventHandle} the detach handle
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   219
 * @for YUI
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   220
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   221
Event.delegate = function (type, fn, el, spec) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   222
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   223
    if (!spec) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   224
        Y.log('delegate: no spec, nothing to do', 'warn', 'event');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   225
        return false;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   226
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   227
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   228
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   229
    var args = Y.Array(arguments, 0, true),	    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   230
		element = el,	// HTML element serving as the delegation container
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   231
		availHandle;	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   232
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   233
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   234
	if (Lang.isString(el)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   235
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   236
		//	Y.Selector.query returns an array of matches unless specified 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   237
		//	to return just the first match.  Since the primary use case for
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
		//	event delegation is to use a single event handler on a container,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   239
		//	Y.delegate doesn't currently support being able to bind a 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
		//	single listener to multiple containers.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
		element = Y.Selector.query(el, null, true);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   244
		if (!element) { // Not found, check using onAvailable
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
			availHandle = Event.onAvailable(el, function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
				availHandle.handle = Event.delegate.apply(Event, args);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
            }, Event, true, false);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   251
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
            return availHandle;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
			
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
		}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
	}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   258
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   259
	element = Y.Node.getDOMNode(element);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   260
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   261
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   262
	var	guid = Y.stamp(element),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   263
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   264
        // The Custom Event for the delegation spec
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   265
        ename = 'delegate:' + guid + type + sanitize(spec),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   266
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   267
        // The key to the listener for the event type and container
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   268
        delegateKey = type + guid,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   269
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   270
		delegate = delegates[delegateKey],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   271
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   272
		domEventHandle,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   273
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   274
		ceHandle,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   275
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   276
		listeners;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   277
	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   278
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   279
    if (!delegate) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   280
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   281
		delegate = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   282
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   283
		if (specialTypes[type]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   284
			
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   285
			if (!Event._fireMouseEnter) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   286
				Y.log("Delegating a " + type + " event requires the event-mouseenter submodule.", "error", "Event");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   287
				return false;				
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   288
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   289
			
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   290
			type = specialTypes[type];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   291
			delegate.fn = Event._fireMouseEnter;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   292
			
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   293
		}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   294
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   295
		//	Create the DOM Event wrapper that will fire the Custom Event
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   296
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   297
		domEventHandle = attach(type, delegateKey, element);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   298
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   299
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   300
		//	Hook into the _delete method for the Custom Event wrapper of this
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   301
		//	DOM Event in order to clean up the 'delegates' map and unsubscribe
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   302
		//	the associated Custom Event listeners fired by this DOM event
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   303
		//	listener if/when the user calls "purgeElement" OR removes all 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   304
		//	listeners of the Custom Event.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   305
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   306
		Y.after(function (sub) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   307
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   308
			if (domEventHandle.sub == sub) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   309
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   310
				//	Delete this event from the map of known delegates
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   311
				delete delegates[delegateKey];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   312
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   313
				Y.log("DOM event listener associated with the " + ename + " Custom Event removed.  Removing all " + ename + " listeners.", "info", "Event");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   314
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   315
				//	Unsubscribe all listeners of the Custom Event fired 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   316
				//	by this DOM event.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   317
				Y.detachAll(ename);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   318
				
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   319
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   320
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   321
		}, domEventHandle.evt, "_delete");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   322
			
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   323
		delegate.handle = domEventHandle;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   324
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   325
        delegates[delegateKey] = delegate;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   326
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   327
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   328
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   329
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   330
	listeners = delegate.listeners;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   331
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   332
	delegate.listeners = listeners ? (listeners + 1) : 1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   333
    delegate[spec] = ename;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   334
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   335
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   336
    args[0] = ename;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   337
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   338
    // Remove element, delegation spec
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   339
    args.splice(2, 2);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   340
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   341
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   342
    // Subscribe to the Custom Event for the delegation spec
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   343
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   344
	ceHandle = Y.on.apply(Y, args);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   345
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   346
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   347
	//	Hook into the detach method of the handle in order to clean up the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   348
	//	'delegates' map and remove the associated DOM event handler 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   349
	//	responsible for firing this Custom Event if all listener for this 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   350
	//	event have been removed.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   351
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   352
	Y.after(function () {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   353
			
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   354
		delegate.listeners = (delegate.listeners - 1);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   355
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   356
		if (delegate.listeners === 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   357
			Y.log("No more listeners for the " + ename + " Custom Event.  Removing its associated DOM event listener.", "info", "Event");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   358
			delegate.handle.detach();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   359
		}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   360
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   361
	}, ceHandle, "detach");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   362
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   363
    return ceHandle;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   364
	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   365
};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   366
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   367
Y.delegate = Event.delegate;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   368
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   369
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   370
}, '3.0.0' ,{requires:['node-base']});