roojs-core-debug.js
authorAlan Knowles <alan@akbkhome.com>
Mon, 1 Aug 2011 10:25:32 +0000 (18:25 +0800)
committerAlan Knowles <alan@akbkhome.com>
Mon, 1 Aug 2011 10:25:32 +0000 (18:25 +0800)
roojs-core-debug.js

index e214d1b..7611660 100644 (file)
@@ -12769,1693 +12769,4 @@ mc.add(otherEl);
  * @param {String/Number} key The key or index of the item.
  * @return {Object} The item associated with the passed key.
  */
-Roo.util.MixedCollection.prototype.get = Roo.util.MixedCollection.prototype.item;/*
- * Based on:
- * Ext JS Library 1.1.1
- * Copyright(c) 2006-2007, Ext JS, LLC.
- *
- * Originally Released Under LGPL - original licence link has changed is not relivant.
- *
- * Fork - LGPL
- * <script type="text/javascript">
- */
-/**
- * @class Roo.util.JSON
- * Modified version of Douglas Crockford"s json.js that doesn"t
- * mess with the Object prototype 
- * http://www.json.org/js.html
- * @singleton
- */
-Roo.util.JSON = new (function(){
-    var useHasOwn = {}.hasOwnProperty ? true : false;
-    
-    // crashes Safari in some instances
-    //var validRE = /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/;
-    
-    var pad = function(n) {
-        return n < 10 ? "0" + n : n;
-    };
-    
-    var m = {
-        "\b": '\\b',
-        "\t": '\\t',
-        "\n": '\\n',
-        "\f": '\\f',
-        "\r": '\\r',
-        '"' : '\\"',
-        "\\": '\\\\'
-    };
-
-    var encodeString = function(s){
-        if (/["\\\x00-\x1f]/.test(s)) {
-            return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) {
-                var c = m[b];
-                if(c){
-                    return c;
-                }
-                c = b.charCodeAt();
-                return "\\u00" +
-                    Math.floor(c / 16).toString(16) +
-                    (c % 16).toString(16);
-            }) + '"';
-        }
-        return '"' + s + '"';
-    };
-    
-    var encodeArray = function(o){
-        var a = ["["], b, i, l = o.length, v;
-            for (i = 0; i < l; i += 1) {
-                v = o[i];
-                switch (typeof v) {
-                    case "undefined":
-                    case "function":
-                    case "unknown":
-                        break;
-                    default:
-                        if (b) {
-                            a.push(',');
-                        }
-                        a.push(v === null ? "null" : Roo.util.JSON.encode(v));
-                        b = true;
-                }
-            }
-            a.push("]");
-            return a.join("");
-    };
-    
-    var encodeDate = function(o){
-        return '"' + o.getFullYear() + "-" +
-                pad(o.getMonth() + 1) + "-" +
-                pad(o.getDate()) + "T" +
-                pad(o.getHours()) + ":" +
-                pad(o.getMinutes()) + ":" +
-                pad(o.getSeconds()) + '"';
-    };
-    
-    /**
-     * Encodes an Object, Array or other value
-     * @param {Mixed} o The variable to encode
-     * @return {String} The JSON string
-     */
-    this.encode = function(o)
-    {
-        // should this be extended to fully wrap stringify..
-        
-        if(typeof o == "undefined" || o === null){
-            return "null";
-        }else if(o instanceof Array){
-            return encodeArray(o);
-        }else if(o instanceof Date){
-            return encodeDate(o);
-        }else if(typeof o == "string"){
-            return encodeString(o);
-        }else if(typeof o == "number"){
-            return isFinite(o) ? String(o) : "null";
-        }else if(typeof o == "boolean"){
-            return String(o);
-        }else {
-            var a = ["{"], b, i, v;
-            for (i in o) {
-                if(!useHasOwn || o.hasOwnProperty(i)) {
-                    v = o[i];
-                    switch (typeof v) {
-                    case "undefined":
-                    case "function":
-                    case "unknown":
-                        break;
-                    default:
-                        if(b){
-                            a.push(',');
-                        }
-                        a.push(this.encode(i), ":",
-                                v === null ? "null" : this.encode(v));
-                        b = true;
-                    }
-                }
-            }
-            a.push("}");
-            return a.join("");
-        }
-    };
-    
-    /**
-     * Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws a SyntaxError.
-     * @param {String} json The JSON string
-     * @return {Object} The resulting object
-     */
-    this.decode = function(json){
-        
-        return  /** eval:var:json */ eval("(" + json + ')');
-    };
-})();
-/** 
- * Shorthand for {@link Roo.util.JSON#encode}
- * @member Roo encode 
- * @method */
-Roo.encode = typeof(JSON) != 'undefined' && JSON.stringify ? JSON.stringify : Roo.util.JSON.encode;
-/** 
- * Shorthand for {@link Roo.util.JSON#decode}
- * @member Roo decode 
- * @method */
-Roo.decode = typeof(JSON) != 'undefined' && JSON.parse ? JSON.parse : Roo.util.JSON.decode;
-/*
- * Based on:
- * Ext JS Library 1.1.1
- * Copyright(c) 2006-2007, Ext JS, LLC.
- *
- * Originally Released Under LGPL - original licence link has changed is not relivant.
- *
- * Fork - LGPL
- * <script type="text/javascript">
- */
-/**
- * @class Roo.util.Format
- * Reusable data formatting functions
- * @singleton
- */
-Roo.util.Format = function(){
-    var trimRe = /^\s+|\s+$/g;
-    return {
-        /**
-         * Truncate a string and add an ellipsis ('...') to the end if it exceeds the specified length
-         * @param {String} value The string to truncate
-         * @param {Number} length The maximum length to allow before truncating
-         * @return {String} The converted text
-         */
-        ellipsis : function(value, len){
-            if(value && value.length > len){
-                return value.substr(0, len-3)+"...";
-            }
-            return value;
-        },
-
-        /**
-         * Checks a reference and converts it to empty string if it is undefined
-         * @param {Mixed} value Reference to check
-         * @return {Mixed} Empty string if converted, otherwise the original value
-         */
-        undef : function(value){
-            return typeof value != "undefined" ? value : "";
-        },
-
-        /**
-         * Convert certain characters (&, <, >, and ') to their HTML character equivalents for literal display in web pages.
-         * @param {String} value The string to encode
-         * @return {String} The encoded text
-         */
-        htmlEncode : function(value){
-            return !value ? value : String(value).replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
-        },
-
-        /**
-         * Convert certain characters (&, <, >, and ') from their HTML character equivalents.
-         * @param {String} value The string to decode
-         * @return {String} The decoded text
-         */
-        htmlDecode : function(value){
-            return !value ? value : String(value).replace(/&amp;/g, "&").replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&quot;/g, '"');
-        },
-
-        /**
-         * Trims any whitespace from either side of a string
-         * @param {String} value The text to trim
-         * @return {String} The trimmed text
-         */
-        trim : function(value){
-            return String(value).replace(trimRe, "");
-        },
-
-        /**
-         * Returns a substring from within an original string
-         * @param {String} value The original text
-         * @param {Number} start The start index of the substring
-         * @param {Number} length The length of the substring
-         * @return {String} The substring
-         */
-        substr : function(value, start, length){
-            return String(value).substr(start, length);
-        },
-
-        /**
-         * Converts a string to all lower case letters
-         * @param {String} value The text to convert
-         * @return {String} The converted text
-         */
-        lowercase : function(value){
-            return String(value).toLowerCase();
-        },
-
-        /**
-         * Converts a string to all upper case letters
-         * @param {String} value The text to convert
-         * @return {String} The converted text
-         */
-        uppercase : function(value){
-            return String(value).toUpperCase();
-        },
-
-        /**
-         * Converts the first character only of a string to upper case
-         * @param {String} value The text to convert
-         * @return {String} The converted text
-         */
-        capitalize : function(value){
-            return !value ? value : value.charAt(0).toUpperCase() + value.substr(1).toLowerCase();
-        },
-
-        // private
-        call : function(value, fn){
-            if(arguments.length > 2){
-                var args = Array.prototype.slice.call(arguments, 2);
-                args.unshift(value);
-                 
-                return /** eval:var:value */  eval(fn).apply(window, args);
-            }else{
-                /** eval:var:value */
-                return /** eval:var:value */ eval(fn).call(window, value);
-            }
-        },
-
-       
-        /**
-         * safer version of Math.toFixed..??/
-         * @param {Number/String} value The numeric value to format
-         * @param {Number/String} value Decimal places 
-         * @return {String} The formatted currency string
-         */
-        toFixed : function(v, n)
-        {
-            // why not use to fixed - precision is buggered???
-            if (!n) {
-                return Math.round(v-0);
-            }
-            var fact = Math.pow(10,n+1);
-            v = (Math.round((v-0)*fact))/fact;
-            var z = (''+fact).substring(2);
-            if (v == Math.floor(v)) {
-                return Math.floor(v) + '.' + z;
-            }
-            
-            // now just padd decimals..
-            var ps = String(v).split('.');
-            var fd = (ps[1] + z);
-            var r = fd.substring(0,n); 
-            var rm = fd.substring(n); 
-            if (rm < 5) {
-                return ps[0] + '.' + r;
-            }
-            r*=1; // turn it into a number;
-            r++;
-            if (String(r).length != n) {
-                ps[0]*=1;
-                ps[0]++;
-                r = String(r).substring(1); // chop the end off.
-            }
-            
-            return ps[0] + '.' + r;
-             
-        },
-        
-        /**
-         * Format a number as US currency
-         * @param {Number/String} value The numeric value to format
-         * @return {String} The formatted currency string
-         */
-        usMoney : function(v){
-            v = (Math.round((v-0)*100))/100;
-            v = (v == Math.floor(v)) ? v + ".00" : ((v*10 == Math.floor(v*10)) ? v + "0" : v);
-            v = String(v);
-            var ps = v.split('.');
-            var whole = ps[0];
-            var sub = ps[1] ? '.'+ ps[1] : '.00';
-            var r = /(\d+)(\d{3})/;
-            while (r.test(whole)) {
-                whole = whole.replace(r, '$1' + ',' + '$2');
-            }
-            return "$" + whole + sub ;
-        },
-        
-        /**
-         * Parse a value into a formatted date using the specified format pattern.
-         * @param {Mixed} value The value to format
-         * @param {String} format (optional) Any valid date format string (defaults to 'm/d/Y')
-         * @return {String} The formatted date string
-         */
-        date : function(v, format){
-            if(!v){
-                return "";
-            }
-            if(!(v instanceof Date)){
-                v = new Date(Date.parse(v));
-            }
-            return v.dateFormat(format || "m/d/Y");
-        },
-
-        /**
-         * Returns a date rendering function that can be reused to apply a date format multiple times efficiently
-         * @param {String} format Any valid date format string
-         * @return {Function} The date formatting function
-         */
-        dateRenderer : function(format){
-            return function(v){
-                return Roo.util.Format.date(v, format);  
-            };
-        },
-
-        // private
-        stripTagsRE : /<\/?[^>]+>/gi,
-        
-        /**
-         * Strips all HTML tags
-         * @param {Mixed} value The text from which to strip tags
-         * @return {String} The stripped text
-         */
-        stripTags : function(v){
-            return !v ? v : String(v).replace(this.stripTagsRE, "");
-        }
-    };
-}();/*
- * Based on:
- * Ext JS Library 1.1.1
- * Copyright(c) 2006-2007, Ext JS, LLC.
- *
- * Originally Released Under LGPL - original licence link has changed is not relivant.
- *
- * Fork - LGPL
- * <script type="text/javascript">
- */
-
-
-
-/**
- * @class Roo.MasterTemplate
- * @extends Roo.Template
- * Provides a template that can have child templates. The syntax is:
-<pre><code>
-var t = new Roo.MasterTemplate(
-       '&lt;select name="{name}"&gt;',
-               '&lt;tpl name="options"&gt;&lt;option value="{value:trim}"&gt;{text:ellipsis(10)}&lt;/option&gt;&lt;/tpl&gt;',
-       '&lt;/select&gt;'
-);
-t.add('options', {value: 'foo', text: 'bar'});
-// or you can add multiple child elements in one shot
-t.addAll('options', [
-    {value: 'foo', text: 'bar'},
-    {value: 'foo2', text: 'bar2'},
-    {value: 'foo3', text: 'bar3'}
-]);
-// then append, applying the master template values
-t.append('my-form', {name: 'my-select'});
-</code></pre>
-* A name attribute for the child template is not required if you have only one child
-* template or you want to refer to them by index.
- */
-Roo.MasterTemplate = function(){
-    Roo.MasterTemplate.superclass.constructor.apply(this, arguments);
-    this.originalHtml = this.html;
-    var st = {};
-    var m, re = this.subTemplateRe;
-    re.lastIndex = 0;
-    var subIndex = 0;
-    while(m = re.exec(this.html)){
-        var name = m[1], content = m[2];
-        st[subIndex] = {
-            name: name,
-            index: subIndex,
-            buffer: [],
-            tpl : new Roo.Template(content)
-        };
-        if(name){
-            st[name] = st[subIndex];
-        }
-        st[subIndex].tpl.compile();
-        st[subIndex].tpl.call = this.call.createDelegate(this);
-        subIndex++;
-    }
-    this.subCount = subIndex;
-    this.subs = st;
-};
-Roo.extend(Roo.MasterTemplate, Roo.Template, {
-    /**
-    * The regular expression used to match sub templates
-    * @type RegExp
-    * @property
-    */
-    subTemplateRe : /<tpl(?:\sname="([\w-]+)")?>((?:.|\n)*?)<\/tpl>/gi,
-
-    /**
-     * Applies the passed values to a child template.
-     * @param {String/Number} name (optional) The name or index of the child template
-     * @param {Array/Object} values The values to be applied to the template
-     * @return {MasterTemplate} this
-     */
-     add : function(name, values){
-        if(arguments.length == 1){
-            values = arguments[0];
-            name = 0;
-        }
-        var s = this.subs[name];
-        s.buffer[s.buffer.length] = s.tpl.apply(values);
-        return this;
-    },
-
-    /**
-     * Applies all the passed values to a child template.
-     * @param {String/Number} name (optional) The name or index of the child template
-     * @param {Array} values The values to be applied to the template, this should be an array of objects.
-     * @param {Boolean} reset (optional) True to reset the template first
-     * @return {MasterTemplate} this
-     */
-    fill : function(name, values, reset){
-        var a = arguments;
-        if(a.length == 1 || (a.length == 2 && typeof a[1] == "boolean")){
-            values = a[0];
-            name = 0;
-            reset = a[1];
-        }
-        if(reset){
-            this.reset();
-        }
-        for(var i = 0, len = values.length; i < len; i++){
-            this.add(name, values[i]);
-        }
-        return this;
-    },
-
-    /**
-     * Resets the template for reuse
-     * @return {MasterTemplate} this
-     */
-     reset : function(){
-        var s = this.subs;
-        for(var i = 0; i < this.subCount; i++){
-            s[i].buffer = [];
-        }
-        return this;
-    },
-
-    applyTemplate : function(values){
-        var s = this.subs;
-        var replaceIndex = -1;
-        this.html = this.originalHtml.replace(this.subTemplateRe, function(m, name){
-            return s[++replaceIndex].buffer.join("");
-        });
-        return Roo.MasterTemplate.superclass.applyTemplate.call(this, values);
-    },
-
-    apply : function(){
-        return this.applyTemplate.apply(this, arguments);
-    },
-
-    compile : function(){return this;}
-});
-
-/**
- * Alias for fill().
- * @method
- */
-Roo.MasterTemplate.prototype.addAll = Roo.MasterTemplate.prototype.fill;
- /**
- * Creates a template from the passed element's value (display:none textarea, preferred) or innerHTML. e.g.
- * var tpl = Roo.MasterTemplate.from('element-id');
- * @param {String/HTMLElement} el
- * @param {Object} config
- * @static
- */
-Roo.MasterTemplate.from = function(el, config){
-    el = Roo.getDom(el);
-    return new Roo.MasterTemplate(el.value || el.innerHTML, config || '');
-};/*
- * Based on:
- * Ext JS Library 1.1.1
- * Copyright(c) 2006-2007, Ext JS, LLC.
- *
- * Originally Released Under LGPL - original licence link has changed is not relivant.
- *
- * Fork - LGPL
- * <script type="text/javascript">
- */
-
-/**
- * @class Roo.util.CSS
- * Utility class for manipulating CSS rules
- * @singleton
- */
-Roo.util.CSS = function(){
-       var rules = null;
-       var doc = document;
-
-    var camelRe = /(-[a-z])/gi;
-    var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); };
-
-   return {
-   /**
-    * Very simple dynamic creation of stylesheets from a text blob of rules.  The text will wrapped in a style
-    * tag and appended to the HEAD of the document.
-    * @param {String|Object} cssText The text containing the css rules
-    * @param {String} id An id to add to the stylesheet for later removal
-    * @return {StyleSheet}
-    */
-    createStyleSheet : function(cssText, id){
-        var ss;
-        var head = doc.getElementsByTagName("head")[0];
-        var nrules = doc.createElement("style");
-        nrules.setAttribute("type", "text/css");
-        if(id){
-            nrules.setAttribute("id", id);
-        }
-        if (typeof(cssText) != 'string') {
-            // support object maps..
-            // not sure if this a good idea.. 
-            // perhaps it should be merged with the general css handling
-            // and handle js style props.
-            var cssTextNew = [];
-            for(var n in cssText) {
-                var citems = [];
-                for(var k in cssText[n]) {
-                    citems.push( k + ' : ' +cssText[n][k] + ';' );
-                }
-                cssTextNew.push( n + ' { ' + citems.join(' ') + '} ');
-                
-            }
-            cssText = cssTextNew.join("\n");
-            
-        }
-       
-       
-       if(Roo.isIE){
-           head.appendChild(nrules);
-           ss = nrules.styleSheet;
-           ss.cssText = cssText;
-       }else{
-           try{
-                nrules.appendChild(doc.createTextNode(cssText));
-           }catch(e){
-               nrules.cssText = cssText; 
-           }
-           head.appendChild(nrules);
-           ss = nrules.styleSheet ? nrules.styleSheet : (nrules.sheet || doc.styleSheets[doc.styleSheets.length-1]);
-       }
-       this.cacheStyleSheet(ss);
-       return ss;
-   },
-
-   /**
-    * Removes a style or link tag by id
-    * @param {String} id The id of the tag
-    */
-   removeStyleSheet : function(id){
-       var existing = doc.getElementById(id);
-       if(existing){
-           existing.parentNode.removeChild(existing);
-       }
-   },
-
-   /**
-    * Dynamically swaps an existing stylesheet reference for a new one
-    * @param {String} id The id of an existing link tag to remove
-    * @param {String} url The href of the new stylesheet to include
-    */
-   swapStyleSheet : function(id, url){
-       this.removeStyleSheet(id);
-       var ss = doc.createElement("link");
-       ss.setAttribute("rel", "stylesheet");
-       ss.setAttribute("type", "text/css");
-       ss.setAttribute("id", id);
-       ss.setAttribute("href", url);
-       doc.getElementsByTagName("head")[0].appendChild(ss);
-   },
-   
-   /**
-    * Refresh the rule cache if you have dynamically added stylesheets
-    * @return {Object} An object (hash) of rules indexed by selector
-    */
-   refreshCache : function(){
-       return this.getRules(true);
-   },
-
-   // private
-   cacheStyleSheet : function(stylesheet){
-       if(!rules){
-           rules = {};
-       }
-       try{// try catch for cross domain access issue
-           var ssRules = stylesheet.cssRules || stylesheet.rules;
-           for(var j = ssRules.length-1; j >= 0; --j){
-               rules[ssRules[j].selectorText] = ssRules[j];
-           }
-       }catch(e){}
-   },
-   
-   /**
-    * Gets all css rules for the document
-    * @param {Boolean} refreshCache true to refresh the internal cache
-    * @return {Object} An object (hash) of rules indexed by selector
-    */
-   getRules : function(refreshCache){
-               if(rules == null || refreshCache){
-                       rules = {};
-                       var ds = doc.styleSheets;
-                       for(var i =0, len = ds.length; i < len; i++){
-                           try{
-                       this.cacheStyleSheet(ds[i]);
-                   }catch(e){} 
-               }
-               }
-               return rules;
-       },
-       
-       /**
-    * Gets an an individual CSS rule by selector(s)
-    * @param {String/Array} selector The CSS selector or an array of selectors to try. The first selector that is found is returned.
-    * @param {Boolean} refreshCache true to refresh the internal cache if you have recently updated any rules or added styles dynamically
-    * @return {CSSRule} The CSS rule or null if one is not found
-    */
-   getRule : function(selector, refreshCache){
-               var rs = this.getRules(refreshCache);
-               if(!(selector instanceof Array)){
-                   return rs[selector];
-               }
-               for(var i = 0; i < selector.length; i++){
-                       if(rs[selector[i]]){
-                               return rs[selector[i]];
-                       }
-               }
-               return null;
-       },
-       
-       
-       /**
-    * Updates a rule property
-    * @param {String/Array} selector If it's an array it tries each selector until it finds one. Stops immediately once one is found.
-    * @param {String} property The css property
-    * @param {String} value The new value for the property
-    * @return {Boolean} true If a rule was found and updated
-    */
-   updateRule : function(selector, property, value){
-               if(!(selector instanceof Array)){
-                       var rule = this.getRule(selector);
-                       if(rule){
-                               rule.style[property.replace(camelRe, camelFn)] = value;
-                               return true;
-                       }
-               }else{
-                       for(var i = 0; i < selector.length; i++){
-                               if(this.updateRule(selector[i], property, value)){
-                                       return true;
-                               }
-                       }
-               }
-               return false;
-       }
-   };  
-}();/*
- * Based on:
- * Ext JS Library 1.1.1
- * Copyright(c) 2006-2007, Ext JS, LLC.
- *
- * Originally Released Under LGPL - original licence link has changed is not relivant.
- *
- * Fork - LGPL
- * <script type="text/javascript">
- */
-
-
-/**
- * @class Roo.util.ClickRepeater
- * @extends Roo.util.Observable
- * 
- * A wrapper class which can be applied to any element. Fires a "click" event while the
- * mouse is pressed. The interval between firings may be specified in the config but
- * defaults to 10 milliseconds.
- * 
- * Optionally, a CSS class may be applied to the element during the time it is pressed.
- * 
- * @cfg {String/HTMLElement/Element} el The element to act as a button.
- * @cfg {Number} delay The initial delay before the repeating event begins firing.
- * Similar to an autorepeat key delay.
- * @cfg {Number} interval The interval between firings of the "click" event. Default 10 ms.
- * @cfg {String} pressClass A CSS class name to be applied to the element while pressed.
- * @cfg {Boolean} accelerate True if autorepeating should start slowly and accelerate.
- *           "interval" and "delay" are ignored. "immediate" is honored.
- * @cfg {Boolean} preventDefault True to prevent the default click event
- * @cfg {Boolean} stopDefault True to stop the default click event
- * 
- * @history
- *     2007-02-02 jvs Original code contributed by Nige "Animal" White
- *     2007-02-02 jvs Renamed to ClickRepeater
- *   2007-02-03 jvs Modifications for FF Mac and Safari 
- *
- *  @constructor
- * @param {String/HTMLElement/Element} el The element to listen on
- * @param {Object} config
- **/
-Roo.util.ClickRepeater = function(el, config)
-{
-    this.el = Roo.get(el);
-    this.el.unselectable();
-
-    Roo.apply(this, config);
-
-    this.addEvents({
-    /**
-     * @event mousedown
-     * Fires when the mouse button is depressed.
-     * @param {Roo.util.ClickRepeater} this
-     */
-        "mousedown" : true,
-    /**
-     * @event click
-     * Fires on a specified interval during the time the element is pressed.
-     * @param {Roo.util.ClickRepeater} this
-     */
-        "click" : true,
-    /**
-     * @event mouseup
-     * Fires when the mouse key is released.
-     * @param {Roo.util.ClickRepeater} this
-     */
-        "mouseup" : true
-    });
-
-    this.el.on("mousedown", this.handleMouseDown, this);
-    if(this.preventDefault || this.stopDefault){
-        this.el.on("click", function(e){
-            if(this.preventDefault){
-                e.preventDefault();
-            }
-            if(this.stopDefault){
-                e.stopEvent();
-            }
-        }, this);
-    }
-
-    // allow inline handler
-    if(this.handler){
-        this.on("click", this.handler,  this.scope || this);
-    }
-
-    Roo.util.ClickRepeater.superclass.constructor.call(this);
-};
-
-Roo.extend(Roo.util.ClickRepeater, Roo.util.Observable, {
-    interval : 20,
-    delay: 250,
-    preventDefault : true,
-    stopDefault : false,
-    timer : 0,
-
-    // private
-    handleMouseDown : function(){
-        clearTimeout(this.timer);
-        this.el.blur();
-        if(this.pressClass){
-            this.el.addClass(this.pressClass);
-        }
-        this.mousedownTime = new Date();
-
-        Roo.get(document).on("mouseup", this.handleMouseUp, this);
-        this.el.on("mouseout", this.handleMouseOut, this);
-
-        this.fireEvent("mousedown", this);
-        this.fireEvent("click", this);
-        
-        this.timer = this.click.defer(this.delay || this.interval, this);
-    },
-
-    // private
-    click : function(){
-        this.fireEvent("click", this);
-        this.timer = this.click.defer(this.getInterval(), this);
-    },
-
-    // private
-    getInterval: function(){
-        if(!this.accelerate){
-            return this.interval;
-        }
-        var pressTime = this.mousedownTime.getElapsed();
-        if(pressTime < 500){
-            return 400;
-        }else if(pressTime < 1700){
-            return 320;
-        }else if(pressTime < 2600){
-            return 250;
-        }else if(pressTime < 3500){
-            return 180;
-        }else if(pressTime < 4400){
-            return 140;
-        }else if(pressTime < 5300){
-            return 80;
-        }else if(pressTime < 6200){
-            return 50;
-        }else{
-            return 10;
-        }
-    },
-
-    // private
-    handleMouseOut : function(){
-        clearTimeout(this.timer);
-        if(this.pressClass){
-            this.el.removeClass(this.pressClass);
-        }
-        this.el.on("mouseover", this.handleMouseReturn, this);
-    },
-
-    // private
-    handleMouseReturn : function(){
-        this.el.un("mouseover", this.handleMouseReturn);
-        if(this.pressClass){
-            this.el.addClass(this.pressClass);
-        }
-        this.click();
-    },
-
-    // private
-    handleMouseUp : function(){
-        clearTimeout(this.timer);
-        this.el.un("mouseover", this.handleMouseReturn);
-        this.el.un("mouseout", this.handleMouseOut);
-        Roo.get(document).un("mouseup", this.handleMouseUp);
-        this.el.removeClass(this.pressClass);
-        this.fireEvent("mouseup", this);
-    }
-});/*
- * Based on:
- * Ext JS Library 1.1.1
- * Copyright(c) 2006-2007, Ext JS, LLC.
- *
- * Originally Released Under LGPL - original licence link has changed is not relivant.
- *
- * Fork - LGPL
- * <script type="text/javascript">
- */
-
-/**
- * @class Roo.KeyNav
- * <p>Provides a convenient wrapper for normalized keyboard navigation.  KeyNav allows you to bind
- * navigation keys to function calls that will get called when the keys are pressed, providing an easy
- * way to implement custom navigation schemes for any UI component.</p>
- * <p>The following are all of the possible keys that can be implemented: enter, left, right, up, down, tab, esc,
- * pageUp, pageDown, del, home, end.  Usage:</p>
- <pre><code>
-var nav = new Roo.KeyNav("my-element", {
-    "left" : function(e){
-        this.moveLeft(e.ctrlKey);
-    },
-    "right" : function(e){
-        this.moveRight(e.ctrlKey);
-    },
-    "enter" : function(e){
-        this.save();
-    },
-    scope : this
-});
-</code></pre>
- * @constructor
- * @param {String/HTMLElement/Roo.Element} el The element to bind to
- * @param {Object} config The config
- */
-Roo.KeyNav = function(el, config){
-    this.el = Roo.get(el);
-    Roo.apply(this, config);
-    if(!this.disabled){
-        this.disabled = true;
-        this.enable();
-    }
-};
-
-Roo.KeyNav.prototype = {
-    /**
-     * @cfg {Boolean} disabled
-     * True to disable this KeyNav instance (defaults to false)
-     */
-    disabled : false,
-    /**
-     * @cfg {String} defaultEventAction
-     * The method to call on the {@link Roo.EventObject} after this KeyNav intercepts a key.  Valid values are
-     * {@link Roo.EventObject#stopEvent}, {@link Roo.EventObject#preventDefault} and
-     * {@link Roo.EventObject#stopPropagation} (defaults to 'stopEvent')
-     */
-    defaultEventAction: "stopEvent",
-    /**
-     * @cfg {Boolean} forceKeyDown
-     * Handle the keydown event instead of keypress (defaults to false).  KeyNav automatically does this for IE since
-     * IE does not propagate special keys on keypress, but setting this to true will force other browsers to also
-     * handle keydown instead of keypress.
-     */
-    forceKeyDown : false,
-
-    // private
-    prepareEvent : function(e){
-        var k = e.getKey();
-        var h = this.keyToHandler[k];
-        //if(h && this[h]){
-        //    e.stopPropagation();
-        //}
-        if(Roo.isSafari && h && k >= 37 && k <= 40){
-            e.stopEvent();
-        }
-    },
-
-    // private
-    relay : function(e){
-        var k = e.getKey();
-        var h = this.keyToHandler[k];
-        if(h && this[h]){
-            if(this.doRelay(e, this[h], h) !== true){
-                e[this.defaultEventAction]();
-            }
-        }
-    },
-
-    // private
-    doRelay : function(e, h, hname){
-        return h.call(this.scope || this, e);
-    },
-
-    // possible handlers
-    enter : false,
-    left : false,
-    right : false,
-    up : false,
-    down : false,
-    tab : false,
-    esc : false,
-    pageUp : false,
-    pageDown : false,
-    del : false,
-    home : false,
-    end : false,
-
-    // quick lookup hash
-    keyToHandler : {
-        37 : "left",
-        39 : "right",
-        38 : "up",
-        40 : "down",
-        33 : "pageUp",
-        34 : "pageDown",
-        46 : "del",
-        36 : "home",
-        35 : "end",
-        13 : "enter",
-        27 : "esc",
-        9  : "tab"
-    },
-
-       /**
-        * Enable this KeyNav
-        */
-       enable: function(){
-               if(this.disabled){
-            // ie won't do special keys on keypress, no one else will repeat keys with keydown
-            // the EventObject will normalize Safari automatically
-            if(this.forceKeyDown || Roo.isIE || Roo.isAir){
-                this.el.on("keydown", this.relay,  this);
-            }else{
-                this.el.on("keydown", this.prepareEvent,  this);
-                this.el.on("keypress", this.relay,  this);
-            }
-                   this.disabled = false;
-               }
-       },
-
-       /**
-        * Disable this KeyNav
-        */
-       disable: function(){
-               if(!this.disabled){
-                   if(this.forceKeyDown || Roo.isIE || Roo.isAir){
-                this.el.un("keydown", this.relay);
-            }else{
-                this.el.un("keydown", this.prepareEvent);
-                this.el.un("keypress", this.relay);
-            }
-                   this.disabled = true;
-               }
-       }
-};/*
- * Based on:
- * Ext JS Library 1.1.1
- * Copyright(c) 2006-2007, Ext JS, LLC.
- *
- * Originally Released Under LGPL - original licence link has changed is not relivant.
- *
- * Fork - LGPL
- * <script type="text/javascript">
- */
-
-/**
- * @class Roo.KeyMap
- * Handles mapping keys to actions for an element. One key map can be used for multiple actions.
- * The constructor accepts the same config object as defined by {@link #addBinding}.
- * If you bind a callback function to a KeyMap, anytime the KeyMap handles an expected key
- * combination it will call the function with this signature (if the match is a multi-key
- * combination the callback will still be called only once): (String key, Roo.EventObject e)
- * A KeyMap can also handle a string representation of keys.<br />
- * Usage:
- <pre><code>
-// map one key by key code
-var map = new Roo.KeyMap("my-element", {
-    key: 13, // or Roo.EventObject.ENTER
-    fn: myHandler,
-    scope: myObject
-});
-
-// map multiple keys to one action by string
-var map = new Roo.KeyMap("my-element", {
-    key: "a\r\n\t",
-    fn: myHandler,
-    scope: myObject
-});
-
-// map multiple keys to multiple actions by strings and array of codes
-var map = new Roo.KeyMap("my-element", [
-    {
-        key: [10,13],
-        fn: function(){ alert("Return was pressed"); }
-    }, {
-        key: "abc",
-        fn: function(){ alert('a, b or c was pressed'); }
-    }, {
-        key: "\t",
-        ctrl:true,
-        shift:true,
-        fn: function(){ alert('Control + shift + tab was pressed.'); }
-    }
-]);
-</code></pre>
- * <b>Note: A KeyMap starts enabled</b>
- * @constructor
- * @param {String/HTMLElement/Roo.Element} el The element to bind to
- * @param {Object} config The config (see {@link #addBinding})
- * @param {String} eventName (optional) The event to bind to (defaults to "keydown")
- */
-Roo.KeyMap = function(el, config, eventName){
-    this.el  = Roo.get(el);
-    this.eventName = eventName || "keydown";
-    this.bindings = [];
-    if(config){
-        this.addBinding(config);
-    }
-    this.enable();
-};
-
-Roo.KeyMap.prototype = {
-    /**
-     * True to stop the event from bubbling and prevent the default browser action if the
-     * key was handled by the KeyMap (defaults to false)
-     * @type Boolean
-     */
-    stopEvent : false,
-
-    /**
-     * Add a new binding to this KeyMap. The following config object properties are supported:
-     * <pre>
-Property    Type             Description
-----------  ---------------  ----------------------------------------------------------------------
-key         String/Array     A single keycode or an array of keycodes to handle
-shift       Boolean          True to handle key only when shift is pressed (defaults to false)
-ctrl        Boolean          True to handle key only when ctrl is pressed (defaults to false)
-alt         Boolean          True to handle key only when alt is pressed (defaults to false)
-fn          Function         The function to call when KeyMap finds the expected key combination
-scope       Object           The scope of the callback function
-</pre>
-     *
-     * Usage:
-     * <pre><code>
-// Create a KeyMap
-var map = new Roo.KeyMap(document, {
-    key: Roo.EventObject.ENTER,
-    fn: handleKey,
-    scope: this
-});
-
-//Add a new binding to the existing KeyMap later
-map.addBinding({
-    key: 'abc',
-    shift: true,
-    fn: handleKey,
-    scope: this
-});
-</code></pre>
-     * @param {Object/Array} config A single KeyMap config or an array of configs
-     */
-       addBinding : function(config){
-        if(config instanceof Array){
-            for(var i = 0, len = config.length; i < len; i++){
-                this.addBinding(config[i]);
-            }
-            return;
-        }
-        var keyCode = config.key,
-            shift = config.shift, 
-            ctrl = config.ctrl, 
-            alt = config.alt,
-            fn = config.fn,
-            scope = config.scope;
-        if(typeof keyCode == "string"){
-            var ks = [];
-            var keyString = keyCode.toUpperCase();
-            for(var j = 0, len = keyString.length; j < len; j++){
-                ks.push(keyString.charCodeAt(j));
-            }
-            keyCode = ks;
-        }
-        var keyArray = keyCode instanceof Array;
-        var handler = function(e){
-            if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) &&  (!alt || e.altKey)){
-                var k = e.getKey();
-                if(keyArray){
-                    for(var i = 0, len = keyCode.length; i < len; i++){
-                        if(keyCode[i] == k){
-                          if(this.stopEvent){
-                              e.stopEvent();
-                          }
-                          fn.call(scope || window, k, e);
-                          return;
-                        }
-                    }
-                }else{
-                    if(k == keyCode){
-                        if(this.stopEvent){
-                           e.stopEvent();
-                        }
-                        fn.call(scope || window, k, e);
-                    }
-                }
-            }
-        };
-        this.bindings.push(handler);  
-       },
-
-    /**
-     * Shorthand for adding a single key listener
-     * @param {Number/Array/Object} key Either the numeric key code, array of key codes or an object with the
-     * following options:
-     * {key: (number or array), shift: (true/false), ctrl: (true/false), alt: (true/false)}
-     * @param {Function} fn The function to call
-     * @param {Object} scope (optional) The scope of the function
-     */
-    on : function(key, fn, scope){
-        var keyCode, shift, ctrl, alt;
-        if(typeof key == "object" && !(key instanceof Array)){
-            keyCode = key.key;
-            shift = key.shift;
-            ctrl = key.ctrl;
-            alt = key.alt;
-        }else{
-            keyCode = key;
-        }
-        this.addBinding({
-            key: keyCode,
-            shift: shift,
-            ctrl: ctrl,
-            alt: alt,
-            fn: fn,
-            scope: scope
-        })
-    },
-
-    // private
-    handleKeyDown : function(e){
-           if(this.enabled){ //just in case
-           var b = this.bindings;
-           for(var i = 0, len = b.length; i < len; i++){
-               b[i].call(this, e);
-           }
-           }
-       },
-       
-       /**
-        * Returns true if this KeyMap is enabled
-        * @return {Boolean} 
-        */
-       isEnabled : function(){
-           return this.enabled;  
-       },
-       
-       /**
-        * Enables this KeyMap
-        */
-       enable: function(){
-               if(!this.enabled){
-                   this.el.on(this.eventName, this.handleKeyDown, this);
-                   this.enabled = true;
-               }
-       },
-
-       /**
-        * Disable this KeyMap
-        */
-       disable: function(){
-               if(this.enabled){
-                   this.el.removeListener(this.eventName, this.handleKeyDown, this);
-                   this.enabled = false;
-               }
-       }
-};/*
- * Based on:
- * Ext JS Library 1.1.1
- * Copyright(c) 2006-2007, Ext JS, LLC.
- *
- * Originally Released Under LGPL - original licence link has changed is not relivant.
- *
- * Fork - LGPL
- * <script type="text/javascript">
- */
-
-/**
- * @class Roo.util.TextMetrics
- * Provides precise pixel measurements for blocks of text so that you can determine exactly how high and
- * wide, in pixels, a given block of text will be.
- * @singleton
- */
-Roo.util.TextMetrics = function(){
-    var shared;
-    return {
-        /**
-         * Measures the size of the specified text
-         * @param {String/HTMLElement} el The element, dom node or id from which to copy existing CSS styles
-         * that can affect the size of the rendered text
-         * @param {String} text The text to measure
-         * @param {Number} fixedWidth (optional) If the text will be multiline, you have to set a fixed width
-         * in order to accurately measure the text height
-         * @return {Object} An object containing the text's size {width: (width), height: (height)}
-         */
-        measure : function(el, text, fixedWidth){
-            if(!shared){
-                shared = Roo.util.TextMetrics.Instance(el, fixedWidth);
-            }
-            shared.bind(el);
-            shared.setFixedWidth(fixedWidth || 'auto');
-            return shared.getSize(text);
-        },
-
-        /**
-         * Return a unique TextMetrics instance that can be bound directly to an element and reused.  This reduces
-         * the overhead of multiple calls to initialize the style properties on each measurement.
-         * @param {String/HTMLElement} el The element, dom node or id that the instance will be bound to
-         * @param {Number} fixedWidth (optional) If the text will be multiline, you have to set a fixed width
-         * in order to accurately measure the text height
-         * @return {Roo.util.TextMetrics.Instance} instance The new instance
-         */
-        createInstance : function(el, fixedWidth){
-            return Roo.util.TextMetrics.Instance(el, fixedWidth);
-        }
-    };
-}();
-
-
-Roo.util.TextMetrics.Instance = function(bindTo, fixedWidth){
-    var ml = new Roo.Element(document.createElement('div'));
-    document.body.appendChild(ml.dom);
-    ml.position('absolute');
-    ml.setLeftTop(-1000, -1000);
-    ml.hide();
-
-    if(fixedWidth){
-        ml.setWidth(fixedWidth);
-    }
-     
-    var instance = {
-        /**
-         * Returns the size of the specified text based on the internal element's style and width properties
-         * @memberOf Roo.util.TextMetrics.Instance#
-         * @param {String} text The text to measure
-         * @return {Object} An object containing the text's size {width: (width), height: (height)}
-         */
-        getSize : function(text){
-            ml.update(text);
-            var s = ml.getSize();
-            ml.update('');
-            return s;
-        },
-
-        /**
-         * Binds this TextMetrics instance to an element from which to copy existing CSS styles
-         * that can affect the size of the rendered text
-         * @memberOf Roo.util.TextMetrics.Instance#
-         * @param {String/HTMLElement} el The element, dom node or id
-         */
-        bind : function(el){
-            ml.setStyle(
-                Roo.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height')
-            );
-        },
-
-        /**
-         * Sets a fixed width on the internal measurement element.  If the text will be multiline, you have
-         * to set a fixed width in order to accurately measure the text height.
-         * @memberOf Roo.util.TextMetrics.Instance#
-         * @param {Number} width The width to set on the element
-         */
-        setFixedWidth : function(width){
-            ml.setWidth(width);
-        },
-
-        /**
-         * Returns the measured width of the specified text
-         * @memberOf Roo.util.TextMetrics.Instance#
-         * @param {String} text The text to measure
-         * @return {Number} width The width in pixels
-         */
-        getWidth : function(text){
-            ml.dom.style.width = 'auto';
-            return this.getSize(text).width;
-        },
-
-        /**
-         * Returns the measured height of the specified text.  For multiline text, be sure to call
-         * {@link #setFixedWidth} if necessary.
-         * @memberOf Roo.util.TextMetrics.Instance#
-         * @param {String} text The text to measure
-         * @return {Number} height The height in pixels
-         */
-        getHeight : function(text){
-            return this.getSize(text).height;
-        }
-    };
-
-    instance.bind(bindTo);
-
-    return instance;
-};
-
-// backwards compat
-Roo.Element.measureText = Roo.util.TextMetrics.measure;/*
- * Based on:
- * Ext JS Library 1.1.1
- * Copyright(c) 2006-2007, Ext JS, LLC.
- *
- * Originally Released Under LGPL - original licence link has changed is not relivant.
- *
- * Fork - LGPL
- * <script type="text/javascript">
- */
-
-/**
- * @class Roo.state.Provider
- * Abstract base class for state provider implementations. This class provides methods
- * for encoding and decoding <b>typed</b> variables including dates and defines the 
- * Provider interface.
- */
-Roo.state.Provider = function(){
-    /**
-     * @event statechange
-     * Fires when a state change occurs.
-     * @param {Provider} this This state provider
-     * @param {String} key The state key which was changed
-     * @param {String} value The encoded value for the state
-     */
-    this.addEvents({
-        "statechange": true
-    });
-    this.state = {};
-    Roo.state.Provider.superclass.constructor.call(this);
-};
-Roo.extend(Roo.state.Provider, Roo.util.Observable, {
-    /**
-     * Returns the current value for a key
-     * @param {String} name The key name
-     * @param {Mixed} defaultValue A default value to return if the key's value is not found
-     * @return {Mixed} The state data
-     */
-    get : function(name, defaultValue){
-        return typeof this.state[name] == "undefined" ?
-            defaultValue : this.state[name];
-    },
-    
-    /**
-     * Clears a value from the state
-     * @param {String} name The key name
-     */
-    clear : function(name){
-        delete this.state[name];
-        this.fireEvent("statechange", this, name, null);
-    },
-    
-    /**
-     * Sets the value for a key
-     * @param {String} name The key name
-     * @param {Mixed} value The value to set
-     */
-    set : function(name, value){
-        this.state[name] = value;
-        this.fireEvent("statechange", this, name, value);
-    },
-    
-    /**
-     * Decodes a string previously encoded with {@link #encodeValue}.
-     * @param {String} value The value to decode
-     * @return {Mixed} The decoded value
-     */
-    decodeValue : function(cookie){
-        var re = /^(a|n|d|b|s|o)\:(.*)$/;
-        var matches = re.exec(unescape(cookie));
-        if(!matches || !matches[1]) return; // non state cookie
-        var type = matches[1];
-        var v = matches[2];
-        switch(type){
-            case "n":
-                return parseFloat(v);
-            case "d":
-                return new Date(Date.parse(v));
-            case "b":
-                return (v == "1");
-            case "a":
-                var all = [];
-                var values = v.split("^");
-                for(var i = 0, len = values.length; i < len; i++){
-                    all.push(this.decodeValue(values[i]));
-                }
-                return all;
-           case "o":
-                var all = {};
-                var values = v.split("^");
-                for(var i = 0, len = values.length; i < len; i++){
-                    var kv = values[i].split("=");
-                    all[kv[0]] = this.decodeValue(kv[1]);
-                }
-                return all;
-           default:
-                return v;
-        }
-    },
-    
-    /**
-     * Encodes a value including type information.  Decode with {@link #decodeValue}.
-     * @param {Mixed} value The value to encode
-     * @return {String} The encoded value
-     */
-    encodeValue : function(v){
-        var enc;
-        if(typeof v == "number"){
-            enc = "n:" + v;
-        }else if(typeof v == "boolean"){
-            enc = "b:" + (v ? "1" : "0");
-        }else if(v instanceof Date){
-            enc = "d:" + v.toGMTString();
-        }else if(v instanceof Array){
-            var flat = "";
-            for(var i = 0, len = v.length; i < len; i++){
-                flat += this.encodeValue(v[i]);
-                if(i != len-1) flat += "^";
-            }
-            enc = "a:" + flat;
-        }else if(typeof v == "object"){
-            var flat = "";
-            for(var key in v){
-                if(typeof v[key] != "function"){
-                    flat += key + "=" + this.encodeValue(v[key]) + "^";
-                }
-            }
-            enc = "o:" + flat.substring(0, flat.length-1);
-        }else{
-            enc = "s:" + v;
-        }
-        return escape(enc);        
-    }
-});
-
-/*
- * Based on:
- * Ext JS Library 1.1.1
- * Copyright(c) 2006-2007, Ext JS, LLC.
- *
- * Originally Released Under LGPL - original licence link has changed is not relivant.
- *
- * Fork - LGPL
- * <script type="text/javascript">
- */
-/**
- * @class Roo.state.Manager
- * This is the global state manager. By default all components that are "state aware" check this class
- * for state information if you don't pass them a custom state provider. In order for this class
- * to be useful, it must be initialized with a provider when your application initializes.
- <pre><code>
-// in your initialization function
-init : function(){
-   Roo.state.Manager.setProvider(new Roo.state.CookieProvider());
-   ...
-   // supposed you have a {@link Roo.BorderLayout}
-   var layout = new Roo.BorderLayout(...);
-   layout.restoreState();
-   // or a {Roo.BasicDialog}
-   var dialog = new Roo.BasicDialog(...);
-   dialog.restoreState();
- </code></pre>
- * @singleton
- */
-Roo.state.Manager = function(){
-    var provider = new Roo.state.Provider();
-    
-    return {
-        /**
-         * Configures the default state provider for your application
-         * @param {Provider} stateProvider The state provider to set
-         */
-        setProvider : function(stateProvider){
-            provider = stateProvider;
-        },
-        
-        /**
-         * Returns the current value for a key
-         * @param {String} name The key name
-         * @param {Mixed} defaultValue The default value to return if the key lookup does not match
-         * @return {Mixed} The state data
-         */
-        get : function(key, defaultValue){
-            return provider.get(key, defaultValue);
-        },
-        
-        /**
-         * Sets the value for a key
-         * @param {String} name The key name
-         * @param {Mixed} value The state data
-         */
-         set : function(key, value){
-            provider.set(key, value);
-        },
-        
-        /**
-         * Clears a value from the state
-         * @param {String} name The key name
-         */
-        clear : function(key){
-            provider.clear(key);
-        },
-        
-        /**
-         * Gets the currently configured state provider
-         * @return {Provider} The state provider
-         */
-        getProvider : function(){
-            return provider;
-        }
-    };
-}();
-/*
- * Based on:
- * Ext JS Library 1.1.1
- * Copyright(c) 2006-2007, Ext JS, LLC.
- *
- * Originally Released Under LGPL - original licence link has changed is not relivant.
- *
- * Fork - LGPL
- * <script type="text/javascript">
- */
-/**
- * @class Roo.state.CookieProvider
- * @extends Roo.state.Provider
- * The default Provider implementation which saves state via cookies.
- * <br />Usage:
- <pre><code>
-   var cp = new Roo.state.CookieProvider({
-       path: "/cgi-bin/",
-       expires: new Date(new Date().getTime()+(1000*60*60*24*30)); //30 days
-       domain: "roojs.com"
-   })
-   Roo.state.Manager.setProvider(cp);
- </code></pre>
- * @cfg {String} path The path for which the cookie is active (defaults to root '/' which makes it active for all pages in the site)
- * @cfg {Date} expires The cookie expiration date (defaults to 7 days from now)
- * @cfg {String} domain The domain to save the cookie for.  Note that you cannot specify a different domain than
- * your page is on, but you can specify a sub-domain, or simply the domain itself like 'roojs.com' to include
- * all sub-domains if you need to access cookies across different sub-domains (defaults to null which uses the same
- * domain the page is running on including the 'www' like 'www.roojs.com')
- * @cfg {Boolean} secure True if the site is using SSL (defaults to false)
- * @constructor
- * Create a new CookieProvider
- * @param {Object} config The configuration object
- */
-Roo.state.CookieProvider = function(config){
-    Roo.state.CookieProvider.superclass.constructor.call(this);
-    this.path = "/";
-    this.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); //7 days
-    this.domain = null;
-    this.secure = false;
-    Roo.apply(this, config);
-    this.state = this.readCookies();
-};
-
-Roo.extend(Roo.state.CookieProvider, Roo.state.Provider, {
-    // private
-    set : function(name, value){
-        if(typeof value == "undefined" || value === null){
-            this.clear(name);
-            return;
-        }
-        this.setCookie(name, value);
-        Roo.state.CookieProvider.superclass.set.call(this, name, value);
-    },
-
-    // private
-    clear : function(name){
-        this.clearCookie(name);
-        Roo.state.CookieProvider.superclass.clear.call(this, name);
-    },
-
-    // private
-    readCookies : function(){
-        var cookies = {};
-        var c = document.cookie + ";";
-        var re = /\s?(.*?)=(.*?);/g;
-       var matches;
-       while((matches = re.exec(c)) != null){
-            var name = matches[1];
-            var value = matches[2];
-            if(name && name.substring(0,3) == "ys-"){
-                cookies[name.substr(3)] = this.decodeValue(value);
-            }
-        }
-        return cookies;
-    },
-
-    // private
-    setCookie : function(name, value){
-        document.cookie = "ys-"+ name + "=" + this.encodeValue(value) +
-           ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) +
-           ((this.path == null) ? "" : ("; path=" + this.path)) +
-           ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
-           ((this.secure == true) ? "; secure" : "");
-    },
-
-    // private
-    clearCookie : function(name){
-        document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +
-           ((this.path == null) ? "" : ("; path=" + this.path)) +
-           ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
-           ((this.secure == true) ? "; secure" : "");
-    }
-});
\ No newline at end of file
+Roo.util.MixedCollection.prototype.get = Roo.util.MixedCollection.prototype.item;
\ No newline at end of file