roojs-core.js
authorAlan Knowles <alan@akbkhome.com>
Wed, 28 Jul 2010 06:42:37 +0000 (14:42 +0800)
committerAlan Knowles <alan@akbkhome.com>
Wed, 28 Jul 2010 06:42:37 +0000 (14:42 +0800)
roojs-core.js

index e69de29..d26a26f 100644 (file)
+
+
+
+
+
+
+
+window["undefined"] = window["undefined"];
+
+
+
+var  Roo = {}; 
+
+
+
+Roo.apply = function(o, c, A){
+    if(A){
+        
+        Roo.apply(o, A);
+    }
+    if(o && c && typeof  c == 'object'){
+        for(var  p  in  c){
+            o[p] = c[p];
+        }
+    }
+    return  o;
+};
+
+
+(function(){
+    var  B = 0;
+    var  ua = navigator.userAgent.toLowerCase();
+
+    var  C = document.compatMode == "CSS1Compat",
+        D = ua.indexOf("opera") > -1,
+        E = (/webkit|khtml/).test(ua),
+        F = ua.indexOf("msie") > -1,
+        G = ua.indexOf("msie 7") > -1,
+        H = !E && ua.indexOf("gecko") > -1,
+        I = F && !C,
+        J = (ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1),
+        K = (ua.indexOf("macintosh") != -1 || ua.indexOf("mac os x") != -1),
+        L = (ua.indexOf("linux") != -1),
+        M = window.location.href.toLowerCase().indexOf("https") === 0;
+
+    
+       if(F && !G){
+        try{
+            document.execCommand("BackgroundImageCache", false, true);
+        }catch(e){}
+    }
+
+
+    Roo.apply(Roo, {
+        
+
+        isStrict : C,
+        
+
+        isSecure : M,
+        
+
+        isReady : false,
+        
+
+        
+        debug: false,
+
+        
+
+        enableGarbageCollector : true,
+
+        
+
+        enableListenerCollection:false,
+
+        
+
+        SSL_SECURE_URL : "javascript:false",
+
+        
+
+        BLANK_IMAGE_URL : "http:/"+"/localhost/s.gif",
+
+        emptyFn : function(){},
+
+        
+
+        applyIf : function(o, c){
+            if(o && c){
+                for(var  p  in  c){
+                    if(typeof  o[p] == "undefined"){ o[p] = c[p]; }
+                }
+            }
+            return  o;
+        },
+
+        
+
+        addBehaviors : function(o){
+            if(!Roo.isReady){
+                Roo.onReady(function(){
+                    Roo.addBehaviors(o);
+                });
+                return;
+            }
+            var  N = {}; 
+            for(var  b  in  o){
+                var  parts = b.split('@');
+                if(parts[1]){ 
+                    var  s = parts[0];
+                    if(!N[s]){
+                        N[s] = Roo.select(s);
+                    }
+
+                    N[s].on(parts[1], o[b]);
+                }
+            }
+
+            N = null;
+        },
+
+        
+
+        id : function(el, O){
+            O = O || "roo-gen";
+            el = Roo.getDom(el);
+            var  id = O + (++B);
+            return  el ? (el.id ? el.id : (el.id = id)) : id;
+        },
+         
+       
+        
+
+        extend : function(){
+            
+            var  io = function(o){
+                for(var  m  in  o){
+                    this[m] = o[m];
+                }
+            };
+            return  function(sb, sp, P){
+                if(typeof  sp == 'object'){ 
+                    P = sp;
+                    sp = sb;
+                    sb = function(){sp.apply(this, arguments);};
+                }
+                var  F = function(){}, sbp, spp = sp.prototype;
+                F.prototype = spp;
+                sbp = sb.prototype = new  F();
+                sbp.constructor=sb;
+                sb.superclass=spp;
+                
+                if(spp.constructor == Object.prototype.constructor){
+                    spp.constructor=sp;
+                   
+                }
+
+                
+                sb.override = function(o){
+                    Roo.override(sb, o);
+                };
+                sbp.override = io;
+                Roo.override(sb, P);
+                return  sb;
+            };
+        }(),
+
+        
+
+        override : function(P, Q){
+            if(Q){
+                var  p = P.prototype;
+                for(var  method  in  Q){
+                    p[method] = Q[method];
+                }
+            }
+        },
+        
+
+        namespace : function(){
+            var  a=arguments, o=null, i, j, d, rt;
+            for (i=0; i<a.length; ++i) {
+                d=a[i].split(".");
+                rt = d[0];
+                
+
+                eval('if (typeof ' + rt + ' == "undefined"){' + rt + ' = {};} o = ' + rt + ';');
+                for (j=1; j<d.length; ++j) {
+                    o[d[j]]=o[d[j]] || {};
+                    o=o[d[j]];
+                }
+            }
+        },
+        
+
+         
+        factory : function(c, ns)
+        {
+            
+            if (!c.xtype   || (!ns && !c.xns) ||  (c.xns === false)) { 
+                return  c;
+            }
+
+            ns = c.xns ? c.xns : ns; 
+            if (c.constructor == ns[c.xtype]) {
+                return  c;
+            }
+            if (ns[c.xtype]) {
+                if (Roo.debug) Roo.log("Roo.Factory(" + c.xtype + ")");
+                var  ret = new  ns[c.xtype](c);
+                ret.xns = false;
+                return  ret;
+            }
+
+            c.xns = false; 
+            return  c;
+        },
+         
+
+        log : function(s)
+        {
+            if ((typeof(console) == 'undefined') || (typeof(console.log) == 'undefined')) {
+                return; 
+            }
+
+            console.log(s);
+            
+        },
+        
+
+        urlEncode : function(o){
+            if(!o){
+                return  "";
+            }
+            var  R = [];
+            for(var  key  in  o){
+                var  ov = o[key], k = encodeURIComponent(key);
+                var  type = typeof  ov;
+                if(type == 'undefined'){
+                    R.push(k, "=&");
+                }else  if(type != "function" && type != "object"){
+                    R.push(k, "=", encodeURIComponent(ov), "&");
+                }else  if(ov  instanceof  Array){
+                    if (ov.length) {
+                           for(var  i = 0, len = ov.length; i < len; i++) {
+                               R.push(k, "=", encodeURIComponent(ov[i] === undefined ? '' : ov[i]), "&");
+                           }
+                       } else  {
+                           R.push(k, "=&");
+                       }
+                }
+            }
+
+            R.pop();
+            return  R.join("");
+        },
+
+        
+
+        urlDecode : function(S, T){
+            if(!S || !S.length){
+                return  {};
+            }
+            var  U = {};
+            var  V = S.split('&');
+            var  W, X, Y;
+            for(var  i = 0, len = V.length; i < len; i++){
+                W = V[i].split('=');
+                X = decodeURIComponent(W[0]);
+                Y = decodeURIComponent(W[1]);
+                if(T !== true){
+                    if(typeof  U[X] == "undefined"){
+                        U[X] = Y;
+                    }else  if(typeof  U[X] == "string"){
+                        U[X] = [U[X]];
+                        U[X].push(Y);
+                    }else {
+                        U[X].push(Y);
+                    }
+                }else {
+                    U[X] = Y;
+                }
+            }
+            return  U;
+        },
+
+        
+
+        each : function(Z, fn, f){
+            if(typeof  Z.length == "undefined" || typeof  Z == "string"){
+                Z = [Z];
+            }
+            for(var  i = 0, len = Z.length; i < len; i++){
+                if(fn.call(f || Z[i], Z[i], i, Z) === false){ return  i; };
+            }
+        },
+
+        
+        combine : function(){
+            var  as = arguments, l = as.length, r = [];
+            for(var  i = 0; i < l; i++){
+                var  a = as[i];
+                if(a  instanceof  Array){
+                    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;
+        },
+
+        
+
+        escapeRe : function(s) {
+            return  s.replace(/([.*+?^${}()|[\]\/\\])/g, "\\$1");
+        },
+
+        
+        callback : function(cb, g, h, n){
+            if(typeof  cb == "function"){
+                if(n){
+                    cb.defer(n, g, h || []);
+                }else {
+                    cb.apply(g, h || []);
+                }
+            }
+        },
+
+        
+
+        getDom : function(el){
+            if(!el){
+                return  null;
+            }
+            return  el.dom ? el.dom : (typeof  el == 'string' ? document.getElementById(el) : el);
+        },
+
+        
+
+        getCmp : function(id){
+            return  Roo.ComponentMgr.get(id);
+        },
+         
+        num : function(v, q){
+            if(typeof  v != 'number'){
+                return  q;
+            }
+            return  v;
+        },
+
+        destroy : function(){
+            for(var  i = 0, a = arguments, len = a.length; i < len; i++) {
+                var  as = a[i];
+                if(as){
+                    if(as.dom){
+                        as.removeAllListeners();
+                        as.remove();
+                        continue;
+                    }
+                    if(typeof  as.purgeListeners == 'function'){
+                        as.purgeListeners();
+                    }
+                    if(typeof  as.destroy == 'function'){
+                        as.destroy();
+                    }
+                }
+            }
+        },
+
+        
+        
+
+        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';
+                }
+                if(typeof  o.length == 'number' && typeof  o.item == 'function') {
+                    return  'nodelist';
+                }
+            }
+            return  t;
+        },
+
+        
+
+        isEmpty : function(v, u){
+            return  v === null || v === undefined || (!u ? v === '' : false);
+        },
+        
+        
+
+        isOpera : D,
+        
+
+        isSafari : E,
+        
+
+        isIE : F,
+        
+
+        isIE7 : G,
+        
+
+        isGecko : H,
+        
+
+        isBorderBox : I,
+        
+
+        isWindows : J,
+        
+
+        isLinux : L,
+        
+
+        isMac : K,
+
+        
+
+        useShims : ((F && !G) || (H && K))
+    });
+
+
+})();
+
+Roo.namespace("Roo", "Roo.util", "Roo.grid", "Roo.dd", "Roo.tree", "Roo.data",
+                "Roo.form", "Roo.menu", "Roo.state", "Roo.lib", "Roo.layout", "Roo.app", "Roo.ux");
+
+
+
+
+(function() {    
+    
+    if(Roo.isIE) {
+        function  A() {
+            var  p = Function.prototype;
+            delete  p.createSequence;
+            delete  p.defer;
+            delete  p.createDelegate;
+            delete  p.createCallback;
+            delete  p.createInterceptor;
+
+            window.detachEvent("onunload", A);
+        }
+
+        window.attachEvent("onunload", A);
+    }
+})();
+
+
+
+
+Roo.apply(Function.prototype, {
+     
+
+    createCallback : function(
+){
+        
+        var  B = arguments;
+        var  C = this;
+        return  function() {
+            return  C.apply(window, B);
+        };
+    },
+
+    
+
+    createDelegate : function(D, E, F){
+        var  G = this;
+        return  function() {
+            var  H = E || arguments;
+            if(F === true){
+                H = Array.prototype.slice.call(arguments, 0);
+                H = H.concat(E);
+            }else  if(typeof  F == "number"){
+                H = Array.prototype.slice.call(arguments, 0); 
+                var  applyArgs = [F, 0].concat(E); 
+                Array.prototype.splice.apply(H, applyArgs); 
+            }
+            return  G.apply(D || window, H);
+        };
+    },
+
+    
+
+    defer : function(H, I, J, K){
+        var  fn = this.createDelegate(I, J, K);
+        if(H){
+            return  setTimeout(fn, H);
+        }
+
+        fn();
+        return  0;
+    },
+    
+
+    createSequence : function(L, M){
+        if(typeof  L != "function"){
+            return  this;
+        }
+        var  N = this;
+        return  function() {
+            var  O = N.apply(this || window, arguments);
+            L.apply(M || this || window, arguments);
+            return  O;
+        };
+    },
+
+    
+
+    createInterceptor : function(O, P){
+        if(typeof  O != "function"){
+            return  this;
+        }
+        var  Q = this;
+        return  function() {
+            O.target = this;
+            O.method = Q;
+            if(O.apply(P || this || window, arguments) === false){
+                return;
+            }
+            return  Q.apply(this || window, arguments);
+        };
+    }
+});
+
+
+
+
+Roo.applyIf(String, {
+    
+    
+
+    
+    
+
+    escape : function(A) {
+        return  A.replace(/('|\\)/g, "\\$1");
+    },
+
+    
+
+    leftPad : function (B, C, ch) {
+        var  D = new  String(B);
+        if(ch === null || ch === undefined || ch === '') {
+            ch = " ";
+        }
+        while (D.length < C) {
+            D = ch + D;
+        }
+        return  D;
+    },
+
+    
+
+    format : function(E){
+        var  F = Array.prototype.slice.call(arguments, 1);
+        return  E.replace(/\{(\d+)\}/g, function(m, i){
+            return  Roo.util.Format.htmlEncode(F[i]);
+        });
+    }
+});
+
+
+
+String.prototype.toggle = function(G, H){
+    return  this == G ? H : G;
+};
+
+
+
+
+Roo.applyIf(Number.prototype, {
+    
+
+    constrain : function(A, B){
+        return  Math.min(Math.max(this, A), B);
+    }
+});
+
+
+
+Roo.applyIf(Array.prototype, {
+    
+
+    indexOf : function(o){
+       for (var  i = 0, len = this.length; i < len; i++){
+             if(this[i] == o) return  i;
+       }
+          return  -1;
+    },
+
+    
+
+    remove : function(o){
+       var  A = this.indexOf(o);
+       if(A != -1){
+           this.splice(A, 1);
+       }
+    },
+    
+
+    map : function(B )
+    {
+        var  C = this.length >>> 0;
+        if (typeof  B != "function")
+            throw  new  TypeError();
+
+        var  D = new  Array(C);
+        var  E = arguments[1];
+        for (var  i = 0; i < C; i++)
+        {
+            if (i  in  this)
+                D[i] = B.call(E, this[i], i, this);
+        }
+
+        return  D;
+    }
+    
+});
+
+
+
+
+
+
+
+
+
+
+
+
+Date.prototype.getElapsed = function(A) {
+       return  Math.abs((A || new  Date()).getTime()-this.getTime());
+};
+
+
+
+
+Date.parseFunctions = {count:0};
+
+Date.parseRegexes = [];
+
+Date.formatFunctions = {count:0};
+
+
+Date.prototype.dateFormat = function(B) {
+    if (Date.formatFunctions[B] == null) {
+        Date.createNewFormat(B);
+    }
+    var  C = Date.formatFunctions[B];
+    return  this[C]();
+};
+
+
+
+
+Date.prototype.format = Date.prototype.dateFormat;
+
+
+Date.createNewFormat = function(D) {
+    var  E = "format" + Date.formatFunctions.count++;
+    Date.formatFunctions[D] = E;
+    var  F = "Date.prototype." + E + " = function(){return ";
+    var  G = false;
+    var  ch = '';
+    for (var  i = 0; i < D.length; ++i) {
+        ch = D.charAt(i);
+        if (!G && ch == "\\") {
+            G = true;
+        }
+        else  if (G) {
+            G = false;
+            F += "'" + String.escape(ch) + "' + ";
+        }
+        else  {
+            F += Date.getFormatCode(ch);
+        }
+    }
+    
+
+    eval(F.substring(0, F.length - 3) + ";}");
+};
+
+
+Date.getFormatCode = function(H) {
+    switch (H) {
+    case  "d":
+        return  "String.leftPad(this.getDate(), 2, '0') + ";
+    case  "D":
+        return  "Date.dayNames[this.getDay()].substring(0, 3) + ";
+    case  "j":
+        return  "this.getDate() + ";
+    case  "l":
+        return  "Date.dayNames[this.getDay()] + ";
+    case  "S":
+        return  "this.getSuffix() + ";
+    case  "w":
+        return  "this.getDay() + ";
+    case  "z":
+        return  "this.getDayOfYear() + ";
+    case  "W":
+        return  "this.getWeekOfYear() + ";
+    case  "F":
+        return  "Date.monthNames[this.getMonth()] + ";
+    case  "m":
+        return  "String.leftPad(this.getMonth() + 1, 2, '0') + ";
+    case  "M":
+        return  "Date.monthNames[this.getMonth()].substring(0, 3) + ";
+    case  "n":
+        return  "(this.getMonth() + 1) + ";
+    case  "t":
+        return  "this.getDaysInMonth() + ";
+    case  "L":
+        return  "(this.isLeapYear() ? 1 : 0) + ";
+    case  "Y":
+        return  "this.getFullYear() + ";
+    case  "y":
+        return  "('' + this.getFullYear()).substring(2, 4) + ";
+    case  "a":
+        return  "(this.getHours() < 12 ? 'am' : 'pm') + ";
+    case  "A":
+        return  "(this.getHours() < 12 ? 'AM' : 'PM') + ";
+    case  "g":
+        return  "((this.getHours() % 12) ? this.getHours() % 12 : 12) + ";
+    case  "G":
+        return  "this.getHours() + ";
+    case  "h":
+        return  "String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0') + ";
+    case  "H":
+        return  "String.leftPad(this.getHours(), 2, '0') + ";
+    case  "i":
+        return  "String.leftPad(this.getMinutes(), 2, '0') + ";
+    case  "s":
+        return  "String.leftPad(this.getSeconds(), 2, '0') + ";
+    case  "O":
+        return  "this.getGMTOffset() + ";
+    case  "T":
+        return  "this.getTimezone() + ";
+    case  "Z":
+        return  "(this.getTimezoneOffset() * -60) + ";
+    default:
+        return  "'" + String.escape(H) + "' + ";
+    }
+};
+
+
+
+Date.parseDate = function(I, J) {
+    if (Date.parseFunctions[J] == null) {
+        Date.createParser(J);
+    }
+    var  K = Date.parseFunctions[J];
+    return  Date[K](I);
+};
+
+
+Date.createParser = function(L) {
+    var  M = "parse" + Date.parseFunctions.count++;
+    var  N = Date.parseRegexes.length;
+    var  O = 1;
+    Date.parseFunctions[L] = M;
+
+    var  P = "Date." + M + " = function(input){\n"
+        + "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1, o, z, v;\n"
+        + "var d = new Date();\n"
+        + "y = d.getFullYear();\n"
+        + "m = d.getMonth();\n"
+        + "d = d.getDate();\n"
+        + "var results = input.match(Date.parseRegexes[" + N + "]);\n"
+        + "if (results && results.length > 0) {";
+    var  Q = "";
+
+    var  R = false;
+    var  ch = '';
+    for (var  i = 0; i < L.length; ++i) {
+        ch = L.charAt(i);
+        if (!R && ch == "\\") {
+            R = true;
+        }
+        else  if (R) {
+            R = false;
+            Q += String.escape(ch);
+        }
+        else  {
+            var  obj = Date.formatCodeToRegex(ch, O);
+            O += obj.g;
+            Q += obj.s;
+            if (obj.g && obj.c) {
+                P += obj.c;
+            }
+        }
+    }
+
+
+    P += "if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n"
+        + "{v = new Date(y, m, d, h, i, s);}\n"
+        + "else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n"
+        + "{v = new Date(y, m, d, h, i);}\n"
+        + "else if (y >= 0 && m >= 0 && d > 0 && h >= 0)\n"
+        + "{v = new Date(y, m, d, h);}\n"
+        + "else if (y >= 0 && m >= 0 && d > 0)\n"
+        + "{v = new Date(y, m, d);}\n"
+        + "else if (y >= 0 && m >= 0)\n"
+        + "{v = new Date(y, m);}\n"
+        + "else if (y >= 0)\n"
+        + "{v = new Date(y);}\n"
+        + "}return (v && (z || o))?\n" 
+        + "    ((z)? v.add(Date.SECOND, (v.getTimezoneOffset() * 60) + (z*1)) :\n" 
+        + "        v.add(Date.HOUR, (v.getGMTOffset() / 100) + (o / -100))) : v\n" 
+        + ";}";
+
+    Date.parseRegexes[N] = new  RegExp("^" + Q + "$");
+    
+
+    eval(P);
+};
+
+
+Date.formatCodeToRegex = function(S, T) {
+    switch (S) {
+    case  "D":
+        return  {g:0,
+        c:null,
+        s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"};
+    case  "j":
+        return  {g:1,
+            c:"d = parseInt(results[" + T + "], 10);\n",
+            s:"(\\d{1,2})"}; 
+    case  "d":
+        return  {g:1,
+            c:"d = parseInt(results[" + T + "], 10);\n",
+            s:"(\\d{2})"}; 
+    case  "l":
+        return  {g:0,
+            c:null,
+            s:"(?:" + Date.dayNames.join("|") + ")"};
+    case  "S":
+        return  {g:0,
+            c:null,
+            s:"(?:st|nd|rd|th)"};
+    case  "w":
+        return  {g:0,
+            c:null,
+            s:"\\d"};
+    case  "z":
+        return  {g:0,
+            c:null,
+            s:"(?:\\d{1,3})"};
+    case  "W":
+        return  {g:0,
+            c:null,
+            s:"(?:\\d{2})"};
+    case  "F":
+        return  {g:1,
+            c:"m = parseInt(Date.monthNumbers[results[" + T + "].substring(0, 3)], 10);\n",
+            s:"(" + Date.monthNames.join("|") + ")"};
+    case  "M":
+        return  {g:1,
+            c:"m = parseInt(Date.monthNumbers[results[" + T + "]], 10);\n",
+            s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};
+    case  "n":
+        return  {g:1,
+            c:"m = parseInt(results[" + T + "], 10) - 1;\n",
+            s:"(\\d{1,2})"}; 
+    case  "m":
+        return  {g:1,
+            c:"m = parseInt(results[" + T + "], 10) - 1;\n",
+            s:"(\\d{2})"}; 
+    case  "t":
+        return  {g:0,
+            c:null,
+            s:"\\d{1,2}"};
+    case  "L":
+        return  {g:0,
+            c:null,
+            s:"(?:1|0)"};
+    case  "Y":
+        return  {g:1,
+            c:"y = parseInt(results[" + T + "], 10);\n",
+            s:"(\\d{4})"};
+    case  "y":
+        return  {g:1,
+            c:"var ty = parseInt(results[" + T + "], 10);\n"
+                + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
+            s:"(\\d{1,2})"};
+    case  "a":
+        return  {g:1,
+            c:"if (results[" + T + "] == 'am') {\n"
+                + "if (h == 12) { h = 0; }\n"
+                + "} else { if (h < 12) { h += 12; }}",
+            s:"(am|pm)"};
+    case  "A":
+        return  {g:1,
+            c:"if (results[" + T + "] == 'AM') {\n"
+                + "if (h == 12) { h = 0; }\n"
+                + "} else { if (h < 12) { h += 12; }}",
+            s:"(AM|PM)"};
+    case  "g":
+    case  "G":
+        return  {g:1,
+            c:"h = parseInt(results[" + T + "], 10);\n",
+            s:"(\\d{1,2})"}; 
+    case  "h":
+    case  "H":
+        return  {g:1,
+            c:"h = parseInt(results[" + T + "], 10);\n",
+            s:"(\\d{2})"}; 
+    case  "i":
+        return  {g:1,
+            c:"i = parseInt(results[" + T + "], 10);\n",
+            s:"(\\d{2})"};
+    case  "s":
+        return  {g:1,
+            c:"s = parseInt(results[" + T + "], 10);\n",
+            s:"(\\d{2})"};
+    case  "O":
+        return  {g:1,
+            c:[
+                "o = results[", T, "];\n",
+                "var sn = o.substring(0,1);\n", 
+                "var hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60);\n", 
+                "var mn = o.substring(3,5) % 60;\n", 
+                "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))?\n", 
+                "    (sn + String.leftPad(hr, 2, 0) + String.leftPad(mn, 2, 0)) : null;\n"
+            ].join(""),
+            s:"([+\-]\\d{4})"};
+    case  "T":
+        return  {g:0,
+            c:null,
+            s:"[A-Z]{1,4}"}; 
+    case  "Z":
+        return  {g:1,
+            c:"z = results[" + T + "];\n" 
+                  + "z = (-43200 <= z*1 && z*1 <= 50400)? z : null;\n",
+            s:"([+\-]?\\d{1,5})"}; 
+    default:
+        return  {g:0,
+            c:null,
+            s:String.escape(S)};
+    }
+};
+
+
+
+Date.prototype.getTimezone = function() {
+    return  this.toString().replace(/^.*? ([A-Z]{1,4})[\-+][0-9]{4} .*$/, "$1");
+};
+
+
+
+Date.prototype.getGMTOffset = function() {
+    return  (this.getTimezoneOffset() > 0 ? "-" : "+")
+        + String.leftPad(Math.abs(Math.floor(this.getTimezoneOffset() / 60)), 2, "0")
+        + String.leftPad(this.getTimezoneOffset() % 60, 2, "0");
+};
+
+
+
+Date.prototype.getDayOfYear = function() {
+    var  U = 0;
+    Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
+    for (var  i = 0; i < this.getMonth(); ++i) {
+        U += Date.daysInMonth[i];
+    }
+    return  U + this.getDate() - 1;
+};
+
+
+
+Date.prototype.getWeekOfYear = function() {
+    
+    var  V = this.getDayOfYear() + (4 - this.getDay());
+    
+    var  W = new  Date(this.getFullYear(), 0, 1);
+    var  X = (7 - W.getDay() + 4);
+    return  String.leftPad(((V - X) / 7) + 1, 2, "0");
+};
+
+
+
+Date.prototype.isLeapYear = function() {
+    var  Y = this.getFullYear();
+    return  ((Y & 3) == 0 && (Y % 100 || (Y % 400 == 0 && Y)));
+};
+
+
+
+Date.prototype.getFirstDayOfMonth = function() {
+    var  Z = (this.getDay() - (this.getDate() - 1)) % 7;
+    return  (Z < 0) ? (Z + 7) : Z;
+};
+
+
+
+Date.prototype.getLastDayOfMonth = function() {
+    var  a = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7;
+    return  (a < 0) ? (a + 7) : a;
+};
+
+
+
+
+Date.prototype.getFirstDateOfMonth = function() {
+    return  new  Date(this.getFullYear(), this.getMonth(), 1);
+};
+
+
+
+Date.prototype.getLastDateOfMonth = function() {
+    return  new  Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth());
+};
+
+
+Date.prototype.getDaysInMonth = function() {
+    Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
+    return  Date.daysInMonth[this.getMonth()];
+};
+
+
+
+Date.prototype.getSuffix = function() {
+    switch (this.getDate()) {
+        case  1:
+        case  21:
+        case  31:
+            return  "st";
+        case  2:
+        case  22:
+            return  "nd";
+        case  3:
+        case  23:
+            return  "rd";
+        default:
+            return  "th";
+    }
+};
+
+
+Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
+
+
+
+Date.monthNames =
+   ["January",
+    "February",
+    "March",
+    "April",
+    "May",
+    "June",
+    "July",
+    "August",
+    "September",
+    "October",
+    "November",
+    "December"];
+
+
+
+Date.dayNames =
+   ["Sunday",
+    "Monday",
+    "Tuesday",
+    "Wednesday",
+    "Thursday",
+    "Friday",
+    "Saturday"];
+
+
+Date.y2kYear = 50;
+
+Date.monthNumbers = {
+    Jan:0,
+    Feb:1,
+    Mar:2,
+    Apr:3,
+    May:4,
+    Jun:5,
+    Jul:6,
+    Aug:7,
+    Sep:8,
+    Oct:9,
+    Nov:10,
+    Dec:11};
+
+
+
+Date.prototype.clone = function() {
+       return  new  Date(this.getTime());
+};
+
+
+
+Date.prototype.clearTime = function(b){
+    if(b){
+        return  this.clone().clearTime();
+    }
+
+    this.setHours(0);
+    this.setMinutes(0);
+    this.setSeconds(0);
+    this.setMilliseconds(0);
+    return  this;
+};
+
+
+
+if(Roo.isSafari){
+    Date.brokenSetMonth = Date.prototype.setMonth;
+       Date.prototype.setMonth = function(c){
+               if(c <= -1){
+                       var  n = Math.ceil(-c);
+                       var  back_year = Math.ceil(n/12);
+                       var  month = (n % 12) ? 12 - n % 12 : 0 ;
+                       this.setFullYear(this.getFullYear() - back_year);
+                       return  Date.brokenSetMonth.call(this, month);
+               } else  {
+                       return  Date.brokenSetMonth.apply(this, arguments);
+               }
+       };
+}
+
+
+
+
+Date.MILLI = "ms";
+
+
+Date.SECOND = "s";
+
+
+Date.MINUTE = "mi";
+
+
+Date.HOUR = "h";
+
+
+Date.DAY = "d";
+
+
+Date.MONTH = "mo";
+
+
+Date.YEAR = "y";
+
+
+
+Date.prototype.add = function(e, f){
+  var  d = this.clone();
+  if (!e || f === 0) return  d;
+  switch(e.toLowerCase()){
+    case  Date.MILLI:
+      d.setMilliseconds(this.getMilliseconds() + f);
+      break;
+    case  Date.SECOND:
+      d.setSeconds(this.getSeconds() + f);
+      break;
+    case  Date.MINUTE:
+      d.setMinutes(this.getMinutes() + f);
+      break;
+    case  Date.HOUR:
+      d.setHours(this.getHours() + f);
+      break;
+    case  Date.DAY:
+      d.setDate(this.getDate() + f);
+      break;
+    case  Date.MONTH:
+      var  a = this.getDate();
+      if(a > 28){
+          a = Math.min(a, this.getFirstDateOfMonth().add('mo', f).getLastDateOfMonth().getDate());
+      }
+
+      d.setDate(a);
+      d.setMonth(this.getMonth() + f);
+      break;
+    case  Date.YEAR:
+      d.setFullYear(this.getFullYear() + f);
+      break;
+  }
+  return  d;
+};
+
+
+
+Roo.lib.Dom = {
+    getViewWidth : function(A) {
+        return  A ? this.getDocumentWidth() : this.getViewportWidth();
+    },
+
+    getViewHeight : function(B) {
+        return  B ? this.getDocumentHeight() : this.getViewportHeight();
+    },
+
+    getDocumentHeight: function() {
+        var  C = (document.compatMode != "CSS1Compat") ? document.body.scrollHeight : document.documentElement.scrollHeight;
+        return  Math.max(C, this.getViewportHeight());
+    },
+
+    getDocumentWidth: function() {
+        var  D = (document.compatMode != "CSS1Compat") ? document.body.scrollWidth : document.documentElement.scrollWidth;
+        return  Math.max(D, this.getViewportWidth());
+    },
+
+    getViewportHeight: function() {
+        var  E = self.innerHeight;
+        var  F = document.compatMode;
+
+        if ((F || Roo.isIE) && !Roo.isOpera) {
+            E = (F == "CSS1Compat") ?
+                     document.documentElement.clientHeight :
+                     document.body.clientHeight;
+        }
+
+        return  E;
+    },
+
+    getViewportWidth: function() {
+        var  G = self.innerWidth;
+        var  H = document.compatMode;
+
+        if (H || Roo.isIE) {
+            G = (H == "CSS1Compat") ?
+                    document.documentElement.clientWidth :
+                    document.body.clientWidth;
+        }
+        return  G;
+    },
+
+    isAncestor : function(p, c) {
+        p = Roo.getDom(p);
+        c = Roo.getDom(c);
+        if (!p || !c) {
+            return  false;
+        }
+
+        if (p.contains && !Roo.isSafari) {
+            return  p.contains(c);
+        } else  if (p.compareDocumentPosition) {
+            return  !!(p.compareDocumentPosition(c) & 16);
+        } else  {
+            var  parent = c.parentNode;
+            while (parent) {
+                if (parent == p) {
+                    return  true;
+                }
+                else  if (!parent.tagName || parent.tagName.toUpperCase() == "HTML") {
+                    return  false;
+                }
+
+                parent = parent.parentNode;
+            }
+            return  false;
+        }
+    },
+
+    getRegion : function(el) {
+        return  Roo.lib.Region.getRegion(el);
+    },
+
+    getY : function(el) {
+        return  this.getXY(el)[1];
+    },
+
+    getX : function(el) {
+        return  this.getXY(el)[0];
+    },
+
+    getXY : function(el) {
+        var  p, pe, b, I, bd = document.body;
+        el = Roo.getDom(el);
+        var  J = Roo.lib.AnimBase.fly;
+        if (el.getBoundingClientRect) {
+            b = el.getBoundingClientRect();
+            I = J(document).getScroll();
+            return  [b.left + I.left, b.top + I.top];
+        }
+        var  x = 0, y = 0;
+
+        p = el;
+
+        var  K = J(el).getStyle("position") == "absolute";
+
+        while (p) {
+
+            x += p.offsetLeft;
+            y += p.offsetTop;
+
+            if (!K && J(p).getStyle("position") == "absolute") {
+                K = true;
+            }
+
+            if (Roo.isGecko) {
+                pe = J(p);
+
+                var  bt = parseInt(pe.getStyle("borderTopWidth"), 10) || 0;
+                var  bl = parseInt(pe.getStyle("borderLeftWidth"), 10) || 0;
+
+
+                x += bl;
+                y += bt;
+
+
+                if (p != el && pe.getStyle('overflow') != 'visible') {
+                    x += bl;
+                    y += bt;
+                }
+            }
+
+            p = p.offsetParent;
+        }
+
+        if (Roo.isSafari && K) {
+            x -= bd.offsetLeft;
+            y -= bd.offsetTop;
+        }
+
+        if (Roo.isGecko && !K) {
+            var  dbd = J(bd);
+            x += parseInt(dbd.getStyle("borderLeftWidth"), 10) || 0;
+            y += parseInt(dbd.getStyle("borderTopWidth"), 10) || 0;
+        }
+
+
+        p = el.parentNode;
+        while (p && p != bd) {
+            if (!Roo.isOpera || (p.tagName != 'TR' && J(p).getStyle("display") != "inline")) {
+                x -= p.scrollLeft;
+                y -= p.scrollTop;
+            }
+
+            p = p.parentNode;
+        }
+        return  [x, y];
+    },
+  
+
+
+    setXY : function(el, xy) {
+        el = Roo.fly(el, '_setXY');
+        el.position();
+        var  L = el.translatePoints(xy);
+        if (xy[0] !== false) {
+            el.dom.style.left = L.left + "px";
+        }
+        if (xy[1] !== false) {
+            el.dom.style.top = L.top + "px";
+        }
+    },
+
+    setX : function(el, x) {
+        this.setXY(el, [x, false]);
+    },
+
+    setY : function(el, y) {
+        this.setXY(el, [false, y]);
+    }
+};
+
+
+
+
+Roo.lib.Event = function() {
+    var  A = false;
+    var  B = [];
+    var  C = [];
+    var  D = 0;
+    var  E = [];
+    var  F = 0;
+    var  G = null;
+
+    return  {
+        POLL_RETRYS: 200,
+        POLL_INTERVAL: 20,
+        EL: 0,
+        TYPE: 1,
+        FN: 2,
+        WFN: 3,
+        OBJ: 3,
+        ADJ_SCOPE: 4,
+        _interval: null,
+
+        startInterval: function() {
+            if (!this._interval) {
+                var  self = this;
+                var  callback = function() {
+                    self._tryPreloadAttach();
+                };
+                this._interval = setInterval(callback, this.POLL_INTERVAL);
+
+            }
+        },
+
+        onAvailable: function(h, k, m, n) {
+            E.push({ id:         h,
+                fn:         k,
+                obj:        m,
+                override:   n,
+                checkReady: false    });
+
+            D = this.POLL_RETRYS;
+            this.startInterval();
+        },
+
+
+        addListener: function(el, o, fn) {
+            el = Roo.getDom(el);
+            if (!el || !fn) {
+                return  false;
+            }
+
+            if ("unload" == o) {
+                C[C.length] =
+                [el, o, fn];
+                return  true;
+            }
+
+            var  p = function(e) {
+                return  fn(Roo.lib.Event.getEvent(e));
+            };
+
+            var  li = [el, o, fn, p];
+
+            var  q = B.length;
+            B[q] = li;
+
+            this.doAdd(el, o, p, false);
+            return  true;
+
+        },
+
+
+        removeListener: function(el, r, fn) {
+            var  i, s;
+
+            el = Roo.getDom(el);
+
+            if(!fn) {
+                return  this.purgeElement(el, false, r);
+            }
+
+
+            if ("unload" == r) {
+
+                for (i = 0,s = C.length; i < s; i++) {
+                    var  li = C[i];
+                    if (li &&
+                        li[0] == el &&
+                        li[1] == r &&
+                        li[2] == fn) {
+                        C.splice(i, 1);
+                        return  true;
+                    }
+                }
+
+                return  false;
+            }
+
+            var  u = null;
+
+
+            var  v = arguments[3];
+
+            if ("undefined" == typeof  v) {
+                v = this._getCacheIndex(el, r, fn);
+            }
+
+            if (v >= 0) {
+                u = B[v];
+            }
+
+            if (!el || !u) {
+                return  false;
+            }
+
+
+            this.doRemove(el, r, u[this.WFN], false);
+
+            delete  B[v][this.WFN];
+            delete  B[v][this.FN];
+            B.splice(v, 1);
+
+            return  true;
+
+        },
+
+
+        getTarget: function(ev, w) {
+            ev = ev.browserEvent || ev;
+            var  t = ev.target || ev.srcElement;
+            return  this.resolveTextNode(t);
+        },
+
+
+        resolveTextNode: function(z) {
+            if (Roo.isSafari && z && 3 == z.nodeType) {
+                return  z.parentNode;
+            } else  {
+                return  z;
+            }
+        },
+
+
+        getPageX: function(ev) {
+            ev = ev.browserEvent || ev;
+            var  x = ev.pageX;
+            if (!x && 0 !== x) {
+                x = ev.clientX || 0;
+
+                if (Roo.isIE) {
+                    x += this.getScroll()[1];
+                }
+            }
+
+            return  x;
+        },
+
+
+        getPageY: function(ev) {
+            ev = ev.browserEvent || ev;
+            var  y = ev.pageY;
+            if (!y && 0 !== y) {
+                y = ev.clientY || 0;
+
+                if (Roo.isIE) {
+                    y += this.getScroll()[0];
+                }
+            }
+
+
+            return  y;
+        },
+
+
+        getXY: function(ev) {
+            ev = ev.browserEvent || ev;
+            return  [this.getPageX(ev), this.getPageY(ev)];
+        },
+
+
+        getRelatedTarget: function(ev) {
+            ev = ev.browserEvent || ev;
+            var  t = ev.relatedTarget;
+            if (!t) {
+                if (ev.type == "mouseout") {
+                    t = ev.toElement;
+                } else  if (ev.type == "mouseover") {
+                    t = ev.fromElement;
+                }
+            }
+
+            return  this.resolveTextNode(t);
+        },
+
+
+        getTime: function(ev) {
+            ev = ev.browserEvent || ev;
+            if (!ev.time) {
+                var  t = new  Date().getTime();
+                try {
+                    ev.time = t;
+                } catch(ex) {
+                    this.lastError = ex;
+                    return  t;
+                }
+            }
+
+            return  ev.time;
+        },
+
+
+        stopEvent: function(ev) {
+            this.stopPropagation(ev);
+            this.preventDefault(ev);
+        },
+
+
+        stopPropagation: function(ev) {
+            ev = ev.browserEvent || ev;
+            if (ev.stopPropagation) {
+                ev.stopPropagation();
+            } else  {
+                ev.cancelBubble = true;
+            }
+        },
+
+
+        preventDefault: function(ev) {
+            ev = ev.browserEvent || ev;
+            if(ev.preventDefault) {
+                ev.preventDefault();
+            } else  {
+                ev.returnValue = false;
+            }
+        },
+
+
+        getEvent: function(e) {
+            var  ev = e || window.event;
+            if (!ev) {
+                var  c = this.getEvent.caller;
+                while (c) {
+                    ev = c.arguments[0];
+                    if (ev && Event == ev.constructor) {
+                        break;
+                    }
+
+                    c = c.caller;
+                }
+            }
+            return  ev;
+        },
+
+
+        getCharCode: function(ev) {
+            ev = ev.browserEvent || ev;
+            return  ev.charCode || ev.keyCode || 0;
+        },
+
+
+        _getCacheIndex: function(el, AA, fn) {
+            for (var  i = 0,s = B.length; i < s; ++i) {
+                var  li = B[i];
+                if (li &&
+                    li[this.FN] == fn &&
+                    li[this.EL] == el &&
+                    li[this.TYPE] == AA) {
+                    return  i;
+                }
+            }
+
+            return  -1;
+        },
+
+
+        elCache: {},
+
+
+        getEl: function(id) {
+            return  document.getElementById(id);
+        },
+
+
+        clearCache: function() {
+        },
+
+
+        _load: function(e) {
+            A = true;
+            var  EU = Roo.lib.Event;
+
+
+            if (Roo.isIE) {
+                EU.doRemove(window, "load", EU._load);
+            }
+        },
+
+
+        _tryPreloadAttach: function() {
+
+            if (this.locked) {
+                return  false;
+            }
+
+
+            this.locked = true;
+
+
+            var  AB = !A;
+            if (!AB) {
+                AB = (D > 0);
+            }
+
+
+            var  AC = [];
+            for (var  i = 0,s = E.length; i < s; ++i) {
+                var  item = E[i];
+                if (item) {
+                    var  el = this.getEl(item.id);
+
+                    if (el) {
+                        if (!item.checkReady ||
+                            A ||
+                            el.nextSibling ||
+                            (document && document.body)) {
+
+                            var  scope = el;
+                            if (item.override) {
+                                if (item.override === true) {
+                                    scope = item.obj;
+                                } else  {
+                                    scope = item.override;
+                                }
+                            }
+
+                            item.fn.call(scope, item.obj);
+                            E[i] = null;
+                        }
+                    } else  {
+                        AC.push(item);
+                    }
+                }
+            }
+
+
+            D = (AC.length === 0) ? 0 : D - 1;
+
+            if (AB) {
+
+                this.startInterval();
+            } else  {
+                clearInterval(this._interval);
+                this._interval = null;
+            }
+
+
+            this.locked = false;
+
+            return  true;
+
+        },
+
+
+        purgeElement: function(el, AD, AE) {
+            var  AF = this.getListeners(el, AE);
+            if (AF) {
+                for (var  i = 0,s = AF.length; i < s; ++i) {
+                    var  l = AF[i];
+                    this.removeListener(el, l.type, l.fn);
+                }
+            }
+
+            if (AD && el && el.childNodes) {
+                for (i = 0,s = el.childNodes.length; i < s; ++i) {
+                    this.purgeElement(el.childNodes[i], AD, AE);
+                }
+            }
+        },
+
+
+        getListeners: function(el, AG) {
+            var  AH = [], AI;
+            if (!AG) {
+                AI = [B, C];
+            } else  if (AG == "unload") {
+                AI = [C];
+            } else  {
+                AI = [B];
+            }
+
+            for (var  j = 0; j < AI.length; ++j) {
+                var  searchList = AI[j];
+                if (searchList && searchList.length > 0) {
+                    for (var  i = 0,s = searchList.length; i < s; ++i) {
+                        var  l = searchList[i];
+                        if (l && l[this.EL] === el &&
+                            (!AG || AG === l[this.TYPE])) {
+                            AH.push({
+                                type:   l[this.TYPE],
+                                fn:     l[this.FN],
+                                obj:    l[this.OBJ],
+                                adjust: l[this.ADJ_SCOPE],
+                                index:  i
+                            });
+                        }
+                    }
+                }
+            }
+
+            return  (AH.length) ? AH : null;
+        },
+
+
+        _unload: function(e) {
+
+            var  EU = Roo.lib.Event, i, j, l, AJ, AK;
+
+            for (i = 0,AJ = C.length; i < AJ; ++i) {
+                l = C[i];
+                if (l) {
+                    var  scope = window;
+                    if (l[EU.ADJ_SCOPE]) {
+                        if (l[EU.ADJ_SCOPE] === true) {
+                            scope = l[EU.OBJ];
+                        } else  {
+                            scope = l[EU.ADJ_SCOPE];
+                        }
+                    }
+
+                    l[EU.FN].call(scope, EU.getEvent(e), l[EU.OBJ]);
+                    C[i] = null;
+                    l = null;
+                    scope = null;
+                }
+            }
+
+
+            C = null;
+
+            if (B && B.length > 0) {
+                j = B.length;
+                while (j) {
+                    AK = j - 1;
+                    l = B[AK];
+                    if (l) {
+                        EU.removeListener(l[EU.EL], l[EU.TYPE],
+                                l[EU.FN], AK);
+                    }
+
+                    j = j - 1;
+                }
+
+                l = null;
+
+                EU.clearCache();
+            }
+
+
+            EU.doRemove(window, "unload", EU._unload);
+
+        },
+
+
+        getScroll: function() {
+            var  dd = document.documentElement, db = document.body;
+            if (dd && (dd.scrollTop || dd.scrollLeft)) {
+                return  [dd.scrollTop, dd.scrollLeft];
+            } else  if (db) {
+                return  [db.scrollTop, db.scrollLeft];
+            } else  {
+                return  [0, 0];
+            }
+        },
+
+
+        doAdd: function () {
+            if (window.addEventListener) {
+                return  function(el, AL, fn, AM) {
+                    el.addEventListener(AL, fn, (AM));
+                };
+            } else  if (window.attachEvent) {
+                return  function(el, AL, fn, AM) {
+                    el.attachEvent("on" + AL, fn);
+                };
+            } else  {
+                return  function() {
+                };
+            }
+        }(),
+
+
+        doRemove: function() {
+            if (window.removeEventListener) {
+                return  function (el, AL, fn, AM) {
+                    el.removeEventListener(AL, fn, (AM));
+                };
+            } else  if (window.detachEvent) {
+                return  function (el, AL, fn) {
+                    el.detachEvent("on" + AL, fn);
+                };
+            } else  {
+                return  function() {
+                };
+            }
+        }()
+    };
+    
+}();
+(function() {     
+   
+    var  E = Roo.lib.Event;
+    E.on = E.addListener;
+    E.un = E.removeListener;
+
+    if (document && document.body) {
+        E._load();
+    } else  {
+        E.doAdd(window, "load", E._load);
+    }
+
+    E.doAdd(window, "unload", E._unload);
+    E._tryPreloadAttach();
+})();
+
+
+
+
+
+(function() {
+    
+    Roo.lib.Ajax = {
+        request : function(A, B, cb, C, D) {
+            if(D){
+                var  hs = D.headers;
+                if(hs){
+                    for(var  h  in  hs){
+                        if(hs.hasOwnProperty(h)){
+                            this.initHeader(h, hs[h], false);
+                        }
+                    }
+                }
+                if(D.xmlData){
+                    this.initHeader('Content-Type', 'text/xml', false);
+                    A = 'POST';
+                    C = D.xmlData;
+                }
+            }
+
+            return  this.asyncRequest(A, B, cb, C);
+        },
+
+        serializeForm : function(E) {
+            if(typeof  E == 'string') {
+                E = (document.getElementById(E) || document.forms[E]);
+            }
+
+            var  el, F, G, H, I = '', J = false;
+            for (var  i = 0; i < E.elements.length; i++) {
+                el = E.elements[i];
+                H = E.elements[i].disabled;
+                F = E.elements[i].name;
+                G = E.elements[i].value;
+
+                if (!H && F){
+                    switch (el.type)
+                            {
+                        case  'select-one':
+                        case  'select-multiple':
+                            for (var  j = 0; j < el.options.length; j++) {
+                                if (el.options[j].selected) {
+                                    if (Roo.isIE) {
+                                        I += encodeURIComponent(F) + '=' + encodeURIComponent(el.options[j].attributes['value'].specified ? el.options[j].value : el.options[j].text) + '&';
+                                    }
+                                    else  {
+                                        I += encodeURIComponent(F) + '=' + encodeURIComponent(el.options[j].hasAttribute('value') ? el.options[j].value : el.options[j].text) + '&';
+                                    }
+                                }
+                            }
+                            break;
+                        case  'radio':
+                        case  'checkbox':
+                            if (el.checked) {
+                                I += encodeURIComponent(F) + '=' + encodeURIComponent(G) + '&';
+                            }
+                            break;
+                        case  'file':
+
+                        case  undefined:
+
+                        case  'reset':
+
+                        case  'button':
+
+                            break;
+                        case  'submit':
+                            if(J == false) {
+                                I += encodeURIComponent(F) + '=' + encodeURIComponent(G) + '&';
+                                J = true;
+                            }
+                            break;
+                        default:
+                            I += encodeURIComponent(F) + '=' + encodeURIComponent(G) + '&';
+                            break;
+                    }
+                }
+            }
+
+            I = I.substr(0, I.length - 1);
+            return  I;
+        },
+
+        headers:{},
+
+        hasHeaders:false,
+
+        useDefaultHeader:true,
+
+        defaultPostHeader:'application/x-www-form-urlencoded',
+
+        useDefaultXhrHeader:true,
+
+        defaultXhrHeader:'XMLHttpRequest',
+
+        hasDefaultHeaders:true,
+
+        defaultHeaders:{},
+
+        poll:{},
+
+        timeout:{},
+
+        pollInterval:50,
+
+        transactionId:0,
+
+        setProgId:function(id)
+        {
+            this.activeX.unshift(id);
+        },
+
+        setDefaultPostHeader:function(b)
+        {
+            this.useDefaultHeader = b;
+        },
+
+        setDefaultXhrHeader:function(b)
+        {
+            this.useDefaultXhrHeader = b;
+        },
+
+        setPollingInterval:function(i)
+        {
+            if (typeof  i == 'number' && isFinite(i)) {
+                this.pollInterval = i;
+            }
+        },
+
+        createXhrObject:function(K)
+        {
+            var  L,M;
+            try
+            {
+
+                M = new  XMLHttpRequest();
+
+                L = { conn:M, tId:K };
+            }
+            catch(e)
+            {
+                for (var  i = 0; i < this.activeX.length; ++i) {
+                    try
+                    {
+
+                        http = new  ActiveXObject(this.activeX[i]);
+
+                        obj = { conn:http, tId:transactionId };
+                        break;
+                    }
+                    catch(e) {
+                    }
+                }
+            }
+            finally
+            {
+                return  L;
+            }
+        },
+
+        getConnectionObject:function()
+        {
+            var  o;
+            var  N = this.transactionId;
+
+            try
+            {
+                o = this.createXhrObject(N);
+                if (o) {
+                    this.transactionId++;
+                }
+            }
+            catch(e) {
+            }
+            finally
+            {
+                return  o;
+            }
+        },
+
+        asyncRequest:function(O, P, Q, R)
+        {
+            var  o = this.getConnectionObject();
+
+            if (!o) {
+                return  null;
+            }
+            else  {
+                o.conn.open(O, P, true);
+
+                if (this.useDefaultXhrHeader) {
+                    if (!this.defaultHeaders['X-Requested-With']) {
+                        this.initHeader('X-Requested-With', this.defaultXhrHeader, true);
+                    }
+                }
+
+                if(R && this.useDefaultHeader){
+                    this.initHeader('Content-Type', this.defaultPostHeader);
+                }
+
+                 if (this.hasDefaultHeaders || this.hasHeaders) {
+                    this.setHeader(o);
+                }
+
+
+                this.handleReadyState(o, Q);
+                o.conn.send(R || null);
+
+                return  o;
+            }
+        },
+
+        handleReadyState:function(o, S)
+        {
+            var  T = this;
+
+            if (S && S.timeout) {
+                this.timeout[o.tId] = window.setTimeout(function() {
+                    T.abort(o, S, true);
+                }, S.timeout);
+            }
+
+
+            this.poll[o.tId] = window.setInterval(
+                    function() {
+                        if (o.conn && o.conn.readyState == 4) {
+                            window.clearInterval(T.poll[o.tId]);
+                            delete  T.poll[o.tId];
+
+                            if(S && S.timeout) {
+                                window.clearTimeout(T.timeout[o.tId]);
+                                delete  T.timeout[o.tId];
+                            }
+
+
+                            T.handleTransactionResponse(o, S);
+                        }
+                    }
+                    , this.pollInterval);
+        },
+
+        handleTransactionResponse:function(o, U, V)
+        {
+
+            if (!U) {
+                this.releaseObject(o);
+                return;
+            }
+
+            var  W, X;
+
+            try
+            {
+                if (o.conn.status !== undefined && o.conn.status != 0) {
+                    W = o.conn.status;
+                }
+                else  {
+                    W = 13030;
+                }
+            }
+            catch(e) {
+
+
+                httpStatus = 13030;
+            }
+
+            if (W >= 200 && W < 300) {
+                X = this.createResponseObject(o, U.argument);
+                if (U.success) {
+                    if (!U.scope) {
+                        U.success(X);
+                    }
+                    else  {
+
+
+                        U.success.apply(U.scope, [X]);
+                    }
+                }
+            }
+            else  {
+                switch (W) {
+
+                    case  12002:
+                    case  12029:
+                    case  12030:
+                    case  12031:
+                    case  12152:
+                    case  13030:
+                        X = this.createExceptionObject(o.tId, U.argument, (V ? V : false));
+                        if (U.failure) {
+                            if (!U.scope) {
+                                U.failure(X);
+                            }
+                            else  {
+                                U.failure.apply(U.scope, [X]);
+                            }
+                        }
+                        break;
+                    default:
+                        X = this.createResponseObject(o, U.argument);
+                        if (U.failure) {
+                            if (!U.scope) {
+                                U.failure(X);
+                            }
+                            else  {
+                                U.failure.apply(U.scope, [X]);
+                            }
+                        }
+                }
+            }
+
+
+            this.releaseObject(o);
+            X = null;
+        },
+
+        createResponseObject:function(o, Y)
+        {
+            var  Z = {};
+            var  a = {};
+
+            try
+            {
+                var  headerStr = o.conn.getAllResponseHeaders();
+                var  header = headerStr.split('\n');
+                for (var  i = 0; i < header.length; i++) {
+                    var  delimitPos = header[i].indexOf(':');
+                    if (delimitPos != -1) {
+                        a[header[i].substring(0, delimitPos)] = header[i].substring(delimitPos + 2);
+                    }
+                }
+            }
+            catch(e) {
+            }
+
+
+            Z.tId = o.tId;
+            Z.status = o.conn.status;
+            Z.statusText = o.conn.statusText;
+            Z.getResponseHeader = a;
+            Z.getAllResponseHeaders = headerStr;
+            Z.responseText = o.conn.responseText;
+            Z.responseXML = o.conn.responseXML;
+
+            if (typeof  Y !== undefined) {
+                Z.argument = Y;
+            }
+
+            return  Z;
+        },
+
+        createExceptionObject:function(c, d, f)
+        {
+            var  g = 0;
+            var  k = 'communication failure';
+            var  l = -1;
+            var  m = 'transaction aborted';
+
+            var  n = {};
+
+            n.tId = c;
+            if (f) {
+                n.status = l;
+                n.statusText = m;
+            }
+            else  {
+                n.status = g;
+                n.statusText = k;
+            }
+
+            if (d) {
+                n.argument = d;
+            }
+
+            return  n;
+        },
+
+        initHeader:function(p, q, r)
+        {
+            var  s = (r) ? this.defaultHeaders : this.headers;
+
+            if (s[p] === undefined) {
+                s[p] = q;
+            }
+            else  {
+
+
+                s[p] = q + "," + s[p];
+            }
+
+            if (r) {
+                this.hasDefaultHeaders = true;
+            }
+            else  {
+                this.hasHeaders = true;
+            }
+        },
+
+
+        setHeader:function(o)
+        {
+            if (this.hasDefaultHeaders) {
+                for (var  prop  in  this.defaultHeaders) {
+                    if (this.defaultHeaders.hasOwnProperty(prop)) {
+                        o.conn.setRequestHeader(prop, this.defaultHeaders[prop]);
+                    }
+                }
+            }
+
+            if (this.hasHeaders) {
+                for (var  prop  in  this.headers) {
+                    if (this.headers.hasOwnProperty(prop)) {
+                        o.conn.setRequestHeader(prop, this.headers[prop]);
+                    }
+                }
+
+                this.headers = {};
+                this.hasHeaders = false;
+            }
+        },
+
+        resetDefaultHeaders:function() {
+            delete  this.defaultHeaders;
+            this.defaultHeaders = {};
+            this.hasDefaultHeaders = false;
+        },
+
+        abort:function(o, t, u)
+        {
+            if(this.isCallInProgress(o)) {
+                o.conn.abort();
+                window.clearInterval(this.poll[o.tId]);
+                delete  this.poll[o.tId];
+                if (u) {
+                    delete  this.timeout[o.tId];
+                }
+
+
+                this.handleTransactionResponse(o, t, true);
+
+                return  true;
+            }
+            else  {
+                return  false;
+            }
+        },
+
+
+        isCallInProgress:function(o)
+        {
+            if (o && o.conn) {
+                return  o.conn.readyState != 4 && o.conn.readyState != 0;
+            }
+            else  {
+
+                return  false;
+            }
+        },
+
+
+        releaseObject:function(o)
+        {
+
+            o.conn = null;
+
+            o = null;
+        },
+
+        activeX:[
+        'MSXML2.XMLHTTP.3.0',
+        'MSXML2.XMLHTTP',
+        'Microsoft.XMLHTTP'
+        ]
+
+
+    };
+})();
+
+
+
+Roo.lib.Region = function(t, r, b, l) {
+    this.top = t;
+    this[1] = t;
+    this.right = r;
+    this.bottom = b;
+    this.left = l;
+    this[0] = l;
+};
+
+
+Roo.lib.Region.prototype = {
+    contains : function(A) {
+        return  ( A.left >= this.left &&
+                 A.right <= this.right &&
+                 A.top >= this.top &&
+                 A.bottom <= this.bottom    );
+
+    },
+
+    getArea : function() {
+        return  ( (this.bottom - this.top) * (this.right - this.left) );
+    },
+
+    intersect : function(B) {
+        var  t = Math.max(this.top, B.top);
+        var  r = Math.min(this.right, B.right);
+        var  b = Math.min(this.bottom, B.bottom);
+        var  l = Math.max(this.left, B.left);
+
+        if (b >= t && r >= l) {
+            return  new  Roo.lib.Region(t, r, b, l);
+        } else  {
+            return  null;
+        }
+    },
+    union : function(C) {
+        var  t = Math.min(this.top, C.top);
+        var  r = Math.max(this.right, C.right);
+        var  b = Math.max(this.bottom, C.bottom);
+        var  l = Math.min(this.left, C.left);
+
+        return  new  Roo.lib.Region(t, r, b, l);
+    },
+
+    adjust : function(t, l, b, r) {
+        this.top += t;
+        this.left += l;
+        this.right += r;
+        this.bottom += b;
+        return  this;
+    }
+};
+
+Roo.lib.Region.getRegion = function(el) {
+    var  p = Roo.lib.Dom.getXY(el);
+
+    var  t = p[1];
+    var  r = p[0] + el.offsetWidth;
+    var  b = p[1] + el.offsetHeight;
+    var  l = p[0];
+
+    return  new  Roo.lib.Region(t, r, b, l);
+};
+
+
+
+
+
+
+Roo.lib.Point = function(x, y) {
+    if (x  instanceof  Array) {
+        y = x[1];
+        x = x[0];
+    }
+
+    this.x = this.right = this.left = this[0] = x;
+    this.y = this.top = this.bottom = this[1] = y;
+};
+
+Roo.lib.Point.prototype = new  Roo.lib.Region();
+
+
+
+(function() {   
+
+    Roo.lib.Anim = {
+        scroll : function(el, A, B, C, cb, D) {
+            this.run(el, A, B, C, cb, D, Roo.lib.Scroll);
+        },
+
+        motion : function(el, E, F, G, cb, H) {
+            this.run(el, E, F, G, cb, H, Roo.lib.Motion);
+        },
+
+        color : function(el, I, J, K, cb, L) {
+            this.run(el, I, J, K, cb, L, Roo.lib.ColorAnim);
+        },
+
+        run : function(el, M, N, O, cb, P, Q) {
+            Q = Q || Roo.lib.AnimBase;
+            if (typeof  O == "string") {
+                O = Roo.lib.Easing[O];
+            }
+            var  R = new  Q(el, M, N, O);
+            R.animateX(function() {
+                Roo.callback(cb, P);
+            });
+            return  R;
+        }
+    };
+})();
+
+
+
+(function() {    
+    var  A;
+    
+    function  B(el) {
+        if (!A) {
+            A = new  Roo.Element.Flyweight();
+        }
+
+        A.dom = el;
+        return  A;
+    }
+
+
+    
+    
+   
+    
+    Roo.lib.AnimBase = function(el, C, D, E) {
+        if (el) {
+            this.init(el, C, D, E);
+        }
+    };
+
+    Roo.lib.AnimBase.fly = B;
+    
+    
+    
+    Roo.lib.AnimBase.prototype = {
+
+        toString: function() {
+            var  el = this.getEl();
+            var  id = el.id || el.tagName;
+            return  ("Anim " + id);
+        },
+
+        patterns: {
+            noNegatives:        /width|height|opacity|padding/i,
+            offsetAttribute:  /^((width|height)|(top|left))$/,
+            defaultUnit:        /width|height|top$|bottom$|left$|right$/i,
+            offsetUnit:         /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i
+        },
+
+
+        doMethod: function(C, D, E) {
+            return  this.method(this.currentFrame, D, E - D, this.totalFrames);
+        },
+
+
+        setAttribute: function(F, G, H) {
+            if (this.patterns.noNegatives.test(F)) {
+                G = (G > 0) ? G : 0;
+            }
+
+
+            Roo.fly(this.getEl(), '_anim').setStyle(F, G + H);
+        },
+
+
+        getAttribute: function(I) {
+            var  el = this.getEl();
+            var  J = B(el).getStyle(I);
+
+            if (J !== 'auto' && !this.patterns.offsetUnit.test(J)) {
+                return  parseFloat(J);
+            }
+
+            var  a = this.patterns.offsetAttribute.exec(I) || [];
+            var  K = !!( a[3] );
+            var  L = !!( a[2] );
+
+
+            if (L || (B(el).getStyle('position') == 'absolute' && K)) {
+                J = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)];
+            } else  {
+                J = 0;
+            }
+
+            return  J;
+        },
+
+
+        getDefaultUnit: function(M) {
+            if (this.patterns.defaultUnit.test(M)) {
+                return  'px';
+            }
+
+            return  '';
+        },
+
+        animateX : function(N, O) {
+            var  f = function() {
+                this.onComplete.removeListener(f);
+                if (typeof  N == "function") {
+                    N.call(O || this, this);
+                }
+            };
+            this.onComplete.addListener(f, this);
+            this.animate();
+        },
+
+
+        setRuntimeAttribute: function(P) {
+            var  Q;
+            var  R;
+            var  S = this.attributes;
+
+            this.runtimeAttributes[P] = {};
+
+            var  T = function(U) {
+                return  (typeof  U !== 'undefined');
+            };
+
+            if (!T(S[P]['to']) && !T(S[P]['by'])) {
+                return  false;
+            }
+
+
+            Q = ( T(S[P]['from']) ) ? S[P]['from'] : this.getAttribute(P);
+
+
+            if (T(S[P]['to'])) {
+                R = S[P]['to'];
+            } else  if (T(S[P]['by'])) {
+                if (Q.constructor == Array) {
+                    R = [];
+                    for (var  i = 0, len = Q.length; i < len; ++i) {
+                        R[i] = Q[i] + S[P]['by'][i];
+                    }
+                } else  {
+                    R = Q + S[P]['by'];
+                }
+            }
+
+
+            this.runtimeAttributes[P].start = Q;
+            this.runtimeAttributes[P].end = R;
+
+
+            this.runtimeAttributes[P].unit = ( T(S[P].unit) ) ? S[P]['unit'] : this.getDefaultUnit(P);
+        },
+
+
+        init: function(el, U, V, W) {
+
+            var  X = false;
+
+
+            var  Y = null;
+
+
+            var  Z = 0;
+
+
+            el = Roo.getDom(el);
+
+
+            this.attributes = U || {};
+
+
+            this.duration = V || 1;
+
+
+            this.method = W || Roo.lib.Easing.easeNone;
+
+
+            this.useSeconds = true;
+
+
+            this.currentFrame = 0;
+
+
+            this.totalFrames = Roo.lib.AnimMgr.fps;
+
+
+            this.getEl = function() {
+                return  el;
+            };
+
+
+            this.isAnimated = function() {
+                return  X;
+            };
+
+
+            this.getStartTime = function() {
+                return  Y;
+            };
+
+            this.runtimeAttributes = {};
+
+
+            this.animate = function() {
+                if (this.isAnimated()) {
+                    return  false;
+                }
+
+
+                this.currentFrame = 0;
+
+                this.totalFrames = ( this.useSeconds ) ? Math.ceil(Roo.lib.AnimMgr.fps * this.duration) : this.duration;
+
+                Roo.lib.AnimMgr.registerElement(this);
+            };
+
+
+            this.stop = function(e) {
+                if (e) {
+                    this.currentFrame = this.totalFrames;
+                    this._onTween.fire();
+                }
+
+                Roo.lib.AnimMgr.stop(this);
+            };
+
+            var  b = function() {
+                this.onStart.fire();
+
+                this.runtimeAttributes = {};
+                for (var  P  in  this.attributes) {
+                    this.setRuntimeAttribute(P);
+                }
+
+
+                X = true;
+                Z = 0;
+                Y = new  Date();
+            };
+
+
+            var  c = function() {
+                var  e = {
+                    duration: new  Date() - this.getStartTime(),
+                    currentFrame: this.currentFrame
+                };
+
+                e.toString = function() {
+                    return  (
+                            'duration: ' + e.duration +
+                            ', currentFrame: ' + e.currentFrame
+                            );
+                };
+
+                this.onTween.fire(e);
+
+                var  g = this.runtimeAttributes;
+
+                for (var  P  in  g) {
+                    this.setAttribute(P, this.doMethod(P, g[P].start, g[P].end), g[P].unit);
+                }
+
+
+                Z += 1;
+            };
+
+            var  d = function() {
+                var  e = (new  Date() - Y) / 1000 ;
+
+                var  g = {
+                    duration: e,
+                    frames: Z,
+                    fps: Z / e
+                };
+
+                g.toString = function() {
+                    return  (
+                            'duration: ' + g.duration +
+                            ', frames: ' + g.frames +
+                            ', fps: ' + g.fps
+                            );
+                };
+
+                X = false;
+                Z = 0;
+                this.onComplete.fire(g);
+            };
+
+
+            this._onStart = new  Roo.util.Event(this);
+            this.onStart = new  Roo.util.Event(this);
+            this.onTween = new  Roo.util.Event(this);
+            this._onTween = new  Roo.util.Event(this);
+            this.onComplete = new  Roo.util.Event(this);
+            this._onComplete = new  Roo.util.Event(this);
+            this._onStart.addListener(b);
+            this._onTween.addListener(c);
+            this._onComplete.addListener(d);
+        }
+    };
+})();
+
+
+
+
+Roo.lib.AnimMgr = new  function() {
+
+        var  A = null;
+
+
+        var  B = [];
+
+
+        var  C = 0;
+
+
+        this.fps = 1000;
+
+
+        this.delay = 1;
+
+
+        this.registerElement = function(F) {
+            B[B.length] = F;
+            C += 1;
+            F._onStart.fire();
+            this.start();
+        };
+
+
+        this.unRegister = function(F, G) {
+            F._onComplete.fire();
+            G = G || D(F);
+            if (G != -1) {
+                B.splice(G, 1);
+            }
+
+
+            C -= 1;
+            if (C <= 0) {
+                this.stop();
+            }
+        };
+
+
+        this.start = function() {
+            if (A === null) {
+                A = setInterval(this.run, this.delay);
+            }
+        };
+
+
+        this.stop = function(F) {
+            if (!F) {
+                clearInterval(A);
+
+                for (var  i = 0, len = B.length; i < len; ++i) {
+                    if (B[0].isAnimated()) {
+                        this.unRegister(B[0], 0);
+                    }
+                }
+
+
+                B = [];
+                A = null;
+                C = 0;
+            }
+            else  {
+                this.unRegister(F);
+            }
+        };
+
+
+        this.run = function() {
+            for (var  i = 0, len = B.length; i < len; ++i) {
+                var  tween = B[i];
+                if (!tween || !tween.isAnimated()) {
+                    continue;
+                }
+
+                if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null)
+                {
+                    tween.currentFrame += 1;
+
+                    if (tween.useSeconds) {
+                        E(tween);
+                    }
+
+                    tween._onTween.fire();
+                }
+                else  {
+                    Roo.lib.AnimMgr.stop(tween, i);
+                }
+            }
+        };
+
+        var  D = function(F) {
+            for (var  i = 0, len = B.length; i < len; ++i) {
+                if (B[i] == F) {
+                    return  i;
+                }
+            }
+            return  -1;
+        };
+
+
+        var  E = function(F) {
+            var  G = F.totalFrames;
+            var  H = F.currentFrame;
+            var  I = (F.currentFrame * F.duration * 1000 / F.totalFrames);
+            var  J = (new  Date() - F.getStartTime());
+            var  K = 0;
+
+            if (J < F.duration * 1000) {
+                K = Math.round((J / I - 1) * F.currentFrame);
+            } else  {
+                K = G - (H + 1);
+            }
+            if (K > 0 && isFinite(K)) {
+                if (F.currentFrame + K >= G) {
+                    K = G - (H + 1);
+                }
+
+
+                F.currentFrame += K;
+            }
+        };
+    };
+
+
+Roo.lib.Bezier = new  function() {
+
+        this.getPosition = function(A, t) {
+            var  n = A.length;
+            var  B = [];
+
+            for (var  i = 0; i < n; ++i) {
+                B[i] = [A[i][0], A[i][1]];
+            }
+
+            for (var  j = 1; j < n; ++j) {
+                for (i = 0; i < n - j; ++i) {
+                    B[i][0] = (1 - t) * B[i][0] + t * B[parseInt(i + 1, 10)][0];
+                    B[i][1] = (1 - t) * B[i][1] + t * B[parseInt(i + 1, 10)][1];
+                }
+            }
+
+            return  [ B[0][0], B[0][1] ];
+
+        };
+    };
+
+
+(function() {
+
+    Roo.lib.ColorAnim = function(el, D, E, F) {
+        Roo.lib.ColorAnim.superclass.constructor.call(this, el, D, E, F);
+    };
+
+    Roo.extend(Roo.lib.ColorAnim, Roo.lib.AnimBase);
+
+    var  A = Roo.lib.AnimBase.fly;
+    var  Y = Roo.lib;
+    var  B = Y.ColorAnim.superclass;
+    var  C = Y.ColorAnim.prototype;
+
+    C.toString = function() {
+        var  el = this.getEl();
+        var  id = el.id || el.tagName;
+        return  ("ColorAnim " + id);
+    };
+
+    C.patterns.color = /color$/i;
+    C.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i;
+    C.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;
+    C.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i;
+    C.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/;
+
+
+    C.parseColor = function(s) {
+        if (s.length == 3) {
+            return  s;
+        }
+
+        var  c = this.patterns.hex.exec(s);
+        if (c && c.length == 4) {
+            return  [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ];
+        }
+
+
+        c = this.patterns.rgb.exec(s);
+        if (c && c.length == 4) {
+            return  [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ];
+        }
+
+
+        c = this.patterns.hex3.exec(s);
+        if (c && c.length == 4) {
+            return  [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ];
+        }
+
+        return  null;
+    };
+    
+    C.getAttribute = function(D) {
+        var  el = this.getEl();
+        if (this.patterns.color.test(D)) {
+            var  val = A(el).getStyle(D);
+
+            if (this.patterns.transparent.test(val)) {
+                var  parent = el.parentNode;
+                val = A(parent).getStyle(D);
+
+                while (parent && this.patterns.transparent.test(val)) {
+                    parent = parent.parentNode;
+                    val = A(parent).getStyle(D);
+                    if (parent.tagName.toUpperCase() == 'HTML') {
+                        val = '#fff';
+                    }
+                }
+            }
+        } else  {
+            val = B.getAttribute.call(this, D);
+        }
+
+        return  val;
+    };
+    C.getAttribute = function(D) {
+        var  el = this.getEl();
+        if (this.patterns.color.test(D)) {
+            var  val = A(el).getStyle(D);
+
+            if (this.patterns.transparent.test(val)) {
+                var  parent = el.parentNode;
+                val = A(parent).getStyle(D);
+
+                while (parent && this.patterns.transparent.test(val)) {
+                    parent = parent.parentNode;
+                    val = A(parent).getStyle(D);
+                    if (parent.tagName.toUpperCase() == 'HTML') {
+                        val = '#fff';
+                    }
+                }
+            }
+        } else  {
+            val = B.getAttribute.call(this, D);
+        }
+
+        return  val;
+    };
+
+    C.doMethod = function(D, E, F) {
+        var  G;
+
+        if (this.patterns.color.test(D)) {
+            G = [];
+            for (var  i = 0, len = E.length; i < len; ++i) {
+                G[i] = B.doMethod.call(this, D, E[i], F[i]);
+            }
+
+
+            G = 'rgb(' + Math.floor(G[0]) + ',' + Math.floor(G[1]) + ',' + Math.floor(G[2]) + ')';
+        }
+        else  {
+            G = B.doMethod.call(this, D, E, F);
+        }
+
+        return  G;
+    };
+
+    C.setRuntimeAttribute = function(D) {
+        B.setRuntimeAttribute.call(this, D);
+
+        if (this.patterns.color.test(D)) {
+            var  attributes = this.attributes;
+            var  start = this.parseColor(this.runtimeAttributes[D].start);
+            var  end = this.parseColor(this.runtimeAttributes[D].end);
+
+            if (typeof  attributes[D]['to'] === 'undefined' && typeof  attributes[D]['by'] !== 'undefined') {
+                end = this.parseColor(attributes[D].by);
+
+                for (var  i = 0, len = start.length; i < len; ++i) {
+                    end[i] = start[i] + end[i];
+                }
+            }
+
+
+            this.runtimeAttributes[D].start = start;
+            this.runtimeAttributes[D].end = end;
+        }
+    };
+})();
+
+
+
+
+Roo.lib.Easing = {
+
+
+    easeNone: function (t, b, c, d) {
+        return  c * t / d + b;
+    },
+
+
+    easeIn: function (t, b, c, d) {
+        return  c * (t /= d) * t + b;
+    },
+
+
+    easeOut: function (t, b, c, d) {
+        return  -c * (t /= d) * (t - 2) + b;
+    },
+
+
+    easeBoth: function (t, b, c, d) {
+        if ((t /= d / 2) < 1) {
+            return  c / 2 * t * t + b;
+        }
+
+        return  -c / 2 * ((--t) * (t - 2) - 1) + b;
+    },
+
+
+    easeInStrong: function (t, b, c, d) {
+        return  c * (t /= d) * t * t * t + b;
+    },
+
+
+    easeOutStrong: function (t, b, c, d) {
+        return  -c * ((t = t / d - 1) * t * t * t - 1) + b;
+    },
+
+
+    easeBothStrong: function (t, b, c, d) {
+        if ((t /= d / 2) < 1) {
+            return  c / 2 * t * t * t * t + b;
+        }
+
+        return  -c / 2 * ((t -= 2) * t * t * t - 2) + b;
+    },
+
+
+
+    elasticIn: function (t, b, c, d, a, p) {
+        if (t == 0) {
+            return  b;
+        }
+        if ((t /= d) == 1) {
+            return  b + c;
+        }
+        if (!p) {
+            p = d * .3;
+        }
+
+        if (!a || a < Math.abs(c)) {
+            a = c;
+            var  s = p / 4;
+        }
+        else  {
+            var  s = p / (2 * Math.PI) * Math.asin(c / a);
+        }
+
+        return  -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
+    },
+
+
+    elasticOut: function (t, b, c, d, a, p) {
+        if (t == 0) {
+            return  b;
+        }
+        if ((t /= d) == 1) {
+            return  b + c;
+        }
+        if (!p) {
+            p = d * .3;
+        }
+
+        if (!a || a < Math.abs(c)) {
+            a = c;
+            var  s = p / 4;
+        }
+        else  {
+            var  s = p / (2 * Math.PI) * Math.asin(c / a);
+        }
+
+        return  a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;
+    },
+
+
+    elasticBoth: function (t, b, c, d, a, p) {
+        if (t == 0) {
+            return  b;
+        }
+
+        if ((t /= d / 2) == 2) {
+            return  b + c;
+        }
+
+        if (!p) {
+            p = d * (.3 * 1.5);
+        }
+
+        if (!a || a < Math.abs(c)) {
+            a = c;
+            var  s = p / 4;
+        }
+        else  {
+            var  s = p / (2 * Math.PI) * Math.asin(c / a);
+        }
+
+        if (t < 1) {
+            return  -.5 * (a * Math.pow(2, 10 * (t -= 1)) *
+                          Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
+        }
+        return  a * Math.pow(2, -10 * (t -= 1)) *
+               Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b;
+    },
+
+
+
+    backIn: function (t, b, c, d, s) {
+        if (typeof  s == 'undefined') {
+            s = 1.70158;
+        }
+        return  c * (t /= d) * t * ((s + 1) * t - s) + b;
+    },
+
+
+    backOut: function (t, b, c, d, s) {
+        if (typeof  s == 'undefined') {
+            s = 1.70158;
+        }
+        return  c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
+    },
+
+
+    backBoth: function (t, b, c, d, s) {
+        if (typeof  s == 'undefined') {
+            s = 1.70158;
+        }
+
+        if ((t /= d / 2 ) < 1) {
+            return  c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;
+        }
+        return  c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;
+    },
+
+
+    bounceIn: function (t, b, c, d) {
+        return  c - Roo.lib.Easing.bounceOut(d - t, 0, c, d) + b;
+    },
+
+
+    bounceOut: function (t, b, c, d) {
+        if ((t /= d) < (1 / 2.75)) {
+            return  c * (7.5625 * t * t) + b;
+        } else  if (t < (2 / 2.75)) {
+            return  c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;
+        } else  if (t < (2.5 / 2.75)) {
+            return  c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;
+        }
+        return  c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;
+    },
+
+
+    bounceBoth: function (t, b, c, d) {
+        if (t < d / 2) {
+            return  Roo.lib.Easing.bounceIn(t * 2, 0, c, d) * .5 + b;
+        }
+        return  Roo.lib.Easing.bounceOut(t * 2 - d, 0, c, d) * .5 + c * .5 + b;
+    }
+};
+
+
+    (function() {
+        Roo.lib.Motion = function(el, E, F, G) {
+            if (el) {
+                Roo.lib.Motion.superclass.constructor.call(this, el, E, F, G);
+            }
+        };
+
+        Roo.extend(Roo.lib.Motion, Roo.lib.ColorAnim);
+
+
+        var  Y = Roo.lib;
+        var  A = Y.Motion.superclass;
+        var  B = Y.Motion.prototype;
+
+        B.toString = function() {
+            var  el = this.getEl();
+            var  id = el.id || el.tagName;
+            return  ("Motion " + id);
+        };
+
+        B.patterns.points = /^points$/i;
+
+        B.setAttribute = function(E, F, G) {
+            if (this.patterns.points.test(E)) {
+                G = G || 'px';
+                A.setAttribute.call(this, 'left', F[0], G);
+                A.setAttribute.call(this, 'top', F[1], G);
+            } else  {
+                A.setAttribute.call(this, E, F, G);
+            }
+        };
+
+        B.getAttribute = function(E) {
+            if (this.patterns.points.test(E)) {
+                var  val = [
+                        A.getAttribute.call(this, 'left'),
+                        A.getAttribute.call(this, 'top')
+                        ];
+            } else  {
+                val = A.getAttribute.call(this, E);
+            }
+
+            return  val;
+        };
+
+        B.doMethod = function(E, F, G) {
+            var  H = null;
+
+            if (this.patterns.points.test(E)) {
+                var  t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100;
+                H = Y.Bezier.getPosition(this.runtimeAttributes[E], t);
+            } else  {
+                H = A.doMethod.call(this, E, F, G);
+            }
+            return  H;
+        };
+
+        B.setRuntimeAttribute = function(E) {
+            if (this.patterns.points.test(E)) {
+                var  el = this.getEl();
+                var  attributes = this.attributes;
+                var  start;
+                var  control = attributes['points']['control'] || [];
+                var  end;
+                var  i, len;
+
+                if (control.length > 0 && !(control[0]  instanceof  Array)) {
+                    control = [control];
+                } else  {
+                    var  tmp = [];
+                    for (i = 0,len = control.length; i < len; ++i) {
+                        tmp[i] = control[i];
+                    }
+
+                    control = tmp;
+                }
+
+
+                Roo.fly(el).position();
+
+                if (D(attributes['points']['from'])) {
+                    Roo.lib.Dom.setXY(el, attributes['points']['from']);
+                }
+                else  {
+                    Roo.lib.Dom.setXY(el, Roo.lib.Dom.getXY(el));
+                }
+
+
+                start = this.getAttribute('points');
+
+
+                if (D(attributes['points']['to'])) {
+                    end = C.call(this, attributes['points']['to'], start);
+
+                    var  pageXY = Roo.lib.Dom.getXY(this.getEl());
+                    for (i = 0,len = control.length; i < len; ++i) {
+                        control[i] = C.call(this, control[i], start);
+                    }
+
+
+                } else  if (D(attributes['points']['by'])) {
+                    end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ];
+
+                    for (i = 0,len = control.length; i < len; ++i) {
+                        control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ];
+                    }
+                }
+
+
+                this.runtimeAttributes[E] = [start];
+
+                if (control.length > 0) {
+                    this.runtimeAttributes[E] = this.runtimeAttributes[E].concat(control);
+                }
+
+
+                this.runtimeAttributes[E][this.runtimeAttributes[E].length] = end;
+            }
+            else  {
+                A.setRuntimeAttribute.call(this, E);
+            }
+        };
+
+        var  C = function(E, F) {
+            var  G = Roo.lib.Dom.getXY(this.getEl());
+            E = [ E[0] - G[0] + F[0], E[1] - G[1] + F[1] ];
+
+            return  E;
+        };
+
+        var  D = function(E) {
+            return  (typeof  E !== 'undefined');
+        };
+    })();
+
+
+
+    (function() {
+        Roo.lib.Scroll = function(el, C, D, E) {
+            if (el) {
+                Roo.lib.Scroll.superclass.constructor.call(this, el, C, D, E);
+            }
+        };
+
+        Roo.extend(Roo.lib.Scroll, Roo.lib.ColorAnim);
+
+
+        var  Y = Roo.lib;
+        var  A = Y.Scroll.superclass;
+        var  B = Y.Scroll.prototype;
+
+        B.toString = function() {
+            var  el = this.getEl();
+            var  id = el.id || el.tagName;
+            return  ("Scroll " + id);
+        };
+
+        B.doMethod = function(C, D, E) {
+            var  F = null;
+
+            if (C == 'scroll') {
+                F = [
+                        this.method(this.currentFrame, D[0], E[0] - D[0], this.totalFrames),
+                        this.method(this.currentFrame, D[1], E[1] - D[1], this.totalFrames)
+                        ];
+
+            } else  {
+                F = A.doMethod.call(this, C, D, E);
+            }
+            return  F;
+        };
+
+        B.getAttribute = function(C) {
+            var  D = null;
+            var  el = this.getEl();
+
+            if (C == 'scroll') {
+                D = [ el.scrollLeft, el.scrollTop ];
+            } else  {
+                D = A.getAttribute.call(this, C);
+            }
+
+            return  D;
+        };
+
+        B.setAttribute = function(C, D, E) {
+            var  el = this.getEl();
+
+            if (C == 'scroll') {
+                el.scrollLeft = D[0];
+                el.scrollTop = D[1];
+            } else  {
+                A.setAttribute.call(this, C, D, E);
+            }
+        };
+    })();
+
+
+
+
+
+
+Roo.DomHelper = function(){
+    var  A = null;
+    var  B = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;
+    var  C = /^table|tbody|tr|td$/i;
+    var  D = {};
+    
+    
+
+    var  E = function(o){
+        if(typeof  o == 'string'){
+            return  o;
+        }
+        var  b = "";
+        if(!o.tag){
+            o.tag = "div";
+        }
+
+        b += "<" + o.tag;
+        for(var  attr  in  o){
+            if(attr == "tag" || attr == "children" || attr == "cn" || attr == "html" || typeof  o[attr] == "function") continue;
+            if(attr == "style"){
+                var  s = o["style"];
+                if(typeof  s == "function"){
+                    s = s.call();
+                }
+                if(typeof  s == "string"){
+                    b += ' style="' + s + '"';
+                }else  if(typeof  s == "object"){
+                    b += ' style="';
+                    for(var  key  in  s){
+                        if(typeof  s[key] != "function"){
+                            b += key + ":" + s[key] + ";";
+                        }
+                    }
+
+                    b += '"';
+                }
+            }else {
+                if(attr == "cls"){
+                    b += ' class="' + o["cls"] + '"';
+                }else  if(attr == "htmlFor"){
+                    b += ' for="' + o["htmlFor"] + '"';
+                }else {
+                    b += " " + attr + '="' + o[attr] + '"';
+                }
+            }
+        }
+        if(B.test(o.tag)){
+            b += "/>";
+        }else {
+            b += ">";
+            var  cn = o.children || o.cn;
+            if(cn){
+                
+                if((cn  instanceof  Array) || (Roo.isSafari && typeof(cn.join) == "function")){
+                    for(var  i = 0, len = cn.length; i < len; i++) {
+                        b += E(cn[i], b);
+                    }
+                }else {
+                    b += E(cn, b);
+                }
+            }
+            if(o.html){
+                b += o.html;
+            }
+
+            b += "</" + o.tag + ">";
+        }
+        return  b;
+    };
+
+    
+    
+
+    var  F = function(o, M){
+         
+        
+        var  ns = false;
+        if (o.ns && o.ns != 'html') {
+               
+            if (o.xmlns && typeof(D[o.ns]) == 'undefined') {
+                D[o.ns] = o.xmlns;
+                ns = o.xmlns;
+            }
+            if (typeof(D[o.ns]) == 'undefined') {
+                console.log("Trying to create namespace element " + o.ns + ", however no xmlns was sent to builder previously");
+            }
+
+            ns = D[o.ns];
+        }
+        
+        
+        if (typeof(o) == 'string') {
+            return  M.appendChild(document.createTextNode(o));
+        }
+
+        o.tag = o.tag || div;
+        if (o.ns && Roo.isIE) {
+            ns = false;
+            o.tag = o.ns + ':' + o.tag;
+            
+        }
+        var  el = ns ? document.createElementNS( ns, o.tag||'div') :  document.createElement(o.tag||'div');
+        var  N = el.setAttribute ? true : false; 
+        for(var  attr  in  o){
+            
+            if(attr == "tag" || attr == "ns" ||attr == "xmlns" ||attr == "children" || attr == "cn" || attr == "html" || 
+                    attr == "style" || typeof  o[attr] == "function") continue;
+                    
+            if(attr=="cls" && Roo.isIE){
+                el.className = o["cls"];
+            }else {
+                if(N) el.setAttribute(attr=="cls" ? 'class' : attr, o[attr]);
+                else  el[attr] = o[attr];
+            }
+        }
+
+        Roo.DomHelper.applyStyles(el, o.style);
+        var  cn = o.children || o.cn;
+        if(cn){
+            
+             if((cn  instanceof  Array) || (Roo.isSafari && typeof(cn.join) == "function")){
+                for(var  i = 0, len = cn.length; i < len; i++) {
+                    F(cn[i], el);
+                }
+            }else {
+                F(cn, el);
+            }
+        }
+        if(o.html){
+            el.innerHTML = o.html;
+        }
+        if(M){
+           M.appendChild(el);
+        }
+        return  el;
+    };
+
+    var  G = function(M, s, h, e){
+        A.innerHTML = [s, h, e].join('');
+        var  i = -1, el = A;
+        while(++i < M){
+            el = el.firstChild;
+        }
+        return  el;
+    };
+
+    
+    var  ts = '<table>',
+        te = '</table>',
+        H = ts+'<tbody>',
+        I = '</tbody>'+te,
+        J = H + '<tr>',
+        K = '</tr>'+I;
+
+    
+
+    var  L = function(M, N, el, O){
+        if(!A){
+            A = document.createElement('div');
+        }
+        var  P;
+        var  Q = null;
+        if(M == 'td'){
+            if(N == 'afterbegin' || N == 'beforeend'){ 
+                return;
+            }
+            if(N == 'beforebegin'){
+                Q = el;
+                el = el.parentNode;
+            } else {
+                Q = el.nextSibling;
+                el = el.parentNode;
+            }
+
+            P = G(4, J, O, K);
+        }
+        else  if(M == 'tr'){
+            if(N == 'beforebegin'){
+                Q = el;
+                el = el.parentNode;
+                P = G(3, H, O, I);
+            } else  if(N == 'afterend'){
+                Q = el.nextSibling;
+                el = el.parentNode;
+                P = G(3, H, O, I);
+            } else { 
+                if(N == 'afterbegin'){
+                    Q = el.firstChild;
+                }
+
+                P = G(4, J, O, K);
+            }
+        } else  if(M == 'tbody'){
+            if(N == 'beforebegin'){
+                Q = el;
+                el = el.parentNode;
+                P = G(2, ts, O, te);
+            } else  if(N == 'afterend'){
+                Q = el.nextSibling;
+                el = el.parentNode;
+                P = G(2, ts, O, te);
+            } else {
+                if(N == 'afterbegin'){
+                    Q = el.firstChild;
+                }
+
+                P = G(3, H, O, I);
+            }
+        } else { 
+            if(N == 'beforebegin' || N == 'afterend'){ 
+                return;
+            }
+            if(N == 'afterbegin'){
+                Q = el.firstChild;
+            }
+
+            P = G(2, ts, O, te);
+        }
+
+        el.insertBefore(P, Q);
+        return  P;
+    };
+
+    return  {
+    
+
+    useDom : false,
+
+    
+
+    markup : function(o){
+        return  E(o);
+    },
+
+    
+
+    applyStyles : function(el, c){
+        if(c){
+           el = Roo.fly(el);
+           if(typeof  c == "string"){
+               var  re = /\s?([a-z\-]*)\:\s?([^;]*);?/gi;
+               var  matches;
+               while ((matches = re.exec(c)) != null){
+                   el.setStyle(matches[1], matches[2]);
+               }
+           }else  if (typeof  c == "object"){
+               for (var  style  in  c){
+                  el.setStyle(style, c[style]);
+               }
+           }else  if (typeof  c == "function"){
+                Roo.DomHelper.applyStyles(el, c.call());
+           }
+        }
+    },
+
+    
+
+    insertHtml : function(d, el, e){
+        d = d.toLowerCase();
+        if(el.insertAdjacentHTML){
+            if(C.test(el.tagName)){
+                var  rs;
+                if(rs = L(el.tagName.toLowerCase(), d, el, e)){
+                    return  rs;
+                }
+            }
+            switch(d){
+                case  "beforebegin":
+                    el.insertAdjacentHTML('BeforeBegin', e);
+                    return  el.previousSibling;
+                case  "afterbegin":
+                    el.insertAdjacentHTML('AfterBegin', e);
+                    return  el.firstChild;
+                case  "beforeend":
+                    el.insertAdjacentHTML('BeforeEnd', e);
+                    return  el.lastChild;
+                case  "afterend":
+                    el.insertAdjacentHTML('AfterEnd', e);
+                    return  el.nextSibling;
+            }
+            throw  'Illegal insertion point -> "' + d + '"';
+        }
+        var  f = el.ownerDocument.createRange();
+        var  g;
+        switch(d){
+             case  "beforebegin":
+                f.setStartBefore(el);
+                g = f.createContextualFragment(e);
+                el.parentNode.insertBefore(g, el);
+                return  el.previousSibling;
+             case  "afterbegin":
+                if(el.firstChild){
+                    f.setStartBefore(el.firstChild);
+                    g = f.createContextualFragment(e);
+                    el.insertBefore(g, el.firstChild);
+                    return  el.firstChild;
+                }else {
+                    el.innerHTML = e;
+                    return  el.firstChild;
+                }
+            case  "beforeend":
+                if(el.lastChild){
+                    f.setStartAfter(el.lastChild);
+                    g = f.createContextualFragment(e);
+                    el.appendChild(g);
+                    return  el.lastChild;
+                }else {
+                    el.innerHTML = e;
+                    return  el.lastChild;
+                }
+            case  "afterend":
+                f.setStartAfter(el);
+                g = f.createContextualFragment(e);
+                el.parentNode.insertBefore(g, el.nextSibling);
+                return  el.nextSibling;
+            }
+            throw  'Illegal insertion point -> "' + d + '"';
+    },
+
+    
+
+    insertBefore : function(el, o, h){
+        return  this.doInsert(el, o, h, "beforeBegin");
+    },
+
+    
+
+    insertAfter : function(el, o, j){
+        return  this.doInsert(el, o, j, "afterEnd", "nextSibling");
+    },
+
+    
+
+    insertFirst : function(el, o, k){
+        return  this.doInsert(el, o, k, "afterBegin");
+    },
+
+    
+    doInsert : function(el, o, l, m, n){
+        el = Roo.getDom(el);
+        var  p;
+        if(this.useDom || o.ns){
+            p = F(o, null);
+            el.parentNode.insertBefore(p, n ? el[n] : el);
+        }else {
+            var  e = E(o);
+            p = this.insertHtml(m, el, e);
+        }
+        return  l ? Roo.get(p, true) : p;
+    },
+
+    
+
+    append : function(el, o, q){
+        el = Roo.getDom(el);
+        var  r;
+        if(this.useDom || o.ns){
+            r = F(o, null);
+            el.appendChild(r);
+        }else {
+            var  e = E(o);
+            r = this.insertHtml("beforeEnd", el, e);
+        }
+        return  q ? Roo.get(r, true) : r;
+    },
+
+    
+
+    overwrite : function(el, o, t){
+        el = Roo.getDom(el);
+        if (o.ns) {
+          
+            while (el.childNodes.length) {
+                el.removeChild(el.firstChild);
+            }
+
+            F(o, el);
+        } else  {
+            el.innerHTML = E(o);   
+        }
+        
+        return  t ? Roo.get(el.firstChild, true) : el.firstChild;
+    },
+
+    
+
+    createTemplate : function(o){
+        var  u = E(o);
+        return  new  Roo.Template(u);
+    }
+    };
+}();
+
+
+
+
+
+Roo.Template = function(A){
+    
+    if(A  instanceof  Array){
+        A = A.join("");
+    }else  if(arguments.length > 1){
+        A = Array.prototype.join.call(arguments, "");
+    }
+    
+    
+    if (typeof(A) == 'object') {
+        Roo.apply(this,A)
+    } else  {
+        
+        this.html = A;
+    }
+    
+    
+};
+Roo.Template.prototype = {
+    
+    
+
+    html : '',
+    
+
+    applyTemplate : function(values){
+        try {
+            
+            if(this.compiled){
+                return  this.compiled(values);
+            }
+            var  useF = this.disableFormats !== true;
+            var  fm = Roo.util.Format, tpl = this;
+            var  fn = function(m, E, F, G){
+                if(F && useF){
+                    if(F.substr(0, 5) == "this."){
+                        return  tpl.call(F.substr(5), values[E], values);
+                    }else {
+                        if(G){
+                            
+                            
+                            
+                            var  re = /^\s*['"](.*)["']\s*$/;
+                            G = G.split(',');
+                            for(var  i = 0, len = G.length; i < len; i++){
+                                G[i] = G[i].replace(re, "$1");
+                            }
+
+                            G = [values[E]].concat(G);
+                        }else {
+                            G = [values[E]];
+                        }
+                        return  fm[F].apply(fm, G);
+                    }
+                }else {
+                    return  values[E] !== undefined ? values[E] : "";
+                }
+            };
+            return  this.html.replace(this.re, fn);
+        } catch (e) {
+            Roo.log(e);
+            throw  e;
+        }
+         
+    },
+    
+    
+
+    set : function(B, C){
+        this.html = B;
+        this.compiled = null;
+        if(C){
+            this.compile();
+        }
+        return  this;
+    },
+    
+    
+
+    disableFormats : false,
+    
+    
+
+    re : /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,
+    
+    
+
+    compile : function(){
+        var  fm = Roo.util.Format;
+        var  D = this.disableFormats !== true;
+        var  E = Roo.isGecko ? "+" : ",";
+        var  fn = function(m, G, H, I){
+            if(H && D){
+                I = I ? ',' + I : "";
+                if(H.substr(0, 5) != "this."){
+                    H = "fm." + H + '(';
+                }else {
+                    H = 'this.call("'+ H.substr(5) + '", ';
+                    I = ", values";
+                }
+            }else {
+                I= ''; H = "(values['" + G + "'] == undefined ? '' : ";
+            }
+            return  "'"+ E + H + "values['" + G + "']" + I + ")"+E+"'";
+        };
+        var  F;
+        
+        if(Roo.isGecko){
+            F = "this.compiled = function(values){ return '" +
+                   this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn) +
+                    "';};";
+        }else {
+            F = ["this.compiled = function(values){ return ['"];
+            F.push(this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn));
+            F.push("'].join('');};");
+            F = F.join('');
+        }
+        
+
+        eval(F);
+        return  this;
+    },
+    
+    
+    call : function(G, H, I){
+        return  this[G](H, I);
+    },
+    
+    
+
+    insertFirst: function(el, J, K){
+        return  this.doInsert('afterBegin', el, J, K);
+    },
+
+    
+
+    insertBefore: function(el, L, M){
+        return  this.doInsert('beforeBegin', el, L, M);
+    },
+
+    
+
+    insertAfter : function(el, N, O){
+        return  this.doInsert('afterEnd', el, N, O);
+    },
+    
+    
+
+    append : function(el, P, Q){
+        return  this.doInsert('beforeEnd', el, P, Q);
+    },
+
+    doInsert : function(R, el, S, T){
+        el = Roo.getDom(el);
+        var  U = Roo.DomHelper.insertHtml(R, el, this.applyTemplate(S));
+        return  T ? Roo.get(U, true) : U;
+    },
+
+    
+
+    overwrite : function(el, V, W){
+        el = Roo.getDom(el);
+        el.innerHTML = this.applyTemplate(V);
+        return  W ? Roo.get(el.firstChild, true) : el.firstChild;
+    }
+};
+
+
+Roo.Template.prototype.apply = Roo.Template.prototype.applyTemplate;
+
+
+Roo.DomHelper.Template = Roo.Template;
+
+
+
+Roo.Template.from = function(el){
+    el = Roo.getDom(el);
+    return  new  Roo.Template(el.value || el.innerHTML);
+};
+
+
+
+
+
+
+
+Roo.DomQuery = function(){
+    var  A = {}, simpleCache = {}, valueCache = {};
+    var  B = /\S/;
+    var  C = /^\s+|\s+$/g;
+    var  D = /\{(\d+)\}/g;
+    var  E = /^(\s?[\/>+~]\s?|\s|$)/;
+    var  F = /^(#)?([\w-\*]+)/;
+    var  G = /(\d*)n\+?(\d*)/, H = /\D/;
+
+    function  I(p, T){
+        var  i = 0;
+        var  n = p.firstChild;
+        while(n){
+            if(n.nodeType == 1){
+               if(++i == T){
+                   return  n;
+               }
+            }
+
+            n = n.nextSibling;
+        }
+        return  null;
+    };
+
+    function  J(n){
+        while((n = n.nextSibling) && n.nodeType != 1);
+        return  n;
+    };
+
+    function  K(n){
+        while((n = n.previousSibling) && n.nodeType != 1);
+        return  n;
+    };
+
+    function  L(d){
+        var  n = d.firstChild, ni = -1;
+           while(n){
+               var  nx = n.nextSibling;
+               if(n.nodeType == 3 && !B.test(n.nodeValue)){
+                   d.removeChild(n);
+               }else {
+                   n.nodeIndex = ++ni;
+               }
+
+               n = nx;
+           }
+           return  this;
+       };
+
+    function  byClassName(c, a, v){
+        if(!v){
+            return  c;
+        }
+        var  r = [], ri = -1, cn;
+        for(var  i = 0, ci; ci = c[i]; i++){
+            if((' '+ci.className+' ').indexOf(v) != -1){
+                r[++ri] = ci;
+            }
+        }
+        return  r;
+    };
+
+    function  attrValue(n, T){
+        if(!n.tagName && typeof  n.length != "undefined"){
+            n = n[0];
+        }
+        if(!n){
+            return  null;
+        }
+        if(T == "for"){
+            return  n.htmlFor;
+        }
+        if(T == "class" || T == "className"){
+            return  n.className;
+        }
+        return  n.getAttribute(T) || n[T];
+
+    };
+
+    function  getNodes(ns, T, U){
+        var  V = [], ri = -1, cs;
+        if(!ns){
+            return  V;
+        }
+
+        U = U || "*";
+        if(typeof  ns.getElementsByTagName != "undefined"){
+            ns = [ns];
+        }
+        if(!T){
+            for(var  i = 0, ni; ni = ns[i]; i++){
+                cs = ni.getElementsByTagName(U);
+                for(var  j = 0, ci; ci = cs[j]; j++){
+                    V[++ri] = ci;
+                }
+            }
+        }else  if(T == "/" || T == ">"){
+            var  utag = U.toUpperCase();
+            for(var  i = 0, ni, cn; ni = ns[i]; i++){
+                cn = ni.children || ni.childNodes;
+                for(var  j = 0, cj; cj = cn[j]; j++){
+                    if(cj.nodeName == utag || cj.nodeName == U  || U == '*'){
+                        V[++ri] = cj;
+                    }
+                }
+            }
+        }else  if(T == "+"){
+            var  utag = U.toUpperCase();
+            for(var  i = 0, n; n = ns[i]; i++){
+                while((n = n.nextSibling) && n.nodeType != 1);
+                if(n && (n.nodeName == utag || n.nodeName == U || U == '*')){
+                    V[++ri] = n;
+                }
+            }
+        }else  if(T == "~"){
+            for(var  i = 0, n; n = ns[i]; i++){
+                while((n = n.nextSibling) && (n.nodeType != 1 || (U == '*' || n.tagName.toLowerCase()!=U)));
+                if(n){
+                    V[++ri] = n;
+                }
+            }
+        }
+        return  V;
+    };
+
+    function  M(a, b){
+        if(b.slice){
+            return  a.concat(b);
+        }
+        for(var  i = 0, l = b.length; i < l; i++){
+            a[a.length] = b[i];
+        }
+        return  a;
+    }
+
+    function  byTag(cs, T){
+        if(cs.tagName || cs == document){
+            cs = [cs];
+        }
+        if(!T){
+            return  cs;
+        }
+        var  r = [], ri = -1;
+        T = T.toLowerCase();
+        for(var  i = 0, ci; ci = cs[i]; i++){
+            if(ci.nodeType == 1 && ci.tagName.toLowerCase()==T){
+                r[++ri] = ci;
+            }
+        }
+        return  r;
+    };
+
+    function  N(cs, T, id){
+        if(cs.tagName || cs == document){
+            cs = [cs];
+        }
+        if(!id){
+            return  cs;
+        }
+        var  r = [], ri = -1;
+        for(var  i = 0,ci; ci = cs[i]; i++){
+            if(ci && ci.id == id){
+                r[++ri] = ci;
+                return  r;
+            }
+        }
+        return  r;
+    };
+
+    function  byAttribute(cs, T, U, op, V){
+        var  r = [], ri = -1, st = V=="{";
+        var  f = Roo.DomQuery.operators[op];
+        for(var  i = 0, ci; ci = cs[i]; i++){
+            var  a;
+            if(st){
+                a = Roo.DomQuery.getStyle(ci, T);
+            }
+            else  if(T == "class" || T == "className"){
+                a = ci.className;
+            }else  if(T == "for"){
+                a = ci.htmlFor;
+            }else  if(T == "href"){
+                a = ci.getAttribute("href", 2);
+            }else {
+                a = ci.getAttribute(T);
+            }
+            if((f && f(a, U)) || (!f && a)){
+                r[++ri] = ci;
+            }
+        }
+        return  r;
+    };
+
+    function  byPseudo(cs, T, U){
+        return  Roo.DomQuery.pseudos[T](cs, U);
+    };
+
+    
+    
+    
+    var  O = window.ActiveXObject ? true : false;
+
+    
+    
+    
+    
+
+    var  batch = 30803; 
+
+    var  P = 30803;
+
+    function  Q(cs){
+        var  d = ++P;
+        cs[0].setAttribute("_nodup", d);
+        var  r = [cs[0]];
+        for(var  i = 1, len = cs.length; i < len; i++){
+            var  c = cs[i];
+            if(!c.getAttribute("_nodup") != d){
+                c.setAttribute("_nodup", d);
+                r[r.length] = c;
+            }
+        }
+        for(var  i = 0, len = cs.length; i < len; i++){
+            cs[i].removeAttribute("_nodup");
+        }
+        return  r;
+    }
+
+    function  nodup(cs){
+        if(!cs){
+            return  [];
+        }
+        var  T = cs.length, c, i, r = cs, cj, ri = -1;
+        if(!T || typeof  cs.nodeType != "undefined" || T == 1){
+            return  cs;
+        }
+        if(O && typeof  cs[0].selectSingleNode != "undefined"){
+            return  Q(cs);
+        }
+        var  d = ++P;
+        cs[0]._nodup = d;
+        for(i = 1; c = cs[i]; i++){
+            if(c._nodup != d){
+                c._nodup = d;
+            }else {
+                r = [];
+                for(var  j = 0; j < i; j++){
+                    r[++ri] = cs[j];
+                }
+                for(j = i+1; cj = cs[j]; j++){
+                    if(cj._nodup != d){
+                        cj._nodup = d;
+                        r[++ri] = cj;
+                    }
+                }
+                return  r;
+            }
+        }
+        return  r;
+    }
+
+    function  R(c1, c2){
+        var  d = ++P;
+        for(var  i = 0, len = c1.length; i < len; i++){
+            c1[i].setAttribute("_qdiff", d);
+        }
+        var  r = [];
+        for(var  i = 0, len = c2.length; i < len; i++){
+            if(c2[i].getAttribute("_qdiff") != d){
+                r[r.length] = c2[i];
+            }
+        }
+        for(var  i = 0, len = c1.length; i < len; i++){
+           c1[i].removeAttribute("_qdiff");
+        }
+        return  r;
+    }
+
+    function  S(c1, c2){
+        var  T = c1.length;
+        if(!T){
+            return  c2;
+        }
+        if(O && c1[0].selectSingleNode){
+            return  R(c1, c2);
+        }
+        var  d = ++P;
+        for(var  i = 0; i < T; i++){
+            c1[i]._qdiff = d;
+        }
+        var  r = [];
+        for(var  i = 0, len = c2.length; i < len; i++){
+            if(c2[i]._qdiff != d){
+                r[r.length] = c2[i];
+            }
+        }
+        return  r;
+    }
+
+    function  quickId(ns, T, U, id){
+        if(ns == U){
+           var  d = U.ownerDocument || U;
+           return  d.getElementById(id);
+        }
+
+        ns = getNodes(ns, T, "*");
+        return  N(ns, null, id);
+    }
+
+    return  {
+        getStyle : function(el, AA){
+            return  Roo.fly(el).getStyle(AA);
+        },
+        
+
+        compile : function(AB, AC){
+            AC = AC || "select";
+            
+            var  fn = ["var f = function(root){\n var mode; ++batch; var n = root || document;\n"];
+            var  q = AB, mode, lq;
+            var  tk = Roo.DomQuery.matchers;
+            var  AD = tk.length;
+            var  mm;
+
+            
+            var  AE = q.match(E);
+            if(AE && AE[1]){
+                fn[fn.length] = 'mode="'+AE[1].replace(C, "")+'";';
+                q = q.replace(AE[1], "");
+            }
+            
+            while(AB.substr(0, 1)=="/"){
+                AB = AB.substr(1);
+            }
+
+            while(q && lq != q){
+                lq = q;
+                var  tm = q.match(F);
+                if(AC == "select"){
+                    if(tm){
+                        if(tm[1] == "#"){
+                            fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");';
+                        }else {
+                            fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");';
+                        }
+
+                        q = q.replace(tm[0], "");
+                    }else  if(q.substr(0, 1) != '@'){
+                        fn[fn.length] = 'n = getNodes(n, mode, "*");';
+                    }
+                }else {
+                    if(tm){
+                        if(tm[1] == "#"){
+                            fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");';
+                        }else {
+                            fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");';
+                        }
+
+                        q = q.replace(tm[0], "");
+                    }
+                }
+                while(!(mm = q.match(E))){
+                    var  matched = false;
+                    for(var  j = 0; j < AD; j++){
+                        var  t = tk[j];
+                        var  m = q.match(t.re);
+                        if(m){
+                            fn[fn.length] = t.select.replace(D, function(x, i){
+                                                    return  m[i];
+                                                });
+                            q = q.replace(m[0], "");
+                            matched = true;
+                            break;
+                        }
+                    }
+                    
+                    if(!matched){
+                        throw  'Error parsing selector, parsing failed at "' + q + '"';
+                    }
+                }
+                if(mm[1]){
+                    fn[fn.length] = 'mode="'+mm[1].replace(C, "")+'";';
+                    q = q.replace(mm[1], "");
+                }
+            }
+
+            fn[fn.length] = "return nodup(n);\n}";
+            
+             
+            eval(fn.join(""));
+            return  f;
+        },
+
+        
+
+        select : function(AF, AG, AH){
+            if(!AG || AG == document){
+                AG = document;
+            }
+            if(typeof  AG == "string"){
+                AG = document.getElementById(AG);
+            }
+            var  AI = AF.split(",");
+            var  AJ = [];
+            for(var  i = 0, len = AI.length; i < len; i++){
+                var  p = AI[i].replace(C, "");
+                if(!A[p]){
+                    A[p] = Roo.DomQuery.compile(p);
+                    if(!A[p]){
+                        throw  p + " is not a valid selector";
+                    }
+                }
+                var  z = A[p](AG);
+                if(z && z != document){
+                    AJ = AJ.concat(z);
+                }
+            }
+            if(AI.length > 1){
+                return  nodup(AJ);
+            }
+            return  AJ;
+        },
+
+        
+
+        selectNode : function(AK, AL){
+            return  Roo.DomQuery.select(AK, AL)[0];
+        },
+
+        
+
+        selectValue : function(AM, AN, AO){
+            AM = AM.replace(C, "");
+            if(!valueCache[AM]){
+                valueCache[AM] = Roo.DomQuery.compile(AM, "select");
+            }
+            var  n = valueCache[AM](AN);
+            n = n[0] ? n[0] : n;
+            var  v = (n && n.firstChild ? n.firstChild.nodeValue : null);
+            return  ((v === null||v === undefined||v==='') ? AO : v);
+        },
+
+        
+
+        selectNumber : function(AP, AQ, AR){
+            var  v = Roo.DomQuery.selectValue(AP, AQ, AR || 0);
+            return  parseFloat(v);
+        },
+
+        
+
+        is : function(el, ss){
+            if(typeof  el == "string"){
+                el = document.getElementById(el);
+            }
+            var  AS = (el  instanceof  Array);
+            var  AT = Roo.DomQuery.filter(AS ? el : [el], ss);
+            return  AS ? (AT.length == el.length) : (AT.length > 0);
+        },
+
+        
+
+        filter : function(AU, ss, AV){
+            ss = ss.replace(C, "");
+            if(!simpleCache[ss]){
+                simpleCache[ss] = Roo.DomQuery.compile(ss, "simple");
+            }
+            var  AW = simpleCache[ss](AU);
+            return  AV ? S(AW, AU) : AW;
+        },
+
+        
+
+        matchers : [{
+                re: /^\.([\w-]+)/,
+                select: 'n = byClassName(n, null, " {1} ");'
+            }, {
+                re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,
+                select: 'n = byPseudo(n, "{1}", "{2}");'
+            },{
+                re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,
+                select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");'
+            }, {
+                re: /^#([\w-]+)/,
+                select: 'n = byId(n, null, "{1}");'
+            },{
+                re: /^@([\w-]+)/,
+                select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'
+            }
+        ],
+
+        
+
+        operators : {
+            "=" : function(a, v){
+                return  a == v;
+            },
+            "!=" : function(a, v){
+                return  a != v;
+            },
+            "^=" : function(a, v){
+                return  a && a.substr(0, v.length) == v;
+            },
+            "$=" : function(a, v){
+                return  a && a.substr(a.length-v.length) == v;
+            },
+            "*=" : function(a, v){
+                return  a && a.indexOf(v) !== -1;
+            },
+            "%=" : function(a, v){
+                return  (a % v) == 0;
+            },
+            "|=" : function(a, v){
+                return  a && (a == v || a.substr(0, v.length+1) == v+'-');
+            },
+            "~=" : function(a, v){
+                return  a && (' '+a+' ').indexOf(' '+v+' ') != -1;
+            }
+        },
+
+        
+
+        pseudos : {
+            "first-child" : function(c){
+                var  r = [], ri = -1, n;
+                for(var  i = 0, ci; ci = n = c[i]; i++){
+                    while((n = n.previousSibling) && n.nodeType != 1);
+                    if(!n){
+                        r[++ri] = ci;
+                    }
+                }
+                return  r;
+            },
+
+            "last-child" : function(c){
+                var  r = [], ri = -1, n;
+                for(var  i = 0, ci; ci = n = c[i]; i++){
+                    while((n = n.nextSibling) && n.nodeType != 1);
+                    if(!n){
+                        r[++ri] = ci;
+                    }
+                }
+                return  r;
+            },
+
+            "nth-child" : function(c, a) {
+                var  r = [], ri = -1;
+                var  m = G.exec(a == "even" && "2n" || a == "odd" && "2n+1" || !H.test(a) && "n+" + a || a);
+                var  f = (m[1] || 1) - 0, l = m[2] - 0;
+                for(var  i = 0, n; n = c[i]; i++){
+                    var  pn = n.parentNode;
+                    if (batch != pn._batch) {
+                        var  j = 0;
+                        for(var  cn = pn.firstChild; cn; cn = cn.nextSibling){
+                            if(cn.nodeType == 1){
+                               cn.nodeIndex = ++j;
+                            }
+                        }
+
+                        pn._batch = batch;
+                    }
+                    if (f == 1) {
+                        if (l == 0 || n.nodeIndex == l){
+                            r[++ri] = n;
+                        }
+                    } else  if ((n.nodeIndex + l) % f == 0){
+                        r[++ri] = n;
+                    }
+                }
+
+                return  r;
+            },
+
+            "only-child" : function(c){
+                var  r = [], ri = -1;;
+                for(var  i = 0, ci; ci = c[i]; i++){
+                    if(!K(ci) && !J(ci)){
+                        r[++ri] = ci;
+                    }
+                }
+                return  r;
+            },
+
+            "empty" : function(c){
+                var  r = [], ri = -1;
+                for(var  i = 0, ci; ci = c[i]; i++){
+                    var  cns = ci.childNodes, j = 0, cn, empty = true;
+                    while(cn = cns[j]){
+                        ++j;
+                        if(cn.nodeType == 1 || cn.nodeType == 3){
+                            empty = false;
+                            break;
+                        }
+                    }
+                    if(empty){
+                        r[++ri] = ci;
+                    }
+                }
+                return  r;
+            },
+
+            "contains" : function(c, v){
+                var  r = [], ri = -1;
+                for(var  i = 0, ci; ci = c[i]; i++){
+                    if((ci.textContent||ci.innerText||'').indexOf(v) != -1){
+                        r[++ri] = ci;
+                    }
+                }
+                return  r;
+            },
+
+            "nodeValue" : function(c, v){
+                var  r = [], ri = -1;
+                for(var  i = 0, ci; ci = c[i]; i++){
+                    if(ci.firstChild && ci.firstChild.nodeValue == v){
+                        r[++ri] = ci;
+                    }
+                }
+                return  r;
+            },
+
+            "checked" : function(c){
+                var  r = [], ri = -1;
+                for(var  i = 0, ci; ci = c[i]; i++){
+                    if(ci.checked == true){
+                        r[++ri] = ci;
+                    }
+                }
+                return  r;
+            },
+
+            "not" : function(c, ss){
+                return  Roo.DomQuery.filter(c, ss, true);
+            },
+
+            "odd" : function(c){
+                return  this["nth-child"](c, "odd");
+            },
+
+            "even" : function(c){
+                return  this["nth-child"](c, "even");
+            },
+
+            "nth" : function(c, a){
+                return  c[a-1] || [];
+            },
+
+            "first" : function(c){
+                return  c[0] || [];
+            },
+
+            "last" : function(c){
+                return  c[c.length-1] || [];
+            },
+
+            "has" : function(c, ss){
+                var  s = Roo.DomQuery.select;
+                var  r = [], ri = -1;
+                for(var  i = 0, ci; ci = c[i]; i++){
+                    if(s(ss, ci).length > 0){
+                        r[++ri] = ci;
+                    }
+                }
+                return  r;
+            },
+
+            "next" : function(c, ss){
+                var  is = Roo.DomQuery.is;
+                var  r = [], ri = -1;
+                for(var  i = 0, ci; ci = c[i]; i++){
+                    var  n = J(ci);
+                    if(n && is(n, ss)){
+                        r[++ri] = ci;
+                    }
+                }
+                return  r;
+            },
+
+            "prev" : function(c, ss){
+                var  is = Roo.DomQuery.is;
+                var  r = [], ri = -1;
+                for(var  i = 0, ci; ci = c[i]; i++){
+                    var  n = K(ci);
+                    if(n && is(n, ss)){
+                        r[++ri] = ci;
+                    }
+                }
+                return  r;
+            }
+        }
+    };
+}();
+
+
+
+Roo.query = Roo.DomQuery.select;
+
+
+
+
+
+
+
+Roo.util.Observable = function(A){
+    
+    A = A|| {};
+    this.addEvents(A.events || {});
+    if (A.events) {
+        delete  A.events; 
+    }
+
+     
+    Roo.apply(this, A);
+    
+    if(this.listeners){
+        this.on(this.listeners);
+        delete  this.listeners;
+    }
+};
+Roo.util.Observable.prototype = {
+    
+
+    
+    
+    
+
+    fireEvent : function(){
+        var  ce = this.events[arguments[0].toLowerCase()];
+        if(typeof  ce == "object"){
+            return  ce.fire.apply(ce, Array.prototype.slice.call(arguments, 1));
+        }else {
+            return  true;
+        }
+    },
+
+    
+    filterOptRe : /^(?:scope|delay|buffer|single)$/,
+
+    
+
+    addListener : function(B, fn, C, o){
+        if(typeof  B == "object"){
+            o = B;
+            for(var  e  in  o){
+                if(this.filterOptRe.test(e)){
+                    continue;
+                }
+                if(typeof  o[e] == "function"){
+                    
+                    this.addListener(e, o[e], o.scope,  o);
+                }else {
+                    
+                    this.addListener(e, o[e].fn, o[e].scope, o[e]);
+                }
+            }
+            return;
+        }
+
+        o = (!o || typeof  o == "boolean") ? {} : o;
+        B = B.toLowerCase();
+        var  ce = this.events[B] || true;
+        if(typeof  ce == "boolean"){
+            ce = new  Roo.util.Event(this, B);
+            this.events[B] = ce;
+        }
+
+        ce.addListener(fn, C, o);
+    },
+
+    
+
+    removeListener : function(D, fn, E){
+        var  ce = this.events[D.toLowerCase()];
+        if(typeof  ce == "object"){
+            ce.removeListener(fn, E);
+        }
+    },
+
+    
+
+    purgeListeners : function(){
+        for(var  evt  in  this.events){
+            if(typeof  this.events[evt] == "object"){
+                 this.events[evt].clearListeners();
+            }
+        }
+    },
+
+    relayEvents : function(o, F){
+        var  G = function(H){
+            return  function(){
+                return  this.fireEvent.apply(this, Roo.combine(H, Array.prototype.slice.call(arguments, 0)));
+            };
+        };
+        for(var  i = 0, len = F.length; i < len; i++){
+            var  ename = F[i];
+            if(!this.events[ename]){ this.events[ename] = true; };
+            o.on(ename, G(ename), this);
+        }
+    },
+
+    
+
+    addEvents : function(o){
+        if(!this.events){
+            this.events = {};
+        }
+
+        Roo.applyIf(this.events, o);
+    },
+
+    
+
+    hasListener : function(H){
+        var  e = this.events[H];
+        return  typeof  e == "object" && e.listeners.length > 0;
+    }
+};
+
+
+Roo.util.Observable.prototype.on = Roo.util.Observable.prototype.addListener;
+
+
+Roo.util.Observable.prototype.un = Roo.util.Observable.prototype.removeListener;
+
+
+
+Roo.util.Observable.capture = function(o, fn, I){
+    o.fireEvent = o.fireEvent.createInterceptor(fn, I);
+};
+
+
+
+Roo.util.Observable.releaseCapture = function(o){
+    o.fireEvent = Roo.util.Observable.prototype.fireEvent;
+};
+
+(function(){
+
+    var  J = function(h, o, M){
+        var  N = new  Roo.util.DelayedTask();
+        return  function(){
+            N.delay(o.buffer, h, M, Array.prototype.slice.call(arguments, 0));
+        };
+    };
+
+    var  K = function(h, e, fn, M){
+        return  function(){
+            e.removeListener(fn, M);
+            return  h.apply(M, arguments);
+        };
+    };
+
+    var  L = function(h, o, M){
+        return  function(){
+            var  N = Array.prototype.slice.call(arguments, 0);
+            setTimeout(function(){
+                h.apply(M, N);
+            }, o.delay || 10);
+        };
+    };
+
+    Roo.util.Event = function(M, N){
+        this.name = N;
+        this.obj = M;
+        this.listeners = [];
+    };
+
+    Roo.util.Event.prototype = {
+        addListener : function(fn, M, N){
+            var  o = N || {};
+            M = M || this.obj;
+            if(!this.isListening(fn, M)){
+                var  l = {fn: fn, scope: M, options: o};
+                var  h = fn;
+                if(o.delay){
+                    h = L(h, o, M);
+                }
+                if(o.single){
+                    h = K(h, this, fn, M);
+                }
+                if(o.buffer){
+                    h = J(h, o, M);
+                }
+
+                l.fireFn = h;
+                if(!this.firing){ 
+                    this.listeners.push(l);
+                }else {
+                    this.listeners = this.listeners.slice(0);
+                    this.listeners.push(l);
+                }
+            }
+        },
+
+        findListener : function(fn, O){
+            O = O || this.obj;
+            var  ls = this.listeners;
+            for(var  i = 0, len = ls.length; i < len; i++){
+                var  l = ls[i];
+                if(l.fn == fn && l.scope == O){
+                    return  i;
+                }
+            }
+            return  -1;
+        },
+
+        isListening : function(fn, P){
+            return  this.findListener(fn, P) != -1;
+        },
+
+        removeListener : function(fn, Q){
+            var  R;
+            if((R = this.findListener(fn, Q)) != -1){
+                if(!this.firing){
+                    this.listeners.splice(R, 1);
+                }else {
+                    this.listeners = this.listeners.slice(0);
+                    this.listeners.splice(R, 1);
+                }
+                return  true;
+            }
+            return  false;
+        },
+
+        clearListeners : function(){
+            this.listeners = [];
+        },
+
+        fire : function(){
+            var  ls = this.listeners, S, T = ls.length;
+            if(T > 0){
+                this.firing = true;
+                var  args = Array.prototype.slice.call(arguments, 0);
+                for(var  i = 0; i < T; i++){
+                    var  l = ls[i];
+                    if(l.fireFn.apply(l.scope||this.obj||window, arguments) === false){
+                        this.firing = false;
+                        return  false;
+                    }
+                }
+
+                this.firing = false;
+            }
+            return  true;
+        }
+    };
+})();
+
+
+
+
+
+Roo.EventManager = function(){
+    var  A, B, C = false;
+    var  F, G, H, I;
+    var  E = Roo.lib.Event;
+    var  D = Roo.lib.Dom;
+
+
+    var  J = function(){
+        if(!C){
+            C = true;
+            Roo.isReady = true;
+            if(B){
+                clearInterval(B);
+            }
+            if(Roo.isGecko || Roo.isOpera) {
+                document.removeEventListener("DOMContentLoaded", J, false);
+            }
+            if(Roo.isIE){
+                var  defer = document.getElementById("ie-deferred-loader");
+                if(defer){
+                    defer.onreadystatechange = null;
+                    defer.parentNode.removeChild(defer);
+                }
+            }
+            if(A){
+                A.fire();
+                A.clearListeners();
+            }
+        }
+    };
+    
+    var  K = function(){
+        A = new  Roo.util.Event();
+        if(Roo.isGecko || Roo.isOpera) {
+            document.addEventListener("DOMContentLoaded", J, false);
+        }else  if(Roo.isIE){
+            document.write("<s"+'cript id="ie-deferred-loader" defer="defer" src="/'+'/:"></s'+"cript>");
+            var  defer = document.getElementById("ie-deferred-loader");
+            defer.onreadystatechange = function(){
+                if(this.readyState == "complete"){
+                    J();
+                }
+            };
+        }else  if(Roo.isSafari){ 
+            B = setInterval(function(){
+                var  rs = document.readyState;
+                if(rs == "complete") {
+                    J();     
+                 }
+            }, 10);
+        }
+
+        
+        E.on(window, "load", J);
+    };
+
+    var  L = function(h, o){
+        var  S = new  Roo.util.DelayedTask(h);
+        return  function(e){
+            
+            e = new  Roo.EventObjectImpl(e);
+            S.delay(o.buffer, h, null, [e]);
+        };
+    };
+
+    var  M = function(h, el, S, fn){
+        return  function(e){
+            Roo.EventManager.removeListener(el, S, fn);
+            h(e);
+        };
+    };
+
+    var  N = function(h, o){
+        return  function(e){
+            
+            e = new  Roo.EventObjectImpl(e);
+            setTimeout(function(){
+                h(e);
+            }, o.delay || 10);
+        };
+    };
+
+    var  O = function(S, T, U, fn, V){
+        var  o = (!U || typeof  U == "boolean") ? {} : U;
+        fn = fn || o.fn; V = V || o.scope;
+        var  el = Roo.getDom(S);
+        if(!el){
+            throw  "Error listening for \"" + T + '\". Element "' + S + '" doesn\'t exist.';
+        }
+        var  h = function(e){
+            e = Roo.EventObject.setEvent(e);
+            var  t;
+            if(o.delegate){
+                t = e.getTarget(o.delegate, el);
+                if(!t){
+                    return;
+                }
+            }else {
+                t = e.target;
+            }
+            if(o.stopEvent === true){
+                e.stopEvent();
+            }
+            if(o.preventDefault === true){
+               e.preventDefault();
+            }
+            if(o.stopPropagation === true){
+                e.stopPropagation();
+            }
+
+            if(o.normalized === false){
+                e = e.browserEvent;
+            }
+
+
+            fn.call(V || el, e, t, o);
+        };
+        if(o.delay){
+            h = N(h, o);
+        }
+        if(o.single){
+            h = M(h, el, T, fn);
+        }
+        if(o.buffer){
+            h = L(h, o);
+        }
+
+        fn._handlers = fn._handlers || [];
+        fn._handlers.push([Roo.id(el), T, h]);
+
+        E.on(el, T, h);
+        if(T == "mousewheel" && el.addEventListener){ 
+            el.addEventListener("DOMMouseScroll", h, false);
+            E.on(window, 'unload', function(){
+                el.removeEventListener("DOMMouseScroll", h, false);
+            });
+        }
+        if(T == "mousedown" && el == document){ 
+            Roo.EventManager.stoppedMouseDownEvent.addListener(h);
+        }
+        return  h;
+    };
+
+    var  P = function(el, S, fn){
+        var  id = Roo.id(el), T = fn._handlers, hd = fn;
+        if(T){
+            for(var  i = 0, len = T.length; i < len; i++){
+                var  h = T[i];
+                if(h[0] == id && h[1] == S){
+                    hd = h[2];
+                    T.splice(i, 1);
+                    break;
+                }
+            }
+        }
+
+        E.un(el, S, hd);
+        el = Roo.getDom(el);
+        if(S == "mousewheel" && el.addEventListener){
+            el.removeEventListener("DOMMouseScroll", hd, false);
+        }
+        if(S == "mousedown" && el == document){ 
+            Roo.EventManager.stoppedMouseDownEvent.removeListener(hd);
+        }
+    };
+
+    var  Q = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;
+    
+    var  R = {
+        
+        
+        
+
+        
+        
+        
+
+        wrap : function(fn, S, T){
+            return  function(e){
+                Roo.EventObject.setEvent(e);
+                fn.call(T ? S || window : window, Roo.EventObject, S);
+            };
+        },
+        
+        
+
+        addListener : function(U, V, fn, W, X){
+            if(typeof  V == "object"){
+                var  o = V;
+                for(var  e  in  o){
+                    if(Q.test(e)){
+                        continue;
+                    }
+                    if(typeof  o[e] == "function"){
+                        
+                        O(U, e, o, o[e], o.scope);
+                    }else {
+                        
+                        O(U, e, o[e]);
+                    }
+                }
+                return;
+            }
+            return  O(U, V, X, fn, W);
+        },
+        
+        
+
+        removeListener : function(Y, Z, fn){
+            return  P(Y, Z, fn);
+        },
+        
+        
+
+        onDocumentReady : function(fn, a, b){
+            if(C){ 
+                A.addListener(fn, a, b);
+                A.fire();
+                A.clearListeners();
+                return;
+            }
+            if(!A){
+                K();
+            }
+
+            A.addListener(fn, a, b);
+        },
+        
+        
+
+        onWindowResize : function(fn, c, d){
+            if(!F){
+                F = new  Roo.util.Event();
+                G = new  Roo.util.DelayedTask(function(){
+                    F.fire(D.getViewWidth(), D.getViewHeight());
+                });
+                E.on(window, "resize", function(){
+                    if(Roo.isIE){
+                        G.delay(50);
+                    }else {
+                        F.fire(D.getViewWidth(), D.getViewHeight());
+                    }
+                });
+            }
+
+            F.addListener(fn, c, d);
+        },
+
+        
+
+        onTextResize : function(fn, f, g){
+            if(!H){
+                H = new  Roo.util.Event();
+                var  textEl = new  Roo.Element(document.createElement('div'));
+                textEl.dom.className = 'x-text-resize';
+                textEl.dom.innerHTML = 'X';
+                textEl.appendTo(document.body);
+                I = textEl.dom.offsetHeight;
+                setInterval(function(){
+                    if(textEl.dom.offsetHeight != I){
+                        H.fire(I, I = textEl.dom.offsetHeight);
+                    }
+                }, this.textResizeInterval);
+            }
+
+            H.addListener(fn, f, g);
+        },
+
+        
+
+        removeResizeListener : function(fn, j){
+            if(F){
+                F.removeListener(fn, j);
+            }
+        },
+
+        
+        fireResize : function(){
+            if(F){
+                F.fire(D.getViewWidth(), D.getViewHeight());
+            }   
+        },
+        
+
+        ieDeferSrc : false,
+        
+
+        textResizeInterval : 50
+    };
+    
+    
+
+    
+     
+
+    R.on = R.addListener;
+    R.un = R.removeListener;
+
+    R.stoppedMouseDownEvent = new  Roo.util.Event();
+    return  R;
+}();
+
+
+Roo.onReady = Roo.EventManager.onDocumentReady;
+
+Roo.onReady(function(){
+    var  bd = Roo.get(document.body);
+    if(!bd){ return; }
+
+    var  S = [
+            Roo.isIE ? "roo-ie"
+            : Roo.isGecko ? "roo-gecko"
+            : Roo.isOpera ? "roo-opera"
+            : Roo.isSafari ? "roo-safari" : ""];
+
+    if(Roo.isMac){
+        S.push("roo-mac");
+    }
+    if(Roo.isLinux){
+        S.push("roo-linux");
+    }
+    if(Roo.isBorderBox){
+        S.push('roo-border-box');
+    }
+    if(Roo.isStrict){ 
+        var  p = bd.dom.parentNode;
+        if(p){
+            p.className += ' roo-strict';
+        }
+    }
+
+    bd.addClass(S.join(' '));
+});
+
+
+
+Roo.EventObject = function(){
+    
+    var  E = Roo.lib.Event;
+    
+    
+    var  T = {
+        63234 : 37, 
+        63235 : 39, 
+        63232 : 38, 
+        63233 : 40, 
+        63276 : 33, 
+        63277 : 34, 
+        63272 : 46, 
+        63273 : 36, 
+        63275 : 35  
+    };
+
+    
+    var  U = Roo.isIE ? {1:0,4:1,2:2} :
+                (Roo.isSafari ? {1:0,2:1,3:2} : {0:0,1:1,2:2});
+
+    Roo.EventObjectImpl = function(e){
+        if(e){
+            this.setEvent(e.browserEvent || e);
+        }
+    };
+    Roo.EventObjectImpl.prototype = {
+        
+
+            
+
+        
+        
+        
+
+        browserEvent : null,
+        
+
+        button : -1,
+        
+
+        shiftKey : false,
+        
+
+        ctrlKey : false,
+        
+
+        altKey : false,
+
+        
+
+        BACKSPACE : 8,
+        
+
+        TAB : 9,
+        
+
+        RETURN  : 13,
+        
+
+        ENTER : 13,
+        
+
+        SHIFT : 16,
+        
+
+        CONTROL : 17,
+        
+
+        ESC : 27,
+        
+
+        SPACE : 32,
+        
+
+        PAGEUP : 33,
+        
+
+        PAGEDOWN : 34,
+        
+
+        END : 35,
+        
+
+        HOME : 36,
+        
+
+        LEFT : 37,
+        
+
+        UP : 38,
+        
+
+        RIGHT : 39,
+        
+
+        DOWN : 40,
+        
+
+        DELETE  : 46,
+        
+
+        F5 : 116,
+
+           
+
+        setEvent : function(e){
+            if(e == this || (e && e.browserEvent)){ 
+                return  e;
+            }
+
+            this.browserEvent = e;
+            if(e){
+                
+                this.button = e.button ? U[e.button] : (e.which ? e.which-1 : -1);
+                if(e.type == 'click' && this.button == -1){
+                    this.button = 0;
+                }
+
+                this.type = e.type;
+                this.shiftKey = e.shiftKey;
+                
+                this.ctrlKey = e.ctrlKey || e.metaKey;
+                this.altKey = e.altKey;
+                
+                this.keyCode = e.keyCode;
+                
+                this.charCode = (e.type == 'keyup' || e.type == 'keydown') ? 0 : e.charCode;
+                
+                this.target = E.getTarget(e);
+                
+                this.xy = E.getXY(e);
+            }else {
+                this.button = -1;
+                this.shiftKey = false;
+                this.ctrlKey = false;
+                this.altKey = false;
+                this.keyCode = 0;
+                this.charCode =0;
+                this.target = null;
+                this.xy = [0, 0];
+            }
+            return  this;
+        },
+
+        
+
+        stopEvent : function(){
+            if(this.browserEvent){
+                if(this.browserEvent.type == 'mousedown'){
+                    Roo.EventManager.stoppedMouseDownEvent.fire(this);
+                }
+
+                E.stopEvent(this.browserEvent);
+            }
+        },
+
+        
+
+        preventDefault : function(){
+            if(this.browserEvent){
+                E.preventDefault(this.browserEvent);
+            }
+        },
+
+        
+
+        isNavKeyPress : function(){
+            var  k = this.keyCode;
+            k = Roo.isSafari ? (T[k] || k) : k;
+            return  (k >= 33 && k <= 40) || k == this.RETURN  || k == this.TAB || k == this.ESC;
+        },
+
+        isSpecialKey : function(){
+            var  k = this.keyCode;
+            return  (this.type == 'keypress' && this.ctrlKey) || k == 9 || k == 13  || k == 40 || k == 27 ||
+            (k == 16) || (k == 17) ||
+            (k >= 18 && k <= 20) ||
+            (k >= 33 && k <= 35) ||
+            (k >= 36 && k <= 39) ||
+            (k >= 44 && k <= 45);
+        },
+        
+
+        stopPropagation : function(){
+            if(this.browserEvent){
+                if(this.type == 'mousedown'){
+                    Roo.EventManager.stoppedMouseDownEvent.fire(this);
+                }
+
+                E.stopPropagation(this.browserEvent);
+            }
+        },
+
+        
+
+        getCharCode : function(){
+            return  this.charCode || this.keyCode;
+        },
+
+        
+
+        getKey : function(){
+            var  k = this.keyCode || this.charCode;
+            return  Roo.isSafari ? (T[k] || k) : k;
+        },
+
+        
+
+        getPageX : function(){
+            return  this.xy[0];
+        },
+
+        
+
+        getPageY : function(){
+            return  this.xy[1];
+        },
+
+        
+
+        getTime : function(){
+            if(this.browserEvent){
+                return  E.getTime(this.browserEvent);
+            }
+            return  null;
+        },
+
+        
+
+        getXY : function(){
+            return  this.xy;
+        },
+
+        
+
+        getTarget : function(V, W, X){
+            return  V ? Roo.fly(this.target).findParent(V, W, X) : this.target;
+        },
+        
+
+        getRelatedTarget : function(){
+            if(this.browserEvent){
+                return  E.getRelatedTarget(this.browserEvent);
+            }
+            return  null;
+        },
+
+        
+
+        getWheelDelta : function(){
+            var  e = this.browserEvent;
+            var  Y = 0;
+            if(e.wheelDelta){ 
+
+                Y = e.wheelDelta/120;
+            }else  if(e.detail){ 
+
+                Y = -e.detail/3;
+            }
+            return  Y;
+        },
+
+        
+
+        hasModifier : function(){
+            return  !!((this.ctrlKey || this.altKey) || this.shiftKey);
+        },
+
+        
+
+        within : function(el, Z){
+            var  t = this[Z ? "getRelatedTarget" : "getTarget"]();
+            return  t && Roo.fly(el).contains(t);
+        },
+
+        getPoint : function(){
+            return  new  Roo.lib.Point(this.xy[0], this.xy[1]);
+        }
+    };
+
+    return  new  Roo.EventObjectImpl();
+}();
+            
+    
+
+
+
+
+(function(){
+    var  D = Roo.lib.Dom;
+    var  E = Roo.lib.Event;
+    var  A = Roo.lib.Anim;
+
+    
+    var  B = {};
+    var  C = /(-[a-z])/gi;
+    var  F = function(m, a){ return  a.charAt(1).toUpperCase(); };
+    var  G = document.defaultView;
+
+
+
+    Roo.Element = function(J, K){
+        var  L = typeof  J == "string" ?
+                document.getElementById(J) : J;
+        if(!L){ 
+            return  null;
+        }
+        var  id = L.id;
+        if(K !== true && id && Roo.Element.cache[id]){ 
+            return  Roo.Element.cache[id];
+        }
+
+
+        
+
+        this.dom = L;
+
+        
+
+        this.id = id || Roo.id(L);
+    };
+
+    var  El = Roo.Element;
+
+    El.prototype = {
+        
+
+        originalDisplay : "",
+
+        visibilityMode : 1,
+        
+
+        defaultUnit : "px",
+        
+
+        setVisibilityMode : function(J){
+            this.visibilityMode = J;
+            return  this;
+        },
+        
+
+        enableDisplayMode : function(K){
+            this.setVisibilityMode(El.DISPLAY);
+            if(typeof  K != "undefined") this.originalDisplay = K;
+            return  this;
+        },
+
+        
+
+        findParent : function(L, M, N){
+            var  p = this.dom, b = document.body, O = 0, dq = Roo.DomQuery, P;
+            M = M || 50;
+            if(typeof  M != "number"){
+                P = Roo.getDom(M);
+                M = 10;
+            }
+            while(p && p.nodeType == 1 && O < M && p != b && p != P){
+                if(dq.is(p, L)){
+                    return  N ? Roo.get(p) : p;
+                }
+
+                O++;
+                p = p.parentNode;
+            }
+            return  null;
+        },
+
+
+        
+
+        findParentNode : function(Q, R, S){
+            var  p = Roo.fly(this.dom.parentNode, '_internal');
+            return  p ? p.findParent(Q, R, S) : null;
+        },
+
+        
+
+        up : function(T, U){
+            return  this.findParentNode(T, U, true);
+        },
+
+
+
+        
+
+        is : function(V){
+            return  Roo.DomQuery.is(this.dom, V);
+        },
+
+        
+
+        animate : function(W, X, Y, Z, c){
+            this.anim(W, {duration: X, callback: Y, easing: Z}, c);
+            return  this;
+        },
+
+        
+
+        anim : function(e, g, h, j, k, cb){
+            h = h || 'run';
+            g = g || {};
+            var  l = Roo.lib.Anim[h](
+                this.dom, e,
+                (g.duration || j) || .35,
+                (g.easing || k) || 'easeOut',
+                function(){
+                    Roo.callback(cb, this);
+                    Roo.callback(g.callback, g.scope || this, [this, g]);
+                },
+                this
+            );
+            g.anim = l;
+            return  l;
+        },
+
+        
+        preanim : function(a, i){
+            return  !a[i] ? false : (typeof  a[i] == "object" ? a[i]: {duration: a[i+1], callback: a[i+2], easing: a[i+3]});
+        },
+
+        
+
+        clean : function(o){
+            if(this.isCleaned && o !== true){
+                return  this;
+            }
+            var  ns = /\S/;
+            var  d = this.dom, n = d.firstChild, ni = -1;
+            while(n){
+                var  nx = n.nextSibling;
+                if(n.nodeType == 3 && !ns.test(n.nodeValue)){
+                    d.removeChild(n);
+                }else {
+                    n.nodeIndex = ++ni;
+                }
+
+                n = nx;
+            }
+
+            this.isCleaned = true;
+            return  this;
+        },
+
+        
+        calcOffsetsTo : function(el){
+            el = Roo.get(el);
+            var  d = el.dom;
+            var  q = false;
+            if(el.getStyle('position') == 'static'){
+                el.position('relative');
+                q = true;
+            }
+            var  x = 0, y =0;
+            var  op = this.dom;
+            while(op && op != d && op.tagName != 'HTML'){
+                x+= op.offsetLeft;
+                y+= op.offsetTop;
+                op = op.offsetParent;
+            }
+            if(q){
+                el.position('static');
+            }
+            return  [x, y];
+        },
+
+        
+
+        scrollIntoView : function(u, v){
+            var  c = Roo.getDom(u) || document.body;
+            var  el = this.dom;
+
+            var  o = this.calcOffsetsTo(c),
+                l = o[0],
+                t = o[1],
+                b = t+el.offsetHeight,
+                r = l+el.offsetWidth;
+
+            var  ch = c.clientHeight;
+            var  ct = parseInt(c.scrollTop, 10);
+            var  cl = parseInt(c.scrollLeft, 10);
+            var  cb = ct + ch;
+            var  cr = cl + c.clientWidth;
+
+            if(t < ct){
+                c.scrollTop = t;
+            }else  if(b > cb){
+                c.scrollTop = b-ch;
+            }
+
+            if(v !== false){
+                if(l < cl){
+                    c.scrollLeft = l;
+                }else  if(r > cr){
+                    c.scrollLeft = r-c.clientWidth;
+                }
+            }
+            return  this;
+        },
+
+        
+        scrollChildIntoView : function(w, z){
+            Roo.fly(w, '_scrollChildIntoView').scrollIntoView(this, z);
+        },
+
+        
+
+        autoHeight : function(AA, AB, AC, AD){
+            var  AE = this.getHeight();
+            this.clip();
+            this.setHeight(1); 
+            setTimeout(function(){
+                var  AG = parseInt(this.dom.scrollHeight, 10); 
+                if(!AA){
+                    this.setHeight(AG);
+                    this.unclip();
+                    if(typeof  AC == "function"){
+                        AC();
+                    }
+                }else {
+                    this.setHeight(AE); 
+                    this.setHeight(AG, AA, AB, function(){
+                        this.unclip();
+                        if(typeof  AC == "function") AC();
+                    }.createDelegate(this), AD);
+                }
+            }.createDelegate(this), 0);
+            return  this;
+        },
+
+        
+
+        contains : function(el){
+            if(!el){return  false;}
+            return  D.isAncestor(this.dom, el.dom ? el.dom : el);
+        },
+
+        
+
+        isVisible : function(AF) {
+            var  AG = !(this.getStyle("visibility") == "hidden" || this.getStyle("display") == "none");
+            if(AF !== true || !AG){
+                return  AG;
+            }
+            var  p = this.dom.parentNode;
+            while(p && p.tagName.toLowerCase() != "body"){
+                if(!Roo.fly(p, '_isVisible').isVisible()){
+                    return  false;
+                }
+
+                p = p.parentNode;
+            }
+            return  true;
+        },
+
+        
+
+        select : function(AH, AI){
+            return  El.select(AH, AI, this.dom);
+        },
+
+        
+
+        query : function(AJ, AK){
+            return  Roo.DomQuery.select(AJ, this.dom);
+        },
+
+        
+
+        child : function(AL, AM){
+            var  n = Roo.DomQuery.selectNode(AL, this.dom);
+            return  AM ? n : Roo.get(n);
+        },
+
+        
+
+        down : function(AN, AO){
+            var  n = Roo.DomQuery.selectNode(" > " + AN, this.dom);
+            return  AO ? n : Roo.get(n);
+        },
+
+        
+
+        initDD : function(AP, AQ, AR){
+            var  dd = new  Roo.dd.DD(Roo.id(this.dom), AP, AQ);
+            return  Roo.apply(dd, AR);
+        },
+
+        
+
+        initDDProxy : function(AS, AT, AU){
+            var  dd = new  Roo.dd.DDProxy(Roo.id(this.dom), AS, AT);
+            return  Roo.apply(dd, AU);
+        },
+
+        
+
+        initDDTarget : function(AV, AW, AX){
+            var  dd = new  Roo.dd.DDTarget(Roo.id(this.dom), AV, AW);
+            return  Roo.apply(dd, AX);
+        },
+
+        
+
+         setVisible : function(AY, AZ){
+            if(!AZ || !A){
+                if(this.visibilityMode == El.DISPLAY){
+                    this.setDisplayed(AY);
+                }else {
+                    this.fixDisplay();
+                    this.dom.style.visibility = AY ? "visible" : "hidden";
+                }
+            }else {
+                
+                var  dom = this.dom;
+                var  J = this.visibilityMode;
+                if(AY){
+                    this.setOpacity(.01);
+                    this.setVisible(true);
+                }
+
+                this.anim({opacity: { to: (AY?1:0) }},
+                      this.preanim(arguments, 1),
+                      null, .35, 'easeIn', function(){
+                         if(!AY){
+                             if(J == El.DISPLAY){
+                                 dom.style.display = "none";
+                             }else {
+                                 dom.style.visibility = "hidden";
+                             }
+
+                             Roo.get(dom).setOpacity(1);
+                         }
+                     });
+            }
+            return  this;
+        },
+
+        
+
+        isDisplayed : function() {
+            return  this.getStyle("display") != "none";
+        },
+
+        
+
+        toggle : function(Aa){
+            this.setVisible(!this.isVisible(), this.preanim(arguments, 0));
+            return  this;
+        },
+
+        
+
+        setDisplayed : function(Ab) {
+            if(typeof  Ab == "boolean"){
+               Ab = Ab ? this.originalDisplay : "none";
+            }
+
+            this.setStyle("display", Ab);
+            return  this;
+        },
+
+        
+
+        focus : function() {
+            try{
+                this.dom.focus();
+            }catch(e){}
+            return  this;
+        },
+
+        
+
+        blur : function() {
+            try{
+                this.dom.blur();
+            }catch(e){}
+            return  this;
+        },
+
+        
+
+        addClass : function(Ac){
+            if(Ac  instanceof  Array){
+                for(var  i = 0, len = Ac.length; i < len; i++) {
+                    this.addClass(Ac[i]);
+                }
+            }else {
+                if(Ac && !this.hasClass(Ac)){
+                    this.dom.className = this.dom.className + " " + Ac;
+                }
+            }
+            return  this;
+        },
+
+        
+
+        radioClass : function(Ad){
+            var  Ae = this.dom.parentNode.childNodes;
+            for(var  i = 0; i < Ae.length; i++) {
+                var  s = Ae[i];
+                if(s.nodeType == 1){
+                    Roo.get(s).removeClass(Ad);
+                }
+            }
+
+            this.addClass(Ad);
+            return  this;
+        },
+
+        
+
+        removeClass : function(Af){
+            if(!Af || !this.dom.className){
+                return  this;
+            }
+            if(Af  instanceof  Array){
+                for(var  i = 0, len = Af.length; i < len; i++) {
+                    this.removeClass(Af[i]);
+                }
+            }else {
+                if(this.hasClass(Af)){
+                    var  re = this.classReCache[Af];
+                    if (!re) {
+                       re = new  RegExp('(?:^|\\s+)' + Af + '(?:\\s+|$)', "g");
+                       this.classReCache[Af] = re;
+                    }
+
+                    this.dom.className =
+                        this.dom.className.replace(re, " ");
+                }
+            }
+            return  this;
+        },
+
+        
+        classReCache: {},
+
+        
+
+        toggleClass : function(Ag){
+            if(this.hasClass(Ag)){
+                this.removeClass(Ag);
+            }else {
+                this.addClass(Ag);
+            }
+            return  this;
+        },
+
+        
+
+        hasClass : function(Ah){
+            return  Ah && (' '+this.dom.className+' ').indexOf(' '+Ah+' ') != -1;
+        },
+
+        
+
+        replaceClass : function(Ai, Aj){
+            this.removeClass(Ai);
+            this.addClass(Aj);
+            return  this;
+        },
+
+        
+
+        getStyles : function(){
+            var  a = arguments, Ak = a.length, r = {};
+            for(var  i = 0; i < Ak; i++){
+                r[a[i]] = this.getStyle(a[i]);
+            }
+            return  r;
+        },
+
+        
+
+        getStyle : function(){
+            return  G && G.getComputedStyle ?
+                function(Al){
+                    var  el = this.dom, v, cs, Am;
+                    if(Al == 'float'){
+                        Al = "cssFloat";
+                    }
+                    if(el.style && (v = el.style[Al])){
+                        return  v;
+                    }
+                    if(cs = G.getComputedStyle(el, "")){
+                        if(!(Am = B[Al])){
+                            Am = B[Al] = Al.replace(C, F);
+                        }
+                        return  cs[Am];
+                    }
+                    return  null;
+                } :
+                function(Al){
+                    var  el = this.dom, v, cs, Am;
+                    if(Al == 'opacity'){
+                        if(typeof  el.style.filter == 'string'){
+                            var  m = el.style.filter.match(/alpha\(opacity=(.*)\)/i);
+                            if(m){
+                                var  fv = parseFloat(m[1]);
+                                if(!isNaN(fv)){
+                                    return  fv ? fv / 100 : 0;
+                                }
+                            }
+                        }
+                        return  1;
+                    }else  if(Al == 'float'){
+                        Al = "styleFloat";
+                    }
+                    if(!(Am = B[Al])){
+                        Am = B[Al] = Al.replace(C, F);
+                    }
+                    if(v = el.style[Am]){
+                        return  v;
+                    }
+                    if(cs = el.currentStyle){
+                        return  cs[Am];
+                    }
+                    return  null;
+                };
+        }(),
+
+        
+
+        setStyle : function(Al, Am){
+            if(typeof  Al == "string"){
+                
+                if (Al == 'float') {
+                    this.setStyle(Roo.isIE ? 'styleFloat'  : 'cssFloat', Am);
+                    return  this;
+                }
+                
+                var  camel;
+                if(!(camel = B[Al])){
+                    camel = B[Al] = Al.replace(C, F);
+                }
+                
+                if(camel == 'opacity') {
+                    this.setOpacity(Am);
+                }else {
+                    this.dom.style[camel] = Am;
+                }
+            }else {
+                for(var  style  in  Al){
+                    if(typeof  Al[style] != "function"){
+                       this.setStyle(style, Al[style]);
+                    }
+                }
+            }
+            return  this;
+        },
+
+        
+
+        applyStyles : function(An){
+            Roo.DomHelper.applyStyles(this.dom, An);
+            return  this;
+        },
+
+        
+
+        getX : function(){
+            return  D.getX(this.dom);
+        },
+
+        
+
+        getY : function(){
+            return  D.getY(this.dom);
+        },
+
+        
+
+        getXY : function(){
+            return  D.getXY(this.dom);
+        },
+
+        
+
+        setX : function(x, Ao){
+            if(!Ao || !A){
+                D.setX(this.dom, x);
+            }else {
+                this.setXY([x, this.getY()], this.preanim(arguments, 1));
+            }
+            return  this;
+        },
+
+        
+
+        setY : function(y, Ap){
+            if(!Ap || !A){
+                D.setY(this.dom, y);
+            }else {
+                this.setXY([this.getX(), y], this.preanim(arguments, 1));
+            }
+            return  this;
+        },
+
+        
+
+        setLeft : function(Aq){
+            this.setStyle("left", this.addUnits(Aq));
+            return  this;
+        },
+
+        
+
+        setTop : function(Ar){
+            this.setStyle("top", this.addUnits(Ar));
+            return  this;
+        },
+
+        
+
+        setRight : function(As){
+            this.setStyle("right", this.addUnits(As));
+            return  this;
+        },
+
+        
+
+        setBottom : function(At){
+            this.setStyle("bottom", this.addUnits(At));
+            return  this;
+        },
+
+        
+
+        setXY : function(Au, Av){
+            if(!Av || !A){
+                D.setXY(this.dom, Au);
+            }else {
+                this.anim({points: {to: Au}}, this.preanim(arguments, 1), 'motion');
+            }
+            return  this;
+        },
+
+        
+
+        setLocation : function(x, y, Aw){
+            this.setXY([x, y], this.preanim(arguments, 2));
+            return  this;
+        },
+
+        
+
+        moveTo : function(x, y, Ax){
+            this.setXY([x, y], this.preanim(arguments, 2));
+            return  this;
+        },
+
+        
+
+        getRegion : function(){
+            return  D.getRegion(this.dom);
+        },
+
+        
+
+        getHeight : function(Ay){
+            var  h = this.dom.offsetHeight || 0;
+            return  Ay !== true ? h : h-this.getBorderWidth("tb")-this.getPadding("tb");
+        },
+
+        
+
+        getWidth : function(Az){
+            var  w = this.dom.offsetWidth || 0;
+            return  Az !== true ? w : w-this.getBorderWidth("lr")-this.getPadding("lr");
+        },
+
+        
+
+        getComputedHeight : function(){
+            var  h = Math.max(this.dom.offsetHeight, this.dom.clientHeight);
+            if(!h){
+                h = parseInt(this.getStyle('height'), 10) || 0;
+                if(!this.isBorderBox()){
+                    h += this.getFrameWidth('tb');
+                }
+            }
+            return  h;
+        },
+
+        
+
+        getComputedWidth : function(){
+            var  w = Math.max(this.dom.offsetWidth, this.dom.clientWidth);
+            if(!w){
+                w = parseInt(this.getStyle('width'), 10) || 0;
+                if(!this.isBorderBox()){
+                    w += this.getFrameWidth('lr');
+                }
+            }
+            return  w;
+        },
+
+        
+
+        getSize : function(A0){
+            return  {width: this.getWidth(A0), height: this.getHeight(A0)};
+        },
+
+        
+
+        getViewSize : function(){
+            var  d = this.dom, A1 = document, aw = 0, ah = 0;
+            if(d == A1 || d == A1.body){
+                return  {width : D.getViewWidth(), height: D.getViewHeight()};
+            }else {
+                return  {
+                    width : d.clientWidth,
+                    height: d.clientHeight
+                };
+            }
+        },
+
+        
+
+        getValue : function(A2){
+            return  A2 ? parseInt(this.dom.value, 10) : this.dom.value;
+        },
+
+        
+        adjustWidth : function(A3){
+            if(typeof  A3 == "number"){
+                if(this.autoBoxAdjust && !this.isBorderBox()){
+                   A3 -= (this.getBorderWidth("lr") + this.getPadding("lr"));
+                }
+                if(A3 < 0){
+                    A3 = 0;
+                }
+            }
+            return  A3;
+        },
+
+        
+        adjustHeight : function(A4){
+            if(typeof  A4 == "number"){
+               if(this.autoBoxAdjust && !this.isBorderBox()){
+                   A4 -= (this.getBorderWidth("tb") + this.getPadding("tb"));
+               }
+               if(A4 < 0){
+                   A4 = 0;
+               }
+            }
+            return  A4;
+        },
+
+        
+
+        setWidth : function(A5, A6){
+            A5 = this.adjustWidth(A5);
+            if(!A6 || !A){
+                this.dom.style.width = this.addUnits(A5);
+            }else {
+                this.anim({width: {to: A5}}, this.preanim(arguments, 1));
+            }
+            return  this;
+        },
+
+        
+
+         setHeight : function(A7, A8){
+            A7 = this.adjustHeight(A7);
+            if(!A8 || !A){
+                this.dom.style.height = this.addUnits(A7);
+            }else {
+                this.anim({height: {to: A7}}, this.preanim(arguments, 1));
+            }
+            return  this;
+        },
+
+        
+
+         setSize : function(A9, BA, BB){
+            if(typeof  A9 == "object"){ 
+                BA = A9.height; A9 = A9.width;
+            }
+
+            A9 = this.adjustWidth(A9); BA = this.adjustHeight(BA);
+            if(!BB || !A){
+                this.dom.style.width = this.addUnits(A9);
+                this.dom.style.height = this.addUnits(BA);
+            }else {
+                this.anim({width: {to: A9}, height: {to: BA}}, this.preanim(arguments, 2));
+            }
+            return  this;
+        },
+
+        
+
+        setBounds : function(x, y, BC, BD, BE){
+            if(!BE || !A){
+                this.setSize(BC, BD);
+                this.setLocation(x, y);
+            }else {
+                BC = this.adjustWidth(BC); BD = this.adjustHeight(BD);
+                this.anim({points: {to: [x, y]}, width: {to: BC}, height: {to: BD}},
+                              this.preanim(arguments, 4), 'motion');
+            }
+            return  this;
+        },
+
+        
+
+        setRegion : function(BF, BG){
+            this.setBounds(BF.left, BF.top, BF.right-BF.left, BF.bottom-BF.top, this.preanim(arguments, 1));
+            return  this;
+        },
+
+        
+
+        addListener : function(BH, fn, BI, BJ){
+            Roo.EventManager.on(this.dom,  BH, fn, BI || this, BJ);
+        },
+
+        
+
+        removeListener : function(BK, fn){
+            Roo.EventManager.removeListener(this.dom,  BK, fn);
+            return  this;
+        },
+
+        
+
+        removeAllListeners : function(){
+            E.purgeElement(this.dom);
+            return  this;
+        },
+
+        relayEvent : function(BL, BM){
+            this.on(BL, function(e){
+                BM.fireEvent(BL, e);
+            });
+        },
+
+        
+
+         setOpacity : function(BN, BO){
+            if(!BO || !A){
+                var  s = this.dom.style;
+                if(Roo.isIE){
+                    s.zoom = 1;
+                    s.filter = (s.filter || '').replace(/alpha\([^\)]*\)/gi,"") +
+                               (BN == 1 ? "" : "alpha(opacity=" + BN * 100 + ")");
+                }else {
+                    s.opacity = BN;
+                }
+            }else {
+                this.anim({opacity: {to: BN}}, this.preanim(arguments, 1), null, .35, 'easeIn');
+            }
+            return  this;
+        },
+
+        
+
+        getLeft : function(BP){
+            if(!BP){
+                return  this.getX();
+            }else {
+                return  parseInt(this.getStyle("left"), 10) || 0;
+            }
+        },
+
+        
+
+        getRight : function(BQ){
+            if(!BQ){
+                return  this.getX() + this.getWidth();
+            }else {
+                return  (this.getLeft(true) + this.getWidth()) || 0;
+            }
+        },
+
+        
+
+        getTop : function(BR) {
+            if(!BR){
+                return  this.getY();
+            }else {
+                return  parseInt(this.getStyle("top"), 10) || 0;
+            }
+        },
+
+        
+
+        getBottom : function(BS){
+            if(!BS){
+                return  this.getY() + this.getHeight();
+            }else {
+                return  (this.getTop(true) + this.getHeight()) || 0;
+            }
+        },
+
+        
+
+        position : function(BT, BU, x, y){
+            if(!BT){
+               if(this.getStyle('position') == 'static'){
+                   this.setStyle('position', 'relative');
+               }
+            }else {
+                this.setStyle("position", BT);
+            }
+            if(BU){
+                this.setStyle("z-index", BU);
+            }
+            if(x !== undefined && y !== undefined){
+                this.setXY([x, y]);
+            }else  if(x !== undefined){
+                this.setX(x);
+            }else  if(y !== undefined){
+                this.setY(y);
+            }
+        },
+
+        
+
+        clearPositioning : function(BV){
+            BV = BV ||'';
+            this.setStyle({
+                "left": BV,
+                "right": BV,
+                "top": BV,
+                "bottom": BV,
+                "z-index": "",
+                "position" : "static"
+            });
+            return  this;
+        },
+
+        
+
+        getPositioning : function(){
+            var  l = this.getStyle("left");
+            var  t = this.getStyle("top");
+            return  {
+                "position" : this.getStyle("position"),
+                "left" : l,
+                "right" : l ? "" : this.getStyle("right"),
+                "top" : t,
+                "bottom" : t ? "" : this.getStyle("bottom"),
+                "z-index" : this.getStyle("z-index")
+            };
+        },
+
+        
+
+        getBorderWidth : function(BW){
+            return  this.addStyles(BW, El.borders);
+        },
+
+        
+
+        getPadding : function(BX){
+            return  this.addStyles(BX, El.paddings);
+        },
+
+        
+
+        setPositioning : function(pc){
+            this.applyStyles(pc);
+            if(pc.right == "auto"){
+                this.dom.style.right = "";
+            }
+            if(pc.bottom == "auto"){
+                this.dom.style.bottom = "";
+            }
+            return  this;
+        },
+
+        
+        fixDisplay : function(){
+            if(this.getStyle("display") == "none"){
+                this.setStyle("visibility", "hidden");
+                this.setStyle("display", this.originalDisplay); 
+                if(this.getStyle("display") == "none"){ 
+                    this.setStyle("display", "block");
+                }
+            }
+        },
+
+        
+
+         setLeftTop : function(BY, BZ){
+            this.dom.style.left = this.addUnits(BY);
+            this.dom.style.top = this.addUnits(BZ);
+            return  this;
+        },
+
+        
+
+         move : function(Ba, Bb, Bc){
+            var  xy = this.getXY();
+            Ba = Ba.toLowerCase();
+            switch(Ba){
+                case  "l":
+                case  "left":
+                    this.moveTo(xy[0]-Bb, xy[1], this.preanim(arguments, 2));
+                    break;
+               case  "r":
+               case  "right":
+                    this.moveTo(xy[0]+Bb, xy[1], this.preanim(arguments, 2));
+                    break;
+               case  "t":
+               case  "top":
+               case  "up":
+                    this.moveTo(xy[0], xy[1]-Bb, this.preanim(arguments, 2));
+                    break;
+               case  "b":
+               case  "bottom":
+               case  "down":
+                    this.moveTo(xy[0], xy[1]+Bb, this.preanim(arguments, 2));
+                    break;
+            }
+            return  this;
+        },
+
+        
+
+        clip : function(){
+            if(!this.isClipped){
+               this.isClipped = true;
+               this.originalClip = {
+                   "o": this.getStyle("overflow"),
+                   "x": this.getStyle("overflow-x"),
+                   "y": this.getStyle("overflow-y")
+               };
+               this.setStyle("overflow", "hidden");
+               this.setStyle("overflow-x", "hidden");
+               this.setStyle("overflow-y", "hidden");
+            }
+            return  this;
+        },
+
+        
+
+        unclip : function(){
+            if(this.isClipped){
+                this.isClipped = false;
+                var  o = this.originalClip;
+                if(o.o){this.setStyle("overflow", o.o);}
+                if(o.x){this.setStyle("overflow-x", o.x);}
+                if(o.y){this.setStyle("overflow-y", o.y);}
+            }
+            return  this;
+        },
+
+
+        
+
+        getAnchorXY : function(Bd, Be, s){
+            
+            
+
+            var  w, h, vp = false;
+            if(!s){
+                var  d = this.dom;
+                if(d == document.body || d == document){
+                    vp = true;
+                    w = D.getViewWidth(); h = D.getViewHeight();
+                }else {
+                    w = this.getWidth(); h = this.getHeight();
+                }
+            }else {
+                w = s.width;  h = s.height;
+            }
+            var  x = 0, y = 0, r = Math.round;
+            switch((Bd || "tl").toLowerCase()){
+                case  "c":
+                    x = r(w*.5);
+                    y = r(h*.5);
+                break;
+                case  "t":
+                    x = r(w*.5);
+                    y = 0;
+                break;
+                case  "l":
+                    x = 0;
+                    y = r(h*.5);
+                break;
+                case  "r":
+                    x = w;
+                    y = r(h*.5);
+                break;
+                case  "b":
+                    x = r(w*.5);
+                    y = h;
+                break;
+                case  "tl":
+                    x = 0;
+                    y = 0;
+                break;
+                case  "bl":
+                    x = 0;
+                    y = h;
+                break;
+                case  "br":
+                    x = w;
+                    y = h;
+                break;
+                case  "tr":
+                    x = w;
+                    y = 0;
+                break;
+            }
+            if(Be === true){
+                return  [x, y];
+            }
+            if(vp){
+                var  sc = this.getScroll();
+                return  [x + sc.left, y + sc.top];
+            }
+            
+            var  o = this.getXY();
+            return  [x+o[0], y+o[1]];
+        },
+
+        
+
+        getAlignToXY : function(el, p, o){
+            el = Roo.get(el);
+            var  d = this.dom;
+            if(!el.dom){
+                throw  "Element.alignTo with an element that doesn't exist";
+            }
+            var  c = false; 
+            var  p1 = "", p2 = "";
+            o = o || [0,0];
+
+            if(!p){
+                p = "tl-bl";
+            }else  if(p == "?"){
+                p = "tl-bl?";
+            }else  if(p.indexOf("-") == -1){
+                p = "tl-" + p;
+            }
+
+            p = p.toLowerCase();
+            var  m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/);
+            if(!m){
+               throw  "Element.alignTo with an invalid alignment " + p;
+            }
+
+            p1 = m[1]; p2 = m[2]; c = !!m[3];
+
+            
+            
+            var  a1 = this.getAnchorXY(p1, true);
+            var  a2 = el.getAnchorXY(p2, false);
+            var  x = a2[0] - a1[0] + o[0];
+            var  y = a2[1] - a1[1] + o[1];
+            if(c){
+                
+                var  w = this.getWidth(), h = this.getHeight(), r = el.getRegion();
+                
+                var  dw = D.getViewWidth()-5, dh = D.getViewHeight()-5;
+
+                
+                
+                
+                var  p1y = p1.charAt(0), p1x = p1.charAt(p1.length-1);
+               var  p2y = p2.charAt(0), p2x = p2.charAt(p2.length-1);
+               var  swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t"));
+               var  swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r"));
+
+               var  A1 = document;
+               var  scrollX = (A1.documentElement.scrollLeft || A1.body.scrollLeft || 0)+5;
+               var  scrollY = (A1.documentElement.scrollTop || A1.body.scrollTop || 0)+5;
+
+               if((x+w) > dw + scrollX){
+                    x = swapX ? r.left-w : dw+scrollX-w;
+                }
+               if(x < scrollX){
+                   x = swapX ? r.right : scrollX;
+               }
+               if((y+h) > dh + scrollY){
+                    y = swapY ? r.top-h : dh+scrollY-h;
+                }
+               if (y < scrollY){
+                   y = swapY ? r.bottom : scrollY;
+               }
+            }
+            return  [x,y];
+        },
+
+        
+        getConstrainToXY : function(){
+            var  os = {top:0, left:0, bottom:0, right: 0};
+
+            return  function(el, Bf, Bg, Bh){
+                el = Roo.get(el);
+                Bg = Bg ? Roo.applyIf(Bg, os) : os;
+
+                var  vw, vh, vx = 0, vy = 0;
+                if(el.dom == document.body || el.dom == document){
+                    vw = Roo.lib.Dom.getViewWidth();
+                    vh = Roo.lib.Dom.getViewHeight();
+                }else {
+                    vw = el.dom.clientWidth;
+                    vh = el.dom.clientHeight;
+                    if(!Bf){
+                        var  vxy = el.getXY();
+                        vx = vxy[0];
+                        vy = vxy[1];
+                    }
+                }
+
+                var  s = el.getScroll();
+
+                vx += Bg.left + s.left;
+                vy += Bg.top + s.top;
+
+                vw -= Bg.right;
+                vh -= Bg.bottom;
+
+                var  vr = vx+vw;
+                var  vb = vy+vh;
+
+                var  xy = Bh || (!Bf ? this.getXY() : [this.getLeft(true), this.getTop(true)]);
+                var  x = xy[0], y = xy[1];
+                var  w = this.dom.offsetWidth, h = this.dom.offsetHeight;
+
+                
+                var  Bi = false;
+
+                
+                if((x + w) > vr){
+                    x = vr - w;
+                    Bi = true;
+                }
+                if((y + h) > vb){
+                    y = vb - h;
+                    Bi = true;
+                }
+                
+                if(x < vx){
+                    x = vx;
+                    Bi = true;
+                }
+                if(y < vy){
+                    y = vy;
+                    Bi = true;
+                }
+                return  Bi ? [x, y] : false;
+            };
+        }(),
+
+        
+        adjustForConstraints : function(xy, Bf, Bg){
+            return  this.getConstrainToXY(Bf || document, false, Bg, xy) ||  xy;
+        },
+
+        
+
+        alignTo : function(Bh, Bi, Bj, Bk){
+            var  xy = this.getAlignToXY(Bh, Bi, Bj);
+            this.setXY(xy, this.preanim(arguments, 3));
+            return  this;
+        },
+
+        
+
+        anchorTo : function(el, Bl, Bm, Bn, Bo, Bp){
+            var  Bq = function(){
+                this.alignTo(el, Bl, Bm, Bn);
+                Roo.callback(Bp, this);
+            };
+            Roo.EventManager.onWindowResize(Bq, this);
+            var  tm = typeof  Bo;
+            if(tm != 'undefined'){
+                Roo.EventManager.on(window, 'scroll', Bq, this,
+                    {buffer: tm == 'number' ? Bo : 50});
+            }
+
+            Bq.call(this); 
+            return  this;
+        },
+        
+
+        clearOpacity : function(){
+            if (window.ActiveXObject) {
+                if(typeof  this.dom.style.filter == 'string' && (/alpha/i).test(this.dom.style.filter)){
+                    this.dom.style.filter = "";
+                }
+            } else  {
+                this.dom.style.opacity = "";
+                this.dom.style["-moz-opacity"] = "";
+                this.dom.style["-khtml-opacity"] = "";
+            }
+            return  this;
+        },
+
+        
+
+        hide : function(Br){
+            this.setVisible(false, this.preanim(arguments, 0));
+            return  this;
+        },
+
+        
+
+        show : function(Bs){
+            this.setVisible(true, this.preanim(arguments, 0));
+            return  this;
+        },
+
+        
+
+        addUnits : function(Bt){
+            return  Roo.Element.addUnits(Bt, this.defaultUnit);
+        },
+
+        
+
+        beginMeasure : function(){
+            var  el = this.dom;
+            if(el.offsetWidth || el.offsetHeight){
+                return  this; 
+            }
+            var  Bu = [];
+            var  p = this.dom, b = document.body; 
+            while((!el.offsetWidth && !el.offsetHeight) && p && p.tagName && p != b){
+                var  pe = Roo.get(p);
+                if(pe.getStyle('display') == 'none'){
+                    Bu.push({el: p, visibility: pe.getStyle("visibility")});
+                    p.style.visibility = "hidden";
+                    p.style.display = "block";
+                }
+
+                p = p.parentNode;
+            }
+
+            this._measureChanged = Bu;
+            return  this;
+
+        },
+
+        
+
+        endMeasure : function(){
+            var  Bv = this._measureChanged;
+            if(Bv){
+                for(var  i = 0, Ak = Bv.length; i < Ak; i++) {
+                    var  r = Bv[i];
+                    r.el.style.visibility = r.visibility;
+                    r.el.style.display = "none";
+                }
+
+                this._measureChanged = null;
+            }
+            return  this;
+        },
+
+        
+
+        update : function(Bw, Bx, By){
+            if(typeof  Bw == "undefined"){
+                Bw = "";
+            }
+            if(Bx !== true){
+                this.dom.innerHTML = Bw;
+                if(typeof  By == "function"){
+                    By();
+                }
+                return  this;
+            }
+            var  id = Roo.id();
+            var  Bz = this.dom;
+
+            Bw += '<span id="' + id + '"></span>';
+
+            E.onAvailable(id, function(){
+                var  hd = document.getElementsByTagName("head")[0];
+                var  re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;
+                var  B0 = /\ssrc=([\'\"])(.*?)\1/i;
+                var  B1 = /\stype=([\'\"])(.*?)\1/i;
+
+                var  B2;
+                while(B2 = re.exec(Bw)){
+                    var  attrs = B2[1];
+                    var  srcMatch = attrs ? attrs.match(B0) : false;
+                    if(srcMatch && srcMatch[2]){
+                       var  s = document.createElement("script");
+                       s.src = srcMatch[2];
+                       var  typeMatch = attrs.match(B1);
+                       if(typeMatch && typeMatch[2]){
+                           s.type = typeMatch[2];
+                       }
+
+                       hd.appendChild(s);
+                    }else  if(B2[2] && B2[2].length > 0){
+                        if(window.execScript) {
+                           window.execScript(B2[2]);
+                        } else  {
+                            
+
+                           window.eval(B2[2]);
+                        }
+                    }
+                }
+                var  el = document.getElementById(id);
+                if(el){el.parentNode.removeChild(el);}
+                if(typeof  By == "function"){
+                    By();
+                }
+            });
+            Bz.innerHTML = Bw.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, "");
+            return  this;
+        },
+
+        
+
+        load : function(){
+            var  um = this.getUpdateManager();
+            um.update.apply(um, arguments);
+            return  this;
+        },
+
+        
+
+        getUpdateManager : function(){
+            if(!this.updateManager){
+                this.updateManager = new  Roo.UpdateManager(this);
+            }
+            return  this.updateManager;
+        },
+
+        
+
+        unselectable : function(){
+            this.dom.unselectable = "on";
+            this.swallowEvent("selectstart", true);
+            this.applyStyles("-moz-user-select:none;-khtml-user-select:none;");
+            this.addClass("x-unselectable");
+            return  this;
+        },
+
+        
+
+        getCenterXY : function(){
+            return  this.getAlignToXY(document, 'c-c');
+        },
+
+        
+
+        center : function(B0){
+            this.alignTo(B0 || document, 'c-c');
+            return  this;
+        },
+
+        
+
+        isBorderBox : function(){
+            return  I[this.dom.tagName.toLowerCase()] || Roo.isBorderBox;
+        },
+
+        
+
+        getBox : function(B1, B2){
+            var  xy;
+            if(!B2){
+                xy = this.getXY();
+            }else {
+                var  BY = parseInt(this.getStyle("left"), 10) || 0;
+                var  BZ = parseInt(this.getStyle("top"), 10) || 0;
+                xy = [BY, BZ];
+            }
+            var  el = this.dom, w = el.offsetWidth, h = el.offsetHeight, bx;
+            if(!B1){
+                bx = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: w, height: h};
+            }else {
+                var  l = this.getBorderWidth("l")+this.getPadding("l");
+                var  r = this.getBorderWidth("r")+this.getPadding("r");
+                var  t = this.getBorderWidth("t")+this.getPadding("t");
+                var  b = this.getBorderWidth("b")+this.getPadding("b");
+                bx = {x: xy[0]+l, y: xy[1]+t, 0: xy[0]+l, 1: xy[1]+t, width: w-(l+r), height: h-(t+b)};
+            }
+
+            bx.right = bx.x + bx.width;
+            bx.bottom = bx.y + bx.height;
+            return  bx;
+        },
+
+        
+
+        getFrameWidth : function(B3, B4){
+            return  B4 && Roo.isBorderBox ? 0 : (this.getPadding(B3) + this.getBorderWidth(B3));
+        },
+
+        
+
+        setBox : function(B5, B6, B7){
+            var  w = B5.width, h = B5.height;
+            if((B6 && !this.autoBoxAdjust) && !this.isBorderBox()){
+               w -= (this.getBorderWidth("lr") + this.getPadding("lr"));
+               h -= (this.getBorderWidth("tb") + this.getPadding("tb"));
+            }
+
+            this.setBounds(B5.x, B5.y, w, h, this.preanim(arguments, 2));
+            return  this;
+        },
+
+        
+
+         repaint : function(){
+            var  B8 = this.dom;
+            this.addClass("x-repaint");
+            setTimeout(function(){
+                Roo.get(B8).removeClass("x-repaint");
+            }, 1);
+            return  this;
+        },
+
+        
+
+        getMargins : function(B9){
+            if(!B9){
+                return  {
+                    top: parseInt(this.getStyle("margin-top"), 10) || 0,
+                    left: parseInt(this.getStyle("margin-left"), 10) || 0,
+                    bottom: parseInt(this.getStyle("margin-bottom"), 10) || 0,
+                    right: parseInt(this.getStyle("margin-right"), 10) || 0
+                };
+            }else {
+                return  this.addStyles(B9, El.margins);
+             }
+        },
+
+        
+        addStyles : function(CA, CB){
+            var  CC = 0, v, w;
+            for(var  i = 0, Ak = CA.length; i < Ak; i++){
+                v = this.getStyle(CB[CA.charAt(i)]);
+                if(v){
+                     w = parseInt(v, 10);
+                     if(w){ CC += w; }
+                }
+            }
+            return  CC;
+        },
+
+        
+
+        createProxy : function(CD, CE, CF){
+            if(CE){
+                CE = Roo.getDom(CE);
+            }else {
+                CE = document.body;
+            }
+
+            CD = typeof  CD == "object" ?
+                CD : {tag : "div", cls: CD};
+            var  CG = Roo.DomHelper.append(CE, CD, true);
+            if(CF){
+               CG.setBox(this.getBox());
+            }
+            return  CG;
+        },
+
+        
+
+        mask : function(CH, CI){
+            if(this.getStyle("position") == "static"){
+                this.setStyle("position", "relative");
+            }
+            if(!this._mask){
+                this._mask = Roo.DomHelper.append(this.dom, {cls:"roo-el-mask"}, true);
+            }
+
+            this.addClass("x-masked");
+            this._mask.setDisplayed(true);
+            if(typeof  CH == 'string'){
+                if(!this._maskMsg){
+                    this._maskMsg = Roo.DomHelper.append(this.dom, {cls:"roo-el-mask-msg", cn:{tag:'div'}}, true);
+                }
+                var  mm = this._maskMsg;
+                mm.dom.className = CI ? "roo-el-mask-msg " + CI : "roo-el-mask-msg";
+                mm.dom.firstChild.innerHTML = CH;
+                mm.setDisplayed(true);
+                mm.center(this);
+            }
+            if(Roo.isIE && !(Roo.isIE7 && Roo.isStrict) && this.getStyle('height') == 'auto'){ 
+                this._mask.setHeight(this.getHeight());
+            }
+            return  this._mask;
+        },
+
+        
+
+        unmask : function(CJ){
+            if(this._mask){
+                if(CJ === true){
+                    this._mask.remove();
+                    delete  this._mask;
+                    if(this._maskMsg){
+                        this._maskMsg.remove();
+                        delete  this._maskMsg;
+                    }
+                }else {
+                    this._mask.setDisplayed(false);
+                    if(this._maskMsg){
+                        this._maskMsg.setDisplayed(false);
+                    }
+                }
+            }
+
+            this.removeClass("x-masked");
+        },
+
+        
+
+        isMasked : function(){
+            return  this._mask && this._mask.isVisible();
+        },
+
+        
+
+        createShim : function(){
+            var  el = document.createElement('iframe');
+            el.frameBorder = 'no';
+            el.className = 'roo-shim';
+            if(Roo.isIE && Roo.isSecure){
+                el.src = Roo.SSL_SECURE_URL;
+            }
+            var  CK = Roo.get(this.dom.parentNode.insertBefore(el, this.dom));
+            CK.autoBoxAdjust = false;
+            return  CK;
+        },
+
+        
+
+        remove : function(){
+            if(this.dom.parentNode){
+                this.dom.parentNode.removeChild(this.dom);
+            }
+            delete  El.cache[this.dom.id];
+        },
+
+        
+
+        addClassOnOver : function(CL, CM){
+            this.on("mouseover", function(){
+                Roo.fly(this, '_internal').addClass(CL);
+            }, this.dom);
+            var  CN = function(e){
+                if(CM !== true || !e.within(this, true)){
+                    Roo.fly(this, '_internal').removeClass(CL);
+                }
+            };
+            this.on("mouseout", CN, this.dom);
+            return  this;
+        },
+
+        
+
+        addClassOnFocus : function(CO){
+            this.on("focus", function(){
+                Roo.fly(this, '_internal').addClass(CO);
+            }, this.dom);
+            this.on("blur", function(){
+                Roo.fly(this, '_internal').removeClass(CO);
+            }, this.dom);
+            return  this;
+        },
+        
+
+        addClassOnClick : function(CP){
+            var  CQ = this.dom;
+            this.on("mousedown", function(){
+                Roo.fly(CQ, '_internal').addClass(CP);
+                var  d = Roo.get(document);
+                var  fn = function(){
+                    Roo.fly(CQ, '_internal').removeClass(CP);
+                    d.removeListener("mouseup", fn);
+                };
+                d.on("mouseup", fn);
+            });
+            return  this;
+        },
+
+        
+
+        swallowEvent : function(CR, CS){
+            var  fn = function(e){
+                e.stopPropagation();
+                if(CS){
+                    e.preventDefault();
+                }
+            };
+            if(CR  instanceof  Array){
+                for(var  i = 0, Ak = CR.length; i < Ak; i++){
+                     this.on(CR[i], fn);
+                }
+                return  this;
+            }
+
+            this.on(CR, fn);
+            return  this;
+        },
+
+        
+
+      fitToParentDelegate : Roo.emptyFn, 
+
+        
+
+        fitToParent : function(CT, CU) {
+          Roo.EventManager.removeResizeListener(this.fitToParentDelegate); 
+          this.fitToParentDelegate = Roo.emptyFn; 
+          if (CT === true && !this.dom.parentNode) { 
+            return;
+          }
+          var  p = Roo.get(CU || this.dom.parentNode);
+          this.setSize(p.getComputedWidth() - p.getFrameWidth('lr'), p.getComputedHeight() - p.getFrameWidth('tb'));
+          if (CT === true) {
+            this.fitToParentDelegate = this.fitToParent.createDelegate(this, [true, CU]);
+            Roo.EventManager.onWindowResize(this.fitToParentDelegate);
+          }
+          return  this;
+        },
+
+        
+
+        getNextSibling : function(){
+            var  n = this.dom.nextSibling;
+            while(n && n.nodeType != 1){
+                n = n.nextSibling;
+            }
+            return  n;
+        },
+
+        
+
+        getPrevSibling : function(){
+            var  n = this.dom.previousSibling;
+            while(n && n.nodeType != 1){
+                n = n.previousSibling;
+            }
+            return  n;
+        },
+
+
+        
+
+        appendChild: function(el){
+            el = Roo.get(el);
+            el.appendTo(this);
+            return  this;
+        },
+
+        
+
+        createChild: function(CV, CW, CX){
+            CV = CV || {tag:'div'};
+            if(CW){
+                return  Roo.DomHelper.insertBefore(CW, CV, CX !== true);
+            }
+            return  Roo.DomHelper[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, CV,  CX !== true);
+        },
+
+        
+
+        appendTo: function(el){
+            el = Roo.getDom(el);
+            el.appendChild(this.dom);
+            return  this;
+        },
+
+        
+
+        insertBefore: function(el){
+            el = Roo.getDom(el);
+            el.parentNode.insertBefore(this.dom, el);
+            return  this;
+        },
+
+        
+
+        insertAfter: function(el){
+            el = Roo.getDom(el);
+            el.parentNode.insertBefore(this.dom, el.nextSibling);
+            return  this;
+        },
+
+        
+
+        insertFirst: function(el, CY){
+            el = el || {};
+            if(typeof  el == 'object' && !el.nodeType){ 
+                return  this.createChild(el, this.dom.firstChild, CY);
+            }else {
+                el = Roo.getDom(el);
+                this.dom.insertBefore(el, this.dom.firstChild);
+                return  !CY ? Roo.get(el) : el;
+            }
+        },
+
+        
+
+        insertSibling: function(el, CZ, Ca){
+            CZ = CZ ? CZ.toLowerCase() : 'before';
+            el = el || {};
+            var  rt, Cb = CZ == 'before' ? this.dom : this.dom.nextSibling;
+
+            if(typeof  el == 'object' && !el.nodeType){ 
+                if(CZ == 'after' && !this.dom.nextSibling){
+                    rt = Roo.DomHelper.append(this.dom.parentNode, el, !Ca);
+                }else {
+                    rt = Roo.DomHelper[CZ == 'after' ? 'insertAfter' : 'insertBefore'](this.dom, el, !Ca);
+                }
+
+            }else {
+                rt = this.dom.parentNode.insertBefore(Roo.getDom(el),
+                            CZ == 'before' ? this.dom : this.dom.nextSibling);
+                if(!Ca){
+                    rt = Roo.get(rt);
+                }
+            }
+            return  rt;
+        },
+
+        
+
+        wrap: function(Cc, Cd){
+            if(!Cc){
+                Cc = {tag: "div"};
+            }
+            var  Ce = Roo.DomHelper.insertBefore(this.dom, Cc, !Cd);
+            Ce.dom ? Ce.dom.appendChild(this.dom) : Ce.appendChild(this.dom);
+            return  Ce;
+        },
+
+        
+
+        replace: function(el){
+            el = Roo.get(el);
+            this.insertBefore(el);
+            el.remove();
+            return  this;
+        },
+
+        
+
+        insertHtml : function(Cf, Cg, Ch){
+            var  el = Roo.DomHelper.insertHtml(Cf, this.dom, Cg);
+            return  Ch ? Roo.get(el) : el;
+        },
+
+        
+
+        set : function(o, Ci){
+            var  el = this.dom;
+            Ci = typeof  Ci == 'undefined' ? (el.setAttribute ? true : false) : Ci;
+            for(var  attr  in  o){
+                if(attr == "style" || typeof  o[attr] == "function") continue;
+                if(attr=="cls"){
+                    el.className = o["cls"];
+                }else {
+                    if(Ci) el.setAttribute(attr, o[attr]);
+                    else  el[attr] = o[attr];
+                }
+            }
+            if(o.style){
+                Roo.DomHelper.applyStyles(el, o.style);
+            }
+            return  this;
+        },
+
+        
+
+        addKeyListener : function(Cj, fn, Ck){
+            var  Cl;
+            if(typeof  Cj != "object" || Cj  instanceof  Array){
+                Cl = {
+                    key: Cj,
+                    fn: fn,
+                    scope: Ck
+                };
+            }else {
+                Cl = {
+                    key : Cj.key,
+                    shift : Cj.shift,
+                    ctrl : Cj.ctrl,
+                    alt : Cj.alt,
+                    fn: fn,
+                    scope: Ck
+                };
+            }
+            return  new  Roo.KeyMap(this, Cl);
+        },
+
+        
+
+        addKeyMap : function(Cm){
+            return  new  Roo.KeyMap(this, Cm);
+        },
+
+        
+
+         isScrollable : function(){
+            var  Cn = this.dom;
+            return  Cn.scrollHeight > Cn.clientHeight || Cn.scrollWidth > Cn.clientWidth;
+        },
+
+        
+
+
+        scrollTo : function(Co, Cp, Cq){
+            var  Cr = Co.toLowerCase() == "left" ? "scrollLeft" : "scrollTop";
+            if(!Cq || !A){
+                this.dom[Cr] = Cp;
+            }else {
+                var  to = Cr == "scrollLeft" ? [Cp, this.dom.scrollTop] : [this.dom.scrollLeft, Cp];
+                this.anim({scroll: {"to": to}}, this.preanim(arguments, 2), 'scroll');
+            }
+            return  this;
+        },
+
+        
+
+         scroll : function(Cs, Ct, Cu){
+             if(!this.isScrollable()){
+                 return;
+             }
+             var  el = this.dom;
+             var  l = el.scrollLeft, t = el.scrollTop;
+             var  w = el.scrollWidth, h = el.scrollHeight;
+             var  cw = el.clientWidth, ch = el.clientHeight;
+             Cs = Cs.toLowerCase();
+             var  Cv = false;
+             var  a = this.preanim(arguments, 2);
+             switch(Cs){
+                 case  "l":
+                 case  "left":
+                     if(w - l > cw){
+                         var  v = Math.min(l + Ct, w-cw);
+                         this.scrollTo("left", v, a);
+                         Cv = true;
+                     }
+                     break;
+                case  "r":
+                case  "right":
+                     if(l > 0){
+                         var  v = Math.max(l - Ct, 0);
+                         this.scrollTo("left", v, a);
+                         Cv = true;
+                     }
+                     break;
+                case  "t":
+                case  "top":
+                case  "up":
+                     if(t > 0){
+                         var  v = Math.max(t - Ct, 0);
+                         this.scrollTo("top", v, a);
+                         Cv = true;
+                     }
+                     break;
+                case  "b":
+                case  "bottom":
+                case  "down":
+                     if(h - t > ch){
+                         var  v = Math.min(t + Ct, h-ch);
+                         this.scrollTo("top", v, a);
+                         Cv = true;
+                     }
+                     break;
+             }
+             return  Cv;
+        },
+
+        
+
+        translatePoints : function(x, y){
+            if(typeof  x == 'object' || x  instanceof  Array){
+                y = x[1]; x = x[0];
+            }
+            var  p = this.getStyle('position');
+            var  o = this.getXY();
+
+            var  l = parseInt(this.getStyle('left'), 10);
+            var  t = parseInt(this.getStyle('top'), 10);
+
+            if(isNaN(l)){
+                l = (p == "relative") ? 0 : this.dom.offsetLeft;
+            }
+            if(isNaN(t)){
+                t = (p == "relative") ? 0 : this.dom.offsetTop;
+            }
+
+            return  {left: (x - o[0] + l), top: (y - o[1] + t)};
+        },
+
+        
+
+        getScroll : function(){
+            var  d = this.dom, Cw = document;
+            if(d == Cw || d == Cw.body){
+                var  l = window.pageXOffset || Cw.documentElement.scrollLeft || Cw.body.scrollLeft || 0;
+                var  t = window.pageYOffset || Cw.documentElement.scrollTop || Cw.body.scrollTop || 0;
+                return  {left: l, top: t};
+            }else {
+                return  {left: d.scrollLeft, top: d.scrollTop};
+            }
+        },
+
+        
+
+        getColor : function(Cx, Cy, Cz){
+            var  v = this.getStyle(Cx);
+            if(!v || v == "transparent" || v == "inherit") {
+                return  Cy;
+            }
+            var  C0 = typeof  Cz == "undefined" ? "#" : Cz;
+            if(v.substr(0, 4) == "rgb("){
+                var  rvs = v.slice(4, v.length -1).split(",");
+                for(var  i = 0; i < 3; i++){
+                    var  h = parseInt(rvs[i]).toString(16);
+                    if(h < 16){
+                        h = "0" + h;
+                    }
+
+                    C0 += h;
+                }
+            } else  {
+                if(v.substr(0, 1) == "#"){
+                    if(v.length == 4) {
+                        for(var  i = 1; i < 4; i++){
+                            var  c = v.charAt(i);
+                            C0 +=  c + c;
+                        }
+                    }else  if(v.length == 7){
+                        C0 += v.substr(1);
+                    }
+                }
+            }
+            return (C0.length > 5 ? C0.toLowerCase() : Cy);
+        },
+
+        
+
+        boxWrap : function(C1){
+            C1 = C1 || 'x-box';
+            var  el = Roo.get(this.insertHtml('beforeBegin', String.format('<div class="{0}">'+El.boxMarkup+'</div>', C1)));
+            el.child('.'+C1+'-mc').dom.appendChild(this.dom);
+            return  el;
+        },
+
+        
+
+        getAttributeNS : Roo.isIE ? function(ns, C2){
+            var  d = this.dom;
+            var  C3 = typeof  d[ns+":"+C2];
+            if(C3 != 'undefined' && C3 != 'unknown'){
+                return  d[ns+":"+C2];
+            }
+            return  d[C2];
+        } : function(ns, C4){
+            var  d = this.dom;
+            return  d.getAttributeNS(ns, C4) || d.getAttribute(ns+":"+C4) || d.getAttribute(C4) || d[C4];
+        }
+    };
+
+    var  ep = El.prototype;
+
+    
+
+    ep.on = ep.addListener;
+        
+    ep.mon = ep.addListener;
+
+    
+
+    ep.un = ep.removeListener;
+
+    
+
+    ep.autoBoxAdjust = true;
+
+    
+    El.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i;
+
+    
+    El.addUnits = function(v, J){
+        if(v === "" || v == "auto"){
+            return  v;
+        }
+        if(v === undefined){
+            return  '';
+        }
+        if(typeof  v == "number" || !El.unitPattern.test(v)){
+            return  v + (J || 'px');
+        }
+        return  v;
+    };
+
+    
+    El.boxMarkup = '<div class="{0}-tl"><div class="{0}-tr"><div class="{0}-tc"></div></div></div><div class="{0}-ml"><div class="{0}-mr"><div class="{0}-mc"></div></div></div><div class="{0}-bl"><div class="{0}-br"><div class="{0}-bc"></div></div></div>';
+    
+
+    El.VISIBILITY = 1;
+    
+
+    El.DISPLAY = 2;
+
+    El.borders = {l: "border-left-width", r: "border-right-width", t: "border-top-width", b: "border-bottom-width"};
+    El.paddings = {l: "padding-left", r: "padding-right", t: "padding-top", b: "padding-bottom"};
+    El.margins = {l: "margin-left", r: "margin-right", t: "margin-top", b: "margin-bottom"};
+
+
+
+    
+
+    El.cache = {};
+
+    var  H;
+
+    
+
+    El.get = function(el){
+        var  ex, J, id;
+        if(!el){ return  null; }
+        if(typeof  el == "string"){ 
+            if(!(J = document.getElementById(el))){
+                return  null;
+            }
+            if(ex = El.cache[el]){
+                ex.dom = J;
+            }else {
+                ex = El.cache[el] = new  El(J);
+            }
+            return  ex;
+        }else  if(el.tagName){ 
+            if(!(id = el.id)){
+                id = Roo.id(el);
+            }
+            if(ex = El.cache[id]){
+                ex.dom = el;
+            }else {
+                ex = El.cache[id] = new  El(el);
+            }
+            return  ex;
+        }else  if(el  instanceof  El){
+            if(el != H){
+                el.dom = document.getElementById(el.id) || el.dom; 
+                                                              
+                El.cache[el.id] = el; 
+            }
+            return  el;
+        }else  if(el.isComposite){
+            return  el;
+        }else  if(el  instanceof  Array){
+            return  El.select(el);
+        }else  if(el == document){
+            
+            if(!H){
+                var  f = function(){};
+                f.prototype = El.prototype;
+                H = new  f();
+                H.dom = document;
+            }
+            return  H;
+        }
+        return  null;
+    };
+
+    
+    El.uncache = function(el){
+        for(var  i = 0, a = arguments, len = a.length; i < len; i++) {
+            if(a[i]){
+                delete  El.cache[a[i].id || a[i]];
+            }
+        }
+    };
+
+    
+    
+    
+    El.garbageCollect = function(){
+        if(!Roo.enableGarbageCollector){
+            clearInterval(El.collectorThread);
+            return;
+        }
+        for(var  eid  in  El.cache){
+            var  el = El.cache[eid], d = el.dom;
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            if(!d || !d.parentNode || (!d.offsetParent && !document.getElementById(eid))){
+                delete  El.cache[eid];
+                if(d && Roo.enableListenerCollection){
+                    E.purgeElement(d);
+                }
+            }
+        }
+    }
+
+    El.collectorThreadId = setInterval(El.garbageCollect, 30000);
+
+
+    
+    El.Flyweight = function(J){
+        this.dom = J;
+    };
+    El.Flyweight.prototype = El.prototype;
+
+    El._flyweights = {};
+    
+
+    El.fly = function(el, J){
+        J = J || '_global';
+        el = Roo.getDom(el);
+        if(!el){
+            return  null;
+        }
+        if(!El._flyweights[J]){
+            El._flyweights[J] = new  El.Flyweight();
+        }
+
+        El._flyweights[J].dom = el;
+        return  El._flyweights[J];
+    };
+
+    
+
+    Roo.get = El.get;
+    
+
+    Roo.fly = El.fly;
+
+    
+    var  I = Roo.isStrict ? {
+        select:1
+    } : {
+        input:1, select:1, textarea:1
+    };
+    if(Roo.isIE || Roo.isGecko){
+        I['button'] = 1;
+    }
+
+
+
+    Roo.EventManager.on(window, 'unload', function(){
+        delete  El.cache;
+        delete  El._flyweights;
+    });
+})();
+
+
+
+
+if(Roo.DomQuery){
+    Roo.Element.selectorFunction = Roo.DomQuery.select;
+}
+
+
+Roo.Element.select = function(J, K, L){
+    var  M;
+    if(typeof  J == "string"){
+        M = Roo.Element.selectorFunction(J, L);
+    }else  if(J.length !== undefined){
+        M = J;
+    }else {
+        throw  "Invalid selector";
+    }
+    if(K === true){
+        return  new  Roo.CompositeElement(M);
+    }else {
+        return  new  Roo.CompositeElementLite(M);
+    }
+};
+
+
+Roo.select = Roo.Element.select;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Roo.enableFx = true;
+
+
+
+Roo.Fx = {
+       
+
+    slideIn : function(A, o){
+        var  el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+
+            A = A || "t";
+
+            
+            this.fixDisplay();
+
+            
+            var  r = this.getFxRestore();
+            var  b = this.getBox();
+            
+            this.setSize(b);
+
+            
+            var  B = this.fxWrap(r.pos, o, "hidden");
+
+            var  st = this.dom.style;
+            st.visibility = "visible";
+            st.position = "absolute";
+
+            
+            var  C = function(){
+                el.fxUnwrap(B, r.pos, o);
+                st.width = r.width;
+                st.height = r.height;
+                el.afterFx(o);
+            };
+            
+            var  a, pt = {to: [b.x, b.y]}, bw = {to: b.width}, bh = {to: b.height};
+
+            switch(A.toLowerCase()){
+                case  "t":
+                    B.setSize(b.width, 0);
+                    st.left = st.bottom = "0";
+                    a = {height: bh};
+                break;
+                case  "l":
+                    B.setSize(0, b.height);
+                    st.right = st.top = "0";
+                    a = {width: bw};
+                break;
+                case  "r":
+                    B.setSize(0, b.height);
+                    B.setX(b.right);
+                    st.left = st.top = "0";
+                    a = {width: bw, points: pt};
+                break;
+                case  "b":
+                    B.setSize(b.width, 0);
+                    B.setY(b.bottom);
+                    st.left = st.top = "0";
+                    a = {height: bh, points: pt};
+                break;
+                case  "tl":
+                    B.setSize(0, 0);
+                    st.right = st.bottom = "0";
+                    a = {width: bw, height: bh};
+                break;
+                case  "bl":
+                    B.setSize(0, 0);
+                    B.setY(b.y+b.height);
+                    st.right = st.top = "0";
+                    a = {width: bw, height: bh, points: pt};
+                break;
+                case  "br":
+                    B.setSize(0, 0);
+                    B.setXY([b.right, b.bottom]);
+                    st.left = st.top = "0";
+                    a = {width: bw, height: bh, points: pt};
+                break;
+                case  "tr":
+                    B.setSize(0, 0);
+                    B.setX(b.x+b.width);
+                    st.left = st.bottom = "0";
+                    a = {width: bw, height: bh, points: pt};
+                break;
+            }
+
+            this.dom.style.visibility = "visible";
+            B.show();
+
+            arguments.callee.anim = B.fxanim(a,
+                o,
+                'motion',
+                .5,
+                'easeOut', C);
+        });
+        return  this;
+    },
+    
+       
+
+    slideOut : function(B, o){
+        var  el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+
+            B = B || "t";
+
+            
+            var  r = this.getFxRestore();
+            
+            var  b = this.getBox();
+            
+            this.setSize(b);
+
+            
+            var  C = this.fxWrap(r.pos, o, "visible");
+
+            var  st = this.dom.style;
+            st.visibility = "visible";
+            st.position = "absolute";
+
+            C.setSize(b);
+
+            var  D = function(){
+                if(o.useDisplay){
+                    el.setDisplayed(false);
+                }else {
+                    el.hide();
+                }
+
+
+                el.fxUnwrap(C, r.pos, o);
+
+                st.width = r.width;
+                st.height = r.height;
+
+                el.afterFx(o);
+            };
+
+            var  a, E = {to: 0};
+            switch(B.toLowerCase()){
+                case  "t":
+                    st.left = st.bottom = "0";
+                    a = {height: E};
+                break;
+                case  "l":
+                    st.right = st.top = "0";
+                    a = {width: E};
+                break;
+                case  "r":
+                    st.left = st.top = "0";
+                    a = {width: E, points: {to:[b.right, b.y]}};
+                break;
+                case  "b":
+                    st.left = st.top = "0";
+                    a = {height: E, points: {to:[b.x, b.bottom]}};
+                break;
+                case  "tl":
+                    st.right = st.bottom = "0";
+                    a = {width: E, height: E};
+                break;
+                case  "bl":
+                    st.right = st.top = "0";
+                    a = {width: E, height: E, points: {to:[b.x, b.bottom]}};
+                break;
+                case  "br":
+                    st.left = st.top = "0";
+                    a = {width: E, height: E, points: {to:[b.x+b.width, b.bottom]}};
+                break;
+                case  "tr":
+                    st.left = st.bottom = "0";
+                    a = {width: E, height: E, points: {to:[b.right, b.y]}};
+                break;
+            }
+
+
+            arguments.callee.anim = C.fxanim(a,
+                o,
+                'motion',
+                .5,
+                "easeOut", D);
+        });
+        return  this;
+    },
+
+       
+
+    puff : function(o){
+        var  el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+            this.clearOpacity();
+            this.show();
+
+            
+            var  r = this.getFxRestore();
+            var  st = this.dom.style;
+
+            var  C = function(){
+                if(o.useDisplay){
+                    el.setDisplayed(false);
+                }else {
+                    el.hide();
+                }
+
+
+                el.clearOpacity();
+
+                el.setPositioning(r.pos);
+                st.width = r.width;
+                st.height = r.height;
+                st.fontSize = '';
+                el.afterFx(o);
+            };
+
+            var  D = this.getWidth();
+            var  E = this.getHeight();
+
+            arguments.callee.anim = this.fxanim({
+                    width : {to: this.adjustWidth(D * 2)},
+                    height : {to: this.adjustHeight(E * 2)},
+                    points : {by: [-(D * .5), -(E * .5)]},
+                    opacity : {to: 0},
+                    fontSize: {to:200, unit: "%"}
+                },
+                o,
+                'motion',
+                .5,
+                "easeOut", C);
+        });
+        return  this;
+    },
+
+       
+
+    switchOff : function(o){
+        var  el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+            this.clearOpacity();
+            this.clip();
+
+            
+            var  r = this.getFxRestore();
+            var  st = this.dom.style;
+
+            var  C = function(){
+                if(o.useDisplay){
+                    el.setDisplayed(false);
+                }else {
+                    el.hide();
+                }
+
+
+                el.clearOpacity();
+                el.setPositioning(r.pos);
+                st.width = r.width;
+                st.height = r.height;
+
+                el.afterFx(o);
+            };
+
+            this.fxanim({opacity:{to:0.3}}, null, null, .1, null, function(){
+                this.clearOpacity();
+                (function(){
+                    this.fxanim({
+                        height:{to:1},
+                        points:{by:[0, this.getHeight() * .5]}
+                    }, o, 'motion', 0.3, 'easeIn', C);
+                }).defer(100, this);
+            });
+        });
+        return  this;
+    },
+
+    
+       
+    highlight : function(C, o){
+        var  el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+            C = C || "ffff9c";
+            attr = o.attr || "backgroundColor";
+
+            this.clearOpacity();
+            this.show();
+
+            var  D = this.getColor(attr);
+            var  E = this.dom.style[attr];
+            endColor = (o.endColor || D) || "ffffff";
+
+            var  F = function(){
+                el.dom.style[attr] = E;
+                el.afterFx(o);
+            };
+
+            var  a = {};
+            a[attr] = {from: C, to: endColor};
+            arguments.callee.anim = this.fxanim(a,
+                o,
+                'color',
+                1,
+                'easeIn', F);
+        });
+        return  this;
+    },
+
+   
+
+    frame : function(D, E, o){
+        var  el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+            D = D || "#C3DAF9";
+            if(D.length == 6){
+                D = "#" + D;
+            }
+
+            E = E || 1;
+            duration = o.duration || 1;
+            this.show();
+
+            var  b = this.getBox();
+            var  F = function(){
+                var  G = this.createProxy({
+
+                     style:{
+                        visbility:"hidden",
+                        position:"absolute",
+                        "z-index":"35000", 
+                        border:"0px solid " + D
+                     }
+                  });
+                var  H = Roo.isBorderBox ? 2 : 1;
+                G.animate({
+                    top:{from:b.y, to:b.y - 20},
+                    left:{from:b.x, to:b.x - 20},
+                    borderWidth:{from:0, to:10},
+                    opacity:{from:1, to:0},
+                    height:{from:b.height, to:(b.height + (20*H))},
+                    width:{from:b.width, to:(b.width + (20*H))}
+                }, duration, function(){
+                    G.remove();
+                });
+                if(--E > 0){
+                     F.defer((duration/2)*1000, this);
+                }else {
+                    el.afterFx(o);
+                }
+            };
+            F.call(this);
+        });
+        return  this;
+    },
+
+   
+
+    pause : function(F){
+        var  el = this.getFxEl();
+        var  o = {};
+
+        el.queueFx(o, function(){
+            setTimeout(function(){
+                el.afterFx(o);
+            }, F * 1000);
+        });
+        return  this;
+    },
+
+   
+
+    fadeIn : function(o){
+        var  el = this.getFxEl();
+        o = o || {};
+        el.queueFx(o, function(){
+            this.setOpacity(0);
+            this.fixDisplay();
+            this.dom.style.visibility = 'visible';
+            var  to = o.endOpacity || 1;
+            arguments.callee.anim = this.fxanim({opacity:{to:to}},
+                o, null, .5, "easeOut", function(){
+                if(to == 1){
+                    this.clearOpacity();
+                }
+
+                el.afterFx(o);
+            });
+        });
+        return  this;
+    },
+
+   
+
+    fadeOut : function(o){
+        var  el = this.getFxEl();
+        o = o || {};
+        el.queueFx(o, function(){
+            arguments.callee.anim = this.fxanim({opacity:{to:o.endOpacity || 0}},
+                o, null, .5, "easeOut", function(){
+                if(this.visibilityMode == Roo.Element.DISPLAY || o.useDisplay){
+                     this.dom.style.display = "none";
+                }else {
+                     this.dom.style.visibility = "hidden";
+                }
+
+                this.clearOpacity();
+                el.afterFx(o);
+            });
+        });
+        return  this;
+    },
+
+   
+
+    scale : function(w, h, o){
+        this.shift(Roo.apply({}, o, {
+            width: w,
+            height: h
+        }));
+        return  this;
+    },
+
+   
+
+    shift : function(o){
+        var  el = this.getFxEl();
+        o = o || {};
+        el.queueFx(o, function(){
+            var  a = {}, w = o.width, h = o.height, x = o.x, y = o.y,  op = o.opacity;
+            if(w !== undefined){
+                a.width = {to: this.adjustWidth(w)};
+            }
+            if(h !== undefined){
+                a.height = {to: this.adjustHeight(h)};
+            }
+            if(x !== undefined || y !== undefined){
+                a.points = {to: [
+                    x !== undefined ? x : this.getX(),
+                    y !== undefined ? y : this.getY()
+                ]};
+            }
+            if(op !== undefined){
+                a.opacity = {to: op};
+            }
+            if(o.xy !== undefined){
+                a.points = {to: o.xy};
+            }
+
+            arguments.callee.anim = this.fxanim(a,
+                o, 'motion', .35, "easeOut", function(){
+                el.afterFx(o);
+            });
+        });
+        return  this;
+    },
+
+       
+
+    ghost : function(G, o){
+        var  el = this.getFxEl();
+        o = o || {};
+
+        el.queueFx(o, function(){
+            G = G || "b";
+
+            
+            var  r = this.getFxRestore();
+            var  w = this.getWidth(),
+                h = this.getHeight();
+
+            var  st = this.dom.style;
+
+            var  H = function(){
+                if(o.useDisplay){
+                    el.setDisplayed(false);
+                }else {
+                    el.hide();
+                }
+
+
+                el.clearOpacity();
+                el.setPositioning(r.pos);
+                st.width = r.width;
+                st.height = r.height;
+
+                el.afterFx(o);
+            };
+
+            var  a = {opacity: {to: 0}, points: {}}, pt = a.points;
+            switch(G.toLowerCase()){
+                case  "t":
+                    pt.by = [0, -h];
+                break;
+                case  "l":
+                    pt.by = [-w, 0];
+                break;
+                case  "r":
+                    pt.by = [w, 0];
+                break;
+                case  "b":
+                    pt.by = [0, h];
+                break;
+                case  "tl":
+                    pt.by = [-w, -h];
+                break;
+                case  "bl":
+                    pt.by = [-w, h];
+                break;
+                case  "br":
+                    pt.by = [w, h];
+                break;
+                case  "tr":
+                    pt.by = [w, -h];
+                break;
+            }
+
+
+            arguments.callee.anim = this.fxanim(a,
+                o,
+                'motion',
+                .5,
+                "easeOut", H);
+        });
+        return  this;
+    },
+
+       
+
+    syncFx : function(){
+        this.fxDefaults = Roo.apply(this.fxDefaults || {}, {
+            block : false,
+            concurrent : true,
+            stopFx : false
+        });
+        return  this;
+    },
+
+       
+
+    sequenceFx : function(){
+        this.fxDefaults = Roo.apply(this.fxDefaults || {}, {
+            block : false,
+            concurrent : false,
+            stopFx : false
+        });
+        return  this;
+    },
+
+       
+
+    nextFx : function(){
+        var  ef = this.fxQueue[0];
+        if(ef){
+            ef.call(this);
+        }
+    },
+
+       
+
+    hasActiveFx : function(){
+        return  this.fxQueue && this.fxQueue[0];
+    },
+
+       
+
+    stopFx : function(){
+        if(this.hasActiveFx()){
+            var  cur = this.fxQueue[0];
+            if(cur && cur.anim && cur.anim.isAnimated()){
+                this.fxQueue = [cur]; 
+                cur.anim.stop(true);
+            }
+        }
+        return  this;
+    },
+
+       
+
+    beforeFx : function(o){
+        if(this.hasActiveFx() && !o.concurrent){
+           if(o.stopFx){
+               this.stopFx();
+               return  true;
+           }
+           return  false;
+        }
+        return  true;
+    },
+
+       
+
+    hasFxBlock : function(){
+        var  q = this.fxQueue;
+        return  q && q[0] && q[0].block;
+    },
+
+       
+
+    queueFx : function(o, fn){
+        if(!this.fxQueue){
+            this.fxQueue = [];
+        }
+        if(!this.hasFxBlock()){
+            Roo.applyIf(o, this.fxDefaults);
+            if(!o.concurrent){
+                var  run = this.beforeFx(o);
+                fn.block = o.block;
+                this.fxQueue.push(fn);
+                if(run){
+                    this.nextFx();
+                }
+            }else {
+                fn.call(this);
+            }
+        }
+        return  this;
+    },
+
+       
+
+    fxWrap : function(H, o, I){
+        var  J;
+        if(!o.wrap || !(J = Roo.get(o.wrap))){
+            var  wrapXY;
+            if(o.fixPosition){
+                wrapXY = this.getXY();
+            }
+            var  div = document.createElement("div");
+            div.style.visibility = I;
+            J = Roo.get(this.dom.parentNode.insertBefore(div, this.dom));
+            J.setPositioning(H);
+            if(J.getStyle("position") == "static"){
+                J.position("relative");
+            }
+
+            this.clearPositioning('auto');
+            J.clip();
+            J.dom.appendChild(this.dom);
+            if(wrapXY){
+                J.setXY(wrapXY);
+            }
+        }
+        return  J;
+    },
+
+       
+
+    fxUnwrap : function(K, L, o){
+        this.clearPositioning();
+        this.setPositioning(L);
+        if(!o.wrap){
+            K.dom.parentNode.insertBefore(this.dom, K.dom);
+            K.remove();
+        }
+    },
+
+       
+
+    getFxRestore : function(){
+        var  st = this.dom.style;
+        return  {pos: this.getPositioning(), width: st.width, height : st.height};
+    },
+
+       
+
+    afterFx : function(o){
+        if(o.afterStyle){
+            this.applyStyles(o.afterStyle);
+        }
+        if(o.afterCls){
+            this.addClass(o.afterCls);
+        }
+        if(o.remove === true){
+            this.remove();
+        }
+
+        Roo.callback(o.callback, o.scope, [this]);
+        if(!o.concurrent){
+            this.fxQueue.shift();
+            this.nextFx();
+        }
+    },
+
+       
+
+    getFxEl : function(){ 
+        return  Roo.get(this.dom);
+    },
+
+       
+
+    fxanim : function(M, N, O, P, Q, cb){
+        O = O || 'run';
+        N = N || {};
+        var  R = Roo.lib.Anim[O](
+            this.dom, M,
+            (N.duration || P) || .35,
+            (N.easing || Q) || 'easeOut',
+            function(){
+                Roo.callback(cb, this);
+            },
+            this
+        );
+        N.anim = R;
+        return  R;
+    }
+};
+
+
+Roo.Fx.resize = Roo.Fx.scale;
+
+
+
+Roo.apply(Roo.Element.prototype, Roo.Fx);
+
+
+
+
+
+
+Roo.CompositeElement = function(A){
+    this.elements = [];
+    this.addElements(A);
+};
+Roo.CompositeElement.prototype = {
+    isComposite: true,
+    addElements : function(B){
+        if(!B) return  this;
+        if(typeof  B == "string"){
+            B = Roo.Element.selectorFunction(B);
+        }
+        var  C = this.elements;
+        var  D = C.length-1;
+        for(var  i = 0, len = B.length; i < len; i++) {
+               C[++D] = Roo.get(B[i]);
+        }
+        return  this;
+    },
+
+    
+
+    fill : function(E){
+        this.elements = [];
+        this.add(E);
+        return  this;
+    },
+
+    
+
+    filter : function(F){
+        var  G = [];
+        this.each(function(el){
+            if(el.is(F)){
+                G[G.length] = el.dom;
+            }
+        });
+        this.fill(G);
+        return  this;
+    },
+
+    invoke : function(fn, H){
+        var  I = this.elements;
+        for(var  i = 0, len = I.length; i < len; i++) {
+               Roo.Element.prototype[fn].apply(I[i], H);
+        }
+        return  this;
+    },
+    
+
+    add : function(J){
+        if(typeof  J == "string"){
+            this.addElements(Roo.Element.selectorFunction(J));
+        }else  if(J.length !== undefined){
+            this.addElements(J);
+        }else {
+            this.addElements([J]);
+        }
+        return  this;
+    },
+    
+
+    each : function(fn, K){
+        var  L = this.elements;
+        for(var  i = 0, len = L.length; i < len; i++){
+            if(fn.call(K || L[i], L[i], this, i) === false) {
+                break;
+            }
+        }
+        return  this;
+    },
+
+    
+
+    item : function(M){
+        return  this.elements[M] || null;
+    },
+
+    
+
+    first : function(){
+        return  this.item(0);
+    },
+
+    
+
+    last : function(){
+        return  this.item(this.elements.length-1);
+    },
+
+    
+
+    getCount : function(){
+        return  this.elements.length;
+    },
+
+    
+
+    contains : function(el){
+        return  this.indexOf(el) !== -1;
+    },
+
+    
+
+    indexOf : function(el){
+        return  this.elements.indexOf(Roo.get(el));
+    },
+
+
+    
+
+    removeElement : function(el, N){
+        if(el  instanceof  Array){
+            for(var  i = 0, len = el.length; i < len; i++){
+                this.removeElement(el[i]);
+            }
+            return  this;
+        }
+        var  O = typeof  el == 'number' ? el : this.indexOf(el);
+        if(O !== -1){
+            if(N){
+                var  d = this.elements[O];
+                if(d.dom){
+                    d.remove();
+                }else {
+                    d.parentNode.removeChild(d);
+                }
+            }
+
+            this.elements.splice(O, 1);
+        }
+        return  this;
+    },
+
+    
+
+    replaceElement : function(el, P, Q){
+        var  R = typeof  el == 'number' ? el : this.indexOf(el);
+        if(R !== -1){
+            if(Q){
+                this.elements[R].replaceWith(P);
+            }else {
+                this.elements.splice(R, 1, Roo.get(P))
+            }
+        }
+        return  this;
+    },
+
+    
+
+    clear : function(){
+        this.elements = [];
+    }
+};
+(function(){
+    Roo.CompositeElement.createCall = function(S, T){
+        if(!S[T]){
+            S[T] = function(){
+                return  this.invoke(T, arguments);
+            };
+        }
+    };
+    for(var  fnName  in  Roo.Element.prototype){
+        if(typeof  Roo.Element.prototype[fnName] == "function"){
+            Roo.CompositeElement.createCall(Roo.CompositeElement.prototype, fnName);
+        }
+    };
+})();
+
+
+
+
+
+
+Roo.CompositeElementLite = function(A){
+    Roo.CompositeElementLite.superclass.constructor.call(this, A);
+    this.el = new  Roo.Element.Flyweight();
+};
+Roo.extend(Roo.CompositeElementLite, Roo.CompositeElement, {
+    addElements : function(B){
+        if(B){
+            if(B  instanceof  Array){
+                this.elements = this.elements.concat(B);
+            }else {
+                var  yels = this.elements;
+                var  index = yels.length-1;
+                for(var  i = 0, len = B.length; i < len; i++) {
+                    yels[++index] = B[i];
+                }
+            }
+        }
+        return  this;
+    },
+    invoke : function(fn, C){
+        var  D = this.elements;
+        var  el = this.el;
+        for(var  i = 0, len = D.length; i < len; i++) {
+            el.dom = D[i];
+               Roo.Element.prototype[fn].apply(el, C);
+        }
+        return  this;
+    },
+    
+
+    item : function(E){
+        if(!this.elements[E]){
+            return  null;
+        }
+
+        this.el.dom = this.elements[E];
+        return  this.el;
+    },
+
+    
+    addListener : function(F, G, H, I){
+        var  J = this.elements;
+        for(var  i = 0, len = J.length; i < len; i++) {
+            Roo.EventManager.on(J[i], F, G, H || J[i], I);
+        }
+        return  this;
+    },
+
+    
+
+    each : function(fn, K){
+        var  L = this.elements;
+        var  el = this.el;
+        for(var  i = 0, len = L.length; i < len; i++){
+            el.dom = L[i];
+               if(fn.call(K || el, el, this, i) === false){
+                break;
+            }
+        }
+        return  this;
+    },
+
+    indexOf : function(el){
+        return  this.elements.indexOf(Roo.getDom(el));
+    },
+
+    replaceElement : function(el, M, N){
+        var  O = typeof  el == 'number' ? el : this.indexOf(el);
+        if(O !== -1){
+            M = Roo.getDom(M);
+            if(N){
+                var  d = this.elements[O];
+                d.parentNode.insertBefore(M, d);
+                d.parentNode.removeChild(d);
+            }
+
+            this.elements.splice(O, 1, M);
+        }
+        return  this;
+    }
+});
+Roo.CompositeElementLite.prototype.on = Roo.CompositeElementLite.prototype.addListener;
+
+
+
+
+
+
+
+
+Roo.data.Connection = function(A){
+    Roo.apply(this, A);
+    this.addEvents({
+        
+
+        "beforerequest" : true,
+        
+
+        "requestcomplete" : true,
+        
+
+        "requestexception" : true
+    });
+    Roo.data.Connection.superclass.constructor.call(this);
+};
+
+Roo.extend(Roo.data.Connection, Roo.util.Observable, {
+    
+
+    
+
+    
+
+    
+
+    
+
+    timeout : 30000,
+    
+
+    autoAbort:false,
+
+    
+
+    disableCaching: true,
+
+    
+
+    request : function(o){
+        if(this.fireEvent("beforerequest", this, o) !== false){
+            var  p = o.params;
+
+            if(typeof  p == "function"){
+                p = p.call(o.scope||window, o);
+            }
+            if(typeof  p == "object"){
+                p = Roo.urlEncode(o.params);
+            }
+            if(this.extraParams){
+                var  extras = Roo.urlEncode(this.extraParams);
+                p = p ? (p + '&' + extras) : extras;
+            }
+
+            var  url = o.url || this.url;
+            if(typeof  url == 'function'){
+                url = url.call(o.scope||window, o);
+            }
+
+            if(o.form){
+                var  form = Roo.getDom(o.form);
+                url = url || form.action;
+
+                var  enctype = form.getAttribute("enctype");
+                if(o.isUpload || (enctype && enctype.toLowerCase() == 'multipart/form-data')){
+                    return  this.doFormUpload(o, p, url);
+                }
+                var  f = Roo.lib.Ajax.serializeForm(form);
+                p = p ? (p + '&' + f) : f;
+            }
+
+            var  hs = o.headers;
+            if(this.defaultHeaders){
+                hs = Roo.apply(hs || {}, this.defaultHeaders);
+                if(!o.headers){
+                    o.headers = hs;
+                }
+            }
+
+            var  cb = {
+                success: this.handleResponse,
+                failure: this.handleFailure,
+                scope: this,
+                argument: {options: o},
+                timeout : this.timeout
+            };
+
+            var  method = o.method||this.method||(p ? "POST" : "GET");
+
+            if(method == 'GET' && (this.disableCaching && o.disableCaching !== false) || o.disableCaching === true){
+                url += (url.indexOf('?') != -1 ? '&' : '?') + '_dc=' + (new  Date().getTime());
+            }
+
+            if(typeof  o.autoAbort == 'boolean'){ 
+                if(o.autoAbort){
+                    this.abort();
+                }
+            }else  if(this.autoAbort !== false){
+                this.abort();
+            }
+
+            if((method == 'GET' && p) || o.xmlData){
+                url += (url.indexOf('?') != -1 ? '&' : '?') + p;
+                p = '';
+            }
+
+            this.transId = Roo.lib.Ajax.request(method, url, cb, p, o);
+            return  this.transId;
+        }else {
+            Roo.callback(o.callback, o.scope, [o, null, null]);
+            return  null;
+        }
+    },
+
+    
+
+    isLoading : function(B){
+        if(B){
+            return  Roo.lib.Ajax.isCallInProgress(B);
+        }else {
+            return  this.transId ? true : false;
+        }
+    },
+
+    
+
+    abort : function(C){
+        if(C || this.isLoading()){
+            Roo.lib.Ajax.abort(C || this.transId);
+        }
+    },
+
+    
+    handleResponse : function(D){
+        this.transId = false;
+        var  E = D.argument.options;
+        D.argument = E ? E.argument : null;
+        this.fireEvent("requestcomplete", this, D, E);
+        Roo.callback(E.success, E.scope, [D, E]);
+        Roo.callback(E.callback, E.scope, [E, true, D]);
+    },
+
+    
+    handleFailure : function(F, e){
+        this.transId = false;
+        var  G = F.argument.options;
+        F.argument = G ? G.argument : null;
+        this.fireEvent("requestexception", this, F, G, e);
+        Roo.callback(G.failure, G.scope, [F, G]);
+        Roo.callback(G.callback, G.scope, [G, false, F]);
+    },
+
+    
+    doFormUpload : function(o, ps, H){
+        var  id = Roo.id();
+        var  I = document.createElement('iframe');
+        I.id = id;
+        I.name = id;
+        I.className = 'x-hidden';
+        if(Roo.isIE){
+            I.src = Roo.SSL_SECURE_URL;
+        }
+
+        document.body.appendChild(I);
+
+        if(Roo.isIE){
+           document.frames[id].name = id;
+        }
+
+        var  J = Roo.getDom(o.form);
+        J.target = id;
+        J.method = 'POST';
+        J.enctype = J.encoding = 'multipart/form-data';
+        if(H){
+            J.action = H;
+        }
+
+        var  K, hd;
+        if(ps){ 
+            K = [];
+            ps = Roo.urlDecode(ps, false);
+            for(var  k  in  ps){
+                if(ps.hasOwnProperty(k)){
+                    hd = document.createElement('input');
+                    hd.type = 'hidden';
+                    hd.name = k;
+                    hd.value = ps[k];
+                    J.appendChild(hd);
+                    K.push(hd);
+                }
+            }
+        }
+
+        function  cb(){
+            var  r = {  
+                responseText : '',
+                responseXML : null
+            };
+
+            r.argument = o ? o.argument : null;
+
+            try { 
+                var  doc;
+                if(Roo.isIE){
+                    doc = I.contentWindow.document;
+                }else  {
+                    doc = (I.contentDocument || window.frames[id].document);
+                }
+                if(doc && doc.body){
+                    r.responseText = doc.body.innerHTML;
+                }
+                if(doc && doc.XMLDocument){
+                    r.responseXML = doc.XMLDocument;
+                }else  {
+                    r.responseXML = doc;
+                }
+            }
+            catch(e) {
+                
+            }
+
+
+            Roo.EventManager.removeListener(I, 'load', cb, this);
+
+            this.fireEvent("requestcomplete", this, r, o);
+            Roo.callback(o.success, o.scope, [r, o]);
+            Roo.callback(o.callback, o.scope, [o, true, r]);
+
+            setTimeout(function(){document.body.removeChild(I);}, 100);
+        }
+
+
+        Roo.EventManager.on(I, 'load', cb, this);
+        J.submit();
+
+        if(K){ 
+            for(var  i = 0, len = K.length; i < len; i++){
+                J.removeChild(K[i]);
+            }
+        }
+    }
+});
+
+
+
+Roo.Ajax = new  Roo.data.Connection({
+    
+   
+
+    
+
+    
+
+    
+
+    
+
+    
+
+
+    
+
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+
+    
+
+    autoAbort : false,
+
+    
+
+    serializeForm : function(L){
+        return  Roo.lib.Ajax.serializeForm(L);
+    }
+});
+
+
+
+
+Roo.Ajax = new  Roo.data.Connection({
+    
+    
+    
+
+    
+   
+
+    
+
+    
+
+    
+
+    
+
+    
+
+
+    
+
+
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+
+
+    
+
+    autoAbort : false,
+
+    
+
+    serializeForm : function(A){
+        return  Roo.lib.Ajax.serializeForm(A);
+    }
+});
+
+
+
+
+
+Roo.UpdateManager = function(el, A){
+    el = Roo.get(el);
+    if(!A && el.updateManager){
+        return  el.updateManager;
+    }
+
+    
+
+    this.el = el;
+    
+
+    this.defaultUrl = null;
+
+    this.addEvents({
+        
+
+        "beforeupdate": true,
+        
+
+        "update": true,
+        
+
+        "failure": true
+    });
+    var  d = Roo.UpdateManager.defaults;
+    
+
+    this.sslBlankUrl = d.sslBlankUrl;
+    
+
+    this.disableCaching = d.disableCaching;
+    
+
+    this.indicatorText = d.indicatorText;
+    
+
+    this.showLoadIndicator = d.showLoadIndicator;
+    
+
+    this.timeout = d.timeout;
+
+    
+
+    this.loadScripts = d.loadScripts;
+
+    
+
+    this.transaction = null;
+
+    
+
+    this.autoRefreshProcId = null;
+    
+
+    this.refreshDelegate = this.refresh.createDelegate(this);
+    
+
+    this.updateDelegate = this.update.createDelegate(this);
+    
+
+    this.formUpdateDelegate = this.formUpdate.createDelegate(this);
+    
+
+    this.successDelegate = this.processSuccess.createDelegate(this);
+    
+
+    this.failureDelegate = this.processFailure.createDelegate(this);
+
+    if(!this.renderer){
+     
+
+    this.renderer = new  Roo.UpdateManager.BasicRenderer();
+    }
+
+    
+    Roo.UpdateManager.superclass.constructor.call(this);
+};
+
+Roo.extend(Roo.UpdateManager, Roo.util.Observable, {
+    
+
+    getEl : function(){
+        return  this.el;
+    },
+    
+
+    update : function(B, C, D, E){
+        if(this.fireEvent("beforeupdate", this.el, B, C) !== false){
+            var  method = this.method, cfg;
+            if(typeof  B == "object"){ 
+                cfg = B;
+                B = cfg.url;
+                C = C || cfg.params;
+                D = D || cfg.callback;
+                E = E || cfg.discardUrl;
+                if(D && cfg.scope){
+                    D = D.createDelegate(cfg.scope);
+                }
+                if(typeof  cfg.method != "undefined"){method = cfg.method;};
+                if(typeof  cfg.nocache != "undefined"){this.disableCaching = cfg.nocache;};
+                if(typeof  cfg.text != "undefined"){this.indicatorText = '<div class="loading-indicator">'+cfg.text+"</div>";};
+                if(typeof  cfg.scripts != "undefined"){this.loadScripts = cfg.scripts;};
+                if(typeof  cfg.timeout != "undefined"){this.timeout = cfg.timeout;};
+            }
+
+            this.showLoading();
+            if(!E){
+                this.defaultUrl = B;
+            }
+            if(typeof  B == "function"){
+                B = B.call(this);
+            }
+
+
+            method = method || (C ? "POST" : "GET");
+            if(method == "GET"){
+                B = this.prepareUrl(B);
+            }
+
+            var  o = Roo.apply(cfg ||{}, {
+                url : B,
+                params: C,
+                success: this.successDelegate,
+                failure: this.failureDelegate,
+                callback: undefined,
+                timeout: (this.timeout*1000),
+                argument: {"url": B, "form": null, "callback": D, "params": C}
+            });
+
+            this.transaction = Roo.Ajax.request(o);
+        }
+    },
+
+    
+
+    formUpdate : function(F, G, H, I){
+        if(this.fireEvent("beforeupdate", this.el, F, G) !== false){
+            if(typeof  G == "function"){
+                G = G.call(this);
+            }
+
+            F = Roo.getDom(F);
+            this.transaction = Roo.Ajax.request({
+                form: F,
+                url:G,
+                success: this.successDelegate,
+                failure: this.failureDelegate,
+                timeout: (this.timeout*1000),
+                argument: {"url": G, "form": F, "callback": I, "reset": H}
+            });
+            this.showLoading.defer(1, this);
+        }
+    },
+
+    
+
+    refresh : function(J){
+        if(this.defaultUrl == null){
+            return;
+        }
+
+        this.update(this.defaultUrl, null, J, true);
+    },
+
+    
+
+    startAutoRefresh : function(K, L, M, N, O){
+        if(O){
+            this.update(L || this.defaultUrl, M, N, true);
+        }
+        if(this.autoRefreshProcId){
+            clearInterval(this.autoRefreshProcId);
+        }
+
+        this.autoRefreshProcId = setInterval(this.update.createDelegate(this, [L || this.defaultUrl, M, N, true]), K*1000);
+    },
+
+    
+
+     stopAutoRefresh : function(){
+        if(this.autoRefreshProcId){
+            clearInterval(this.autoRefreshProcId);
+            delete  this.autoRefreshProcId;
+        }
+    },
+
+    isAutoRefreshing : function(){
+       return  this.autoRefreshProcId ? true : false;
+    },
+    
+
+    showLoading : function(){
+        if(this.showLoadIndicator){
+            this.el.update(this.indicatorText);
+        }
+    },
+
+    
+
+    prepareUrl : function(P){
+        if(this.disableCaching){
+            var  append = "_dc=" + (new  Date().getTime());
+            if(P.indexOf("?") !== -1){
+                P += "&" + append;
+            }else {
+                P += "?" + append;
+            }
+        }
+        return  P;
+    },
+
+    
+
+    processSuccess : function(Q){
+        this.transaction = null;
+        if(Q.argument.form && Q.argument.reset){
+            try{ 
+                Q.argument.form.reset();
+            }catch(e){}
+        }
+        if(this.loadScripts){
+            this.renderer.render(this.el, Q, this,
+                this.updateComplete.createDelegate(this, [Q]));
+        }else {
+            this.renderer.render(this.el, Q, this);
+            this.updateComplete(Q);
+        }
+    },
+
+    updateComplete : function(R){
+        this.fireEvent("update", this.el, R);
+        if(typeof  R.argument.callback == "function"){
+            R.argument.callback(this.el, true, R);
+        }
+    },
+
+    
+
+    processFailure : function(S){
+        this.transaction = null;
+        this.fireEvent("failure", this.el, S);
+        if(typeof  S.argument.callback == "function"){
+            S.argument.callback(this.el, false, S);
+        }
+    },
+
+    
+
+    setRenderer : function(T){
+        this.renderer = T;
+    },
+
+    getRenderer : function(){
+       return  this.renderer;
+    },
+
+    
+
+    setDefaultUrl : function(U){
+        this.defaultUrl = U;
+    },
+
+    
+
+    abort : function(){
+        if(this.transaction){
+            Roo.Ajax.abort(this.transaction);
+        }
+    },
+
+    
+
+    isUpdating : function(){
+        if(this.transaction){
+            return  Roo.Ajax.isLoading(this.transaction);
+        }
+        return  false;
+    }
+});
+
+
+
+   Roo.UpdateManager.defaults = {
+       
+
+         timeout : 30,
+
+         
+
+        loadScripts : false,
+
+        
+
+        sslBlankUrl : (Roo.SSL_SECURE_URL || "javascript:false"),
+        
+
+        disableCaching : false,
+        
+
+        showLoadIndicator : true,
+        
+
+        indicatorText : '<div class="loading-indicator">Loading...</div>'
+   };
+
+
+
+Roo.UpdateManager.updateElement = function(el, V, W, X){
+    var  um = Roo.get(el, true).getUpdateManager();
+    Roo.apply(um, X);
+    um.update(V, W, X ? X.callback : null);
+};
+
+Roo.UpdateManager.update = Roo.UpdateManager.updateElement;
+
+
+Roo.UpdateManager.BasicRenderer = function(){};
+
+Roo.UpdateManager.BasicRenderer.prototype = {
+    
+
+     render : function(el, Y, Z, a){
+        el.update(Y.responseText, Z.loadScripts, a);
+    }
+};
+
+
+
+
+
+
+Roo.util.DelayedTask = function(fn, A, B){
+    var  id = null, d, t;
+
+    var  C = function(){
+        var  D = new  Date().getTime();
+        if(D - t >= d){
+            clearInterval(id);
+            id = null;
+            fn.apply(A, B || []);
+        }
+    };
+    
+
+    this.delay = function(D, E, F, G){
+        if(id && D != d){
+            this.cancel();
+        }
+
+        d = D;
+        t = new  Date().getTime();
+        fn = E || fn;
+        A = F || A;
+        B = G || B;
+        if(!id){
+            id = setInterval(C, d);
+        }
+    };
+
+    
+
+    this.cancel = function(){
+        if(id){
+            clearInterval(id);
+            id = null;
+        }
+    };
+};
+
+
+Roo.util.TaskRunner = function(A){
+    A = A || 10;
+    var  B = [], C = [];
+    var  id = 0;
+    var  D = false;
+
+    var  E = function(){
+        D = false;
+        clearInterval(id);
+        id = 0;
+    };
+
+    var  F = function(){
+        if(!D){
+            D = true;
+            id = setInterval(H, A);
+        }
+    };
+
+    var  G = function(I){
+        C.push(I);
+        if(I.onStop){
+            I.onStop();
+        }
+    };
+
+    var  H = function(){
+        if(C.length > 0){
+            for(var  i = 0, len = C.length; i < len; i++){
+                B.remove(C[i]);
+            }
+
+            C = [];
+            if(B.length < 1){
+                E();
+                return;
+            }
+        }
+        var  I = new  Date().getTime();
+        for(var  i = 0, len = B.length; i < len; ++i){
+            var  t = B[i];
+            var  itime = I - t.taskRunTime;
+            if(t.interval <= itime){
+                var  rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]);
+                t.taskRunTime = I;
+                if(rt === false || t.taskRunCount === t.repeat){
+                    G(t);
+                    return;
+                }
+            }
+            if(t.duration && t.duration <= (I - t.taskStartTime)){
+                G(t);
+            }
+        }
+    };
+
+    
+
+    this.start = function(I){
+        B.push(I);
+        I.taskStartTime = new  Date().getTime();
+        I.taskRunTime = 0;
+        I.taskRunCount = 0;
+        F();
+        return  I;
+    };
+
+    this.stop = function(I){
+        G(I);
+        return  I;
+    };
+
+    this.stopAll = function(){
+        E();
+        for(var  i = 0, len = B.length; i < len; i++){
+            if(B[i].onStop){
+                B[i].onStop();
+            }
+        }
+
+        B = [];
+        C = [];
+    };
+};
+
+Roo.TaskMgr = new  Roo.util.TaskRunner();
+
+
+
+
+
+Roo.util.MixedCollection = function(A, B){
+    this.items = [];
+    this.map = {};
+    this.keys = [];
+    this.length = 0;
+    this.addEvents({
+        
+
+        "clear" : true,
+        
+
+        "add" : true,
+        
+
+        "replace" : true,
+        
+
+        "remove" : true,
+        "sort" : true
+    });
+    this.allowFunctions = A === true;
+    if(B){
+        this.getKey = B;
+    }
+
+    Roo.util.MixedCollection.superclass.constructor.call(this);
+};
+
+Roo.extend(Roo.util.MixedCollection, Roo.util.Observable, {
+    allowFunctions : false,
+    
+
+
+    add : function(C, o){
+        if(arguments.length == 1){
+            o = arguments[0];
+            C = this.getKey(o);
+        }
+        if(typeof  C == "undefined" || C === null){
+            this.length++;
+            this.items.push(o);
+            this.keys.push(null);
+        }else {
+            var  old = this.map[C];
+            if(old){
+                return  this.replace(C, o);
+            }
+
+            this.length++;
+            this.items.push(o);
+            this.map[C] = o;
+            this.keys.push(C);
+        }
+
+        this.fireEvent("add", this.length-1, o, C);
+        return  o;
+    },
+   
+
+
+    getKey : function(o){
+         return  o.id; 
+    },
+   
+
+
+    replace : function(D, o){
+        if(arguments.length == 1){
+            o = arguments[0];
+            D = this.getKey(o);
+        }
+        var  E = this.item(D);
+        if(typeof  D == "undefined" || D === null || typeof  E == "undefined"){
+             return  this.add(D, o);
+        }
+        var  F = this.indexOfKey(D);
+        this.items[F] = o;
+        this.map[D] = o;
+        this.fireEvent("replace", D, E, o);
+        return  o;
+    },
+   
+
+
+    addAll : function(G){
+        if(arguments.length > 1 || G  instanceof  Array){
+            var  args = arguments.length > 1 ? arguments : G;
+            for(var  i = 0, len = args.length; i < len; i++){
+                this.add(args[i]);
+            }
+        }else {
+            for(var  D  in  G){
+                if(this.allowFunctions || typeof  G[D] != "function"){
+                    this.add(D, G[D]);
+                }
+            }
+        }
+    },
+   
+
+
+    each : function(fn, H){
+        var  I = [].concat(this.items); 
+        for(var  i = 0, len = I.length; i < len; i++){
+            if(fn.call(H || I[i], I[i], i, len) === false){
+                break;
+            }
+        }
+    },
+   
+
+
+    eachKey : function(fn, J){
+        for(var  i = 0, len = this.keys.length; i < len; i++){
+            fn.call(J || window, this.keys[i], this.items[i], i, len);
+        }
+    },
+   
+
+
+    find : function(fn, K){
+        for(var  i = 0, len = this.items.length; i < len; i++){
+            if(fn.call(K || window, this.items[i], this.keys[i])){
+                return  this.items[i];
+            }
+        }
+        return  null;
+    },
+   
+
+
+    insert : function(L, M, o){
+        if(arguments.length == 2){
+            o = arguments[1];
+            M = this.getKey(o);
+        }
+        if(L >= this.length){
+            return  this.add(M, o);
+        }
+
+        this.length++;
+        this.items.splice(L, 0, o);
+        if(typeof  M != "undefined" && M != null){
+            this.map[M] = o;
+        }
+
+        this.keys.splice(L, 0, M);
+        this.fireEvent("add", L, o, M);
+        return  o;
+    },
+   
+
+
+    remove : function(o){
+        return  this.removeAt(this.indexOf(o));
+    },
+   
+
+
+    removeAt : function(N){
+        if(N < this.length && N >= 0){
+            this.length--;
+            var  o = this.items[N];
+            this.items.splice(N, 1);
+            var  M = this.keys[N];
+            if(typeof  M != "undefined"){
+                delete  this.map[M];
+            }
+
+            this.keys.splice(N, 1);
+            this.fireEvent("remove", o, M);
+        }
+    },
+   
+
+
+    removeKey : function(O){
+        return  this.removeAt(this.indexOfKey(O));
+    },
+   
+
+
+    getCount : function(){
+        return  this.length; 
+    },
+   
+
+
+    indexOf : function(o){
+        if(!this.items.indexOf){
+            for(var  i = 0, len = this.items.length; i < len; i++){
+                if(this.items[i] == o) return  i;
+            }
+            return  -1;
+        }else {
+            return  this.items.indexOf(o);
+        }
+    },
+   
+
+
+    indexOfKey : function(P){
+        if(!this.keys.indexOf){
+            for(var  i = 0, len = this.keys.length; i < len; i++){
+                if(this.keys[i] == P) return  i;
+            }
+            return  -1;
+        }else {
+            return  this.keys.indexOf(P);
+        }
+    },
+   
+
+
+    item : function(Q){
+        var  R = typeof  this.map[Q] != "undefined" ? this.map[Q] : this.items[Q];
+        return  typeof  R != 'function' || this.allowFunctions ? R : null; 
+    },
+    
+
+
+    itemAt : function(S){
+        return  this.items[S];
+    },
+    
+
+
+    key : function(T){
+        return  this.map[T];
+    },
+   
+
+
+    contains : function(o){
+        return  this.indexOf(o) != -1;
+    },
+   
+
+
+    containsKey : function(U){
+        return  typeof  this.map[U] != "undefined";
+    },
+   
+
+
+    clear : function(){
+        this.length = 0;
+        this.items = [];
+        this.keys = [];
+        this.map = {};
+        this.fireEvent("clear");
+    },
+   
+
+
+    first : function(){
+        return  this.items[0]; 
+    },
+   
+
+
+    last : function(){
+        return  this.items[this.length-1];   
+    },
+    
+    _sort : function(V, W, fn){
+        var  X = String(W).toUpperCase() == "DESC" ? -1 : 1;
+        fn = fn || function(a, b){
+            return  a-b;
+        };
+        var  c = [], k = this.keys, Y = this.items;
+        for(var  i = 0, len = Y.length; i < len; i++){
+            c[c.length] = {key: k[i], value: Y[i], index: i};
+        }
+
+        c.sort(function(a, b){
+            var  v = fn(a[V], b[V]) * X;
+            if(v == 0){
+                v = (a.index < b.index ? -1 : 1);
+            }
+            return  v;
+        });
+        for(var  i = 0, len = c.length; i < len; i++){
+            Y[i] = c[i].value;
+            k[i] = c[i].key;
+        }
+
+        this.fireEvent("sort", this);
+    },
+    
+    
+
+    sort : function(Z, fn){
+        this._sort("value", Z, fn);
+    },
+    
+    
+
+    keySort : function(a, fn){
+        this._sort("key", a, fn || function(a, b){
+            return  String(a).toUpperCase()-String(b).toUpperCase();
+        });
+    },
+    
+    
+
+    getRange : function(b, d){
+        var  e = this.items;
+        if(e.length < 1){
+            return  [];
+        }
+
+        b = b || 0;
+        d = Math.min(typeof  d == "undefined" ? this.length-1 : d, this.length-1);
+        var  r = [];
+        if(b <= d){
+            for(var  i = b; i <= d; i++) {
+                   r[r.length] = e[i];
+            }
+        }else {
+            for(var  i = b; i >= d; i--) {
+                   r[r.length] = e[i];
+            }
+        }
+        return  r;
+    },
+        
+    
+
+    filter : function(f, g){
+        if(!g.exec){ 
+            g = String(g);
+            if(g.length == 0){
+                return  this.clone();
+            }
+
+            g = new  RegExp("^" + Roo.escapeRe(g), "i");
+        }
+        return  this.filterBy(function(o){
+            return  o && g.test(o[f]);
+        });
+       },
+    
+    
+
+    filterBy : function(fn, h){
+        var  r = new  Roo.util.MixedCollection();
+        r.getKey = this.getKey;
+        var  k = this.keys, it = this.items;
+        for(var  i = 0, len = it.length; i < len; i++){
+            if(fn.call(h||this, it[i], k[i])){
+                               r.add(k[i], it[i]);
+                       }
+        }
+        return  r;
+    },
+    
+    
+
+    clone : function(){
+        var  r = new  Roo.util.MixedCollection();
+        var  k = this.keys, it = this.items;
+        for(var  i = 0, len = it.length; i < len; i++){
+            r.add(k[i], it[i]);
+        }
+
+        r.getKey = this.getKey;
+        return  r;
+    }
+});
+
+
+Roo.util.MixedCollection.prototype.get = Roo.util.MixedCollection.prototype.item;
+
+
+
+
+Roo.util.JSON = new  (function(){
+    var  useHasOwn = {}.hasOwnProperty ? true : false;
+    
+    
+    
+    
+    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()) + '"';
+    };
+    
+    
+
+    this.encode = function(o){
+        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("");
+        }
+    };
+    
+    
+
+    this.decode = function(json){
+        
+
+        return  eval("(" + json + ')');
+    };
+})();
+
+
+Roo.encode = Roo.util.JSON.encode;
+
+
+Roo.decode = Roo.util.JSON.decode;
+
+
+
+
+
+Roo.util.Format = function(){
+    var  A = /^\s+|\s+$/g;
+    return  {
+        
+
+        ellipsis : function(R, S){
+            if(R && R.length > S){
+                return  R.substr(0, S-3)+"...";
+            }
+            return  R;
+        },
+
+        
+
+        undef : function(T){
+            return  typeof  T != "undefined" ? T : "";
+        },
+
+        
+
+        htmlEncode : function(U){
+            return  !U ? U : String(U).replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
+        },
+
+        
+
+        htmlDecode : function(V){
+            return  !V ? V : String(V).replace(/&amp;/g, "&").replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&quot;/g, '"');
+        },
+
+        
+
+        trim : function(W){
+            return  String(W).replace(A, "");
+        },
+
+        
+
+        substr : function(X, Y, Z){
+            return  String(X).substr(Y, Z);
+        },
+
+        
+
+        lowercase : function(a){
+            return  String(a).toLowerCase();
+        },
+
+        
+
+        uppercase : function(b){
+            return  String(b).toUpperCase();
+        },
+
+        
+
+        capitalize : function(c){
+            return  !c ? c : c.charAt(0).toUpperCase() + c.substr(1).toLowerCase();
+        },
+
+        
+        call : function(value, fn){
+            if(arguments.length > 2){
+                var  args = Array.prototype.slice.call(arguments, 2);
+                args.unshift(value);
+                 
+                return  
+  eval(fn).apply(window, args);
+            }else {
+                
+
+                return  
+ eval(fn).call(window, value);
+            }
+        },
+
+        
+
+        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  d = ps[0];
+            var  e = ps[1] ? '.'+ ps[1] : '.00';
+            var  r = /(\d+)(\d{3})/;
+            while (r.test(d)) {
+                d = d.replace(r, '$1' + ',' + '$2');
+            }
+            return  "$" + d + e ;
+        },
+
+        
+
+        date : function(v, f){
+            if(!v){
+                return  "";
+            }
+            if(!(v  instanceof  Date)){
+                v = new  Date(Date.parse(v));
+            }
+            return  v.dateFormat(f || "m/d/Y");
+        },
+
+        
+
+        dateRenderer : function(g){
+            return  function(v){
+                return  Roo.util.Format.date(v, g);  
+            };
+        },
+
+        
+        stripTagsRE : /<\/?[^>]+>/gi,
+        
+        
+
+        stripTags : function(v){
+            return  !v ? v : String(v).replace(this.stripTagsRE, "");
+        }
+    };
+}();
+
+
+
+
+
+
+
+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  A = 0;
+    while(m = re.exec(this.html)){
+        var  name = m[1], content = m[2];
+        st[A] = {
+            name: name,
+            index: A,
+            buffer: [],
+            tpl : new  Roo.Template(content)
+        };
+        if(name){
+            st[name] = st[A];
+        }
+
+        st[A].tpl.compile();
+        st[A].tpl.call = this.call.createDelegate(this);
+        A++;
+    }
+
+    this.subCount = A;
+    this.subs = st;
+};
+Roo.extend(Roo.MasterTemplate, Roo.Template, {
+    
+
+    subTemplateRe : /<tpl(?:\sname="([\w-]+)")?>((?:.|\n)*?)<\/tpl>/gi,
+
+    
+
+     add : function(B, C){
+        if(arguments.length == 1){
+            C = arguments[0];
+            B = 0;
+        }
+        var  s = this.subs[B];
+        s.buffer[s.buffer.length] = s.tpl.apply(C);
+        return  this;
+    },
+
+    
+
+    fill : function(D, E, F){
+        var  a = arguments;
+        if(a.length == 1 || (a.length == 2 && typeof  a[1] == "boolean")){
+            E = a[0];
+            D = 0;
+            F = a[1];
+        }
+        if(F){
+            this.reset();
+        }
+        for(var  i = 0, len = E.length; i < len; i++){
+            this.add(D, E[i]);
+        }
+        return  this;
+    },
+
+    
+
+     reset : function(){
+        var  s = this.subs;
+        for(var  i = 0; i < this.subCount; i++){
+            s[i].buffer = [];
+        }
+        return  this;
+    },
+
+    applyTemplate : function(G){
+        var  s = this.subs;
+        var  H = -1;
+        this.html = this.originalHtml.replace(this.subTemplateRe, function(m, I){
+            return  s[++H].buffer.join("");
+        });
+        return  Roo.MasterTemplate.superclass.applyTemplate.call(this, G);
+    },
+
+    apply : function(){
+        return  this.applyTemplate.apply(this, arguments);
+    },
+
+    compile : function(){return  this;}
+});
+
+
+
+Roo.MasterTemplate.prototype.addAll = Roo.MasterTemplate.prototype.fill;
+
+Roo.MasterTemplate.from = function(el, I){
+    el = Roo.getDom(el);
+    return  new  Roo.MasterTemplate(el.value || el.innerHTML, I || '');
+};
+
+
+
+
+
+Roo.util.CSS = function(){
+       var  A = null;
+       var  B = document;
+
+    var  C = /(-[a-z])/gi;
+    var  D = function(m, a){ return  a.charAt(1).toUpperCase(); };
+
+   return  {
+   
+
+    createStyleSheet : function(Q, id){
+        var  ss;
+        var  R = B.getElementsByTagName("head")[0];
+        var  S = B.createElement("style");
+        S.setAttribute("type", "text/css");
+        if(id){
+            S.setAttribute("id", id);
+        }
+        if (typeof(Q) != 'string') {
+            
+            
+            
+            
+            var  cssTextNew = [];
+            for(var  n  in  Q) {
+                var  citems = [];
+                for(var  k  in  Q[n]) {
+                    citems.push( k + ' : ' +Q[n][k] + ';' );
+                }
+
+                cssTextNew.push( n + ' { ' + citems.join(' ') + '} ');
+                
+            }
+
+            Q = cssTextNew.join("\n");
+            
+        }
+       
+       
+       if(Roo.isIE){
+           R.appendChild(S);
+           ss = S.styleSheet;
+           ss.cssText = Q;
+       }else {
+           try{
+                S.appendChild(B.createTextNode(Q));
+           }catch(e){
+               S.cssText = Q; 
+           }
+
+           R.appendChild(S);
+           ss = S.styleSheet ? S.styleSheet : (S.sheet || B.styleSheets[B.styleSheets.length-1]);
+       }
+
+       this.cacheStyleSheet(ss);
+       return  ss;
+   },
+
+   
+
+   removeStyleSheet : function(id){
+       var  T = B.getElementById(id);
+       if(T){
+           T.parentNode.removeChild(T);
+       }
+   },
+
+   
+
+   swapStyleSheet : function(id, U){
+       this.removeStyleSheet(id);
+       var  ss = B.createElement("link");
+       ss.setAttribute("rel", "stylesheet");
+       ss.setAttribute("type", "text/css");
+       ss.setAttribute("id", id);
+       ss.setAttribute("href", U);
+       B.getElementsByTagName("head")[0].appendChild(ss);
+   },
+   
+   
+
+   refreshCache : function(){
+       return  this.getRules(true);
+   },
+
+   
+   cacheStyleSheet : function(V){
+       if(!S){
+           S = {};
+       }
+       try{
+           var  ssRules = V.cssRules || V.rules;
+           for(var  j = ssRules.length-1; j >= 0; --j){
+               S[ssRules[j].selectorText] = ssRules[j];
+           }
+       }catch(e){}
+   },
+   
+   
+
+   getRules : function(W){
+               if(S == null || W){
+                       S = {};
+                       var  ds = B.styleSheets;
+                       for(var  i =0, len = ds.length; i < len; i++){
+                           try{
+                       this.cacheStyleSheet(ds[i]);
+                   }catch(e){} 
+               }
+               }
+               return  S;
+       },
+       
+       
+
+   getRule : function(X, Y){
+               var  rs = this.getRules(Y);
+               if(!(X  instanceof  Array)){
+                   return  rs[X];
+               }
+               for(var  i = 0; i < X.length; i++){
+                       if(rs[X[i]]){
+                               return  rs[X[i]];
+                       }
+               }
+               return  null;
+       },
+       
+       
+       
+
+   updateRule : function(Z, a, b){
+               if(!(Z  instanceof  Array)){
+                       var  rule = this.getRule(Z);
+                       if(rule){
+                               rule.style[a.replace(C, D)] = b;
+                               return  true;
+                       }
+               }else {
+                       for(var  i = 0; i < Z.length; i++){
+                               if(this.updateRule(Z[i], a, b)){
+                                       return  true;
+                               }
+                       }
+               }
+               return  false;
+       }
+   };  
+}();
+
+
+
+
+
+
+Roo.util.ClickRepeater = function(el, A)
+{
+    this.el = Roo.get(el);
+    this.el.unselectable();
+
+    Roo.apply(this, A);
+
+    this.addEvents({
+    
+
+        "mousedown" : true,
+    
+
+        "click" : true,
+    
+
+        "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);
+    }
+
+    
+    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,
+
+    
+    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);
+    },
+
+    
+    click : function(){
+        this.fireEvent("click", this);
+        this.timer = this.click.defer(this.getInterval(), this);
+    },
+
+    
+    getInterval: function(){
+        if(!this.accelerate){
+            return  this.interval;
+        }
+        var  B = this.mousedownTime.getElapsed();
+        if(B < 500){
+            return  400;
+        }else  if(B < 1700){
+            return  320;
+        }else  if(B < 2600){
+            return  250;
+        }else  if(B < 3500){
+            return  180;
+        }else  if(B < 4400){
+            return  140;
+        }else  if(B < 5300){
+            return  80;
+        }else  if(B < 6200){
+            return  50;
+        }else {
+            return  10;
+        }
+    },
+
+    
+    handleMouseOut : function(){
+        clearTimeout(this.timer);
+        if(this.pressClass){
+            this.el.removeClass(this.pressClass);
+        }
+
+        this.el.on("mouseover", this.handleMouseReturn, this);
+    },
+
+    
+    handleMouseReturn : function(){
+        this.el.un("mouseover", this.handleMouseReturn);
+        if(this.pressClass){
+            this.el.addClass(this.pressClass);
+        }
+
+        this.click();
+    },
+
+    
+    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);
+    }
+});
+
+
+
+
+
+Roo.KeyNav = function(el, A){
+    this.el = Roo.get(el);
+    Roo.apply(this, A);
+    if(!this.disabled){
+        this.disabled = true;
+        this.enable();
+    }
+};
+
+Roo.KeyNav.prototype = {
+    
+
+    disabled : false,
+    
+
+    defaultEventAction: "stopEvent",
+    
+
+    forceKeyDown : false,
+
+    
+    prepareEvent : function(e){
+        var  k = e.getKey();
+        var  h = this.keyToHandler[k];
+        
+        
+        
+        if(Roo.isSafari && h && k >= 37 && k <= 40){
+            e.stopEvent();
+        }
+    },
+
+    
+    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]();
+            }
+        }
+    },
+
+    
+    doRelay : function(e, h, B){
+        return  h.call(this.scope || this, e);
+    },
+
+    
+    enter : false,
+    left : false,
+    right : false,
+    up : false,
+    down : false,
+    tab : false,
+    esc : false,
+    pageUp : false,
+    pageDown : false,
+    del : false,
+    home : false,
+    end : false,
+
+    
+    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: function(){
+               if(this.disabled){
+            
+            
+            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: 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;
+               }
+       }
+};
+
+
+
+
+
+Roo.KeyMap = function(el, A, B){
+    this.el  = Roo.get(el);
+    this.eventName = B || "keydown";
+    this.bindings = [];
+    if(A){
+        this.addBinding(A);
+    }
+
+    this.enable();
+};
+
+Roo.KeyMap.prototype = {
+    
+
+    stopEvent : false,
+
+    
+
+       addBinding : function(C){
+        if(C  instanceof  Array){
+            for(var  i = 0, len = C.length; i < len; i++){
+                this.addBinding(C[i]);
+            }
+            return;
+        }
+        var  D = C.key,
+            E = C.shift, 
+            F = C.ctrl, 
+            G = C.alt,
+            fn = C.fn,
+            H = C.scope;
+        if(typeof  D == "string"){
+            var  ks = [];
+            var  keyString = D.toUpperCase();
+            for(var  j = 0, len = keyString.length; j < len; j++){
+                ks.push(keyString.charCodeAt(j));
+            }
+
+            D = ks;
+        }
+        var  I = D  instanceof  Array;
+        var  J = function(e){
+            if((!E || e.shiftKey) && (!F || e.ctrlKey) &&  (!G || e.altKey)){
+                var  k = e.getKey();
+                if(I){
+                    for(var  i = 0, len = D.length; i < len; i++){
+                        if(D[i] == k){
+                          if(this.stopEvent){
+                              e.stopEvent();
+                          }
+
+                          fn.call(H || window, k, e);
+                          return;
+                        }
+                    }
+                }else {
+                    if(k == D){
+                        if(this.stopEvent){
+                           e.stopEvent();
+                        }
+
+                        fn.call(H || window, k, e);
+                    }
+                }
+            }
+        };
+        this.bindings.push(J);  
+       },
+
+    
+
+    on : function(K, fn, L){
+        var  M, N, O, P;
+        if(typeof  K == "object" && !(K  instanceof  Array)){
+            M = K.key;
+            N = K.shift;
+            O = K.ctrl;
+            P = K.alt;
+        }else {
+            M = K;
+        }
+
+        this.addBinding({
+            key: M,
+            shift: N,
+            ctrl: O,
+            alt: P,
+            fn: fn,
+            scope: L
+        })
+    },
+
+    
+    handleKeyDown : function(e){
+           if(this.enabled){ 
+           var  b = this.bindings;
+           for(var  i = 0, len = b.length; i < len; i++){
+               b[i].call(this, e);
+           }
+           }
+       },
+       
+       
+
+       isEnabled : function(){
+           return  this.enabled;  
+       },
+       
+       
+
+       enable: function(){
+               if(!this.enabled){
+                   this.el.on(this.eventName, this.handleKeyDown, this);
+                   this.enabled = true;
+               }
+       },
+
+       
+
+       disable: function(){
+               if(this.enabled){
+                   this.el.removeListener(this.eventName, this.handleKeyDown, this);
+                   this.enabled = false;
+               }
+       }
+};
+
+
+
+
+
+Roo.util.TextMetrics = function(){
+    var  A;
+    return  {
+        
+
+        measure : function(el, E, F){
+            if(!A){
+                A = Roo.util.TextMetrics.Instance(el, F);
+            }
+
+            A.bind(el);
+            A.setFixedWidth(F || 'auto');
+            return  A.getSize(E);
+        },
+
+        
+
+        createInstance : function(el, G){
+            return  Roo.util.TextMetrics.Instance(el, G);
+        }
+    };
+}();
+
+
+Roo.util.TextMetrics.Instance = function(B, C){
+    var  ml = new  Roo.Element(document.createElement('div'));
+    document.body.appendChild(ml.dom);
+    ml.position('absolute');
+    ml.setLeftTop(-1000, -1000);
+    ml.hide();
+
+    if(C){
+        ml.setWidth(C);
+    }
+     
+    var  D = {
+        
+
+        getSize : function(E){
+            ml.update(E);
+            var  s = ml.getSize();
+            ml.update('');
+            return  s;
+        },
+
+        
+
+        bind : function(el){
+            ml.setStyle(
+                Roo.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height')
+            );
+        },
+
+        
+
+        setFixedWidth : function(F){
+            ml.setWidth(F);
+        },
+
+        
+
+        getWidth : function(G){
+            ml.dom.style.width = 'auto';
+            return  this.getSize(G).width;
+        },
+
+        
+
+        getHeight : function(H){
+            return  this.getSize(H).height;
+        }
+    };
+
+    D.bind(B);
+
+    return  D;
+};
+
+
+Roo.Element.measureText = Roo.util.TextMetrics.measure;
+
+
+
+
+
+Roo.state.Provider = function(){
+    
+
+    this.addEvents({
+        "statechange": true
+    });
+    this.state = {};
+    Roo.state.Provider.superclass.constructor.call(this);
+};
+Roo.extend(Roo.state.Provider, Roo.util.Observable, {
+    
+
+    get : function(A, B){
+        return  typeof  this.state[A] == "undefined" ?
+            B : this.state[A];
+    },
+    
+    
+
+    clear : function(C){
+        delete  this.state[C];
+        this.fireEvent("statechange", this, C, null);
+    },
+    
+    
+
+    set : function(D, E){
+        this.state[D] = E;
+        this.fireEvent("statechange", this, D, E);
+    },
+    
+    
+
+    decodeValue : function(F){
+        var  re = /^(a|n|d|b|s|o)\:(.*)$/;
+        var  G = re.exec(unescape(F));
+        if(!G || !G[1]) return; 
+        var  H = G[1];
+        var  v = G[2];
+        switch(H){
+            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;
+        }
+    },
+    
+    
+
+    encodeValue : function(v){
+        var  I;
+        if(typeof  v == "number"){
+            I = "n:" + v;
+        }else  if(typeof  v == "boolean"){
+            I = "b:" + (v ? "1" : "0");
+        }else  if(v  instanceof  Date){
+            I = "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 += "^";
+            }
+
+            I = "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]) + "^";
+                }
+            }
+
+            I = "o:" + flat.substring(0, flat.length-1);
+        }else {
+            I = "s:" + v;
+        }
+        return  escape(I);        
+    }
+});
+
+
+
+
+
+
+Roo.state.Manager = function(){
+    var  A = new  Roo.state.Provider();
+    
+    return  {
+        
+
+        setProvider : function(H){
+            A = H;
+        },
+        
+        
+
+        get : function(I, J){
+            return  A.get(I, J);
+        },
+        
+        
+
+         set : function(K, L){
+            A.set(K, L);
+        },
+        
+        
+
+        clear : function(M){
+            A.clear(M);
+        },
+        
+        
+
+        getProvider : function(){
+            return  A;
+        }
+    };
+}();
+
+
+
+
+
+Roo.state.CookieProvider = function(A){
+    Roo.state.CookieProvider.superclass.constructor.call(this);
+    this.path = "/";
+    this.expires = new  Date(new  Date().getTime()+(1000*60*60*24*7)); 
+    this.domain = null;
+    this.secure = false;
+    Roo.apply(this, A);
+    this.state = this.readCookies();
+};
+
+Roo.extend(Roo.state.CookieProvider, Roo.state.Provider, {
+    
+    set : function(B, C){
+        if(typeof  C == "undefined" || C === null){
+            this.clear(B);
+            return;
+        }
+
+        this.setCookie(B, C);
+        Roo.state.CookieProvider.superclass.set.call(this, B, C);
+    },
+
+    
+    clear : function(D){
+        this.clearCookie(D);
+        Roo.state.CookieProvider.superclass.clear.call(this, D);
+    },
+
+    
+    readCookies : function(){
+        var  E = {};
+        var  c = document.cookie + ";";
+        var  re = /\s?(.*?)=(.*?);/g;
+       var  F;
+       while((F = re.exec(c)) != null){
+            var  D = F[1];
+            var  C = F[2];
+            if(D && D.substring(0,3) == "ys-"){
+                E[D.substr(3)] = this.decodeValue(C);
+            }
+        }
+        return  E;
+    },
+
+    
+    setCookie : function(G, H){
+        document.cookie = "ys-"+ G + "=" + this.encodeValue(H) +
+           ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) +
+           ((this.path == null) ? "" : ("; path=" + this.path)) +
+           ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
+           ((this.secure == true) ? "; secure" : "");
+    },
+
+    
+    clearCookie : function(I){
+        document.cookie = "ys-" + I + "=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" : "");
+    }
+});