1 <html><head><title>Function.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/*
4 * Copyright(c) 2006-2007, Ext JS, LLC.
6 * Originally Released Under LGPL - original licence link has changed is not relivant.
9 * <script type="text/javascript">
12 </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
13 </span><span class="jsdoc-comment">// wrappedn so fnCleanup is not in global scope...
14 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.isIE</span><span class="jsdoc-syntax">) {
15 </span><span class="jsdoc-keyword">function </span><span class="jsdoc-var">fnCleanUp</span><span class="jsdoc-syntax">() {
16 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Function.prototype</span><span class="jsdoc-syntax">;
17 </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">p.createSequence</span><span class="jsdoc-syntax">;
18 </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">p.defer</span><span class="jsdoc-syntax">;
19 </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">p.createDelegate</span><span class="jsdoc-syntax">;
20 </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">p.createCallback</span><span class="jsdoc-syntax">;
21 </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">p.createInterceptor</span><span class="jsdoc-syntax">;
23 </span><span class="jsdoc-var">window.detachEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"onunload"</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">fnCleanUp</span><span class="jsdoc-syntax">);
25 </span><span class="jsdoc-var">window.attachEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"onunload"</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">fnCleanUp</span><span class="jsdoc-syntax">);
30 </span><span class="jsdoc-comment">/**
32 * These functions are available on every Function object (any JavaScript function).
34 </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Function.prototype</span><span class="jsdoc-syntax">, {
35 </span><span class="jsdoc-comment">/**
36 * Creates a callback that passes arguments[0], arguments[1], arguments[2], ...
37 * Call directly on any function. Example: <code>myFunction.createCallback(myarg, myarg2)</code>
38 * Will create a function that is bound to those 2 args.
39 * @return {Function} The new function
41 </span><span class="jsdoc-var">createCallback </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-comment">/*args...*/</span><span class="jsdoc-syntax">){
42 </span><span class="jsdoc-comment">// make args available, in function below
43 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">args </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">;
44 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">method </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
45 </span><span class="jsdoc-keyword">return function</span><span class="jsdoc-syntax">() {
46 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">method.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">args</span><span class="jsdoc-syntax">);
50 </span><span class="jsdoc-comment">/**
51 * Creates a delegate (callback) that sets the scope to obj.
52 * Call directly on any function. Example: <code>this.myFunction.createDelegate(this)</code>
53 * Will create a function that is automatically scoped to this.
54 * @param {Object} obj (optional) The object for which the scope is set
55 * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
56 * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
57 * if a number the args are inserted at the specified position
58 * @return {Function} The new function
60 </span><span class="jsdoc-var">createDelegate </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">obj</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">args</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">appendArgs</span><span class="jsdoc-syntax">){
61 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">method </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
62 </span><span class="jsdoc-keyword">return function</span><span class="jsdoc-syntax">() {
63 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">callArgs </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">args </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">;
64 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">appendArgs </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">){
65 </span><span class="jsdoc-var">callArgs </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Array.prototype.slice.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">, 0);
66 </span><span class="jsdoc-var">callArgs </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">callArgs.concat</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">args</span><span class="jsdoc-syntax">);
67 }</span><span class="jsdoc-keyword">else if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">appendArgs </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">"number"</span><span class="jsdoc-syntax">){
68 </span><span class="jsdoc-var">callArgs </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Array.prototype.slice.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">, 0); </span><span class="jsdoc-comment">// copy arguments first
69 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">applyArgs </span><span class="jsdoc-syntax">= [</span><span class="jsdoc-var">appendArgs</span><span class="jsdoc-syntax">, 0]</span><span class="jsdoc-var">.concat</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">args</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// create method call params
70 </span><span class="jsdoc-var">Array.prototype.splice.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">callArgs</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">applyArgs</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// splice them in
71 </span><span class="jsdoc-syntax">}
72 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">method.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">obj </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">callArgs</span><span class="jsdoc-syntax">);
76 </span><span class="jsdoc-comment">/**
77 * Calls this function after the number of millseconds specified.
78 * @param {Number} millis The number of milliseconds for the setTimeout call (if 0 the function is executed immediately)
79 * @param {Object} obj (optional) The object for which the scope is set
80 * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
81 * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
82 * if a number the args are inserted at the specified position
83 * @return {Number} The timeout id that can be used with clearTimeout
85 </span><span class="jsdoc-var">defer </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">millis</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">obj</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">args</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">appendArgs</span><span class="jsdoc-syntax">){
86 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">fn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.createDelegate</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">obj</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">args</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">appendArgs</span><span class="jsdoc-syntax">);
87 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">millis</span><span class="jsdoc-syntax">){
88 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">setTimeout</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">millis</span><span class="jsdoc-syntax">);
90 </span><span class="jsdoc-var">fn</span><span class="jsdoc-syntax">();
91 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">0;
93 </span><span class="jsdoc-comment">/**
94 * Create a combined function call sequence of the original function + the passed function.
95 * The resulting function returns the results of the original function.
96 * The passed fcn is called with the parameters of the original function
97 * @param {Function} fcn The function to sequence
98 * @param {Object} scope (optional) The scope of the passed fcn (Defaults to scope of original function or window)
99 * @return {Function} The new function
101 </span><span class="jsdoc-var">createSequence </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fcn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">){
102 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">fcn </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">"function"</span><span class="jsdoc-syntax">){
103 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
105 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">method </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
106 </span><span class="jsdoc-keyword">return function</span><span class="jsdoc-syntax">() {
107 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">retval </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">method.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">);
108 </span><span class="jsdoc-var">fcn.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">scope </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">);
109 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">retval</span><span class="jsdoc-syntax">;
113 </span><span class="jsdoc-comment">/**
114 * Creates an interceptor function. The passed fcn is called before the original one. If it returns false, the original one is not called.
115 * The resulting function returns the results of the original function.
116 * The passed fcn is called with the parameters of the original function.
118 * @param {Function} fcn The function to call before the original
119 * @param {Object} scope (optional) The scope of the passed fcn (Defaults to scope of original function or window)
120 * @return {Function} The new function
122 </span><span class="jsdoc-var">createInterceptor </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fcn</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">){
123 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">fcn </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">"function"</span><span class="jsdoc-syntax">){
124 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
126 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">method </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
127 </span><span class="jsdoc-keyword">return function</span><span class="jsdoc-syntax">() {
128 </span><span class="jsdoc-var">fcn.target </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
129 </span><span class="jsdoc-var">fcn.method </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">method</span><span class="jsdoc-syntax">;
130 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">fcn.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">scope </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">) === </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
131 </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
133 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">method.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">arguments</span><span class="jsdoc-syntax">);
137 </span></code></body></html>