ext-base-debug.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:121k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.0.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */
  2. // for old browsers
  3. window.undefined = window.undefined;
  4. /**
  5.  * @class Ext
  6.  * Ext core utilities and functions.
  7.  * @singleton
  8.  */
  9. Ext = {
  10.     /**
  11.      * The version of the framework
  12.      * @type String
  13.      */
  14.     version : '3.0'
  15. };
  16. /**
  17.  * Copies all the properties of config to obj.
  18.  * @param {Object} obj The receiver of the properties
  19.  * @param {Object} config The source of the properties
  20.  * @param {Object} defaults A different object that will also be applied for default values
  21.  * @return {Object} returns obj
  22.  * @member Ext apply
  23.  */
  24. Ext.apply = function(o, c, defaults){
  25.     // no "this" reference for friendly out of scope calls
  26.     if(defaults){
  27.         Ext.apply(o, defaults);
  28.     }
  29.     if(o && c && typeof c == 'object'){
  30.         for(var p in c){
  31.             o[p] = c[p];
  32.         }
  33.     }
  34.     return o;
  35. };
  36. (function(){
  37.     var idSeed = 0,
  38.         toString = Object.prototype.toString,
  39.         //assume it's not null and not an array
  40.         isIterable = function(v){
  41.             //check for array or arguments
  42.             if(Ext.isArray(v) || v.callee){
  43.                 return true;
  44.             }
  45.             //check for node list type
  46.             if(/NodeList|HTMLCollection/.test(toString.call(v))){
  47.                 return true;
  48.             }
  49.             //NodeList has an item and length property
  50.             //IXMLDOMNodeList has nextNode method, needs to be checked first.
  51.             return ((v.nextNode || v.item) && Ext.isNumber(v.length));
  52.         },
  53.         ua = navigator.userAgent.toLowerCase(),
  54.         check = function(r){
  55.             return r.test(ua);
  56.         },
  57.         DOC = document,
  58.         isStrict = DOC.compatMode == "CSS1Compat",
  59.         isOpera = check(/opera/),
  60.         isChrome = check(/chrome/),
  61.         isWebKit = check(/webkit/),
  62.         isSafari = !isChrome && check(/safari/),
  63.         isSafari2 = isSafari && check(/applewebkit/4/), // unique to Safari 2
  64.         isSafari3 = isSafari && check(/version/3/),
  65.         isSafari4 = isSafari && check(/version/4/),
  66.         isIE = !isOpera && check(/msie/),
  67.         isIE7 = isIE && check(/msie 7/),
  68.         isIE8 = isIE && check(/msie 8/),
  69.         isIE6 = isIE && !isIE7 && !isIE8,
  70.         isGecko = !isWebKit && check(/gecko/),
  71.         isGecko2 = isGecko && check(/rv:1.8/),
  72.         isGecko3 = isGecko && check(/rv:1.9/),
  73.         isBorderBox = isIE && !isStrict,
  74.         isWindows = check(/windows|win32/),
  75.         isMac = check(/macintosh|mac os x/),
  76.         isAir = check(/adobeair/),
  77.         isLinux = check(/linux/),
  78.         isSecure = /^https/i.test(window.location.protocol);
  79.     // remove css image flicker
  80.     if(isIE6){
  81.         try{
  82.             DOC.execCommand("BackgroundImageCache", false, true);
  83.         }catch(e){}
  84.     }
  85.     Ext.apply(Ext, {
  86.         /**
  87.          * URL to a blank file used by Ext when in secure mode for iframe src and onReady src to prevent
  88.          * the IE insecure content warning (defaults to javascript:false).
  89.          * @type String
  90.          */
  91.         SSL_SECURE_URL : 'javascript:false',
  92.         /**
  93.          * True if the browser is in strict (standards-compliant) mode, as opposed to quirks mode
  94.          * @type Boolean
  95.          */
  96.         isStrict : isStrict,
  97.         /**
  98.          * True if the page is running over SSL
  99.          * @type Boolean
  100.          */
  101.         isSecure : isSecure,
  102.         /**
  103.          * True when the document is fully initialized and ready for action
  104.          * @type Boolean
  105.          */
  106.         isReady : false,
  107.         /**
  108.          * True if the {@link Ext.Fx} Class is available
  109.          * @type Boolean
  110.          * @property enableFx
  111.          */
  112.         /**
  113.          * True to automatically uncache orphaned Ext.Elements periodically (defaults to true)
  114.          * @type Boolean
  115.          */
  116.         enableGarbageCollector : true,
  117.         /**
  118.          * True to automatically purge event listeners after uncaching an element (defaults to false).
  119.          * Note: this only happens if {@link #enableGarbageCollector} is true.
  120.          * @type Boolean
  121.          */
  122.         enableListenerCollection : false,
  123.         /**
  124.          * Indicates whether to use native browser parsing for JSON methods.
  125.          * This option is ignored if the browser does not support native JSON methods.
  126.          * <b>Note: Native JSON methods will not work with objects that have functions.
  127.          * Also, property names must be quoted, otherwise the data will not parse.</b> (Defaults to false)
  128.          * @type Boolean
  129.          */
  130.         USE_NATIVE_JSON : false,
  131.         /**
  132.          * Copies all the properties of config to obj if they don't already exist.
  133.          * @param {Object} obj The receiver of the properties
  134.          * @param {Object} config The source of the properties
  135.          * @return {Object} returns obj
  136.          */
  137.         applyIf : function(o, c){
  138.             if(o){
  139.                 for(var p in c){
  140.                     if(Ext.isEmpty(o[p])){
  141.                         o[p] = c[p];
  142.                     }
  143.                 }
  144.             }
  145.             return o;
  146.         },
  147.         /**
  148.          * Generates unique ids. If the element already has an id, it is unchanged
  149.          * @param {Mixed} el (optional) The element to generate an id for
  150.          * @param {String} prefix (optional) Id prefix (defaults "ext-gen")
  151.          * @return {String} The generated Id.
  152.          */
  153.         id : function(el, prefix){
  154.             return (el = Ext.getDom(el) || {}).id = el.id || (prefix || "ext-gen") + (++idSeed);
  155.         },
  156.         /**
  157.          * Extends one class with another class and optionally overrides members with the passed literal. This class
  158.          * also adds the function "override()" to the class that can be used to override
  159.          * members on an instance.
  160.          * * <p>
  161.          * This function also supports a 2-argument call in which the subclass's constructor is
  162.          * not passed as an argument. In this form, the parameters are as follows:</p><p>
  163.          * <div class="mdetail-params"><ul>
  164.          * <li><code>superclass</code>
  165.          * <div class="sub-desc">The class being extended</div></li>
  166.          * <li><code>overrides</code>
  167.          * <div class="sub-desc">A literal with members which are copied into the subclass's
  168.          * prototype, and are therefore shared among all instances of the new class.<p>
  169.          * This may contain a special member named <tt><b>constructor</b></tt>. This is used
  170.          * to define the constructor of the new class, and is returned. If this property is
  171.          * <i>not</i> specified, a constructor is generated and returned which just calls the
  172.          * superclass's constructor passing on its parameters.</p></div></li>
  173.          * </ul></div></p><p>
  174.          * For example, to create a subclass of the Ext GridPanel:
  175.          * <pre><code>
  176. MyGridPanel = Ext.extend(Ext.grid.GridPanel, {
  177.     constructor: function(config) {
  178.         // Your preprocessing here
  179.         MyGridPanel.superclass.constructor.apply(this, arguments);
  180.         // Your postprocessing here
  181.     },
  182.     yourMethod: function() {
  183.         // etc.
  184.     }
  185. });
  186. </code></pre>
  187.          * </p>
  188.          * @param {Function} subclass The class inheriting the functionality
  189.          * @param {Function} superclass The class being extended
  190.          * @param {Object} overrides (optional) A literal with members which are copied into the subclass's
  191.          * prototype, and are therefore shared between all instances of the new class.
  192.          * @return {Function} The subclass constructor.
  193.          * @method extend
  194.          */
  195.         extend : function(){
  196.             // inline overrides
  197.             var io = function(o){
  198.                 for(var m in o){
  199.                     this[m] = o[m];
  200.                 }
  201.             };
  202.             var oc = Object.prototype.constructor;
  203.             return function(sb, sp, overrides){
  204.                 if(Ext.isObject(sp)){
  205.                     overrides = sp;
  206.                     sp = sb;
  207.                     sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);};
  208.                 }
  209.                 var F = function(){},
  210.                     sbp,
  211.                     spp = sp.prototype;
  212.                 F.prototype = spp;
  213.                 sbp = sb.prototype = new F();
  214.                 sbp.constructor=sb;
  215.                 sb.superclass=spp;
  216.                 if(spp.constructor == oc){
  217.                     spp.constructor=sp;
  218.                 }
  219.                 sb.override = function(o){
  220.                     Ext.override(sb, o);
  221.                 };
  222.                 sbp.superclass = sbp.supr = (function(){
  223.                     return spp;
  224.                 });
  225.                 sbp.override = io;
  226.                 Ext.override(sb, overrides);
  227.                 sb.extend = function(o){Ext.extend(sb, o);};
  228.                 return sb;
  229.             };
  230.         }(),
  231.         /**
  232.          * Adds a list of functions to the prototype of an existing class, overwriting any existing methods with the same name.
  233.          * Usage:<pre><code>
  234. Ext.override(MyClass, {
  235.     newMethod1: function(){
  236.         // etc.
  237.     },
  238.     newMethod2: function(foo){
  239.         // etc.
  240.     }
  241. });
  242. </code></pre>
  243.          * @param {Object} origclass The class to override
  244.          * @param {Object} overrides The list of functions to add to origClass.  This should be specified as an object literal
  245.          * containing one or more methods.
  246.          * @method override
  247.          */
  248.         override : function(origclass, overrides){
  249.             if(overrides){
  250.                 var p = origclass.prototype;
  251.                 Ext.apply(p, overrides);
  252.                 if(Ext.isIE && overrides.toString != origclass.toString){
  253.                     p.toString = overrides.toString;
  254.                 }
  255.             }
  256.         },
  257.         /**
  258.          * Creates namespaces to be used for scoping variables and classes so that they are not global.
  259.          * Specifying the last node of a namespace implicitly creates all other nodes. Usage:
  260.          * <pre><code>
  261. Ext.namespace('Company', 'Company.data');
  262. Ext.namespace('Company.data'); // equivalent and preferable to above syntax
  263. Company.Widget = function() { ... }
  264. Company.data.CustomStore = function(config) { ... }
  265. </code></pre>
  266.          * @param {String} namespace1
  267.          * @param {String} namespace2
  268.          * @param {String} etc
  269.          * @method namespace
  270.          */
  271.         namespace : function(){
  272.             var o, d;
  273.             Ext.each(arguments, function(v) {
  274.                 d = v.split(".");
  275.                 o = window[d[0]] = window[d[0]] || {};
  276.                 Ext.each(d.slice(1), function(v2){
  277.                     o = o[v2] = o[v2] || {};
  278.                 });
  279.             });
  280.             return o;
  281.         },
  282.         /**
  283.          * Takes an object and converts it to an encoded URL. e.g. Ext.urlEncode({foo: 1, bar: 2}); would return "foo=1&bar=2".  Optionally, property values can be arrays, instead of keys and the resulting string that's returned will contain a name/value pair for each array value.
  284.          * @param {Object} o
  285.          * @param {String} pre (optional) A prefix to add to the url encoded string
  286.          * @return {String}
  287.          */
  288.         urlEncode: function(o, pre){
  289.             var undef, buf = [], key, e = encodeURIComponent;
  290.             for(key in o){
  291.                 undef = !Ext.isDefined(o[key]);
  292.                 Ext.each(undef ? key : o[key], function(val, i){
  293.                     buf.push("&", e(key), "=", (val != key || !undef) ? e(val) : "");
  294.                 });
  295.             }
  296.             if(!pre){
  297.                 buf.shift();
  298.                 pre = "";
  299.             }
  300.             return pre + buf.join('');
  301.         },
  302.         /**
  303.          * Takes an encoded URL and and converts it to an object. Example: <pre><code>
  304. Ext.urlDecode("foo=1&bar=2"); // returns {foo: "1", bar: "2"}
  305. Ext.urlDecode("foo=1&bar=2&bar=3&bar=4", false); // returns {foo: "1", bar: ["2", "3", "4"]}
  306. </code></pre>
  307.          * @param {String} string
  308.          * @param {Boolean} overwrite (optional) Items of the same name will overwrite previous values instead of creating an an array (Defaults to false).
  309.          * @return {Object} A literal with members
  310.          */
  311.         urlDecode : function(string, overwrite){
  312.             var obj = {},
  313.                 pairs = string.split('&'),
  314.                 d = decodeURIComponent,
  315.                 name,
  316.                 value;
  317.             Ext.each(pairs, function(pair) {
  318.                 pair = pair.split('=');
  319.                 name = d(pair[0]);
  320.                 value = d(pair[1]);
  321.                 obj[name] = overwrite || !obj[name] ? value :
  322.                             [].concat(obj[name]).concat(value);
  323.             });
  324.             return obj;
  325.         },
  326.         /**
  327.          * Appends content to the query string of a URL, which handles logic for whether to place
  328.          * a question mark or ampersand.
  329.          * @param {String} url The url to append to.
  330.          * @@param {String} s The content to append to the url.
  331.          * @return (String) The appended string
  332.          */
  333.         urlAppend : function(url, s){
  334.             if(!Ext.isEmpty(s)){
  335.                 return url + (url.indexOf('?') === -1 ? '?' : '&') + s;
  336.             }
  337.             return url;
  338.         },
  339.         /**
  340.          * Converts any iterable (numeric indices and a length property) into a true array
  341.          * Don't use this on strings. IE doesn't support "abc"[0] which this implementation depends on.
  342.          * For strings, use this instead: "abc".match(/./g) => [a,b,c];
  343.          * @param {Iterable} the iterable object to be turned into a true Array.
  344.          * @return (Array) array
  345.          */
  346.         toArray : function(){
  347.             return isIE ?
  348.                 function(a, i, j, res){
  349.                     res = [];
  350.                     Ext.each(a, function(v) {
  351.                         res.push(v);
  352.                     });
  353.                     return res.slice(i || 0, j || res.length);
  354.                 } :
  355.                 function(a, i, j){
  356.                     return Array.prototype.slice.call(a, i || 0, j || a.length);
  357.                 }
  358.         }(),
  359.         /**
  360.          * Iterates an array calling the passed function with each item, stopping if your function returns false. If the
  361.          * passed array is not really an array, your function is called once with it.
  362.          * The supplied function is called with (Object item, Number index, Array allItems).
  363.          * @param {Array/NodeList/Mixed} array
  364.          * @param {Function} fn
  365.          * @param {Object} scope
  366.          */
  367.         each: function(array, fn, scope){
  368.             if(Ext.isEmpty(array, true)){
  369.                 return;
  370.             }
  371.             if(!isIterable(array) || Ext.isPrimitive(array)){
  372.                 array = [array];
  373.             }
  374.             for(var i = 0, len = array.length; i < len; i++){
  375.                 if(fn.call(scope || array[i], array[i], i, array) === false){
  376.                     return i;
  377.                 };
  378.             }
  379.         },
  380.         /**
  381.          * Iterates either the elements in an array, or each of the properties in an object.
  382.          * <b>Note</b>: If you are only iterating arrays, it is better to call {@link #each}.
  383.          * @param {Object/Array} object The object or array to be iterated
  384.          * @param {Function} fn The function to be called for each iteration.
  385.          * The iteration will stop if the supplied function returns false, or
  386.          * all array elements / object properties have been covered. The signature
  387.          * varies depending on the type of object being interated:
  388.          * <div class="mdetail-params"><ul>
  389.          * <li>Arrays : <tt>(Object item, Number index, Array allItems)</tt>
  390.          * <div class="sub-desc">
  391.          * When iterating an array, the supplied function is called with each item.</div></li>
  392.          * <li>Objects : <tt>(String key, Object value)</tt>
  393.          * <div class="sub-desc">
  394.          * When iterating an object, the supplied function is called with each key-value pair in
  395.          * the object.</div></li>
  396.          * </ul></div>
  397.          * @param {Object} scope The scope to call the supplied function with, defaults to
  398.          * the specified <tt>object</tt>
  399.          */
  400.         iterate : function(obj, fn, scope){
  401.             if(isIterable(obj)){
  402.                 Ext.each(obj, fn, scope);
  403.                 return;
  404.             }else if(Ext.isObject(obj)){
  405.                 for(var prop in obj){
  406.                     if(obj.hasOwnProperty(prop)){
  407.                         if(fn.call(scope || obj, prop, obj[prop]) === false){
  408.                             return;
  409.                         };
  410.                     }
  411.                 }
  412.             }
  413.         },
  414.         /**
  415.          * Return the dom node for the passed String (id), dom node, or Ext.Element.
  416.          * Here are some examples:
  417.          * <pre><code>
  418. // gets dom node based on id
  419. var elDom = Ext.getDom('elId');
  420. // gets dom node based on the dom node
  421. var elDom1 = Ext.getDom(elDom);
  422. // If we don&#39;t know if we are working with an
  423. // Ext.Element or a dom node use Ext.getDom
  424. function(el){
  425.     var dom = Ext.getDom(el);
  426.     // do something with the dom node
  427. }
  428.          * </code></pre>
  429.          * <b>Note</b>: the dom node to be found actually needs to exist (be rendered, etc)
  430.          * when this method is called to be successful.
  431.          * @param {Mixed} el
  432.          * @return HTMLElement
  433.          */
  434.         getDom : function(el){
  435.             if(!el || !DOC){
  436.                 return null;
  437.             }
  438.             return el.dom ? el.dom : (Ext.isString(el) ? DOC.getElementById(el) : el);
  439.         },
  440.         /**
  441.          * Returns the current document body as an {@link Ext.Element}.
  442.          * @return Ext.Element The document body
  443.          */
  444.         getBody : function(){
  445.             return Ext.get(DOC.body || DOC.documentElement);
  446.         },
  447.         /**
  448.          * Removes a DOM node from the document.  The body node will be ignored if passed in.
  449.          * @param {HTMLElement} node The node to remove
  450.          */
  451.         removeNode : isIE ? function(){
  452.             var d;
  453.             return function(n){
  454.                 if(n && n.tagName != 'BODY'){
  455.                     d = d || DOC.createElement('div');
  456.                     d.appendChild(n);
  457.                     d.innerHTML = '';
  458.                 }
  459.             }
  460.         }() : function(n){
  461.             if(n && n.parentNode && n.tagName != 'BODY'){
  462.                 n.parentNode.removeChild(n);
  463.             }
  464.         },
  465.         /**
  466.          * <p>Returns true if the passed value is empty.</p>
  467.          * <p>The value is deemed to be empty if it is<div class="mdetail-params"><ul>
  468.          * <li>null</li>
  469.          * <li>undefined</li>
  470.          * <li>an empty array</li>
  471.          * <li>a zero length string (Unless the <tt>allowBlank</tt> parameter is <tt>true</tt>)</li>
  472.          * </ul></div>
  473.          * @param {Mixed} value The value to test
  474.          * @param {Boolean} allowBlank (optional) true to allow empty strings (defaults to false)
  475.          * @return {Boolean}
  476.          */
  477.         isEmpty : function(v, allowBlank){
  478.             return v === null || v === undefined || ((Ext.isArray(v) && !v.length)) || (!allowBlank ? v === '' : false);
  479.         },
  480.         /**
  481.          * Returns true if the passed object is a JavaScript array, otherwise false.
  482.          * @param {Object} object The object to test
  483.          * @return {Boolean}
  484.          */
  485.         isArray : function(v){
  486.             return toString.apply(v) === '[object Array]';
  487.         },
  488.         /**
  489.          * Returns true if the passed object is a JavaScript Object, otherwise false.
  490.          * @param {Object} object The object to test
  491.          * @return {Boolean}
  492.          */
  493.         isObject : function(v){
  494.             return v && typeof v == "object";
  495.         },
  496.         /**
  497.          * Returns true if the passed object is a JavaScript 'primitive', a string, number or boolean.
  498.          * @param {Mixed} value The value to test
  499.          * @return {Boolean}
  500.          */
  501.         isPrimitive : function(v){
  502.             return Ext.isString(v) || Ext.isNumber(v) || Ext.isBoolean(v);
  503.         },
  504.         /**
  505.          * Returns true if the passed object is a JavaScript Function, otherwise false.
  506.          * @param {Object} object The object to test
  507.          * @return {Boolean}
  508.          */
  509.         isFunction : function(v){
  510.             return toString.apply(v) === '[object Function]';
  511.         },
  512.         /**
  513.          * Returns true if the passed object is a number. Returns false for non-finite numbers.
  514.          * @param {Object} v The object to test
  515.          * @return {Boolean}
  516.          */
  517.         isNumber: function(v){
  518.             return typeof v === 'number' && isFinite(v);
  519.         },
  520.         /**
  521.          * Returns true if the passed object is a string.
  522.          * @param {Object} v The object to test
  523.          * @return {Boolean}
  524.          */
  525.         isString: function(v){
  526.             return typeof v === 'string';
  527.         },
  528.         /**
  529.          * Returns true if the passed object is a boolean.
  530.          * @param {Object} v The object to test
  531.          * @return {Boolean}
  532.          */
  533.         isBoolean: function(v){
  534.             return typeof v === 'boolean';
  535.         },
  536.         /**
  537.          * Returns true if the passed object is not undefined.
  538.          * @param {Object} v The object to test
  539.          * @return {Boolean}
  540.          */
  541.         isDefined: function(v){
  542.             return typeof v !== 'undefined';
  543.         },
  544.         /**
  545.          * True if the detected browser is Opera.
  546.          * @type Boolean
  547.          */
  548.         isOpera : isOpera,
  549.         /**
  550.          * True if the detected browser uses WebKit.
  551.          * @type Boolean
  552.          */
  553.         isWebKit: isWebKit,
  554.         /**
  555.          * True if the detected browser is Chrome.
  556.          * @type Boolean
  557.          */
  558.         isChrome : isChrome,
  559.         /**
  560.          * True if the detected browser is Safari.
  561.          * @type Boolean
  562.          */
  563.         isSafari : isSafari,
  564.         /**
  565.          * True if the detected browser is Safari 3.x.
  566.          * @type Boolean
  567.          */
  568.         isSafari3 : isSafari3,
  569.         /**
  570.          * True if the detected browser is Safari 4.x.
  571.          * @type Boolean
  572.          */
  573.         isSafari4 : isSafari4,
  574.         /**
  575.          * True if the detected browser is Safari 2.x.
  576.          * @type Boolean
  577.          */
  578.         isSafari2 : isSafari2,
  579.         /**
  580.          * True if the detected browser is Internet Explorer.
  581.          * @type Boolean
  582.          */
  583.         isIE : isIE,
  584.         /**
  585.          * True if the detected browser is Internet Explorer 6.x.
  586.          * @type Boolean
  587.          */
  588.         isIE6 : isIE6,
  589.         /**
  590.          * True if the detected browser is Internet Explorer 7.x.
  591.          * @type Boolean
  592.          */
  593.         isIE7 : isIE7,
  594.         /**
  595.          * True if the detected browser is Internet Explorer 8.x.
  596.          * @type Boolean
  597.          */
  598.         isIE8 : isIE8,
  599.         /**
  600.          * True if the detected browser uses the Gecko layout engine (e.g. Mozilla, Firefox).
  601.          * @type Boolean
  602.          */
  603.         isGecko : isGecko,
  604.         /**
  605.          * True if the detected browser uses a pre-Gecko 1.9 layout engine (e.g. Firefox 2.x).
  606.          * @type Boolean
  607.          */
  608.         isGecko2 : isGecko2,
  609.         /**
  610.          * True if the detected browser uses a Gecko 1.9+ layout engine (e.g. Firefox 3.x).
  611.          * @type Boolean
  612.          */
  613.         isGecko3 : isGecko3,
  614.         /**
  615.          * True if the detected browser is Internet Explorer running in non-strict mode.
  616.          * @type Boolean
  617.          */
  618.         isBorderBox : isBorderBox,
  619.         /**
  620.          * True if the detected platform is Linux.
  621.          * @type Boolean
  622.          */
  623.         isLinux : isLinux,
  624.         /**
  625.          * True if the detected platform is Windows.
  626.          * @type Boolean
  627.          */
  628.         isWindows : isWindows,
  629.         /**
  630.          * True if the detected platform is Mac OS.
  631.          * @type Boolean
  632.          */
  633.         isMac : isMac,
  634.         /**
  635.          * True if the detected platform is Adobe Air.
  636.          * @type Boolean
  637.          */
  638.         isAir : isAir
  639.     });
  640.     /**
  641.      * Creates namespaces to be used for scoping variables and classes so that they are not global.
  642.      * Specifying the last node of a namespace implicitly creates all other nodes. Usage:
  643.      * <pre><code>
  644. Ext.namespace('Company', 'Company.data');
  645. Ext.namespace('Company.data'); // equivalent and preferable to above syntax
  646. Company.Widget = function() { ... }
  647. Company.data.CustomStore = function(config) { ... }
  648. </code></pre>
  649.      * @param {String} namespace1
  650.      * @param {String} namespace2
  651.      * @param {String} etc
  652.      * @method namespace
  653.      */
  654.     Ext.ns = Ext.namespace;
  655. })();
  656. Ext.ns("Ext", "Ext.util", "Ext.lib", "Ext.data");
  657. /**
  658.  * @class Function
  659.  * These functions are available on every Function object (any JavaScript function).
  660.  */
  661. Ext.apply(Function.prototype, {
  662.      /**
  663.      * Creates an interceptor function. The passed fcn is called before the original one. If it returns false,
  664.      * the original one is not called. The resulting function returns the results of the original function.
  665.      * The passed fcn is called with the parameters of the original function. Example usage:
  666.      * <pre><code>
  667. var sayHi = function(name){
  668.     alert('Hi, ' + name);
  669. }
  670. sayHi('Fred'); // alerts "Hi, Fred"
  671. // create a new function that validates input without
  672. // directly modifying the original function:
  673. var sayHiToFriend = sayHi.createInterceptor(function(name){
  674.     return name == 'Brian';
  675. });
  676. sayHiToFriend('Fred');  // no alert
  677. sayHiToFriend('Brian'); // alerts "Hi, Brian"
  678. </code></pre>
  679.      * @param {Function} fcn The function to call before the original
  680.      * @param {Object} scope (optional) The scope of the passed fcn (Defaults to scope of original function or window)
  681.      * @return {Function} The new function
  682.      */
  683.     createInterceptor : function(fcn, scope){
  684.         var method = this;
  685.         return !Ext.isFunction(fcn) ?
  686.                 this :
  687.                 function() {
  688.                     var me = this,
  689.                         args = arguments;
  690.                     fcn.target = me;
  691.                     fcn.method = method;
  692.                     return (fcn.apply(scope || me || window, args) !== false) ?
  693.                             method.apply(me || window, args) :
  694.                             null;
  695.                 };
  696.     },
  697.      /**
  698.      * Creates a callback that passes arguments[0], arguments[1], arguments[2], ...
  699.      * Call directly on any function. Example: <code>myFunction.createCallback(arg1, arg2)</code>
  700.      * Will create a function that is bound to those 2 args. <b>If a specific scope is required in the
  701.      * callback, use {@link #createDelegate} instead.</b> The function returned by createCallback always
  702.      * executes in the window scope.
  703.      * <p>This method is required when you want to pass arguments to a callback function.  If no arguments
  704.      * are needed, you can simply pass a reference to the function as a callback (e.g., callback: myFn).
  705.      * However, if you tried to pass a function with arguments (e.g., callback: myFn(arg1, arg2)) the function
  706.      * would simply execute immediately when the code is parsed. Example usage:
  707.      * <pre><code>
  708. var sayHi = function(name){
  709.     alert('Hi, ' + name);
  710. }
  711. // clicking the button alerts "Hi, Fred"
  712. new Ext.Button({
  713.     text: 'Say Hi',
  714.     renderTo: Ext.getBody(),
  715.     handler: sayHi.createCallback('Fred')
  716. });
  717. </code></pre>
  718.      * @return {Function} The new function
  719.     */
  720.     createCallback : function(/*args...*/){
  721.         // make args available, in function below
  722.         var args = arguments,
  723.             method = this;
  724.         return function() {
  725.             return method.apply(window, args);
  726.         };
  727.     },
  728.     /**
  729.      * Creates a delegate (callback) that sets the scope to obj.
  730.      * Call directly on any function. Example: <code>this.myFunction.createDelegate(this, [arg1, arg2])</code>
  731.      * Will create a function that is automatically scoped to obj so that the <tt>this</tt> variable inside the
  732.      * callback points to obj. Example usage:
  733.      * <pre><code>
  734. var sayHi = function(name){
  735.     // Note this use of "this.text" here.  This function expects to
  736.     // execute within a scope that contains a text property.  In this
  737.     // example, the "this" variable is pointing to the btn object that
  738.     // was passed in createDelegate below.
  739.     alert('Hi, ' + name + '. You clicked the "' + this.text + '" button.');
  740. }
  741. var btn = new Ext.Button({
  742.     text: 'Say Hi',
  743.     renderTo: Ext.getBody()
  744. });
  745. // This callback will execute in the scope of the
  746. // button instance. Clicking the button alerts
  747. // "Hi, Fred. You clicked the "Say Hi" button."
  748. btn.on('click', sayHi.createDelegate(btn, ['Fred']));
  749. </code></pre>
  750.      * @param {Object} obj (optional) The object for which the scope is set
  751.      * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
  752.      * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
  753.      *                                             if a number the args are inserted at the specified position
  754.      * @return {Function} The new function
  755.      */
  756.     createDelegate : function(obj, args, appendArgs){
  757.         var method = this;
  758.         return function() {
  759.             var callArgs = args || arguments;
  760.             if (appendArgs === true){
  761.                 callArgs = Array.prototype.slice.call(arguments, 0);
  762.                 callArgs = callArgs.concat(args);
  763.             }else if (Ext.isNumber(appendArgs)){
  764.                 callArgs = Array.prototype.slice.call(arguments, 0); // copy arguments first
  765.                 var applyArgs = [appendArgs, 0].concat(args); // create method call params
  766.                 Array.prototype.splice.apply(callArgs, applyArgs); // splice them in
  767.             }
  768.             return method.apply(obj || window, callArgs);
  769.         };
  770.     },
  771.     /**
  772.      * Calls this function after the number of millseconds specified, optionally in a specific scope. Example usage:
  773.      * <pre><code>
  774. var sayHi = function(name){
  775.     alert('Hi, ' + name);
  776. }
  777. // executes immediately:
  778. sayHi('Fred');
  779. // executes after 2 seconds:
  780. sayHi.defer(2000, this, ['Fred']);
  781. // this syntax is sometimes useful for deferring
  782. // execution of an anonymous function:
  783. (function(){
  784.     alert('Anonymous');
  785. }).defer(100);
  786. </code></pre>
  787.      * @param {Number} millis The number of milliseconds for the setTimeout call (if less than or equal to 0 the function is executed immediately)
  788.      * @param {Object} obj (optional) The object for which the scope is set
  789.      * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
  790.      * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
  791.      *                                             if a number the args are inserted at the specified position
  792.      * @return {Number} The timeout id that can be used with clearTimeout
  793.      */
  794.     defer : function(millis, obj, args, appendArgs){
  795.         var fn = this.createDelegate(obj, args, appendArgs);
  796.         if(millis > 0){
  797.             return setTimeout(fn, millis);
  798.         }
  799.         fn();
  800.         return 0;
  801.     }
  802. });
  803. /**
  804.  * @class String
  805.  * These functions are available on every String object.
  806.  */
  807. Ext.applyIf(String, {
  808.     /**
  809.      * Allows you to define a tokenized string and pass an arbitrary number of arguments to replace the tokens.  Each
  810.      * token must be unique, and must increment in the format {0}, {1}, etc.  Example usage:
  811.      * <pre><code>
  812. var cls = 'my-class', text = 'Some text';
  813. var s = String.format('&lt;div class="{0}">{1}&lt;/div>', cls, text);
  814. // s now contains the string: '&lt;div class="my-class">Some text&lt;/div>'
  815.      * </code></pre>
  816.      * @param {String} string The tokenized string to be formatted
  817.      * @param {String} value1 The value to replace token {0}
  818.      * @param {String} value2 Etc...
  819.      * @return {String} The formatted string
  820.      * @static
  821.      */
  822.     format : function(format){
  823.         var args = Ext.toArray(arguments, 1);
  824.         return format.replace(/{(d+)}/g, function(m, i){
  825.             return args[i];
  826.         });
  827.     }
  828. });
  829. /**
  830.  * @class Array
  831.  */
  832. Ext.applyIf(Array.prototype, {
  833.     /**
  834.      * Checks whether or not the specified object exists in the array.
  835.      * @param {Object} o The object to check for
  836.      * @return {Number} The index of o in the array (or -1 if it is not found)
  837.      */
  838.     indexOf : function(o){
  839.         for (var i = 0, len = this.length; i < len; i++){
  840.             if(this[i] == o){
  841.                 return i;
  842.             }
  843.         }
  844.         return -1;
  845.     },
  846.     /**
  847.      * Removes the specified object from the array.  If the object is not found nothing happens.
  848.      * @param {Object} o The object to remove
  849.      * @return {Array} this array
  850.      */
  851.     remove : function(o){
  852.         var index = this.indexOf(o);
  853.         if(index != -1){
  854.             this.splice(index, 1);
  855.         }
  856.         return this;
  857.     }
  858. });
  859. /**  * @class Ext  */ Ext.ns("Ext.grid", "Ext.dd", "Ext.tree", "Ext.form", "Ext.menu",        "Ext.state", "Ext.layout", "Ext.app", "Ext.ux", "Ext.chart", "Ext.direct");     /**      * Namespace alloted for extensions to the framework.      * @property ux      * @type Object      */ Ext.apply(Ext, function(){     var E = Ext, idSeed = 0;     return {         /**         * A reusable empty function         * @property         * @type Function         */         emptyFn : function(){},         /**          * URL to a 1x1 transparent gif image used by Ext to create inline icons with CSS background images.           * In older versions of IE, this defaults to "http://extjs.com/s.gif" and you should change this to a URL on your server.          * For other browsers it uses an inline data URL.          * @type String          */         BLANK_IMAGE_URL : Ext.isIE6 || Ext.isIE7 ?                             'http:/' + '/extjs.com/s.gif' :                             'data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==',         extendX : function(supr, fn){             return Ext.extend(supr, fn(supr.prototype));         },         /**          * Returns the current HTML document object as an {@link Ext.Element}.          * @return Ext.Element The document          */         getDoc : function(){             return Ext.get(document);         },         /**          * Returns true if the passed object is a JavaScript date object, otherwise false.          * @param {Object} object The object to test          * @return {Boolean}          */         isDate : function(v){             return Object.prototype.toString.apply(v) === '[object Date]';         },         /**          * Utility method for validating that a value is numeric, returning the specified default value if it is not.          * @param {Mixed} value Should be a number, but any type will be handled appropriately          * @param {Number} defaultValue The value to return if the original value is non-numeric          * @return {Number} Value, if numeric, else defaultValue          */         num : function(v, defaultValue){             v = Number(v === null || typeof v == 'boolean'? NaN : v);             return isNaN(v)? defaultValue : v;         },         /**          * <p>Utility method for returning a default value if the passed value is empty.</p>          * <p>The value is deemed to be empty if it is<div class="mdetail-params"><ul>          * <li>null</li>          * <li>undefined</li>          * <li>an empty array</li>          * <li>a zero length string (Unless the <tt>allowBlank</tt> parameter is <tt>true</tt>)</li>          * </ul></div>          * @param {Mixed} value The value to test          * @param {Mixed} defaultValue The value to return if the original value is empty          * @param {Boolean} allowBlank (optional) true to allow zero length strings to qualify as non-empty (defaults to false)          * @return {Mixed} value, if non-empty, else defaultValue          */         value : function(v, defaultValue, allowBlank){             return Ext.isEmpty(v, allowBlank) ? defaultValue : v;         },         /**          * Escapes the passed string for use in a regular expression          * @param {String} str          * @return {String}          */         escapeRe : function(s) {             return s.replace(/([.*+?^${}()|[]/\])/g, "\$1");         },         sequence : function(o, name, fn, scope){             o[name] = o[name].createSequence(fn, scope);         },         /**          * Applies event listeners to elements by selectors when the document is ready.          * The event name is specified with an <tt>&#64;</tt> suffix.          * <pre><code> Ext.addBehaviors({     // add a listener for click on all anchors in element with id foo     '#foo a&#64;click' : function(e, t){         // do something     },          // add the same listener to multiple selectors (separated by comma BEFORE the &#64;)     '#foo a, #bar span.some-class&#64;mouseover' : function(){         // do something     } });          * </code></pre>           * @param {Object} obj The list of behaviors to apply          */         addBehaviors : function(o){             if(!Ext.isReady){                 Ext.onReady(function(){                     Ext.addBehaviors(o);                 });             } else {                 var cache = {}, // simple cache for applying multiple behaviors to same selector does query multiple times                     parts,                     b,                     s;                 for (b in o) {                     if ((parts = b.split('@'))[1]) { // for Object prototype breakers                         s = parts[0];                         if(!cache[s]){                             cache[s] = Ext.select(s);                         }                         cache[s].on(parts[1], o[b]);                     }                 }                 cache = null;             }         },         // deprecated         combine : function(){             var as = arguments, l = as.length, r = [];             for(var i = 0; i < l; i++){                 var a = as[i];                 if(Ext.isArray(a)){                     r = r.concat(a);                 }else if(a.length !== undefined && !a.substr){                     r = r.concat(Array.prototype.slice.call(a, 0));                 }else{                     r.push(a);                 }             }             return r;         },         /**          * Copies a set of named properties fom the source object to the destination object.          * <p>example:<pre><code> ImageComponent = Ext.extend(Ext.BoxComponent, {     initComponent: function() {         this.autoEl = { tag: 'img' };         MyComponent.superclass.initComponent.apply(this, arguments);         this.initialBox = Ext.copyTo({}, this.initialConfig, 'x,y,width,height');     } });          * </code></pre>           * @param {Object} The destination object.          * @param {Object} The source object.          * @param {Array/String} Either an Array of property names, or a comma-delimited list          * of property names to copy.          * @return {Object} The modified object.         */         copyTo : function(dest, source, names){             if(typeof names == 'string'){                 names = names.split(/[,;s]/);             }             Ext.each(names, function(name){                 if(source.hasOwnProperty(name)){                     dest[name] = source[name];                 }             }, this);             return dest;         },         /**          * Attempts to destroy any objects passed to it by removing all event listeners, removing them from the          * DOM (if applicable) and calling their destroy functions (if available).  This method is primarily          * intended for arguments of type {@link Ext.Element} and {@link Ext.Component}, but any subclass of          * {@link Ext.util.Observable} can be passed in.  Any number of elements and/or components can be          * passed into this function in a single call as separate arguments.          * @param {Mixed} arg1 An {@link Ext.Element}, {@link Ext.Component}, or an Array of either of these to destroy          * @param {Mixed} arg2 (optional)          * @param {Mixed} etc... (optional)          */         destroy : function(){             Ext.each(arguments, function(arg){                 if(arg){                     if(Ext.isArray(arg)){                         this.destroy.apply(this, arg);                     }else if(Ext.isFunction(arg.destroy)){                         arg.destroy();                     }else if(arg.dom){                         arg.remove();                     }                     }             }, this);         },         /**          * Attempts to destroy and then remove a set of named properties of the passed object.          * @param {Object} o The object (most likely a Component) who's properties you wish to destroy.          * @param {Mixed} arg1 The name of the property to destroy and remove from the object.          * @param {Mixed} etc... More property names to destroy and remove.          */         destroyMembers : function(o, arg1, arg2, etc){             for(var i = 1, a = arguments, len = a.length; i < len; i++) {                 Ext.destroy(o[a[i]]);                 delete o[a[i]];             }         },         /**          * Creates a copy of the passed Array with falsy values removed.          * @param {Array/NodeList} arr The Array from which to remove falsy values.          * @return {Array} The new, compressed Array.          */         clean : function(arr){             var ret = [];             Ext.each(arr, function(v){                 if(!!v){                     ret.push(v);                 }             });             return ret;         },         /**          * Creates a copy of the passed Array, filtered to contain only unique values.          * @param {Array} arr The Array to filter          * @return {Array} The new Array containing unique values.          */         unique : function(arr){             var ret = [],                 collect = {};             Ext.each(arr, function(v) {                 if(!collect[v]){                     ret.push(v);                 }                 collect[v] = true;             });             return ret;         },         /**          * Recursively flattens into 1-d Array. Injects Arrays inline.          * @param {Array} arr The array to flatten          * @return {Array} The new, flattened array.          */         flatten : function(arr){             var worker = [];             function rFlatten(a) {                 Ext.each(a, function(v) {                     if(Ext.isArray(v)){                         rFlatten(v);                     }else{                         worker.push(v);                     }                 });                 return worker;             }             return rFlatten(arr);         },         /**          * Returns the minimum value in the Array.          * @param {Array|NodeList} arr The Array from which to select the minimum value.          * @param {Function} comp (optional) a function to perform the comparision which determines minimization.          *                   If omitted the "<" operator will be used. Note: gt = 1; eq = 0; lt = -1          * @return {Object} The minimum value in the Array.          */         min : function(arr, comp){             var ret = arr[0];             comp = comp || function(a,b){ return a < b ? -1 : 1; };             Ext.each(arr, function(v) {                 ret = comp(ret, v) == -1 ? ret : v;             });             return ret;         },         /**          * Returns the maximum value in the Array          * @param {Array|NodeList} arr The Array from which to select the maximum value.          * @param {Function} comp (optional) a function to perform the comparision which determines maximization.          *                   If omitted the ">" operator will be used. Note: gt = 1; eq = 0; lt = -1          * @return {Object} The maximum value in the Array.          */         max : function(arr, comp){             var ret = arr[0];             comp = comp || function(a,b){ return a > b ? 1 : -1; };             Ext.each(arr, function(v) {                 ret = comp(ret, v) == 1 ? ret : v;             });             return ret;         },         /**          * Calculates the mean of the Array          * @param {Array} arr The Array to calculate the mean value of.          * @return {Number} The mean.          */         mean : function(arr){            return Ext.sum(arr) / arr.length;         },         /**          * Calculates the sum of the Array          * @param {Array} arr The Array to calculate the sum value of.          * @return {Number} The sum.          */         sum : function(arr){            var ret = 0;            Ext.each(arr, function(v) {                ret += v;            });            return ret;         },         /**          * Partitions the set into two sets: a true set and a false set.          * Example:           * Example2:           * <pre><code> // Example 1: Ext.partition([true, false, true, true, false]); // [[true, true, true], [false, false]] // Example 2: Ext.partition(     Ext.query("p"),     function(val){         return val.className == "class1"     } ); // true are those paragraph elements with a className of "class1", // false set are those that do not have that className.          * </code></pre>          * @param {Array|NodeList} arr The array to partition          * @param {Function} truth (optional) a function to determine truth.  If this is omitted the element          *                   itself must be able to be evaluated for its truthfulness.          * @return {Array} [true<Array>,false<Array>]          */         partition : function(arr, truth){             var ret = [[],[]];             Ext.each(arr, function(v, i, a) {                 ret[ (truth && truth(v, i, a)) || (!truth && v) ? 0 : 1].push(v);             });             return ret;         },         /**          * Invokes a method on each item in an Array.          * <pre><code> // Example: Ext.invoke(Ext.query("p"), "getAttribute", "id"); // [el1.getAttribute("id"), el2.getAttribute("id"), ..., elN.getAttribute("id")]          * </code></pre>          * @param {Array|NodeList} arr The Array of items to invoke the method on.          * @param {String} methodName The method name to invoke.          * @param {Anything} ... Arguments to send into the method invocation.          * @return {Array} The results of invoking the method on each item in the array.          */         invoke : function(arr, methodName){             var ret = [],                 args = Array.prototype.slice.call(arguments, 2);             Ext.each(arr, function(v,i) {                 if (v && typeof v[methodName] == "function") {                     ret.push(v[methodName].apply(v, args));                 } else {                     ret.push(undefined);                 }             });             return ret;         },         /**          * Plucks the value of a property from each item in the Array          * <pre><code> // Example: Ext.pluck(Ext.query("p"), "className"); // [el1.className, el2.className, ..., elN.className]          * </code></pre>          * @param {Array|NodeList} arr The Array of items to pluck the value from.          * @param {String} prop The property name to pluck from each element.          * @return {Array} The value from each item in the Array.          */         pluck : function(arr, prop){             var ret = [];             Ext.each(arr, function(v) {                 ret.push( v[prop] );             });             return ret;         },         /**          * <p>Zips N sets together.</p>          * <pre><code> // Example 1: Ext.zip([1,2,3],[4,5,6]); // [[1,4],[2,5],[3,6]] // Example 2: Ext.zip(     [ "+", "-", "+"],     [  12,  10,  22],     [  43,  15,  96],     function(a, b, c){         return "$" + a + "" + b + "." + c     } ); // ["$+12.43", "$-10.15", "$+22.96"]          * </code></pre>          * @param {Arrays|NodeLists} arr This argument may be repeated. Array(s) to contribute values.          * @param {Function} zipper (optional) The last item in the argument list. This will drive how the items are zipped together.          * @return {Array} The zipped set.          */         zip : function(){             var parts = Ext.partition(arguments, function( val ){ return !Ext.isFunction(val); }),                 arrs = parts[0],                 fn = parts[1][0],                 len = Ext.max(Ext.pluck(arrs, "length")),                 ret = [];             for (var i = 0; i < len; i++) {                 ret[i] = [];                 if(fn){                     ret[i] = fn.apply(fn, Ext.pluck(arrs, i));                 }else{                     for (var j = 0, aLen = arrs.length; j < aLen; j++){                         ret[i].push( arrs[j][i] );                     }                 }             }             return ret;         },         /**          * This is shorthand reference to {@link Ext.ComponentMgr#get}.          * Looks up an existing {@link Ext.Component Component} by {@link Ext.Component#id id}          * @param {String} id The component {@link Ext.Component#id id}          * @return Ext.Component The Component, <tt>undefined</tt> if not found, or <tt>null</tt> if a          * Class was found.         */         getCmp : function(id){             return Ext.ComponentMgr.get(id);         },         /**          * By default, Ext intelligently decides whether floating elements should be shimmed. If you are using flash,          * you may want to set this to true.          * @type Boolean          */         useShims: E.isIE6 || (E.isMac && E.isGecko2),         // inpired by a similar function in mootools library         /**          * Returns the type of object that is passed in. If the object passed in is null or undefined it          * return false otherwise it returns one of the following values:<div class="mdetail-params"><ul>          * <li><b>string</b>: If the object passed is a string</li>          * <li><b>number</b>: If the object passed is a number</li>          * <li><b>boolean</b>: If the object passed is a boolean value</li>          * <li><b>date</b>: If the object passed is a Date object</li>          * <li><b>function</b>: If the object passed is a function reference</li>          * <li><b>object</b>: If the object passed is an object</li>          * <li><b>array</b>: If the object passed is an array</li>          * <li><b>regexp</b>: If the object passed is a regular expression</li>          * <li><b>element</b>: If the object passed is a DOM Element</li>          * <li><b>nodelist</b>: If the object passed is a DOM NodeList</li>          * <li><b>textnode</b>: If the object passed is a DOM text node and contains something other than whitespace</li>          * <li><b>whitespace</b>: If the object passed is a DOM text node and contains only whitespace</li>          * </ul></div>          * @param {Mixed} object          * @return {String}          */         type : function(o){             if(o === undefined || o === null){                 return false;             }             if(o.htmlElement){                 return 'element';             }             var t = typeof o;             if(t == 'object' && o.nodeName) {                 switch(o.nodeType) {                     case 1: return 'element';                     case 3: return (/S/).test(o.nodeValue) ? 'textnode' : 'whitespace';                 }             }             if(t == 'object' || t == 'function') {                 switch(o.constructor) {                     case Array: return 'array';                     case RegExp: return 'regexp';                     case Date: return 'date';                 }                 if(typeof o.length == 'number' && typeof o.item == 'function') {                     return 'nodelist';                 }             }             return t;         },         intercept : function(o, name, fn, scope){             o[name] = o[name].createInterceptor(fn, scope);         },         // internal         callback : function(cb, scope, args, delay){             if(Ext.isFunction(cb)){                 if(delay){                     cb.defer(delay, scope, args || []);                 }else{                     cb.apply(scope, args || []);                 }             }         }     }; }()); /**  * @class Function  * These functions are available on every Function object (any JavaScript function).  */ Ext.apply(Function.prototype, {     /**      * Create a combined function call sequence of the original function + the passed function.      * The resulting function returns the results of the original function.      * The passed fcn is called with the parameters of the original function. Example usage:      * <pre><code> var sayHi = function(name){     alert('Hi, ' + name); } sayHi('Fred'); // alerts "Hi, Fred" var sayGoodbye = sayHi.createSequence(function(name){     alert('Bye, ' + name); }); sayGoodbye('Fred'); // both alerts show </code></pre>      * @param {Function} fcn The function to sequence      * @param {Object} scope (optional) The scope of the passed fcn (Defaults to scope of original function or window)      * @return {Function} The new function      */     createSequence : function(fcn, scope){         var method = this;         return !Ext.isFunction(fcn) ?                 this :                 function(){                     var retval = method.apply(this || window, arguments);                     fcn.apply(scope || this || window, arguments);                     return retval;                 };     } }); /**  * @class String  * These functions are available as static methods on the JavaScript String object.  */ Ext.applyIf(String, {     /**      * Escapes the passed string for ' and       * @param {String} string The string to escape      * @return {String} The escaped string      * @static      */     escape : function(string) {         return string.replace(/('|\)/g, "\$1");     },     /**      * Pads the left side of a string with a specified character.  This is especially useful      * for normalizing number and date strings.  Example usage:      * <pre><code> var s = String.leftPad('123', 5, '0'); // s now contains the string: '00123'      * </code></pre>      * @param {String} string The original string      * @param {Number} size The total length of the output string      * @param {String} char (optional) The character with which to pad the original string (defaults to empty string " ")      * @return {String} The padded string      * @static      */     leftPad : function (val, size, ch) {         var result = String(val);         if(!ch) {             ch = " ";         }         while (result.length < size) {             result = ch + result;         }         return result;     } }); /**  * Utility function that allows you to easily switch a string between two alternating values.  The passed value  * is compared to the current string, and if they are equal, the other value that was passed in is returned.  If  * they are already different, the first value passed in is returned.  Note that this method returns the new value  * but does not change the current string.  * <pre><code> // alternate sort directions sort = sort.toggle('ASC', 'DESC'); // instead of conditional logic: sort = (sort == 'ASC' ? 'DESC' : 'ASC'); </code></pre>  * @param {String} value The value to compare to the current string  * @param {String} other The new value to use if the string already equals the first value passed in  * @return {String} The new value  */ String.prototype.toggle = function(value, other){     return this == value ? other : value; }; /**  * Trims whitespace from either end of a string, leaving spaces within the string intact.  Example:  * <pre><code> var s = '  foo bar  '; alert('-' + s + '-');         //alerts "- foo bar -" alert('-' + s.trim() + '-');  //alerts "-foo bar-" </code></pre>  * @return {String} The trimmed string  */ String.prototype.trim = function(){     var re = /^s+|s+$/g;     return function(){ return this.replace(re, ""); }; }(); // here to prevent dependency on Date.js /**  Returns the number of milliseconds between this date and date  @param {Date} date (optional) Defaults to now  @return {Number} The diff in milliseconds  @member Date getElapsed  */ Date.prototype.getElapsed = function(date) {     return Math.abs((date || new Date()).getTime()-this.getTime()); }; /**  * @class Number  */ Ext.applyIf(Number.prototype, {     /**      * Checks whether or not the current number is within a desired range.  If the number is already within the      * range it is returned, otherwise the min or max value is returned depending on which side of the range is      * exceeded.  Note that this method returns the constrained value but does not change the current number.      * @param {Number} min The minimum number in the range      * @param {Number} max The maximum number in the range      * @return {Number} The constrained value if outside the range, otherwise the current value      */     constrain : function(min, max){         return Math.min(Math.max(this, min), max);     } }); /**  * @class Ext.util.TaskRunner  * Provides the ability to execute one or more arbitrary tasks in a multithreaded  * manner.  Generally, you can use the singleton {@link Ext.TaskMgr} instead, but  * if needed, you can create separate instances of TaskRunner.  Any number of  * separate tasks can be started at any time and will run independently of each  * other. Example usage:  * <pre><code> // Start a simple clock task that updates a div once per second var updateClock = function(){     Ext.fly('clock').update(new Date().format('g:i:s A')); }  var task = {     run: updateClock,     interval: 1000 //1 second } var runner = new Ext.util.TaskRunner(); runner.start(task); // equivalent using TaskMgr Ext.TaskMgr.start({     run: updateClock,     interval: 1000 });  * </code></pre>  * Also see {@link Ext.util.DelayedTask}.   *   * @constructor  * @param {Number} interval (optional) The minimum precision in milliseconds supported by this TaskRunner instance  * (defaults to 10)  */ Ext.util.TaskRunner = function(interval){     interval = interval || 10;     var tasks = [],       removeQueue = [],      id = 0,      running = false,      // private      stopThread = function(){         running = false;         clearInterval(id);         id = 0;     },      // private      startThread = function(){         if(!running){             running = true;             id = setInterval(runTasks, interval);         }     },      // private      removeTask = function(t){         removeQueue.push(t);         if(t.onStop){             t.onStop.apply(t.scope || t);         }     },           // private      runTasks = function(){      var rqLen = removeQueue.length,      now = new Date().getTime();                        if(rqLen > 0){             for(var i = 0; i < rqLen; i++){                 tasks.remove(removeQueue[i]);             }             removeQueue = [];             if(tasks.length < 1){                 stopThread();                 return;             }         }                  for(var i = 0, t, itime, rt, len = tasks.length; i < len; ++i){             t = tasks[i];             itime = now - t.taskRunTime;             if(t.interval <= itime){                 rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]);                 t.taskRunTime = now;                 if(rt === false || t.taskRunCount === t.repeat){                     removeTask(t);                     return;                 }             }             if(t.duration && t.duration <= (now - t.taskStartTime)){                 removeTask(t);             }         }     };     /**      * Starts a new task.      * @method start      * @param {Object} task A config object that supports the following properties:<ul>      * <li><code>run</code> : Function<div class="sub-desc">The function to execute each time the task is run. The      * function will be called at each interval and passed the <code>args</code> argument if specified.  If a      * particular scope is required, be sure to specify it using the <code>scope</code> argument.</div></li>      * <li><code>interval</code> : Number<div class="sub-desc">The frequency in milliseconds with which the task      * should be executed.</div></li>      * <li><code>args</code> : Array<div class="sub-desc">(optional) An array of arguments to be passed to the function      * specified by <code>run</code>.</div></li>      * <li><code>scope</code> : Object<div class="sub-desc">(optional) The scope (<tt>this</tt> reference) in which to execute the      * <code>run</code> function. Defaults to the task config object.</div></li>      * <li><code>duration</code> : Number<div class="sub-desc">(optional) The length of time in milliseconds to execute      * the task before stopping automatically (defaults to indefinite).</div></li>      * <li><code>repeat</code> : Number<div class="sub-desc">(optional) The number of times to execute the task before      * stopping automatically (defaults to indefinite).</div></li>      * </ul>      * @return {Object} The task      */     this.start = function(task){         tasks.push(task);         task.taskStartTime = new Date().getTime();         task.taskRunTime = 0;         task.taskRunCount = 0;         startThread();         return task;     };     /**      * Stops an existing running task.      * @method stop      * @param {Object} task The task to stop      * @return {Object} The task      */     this.stop = function(task){         removeTask(task);         return task;     };     /**      * Stops all tasks that are currently running.      * @method stopAll      */     this.stopAll = function(){         stopThread();         for(var i = 0, len = tasks.length; i < len; i++){             if(tasks[i].onStop){                 tasks[i].onStop();             }         }         tasks = [];         removeQueue = [];     }; }; /**  * @class Ext.TaskMgr  * @extends Ext.util.TaskRunner  * A static {@link Ext.util.TaskRunner} instance that can be used to start and stop arbitrary tasks.  See  * {@link Ext.util.TaskRunner} for supported methods and task config properties.  * <pre><code> // Start a simple clock task that updates a div once per second var task = {     run: function(){         Ext.fly('clock').update(new Date().format('g:i:s A'));     },     interval: 1000 //1 second } Ext.TaskMgr.start(task); </code></pre>  * @singleton  */ Ext.TaskMgr = new Ext.util.TaskRunner();(function(){
  860. var libFlyweight;
  861. function fly(el) {
  862.         if (!libFlyweight) {
  863.             libFlyweight = new Ext.Element.Flyweight();
  864.         }
  865.         libFlyweight.dom = el;
  866.         return libFlyweight;
  867.     }
  868.     
  869.     (function(){
  870. var doc = document,
  871. isCSS1 = doc.compatMode == "CSS1Compat",
  872. MAX = Math.max,
  873. PARSEINT = parseInt;
  874. Ext.lib.Dom = {
  875.     isAncestor : function(p, c) {
  876.     var ret = false;
  877. p = Ext.getDom(p);
  878. c = Ext.getDom(c);
  879. if (p && c) {
  880. if (p.contains) {
  881. return p.contains(c);
  882. } else if (p.compareDocumentPosition) {
  883. return !!(p.compareDocumentPosition(c) & 16);
  884. } else {
  885. while (c = c.parentNode) {
  886. ret = c == p || ret;         
  887. }
  888. }             
  889. }
  890. return ret;
  891. },
  892.         getViewWidth : function(full) {
  893.             return full ? this.getDocumentWidth() : this.getViewportWidth();
  894.         },
  895.         getViewHeight : function(full) {
  896.             return full ? this.getDocumentHeight() : this.getViewportHeight();
  897.         },
  898.         getDocumentHeight: function() {            
  899.             return MAX(!isCSS1 ? doc.body.scrollHeight : doc.documentElement.scrollHeight, this.getViewportHeight());
  900.         },
  901.         getDocumentWidth: function() {            
  902.             return MAX(!isCSS1 ? doc.body.scrollWidth : doc.documentElement.scrollWidth, this.getViewportWidth());
  903.         },
  904.         getViewportHeight: function(){
  905.         return Ext.isIE ? 
  906.             (Ext.isStrict ? doc.documentElement.clientHeight : doc.body.clientHeight) :
  907.             self.innerHeight;
  908.         },
  909.         getViewportWidth : function() {
  910.         return !Ext.isStrict && !Ext.isOpera ? doc.body.clientWidth :
  911.             Ext.isIE ? doc.documentElement.clientWidth : self.innerWidth;
  912.         },
  913.         
  914.         getY : function(el) {
  915.             return this.getXY(el)[1];
  916.         },
  917.         getX : function(el) {
  918.             return this.getXY(el)[0];
  919.         },
  920.         getXY : function(el) {
  921.             var p, 
  922.              pe, 
  923.              b,
  924.              bt, 
  925.              bl,     
  926.              dbd,       
  927.              x = 0,
  928.              y = 0, 
  929.              scroll,
  930.              hasAbsolute, 
  931.              bd = (doc.body || doc.documentElement),
  932.              ret = [0,0];
  933.             
  934.             el = Ext.getDom(el);
  935.             if(el != bd){
  936.             if (el.getBoundingClientRect) {
  937.                 b = el.getBoundingClientRect();
  938.                 scroll = fly(document).getScroll();
  939.                 ret = [b.left + scroll.left, b.top + scroll.top];
  940.             } else {  
  941.             p = el;
  942.             hasAbsolute = fly(el).isStyle("position", "absolute");
  943.             while (p) {
  944.             pe = fly(p);
  945.                 x += p.offsetLeft;
  946.                 y += p.offsetTop;
  947.                 hasAbsolute = hasAbsolute || pe.isStyle("position", "absolute");
  948.                 
  949.                 if (Ext.isGecko) {                     
  950.                     y += bt = PARSEINT(pe.getStyle("borderTopWidth"), 10) || 0;
  951.                     x += bl = PARSEINT(pe.getStyle("borderLeftWidth"), 10) || 0;
  952.                     if (p != el && !pe.isStyle('overflow','visible')) {
  953.                         x += bl;
  954.                         y += bt;
  955.                     }
  956.                 }
  957.                 p = p.offsetParent;
  958.             }
  959.             if (Ext.isSafari && hasAbsolute) {
  960.                 x -= bd.offsetLeft;
  961.                 y -= bd.offsetTop;
  962.             }
  963.             if (Ext.isGecko && !hasAbsolute) {
  964.                 dbd = fly(bd);
  965.                 x += PARSEINT(dbd.getStyle("borderLeftWidth"), 10) || 0;
  966.                 y += PARSEINT(dbd.getStyle("borderTopWidth"), 10) || 0;
  967.             }
  968.             p = el.parentNode;
  969.             while (p && p != bd) {
  970.                 if (!Ext.isOpera || (p.tagName != 'TR' && !fly(p).isStyle("display", "inline"))) {
  971.                     x -= p.scrollLeft;
  972.                     y -= p.scrollTop;
  973.                 }
  974.                 p = p.parentNode;
  975.             }
  976.             ret = [x,y];
  977.             }
  978.           }
  979.             return ret
  980.         },
  981.         setXY : function(el, xy) {
  982.             (el = Ext.fly(el, '_setXY')).position();
  983.             
  984.             var pts = el.translatePoints(xy),
  985.              style = el.dom.style,
  986.              pos;            
  987.             
  988.             for (pos in pts) {             
  989.             if(!isNaN(pts[pos])) style[pos] = pts[pos] + "px"
  990.             }
  991.         },
  992.         setX : function(el, x) {
  993.             this.setXY(el, [x, false]);
  994.         },
  995.         setY : function(el, y) {
  996.             this.setXY(el, [false, y]);
  997.         }
  998.     };
  999. })();Ext.lib.Dom.getRegion = function(el) {
  1000.     return Ext.lib.Region.getRegion(el);
  1001. };Ext.lib.Event = function() {
  1002.     var loadComplete = false,
  1003.         listeners = [],
  1004.         unloadListeners = [],
  1005.         retryCount = 0,
  1006.         onAvailStack = [],
  1007.         _interval,
  1008.         locked = false,
  1009.         win = window,
  1010.         doc = document,
  1011.         
  1012.         // constants            
  1013.         POLL_RETRYS = 200,
  1014.         POLL_INTERVAL = 20,
  1015.         EL = 0,
  1016.         TYPE = 1,
  1017.         FN = 2,
  1018.         WFN = 3,
  1019.         OBJ = 3,
  1020.         ADJ_SCOPE = 4,   
  1021.         SCROLLLEFT = 'scrollLeft',
  1022.         SCROLLTOP = 'scrollTop',
  1023.         UNLOAD = 'unload',
  1024.         MOUSEOVER = 'mouseover',
  1025.         MOUSEOUT = 'mouseout',
  1026.         // private
  1027.         doAdd = function() {
  1028.             var ret;
  1029.             if (win.addEventListener) {
  1030.                 ret = function(el, eventName, fn, capture) {
  1031.                     if (eventName == 'mouseenter') {
  1032.                         fn = fn.createInterceptor(checkRelatedTarget);
  1033.                         el.addEventListener(MOUSEOVER, fn, (capture));
  1034.                     } else if (eventName == 'mouseleave') {
  1035.                         fn = fn.createInterceptor(checkRelatedTarget);
  1036.                         el.addEventListener(MOUSEOUT, fn, (capture));
  1037.                     } else {
  1038.                         el.addEventListener(eventName, fn, (capture));
  1039.                     }
  1040.                     return fn;
  1041.                 };
  1042.             } else if (win.attachEvent) {
  1043.                 ret = function(el, eventName, fn, capture) {
  1044.                     el.attachEvent("on" + eventName, fn);
  1045.                     return fn;
  1046.                 };
  1047.             } else {
  1048.                 ret = function(){};
  1049.             }
  1050.             return ret;
  1051.         }(),    
  1052.         // private
  1053.         doRemove = function(){
  1054.             var ret;
  1055.             if (win.removeEventListener) {
  1056.                 ret = function (el, eventName, fn, capture) {
  1057.                     if (eventName == 'mouseenter') {
  1058.                         eventName = MOUSEOVER;
  1059.                     } else if (eventName == 'mouseleave') {
  1060.                         eventName = MOUSEOUT;
  1061.                     }                        
  1062.                     el.removeEventListener(eventName, fn, (capture));
  1063.                 };
  1064.             } else if (win.detachEvent) {
  1065.                 ret = function (el, eventName, fn) {
  1066.                     el.detachEvent("on" + eventName, fn);
  1067.                 };
  1068.             } else {
  1069.                 ret = function(){};
  1070.             }
  1071.             return ret;
  1072.         }();        
  1073.     var isXUL = Ext.isGecko ? function(node){ 
  1074.         return Object.prototype.toString.call(node) == '[object XULElement]';
  1075.     } : function(){};
  1076.         
  1077.     var isTextNode = Ext.isGecko ? function(node){
  1078.         try{
  1079.             return node.nodeType == 3;
  1080.         }catch(e) {
  1081.             return false;
  1082.         }
  1083.     } : function(node){
  1084.         return node.nodeType == 3;
  1085.     };
  1086.         
  1087.     function checkRelatedTarget(e) {
  1088.         var related = pub.getRelatedTarget(e);
  1089.         return !(isXUL(related) || elContains(e.currentTarget,related));
  1090.     }
  1091.     function elContains(parent, child) {
  1092.        if(parent && parent.firstChild){  
  1093.          while(child) {
  1094.             if(child === parent) {
  1095.                 return true;
  1096.             }
  1097.             try {
  1098.                 child = child.parentNode;
  1099.             } catch(e) {
  1100.                 // In FF if you mouseout an text input element
  1101.                 // thats inside a div sometimes it randomly throws
  1102.                 // Permission denied to get property HTMLDivElement.parentNode
  1103.                 // See https://bugzilla.mozilla.org/show_bug.cgi?id=208427
  1104.                 
  1105.                 return false;
  1106.             }                
  1107.             if(child && (child.nodeType != 1)) {
  1108.                 child = null;
  1109.             }
  1110.           }
  1111.         }
  1112.         return false;
  1113.     }
  1114.         
  1115.     // private  
  1116.     function _getCacheIndex(el, eventName, fn) {
  1117.         var index = -1;
  1118.         Ext.each(listeners, function (v,i) {
  1119.             if(v && v[FN] == fn && v[EL] == el && v[TYPE] == eventName) {
  1120.                 index = i;
  1121.             }
  1122.         });
  1123.         return index;
  1124.     }
  1125.                     
  1126.     // private
  1127.     function _tryPreloadAttach() {
  1128.         var ret = false,                
  1129.             notAvail = [],
  1130.             element,
  1131.             tryAgain = !loadComplete || (retryCount > 0);                       
  1132.         
  1133.         if (!locked) {
  1134.             locked = true;
  1135.             
  1136.             Ext.each(onAvailStack, function (v,i,a){
  1137.                 if(v && (element = doc.getElementById(v.id))){
  1138.                     if(!v.checkReady || loadComplete || element.nextSibling || (doc && doc.body)) {
  1139.                         element = v.override ? (v.override === true ? v.obj : v.override) : element;
  1140.                         v.fn.call(element, v.obj);
  1141.                         onAvailStack[i] = null;
  1142.                     } else {
  1143.                         notAvail.push(v);
  1144.                     }
  1145.                 }   
  1146.             });
  1147.             retryCount = (notAvail.length === 0) ? 0 : retryCount - 1;
  1148.             if (tryAgain) { 
  1149.                 startInterval();
  1150.             } else {
  1151.                 clearInterval(_interval);
  1152.                 _interval = null;
  1153.             }
  1154.             ret = !(locked = false);
  1155.         }
  1156.         return ret;
  1157.     }
  1158.     
  1159.     // private              
  1160.     function startInterval() {            
  1161.         if(!_interval){                    
  1162.             var callback = function() {
  1163.                 _tryPreloadAttach();
  1164.             };
  1165.             _interval = setInterval(callback, POLL_INTERVAL);
  1166.         }
  1167.     }
  1168.     
  1169.     // private 
  1170.     function getScroll() {
  1171.         var dd = doc.documentElement, 
  1172.             db = doc.body;
  1173.         if(dd && (dd[SCROLLTOP] || dd[SCROLLLEFT])){
  1174.             return [dd[SCROLLLEFT], dd[SCROLLTOP]];
  1175.         }else if(db){
  1176.             return [db[SCROLLLEFT], db[SCROLLTOP]];
  1177.         }else{
  1178.             return [0, 0];
  1179.         }
  1180.     }
  1181.         
  1182.     // private
  1183.     function getPageCoord (ev, xy) {
  1184.         ev = ev.browserEvent || ev;
  1185.         var coord  = ev['page' + xy];
  1186.         if (!coord && coord !== 0) {
  1187.             coord = ev['client' + xy] || 0;
  1188.             if (Ext.isIE) {
  1189.                 coord += getScroll()[xy == "X" ? 0 : 1];
  1190.             }
  1191.         }
  1192.         return coord;
  1193.     }
  1194.     var pub =  {
  1195.         onAvailable : function(p_id, p_fn, p_obj, p_override) {             
  1196.             onAvailStack.push({ 
  1197.                 id:         p_id,
  1198.                 fn:         p_fn,
  1199.                 obj:        p_obj,
  1200.                 override:   p_override,
  1201.                 checkReady: false });
  1202.             retryCount = POLL_RETRYS;
  1203.             startInterval();
  1204.         },
  1205.         addListener: function(el, eventName, fn) {
  1206.             var ret;                
  1207.             el = Ext.getDom(el);                
  1208.             if (el && fn) {
  1209.                 if (UNLOAD == eventName) {
  1210.                     ret = !!(unloadListeners[unloadListeners.length] = [el, eventName, fn]);                    
  1211.                 } else {
  1212.                     listeners.push([el, eventName, fn, ret = doAdd(el, eventName, fn, false)]);
  1213.                 }
  1214.             }
  1215.             return !!ret;
  1216.         },
  1217.         removeListener: function(el, eventName, fn) {
  1218.             var ret = false,
  1219.                 index, 
  1220.                 cacheItem;
  1221.             el = Ext.getDom(el);
  1222.             if(!fn) {                   
  1223.                 ret = this.purgeElement(el, false, eventName);
  1224.             } else if (UNLOAD == eventName) {   
  1225.                 Ext.each(unloadListeners, function(v, i, a) {
  1226.                     if( v && v[0] == el && v[1] == eventName && v[2] == fn) {
  1227.                         unloadListeners.splice(i, 1);
  1228.                         ret = true;
  1229.                     }
  1230.                 });
  1231.             } else {    
  1232.                 index = arguments[3] || _getCacheIndex(el, eventName, fn);
  1233.                 cacheItem = listeners[index];
  1234.                 
  1235.                 if (el && cacheItem) {
  1236.                     doRemove(el, eventName, cacheItem[WFN], false);     
  1237.                     cacheItem[WFN] = cacheItem[FN] = null;                       
  1238.                     listeners.splice(index, 1);     
  1239.                     ret = true;
  1240.                 }
  1241.             }
  1242.             return ret;
  1243.         },
  1244.         getTarget : function(ev) {
  1245.             ev = ev.browserEvent || ev;                
  1246.             return this.resolveTextNode(ev.target || ev.srcElement);
  1247.         },
  1248.         resolveTextNode : function(node) {
  1249.             return node && !isXUL(node) && isTextNode(node) ? node.parentNode : node;
  1250.         },
  1251.         getRelatedTarget : function(ev) {
  1252.             ev = ev.browserEvent || ev;
  1253.             return this.resolveTextNode(ev.relatedTarget || 
  1254.                     (ev.type == MOUSEOUT ? ev.toElement :
  1255.                      ev.type == MOUSEOVER ? ev.fromElement : null));
  1256.         },
  1257.         
  1258.         getPageX : function(ev) {
  1259.             return getPageCoord(ev, "X");
  1260.         },
  1261.         getPageY : function(ev) {
  1262.             return getPageCoord(ev, "Y");
  1263.         },
  1264.         getXY : function(ev) {                             
  1265.             return [this.getPageX(ev), this.getPageY(ev)];
  1266.         },
  1267. // Is this useful?  Removing to save space unless use case exists.
  1268. //             getTime: function(ev) {
  1269. //                 ev = ev.browserEvent || ev;
  1270. //                 if (!ev.time) {
  1271. //                     var t = new Date().getTime();
  1272. //                     try {
  1273. //                         ev.time = t;
  1274. //                     } catch(ex) {
  1275. //                         return t;
  1276. //                     }
  1277. //                 }
  1278. //                 return ev.time;
  1279. //             },
  1280.         stopEvent : function(ev) {                            
  1281.             this.stopPropagation(ev);
  1282.             this.preventDefault(ev);
  1283.         },
  1284.         stopPropagation : function(ev) {
  1285.             ev = ev.browserEvent || ev;
  1286.             if (ev.stopPropagation) {
  1287.                 ev.stopPropagation();
  1288.             } else {
  1289.                 ev.cancelBubble = true;
  1290.             }
  1291.         },
  1292.         preventDefault : function(ev) {
  1293.             ev = ev.browserEvent || ev;
  1294.             if (ev.preventDefault) {
  1295.                 ev.preventDefault();
  1296.             } else {
  1297.                 ev.returnValue = false;
  1298.             }
  1299.         },
  1300.         
  1301.         getEvent : function(e) {
  1302.             e = e || win.event;
  1303.             if (!e) {
  1304.                 var c = this.getEvent.caller;
  1305.                 while (c) {
  1306.                     e = c.arguments[0];
  1307.                     if (e && Event == e.constructor) {
  1308.                         break;
  1309.                     }
  1310.                     c = c.caller;
  1311.                 }
  1312.             }
  1313.             return e;
  1314.         },
  1315.         getCharCode : function(ev) {
  1316.             ev = ev.browserEvent || ev;
  1317.             return ev.charCode || ev.keyCode || 0;
  1318.         },
  1319.         //clearCache: function() {},
  1320.         _load : function(e) {
  1321.             loadComplete = true;
  1322.             var EU = Ext.lib.Event;    
  1323.             if (Ext.isIE && e !== true) {
  1324.         // IE8 complains that _load is null or not an object
  1325.         // so lets remove self via arguments.callee
  1326.                 doRemove(win, "load", arguments.callee);
  1327.             }
  1328.         },            
  1329.         
  1330.         purgeElement : function(el, recurse, eventName) {
  1331.             var me = this;
  1332.             Ext.each( me.getListeners(el, eventName), function(v){
  1333.                 if(v){
  1334.                     me.removeListener(el, v.type, v.fn);
  1335.                 }
  1336.             });
  1337.             if (recurse && el && el.childNodes) {
  1338.                 Ext.each(el.childNodes, function(v){
  1339.                     me.purgeElement(v, recurse, eventName);
  1340.                 });
  1341.             }
  1342.         },
  1343.         getListeners : function(el, eventName) {
  1344.             var me = this,
  1345.                 results = [], 
  1346.                 searchLists;
  1347.             if (eventName){  
  1348.                 searchLists = eventName == UNLOAD ? unloadListeners : listeners;
  1349.             }else{
  1350.                 searchLists = listeners.concat(unloadListeners);
  1351.             }
  1352.             Ext.each(searchLists, function(v, i){
  1353.                 if (v && v[EL] == el && (!eventName || eventName == v[TYPE])) {
  1354.                     results.push({
  1355.                                 type:   v[TYPE],
  1356.                                 fn:     v[FN],
  1357.                                 obj:    v[OBJ],
  1358.                                 adjust: v[ADJ_SCOPE],
  1359.                                 index:  i
  1360.                             });
  1361.                 }   
  1362.             });                
  1363.             return results.length ? results : null;
  1364.         },
  1365.         _unload : function(e) {
  1366.              var EU = Ext.lib.Event, 
  1367.                 i, 
  1368.                 j, 
  1369.                 l, 
  1370.                 len, 
  1371.                 index,
  1372.                 scope;
  1373.                 
  1374.             Ext.each(unloadListeners, function(v) {
  1375.                 if (v) {
  1376.                     try{
  1377.                         scope =  v[ADJ_SCOPE] ? (v[ADJ_SCOPE] === true ? v[OBJ] : v[ADJ_SCOPE]) :  win; 
  1378.                         v[FN].call(scope, EU.getEvent(e), v[OBJ]);
  1379.                     }catch(ex){}
  1380.                 }   
  1381.             });     
  1382.             unloadListeners = null;
  1383.             if(listeners && (j = listeners.length)){                    
  1384.                 while(j){                        
  1385.                     if((l = listeners[index = --j])){
  1386.                         EU.removeListener(l[EL], l[TYPE], l[FN], index);
  1387.                     }                        
  1388.                 }
  1389.                 //EU.clearCache();
  1390.             }
  1391.             doRemove(win, UNLOAD, EU._unload);
  1392.         }            
  1393.     };        
  1394.     
  1395.     // Initialize stuff.
  1396.     pub.on = pub.addListener;
  1397.     pub.un = pub.removeListener;
  1398.     if (doc && doc.body) {
  1399.         pub._load(true);
  1400.     } else {
  1401.         doAdd(win, "load", pub._load);
  1402.     }
  1403.     doAdd(win, UNLOAD, pub._unload);    
  1404.     _tryPreloadAttach();
  1405.     
  1406.     return pub;
  1407. }();/*
  1408.  * Portions of this file are based on pieces of Yahoo User Interface Library
  1409.  * Copyright (c) 2007, Yahoo! Inc. All rights reserved.
  1410.  * YUI licensed under the BSD License:
  1411.  * http://developer.yahoo.net/yui/license.txt
  1412.  */
  1413.     Ext.lib.Ajax = function() {     
  1414.     var activeX = ['MSXML2.XMLHTTP.3.0',
  1415.            'MSXML2.XMLHTTP',
  1416.            'Microsoft.XMLHTTP'],
  1417.             CONTENTTYPE = 'Content-Type';
  1418.            
  1419. // private
  1420. function setHeader(o) {
  1421.         var conn = o.conn,
  1422.          prop;
  1423.         
  1424.         function setTheHeaders(conn, headers){
  1425.       for (prop in headers) {
  1426.                     if (headers.hasOwnProperty(prop)) {
  1427.                         conn.setRequestHeader(prop, headers[prop]);
  1428.                     }
  1429.                 }   
  1430.         }
  1431.         
  1432.             if (pub.defaultHeaders) {
  1433.             setTheHeaders(conn, pub.defaultHeaders);
  1434.             }
  1435.             if (pub.headers) {
  1436. setTheHeaders(conn, pub.headers);
  1437.                 pub.headers = null;                
  1438.             }
  1439.         }    
  1440.         
  1441.         // private
  1442.         function createExceptionObject(tId, callbackArg, isAbort, isTimeout) {         
  1443.             return {
  1444.             tId : tId,
  1445.             status : isAbort ? -1 : 0,
  1446.             statusText : isAbort ? 'transaction aborted' : 'communication failure',
  1447.                     isAbort: true,
  1448.                     isTimeout: true,
  1449.             argument : callbackArg
  1450.             };
  1451.         }  
  1452.         
  1453.         // private 
  1454.         function initHeader(label, value) {         
  1455. (pub.headers = pub.headers || {})[label] = value;             
  1456.         }
  1457.     
  1458.         // private
  1459.         function createResponseObject(o, callbackArg) {
  1460.             var headerObj = {},
  1461.                 headerStr,              
  1462.                 conn = o.conn,
  1463.                 t,
  1464.                 s;
  1465.             try {
  1466.                 headerStr = o.conn.getAllResponseHeaders();   
  1467.                 Ext.each(headerStr.replace(/rn/g, 'n').split('n'), function(v){
  1468.                     t = v.indexOf(':');
  1469.                     if(t >= 0){
  1470.                         s = v.substr(0, t).toLowerCase();
  1471.                         if(v.charAt(t + 1) == ' '){
  1472.                             ++t;
  1473.                         }
  1474.                         headerObj[s] = v.substr(t + 1);
  1475.                     }
  1476.                 });
  1477.             } catch(e) {}
  1478.                         
  1479.             return {
  1480.                 tId : o.tId,
  1481.                 status : conn.status,
  1482.                 statusText : conn.statusText,
  1483.                 getResponseHeader : function(header){return headerObj[header.toLowerCase()];},
  1484.                 getAllResponseHeaders : function(){return headerStr},
  1485.                 responseText : conn.responseText,
  1486.                 responseXML : conn.responseXML,
  1487.                 argument : callbackArg
  1488.             };
  1489.         }
  1490.         
  1491.         // private
  1492.         function releaseObject(o) {
  1493.             o.conn = null;
  1494.             o = null;
  1495.         }        
  1496.     
  1497.         // private
  1498.         function handleTransactionResponse(o, callback, isAbort, isTimeout) {
  1499.             if (!callback) {
  1500.                 releaseObject(o);
  1501.                 return;
  1502.             }
  1503.             var httpStatus, responseObject;
  1504.             try {
  1505.                 if (o.conn.status !== undefined && o.conn.status != 0) {
  1506.                     httpStatus = o.conn.status;
  1507.                 }
  1508.                 else {
  1509.                     httpStatus = 13030;
  1510.                 }
  1511.             }
  1512.             catch(e) {
  1513.                 httpStatus = 13030;
  1514.             }
  1515.             if ((httpStatus >= 200 && httpStatus < 300) || (Ext.isIE && httpStatus == 1223)) {
  1516.                 responseObject = createResponseObject(o, callback.argument);
  1517.                 if (callback.success) {
  1518.                     if (!callback.scope) {
  1519.                         callback.success(responseObject);
  1520.                     }
  1521.                     else {
  1522.                         callback.success.apply(callback.scope, [responseObject]);
  1523.                     }
  1524.                 }
  1525.             }
  1526.             else {
  1527.                 switch (httpStatus) {
  1528.                     case 12002:
  1529.                     case 12029:
  1530.                     case 12030:
  1531.                     case 12031:
  1532.                     case 12152:
  1533.                     case 13030:
  1534.                         responseObject = createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false), isTimeout);
  1535.                         if (callback.failure) {
  1536.                             if (!callback.scope) {
  1537.                                 callback.failure(responseObject);
  1538.                             }
  1539.                             else {
  1540.                                 callback.failure.apply(callback.scope, [responseObject]);
  1541.                             }
  1542.                         }
  1543.                         break;
  1544.                     default:
  1545.                         responseObject = createResponseObject(o, callback.argument);
  1546.                         if (callback.failure) {
  1547.                             if (!callback.scope) {
  1548.                                 callback.failure(responseObject);
  1549.                             }
  1550.                             else {
  1551.                                 callback.failure.apply(callback.scope, [responseObject]);
  1552.                             }
  1553.                         }
  1554.                 }
  1555.             }
  1556.             releaseObject(o);
  1557.             responseObject = null;
  1558.         }  
  1559.         
  1560.         // private
  1561.         function handleReadyState(o, callback){
  1562.     callback = callback || {};
  1563.             var conn = o.conn,
  1564.              tId = o.tId,
  1565.              poll = pub.poll,
  1566. cbTimeout = callback.timeout || null;
  1567.             if (cbTimeout) {
  1568.                 pub.timeout[tId] = setTimeout(function() {
  1569.                     pub.abort(o, callback, true);
  1570.                 }, cbTimeout);
  1571.             }
  1572.             poll[tId] = setInterval(
  1573.                 function() {
  1574.                     if (conn && conn.readyState == 4) {
  1575.                         clearInterval(poll[tId]);
  1576.                         poll[tId] = null;
  1577.                         if (cbTimeout) {
  1578.                             clearTimeout(pub.timeout[tId]);
  1579.                             pub.timeout[tId] = null;
  1580.                         }
  1581.                         handleTransactionResponse(o, callback);
  1582.                     }
  1583.                 },
  1584.                 pub.pollInterval);
  1585.         }
  1586.         
  1587.         // private
  1588.         function asyncRequest(method, uri, callback, postData) {
  1589.             var o = getConnectionObject() || null;
  1590.             if (o) {
  1591.                 o.conn.open(method, uri, true);
  1592.                 if (pub.useDefaultXhrHeader) {                    
  1593.                  initHeader('X-Requested-With', pub.defaultXhrHeader);
  1594.                 }
  1595.                 if(postData && pub.useDefaultHeader && (!pub.headers || !pub.headers[CONTENTTYPE])){
  1596.                     initHeader(CONTENTTYPE, pub.defaultPostHeader);
  1597.                 }
  1598.                 if (pub.defaultHeaders || pub.headers) {
  1599.                     setHeader(o);
  1600.                 }
  1601.                 handleReadyState(o, callback);
  1602.                 o.conn.send(postData || null);
  1603.             }
  1604.             return o;
  1605.         }
  1606.         
  1607.         // private
  1608.         function getConnectionObject() {
  1609.             var o;      
  1610.             try {
  1611.                 if (o = createXhrObject(pub.transactionId)) {
  1612.                     pub.transactionId++;
  1613.                 }
  1614.             } catch(e) {
  1615.             } finally {
  1616.                 return o;
  1617.             }
  1618.         }
  1619.        
  1620.         // private
  1621.         function createXhrObject(transactionId) {
  1622.             var http;
  1623.             
  1624.             try {
  1625.                 http = new XMLHttpRequest();                
  1626.             } catch(e) {
  1627.                 for (var i = 0; i < activeX.length; ++i) {             
  1628.                     try {
  1629.                         http = new ActiveXObject(activeX[i]);                        
  1630.                         break;
  1631.                     } catch(e) {}
  1632.                 }
  1633.             } finally {
  1634.                 return {conn : http, tId : transactionId};
  1635.             }
  1636.         }
  1637.          
  1638.     var pub = {
  1639.         request : function(method, uri, cb, data, options) {
  1640.     if(options){
  1641.         var me = this,         
  1642.          xmlData = options.xmlData,
  1643.          jsonData = options.jsonData,
  1644.                         hs;
  1645.         
  1646.         Ext.applyIf(me, options);         
  1647.             
  1648.             if(xmlData || jsonData){
  1649.                         hs = me.headers;
  1650.                         if(!hs || !hs[CONTENTTYPE]){
  1651.                 initHeader(CONTENTTYPE, xmlData ? 'text/xml' : 'application/json');
  1652.                         }
  1653.             data = xmlData || (Ext.isObject(jsonData) ? Ext.encode(jsonData) : jsonData);
  1654.         }
  1655.     }          
  1656.     return asyncRequest(method || options.method || "POST", uri, cb, data);
  1657.         },
  1658.         serializeForm : function(form) {
  1659.         var fElements = form.elements || (document.forms[form] || Ext.getDom(form)).elements,
  1660.              hasSubmit = false,
  1661.              encoder = encodeURIComponent,
  1662.          element,
  1663.              options, 
  1664.              name, 
  1665.              val,             
  1666.              data = '',
  1667.              type;
  1668.             
  1669.         Ext.each(fElements, function(element) {             
  1670.                 name = element.name;              
  1671. type = element.type;
  1672.                 if (!element.disabled && name){
  1673.                 if(/select-(one|multiple)/i.test(type)){                 
  1674.             Ext.each(element.options, function(opt) {
  1675.             if (opt.selected) {
  1676.             data += String.format("{0}={1}&",                 
  1677.               encoder(name),               
  1678.                (opt.hasAttribute ? opt.hasAttribute('value') : opt.getAttributeNode('value').specified) ? opt.value : opt.text);
  1679.                                 }
  1680.                             });
  1681.                 } else if(!/file|undefined|reset|button/i.test(type)) {
  1682.                 if(!(/radio|checkbox/i.test(type) && !element.checked) && !(type == 'submit' && hasSubmit)){
  1683.                                     
  1684.                                 data += encoder(name) + '=' + encoder(element.value) + '&';                     
  1685.                                 hasSubmit = /submit/i.test(type);    
  1686.                             }                  
  1687.                 } 
  1688.                 }
  1689.             });            
  1690.             return data.substr(0, data.length - 1);
  1691.         },
  1692.         
  1693.         useDefaultHeader : true,
  1694.         defaultPostHeader : 'application/x-www-form-urlencoded; charset=UTF-8',
  1695.         useDefaultXhrHeader : true,
  1696.         defaultXhrHeader : 'XMLHttpRequest',        
  1697.         poll : {},
  1698.         timeout : {},
  1699.         pollInterval : 50,
  1700.         transactionId : 0,
  1701.         
  1702. // This is never called - Is it worth exposing this?           
  1703. //          setProgId : function(id) {
  1704. //              activeX.unshift(id);
  1705. //          },
  1706. // This is never called - Is it worth exposing this?  
  1707. //          setDefaultPostHeader : function(b) {
  1708. //              this.useDefaultHeader = b;
  1709. //          },
  1710.         
  1711. // This is never called - Is it worth exposing this?  
  1712. //          setDefaultXhrHeader : function(b) {
  1713. //              this.useDefaultXhrHeader = b;
  1714. //          },
  1715. // This is never called - Is it worth exposing this?        
  1716. //          setPollingInterval : function(i) {
  1717. //              if (typeof i == 'number' && isFinite(i)) {
  1718. //                  this.pollInterval = i;
  1719. //              }
  1720. //          },
  1721.         
  1722. // This is never called - Is it worth exposing this?
  1723. //          resetDefaultHeaders : function() {
  1724. //              this.defaultHeaders = null;
  1725. //          },
  1726.         abort : function(o, callback, isTimeout) {
  1727.         var me = this,
  1728.          tId = o.tId,
  1729.          isAbort = false;
  1730.         
  1731.             if (me.isCallInProgress(o)) {
  1732.                 o.conn.abort();
  1733.                 clearInterval(me.poll[tId]);
  1734.                 me.poll[tId] = null;
  1735.                 if (isTimeout) {
  1736.                     me.timeout[tId] = null;
  1737.                 }
  1738.                 handleTransactionResponse(o, callback, (isAbort = true), isTimeout);                
  1739.             }
  1740.             return isAbort;
  1741.         },
  1742.         isCallInProgress : function(o) {
  1743.             // if there is a connection and readyState is not 0 or 4
  1744.             return o.conn && !{0:true,4:true}[o.conn.readyState];         
  1745.         }
  1746.     };
  1747.     return pub;
  1748.     }(); Ext.lib.Region = function(t, r, b, l) {
  1749. var me = this;
  1750.         me.top = t;
  1751.         me[1] = t;
  1752.         me.right = r;
  1753.         me.bottom = b;
  1754.         me.left = l;
  1755.         me[0] = l;
  1756.     };
  1757.     Ext.lib.Region.prototype = {
  1758.         contains : function(region) {
  1759.         var me = this;
  1760.             return ( region.left >= me.left &&
  1761.                      region.right <= me.right &&
  1762.                      region.top >= me.top &&
  1763.                      region.bottom <= me.bottom );
  1764.         },
  1765.         getArea : function() {
  1766.         var me = this;
  1767.             return ( (me.bottom - me.top) * (me.right - me.left) );
  1768.         },
  1769.         intersect : function(region) {
  1770.             var me = this,
  1771.              t = Math.max(me.top, region.top),
  1772.              r = Math.min(me.right, region.right),
  1773.              b = Math.min(me.bottom, region.bottom),
  1774.              l = Math.max(me.left, region.left);
  1775.             if (b >= t && r >= l) {
  1776.                 return new Ext.lib.Region(t, r, b, l);
  1777.             }
  1778.         },
  1779.         
  1780.         union : function(region) {
  1781.         var me = this,
  1782.              t = Math.min(me.top, region.top),
  1783.              r = Math.max(me.right, region.right),
  1784.              b = Math.max(me.bottom, region.bottom),
  1785.              l = Math.min(me.left, region.left);
  1786.             return new Ext.lib.Region(t, r, b, l);
  1787.         },
  1788.         constrainTo : function(r) {
  1789.         var me = this;
  1790.             me.top = me.top.constrain(r.top, r.bottom);
  1791.             me.bottom = me.bottom.constrain(r.top, r.bottom);
  1792.             me.left = me.left.constrain(r.left, r.right);
  1793.             me.right = me.right.constrain(r.left, r.right);
  1794.             return me;
  1795.         },
  1796.         adjust : function(t, l, b, r) {
  1797.         var me = this;
  1798.             me.top += t;
  1799.             me.left += l;
  1800.             me.right += r;
  1801.             me.bottom += b;
  1802.             return me;
  1803.         }
  1804.     };
  1805.     Ext.lib.Region.getRegion = function(el) {
  1806.         var p = Ext.lib.Dom.getXY(el),
  1807.          t = p[1],
  1808.          r = p[0] + el.offsetWidth,
  1809.          b = p[1] + el.offsetHeight,
  1810.          l = p[0];
  1811.         return new Ext.lib.Region(t, r, b, l);
  1812.     }; Ext.lib.Point = function(x, y) {
  1813.         if (Ext.isArray(x)) {
  1814.             y = x[1];
  1815.             x = x[0];
  1816.         }
  1817.         var me = this;
  1818.         me.x = me.right = me.left = me[0] = x;
  1819.         me.y = me.top = me.bottom = me[1] = y;
  1820.     };
  1821.     Ext.lib.Point.prototype = new Ext.lib.Region();
  1822. (function(){    
  1823.     var EXTLIB = Ext.lib,
  1824.         noNegatives = /width|height|opacity|padding/i,
  1825.         offsetAttribute = /^((width|height)|(top|left))$/,
  1826.         defaultUnit = /width|height|top$|bottom$|left$|right$/i,
  1827.         offsetUnit =  /d+(em|%|en|ex|pt|in|cm|mm|pc)$/i,
  1828.         isset = function(v){
  1829.             return typeof v !== 'undefined';
  1830.         },
  1831.         now = function(){
  1832.             return new Date();    
  1833.         };
  1834.         
  1835.     EXTLIB.Anim = {
  1836.         motion : function(el, args, duration, easing, cb, scope) {
  1837.             return this.run(el, args, duration, easing, cb, scope, Ext.lib.Motion);
  1838.         },
  1839.         run : function(el, args, duration, easing, cb, scope, type) {
  1840.             type = type || Ext.lib.AnimBase;
  1841.             if (typeof easing == "string") {
  1842.                 easing = Ext.lib.Easing[easing];
  1843.             }
  1844.             var anim = new type(el, args, duration, easing);
  1845.             anim.animateX(function() {
  1846.                 if(Ext.isFunction(cb)){
  1847.                     cb.call(scope);
  1848.                 }
  1849.             });
  1850.             return anim;
  1851.         }
  1852.     };
  1853.     
  1854.     EXTLIB.AnimBase = function(el, attributes, duration, method) {
  1855.         if (el) {
  1856.             this.init(el, attributes, duration, method);
  1857.         }
  1858.     };
  1859.     EXTLIB.AnimBase.prototype = {
  1860.         doMethod: function(attr, start, end) {
  1861.             var me = this;
  1862.             return me.method(me.curFrame, start, end - start, me.totalFrames);
  1863.         },
  1864.         setAttr: function(attr, val, unit) {
  1865.             if (noNegatives.test(attr) && val < 0) {
  1866.                 val = 0;
  1867.             }
  1868.             Ext.fly(this.el, '_anim').setStyle(attr, val + unit);
  1869.         },
  1870.         getAttr: function(attr) {
  1871.             var el = Ext.fly(this.el),
  1872.                 val = el.getStyle(attr),
  1873.                 a = offsetAttribute.exec(attr) || []
  1874.             if (val !== 'auto' && !offsetUnit.test(val)) {
  1875.                 return parseFloat(val);
  1876.             }
  1877.             return (!!(a[2]) || (el.getStyle('position') == 'absolute' && !!(a[3]))) ? el.dom['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)] : 0;
  1878.         },
  1879.         getDefaultUnit: function(attr) {
  1880.             return defaultUnit.test(attr) ? 'px' : '';
  1881.         },
  1882.         animateX : function(callback, scope) {
  1883.             var me = this,
  1884.                 f = function() {
  1885.                 me.onComplete.removeListener(f);
  1886.                 if (Ext.isFunction(callback)) {
  1887.                     callback.call(scope || me, me);
  1888.                 }
  1889.             };
  1890.             me.onComplete.addListener(f, me);
  1891.             me.animate();
  1892.         },
  1893.         setRunAttr: function(attr) {            
  1894.             var me = this,
  1895.                 a = this.attributes[attr],
  1896.                 to = a.to,
  1897.                 by = a.by,
  1898.                 from = a.from,
  1899.                 unit = a.unit,
  1900.                 ra = (this.runAttrs[attr] = {}),
  1901.                 end;
  1902.             if (!isset(to) && !isset(by)){
  1903.                 return false;
  1904.             }
  1905.             var start = isset(from) ? from : me.getAttr(attr);
  1906.             if (isset(to)) {
  1907.                 end = to;
  1908.             }else if(isset(by)) {
  1909.                 if (Ext.isArray(start)){
  1910.                     end = [];
  1911.                     Ext.each(start, function(v, i){
  1912.                         end[i] = v + by[i];
  1913.                     });
  1914.                 }else{
  1915.                     end = start + by;
  1916.                 }
  1917.             }
  1918.             Ext.apply(ra, {
  1919.                 start: start,
  1920.                 end: end,
  1921.                 unit: isset(unit) ? unit : me.getDefaultUnit(attr)
  1922.             });
  1923.         },
  1924.         init: function(el, attributes, duration, method) {
  1925.             var me = this,
  1926.                 actualFrames = 0,
  1927.                 mgr = EXTLIB.AnimMgr;
  1928.                 
  1929.             Ext.apply(me, {
  1930.                 isAnimated: false,
  1931.                 startTime: null,
  1932.                 el: Ext.getDom(el),
  1933.                 attributes: attributes || {},
  1934.                 duration: duration || 1,
  1935.                 method: method || EXTLIB.Easing.easeNone,
  1936.                 useSec: true,
  1937.                 curFrame: 0,
  1938.                 totalFrames: mgr.fps,
  1939.                 runAttrs: {},
  1940.                 animate: function(){
  1941.                     var me = this,
  1942.                         d = me.duration;
  1943.                     
  1944.                     if(me.isAnimated){
  1945.                         return false;
  1946.                     }
  1947.                     me.curFrame = 0;
  1948.                     me.totalFrames = me.useSec ? Math.ceil(mgr.fps * d) : d;
  1949.                     mgr.registerElement(me); 
  1950.                 },
  1951.                 
  1952.                 stop: function(finish){
  1953.                     var me = this;
  1954.                 
  1955.                     if(finish){
  1956.                         me.curFrame = me.totalFrames;
  1957.                         me._onTween.fire();
  1958.                     }
  1959.                     mgr.stop(me);
  1960.                 }
  1961.             });
  1962.             var onStart = function(){
  1963.                 var me = this,
  1964.                     attr;
  1965.                 
  1966.                 me.onStart.fire();
  1967.                 me.runAttrs = {};
  1968.                 for(attr in this.attributes){
  1969.                     this.setRunAttr(attr);
  1970.                 }
  1971.                 me.isAnimated = true;
  1972.                 me.startTime = now();
  1973.                 actualFrames = 0;
  1974.             };
  1975.             var onTween = function(){
  1976.                 var me = this;
  1977.                 me.onTween.fire({
  1978.                     duration: now() - me.startTime,
  1979.                     curFrame: me.curFrame
  1980.                 });
  1981.                 var ra = me.runAttrs;
  1982.                 for (var attr in ra) {
  1983.                     this.setAttr(attr, me.doMethod(attr, ra[attr].start, ra[attr].end), ra[attr].unit);
  1984.                 }
  1985.                 ++actualFrames;
  1986.             };
  1987.             var onComplete = function() {
  1988.                 var me = this,
  1989.                     actual = (now() - me.startTime) / 1000,
  1990.                     data = {
  1991.                         duration: actual,
  1992.                         frames: actualFrames,
  1993.                         fps: actualFrames / actual
  1994.                     };
  1995.                 me.isAnimated = false;
  1996.                 actualFrames = 0;
  1997.                 me.onComplete.fire(data);
  1998.             };
  1999.             me.onStart = new Ext.util.Event(me);
  2000.             me.onTween = new Ext.util.Event(me);            
  2001.             me.onComplete = new Ext.util.Event(me);
  2002.             (me._onStart = new Ext.util.Event(me)).addListener(onStart);
  2003.             (me._onTween = new Ext.util.Event(me)).addListener(onTween);
  2004.             (me._onComplete = new Ext.util.Event(me)).addListener(onComplete); 
  2005.         }
  2006.     };
  2007.     Ext.lib.AnimMgr = new function() {
  2008.         var me = this,
  2009.             thread = null,
  2010.             queue = [],
  2011.             tweenCount = 0;
  2012.         Ext.apply(me, {
  2013.             fps: 1000,
  2014.             delay: 1,
  2015.             registerElement: function(tween){
  2016.                 queue.push(tween);
  2017.                 ++tweenCount;
  2018.                 tween._onStart.fire();
  2019.                 me.start();
  2020.             },
  2021.             
  2022.             unRegister: function(tween, index){
  2023.                 tween._onComplete.fire();
  2024.                 index = index || getIndex(tween);
  2025.                 if (index != -1) {
  2026.                     queue.splice(index, 1);
  2027.                 }
  2028.                 if (--tweenCount <= 0) {
  2029.                     me.stop();
  2030.                 }
  2031.             },
  2032.             
  2033.             start: function(){
  2034.                 if(thread === null){
  2035.                     thread = setInterval(me.run, me.delay);
  2036.                 }
  2037.             },
  2038.             
  2039.             stop: function(tween){
  2040.                 if(!tween){
  2041.                     clearInterval(thread);
  2042.                     for(var i = 0, len = queue.length; i < len; ++i){
  2043.                         if(queue[0].isAnimated){
  2044.                             me.unRegister(queue[0], 0);
  2045.                         }
  2046.                     }
  2047.                     queue = [];
  2048.                     thread = null;
  2049.                     tweenCount = 0;
  2050.                 }else{
  2051.                     me.unRegister(tween);
  2052.                 }
  2053.             },
  2054.             
  2055.             run: function(){
  2056.                 var tf;
  2057.                 Ext.each(queue, function(tween){
  2058.                     if(tween && tween.isAnimated){
  2059.                         tf = tween.totalFrames;
  2060.                         if(tween.curFrame < tf || tf === null){
  2061.                             ++tween.curFrame;
  2062.                             if(tween.useSec){
  2063.                                 correctFrame(tween);
  2064.                             }
  2065.                             tween._onTween.fire();
  2066.                         }else{
  2067.                             me.stop(tween);
  2068.                         }
  2069.                     }
  2070.                 }, me);
  2071.             }
  2072.         });
  2073.         var getIndex = function(anim) {
  2074.             var out = -1;
  2075.             Ext.each(queue, function(item, idx){
  2076.                 if(item == anim){
  2077.                     out = idx;
  2078.                     return false;
  2079.                 }
  2080.             });
  2081.             return out;
  2082.         };
  2083.         var correctFrame = function(tween) {
  2084.             var frames = tween.totalFrames,
  2085.                 frame = tween.curFrame,
  2086.                 duration = tween.duration,
  2087.                 expected = (frame * duration * 1000 / frames),
  2088.                 elapsed = (now() - tween.startTime),
  2089.                 tweak = 0;
  2090.             if(elapsed < duration * 1000){
  2091.                 tweak = Math.round((elapsed / expected - 1) * frame);
  2092.             }else{
  2093.                 tweak = frames - (frame + 1);
  2094.             }
  2095.             if(tweak > 0 && isFinite(tweak)){
  2096.                 if(tween.curFrame + tweak >= frames){
  2097.                     tweak = frames - (frame + 1);
  2098.                 }
  2099.                 tween.curFrame += tweak;
  2100.             }
  2101.         };
  2102.     };
  2103.     EXTLIB.Bezier = new function() {
  2104.         this.getPosition = function(points, t) {
  2105.             var n = points.length,
  2106.                 tmp = [],
  2107.                 c = 1 - t, 
  2108.                 i,
  2109.                 j;
  2110.             for (i = 0; i < n; ++i) {
  2111.                 tmp[i] = [points[i][0], points[i][1]];
  2112.             }
  2113.             for (j = 1; j < n; ++j) {
  2114.                 for (i = 0; i < n - j; ++i) {
  2115.                     tmp[i][0] = c * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0];
  2116.                     tmp[i][1] = c * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1];
  2117.                 }
  2118.             }
  2119.             return [ tmp[0][0], tmp[0][1] ];
  2120.         };
  2121.     };
  2122.     EXTLIB.Easing = {
  2123.         easeNone: function (t, b, c, d) {
  2124.             return c * t / d + b;
  2125.         },
  2126.         easeIn: function (t, b, c, d) {
  2127.             return c * (t /= d) * t + b;
  2128.         },
  2129.         easeOut: function (t, b, c, d) {
  2130.             return -c * (t /= d) * (t - 2) + b;
  2131.         }
  2132.     };
  2133.     (function() {
  2134.         EXTLIB.Motion = function(el, attributes, duration, method) {
  2135.             if (el) {
  2136.                 EXTLIB.Motion.superclass.constructor.call(this, el, attributes, duration, method);
  2137.             }
  2138.         };
  2139.         Ext.extend(EXTLIB.Motion, Ext.lib.AnimBase);
  2140.         var superclass = EXTLIB.Motion.superclass,
  2141.             proto = EXTLIB.Motion.prototype,
  2142.             pointsRe = /^points$/i;
  2143.         Ext.apply(EXTLIB.Motion.prototype, {
  2144.             setAttr: function(attr, val, unit){
  2145.                 var me = this,
  2146.                     setAttr = superclass.setAttr;
  2147.                     
  2148.                 if (pointsRe.test(attr)) {
  2149.                     unit = unit || 'px';
  2150.                     setAttr.call(me, 'left', val[0], unit);
  2151.                     setAttr.call(me, 'top', val[1], unit);
  2152.                 } else {
  2153.                     setAttr.call(me, attr, val, unit);
  2154.                 }
  2155.             },
  2156.             
  2157.             getAttr: function(attr){
  2158.                 var me = this,
  2159.                     getAttr = superclass.getAttr;
  2160.                     
  2161.                 return pointsRe.test(attr) ? [getAttr.call(me, 'left'), getAttr.call(me, 'top')] : getAttr.call(me, attr);
  2162.             },
  2163.             
  2164.             doMethod: function(attr, start, end){
  2165.                 var me = this;
  2166.                 
  2167.                 return pointsRe.test(attr)
  2168.                         ? EXTLIB.Bezier.getPosition(me.runAttrs[attr], me.method(me.curFrame, 0, 100, me.totalFrames) / 100)
  2169.                         : superclass.doMethod.call(me, attr, start, end);
  2170.             },
  2171.             
  2172.             setRunAttr: function(attr){
  2173.                 if(pointsRe.test(attr)){
  2174.                     
  2175.                     var me = this,
  2176.                         el = this.el,
  2177.                         points = this.attributes.points,
  2178.                         control = points.control || [],
  2179.                         from = points.from,
  2180.                         to = points.to,
  2181.                         by = points.by,
  2182.                         DOM = EXTLIB.Dom,
  2183.                         start,
  2184.                         i,
  2185.                         end,
  2186.                         len,
  2187.                         ra;
  2188.                   
  2189.                     if(control.length > 0 && !Ext.isArray(control[0])){
  2190.                         control = [control];
  2191.                     }else{
  2192.                         /*
  2193.                         var tmp = [];
  2194.                         for (i = 0,len = control.length; i < len; ++i) {
  2195.                             tmp[i] = control[i];
  2196.                         }
  2197.                         control = tmp;
  2198.                         */
  2199.                     }
  2200.                     Ext.fly(el, '_anim').position();
  2201.                     DOM.setXY(el, isset(from) ? from : DOM.getXY(el));
  2202.                     start = me.getAttr('points');
  2203.                     if(isset(to)){
  2204.                         end = translateValues.call(me, to, start);
  2205.                         for (i = 0,len = control.length; i < len; ++i) {
  2206.                             control[i] = translateValues.call(me, control[i], start);
  2207.                         }
  2208.                     } else if (isset(by)) {
  2209.                         end = [start[0] + by[0], start[1] + by[1]];
  2210.                         for (i = 0,len = control.length; i < len; ++i) {
  2211.                             control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ];
  2212.                         }
  2213.                     }
  2214.                     ra = this.runAttrs[attr] = [start];
  2215.                     if (control.length > 0) {
  2216.                         ra = ra.concat(control);
  2217.                     }
  2218.                     ra[ra.length] = end;
  2219.                 }else{
  2220.                     superclass.setRunAttr.call(this, attr);
  2221.                 }
  2222.             }
  2223.         });
  2224.         var translateValues = function(val, start) {
  2225.             var pageXY = EXTLIB.Dom.getXY(this.el);
  2226.             return [val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1]];
  2227.         };
  2228.     })();
  2229. })();// Easing functions
  2230. (function(){
  2231. // shortcuts to aid compression
  2232. var abs = Math.abs,
  2233.   pi = Math.PI,
  2234.   asin = Math.asin,
  2235.   pow = Math.pow,
  2236.   sin = Math.sin,
  2237. EXTLIB = Ext.lib;
  2238.  
  2239.     Ext.apply(EXTLIB.Easing, {
  2240.         
  2241.         easeBoth: function (t, b, c, d) {
  2242.         return ((t /= d / 2) < 1)  ?  c / 2 * t * t + b  :  -c / 2 * ((--t) * (t - 2) - 1) + b;               
  2243.         },
  2244.         
  2245.         easeInStrong: function (t, b, c, d) {
  2246.             return c * (t /= d) * t * t * t + b;
  2247.         },
  2248.         easeOutStrong: function (t, b, c, d) {
  2249.             return -c * ((t = t / d - 1) * t * t * t - 1) + b;
  2250.         },
  2251.         easeBothStrong: function (t, b, c, d) {
  2252.             return ((t /= d / 2) < 1)  ?  c / 2 * t * t * t * t + b  :  -c / 2 * ((t -= 2) * t * t * t - 2) + b;
  2253.         },
  2254.         elasticIn: function (t, b, c, d, a, p) {
  2255.         if (t == 0 || (t /= d) == 1) {
  2256.                 return t == 0 ? b : b + c;
  2257.             }             
  2258.             p = p || (d * .3);             
  2259. var s;
  2260. if (a >= abs(c)) {
  2261. s = p / (2 * pi) * asin(c / a);
  2262. } else {
  2263. a = c;
  2264. s = p / 4;
  2265. }
  2266.             return -(a * pow(2, 10 * (t -= 1)) * sin((t * d - s) * (2 * pi) / p)) + b;
  2267.                    
  2268.         }, 
  2269. elasticOut: function (t, b, c, d, a, p) {
  2270.         if (t == 0 || (t /= d) == 1) {
  2271.                 return t == 0 ? b : b + c;
  2272.             }             
  2273.             p = p || (d * .3);             
  2274. var s;
  2275. if (a >= abs(c)) {
  2276. s = p / (2 * pi) * asin(c / a);
  2277. } else {
  2278. a = c;
  2279. s = p / 4;
  2280. }
  2281.             return a * pow(2, -10 * t) * sin((t * d - s) * (2 * pi) / p) + c + b;  
  2282.         }, 
  2283.         elasticBoth: function (t, b, c, d, a, p) {
  2284.             if (t == 0 || (t /= d / 2) == 2) {
  2285.                 return t == 0 ? b : b + c;
  2286.             }          
  2287.             
  2288.             p = p || (d * (.3 * 1.5));              
  2289.             var s;
  2290.             if (a >= abs(c)) {
  2291.             s = p / (2 * pi) * asin(c / a);
  2292.             } else {
  2293.             a = c;
  2294.                 s = p / 4;
  2295.             }
  2296.             return t < 1 ?
  2297.                  -.5 * (a * pow(2, 10 * (t -= 1)) * sin((t * d - s) * (2 * pi) / p)) + b :
  2298.                     a * pow(2, -10 * (t -= 1)) * sin((t * d - s) * (2 * pi) / p) * .5 + c + b;
  2299.         },
  2300.         backIn: function (t, b, c, d, s) {
  2301.             s = s ||  1.70158;              
  2302.             return c * (t /= d) * t * ((s + 1) * t - s) + b;
  2303.         },
  2304.         backOut: function (t, b, c, d, s) {
  2305.             if (!s) {
  2306.                 s = 1.70158;
  2307.             }
  2308.             return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
  2309.         },
  2310.         backBoth: function (t, b, c, d, s) {
  2311.             s = s || 1.70158;              
  2312.             return ((t /= d / 2 ) < 1) ?
  2313.                     c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b :              
  2314.              c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;
  2315.         },
  2316.         bounceIn: function (t, b, c, d) {
  2317.             return c - EXTLIB.Easing.bounceOut(d - t, 0, c, d) + b;
  2318.         },
  2319.         bounceOut: function (t, b, c, d) {
  2320.         if ((t /= d) < (1 / 2.75)) {
  2321.                 return c * (7.5625 * t * t) + b;
  2322.             } else if (t < (2 / 2.75)) {
  2323.                 return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;
  2324.             } else if (t < (2.5 / 2.75)) {
  2325.                 return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;
  2326.             }
  2327.             return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;
  2328.         },
  2329.         bounceBoth: function (t, b, c, d) {
  2330.             return (t < d / 2) ?
  2331.                    EXTLIB.Easing.bounceIn(t * 2, 0, c, d) * .5 + b : 
  2332.                 EXTLIB.Easing.bounceOut(t * 2 - d, 0, c, d) * .5 + c * .5 + b;
  2333.         }
  2334.     });
  2335. })();
  2336. (function() {
  2337.     var EXTLIB = Ext.lib;
  2338. // Color Animation
  2339. EXTLIB.Anim.color = function(el, args, duration, easing, cb, scope) {
  2340.     return EXTLIB.Anim.run(el, args, duration, easing, cb, scope, EXTLIB.ColorAnim);
  2341. }
  2342.     EXTLIB.ColorAnim = function(el, attributes, duration, method) {
  2343.         EXTLIB.ColorAnim.superclass.constructor.call(this, el, attributes, duration, method);
  2344.     };
  2345.     Ext.extend(EXTLIB.ColorAnim, EXTLIB.AnimBase);
  2346.     var superclass = EXTLIB.ColorAnim.superclass,
  2347.      colorRE = /color$/i,
  2348.      transparentRE = /^transparent|rgba(0, 0, 0, 0)$/,
  2349.         rgbRE = /^rgb(([0-9]+)s*,s*([0-9]+)s*,s*([0-9]+))$/i,
  2350.         hexRE= /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,
  2351.         hex3RE = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i,
  2352.         isset = function(v){
  2353.             return typeof v !== 'undefined';
  2354.         }
  2355.          
  2356.     // private
  2357.     function parseColor(s) {
  2358.         var pi = parseInt,
  2359.             base,
  2360.             out = null,
  2361.             c;
  2362.         
  2363.     if (s.length == 3) {
  2364.             return s;
  2365.         }
  2366.         
  2367.         Ext.each([hexRE, rgbRE, hex3RE], function(re, idx){
  2368.             base = (idx % 2 == 0) ? 16 : 10;
  2369.             c = re.exec(s);
  2370.             if(c && c.length == 4){
  2371.                 out = [pi(c[1], base), pi(c[2], base), pi(c[3], base)];
  2372.                 return false;
  2373.             }
  2374.         });
  2375.         return out;
  2376.     }
  2377.     Ext.apply(EXTLIB.ColorAnim.prototype, {
  2378.         getAttr : function(attr) {
  2379.             var me = this,
  2380.                 el = me.el,
  2381.                 val;                
  2382.             if(colorRE.test(attr)){
  2383.                 while(el && transparentRE.test(val = Ext.fly(el).getStyle(attr))){
  2384.                     el = el.parentNode;
  2385.                     val = "fff";
  2386.                 }
  2387.             }else{
  2388.                 val = superclass.getAttr.call(me, attr);
  2389.             }
  2390.             return val;
  2391.         },
  2392.         doMethod : function(attr, start, end) {
  2393.             var me = this,
  2394.              val,
  2395.              floor = Math.floor;            
  2396.             if(colorRE.test(attr)){
  2397.                 val = [];
  2398.              
  2399.             Ext.each(start, function(v, i) {
  2400.                     val[i] = superclass.doMethod.call(me, attr, v, end[i]);
  2401.                 });
  2402.                 val = 'rgb(' + floor(val[0]) + ',' + floor(val[1]) + ',' + floor(val[2]) + ')';
  2403.             }else{
  2404.                 val = superclass.doMethod.call(me, attr, start, end);
  2405.             }
  2406.             return val;
  2407.         },
  2408.         setRunAttr : function(attr) {
  2409.             var me = this,
  2410.                 a = me.attributes[attr],
  2411.                 to = a.to,
  2412.                 by = a.by,
  2413.                 ra;
  2414.                 
  2415.             superclass.setRunAttr.call(me, attr);
  2416.             ra = me.runAttrs[attr];
  2417.             if(colorRE.test(attr)){
  2418.                 var start = parseColor(ra.start),
  2419.                     end = parseColor(ra.end);
  2420.                 if(!isset(to) && isset(by)){
  2421.                     end = parseColor(by);
  2422.                     Ext.each(start, function(item, i){
  2423.                         end[i] = item + end[i];
  2424.                     });
  2425.                 }
  2426.                 ra.start = start;
  2427.                 ra.end = end;
  2428.             }
  2429.         }
  2430. });
  2431. })();
  2432. (function() {
  2433.     // Scroll Animation
  2434.     var EXTLIB = Ext.lib;
  2435. EXTLIB.Anim.scroll = function(el, args, duration, easing, cb, scope) {         
  2436.     return EXTLIB.Anim.run(el, args, duration, easing, cb, scope, EXTLIB.Scroll);
  2437. }
  2438.     EXTLIB.Scroll = function(el, attributes, duration, method) {
  2439.         if(el){
  2440.             EXTLIB.Scroll.superclass.constructor.call(this, el, attributes, duration, method);
  2441.         }
  2442.     };
  2443.     Ext.extend(EXTLIB.Scroll, EXTLIB.ColorAnim);
  2444.     var superclass = EXTLIB.Scroll.superclass,
  2445.      SCROLL = 'scroll';
  2446.     Ext.apply(EXTLIB.Scroll.prototype, {
  2447.         doMethod : function(attr, start, end) {
  2448.             var val,
  2449.              me = this,
  2450.              curFrame = me.curFrame,
  2451.              totalFrames = me.totalFrames;
  2452.             if(attr == SCROLL){
  2453.                 val = [me.method(curFrame, start[0], end[0] - start[0], totalFrames),
  2454.                        me.method(curFrame, start[1], end[1] - start[1], totalFrames)];
  2455.             }else{
  2456.                 val = superclass.doMethod.call(me, attr, start, end);
  2457.             }
  2458.             return val;
  2459.         },
  2460.         getAttr : function(attr) {
  2461.             var me = this;
  2462.             if (attr == SCROLL) {
  2463.                 return [me.el.scrollLeft, me.el.scrollTop];
  2464.             }else{
  2465.                 return superclass.getAttr.call(me, attr);
  2466.             }
  2467.         },
  2468.         setAttr : function(attr, val, unit) {
  2469.             var me = this;
  2470.             if(attr == SCROLL){
  2471.                 me.el.scrollLeft = val[0];
  2472.                 me.el.scrollTop = val[1];
  2473.             }else{
  2474.                 superclass.setAttr.call(me, attr, val, unit);
  2475.             }
  2476.         }
  2477.     });
  2478. })();
  2479. if(Ext.isIE) {
  2480.         function fnCleanUp() {
  2481.             var p = Function.prototype;
  2482.             delete p.createSequence;
  2483.             delete p.defer;
  2484.             delete p.createDelegate;
  2485.             delete p.createCallback;
  2486.             delete p.createInterceptor;
  2487.             window.detachEvent("onunload", fnCleanUp);
  2488.         }
  2489.         window.attachEvent("onunload", fnCleanUp);
  2490.     }
  2491. })();