Upgrade to ExtJS 3.3.1 - Released 11/30/2010
[extjs.git] / ext-all-debug.js
index 072ce1c..00231c8 100644 (file)
-/*\r
- * Ext JS Library 2.2.1\r
- * Copyright(c) 2006-2009, Ext JS, LLC.\r
- * licensing@extjs.com\r
- * \r
- * http://extjs.com/license\r
- */\r
-\r
-\r
-Ext.DomHelper = function(){\r
-    var tempTableEl = null;\r
-    var emptyTags = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;\r
-    var tableRe = /^table|tbody|tr|td$/i;\r
-\r
-    // build as innerHTML where available\r
-    var createHtml = function(o){\r
-        if(typeof o == 'string'){\r
-            return o;\r
-        }\r
-        var b = "";\r
-        if (Ext.isArray(o)) {\r
-            for (var i = 0, l = o.length; i < l; i++) {\r
-                b += createHtml(o[i]);\r
-            }\r
-            return b;\r
-        }\r
-        if(!o.tag){\r
-            o.tag = "div";\r
-        }\r
-        b += "<" + o.tag;\r
-        for(var attr in o){\r
-            if(attr == "tag" || attr == "children" || attr == "cn" || attr == "html" || typeof o[attr] == "function") continue;\r
-            if(attr == "style"){\r
-                var s = o["style"];\r
-                if(typeof s == "function"){\r
-                    s = s.call();\r
-                }\r
-                if(typeof s == "string"){\r
-                    b += ' style="' + s + '"';\r
-                }else if(typeof s == "object"){\r
-                    b += ' style="';\r
-                    for(var key in s){\r
-                        if(typeof s[key] != "function"){\r
-                            b += key + ":" + s[key] + ";";\r
-                        }\r
-                    }\r
-                    b += '"';\r
-                }\r
-            }else{\r
-                if(attr == "cls"){\r
-                    b += ' class="' + o["cls"] + '"';\r
-                }else if(attr == "htmlFor"){\r
-                    b += ' for="' + o["htmlFor"] + '"';\r
-                }else{\r
-                    b += " " + attr + '="' + o[attr] + '"';\r
-                }\r
-            }\r
-        }\r
-        if(emptyTags.test(o.tag)){\r
-            b += "/>";\r
-        }else{\r
-            b += ">";\r
-            var cn = o.children || o.cn;\r
-            if(cn){\r
-                b += createHtml(cn);\r
-            } else if(o.html){\r
-                b += o.html;\r
-            }\r
-            b += "</" + o.tag + ">";\r
-        }\r
-        return b;\r
-    };\r
-\r
-    // build as dom\r
-    \r
-    var createDom = function(o, parentNode){\r
-        var el;\r
-        if (Ext.isArray(o)) {                       // Allow Arrays of siblings to be inserted\r
-            el = document.createDocumentFragment(); // in one shot using a DocumentFragment\r
-            for(var i = 0, l = o.length; i < l; i++) {\r
-                createDom(o[i], el);\r
-            }\r
-        } else if (typeof o == "string") {         // Allow a string as a child spec.\r
-            el = document.createTextNode(o);\r
-        } else {\r
-            el = document.createElement(o.tag||'div');\r
-            var useSet = !!el.setAttribute; // In IE some elements don't have setAttribute\r
-            for(var attr in o){\r
-                if(attr == "tag" || attr == "children" || attr == "cn" || attr == "html" || attr == "style" || typeof o[attr] == "function") continue;\r
-                if(attr=="cls"){\r
-                    el.className = o["cls"];\r
-                }else{\r
-                    if(useSet) el.setAttribute(attr, o[attr]);\r
-                    else el[attr] = o[attr];\r
-                }\r
-            }\r
-            Ext.DomHelper.applyStyles(el, o.style);\r
-            var cn = o.children || o.cn;\r
-            if(cn){\r
-                createDom(cn, el);\r
-            } else if(o.html){\r
-                el.innerHTML = o.html;\r
-            }\r
-        }\r
-        if(parentNode){\r
-           parentNode.appendChild(el);\r
-        }\r
-        return el;\r
-    };\r
-\r
-    var ieTable = function(depth, s, h, e){\r
-        tempTableEl.innerHTML = [s, h, e].join('');\r
-        var i = -1, el = tempTableEl;\r
-        while(++i < depth){\r
-            el = el.firstChild;\r
-        }\r
-        return el;\r
-    };\r
-\r
-    // kill repeat to save bytes\r
-    var ts = '<table>',\r
-        te = '</table>',\r
-        tbs = ts+'<tbody>',\r
-        tbe = '</tbody>'+te,\r
-        trs = tbs + '<tr>',\r
-        tre = '</tr>'+tbe;\r
-\r
-    \r
-    var insertIntoTable = function(tag, where, el, html){\r
-        if(!tempTableEl){\r
-            tempTableEl = document.createElement('div');\r
-        }\r
-        var node;\r
-        var before = null;\r
-        if(tag == 'td'){\r
-            if(where == 'afterbegin' || where == 'beforeend'){ // INTO a TD\r
-                return;\r
-            }\r
-            if(where == 'beforebegin'){\r
-                before = el;\r
-                el = el.parentNode;\r
-            } else{\r
-                before = el.nextSibling;\r
-                el = el.parentNode;\r
-            }\r
-            node = ieTable(4, trs, html, tre);\r
-        }\r
-        else if(tag == 'tr'){\r
-            if(where == 'beforebegin'){\r
-                before = el;\r
-                el = el.parentNode;\r
-                node = ieTable(3, tbs, html, tbe);\r
-            } else if(where == 'afterend'){\r
-                before = el.nextSibling;\r
-                el = el.parentNode;\r
-                node = ieTable(3, tbs, html, tbe);\r
-            } else{ // INTO a TR\r
-                if(where == 'afterbegin'){\r
-                    before = el.firstChild;\r
-                }\r
-                node = ieTable(4, trs, html, tre);\r
-            }\r
-        } else if(tag == 'tbody'){\r
-            if(where == 'beforebegin'){\r
-                before = el;\r
-                el = el.parentNode;\r
-                node = ieTable(2, ts, html, te);\r
-            } else if(where == 'afterend'){\r
-                before = el.nextSibling;\r
-                el = el.parentNode;\r
-                node = ieTable(2, ts, html, te);\r
-            } else{\r
-                if(where == 'afterbegin'){\r
-                    before = el.firstChild;\r
-                }\r
-                node = ieTable(3, tbs, html, tbe);\r
-            }\r
-        } else{ // TABLE\r
-            if(where == 'beforebegin' || where == 'afterend'){ // OUTSIDE the table\r
-                return;\r
-            }\r
-            if(where == 'afterbegin'){\r
-                before = el.firstChild;\r
-            }\r
-            node = ieTable(2, ts, html, te);\r
-        }\r
-        el.insertBefore(node, before);\r
-        return node;\r
-    };\r
-\r
-\r
-    return {\r
-    \r
-    useDom : false,\r
-\r
-    \r
-    markup : function(o){\r
-        return createHtml(o);\r
-    },\r
-\r
-    \r
-    applyStyles : function(el, styles){\r
-        if(styles){\r
-           el = Ext.fly(el);\r
-           if(typeof styles == "string"){\r
-               var re = /\s?([a-z\-]*)\:\s?([^;]*);?/gi;\r
-               var matches;\r
-               while ((matches = re.exec(styles)) != null){\r
-                   el.setStyle(matches[1], matches[2]);\r
-               }\r
-           }else if (typeof styles == "object"){\r
-               for (var style in styles){\r
-                  el.setStyle(style, styles[style]);\r
-               }\r
-           }else if (typeof styles == "function"){\r
-                Ext.DomHelper.applyStyles(el, styles.call());\r
-           }\r
-        }\r
-    },\r
-\r
-    \r
-    insertHtml : function(where, el, html){\r
-        where = where.toLowerCase();\r
-        if(el.insertAdjacentHTML){\r
-            if(tableRe.test(el.tagName)){\r
-                var rs;\r
-                if(rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html)){\r
-                    return rs;\r
-                }\r
-            }\r
-            switch(where){\r
-                case "beforebegin":\r
-                    el.insertAdjacentHTML('BeforeBegin', html);\r
-                    return el.previousSibling;\r
-                case "afterbegin":\r
-                    el.insertAdjacentHTML('AfterBegin', html);\r
-                    return el.firstChild;\r
-                case "beforeend":\r
-                    el.insertAdjacentHTML('BeforeEnd', html);\r
-                    return el.lastChild;\r
-                case "afterend":\r
-                    el.insertAdjacentHTML('AfterEnd', html);\r
-                    return el.nextSibling;\r
-            }\r
-            throw 'Illegal insertion point -> "' + where + '"';\r
-        }\r
-        var range = el.ownerDocument.createRange();\r
-        var frag;\r
-        switch(where){\r
-             case "beforebegin":\r
-                range.setStartBefore(el);\r
-                frag = range.createContextualFragment(html);\r
-                el.parentNode.insertBefore(frag, el);\r
-                return el.previousSibling;\r
-             case "afterbegin":\r
-                if(el.firstChild){\r
-                    range.setStartBefore(el.firstChild);\r
-                    frag = range.createContextualFragment(html);\r
-                    el.insertBefore(frag, el.firstChild);\r
-                    return el.firstChild;\r
-                }else{\r
-                    el.innerHTML = html;\r
-                    return el.firstChild;\r
-                }\r
-            case "beforeend":\r
-                if(el.lastChild){\r
-                    range.setStartAfter(el.lastChild);\r
-                    frag = range.createContextualFragment(html);\r
-                    el.appendChild(frag);\r
-                    return el.lastChild;\r
-                }else{\r
-                    el.innerHTML = html;\r
-                    return el.lastChild;\r
-                }\r
-            case "afterend":\r
-                range.setStartAfter(el);\r
-                frag = range.createContextualFragment(html);\r
-                el.parentNode.insertBefore(frag, el.nextSibling);\r
-                return el.nextSibling;\r
-            }\r
-            throw 'Illegal insertion point -> "' + where + '"';\r
-    },\r
-\r
-    \r
-    insertBefore : function(el, o, returnElement){\r
-        return this.doInsert(el, o, returnElement, "beforeBegin");\r
-    },\r
-\r
-    \r
-    insertAfter : function(el, o, returnElement){\r
-        return this.doInsert(el, o, returnElement, "afterEnd", "nextSibling");\r
-    },\r
-\r
-    \r
-    insertFirst : function(el, o, returnElement){\r
-        return this.doInsert(el, o, returnElement, "afterBegin", "firstChild");\r
-    },\r
-\r
-    // private\r
-    doInsert : function(el, o, returnElement, pos, sibling){\r
-        el = Ext.getDom(el);\r
-        var newNode;\r
-        if(this.useDom){\r
-            newNode = createDom(o, null);\r
-            (sibling === "firstChild" ? el : el.parentNode).insertBefore(newNode, sibling ? el[sibling] : el);\r
-        }else{\r
-            var html = createHtml(o);\r
-            newNode = this.insertHtml(pos, el, html);\r
-        }\r
-        return returnElement ? Ext.get(newNode, true) : newNode;\r
-    },\r
-\r
-    \r
-    append : function(el, o, returnElement){\r
-        el = Ext.getDom(el);\r
-        var newNode;\r
-        if(this.useDom){\r
-            newNode = createDom(o, null);\r
-            el.appendChild(newNode);\r
-        }else{\r
-            var html = createHtml(o);\r
-            newNode = this.insertHtml("beforeEnd", el, html);\r
-        }\r
-        return returnElement ? Ext.get(newNode, true) : newNode;\r
-    },\r
-\r
-    \r
-    overwrite : function(el, o, returnElement){\r
-        el = Ext.getDom(el);\r
-        el.innerHTML = createHtml(o);\r
-        return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;\r
-    },\r
-\r
-    \r
-    createTemplate : function(o){\r
-        var html = createHtml(o);\r
-        return new Ext.Template(html);\r
-    }\r
-    };\r
-}();\r
-\r
-\r
-Ext.Template = function(html){\r
-    var a = arguments;\r
-    if(Ext.isArray(html)){\r
-        html = html.join("");\r
-    }else if(a.length > 1){\r
-        var buf = [];\r
-        for(var i = 0, len = a.length; i < len; i++){\r
-            if(typeof a[i] == 'object'){\r
-                Ext.apply(this, a[i]);\r
-            }else{\r
-                buf[buf.length] = a[i];\r
-            }\r
-        }\r
-        html = buf.join('');\r
-    }\r
-    \r
-    this.html = html;\r
-    if(this.compiled){\r
-        this.compile();\r
-    }\r
-};\r
-Ext.Template.prototype = {\r
-    \r
-    applyTemplate : function(values){\r
-        if(this.compiled){\r
-            return this.compiled(values);\r
-        }\r
-        var useF = this.disableFormats !== true;\r
-        var fm = Ext.util.Format, tpl = this;\r
-        var fn = function(m, name, format, args){\r
-            if(format && useF){\r
-                if(format.substr(0, 5) == "this."){\r
-                    return tpl.call(format.substr(5), values[name], values);\r
-                }else{\r
-                    if(args){\r
-                        // quoted values are required for strings in compiled templates,\r
-                        // but for non compiled we need to strip them\r
-                        // quoted reversed for jsmin\r
-                        var re = /^\s*['"](.*)["']\s*$/;\r
-                        args = args.split(',');\r
-                        for(var i = 0, len = args.length; i < len; i++){\r
-                            args[i] = args[i].replace(re, "$1");\r
-                        }\r
-                        args = [values[name]].concat(args);\r
-                    }else{\r
-                        args = [values[name]];\r
-                    }\r
-                    return fm[format].apply(fm, args);\r
-                }\r
-            }else{\r
-                return values[name] !== undefined ? values[name] : "";\r
-            }\r
-        };\r
-        return this.html.replace(this.re, fn);\r
-    },\r
-\r
-    \r
-    set : function(html, compile){\r
-        this.html = html;\r
-        this.compiled = null;\r
-        if(compile){\r
-            this.compile();\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    disableFormats : false,\r
-\r
-    \r
-    re : /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,\r
-\r
-    \r
-    compile : function(){\r
-        var fm = Ext.util.Format;\r
-        var useF = this.disableFormats !== true;\r
-        var sep = Ext.isGecko ? "+" : ",";\r
-        var fn = function(m, name, format, args){\r
-            if(format && useF){\r
-                args = args ? ',' + args : "";\r
-                if(format.substr(0, 5) != "this."){\r
-                    format = "fm." + format + '(';\r
-                }else{\r
-                    format = 'this.call("'+ format.substr(5) + '", ';\r
-                    args = ", values";\r
-                }\r
-            }else{\r
-                args= ''; format = "(values['" + name + "'] == undefined ? '' : ";\r
-            }\r
-            return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'";\r
-        };\r
-        var body;\r
-        // branched to use + in gecko and [].join() in others\r
-        if(Ext.isGecko){\r
-            body = "this.compiled = function(values){ return '" +\r
-                   this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn) +\r
-                    "';};";\r
-        }else{\r
-            body = ["this.compiled = function(values){ return ['"];\r
-            body.push(this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn));\r
-            body.push("'].join('');};");\r
-            body = body.join('');\r
-        }\r
-        eval(body);\r
-        return this;\r
-    },\r
-\r
-    // private function used to call members\r
-    call : function(fnName, value, allValues){\r
-        return this[fnName](value, allValues);\r
-    },\r
-\r
-    \r
-    insertFirst: function(el, values, returnElement){\r
-        return this.doInsert('afterBegin', el, values, returnElement);\r
-    },\r
-\r
-    \r
-    insertBefore: function(el, values, returnElement){\r
-        return this.doInsert('beforeBegin', el, values, returnElement);\r
-    },\r
-\r
-    \r
-    insertAfter : function(el, values, returnElement){\r
-        return this.doInsert('afterEnd', el, values, returnElement);\r
-    },\r
-\r
-    \r
-    append : function(el, values, returnElement){\r
-        return this.doInsert('beforeEnd', el, values, returnElement);\r
-    },\r
-\r
-    doInsert : function(where, el, values, returnEl){\r
-        el = Ext.getDom(el);\r
-        var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values));\r
-        return returnEl ? Ext.get(newNode, true) : newNode;\r
-    },\r
-\r
-    \r
-    overwrite : function(el, values, returnElement){\r
-        el = Ext.getDom(el);\r
-        el.innerHTML = this.applyTemplate(values);\r
-        return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;\r
-    }\r
-};\r
-\r
-Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;\r
-\r
-// backwards compat\r
-Ext.DomHelper.Template = Ext.Template;\r
-\r
-\r
-Ext.Template.from = function(el, config){\r
-    el = Ext.getDom(el);\r
-    return new Ext.Template(el.value || el.innerHTML, config || '');\r
-};\r
-\r
-\r
-Ext.DomQuery = function(){\r
-    var cache = {}, simpleCache = {}, valueCache = {};\r
-    var nonSpace = /\S/;\r
-    var trimRe = /^\s+|\s+$/g;\r
-    var tplRe = /\{(\d+)\}/g;\r
-    var modeRe = /^(\s?[\/>+~]\s?|\s|$)/;\r
-    var tagTokenRe = /^(#)?([\w-\*]+)/;\r
-    var nthRe = /(\d*)n\+?(\d*)/, nthRe2 = /\D/;\r
-\r
-    function child(p, index){\r
-        var i = 0;\r
-        var n = p.firstChild;\r
-        while(n){\r
-            if(n.nodeType == 1){\r
-               if(++i == index){\r
-                   return n;\r
-               }\r
-            }\r
-            n = n.nextSibling;\r
-        }\r
-        return null;\r
-    };\r
-\r
-    function next(n){\r
-        while((n = n.nextSibling) && n.nodeType != 1);\r
-        return n;\r
-    };\r
-\r
-    function prev(n){\r
-        while((n = n.previousSibling) && n.nodeType != 1);\r
-        return n;\r
-    };\r
-\r
-    function children(d){\r
-        var n = d.firstChild, ni = -1;\r
-           while(n){\r
-               var nx = n.nextSibling;\r
-               if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){\r
-                   d.removeChild(n);\r
-               }else{\r
-                   n.nodeIndex = ++ni;\r
-               }\r
-               n = nx;\r
-           }\r
-           return this;\r
-       };\r
-\r
-    function byClassName(c, a, v){\r
-        if(!v){\r
-            return c;\r
-        }\r
-        var r = [], ri = -1, cn;\r
-        for(var i = 0, ci; ci = c[i]; i++){\r
-            if((' '+ci.className+' ').indexOf(v) != -1){\r
-                r[++ri] = ci;\r
-            }\r
-        }\r
-        return r;\r
-    };\r
-\r
-    function attrValue(n, attr){\r
-        if(!n.tagName && typeof n.length != "undefined"){\r
-            n = n[0];\r
-        }\r
-        if(!n){\r
-            return null;\r
-        }\r
-        if(attr == "for"){\r
-            return n.htmlFor;\r
-        }\r
-        if(attr == "class" || attr == "className"){\r
-            return n.className;\r
-        }\r
-        return n.getAttribute(attr) || n[attr];\r
-\r
-    };\r
-\r
-    function getNodes(ns, mode, tagName){\r
-        var result = [], ri = -1, cs;\r
-        if(!ns){\r
-            return result;\r
-        }\r
-        tagName = tagName || "*";\r
-        if(typeof ns.getElementsByTagName != "undefined"){\r
-            ns = [ns];\r
-        }\r
-        if(!mode){\r
-            for(var i = 0, ni; ni = ns[i]; i++){\r
-                cs = ni.getElementsByTagName(tagName);\r
-                for(var j = 0, ci; ci = cs[j]; j++){\r
-                    result[++ri] = ci;\r
-                }\r
-            }\r
-        }else if(mode == "/" || mode == ">"){\r
-            var utag = tagName.toUpperCase();\r
-            for(var i = 0, ni, cn; ni = ns[i]; i++){\r
-                cn = ni.children || ni.childNodes;\r
-                for(var j = 0, cj; cj = cn[j]; j++){\r
-                    if(cj.nodeName == utag || cj.nodeName == tagName  || tagName == '*'){\r
-                        result[++ri] = cj;\r
-                    }\r
-                }\r
-            }\r
-        }else if(mode == "+"){\r
-            var utag = tagName.toUpperCase();\r
-            for(var i = 0, n; n = ns[i]; i++){\r
-                while((n = n.nextSibling) && n.nodeType != 1);\r
-                if(n && (n.nodeName == utag || n.nodeName == tagName || tagName == '*')){\r
-                    result[++ri] = n;\r
-                }\r
-            }\r
-        }else if(mode == "~"){\r
-            for(var i = 0, n; n = ns[i]; i++){\r
-                while((n = n.nextSibling) && (n.nodeType != 1 || (tagName == '*' || n.tagName.toLowerCase()!=tagName)));\r
-                if(n){\r
-                    result[++ri] = n;\r
-                }\r
-            }\r
-        }\r
-        return result;\r
-    };\r
-\r
-    function concat(a, b){\r
-        if(b.slice){\r
-            return a.concat(b);\r
-        }\r
-        for(var i = 0, l = b.length; i < l; i++){\r
-            a[a.length] = b[i];\r
-        }\r
-        return a;\r
-    }\r
-\r
-    function byTag(cs, tagName){\r
-        if(cs.tagName || cs == document){\r
-            cs = [cs];\r
-        }\r
-        if(!tagName){\r
-            return cs;\r
-        }\r
-        var r = [], ri = -1;\r
-        tagName = tagName.toLowerCase();\r
-        for(var i = 0, ci; ci = cs[i]; i++){\r
-            if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){\r
-                r[++ri] = ci;\r
-            }\r
-        }\r
-        return r;\r
-    };\r
-\r
-    function byId(cs, attr, id){\r
-        if(cs.tagName || cs == document){\r
-            cs = [cs];\r
-        }\r
-        if(!id){\r
-            return cs;\r
-        }\r
-        var r = [], ri = -1;\r
-        for(var i = 0,ci; ci = cs[i]; i++){\r
-            if(ci && ci.id == id){\r
-                r[++ri] = ci;\r
-                return r;\r
-            }\r
-        }\r
-        return r;\r
-    };\r
-\r
-    function byAttribute(cs, attr, value, op, custom){\r
-        var r = [], ri = -1, st = custom=="{";\r
-        var f = Ext.DomQuery.operators[op];\r
-        for(var i = 0, ci; ci = cs[i]; i++){\r
-            var a;\r
-            if(st){\r
-                a = Ext.DomQuery.getStyle(ci, attr);\r
-            }\r
-            else if(attr == "class" || attr == "className"){\r
-                a = ci.className;\r
-            }else if(attr == "for"){\r
-                a = ci.htmlFor;\r
-            }else if(attr == "href"){\r
-                a = ci.getAttribute("href", 2);\r
-            }else{\r
-                a = ci.getAttribute(attr);\r
-            }\r
-            if((f && f(a, value)) || (!f && a)){\r
-                r[++ri] = ci;\r
-            }\r
-        }\r
-        return r;\r
-    };\r
-\r
-    function byPseudo(cs, name, value){\r
-        return Ext.DomQuery.pseudos[name](cs, value);\r
-    };\r
-\r
-    // This is for IE MSXML which does not support expandos.\r
-    // IE runs the same speed using setAttribute, however FF slows way down\r
-    // and Safari completely fails so they need to continue to use expandos.\r
-    var isIE = window.ActiveXObject ? true : false;\r
-\r
-    // this eval is stop the compressor from\r
-    // renaming the variable to something shorter\r
-    eval("var batch = 30803;");\r
-\r
-    var key = 30803;\r
-\r
-    function nodupIEXml(cs){\r
-        var d = ++key;\r
-        cs[0].setAttribute("_nodup", d);\r
-        var r = [cs[0]];\r
-        for(var i = 1, len = cs.length; i < len; i++){\r
-            var c = cs[i];\r
-            if(!c.getAttribute("_nodup") != d){\r
-                c.setAttribute("_nodup", d);\r
-                r[r.length] = c;\r
-            }\r
-        }\r
-        for(var i = 0, len = cs.length; i < len; i++){\r
-            cs[i].removeAttribute("_nodup");\r
-        }\r
-        return r;\r
-    }\r
-\r
-    function nodup(cs){\r
-        if(!cs){\r
-            return [];\r
-        }\r
-        var len = cs.length, c, i, r = cs, cj, ri = -1;\r
-        if(!len || typeof cs.nodeType != "undefined" || len == 1){\r
-            return cs;\r
-        }\r
-        if(isIE && typeof cs[0].selectSingleNode != "undefined"){\r
-            return nodupIEXml(cs);\r
-        }\r
-        var d = ++key;\r
-        cs[0]._nodup = d;\r
-        for(i = 1; c = cs[i]; i++){\r
-            if(c._nodup != d){\r
-                c._nodup = d;\r
-            }else{\r
-                r = [];\r
-                for(var j = 0; j < i; j++){\r
-                    r[++ri] = cs[j];\r
-                }\r
-                for(j = i+1; cj = cs[j]; j++){\r
-                    if(cj._nodup != d){\r
-                        cj._nodup = d;\r
-                        r[++ri] = cj;\r
-                    }\r
-                }\r
-                return r;\r
-            }\r
-        }\r
-        return r;\r
-    }\r
-\r
-    function quickDiffIEXml(c1, c2){\r
-        var d = ++key;\r
-        for(var i = 0, len = c1.length; i < len; i++){\r
-            c1[i].setAttribute("_qdiff", d);\r
-        }\r
-        var r = [];\r
-        for(var i = 0, len = c2.length; i < len; i++){\r
-            if(c2[i].getAttribute("_qdiff") != d){\r
-                r[r.length] = c2[i];\r
-            }\r
-        }\r
-        for(var i = 0, len = c1.length; i < len; i++){\r
-           c1[i].removeAttribute("_qdiff");\r
-        }\r
-        return r;\r
-    }\r
-\r
-    function quickDiff(c1, c2){\r
-        var len1 = c1.length;\r
-        if(!len1){\r
-            return c2;\r
-        }\r
-        if(isIE && c1[0].selectSingleNode){\r
-            return quickDiffIEXml(c1, c2);\r
-        }\r
-        var d = ++key;\r
-        for(var i = 0; i < len1; i++){\r
-            c1[i]._qdiff = d;\r
-        }\r
-        var r = [];\r
-        for(var i = 0, len = c2.length; i < len; i++){\r
-            if(c2[i]._qdiff != d){\r
-                r[r.length] = c2[i];\r
-            }\r
-        }\r
-        return r;\r
-    }\r
-\r
-    function quickId(ns, mode, root, id){\r
-        if(ns == root){\r
-           var d = root.ownerDocument || root;\r
-           return d.getElementById(id);\r
-        }\r
-        ns = getNodes(ns, mode, "*");\r
-        return byId(ns, null, id);\r
-    }\r
-\r
-    return {\r
-        getStyle : function(el, name){\r
-            return Ext.fly(el).getStyle(name);\r
-        },\r
-        \r
-        compile : function(path, type){\r
-            type = type || "select";\r
-\r
-            var fn = ["var f = function(root){\n var mode; ++batch; var n = root || document;\n"];\r
-            var q = path, mode, lq;\r
-            var tk = Ext.DomQuery.matchers;\r
-            var tklen = tk.length;\r
-            var mm;\r
-\r
-            // accept leading mode switch\r
-            var lmode = q.match(modeRe);\r
-            if(lmode && lmode[1]){\r
-                fn[fn.length] = 'mode="'+lmode[1].replace(trimRe, "")+'";';\r
-                q = q.replace(lmode[1], "");\r
-            }\r
-            // strip leading slashes\r
-            while(path.substr(0, 1)=="/"){\r
-                path = path.substr(1);\r
-            }\r
-\r
-            while(q && lq != q){\r
-                lq = q;\r
-                var tm = q.match(tagTokenRe);\r
-                if(type == "select"){\r
-                    if(tm){\r
-                        if(tm[1] == "#"){\r
-                            fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");';\r
-                        }else{\r
-                            fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");';\r
-                        }\r
-                        q = q.replace(tm[0], "");\r
-                    }else if(q.substr(0, 1) != '@'){\r
-                        fn[fn.length] = 'n = getNodes(n, mode, "*");';\r
-                    }\r
-                }else{\r
-                    if(tm){\r
-                        if(tm[1] == "#"){\r
-                            fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");';\r
-                        }else{\r
-                            fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");';\r
-                        }\r
-                        q = q.replace(tm[0], "");\r
-                    }\r
-                }\r
-                while(!(mm = q.match(modeRe))){\r
-                    var matched = false;\r
-                    for(var j = 0; j < tklen; j++){\r
-                        var t = tk[j];\r
-                        var m = q.match(t.re);\r
-                        if(m){\r
-                            fn[fn.length] = t.select.replace(tplRe, function(x, i){\r
-                                                    return m[i];\r
-                                                });\r
-                            q = q.replace(m[0], "");\r
-                            matched = true;\r
-                            break;\r
-                        }\r
-                    }\r
-                    // prevent infinite loop on bad selector\r
-                    if(!matched){\r
-                        throw 'Error parsing selector, parsing failed at "' + q + '"';\r
-                    }\r
-                }\r
-                if(mm[1]){\r
-                    fn[fn.length] = 'mode="'+mm[1].replace(trimRe, "")+'";';\r
-                    q = q.replace(mm[1], "");\r
-                }\r
-            }\r
-            fn[fn.length] = "return nodup(n);\n}";\r
-            eval(fn.join(""));\r
-            return f;\r
-        },\r
-\r
-        \r
-        select : function(path, root, type){\r
-            if(!root || root == document){\r
-                root = document;\r
-            }\r
-            if(typeof root == "string"){\r
-                root = document.getElementById(root);\r
-            }\r
-            var paths = path.split(",");\r
-            var results = [];\r
-            for(var i = 0, len = paths.length; i < len; i++){\r
-                var p = paths[i].replace(trimRe, "");\r
-                if(!cache[p]){\r
-                    cache[p] = Ext.DomQuery.compile(p);\r
-                    if(!cache[p]){\r
-                        throw p + " is not a valid selector";\r
-                    }\r
-                }\r
-                var result = cache[p](root);\r
-                if(result && result != document){\r
-                    results = results.concat(result);\r
-                }\r
-            }\r
-            if(paths.length > 1){\r
-                return nodup(results);\r
-            }\r
-            return results;\r
-        },\r
-\r
-        \r
-        selectNode : function(path, root){\r
-            return Ext.DomQuery.select(path, root)[0];\r
-        },\r
-\r
-        \r
-        selectValue : function(path, root, defaultValue){\r
-            path = path.replace(trimRe, "");\r
-            if(!valueCache[path]){\r
-                valueCache[path] = Ext.DomQuery.compile(path, "select");\r
-            }\r
-            var n = valueCache[path](root);\r
-            n = n[0] ? n[0] : n;\r
-            var v = (n && n.firstChild ? n.firstChild.nodeValue : null);\r
-            return ((v === null||v === undefined||v==='') ? defaultValue : v);\r
-        },\r
-\r
-        \r
-        selectNumber : function(path, root, defaultValue){\r
-            var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0);\r
-            return parseFloat(v);\r
-        },\r
-\r
-        \r
-        is : function(el, ss){\r
-            if(typeof el == "string"){\r
-                el = document.getElementById(el);\r
-            }\r
-            var isArray = Ext.isArray(el);\r
-            var result = Ext.DomQuery.filter(isArray ? el : [el], ss);\r
-            return isArray ? (result.length == el.length) : (result.length > 0);\r
-        },\r
-\r
-        \r
-        filter : function(els, ss, nonMatches){\r
-            ss = ss.replace(trimRe, "");\r
-            if(!simpleCache[ss]){\r
-                simpleCache[ss] = Ext.DomQuery.compile(ss, "simple");\r
-            }\r
-            var result = simpleCache[ss](els);\r
-            return nonMatches ? quickDiff(result, els) : result;\r
-        },\r
-\r
-        \r
-        matchers : [{\r
-                re: /^\.([\w-]+)/,\r
-                select: 'n = byClassName(n, null, " {1} ");'\r
-            }, {\r
-                re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,\r
-                select: 'n = byPseudo(n, "{1}", "{2}");'\r
-            },{\r
-                re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,\r
-                select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");'\r
-            }, {\r
-                re: /^#([\w-]+)/,\r
-                select: 'n = byId(n, null, "{1}");'\r
-            },{\r
-                re: /^@([\w-]+)/,\r
-                select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'\r
-            }\r
-        ],\r
-\r
-        \r
-        operators : {\r
-            "=" : function(a, v){\r
-                return a == v;\r
-            },\r
-            "!=" : function(a, v){\r
-                return a != v;\r
-            },\r
-            "^=" : function(a, v){\r
-                return a && a.substr(0, v.length) == v;\r
-            },\r
-            "$=" : function(a, v){\r
-                return a && a.substr(a.length-v.length) == v;\r
-            },\r
-            "*=" : function(a, v){\r
-                return a && a.indexOf(v) !== -1;\r
-            },\r
-            "%=" : function(a, v){\r
-                return (a % v) == 0;\r
-            },\r
-            "|=" : function(a, v){\r
-                return a && (a == v || a.substr(0, v.length+1) == v+'-');\r
-            },\r
-            "~=" : function(a, v){\r
-                return a && (' '+a+' ').indexOf(' '+v+' ') != -1;\r
-            }\r
-        },\r
-\r
-        \r
-        pseudos : {\r
-            "first-child" : function(c){\r
-                var r = [], ri = -1, n;\r
-                for(var i = 0, ci; ci = n = c[i]; i++){\r
-                    while((n = n.previousSibling) && n.nodeType != 1);\r
-                    if(!n){\r
-                        r[++ri] = ci;\r
-                    }\r
-                }\r
-                return r;\r
-            },\r
-\r
-            "last-child" : function(c){\r
-                var r = [], ri = -1, n;\r
-                for(var i = 0, ci; ci = n = c[i]; i++){\r
-                    while((n = n.nextSibling) && n.nodeType != 1);\r
-                    if(!n){\r
-                        r[++ri] = ci;\r
-                    }\r
-                }\r
-                return r;\r
-            },\r
-\r
-            "nth-child" : function(c, a) {\r
-                var r = [], ri = -1;\r
-                var m = nthRe.exec(a == "even" && "2n" || a == "odd" && "2n+1" || !nthRe2.test(a) && "n+" + a || a);\r
-                var f = (m[1] || 1) - 0, l = m[2] - 0;\r
-                for(var i = 0, n; n = c[i]; i++){\r
-                    var pn = n.parentNode;\r
-                    if (batch != pn._batch) {\r
-                        var j = 0;\r
-                        for(var cn = pn.firstChild; cn; cn = cn.nextSibling){\r
-                            if(cn.nodeType == 1){\r
-                               cn.nodeIndex = ++j;\r
-                            }\r
-                        }\r
-                        pn._batch = batch;\r
-                    }\r
-                    if (f == 1) {\r
-                        if (l == 0 || n.nodeIndex == l){\r
-                            r[++ri] = n;\r
-                        }\r
-                    } else if ((n.nodeIndex + l) % f == 0){\r
-                        r[++ri] = n;\r
-                    }\r
-                }\r
-\r
-                return r;\r
-            },\r
-\r
-            "only-child" : function(c){\r
-                var r = [], ri = -1;;\r
-                for(var i = 0, ci; ci = c[i]; i++){\r
-                    if(!prev(ci) && !next(ci)){\r
-                        r[++ri] = ci;\r
-                    }\r
-                }\r
-                return r;\r
-            },\r
-\r
-            "empty" : function(c){\r
-                var r = [], ri = -1;\r
-                for(var i = 0, ci; ci = c[i]; i++){\r
-                    var cns = ci.childNodes, j = 0, cn, empty = true;\r
-                    while(cn = cns[j]){\r
-                        ++j;\r
-                        if(cn.nodeType == 1 || cn.nodeType == 3){\r
-                            empty = false;\r
-                            break;\r
-                        }\r
-                    }\r
-                    if(empty){\r
-                        r[++ri] = ci;\r
-                    }\r
-                }\r
-                return r;\r
-            },\r
-\r
-            "contains" : function(c, v){\r
-                var r = [], ri = -1;\r
-                for(var i = 0, ci; ci = c[i]; i++){\r
-                    if((ci.textContent||ci.innerText||'').indexOf(v) != -1){\r
-                        r[++ri] = ci;\r
-                    }\r
-                }\r
-                return r;\r
-            },\r
-\r
-            "nodeValue" : function(c, v){\r
-                var r = [], ri = -1;\r
-                for(var i = 0, ci; ci = c[i]; i++){\r
-                    if(ci.firstChild && ci.firstChild.nodeValue == v){\r
-                        r[++ri] = ci;\r
-                    }\r
-                }\r
-                return r;\r
-            },\r
-\r
-            "checked" : function(c){\r
-                var r = [], ri = -1;\r
-                for(var i = 0, ci; ci = c[i]; i++){\r
-                    if(ci.checked == true){\r
-                        r[++ri] = ci;\r
-                    }\r
-                }\r
-                return r;\r
-            },\r
-\r
-            "not" : function(c, ss){\r
-                return Ext.DomQuery.filter(c, ss, true);\r
-            },\r
-\r
-            "any" : function(c, selectors){\r
-                var ss = selectors.split('|');\r
-                var r = [], ri = -1, s;\r
-                for(var i = 0, ci; ci = c[i]; i++){\r
-                    for(var j = 0; s = ss[j]; j++){\r
-                        if(Ext.DomQuery.is(ci, s)){\r
-                            r[++ri] = ci;\r
-                            break;\r
-                        }\r
-                    }\r
-                }\r
-                return r;\r
-            },\r
-\r
-            "odd" : function(c){\r
-                return this["nth-child"](c, "odd");\r
-            },\r
-\r
-            "even" : function(c){\r
-                return this["nth-child"](c, "even");\r
-            },\r
-\r
-            "nth" : function(c, a){\r
-                return c[a-1] || [];\r
-            },\r
-\r
-            "first" : function(c){\r
-                return c[0] || [];\r
-            },\r
-\r
-            "last" : function(c){\r
-                return c[c.length-1] || [];\r
-            },\r
-\r
-            "has" : function(c, ss){\r
-                var s = Ext.DomQuery.select;\r
-                var r = [], ri = -1;\r
-                for(var i = 0, ci; ci = c[i]; i++){\r
-                    if(s(ss, ci).length > 0){\r
-                        r[++ri] = ci;\r
-                    }\r
-                }\r
-                return r;\r
-            },\r
-\r
-            "next" : function(c, ss){\r
-                var is = Ext.DomQuery.is;\r
-                var r = [], ri = -1;\r
-                for(var i = 0, ci; ci = c[i]; i++){\r
-                    var n = next(ci);\r
-                    if(n && is(n, ss)){\r
-                        r[++ri] = ci;\r
-                    }\r
-                }\r
-                return r;\r
-            },\r
-\r
-            "prev" : function(c, ss){\r
-                var is = Ext.DomQuery.is;\r
-                var r = [], ri = -1;\r
-                for(var i = 0, ci; ci = c[i]; i++){\r
-                    var n = prev(ci);\r
-                    if(n && is(n, ss)){\r
-                        r[++ri] = ci;\r
-                    }\r
-                }\r
-                return r;\r
-            }\r
-        }\r
-    };\r
-}();\r
-\r
-\r
-Ext.query = Ext.DomQuery.select;\r
-\r
-\r
-Ext.util.Observable = function(){\r
-    \r
-    if(this.listeners){\r
-        this.on(this.listeners);\r
-        delete this.listeners;\r
-    }\r
-};\r
-Ext.util.Observable.prototype = {\r
-    \r
-    fireEvent : function(){\r
-        if(this.eventsSuspended !== true){\r
-            var ce = this.events[arguments[0].toLowerCase()];\r
-            if(typeof ce == "object"){\r
-                return ce.fire.apply(ce, Array.prototype.slice.call(arguments, 1));\r
-            }\r
-        }\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    filterOptRe : /^(?:scope|delay|buffer|single)$/,\r
-\r
-    \r
-    addListener : function(eventName, fn, scope, o){\r
-        if(typeof eventName == "object"){\r
-            o = eventName;\r
-            for(var e in o){\r
-                if(this.filterOptRe.test(e)){\r
-                    continue;\r
-                }\r
-                if(typeof o[e] == "function"){\r
-                    // shared options\r
-                    this.addListener(e, o[e], o.scope,  o);\r
-                }else{\r
-                    // individual options\r
-                    this.addListener(e, o[e].fn, o[e].scope, o[e]);\r
-                }\r
-            }\r
-            return;\r
-        }\r
-        o = (!o || typeof o == "boolean") ? {} : o;\r
-        eventName = eventName.toLowerCase();\r
-        var ce = this.events[eventName] || true;\r
-        if(typeof ce == "boolean"){\r
-            ce = new Ext.util.Event(this, eventName);\r
-            this.events[eventName] = ce;\r
-        }\r
-        ce.addListener(fn, scope, o);\r
-    },\r
-\r
-    \r
-    removeListener : function(eventName, fn, scope){\r
-        var ce = this.events[eventName.toLowerCase()];\r
-        if(typeof ce == "object"){\r
-            ce.removeListener(fn, scope);\r
-        }\r
-    },\r
-\r
-    \r
-    purgeListeners : function(){\r
-        for(var evt in this.events){\r
-            if(typeof this.events[evt] == "object"){\r
-                 this.events[evt].clearListeners();\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    relayEvents : function(o, events){\r
-        var createHandler = function(ename){\r
-            return function(){\r
-                return this.fireEvent.apply(this, Ext.combine(ename, Array.prototype.slice.call(arguments, 0)));\r
-            };\r
-        };\r
-        for(var i = 0, len = events.length; i < len; i++){\r
-            var ename = events[i];\r
-            if(!this.events[ename]){ this.events[ename] = true; };\r
-            o.on(ename, createHandler(ename), this);\r
-        }\r
-    },\r
-\r
-    \r
-    addEvents : function(o){\r
-        if(!this.events){\r
-            this.events = {};\r
-        }\r
-        if(typeof o == 'string'){\r
-            for(var i = 0, a = arguments, v; v = a[i]; i++){\r
-                if(!this.events[a[i]]){\r
-                    this.events[a[i]] = true;\r
-                }\r
-            }\r
-        }else{\r
-            Ext.applyIf(this.events, o);\r
-        }\r
-    },\r
-\r
-    \r
-    hasListener : function(eventName){\r
-        var e = this.events[eventName];\r
-        return typeof e == "object" && e.listeners.length > 0;\r
-    },\r
-\r
-    \r
-    suspendEvents : function(){\r
-        this.eventsSuspended = true;\r
-    },\r
-\r
-    \r
-    resumeEvents : function(){\r
-        this.eventsSuspended = false;\r
-    },\r
-\r
-    // these are considered experimental\r
-    // allows for easier interceptor and sequences, including cancelling and overwriting the return value of the call\r
-    // private\r
-    getMethodEvent : function(method){\r
-        if(!this.methodEvents){\r
-            this.methodEvents = {};\r
-        }\r
-        var e = this.methodEvents[method];\r
-        if(!e){\r
-            e = {};\r
-            this.methodEvents[method] = e;\r
-\r
-            e.originalFn = this[method];\r
-            e.methodName = method;\r
-            e.before = [];\r
-            e.after = [];\r
-\r
-\r
-            var returnValue, v, cancel;\r
-            var obj = this;\r
-\r
-            var makeCall = function(fn, scope, args){\r
-                if((v = fn.apply(scope || obj, args)) !== undefined){\r
-                    if(typeof v === 'object'){\r
-                        if(v.returnValue !== undefined){\r
-                            returnValue = v.returnValue;\r
-                        }else{\r
-                            returnValue = v;\r
-                        }\r
-                        if(v.cancel === true){\r
-                            cancel = true;\r
-                        }\r
-                    }else if(v === false){\r
-                        cancel = true;\r
-                    }else {\r
-                        returnValue = v;\r
-                    }\r
-                }\r
-            }\r
-\r
-            this[method] = function(){\r
-                returnValue = v = undefined; cancel = false;\r
-                var args = Array.prototype.slice.call(arguments, 0);\r
-                for(var i = 0, len = e.before.length; i < len; i++){\r
-                    makeCall(e.before[i].fn, e.before[i].scope, args);\r
-                    if(cancel){\r
-                        return returnValue;\r
-                    }\r
-                }\r
-\r
-                if((v = e.originalFn.apply(obj, args)) !== undefined){\r
-                    returnValue = v;\r
-                }\r
-\r
-                for(var i = 0, len = e.after.length; i < len; i++){\r
-                    makeCall(e.after[i].fn, e.after[i].scope, args);\r
-                    if(cancel){\r
-                        return returnValue;\r
-                    }\r
-                }\r
-                return returnValue;\r
-            };\r
-        }\r
-        return e;\r
-    },\r
-\r
-    // adds an "interceptor" called before the original method\r
-    beforeMethod : function(method, fn, scope){\r
-        var e = this.getMethodEvent(method);\r
-        e.before.push({fn: fn, scope: scope});\r
-    },\r
-\r
-    // adds a "sequence" called after the original method\r
-    afterMethod : function(method, fn, scope){\r
-        var e = this.getMethodEvent(method);\r
-        e.after.push({fn: fn, scope: scope});\r
-    },\r
-\r
-    removeMethodListener : function(method, fn, scope){\r
-        var e = this.getMethodEvent(method);\r
-        for(var i = 0, len = e.before.length; i < len; i++){\r
-            if(e.before[i].fn == fn && e.before[i].scope == scope){\r
-                e.before.splice(i, 1);\r
-                return;\r
-            }\r
-        }\r
-        for(var i = 0, len = e.after.length; i < len; i++){\r
-            if(e.after[i].fn == fn && e.after[i].scope == scope){\r
-                e.after.splice(i, 1);\r
-                return;\r
-            }\r
-        }\r
-    }\r
-};\r
-\r
-Ext.util.Observable.prototype.on = Ext.util.Observable.prototype.addListener;\r
-\r
-Ext.util.Observable.prototype.un = Ext.util.Observable.prototype.removeListener;\r
-\r
-\r
-Ext.util.Observable.capture = function(o, fn, scope){\r
-    o.fireEvent = o.fireEvent.createInterceptor(fn, scope);\r
-};\r
-\r
-\r
-Ext.util.Observable.releaseCapture = function(o){\r
-    o.fireEvent = Ext.util.Observable.prototype.fireEvent;\r
-};\r
-\r
-(function(){\r
-\r
-    var createBuffered = function(h, o, scope){\r
-        var task = new Ext.util.DelayedTask();\r
-        return function(){\r
-            task.delay(o.buffer, h, scope, Array.prototype.slice.call(arguments, 0));\r
-        };\r
-    };\r
-\r
-    var createSingle = function(h, e, fn, scope){\r
-        return function(){\r
-            e.removeListener(fn, scope);\r
-            return h.apply(scope, arguments);\r
-        };\r
-    };\r
-\r
-    var createDelayed = function(h, o, scope){\r
-        return function(){\r
-            var args = Array.prototype.slice.call(arguments, 0);\r
-            setTimeout(function(){\r
-                h.apply(scope, args);\r
-            }, o.delay || 10);\r
-        };\r
-    };\r
-\r
-    Ext.util.Event = function(obj, name){\r
-        this.name = name;\r
-        this.obj = obj;\r
-        this.listeners = [];\r
-    };\r
-\r
-    Ext.util.Event.prototype = {\r
-        addListener : function(fn, scope, options){\r
-            scope = scope || this.obj;\r
-            if(!this.isListening(fn, scope)){\r
-                var l = this.createListener(fn, scope, options);\r
-                if(!this.firing){\r
-                    this.listeners.push(l);\r
-                }else{ // if we are currently firing this event, don't disturb the listener loop\r
-                    this.listeners = this.listeners.slice(0);\r
-                    this.listeners.push(l);\r
-                }\r
-            }\r
-        },\r
-\r
-        createListener : function(fn, scope, o){\r
-            o = o || {};\r
-            scope = scope || this.obj;\r
-            var l = {fn: fn, scope: scope, options: o};\r
-            var h = fn;\r
-            if(o.delay){\r
-                h = createDelayed(h, o, scope);\r
-            }\r
-            if(o.single){\r
-                h = createSingle(h, this, fn, scope);\r
-            }\r
-            if(o.buffer){\r
-                h = createBuffered(h, o, scope);\r
-            }\r
-            l.fireFn = h;\r
-            return l;\r
-        },\r
-\r
-        findListener : function(fn, scope){\r
-            scope = scope || this.obj;\r
-            var ls = this.listeners;\r
-            for(var i = 0, len = ls.length; i < len; i++){\r
-                var l = ls[i];\r
-                if(l.fn == fn && l.scope == scope){\r
-                    return i;\r
-                }\r
-            }\r
-            return -1;\r
-        },\r
-\r
-        isListening : function(fn, scope){\r
-            return this.findListener(fn, scope) != -1;\r
-        },\r
-\r
-        removeListener : function(fn, scope){\r
-            var index;\r
-            if((index = this.findListener(fn, scope)) != -1){\r
-                if(!this.firing){\r
-                    this.listeners.splice(index, 1);\r
-                }else{\r
-                    this.listeners = this.listeners.slice(0);\r
-                    this.listeners.splice(index, 1);\r
-                }\r
-                return true;\r
-            }\r
-            return false;\r
-        },\r
-\r
-        clearListeners : function(){\r
-            this.listeners = [];\r
-        },\r
-\r
-        fire : function(){\r
-            var ls = this.listeners, scope, len = ls.length;\r
-            if(len > 0){\r
-                this.firing = true;\r
-                var args = Array.prototype.slice.call(arguments, 0);\r
-                for(var i = 0; i < len; i++){\r
-                    var l = ls[i];\r
-                    if(l.fireFn.apply(l.scope||this.obj||window, arguments) === false){\r
-                        this.firing = false;\r
-                        return false;\r
-                    }\r
-                }\r
-                this.firing = false;\r
-            }\r
-            return true;\r
-        }\r
-    };\r
-})();\r
-\r
-Ext.EventManager = function(){\r
-    var docReadyEvent, docReadyProcId, docReadyState = false;\r
-    var resizeEvent, resizeTask, textEvent, textSize;\r
-    var E = Ext.lib.Event;\r
-    var D = Ext.lib.Dom;\r
-    // fix parser confusion\r
-    var xname = 'Ex' + 't';\r
-\r
-    var elHash = {};\r
-\r
-    var addListener = function(el, ename, fn, wrap, scope){\r
-        var id = Ext.id(el);\r
-        if(!elHash[id]){\r
-            elHash[id] = {};\r
-        }\r
-        var es = elHash[id];\r
-        if(!es[ename]){\r
-            es[ename] = [];\r
-        }\r
-        var ls = es[ename];\r
-        ls.push({\r
-            id: id,\r
-            ename: ename,\r
-            fn: fn,\r
-            wrap: wrap,\r
-            scope: scope\r
-        });\r
-\r
-         E.on(el, ename, wrap);\r
-\r
-        if(ename == "mousewheel" && el.addEventListener){ // workaround for jQuery\r
-            el.addEventListener("DOMMouseScroll", wrap, false);\r
-            E.on(window, 'unload', function(){\r
-                el.removeEventListener("DOMMouseScroll", wrap, false);\r
-            });\r
-        }\r
-        if(ename == "mousedown" && el == document){ // fix stopped mousedowns on the document\r
-            Ext.EventManager.stoppedMouseDownEvent.addListener(wrap);\r
-        }\r
-    }\r
-\r
-    var removeListener = function(el, ename, fn, scope){\r
-        el = Ext.getDom(el);\r
-\r
-        var id = Ext.id(el), es = elHash[id], wrap;\r
-        if(es){\r
-            var ls = es[ename], l;\r
-            if(ls){\r
-                for(var i = 0, len = ls.length; i < len; i++){\r
-                    l = ls[i];\r
-                    if(l.fn == fn && (!scope || l.scope == scope)){\r
-                        wrap = l.wrap;\r
-                        E.un(el, ename, wrap);\r
-                        ls.splice(i, 1);\r
-                        break;\r
-                    }\r
-                }\r
-            }\r
-        }\r
-        if(ename == "mousewheel" && el.addEventListener && wrap){\r
-            el.removeEventListener("DOMMouseScroll", wrap, false);\r
-        }\r
-        if(ename == "mousedown" && el == document && wrap){ // fix stopped mousedowns on the document\r
-            Ext.EventManager.stoppedMouseDownEvent.removeListener(wrap);\r
-        }\r
-    }\r
-\r
-    var removeAll = function(el){\r
-        el = Ext.getDom(el);\r
-        var id = Ext.id(el), es = elHash[id], ls;\r
-        if(es){\r
-            for(var ename in es){\r
-                if(es.hasOwnProperty(ename)){\r
-                    ls = es[ename];\r
-                    for(var i = 0, len = ls.length; i < len; i++){\r
-                        E.un(el, ename, ls[i].wrap);\r
-                        ls[i] = null;\r
-                    }\r
-                }\r
-                es[ename] = null;\r
-            }\r
-            delete elHash[id];\r
-        }\r
-    }\r
-\r
-\r
-    var fireDocReady = function(){\r
-        if(!docReadyState){\r
-            docReadyState = true;\r
-            Ext.isReady = true;\r
-            if(docReadyProcId){\r
-                clearInterval(docReadyProcId);\r
-            }\r
-            if(Ext.isGecko || Ext.isOpera) {\r
-                document.removeEventListener("DOMContentLoaded", fireDocReady, false);\r
-            }\r
-            if(Ext.isIE){\r
-                var defer = document.getElementById("ie-deferred-loader");\r
-                if(defer){\r
-                    defer.onreadystatechange = null;\r
-                    defer.parentNode.removeChild(defer);\r
-                }\r
-            }\r
-            if(docReadyEvent){\r
-                docReadyEvent.fire();\r
-                docReadyEvent.clearListeners();\r
-            }\r
-        }\r
-    };\r
-\r
-    var initDocReady = function(){\r
-        docReadyEvent = new Ext.util.Event();\r
-        if(Ext.isGecko || Ext.isOpera) {\r
-            document.addEventListener("DOMContentLoaded", fireDocReady, false);\r
-        }else if(Ext.isIE){\r
-            document.write("<s"+'cript id="ie-deferred-loader" defer="defer" src="/'+'/:"></s'+"cript>");\r
-            var defer = document.getElementById("ie-deferred-loader");\r
-            defer.onreadystatechange = function(){\r
-                if(this.readyState == "complete"){\r
-                    fireDocReady();\r
-                }\r
-            };\r
-        }else if(Ext.isSafari){\r
-            docReadyProcId = setInterval(function(){\r
-                var rs = document.readyState;\r
-                if(rs == "complete") {\r
-                    fireDocReady();\r
-                 }\r
-            }, 10);\r
-        }\r
-        // no matter what, make sure it fires on load\r
-        E.on(window, "load", fireDocReady);\r
-    };\r
-\r
-    var createBuffered = function(h, o){\r
-        var task = new Ext.util.DelayedTask(h);\r
-        return function(e){\r
-            // create new event object impl so new events don't wipe out properties\r
-            e = new Ext.EventObjectImpl(e);\r
-            task.delay(o.buffer, h, null, [e]);\r
-        };\r
-    };\r
-\r
-    var createSingle = function(h, el, ename, fn, scope){\r
-        return function(e){\r
-            Ext.EventManager.removeListener(el, ename, fn, scope);\r
-            h(e);\r
-        };\r
-    };\r
-\r
-    var createDelayed = function(h, o){\r
-        return function(e){\r
-            // create new event object impl so new events don't wipe out properties\r
-            e = new Ext.EventObjectImpl(e);\r
-            setTimeout(function(){\r
-                h(e);\r
-            }, o.delay || 10);\r
-        };\r
-    };\r
-\r
-    var listen = function(element, ename, opt, fn, scope){\r
-        var o = (!opt || typeof opt == "boolean") ? {} : opt;\r
-        fn = fn || o.fn; scope = scope || o.scope;\r
-        var el = Ext.getDom(element);\r
-        if(!el){\r
-            throw "Error listening for \"" + ename + '\". Element "' + element + '" doesn\'t exist.';\r
-        }\r
-        var h = function(e){\r
-            // prevent errors while unload occurring\r
-            if(!window[xname]){\r
-                return;\r
-            }\r
-            e = Ext.EventObject.setEvent(e);\r
-            var t;\r
-            if(o.delegate){\r
-                t = e.getTarget(o.delegate, el);\r
-                if(!t){\r
-                    return;\r
-                }\r
-            }else{\r
-                t = e.target;\r
-            }\r
-            if(o.stopEvent === true){\r
-                e.stopEvent();\r
-            }\r
-            if(o.preventDefault === true){\r
-               e.preventDefault();\r
-            }\r
-            if(o.stopPropagation === true){\r
-                e.stopPropagation();\r
-            }\r
-\r
-            if(o.normalized === false){\r
-                e = e.browserEvent;\r
-            }\r
-\r
-            fn.call(scope || el, e, t, o);\r
-        };\r
-        if(o.delay){\r
-            h = createDelayed(h, o);\r
-        }\r
-        if(o.single){\r
-            h = createSingle(h, el, ename, fn, scope);\r
-        }\r
-        if(o.buffer){\r
-            h = createBuffered(h, o);\r
-        }\r
-\r
-        addListener(el, ename, fn, h, scope);\r
-        return h;\r
-    };\r
-\r
-    var propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;\r
-    var pub = {\r
-\r
-    \r
-        addListener : function(element, eventName, fn, scope, options){\r
-            if(typeof eventName == "object"){\r
-                var o = eventName;\r
-                for(var e in o){\r
-                    if(propRe.test(e)){\r
-                        continue;\r
-                    }\r
-                    if(typeof o[e] == "function"){\r
-                        // shared options\r
-                        listen(element, e, o, o[e], o.scope);\r
-                    }else{\r
-                        // individual options\r
-                        listen(element, e, o[e]);\r
-                    }\r
-                }\r
-                return;\r
-            }\r
-            return listen(element, eventName, options, fn, scope);\r
-        },\r
-\r
-        \r
-        removeListener : function(element, eventName, fn, scope){\r
-            return removeListener(element, eventName, fn, scope);\r
-        },\r
-\r
-        \r
-        removeAll : function(element){\r
-            return removeAll(element);\r
-        },\r
-\r
-        \r
-        onDocumentReady : function(fn, scope, options){\r
-            if(docReadyState){ // if it already fired\r
-                docReadyEvent.addListener(fn, scope, options);\r
-                docReadyEvent.fire();\r
-                docReadyEvent.clearListeners();\r
-                return;\r
-            }\r
-            if(!docReadyEvent){\r
-                initDocReady();\r
-            }\r
-            options = options || {};\r
-            if(!options.delay){\r
-                options.delay = 1;\r
-            }\r
-            docReadyEvent.addListener(fn, scope, options);\r
-        },\r
-        \r
-        // private\r
-        doResizeEvent: function(){\r
-            resizeEvent.fire(D.getViewWidth(), D.getViewHeight());\r
-        },\r
-\r
-        \r
-        onWindowResize : function(fn, scope, options){\r
-            if(!resizeEvent){\r
-                resizeEvent = new Ext.util.Event();\r
-                resizeTask = new Ext.util.DelayedTask(this.doResizeEvent);\r
-                E.on(window, "resize", this.fireWindowResize, this);\r
-            }\r
-            resizeEvent.addListener(fn, scope, options);\r
-        },\r
-\r
-        // exposed only to allow manual firing\r
-        fireWindowResize : function(){\r
-            if(resizeEvent){\r
-                if((Ext.isIE||Ext.isAir) && resizeTask){\r
-                    resizeTask.delay(50);\r
-                }else{\r
-                    resizeEvent.fire(D.getViewWidth(), D.getViewHeight());\r
-                }\r
-            }\r
-        },\r
-\r
-        \r
-        onTextResize : function(fn, scope, options){\r
-            if(!textEvent){\r
-                textEvent = new Ext.util.Event();\r
-                var textEl = new Ext.Element(document.createElement('div'));\r
-                textEl.dom.className = 'x-text-resize';\r
-                textEl.dom.innerHTML = 'X';\r
-                textEl.appendTo(document.body);\r
-                textSize = textEl.dom.offsetHeight;\r
-                setInterval(function(){\r
-                    if(textEl.dom.offsetHeight != textSize){\r
-                        textEvent.fire(textSize, textSize = textEl.dom.offsetHeight);\r
-                    }\r
-                }, this.textResizeInterval);\r
-            }\r
-            textEvent.addListener(fn, scope, options);\r
-        },\r
-\r
-        \r
-        removeResizeListener : function(fn, scope){\r
-            if(resizeEvent){\r
-                resizeEvent.removeListener(fn, scope);\r
-            }\r
-        },\r
-\r
-        // private\r
-        fireResize : function(){\r
-            if(resizeEvent){\r
-                resizeEvent.fire(D.getViewWidth(), D.getViewHeight());\r
-            }\r
-        },\r
-        \r
-        ieDeferSrc : false,\r
-        \r
-        textResizeInterval : 50\r
-    };\r
-     \r
-    pub.on = pub.addListener;\r
-    \r
-    pub.un = pub.removeListener;\r
-\r
-    pub.stoppedMouseDownEvent = new Ext.util.Event();\r
-    return pub;\r
-}();\r
-\r
-Ext.onReady = Ext.EventManager.onDocumentReady;\r
-\r
-\r
-// Initialize doc classes\r
-(function(){\r
-    var initExtCss = function(){\r
-        // find the body element\r
-        var bd = document.body || document.getElementsByTagName('body')[0];\r
-        if(!bd){ return false; }\r
-        var cls = [' ',\r
-                Ext.isIE ? "ext-ie " + (Ext.isIE6 ? 'ext-ie6' : (Ext.isIE7 ? 'ext-ie7' : 'ext-ie8'))\r
-                : Ext.isGecko ? "ext-gecko " + (Ext.isGecko2 ? 'ext-gecko2' : 'ext-gecko3')\r
-                : Ext.isOpera ? "ext-opera"\r
-                : Ext.isSafari ? "ext-safari"\r
-                : Ext.isChrome ? "ext-chrome" : ""];\r
-\r
-        if(Ext.isMac){\r
-            cls.push("ext-mac");\r
-        }\r
-        if(Ext.isLinux){\r
-            cls.push("ext-linux");\r
-        }\r
-        if(Ext.isBorderBox){\r
-            cls.push('ext-border-box');\r
-        }\r
-        if(Ext.isStrict){ // add to the parent to allow for selectors like ".ext-strict .ext-ie"\r
-            var p = bd.parentNode;\r
-            if(p){\r
-                p.className += ' ext-strict';\r
-            }\r
-        }\r
-        bd.className += cls.join(' ');\r
-        return true;\r
-    }\r
-\r
-    if(!initExtCss()){\r
-        Ext.onReady(initExtCss);\r
-    }\r
-})();\r
-\r
-\r
-Ext.EventObject = function(){\r
-\r
-    var E = Ext.lib.Event;\r
-\r
-    // safari keypress events for special keys return bad keycodes\r
-    var safariKeys = {\r
-        3 : 13, // enter\r
-        63234 : 37, // left\r
-        63235 : 39, // right\r
-        63232 : 38, // up\r
-        63233 : 40, // down\r
-        63276 : 33, // page up\r
-        63277 : 34, // page down\r
-        63272 : 46, // delete\r
-        63273 : 36, // home\r
-        63275 : 35  // end\r
-    };\r
-\r
-    // normalize button clicks\r
-    var btnMap = Ext.isIE ? {1:0,4:1,2:2} :\r
-                (Ext.isSafari ? {1:0,2:1,3:2} : {0:0,1:1,2:2});\r
-\r
-    Ext.EventObjectImpl = function(e){\r
-        if(e){\r
-            this.setEvent(e.browserEvent || e);\r
-        }\r
-    };\r
-\r
-    Ext.EventObjectImpl.prototype = {\r
-        \r
-        browserEvent : null,\r
-        \r
-        button : -1,\r
-        \r
-        shiftKey : false,\r
-        \r
-        ctrlKey : false,\r
-        \r
-        altKey : false,\r
-\r
-        \r
-        BACKSPACE: 8,\r
-        \r
-        TAB: 9,\r
-        \r
-        NUM_CENTER: 12,\r
-        \r
-        ENTER: 13,\r
-        \r
-        RETURN: 13,\r
-        \r
-        SHIFT: 16,\r
-        \r
-        CTRL: 17,\r
-        CONTROL : 17, // legacy\r
-        \r
-        ALT: 18,\r
-        \r
-        PAUSE: 19,\r
-        \r
-        CAPS_LOCK: 20,\r
-        \r
-        ESC: 27,\r
-        \r
-        SPACE: 32,\r
-        \r
-        PAGE_UP: 33,\r
-        PAGEUP : 33, // legacy\r
-        \r
-        PAGE_DOWN: 34,\r
-        PAGEDOWN : 34, // legacy\r
-        \r
-        END: 35,\r
-        \r
-        HOME: 36,\r
-        \r
-        LEFT: 37,\r
-        \r
-        UP: 38,\r
-        \r
-        RIGHT: 39,\r
-        \r
-        DOWN: 40,\r
-        \r
-        PRINT_SCREEN: 44,\r
-        \r
-        INSERT: 45,\r
-        \r
-        DELETE: 46,\r
-        \r
-        ZERO: 48,\r
-        \r
-        ONE: 49,\r
-        \r
-        TWO: 50,\r
-        \r
-        THREE: 51,\r
-        \r
-        FOUR: 52,\r
-        \r
-        FIVE: 53,\r
-        \r
-        SIX: 54,\r
-        \r
-        SEVEN: 55,\r
-        \r
-        EIGHT: 56,\r
-        \r
-        NINE: 57,\r
-        \r
-        A: 65,\r
-        \r
-        B: 66,\r
-        \r
-        C: 67,\r
-        \r
-        D: 68,\r
-        \r
-        E: 69,\r
-        \r
-        F: 70,\r
-        \r
-        G: 71,\r
-        \r
-        H: 72,\r
-        \r
-        I: 73,\r
-        \r
-        J: 74,\r
-        \r
-        K: 75,\r
-        \r
-        L: 76,\r
-        \r
-        M: 77,\r
-        \r
-        N: 78,\r
-        \r
-        O: 79,\r
-        \r
-        P: 80,\r
-        \r
-        Q: 81,\r
-        \r
-        R: 82,\r
-        \r
-        S: 83,\r
-        \r
-        T: 84,\r
-        \r
-        U: 85,\r
-        \r
-        V: 86,\r
-        \r
-        W: 87,\r
-        \r
-        X: 88,\r
-        \r
-        Y: 89,\r
-        \r
-        Z: 90,\r
-        \r
-        CONTEXT_MENU: 93,\r
-        \r
-        NUM_ZERO: 96,\r
-        \r
-        NUM_ONE: 97,\r
-        \r
-        NUM_TWO: 98,\r
-        \r
-        NUM_THREE: 99,\r
-        \r
-        NUM_FOUR: 100,\r
-        \r
-        NUM_FIVE: 101,\r
-        \r
-        NUM_SIX: 102,\r
-        \r
-        NUM_SEVEN: 103,\r
-        \r
-        NUM_EIGHT: 104,\r
-        \r
-        NUM_NINE: 105,\r
-        \r
-        NUM_MULTIPLY: 106,\r
-        \r
-        NUM_PLUS: 107,\r
-        \r
-        NUM_MINUS: 109,\r
-        \r
-        NUM_PERIOD: 110,\r
-        \r
-        NUM_DIVISION: 111,\r
-        \r
-        F1: 112,\r
-        \r
-        F2: 113,\r
-        \r
-        F3: 114,\r
-        \r
-        F4: 115,\r
-        \r
-        F5: 116,\r
-        \r
-        F6: 117,\r
-        \r
-        F7: 118,\r
-        \r
-        F8: 119,\r
-        \r
-        F9: 120,\r
-        \r
-        F10: 121,\r
-        \r
-        F11: 122,\r
-        \r
-        F12: 123,\r
-\r
-           \r
-        setEvent : function(e){\r
-            if(e == this || (e && e.browserEvent)){ // already wrapped\r
-                return e;\r
-            }\r
-            this.browserEvent = e;\r
-            if(e){\r
-                // normalize buttons\r
-                this.button = e.button ? btnMap[e.button] : (e.which ? e.which-1 : -1);\r
-                if(e.type == 'click' && this.button == -1){\r
-                    this.button = 0;\r
-                }\r
-                this.type = e.type;\r
-                this.shiftKey = e.shiftKey;\r
-                // mac metaKey behaves like ctrlKey\r
-                this.ctrlKey = e.ctrlKey || e.metaKey;\r
-                this.altKey = e.altKey;\r
-                // in getKey these will be normalized for the mac\r
-                this.keyCode = e.keyCode;\r
-                this.charCode = e.charCode;\r
-                // cache the target for the delayed and or buffered events\r
-                this.target = E.getTarget(e);\r
-                // same for XY\r
-                this.xy = E.getXY(e);\r
-            }else{\r
-                this.button = -1;\r
-                this.shiftKey = false;\r
-                this.ctrlKey = false;\r
-                this.altKey = false;\r
-                this.keyCode = 0;\r
-                this.charCode = 0;\r
-                this.target = null;\r
-                this.xy = [0, 0];\r
-            }\r
-            return this;\r
-        },\r
-\r
-        \r
-        stopEvent : function(){\r
-            if(this.browserEvent){\r
-                if(this.browserEvent.type == 'mousedown'){\r
-                    Ext.EventManager.stoppedMouseDownEvent.fire(this);\r
-                }\r
-                E.stopEvent(this.browserEvent);\r
-            }\r
-        },\r
-\r
-        \r
-        preventDefault : function(){\r
-            if(this.browserEvent){\r
-                E.preventDefault(this.browserEvent);\r
-            }\r
-        },\r
-\r
-        \r
-        isNavKeyPress : function(){\r
-            var k = this.keyCode;\r
-            k = Ext.isSafari ? (safariKeys[k] || k) : k;\r
-            return (k >= 33 && k <= 40) || k == this.RETURN || k == this.TAB || k == this.ESC;\r
-        },\r
-\r
-        isSpecialKey : function(){\r
-            var k = this.keyCode;\r
-            return (this.type == 'keypress' && this.ctrlKey) || k == 9 || k == 13  || k == 40 || k == 27 ||\r
-            (k == 16) || (k == 17) ||\r
-            (k >= 18 && k <= 20) ||\r
-            (k >= 33 && k <= 35) ||\r
-            (k >= 36 && k <= 39) ||\r
-            (k >= 44 && k <= 45);\r
-        },\r
-\r
-        \r
-        stopPropagation : function(){\r
-            if(this.browserEvent){\r
-                if(this.browserEvent.type == 'mousedown'){\r
-                    Ext.EventManager.stoppedMouseDownEvent.fire(this);\r
-                }\r
-                E.stopPropagation(this.browserEvent);\r
-            }\r
-        },\r
-\r
-        \r
-        getCharCode : function(){\r
-            return this.charCode || this.keyCode;\r
-        },\r
-\r
-        \r
-        getKey : function(){\r
-            var k = this.keyCode || this.charCode;\r
-            return Ext.isSafari ? (safariKeys[k] || k) : k;\r
-        },\r
-\r
-        \r
-        getPageX : function(){\r
-            return this.xy[0];\r
-        },\r
-\r
-        \r
-        getPageY : function(){\r
-            return this.xy[1];\r
-        },\r
-\r
-        \r
-        getTime : function(){\r
-            if(this.browserEvent){\r
-                return E.getTime(this.browserEvent);\r
-            }\r
-            return null;\r
-        },\r
-\r
-        \r
-        getXY : function(){\r
-            return this.xy;\r
-        },\r
-\r
-        \r
-        getTarget : function(selector, maxDepth, returnEl){\r
-            return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : (returnEl ? Ext.get(this.target) : this.target);\r
-        },\r
-\r
-        \r
-        getRelatedTarget : function(){\r
-            if(this.browserEvent){\r
-                return E.getRelatedTarget(this.browserEvent);\r
-            }\r
-            return null;\r
-        },\r
-\r
-        \r
-        getWheelDelta : function(){\r
-            var e = this.browserEvent;\r
-            var delta = 0;\r
-            if(e.wheelDelta){ \r
-                delta = e.wheelDelta/120;\r
-            }else if(e.detail){ \r
-                delta = -e.detail/3;\r
-            }\r
-            return delta;\r
-        },\r
-\r
-        \r
-        hasModifier : function(){\r
-            return ((this.ctrlKey || this.altKey) || this.shiftKey) ? true : false;\r
-        },\r
-\r
-        \r
-        within : function(el, related, allowEl){\r
-            var t = this[related ? "getRelatedTarget" : "getTarget"]();\r
-            return t && ((allowEl ? (t === Ext.getDom(el)) : false) || Ext.fly(el).contains(t));\r
-        },\r
-\r
-        getPoint : function(){\r
-            return new Ext.lib.Point(this.xy[0], this.xy[1]);\r
-        }\r
-    };\r
-\r
-    return new Ext.EventObjectImpl();\r
-}();\r
-\r
-(function(){\r
-var D = Ext.lib.Dom;\r
-var E = Ext.lib.Event;\r
-var A = Ext.lib.Anim;\r
-\r
-// local style camelizing for speed\r
-var propCache = {};\r
-var camelRe = /(-[a-z])/gi;\r
-var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); };\r
-var view = document.defaultView;\r
-\r
-Ext.Element = function(element, forceNew){\r
-    var dom = typeof element == "string" ?\r
-            document.getElementById(element) : element;\r
-    if(!dom){ // invalid id/element\r
-        return null;\r
-    }\r
-    var id = dom.id;\r
-    if(forceNew !== true && id && Ext.Element.cache[id]){ // element object already exists\r
-        return Ext.Element.cache[id];\r
-    }\r
-\r
-    \r
-    this.dom = dom;\r
-\r
-    \r
-    this.id = id || Ext.id(dom);\r
-};\r
-\r
-var El = Ext.Element;\r
-\r
-El.prototype = {\r
-    \r
-    originalDisplay : "",\r
-\r
-    visibilityMode : 1,\r
-    \r
-    defaultUnit : "px",\r
-    \r
-    setVisibilityMode : function(visMode){\r
-        this.visibilityMode = visMode;\r
-        return this;\r
-    },\r
-    \r
-    enableDisplayMode : function(display){\r
-        this.setVisibilityMode(El.DISPLAY);\r
-        if(typeof display != "undefined") this.originalDisplay = display;\r
-        return this;\r
-    },\r
-\r
-    \r
-    findParent : function(simpleSelector, maxDepth, returnEl){\r
-        var p = this.dom, b = document.body, depth = 0, dq = Ext.DomQuery, stopEl;\r
-        maxDepth = maxDepth || 50;\r
-        if(typeof maxDepth != "number"){\r
-            stopEl = Ext.getDom(maxDepth);\r
-            maxDepth = 10;\r
-        }\r
-        while(p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl){\r
-            if(dq.is(p, simpleSelector)){\r
-                return returnEl ? Ext.get(p) : p;\r
-            }\r
-            depth++;\r
-            p = p.parentNode;\r
-        }\r
-        return null;\r
-    },\r
-\r
-\r
-    \r
-    findParentNode : function(simpleSelector, maxDepth, returnEl){\r
-        var p = Ext.fly(this.dom.parentNode, '_internal');\r
-        return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null;\r
-    },\r
-\r
-    \r
-    up : function(simpleSelector, maxDepth){\r
-        return this.findParentNode(simpleSelector, maxDepth, true);\r
-    },\r
-\r
-\r
-\r
-    \r
-    is : function(simpleSelector){\r
-        return Ext.DomQuery.is(this.dom, simpleSelector);\r
-    },\r
-\r
-    \r
-    animate : function(args, duration, onComplete, easing, animType){\r
-        this.anim(args, {duration: duration, callback: onComplete, easing: easing}, animType);\r
-        return this;\r
-    },\r
-\r
-    \r
-    anim : function(args, opt, animType, defaultDur, defaultEase, cb){\r
-        animType = animType || 'run';\r
-        opt = opt || {};\r
-        var anim = Ext.lib.Anim[animType](\r
-            this.dom, args,\r
-            (opt.duration || defaultDur) || .35,\r
-            (opt.easing || defaultEase) || 'easeOut',\r
-            function(){\r
-                Ext.callback(cb, this);\r
-                Ext.callback(opt.callback, opt.scope || this, [this, opt]);\r
-            },\r
-            this\r
-        );\r
-        opt.anim = anim;\r
-        return anim;\r
-    },\r
-\r
-    // private legacy anim prep\r
-    preanim : function(a, i){\r
-        return !a[i] ? false : (typeof a[i] == "object" ? a[i]: {duration: a[i+1], callback: a[i+2], easing: a[i+3]});\r
-    },\r
-\r
-    \r
-    clean : function(forceReclean){\r
-        if(this.isCleaned && forceReclean !== true){\r
-            return this;\r
-        }\r
-        var ns = /\S/;\r
-        var d = this.dom, n = d.firstChild, ni = -1;\r
-           while(n){\r
-               var nx = n.nextSibling;\r
-               if(n.nodeType == 3 && !ns.test(n.nodeValue)){\r
-                   d.removeChild(n);\r
-               }else{\r
-                   n.nodeIndex = ++ni;\r
-               }\r
-               n = nx;\r
-           }\r
-           this.isCleaned = true;\r
-           return this;\r
-       },\r
-\r
-    \r
-    scrollIntoView : function(container, hscroll){\r
-        var c = Ext.getDom(container) || Ext.getBody().dom;\r
-        var el = this.dom;\r
-\r
-        var o = this.getOffsetsTo(c),\r
-            l = o[0] + c.scrollLeft,\r
-            t = o[1] + c.scrollTop,\r
-            b = t+el.offsetHeight,\r
-            r = l+el.offsetWidth;\r
-\r
-        var ch = c.clientHeight;\r
-        var ct = parseInt(c.scrollTop, 10);\r
-        var cl = parseInt(c.scrollLeft, 10);\r
-        var cb = ct + ch;\r
-        var cr = cl + c.clientWidth;\r
-\r
-        if(el.offsetHeight > ch || t < ct){\r
-               c.scrollTop = t;\r
-        }else if(b > cb){\r
-            c.scrollTop = b-ch;\r
-        }\r
-        c.scrollTop = c.scrollTop; // corrects IE, other browsers will ignore\r
-\r
-        if(hscroll !== false){\r
-                       if(el.offsetWidth > c.clientWidth || l < cl){\r
-                c.scrollLeft = l;\r
-            }else if(r > cr){\r
-                c.scrollLeft = r-c.clientWidth;\r
-            }\r
-            c.scrollLeft = c.scrollLeft;\r
-        }\r
-        return this;\r
-    },\r
-\r
-    // private\r
-    scrollChildIntoView : function(child, hscroll){\r
-        Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll);\r
-    },\r
-\r
-    \r
-    autoHeight : function(animate, duration, onComplete, easing){\r
-        var oldHeight = this.getHeight();\r
-        this.clip();\r
-        this.setHeight(1); // force clipping\r
-        setTimeout(function(){\r
-            var height = parseInt(this.dom.scrollHeight, 10); // parseInt for Safari\r
-            if(!animate){\r
-                this.setHeight(height);\r
-                this.unclip();\r
-                if(typeof onComplete == "function"){\r
-                    onComplete();\r
-                }\r
-            }else{\r
-                this.setHeight(oldHeight); // restore original height\r
-                this.setHeight(height, animate, duration, function(){\r
-                    this.unclip();\r
-                    if(typeof onComplete == "function") onComplete();\r
-                }.createDelegate(this), easing);\r
-            }\r
-        }.createDelegate(this), 0);\r
-        return this;\r
-    },\r
-\r
-    \r
-    contains : function(el){\r
-        if(!el){return false;}\r
-        return D.isAncestor(this.dom, el.dom ? el.dom : el);\r
-    },\r
-\r
-    \r
-    isVisible : function(deep) {\r
-        var vis = !(this.getStyle("visibility") == "hidden" || this.getStyle("display") == "none");\r
-        if(deep !== true || !vis){\r
-            return vis;\r
-        }\r
-        var p = this.dom.parentNode;\r
-        while(p && p.tagName.toLowerCase() != "body"){\r
-            if(!Ext.fly(p, '_isVisible').isVisible()){\r
-                return false;\r
-            }\r
-            p = p.parentNode;\r
-        }\r
-        return true;\r
-    },\r
-\r
-    \r
-    select : function(selector, unique){\r
-        return El.select(selector, unique, this.dom);\r
-    },\r
-\r
-    \r
-    query : function(selector){\r
-        return Ext.DomQuery.select(selector, this.dom);\r
-    },\r
-\r
-    \r
-    child : function(selector, returnDom){\r
-        var n = Ext.DomQuery.selectNode(selector, this.dom);\r
-        return returnDom ? n : Ext.get(n);\r
-    },\r
-\r
-    \r
-    down : function(selector, returnDom){\r
-        var n = Ext.DomQuery.selectNode(" > " + selector, this.dom);\r
-        return returnDom ? n : Ext.get(n);\r
-    },\r
-\r
-    \r
-    initDD : function(group, config, overrides){\r
-        var dd = new Ext.dd.DD(Ext.id(this.dom), group, config);\r
-        return Ext.apply(dd, overrides);\r
-    },\r
-\r
-    \r
-    initDDProxy : function(group, config, overrides){\r
-        var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config);\r
-        return Ext.apply(dd, overrides);\r
-    },\r
-\r
-    \r
-    initDDTarget : function(group, config, overrides){\r
-        var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config);\r
-        return Ext.apply(dd, overrides);\r
-    },\r
-\r
-    \r
-     setVisible : function(visible, animate){\r
-        if(!animate || !A){\r
-            if(this.visibilityMode == El.DISPLAY){\r
-                this.setDisplayed(visible);\r
-            }else{\r
-                this.fixDisplay();\r
-                this.dom.style.visibility = visible ? "visible" : "hidden";\r
-            }\r
-        }else{\r
-            // closure for composites\r
-            var dom = this.dom;\r
-            var visMode = this.visibilityMode;\r
-            if(visible){\r
-                this.setOpacity(.01);\r
-                this.setVisible(true);\r
-            }\r
-            this.anim({opacity: { to: (visible?1:0) }},\r
-                  this.preanim(arguments, 1),\r
-                  null, .35, 'easeIn', function(){\r
-                     if(!visible){\r
-                         if(visMode == El.DISPLAY){\r
-                             dom.style.display = "none";\r
-                         }else{\r
-                             dom.style.visibility = "hidden";\r
-                         }\r
-                         Ext.get(dom).setOpacity(1);\r
-                     }\r
-                 });\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    isDisplayed : function() {\r
-        return this.getStyle("display") != "none";\r
-    },\r
-\r
-    \r
-    toggle : function(animate){\r
-        this.setVisible(!this.isVisible(), this.preanim(arguments, 0));\r
-        return this;\r
-    },\r
-\r
-    \r
-    setDisplayed : function(value) {\r
-        if(typeof value == "boolean"){\r
-           value = value ? this.originalDisplay : "none";\r
-        }\r
-        this.setStyle("display", value);\r
-        return this;\r
-    },\r
-\r
-    \r
-    focus : function() {\r
-        try{\r
-            this.dom.focus();\r
-        }catch(e){}\r
-        return this;\r
-    },\r
-\r
-    \r
-    blur : function() {\r
-        try{\r
-            this.dom.blur();\r
-        }catch(e){}\r
-        return this;\r
-    },\r
-\r
-    \r
-    addClass : function(className){\r
-        if(Ext.isArray(className)){\r
-            for(var i = 0, len = className.length; i < len; i++) {\r
-               this.addClass(className[i]);\r
-            }\r
-        }else{\r
-            if(className && !this.hasClass(className)){\r
-                this.dom.className = this.dom.className + " " + className;\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    radioClass : function(className){\r
-        var siblings = this.dom.parentNode.childNodes;\r
-        for(var i = 0; i < siblings.length; i++) {\r
-               var s = siblings[i];\r
-               if(s.nodeType == 1){\r
-                   Ext.get(s).removeClass(className);\r
-               }\r
-        }\r
-        this.addClass(className);\r
-        return this;\r
-    },\r
-\r
-    \r
-    removeClass : function(className){\r
-        if(!className || !this.dom.className){\r
-            return this;\r
-        }\r
-        if(Ext.isArray(className)){\r
-            for(var i = 0, len = className.length; i < len; i++) {\r
-               this.removeClass(className[i]);\r
-            }\r
-        }else{\r
-            if(this.hasClass(className)){\r
-                var re = this.classReCache[className];\r
-                if (!re) {\r
-                   re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', "g");\r
-                   this.classReCache[className] = re;\r
-                }\r
-                this.dom.className =\r
-                    this.dom.className.replace(re, " ");\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-\r
-    // private\r
-    classReCache: {},\r
-\r
-    \r
-    toggleClass : function(className){\r
-        if(this.hasClass(className)){\r
-            this.removeClass(className);\r
-        }else{\r
-            this.addClass(className);\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    hasClass : function(className){\r
-        return className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1;\r
-    },\r
-\r
-    \r
-    replaceClass : function(oldClassName, newClassName){\r
-        this.removeClass(oldClassName);\r
-        this.addClass(newClassName);\r
-        return this;\r
-    },\r
-\r
-    \r
-    getStyles : function(){\r
-        var a = arguments, len = a.length, r = {};\r
-        for(var i = 0; i < len; i++){\r
-            r[a[i]] = this.getStyle(a[i]);\r
-        }\r
-        return r;\r
-    },\r
-\r
-    \r
-    getStyle : function(){\r
-        return view && view.getComputedStyle ?\r
-            function(prop){\r
-                var el = this.dom, v, cs, camel;\r
-                if(prop == 'float'){\r
-                    prop = "cssFloat";\r
-                }\r
-                if(v = el.style[prop]){\r
-                    return v;\r
-                }\r
-                if(cs = view.getComputedStyle(el, "")){\r
-                    if(!(camel = propCache[prop])){\r
-                        camel = propCache[prop] = prop.replace(camelRe, camelFn);\r
-                    }\r
-                    return cs[camel];\r
-                }\r
-                return null;\r
-            } :\r
-            function(prop){\r
-                var el = this.dom, v, cs, camel;\r
-                if(prop == 'opacity'){\r
-                    if(typeof el.style.filter == 'string'){\r
-                        var m = el.style.filter.match(/alpha\(opacity=(.*)\)/i);\r
-                        if(m){\r
-                            var fv = parseFloat(m[1]);\r
-                            if(!isNaN(fv)){\r
-                                return fv ? fv / 100 : 0;\r
-                            }\r
-                        }\r
-                    }\r
-                    return 1;\r
-                }else if(prop == 'float'){\r
-                    prop = "styleFloat";\r
-                }\r
-                if(!(camel = propCache[prop])){\r
-                    camel = propCache[prop] = prop.replace(camelRe, camelFn);\r
-                }\r
-                if(v = el.style[camel]){\r
-                    return v;\r
-                }\r
-                if(cs = el.currentStyle){\r
-                    return cs[camel];\r
-                }\r
-                return null;\r
-            };\r
-    }(),\r
-\r
-    \r
-    setStyle : function(prop, value){\r
-        if(typeof prop == "string"){\r
-            var camel;\r
-            if(!(camel = propCache[prop])){\r
-                camel = propCache[prop] = prop.replace(camelRe, camelFn);\r
-            }\r
-            if(camel == 'opacity') {\r
-                this.setOpacity(value);\r
-            }else{\r
-                this.dom.style[camel] = value;\r
-            }\r
-        }else{\r
-            for(var style in prop){\r
-                if(typeof prop[style] != "function"){\r
-                   this.setStyle(style, prop[style]);\r
-                }\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    applyStyles : function(style){\r
-        Ext.DomHelper.applyStyles(this.dom, style);\r
-        return this;\r
-    },\r
-\r
-    \r
-    getX : function(){\r
-        return D.getX(this.dom);\r
-    },\r
-\r
-    \r
-    getY : function(){\r
-        return D.getY(this.dom);\r
-    },\r
-\r
-    \r
-    getXY : function(){\r
-        return D.getXY(this.dom);\r
-    },\r
-\r
-    \r
-    getOffsetsTo : function(el){\r
-        var o = this.getXY();\r
-        var e = Ext.fly(el, '_internal').getXY();\r
-        return [o[0]-e[0],o[1]-e[1]];\r
-    },\r
-\r
-    \r
-    setX : function(x, animate){\r
-        if(!animate || !A){\r
-            D.setX(this.dom, x);\r
-        }else{\r
-            this.setXY([x, this.getY()], this.preanim(arguments, 1));\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    setY : function(y, animate){\r
-        if(!animate || !A){\r
-            D.setY(this.dom, y);\r
-        }else{\r
-            this.setXY([this.getX(), y], this.preanim(arguments, 1));\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    setLeft : function(left){\r
-        this.setStyle("left", this.addUnits(left));\r
-        return this;\r
-    },\r
-\r
-    \r
-    setTop : function(top){\r
-        this.setStyle("top", this.addUnits(top));\r
-        return this;\r
-    },\r
-\r
-    \r
-    setRight : function(right){\r
-        this.setStyle("right", this.addUnits(right));\r
-        return this;\r
-    },\r
-\r
-    \r
-    setBottom : function(bottom){\r
-        this.setStyle("bottom", this.addUnits(bottom));\r
-        return this;\r
-    },\r
-\r
-    \r
-    setXY : function(pos, animate){\r
-        if(!animate || !A){\r
-            D.setXY(this.dom, pos);\r
-        }else{\r
-            this.anim({points: {to: pos}}, this.preanim(arguments, 1), 'motion');\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    setLocation : function(x, y, animate){\r
-        this.setXY([x, y], this.preanim(arguments, 2));\r
-        return this;\r
-    },\r
-\r
-    \r
-    moveTo : function(x, y, animate){\r
-        this.setXY([x, y], this.preanim(arguments, 2));\r
-        return this;\r
-    },\r
-\r
-    \r
-    getRegion : function(){\r
-        return D.getRegion(this.dom);\r
-    },\r
-\r
-    \r
-    getHeight : function(contentHeight){\r
-        var h = this.dom.offsetHeight || 0;\r
-        h = contentHeight !== true ? h : h-this.getBorderWidth("tb")-this.getPadding("tb");\r
-        return h < 0 ? 0 : h;\r
-    },\r
-\r
-    \r
-    getWidth : function(contentWidth){\r
-        var w = this.dom.offsetWidth || 0;\r
-        w = contentWidth !== true ? w : w-this.getBorderWidth("lr")-this.getPadding("lr");\r
-        return w < 0 ? 0 : w;\r
-    },\r
-\r
-    \r
-    getComputedHeight : function(){\r
-        var h = Math.max(this.dom.offsetHeight, this.dom.clientHeight);\r
-        if(!h){\r
-            h = parseInt(this.getStyle('height'), 10) || 0;\r
-            if(!this.isBorderBox()){\r
-                h += this.getFrameWidth('tb');\r
-            }\r
-        }\r
-        return h;\r
-    },\r
-\r
-    \r
-    getComputedWidth : function(){\r
-        var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth);\r
-        if(!w){\r
-            w = parseInt(this.getStyle('width'), 10) || 0;\r
-            if(!this.isBorderBox()){\r
-                w += this.getFrameWidth('lr');\r
-            }\r
-        }\r
-        return w;\r
-    },\r
-\r
-    \r
-    getSize : function(contentSize){\r
-        return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)};\r
-    },\r
-\r
-    getStyleSize : function(){\r
-        var w, h, d = this.dom, s = d.style;\r
-        if(s.width && s.width != 'auto'){\r
-            w = parseInt(s.width, 10);\r
-            if(Ext.isBorderBox){\r
-               w -= this.getFrameWidth('lr');\r
-            }\r
-        }\r
-        if(s.height && s.height != 'auto'){\r
-            h = parseInt(s.height, 10);\r
-            if(Ext.isBorderBox){\r
-               h -= this.getFrameWidth('tb');\r
-            }\r
-        }\r
-        return {width: w || this.getWidth(true), height: h || this.getHeight(true)};\r
-\r
-    },\r
-\r
-    \r
-    getViewSize : function(){\r
-        var d = this.dom, doc = document, aw = 0, ah = 0;\r
-        if(d == doc || d == doc.body){\r
-            return {width : D.getViewWidth(), height: D.getViewHeight()};\r
-        }else{\r
-            return {\r
-                width : d.clientWidth,\r
-                height: d.clientHeight\r
-            };\r
-        }\r
-    },\r
-\r
-    \r
-    getValue : function(asNumber){\r
-        return asNumber ? parseInt(this.dom.value, 10) : this.dom.value;\r
-    },\r
-\r
-    // private\r
-    adjustWidth : function(width){\r
-        if(typeof width == "number"){\r
-            if(this.autoBoxAdjust && !this.isBorderBox()){\r
-               width -= (this.getBorderWidth("lr") + this.getPadding("lr"));\r
-            }\r
-            if(width < 0){\r
-                width = 0;\r
-            }\r
-        }\r
-        return width;\r
-    },\r
-\r
-    // private\r
-    adjustHeight : function(height){\r
-        if(typeof height == "number"){\r
-           if(this.autoBoxAdjust && !this.isBorderBox()){\r
-               height -= (this.getBorderWidth("tb") + this.getPadding("tb"));\r
-           }\r
-           if(height < 0){\r
-               height = 0;\r
-           }\r
-        }\r
-        return height;\r
-    },\r
-\r
-    \r
-    setWidth : function(width, animate){\r
-        width = this.adjustWidth(width);\r
-        if(!animate || !A){\r
-            this.dom.style.width = this.addUnits(width);\r
-        }else{\r
-            this.anim({width: {to: width}}, this.preanim(arguments, 1));\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-     setHeight : function(height, animate){\r
-        height = this.adjustHeight(height);\r
-        if(!animate || !A){\r
-            this.dom.style.height = this.addUnits(height);\r
-        }else{\r
-            this.anim({height: {to: height}}, this.preanim(arguments, 1));\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-     setSize : function(width, height, animate){\r
-        if(typeof width == "object"){ // in case of object from getSize()\r
-            height = width.height; width = width.width;\r
-        }\r
-        width = this.adjustWidth(width); height = this.adjustHeight(height);\r
-        if(!animate || !A){\r
-            this.dom.style.width = this.addUnits(width);\r
-            this.dom.style.height = this.addUnits(height);\r
-        }else{\r
-            this.anim({width: {to: width}, height: {to: height}}, this.preanim(arguments, 2));\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    setBounds : function(x, y, width, height, animate){\r
-        if(!animate || !A){\r
-            this.setSize(width, height);\r
-            this.setLocation(x, y);\r
-        }else{\r
-            width = this.adjustWidth(width); height = this.adjustHeight(height);\r
-            this.anim({points: {to: [x, y]}, width: {to: width}, height: {to: height}},\r
-                          this.preanim(arguments, 4), 'motion');\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    setRegion : function(region, animate){\r
-        this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, this.preanim(arguments, 1));\r
-        return this;\r
-    },\r
-\r
-    \r
-    addListener : function(eventName, fn, scope, options){\r
-        Ext.EventManager.on(this.dom,  eventName, fn, scope || this, options);\r
-    },\r
-\r
-    \r
-    removeListener : function(eventName, fn, scope){\r
-        Ext.EventManager.removeListener(this.dom,  eventName, fn, scope || this);\r
-        return this;\r
-    },\r
-\r
-    \r
-    removeAllListeners : function(){\r
-        Ext.EventManager.removeAll(this.dom);\r
-        return this;\r
-    },\r
-\r
-    \r
-    relayEvent : function(eventName, observable){\r
-        this.on(eventName, function(e){\r
-            observable.fireEvent(eventName, e);\r
-        });\r
-    },\r
-\r
-    \r
-     setOpacity : function(opacity, animate){\r
-        if(!animate || !A){\r
-            var s = this.dom.style;\r
-            if(Ext.isIE){\r
-                s.zoom = 1;\r
-                s.filter = (s.filter || '').replace(/alpha\([^\)]*\)/gi,"") +\r
-                           (opacity == 1 ? "" : " alpha(opacity=" + opacity * 100 + ")");\r
-            }else{\r
-                s.opacity = opacity;\r
-            }\r
-        }else{\r
-            this.anim({opacity: {to: opacity}}, this.preanim(arguments, 1), null, .35, 'easeIn');\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    getLeft : function(local){\r
-        if(!local){\r
-            return this.getX();\r
-        }else{\r
-            return parseInt(this.getStyle("left"), 10) || 0;\r
-        }\r
-    },\r
-\r
-    \r
-    getRight : function(local){\r
-        if(!local){\r
-            return this.getX() + this.getWidth();\r
-        }else{\r
-            return (this.getLeft(true) + this.getWidth()) || 0;\r
-        }\r
-    },\r
-\r
-    \r
-    getTop : function(local) {\r
-        if(!local){\r
-            return this.getY();\r
-        }else{\r
-            return parseInt(this.getStyle("top"), 10) || 0;\r
-        }\r
-    },\r
-\r
-    \r
-    getBottom : function(local){\r
-        if(!local){\r
-            return this.getY() + this.getHeight();\r
-        }else{\r
-            return (this.getTop(true) + this.getHeight()) || 0;\r
-        }\r
-    },\r
-\r
-    \r
-    position : function(pos, zIndex, x, y){\r
-        if(!pos){\r
-           if(this.getStyle('position') == 'static'){\r
-               this.setStyle('position', 'relative');\r
-           }\r
-        }else{\r
-            this.setStyle("position", pos);\r
-        }\r
-        if(zIndex){\r
-            this.setStyle("z-index", zIndex);\r
-        }\r
-        if(x !== undefined && y !== undefined){\r
-            this.setXY([x, y]);\r
-        }else if(x !== undefined){\r
-            this.setX(x);\r
-        }else if(y !== undefined){\r
-            this.setY(y);\r
-        }\r
-    },\r
-\r
-    \r
-    clearPositioning : function(value){\r
-        value = value ||'';\r
-        this.setStyle({\r
-            "left": value,\r
-            "right": value,\r
-            "top": value,\r
-            "bottom": value,\r
-            "z-index": "",\r
-            "position" : "static"\r
-        });\r
-        return this;\r
-    },\r
-\r
-    \r
-    getPositioning : function(){\r
-        var l = this.getStyle("left");\r
-        var t = this.getStyle("top");\r
-        return {\r
-            "position" : this.getStyle("position"),\r
-            "left" : l,\r
-            "right" : l ? "" : this.getStyle("right"),\r
-            "top" : t,\r
-            "bottom" : t ? "" : this.getStyle("bottom"),\r
-            "z-index" : this.getStyle("z-index")\r
-        };\r
-    },\r
-\r
-    \r
-    getBorderWidth : function(side){\r
-        return this.addStyles(side, El.borders);\r
-    },\r
-\r
-    \r
-    getPadding : function(side){\r
-        return this.addStyles(side, El.paddings);\r
-    },\r
-\r
-    \r
-    setPositioning : function(pc){\r
-        this.applyStyles(pc);\r
-        if(pc.right == "auto"){\r
-            this.dom.style.right = "";\r
-        }\r
-        if(pc.bottom == "auto"){\r
-            this.dom.style.bottom = "";\r
-        }\r
-        return this;\r
-    },\r
-\r
-    // private\r
-    fixDisplay : function(){\r
-        if(this.getStyle("display") == "none"){\r
-            this.setStyle("visibility", "hidden");\r
-            this.setStyle("display", this.originalDisplay); // first try reverting to default\r
-            if(this.getStyle("display") == "none"){ // if that fails, default to block\r
-                this.setStyle("display", "block");\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-       setOverflow : function(v){\r
-       if(v=='auto' && Ext.isMac && Ext.isGecko2){ // work around stupid FF 2.0/Mac scroll bar bug\r
-               this.dom.style.overflow = 'hidden';\r
-               (function(){this.dom.style.overflow = 'auto';}).defer(1, this);\r
-       }else{\r
-               this.dom.style.overflow = v;\r
-       }\r
-       },\r
-\r
-    \r
-     setLeftTop : function(left, top){\r
-        this.dom.style.left = this.addUnits(left);\r
-        this.dom.style.top = this.addUnits(top);\r
-        return this;\r
-    },\r
-\r
-    \r
-     move : function(direction, distance, animate){\r
-        var xy = this.getXY();\r
-        direction = direction.toLowerCase();\r
-        switch(direction){\r
-            case "l":\r
-            case "left":\r
-                this.moveTo(xy[0]-distance, xy[1], this.preanim(arguments, 2));\r
-                break;\r
-           case "r":\r
-           case "right":\r
-                this.moveTo(xy[0]+distance, xy[1], this.preanim(arguments, 2));\r
-                break;\r
-           case "t":\r
-           case "top":\r
-           case "up":\r
-                this.moveTo(xy[0], xy[1]-distance, this.preanim(arguments, 2));\r
-                break;\r
-           case "b":\r
-           case "bottom":\r
-           case "down":\r
-                this.moveTo(xy[0], xy[1]+distance, this.preanim(arguments, 2));\r
-                break;\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    clip : function(){\r
-        if(!this.isClipped){\r
-           this.isClipped = true;\r
-           this.originalClip = {\r
-               "o": this.getStyle("overflow"),\r
-               "x": this.getStyle("overflow-x"),\r
-               "y": this.getStyle("overflow-y")\r
-           };\r
-           this.setStyle("overflow", "hidden");\r
-           this.setStyle("overflow-x", "hidden");\r
-           this.setStyle("overflow-y", "hidden");\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    unclip : function(){\r
-        if(this.isClipped){\r
-            this.isClipped = false;\r
-            var o = this.originalClip;\r
-            if(o.o){this.setStyle("overflow", o.o);}\r
-            if(o.x){this.setStyle("overflow-x", o.x);}\r
-            if(o.y){this.setStyle("overflow-y", o.y);}\r
-        }\r
-        return this;\r
-    },\r
-\r
-\r
-    \r
-    getAnchorXY : function(anchor, local, s){\r
-        //Passing a different size is useful for pre-calculating anchors,\r
-        //especially for anchored animations that change the el size.\r
-\r
-        var w, h, vp = false;\r
-        if(!s){\r
-            var d = this.dom;\r
-            if(d == document.body || d == document){\r
-                vp = true;\r
-                w = D.getViewWidth(); h = D.getViewHeight();\r
-            }else{\r
-                w = this.getWidth(); h = this.getHeight();\r
-            }\r
-        }else{\r
-            w = s.width;  h = s.height;\r
-        }\r
-        var x = 0, y = 0, r = Math.round;\r
-        switch((anchor || "tl").toLowerCase()){\r
-            case "c":\r
-                x = r(w*.5);\r
-                y = r(h*.5);\r
-            break;\r
-            case "t":\r
-                x = r(w*.5);\r
-                y = 0;\r
-            break;\r
-            case "l":\r
-                x = 0;\r
-                y = r(h*.5);\r
-            break;\r
-            case "r":\r
-                x = w;\r
-                y = r(h*.5);\r
-            break;\r
-            case "b":\r
-                x = r(w*.5);\r
-                y = h;\r
-            break;\r
-            case "tl":\r
-                x = 0;\r
-                y = 0;\r
-            break;\r
-            case "bl":\r
-                x = 0;\r
-                y = h;\r
-            break;\r
-            case "br":\r
-                x = w;\r
-                y = h;\r
-            break;\r
-            case "tr":\r
-                x = w;\r
-                y = 0;\r
-            break;\r
-        }\r
-        if(local === true){\r
-            return [x, y];\r
-        }\r
-        if(vp){\r
-            var sc = this.getScroll();\r
-            return [x + sc.left, y + sc.top];\r
-        }\r
-        //Add the element's offset xy\r
-        var o = this.getXY();\r
-        return [x+o[0], y+o[1]];\r
-    },\r
-\r
-    \r
-    getAlignToXY : function(el, p, o){\r
-        el = Ext.get(el);\r
-        if(!el || !el.dom){\r
-            throw "Element.alignToXY with an element that doesn't exist";\r
-        }\r
-        var d = this.dom;\r
-        var c = false; //constrain to viewport\r
-        var p1 = "", p2 = "";\r
-        o = o || [0,0];\r
-\r
-        if(!p){\r
-            p = "tl-bl";\r
-        }else if(p == "?"){\r
-            p = "tl-bl?";\r
-        }else if(p.indexOf("-") == -1){\r
-            p = "tl-" + p;\r
-        }\r
-        p = p.toLowerCase();\r
-        var m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/);\r
-        if(!m){\r
-           throw "Element.alignTo with an invalid alignment " + p;\r
-        }\r
-        p1 = m[1]; p2 = m[2]; c = !!m[3];\r
-\r
-        //Subtract the aligned el's internal xy from the target's offset xy\r
-        //plus custom offset to get the aligned el's new offset xy\r
-        var a1 = this.getAnchorXY(p1, true);\r
-        var a2 = el.getAnchorXY(p2, false);\r
-\r
-        var x = a2[0] - a1[0] + o[0];\r
-        var y = a2[1] - a1[1] + o[1];\r
-\r
-        if(c){\r
-            //constrain the aligned el to viewport if necessary\r
-            var w = this.getWidth(), h = this.getHeight(), r = el.getRegion();\r
-            // 5px of margin for ie\r
-            var dw = D.getViewWidth()-5, dh = D.getViewHeight()-5;\r
-\r
-            //If we are at a viewport boundary and the aligned el is anchored on a target border that is\r
-            //perpendicular to the vp border, allow the aligned el to slide on that border,\r
-            //otherwise swap the aligned el to the opposite border of the target.\r
-            var p1y = p1.charAt(0), p1x = p1.charAt(p1.length-1);\r
-           var p2y = p2.charAt(0), p2x = p2.charAt(p2.length-1);\r
-           var swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t"));\r
-           var swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r"));\r
-\r
-           var doc = document;\r
-           var scrollX = (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0)+5;\r
-           var scrollY = (doc.documentElement.scrollTop || doc.body.scrollTop || 0)+5;\r
-\r
-           if((x+w) > dw + scrollX){\r
-                x = swapX ? r.left-w : dw+scrollX-w;\r
-            }\r
-           if(x < scrollX){\r
-               x = swapX ? r.right : scrollX;\r
-           }\r
-           if((y+h) > dh + scrollY){\r
-                y = swapY ? r.top-h : dh+scrollY-h;\r
-            }\r
-           if (y < scrollY){\r
-               y = swapY ? r.bottom : scrollY;\r
-           }\r
-        }\r
-        return [x,y];\r
-    },\r
-\r
-    // private\r
-    getConstrainToXY : function(){\r
-        var os = {top:0, left:0, bottom:0, right: 0};\r
-\r
-        return function(el, local, offsets, proposedXY){\r
-            el = Ext.get(el);\r
-            offsets = offsets ? Ext.applyIf(offsets, os) : os;\r
-\r
-            var vw, vh, vx = 0, vy = 0;\r
-            if(el.dom == document.body || el.dom == document){\r
-                vw = Ext.lib.Dom.getViewWidth();\r
-                vh = Ext.lib.Dom.getViewHeight();\r
-            }else{\r
-                vw = el.dom.clientWidth;\r
-                vh = el.dom.clientHeight;\r
-                if(!local){\r
-                    var vxy = el.getXY();\r
-                    vx = vxy[0];\r
-                    vy = vxy[1];\r
-                }\r
-            }\r
-\r
-            var s = el.getScroll();\r
-\r
-            vx += offsets.left + s.left;\r
-            vy += offsets.top + s.top;\r
-\r
-            vw -= offsets.right;\r
-            vh -= offsets.bottom;\r
-\r
-            var vr = vx+vw;\r
-            var vb = vy+vh;\r
-\r
-            var xy = proposedXY || (!local ? this.getXY() : [this.getLeft(true), this.getTop(true)]);\r
-            var x = xy[0], y = xy[1];\r
-            var w = this.dom.offsetWidth, h = this.dom.offsetHeight;\r
-\r
-            // only move it if it needs it\r
-            var moved = false;\r
-\r
-            // first validate right/bottom\r
-            if((x + w) > vr){\r
-                x = vr - w;\r
-                moved = true;\r
-            }\r
-            if((y + h) > vb){\r
-                y = vb - h;\r
-                moved = true;\r
-            }\r
-            // then make sure top/left isn't negative\r
-            if(x < vx){\r
-                x = vx;\r
-                moved = true;\r
-            }\r
-            if(y < vy){\r
-                y = vy;\r
-                moved = true;\r
-            }\r
-            return moved ? [x, y] : false;\r
-        };\r
-    }(),\r
-\r
-    // private\r
-    adjustForConstraints : function(xy, parent, offsets){\r
-        return this.getConstrainToXY(parent || document, false, offsets, xy) ||  xy;\r
-    },\r
-\r
-    \r
-    alignTo : function(element, position, offsets, animate){\r
-        var xy = this.getAlignToXY(element, position, offsets);\r
-        this.setXY(xy, this.preanim(arguments, 3));\r
-        return this;\r
-    },\r
-\r
-    \r
-    anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){\r
-        var action = function(){\r
-            this.alignTo(el, alignment, offsets, animate);\r
-            Ext.callback(callback, this);\r
-        };\r
-        Ext.EventManager.onWindowResize(action, this);\r
-        var tm = typeof monitorScroll;\r
-        if(tm != 'undefined'){\r
-            Ext.EventManager.on(window, 'scroll', action, this,\r
-                {buffer: tm == 'number' ? monitorScroll : 50});\r
-        }\r
-        action.call(this); // align immediately\r
-        return this;\r
-    },\r
-    \r
-    clearOpacity : function(){\r
-        if (window.ActiveXObject) {\r
-            if(typeof this.dom.style.filter == 'string' && (/alpha/i).test(this.dom.style.filter)){\r
-                this.dom.style.filter = "";\r
-            }\r
-        } else {\r
-            this.dom.style.opacity = "";\r
-            this.dom.style["-moz-opacity"] = "";\r
-            this.dom.style["-khtml-opacity"] = "";\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    hide : function(animate){\r
-        this.setVisible(false, this.preanim(arguments, 0));\r
-        return this;\r
-    },\r
-\r
-    \r
-    show : function(animate){\r
-        this.setVisible(true, this.preanim(arguments, 0));\r
-        return this;\r
-    },\r
-\r
-    \r
-    addUnits : function(size){\r
-        return Ext.Element.addUnits(size, this.defaultUnit);\r
-    },\r
-\r
-    \r
-    update : function(html, loadScripts, callback){\r
-        if(typeof html == "undefined"){\r
-            html = "";\r
-        }\r
-        if(loadScripts !== true){\r
-            this.dom.innerHTML = html;\r
-            if(typeof callback == "function"){\r
-                callback();\r
-            }\r
-            return this;\r
-        }\r
-        var id = Ext.id();\r
-        var dom = this.dom;\r
-\r
-        html += '<span id="' + id + '"></span>';\r
-\r
-        E.onAvailable(id, function(){\r
-            var hd = document.getElementsByTagName("head")[0];\r
-            var re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;\r
-            var srcRe = /\ssrc=([\'\"])(.*?)\1/i;\r
-            var typeRe = /\stype=([\'\"])(.*?)\1/i;\r
-\r
-            var match;\r
-            while(match = re.exec(html)){\r
-                var attrs = match[1];\r
-                var srcMatch = attrs ? attrs.match(srcRe) : false;\r
-                if(srcMatch && srcMatch[2]){\r
-                   var s = document.createElement("script");\r
-                   s.src = srcMatch[2];\r
-                   var typeMatch = attrs.match(typeRe);\r
-                   if(typeMatch && typeMatch[2]){\r
-                       s.type = typeMatch[2];\r
-                   }\r
-                   hd.appendChild(s);\r
-                }else if(match[2] && match[2].length > 0){\r
-                    if(window.execScript) {\r
-                       window.execScript(match[2]);\r
-                    } else {\r
-                       window.eval(match[2]);\r
-                    }\r
-                }\r
-            }\r
-            var el = document.getElementById(id);\r
-            if(el){Ext.removeNode(el);}\r
-            if(typeof callback == "function"){\r
-                callback();\r
-            }\r
-        });\r
-        dom.innerHTML = html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, "");\r
-        return this;\r
-    },\r
-\r
-    \r
-    load : function(){\r
-        var um = this.getUpdater();\r
-        um.update.apply(um, arguments);\r
-        return this;\r
-    },\r
-\r
-    \r
-    getUpdater : function(){\r
-        if(!this.updateManager){\r
-            this.updateManager = new Ext.Updater(this);\r
-        }\r
-        return this.updateManager;\r
-    },\r
-\r
-    \r
-    unselectable : function(){\r
-        this.dom.unselectable = "on";\r
-        this.swallowEvent("selectstart", true);\r
-        this.applyStyles("-moz-user-select:none;-khtml-user-select:none;");\r
-        this.addClass("x-unselectable");\r
-        return this;\r
-    },\r
-\r
-    \r
-    getCenterXY : function(){\r
-        return this.getAlignToXY(document, 'c-c');\r
-    },\r
-\r
-    \r
-    center : function(centerIn){\r
-        this.alignTo(centerIn || document, 'c-c');\r
-        return this;\r
-    },\r
-\r
-    \r
-    isBorderBox : function(){\r
-        return noBoxAdjust[this.dom.tagName.toLowerCase()] || Ext.isBorderBox;\r
-    },\r
-\r
-    \r
-    getBox : function(contentBox, local){\r
-        var xy;\r
-        if(!local){\r
-            xy = this.getXY();\r
-        }else{\r
-            var left = parseInt(this.getStyle("left"), 10) || 0;\r
-            var top = parseInt(this.getStyle("top"), 10) || 0;\r
-            xy = [left, top];\r
-        }\r
-        var el = this.dom, w = el.offsetWidth, h = el.offsetHeight, bx;\r
-        if(!contentBox){\r
-            bx = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: w, height: h};\r
-        }else{\r
-            var l = this.getBorderWidth("l")+this.getPadding("l");\r
-            var r = this.getBorderWidth("r")+this.getPadding("r");\r
-            var t = this.getBorderWidth("t")+this.getPadding("t");\r
-            var b = this.getBorderWidth("b")+this.getPadding("b");\r
-            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)};\r
-        }\r
-        bx.right = bx.x + bx.width;\r
-        bx.bottom = bx.y + bx.height;\r
-        return bx;\r
-    },\r
-\r
-    \r
-    getFrameWidth : function(sides, onlyContentBox){\r
-        return onlyContentBox && Ext.isBorderBox ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides));\r
-    },\r
-\r
-    \r
-    setBox : function(box, adjust, animate){\r
-        var w = box.width, h = box.height;\r
-        if((adjust && !this.autoBoxAdjust) && !this.isBorderBox()){\r
-           w -= (this.getBorderWidth("lr") + this.getPadding("lr"));\r
-           h -= (this.getBorderWidth("tb") + this.getPadding("tb"));\r
-        }\r
-        this.setBounds(box.x, box.y, w, h, this.preanim(arguments, 2));\r
-        return this;\r
-    },\r
-\r
-    \r
-     repaint : function(){\r
-        var dom = this.dom;\r
-        this.addClass("x-repaint");\r
-        setTimeout(function(){\r
-            Ext.get(dom).removeClass("x-repaint");\r
-        }, 1);\r
-        return this;\r
-    },\r
-\r
-    \r
-    getMargins : function(side){\r
-        if(!side){\r
-            return {\r
-                top: parseInt(this.getStyle("margin-top"), 10) || 0,\r
-                left: parseInt(this.getStyle("margin-left"), 10) || 0,\r
-                bottom: parseInt(this.getStyle("margin-bottom"), 10) || 0,\r
-                right: parseInt(this.getStyle("margin-right"), 10) || 0\r
-            };\r
-        }else{\r
-            return this.addStyles(side, El.margins);\r
-         }\r
-    },\r
-\r
-    // private\r
-    addStyles : function(sides, styles){\r
-        var val = 0, v, w;\r
-        for(var i = 0, len = sides.length; i < len; i++){\r
-            v = this.getStyle(styles[sides.charAt(i)]);\r
-            if(v){\r
-                 w = parseInt(v, 10);\r
-                 if(w){ val += (w >= 0 ? w : -1 * w); }\r
-            }\r
-        }\r
-        return val;\r
-    },\r
-\r
-    \r
-    createProxy : function(config, renderTo, matchBox){\r
-        config = typeof config == "object" ?\r
-            config : {tag : "div", cls: config};\r
-\r
-        var proxy;\r
-        if(renderTo){\r
-            proxy = Ext.DomHelper.append(renderTo, config, true);\r
-        }else {\r
-            proxy = Ext.DomHelper.insertBefore(this.dom, config, true);\r
-        }\r
-        if(matchBox){\r
-           proxy.setBox(this.getBox());\r
-        }\r
-        return proxy;\r
-    },\r
-\r
-    \r
-    mask : function(msg, msgCls){\r
-        if(this.getStyle("position") == "static"){\r
-            this.addClass("x-masked-relative");\r
-        }\r
-        if(this._maskMsg){\r
-            this._maskMsg.remove();\r
-        }\r
-        if(this._mask){\r
-            this._mask.remove();\r
-        }\r
-\r
-        this._mask = Ext.DomHelper.append(this.dom, {cls:"ext-el-mask"}, true);\r
-\r
-        this.addClass("x-masked");\r
-        this._mask.setDisplayed(true);\r
-        if(typeof msg == 'string'){\r
-            this._maskMsg = Ext.DomHelper.append(this.dom, {cls:"ext-el-mask-msg", cn:{tag:'div'}}, true);\r
-            var mm = this._maskMsg;\r
-            mm.dom.className = msgCls ? "ext-el-mask-msg " + msgCls : "ext-el-mask-msg";\r
-            mm.dom.firstChild.innerHTML = msg;\r
-            mm.setDisplayed(true);\r
-            mm.center(this);\r
-        }\r
-        if(Ext.isIE && !(Ext.isIE7 && Ext.isStrict) && this.getStyle('height') == 'auto'){ // ie will not expand full height automatically\r
-            this._mask.setSize(this.getWidth(), this.getHeight());\r
-        }\r
-        return this._mask;\r
-    },\r
-\r
-    \r
-    unmask : function(){\r
-        if(this._mask){\r
-            if(this._maskMsg){\r
-                this._maskMsg.remove();\r
-                delete this._maskMsg;\r
-            }\r
-            this._mask.remove();\r
-            delete this._mask;\r
-        }\r
-        this.removeClass(["x-masked", "x-masked-relative"]);\r
-    },\r
-\r
-    \r
-    isMasked : function(){\r
-        return this._mask && this._mask.isVisible();\r
-    },\r
-\r
-    \r
-    createShim : function(){\r
-        var el = document.createElement('iframe');\r
-        el.frameBorder = '0';\r
-        el.className = 'ext-shim';\r
-        if(Ext.isIE && Ext.isSecure){\r
-            el.src = Ext.SSL_SECURE_URL;\r
-        }\r
-        var shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom));\r
-        shim.autoBoxAdjust = false;\r
-        return shim;\r
-    },\r
-\r
-    \r
-    remove : function(){\r
-        Ext.removeNode(this.dom);\r
-        delete El.cache[this.dom.id];\r
-    },\r
-\r
-    \r
-    hover : function(overFn, outFn, scope){\r
-        var preOverFn = function(e){\r
-            if(!e.within(this, true)){\r
-                overFn.apply(scope || this, arguments);\r
-            }\r
-        };\r
-        var preOutFn = function(e){\r
-            if(!e.within(this, true)){\r
-                outFn.apply(scope || this, arguments);\r
-            }\r
-        };\r
-        this.on("mouseover", preOverFn, this.dom);\r
-        this.on("mouseout", preOutFn, this.dom);\r
-        return this;\r
-    },\r
-\r
-    \r
-    addClassOnOver : function(className){\r
-        this.hover(\r
-            function(){\r
-                Ext.fly(this, '_internal').addClass(className);\r
-            },\r
-            function(){\r
-                Ext.fly(this, '_internal').removeClass(className);\r
-            }\r
-        );\r
-        return this;\r
-    },\r
-\r
-    \r
-    addClassOnFocus : function(className){\r
-        this.on("focus", function(){\r
-            Ext.fly(this, '_internal').addClass(className);\r
-        }, this.dom);\r
-        this.on("blur", function(){\r
-            Ext.fly(this, '_internal').removeClass(className);\r
-        }, this.dom);\r
-        return this;\r
-    },\r
-    \r
-    addClassOnClick : function(className){\r
-        var dom = this.dom;\r
-        this.on("mousedown", function(){\r
-            Ext.fly(dom, '_internal').addClass(className);\r
-            var d = Ext.getDoc();\r
-            var fn = function(){\r
-                Ext.fly(dom, '_internal').removeClass(className);\r
-                d.removeListener("mouseup", fn);\r
-            };\r
-            d.on("mouseup", fn);\r
-        });\r
-        return this;\r
-    },\r
-\r
-    \r
-    swallowEvent : function(eventName, preventDefault){\r
-        var fn = function(e){\r
-            e.stopPropagation();\r
-            if(preventDefault){\r
-                e.preventDefault();\r
-            }\r
-        };\r
-        if(Ext.isArray(eventName)){\r
-            for(var i = 0, len = eventName.length; i < len; i++){\r
-                 this.on(eventName[i], fn);\r
-            }\r
-            return this;\r
-        }\r
-        this.on(eventName, fn);\r
-        return this;\r
-    },\r
-\r
-    \r
-    parent : function(selector, returnDom){\r
-        return this.matchNode('parentNode', 'parentNode', selector, returnDom);\r
-    },\r
-\r
-     \r
-    next : function(selector, returnDom){\r
-        return this.matchNode('nextSibling', 'nextSibling', selector, returnDom);\r
-    },\r
-\r
-    \r
-    prev : function(selector, returnDom){\r
-        return this.matchNode('previousSibling', 'previousSibling', selector, returnDom);\r
-    },\r
-\r
-\r
-    \r
-    first : function(selector, returnDom){\r
-        return this.matchNode('nextSibling', 'firstChild', selector, returnDom);\r
-    },\r
-\r
-    \r
-    last : function(selector, returnDom){\r
-        return this.matchNode('previousSibling', 'lastChild', selector, returnDom);\r
-    },\r
-\r
-    matchNode : function(dir, start, selector, returnDom){\r
-        var n = this.dom[start];\r
-        while(n){\r
-            if(n.nodeType == 1 && (!selector || Ext.DomQuery.is(n, selector))){\r
-                return !returnDom ? Ext.get(n) : n;\r
-            }\r
-            n = n[dir];\r
-        }\r
-        return null;\r
-    },\r
-\r
-    \r
-    appendChild: function(el){\r
-        el = Ext.get(el);\r
-        el.appendTo(this);\r
-        return this;\r
-    },\r
-\r
-    \r
-    createChild: function(config, insertBefore, returnDom){\r
-        config = config || {tag:'div'};\r
-        if(insertBefore){\r
-            return Ext.DomHelper.insertBefore(insertBefore, config, returnDom !== true);\r
-        }\r
-        return Ext.DomHelper[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, config,  returnDom !== true);\r
-    },\r
-\r
-    \r
-    appendTo: function(el){\r
-        el = Ext.getDom(el);\r
-        el.appendChild(this.dom);\r
-        return this;\r
-    },\r
-\r
-    \r
-    insertBefore: function(el){\r
-        el = Ext.getDom(el);\r
-        el.parentNode.insertBefore(this.dom, el);\r
-        return this;\r
-    },\r
-\r
-    \r
-    insertAfter: function(el){\r
-        el = Ext.getDom(el);\r
-        el.parentNode.insertBefore(this.dom, el.nextSibling);\r
-        return this;\r
-    },\r
-\r
-    \r
-    insertFirst: function(el, returnDom){\r
-        el = el || {};\r
-        if(typeof el == 'object' && !el.nodeType && !el.dom){ // dh config\r
-            return this.createChild(el, this.dom.firstChild, returnDom);\r
-        }else{\r
-            el = Ext.getDom(el);\r
-            this.dom.insertBefore(el, this.dom.firstChild);\r
-            return !returnDom ? Ext.get(el) : el;\r
-        }\r
-    },\r
-\r
-    \r
-    insertSibling: function(el, where, returnDom){\r
-        var rt;\r
-        if(Ext.isArray(el)){\r
-            for(var i = 0, len = el.length; i < len; i++){\r
-                rt = this.insertSibling(el[i], where, returnDom);\r
-            }\r
-            return rt;\r
-        }\r
-        where = where ? where.toLowerCase() : 'before';\r
-        el = el || {};\r
-        var refNode = where == 'before' ? this.dom : this.dom.nextSibling;\r
-\r
-        if(typeof el == 'object' && !el.nodeType && !el.dom){ // dh config\r
-            if(where == 'after' && !this.dom.nextSibling){\r
-                rt = Ext.DomHelper.append(this.dom.parentNode, el, !returnDom);\r
-            }else{\r
-                rt = Ext.DomHelper[where == 'after' ? 'insertAfter' : 'insertBefore'](this.dom, el, !returnDom);\r
-            }\r
-\r
-        }else{\r
-            rt = this.dom.parentNode.insertBefore(Ext.getDom(el), refNode);\r
-            if(!returnDom){\r
-                rt = Ext.get(rt);\r
-            }\r
-        }\r
-        return rt;\r
-    },\r
-\r
-    \r
-    wrap: function(config, returnDom){\r
-        if(!config){\r
-            config = {tag: "div"};\r
-        }\r
-        var newEl = Ext.DomHelper.insertBefore(this.dom, config, !returnDom);\r
-        newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom);\r
-        return newEl;\r
-    },\r
-\r
-    \r
-    replace: function(el){\r
-        el = Ext.get(el);\r
-        this.insertBefore(el);\r
-        el.remove();\r
-        return this;\r
-    },\r
-\r
-    \r
-    replaceWith: function(el){\r
-        if(typeof el == 'object' && !el.nodeType && !el.dom){ // dh config\r
-            el = this.insertSibling(el, 'before');\r
-        }else{\r
-            el = Ext.getDom(el);\r
-            this.dom.parentNode.insertBefore(el, this.dom);\r
-        }\r
-        El.uncache(this.id);\r
-        Ext.removeNode(this.dom);\r
-        this.dom = el;\r
-        this.id = Ext.id(el);\r
-        El.cache[this.id] = this;\r
-        return this;\r
-    },\r
-\r
-    \r
-    insertHtml : function(where, html, returnEl){\r
-        var el = Ext.DomHelper.insertHtml(where, this.dom, html);\r
-        return returnEl ? Ext.get(el) : el;\r
-    },\r
-\r
-    \r
-    set : function(o, useSet){\r
-        var el = this.dom;\r
-        useSet = typeof useSet == 'undefined' ? (el.setAttribute ? true : false) : useSet;\r
-        for(var attr in o){\r
-            if(attr == "style" || typeof o[attr] == "function") continue;\r
-            if(attr=="cls"){\r
-                el.className = o["cls"];\r
-            }else if(o.hasOwnProperty(attr)){\r
-                if(useSet) el.setAttribute(attr, o[attr]);\r
-                else el[attr] = o[attr];\r
-            }\r
-        }\r
-        if(o.style){\r
-            Ext.DomHelper.applyStyles(el, o.style);\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    addKeyListener : function(key, fn, scope){\r
-        var config;\r
-        if(typeof key != "object" || Ext.isArray(key)){\r
-            config = {\r
-                key: key,\r
-                fn: fn,\r
-                scope: scope\r
-            };\r
-        }else{\r
-            config = {\r
-                key : key.key,\r
-                shift : key.shift,\r
-                ctrl : key.ctrl,\r
-                alt : key.alt,\r
-                fn: fn,\r
-                scope: scope\r
-            };\r
-        }\r
-        return new Ext.KeyMap(this, config);\r
-    },\r
-\r
-    \r
-    addKeyMap : function(config){\r
-        return new Ext.KeyMap(this, config);\r
-    },\r
-\r
-    \r
-     isScrollable : function(){\r
-        var dom = this.dom;\r
-        return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth;\r
-    },\r
-\r
-    \r
-    scrollTo : function(side, value, animate){\r
-        var prop = side.toLowerCase() == "left" ? "scrollLeft" : "scrollTop";\r
-        if(!animate || !A){\r
-            this.dom[prop] = value;\r
-        }else{\r
-            var to = prop == "scrollLeft" ? [value, this.dom.scrollTop] : [this.dom.scrollLeft, value];\r
-            this.anim({scroll: {"to": to}}, this.preanim(arguments, 2), 'scroll');\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-     scroll : function(direction, distance, animate){\r
-         if(!this.isScrollable()){\r
-             return;\r
-         }\r
-         var el = this.dom;\r
-         var l = el.scrollLeft, t = el.scrollTop;\r
-         var w = el.scrollWidth, h = el.scrollHeight;\r
-         var cw = el.clientWidth, ch = el.clientHeight;\r
-         direction = direction.toLowerCase();\r
-         var scrolled = false;\r
-         var a = this.preanim(arguments, 2);\r
-         switch(direction){\r
-             case "l":\r
-             case "left":\r
-                 if(w - l > cw){\r
-                     var v = Math.min(l + distance, w-cw);\r
-                     this.scrollTo("left", v, a);\r
-                     scrolled = true;\r
-                 }\r
-                 break;\r
-            case "r":\r
-            case "right":\r
-                 if(l > 0){\r
-                     var v = Math.max(l - distance, 0);\r
-                     this.scrollTo("left", v, a);\r
-                     scrolled = true;\r
-                 }\r
-                 break;\r
-            case "t":\r
-            case "top":\r
-            case "up":\r
-                 if(t > 0){\r
-                     var v = Math.max(t - distance, 0);\r
-                     this.scrollTo("top", v, a);\r
-                     scrolled = true;\r
-                 }\r
-                 break;\r
-            case "b":\r
-            case "bottom":\r
-            case "down":\r
-                 if(h - t > ch){\r
-                     var v = Math.min(t + distance, h-ch);\r
-                     this.scrollTo("top", v, a);\r
-                     scrolled = true;\r
-                 }\r
-                 break;\r
-         }\r
-         return scrolled;\r
-    },\r
-\r
-    \r
-    translatePoints : function(x, y){\r
-        if(typeof x == 'object' || Ext.isArray(x)){\r
-            y = x[1]; x = x[0];\r
-        }\r
-        var p = this.getStyle('position');\r
-        var o = this.getXY();\r
-\r
-        var l = parseInt(this.getStyle('left'), 10);\r
-        var t = parseInt(this.getStyle('top'), 10);\r
-\r
-        if(isNaN(l)){\r
-            l = (p == "relative") ? 0 : this.dom.offsetLeft;\r
-        }\r
-        if(isNaN(t)){\r
-            t = (p == "relative") ? 0 : this.dom.offsetTop;\r
-        }\r
-\r
-        return {left: (x - o[0] + l), top: (y - o[1] + t)};\r
-    },\r
-\r
-    \r
-    getScroll : function(){\r
-        var d = this.dom, doc = document;\r
-        if(d == doc || d == doc.body){\r
-            var l, t;\r
-            if(Ext.isIE && Ext.isStrict){\r
-                l = doc.documentElement.scrollLeft || (doc.body.scrollLeft || 0);\r
-                t = doc.documentElement.scrollTop || (doc.body.scrollTop || 0);\r
-            }else{\r
-                l = window.pageXOffset || (doc.body.scrollLeft || 0);\r
-                t = window.pageYOffset || (doc.body.scrollTop || 0);\r
-            }\r
-            return {left: l, top: t};\r
-        }else{\r
-            return {left: d.scrollLeft, top: d.scrollTop};\r
-        }\r
-    },\r
-\r
-    \r
-    getColor : function(attr, defaultValue, prefix){\r
-        var v = this.getStyle(attr);\r
-        if(!v || v == "transparent" || v == "inherit") {\r
-            return defaultValue;\r
-        }\r
-        var color = typeof prefix == "undefined" ? "#" : prefix;\r
-        if(v.substr(0, 4) == "rgb("){\r
-            var rvs = v.slice(4, v.length -1).split(",");\r
-            for(var i = 0; i < 3; i++){\r
-                var h = parseInt(rvs[i]);\r
-                var s = h.toString(16);\r
-                if(h < 16){\r
-                    s = "0" + s;\r
-                }\r
-                color += s;\r
-            }\r
-        } else {\r
-            if(v.substr(0, 1) == "#"){\r
-                if(v.length == 4) {\r
-                    for(var i = 1; i < 4; i++){\r
-                        var c = v.charAt(i);\r
-                        color +=  c + c;\r
-                    }\r
-                }else if(v.length == 7){\r
-                    color += v.substr(1);\r
-                }\r
-            }\r
-        }\r
-        return(color.length > 5 ? color.toLowerCase() : defaultValue);\r
-    },\r
-\r
-    \r
-    boxWrap : function(cls){\r
-        cls = cls || 'x-box';\r
-        var el = Ext.get(this.insertHtml('beforeBegin', String.format('<div class="{0}">'+El.boxMarkup+'</div>', cls)));\r
-        el.child('.'+cls+'-mc').dom.appendChild(this.dom);\r
-        return el;\r
-    },\r
-\r
-    \r
-    getAttributeNS : Ext.isIE ? function(ns, name){\r
-        var d = this.dom;\r
-        var type = typeof d[ns+":"+name];\r
-        if(type != 'undefined' && type != 'unknown'){\r
-            return d[ns+":"+name];\r
-        }\r
-        return d[name];\r
-    } : function(ns, name){\r
-        var d = this.dom;\r
-        return d.getAttributeNS(ns, name) || d.getAttribute(ns+":"+name) || d.getAttribute(name) || d[name];\r
-    },\r
-\r
-    \r
-    getTextWidth : function(text, min, max){\r
-        return (Ext.util.TextMetrics.measure(this.dom, Ext.value(text, this.dom.innerHTML, true)).width).constrain(min || 0, max || 1000000);\r
-    }\r
-};\r
-\r
-var ep = El.prototype;\r
-\r
-\r
-ep.on = ep.addListener;\r
-    // backwards compat\r
-ep.mon = ep.addListener;\r
-\r
-ep.getUpdateManager = ep.getUpdater;\r
-\r
-\r
-ep.un = ep.removeListener;\r
-\r
-\r
-ep.autoBoxAdjust = true;\r
-\r
-// private\r
-El.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i;\r
-\r
-// private\r
-El.addUnits = function(v, defaultUnit){\r
-    if(v === "" || v == "auto"){\r
-        return v;\r
-    }\r
-    if(v === undefined){\r
-        return '';\r
-    }\r
-    if(typeof v == "number" || !El.unitPattern.test(v)){\r
-        return v + (defaultUnit || 'px');\r
-    }\r
-    return v;\r
-};\r
-\r
-// special markup used throughout Ext when box wrapping elements\r
-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>';\r
-\r
-El.VISIBILITY = 1;\r
-\r
-El.DISPLAY = 2;\r
-\r
-El.borders = {l: "border-left-width", r: "border-right-width", t: "border-top-width", b: "border-bottom-width"};\r
-El.paddings = {l: "padding-left", r: "padding-right", t: "padding-top", b: "padding-bottom"};\r
-El.margins = {l: "margin-left", r: "margin-right", t: "margin-top", b: "margin-bottom"};\r
-\r
-\r
-\r
-\r
-El.cache = {};\r
-\r
-var docEl;\r
-\r
-\r
-El.get = function(el){\r
-    var ex, elm, id;\r
-    if(!el){ return null; }\r
-    if(typeof el == "string"){ // element id\r
-        if(!(elm = document.getElementById(el))){\r
-            return null;\r
-        }\r
-        if(ex = El.cache[el]){\r
-            ex.dom = elm;\r
-        }else{\r
-            ex = El.cache[el] = new El(elm);\r
-        }\r
-        return ex;\r
-    }else if(el.tagName){ // dom element\r
-        if(!(id = el.id)){\r
-            id = Ext.id(el);\r
-        }\r
-        if(ex = El.cache[id]){\r
-            ex.dom = el;\r
-        }else{\r
-            ex = El.cache[id] = new El(el);\r
-        }\r
-        return ex;\r
-    }else if(el instanceof El){\r
-        if(el != docEl){\r
-            el.dom = document.getElementById(el.id) || el.dom; // refresh dom element in case no longer valid,\r
-                                                          // catch case where it hasn't been appended\r
-            El.cache[el.id] = el; // in case it was created directly with Element(), let's cache it\r
-        }\r
-        return el;\r
-    }else if(el.isComposite){\r
-        return el;\r
-    }else if(Ext.isArray(el)){\r
-        return El.select(el);\r
-    }else if(el == document){\r
-        // create a bogus element object representing the document object\r
-        if(!docEl){\r
-            var f = function(){};\r
-            f.prototype = El.prototype;\r
-            docEl = new f();\r
-            docEl.dom = document;\r
-        }\r
-        return docEl;\r
-    }\r
-    return null;\r
-};\r
-\r
-// private\r
-El.uncache = function(el){\r
-    for(var i = 0, a = arguments, len = a.length; i < len; i++) {\r
-        if(a[i]){\r
-            delete El.cache[a[i].id || a[i]];\r
-        }\r
-    }\r
-};\r
-\r
-// private\r
-// Garbage collection - uncache elements/purge listeners on orphaned elements\r
-// so we don't hold a reference and cause the browser to retain them\r
-El.garbageCollect = function(){\r
-    if(!Ext.enableGarbageCollector){\r
-        clearInterval(El.collectorThread);\r
-        return;\r
-    }\r
-    for(var eid in El.cache){\r
-        var el = El.cache[eid], d = el.dom;\r
-        // -------------------------------------------------------\r
-        // Determining what is garbage:\r
-        // -------------------------------------------------------\r
-        // !d\r
-        // dom node is null, definitely garbage\r
-        // -------------------------------------------------------\r
-        // !d.parentNode\r
-        // no parentNode == direct orphan, definitely garbage\r
-        // -------------------------------------------------------\r
-        // !d.offsetParent && !document.getElementById(eid)\r
-        // display none elements have no offsetParent so we will\r
-        // also try to look it up by it's id. However, check\r
-        // offsetParent first so we don't do unneeded lookups.\r
-        // This enables collection of elements that are not orphans\r
-        // directly, but somewhere up the line they have an orphan\r
-        // parent.\r
-        // -------------------------------------------------------\r
-        if(!d || !d.parentNode || (!d.offsetParent && !document.getElementById(eid))){\r
-            delete El.cache[eid];\r
-            if(d && Ext.enableListenerCollection){\r
-                Ext.EventManager.removeAll(d);\r
-            }\r
-        }\r
-    }\r
-}\r
-El.collectorThreadId = setInterval(El.garbageCollect, 30000);\r
-\r
-var flyFn = function(){};\r
-flyFn.prototype = El.prototype;\r
-var _cls = new flyFn();\r
-\r
-// dom is optional\r
-El.Flyweight = function(dom){\r
-    this.dom = dom;\r
-};\r
-\r
-El.Flyweight.prototype = _cls;\r
-El.Flyweight.prototype.isFlyweight = true;\r
-\r
-El._flyweights = {};\r
-\r
-El.fly = function(el, named){\r
-    named = named || '_global';\r
-    el = Ext.getDom(el);\r
-    if(!el){\r
-        return null;\r
-    }\r
-    if(!El._flyweights[named]){\r
-        El._flyweights[named] = new El.Flyweight();\r
-    }\r
-    El._flyweights[named].dom = el;\r
-    return El._flyweights[named];\r
-};\r
-\r
-\r
-Ext.get = El.get;\r
-\r
-Ext.fly = El.fly;\r
-\r
-// speedy lookup for elements never to box adjust\r
-var noBoxAdjust = Ext.isStrict ? {\r
-    select:1\r
-} : {\r
-    input:1, select:1, textarea:1\r
-};\r
-if(Ext.isIE || Ext.isGecko){\r
-    noBoxAdjust['button'] = 1;\r
-}\r
-\r
-\r
-Ext.EventManager.on(window, 'unload', function(){\r
-    delete El.cache;\r
-    delete El._flyweights;\r
-});\r
-})();\r
-\r
-//Notifies Element that fx methods are available\r
-Ext.enableFx = true;\r
-\r
-\r
-Ext.Fx = {\r
-       \r
-    slideIn : function(anchor, o){\r
-        var el = this.getFxEl();\r
-        o = o || {};\r
-\r
-        el.queueFx(o, function(){\r
-\r
-            anchor = anchor || "t";\r
-\r
-            // fix display to visibility\r
-            this.fixDisplay();\r
-\r
-            // restore values after effect\r
-            var r = this.getFxRestore();\r
-            var b = this.getBox();\r
-            // fixed size for slide\r
-            this.setSize(b);\r
-\r
-            // wrap if needed\r
-            var wrap = this.fxWrap(r.pos, o, "hidden");\r
-\r
-            var st = this.dom.style;\r
-            st.visibility = "visible";\r
-            st.position = "absolute";\r
-\r
-            // clear out temp styles after slide and unwrap\r
-            var after = function(){\r
-                el.fxUnwrap(wrap, r.pos, o);\r
-                st.width = r.width;\r
-                st.height = r.height;\r
-                el.afterFx(o);\r
-            };\r
-            // time to calc the positions\r
-            var a, pt = {to: [b.x, b.y]}, bw = {to: b.width}, bh = {to: b.height};\r
-\r
-            switch(anchor.toLowerCase()){\r
-                case "t":\r
-                    wrap.setSize(b.width, 0);\r
-                    st.left = st.bottom = "0";\r
-                    a = {height: bh};\r
-                break;\r
-                case "l":\r
-                    wrap.setSize(0, b.height);\r
-                    st.right = st.top = "0";\r
-                    a = {width: bw};\r
-                break;\r
-                case "r":\r
-                    wrap.setSize(0, b.height);\r
-                    wrap.setX(b.right);\r
-                    st.left = st.top = "0";\r
-                    a = {width: bw, points: pt};\r
-                break;\r
-                case "b":\r
-                    wrap.setSize(b.width, 0);\r
-                    wrap.setY(b.bottom);\r
-                    st.left = st.top = "0";\r
-                    a = {height: bh, points: pt};\r
-                break;\r
-                case "tl":\r
-                    wrap.setSize(0, 0);\r
-                    st.right = st.bottom = "0";\r
-                    a = {width: bw, height: bh};\r
-                break;\r
-                case "bl":\r
-                    wrap.setSize(0, 0);\r
-                    wrap.setY(b.y+b.height);\r
-                    st.right = st.top = "0";\r
-                    a = {width: bw, height: bh, points: pt};\r
-                break;\r
-                case "br":\r
-                    wrap.setSize(0, 0);\r
-                    wrap.setXY([b.right, b.bottom]);\r
-                    st.left = st.top = "0";\r
-                    a = {width: bw, height: bh, points: pt};\r
-                break;\r
-                case "tr":\r
-                    wrap.setSize(0, 0);\r
-                    wrap.setX(b.x+b.width);\r
-                    st.left = st.bottom = "0";\r
-                    a = {width: bw, height: bh, points: pt};\r
-                break;\r
-            }\r
-            this.dom.style.visibility = "visible";\r
-            wrap.show();\r
-\r
-            arguments.callee.anim = wrap.fxanim(a,\r
-                o,\r
-                'motion',\r
-                .5,\r
-                'easeOut', after);\r
-        });\r
-        return this;\r
-    },\r
-    \r
-       \r
-    slideOut : function(anchor, o){\r
-        var el = this.getFxEl();\r
-        o = o || {};\r
-\r
-        el.queueFx(o, function(){\r
-\r
-            anchor = anchor || "t";\r
-\r
-            // restore values after effect\r
-            var r = this.getFxRestore();\r
-            \r
-            var b = this.getBox();\r
-            // fixed size for slide\r
-            this.setSize(b);\r
-\r
-            // wrap if needed\r
-            var wrap = this.fxWrap(r.pos, o, "visible");\r
-\r
-            var st = this.dom.style;\r
-            st.visibility = "visible";\r
-            st.position = "absolute";\r
-\r
-            wrap.setSize(b);\r
-\r
-            var after = function(){\r
-                if(o.useDisplay){\r
-                    el.setDisplayed(false);\r
-                }else{\r
-                    el.hide();\r
-                }\r
-\r
-                el.fxUnwrap(wrap, r.pos, o);\r
-\r
-                st.width = r.width;\r
-                st.height = r.height;\r
-\r
-                el.afterFx(o);\r
-            };\r
-\r
-            var a, zero = {to: 0};\r
-            switch(anchor.toLowerCase()){\r
-                case "t":\r
-                    st.left = st.bottom = "0";\r
-                    a = {height: zero};\r
-                break;\r
-                case "l":\r
-                    st.right = st.top = "0";\r
-                    a = {width: zero};\r
-                break;\r
-                case "r":\r
-                    st.left = st.top = "0";\r
-                    a = {width: zero, points: {to:[b.right, b.y]}};\r
-                break;\r
-                case "b":\r
-                    st.left = st.top = "0";\r
-                    a = {height: zero, points: {to:[b.x, b.bottom]}};\r
-                break;\r
-                case "tl":\r
-                    st.right = st.bottom = "0";\r
-                    a = {width: zero, height: zero};\r
-                break;\r
-                case "bl":\r
-                    st.right = st.top = "0";\r
-                    a = {width: zero, height: zero, points: {to:[b.x, b.bottom]}};\r
-                break;\r
-                case "br":\r
-                    st.left = st.top = "0";\r
-                    a = {width: zero, height: zero, points: {to:[b.x+b.width, b.bottom]}};\r
-                break;\r
-                case "tr":\r
-                    st.left = st.bottom = "0";\r
-                    a = {width: zero, height: zero, points: {to:[b.right, b.y]}};\r
-                break;\r
-            }\r
-\r
-            arguments.callee.anim = wrap.fxanim(a,\r
-                o,\r
-                'motion',\r
-                .5,\r
-                "easeOut", after);\r
-        });\r
-        return this;\r
-    },\r
-\r
-       \r
-    puff : function(o){\r
-        var el = this.getFxEl();\r
-        o = o || {};\r
-\r
-        el.queueFx(o, function(){\r
-            this.clearOpacity();\r
-            this.show();\r
-\r
-            // restore values after effect\r
-            var r = this.getFxRestore();\r
-            var st = this.dom.style;\r
-\r
-            var after = function(){\r
-                if(o.useDisplay){\r
-                    el.setDisplayed(false);\r
-                }else{\r
-                    el.hide();\r
-                }\r
-\r
-                el.clearOpacity();\r
-\r
-                el.setPositioning(r.pos);\r
-                st.width = r.width;\r
-                st.height = r.height;\r
-                st.fontSize = '';\r
-                el.afterFx(o);\r
-            };\r
-\r
-            var width = this.getWidth();\r
-            var height = this.getHeight();\r
-\r
-            arguments.callee.anim = this.fxanim({\r
-                    width : {to: this.adjustWidth(width * 2)},\r
-                    height : {to: this.adjustHeight(height * 2)},\r
-                    points : {by: [-(width * .5), -(height * .5)]},\r
-                    opacity : {to: 0},\r
-                    fontSize: {to:200, unit: "%"}\r
-                },\r
-                o,\r
-                'motion',\r
-                .5,\r
-                "easeOut", after);\r
-        });\r
-        return this;\r
-    },\r
-\r
-       \r
-    switchOff : function(o){\r
-        var el = this.getFxEl();\r
-        o = o || {};\r
-\r
-        el.queueFx(o, function(){\r
-            this.clearOpacity();\r
-            this.clip();\r
-\r
-            // restore values after effect\r
-            var r = this.getFxRestore();\r
-            var st = this.dom.style;\r
-\r
-            var after = function(){\r
-                if(o.useDisplay){\r
-                    el.setDisplayed(false);\r
-                }else{\r
-                    el.hide();\r
-                }\r
-\r
-                el.clearOpacity();\r
-                el.setPositioning(r.pos);\r
-                st.width = r.width;\r
-                st.height = r.height;\r
-\r
-                el.afterFx(o);\r
-            };\r
-\r
-            this.fxanim({opacity:{to:0.3}}, null, null, .1, null, function(){\r
-                this.clearOpacity();\r
-                (function(){\r
-                    this.fxanim({\r
-                        height:{to:1},\r
-                        points:{by:[0, this.getHeight() * .5]}\r
-                    }, o, 'motion', 0.3, 'easeIn', after);\r
-                }).defer(100, this);\r
-            });\r
-        });\r
-        return this;\r
-    },\r
-\r
-       \r
-    highlight : function(color, o){\r
-        var el = this.getFxEl();\r
-        o = o || {};\r
-\r
-        el.queueFx(o, function(){\r
-            color = color || "ffff9c";\r
-            var attr = o.attr || "backgroundColor";\r
-\r
-            this.clearOpacity();\r
-            this.show();\r
-\r
-            var origColor = this.getColor(attr);\r
-            var restoreColor = this.dom.style[attr];\r
-            var endColor = (o.endColor || origColor) || "ffffff";\r
-\r
-            var after = function(){\r
-                el.dom.style[attr] = restoreColor;\r
-                el.afterFx(o);\r
-            };\r
-\r
-            var a = {};\r
-            a[attr] = {from: color, to: endColor};\r
-            arguments.callee.anim = this.fxanim(a,\r
-                o,\r
-                'color',\r
-                1,\r
-                'easeIn', after);\r
-        });\r
-        return this;\r
-    },\r
-\r
-   \r
-    frame : function(color, count, o){\r
-        var el = this.getFxEl();\r
-        o = o || {};\r
-\r
-        el.queueFx(o, function(){\r
-            color = color || "#C3DAF9";\r
-            if(color.length == 6){\r
-                color = "#" + color;\r
-            }\r
-            count = count || 1;\r
-            var duration = o.duration || 1;\r
-            this.show();\r
-\r
-            var b = this.getBox();\r
-            var animFn = function(){\r
-                var proxy = Ext.getBody().createChild({\r
-                     style:{\r
-                        visbility:"hidden",\r
-                        position:"absolute",\r
-                        "z-index":"35000", // yee haw\r
-                        border:"0px solid " + color\r
-                     }\r
-                  });\r
-                var scale = Ext.isBorderBox ? 2 : 1;\r
-                proxy.animate({\r
-                    top:{from:b.y, to:b.y - 20},\r
-                    left:{from:b.x, to:b.x - 20},\r
-                    borderWidth:{from:0, to:10},\r
-                    opacity:{from:1, to:0},\r
-                    height:{from:b.height, to:(b.height + (20*scale))},\r
-                    width:{from:b.width, to:(b.width + (20*scale))}\r
-                }, duration, function(){\r
-                    proxy.remove();\r
-                    if(--count > 0){\r
-                         animFn();\r
-                    }else{\r
-                        el.afterFx(o);\r
-                    }\r
-                });\r
-            };\r
-            animFn.call(this);\r
-        });\r
-        return this;\r
-    },\r
-\r
-   \r
-    pause : function(seconds){\r
-        var el = this.getFxEl();\r
-        var o = {};\r
-\r
-        el.queueFx(o, function(){\r
-            setTimeout(function(){\r
-                el.afterFx(o);\r
-            }, seconds * 1000);\r
-        });\r
-        return this;\r
-    },\r
-\r
-   \r
-    fadeIn : function(o){\r
-        var el = this.getFxEl();\r
-        o = o || {};\r
-        el.queueFx(o, function(){\r
-            this.setOpacity(0);\r
-            this.fixDisplay();\r
-            this.dom.style.visibility = 'visible';\r
-            var to = o.endOpacity || 1;\r
-            arguments.callee.anim = this.fxanim({opacity:{to:to}},\r
-                o, null, .5, "easeOut", function(){\r
-                if(to == 1){\r
-                    this.clearOpacity();\r
-                }\r
-                el.afterFx(o);\r
-            });\r
-        });\r
-        return this;\r
-    },\r
-\r
-   \r
-    fadeOut : function(o){\r
-        var el = this.getFxEl();\r
-        o = o || {};\r
-        el.queueFx(o, function(){\r
-            var to = o.endOpacity || 0;\r
-            arguments.callee.anim = this.fxanim({opacity:{to:to}},\r
-                o, null, .5, "easeOut", function(){\r
-                if(to === 0){\r
-                    if(this.visibilityMode == Ext.Element.DISPLAY || o.useDisplay){\r
-                         this.dom.style.display = "none";\r
-                    }else{\r
-                         this.dom.style.visibility = "hidden";\r
-                    }\r
-                    this.clearOpacity();\r
-                }\r
-                el.afterFx(o);\r
-            });\r
-        });\r
-        return this;\r
-    },\r
-\r
-   \r
-    scale : function(w, h, o){\r
-        this.shift(Ext.apply({}, o, {\r
-            width: w,\r
-            height: h\r
-        }));\r
-        return this;\r
-    },\r
-\r
-   \r
-    shift : function(o){\r
-        var el = this.getFxEl();\r
-        o = o || {};\r
-        el.queueFx(o, function(){\r
-            var a = {}, w = o.width, h = o.height, x = o.x, y = o.y,  op = o.opacity;\r
-            if(w !== undefined){\r
-                a.width = {to: this.adjustWidth(w)};\r
-            }\r
-            if(h !== undefined){\r
-                a.height = {to: this.adjustHeight(h)};\r
-            }\r
-            if(o.left !== undefined){\r
-                a.left = {to: o.left};\r
-            }\r
-            if(o.top !== undefined){\r
-                a.top = {to: o.top};\r
-            }\r
-            if(o.right !== undefined){\r
-                a.right = {to: o.right};\r
-            }\r
-            if(o.bottom !== undefined){\r
-                a.bottom = {to: o.bottom};\r
-            }\r
-            if(x !== undefined || y !== undefined){\r
-                a.points = {to: [\r
-                    x !== undefined ? x : this.getX(),\r
-                    y !== undefined ? y : this.getY()\r
-                ]};\r
-            }\r
-            if(op !== undefined){\r
-                a.opacity = {to: op};\r
-            }\r
-            if(o.xy !== undefined){\r
-                a.points = {to: o.xy};\r
-            }\r
-            arguments.callee.anim = this.fxanim(a,\r
-                o, 'motion', .35, "easeOut", function(){\r
-                el.afterFx(o);\r
-            });\r
-        });\r
-        return this;\r
-    },\r
-\r
-       \r
-    ghost : function(anchor, o){\r
-        var el = this.getFxEl();\r
-        o = o || {};\r
-\r
-        el.queueFx(o, function(){\r
-            anchor = anchor || "b";\r
-\r
-            // restore values after effect\r
-            var r = this.getFxRestore();\r
-            var w = this.getWidth(),\r
-                h = this.getHeight();\r
-\r
-            var st = this.dom.style;\r
-\r
-            var after = function(){\r
-                if(o.useDisplay){\r
-                    el.setDisplayed(false);\r
-                }else{\r
-                    el.hide();\r
-                }\r
-\r
-                el.clearOpacity();\r
-                el.setPositioning(r.pos);\r
-                st.width = r.width;\r
-                st.height = r.height;\r
-\r
-                el.afterFx(o);\r
-            };\r
-\r
-            var a = {opacity: {to: 0}, points: {}}, pt = a.points;\r
-            switch(anchor.toLowerCase()){\r
-                case "t":\r
-                    pt.by = [0, -h];\r
-                break;\r
-                case "l":\r
-                    pt.by = [-w, 0];\r
-                break;\r
-                case "r":\r
-                    pt.by = [w, 0];\r
-                break;\r
-                case "b":\r
-                    pt.by = [0, h];\r
-                break;\r
-                case "tl":\r
-                    pt.by = [-w, -h];\r
-                break;\r
-                case "bl":\r
-                    pt.by = [-w, h];\r
-                break;\r
-                case "br":\r
-                    pt.by = [w, h];\r
-                break;\r
-                case "tr":\r
-                    pt.by = [w, -h];\r
-                break;\r
-            }\r
-\r
-            arguments.callee.anim = this.fxanim(a,\r
-                o,\r
-                'motion',\r
-                .5,\r
-                "easeOut", after);\r
-        });\r
-        return this;\r
-    },\r
-\r
-       \r
-    syncFx : function(){\r
-        this.fxDefaults = Ext.apply(this.fxDefaults || {}, {\r
-            block : false,\r
-            concurrent : true,\r
-            stopFx : false\r
-        });\r
-        return this;\r
-    },\r
-\r
-       \r
-    sequenceFx : function(){\r
-        this.fxDefaults = Ext.apply(this.fxDefaults || {}, {\r
-            block : false,\r
-            concurrent : false,\r
-            stopFx : false\r
-        });\r
-        return this;\r
-    },\r
-\r
-       \r
-    nextFx : function(){\r
-        var ef = this.fxQueue[0];\r
-        if(ef){\r
-            ef.call(this);\r
-        }\r
-    },\r
-\r
-       \r
-    hasActiveFx : function(){\r
-        return this.fxQueue && this.fxQueue[0];\r
-    },\r
-\r
-       \r
-    stopFx : function(){\r
-        if(this.hasActiveFx()){\r
-            var cur = this.fxQueue[0];\r
-            if(cur && cur.anim && cur.anim.isAnimated()){\r
-                this.fxQueue = [cur]; // clear out others\r
-                cur.anim.stop(true);\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-\r
-       \r
-    beforeFx : function(o){\r
-        if(this.hasActiveFx() && !o.concurrent){\r
-           if(o.stopFx){\r
-               this.stopFx();\r
-               return true;\r
-           }\r
-           return false;\r
-        }\r
-        return true;\r
-    },\r
-\r
-       \r
-    hasFxBlock : function(){\r
-        var q = this.fxQueue;\r
-        return q && q[0] && q[0].block;\r
-    },\r
-\r
-       \r
-    queueFx : function(o, fn){\r
-        if(!this.fxQueue){\r
-            this.fxQueue = [];\r
-        }\r
-        if(!this.hasFxBlock()){\r
-            Ext.applyIf(o, this.fxDefaults);\r
-            if(!o.concurrent){\r
-                var run = this.beforeFx(o);\r
-                fn.block = o.block;\r
-                this.fxQueue.push(fn);\r
-                if(run){\r
-                    this.nextFx();\r
-                }\r
-            }else{\r
-                fn.call(this);\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-\r
-       \r
-    fxWrap : function(pos, o, vis){\r
-        var wrap;\r
-        if(!o.wrap || !(wrap = Ext.get(o.wrap))){\r
-            var wrapXY;\r
-            if(o.fixPosition){\r
-                wrapXY = this.getXY();\r
-            }\r
-            var div = document.createElement("div");\r
-            div.style.visibility = vis;\r
-            wrap = Ext.get(this.dom.parentNode.insertBefore(div, this.dom));\r
-            wrap.setPositioning(pos);\r
-            if(wrap.getStyle("position") == "static"){\r
-                wrap.position("relative");\r
-            }\r
-            this.clearPositioning('auto');\r
-            wrap.clip();\r
-            wrap.dom.appendChild(this.dom);\r
-            if(wrapXY){\r
-                wrap.setXY(wrapXY);\r
-            }\r
-        }\r
-        return wrap;\r
-    },\r
-\r
-       \r
-    fxUnwrap : function(wrap, pos, o){\r
-        this.clearPositioning();\r
-        this.setPositioning(pos);\r
-        if(!o.wrap){\r
-            wrap.dom.parentNode.insertBefore(this.dom, wrap.dom);\r
-            wrap.remove();\r
-        }\r
-    },\r
-\r
-       \r
-    getFxRestore : function(){\r
-        var st = this.dom.style;\r
-        return {pos: this.getPositioning(), width: st.width, height : st.height};\r
-    },\r
-\r
-       \r
-    afterFx : function(o){\r
-        if(o.afterStyle){\r
-            this.applyStyles(o.afterStyle);\r
-        }\r
-        if(o.afterCls){\r
-            this.addClass(o.afterCls);\r
-        }\r
-        if(o.remove === true){\r
-            this.remove();\r
-        }\r
-        Ext.callback(o.callback, o.scope, [this]);\r
-        if(!o.concurrent){\r
-            this.fxQueue.shift();\r
-            this.nextFx();\r
-        }\r
-    },\r
-\r
-       \r
-    getFxEl : function(){ // support for composite element fx\r
-        return Ext.get(this.dom);\r
-    },\r
-\r
-       \r
-    fxanim : function(args, opt, animType, defaultDur, defaultEase, cb){\r
-        animType = animType || 'run';\r
-        opt = opt || {};\r
-        var anim = Ext.lib.Anim[animType](\r
-            this.dom, args,\r
-            (opt.duration || defaultDur) || .35,\r
-            (opt.easing || defaultEase) || 'easeOut',\r
-            function(){\r
-                Ext.callback(cb, this);\r
-            },\r
-            this\r
-        );\r
-        opt.anim = anim;\r
-        return anim;\r
-    }\r
-};\r
-\r
-// backwords compat\r
-Ext.Fx.resize = Ext.Fx.scale;\r
-\r
-//When included, Ext.Fx is automatically applied to Element so that all basic\r
-//effects are available directly via the Element API\r
-Ext.apply(Ext.Element.prototype, Ext.Fx);\r
-\r
-\r
-Ext.CompositeElement = function(els){\r
-    this.elements = [];\r
-    this.addElements(els);\r
-};\r
-Ext.CompositeElement.prototype = {\r
-    isComposite: true,\r
-    addElements : function(els){\r
-        if(!els) return this;\r
-        if(typeof els == "string"){\r
-            els = Ext.Element.selectorFunction(els);\r
-        }\r
-        var yels = this.elements;\r
-        var index = yels.length-1;\r
-        for(var i = 0, len = els.length; i < len; i++) {\r
-               yels[++index] = Ext.get(els[i]);\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    fill : function(els){\r
-        this.elements = [];\r
-        this.add(els);\r
-        return this;\r
-    },\r
-\r
-    \r
-    filter : function(selector){\r
-        var els = [];\r
-        this.each(function(el){\r
-            if(el.is(selector)){\r
-                els[els.length] = el.dom;\r
-            }\r
-        });\r
-        this.fill(els);\r
-        return this;\r
-    },\r
-\r
-    invoke : function(fn, args){\r
-        var els = this.elements;\r
-        for(var i = 0, len = els.length; i < len; i++) {\r
-               Ext.Element.prototype[fn].apply(els[i], args);\r
-        }\r
-        return this;\r
-    },\r
-    \r
-    add : function(els){\r
-        if(typeof els == "string"){\r
-            this.addElements(Ext.Element.selectorFunction(els));\r
-        }else if(els.length !== undefined){\r
-            this.addElements(els);\r
-        }else{\r
-            this.addElements([els]);\r
-        }\r
-        return this;\r
-    },\r
-    \r
-    each : function(fn, scope){\r
-        var els = this.elements;\r
-        for(var i = 0, len = els.length; i < len; i++){\r
-            if(fn.call(scope || els[i], els[i], this, i) === false) {\r
-                break;\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    item : function(index){\r
-        return this.elements[index] || null;\r
-    },\r
-\r
-    \r
-    first : function(){\r
-        return this.item(0);\r
-    },\r
-\r
-    \r
-    last : function(){\r
-        return this.item(this.elements.length-1);\r
-    },\r
-\r
-    \r
-    getCount : function(){\r
-        return this.elements.length;\r
-    },\r
-\r
-    \r
-    contains : function(el){\r
-        return this.indexOf(el) !== -1;\r
-    },\r
-\r
-    \r
-    indexOf : function(el){\r
-        return this.elements.indexOf(Ext.get(el));\r
-    },\r
-\r
-\r
-    \r
-    removeElement : function(el, removeDom){\r
-        if(Ext.isArray(el)){\r
-            for(var i = 0, len = el.length; i < len; i++){\r
-                this.removeElement(el[i]);\r
-            }\r
-            return this;\r
-        }\r
-        var index = typeof el == 'number' ? el : this.indexOf(el);\r
-        if(index !== -1 && this.elements[index]){\r
-            if(removeDom){\r
-                var d = this.elements[index];\r
-                if(d.dom){\r
-                    d.remove();\r
-                }else{\r
-                    Ext.removeNode(d);\r
-                }\r
-            }\r
-            this.elements.splice(index, 1);\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    replaceElement : function(el, replacement, domReplace){\r
-        var index = typeof el == 'number' ? el : this.indexOf(el);\r
-        if(index !== -1){\r
-            if(domReplace){\r
-                this.elements[index].replaceWith(replacement);\r
-            }else{\r
-                this.elements.splice(index, 1, Ext.get(replacement))\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    clear : function(){\r
-        this.elements = [];\r
-    }\r
-};\r
-(function(){\r
-Ext.CompositeElement.createCall = function(proto, fnName){\r
-    if(!proto[fnName]){\r
-        proto[fnName] = function(){\r
-            return this.invoke(fnName, arguments);\r
-        };\r
-    }\r
-};\r
-for(var fnName in Ext.Element.prototype){\r
-    if(typeof Ext.Element.prototype[fnName] == "function"){\r
-        Ext.CompositeElement.createCall(Ext.CompositeElement.prototype, fnName);\r
-    }\r
-};\r
-})();\r
-\r
-\r
-Ext.CompositeElementLite = function(els){\r
-    Ext.CompositeElementLite.superclass.constructor.call(this, els);\r
-    this.el = new Ext.Element.Flyweight();\r
-};\r
-Ext.extend(Ext.CompositeElementLite, Ext.CompositeElement, {\r
-    addElements : function(els){\r
-        if(els){\r
-            if(Ext.isArray(els)){\r
-                this.elements = this.elements.concat(els);\r
-            }else{\r
-                var yels = this.elements;\r
-                var index = yels.length-1;\r
-                for(var i = 0, len = els.length; i < len; i++) {\r
-                    yels[++index] = els[i];\r
-                }\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-    invoke : function(fn, args){\r
-        var els = this.elements;\r
-        var el = this.el;\r
-        for(var i = 0, len = els.length; i < len; i++) {\r
-            el.dom = els[i];\r
-               Ext.Element.prototype[fn].apply(el, args);\r
-        }\r
-        return this;\r
-    },\r
-    \r
-    item : function(index){\r
-        if(!this.elements[index]){\r
-            return null;\r
-        }\r
-        this.el.dom = this.elements[index];\r
-        return this.el;\r
-    },\r
-\r
-    // fixes scope with flyweight\r
-    addListener : function(eventName, handler, scope, opt){\r
-        var els = this.elements;\r
-        for(var i = 0, len = els.length; i < len; i++) {\r
-            Ext.EventManager.on(els[i], eventName, handler, scope || els[i], opt);\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    each : function(fn, scope){\r
-        var els = this.elements;\r
-        var el = this.el;\r
-        for(var i = 0, len = els.length; i < len; i++){\r
-            el.dom = els[i];\r
-               if(fn.call(scope || el, el, this, i) === false){\r
-                break;\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-\r
-    indexOf : function(el){\r
-        return this.elements.indexOf(Ext.getDom(el));\r
-    },\r
-\r
-    replaceElement : function(el, replacement, domReplace){\r
-        var index = typeof el == 'number' ? el : this.indexOf(el);\r
-        if(index !== -1){\r
-            replacement = Ext.getDom(replacement);\r
-            if(domReplace){\r
-                var d = this.elements[index];\r
-                d.parentNode.insertBefore(replacement, d);\r
-                Ext.removeNode(d);\r
-            }\r
-            this.elements.splice(index, 1, replacement);\r
-        }\r
-        return this;\r
-    }\r
-});\r
-Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener;\r
-if(Ext.DomQuery){\r
-    Ext.Element.selectorFunction = Ext.DomQuery.select;\r
-}\r
-\r
-Ext.Element.select = function(selector, unique, root){\r
-    var els;\r
-    if(typeof selector == "string"){\r
-        els = Ext.Element.selectorFunction(selector, root);\r
-    }else if(selector.length !== undefined){\r
-        els = selector;\r
-    }else{\r
-        throw "Invalid selector";\r
-    }\r
-    if(unique === true){\r
-        return new Ext.CompositeElement(els);\r
-    }else{\r
-        return new Ext.CompositeElementLite(els);\r
-    }\r
-};\r
-\r
-Ext.select = Ext.Element.select;\r
-\r
-Ext.data.Connection = function(config){\r
-    Ext.apply(this, config);\r
-    this.addEvents(\r
-        \r
-        "beforerequest",\r
-        \r
-        "requestcomplete",\r
-        \r
-        "requestexception"\r
-    );\r
-    Ext.data.Connection.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.data.Connection, Ext.util.Observable, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    timeout : 30000,\r
-    \r
-    autoAbort:false,\r
-\r
-    \r
-    disableCaching: true,\r
-    \r
-    \r
-    disableCachingParam: '_dc',\r
-    \r
-\r
-    \r
-    request : function(o){\r
-        if(this.fireEvent("beforerequest", this, o) !== false){\r
-            var p = o.params;\r
-\r
-            if(typeof p == "function"){\r
-                p = p.call(o.scope||window, o);\r
-            }\r
-            if(typeof p == "object"){\r
-                p = Ext.urlEncode(p);\r
-            }\r
-            if(this.extraParams){\r
-                var extras = Ext.urlEncode(this.extraParams);\r
-                p = p ? (p + '&' + extras) : extras;\r
-            }\r
-\r
-            var url = o.url || this.url;\r
-            if(typeof url == 'function'){\r
-                url = url.call(o.scope||window, o);\r
-            }\r
-\r
-            if(o.form){\r
-                var form = Ext.getDom(o.form);\r
-                url = url || form.action;\r
-\r
-                var enctype = form.getAttribute("enctype");\r
-                if(o.isUpload || (enctype && enctype.toLowerCase() == 'multipart/form-data')){\r
-                    return this.doFormUpload(o, p, url);\r
-                }\r
-                var f = Ext.lib.Ajax.serializeForm(form);\r
-                p = p ? (p + '&' + f) : f;\r
-            }\r
-\r
-            var hs = o.headers;\r
-            if(this.defaultHeaders){\r
-                hs = Ext.apply(hs || {}, this.defaultHeaders);\r
-                if(!o.headers){\r
-                    o.headers = hs;\r
-                }\r
-            }\r
-\r
-            var cb = {\r
-                success: this.handleResponse,\r
-                failure: this.handleFailure,\r
-                scope: this,\r
-                argument: {options: o},\r
-                timeout : o.timeout || this.timeout\r
-            };\r
-\r
-            var method = o.method||this.method||((p || o.xmlData || o.jsonData) ? "POST" : "GET");\r
-\r
-            if(method == 'GET' && (this.disableCaching && o.disableCaching !== false) || o.disableCaching === true){\r
-                var dcp = o.disableCachingParam || this.disableCachingParam;\r
-                url += (url.indexOf('?') != -1 ? '&' : '?') + dcp + '=' + (new Date().getTime());\r
-            }\r
-\r
-            if(typeof o.autoAbort == 'boolean'){ // options gets top priority\r
-                if(o.autoAbort){\r
-                    this.abort();\r
-                }\r
-            }else if(this.autoAbort !== false){\r
-                this.abort();\r
-            }\r
-            if((method == 'GET' || o.xmlData || o.jsonData) && p){\r
-                url += (url.indexOf('?') != -1 ? '&' : '?') + p;\r
-                p = '';\r
-            }\r
-            this.transId = Ext.lib.Ajax.request(method, url, cb, p, o);\r
-            return this.transId;\r
-        }else{\r
-            Ext.callback(o.callback, o.scope, [o, null, null]);\r
-            return null;\r
-        }\r
-    },\r
-\r
-    \r
-    isLoading : function(transId){\r
-        if(transId){\r
-            return Ext.lib.Ajax.isCallInProgress(transId);\r
-        }else{\r
-            return this.transId ? true : false;\r
-        }\r
-    },\r
-\r
-    \r
-    abort : function(transId){\r
-        if(transId || this.isLoading()){\r
-            Ext.lib.Ajax.abort(transId || this.transId);\r
-        }\r
-    },\r
-\r
-    // private\r
-    handleResponse : function(response){\r
-        this.transId = false;\r
-        var options = response.argument.options;\r
-        response.argument = options ? options.argument : null;\r
-        this.fireEvent("requestcomplete", this, response, options);\r
-        Ext.callback(options.success, options.scope, [response, options]);\r
-        Ext.callback(options.callback, options.scope, [options, true, response]);\r
-    },\r
-\r
-    // private\r
-    handleFailure : function(response, e){\r
-        this.transId = false;\r
-        var options = response.argument.options;\r
-        response.argument = options ? options.argument : null;\r
-        this.fireEvent("requestexception", this, response, options, e);\r
-        Ext.callback(options.failure, options.scope, [response, options]);\r
-        Ext.callback(options.callback, options.scope, [options, false, response]);\r
-    },\r
-\r
-    // private\r
-    doFormUpload : function(o, ps, url){\r
-        var id = Ext.id();\r
-        var frame = document.createElement('iframe');\r
-        frame.id = id;\r
-        frame.name = id;\r
-        frame.className = 'x-hidden';\r
-        if(Ext.isIE){\r
-            frame.src = Ext.SSL_SECURE_URL;\r
-        }\r
-        document.body.appendChild(frame);\r
-\r
-        if(Ext.isIE){\r
-           document.frames[id].name = id;\r
-        }\r
-\r
-        var form = Ext.getDom(o.form);\r
-        form.target = id;\r
-        form.method = 'POST';\r
-        form.enctype = form.encoding = 'multipart/form-data';\r
-        if(url){\r
-            form.action = url;\r
-        }\r
-\r
-        var hiddens, hd;\r
-        if(ps){ // add dynamic params\r
-            hiddens = [];\r
-            ps = Ext.urlDecode(ps, false);\r
-            for(var k in ps){\r
-                if(ps.hasOwnProperty(k)){\r
-                    hd = document.createElement('input');\r
-                    hd.type = 'hidden';\r
-                    hd.name = k;\r
-                    hd.value = ps[k];\r
-                    form.appendChild(hd);\r
-                    hiddens.push(hd);\r
-                }\r
-            }\r
-        }\r
-\r
-        function cb(){\r
-            var r = {  // bogus response object\r
-                responseText : '',\r
-                responseXML : null\r
-            };\r
-\r
-            r.argument = o ? o.argument : null;\r
-\r
-            try { //\r
-                var doc;\r
-                if(Ext.isIE){\r
-                    doc = frame.contentWindow.document;\r
-                }else {\r
-                    doc = (frame.contentDocument || window.frames[id].document);\r
-                }\r
-                if(doc && doc.body){\r
-                    r.responseText = doc.body.innerHTML;\r
-                }\r
-                if(doc && doc.XMLDocument){\r
-                    r.responseXML = doc.XMLDocument;\r
-                }else {\r
-                    r.responseXML = doc;\r
-                }\r
-            }\r
-            catch(e) {\r
-                // ignore\r
-            }\r
-\r
-            Ext.EventManager.removeListener(frame, 'load', cb, this);\r
-\r
-            this.fireEvent("requestcomplete", this, r, o);\r
-\r
-            Ext.callback(o.success, o.scope, [r, o]);\r
-            Ext.callback(o.callback, o.scope, [o, true, r]);\r
-\r
-            setTimeout(function(){Ext.removeNode(frame);}, 100);\r
-        }\r
-\r
-        Ext.EventManager.on(frame, 'load', cb, this);\r
-        form.submit();\r
-\r
-        if(hiddens){ // remove dynamic params\r
-            for(var i = 0, len = hiddens.length; i < len; i++){\r
-                Ext.removeNode(hiddens[i]);\r
-            }\r
-        }\r
-    }\r
-});\r
-\r
-\r
-Ext.Ajax = new Ext.data.Connection({\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-    \r
-\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-    \r
-    autoAbort : false,\r
-\r
-    \r
-    serializeForm : function(form){\r
-        return Ext.lib.Ajax.serializeForm(form);\r
-    }\r
-});\r
-\r
-Ext.Updater = Ext.extend(Ext.util.Observable, {\r
-    constructor: function(el, forceNew){\r
-        el = Ext.get(el);\r
-        if(!forceNew && el.updateManager){\r
-            return el.updateManager;\r
-        }\r
-        \r
-        this.el = el;\r
-        \r
-        this.defaultUrl = null;\r
-\r
-        this.addEvents(\r
-            \r
-            "beforeupdate",\r
-            \r
-            "update",\r
-            \r
-            "failure"\r
-        );\r
-        var d = Ext.Updater.defaults;\r
-        \r
-        this.sslBlankUrl = d.sslBlankUrl;\r
-        \r
-        this.disableCaching = d.disableCaching;\r
-        \r
-        this.indicatorText = d.indicatorText;\r
-        \r
-        this.showLoadIndicator = d.showLoadIndicator;\r
-        \r
-        this.timeout = d.timeout;\r
-        \r
-        this.loadScripts = d.loadScripts;\r
-        \r
-        this.transaction = null;\r
-        \r
-        this.refreshDelegate = this.refresh.createDelegate(this);\r
-        \r
-        this.updateDelegate = this.update.createDelegate(this);\r
-        \r
-        this.formUpdateDelegate = this.formUpdate.createDelegate(this);\r
-\r
-        if(!this.renderer){\r
-         \r
-        this.renderer = this.getDefaultRenderer();\r
-        }\r
-        Ext.Updater.superclass.constructor.call(this);\r
-    },\r
-    \r
-    getDefaultRenderer: function() {\r
-        return new Ext.Updater.BasicRenderer();\r
-    },\r
-    \r
-    getEl : function(){\r
-        return this.el;\r
-    },\r
-\r
-    \r
-    update : function(url, params, callback, discardUrl){\r
-        if(this.fireEvent("beforeupdate", this.el, url, params) !== false){\r
-            var cfg, callerScope;\r
-            if(typeof url == "object"){ // must be config object\r
-                cfg = url;\r
-                url = cfg.url;\r
-                params = params || cfg.params;\r
-                callback = callback || cfg.callback;\r
-                discardUrl = discardUrl || cfg.discardUrl;\r
-                callerScope = cfg.scope;\r
-                if(typeof cfg.nocache != "undefined"){this.disableCaching = cfg.nocache;};\r
-                if(typeof cfg.text != "undefined"){this.indicatorText = '<div class="loading-indicator">'+cfg.text+"</div>";};\r
-                if(typeof cfg.scripts != "undefined"){this.loadScripts = cfg.scripts;};\r
-                if(typeof cfg.timeout != "undefined"){this.timeout = cfg.timeout;};\r
-            }\r
-            this.showLoading();\r
-\r
-            if(!discardUrl){\r
-                this.defaultUrl = url;\r
-            }\r
-            if(typeof url == "function"){\r
-                url = url.call(this);\r
-            }\r
-\r
-            var o = Ext.apply({}, {\r
-                url : url,\r
-                params: (typeof params == "function" && callerScope) ? params.createDelegate(callerScope) : params,\r
-                success: this.processSuccess,\r
-                failure: this.processFailure,\r
-                scope: this,\r
-                callback: undefined,\r
-                timeout: (this.timeout*1000),\r
-                disableCaching: this.disableCaching,\r
-                argument: {\r
-                    "options": cfg,\r
-                    "url": url,\r
-                    "form": null,\r
-                    "callback": callback,\r
-                    "scope": callerScope || window,\r
-                    "params": params\r
-                }\r
-            }, cfg);\r
-\r
-            this.transaction = Ext.Ajax.request(o);\r
-        }\r
-    },\r
-\r
-    \r
-    formUpdate : function(form, url, reset, callback){\r
-        if(this.fireEvent("beforeupdate", this.el, form, url) !== false){\r
-            if(typeof url == "function"){\r
-                url = url.call(this);\r
-            }\r
-            form = Ext.getDom(form)\r
-            this.transaction = Ext.Ajax.request({\r
-                form: form,\r
-                url:url,\r
-                success: this.processSuccess,\r
-                failure: this.processFailure,\r
-                scope: this,\r
-                timeout: (this.timeout*1000),\r
-                argument: {\r
-                    "url": url,\r
-                    "form": form,\r
-                    "callback": callback,\r
-                    "reset": reset\r
-                }\r
-            });\r
-            this.showLoading.defer(1, this);\r
-        }\r
-    },\r
-\r
-    \r
-    refresh : function(callback){\r
-        if(this.defaultUrl == null){\r
-            return;\r
-        }\r
-        this.update(this.defaultUrl, null, callback, true);\r
-    },\r
-\r
-    \r
-    startAutoRefresh : function(interval, url, params, callback, refreshNow){\r
-        if(refreshNow){\r
-            this.update(url || this.defaultUrl, params, callback, true);\r
-        }\r
-        if(this.autoRefreshProcId){\r
-            clearInterval(this.autoRefreshProcId);\r
-        }\r
-        this.autoRefreshProcId = setInterval(this.update.createDelegate(this, [url || this.defaultUrl, params, callback, true]), interval*1000);\r
-    },\r
-\r
-    \r
-     stopAutoRefresh : function(){\r
-        if(this.autoRefreshProcId){\r
-            clearInterval(this.autoRefreshProcId);\r
-            delete this.autoRefreshProcId;\r
-        }\r
-    },\r
-\r
-    \r
-    isAutoRefreshing : function(){\r
-       return this.autoRefreshProcId ? true : false;\r
-    },\r
-\r
-    \r
-    showLoading : function(){\r
-        if(this.showLoadIndicator){\r
-            this.el.update(this.indicatorText);\r
-        }\r
-    },\r
-\r
-    // private\r
-    processSuccess : function(response){\r
-        this.transaction = null;\r
-        if(response.argument.form && response.argument.reset){\r
-            try{ // put in try/catch since some older FF releases had problems with this\r
-                response.argument.form.reset();\r
-            }catch(e){}\r
-        }\r
-        if(this.loadScripts){\r
-            this.renderer.render(this.el, response, this,\r
-                this.updateComplete.createDelegate(this, [response]));\r
-        }else{\r
-            this.renderer.render(this.el, response, this);\r
-            this.updateComplete(response);\r
-        }\r
-    },\r
-\r
-    // private\r
-    updateComplete : function(response){\r
-        this.fireEvent("update", this.el, response);\r
-        if(typeof response.argument.callback == "function"){\r
-            response.argument.callback.call(response.argument.scope, this.el, true, response, response.argument.options);\r
-        }\r
-    },\r
-\r
-    // private\r
-    processFailure : function(response){\r
-        this.transaction = null;\r
-        this.fireEvent("failure", this.el, response);\r
-        if(typeof response.argument.callback == "function"){\r
-            response.argument.callback.call(response.argument.scope, this.el, false, response, response.argument.options);\r
-        }\r
-    },\r
-\r
-    \r
-    setRenderer : function(renderer){\r
-        this.renderer = renderer;\r
-    },\r
-\r
-    \r
-    getRenderer : function(){\r
-       return this.renderer;\r
-    },\r
-\r
-    \r
-    setDefaultUrl : function(defaultUrl){\r
-        this.defaultUrl = defaultUrl;\r
-    },\r
-\r
-    \r
-    abort : function(){\r
-        if(this.transaction){\r
-            Ext.Ajax.abort(this.transaction);\r
-        }\r
-    },\r
-\r
-    \r
-    isUpdating : function(){\r
-        if(this.transaction){\r
-            return Ext.Ajax.isLoading(this.transaction);\r
-        }\r
-        return false;\r
-    }\r
-});\r
-\r
-\r
-   Ext.Updater.defaults = {\r
-       \r
-         timeout : 30,\r
-         \r
-        loadScripts : false,\r
-        \r
-        sslBlankUrl : (Ext.SSL_SECURE_URL || "javascript:false"),\r
-        \r
-        disableCaching : false,\r
-        \r
-        showLoadIndicator : true,\r
-        \r
-        indicatorText : '<div class="loading-indicator">Loading...</div>'\r
-   };\r
-\r
-\r
-Ext.Updater.updateElement = function(el, url, params, options){\r
-    var um = Ext.get(el).getUpdater();\r
-    Ext.apply(um, options);\r
-    um.update(url, params, options ? options.callback : null);\r
-};\r
-\r
-Ext.Updater.BasicRenderer = function(){};\r
-\r
-Ext.Updater.BasicRenderer.prototype = {\r
-    \r
-     render : function(el, response, updateManager, callback){\r
-        el.update(response.responseText, updateManager.loadScripts, callback);\r
-    }\r
-};\r
-\r
-Ext.UpdateManager = Ext.Updater;\r
-\r
-\r
-\r
-\r
-\r
-(function() {\r
-\r
-// create private copy of Ext's String.format() method\r
-// - to remove unnecessary dependency\r
-// - to resolve namespace conflict with M$-Ajax's implementation\r
-function xf(format) {\r
-    var args = Array.prototype.slice.call(arguments, 1);\r
-    return format.replace(/\{(\d+)\}/g, function(m, i) {\r
-        return args[i];\r
-    });\r
-}\r
-\r
-\r
-// private\r
-Date.formatCodeToRegex = function(character, currentGroup) {\r
-    // Note: currentGroup - position in regex result array (see notes for Date.parseCodes below)\r
-    var p = Date.parseCodes[character];\r
-\r
-    if (p) {\r
-      p = Ext.type(p) == 'function'? p() : p;\r
-      Date.parseCodes[character] = p; // reassign function result to prevent repeated execution\r
-    }\r
-\r
-    return p? Ext.applyIf({\r
-      c: p.c? xf(p.c, currentGroup || "{0}") : p.c\r
-    }, p) : {\r
-        g:0,\r
-        c:null,\r
-        s:Ext.escapeRe(character) // treat unrecognised characters as literals\r
-    }\r
-}\r
-\r
-// private shorthand for Date.formatCodeToRegex since we'll be using it fairly often\r
-var $f = Date.formatCodeToRegex;\r
-\r
-Ext.apply(Date, {\r
-    // private\r
-    parseFunctions: {count:0},\r
-    parseRegexes: [],\r
-    formatFunctions: {count:0},\r
-    daysInMonth : [31,28,31,30,31,30,31,31,30,31,30,31],\r
-    y2kYear : 50,\r
-\r
-    \r
-    MILLI : "ms",\r
-\r
-    \r
-    SECOND : "s",\r
-\r
-    \r
-    MINUTE : "mi",\r
-\r
-    \r
-    HOUR : "h",\r
-\r
-    \r
-    DAY : "d",\r
-\r
-    \r
-    MONTH : "mo",\r
-\r
-    \r
-    YEAR : "y",\r
-\r
-    \r
-    dayNames : [\r
-        "Sunday",\r
-        "Monday",\r
-        "Tuesday",\r
-        "Wednesday",\r
-        "Thursday",\r
-        "Friday",\r
-        "Saturday"\r
-    ],\r
-\r
-    \r
-    monthNames : [\r
-        "January",\r
-        "February",\r
-        "March",\r
-        "April",\r
-        "May",\r
-        "June",\r
-        "July",\r
-        "August",\r
-        "September",\r
-        "October",\r
-        "November",\r
-        "December"\r
-    ],\r
-\r
-    \r
-    monthNumbers : {\r
-        Jan:0,\r
-        Feb:1,\r
-        Mar:2,\r
-        Apr:3,\r
-        May:4,\r
-        Jun:5,\r
-        Jul:6,\r
-        Aug:7,\r
-        Sep:8,\r
-        Oct:9,\r
-        Nov:10,\r
-        Dec:11\r
-    },\r
-\r
-    \r
-    getShortMonthName : function(month) {\r
-        return Date.monthNames[month].substring(0, 3);\r
-    },\r
-\r
-    \r
-    getShortDayName : function(day) {\r
-        return Date.dayNames[day].substring(0, 3);\r
-    },\r
-\r
-    \r
-    getMonthNumber : function(name) {\r
-        // handle camel casing for english month names (since the keys for the Date.monthNumbers hash are case sensitive)\r
-        return Date.monthNumbers[name.substring(0, 1).toUpperCase() + name.substring(1, 3).toLowerCase()];\r
-    },\r
-\r
-    \r
-    formatCodes : {\r
-        d: "String.leftPad(this.getDate(), 2, '0')",\r
-        D: "Date.getShortDayName(this.getDay())", // get localised short day name\r
-        j: "this.getDate()",\r
-        l: "Date.dayNames[this.getDay()]",\r
-        N: "(this.getDay() ? this.getDay() : 7)",\r
-        S: "this.getSuffix()",\r
-        w: "this.getDay()",\r
-        z: "this.getDayOfYear()",\r
-        W: "String.leftPad(this.getWeekOfYear(), 2, '0')",\r
-        F: "Date.monthNames[this.getMonth()]",\r
-        m: "String.leftPad(this.getMonth() + 1, 2, '0')",\r
-        M: "Date.getShortMonthName(this.getMonth())", // get localised short month name\r
-        n: "(this.getMonth() + 1)",\r
-        t: "this.getDaysInMonth()",\r
-        L: "(this.isLeapYear() ? 1 : 0)",\r
-        o: "(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0)))",\r
-        Y: "this.getFullYear()",\r
-        y: "('' + this.getFullYear()).substring(2, 4)",\r
-        a: "(this.getHours() < 12 ? 'am' : 'pm')",\r
-        A: "(this.getHours() < 12 ? 'AM' : 'PM')",\r
-        g: "((this.getHours() % 12) ? this.getHours() % 12 : 12)",\r
-        G: "this.getHours()",\r
-        h: "String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",\r
-        H: "String.leftPad(this.getHours(), 2, '0')",\r
-        i: "String.leftPad(this.getMinutes(), 2, '0')",\r
-        s: "String.leftPad(this.getSeconds(), 2, '0')",\r
-        u: "String.leftPad(this.getMilliseconds(), 3, '0')",\r
-        O: "this.getGMTOffset()",\r
-        P: "this.getGMTOffset(true)",\r
-        T: "this.getTimezone()",\r
-        Z: "(this.getTimezoneOffset() * -60)",\r
-        c: function() { // ISO-8601 -- GMT format\r
-            for (var c = "Y-m-dTH:i:sP", code = [], i = 0, l = c.length; i < l; ++i) {\r
-                var e = c.charAt(i);\r
-                code.push(e == "T" ? "'T'" : Date.getFormatCode(e)); // treat T as a character literal\r
-            }\r
-            return code.join(" + ");\r
-        },\r
-        \r
-        U: "Math.round(this.getTime() / 1000)"\r
-    },\r
-\r
-    \r
-    parseDate : function(input, format) {\r
-        var p = Date.parseFunctions;\r
-        if (p[format] == null) {\r
-            Date.createParser(format);\r
-        }\r
-        var func = p[format];\r
-        return Date[func](input);\r
-    },\r
-\r
-    // private\r
-    getFormatCode : function(character) {\r
-        var f = Date.formatCodes[character];\r
-\r
-        if (f) {\r
-          f = Ext.type(f) == 'function'? f() : f;\r
-          Date.formatCodes[character] = f; // reassign function result to prevent repeated execution\r
-        }\r
-\r
-        // note: unknown characters are treated as literals\r
-        return f || ("'" + String.escape(character) + "'");\r
-    },\r
-\r
-    // private\r
-    createNewFormat : function(format) {\r
-        var funcName = "format" + Date.formatFunctions.count++,\r
-            code = "Date.prototype." + funcName + " = function(){return ",\r
-            special = false,\r
-            ch = '';\r
-\r
-        Date.formatFunctions[format] = funcName;\r
-\r
-        for (var i = 0; i < format.length; ++i) {\r
-            ch = format.charAt(i);\r
-            if (!special && ch == "\\") {\r
-                special = true;\r
-            }\r
-            else if (special) {\r
-                special = false;\r
-                code += "'" + String.escape(ch) + "' + ";\r
-            }\r
-            else {\r
-                code += Date.getFormatCode(ch) + " + ";\r
-            }\r
-        }\r
-        eval(code.substring(0, code.length - 3) + ";}");\r
-    },\r
-\r
-    // private\r
-    createParser : function() {\r
-        var code = [\r
-            "Date.{0} = function(input){",\r
-                "var y, m, d, h = 0, i = 0, s = 0, ms = 0, o, z, u, v;",\r
-                "input = String(input);",\r
-                "d = new Date();",\r
-                "y = d.getFullYear();",\r
-                "m = d.getMonth();",\r
-                "d = d.getDate();",\r
-                "var results = input.match(Date.parseRegexes[{1}]);",\r
-                "if(results && results.length > 0){",\r
-                    "{2}",\r
-                    "if(u){",\r
-                        "v = new Date(u * 1000);", // give top priority to UNIX time\r
-                    "}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0 && ms >= 0){",\r
-                        "v = new Date(y, m, d, h, i, s, ms);",\r
-                    "}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0){",\r
-                        "v = new Date(y, m, d, h, i, s);",\r
-                    "}else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0){",\r
-                        "v = new Date(y, m, d, h, i);",\r
-                    "}else if (y >= 0 && m >= 0 && d > 0 && h >= 0){",\r
-                        "v = new Date(y, m, d, h);",\r
-                    "}else if (y >= 0 && m >= 0 && d > 0){",\r
-                        "v = new Date(y, m, d);",\r
-                    "}else if (y >= 0 && m >= 0){",\r
-                        "v = new Date(y, m);",\r
-                    "}else if (y >= 0){",\r
-                        "v = new Date(y);",\r
-                    "}",\r
-                "}",\r
-                "return (v && (z != null || o != null))?" // favour UTC offset over GMT offset\r
-                    + " (Ext.type(z) == 'number' ? v.add(Date.SECOND, -v.getTimezoneOffset() * 60 - z) :" // reset to UTC, then add offset\r
-                    + " v.add(Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn))) : v;", // reset to GMT, then add offset\r
-            "}"\r
-        ].join('\n');\r
-\r
-        return function(format) {\r
-            var funcName = "parse" + Date.parseFunctions.count++,\r
-                regexNum = Date.parseRegexes.length,\r
-                currentGroup = 1,\r
-                calc = "",\r
-                regex = "",\r
-                special = false,\r
-                ch = "";\r
-\r
-            Date.parseFunctions[format] = funcName;\r
-\r
-            for (var i = 0; i < format.length; ++i) {\r
-                ch = format.charAt(i);\r
-                if (!special && ch == "\\") {\r
-                    special = true;\r
-                }\r
-                else if (special) {\r
-                    special = false;\r
-                    regex += String.escape(ch);\r
-                }\r
-                else {\r
-                    var obj = $f(ch, currentGroup);\r
-                    currentGroup += obj.g;\r
-                    regex += obj.s;\r
-                    if (obj.g && obj.c) {\r
-                        calc += obj.c;\r
-                    }\r
-                }\r
-            }\r
-\r
-            Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$", "i");\r
-            eval(xf(code, funcName, regexNum, calc));\r
-        }\r
-    }(),\r
-\r
-    // private\r
-    parseCodes : {\r
-        \r
-        d: {\r
-            g:1,\r
-            c:"d = parseInt(results[{0}], 10);\n",\r
-            s:"(\\d{2})" // day of month with leading zeroes (01 - 31)\r
-        },\r
-        j: {\r
-            g:1,\r
-            c:"d = parseInt(results[{0}], 10);\n",\r
-            s:"(\\d{1,2})" // day of month without leading zeroes (1 - 31)\r
-        },\r
-        D: function() {\r
-            for (var a = [], i = 0; i < 7; a.push(Date.getShortDayName(i)), ++i); // get localised short day names\r
-            return {\r
-                g:0,\r
-                c:null,\r
-                s:"(?:" + a.join("|") +")"\r
-            }\r
-        },\r
-        l: function() {\r
-            return {\r
-                g:0,\r
-                c:null,\r
-                s:"(?:" + Date.dayNames.join("|") + ")"\r
-            }\r
-        },\r
-        N: {\r
-            g:0,\r
-            c:null,\r
-            s:"[1-7]" // ISO-8601 day number (1 (monday) - 7 (sunday))\r
-        },\r
-        S: {\r
-            g:0,\r
-            c:null,\r
-            s:"(?:st|nd|rd|th)"\r
-        },\r
-        w: {\r
-            g:0,\r
-            c:null,\r
-            s:"[0-6]" // javascript day number (0 (sunday) - 6 (saturday))\r
-        },\r
-        z: {\r
-            g:0,\r
-            c:null,\r
-            s:"(?:\\d{1,3})" // day of the year (0 - 364 (365 in leap years))\r
-        },\r
-        W: {\r
-            g:0,\r
-            c:null,\r
-            s:"(?:\\d{2})" // ISO-8601 week number (with leading zero)\r
-        },\r
-        F: function() {\r
-            return {\r
-                g:1,\r
-                c:"m = parseInt(Date.getMonthNumber(results[{0}]), 10);\n", // get localised month number\r
-                s:"(" + Date.monthNames.join("|") + ")"\r
-            }\r
-        },\r
-        M: function() {\r
-            for (var a = [], i = 0; i < 12; a.push(Date.getShortMonthName(i)), ++i); // get localised short month names\r
-            return Ext.applyIf({\r
-                s:"(" + a.join("|") + ")"\r
-            }, $f("F"));\r
-        },\r
-        m: {\r
-            g:1,\r
-            c:"m = parseInt(results[{0}], 10) - 1;\n",\r
-            s:"(\\d{2})" // month number with leading zeros (01 - 12)\r
-        },\r
-        n: {\r
-            g:1,\r
-            c:"m = parseInt(results[{0}], 10) - 1;\n",\r
-            s:"(\\d{1,2})" // month number without leading zeros (1 - 12)\r
-        },\r
-        t: {\r
-            g:0,\r
-            c:null,\r
-            s:"(?:\\d{2})" // no. of days in the month (28 - 31)\r
-        },\r
-        L: {\r
-            g:0,\r
-            c:null,\r
-            s:"(?:1|0)"\r
-        },\r
-        o: function() {\r
-            return $f("Y");\r
-        },\r
-        Y: {\r
-            g:1,\r
-            c:"y = parseInt(results[{0}], 10);\n",\r
-            s:"(\\d{4})" // 4-digit year\r
-        },\r
-        y: {\r
-            g:1,\r
-            c:"var ty = parseInt(results[{0}], 10);\n"\r
-                + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n", // 2-digit year\r
-            s:"(\\d{1,2})"\r
-        },\r
-        a: {\r
-            g:1,\r
-            c:"if (results[{0}] == 'am') {\n"\r
-                + "if (h == 12) { h = 0; }\n"\r
-                + "} else { if (h < 12) { h += 12; }}",\r
-            s:"(am|pm)"\r
-        },\r
-        A: {\r
-            g:1,\r
-            c:"if (results[{0}] == 'AM') {\n"\r
-                + "if (h == 12) { h = 0; }\n"\r
-                + "} else { if (h < 12) { h += 12; }}",\r
-            s:"(AM|PM)"\r
-        },\r
-        g: function() {\r
-            return $f("G");\r
-        },\r
-        G: {\r
-            g:1,\r
-            c:"h = parseInt(results[{0}], 10);\n",\r
-            s:"(\\d{1,2})" // 24-hr format of an hour without leading zeroes (0 - 23)\r
-        },\r
-        h: function() {\r
-            return $f("H");\r
-        },\r
-        H: {\r
-            g:1,\r
-            c:"h = parseInt(results[{0}], 10);\n",\r
-            s:"(\\d{2})" //  24-hr format of an hour with leading zeroes (00 - 23)\r
-        },\r
-        i: {\r
-            g:1,\r
-            c:"i = parseInt(results[{0}], 10);\n",\r
-            s:"(\\d{2})" // minutes with leading zeros (00 - 59)\r
-        },\r
-        s: {\r
-            g:1,\r
-            c:"s = parseInt(results[{0}], 10);\n",\r
-            s:"(\\d{2})" // seconds with leading zeros (00 - 59)\r
-        },\r
-        u: {\r
-            g:1,\r
-            c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",\r
-            s:"(\\d+)" // decimal fraction of a second (minimum = 1 digit, maximum = unlimited)\r
-        },\r
-        O: {\r
-            g:1,\r
-            c:[\r
-                "o = results[{0}];",\r
-                "var sn = o.substring(0,1);", // get + / - sign\r
-                "var hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60);", // get hours (performs minutes-to-hour conversion also, just in case)\r
-                "var mn = o.substring(3,5) % 60;", // get minutes\r
-                "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n" // -12hrs <= GMT offset <= 14hrs\r
-            ].join("\n"),\r
-            s: "([+\-]\\d{4})" // GMT offset in hrs and mins\r
-        },\r
-        P: {\r
-            g:1,\r
-            c:[\r
-                "o = results[{0}];",\r
-                "var sn = o.substring(0,1);", // get + / - sign\r
-                "var hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60);", // get hours (performs minutes-to-hour conversion also, just in case)\r
-                "var mn = o.substring(4,6) % 60;", // get minutes\r
-                "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n" // -12hrs <= GMT offset <= 14hrs\r
-            ].join("\n"),\r
-            s: "([+\-]\\d{2}:\\d{2})" // GMT offset in hrs and mins (with colon separator)\r
-        },\r
-        T: {\r
-            g:0,\r
-            c:null,\r
-            s:"[A-Z]{1,4}" // timezone abbrev. may be between 1 - 4 chars\r
-        },\r
-        Z: {\r
-            g:1,\r
-            c:"z = results[{0}] * 1;\n" // -43200 <= UTC offset <= 50400\r
-                  + "z = (-43200 <= z && z <= 50400)? z : null;\n",\r
-            s:"([+\-]?\\d{1,5})" // leading '+' sign is optional for UTC offset\r
-        },\r
-        c: function() {\r
-            var calc = [],\r
-                arr = [\r
-                    $f("Y", 1), // year\r
-                    $f("m", 2), // month\r
-                    $f("d", 3), // day\r
-                    $f("h", 4), // hour\r
-                    $f("i", 5), // minute\r
-                    $f("s", 6), // second\r
-                    {c:"ms = (results[7] || '.0').substring(1); ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"}, // decimal fraction of a second (minimum = 1 digit, maximum = unlimited)\r
-                    {c:[ // allow both "Z" (i.e. UTC) and "+08:00" (i.e. UTC offset) time zone delimiters\r
-                        "if(results[9] == 'Z'){",\r
-                            "z = 0;",\r
-                        "}else{",\r
-                            $f("P", 9).c,\r
-                        "}"\r
-                    ].join('\n')}\r
-                ];\r
-\r
-            for (var i = 0, l = arr.length; i < l; ++i) {\r
-                calc.push(arr[i].c);\r
-            }\r
-\r
-            return {\r
-                g:1,\r
-                c:calc.join(""),\r
-                s:arr[0].s + "-" + arr[1].s + "-" + arr[2].s + "T" + arr[3].s + ":" + arr[4].s + ":" + arr[5].s\r
-                      + "((\.|,)\\d+)?" // decimal fraction of a second (e.g. ",998465" or ".998465")\r
-                      + "(Z|([+\-]\\d{2}:\\d{2}))" // "Z" (UTC) or "+08:00" (UTC offset)\r
-            }\r
-        },\r
-        U: {\r
-            g:1,\r
-            c:"u = parseInt(results[{0}], 10);\n",\r
-            s:"(-?\\d+)" // leading minus sign indicates seconds before UNIX epoch\r
-        }\r
-    }\r
-});\r
-\r
-}());\r
-\r
-Ext.apply(Date.prototype, {\r
-    // private\r
-    dateFormat : function(format) {\r
-        if (Date.formatFunctions[format] == null) {\r
-            Date.createNewFormat(format);\r
-        }\r
-        var func = Date.formatFunctions[format];\r
-        return this[func]();\r
-    },\r
-\r
-    \r
-    getTimezone : function() {\r
-        // the following list shows the differences between date strings from different browsers on a WinXP SP2 machine from an Asian locale:\r
-        //\r
-        // Opera  : "Thu, 25 Oct 2007 22:53:45 GMT+0800" -- shortest (weirdest) date string of the lot\r
-        // Safari : "Thu Oct 25 2007 22:55:35 GMT+0800 (Malay Peninsula Standard Time)" -- value in parentheses always gives the correct timezone (same as FF)\r
-        // FF     : "Thu Oct 25 2007 22:55:35 GMT+0800 (Malay Peninsula Standard Time)" -- value in parentheses always gives the correct timezone\r
-        // IE     : "Thu Oct 25 22:54:35 UTC+0800 2007" -- (Asian system setting) look for 3-4 letter timezone abbrev\r
-        // IE     : "Thu Oct 25 17:06:37 PDT 2007" -- (American system setting) look for 3-4 letter timezone abbrev\r
-        //\r
-        // this crazy regex attempts to guess the correct timezone abbreviation despite these differences.\r
-        // step 1: (?:\((.*)\) -- find timezone in parentheses\r
-        // step 2: ([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?) -- if nothing was found in step 1, find timezone from timezone offset portion of date string\r
-        // step 3: remove all non uppercase characters found in step 1 and 2\r
-        return this.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, "");\r
-    },\r
-\r
-    \r
-    getGMTOffset : function(colon) {\r
-        return (this.getTimezoneOffset() > 0 ? "-" : "+")\r
-            + String.leftPad(Math.floor(Math.abs(this.getTimezoneOffset()) / 60), 2, "0")\r
-            + (colon ? ":" : "")\r
-            + String.leftPad(Math.abs(this.getTimezoneOffset() % 60), 2, "0");\r
-    },\r
-\r
-    \r
-    getDayOfYear : function() {\r
-        var num = 0;\r
-        Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;\r
-        for (var i = 0; i < this.getMonth(); ++i) {\r
-            num += Date.daysInMonth[i];\r
-        }\r
-        return num + this.getDate() - 1;\r
-    },\r
-\r
-    \r
-    getWeekOfYear : function() {\r
-        // adapted from http://www.merlyn.demon.co.uk/weekcalc.htm\r
-        var ms1d = 864e5, // milliseconds in a day\r
-            ms7d = 7 * ms1d; // milliseconds in a week\r
-\r
-        return function() { // return a closure so constants get calculated only once\r
-            var DC3 = Date.UTC(this.getFullYear(), this.getMonth(), this.getDate() + 3) / ms1d, // an Absolute Day Number\r
-                AWN = Math.floor(DC3 / 7), // an Absolute Week Number\r
-                Wyr = new Date(AWN * ms7d).getUTCFullYear();\r
-\r
-            return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;\r
-        }\r
-    }(),\r
-\r
-    \r
-    isLeapYear : function() {\r
-        var year = this.getFullYear();\r
-        return !!((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));\r
-    },\r
-\r
-    \r
-    getFirstDayOfMonth : function() {\r
-        var day = (this.getDay() - (this.getDate() - 1)) % 7;\r
-        return (day < 0) ? (day + 7) : day;\r
-    },\r
-\r
-    \r
-    getLastDayOfMonth : function() {\r
-        var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7;\r
-        return (day < 0) ? (day + 7) : day;\r
-    },\r
-\r
-\r
-    \r
-    getFirstDateOfMonth : function() {\r
-        return new Date(this.getFullYear(), this.getMonth(), 1);\r
-    },\r
-\r
-    \r
-    getLastDateOfMonth : function() {\r
-        return new Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth());\r
-    },\r
-\r
-    \r
-    getDaysInMonth : function() {\r
-        Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;\r
-        return Date.daysInMonth[this.getMonth()];\r
-    },\r
-\r
-    \r
-    getSuffix : function() {\r
-        switch (this.getDate()) {\r
-            case 1:\r
-            case 21:\r
-            case 31:\r
-                return "st";\r
-            case 2:\r
-            case 22:\r
-                return "nd";\r
-            case 3:\r
-            case 23:\r
-                return "rd";\r
-            default:\r
-                return "th";\r
-        }\r
-    },\r
-\r
-    \r
-    clone : function() {\r
-        return new Date(this.getTime());\r
-    },\r
-\r
-    \r
-    clearTime : function(clone){\r
-        if(clone){\r
-            return this.clone().clearTime();\r
-        }\r
-        this.setHours(0);\r
-        this.setMinutes(0);\r
-        this.setSeconds(0);\r
-        this.setMilliseconds(0);\r
-        return this;\r
-    },\r
-\r
-    \r
-    add : function(interval, value){\r
-        var d = this.clone();\r
-        if (!interval || value === 0) return d;\r
-\r
-        switch(interval.toLowerCase()){\r
-            case Date.MILLI:\r
-                d.setMilliseconds(this.getMilliseconds() + value);\r
-                break;\r
-            case Date.SECOND:\r
-                d.setSeconds(this.getSeconds() + value);\r
-                break;\r
-            case Date.MINUTE:\r
-                d.setMinutes(this.getMinutes() + value);\r
-                break;\r
-            case Date.HOUR:\r
-                d.setHours(this.getHours() + value);\r
-                break;\r
-            case Date.DAY:\r
-                d.setDate(this.getDate() + value);\r
-                break;\r
-            case Date.MONTH:\r
-                var day = this.getDate();\r
-                if(day > 28){\r
-                    day = Math.min(day, this.getFirstDateOfMonth().add('mo', value).getLastDateOfMonth().getDate());\r
-                }\r
-                d.setDate(day);\r
-                d.setMonth(this.getMonth() + value);\r
-                break;\r
-            case Date.YEAR:\r
-                d.setFullYear(this.getFullYear() + value);\r
-                break;\r
-        }\r
-        return d;\r
-    },\r
-\r
-    \r
-    between : function(start, end){\r
-        var t = this.getTime();\r
-        return start.getTime() <= t && t <= end.getTime();\r
-    }\r
-});\r
-\r
-\r
-\r
-Date.prototype.format = Date.prototype.dateFormat;\r
-\r
-\r
-// private\r
-// safari setMonth is broken\r
-if(Ext.isSafari){\r
-    Date.brokenSetMonth = Date.prototype.setMonth;\r
-    Date.prototype.setMonth = function(num){\r
-        if(num <= -1){\r
-            var n = Math.ceil(-num);\r
-            var back_year = Math.ceil(n/12);\r
-            var month = (n % 12) ? 12 - n % 12 : 0 ;\r
-            this.setFullYear(this.getFullYear() - back_year);\r
-            return Date.brokenSetMonth.call(this, month);\r
-        } else {\r
-            return Date.brokenSetMonth.apply(this, arguments);\r
-        }\r
-    };\r
-}\r
-\r
-Ext.util.DelayedTask = function(fn, scope, args){\r
-    var id = null, d, t;\r
-\r
-    var call = function(){\r
-        var now = new Date().getTime();\r
-        if(now - t >= d){\r
-            clearInterval(id);\r
-            id = null;\r
-            fn.apply(scope, args || []);\r
-        }\r
-    };\r
-    \r
-    this.delay = function(delay, newFn, newScope, newArgs){\r
-        if(id && delay != d){\r
-            this.cancel();\r
-        }\r
-        d = delay;\r
-        t = new Date().getTime();\r
-        fn = newFn || fn;\r
-        scope = newScope || scope;\r
-        args = newArgs || args;\r
-        if(!id){\r
-            id = setInterval(call, d);\r
-        }\r
-    };\r
-\r
-    \r
-    this.cancel = function(){\r
-        if(id){\r
-            clearInterval(id);\r
-            id = null;\r
-        }\r
-    };\r
-};\r
-\r
-Ext.util.TaskRunner = function(interval){\r
-    interval = interval || 10;\r
-    var tasks = [], removeQueue = [];\r
-    var id = 0;\r
-    var running = false;\r
-\r
-    // private\r
-    var stopThread = function(){\r
-        running = false;\r
-        clearInterval(id);\r
-        id = 0;\r
-    };\r
-\r
-    // private\r
-    var startThread = function(){\r
-        if(!running){\r
-            running = true;\r
-            id = setInterval(runTasks, interval);\r
-        }\r
-    };\r
-\r
-    // private\r
-    var removeTask = function(t){\r
-        removeQueue.push(t);\r
-        if(t.onStop){\r
-            t.onStop.apply(t.scope || t);\r
-        }\r
-    };\r
-\r
-    // private\r
-    var runTasks = function(){\r
-        if(removeQueue.length > 0){\r
-            for(var i = 0, len = removeQueue.length; i < len; i++){\r
-                tasks.remove(removeQueue[i]);\r
-            }\r
-            removeQueue = [];\r
-            if(tasks.length < 1){\r
-                stopThread();\r
-                return;\r
-            }\r
-        }\r
-        var now = new Date().getTime();\r
-        for(var i = 0, len = tasks.length; i < len; ++i){\r
-            var t = tasks[i];\r
-            var itime = now - t.taskRunTime;\r
-            if(t.interval <= itime){\r
-                var rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]);\r
-                t.taskRunTime = now;\r
-                if(rt === false || t.taskRunCount === t.repeat){\r
-                    removeTask(t);\r
-                    return;\r
-                }\r
-            }\r
-            if(t.duration && t.duration <= (now - t.taskStartTime)){\r
-                removeTask(t);\r
-            }\r
-        }\r
-    };\r
-\r
-    \r
-    this.start = function(task){\r
-        tasks.push(task);\r
-        task.taskStartTime = new Date().getTime();\r
-        task.taskRunTime = 0;\r
-        task.taskRunCount = 0;\r
-        startThread();\r
-        return task;\r
-    };\r
-\r
-    \r
-    this.stop = function(task){\r
-        removeTask(task);\r
-        return task;\r
-    };\r
-\r
-    \r
-    this.stopAll = function(){\r
-        stopThread();\r
-        for(var i = 0, len = tasks.length; i < len; i++){\r
-            if(tasks[i].onStop){\r
-                tasks[i].onStop();\r
-            }\r
-        }\r
-        tasks = [];\r
-        removeQueue = [];\r
-    };\r
-};\r
-\r
-\r
-Ext.TaskMgr = new Ext.util.TaskRunner();\r
-\r
-Ext.util.MixedCollection = function(allowFunctions, keyFn){\r
-    this.items = [];\r
-    this.map = {};\r
-    this.keys = [];\r
-    this.length = 0;\r
-    this.addEvents(\r
-        \r
-        "clear",\r
-        \r
-        "add",\r
-        \r
-        "replace",\r
-        \r
-        "remove",\r
-        "sort"\r
-    );\r
-    this.allowFunctions = allowFunctions === true;\r
-    if(keyFn){\r
-        this.getKey = keyFn;\r
-    }\r
-    Ext.util.MixedCollection.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.util.MixedCollection, Ext.util.Observable, {\r
-    allowFunctions : false,\r
-\r
-\r
-    add : function(key, o){\r
-        if(arguments.length == 1){\r
-            o = arguments[0];\r
-            key = this.getKey(o);\r
-        }\r
-        if(typeof key == "undefined" || key === null){\r
-            this.length++;\r
-            this.items.push(o);\r
-            this.keys.push(null);\r
-        }else{\r
-            var old = this.map[key];\r
-            if(old){\r
-                return this.replace(key, o);\r
-            }\r
-            this.length++;\r
-            this.items.push(o);\r
-            this.map[key] = o;\r
-            this.keys.push(key);\r
-        }\r
-        this.fireEvent("add", this.length-1, o, key);\r
-        return o;\r
-    },\r
-\r
-\r
-    getKey : function(o){\r
-         return o.id;\r
-    },\r
-\r
-\r
-    replace : function(key, o){\r
-        if(arguments.length == 1){\r
-            o = arguments[0];\r
-            key = this.getKey(o);\r
-        }\r
-        var old = this.item(key);\r
-        if(typeof key == "undefined" || key === null || typeof old == "undefined"){\r
-             return this.add(key, o);\r
-        }\r
-        var index = this.indexOfKey(key);\r
-        this.items[index] = o;\r
-        this.map[key] = o;\r
-        this.fireEvent("replace", key, old, o);\r
-        return o;\r
-    },\r
-\r
-\r
-    addAll : function(objs){\r
-        if(arguments.length > 1 || Ext.isArray(objs)){\r
-            var args = arguments.length > 1 ? arguments : objs;\r
-            for(var i = 0, len = args.length; i < len; i++){\r
-                this.add(args[i]);\r
-            }\r
-        }else{\r
-            for(var key in objs){\r
-                if(this.allowFunctions || typeof objs[key] != "function"){\r
-                    this.add(key, objs[key]);\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-\r
-    each : function(fn, scope){\r
-        var items = [].concat(this.items); // each safe for removal\r
-        for(var i = 0, len = items.length; i < len; i++){\r
-            if(fn.call(scope || items[i], items[i], i, len) === false){\r
-                break;\r
-            }\r
-        }\r
-    },\r
-\r
-\r
-    eachKey : function(fn, scope){\r
-        for(var i = 0, len = this.keys.length; i < len; i++){\r
-            fn.call(scope || window, this.keys[i], this.items[i], i, len);\r
-        }\r
-    },\r
-\r
-    \r
-    find : function(fn, scope){\r
-        for(var i = 0, len = this.items.length; i < len; i++){\r
-            if(fn.call(scope || window, this.items[i], this.keys[i])){\r
-                return this.items[i];\r
-            }\r
-        }\r
-        return null;\r
-    },\r
-\r
-\r
-    insert : function(index, key, o){\r
-        if(arguments.length == 2){\r
-            o = arguments[1];\r
-            key = this.getKey(o);\r
-        }\r
-        if(index >= this.length){\r
-            return this.add(key, o);\r
-        }\r
-        this.length++;\r
-        this.items.splice(index, 0, o);\r
-        if(typeof key != "undefined" && key != null){\r
-            this.map[key] = o;\r
-        }\r
-        this.keys.splice(index, 0, key);\r
-        this.fireEvent("add", index, o, key);\r
-        return o;\r
-    },\r
-\r
-\r
-    remove : function(o){\r
-        return this.removeAt(this.indexOf(o));\r
-    },\r
-\r
-\r
-    removeAt : function(index){\r
-        if(index < this.length && index >= 0){\r
-            this.length--;\r
-            var o = this.items[index];\r
-            this.items.splice(index, 1);\r
-            var key = this.keys[index];\r
-            if(typeof key != "undefined"){\r
-                delete this.map[key];\r
-            }\r
-            this.keys.splice(index, 1);\r
-            this.fireEvent("remove", o, key);\r
-            return o;\r
-        }\r
-        return false;\r
-    },\r
-\r
-\r
-    removeKey : function(key){\r
-        return this.removeAt(this.indexOfKey(key));\r
-    },\r
-\r
-\r
-    getCount : function(){\r
-        return this.length;\r
-    },\r
-\r
-\r
-    indexOf : function(o){\r
-        return this.items.indexOf(o);\r
-    },\r
-\r
-\r
-    indexOfKey : function(key){\r
-        return this.keys.indexOf(key);\r
-    },\r
-\r
-\r
-    item : function(key){\r
-        var item = typeof this.map[key] != "undefined" ? this.map[key] : this.items[key];\r
-        return typeof item != 'function' || this.allowFunctions ? item : null; // for prototype!\r
-    },\r
-\r
-\r
-    itemAt : function(index){\r
-        return this.items[index];\r
-    },\r
-\r
-\r
-    key : function(key){\r
-        return this.map[key];\r
-    },\r
-\r
-\r
-    contains : function(o){\r
-        return this.indexOf(o) != -1;\r
-    },\r
-\r
-\r
-    containsKey : function(key){\r
-        return typeof this.map[key] != "undefined";\r
-    },\r
-\r
-\r
-    clear : function(){\r
-        this.length = 0;\r
-        this.items = [];\r
-        this.keys = [];\r
-        this.map = {};\r
-        this.fireEvent("clear");\r
-    },\r
-\r
-\r
-    first : function(){\r
-        return this.items[0];\r
-    },\r
-\r
-\r
-    last : function(){\r
-        return this.items[this.length-1];\r
-    },\r
-\r
-    // private\r
-    _sort : function(property, dir, fn){\r
-        var dsc = String(dir).toUpperCase() == "DESC" ? -1 : 1;\r
-        fn = fn || function(a, b){\r
-            return a-b;\r
-        };\r
-        var c = [], k = this.keys, items = this.items;\r
-        for(var i = 0, len = items.length; i < len; i++){\r
-            c[c.length] = {key: k[i], value: items[i], index: i};\r
-        }\r
-        c.sort(function(a, b){\r
-            var v = fn(a[property], b[property]) * dsc;\r
-            if(v == 0){\r
-                v = (a.index < b.index ? -1 : 1);\r
-            }\r
-            return v;\r
-        });\r
-        for(var i = 0, len = c.length; i < len; i++){\r
-            items[i] = c[i].value;\r
-            k[i] = c[i].key;\r
-        }\r
-        this.fireEvent("sort", this);\r
-    },\r
-\r
-    \r
-    sort : function(dir, fn){\r
-        this._sort("value", dir, fn);\r
-    },\r
-\r
-    \r
-    keySort : function(dir, fn){\r
-        this._sort("key", dir, fn || function(a, b){\r
-            var v1 = String(a).toUpperCase(), v2 = String(b).toUpperCase();\r
-            return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);\r
-        });\r
-    },\r
-\r
-    \r
-    getRange : function(start, end){\r
-        var items = this.items;\r
-        if(items.length < 1){\r
-            return [];\r
-        }\r
-        start = start || 0;\r
-        end = Math.min(typeof end == "undefined" ? this.length-1 : end, this.length-1);\r
-        var r = [];\r
-        if(start <= end){\r
-            for(var i = start; i <= end; i++) {\r
-                   r[r.length] = items[i];\r
-            }\r
-        }else{\r
-            for(var i = start; i >= end; i--) {\r
-                   r[r.length] = items[i];\r
-            }\r
-        }\r
-        return r;\r
-    },\r
-\r
-    \r
-    filter : function(property, value, anyMatch, caseSensitive){\r
-        if(Ext.isEmpty(value, false)){\r
-            return this.clone();\r
-        }\r
-        value = this.createValueMatcher(value, anyMatch, caseSensitive);\r
-        return this.filterBy(function(o){\r
-            return o && value.test(o[property]);\r
-        });\r
-       },\r
-\r
-    \r
-    filterBy : function(fn, scope){\r
-        var r = new Ext.util.MixedCollection();\r
-        r.getKey = this.getKey;\r
-        var k = this.keys, it = this.items;\r
-        for(var i = 0, len = it.length; i < len; i++){\r
-            if(fn.call(scope||this, it[i], k[i])){\r
-                               r.add(k[i], it[i]);\r
-                       }\r
-        }\r
-        return r;\r
-    },\r
-\r
-    \r
-    findIndex : function(property, value, start, anyMatch, caseSensitive){\r
-        if(Ext.isEmpty(value, false)){\r
-            return -1;\r
-        }\r
-        value = this.createValueMatcher(value, anyMatch, caseSensitive);\r
-        return this.findIndexBy(function(o){\r
-            return o && value.test(o[property]);\r
-        }, null, start);\r
-       },\r
-\r
-    \r
-    findIndexBy : function(fn, scope, start){\r
-        var k = this.keys, it = this.items;\r
-        for(var i = (start||0), len = it.length; i < len; i++){\r
-            if(fn.call(scope||this, it[i], k[i])){\r
-                               return i;\r
-            }\r
-        }\r
-        if(typeof start == 'number' && start > 0){\r
-            for(var i = 0; i < start; i++){\r
-                if(fn.call(scope||this, it[i], k[i])){\r
-                    return i;\r
-                }\r
-            }\r
-        }\r
-        return -1;\r
-    },\r
-\r
-    // private\r
-    createValueMatcher : function(value, anyMatch, caseSensitive){\r
-        if(!value.exec){ // not a regex\r
-            value = String(value);\r
-            value = new RegExp((anyMatch === true ? '' : '^') + Ext.escapeRe(value), caseSensitive ? '' : 'i');\r
-        }\r
-        return value;\r
-    },\r
-\r
-    \r
-    clone : function(){\r
-        var r = new Ext.util.MixedCollection();\r
-        var k = this.keys, it = this.items;\r
-        for(var i = 0, len = it.length; i < len; i++){\r
-            r.add(k[i], it[i]);\r
-        }\r
-        r.getKey = this.getKey;\r
-        return r;\r
-    }\r
-});\r
-\r
-Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item;\r
-\r
-Ext.util.JSON = new (function(){\r
-    var useHasOwn = !!{}.hasOwnProperty;\r
-\r
-    // crashes Safari in some instances\r
-    //var validRE = /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/;\r
-\r
-    var pad = function(n) {\r
-        return n < 10 ? "0" + n : n;\r
-    };\r
-\r
-    var m = {\r
-        "\b": '\\b',\r
-        "\t": '\\t',\r
-        "\n": '\\n',\r
-        "\f": '\\f',\r
-        "\r": '\\r',\r
-        '"' : '\\"',\r
-        "\\": '\\\\'\r
-    };\r
-\r
-    var encodeString = function(s){\r
-        if (/["\\\x00-\x1f]/.test(s)) {\r
-            return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) {\r
-                var c = m[b];\r
-                if(c){\r
-                    return c;\r
-                }\r
-                c = b.charCodeAt();\r
-                return "\\u00" +\r
-                    Math.floor(c / 16).toString(16) +\r
-                    (c % 16).toString(16);\r
-            }) + '"';\r
-        }\r
-        return '"' + s + '"';\r
-    };\r
-\r
-    var encodeArray = function(o){\r
-        var a = ["["], b, i, l = o.length, v;\r
-            for (i = 0; i < l; i += 1) {\r
-                v = o[i];\r
-                switch (typeof v) {\r
-                    case "undefined":\r
-                    case "function":\r
-                    case "unknown":\r
-                        break;\r
-                    default:\r
-                        if (b) {\r
-                            a.push(',');\r
-                        }\r
-                        a.push(v === null ? "null" : Ext.util.JSON.encode(v));\r
-                        b = true;\r
-                }\r
-            }\r
-            a.push("]");\r
-            return a.join("");\r
-    };\r
-\r
-    this.encodeDate = function(o){\r
-        return '"' + o.getFullYear() + "-" +\r
-                pad(o.getMonth() + 1) + "-" +\r
-                pad(o.getDate()) + "T" +\r
-                pad(o.getHours()) + ":" +\r
-                pad(o.getMinutes()) + ":" +\r
-                pad(o.getSeconds()) + '"';\r
-    };\r
-\r
-    \r
-    this.encode = function(o){\r
-        if(typeof o == "undefined" || o === null){\r
-            return "null";\r
-        }else if(Ext.isArray(o)){\r
-            return encodeArray(o);\r
-        }else if(Ext.isDate(o)){\r
-            return Ext.util.JSON.encodeDate(o);\r
-        }else if(typeof o == "string"){\r
-            return encodeString(o);\r
-        }else if(typeof o == "number"){\r
-            return isFinite(o) ? String(o) : "null";\r
-        }else if(typeof o == "boolean"){\r
-            return String(o);\r
-        }else {\r
-            var a = ["{"], b, i, v;\r
-            for (i in o) {\r
-                if(!useHasOwn || o.hasOwnProperty(i)) {\r
-                    v = o[i];\r
-                    switch (typeof v) {\r
-                    case "undefined":\r
-                    case "function":\r
-                    case "unknown":\r
-                        break;\r
-                    default:\r
-                        if(b){\r
-                            a.push(',');\r
-                        }\r
-                        a.push(this.encode(i), ":",\r
-                                v === null ? "null" : this.encode(v));\r
-                        b = true;\r
-                    }\r
-                }\r
-            }\r
-            a.push("}");\r
-            return a.join("");\r
-        }\r
-    };\r
-\r
-    \r
-    this.decode = function(json){\r
-        return eval("(" + json + ')');\r
-    };\r
-})();\r
-\r
-Ext.encode = Ext.util.JSON.encode;\r
-\r
-Ext.decode = Ext.util.JSON.decode;\r
-\r
-\r
-Ext.util.Format = function(){\r
-    var trimRe = /^\s+|\s+$/g;\r
-    return {\r
-        \r
-        ellipsis : function(value, len){\r
-            if(value && value.length > len){\r
-                return value.substr(0, len-3)+"...";\r
-            }\r
-            return value;\r
-        },\r
-\r
-        \r
-        undef : function(value){\r
-            return value !== undefined ? value : "";\r
-        },\r
-\r
-        \r
-        defaultValue : function(value, defaultValue){\r
-            return value !== undefined && value !== '' ? value : defaultValue;\r
-        },\r
-\r
-        \r
-        htmlEncode : function(value){\r
-            return !value ? value : String(value).replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");\r
-        },\r
-\r
-        \r
-        htmlDecode : function(value){\r
-            return !value ? value : String(value).replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&quot;/g, '"').replace(/&amp;/g, "&");\r
-        },\r
-\r
-        \r
-        trim : function(value){\r
-            return String(value).replace(trimRe, "");\r
-        },\r
-\r
-        \r
-        substr : function(value, start, length){\r
-            return String(value).substr(start, length);\r
-        },\r
-\r
-        \r
-        lowercase : function(value){\r
-            return String(value).toLowerCase();\r
-        },\r
-\r
-        \r
-        uppercase : function(value){\r
-            return String(value).toUpperCase();\r
-        },\r
-\r
-        \r
-        capitalize : function(value){\r
-            return !value ? value : value.charAt(0).toUpperCase() + value.substr(1).toLowerCase();\r
-        },\r
-\r
-        // private\r
-        call : function(value, fn){\r
-            if(arguments.length > 2){\r
-                var args = Array.prototype.slice.call(arguments, 2);\r
-                args.unshift(value);\r
-                return eval(fn).apply(window, args);\r
-            }else{\r
-                return eval(fn).call(window, value);\r
-            }\r
-        },\r
-\r
-        \r
-        usMoney : function(v){\r
-            v = (Math.round((v-0)*100))/100;\r
-            v = (v == Math.floor(v)) ? v + ".00" : ((v*10 == Math.floor(v*10)) ? v + "0" : v);\r
-            v = String(v);\r
-            var ps = v.split('.');\r
-            var whole = ps[0];\r
-            var sub = ps[1] ? '.'+ ps[1] : '.00';\r
-            var r = /(\d+)(\d{3})/;\r
-            while (r.test(whole)) {\r
-                whole = whole.replace(r, '$1' + ',' + '$2');\r
-            }\r
-            v = whole + sub;\r
-            if(v.charAt(0) == '-'){\r
-                return '-$' + v.substr(1);\r
-            }\r
-            return "$" +  v;\r
-        },\r
-\r
-        \r
-        date : function(v, format){\r
-            if(!v){\r
-                return "";\r
-            }\r
-            if(!Ext.isDate(v)){\r
-                v = new Date(Date.parse(v));\r
-            }\r
-            return v.dateFormat(format || "m/d/Y");\r
-        },\r
-\r
-        \r
-        dateRenderer : function(format){\r
-            return function(v){\r
-                return Ext.util.Format.date(v, format);\r
-            };\r
-        },\r
-\r
-        // private\r
-        stripTagsRE : /<\/?[^>]+>/gi,\r
-        \r
-        \r
-        stripTags : function(v){\r
-            return !v ? v : String(v).replace(this.stripTagsRE, "");\r
-        },\r
-\r
-        // private\r
-        stripScriptsRe : /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,\r
-\r
-        \r
-        stripScripts : function(v){\r
-            return !v ? v : String(v).replace(this.stripScriptsRe, "");\r
-        },\r
-\r
-        \r
-        fileSize : function(size){\r
-            if(size < 1024) {\r
-                return size + " bytes";\r
-            } else if(size < 1048576) {\r
-                return (Math.round(((size*10) / 1024))/10) + " KB";\r
-            } else {\r
-                return (Math.round(((size*10) / 1048576))/10) + " MB";\r
-            }\r
-        },\r
-\r
-        math : function(){\r
-            var fns = {};\r
-            return function(v, a){\r
-                if(!fns[a]){\r
-                    fns[a] = new Function('v', 'return v ' + a + ';');\r
-                }\r
-                return fns[a](v);\r
-            }\r
-        }(),\r
-\r
-               \r
-        nl2br : function(v){\r
-            return v === undefined || v === null ? '' : v.replace(/\n/g, '<br/>');\r
-        }\r
-    };\r
-}();\r
-\r
-Ext.XTemplate = function(){\r
-    Ext.XTemplate.superclass.constructor.apply(this, arguments);\r
-    var s = this.html;\r
-\r
-    s = ['<tpl>', s, '</tpl>'].join('');\r
-\r
-    var re = /<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/;\r
-\r
-    var nameRe = /^<tpl\b[^>]*?for="(.*?)"/;\r
-    var ifRe = /^<tpl\b[^>]*?if="(.*?)"/;\r
-    var execRe = /^<tpl\b[^>]*?exec="(.*?)"/;\r
-    var m, id = 0;\r
-    var tpls = [];\r
-\r
-    while(m = s.match(re)){\r
-       var m2 = m[0].match(nameRe);\r
-       var m3 = m[0].match(ifRe);\r
-       var m4 = m[0].match(execRe);\r
-       var exp = null, fn = null, exec = null;\r
-       var name = m2 && m2[1] ? m2[1] : '';\r
-       if(m3){\r
-           exp = m3 && m3[1] ? m3[1] : null;\r
-           if(exp){\r
-               fn = new Function('values', 'parent', 'xindex', 'xcount', 'with(values){ return '+(Ext.util.Format.htmlDecode(exp))+'; }');\r
-           }\r
-       }\r
-       if(m4){\r
-           exp = m4 && m4[1] ? m4[1] : null;\r
-           if(exp){\r
-               exec = new Function('values', 'parent', 'xindex', 'xcount', 'with(values){ '+(Ext.util.Format.htmlDecode(exp))+'; }');\r
-           }\r
-       }\r
-       if(name){\r
-           switch(name){\r
-               case '.': name = new Function('values', 'parent', 'with(values){ return values; }'); break;\r
-               case '..': name = new Function('values', 'parent', 'with(values){ return parent; }'); break;\r
-               default: name = new Function('values', 'parent', 'with(values){ return '+name+'; }');\r
-           }\r
-       }\r
-       tpls.push({\r
-            id: id,\r
-            target: name,\r
-            exec: exec,\r
-            test: fn,\r
-            body: m[1]||''\r
-        });\r
-       s = s.replace(m[0], '{xtpl'+ id + '}');\r
-       ++id;\r
-    }\r
-    for(var i = tpls.length-1; i >= 0; --i){\r
-        this.compileTpl(tpls[i]);\r
-    }\r
-    this.master = tpls[tpls.length-1];\r
-    this.tpls = tpls;\r
-};\r
-Ext.extend(Ext.XTemplate, Ext.Template, {\r
-    // private\r
-    re : /\{([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,\r
-    // private\r
-    codeRe : /\{\[((?:\\\]|.|\n)*?)\]\}/g,\r
-\r
-    // private\r
-    applySubTemplate : function(id, values, parent, xindex, xcount){\r
-        var t = this.tpls[id];\r
-        if(t.test && !t.test.call(this, values, parent, xindex, xcount)){\r
-            return '';\r
-        }\r
-        if(t.exec && t.exec.call(this, values, parent, xindex, xcount)){\r
-            return '';\r
-        }\r
-        var vs = t.target ? t.target.call(this, values, parent) : values;\r
-        parent = t.target ? values : parent;\r
-        if(t.target && Ext.isArray(vs)){\r
-            var buf = [];\r
-            for(var i = 0, len = vs.length; i < len; i++){\r
-                buf[buf.length] = t.compiled.call(this, vs[i], parent, i+1, len);\r
-            }\r
-            return buf.join('');\r
-        }\r
-        return t.compiled.call(this, vs, parent, xindex, xcount);\r
-    },\r
-\r
-    // private\r
-    compileTpl : function(tpl){\r
-        var fm = Ext.util.Format;\r
-        var useF = this.disableFormats !== true;\r
-        var sep = Ext.isGecko ? "+" : ",";\r
-        var fn = function(m, name, format, args, math){\r
-            if(name.substr(0, 4) == 'xtpl'){\r
-                return "'"+ sep +'this.applySubTemplate('+name.substr(4)+', values, parent, xindex, xcount)'+sep+"'";\r
-            }\r
-            var v;\r
-            if(name === '.'){\r
-                v = 'values';\r
-            }else if(name === '#'){\r
-                v = 'xindex';\r
-            }else if(name.indexOf('.') != -1){\r
-                v = name;\r
-            }else{\r
-                v = "values['" + name + "']";\r
-            }\r
-            if(math){\r
-                v = '(' + v + math + ')';\r
-            }\r
-            if(format && useF){\r
-                args = args ? ',' + args : "";\r
-                if(format.substr(0, 5) != "this."){\r
-                    format = "fm." + format + '(';\r
-                }else{\r
-                    format = 'this.call("'+ format.substr(5) + '", ';\r
-                    args = ", values";\r
-                }\r
-            }else{\r
-                args= ''; format = "("+v+" === undefined ? '' : ";\r
-            }\r
-            return "'"+ sep + format + v + args + ")"+sep+"'";\r
-        };\r
-        var codeFn = function(m, code){\r
-            return "'"+ sep +'('+code+')'+sep+"'";\r
-        };\r
-\r
-        var body;\r
-        // branched to use + in gecko and [].join() in others\r
-        if(Ext.isGecko){\r
-            body = "tpl.compiled = function(values, parent, xindex, xcount){ return '" +\r
-                   tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn) +\r
-                    "';};";\r
-        }else{\r
-            body = ["tpl.compiled = function(values, parent, xindex, xcount){ return ['"];\r
-            body.push(tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn));\r
-            body.push("'].join('');};");\r
-            body = body.join('');\r
-        }\r
-        eval(body);\r
-        return this;\r
-    },\r
-\r
-    \r
-    applyTemplate : function(values){\r
-        return this.master.compiled.call(this, values, {}, 1, 1);\r
-    },\r
-\r
-    \r
-    compile : function(){return this;}\r
-\r
-    \r
-    \r
-    \r
-\r
-});\r
-\r
-Ext.XTemplate.prototype.apply = Ext.XTemplate.prototype.applyTemplate;\r
-\r
-\r
-Ext.XTemplate.from = function(el){\r
-    el = Ext.getDom(el);\r
-    return new Ext.XTemplate(el.value || el.innerHTML);\r
-};\r
-\r
-Ext.util.CSS = function(){\r
-       var rules = null;\r
-       var doc = document;\r
-\r
-    var camelRe = /(-[a-z])/gi;\r
-    var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); };\r
-\r
-   return {\r
-   \r
-   createStyleSheet : function(cssText, id){\r
-       var ss;\r
-       var head = doc.getElementsByTagName("head")[0];\r
-       var rules = doc.createElement("style");\r
-       rules.setAttribute("type", "text/css");\r
-       if(id){\r
-           rules.setAttribute("id", id);\r
-       }\r
-       if(Ext.isIE){\r
-           head.appendChild(rules);\r
-           ss = rules.styleSheet;\r
-           ss.cssText = cssText;\r
-       }else{\r
-           try{\r
-                rules.appendChild(doc.createTextNode(cssText));\r
-           }catch(e){\r
-               rules.cssText = cssText;\r
-           }\r
-           head.appendChild(rules);\r
-           ss = rules.styleSheet ? rules.styleSheet : (rules.sheet || doc.styleSheets[doc.styleSheets.length-1]);\r
-       }\r
-       this.cacheStyleSheet(ss);\r
-       return ss;\r
-   },\r
-\r
-   \r
-   removeStyleSheet : function(id){\r
-       var existing = doc.getElementById(id);\r
-       if(existing){\r
-           existing.parentNode.removeChild(existing);\r
-       }\r
-   },\r
-\r
-   \r
-   swapStyleSheet : function(id, url){\r
-       this.removeStyleSheet(id);\r
-       var ss = doc.createElement("link");\r
-       ss.setAttribute("rel", "stylesheet");\r
-       ss.setAttribute("type", "text/css");\r
-       ss.setAttribute("id", id);\r
-       ss.setAttribute("href", url);\r
-       doc.getElementsByTagName("head")[0].appendChild(ss);\r
-   },\r
-   \r
-   \r
-   refreshCache : function(){\r
-       return this.getRules(true);\r
-   },\r
-\r
-   // private\r
-   cacheStyleSheet : function(ss){\r
-       if(!rules){\r
-           rules = {};\r
-       }\r
-       try{// try catch for cross domain access issue\r
-           var ssRules = ss.cssRules || ss.rules;\r
-           for(var j = ssRules.length-1; j >= 0; --j){\r
-               rules[ssRules[j].selectorText] = ssRules[j];\r
-           }\r
-       }catch(e){}\r
-   },\r
-   \r
-   \r
-   getRules : function(refreshCache){\r
-               if(rules == null || refreshCache){\r
-                       rules = {};\r
-                       var ds = doc.styleSheets;\r
-                       for(var i =0, len = ds.length; i < len; i++){\r
-                           try{\r
-                       this.cacheStyleSheet(ds[i]);\r
-                   }catch(e){} \r
-               }\r
-               }\r
-               return rules;\r
-       },\r
-       \r
-       \r
-   getRule : function(selector, refreshCache){\r
-               var rs = this.getRules(refreshCache);\r
-               if(!Ext.isArray(selector)){\r
-                   return rs[selector];\r
-               }\r
-               for(var i = 0; i < selector.length; i++){\r
-                       if(rs[selector[i]]){\r
-                               return rs[selector[i]];\r
-                       }\r
-               }\r
-               return null;\r
-       },\r
-       \r
-       \r
-       \r
-   updateRule : function(selector, property, value){\r
-               if(!Ext.isArray(selector)){\r
-                       var rule = this.getRule(selector);\r
-                       if(rule){\r
-                               rule.style[property.replace(camelRe, camelFn)] = value;\r
-                               return true;\r
-                       }\r
-               }else{\r
-                       for(var i = 0; i < selector.length; i++){\r
-                               if(this.updateRule(selector[i], property, value)){\r
-                                       return true;\r
-                               }\r
-                       }\r
-               }\r
-               return false;\r
-       }\r
-   };  \r
-}();\r
-\r
-Ext.util.ClickRepeater = function(el, config)\r
-{\r
-    this.el = Ext.get(el);\r
-    this.el.unselectable();\r
-\r
-    Ext.apply(this, config);\r
-\r
-    this.addEvents(\r
-    \r
-        "mousedown",\r
-    \r
-        "click",\r
-    \r
-        "mouseup"\r
-    );\r
-\r
-    this.el.on("mousedown", this.handleMouseDown, this);\r
-    if(this.preventDefault || this.stopDefault){\r
-        this.el.on("click", function(e){\r
-            if(this.preventDefault){\r
-                e.preventDefault();\r
-            }\r
-            if(this.stopDefault){\r
-                e.stopEvent();\r
-            }\r
-        }, this);\r
-    }\r
-\r
-    // allow inline handler\r
-    if(this.handler){\r
-        this.on("click", this.handler,  this.scope || this);\r
-    }\r
-\r
-    Ext.util.ClickRepeater.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.util.ClickRepeater, Ext.util.Observable, {\r
-    interval : 20,\r
-    delay: 250,\r
-    preventDefault : true,\r
-    stopDefault : false,\r
-    timer : 0,\r
-\r
-    // private\r
-    destroy : function() {\r
-        Ext.destroy(this.el);\r
-        this.purgeListeners();\r
-    },\r
-    \r
-    // private\r
-    handleMouseDown : function(){\r
-        clearTimeout(this.timer);\r
-        this.el.blur();\r
-        if(this.pressClass){\r
-            this.el.addClass(this.pressClass);\r
-        }\r
-        this.mousedownTime = new Date();\r
-\r
-        Ext.getDoc().on("mouseup", this.handleMouseUp, this);\r
-        this.el.on("mouseout", this.handleMouseOut, this);\r
-\r
-        this.fireEvent("mousedown", this);\r
-        this.fireEvent("click", this);\r
-\r
-//      Do not honor delay or interval if acceleration wanted.\r
-        if (this.accelerate) {\r
-            this.delay = 400;\r
-           }\r
-        this.timer = this.click.defer(this.delay || this.interval, this);\r
-    },\r
-\r
-    // private\r
-    click : function(){\r
-        this.fireEvent("click", this);\r
-        this.timer = this.click.defer(this.accelerate ?\r
-            this.easeOutExpo(this.mousedownTime.getElapsed(),\r
-                400,\r
-                -390,\r
-                12000) :\r
-            this.interval, this);\r
-    },\r
-\r
-    easeOutExpo : function (t, b, c, d) {\r
-        return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\r
-    },\r
-\r
-    // private\r
-    handleMouseOut : function(){\r
-        clearTimeout(this.timer);\r
-        if(this.pressClass){\r
-            this.el.removeClass(this.pressClass);\r
-        }\r
-        this.el.on("mouseover", this.handleMouseReturn, this);\r
-    },\r
-\r
-    // private\r
-    handleMouseReturn : function(){\r
-        this.el.un("mouseover", this.handleMouseReturn, this);\r
-        if(this.pressClass){\r
-            this.el.addClass(this.pressClass);\r
-        }\r
-        this.click();\r
-    },\r
-\r
-    // private\r
-    handleMouseUp : function(){\r
-        clearTimeout(this.timer);\r
-        this.el.un("mouseover", this.handleMouseReturn, this);\r
-        this.el.un("mouseout", this.handleMouseOut, this);\r
-        Ext.getDoc().un("mouseup", this.handleMouseUp, this);\r
-        this.el.removeClass(this.pressClass);\r
-        this.fireEvent("mouseup", this);\r
-    }\r
-});\r
-\r
-Ext.KeyNav = function(el, config){\r
-    this.el = Ext.get(el);\r
-    Ext.apply(this, config);\r
-    if(!this.disabled){\r
-        this.disabled = true;\r
-        this.enable();\r
-    }\r
-};\r
-\r
-Ext.KeyNav.prototype = {\r
-    \r
-    disabled : false,\r
-    \r
-    defaultEventAction: "stopEvent",\r
-    \r
-    forceKeyDown : false,\r
-\r
-    // private\r
-    prepareEvent : function(e){\r
-        var k = e.getKey();\r
-        var h = this.keyToHandler[k];\r
-        //if(h && this[h]){\r
-        //    e.stopPropagation();\r
-        //}\r
-        if(Ext.isSafari2 && h && k >= 37 && k <= 40){\r
-            e.stopEvent();\r
-        }\r
-    },\r
-\r
-    // private\r
-    relay : function(e){\r
-        var k = e.getKey();\r
-        var h = this.keyToHandler[k];\r
-        if(h && this[h]){\r
-            if(this.doRelay(e, this[h], h) !== true){\r
-                e[this.defaultEventAction]();\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    doRelay : function(e, h, hname){\r
-        return h.call(this.scope || this, e);\r
-    },\r
-\r
-    // possible handlers\r
-    enter : false,\r
-    left : false,\r
-    right : false,\r
-    up : false,\r
-    down : false,\r
-    tab : false,\r
-    esc : false,\r
-    pageUp : false,\r
-    pageDown : false,\r
-    del : false,\r
-    home : false,\r
-    end : false,\r
-\r
-    // quick lookup hash\r
-    keyToHandler : {\r
-        37 : "left",\r
-        39 : "right",\r
-        38 : "up",\r
-        40 : "down",\r
-        33 : "pageUp",\r
-        34 : "pageDown",\r
-        46 : "del",\r
-        36 : "home",\r
-        35 : "end",\r
-        13 : "enter",\r
-        27 : "esc",\r
-        9  : "tab"\r
-    },\r
-\r
-       \r
-       enable: function(){\r
-               if(this.disabled){\r
-            if(this.forceKeyDown || Ext.isIE || Ext.isSafari3 || Ext.isAir){\r
-                this.el.on("keydown", this.relay,  this);\r
-            }else{\r
-                this.el.on("keydown", this.prepareEvent,  this);\r
-                this.el.on("keypress", this.relay,  this);\r
-            }\r
-                   this.disabled = false;\r
-               }\r
-       },\r
-\r
-       \r
-       disable: function(){\r
-               if(!this.disabled){\r
-                   if(this.forceKeyDown || Ext.isIE || Ext.isSafari3 || Ext.isAir){\r
-                this.el.un("keydown", this.relay, this);\r
-            }else{\r
-                this.el.un("keydown", this.prepareEvent, this);\r
-                this.el.un("keypress", this.relay, this);\r
-            }\r
-                   this.disabled = true;\r
-               }\r
-       }\r
-};\r
-\r
-Ext.KeyMap = function(el, config, eventName){\r
-    this.el  = Ext.get(el);\r
-    this.eventName = eventName || "keydown";\r
-    this.bindings = [];\r
-    if(config){\r
-        this.addBinding(config);\r
-    }\r
-    this.enable();\r
-};\r
-\r
-Ext.KeyMap.prototype = {\r
-    \r
-    stopEvent : false,\r
-\r
-    \r
-       addBinding : function(config){\r
-        if(Ext.isArray(config)){\r
-            for(var i = 0, len = config.length; i < len; i++){\r
-                this.addBinding(config[i]);\r
-            }\r
-            return;\r
-        }\r
-        var keyCode = config.key,\r
-            shift = config.shift,\r
-            ctrl = config.ctrl,\r
-            alt = config.alt,\r
-            fn = config.fn || config.handler,\r
-            scope = config.scope;\r
-       \r
-       if (config.stopEvent) {\r
-           this.stopEvent = config.stopEvent;    \r
-       }       \r
-\r
-        if(typeof keyCode == "string"){\r
-            var ks = [];\r
-            var keyString = keyCode.toUpperCase();\r
-            for(var j = 0, len = keyString.length; j < len; j++){\r
-                ks.push(keyString.charCodeAt(j));\r
-            }\r
-            keyCode = ks;\r
-        }\r
-        var keyArray = Ext.isArray(keyCode);\r
-        \r
-        var handler = function(e){\r
-            if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) &&  (!alt || e.altKey)){\r
-                var k = e.getKey();\r
-                if(keyArray){\r
-                    for(var i = 0, len = keyCode.length; i < len; i++){\r
-                        if(keyCode[i] == k){\r
-                          if(this.stopEvent){\r
-                              e.stopEvent();\r
-                          }\r
-                          fn.call(scope || window, k, e);\r
-                          return;\r
-                        }\r
-                    }\r
-                }else{\r
-                    if(k == keyCode){\r
-                        if(this.stopEvent){\r
-                           e.stopEvent();\r
-                        }\r
-                        fn.call(scope || window, k, e);\r
-                    }\r
-                }\r
-            }\r
-        };\r
-        this.bindings.push(handler);\r
-       },\r
-\r
-    \r
-    on : function(key, fn, scope){\r
-        var keyCode, shift, ctrl, alt;\r
-        if(typeof key == "object" && !Ext.isArray(key)){\r
-            keyCode = key.key;\r
-            shift = key.shift;\r
-            ctrl = key.ctrl;\r
-            alt = key.alt;\r
-        }else{\r
-            keyCode = key;\r
-        }\r
-        this.addBinding({\r
-            key: keyCode,\r
-            shift: shift,\r
-            ctrl: ctrl,\r
-            alt: alt,\r
-            fn: fn,\r
-            scope: scope\r
-        })\r
-    },\r
-\r
-    // private\r
-    handleKeyDown : function(e){\r
-           if(this.enabled){ //just in case\r
-           var b = this.bindings;\r
-           for(var i = 0, len = b.length; i < len; i++){\r
-               b[i].call(this, e);\r
-           }\r
-           }\r
-       },\r
-\r
-       \r
-       isEnabled : function(){\r
-           return this.enabled;\r
-       },\r
-\r
-       \r
-       enable: function(){\r
-               if(!this.enabled){\r
-                   this.el.on(this.eventName, this.handleKeyDown, this);\r
-                   this.enabled = true;\r
-               }\r
-       },\r
-\r
-       \r
-       disable: function(){\r
-               if(this.enabled){\r
-                   this.el.removeListener(this.eventName, this.handleKeyDown, this);\r
-                   this.enabled = false;\r
-               }\r
-       }\r
-};\r
-\r
-Ext.util.TextMetrics = function(){\r
-    var shared;\r
-    return {\r
-        \r
-        measure : function(el, text, fixedWidth){\r
-            if(!shared){\r
-                shared = Ext.util.TextMetrics.Instance(el, fixedWidth);\r
-            }\r
-            shared.bind(el);\r
-            shared.setFixedWidth(fixedWidth || 'auto');\r
-            return shared.getSize(text);\r
-        },\r
-\r
-        \r
-        createInstance : function(el, fixedWidth){\r
-            return Ext.util.TextMetrics.Instance(el, fixedWidth);\r
-        }\r
-    };\r
-}();\r
-\r
-Ext.util.TextMetrics.Instance = function(bindTo, fixedWidth){\r
-    var ml = new Ext.Element(document.createElement('div'));\r
-    document.body.appendChild(ml.dom);\r
-    ml.position('absolute');\r
-    ml.setLeftTop(-1000, -1000);\r
-    ml.hide();\r
-\r
-    if(fixedWidth){\r
-        ml.setWidth(fixedWidth);\r
-    }\r
-\r
-    var instance = {\r
-        \r
-        getSize : function(text){\r
-            ml.update(text);\r
-            var s = ml.getSize();\r
-            ml.update('');\r
-            return s;\r
-        },\r
-\r
-        \r
-        bind : function(el){\r
-            ml.setStyle(\r
-                Ext.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing')\r
-            );\r
-        },\r
-\r
-        \r
-        setFixedWidth : function(width){\r
-            ml.setWidth(width);\r
-        },\r
-\r
-        \r
-        getWidth : function(text){\r
-            ml.dom.style.width = 'auto';\r
-            return this.getSize(text).width;\r
-        },\r
-\r
-        \r
-        getHeight : function(text){\r
-            return this.getSize(text).height;\r
-        }\r
-    };\r
-\r
-    instance.bind(bindTo);\r
-\r
-    return instance;\r
-};\r
-\r
-// backwards compat\r
-Ext.Element.measureText = Ext.util.TextMetrics.measure;\r
-\r
-\r
-(function() {\r
-\r
-var Event=Ext.EventManager;\r
-var Dom=Ext.lib.Dom;\r
-\r
-\r
-Ext.dd.DragDrop = function(id, sGroup, config) {\r
-    if(id) {\r
-        this.init(id, sGroup, config);\r
-    }\r
-};\r
-\r
-Ext.dd.DragDrop.prototype = {\r
-\r
-    \r
-    id: null,\r
-\r
-    \r
-    config: null,\r
-\r
-    \r
-    dragElId: null,\r
-\r
-    \r
-    handleElId: null,\r
-\r
-    \r
-    invalidHandleTypes: null,\r
-\r
-    \r
-    invalidHandleIds: null,\r
-\r
-    \r
-    invalidHandleClasses: null,\r
-\r
-    \r
-    startPageX: 0,\r
-\r
-    \r
-    startPageY: 0,\r
-\r
-    \r
-    groups: null,\r
-\r
-    \r
-    locked: false,\r
-\r
-    \r
-    lock: function() { this.locked = true; },\r
-\r
-    \r
-    moveOnly: false,\r
-\r
-    \r
-    unlock: function() { this.locked = false; },\r
-\r
-    \r
-    isTarget: true,\r
-\r
-    \r
-    padding: null,\r
-\r
-    \r
-    _domRef: null,\r
-\r
-    \r
-    __ygDragDrop: true,\r
-\r
-    \r
-    constrainX: false,\r
-\r
-    \r
-    constrainY: false,\r
-\r
-    \r
-    minX: 0,\r
-\r
-    \r
-    maxX: 0,\r
-\r
-    \r
-    minY: 0,\r
-\r
-    \r
-    maxY: 0,\r
-\r
-    \r
-    maintainOffset: false,\r
-\r
-    \r
-    xTicks: null,\r
-\r
-    \r
-    yTicks: null,\r
-\r
-    \r
-    primaryButtonOnly: true,\r
-\r
-    \r
-    available: false,\r
-\r
-    \r
-    hasOuterHandles: false,\r
-\r
-    \r
-    b4StartDrag: function(x, y) { },\r
-\r
-    \r
-    startDrag: function(x, y) {  },\r
-\r
-    \r
-    b4Drag: function(e) { },\r
-\r
-    \r
-    onDrag: function(e) {  },\r
-\r
-    \r
-    onDragEnter: function(e, id) {  },\r
-\r
-    \r
-    b4DragOver: function(e) { },\r
-\r
-    \r
-    onDragOver: function(e, id) {  },\r
-\r
-    \r
-    b4DragOut: function(e) { },\r
-\r
-    \r
-    onDragOut: function(e, id) {  },\r
-\r
-    \r
-    b4DragDrop: function(e) { },\r
-\r
-    \r
-    onDragDrop: function(e, id) {  },\r
-\r
-    \r
-    onInvalidDrop: function(e) {  },\r
-\r
-    \r
-    b4EndDrag: function(e) { },\r
-\r
-    \r
-    endDrag: function(e) {  },\r
-\r
-    \r
-    b4MouseDown: function(e) {  },\r
-\r
-    \r
-    onMouseDown: function(e) {  },\r
-\r
-    \r
-    onMouseUp: function(e) {  },\r
-\r
-    \r
-    onAvailable: function () {\r
-    },\r
-\r
-    \r
-    defaultPadding : {left:0, right:0, top:0, bottom:0},\r
-\r
-    \r
-    constrainTo : function(constrainTo, pad, inContent){\r
-        if(typeof pad == "number"){\r
-            pad = {left: pad, right:pad, top:pad, bottom:pad};\r
-        }\r
-        pad = pad || this.defaultPadding;\r
-        var b = Ext.get(this.getEl()).getBox();\r
-        var ce = Ext.get(constrainTo);\r
-        var s = ce.getScroll();\r
-        var c, cd = ce.dom;\r
-        if(cd == document.body){\r
-            c = { x: s.left, y: s.top, width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()};\r
-        }else{\r
-            var xy = ce.getXY();\r
-            c = {x : xy[0]+s.left, y: xy[1]+s.top, width: cd.clientWidth, height: cd.clientHeight};\r
-        }\r
-\r
-\r
-        var topSpace = b.y - c.y;\r
-        var leftSpace = b.x - c.x;\r
-\r
-        this.resetConstraints();\r
-        this.setXConstraint(leftSpace - (pad.left||0), // left\r
-                c.width - leftSpace - b.width - (pad.right||0), //right\r
-                               this.xTickSize\r
-        );\r
-        this.setYConstraint(topSpace - (pad.top||0), //top\r
-                c.height - topSpace - b.height - (pad.bottom||0), //bottom\r
-                               this.yTickSize\r
-        );\r
-    },\r
-\r
-    \r
-    getEl: function() {\r
-        if (!this._domRef) {\r
-            this._domRef = Ext.getDom(this.id);\r
-        }\r
-\r
-        return this._domRef;\r
-    },\r
-\r
-    \r
-    getDragEl: function() {\r
-        return Ext.getDom(this.dragElId);\r
-    },\r
-\r
-    \r
-    init: function(id, sGroup, config) {\r
-        this.initTarget(id, sGroup, config);\r
-        Event.on(this.id, "mousedown", this.handleMouseDown, this);\r
-        // Event.on(this.id, "selectstart", Event.preventDefault);\r
-    },\r
-\r
-    \r
-    initTarget: function(id, sGroup, config) {\r
-\r
-        // configuration attributes\r
-        this.config = config || {};\r
-\r
-        // create a local reference to the drag and drop manager\r
-        this.DDM = Ext.dd.DDM;\r
-        // initialize the groups array\r
-        this.groups = {};\r
-\r
-        // assume that we have an element reference instead of an id if the\r
-        // parameter is not a string\r
-        if (typeof id !== "string") {\r
-            id = Ext.id(id);\r
-        }\r
-\r
-        // set the id\r
-        this.id = id;\r
-\r
-        // add to an interaction group\r
-        this.addToGroup((sGroup) ? sGroup : "default");\r
-\r
-        // We don't want to register this as the handle with the manager\r
-        // so we just set the id rather than calling the setter.\r
-        this.handleElId = id;\r
-\r
-        // the linked element is the element that gets dragged by default\r
-        this.setDragElId(id);\r
-\r
-        // by default, clicked anchors will not start drag operations.\r
-        this.invalidHandleTypes = { A: "A" };\r
-        this.invalidHandleIds = {};\r
-        this.invalidHandleClasses = [];\r
-\r
-        this.applyConfig();\r
-\r
-        this.handleOnAvailable();\r
-    },\r
-\r
-    \r
-    applyConfig: function() {\r
-\r
-        // configurable properties:\r
-        //    padding, isTarget, maintainOffset, primaryButtonOnly\r
-        this.padding           = this.config.padding || [0, 0, 0, 0];\r
-        this.isTarget          = (this.config.isTarget !== false);\r
-        this.maintainOffset    = (this.config.maintainOffset);\r
-        this.primaryButtonOnly = (this.config.primaryButtonOnly !== false);\r
-\r
-    },\r
-\r
-    \r
-    handleOnAvailable: function() {\r
-        this.available = true;\r
-        this.resetConstraints();\r
-        this.onAvailable();\r
-    },\r
-\r
-     \r
-    setPadding: function(iTop, iRight, iBot, iLeft) {\r
-        // this.padding = [iLeft, iRight, iTop, iBot];\r
-        if (!iRight && 0 !== iRight) {\r
-            this.padding = [iTop, iTop, iTop, iTop];\r
-        } else if (!iBot && 0 !== iBot) {\r
-            this.padding = [iTop, iRight, iTop, iRight];\r
-        } else {\r
-            this.padding = [iTop, iRight, iBot, iLeft];\r
-        }\r
-    },\r
-\r
-    \r
-    setInitPosition: function(diffX, diffY) {\r
-        var el = this.getEl();\r
-\r
-        if (!this.DDM.verifyEl(el)) {\r
-            return;\r
-        }\r
-\r
-        var dx = diffX || 0;\r
-        var dy = diffY || 0;\r
-\r
-        var p = Dom.getXY( el );\r
-\r
-        this.initPageX = p[0] - dx;\r
-        this.initPageY = p[1] - dy;\r
-\r
-        this.lastPageX = p[0];\r
-        this.lastPageY = p[1];\r
-\r
-\r
-        this.setStartPosition(p);\r
-    },\r
-\r
-    \r
-    setStartPosition: function(pos) {\r
-        var p = pos || Dom.getXY( this.getEl() );\r
-        this.deltaSetXY = null;\r
-\r
-        this.startPageX = p[0];\r
-        this.startPageY = p[1];\r
-    },\r
-\r
-    \r
-    addToGroup: function(sGroup) {\r
-        this.groups[sGroup] = true;\r
-        this.DDM.regDragDrop(this, sGroup);\r
-    },\r
-\r
-    \r
-    removeFromGroup: function(sGroup) {\r
-        if (this.groups[sGroup]) {\r
-            delete this.groups[sGroup];\r
-        }\r
-\r
-        this.DDM.removeDDFromGroup(this, sGroup);\r
-    },\r
-\r
-    \r
-    setDragElId: function(id) {\r
-        this.dragElId = id;\r
-    },\r
-\r
-    \r
-    setHandleElId: function(id) {\r
-        if (typeof id !== "string") {\r
-            id = Ext.id(id);\r
-        }\r
-        this.handleElId = id;\r
-        this.DDM.regHandle(this.id, id);\r
-    },\r
-\r
-    \r
-    setOuterHandleElId: function(id) {\r
-        if (typeof id !== "string") {\r
-            id = Ext.id(id);\r
-        }\r
-        Event.on(id, "mousedown",\r
-                this.handleMouseDown, this);\r
-        this.setHandleElId(id);\r
-\r
-        this.hasOuterHandles = true;\r
-    },\r
-\r
-    \r
-    unreg: function() {\r
-        Event.un(this.id, "mousedown",\r
-                this.handleMouseDown);\r
-        this._domRef = null;\r
-        this.DDM._remove(this);\r
-    },\r
-\r
-    destroy : function(){\r
-        this.unreg();\r
-    },\r
-\r
-    \r
-    isLocked: function() {\r
-        return (this.DDM.isLocked() || this.locked);\r
-    },\r
-\r
-    \r
-    handleMouseDown: function(e, oDD){\r
-        if (this.primaryButtonOnly && e.button != 0) {\r
-            return;\r
-        }\r
-\r
-        if (this.isLocked()) {\r
-            return;\r
-        }\r
-\r
-        this.DDM.refreshCache(this.groups);\r
-\r
-        var pt = new Ext.lib.Point(Ext.lib.Event.getPageX(e), Ext.lib.Event.getPageY(e));\r
-        if (!this.hasOuterHandles && !this.DDM.isOverTarget(pt, this) )  {\r
-        } else {\r
-            if (this.clickValidator(e)) {\r
-\r
-                // set the initial element position\r
-                this.setStartPosition();\r
-\r
-\r
-                this.b4MouseDown(e);\r
-                this.onMouseDown(e);\r
-\r
-                this.DDM.handleMouseDown(e, this);\r
-\r
-                this.DDM.stopEvent(e);\r
-            } else {\r
-\r
-\r
-            }\r
-        }\r
-    },\r
-\r
-    clickValidator: function(e) {\r
-        var target = e.getTarget();\r
-        return ( this.isValidHandleChild(target) &&\r
-                    (this.id == this.handleElId ||\r
-                        this.DDM.handleWasClicked(target, this.id)) );\r
-    },\r
-\r
-    \r
-    addInvalidHandleType: function(tagName) {\r
-        var type = tagName.toUpperCase();\r
-        this.invalidHandleTypes[type] = type;\r
-    },\r
-\r
-    \r
-    addInvalidHandleId: function(id) {\r
-        if (typeof id !== "string") {\r
-            id = Ext.id(id);\r
-        }\r
-        this.invalidHandleIds[id] = id;\r
-    },\r
-\r
-    \r
-    addInvalidHandleClass: function(cssClass) {\r
-        this.invalidHandleClasses.push(cssClass);\r
-    },\r
-\r
-    \r
-    removeInvalidHandleType: function(tagName) {\r
-        var type = tagName.toUpperCase();\r
-        // this.invalidHandleTypes[type] = null;\r
-        delete this.invalidHandleTypes[type];\r
-    },\r
-\r
-    \r
-    removeInvalidHandleId: function(id) {\r
-        if (typeof id !== "string") {\r
-            id = Ext.id(id);\r
-        }\r
-        delete this.invalidHandleIds[id];\r
-    },\r
-\r
-    \r
-    removeInvalidHandleClass: function(cssClass) {\r
-        for (var i=0, len=this.invalidHandleClasses.length; i<len; ++i) {\r
-            if (this.invalidHandleClasses[i] == cssClass) {\r
-                delete this.invalidHandleClasses[i];\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    isValidHandleChild: function(node) {\r
-\r
-        var valid = true;\r
-        // var n = (node.nodeName == "#text") ? node.parentNode : node;\r
-        var nodeName;\r
-        try {\r
-            nodeName = node.nodeName.toUpperCase();\r
-        } catch(e) {\r
-            nodeName = node.nodeName;\r
-        }\r
-        valid = valid && !this.invalidHandleTypes[nodeName];\r
-        valid = valid && !this.invalidHandleIds[node.id];\r
-\r
-        for (var i=0, len=this.invalidHandleClasses.length; valid && i<len; ++i) {\r
-            valid = !Ext.fly(node).hasClass(this.invalidHandleClasses[i]);\r
-        }\r
-\r
-\r
-        return valid;\r
-\r
-    },\r
-\r
-    \r
-    setXTicks: function(iStartX, iTickSize) {\r
-        this.xTicks = [];\r
-        this.xTickSize = iTickSize;\r
-\r
-        var tickMap = {};\r
-\r
-        for (var i = this.initPageX; i >= this.minX; i = i - iTickSize) {\r
-            if (!tickMap[i]) {\r
-                this.xTicks[this.xTicks.length] = i;\r
-                tickMap[i] = true;\r
-            }\r
-        }\r
-\r
-        for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) {\r
-            if (!tickMap[i]) {\r
-                this.xTicks[this.xTicks.length] = i;\r
-                tickMap[i] = true;\r
-            }\r
-        }\r
-\r
-        this.xTicks.sort(this.DDM.numericSort) ;\r
-    },\r
-\r
-    \r
-    setYTicks: function(iStartY, iTickSize) {\r
-        this.yTicks = [];\r
-        this.yTickSize = iTickSize;\r
-\r
-        var tickMap = {};\r
-\r
-        for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) {\r
-            if (!tickMap[i]) {\r
-                this.yTicks[this.yTicks.length] = i;\r
-                tickMap[i] = true;\r
-            }\r
-        }\r
-\r
-        for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) {\r
-            if (!tickMap[i]) {\r
-                this.yTicks[this.yTicks.length] = i;\r
-                tickMap[i] = true;\r
-            }\r
-        }\r
-\r
-        this.yTicks.sort(this.DDM.numericSort) ;\r
-    },\r
-\r
-    \r
-    setXConstraint: function(iLeft, iRight, iTickSize) {\r
-        this.leftConstraint = iLeft;\r
-        this.rightConstraint = iRight;\r
-\r
-        this.minX = this.initPageX - iLeft;\r
-        this.maxX = this.initPageX + iRight;\r
-        if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); }\r
-\r
-        this.constrainX = true;\r
-    },\r
-\r
-    \r
-    clearConstraints: function() {\r
-        this.constrainX = false;\r
-        this.constrainY = false;\r
-        this.clearTicks();\r
-    },\r
-\r
-    \r
-    clearTicks: function() {\r
-        this.xTicks = null;\r
-        this.yTicks = null;\r
-        this.xTickSize = 0;\r
-        this.yTickSize = 0;\r
-    },\r
-\r
-    \r
-    setYConstraint: function(iUp, iDown, iTickSize) {\r
-        this.topConstraint = iUp;\r
-        this.bottomConstraint = iDown;\r
-\r
-        this.minY = this.initPageY - iUp;\r
-        this.maxY = this.initPageY + iDown;\r
-        if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); }\r
-\r
-        this.constrainY = true;\r
-\r
-    },\r
-\r
-    \r
-    resetConstraints: function() {\r
-\r
-\r
-        // Maintain offsets if necessary\r
-        if (this.initPageX || this.initPageX === 0) {\r
-            // figure out how much this thing has moved\r
-            var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0;\r
-            var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0;\r
-\r
-            this.setInitPosition(dx, dy);\r
-\r
-        // This is the first time we have detected the element's position\r
-        } else {\r
-            this.setInitPosition();\r
-        }\r
-\r
-        if (this.constrainX) {\r
-            this.setXConstraint( this.leftConstraint,\r
-                                 this.rightConstraint,\r
-                                 this.xTickSize        );\r
-        }\r
-\r
-        if (this.constrainY) {\r
-            this.setYConstraint( this.topConstraint,\r
-                                 this.bottomConstraint,\r
-                                 this.yTickSize         );\r
-        }\r
-    },\r
-\r
-    \r
-    getTick: function(val, tickArray) {\r
-\r
-        if (!tickArray) {\r
-            // If tick interval is not defined, it is effectively 1 pixel,\r
-            // so we return the value passed to us.\r
-            return val;\r
-        } else if (tickArray[0] >= val) {\r
-            // The value is lower than the first tick, so we return the first\r
-            // tick.\r
-            return tickArray[0];\r
-        } else {\r
-            for (var i=0, len=tickArray.length; i<len; ++i) {\r
-                var next = i + 1;\r
-                if (tickArray[next] && tickArray[next] >= val) {\r
-                    var diff1 = val - tickArray[i];\r
-                    var diff2 = tickArray[next] - val;\r
-                    return (diff2 > diff1) ? tickArray[i] : tickArray[next];\r
-                }\r
-            }\r
-\r
-            // The value is larger than the last tick, so we return the last\r
-            // tick.\r
-            return tickArray[tickArray.length - 1];\r
-        }\r
-    },\r
-\r
-    \r
-    toString: function() {\r
-        return ("DragDrop " + this.id);\r
-    }\r
-\r
-};\r
-\r
-})();\r
-\r
-\r
-// Only load the library once.  Rewriting the manager class would orphan\r
-// existing drag and drop instances.\r
-if (!Ext.dd.DragDropMgr) {\r
-\r
-\r
-Ext.dd.DragDropMgr = function() {\r
-\r
-    var Event = Ext.EventManager;\r
-\r
-    return {\r
-\r
-        \r
-        ids: {},\r
-\r
-        \r
-        handleIds: {},\r
-\r
-        \r
-        dragCurrent: null,\r
-\r
-        \r
-        dragOvers: {},\r
-\r
-        \r
-        deltaX: 0,\r
-\r
-        \r
-        deltaY: 0,\r
-\r
-        \r
-        preventDefault: true,\r
-\r
-        \r
-        stopPropagation: true,\r
-\r
-        \r
-        initialized: false,\r
-\r
-        \r
-        locked: false,\r
-\r
-        \r
-        init: function() {\r
-            this.initialized = true;\r
-        },\r
-\r
-        \r
-        POINT: 0,\r
-\r
-        \r
-        INTERSECT: 1,\r
-\r
-        \r
-        mode: 0,\r
-\r
-        \r
-        _execOnAll: function(sMethod, args) {\r
-            for (var i in this.ids) {\r
-                for (var j in this.ids[i]) {\r
-                    var oDD = this.ids[i][j];\r
-                    if (! this.isTypeOfDD(oDD)) {\r
-                        continue;\r
-                    }\r
-                    oDD[sMethod].apply(oDD, args);\r
-                }\r
-            }\r
-        },\r
-\r
-        \r
-        _onLoad: function() {\r
-\r
-            this.init();\r
-\r
-\r
-            Event.on(document, "mouseup",   this.handleMouseUp, this, true);\r
-            Event.on(document, "mousemove", this.handleMouseMove, this, true);\r
-            Event.on(window,   "unload",    this._onUnload, this, true);\r
-            Event.on(window,   "resize",    this._onResize, this, true);\r
-            // Event.on(window,   "mouseout",    this._test);\r
-\r
-        },\r
-\r
-        \r
-        _onResize: function(e) {\r
-            this._execOnAll("resetConstraints", []);\r
-        },\r
-\r
-        \r
-        lock: function() { this.locked = true; },\r
-\r
-        \r
-        unlock: function() { this.locked = false; },\r
-\r
-        \r
-        isLocked: function() { return this.locked; },\r
-\r
-        \r
-        locationCache: {},\r
-\r
-        \r
-        useCache: true,\r
-\r
-        \r
-        clickPixelThresh: 3,\r
-\r
-        \r
-        clickTimeThresh: 350,\r
-\r
-        \r
-        dragThreshMet: false,\r
-\r
-        \r
-        clickTimeout: null,\r
-\r
-        \r
-        startX: 0,\r
-\r
-        \r
-        startY: 0,\r
-\r
-        \r
-        regDragDrop: function(oDD, sGroup) {\r
-            if (!this.initialized) { this.init(); }\r
-\r
-            if (!this.ids[sGroup]) {\r
-                this.ids[sGroup] = {};\r
-            }\r
-            this.ids[sGroup][oDD.id] = oDD;\r
-        },\r
-\r
-        \r
-        removeDDFromGroup: function(oDD, sGroup) {\r
-            if (!this.ids[sGroup]) {\r
-                this.ids[sGroup] = {};\r
-            }\r
-\r
-            var obj = this.ids[sGroup];\r
-            if (obj && obj[oDD.id]) {\r
-                delete obj[oDD.id];\r
-            }\r
-        },\r
-\r
-        \r
-        _remove: function(oDD) {\r
-            for (var g in oDD.groups) {\r
-                if (g && this.ids[g] && this.ids[g][oDD.id]) {\r
-                    delete this.ids[g][oDD.id];\r
-                }\r
-            }\r
-            delete this.handleIds[oDD.id];\r
-        },\r
-\r
-        \r
-        regHandle: function(sDDId, sHandleId) {\r
-            if (!this.handleIds[sDDId]) {\r
-                this.handleIds[sDDId] = {};\r
-            }\r
-            this.handleIds[sDDId][sHandleId] = sHandleId;\r
-        },\r
-\r
-        \r
-        isDragDrop: function(id) {\r
-            return ( this.getDDById(id) ) ? true : false;\r
-        },\r
-\r
-        \r
-        getRelated: function(p_oDD, bTargetsOnly) {\r
-            var oDDs = [];\r
-            for (var i in p_oDD.groups) {\r
-                for (j in this.ids[i]) {\r
-                    var dd = this.ids[i][j];\r
-                    if (! this.isTypeOfDD(dd)) {\r
-                        continue;\r
-                    }\r
-                    if (!bTargetsOnly || dd.isTarget) {\r
-                        oDDs[oDDs.length] = dd;\r
-                    }\r
-                }\r
-            }\r
-\r
-            return oDDs;\r
-        },\r
-\r
-        \r
-        isLegalTarget: function (oDD, oTargetDD) {\r
-            var targets = this.getRelated(oDD, true);\r
-            for (var i=0, len=targets.length;i<len;++i) {\r
-                if (targets[i].id == oTargetDD.id) {\r
-                    return true;\r
-                }\r
-            }\r
-\r
-            return false;\r
-        },\r
-\r
-        \r
-        isTypeOfDD: function (oDD) {\r
-            return (oDD && oDD.__ygDragDrop);\r
-        },\r
-\r
-        \r
-        isHandle: function(sDDId, sHandleId) {\r
-            return ( this.handleIds[sDDId] &&\r
-                            this.handleIds[sDDId][sHandleId] );\r
-        },\r
-\r
-        \r
-        getDDById: function(id) {\r
-            for (var i in this.ids) {\r
-                if (this.ids[i][id]) {\r
-                    return this.ids[i][id];\r
-                }\r
-            }\r
-            return null;\r
-        },\r
-\r
-        \r
-        handleMouseDown: function(e, oDD) {\r
-            if(Ext.QuickTips){\r
-                Ext.QuickTips.disable();\r
-            }\r
-            if(this.dragCurrent){\r
-                // the original browser mouseup wasn't handled (e.g. outside FF browser window)\r
-                // so clean up first to avoid breaking the next drag\r
-                this.handleMouseUp(e);\r
-            }\r
-            \r
-            this.currentTarget = e.getTarget();\r
-            this.dragCurrent = oDD;\r
-\r
-            var el = oDD.getEl();\r
-\r
-            // track start position\r
-            this.startX = e.getPageX();\r
-            this.startY = e.getPageY();\r
-\r
-            this.deltaX = this.startX - el.offsetLeft;\r
-            this.deltaY = this.startY - el.offsetTop;\r
-\r
-            this.dragThreshMet = false;\r
-\r
-            this.clickTimeout = setTimeout(\r
-                    function() {\r
-                        var DDM = Ext.dd.DDM;\r
-                        DDM.startDrag(DDM.startX, DDM.startY);\r
-                    },\r
-                    this.clickTimeThresh );\r
-        },\r
-\r
-        \r
-        startDrag: function(x, y) {\r
-            clearTimeout(this.clickTimeout);\r
-            if (this.dragCurrent) {\r
-                this.dragCurrent.b4StartDrag(x, y);\r
-                this.dragCurrent.startDrag(x, y);\r
-            }\r
-            this.dragThreshMet = true;\r
-        },\r
-\r
-        \r
-        handleMouseUp: function(e) {\r
-\r
-            if(Ext.QuickTips){\r
-                Ext.QuickTips.enable();\r
-            }\r
-            if (! this.dragCurrent) {\r
-                return;\r
-            }\r
-\r
-            clearTimeout(this.clickTimeout);\r
-\r
-            if (this.dragThreshMet) {\r
-                this.fireEvents(e, true);\r
-            } else {\r
-            }\r
-\r
-            this.stopDrag(e);\r
-\r
-            this.stopEvent(e);\r
-        },\r
-\r
-        \r
-        stopEvent: function(e){\r
-            if(this.stopPropagation) {\r
-                e.stopPropagation();\r
-            }\r
-\r
-            if (this.preventDefault) {\r
-                e.preventDefault();\r
-            }\r
-        },\r
-\r
-        \r
-        stopDrag: function(e) {\r
-            // Fire the drag end event for the item that was dragged\r
-            if (this.dragCurrent) {\r
-                if (this.dragThreshMet) {\r
-                    this.dragCurrent.b4EndDrag(e);\r
-                    this.dragCurrent.endDrag(e);\r
-                }\r
-\r
-                this.dragCurrent.onMouseUp(e);\r
-            }\r
-\r
-            this.dragCurrent = null;\r
-            this.dragOvers = {};\r
-        },\r
-\r
-        \r
-        handleMouseMove: function(e) {\r
-            if (! this.dragCurrent) {\r
-                return true;\r
-            }\r
-\r
-            // var button = e.which || e.button;\r
-\r
-            // check for IE mouseup outside of page boundary\r
-            if (Ext.isIE && (e.button !== 0 && e.button !== 1 && e.button !== 2)) {\r
-                this.stopEvent(e);\r
-                return this.handleMouseUp(e);\r
-            }\r
-\r
-            if (!this.dragThreshMet) {\r
-                var diffX = Math.abs(this.startX - e.getPageX());\r
-                var diffY = Math.abs(this.startY - e.getPageY());\r
-                if (diffX > this.clickPixelThresh ||\r
-                            diffY > this.clickPixelThresh) {\r
-                    this.startDrag(this.startX, this.startY);\r
-                }\r
-            }\r
-\r
-            if (this.dragThreshMet) {\r
-                this.dragCurrent.b4Drag(e);\r
-                this.dragCurrent.onDrag(e);\r
-                if(!this.dragCurrent.moveOnly){\r
-                    this.fireEvents(e, false);\r
-                }\r
-            }\r
-\r
-            this.stopEvent(e);\r
-\r
-            return true;\r
-        },\r
-\r
-        \r
-        fireEvents: function(e, isDrop) {\r
-            var dc = this.dragCurrent;\r
-\r
-            // If the user did the mouse up outside of the window, we could\r
-            // get here even though we have ended the drag.\r
-            if (!dc || dc.isLocked()) {\r
-                return;\r
-            }\r
-\r
-            var pt = e.getPoint();\r
-\r
-            // cache the previous dragOver array\r
-            var oldOvers = [];\r
-\r
-            var outEvts   = [];\r
-            var overEvts  = [];\r
-            var dropEvts  = [];\r
-            var enterEvts = [];\r
-\r
-            // Check to see if the object(s) we were hovering over is no longer\r
-            // being hovered over so we can fire the onDragOut event\r
-            for (var i in this.dragOvers) {\r
-\r
-                var ddo = this.dragOvers[i];\r
-\r
-                if (! this.isTypeOfDD(ddo)) {\r
-                    continue;\r
-                }\r
-\r
-                if (! this.isOverTarget(pt, ddo, this.mode)) {\r
-                    outEvts.push( ddo );\r
-                }\r
-\r
-                oldOvers[i] = true;\r
-                delete this.dragOvers[i];\r
-            }\r
-\r
-            for (var sGroup in dc.groups) {\r
-\r
-                if ("string" != typeof sGroup) {\r
-                    continue;\r
-                }\r
-\r
-                for (i in this.ids[sGroup]) {\r
-                    var oDD = this.ids[sGroup][i];\r
-                    if (! this.isTypeOfDD(oDD)) {\r
-                        continue;\r
-                    }\r
-\r
-                    if (oDD.isTarget && !oDD.isLocked() && oDD != dc) {\r
-                        if (this.isOverTarget(pt, oDD, this.mode)) {\r
-                            // look for drop interactions\r
-                            if (isDrop) {\r
-                                dropEvts.push( oDD );\r
-                            // look for drag enter and drag over interactions\r
-                            } else {\r
-\r
-                                // initial drag over: dragEnter fires\r
-                                if (!oldOvers[oDD.id]) {\r
-                                    enterEvts.push( oDD );\r
-                                // subsequent drag overs: dragOver fires\r
-                                } else {\r
-                                    overEvts.push( oDD );\r
-                                }\r
-\r
-                                this.dragOvers[oDD.id] = oDD;\r
-                            }\r
-                        }\r
-                    }\r
-                }\r
-            }\r
-\r
-            if (this.mode) {\r
-                if (outEvts.length) {\r
-                    dc.b4DragOut(e, outEvts);\r
-                    dc.onDragOut(e, outEvts);\r
-                }\r
-\r
-                if (enterEvts.length) {\r
-                    dc.onDragEnter(e, enterEvts);\r
-                }\r
-\r
-                if (overEvts.length) {\r
-                    dc.b4DragOver(e, overEvts);\r
-                    dc.onDragOver(e, overEvts);\r
-                }\r
-\r
-                if (dropEvts.length) {\r
-                    dc.b4DragDrop(e, dropEvts);\r
-                    dc.onDragDrop(e, dropEvts);\r
-                }\r
-\r
-            } else {\r
-                // fire dragout events\r
-                var len = 0;\r
-                for (i=0, len=outEvts.length; i<len; ++i) {\r
-                    dc.b4DragOut(e, outEvts[i].id);\r
-                    dc.onDragOut(e, outEvts[i].id);\r
-                }\r
-\r
-                // fire enter events\r
-                for (i=0,len=enterEvts.length; i<len; ++i) {\r
-                    // dc.b4DragEnter(e, oDD.id);\r
-                    dc.onDragEnter(e, enterEvts[i].id);\r
-                }\r
-\r
-                // fire over events\r
-                for (i=0,len=overEvts.length; i<len; ++i) {\r
-                    dc.b4DragOver(e, overEvts[i].id);\r
-                    dc.onDragOver(e, overEvts[i].id);\r
-                }\r
-\r
-                // fire drop events\r
-                for (i=0, len=dropEvts.length; i<len; ++i) {\r
-                    dc.b4DragDrop(e, dropEvts[i].id);\r
-                    dc.onDragDrop(e, dropEvts[i].id);\r
-                }\r
-\r
-            }\r
-\r
-            // notify about a drop that did not find a target\r
-            if (isDrop && !dropEvts.length) {\r
-                dc.onInvalidDrop(e);\r
-            }\r
-\r
-        },\r
-\r
-        \r
-        getBestMatch: function(dds) {\r
-            var winner = null;\r
-            // Return null if the input is not what we expect\r
-            //if (!dds || !dds.length || dds.length == 0) {\r
-               // winner = null;\r
-            // If there is only one item, it wins\r
-            //} else if (dds.length == 1) {\r
-\r
-            var len = dds.length;\r
-\r
-            if (len == 1) {\r
-                winner = dds[0];\r
-            } else {\r
-                // Loop through the targeted items\r
-                for (var i=0; i<len; ++i) {\r
-                    var dd = dds[i];\r
-                    // If the cursor is over the object, it wins.  If the\r
-                    // cursor is over multiple matches, the first one we come\r
-                    // to wins.\r
-                    if (dd.cursorIsOver) {\r
-                        winner = dd;\r
-                        break;\r
-                    // Otherwise the object with the most overlap wins\r
-                    } else {\r
-                        if (!winner ||\r
-                            winner.overlap.getArea() < dd.overlap.getArea()) {\r
-                            winner = dd;\r
-                        }\r
-                    }\r
-                }\r
-            }\r
-\r
-            return winner;\r
-        },\r
-\r
-        \r
-        refreshCache: function(groups) {\r
-            for (var sGroup in groups) {\r
-                if ("string" != typeof sGroup) {\r
-                    continue;\r
-                }\r
-                for (var i in this.ids[sGroup]) {\r
-                    var oDD = this.ids[sGroup][i];\r
-\r
-                    if (this.isTypeOfDD(oDD)) {\r
-                    // if (this.isTypeOfDD(oDD) && oDD.isTarget) {\r
-                        var loc = this.getLocation(oDD);\r
-                        if (loc) {\r
-                            this.locationCache[oDD.id] = loc;\r
-                        } else {\r
-                            delete this.locationCache[oDD.id];\r
-                            // this will unregister the drag and drop object if\r
-                            // the element is not in a usable state\r
-                            // oDD.unreg();\r
-                        }\r
-                    }\r
-                }\r
-            }\r
-        },\r
-\r
-        \r
-        verifyEl: function(el) {\r
-            if (el) {\r
-                var parent;\r
-                if(Ext.isIE){\r
-                    try{\r
-                        parent = el.offsetParent;\r
-                    }catch(e){}\r
-                }else{\r
-                    parent = el.offsetParent;\r
-                }\r
-                if (parent) {\r
-                    return true;\r
-                }\r
-            }\r
-\r
-            return false;\r
-        },\r
-\r
-        \r
-        getLocation: function(oDD) {\r
-            if (! this.isTypeOfDD(oDD)) {\r
-                return null;\r
-            }\r
-\r
-            var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l;\r
-\r
-            try {\r
-                pos= Ext.lib.Dom.getXY(el);\r
-            } catch (e) { }\r
-\r
-            if (!pos) {\r
-                return null;\r
-            }\r
-\r
-            x1 = pos[0];\r
-            x2 = x1 + el.offsetWidth;\r
-            y1 = pos[1];\r
-            y2 = y1 + el.offsetHeight;\r
-\r
-            t = y1 - oDD.padding[0];\r
-            r = x2 + oDD.padding[1];\r
-            b = y2 + oDD.padding[2];\r
-            l = x1 - oDD.padding[3];\r
-\r
-            return new Ext.lib.Region( t, r, b, l );\r
-        },\r
-\r
-        \r
-        isOverTarget: function(pt, oTarget, intersect) {\r
-            // use cache if available\r
-            var loc = this.locationCache[oTarget.id];\r
-            if (!loc || !this.useCache) {\r
-                loc = this.getLocation(oTarget);\r
-                this.locationCache[oTarget.id] = loc;\r
-\r
-            }\r
-\r
-            if (!loc) {\r
-                return false;\r
-            }\r
-\r
-            oTarget.cursorIsOver = loc.contains( pt );\r
-\r
-            // DragDrop is using this as a sanity check for the initial mousedown\r
-            // in this case we are done.  In POINT mode, if the drag obj has no\r
-            // contraints, we are also done. Otherwise we need to evaluate the\r
-            // location of the target as related to the actual location of the\r
-            // dragged element.\r
-            var dc = this.dragCurrent;\r
-            if (!dc || !dc.getTargetCoord ||\r
-                    (!intersect && !dc.constrainX && !dc.constrainY)) {\r
-                return oTarget.cursorIsOver;\r
-            }\r
-\r
-            oTarget.overlap = null;\r
-\r
-            // Get the current location of the drag element, this is the\r
-            // location of the mouse event less the delta that represents\r
-            // where the original mousedown happened on the element.  We\r
-            // need to consider constraints and ticks as well.\r
-            var pos = dc.getTargetCoord(pt.x, pt.y);\r
-\r
-            var el = dc.getDragEl();\r
-            var curRegion = new Ext.lib.Region( pos.y,\r
-                                                   pos.x + el.offsetWidth,\r
-                                                   pos.y + el.offsetHeight,\r
-                                                   pos.x );\r
-\r
-            var overlap = curRegion.intersect(loc);\r
-\r
-            if (overlap) {\r
-                oTarget.overlap = overlap;\r
-                return (intersect) ? true : oTarget.cursorIsOver;\r
-            } else {\r
-                return false;\r
-            }\r
-        },\r
-\r
-        \r
-        _onUnload: function(e, me) {\r
-            Ext.dd.DragDropMgr.unregAll();\r
-        },\r
-\r
-        \r
-        unregAll: function() {\r
-\r
-            if (this.dragCurrent) {\r
-                this.stopDrag();\r
-                this.dragCurrent = null;\r
-            }\r
-\r
-            this._execOnAll("unreg", []);\r
-\r
-            for (var i in this.elementCache) {\r
-                delete this.elementCache[i];\r
-            }\r
-\r
-            this.elementCache = {};\r
-            this.ids = {};\r
-        },\r
-\r
-        \r
-        elementCache: {},\r
-\r
-        \r
-        getElWrapper: function(id) {\r
-            var oWrapper = this.elementCache[id];\r
-            if (!oWrapper || !oWrapper.el) {\r
-                oWrapper = this.elementCache[id] =\r
-                    new this.ElementWrapper(Ext.getDom(id));\r
-            }\r
-            return oWrapper;\r
-        },\r
-\r
-        \r
-        getElement: function(id) {\r
-            return Ext.getDom(id);\r
-        },\r
-\r
-        \r
-        getCss: function(id) {\r
-            var el = Ext.getDom(id);\r
-            return (el) ? el.style : null;\r
-        },\r
-\r
-        \r
-        ElementWrapper: function(el) {\r
-                \r
-                this.el = el || null;\r
-                \r
-                this.id = this.el && el.id;\r
-                \r
-                this.css = this.el && el.style;\r
-            },\r
-\r
-        \r
-        getPosX: function(el) {\r
-            return Ext.lib.Dom.getX(el);\r
-        },\r
-\r
-        \r
-        getPosY: function(el) {\r
-            return Ext.lib.Dom.getY(el);\r
-        },\r
-\r
-        \r
-        swapNode: function(n1, n2) {\r
-            if (n1.swapNode) {\r
-                n1.swapNode(n2);\r
-            } else {\r
-                var p = n2.parentNode;\r
-                var s = n2.nextSibling;\r
-\r
-                if (s == n1) {\r
-                    p.insertBefore(n1, n2);\r
-                } else if (n2 == n1.nextSibling) {\r
-                    p.insertBefore(n2, n1);\r
-                } else {\r
-                    n1.parentNode.replaceChild(n2, n1);\r
-                    p.insertBefore(n1, s);\r
-                }\r
-            }\r
-        },\r
-\r
-        \r
-        getScroll: function () {\r
-            var t, l, dde=document.documentElement, db=document.body;\r
-            if (dde && (dde.scrollTop || dde.scrollLeft)) {\r
-                t = dde.scrollTop;\r
-                l = dde.scrollLeft;\r
-            } else if (db) {\r
-                t = db.scrollTop;\r
-                l = db.scrollLeft;\r
-            } else {\r
-\r
-            }\r
-            return { top: t, left: l };\r
-        },\r
-\r
-        \r
-        getStyle: function(el, styleProp) {\r
-            return Ext.fly(el).getStyle(styleProp);\r
-        },\r
-\r
-        \r
-        getScrollTop: function () { return this.getScroll().top; },\r
-\r
-        \r
-        getScrollLeft: function () { return this.getScroll().left; },\r
-\r
-        \r
-        moveToEl: function (moveEl, targetEl) {\r
-            var aCoord = Ext.lib.Dom.getXY(targetEl);\r
-            Ext.lib.Dom.setXY(moveEl, aCoord);\r
-        },\r
-\r
-        \r
-        numericSort: function(a, b) { return (a - b); },\r
-\r
-        \r
-        _timeoutCount: 0,\r
-\r
-        \r
-        _addListeners: function() {\r
-            var DDM = Ext.dd.DDM;\r
-            if ( Ext.lib.Event && document ) {\r
-                DDM._onLoad();\r
-            } else {\r
-                if (DDM._timeoutCount > 2000) {\r
-                } else {\r
-                    setTimeout(DDM._addListeners, 10);\r
-                    if (document && document.body) {\r
-                        DDM._timeoutCount += 1;\r
-                    }\r
-                }\r
-            }\r
-        },\r
-\r
-        \r
-        handleWasClicked: function(node, id) {\r
-            if (this.isHandle(id, node.id)) {\r
-                return true;\r
-            } else {\r
-                // check to see if this is a text node child of the one we want\r
-                var p = node.parentNode;\r
-\r
-                while (p) {\r
-                    if (this.isHandle(id, p.id)) {\r
-                        return true;\r
-                    } else {\r
-                        p = p.parentNode;\r
-                    }\r
-                }\r
-            }\r
-\r
-            return false;\r
-        }\r
-\r
-    };\r
-\r
-}();\r
-\r
-// shorter alias, save a few bytes\r
-Ext.dd.DDM = Ext.dd.DragDropMgr;\r
-Ext.dd.DDM._addListeners();\r
-\r
-}\r
-\r
-\r
-Ext.dd.DD = function(id, sGroup, config) {\r
-    if (id) {\r
-        this.init(id, sGroup, config);\r
-    }\r
-};\r
-\r
-Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, {\r
-\r
-    \r
-    scroll: true,\r
-\r
-    \r
-    autoOffset: function(iPageX, iPageY) {\r
-        var x = iPageX - this.startPageX;\r
-        var y = iPageY - this.startPageY;\r
-        this.setDelta(x, y);\r
-    },\r
-\r
-    \r
-    setDelta: function(iDeltaX, iDeltaY) {\r
-        this.deltaX = iDeltaX;\r
-        this.deltaY = iDeltaY;\r
-    },\r
-\r
-    \r
-    setDragElPos: function(iPageX, iPageY) {\r
-        // the first time we do this, we are going to check to make sure\r
-        // the element has css positioning\r
-\r
-        var el = this.getDragEl();\r
-        this.alignElWithMouse(el, iPageX, iPageY);\r
-    },\r
-\r
-    \r
-    alignElWithMouse: function(el, iPageX, iPageY) {\r
-        var oCoord = this.getTargetCoord(iPageX, iPageY);\r
-        var fly = el.dom ? el : Ext.fly(el, '_dd');\r
-        if (!this.deltaSetXY) {\r
-            var aCoord = [oCoord.x, oCoord.y];\r
-            fly.setXY(aCoord);\r
-            var newLeft = fly.getLeft(true);\r
-            var newTop  = fly.getTop(true);\r
-            this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ];\r
-        } else {\r
-            fly.setLeftTop(oCoord.x + this.deltaSetXY[0], oCoord.y + this.deltaSetXY[1]);\r
-        }\r
-\r
-        this.cachePosition(oCoord.x, oCoord.y);\r
-        this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth);\r
-        return oCoord;\r
-    },\r
-\r
-    \r
-    cachePosition: function(iPageX, iPageY) {\r
-        if (iPageX) {\r
-            this.lastPageX = iPageX;\r
-            this.lastPageY = iPageY;\r
-        } else {\r
-            var aCoord = Ext.lib.Dom.getXY(this.getEl());\r
-            this.lastPageX = aCoord[0];\r
-            this.lastPageY = aCoord[1];\r
-        }\r
-    },\r
-\r
-    \r
-    autoScroll: function(x, y, h, w) {\r
-\r
-        if (this.scroll) {\r
-            // The client height\r
-            var clientH = Ext.lib.Dom.getViewHeight();\r
-\r
-            // The client width\r
-            var clientW = Ext.lib.Dom.getViewWidth();\r
-\r
-            // The amt scrolled down\r
-            var st = this.DDM.getScrollTop();\r
-\r
-            // The amt scrolled right\r
-            var sl = this.DDM.getScrollLeft();\r
-\r
-            // Location of the bottom of the element\r
-            var bot = h + y;\r
-\r
-            // Location of the right of the element\r
-            var right = w + x;\r
-\r
-            // The distance from the cursor to the bottom of the visible area,\r
-            // adjusted so that we don't scroll if the cursor is beyond the\r
-            // element drag constraints\r
-            var toBot = (clientH + st - y - this.deltaY);\r
-\r
-            // The distance from the cursor to the right of the visible area\r
-            var toRight = (clientW + sl - x - this.deltaX);\r
-\r
-\r
-            // How close to the edge the cursor must be before we scroll\r
-            // var thresh = (document.all) ? 100 : 40;\r
-            var thresh = 40;\r
-\r
-            // How many pixels to scroll per autoscroll op.  This helps to reduce\r
-            // clunky scrolling. IE is more sensitive about this ... it needs this\r
-            // value to be higher.\r
-            var scrAmt = (document.all) ? 80 : 30;\r
-\r
-            // Scroll down if we are near the bottom of the visible page and the\r
-            // obj extends below the crease\r
-            if ( bot > clientH && toBot < thresh ) {\r
-                window.scrollTo(sl, st + scrAmt);\r
-            }\r
-\r
-            // Scroll up if the window is scrolled down and the top of the object\r
-            // goes above the top border\r
-            if ( y < st && st > 0 && y - st < thresh ) {\r
-                window.scrollTo(sl, st - scrAmt);\r
-            }\r
-\r
-            // Scroll right if the obj is beyond the right border and the cursor is\r
-            // near the border.\r
-            if ( right > clientW && toRight < thresh ) {\r
-                window.scrollTo(sl + scrAmt, st);\r
-            }\r
-\r
-            // Scroll left if the window has been scrolled to the right and the obj\r
-            // extends past the left border\r
-            if ( x < sl && sl > 0 && x - sl < thresh ) {\r
-                window.scrollTo(sl - scrAmt, st);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    getTargetCoord: function(iPageX, iPageY) {\r
-\r
-\r
-        var x = iPageX - this.deltaX;\r
-        var y = iPageY - this.deltaY;\r
-\r
-        if (this.constrainX) {\r
-            if (x < this.minX) { x = this.minX; }\r
-            if (x > this.maxX) { x = this.maxX; }\r
-        }\r
-\r
-        if (this.constrainY) {\r
-            if (y < this.minY) { y = this.minY; }\r
-            if (y > this.maxY) { y = this.maxY; }\r
-        }\r
-\r
-        x = this.getTick(x, this.xTicks);\r
-        y = this.getTick(y, this.yTicks);\r
-\r
-\r
-        return {x:x, y:y};\r
-    },\r
-\r
-    \r
-    applyConfig: function() {\r
-        Ext.dd.DD.superclass.applyConfig.call(this);\r
-        this.scroll = (this.config.scroll !== false);\r
-    },\r
-\r
-    \r
-    b4MouseDown: function(e) {\r
-        // this.resetConstraints();\r
-        this.autoOffset(e.getPageX(),\r
-                            e.getPageY());\r
-    },\r
-\r
-    \r
-    b4Drag: function(e) {\r
-        this.setDragElPos(e.getPageX(),\r
-                            e.getPageY());\r
-    },\r
-\r
-    toString: function() {\r
-        return ("DD " + this.id);\r
-    }\r
-\r
-    //////////////////////////////////////////////////////////////////////////\r
-    // Debugging ygDragDrop events that can be overridden\r
-    //////////////////////////////////////////////////////////////////////////\r
-    \r
-\r
-});\r
-\r
-Ext.dd.DDProxy = function(id, sGroup, config) {\r
-    if (id) {\r
-        this.init(id, sGroup, config);\r
-        this.initFrame();\r
-    }\r
-};\r
-\r
-\r
-Ext.dd.DDProxy.dragElId = "ygddfdiv";\r
-\r
-Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, {\r
-\r
-    \r
-    resizeFrame: true,\r
-\r
-    \r
-    centerFrame: false,\r
-\r
-    \r
-    createFrame: function() {\r
-        var self = this;\r
-        var body = document.body;\r
-\r
-        if (!body || !body.firstChild) {\r
-            setTimeout( function() { self.createFrame(); }, 50 );\r
-            return;\r
-        }\r
-\r
-        var div = this.getDragEl();\r
-\r
-        if (!div) {\r
-            div    = document.createElement("div");\r
-            div.id = this.dragElId;\r
-            var s  = div.style;\r
-\r
-            s.position   = "absolute";\r
-            s.visibility = "hidden";\r
-            s.cursor     = "move";\r
-            s.border     = "2px solid #aaa";\r
-            s.zIndex     = 999;\r
-\r
-            // appendChild can blow up IE if invoked prior to the window load event\r
-            // while rendering a table.  It is possible there are other scenarios\r
-            // that would cause this to happen as well.\r
-            body.insertBefore(div, body.firstChild);\r
-        }\r
-    },\r
-\r
-    \r
-    initFrame: function() {\r
-        this.createFrame();\r
-    },\r
-\r
-    applyConfig: function() {\r
-        Ext.dd.DDProxy.superclass.applyConfig.call(this);\r
-\r
-        this.resizeFrame = (this.config.resizeFrame !== false);\r
-        this.centerFrame = (this.config.centerFrame);\r
-        this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId);\r
-    },\r
-\r
-    \r
-    showFrame: function(iPageX, iPageY) {\r
-        var el = this.getEl();\r
-        var dragEl = this.getDragEl();\r
-        var s = dragEl.style;\r
-\r
-        this._resizeProxy();\r
-\r
-        if (this.centerFrame) {\r
-            this.setDelta( Math.round(parseInt(s.width,  10)/2),\r
-                           Math.round(parseInt(s.height, 10)/2) );\r
-        }\r
-\r
-        this.setDragElPos(iPageX, iPageY);\r
-\r
-        Ext.fly(dragEl).show();\r
-    },\r
-\r
-    \r
-    _resizeProxy: function() {\r
-        if (this.resizeFrame) {\r
-            var el = this.getEl();\r
-            Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight);\r
-        }\r
-    },\r
-\r
-    // overrides Ext.dd.DragDrop\r
-    b4MouseDown: function(e) {\r
-        var x = e.getPageX();\r
-        var y = e.getPageY();\r
-        this.autoOffset(x, y);\r
-        this.setDragElPos(x, y);\r
-    },\r
-\r
-    // overrides Ext.dd.DragDrop\r
-    b4StartDrag: function(x, y) {\r
-        // show the drag frame\r
-        this.showFrame(x, y);\r
-    },\r
-\r
-    // overrides Ext.dd.DragDrop\r
-    b4EndDrag: function(e) {\r
-        Ext.fly(this.getDragEl()).hide();\r
-    },\r
-\r
-    // overrides Ext.dd.DragDrop\r
-    // By default we try to move the element to the last location of the frame.\r
-    // This is so that the default behavior mirrors that of Ext.dd.DD.\r
-    endDrag: function(e) {\r
-\r
-        var lel = this.getEl();\r
-        var del = this.getDragEl();\r
-\r
-        // Show the drag frame briefly so we can get its position\r
-        del.style.visibility = "";\r
-\r
-        this.beforeMove();\r
-        // Hide the linked element before the move to get around a Safari\r
-        // rendering bug.\r
-        lel.style.visibility = "hidden";\r
-        Ext.dd.DDM.moveToEl(lel, del);\r
-        del.style.visibility = "hidden";\r
-        lel.style.visibility = "";\r
-\r
-        this.afterDrag();\r
-    },\r
-\r
-    beforeMove : function(){\r
-\r
-    },\r
-\r
-    afterDrag : function(){\r
-\r
-    },\r
-\r
-    toString: function() {\r
-        return ("DDProxy " + this.id);\r
-    }\r
-\r
-});\r
-\r
-Ext.dd.DDTarget = function(id, sGroup, config) {\r
-    if (id) {\r
-        this.initTarget(id, sGroup, config);\r
-    }\r
-};\r
-\r
-// Ext.dd.DDTarget.prototype = new Ext.dd.DragDrop();\r
-Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, {\r
-    toString: function() {\r
-        return ("DDTarget " + this.id);\r
-    }\r
-});\r
-\r
-Ext.dd.DragTracker = function(config){\r
-    Ext.apply(this, config);\r
-    this.addEvents(\r
-        'mousedown',\r
-        'mouseup',\r
-        'mousemove',\r
-        'dragstart',\r
-        'dragend',\r
-        'drag'\r
-    );\r
-\r
-    this.dragRegion = new Ext.lib.Region(0,0,0,0);\r
-\r
-    if(this.el){\r
-        this.initEl(this.el);\r
-    }\r
-}\r
-\r
-Ext.extend(Ext.dd.DragTracker, Ext.util.Observable,  {\r
-    active: false,\r
-    tolerance: 5,\r
-    autoStart: false,\r
-\r
-    initEl: function(el){\r
-        this.el = Ext.get(el);\r
-        el.on('mousedown', this.onMouseDown, this,\r
-                this.delegate ? {delegate: this.delegate} : undefined);\r
-    },\r
-\r
-    destroy : function(){\r
-        this.el.un('mousedown', this.onMouseDown, this);\r
-    },\r
-\r
-    onMouseDown: function(e, target){\r
-        if(this.fireEvent('mousedown', this, e) !== false && this.onBeforeStart(e) !== false){\r
-            this.startXY = this.lastXY = e.getXY();\r
-            this.dragTarget = this.delegate ? target : this.el.dom;\r
-            e.preventDefault();\r
-            var doc = Ext.getDoc();\r
-            doc.on('mouseup', this.onMouseUp, this);\r
-            doc.on('mousemove', this.onMouseMove, this);\r
-            doc.on('selectstart', this.stopSelect, this);\r
-            if(this.autoStart){\r
-                this.timer = this.triggerStart.defer(this.autoStart === true ? 1000 : this.autoStart, this);\r
-            }\r
-        }\r
-    },\r
-\r
-    onMouseMove: function(e, target){\r
-        e.preventDefault();\r
-        var xy = e.getXY(), s = this.startXY;\r
-        this.lastXY = xy;\r
-        if(!this.active){\r
-            if(Math.abs(s[0]-xy[0]) > this.tolerance || Math.abs(s[1]-xy[1]) > this.tolerance){\r
-                this.triggerStart();\r
-            }else{\r
-                return;\r
-            }\r
-        }\r
-        this.fireEvent('mousemove', this, e);\r
-        this.onDrag(e);\r
-        this.fireEvent('drag', this, e);\r
-    },\r
-\r
-    onMouseUp: function(e){\r
-        var doc = Ext.getDoc();\r
-        doc.un('mousemove', this.onMouseMove, this);\r
-        doc.un('mouseup', this.onMouseUp, this);\r
-        doc.un('selectstart', this.stopSelect, this);\r
-        e.preventDefault();\r
-        this.clearStart();\r
-        this.active = false;\r
-        delete this.elRegion;\r
-        this.fireEvent('mouseup', this, e);\r
-        this.onEnd(e);\r
-        this.fireEvent('dragend', this, e);\r
-    },\r
-\r
-    triggerStart: function(isTimer){\r
-        this.clearStart();\r
-        this.active = true;\r
-        this.onStart(this.startXY);\r
-        this.fireEvent('dragstart', this, this.startXY);\r
-    },\r
-\r
-    clearStart : function(){\r
-        if(this.timer){\r
-            clearTimeout(this.timer);\r
-            delete this.timer;\r
-        }\r
-    },\r
-\r
-    stopSelect : function(e){\r
-        e.stopEvent();\r
-        return false;\r
-    },\r
-\r
-    onBeforeStart : function(e){\r
-\r
-    },\r
-\r
-    onStart : function(xy){\r
-\r
-    },\r
-\r
-    onDrag : function(e){\r
-\r
-    },\r
-\r
-    onEnd : function(e){\r
-\r
-    },\r
-\r
-    getDragTarget : function(){\r
-        return this.dragTarget;\r
-    },\r
-\r
-    getDragCt : function(){\r
-        return this.el;\r
-    },\r
-\r
-    getXY : function(constrain){\r
-        return constrain ?\r
-               this.constrainModes[constrain].call(this, this.lastXY) : this.lastXY;\r
-    },\r
-\r
-    getOffset : function(constrain){\r
-        var xy = this.getXY(constrain);\r
-        var s = this.startXY;\r
-        return [s[0]-xy[0], s[1]-xy[1]];\r
-    },\r
-\r
-    constrainModes: {\r
-        'point' : function(xy){\r
-\r
-            if(!this.elRegion){\r
-                this.elRegion = this.getDragCt().getRegion();\r
-            }\r
-\r
-            var dr = this.dragRegion;\r
-\r
-            dr.left = xy[0];\r
-            dr.top = xy[1];\r
-            dr.right = xy[0];\r
-            dr.bottom = xy[1];\r
-\r
-            dr.constrainTo(this.elRegion);\r
-\r
-            return [dr.left, dr.top];\r
-        }\r
-    }\r
-});\r
-\r
-Ext.dd.ScrollManager = function(){\r
-    var ddm = Ext.dd.DragDropMgr;\r
-    var els = {};\r
-    var dragEl = null;\r
-    var proc = {};\r
-    \r
-    var onStop = function(e){\r
-        dragEl = null;\r
-        clearProc();\r
-    };\r
-    \r
-    var triggerRefresh = function(){\r
-        if(ddm.dragCurrent){\r
-             ddm.refreshCache(ddm.dragCurrent.groups);\r
-        }\r
-    };\r
-    \r
-    var doScroll = function(){\r
-        if(ddm.dragCurrent){\r
-            var dds = Ext.dd.ScrollManager;\r
-            var inc = proc.el.ddScrollConfig ?\r
-                      proc.el.ddScrollConfig.increment : dds.increment;\r
-            if(!dds.animate){\r
-                if(proc.el.scroll(proc.dir, inc)){\r
-                    triggerRefresh();\r
-                }\r
-            }else{\r
-                proc.el.scroll(proc.dir, inc, true, dds.animDuration, triggerRefresh);\r
-            }\r
-        }\r
-    };\r
-    \r
-    var clearProc = function(){\r
-        if(proc.id){\r
-            clearInterval(proc.id);\r
-        }\r
-        proc.id = 0;\r
-        proc.el = null;\r
-        proc.dir = "";\r
-    };\r
-    \r
-    var startProc = function(el, dir){\r
-        clearProc();\r
-        proc.el = el;\r
-        proc.dir = dir;\r
-        var freq = (el.ddScrollConfig && el.ddScrollConfig.frequency) ? \r
-                el.ddScrollConfig.frequency : Ext.dd.ScrollManager.frequency;\r
-        proc.id = setInterval(doScroll, freq);\r
-    };\r
-    \r
-    var onFire = function(e, isDrop){\r
-        if(isDrop || !ddm.dragCurrent){ return; }\r
-        var dds = Ext.dd.ScrollManager;\r
-        if(!dragEl || dragEl != ddm.dragCurrent){\r
-            dragEl = ddm.dragCurrent;\r
-            // refresh regions on drag start\r
-            dds.refreshCache();\r
-        }\r
-        \r
-        var xy = Ext.lib.Event.getXY(e);\r
-        var pt = new Ext.lib.Point(xy[0], xy[1]);\r
-        for(var id in els){\r
-            var el = els[id], r = el._region;\r
-            var c = el.ddScrollConfig ? el.ddScrollConfig : dds;\r
-            if(r && r.contains(pt) && el.isScrollable()){\r
-                if(r.bottom - pt.y <= c.vthresh){\r
-                    if(proc.el != el){\r
-                        startProc(el, "down");\r
-                    }\r
-                    return;\r
-                }else if(r.right - pt.x <= c.hthresh){\r
-                    if(proc.el != el){\r
-                        startProc(el, "left");\r
-                    }\r
-                    return;\r
-                }else if(pt.y - r.top <= c.vthresh){\r
-                    if(proc.el != el){\r
-                        startProc(el, "up");\r
-                    }\r
-                    return;\r
-                }else if(pt.x - r.left <= c.hthresh){\r
-                    if(proc.el != el){\r
-                        startProc(el, "right");\r
-                    }\r
-                    return;\r
-                }\r
-            }\r
-        }\r
-        clearProc();\r
-    };\r
-    \r
-    ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm);\r
-    ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm);\r
-    \r
-    return {\r
-        \r
-        register : function(el){\r
-            if(Ext.isArray(el)){\r
-                for(var i = 0, len = el.length; i < len; i++) {\r
-                       this.register(el[i]);\r
-                }\r
-            }else{\r
-                el = Ext.get(el);\r
-                els[el.id] = el;\r
-            }\r
-        },\r
-        \r
-        \r
-        unregister : function(el){\r
-            if(Ext.isArray(el)){\r
-                for(var i = 0, len = el.length; i < len; i++) {\r
-                       this.unregister(el[i]);\r
-                }\r
-            }else{\r
-                el = Ext.get(el);\r
-                delete els[el.id];\r
-            }\r
-        },\r
-        \r
-        \r
-        vthresh : 25,\r
-        \r
-        hthresh : 25,\r
-\r
-        \r
-        increment : 100,\r
-        \r
-        \r
-        frequency : 500,\r
-        \r
-        \r
-        animate: true,\r
-        \r
-        \r
-        animDuration: .4,\r
-        \r
-        \r
-        refreshCache : function(){\r
-            for(var id in els){\r
-                if(typeof els[id] == 'object'){ // for people extending the object prototype\r
-                    els[id]._region = els[id].getRegion();\r
-                }\r
-            }\r
-        }\r
-    };\r
-}();\r
-\r
-Ext.dd.Registry = function(){\r
-    var elements = {}; \r
-    var handles = {}; \r
-    var autoIdSeed = 0;\r
-\r
-    var getId = function(el, autogen){\r
-        if(typeof el == "string"){\r
-            return el;\r
-        }\r
-        var id = el.id;\r
-        if(!id && autogen !== false){\r
-            id = "extdd-" + (++autoIdSeed);\r
-            el.id = id;\r
-        }\r
-        return id;\r
-    };\r
-    \r
-    return {\r
-    \r
-        register : function(el, data){\r
-            data = data || {};\r
-            if(typeof el == "string"){\r
-                el = document.getElementById(el);\r
-            }\r
-            data.ddel = el;\r
-            elements[getId(el)] = data;\r
-            if(data.isHandle !== false){\r
-                handles[data.ddel.id] = data;\r
-            }\r
-            if(data.handles){\r
-                var hs = data.handles;\r
-                for(var i = 0, len = hs.length; i < len; i++){\r
-                       handles[getId(hs[i])] = data;\r
-                }\r
-            }\r
-        },\r
-\r
-    \r
-        unregister : function(el){\r
-            var id = getId(el, false);\r
-            var data = elements[id];\r
-            if(data){\r
-                delete elements[id];\r
-                if(data.handles){\r
-                    var hs = data.handles;\r
-                    for(var i = 0, len = hs.length; i < len; i++){\r
-                       delete handles[getId(hs[i], false)];\r
-                    }\r
-                }\r
-            }\r
-        },\r
-\r
-    \r
-        getHandle : function(id){\r
-            if(typeof id != "string"){ // must be element?\r
-                id = id.id;\r
-            }\r
-            return handles[id];\r
-        },\r
-\r
-    \r
-        getHandleFromEvent : function(e){\r
-            var t = Ext.lib.Event.getTarget(e);\r
-            return t ? handles[t.id] : null;\r
-        },\r
-\r
-    \r
-        getTarget : function(id){\r
-            if(typeof id != "string"){ // must be element?\r
-                id = id.id;\r
-            }\r
-            return elements[id];\r
-        },\r
-\r
-    \r
-        getTargetFromEvent : function(e){\r
-            var t = Ext.lib.Event.getTarget(e);\r
-            return t ? elements[t.id] || handles[t.id] : null;\r
-        }\r
-    };\r
-}();\r
-\r
-Ext.dd.StatusProxy = function(config){\r
-    Ext.apply(this, config);\r
-    this.id = this.id || Ext.id();\r
-    this.el = new Ext.Layer({\r
-        dh: {\r
-            id: this.id, tag: "div", cls: "x-dd-drag-proxy "+this.dropNotAllowed, children: [\r
-                {tag: "div", cls: "x-dd-drop-icon"},\r
-                {tag: "div", cls: "x-dd-drag-ghost"}\r
-            ]\r
-        }, \r
-        shadow: !config || config.shadow !== false\r
-    });\r
-    this.ghost = Ext.get(this.el.dom.childNodes[1]);\r
-    this.dropStatus = this.dropNotAllowed;\r
-};\r
-\r
-Ext.dd.StatusProxy.prototype = {\r
-    \r
-    dropAllowed : "x-dd-drop-ok",\r
-    \r
-    dropNotAllowed : "x-dd-drop-nodrop",\r
-\r
-    \r
-    setStatus : function(cssClass){\r
-        cssClass = cssClass || this.dropNotAllowed;\r
-        if(this.dropStatus != cssClass){\r
-            this.el.replaceClass(this.dropStatus, cssClass);\r
-            this.dropStatus = cssClass;\r
-        }\r
-    },\r
-\r
-    \r
-    reset : function(clearGhost){\r
-        this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed;\r
-        this.dropStatus = this.dropNotAllowed;\r
-        if(clearGhost){\r
-            this.ghost.update("");\r
-        }\r
-    },\r
-\r
-    \r
-    update : function(html){\r
-        if(typeof html == "string"){\r
-            this.ghost.update(html);\r
-        }else{\r
-            this.ghost.update("");\r
-            html.style.margin = "0";\r
-            this.ghost.dom.appendChild(html);\r
-        }\r
-        var el = this.ghost.dom.firstChild; \r
-        if(el){\r
-            Ext.fly(el).setStyle(Ext.isIE ? 'styleFloat' : 'cssFloat', 'none');\r
-        }\r
-    },\r
-\r
-    \r
-    getEl : function(){\r
-        return this.el;\r
-    },\r
-\r
-    \r
-    getGhost : function(){\r
-        return this.ghost;\r
-    },\r
-\r
-    \r
-    hide : function(clear){\r
-        this.el.hide();\r
-        if(clear){\r
-            this.reset(true);\r
-        }\r
-    },\r
-\r
-    \r
-    stop : function(){\r
-        if(this.anim && this.anim.isAnimated && this.anim.isAnimated()){\r
-            this.anim.stop();\r
-        }\r
-    },\r
-\r
-    \r
-    show : function(){\r
-        this.el.show();\r
-    },\r
-\r
-    \r
-    sync : function(){\r
-        this.el.sync();\r
-    },\r
-\r
-    \r
-    repair : function(xy, callback, scope){\r
-        this.callback = callback;\r
-        this.scope = scope;\r
-        if(xy && this.animRepair !== false){\r
-            this.el.addClass("x-dd-drag-repair");\r
-            this.el.hideUnders(true);\r
-            this.anim = this.el.shift({\r
-                duration: this.repairDuration || .5,\r
-                easing: 'easeOut',\r
-                xy: xy,\r
-                stopFx: true,\r
-                callback: this.afterRepair,\r
-                scope: this\r
-            });\r
-        }else{\r
-            this.afterRepair();\r
-        }\r
-    },\r
-\r
-    // private\r
-    afterRepair : function(){\r
-        this.hide(true);\r
-        if(typeof this.callback == "function"){\r
-            this.callback.call(this.scope || this);\r
-        }\r
-        this.callback = null;\r
-        this.scope = null;\r
-    }\r
-};\r
-\r
-Ext.dd.DragSource = function(el, config){\r
-    this.el = Ext.get(el);\r
-    if(!this.dragData){\r
-        this.dragData = {};\r
-    }\r
-    \r
-    Ext.apply(this, config);\r
-    \r
-    if(!this.proxy){\r
-        this.proxy = new Ext.dd.StatusProxy();\r
-    }\r
-    Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, \r
-          {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true});\r
-    \r
-    this.dragging = false;\r
-};\r
-\r
-Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, {\r
-    \r
-    \r
-    dropAllowed : "x-dd-drop-ok",\r
-    \r
-    dropNotAllowed : "x-dd-drop-nodrop",\r
-\r
-    \r
-    getDragData : function(e){\r
-        return this.dragData;\r
-    },\r
-\r
-    // private\r
-    onDragEnter : function(e, id){\r
-        var target = Ext.dd.DragDropMgr.getDDById(id);\r
-        this.cachedTarget = target;\r
-        if(this.beforeDragEnter(target, e, id) !== false){\r
-            if(target.isNotifyTarget){\r
-                var status = target.notifyEnter(this, e, this.dragData);\r
-                this.proxy.setStatus(status);\r
-            }else{\r
-                this.proxy.setStatus(this.dropAllowed);\r
-            }\r
-            \r
-            if(this.afterDragEnter){\r
-                \r
-                this.afterDragEnter(target, e, id);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    beforeDragEnter : function(target, e, id){\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    alignElWithMouse: function() {\r
-        Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments);\r
-        this.proxy.sync();\r
-    },\r
-\r
-    // private\r
-    onDragOver : function(e, id){\r
-        var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);\r
-        if(this.beforeDragOver(target, e, id) !== false){\r
-            if(target.isNotifyTarget){\r
-                var status = target.notifyOver(this, e, this.dragData);\r
-                this.proxy.setStatus(status);\r
-            }\r
-\r
-            if(this.afterDragOver){\r
-                \r
-                this.afterDragOver(target, e, id);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    beforeDragOver : function(target, e, id){\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    onDragOut : function(e, id){\r
-        var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);\r
-        if(this.beforeDragOut(target, e, id) !== false){\r
-            if(target.isNotifyTarget){\r
-                target.notifyOut(this, e, this.dragData);\r
-            }\r
-            this.proxy.reset();\r
-            if(this.afterDragOut){\r
-                \r
-                this.afterDragOut(target, e, id);\r
-            }\r
-        }\r
-        this.cachedTarget = null;\r
-    },\r
-\r
-    \r
-    beforeDragOut : function(target, e, id){\r
-        return true;\r
-    },\r
-    \r
-    // private\r
-    onDragDrop : function(e, id){\r
-        var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);\r
-        if(this.beforeDragDrop(target, e, id) !== false){\r
-            if(target.isNotifyTarget){\r
-                if(target.notifyDrop(this, e, this.dragData)){ // valid drop?\r
-                    this.onValidDrop(target, e, id);\r
-                }else{\r
-                    this.onInvalidDrop(target, e, id);\r
-                }\r
-            }else{\r
-                this.onValidDrop(target, e, id);\r
-            }\r
-            \r
-            if(this.afterDragDrop){\r
-                \r
-                this.afterDragDrop(target, e, id);\r
-            }\r
-        }\r
-        delete this.cachedTarget;\r
-    },\r
-\r
-    \r
-    beforeDragDrop : function(target, e, id){\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    onValidDrop : function(target, e, id){\r
-        this.hideProxy();\r
-        if(this.afterValidDrop){\r
-            \r
-            this.afterValidDrop(target, e, id);\r
-        }\r
-    },\r
-\r
-    // private\r
-    getRepairXY : function(e, data){\r
-        return this.el.getXY();  \r
-    },\r
-\r
-    // private\r
-    onInvalidDrop : function(target, e, id){\r
-        this.beforeInvalidDrop(target, e, id);\r
-        if(this.cachedTarget){\r
-            if(this.cachedTarget.isNotifyTarget){\r
-                this.cachedTarget.notifyOut(this, e, this.dragData);\r
-            }\r
-            this.cacheTarget = null;\r
-        }\r
-        this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this);\r
-\r
-        if(this.afterInvalidDrop){\r
-            \r
-            this.afterInvalidDrop(e, id);\r
-        }\r
-    },\r
-\r
-    // private\r
-    afterRepair : function(){\r
-        if(Ext.enableFx){\r
-            this.el.highlight(this.hlColor || "c3daf9");\r
-        }\r
-        this.dragging = false;\r
-    },\r
-\r
-    \r
-    beforeInvalidDrop : function(target, e, id){\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    handleMouseDown : function(e){\r
-        if(this.dragging) {\r
-            return;\r
-        }\r
-        var data = this.getDragData(e);\r
-        if(data && this.onBeforeDrag(data, e) !== false){\r
-            this.dragData = data;\r
-            this.proxy.stop();\r
-            Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments);\r
-        } \r
-    },\r
-\r
-    \r
-    onBeforeDrag : function(data, e){\r
-        return true;\r
-    },\r
-\r
-    \r
-    onStartDrag : Ext.emptyFn,\r
-\r
-    // private override\r
-    startDrag : function(x, y){\r
-        this.proxy.reset();\r
-        this.dragging = true;\r
-        this.proxy.update("");\r
-        this.onInitDrag(x, y);\r
-        this.proxy.show();\r
-    },\r
-\r
-    // private\r
-    onInitDrag : function(x, y){\r
-        var clone = this.el.dom.cloneNode(true);\r
-        clone.id = Ext.id(); // prevent duplicate ids\r
-        this.proxy.update(clone);\r
-        this.onStartDrag(x, y);\r
-        return true;\r
-    },\r
-\r
-    \r
-    getProxy : function(){\r
-        return this.proxy;  \r
-    },\r
-\r
-    \r
-    hideProxy : function(){\r
-        this.proxy.hide();  \r
-        this.proxy.reset(true);\r
-        this.dragging = false;\r
-    },\r
-\r
-    // private\r
-    triggerCacheRefresh : function(){\r
-        Ext.dd.DDM.refreshCache(this.groups);\r
-    },\r
-\r
-    // private - override to prevent hiding\r
-    b4EndDrag: function(e) {\r
-    },\r
-\r
-    // private - override to prevent moving\r
-    endDrag : function(e){\r
-        this.onEndDrag(this.dragData, e);\r
-    },\r
-\r
-    // private\r
-    onEndDrag : function(data, e){\r
-    },\r
-    \r
-    // private - pin to cursor\r
-    autoOffset : function(x, y) {\r
-        this.setDelta(-12, -20);\r
-    }    \r
-});\r
-\r
-Ext.dd.DropTarget = function(el, config){\r
-    this.el = Ext.get(el);\r
-    \r
-    Ext.apply(this, config);\r
-    \r
-    if(this.containerScroll){\r
-        Ext.dd.ScrollManager.register(this.el);\r
-    }\r
-    \r
-    Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, \r
-          {isTarget: true});\r
-\r
-};\r
-\r
-Ext.extend(Ext.dd.DropTarget, Ext.dd.DDTarget, {\r
-    \r
-    \r
-    \r
-    dropAllowed : "x-dd-drop-ok",\r
-    \r
-    dropNotAllowed : "x-dd-drop-nodrop",\r
-\r
-    // private\r
-    isTarget : true,\r
-\r
-    // private\r
-    isNotifyTarget : true,\r
-\r
-    \r
-    notifyEnter : function(dd, e, data){\r
-        if(this.overClass){\r
-            this.el.addClass(this.overClass);\r
-        }\r
-        return this.dropAllowed;\r
-    },\r
-\r
-    \r
-    notifyOver : function(dd, e, data){\r
-        return this.dropAllowed;\r
-    },\r
-\r
-    \r
-    notifyOut : function(dd, e, data){\r
-        if(this.overClass){\r
-            this.el.removeClass(this.overClass);\r
-        }\r
-    },\r
-\r
-    \r
-    notifyDrop : function(dd, e, data){\r
-        return false;\r
-    }\r
-});\r
-\r
-Ext.dd.DragZone = function(el, config){\r
-    Ext.dd.DragZone.superclass.constructor.call(this, el, config);\r
-    if(this.containerScroll){\r
-        Ext.dd.ScrollManager.register(this.el);\r
-    }\r
-};\r
-\r
-Ext.extend(Ext.dd.DragZone, Ext.dd.DragSource, {\r
-    \r
-    \r
-\r
-    \r
-    getDragData : function(e){\r
-        return Ext.dd.Registry.getHandleFromEvent(e);\r
-    },\r
-    \r
-    \r
-    onInitDrag : function(x, y){\r
-        this.proxy.update(this.dragData.ddel.cloneNode(true));\r
-        this.onStartDrag(x, y);\r
-        return true;\r
-    },\r
-    \r
-    \r
-    afterRepair : function(){\r
-        if(Ext.enableFx){\r
-            Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9");\r
-        }\r
-        this.dragging = false;\r
-    },\r
-\r
-    \r
-    getRepairXY : function(e){\r
-        return Ext.Element.fly(this.dragData.ddel).getXY();  \r
-    }\r
-});\r
-\r
-Ext.dd.DropZone = function(el, config){\r
-    Ext.dd.DropZone.superclass.constructor.call(this, el, config);\r
-};\r
-\r
-Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, {\r
-    \r
-    getTargetFromEvent : function(e){\r
-        return Ext.dd.Registry.getTargetFromEvent(e);\r
-    },\r
-\r
-    \r
-    onNodeEnter : function(n, dd, e, data){\r
-        \r
-    },\r
-\r
-    \r
-    onNodeOver : function(n, dd, e, data){\r
-        return this.dropAllowed;\r
-    },\r
-\r
-    \r
-    onNodeOut : function(n, dd, e, data){\r
-        \r
-    },\r
-\r
-    \r
-    onNodeDrop : function(n, dd, e, data){\r
-        return false;\r
-    },\r
-\r
-    \r
-    onContainerOver : function(dd, e, data){\r
-        return this.dropNotAllowed;\r
-    },\r
-\r
-    \r
-    onContainerDrop : function(dd, e, data){\r
-        return false;\r
-    },\r
-\r
-    \r
-    notifyEnter : function(dd, e, data){\r
-        return this.dropNotAllowed;\r
-    },\r
-\r
-    \r
-    notifyOver : function(dd, e, data){\r
-        var n = this.getTargetFromEvent(e);\r
-        if(!n){ // not over valid drop target\r
-            if(this.lastOverNode){\r
-                this.onNodeOut(this.lastOverNode, dd, e, data);\r
-                this.lastOverNode = null;\r
-            }\r
-            return this.onContainerOver(dd, e, data);\r
-        }\r
-        if(this.lastOverNode != n){\r
-            if(this.lastOverNode){\r
-                this.onNodeOut(this.lastOverNode, dd, e, data);\r
-            }\r
-            this.onNodeEnter(n, dd, e, data);\r
-            this.lastOverNode = n;\r
-        }\r
-        return this.onNodeOver(n, dd, e, data);\r
-    },\r
-\r
-    \r
-    notifyOut : function(dd, e, data){\r
-        if(this.lastOverNode){\r
-            this.onNodeOut(this.lastOverNode, dd, e, data);\r
-            this.lastOverNode = null;\r
-        }\r
-    },\r
-\r
-    \r
-    notifyDrop : function(dd, e, data){\r
-        if(this.lastOverNode){\r
-            this.onNodeOut(this.lastOverNode, dd, e, data);\r
-            this.lastOverNode = null;\r
-        }\r
-        var n = this.getTargetFromEvent(e);\r
-        return n ?\r
-            this.onNodeDrop(n, dd, e, data) :\r
-            this.onContainerDrop(dd, e, data);\r
-    },\r
-\r
-    // private\r
-    triggerCacheRefresh : function(){\r
-        Ext.dd.DDM.refreshCache(this.groups);\r
-    }  \r
-});\r
-\r
-\r
-Ext.data.SortTypes = {\r
-    \r
-    none : function(s){\r
-        return s;\r
-    },\r
-    \r
-    \r
-    stripTagsRE : /<\/?[^>]+>/gi,\r
-    \r
-    \r
-    asText : function(s){\r
-        return String(s).replace(this.stripTagsRE, "");\r
-    },\r
-    \r
-    \r
-    asUCText : function(s){\r
-        return String(s).toUpperCase().replace(this.stripTagsRE, "");\r
-    },\r
-    \r
-    \r
-    asUCString : function(s) {\r
-       return String(s).toUpperCase();\r
-    },\r
-    \r
-    \r
-    asDate : function(s) {\r
-        if(!s){\r
-            return 0;\r
-        }\r
-        if(Ext.isDate(s)){\r
-            return s.getTime();\r
-        }\r
-       return Date.parse(String(s));\r
-    },\r
-    \r
-    \r
-    asFloat : function(s) {\r
-       var val = parseFloat(String(s).replace(/,/g, ""));\r
-        if(isNaN(val)) val = 0;\r
-       return val;\r
-    },\r
-    \r
-    \r
-    asInt : function(s) {\r
-        var val = parseInt(String(s).replace(/,/g, ""));\r
-        if(isNaN(val)) val = 0;\r
-       return val;\r
-    }\r
-};\r
-\r
-Ext.data.Record = function(data, id){\r
-    this.id = (id || id === 0) ? id : ++Ext.data.Record.AUTO_ID;\r
-    this.data = data;\r
-};\r
-\r
-\r
-Ext.data.Record.create = function(o){\r
-    var f = Ext.extend(Ext.data.Record, {});\r
-    var p = f.prototype;\r
-    p.fields = new Ext.util.MixedCollection(false, function(field){\r
-        return field.name;\r
-    });\r
-    for(var i = 0, len = o.length; i < len; i++){\r
-        p.fields.add(new Ext.data.Field(o[i]));\r
-    }\r
-    f.getField = function(name){\r
-        return p.fields.get(name);\r
-    };\r
-    return f;\r
-};\r
-\r
-Ext.data.Record.AUTO_ID = 1000;\r
-Ext.data.Record.EDIT = 'edit';\r
-Ext.data.Record.REJECT = 'reject';\r
-Ext.data.Record.COMMIT = 'commit';\r
-\r
-Ext.data.Record.prototype = {\r
-    \r
-    \r
-    \r
-    \r
-    dirty : false,\r
-    editing : false,\r
-    error: null,\r
-    \r
-    modified: null,\r
-\r
-    // private\r
-    join : function(store){\r
-        this.store = store;\r
-    },\r
-\r
-    \r
-    set : function(name, value){\r
-        if(String(this.data[name]) == String(value)){\r
-            return;\r
-        }\r
-        this.dirty = true;\r
-        if(!this.modified){\r
-            this.modified = {};\r
-        }\r
-        if(typeof this.modified[name] == 'undefined'){\r
-            this.modified[name] = this.data[name];\r
-        }\r
-        this.data[name] = value;\r
-        if(!this.editing && this.store){\r
-            this.store.afterEdit(this);\r
-        }\r
-    },\r
-\r
-    \r
-    get : function(name){\r
-        return this.data[name];\r
-    },\r
-\r
-    \r
-    beginEdit : function(){\r
-        this.editing = true;\r
-        this.modified = {};\r
-    },\r
-\r
-    \r
-    cancelEdit : function(){\r
-        this.editing = false;\r
-        delete this.modified;\r
-    },\r
-\r
-    \r
-    endEdit : function(){\r
-        this.editing = false;\r
-        if(this.dirty && this.store){\r
-            this.store.afterEdit(this);\r
-        }\r
-    },\r
-\r
-    \r
-    reject : function(silent){\r
-        var m = this.modified;\r
-        for(var n in m){\r
-            if(typeof m[n] != "function"){\r
-                this.data[n] = m[n];\r
-            }\r
-        }\r
-        this.dirty = false;\r
-        delete this.modified;\r
-        this.editing = false;\r
-        if(this.store && silent !== true){\r
-            this.store.afterReject(this);\r
-        }\r
-    },\r
-\r
-    \r
-    commit : function(silent){\r
-        this.dirty = false;\r
-        delete this.modified;\r
-        this.editing = false;\r
-        if(this.store && silent !== true){\r
-            this.store.afterCommit(this);\r
-        }\r
-    },\r
-\r
-    \r
-    getChanges : function(){\r
-        var m = this.modified, cs = {};\r
-        for(var n in m){\r
-            if(m.hasOwnProperty(n)){\r
-                cs[n] = this.data[n];\r
-            }\r
-        }\r
-        return cs;\r
-    },\r
-\r
-    // private\r
-    hasError : function(){\r
-        return this.error != null;\r
-    },\r
-\r
-    // private\r
-    clearError : function(){\r
-        this.error = null;\r
-    },\r
-\r
-    \r
-    copy : function(newId) {\r
-        return new this.constructor(Ext.apply({}, this.data), newId || this.id);\r
-    },\r
-\r
-    \r
-    isModified : function(fieldName){\r
-        return !!(this.modified && this.modified.hasOwnProperty(fieldName));\r
-    }\r
-};\r
-\r
-Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), {\r
-    \r
-\r
-    \r
-    register : function(){\r
-        for(var i = 0, s; s = arguments[i]; i++){\r
-            this.add(s);\r
-        }\r
-    },\r
-\r
-    \r
-    unregister : function(){\r
-        for(var i = 0, s; s = arguments[i]; i++){\r
-            this.remove(this.lookup(s));\r
-        }\r
-    },\r
-\r
-    \r
-    lookup : function(id){\r
-        return typeof id == "object" ? id : this.get(id);\r
-    },\r
-\r
-    // getKey implementation for MixedCollection\r
-    getKey : function(o){\r
-         return o.storeId || o.id;\r
-    }\r
-});\r
-\r
-Ext.data.Store = function(config){\r
-    this.data = new Ext.util.MixedCollection(false);\r
-    this.data.getKey = function(o){\r
-        return o.id;\r
-    };\r
-    \r
-    this.baseParams = {};\r
-    \r
-    this.paramNames = {\r
-        "start" : "start",\r
-        "limit" : "limit",\r
-        "sort" : "sort",\r
-        "dir" : "dir"\r
-    };\r
-\r
-    if(config && config.data){\r
-        this.inlineData = config.data;\r
-        delete config.data;\r
-    }\r
-\r
-    Ext.apply(this, config);\r
-\r
-    if(this.url && !this.proxy){\r
-        this.proxy = new Ext.data.HttpProxy({url: this.url});\r
-    }\r
-\r
-    if(this.reader){ // reader passed\r
-        if(!this.recordType){\r
-            this.recordType = this.reader.recordType;\r
-        }\r
-        if(this.reader.onMetaChange){\r
-            this.reader.onMetaChange = this.onMetaChange.createDelegate(this);\r
-        }\r
-    }\r
-\r
-    \r
-    if(this.recordType){\r
-        \r
-        this.fields = this.recordType.prototype.fields;\r
-    }\r
-    this.modified = [];\r
-\r
-    this.addEvents(\r
-        \r
-        'datachanged',\r
-        \r
-        'metachange',\r
-        \r
-        'add',\r
-        \r
-        'remove',\r
-        \r
-        'update',\r
-        \r
-        'clear',\r
-        \r
-        'beforeload',\r
-        \r
-        'load',\r
-        \r
-        'loadexception'\r
-    );\r
-\r
-    if(this.proxy){\r
-        this.relayEvents(this.proxy,  ["loadexception"]);\r
-    }\r
-\r
-    this.sortToggle = {};\r
-    if(this.sortInfo){\r
-        this.setDefaultSort(this.sortInfo.field, this.sortInfo.direction);\r
-    }\r
-\r
-    Ext.data.Store.superclass.constructor.call(this);\r
-\r
-    if(this.storeId || this.id){\r
-        Ext.StoreMgr.register(this);\r
-    }\r
-    if(this.inlineData){\r
-        this.loadData(this.inlineData);\r
-        delete this.inlineData;\r
-    }else if(this.autoLoad){\r
-        this.load.defer(10, this, [\r
-            typeof this.autoLoad == 'object' ?\r
-                this.autoLoad : undefined]);\r
-    }\r
-};\r
-Ext.extend(Ext.data.Store, Ext.util.Observable, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    remoteSort : false,\r
-\r
-    \r
-    pruneModifiedRecords : false,\r
-\r
-    \r
-   lastOptions : null,\r
-\r
-    destroy : function(){\r
-        if(this.storeId || this.id){\r
-            Ext.StoreMgr.unregister(this);\r
-        }\r
-        this.data = null;\r
-        this.purgeListeners();\r
-    },\r
-\r
-    \r
-    add : function(records){\r
-        records = [].concat(records);\r
-        if(records.length < 1){\r
-            return;\r
-        }\r
-        for(var i = 0, len = records.length; i < len; i++){\r
-            records[i].join(this);\r
-        }\r
-        var index = this.data.length;\r
-        this.data.addAll(records);\r
-        if(this.snapshot){\r
-            this.snapshot.addAll(records);\r
-        }\r
-        this.fireEvent("add", this, records, index);\r
-    },\r
-\r
-    \r
-    addSorted : function(record){\r
-        var index = this.findInsertIndex(record);\r
-        this.insert(index, record);\r
-    },\r
-\r
-    \r
-    remove : function(record){\r
-        var index = this.data.indexOf(record);\r
-        this.data.removeAt(index);\r
-        if(this.pruneModifiedRecords){\r
-            this.modified.remove(record);\r
-        }\r
-        if(this.snapshot){\r
-            this.snapshot.remove(record);\r
-        }\r
-        this.fireEvent("remove", this, record, index);\r
-    },\r
-    \r
-    \r
-    removeAt : function(index){\r
-        this.remove(this.getAt(index));    \r
-    },\r
-\r
-    \r
-    removeAll : function(){\r
-        this.data.clear();\r
-        if(this.snapshot){\r
-            this.snapshot.clear();\r
-        }\r
-        if(this.pruneModifiedRecords){\r
-            this.modified = [];\r
-        }\r
-        this.fireEvent("clear", this);\r
-    },\r
-\r
-    \r
-    insert : function(index, records){\r
-        records = [].concat(records);\r
-        for(var i = 0, len = records.length; i < len; i++){\r
-            this.data.insert(index, records[i]);\r
-            records[i].join(this);\r
-        }\r
-        this.fireEvent("add", this, records, index);\r
-    },\r
-\r
-    \r
-    indexOf : function(record){\r
-        return this.data.indexOf(record);\r
-    },\r
-\r
-    \r
-    indexOfId : function(id){\r
-        return this.data.indexOfKey(id);\r
-    },\r
-\r
-    \r
-    getById : function(id){\r
-        return this.data.key(id);\r
-    },\r
-\r
-    \r
-    getAt : function(index){\r
-        return this.data.itemAt(index);\r
-    },\r
-\r
-    \r
-    getRange : function(start, end){\r
-        return this.data.getRange(start, end);\r
-    },\r
-\r
-    // private\r
-    storeOptions : function(o){\r
-        o = Ext.apply({}, o);\r
-        delete o.callback;\r
-        delete o.scope;\r
-        this.lastOptions = o;\r
-    },\r
-\r
-    \r
-    load : function(options){\r
-        options = options || {};\r
-        if(this.fireEvent("beforeload", this, options) !== false){\r
-            this.storeOptions(options);\r
-            var p = Ext.apply(options.params || {}, this.baseParams);\r
-            if(this.sortInfo && this.remoteSort){\r
-                var pn = this.paramNames;\r
-                p[pn["sort"]] = this.sortInfo.field;\r
-                p[pn["dir"]] = this.sortInfo.direction;\r
-            }\r
-            this.proxy.load(p, this.reader, this.loadRecords, this, options);\r
-            return true;\r
-        } else {\r
-          return false;\r
-        }\r
-    },\r
-\r
-    \r
-    reload : function(options){\r
-        this.load(Ext.applyIf(options||{}, this.lastOptions));\r
-    },\r
-\r
-    // private\r
-    // Called as a callback by the Reader during a load operation.\r
-    loadRecords : function(o, options, success){\r
-        if(!o || success === false){\r
-            if(success !== false){\r
-                this.fireEvent("load", this, [], options);\r
-            }\r
-            if(options.callback){\r
-                options.callback.call(options.scope || this, [], options, false);\r
-            }\r
-            return;\r
-        }\r
-        var r = o.records, t = o.totalRecords || r.length;\r
-        if(!options || options.add !== true){\r
-            if(this.pruneModifiedRecords){\r
-                this.modified = [];\r
-            }\r
-            for(var i = 0, len = r.length; i < len; i++){\r
-                r[i].join(this);\r
-            }\r
-            if(this.snapshot){\r
-                this.data = this.snapshot;\r
-                delete this.snapshot;\r
-            }\r
-            this.data.clear();\r
-            this.data.addAll(r);\r
-            this.totalLength = t;\r
-            this.applySort();\r
-            this.fireEvent("datachanged", this);\r
-        }else{\r
-            this.totalLength = Math.max(t, this.data.length+r.length);\r
-            this.add(r);\r
-        }\r
-        this.fireEvent("load", this, r, options);\r
-        if(options.callback){\r
-            options.callback.call(options.scope || this, r, options, true);\r
-        }\r
-    },\r
-\r
-    \r
-    loadData : function(o, append){\r
-        var r = this.reader.readRecords(o);\r
-        this.loadRecords(r, {add: append}, true);\r
-    },\r
-\r
-    \r
-    getCount : function(){\r
-        return this.data.length || 0;\r
-    },\r
-\r
-    \r
-    getTotalCount : function(){\r
-        return this.totalLength || 0;\r
-    },\r
-\r
-    \r
-    getSortState : function(){\r
-        return this.sortInfo;\r
-    },\r
-\r
-    // private\r
-    applySort : function(){\r
-        if(this.sortInfo && !this.remoteSort){\r
-            var s = this.sortInfo, f = s.field;\r
-            this.sortData(f, s.direction);\r
-        }\r
-    },\r
-\r
-    // private\r
-    sortData : function(f, direction){\r
-        direction = direction || 'ASC';\r
-        var st = this.fields.get(f).sortType;\r
-        var fn = function(r1, r2){\r
-            var v1 = st(r1.data[f]), v2 = st(r2.data[f]);\r
-            return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);\r
-        };\r
-        this.data.sort(direction, fn);\r
-        if(this.snapshot && this.snapshot != this.data){\r
-            this.snapshot.sort(direction, fn);\r
-        }\r
-    },\r
-\r
-    \r
-    setDefaultSort : function(field, dir){\r
-        dir = dir ? dir.toUpperCase() : "ASC";\r
-        this.sortInfo = {field: field, direction: dir};\r
-        this.sortToggle[field] = dir;\r
-    },\r
-\r
-    \r
-    sort : function(fieldName, dir){\r
-        var f = this.fields.get(fieldName);\r
-        if(!f){\r
-            return false;\r
-        }\r
-        if(!dir){\r
-            if(this.sortInfo && this.sortInfo.field == f.name){ // toggle sort dir\r
-                dir = (this.sortToggle[f.name] || "ASC").toggle("ASC", "DESC");\r
-            }else{\r
-                dir = f.sortDir;\r
-            }\r
-        }\r
-        var st = (this.sortToggle) ? this.sortToggle[f.name] : null;\r
-        var si = (this.sortInfo) ? this.sortInfo : null;\r
-\r
-        this.sortToggle[f.name] = dir;\r
-        this.sortInfo = {field: f.name, direction: dir};\r
-        if(!this.remoteSort){\r
-            this.applySort();\r
-            this.fireEvent("datachanged", this);\r
-        }else{\r
-            if (!this.load(this.lastOptions)) {\r
-                if (st) {\r
-                    this.sortToggle[f.name] = st;\r
-                }\r
-                if (si) {\r
-                    this.sortInfo = si;\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    each : function(fn, scope){\r
-        this.data.each(fn, scope);\r
-    },\r
-\r
-    \r
-    getModifiedRecords : function(){\r
-        return this.modified;\r
-    },\r
-\r
-    // private\r
-    createFilterFn : function(property, value, anyMatch, caseSensitive){\r
-        if(Ext.isEmpty(value, false)){\r
-            return false;\r
-        }\r
-        value = this.data.createValueMatcher(value, anyMatch, caseSensitive);\r
-        return function(r){\r
-            return value.test(r.data[property]);\r
-        };\r
-    },\r
-\r
-    \r
-    sum : function(property, start, end){\r
-        var rs = this.data.items, v = 0;\r
-        start = start || 0;\r
-        end = (end || end === 0) ? end : rs.length-1;\r
-\r
-        for(var i = start; i <= end; i++){\r
-            v += (rs[i].data[property] || 0);\r
-        }\r
-        return v;\r
-    },\r
-\r
-    \r
-    filter : function(property, value, anyMatch, caseSensitive){\r
-        var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);\r
-        return fn ? this.filterBy(fn) : this.clearFilter();\r
-    },\r
-\r
-    \r
-    filterBy : function(fn, scope){\r
-        this.snapshot = this.snapshot || this.data;\r
-        this.data = this.queryBy(fn, scope||this);\r
-        this.fireEvent("datachanged", this);\r
-    },\r
-\r
-    \r
-    query : function(property, value, anyMatch, caseSensitive){\r
-        var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);\r
-        return fn ? this.queryBy(fn) : this.data.clone();\r
-    },\r
-\r
-    \r
-    queryBy : function(fn, scope){\r
-        var data = this.snapshot || this.data;\r
-        return data.filterBy(fn, scope||this);\r
-    },\r
-\r
-    \r
-    find : function(property, value, start, anyMatch, caseSensitive){\r
-        var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);\r
-        return fn ? this.data.findIndexBy(fn, null, start) : -1;\r
-    },\r
-\r
-    \r
-    findBy : function(fn, scope, start){\r
-        return this.data.findIndexBy(fn, scope, start);\r
-    },\r
-\r
-    \r
-    collect : function(dataIndex, allowNull, bypassFilter){\r
-        var d = (bypassFilter === true && this.snapshot) ?\r
-                this.snapshot.items : this.data.items;\r
-        var v, sv, r = [], l = {};\r
-        for(var i = 0, len = d.length; i < len; i++){\r
-            v = d[i].data[dataIndex];\r
-            sv = String(v);\r
-            if((allowNull || !Ext.isEmpty(v)) && !l[sv]){\r
-                l[sv] = true;\r
-                r[r.length] = v;\r
-            }\r
-        }\r
-        return r;\r
-    },\r
-\r
-    \r
-    clearFilter : function(suppressEvent){\r
-        if(this.isFiltered()){\r
-            this.data = this.snapshot;\r
-            delete this.snapshot;\r
-            if(suppressEvent !== true){\r
-                this.fireEvent("datachanged", this);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    isFiltered : function(){\r
-        return this.snapshot && this.snapshot != this.data;\r
-    },\r
-\r
-    // private\r
-    afterEdit : function(record){\r
-        if(this.modified.indexOf(record) == -1){\r
-            this.modified.push(record);\r
-        }\r
-        this.fireEvent("update", this, record, Ext.data.Record.EDIT);\r
-    },\r
-\r
-    // private\r
-    afterReject : function(record){\r
-        this.modified.remove(record);\r
-        this.fireEvent("update", this, record, Ext.data.Record.REJECT);\r
-    },\r
-\r
-    // private\r
-    afterCommit : function(record){\r
-        this.modified.remove(record);\r
-        this.fireEvent("update", this, record, Ext.data.Record.COMMIT);\r
-    },\r
-\r
-    \r
-    commitChanges : function(){\r
-        var m = this.modified.slice(0);\r
-        this.modified = [];\r
-        for(var i = 0, len = m.length; i < len; i++){\r
-            m[i].commit();\r
-        }\r
-    },\r
-\r
-    \r
-    rejectChanges : function(){\r
-        var m = this.modified.slice(0);\r
-        this.modified = [];\r
-        for(var i = 0, len = m.length; i < len; i++){\r
-            m[i].reject();\r
-        }\r
-    },\r
-\r
-    // private\r
-    onMetaChange : function(meta, rtype, o){\r
-        this.recordType = rtype;\r
-        this.fields = rtype.prototype.fields;\r
-        delete this.snapshot;\r
-        this.sortInfo = meta.sortInfo;\r
-        this.modified = [];\r
-        this.fireEvent('metachange', this, this.reader.meta);\r
-    },\r
-\r
-    // private\r
-    findInsertIndex : function(record){\r
-        this.suspendEvents();\r
-        var data = this.data.clone();\r
-        this.data.add(record);\r
-        this.applySort();\r
-        var index = this.data.indexOf(record);\r
-        this.data = data;\r
-        this.resumeEvents();\r
-        return index;\r
-    }\r
-});\r
-\r
-Ext.data.SimpleStore = function(config){\r
-    Ext.data.SimpleStore.superclass.constructor.call(this, Ext.apply(config, {\r
-        reader: new Ext.data.ArrayReader({\r
-                id: config.id\r
-            },\r
-            Ext.data.Record.create(config.fields)\r
-        )\r
-    }));\r
-};\r
-Ext.extend(Ext.data.SimpleStore, Ext.data.Store, {\r
-    loadData : function(data, append){\r
-        if(this.expandData === true){\r
-            var r = [];\r
-            for(var i = 0, len = data.length; i < len; i++){\r
-                r[r.length] = [data[i]];\r
-            }\r
-            data = r;\r
-        }\r
-        Ext.data.SimpleStore.superclass.loadData.call(this, data, append);\r
-    }\r
-});\r
-\r
-Ext.data.JsonStore = function(c){\r
-    \r
-    \r
-    Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(c, {\r
-        proxy: c.proxy || (!c.data ? new Ext.data.HttpProxy({url: c.url}) : undefined),\r
-        reader: new Ext.data.JsonReader(c, c.fields)\r
-    }));\r
-};\r
-Ext.extend(Ext.data.JsonStore, Ext.data.Store);\r
-\r
-Ext.data.Field = function(config){\r
-    if(typeof config == "string"){\r
-        config = {name: config};\r
-    }\r
-    Ext.apply(this, config);\r
-    \r
-    if(!this.type){\r
-        this.type = "auto";\r
-    }\r
-    \r
-    var st = Ext.data.SortTypes;\r
-    // named sortTypes are supported, here we look them up\r
-    if(typeof this.sortType == "string"){\r
-        this.sortType = st[this.sortType];\r
-    }\r
-    \r
-    // set default sortType for strings and dates\r
-    if(!this.sortType){\r
-        switch(this.type){\r
-            case "string":\r
-                this.sortType = st.asUCString;\r
-                break;\r
-            case "date":\r
-                this.sortType = st.asDate;\r
-                break;\r
-            default:\r
-                this.sortType = st.none;\r
-        }\r
-    }\r
-\r
-    // define once\r
-    var stripRe = /[\$,%]/g;\r
-\r
-    // prebuilt conversion function for this field, instead of\r
-    // switching every time we're reading a value\r
-    if(!this.convert){\r
-        var cv, dateFormat = this.dateFormat;\r
-        switch(this.type){\r
-            case "":\r
-            case "auto":\r
-            case undefined:\r
-                cv = function(v){ return v; };\r
-                break;\r
-            case "string":\r
-                cv = function(v){ return (v === undefined || v === null) ? '' : String(v); };\r
-                break;\r
-            case "int":\r
-                cv = function(v){\r
-                    return v !== undefined && v !== null && v !== '' ?\r
-                           parseInt(String(v).replace(stripRe, ""), 10) : '';\r
-                    };\r
-                break;\r
-            case "float":\r
-                cv = function(v){\r
-                    return v !== undefined && v !== null && v !== '' ?\r
-                           parseFloat(String(v).replace(stripRe, ""), 10) : ''; \r
-                    };\r
-                break;\r
-            case "bool":\r
-            case "boolean":\r
-                cv = function(v){ return v === true || v === "true" || v == 1; };\r
-                break;\r
-            case "date":\r
-                cv = function(v){\r
-                    if(!v){\r
-                        return '';\r
-                    }\r
-                    if(Ext.isDate(v)){\r
-                        return v;\r
-                    }\r
-                    if(dateFormat){\r
-                        if(dateFormat == "timestamp"){\r
-                            return new Date(v*1000);\r
-                        }\r
-                        if(dateFormat == "time"){\r
-                            return new Date(parseInt(v, 10));\r
-                        }\r
-                        return Date.parseDate(v, dateFormat);\r
-                    }\r
-                    var parsed = Date.parse(v);\r
-                    return parsed ? new Date(parsed) : null;\r
-                };\r
-             break;\r
-            \r
-        }\r
-        this.convert = cv;\r
-    }\r
-};\r
-\r
-Ext.data.Field.prototype = {\r
-    \r
-    \r
-    \r
-    \r
-    dateFormat: null,\r
-    \r
-    defaultValue: "",\r
-    \r
-    mapping: null,\r
-    \r
-    sortType : null,\r
-    \r
-    sortDir : "ASC"\r
-};\r
-\r
-Ext.data.DataReader = function(meta, recordType){\r
-    \r
-    this.meta = meta;\r
-    this.recordType = Ext.isArray(recordType) ? \r
-        Ext.data.Record.create(recordType) : recordType;\r
-};\r
-\r
-Ext.data.DataReader.prototype = {\r
-    \r
-};\r
-\r
-Ext.data.DataProxy = function(){\r
-    this.addEvents(\r
-        \r
-        'beforeload',\r
-        \r
-        'load'\r
-    );\r
-    Ext.data.DataProxy.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.data.DataProxy, Ext.util.Observable);\r
-\r
-Ext.data.MemoryProxy = function(data){\r
-    Ext.data.MemoryProxy.superclass.constructor.call(this);\r
-    this.data = data;\r
-};\r
-\r
-Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, {\r
-    \r
-    \r
-    \r
-    load : function(params, reader, callback, scope, arg){\r
-        params = params || {};\r
-        var result;\r
-        try {\r
-            result = reader.readRecords(this.data);\r
-        }catch(e){\r
-            this.fireEvent("loadexception", this, arg, null, e);\r
-            callback.call(scope, null, arg, false);\r
-            return;\r
-        }\r
-        callback.call(scope, result, arg, true);\r
-    },\r
-    \r
-    // private\r
-    update : function(params, records){\r
-        \r
-    }\r
-});\r
-\r
-Ext.data.HttpProxy = function(conn){\r
-    Ext.data.HttpProxy.superclass.constructor.call(this);\r
-    \r
-    this.conn = conn;\r
-    this.useAjax = !conn || !conn.events;\r
-\r
-    \r
-};\r
-\r
-Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, {\r
-    \r
-    getConnection : function(){\r
-        return this.useAjax ? Ext.Ajax : this.conn;\r
-    },\r
-\r
-    \r
-    load : function(params, reader, callback, scope, arg){\r
-        if(this.fireEvent("beforeload", this, params) !== false){\r
-            var  o = {\r
-                params : params || {},\r
-                request: {\r
-                    callback : callback,\r
-                    scope : scope,\r
-                    arg : arg\r
-                },\r
-                reader: reader,\r
-                callback : this.loadResponse,\r
-                scope: this\r
-            };\r
-            if(this.useAjax){\r
-                Ext.applyIf(o, this.conn);\r
-                if(this.activeRequest){\r
-                    Ext.Ajax.abort(this.activeRequest);\r
-                }\r
-                this.activeRequest = Ext.Ajax.request(o);\r
-            }else{\r
-                this.conn.request(o);\r
-            }\r
-        }else{\r
-            callback.call(scope||this, null, arg, false);\r
-        }\r
-    },\r
-\r
-    // private\r
-    loadResponse : function(o, success, response){\r
-        delete this.activeRequest;\r
-        if(!success){\r
-            this.fireEvent("loadexception", this, o, response);\r
-            o.request.callback.call(o.request.scope, null, o.request.arg, false);\r
-            return;\r
-        }\r
-        var result;\r
-        try {\r
-            result = o.reader.read(response);\r
-        }catch(e){\r
-            this.fireEvent("loadexception", this, o, response, e);\r
-            o.request.callback.call(o.request.scope, null, o.request.arg, false);\r
-            return;\r
-        }\r
-        this.fireEvent("load", this, o, o.request.arg);\r
-        o.request.callback.call(o.request.scope, result, o.request.arg, true);\r
-    },\r
-    \r
-    // private\r
-    update : function(dataSet){\r
-        \r
-    },\r
-    \r
-    // private\r
-    updateResponse : function(dataSet){\r
-        \r
-    }\r
-});\r
-\r
-Ext.data.ScriptTagProxy = function(config){\r
-    Ext.data.ScriptTagProxy.superclass.constructor.call(this);\r
-    Ext.apply(this, config);\r
-    this.head = document.getElementsByTagName("head")[0];\r
-    \r
-    \r
-};\r
-\r
-Ext.data.ScriptTagProxy.TRANS_ID = 1000;\r
-\r
-Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, {\r
-    \r
-    \r
-    timeout : 30000,\r
-    \r
-    callbackParam : "callback",\r
-    \r
-    nocache : true,\r
-\r
-    \r
-    load : function(params, reader, callback, scope, arg){\r
-        if(this.fireEvent("beforeload", this, params) !== false){\r
-\r
-            var p = Ext.urlEncode(Ext.apply(params, this.extraParams));\r
-\r
-            var url = this.url;\r
-            url += (url.indexOf("?") != -1 ? "&" : "?") + p;\r
-            if(this.nocache){\r
-                url += "&_dc=" + (new Date().getTime());\r
-            }\r
-            var transId = ++Ext.data.ScriptTagProxy.TRANS_ID;\r
-            var trans = {\r
-                id : transId,\r
-                cb : "stcCallback"+transId,\r
-                scriptId : "stcScript"+transId,\r
-                params : params,\r
-                arg : arg,\r
-                url : url,\r
-                callback : callback,\r
-                scope : scope,\r
-                reader : reader\r
-            };\r
-            var conn = this;\r
-\r
-            window[trans.cb] = function(o){\r
-                conn.handleResponse(o, trans);\r
-            };\r
-\r
-            url += String.format("&{0}={1}", this.callbackParam, trans.cb);\r
-\r
-            if(this.autoAbort !== false){\r
-                this.abort();\r
-            }\r
-\r
-            trans.timeoutId = this.handleFailure.defer(this.timeout, this, [trans]);\r
-\r
-            var script = document.createElement("script");\r
-            script.setAttribute("src", url);\r
-            script.setAttribute("type", "text/javascript");\r
-            script.setAttribute("id", trans.scriptId);\r
-            this.head.appendChild(script);\r
-\r
-            this.trans = trans;\r
-        }else{\r
-            callback.call(scope||this, null, arg, false);\r
-        }\r
-    },\r
-\r
-    // private\r
-    isLoading : function(){\r
-        return this.trans ? true : false;\r
-    },\r
-\r
-    \r
-    abort : function(){\r
-        if(this.isLoading()){\r
-            this.destroyTrans(this.trans);\r
-        }\r
-    },\r
-\r
-    // private\r
-    destroyTrans : function(trans, isLoaded){\r
-        this.head.removeChild(document.getElementById(trans.scriptId));\r
-        clearTimeout(trans.timeoutId);\r
-        if(isLoaded){\r
-            window[trans.cb] = undefined;\r
-            try{\r
-                delete window[trans.cb];\r
-            }catch(e){}\r
-        }else{\r
-            // if hasn't been loaded, wait for load to remove it to prevent script error\r
-            window[trans.cb] = function(){\r
-                window[trans.cb] = undefined;\r
-                try{\r
-                    delete window[trans.cb];\r
-                }catch(e){}\r
-            };\r
-        }\r
-    },\r
-\r
-    // private\r
-    handleResponse : function(o, trans){\r
-        this.trans = false;\r
-        this.destroyTrans(trans, true);\r
-        var result;\r
-        try {\r
-            result = trans.reader.readRecords(o);\r
-        }catch(e){\r
-            this.fireEvent("loadexception", this, o, trans.arg, e);\r
-            trans.callback.call(trans.scope||window, null, trans.arg, false);\r
-            return;\r
-        }\r
-        this.fireEvent("load", this, o, trans.arg);\r
-        trans.callback.call(trans.scope||window, result, trans.arg, true);\r
-    },\r
-\r
-    // private\r
-    handleFailure : function(trans){\r
-        this.trans = false;\r
-        this.destroyTrans(trans, false);\r
-        this.fireEvent("loadexception", this, null, trans.arg);\r
-        trans.callback.call(trans.scope||window, null, trans.arg, false);\r
-    }\r
-});\r
-\r
-Ext.data.JsonReader = function(meta, recordType){\r
-    meta = meta || {};\r
-    Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType || meta.fields);\r
-};\r
-Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, {\r
-    \r
-    \r
-    read : function(response){\r
-        var json = response.responseText;\r
-        var o = eval("("+json+")");\r
-        if(!o) {\r
-            throw {message: "JsonReader.read: Json object not found"};\r
-        }\r
-        return this.readRecords(o);\r
-    },\r
-\r
-    // private function a store will implement\r
-    onMetaChange : function(meta, recordType, o){\r
-\r
-    },\r
-\r
-    \r
-    simpleAccess: function(obj, subsc) {\r
-       return obj[subsc];\r
-    },\r
-\r
-       \r
-    getJsonAccessor: function(){\r
-        var re = /[\[\.]/;\r
-        return function(expr) {\r
-            try {\r
-                return(re.test(expr))\r
-                    ? new Function("obj", "return obj." + expr)\r
-                    : function(obj){\r
-                        return obj[expr];\r
-                    };\r
-            } catch(e){}\r
-            return Ext.emptyFn;\r
-        };\r
-    }(),\r
-\r
-    \r
-    readRecords : function(o){\r
-        \r
-        this.jsonData = o;\r
-        if(o.metaData){\r
-            delete this.ef;\r
-            this.meta = o.metaData;\r
-            this.recordType = Ext.data.Record.create(o.metaData.fields);\r
-            this.onMetaChange(this.meta, this.recordType, o);\r
-        }\r
-        var s = this.meta, Record = this.recordType,\r
-            f = Record.prototype.fields, fi = f.items, fl = f.length;\r
-\r
-//      Generate extraction functions for the totalProperty, the root, the id, and for each field\r
-        if (!this.ef) {\r
-            if(s.totalProperty) {\r
-                   this.getTotal = this.getJsonAccessor(s.totalProperty);\r
-               }\r
-               if(s.successProperty) {\r
-                   this.getSuccess = this.getJsonAccessor(s.successProperty);\r
-               }\r
-               this.getRoot = s.root ? this.getJsonAccessor(s.root) : function(p){return p;};\r
-               if (s.id) {\r
-                       var g = this.getJsonAccessor(s.id);\r
-                       this.getId = function(rec) {\r
-                               var r = g(rec);\r
-                               return (r === undefined || r === "") ? null : r;\r
-                       };\r
-               } else {\r
-                       this.getId = function(){return null;};\r
-               }\r
-            this.ef = [];\r
-            for(var i = 0; i < fl; i++){\r
-                f = fi[i];\r
-                var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name;\r
-                this.ef[i] = this.getJsonAccessor(map);\r
-            }\r
-        }\r
-\r
-       var root = this.getRoot(o), c = root.length, totalRecords = c, success = true;\r
-       if(s.totalProperty){\r
-            var v = parseInt(this.getTotal(o), 10);\r
-            if(!isNaN(v)){\r
-                totalRecords = v;\r
-            }\r
-        }\r
-        if(s.successProperty){\r
-            var v = this.getSuccess(o);\r
-            if(v === false || v === 'false'){\r
-                success = false;\r
-            }\r
-        }\r
-        var records = [];\r
-           for(var i = 0; i < c; i++){\r
-                   var n = root[i];\r
-               var values = {};\r
-               var id = this.getId(n);\r
-               for(var j = 0; j < fl; j++){\r
-                   f = fi[j];\r
-                var v = this.ef[j](n);\r
-                values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue, n);\r
-               }\r
-               var record = new Record(values, id);\r
-               record.json = n;\r
-               records[i] = record;\r
-           }\r
-           return {\r
-               success : success,\r
-               records : records,\r
-               totalRecords : totalRecords\r
-           };\r
-    }\r
-});\r
-\r
-Ext.data.XmlReader = function(meta, recordType){\r
-    meta = meta || {};\r
-    Ext.data.XmlReader.superclass.constructor.call(this, meta, recordType || meta.fields);\r
-};\r
-Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, {\r
-    \r
-    read : function(response){\r
-        var doc = response.responseXML;\r
-        if(!doc) {\r
-            throw {message: "XmlReader.read: XML Document not available"};\r
-        }\r
-        return this.readRecords(doc);\r
-    },\r
-\r
-    \r
-    readRecords : function(doc){\r
-        \r
-        this.xmlData = doc;\r
-        var root = doc.documentElement || doc;\r
-       var q = Ext.DomQuery;\r
-       var recordType = this.recordType, fields = recordType.prototype.fields;\r
-       var sid = this.meta.id;\r
-       var totalRecords = 0, success = true;\r
-       if(this.meta.totalRecords){\r
-           totalRecords = q.selectNumber(this.meta.totalRecords, root, 0);\r
-       }\r
-\r
-        if(this.meta.success){\r
-            var sv = q.selectValue(this.meta.success, root, true);\r
-            success = sv !== false && sv !== 'false';\r
-       }\r
-       var records = [];\r
-       var ns = q.select(this.meta.record, root);\r
-        for(var i = 0, len = ns.length; i < len; i++) {\r
-               var n = ns[i];\r
-               var values = {};\r
-               var id = sid ? q.selectValue(sid, n) : undefined;\r
-               for(var j = 0, jlen = fields.length; j < jlen; j++){\r
-                   var f = fields.items[j];\r
-                var v = q.selectValue(f.mapping || f.name, n, f.defaultValue);\r
-                   v = f.convert(v, n);\r
-                   values[f.name] = v;\r
-               }\r
-               var record = new recordType(values, id);\r
-               record.node = n;\r
-               records[records.length] = record;\r
-           }\r
-\r
-           return {\r
-               success : success,\r
-               records : records,\r
-               totalRecords : totalRecords || records.length\r
-           };\r
-    }\r
-});\r
-\r
-Ext.data.ArrayReader = Ext.extend(Ext.data.JsonReader, {\r
-    \r
-    readRecords : function(o){\r
-        var sid = this.meta ? this.meta.id : null;\r
-       var recordType = this.recordType, fields = recordType.prototype.fields;\r
-       var records = [];\r
-       var root = o;\r
-           for(var i = 0; i < root.length; i++){\r
-                   var n = root[i];\r
-               var values = {};\r
-               var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);\r
-               for(var j = 0, jlen = fields.length; j < jlen; j++){\r
-                var f = fields.items[j];\r
-                var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j;\r
-                var v = n[k] !== undefined ? n[k] : f.defaultValue;\r
-                v = f.convert(v, n);\r
-                values[f.name] = v;\r
-            }\r
-               var record = new recordType(values, id);\r
-               record.json = n;\r
-               records[records.length] = record;\r
-           }\r
-           return {\r
-               records : records,\r
-               totalRecords : records.length\r
-           };\r
-    }\r
-});\r
-\r
-Ext.data.Tree = function(root){\r
-   this.nodeHash = {};\r
-   \r
-   this.root = null;\r
-   if(root){\r
-       this.setRootNode(root);\r
-   }\r
-   this.addEvents(\r
-       \r
-       "append",\r
-       \r
-       "remove",\r
-       \r
-       "move",\r
-       \r
-       "insert",\r
-       \r
-       "beforeappend",\r
-       \r
-       "beforeremove",\r
-       \r
-       "beforemove",\r
-       \r
-       "beforeinsert"\r
-   );\r
-\r
-    Ext.data.Tree.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.data.Tree, Ext.util.Observable, {\r
-    \r
-    pathSeparator: "/",\r
-\r
-    // private\r
-    proxyNodeEvent : function(){\r
-        return this.fireEvent.apply(this, arguments);\r
-    },\r
-\r
-    \r
-    getRootNode : function(){\r
-        return this.root;\r
-    },\r
-\r
-    \r
-    setRootNode : function(node){\r
-        this.root = node;\r
-        node.ownerTree = this;\r
-        node.isRoot = true;\r
-        this.registerNode(node);\r
-        return node;\r
-    },\r
-\r
-    \r
-    getNodeById : function(id){\r
-        return this.nodeHash[id];\r
-    },\r
-\r
-    // private\r
-    registerNode : function(node){\r
-        this.nodeHash[node.id] = node;\r
-    },\r
-\r
-    // private\r
-    unregisterNode : function(node){\r
-        delete this.nodeHash[node.id];\r
-    },\r
-\r
-    toString : function(){\r
-        return "[Tree"+(this.id?" "+this.id:"")+"]";\r
-    }\r
-});\r
-\r
-\r
-Ext.data.Node = function(attributes){\r
-    \r
-    this.attributes = attributes || {};\r
-    this.leaf = this.attributes.leaf;\r
-    \r
-    this.id = this.attributes.id;\r
-    if(!this.id){\r
-        this.id = Ext.id(null, "ynode-");\r
-        this.attributes.id = this.id;\r
-    }\r
-    \r
-    this.childNodes = [];\r
-    if(!this.childNodes.indexOf){ // indexOf is a must\r
-        this.childNodes.indexOf = function(o){\r
-            for(var i = 0, len = this.length; i < len; i++){\r
-                if(this[i] == o) return i;\r
-            }\r
-            return -1;\r
-        };\r
-    }\r
-    \r
-    this.parentNode = null;\r
-    \r
-    this.firstChild = null;\r
-    \r
-    this.lastChild = null;\r
-    \r
-    this.previousSibling = null;\r
-    \r
-    this.nextSibling = null;\r
-\r
-    this.addEvents({\r
-       \r
-       "append" : true,\r
-       \r
-       "remove" : true,\r
-       \r
-       "move" : true,\r
-       \r
-       "insert" : true,\r
-       \r
-       "beforeappend" : true,\r
-       \r
-       "beforeremove" : true,\r
-       \r
-       "beforemove" : true,\r
-       \r
-       "beforeinsert" : true\r
-   });\r
-    this.listeners = this.attributes.listeners;\r
-    Ext.data.Node.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.data.Node, Ext.util.Observable, {\r
-    // private\r
-    fireEvent : function(evtName){\r
-        // first do standard event for this node\r
-        if(Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false){\r
-            return false;\r
-        }\r
-        // then bubble it up to the tree if the event wasn't cancelled\r
-        var ot = this.getOwnerTree();\r
-        if(ot){\r
-            if(ot.proxyNodeEvent.apply(ot, arguments) === false){\r
-                return false;\r
-            }\r
-        }\r
-        return true;\r
-    },\r
-\r
-    \r
-    isLeaf : function(){\r
-        return this.leaf === true;\r
-    },\r
-\r
-    // private\r
-    setFirstChild : function(node){\r
-        this.firstChild = node;\r
-    },\r
-\r
-    //private\r
-    setLastChild : function(node){\r
-        this.lastChild = node;\r
-    },\r
-\r
-\r
-    \r
-    isLast : function(){\r
-       return (!this.parentNode ? true : this.parentNode.lastChild == this);\r
-    },\r
-\r
-    \r
-    isFirst : function(){\r
-       return (!this.parentNode ? true : this.parentNode.firstChild == this);\r
-    },\r
-\r
-    \r
-    hasChildNodes : function(){\r
-        return !this.isLeaf() && this.childNodes.length > 0;\r
-    },\r
-    \r
-    \r
-    isExpandable : function(){\r
-        return this.attributes.expandable || this.hasChildNodes();\r
-    },\r
-\r
-    \r
-    appendChild : function(node){\r
-        var multi = false;\r
-        if(Ext.isArray(node)){\r
-            multi = node;\r
-        }else if(arguments.length > 1){\r
-            multi = arguments;\r
-        }\r
-        // if passed an array or multiple args do them one by one\r
-        if(multi){\r
-            for(var i = 0, len = multi.length; i < len; i++) {\r
-               this.appendChild(multi[i]);\r
-            }\r
-        }else{\r
-            if(this.fireEvent("beforeappend", this.ownerTree, this, node) === false){\r
-                return false;\r
-            }\r
-            var index = this.childNodes.length;\r
-            var oldParent = node.parentNode;\r
-            // it's a move, make sure we move it cleanly\r
-            if(oldParent){\r
-                if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index) === false){\r
-                    return false;\r
-                }\r
-                oldParent.removeChild(node);\r
-            }\r
-            index = this.childNodes.length;\r
-            if(index == 0){\r
-                this.setFirstChild(node);\r
-            }\r
-            this.childNodes.push(node);\r
-            node.parentNode = this;\r
-            var ps = this.childNodes[index-1];\r
-            if(ps){\r
-                node.previousSibling = ps;\r
-                ps.nextSibling = node;\r
-            }else{\r
-                node.previousSibling = null;\r
-            }\r
-            node.nextSibling = null;\r
-            this.setLastChild(node);\r
-            node.setOwnerTree(this.getOwnerTree());\r
-            this.fireEvent("append", this.ownerTree, this, node, index);\r
-            if(oldParent){\r
-                node.fireEvent("move", this.ownerTree, node, oldParent, this, index);\r
-            }\r
-            return node;\r
-        }\r
-    },\r
-\r
-    \r
-    removeChild : function(node){\r
-        var index = this.childNodes.indexOf(node);\r
-        if(index == -1){\r
-            return false;\r
-        }\r
-        if(this.fireEvent("beforeremove", this.ownerTree, this, node) === false){\r
-            return false;\r
-        }\r
-\r
-        // remove it from childNodes collection\r
-        this.childNodes.splice(index, 1);\r
-\r
-        // update siblings\r
-        if(node.previousSibling){\r
-            node.previousSibling.nextSibling = node.nextSibling;\r
-        }\r
-        if(node.nextSibling){\r
-            node.nextSibling.previousSibling = node.previousSibling;\r
-        }\r
-\r
-        // update child refs\r
-        if(this.firstChild == node){\r
-            this.setFirstChild(node.nextSibling);\r
-        }\r
-        if(this.lastChild == node){\r
-            this.setLastChild(node.previousSibling);\r
-        }\r
-\r
-        node.setOwnerTree(null);\r
-        // clear any references from the node\r
-        node.parentNode = null;\r
-        node.previousSibling = null;\r
-        node.nextSibling = null;\r
-        this.fireEvent("remove", this.ownerTree, this, node);\r
-        return node;\r
-    },\r
-\r
-    \r
-    insertBefore : function(node, refNode){\r
-        if(!refNode){ // like standard Dom, refNode can be null for append\r
-            return this.appendChild(node);\r
-        }\r
-        // nothing to do\r
-        if(node == refNode){\r
-            return false;\r
-        }\r
-\r
-        if(this.fireEvent("beforeinsert", this.ownerTree, this, node, refNode) === false){\r
-            return false;\r
-        }\r
-        var index = this.childNodes.indexOf(refNode);\r
-        var oldParent = node.parentNode;\r
-        var refIndex = index;\r
-\r
-        // when moving internally, indexes will change after remove\r
-        if(oldParent == this && this.childNodes.indexOf(node) < index){\r
-            refIndex--;\r
-        }\r
-\r
-        // it's a move, make sure we move it cleanly\r
-        if(oldParent){\r
-            if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index, refNode) === false){\r
-                return false;\r
-            }\r
-            oldParent.removeChild(node);\r
-        }\r
-        if(refIndex == 0){\r
-            this.setFirstChild(node);\r
-        }\r
-        this.childNodes.splice(refIndex, 0, node);\r
-        node.parentNode = this;\r
-        var ps = this.childNodes[refIndex-1];\r
-        if(ps){\r
-            node.previousSibling = ps;\r
-            ps.nextSibling = node;\r
-        }else{\r
-            node.previousSibling = null;\r
-        }\r
-        node.nextSibling = refNode;\r
-        refNode.previousSibling = node;\r
-        node.setOwnerTree(this.getOwnerTree());\r
-        this.fireEvent("insert", this.ownerTree, this, node, refNode);\r
-        if(oldParent){\r
-            node.fireEvent("move", this.ownerTree, node, oldParent, this, refIndex, refNode);\r
-        }\r
-        return node;\r
-    },\r
-\r
-    \r
-    remove : function(){\r
-        this.parentNode.removeChild(this);\r
-        return this;\r
-    },\r
-\r
-    \r
-    item : function(index){\r
-        return this.childNodes[index];\r
-    },\r
-\r
-    \r
-    replaceChild : function(newChild, oldChild){\r
-        var s = oldChild ? oldChild.nextSibling : null;\r
-        this.removeChild(oldChild);\r
-        this.insertBefore(newChild, s);\r
-        return oldChild;\r
-    },\r
-\r
-    \r
-    indexOf : function(child){\r
-        return this.childNodes.indexOf(child);\r
-    },\r
-\r
-    \r
-    getOwnerTree : function(){\r
-        // if it doesn't have one, look for one\r
-        if(!this.ownerTree){\r
-            var p = this;\r
-            while(p){\r
-                if(p.ownerTree){\r
-                    this.ownerTree = p.ownerTree;\r
-                    break;\r
-                }\r
-                p = p.parentNode;\r
-            }\r
-        }\r
-        return this.ownerTree;\r
-    },\r
-\r
-    \r
-    getDepth : function(){\r
-        var depth = 0;\r
-        var p = this;\r
-        while(p.parentNode){\r
-            ++depth;\r
-            p = p.parentNode;\r
-        }\r
-        return depth;\r
-    },\r
-\r
-    // private\r
-    setOwnerTree : function(tree){\r
-        // if it's move, we need to update everyone\r
-        if(tree != this.ownerTree){\r
-            if(this.ownerTree){\r
-                this.ownerTree.unregisterNode(this);\r
-            }\r
-            this.ownerTree = tree;\r
-            var cs = this.childNodes;\r
-            for(var i = 0, len = cs.length; i < len; i++) {\r
-               cs[i].setOwnerTree(tree);\r
-            }\r
-            if(tree){\r
-                tree.registerNode(this);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    getPath : function(attr){\r
-        attr = attr || "id";\r
-        var p = this.parentNode;\r
-        var b = [this.attributes[attr]];\r
-        while(p){\r
-            b.unshift(p.attributes[attr]);\r
-            p = p.parentNode;\r
-        }\r
-        var sep = this.getOwnerTree().pathSeparator;\r
-        return sep + b.join(sep);\r
-    },\r
-\r
-    \r
-    bubble : function(fn, scope, args){\r
-        var p = this;\r
-        while(p){\r
-            if(fn.apply(scope || p, args || [p]) === false){\r
-                break;\r
-            }\r
-            p = p.parentNode;\r
-        }\r
-    },\r
-\r
-    \r
-    cascade : function(fn, scope, args){\r
-        if(fn.apply(scope || this, args || [this]) !== false){\r
-            var cs = this.childNodes;\r
-            for(var i = 0, len = cs.length; i < len; i++) {\r
-               cs[i].cascade(fn, scope, args);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    eachChild : function(fn, scope, args){\r
-        var cs = this.childNodes;\r
-        for(var i = 0, len = cs.length; i < len; i++) {\r
-               if(fn.apply(scope || this, args || [cs[i]]) === false){\r
-                   break;\r
-               }\r
-        }\r
-    },\r
-\r
-    \r
-    findChild : function(attribute, value){\r
-        var cs = this.childNodes;\r
-        for(var i = 0, len = cs.length; i < len; i++) {\r
-               if(cs[i].attributes[attribute] == value){\r
-                   return cs[i];\r
-               }\r
-        }\r
-        return null;\r
-    },\r
-\r
-    \r
-    findChildBy : function(fn, scope){\r
-        var cs = this.childNodes;\r
-        for(var i = 0, len = cs.length; i < len; i++) {\r
-               if(fn.call(scope||cs[i], cs[i]) === true){\r
-                   return cs[i];\r
-               }\r
-        }\r
-        return null;\r
-    },\r
-\r
-    \r
-    sort : function(fn, scope){\r
-        var cs = this.childNodes;\r
-        var len = cs.length;\r
-        if(len > 0){\r
-            var sortFn = scope ? function(){fn.apply(scope, arguments);} : fn;\r
-            cs.sort(sortFn);\r
-            for(var i = 0; i < len; i++){\r
-                var n = cs[i];\r
-                n.previousSibling = cs[i-1];\r
-                n.nextSibling = cs[i+1];\r
-                if(i == 0){\r
-                    this.setFirstChild(n);\r
-                }\r
-                if(i == len-1){\r
-                    this.setLastChild(n);\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    contains : function(node){\r
-        return node.isAncestor(this);\r
-    },\r
-\r
-    \r
-    isAncestor : function(node){\r
-        var p = this.parentNode;\r
-        while(p){\r
-            if(p == node){\r
-                return true;\r
-            }\r
-            p = p.parentNode;\r
-        }\r
-        return false;\r
-    },\r
-\r
-    toString : function(){\r
-        return "[Node"+(this.id?" "+this.id:"")+"]";\r
-    }\r
-});\r
-\r
-Ext.data.GroupingStore = Ext.extend(Ext.data.Store, {\r
-    \r
-    \r
-    remoteGroup : false,\r
-    \r
-    groupOnSort:false,\r
-\r
-    \r
-    clearGrouping : function(){\r
-        this.groupField = false;\r
-        if(this.remoteGroup){\r
-            if(this.baseParams){\r
-                delete this.baseParams.groupBy;\r
-            }\r
-            this.reload();\r
-        }else{\r
-            this.applySort();\r
-            this.fireEvent('datachanged', this);\r
-        }\r
-    },\r
-\r
-    \r
-    groupBy : function(field, forceRegroup){\r
-        if(this.groupField == field && !forceRegroup){\r
-            return; // already grouped by this field\r
-        }\r
-        this.groupField = field;\r
-        if(this.remoteGroup){\r
-            if(!this.baseParams){\r
-                this.baseParams = {};\r
-            }\r
-            this.baseParams['groupBy'] = field;\r
-        }\r
-        if(this.groupOnSort){\r
-            this.sort(field);\r
-            return;\r
-        }\r
-        if(this.remoteGroup){\r
-            this.reload();\r
-        }else{\r
-            var si = this.sortInfo || {};\r
-            if(si.field != field){\r
-                this.applySort();\r
-            }else{\r
-                this.sortData(field);\r
-            }\r
-            this.fireEvent('datachanged', this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    applySort : function(){\r
-        Ext.data.GroupingStore.superclass.applySort.call(this);\r
-        if(!this.groupOnSort && !this.remoteGroup){\r
-            var gs = this.getGroupState();\r
-            if(gs && gs != this.sortInfo.field){\r
-                this.sortData(this.groupField);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    applyGrouping : function(alwaysFireChange){\r
-        if(this.groupField !== false){\r
-            this.groupBy(this.groupField, true);\r
-            return true;\r
-        }else{\r
-            if(alwaysFireChange === true){\r
-                this.fireEvent('datachanged', this);\r
-            }\r
-            return false;\r
-        }\r
-    },\r
-\r
-    // private\r
-    getGroupState : function(){\r
-        return this.groupOnSort && this.groupField !== false ?\r
-               (this.sortInfo ? this.sortInfo.field : undefined) : this.groupField;\r
-    }\r
-});\r
-\r
-Ext.ComponentMgr = function(){\r
-    var all = new Ext.util.MixedCollection();\r
-    var types = {};\r
-\r
-    return {\r
-        \r
-        register : function(c){\r
-            all.add(c);\r
-        },\r
-\r
-        \r
-        unregister : function(c){\r
-            all.remove(c);\r
-        },\r
-\r
-        \r
-        get : function(id){\r
-            return all.get(id);\r
-        },\r
-\r
-        \r
-        onAvailable : function(id, fn, scope){\r
-            all.on("add", function(index, o){\r
-                if(o.id == id){\r
-                    fn.call(scope || o, o);\r
-                    all.un("add", fn, scope);\r
-                }\r
-            });\r
-        },\r
-\r
-        \r
-        all : all,\r
-\r
-        \r
-        registerType : function(xtype, cls){\r
-            types[xtype] = cls;\r
-            cls.xtype = xtype;\r
-        },\r
-\r
-        \r
-        create : function(config, defaultType){\r
-            return new types[config.xtype || defaultType](config);\r
-        }\r
-    };\r
-}();\r
-\r
-\r
-Ext.reg = Ext.ComponentMgr.registerType; // this will be called a lot internally, shorthand to keep the bytes down\r
-\r
-Ext.Component = function(config){\r
-    config = config || {};\r
-    if(config.initialConfig){\r
-        if(config.isAction){           // actions\r
-            this.baseAction = config;\r
-        }\r
-        config = config.initialConfig; // component cloning / action set up\r
-    }else if(config.tagName || config.dom || typeof config == "string"){ // element object\r
-        config = {applyTo: config, id: config.id || config};\r
-    }\r
-\r
-    \r
-    this.initialConfig = config;\r
-\r
-    Ext.apply(this, config);\r
-    this.addEvents(\r
-        \r
-        'disable',\r
-        \r
-        'enable',\r
-        \r
-        'beforeshow',\r
-        \r
-        'show',\r
-        \r
-        'beforehide',\r
-        \r
-        'hide',\r
-        \r
-        'beforerender',\r
-        \r
-        'render',\r
-        \r
-        'beforedestroy',\r
-        \r
-        'destroy',\r
-        \r
-        'beforestaterestore',\r
-        \r
-        'staterestore',\r
-        \r
-        'beforestatesave',\r
-        \r
-        'statesave'\r
-    );\r
-    this.getId();\r
-    Ext.ComponentMgr.register(this);\r
-    Ext.Component.superclass.constructor.call(this);\r
-\r
-    if(this.baseAction){\r
-        this.baseAction.addComponent(this);\r
-    }\r
-\r
-    this.initComponent();\r
-\r
-    if(this.plugins){\r
-        if(Ext.isArray(this.plugins)){\r
-            for(var i = 0, len = this.plugins.length; i < len; i++){\r
-                this.plugins[i] = this.initPlugin(this.plugins[i]);\r
-            }\r
-        }else{\r
-            this.plugins = this.initPlugin(this.plugins);\r
-        }\r
-    }\r
-\r
-    if(this.stateful !== false){\r
-        this.initState(config);\r
-    }\r
-\r
-    if(this.applyTo){\r
-        this.applyToMarkup(this.applyTo);\r
-        delete this.applyTo;\r
-    }else if(this.renderTo){\r
-        this.render(this.renderTo);\r
-        delete this.renderTo;\r
-    }\r
-};\r
-\r
-// private\r
-Ext.Component.AUTO_ID = 1000;\r
-\r
-Ext.extend(Ext.Component, Ext.util.Observable, {\r
-    // Configs below are used for all Components when rendered by FormLayout.\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-    \r
-    \r
-    \r
-\r
-    \r
-    disabledClass : "x-item-disabled",\r
-       \r
-    allowDomMove : true,\r
-       \r
-    autoShow : false,\r
-    \r
-    hideMode: 'display',\r
-    \r
-    hideParent: false,\r
-\r
-    \r
-    \r
-    hidden : false,\r
-    \r
-    disabled : false,\r
-    \r
-    rendered : false,\r
-\r
-    // private\r
-    ctype : "Ext.Component",\r
-\r
-    // private\r
-    actionMode : "el",\r
-\r
-    // private\r
-    getActionEl : function(){\r
-        return this[this.actionMode];\r
-    },\r
-\r
-    initPlugin : function(p){\r
-        p.init(this);\r
-        return p;\r
-    },\r
-\r
-    \r
-    initComponent : Ext.emptyFn,\r
-\r
-    \r
-    render : function(container, position){\r
-        if(!this.rendered && this.fireEvent("beforerender", this) !== false){\r
-            if(!container && this.el){\r
-                this.el = Ext.get(this.el);\r
-                container = this.el.dom.parentNode;\r
-                this.allowDomMove = false;\r
-            }\r
-            this.container = Ext.get(container);\r
-            if(this.ctCls){\r
-                this.container.addClass(this.ctCls);\r
-            }\r
-            this.rendered = true;\r
-            if(position !== undefined){\r
-                if(typeof position == 'number'){\r
-                    position = this.container.dom.childNodes[position];\r
-                }else{\r
-                    position = Ext.getDom(position);\r
-                }\r
-            }\r
-            this.onRender(this.container, position || null);\r
-            if(this.autoShow){\r
-                this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]);\r
-            }\r
-            if(this.cls){\r
-                this.el.addClass(this.cls);\r
-                delete this.cls;\r
-            }\r
-            if(this.style){\r
-                this.el.applyStyles(this.style);\r
-                delete this.style;\r
-            }\r
-            if(this.overCls){\r
-                this.el.addClassOnOver(this.overCls);\r
-            }\r
-            this.fireEvent("render", this);\r
-            this.afterRender(this.container);\r
-            if(this.hidden){\r
-                this.hide();\r
-            }\r
-            if(this.disabled){\r
-                this.disable();\r
-            }\r
-\r
-            if(this.stateful !== false){\r
-                this.initStateEvents();\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-\r
-    // private\r
-    initState : function(config){\r
-        if(Ext.state.Manager){\r
-            var id = this.getStateId();\r
-            if(id){\r
-                var state = Ext.state.Manager.get(id);\r
-                if(state){\r
-                    if(this.fireEvent('beforestaterestore', this, state) !== false){\r
-                        this.applyState(state);\r
-                        this.fireEvent('staterestore', this, state);\r
-                    }\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    getStateId : function(){\r
-        return this.stateId || ((this.id.indexOf('ext-comp-') == 0 || this.id.indexOf('ext-gen') == 0) ? null : this.id);\r
-    },\r
-\r
-    // private\r
-    initStateEvents : function(){\r
-        if(this.stateEvents){\r
-            for(var i = 0, e; e = this.stateEvents[i]; i++){\r
-                this.on(e, this.saveState, this, {delay:100});\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    applyState : function(state, config){\r
-        if(state){\r
-            Ext.apply(this, state);\r
-        }\r
-    },\r
-\r
-    // private\r
-    getState : function(){\r
-        return null;\r
-    },\r
-\r
-    // private\r
-    saveState : function(){\r
-        if(Ext.state.Manager){\r
-            var id = this.getStateId();\r
-            if(id){\r
-                var state = this.getState();\r
-                if(this.fireEvent('beforestatesave', this, state) !== false){\r
-                    Ext.state.Manager.set(id, state);\r
-                    this.fireEvent('statesave', this, state);\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    applyToMarkup : function(el){\r
-        this.allowDomMove = false;\r
-        this.el = Ext.get(el);\r
-        this.render(this.el.dom.parentNode);\r
-    },\r
-\r
-    \r
-    addClass : function(cls){\r
-        if(this.el){\r
-            this.el.addClass(cls);\r
-        }else{\r
-            this.cls = this.cls ? this.cls + ' ' + cls : cls;\r
-        }\r
-    },\r
-\r
-    \r
-    removeClass : function(cls){\r
-        if(this.el){\r
-            this.el.removeClass(cls);\r
-        }else if(this.cls){\r
-            this.cls = this.cls.split(' ').remove(cls).join(' ');\r
-        }\r
-    },\r
-\r
-    // private\r
-    // default function is not really useful\r
-    onRender : function(ct, position){\r
-        if(this.autoEl){\r
-            if(typeof this.autoEl == 'string'){\r
-                this.el = document.createElement(this.autoEl);\r
-            }else{\r
-                var div = document.createElement('div');\r
-                Ext.DomHelper.overwrite(div, this.autoEl);\r
-                this.el = div.firstChild;\r
-            }\r
-            if (!this.el.id) {\r
-               this.el.id = this.getId();\r
-            }\r
-        }\r
-        if(this.el){\r
-            this.el = Ext.get(this.el);\r
-            if(this.allowDomMove !== false){\r
-                ct.dom.insertBefore(this.el.dom, position);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    getAutoCreate : function(){\r
-        var cfg = typeof this.autoCreate == "object" ?\r
-                      this.autoCreate : Ext.apply({}, this.defaultAutoCreate);\r
-        if(this.id && !cfg.id){\r
-            cfg.id = this.id;\r
-        }\r
-        return cfg;\r
-    },\r
-\r
-    // private\r
-    afterRender : Ext.emptyFn,\r
-\r
-    \r
-    destroy : function(){\r
-        if(this.fireEvent("beforedestroy", this) !== false){\r
-            this.beforeDestroy();\r
-            if(this.rendered){\r
-                this.el.removeAllListeners();\r
-                this.el.remove();\r
-                if(this.actionMode == "container"){\r
-                    this.container.remove();\r
-                }\r
-            }\r
-            this.onDestroy();\r
-            Ext.ComponentMgr.unregister(this);\r
-            this.fireEvent("destroy", this);\r
-            this.purgeListeners();\r
-        }\r
-    },\r
-\r
-       // private\r
-    beforeDestroy : Ext.emptyFn,\r
-\r
-       // private\r
-    onDestroy  : Ext.emptyFn,\r
-\r
-    \r
-    getEl : function(){\r
-        return this.el;\r
-    },\r
-\r
-    \r
-    getId : function(){\r
-        return this.id || (this.id = "ext-comp-" + (++Ext.Component.AUTO_ID));\r
-    },\r
-\r
-    \r
-    getItemId : function(){\r
-        return this.itemId || this.getId();\r
-    },\r
-\r
-    \r
-    focus : function(selectText, delay){\r
-        if(delay){\r
-            this.focus.defer(typeof delay == 'number' ? delay : 10, this, [selectText, false]);\r
-            return;\r
-        }\r
-        if(this.rendered){\r
-            this.el.focus();\r
-            if(selectText === true){\r
-                this.el.dom.select();\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-\r
-    // private\r
-    blur : function(){\r
-        if(this.rendered){\r
-            this.el.blur();\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    disable : function(){\r
-        if(this.rendered){\r
-            this.onDisable();\r
-        }\r
-        this.disabled = true;\r
-        this.fireEvent("disable", this);\r
-        return this;\r
-    },\r
-\r
-       // private\r
-    onDisable : function(){\r
-        this.getActionEl().addClass(this.disabledClass);\r
-        this.el.dom.disabled = true;\r
-    },\r
-\r
-    \r
-    enable : function(){\r
-        if(this.rendered){\r
-            this.onEnable();\r
-        }\r
-        this.disabled = false;\r
-        this.fireEvent("enable", this);\r
-        return this;\r
-    },\r
-\r
-       // private\r
-    onEnable : function(){\r
-        this.getActionEl().removeClass(this.disabledClass);\r
-        this.el.dom.disabled = false;\r
-    },\r
-\r
-    \r
-    setDisabled : function(disabled){\r
-        this[disabled ? "disable" : "enable"]();\r
-    },\r
-\r
-    \r
-    show: function(){\r
-        if(this.fireEvent("beforeshow", this) !== false){\r
-            this.hidden = false;\r
-            if(this.autoRender){\r
-                this.render(typeof this.autoRender == 'boolean' ? Ext.getBody() : this.autoRender);\r
-            }\r
-            if(this.rendered){\r
-                this.onShow();\r
-            }\r
-            this.fireEvent("show", this);\r
-        }\r
-        return this;\r
-    },\r
-\r
-    // private\r
-    onShow : function(){\r
-        if(this.hideParent){\r
-            this.container.removeClass('x-hide-' + this.hideMode);\r
-        }else{\r
-            this.getActionEl().removeClass('x-hide-' + this.hideMode);\r
-        }\r
-\r
-    },\r
-\r
-    \r
-    hide: function(){\r
-        if(this.fireEvent("beforehide", this) !== false){\r
-            this.hidden = true;\r
-            if(this.rendered){\r
-                this.onHide();\r
-            }\r
-            this.fireEvent("hide", this);\r
-        }\r
-        return this;\r
-    },\r
-\r
-    // private\r
-    onHide : function(){\r
-        if(this.hideParent){\r
-            this.container.addClass('x-hide-' + this.hideMode);\r
-        }else{\r
-            this.getActionEl().addClass('x-hide-' + this.hideMode);\r
-        }\r
-    },\r
-\r
-    \r
-    setVisible: function(visible){\r
-        if(visible) {\r
-            this.show();\r
-        }else{\r
-            this.hide();\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    isVisible : function(){\r
-        return this.rendered && this.getActionEl().isVisible();\r
-    },\r
-\r
-    \r
-    cloneConfig : function(overrides){\r
-        overrides = overrides || {};\r
-        var id = overrides.id || Ext.id();\r
-        var cfg = Ext.applyIf(overrides, this.initialConfig);\r
-        cfg.id = id; // prevent dup id\r
-        return new this.constructor(cfg);\r
-    },\r
-\r
-    \r
-    getXType : function(){\r
-        return this.constructor.xtype;\r
-    },\r
-\r
-    \r
-    isXType : function(xtype, shallow){\r
-        //assume a string by default\r
-        if (typeof xtype == 'function'){\r
-            xtype = xtype.xtype; //handle being passed the class, eg. Ext.Component\r
-        }else if (typeof xtype == 'object'){\r
-            xtype = xtype.constructor.xtype; //handle being passed an instance\r
-        }\r
-            \r
-        return !shallow ? ('/' + this.getXTypes() + '/').indexOf('/' + xtype + '/') != -1 : this.constructor.xtype == xtype;\r
-    },\r
-\r
-    \r
-    getXTypes : function(){\r
-        var tc = this.constructor;\r
-        if(!tc.xtypes){\r
-            var c = [], sc = this;\r
-            while(sc && sc.constructor.xtype){\r
-                c.unshift(sc.constructor.xtype);\r
-                sc = sc.constructor.superclass;\r
-            }\r
-            tc.xtypeChain = c;\r
-            tc.xtypes = c.join('/');\r
-        }\r
-        return tc.xtypes;\r
-    },\r
-\r
-    \r
-    findParentBy: function(fn) {\r
-        for (var p = this.ownerCt; (p != null) && !fn(p, this); p = p.ownerCt);\r
-        return p || null;\r
-    },\r
-\r
-    \r
-    findParentByType: function(xtype) {\r
-        return typeof xtype == 'function' ?\r
-            this.findParentBy(function(p){\r
-                return p.constructor === xtype;\r
-            }) :\r
-            this.findParentBy(function(p){\r
-                return p.constructor.xtype === xtype;\r
-            });\r
-    },\r
-\r
-    // internal function for auto removal of assigned event handlers on destruction\r
-    mon : function(item, ename, fn, scope, opt){\r
-        if(!this.mons){\r
-            this.mons = [];\r
-            this.on('beforedestroy', function(){\r
-                for(var i= 0, len = this.mons.length; i < len; i++){\r
-                    var m = this.mons[i];\r
-                    m.item.un(m.ename, m.fn, m.scope);\r
-                }\r
-            }, this);\r
-        }\r
-        this.mons.push({\r
-            item: item, ename: ename, fn: fn, scope: scope\r
-        });\r
-        item.on(ename, fn, scope, opt);\r
-    }\r
-});\r
-\r
-Ext.reg('component', Ext.Component);\r
-\r
-\r
-Ext.Action = function(config){\r
-    this.initialConfig = config;\r
-    this.items = [];\r
-}\r
-\r
-Ext.Action.prototype = {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-    // private\r
-    isAction : true,\r
-\r
-    \r
-    setText : function(text){\r
-        this.initialConfig.text = text;\r
-        this.callEach('setText', [text]);\r
-    },\r
-\r
-    \r
-    getText : function(){\r
-        return this.initialConfig.text;\r
-    },\r
-\r
-    \r
-    setIconClass : function(cls){\r
-        this.initialConfig.iconCls = cls;\r
-        this.callEach('setIconClass', [cls]);\r
-    },\r
-\r
-    \r
-    getIconClass : function(){\r
-        return this.initialConfig.iconCls;\r
-    },\r
-\r
-    \r
-    setDisabled : function(v){\r
-        this.initialConfig.disabled = v;\r
-        this.callEach('setDisabled', [v]);\r
-    },\r
-\r
-    \r
-    enable : function(){\r
-        this.setDisabled(false);\r
-    },\r
-\r
-    \r
-    disable : function(){\r
-        this.setDisabled(true);\r
-    },\r
-\r
-    \r
-    isDisabled : function(){\r
-        return this.initialConfig.disabled;\r
-    },\r
-\r
-    \r
-    setHidden : function(v){\r
-        this.initialConfig.hidden = v;\r
-        this.callEach('setVisible', [!v]);\r
-    },\r
-\r
-    \r
-    show : function(){\r
-        this.setHidden(false);\r
-    },\r
-\r
-    \r
-    hide : function(){\r
-        this.setHidden(true);\r
-    },\r
-\r
-    \r
-    isHidden : function(){\r
-        return this.initialConfig.hidden;\r
-    },\r
-\r
-    \r
-    setHandler : function(fn, scope){\r
-        this.initialConfig.handler = fn;\r
-        this.initialConfig.scope = scope;\r
-        this.callEach('setHandler', [fn, scope]);\r
-    },\r
-\r
-    \r
-    each : function(fn, scope){\r
-        Ext.each(this.items, fn, scope);\r
-    },\r
-\r
-    // private\r
-    callEach : function(fnName, args){\r
-        var cs = this.items;\r
-        for(var i = 0, len = cs.length; i < len; i++){\r
-            cs[i][fnName].apply(cs[i], args);\r
-        }\r
-    },\r
-\r
-    // private\r
-    addComponent : function(comp){\r
-        this.items.push(comp);\r
-        comp.on('destroy', this.removeComponent, this);\r
-    },\r
-\r
-    // private\r
-    removeComponent : function(comp){\r
-        this.items.remove(comp);\r
-    },\r
-\r
-    \r
-    execute : function(){\r
-        this.initialConfig.handler.apply(this.initialConfig.scope || window, arguments);\r
-    }\r
-};\r
-\r
-(function(){\r
-Ext.Layer = function(config, existingEl){\r
-    config = config || {};\r
-    var dh = Ext.DomHelper;\r
-    var cp = config.parentEl, pel = cp ? Ext.getDom(cp) : document.body;\r
-    if(existingEl){\r
-        this.dom = Ext.getDom(existingEl);\r
-    }\r
-    if(!this.dom){\r
-        var o = config.dh || {tag: "div", cls: "x-layer"};\r
-        this.dom = dh.append(pel, o);\r
-    }\r
-    if(config.cls){\r
-        this.addClass(config.cls);\r
-    }\r
-    this.constrain = config.constrain !== false;\r
-    this.visibilityMode = Ext.Element.VISIBILITY;\r
-    if(config.id){\r
-        this.id = this.dom.id = config.id;\r
-    }else{\r
-        this.id = Ext.id(this.dom);\r
-    }\r
-    this.zindex = config.zindex || this.getZIndex();\r
-    this.position("absolute", this.zindex);\r
-    if(config.shadow){\r
-        this.shadowOffset = config.shadowOffset || 4;\r
-        this.shadow = new Ext.Shadow({\r
-            offset : this.shadowOffset,\r
-            mode : config.shadow\r
-        });\r
-    }else{\r
-        this.shadowOffset = 0;\r
-    }\r
-    this.useShim = config.shim !== false && Ext.useShims;\r
-    this.useDisplay = config.useDisplay;\r
-    this.hide();\r
-};\r
-\r
-var supr = Ext.Element.prototype;\r
-\r
-// shims are shared among layer to keep from having 100 iframes\r
-var shims = [];\r
-\r
-Ext.extend(Ext.Layer, Ext.Element, {\r
-\r
-    getZIndex : function(){\r
-        return this.zindex || parseInt(this.getStyle("z-index"), 10) || 11000;\r
-    },\r
-\r
-    getShim : function(){\r
-        if(!this.useShim){\r
-            return null;\r
-        }\r
-        if(this.shim){\r
-            return this.shim;\r
-        }\r
-        var shim = shims.shift();\r
-        if(!shim){\r
-            shim = this.createShim();\r
-            shim.enableDisplayMode('block');\r
-            shim.dom.style.display = 'none';\r
-            shim.dom.style.visibility = 'visible';\r
-        }\r
-        var pn = this.dom.parentNode;\r
-        if(shim.dom.parentNode != pn){\r
-            pn.insertBefore(shim.dom, this.dom);\r
-        }\r
-        shim.setStyle('z-index', this.getZIndex()-2);\r
-        this.shim = shim;\r
-        return shim;\r
-    },\r
-\r
-    hideShim : function(){\r
-        if(this.shim){\r
-            this.shim.setDisplayed(false);\r
-            shims.push(this.shim);\r
-            delete this.shim;\r
-        }\r
-    },\r
-\r
-    disableShadow : function(){\r
-        if(this.shadow){\r
-            this.shadowDisabled = true;\r
-            this.shadow.hide();\r
-            this.lastShadowOffset = this.shadowOffset;\r
-            this.shadowOffset = 0;\r
-        }\r
-    },\r
-\r
-    enableShadow : function(show){\r
-        if(this.shadow){\r
-            this.shadowDisabled = false;\r
-            this.shadowOffset = this.lastShadowOffset;\r
-            delete this.lastShadowOffset;\r
-            if(show){\r
-                this.sync(true);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    // this code can execute repeatedly in milliseconds (i.e. during a drag) so\r
-    // code size was sacrificed for effeciency (e.g. no getBox/setBox, no XY calls)\r
-    sync : function(doShow){\r
-        var sw = this.shadow;\r
-        if(!this.updating && this.isVisible() && (sw || this.useShim)){\r
-            var sh = this.getShim();\r
-\r
-            var w = this.getWidth(),\r
-                h = this.getHeight();\r
-\r
-            var l = this.getLeft(true),\r
-                t = this.getTop(true);\r
-\r
-            if(sw && !this.shadowDisabled){\r
-                if(doShow && !sw.isVisible()){\r
-                    sw.show(this);\r
-                }else{\r
-                    sw.realign(l, t, w, h);\r
-                }\r
-                if(sh){\r
-                    if(doShow){\r
-                       sh.show();\r
-                    }\r
-                    // fit the shim behind the shadow, so it is shimmed too\r
-                    var a = sw.adjusts, s = sh.dom.style;\r
-                    s.left = (Math.min(l, l+a.l))+"px";\r
-                    s.top = (Math.min(t, t+a.t))+"px";\r
-                    s.width = (w+a.w)+"px";\r
-                    s.height = (h+a.h)+"px";\r
-                }\r
-            }else if(sh){\r
-                if(doShow){\r
-                   sh.show();\r
-                }\r
-                sh.setSize(w, h);\r
-                sh.setLeftTop(l, t);\r
-            }\r
-\r
-        }\r
-    },\r
-\r
-    // private\r
-    destroy : function(){\r
-        this.hideShim();\r
-        if(this.shadow){\r
-            this.shadow.hide();\r
-        }\r
-        this.removeAllListeners();\r
-        Ext.removeNode(this.dom);\r
-        Ext.Element.uncache(this.id);\r
-    },\r
-\r
-    remove : function(){\r
-        this.destroy();\r
-    },\r
-\r
-    // private\r
-    beginUpdate : function(){\r
-        this.updating = true;\r
-    },\r
-\r
-    // private\r
-    endUpdate : function(){\r
-        this.updating = false;\r
-        this.sync(true);\r
-    },\r
-\r
-    // private\r
-    hideUnders : function(negOffset){\r
-        if(this.shadow){\r
-            this.shadow.hide();\r
-        }\r
-        this.hideShim();\r
-    },\r
-\r
-    // private\r
-    constrainXY : function(){\r
-        if(this.constrain){\r
-            var vw = Ext.lib.Dom.getViewWidth(),\r
-                vh = Ext.lib.Dom.getViewHeight();\r
-            var s = Ext.getDoc().getScroll();\r
-\r
-            var xy = this.getXY();\r
-            var x = xy[0], y = xy[1];\r
-            var w = this.dom.offsetWidth+this.shadowOffset, h = this.dom.offsetHeight+this.shadowOffset;\r
-            // only move it if it needs it\r
-            var moved = false;\r
-            // first validate right/bottom\r
-            if((x + w) > vw+s.left){\r
-                x = vw - w - this.shadowOffset;\r
-                moved = true;\r
-            }\r
-            if((y + h) > vh+s.top){\r
-                y = vh - h - this.shadowOffset;\r
-                moved = true;\r
-            }\r
-            // then make sure top/left isn't negative\r
-            if(x < s.left){\r
-                x = s.left;\r
-                moved = true;\r
-            }\r
-            if(y < s.top){\r
-                y = s.top;\r
-                moved = true;\r
-            }\r
-            if(moved){\r
-                if(this.avoidY){\r
-                    var ay = this.avoidY;\r
-                    if(y <= ay && (y+h) >= ay){\r
-                        y = ay-h-5;\r
-                    }\r
-                }\r
-                xy = [x, y];\r
-                this.storeXY(xy);\r
-                supr.setXY.call(this, xy);\r
-                this.sync();\r
-            }\r
-        }\r
-    },\r
-\r
-    isVisible : function(){\r
-        return this.visible;\r
-    },\r
-\r
-    // private\r
-    showAction : function(){\r
-        this.visible = true; // track visibility to prevent getStyle calls\r
-        if(this.useDisplay === true){\r
-            this.setDisplayed("");\r
-        }else if(this.lastXY){\r
-            supr.setXY.call(this, this.lastXY);\r
-        }else if(this.lastLT){\r
-            supr.setLeftTop.call(this, this.lastLT[0], this.lastLT[1]);\r
-        }\r
-    },\r
-\r
-    // private\r
-    hideAction : function(){\r
-        this.visible = false;\r
-        if(this.useDisplay === true){\r
-            this.setDisplayed(false);\r
-        }else{\r
-            this.setLeftTop(-10000,-10000);\r
-        }\r
-    },\r
-\r
-    // overridden Element method\r
-    setVisible : function(v, a, d, c, e){\r
-        if(v){\r
-            this.showAction();\r
-        }\r
-        if(a && v){\r
-            var cb = function(){\r
-                this.sync(true);\r
-                if(c){\r
-                    c();\r
-                }\r
-            }.createDelegate(this);\r
-            supr.setVisible.call(this, true, true, d, cb, e);\r
-        }else{\r
-            if(!v){\r
-                this.hideUnders(true);\r
-            }\r
-            var cb = c;\r
-            if(a){\r
-                cb = function(){\r
-                    this.hideAction();\r
-                    if(c){\r
-                        c();\r
-                    }\r
-                }.createDelegate(this);\r
-            }\r
-            supr.setVisible.call(this, v, a, d, cb, e);\r
-            if(v){\r
-                this.sync(true);\r
-            }else if(!a){\r
-                this.hideAction();\r
-            }\r
-        }\r
-    },\r
-\r
-    storeXY : function(xy){\r
-        delete this.lastLT;\r
-        this.lastXY = xy;\r
-    },\r
-\r
-    storeLeftTop : function(left, top){\r
-        delete this.lastXY;\r
-        this.lastLT = [left, top];\r
-    },\r
-\r
-    // private\r
-    beforeFx : function(){\r
-        this.beforeAction();\r
-        return Ext.Layer.superclass.beforeFx.apply(this, arguments);\r
-    },\r
-\r
-    // private\r
-    afterFx : function(){\r
-        Ext.Layer.superclass.afterFx.apply(this, arguments);\r
-        this.sync(this.isVisible());\r
-    },\r
-\r
-    // private\r
-    beforeAction : function(){\r
-        if(!this.updating && this.shadow){\r
-            this.shadow.hide();\r
-        }\r
-    },\r
-\r
-    // overridden Element method\r
-    setLeft : function(left){\r
-        this.storeLeftTop(left, this.getTop(true));\r
-        supr.setLeft.apply(this, arguments);\r
-        this.sync();\r
-    },\r
-\r
-    setTop : function(top){\r
-        this.storeLeftTop(this.getLeft(true), top);\r
-        supr.setTop.apply(this, arguments);\r
-        this.sync();\r
-    },\r
-\r
-    setLeftTop : function(left, top){\r
-        this.storeLeftTop(left, top);\r
-        supr.setLeftTop.apply(this, arguments);\r
-        this.sync();\r
-    },\r
-\r
-    setXY : function(xy, a, d, c, e){\r
-        this.fixDisplay();\r
-        this.beforeAction();\r
-        this.storeXY(xy);\r
-        var cb = this.createCB(c);\r
-        supr.setXY.call(this, xy, a, d, cb, e);\r
-        if(!a){\r
-            cb();\r
-        }\r
-    },\r
-\r
-    // private\r
-    createCB : function(c){\r
-        var el = this;\r
-        return function(){\r
-            el.constrainXY();\r
-            el.sync(true);\r
-            if(c){\r
-                c();\r
-            }\r
-        };\r
-    },\r
-\r
-    // overridden Element method\r
-    setX : function(x, a, d, c, e){\r
-        this.setXY([x, this.getY()], a, d, c, e);\r
-    },\r
-\r
-    // overridden Element method\r
-    setY : function(y, a, d, c, e){\r
-        this.setXY([this.getX(), y], a, d, c, e);\r
-    },\r
-\r
-    // overridden Element method\r
-    setSize : function(w, h, a, d, c, e){\r
-        this.beforeAction();\r
-        var cb = this.createCB(c);\r
-        supr.setSize.call(this, w, h, a, d, cb, e);\r
-        if(!a){\r
-            cb();\r
-        }\r
-    },\r
-\r
-    // overridden Element method\r
-    setWidth : function(w, a, d, c, e){\r
-        this.beforeAction();\r
-        var cb = this.createCB(c);\r
-        supr.setWidth.call(this, w, a, d, cb, e);\r
-        if(!a){\r
-            cb();\r
-        }\r
-    },\r
-\r
-    // overridden Element method\r
-    setHeight : function(h, a, d, c, e){\r
-        this.beforeAction();\r
-        var cb = this.createCB(c);\r
-        supr.setHeight.call(this, h, a, d, cb, e);\r
-        if(!a){\r
-            cb();\r
-        }\r
-    },\r
-\r
-    // overridden Element method\r
-    setBounds : function(x, y, w, h, a, d, c, e){\r
-        this.beforeAction();\r
-        var cb = this.createCB(c);\r
-        if(!a){\r
-            this.storeXY([x, y]);\r
-            supr.setXY.call(this, [x, y]);\r
-            supr.setSize.call(this, w, h, a, d, cb, e);\r
-            cb();\r
-        }else{\r
-            supr.setBounds.call(this, x, y, w, h, a, d, cb, e);\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    setZIndex : function(zindex){\r
-        this.zindex = zindex;\r
-        this.setStyle("z-index", zindex + 2);\r
-        if(this.shadow){\r
-            this.shadow.setZIndex(zindex + 1);\r
-        }\r
-        if(this.shim){\r
-            this.shim.setStyle("z-index", zindex);\r
-        }\r
-    }\r
-});\r
-})();\r
-\r
-Ext.Shadow = function(config){\r
-    Ext.apply(this, config);\r
-    if(typeof this.mode != "string"){\r
-        this.mode = this.defaultMode;\r
-    }\r
-    var o = this.offset, a = {h: 0};\r
-    var rad = Math.floor(this.offset/2);\r
-    switch(this.mode.toLowerCase()){ // all this hideous nonsense calculates the various offsets for shadows\r
-        case "drop":\r
-            a.w = 0;\r
-            a.l = a.t = o;\r
-            a.t -= 1;\r
-            if(Ext.isIE){\r
-                a.l -= this.offset + rad;\r
-                a.t -= this.offset + rad;\r
-                a.w -= rad;\r
-                a.h -= rad;\r
-                a.t += 1;\r
-            }\r
-        break;\r
-        case "sides":\r
-            a.w = (o*2);\r
-            a.l = -o;\r
-            a.t = o-1;\r
-            if(Ext.isIE){\r
-                a.l -= (this.offset - rad);\r
-                a.t -= this.offset + rad;\r
-                a.l += 1;\r
-                a.w -= (this.offset - rad)*2;\r
-                a.w -= rad + 1;\r
-                a.h -= 1;\r
-            }\r
-        break;\r
-        case "frame":\r
-            a.w = a.h = (o*2);\r
-            a.l = a.t = -o;\r
-            a.t += 1;\r
-            a.h -= 2;\r
-            if(Ext.isIE){\r
-                a.l -= (this.offset - rad);\r
-                a.t -= (this.offset - rad);\r
-                a.l += 1;\r
-                a.w -= (this.offset + rad + 1);\r
-                a.h -= (this.offset + rad);\r
-                a.h += 1;\r
-            }\r
-        break;\r
-    };\r
-\r
-    this.adjusts = a;\r
-};\r
-\r
-Ext.Shadow.prototype = {\r
-    \r
-    \r
-    offset: 4,\r
-\r
-    // private\r
-    defaultMode: "drop",\r
-\r
-    \r
-    show : function(target){\r
-        target = Ext.get(target);\r
-        if(!this.el){\r
-            this.el = Ext.Shadow.Pool.pull();\r
-            if(this.el.dom.nextSibling != target.dom){\r
-                this.el.insertBefore(target);\r
-            }\r
-        }\r
-        this.el.setStyle("z-index", this.zIndex || parseInt(target.getStyle("z-index"), 10)-1);\r
-        if(Ext.isIE){\r
-            this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+(this.offset)+")";\r
-        }\r
-        this.realign(\r
-            target.getLeft(true),\r
-            target.getTop(true),\r
-            target.getWidth(),\r
-            target.getHeight()\r
-        );\r
-        this.el.dom.style.display = "block";\r
-    },\r
-\r
-    \r
-    isVisible : function(){\r
-        return this.el ? true : false;  \r
-    },\r
-\r
-    \r
-    realign : function(l, t, w, h){\r
-        if(!this.el){\r
-            return;\r
-        }\r
-        var a = this.adjusts, d = this.el.dom, s = d.style;\r
-        var iea = 0;\r
-        s.left = (l+a.l)+"px";\r
-        s.top = (t+a.t)+"px";\r
-        var sw = (w+a.w), sh = (h+a.h), sws = sw +"px", shs = sh + "px";\r
-        if(s.width != sws || s.height != shs){\r
-            s.width = sws;\r
-            s.height = shs;\r
-            if(!Ext.isIE){\r
-                var cn = d.childNodes;\r
-                var sww = Math.max(0, (sw-12))+"px";\r
-                cn[0].childNodes[1].style.width = sww;\r
-                cn[1].childNodes[1].style.width = sww;\r
-                cn[2].childNodes[1].style.width = sww;\r
-                cn[1].style.height = Math.max(0, (sh-12))+"px";\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    hide : function(){\r
-        if(this.el){\r
-            this.el.dom.style.display = "none";\r
-            Ext.Shadow.Pool.push(this.el);\r
-            delete this.el;\r
-        }\r
-    },\r
-\r
-    \r
-    setZIndex : function(z){\r
-        this.zIndex = z;\r
-        if(this.el){\r
-            this.el.setStyle("z-index", z);\r
-        }\r
-    }\r
-};\r
-\r
-// Private utility class that manages the internal Shadow cache\r
-Ext.Shadow.Pool = function(){\r
-    var p = [];\r
-    var markup = Ext.isIE ?\r
-                 '<div class="x-ie-shadow"></div>' :\r
-                 '<div class="x-shadow"><div class="xst"><div class="xstl"></div><div class="xstc"></div><div class="xstr"></div></div><div class="xsc"><div class="xsml"></div><div class="xsmc"></div><div class="xsmr"></div></div><div class="xsb"><div class="xsbl"></div><div class="xsbc"></div><div class="xsbr"></div></div></div>';\r
-    return {\r
-        pull : function(){\r
-            var sh = p.shift();\r
-            if(!sh){\r
-                sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, markup));\r
-                sh.autoBoxAdjust = false;\r
-            }\r
-            return sh;\r
-        },\r
-\r
-        push : function(sh){\r
-            p.push(sh);\r
-        }\r
-    };\r
-}();\r
-\r
-Ext.BoxComponent = Ext.extend(Ext.Component, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-    \r
-\r
-       // private\r
-    initComponent : function(){\r
-        Ext.BoxComponent.superclass.initComponent.call(this);\r
-        this.addEvents(\r
-            \r
-            'resize',\r
-            \r
-            'move'\r
-        );\r
-    },\r
-\r
-    // private, set in afterRender to signify that the component has been rendered\r
-    boxReady : false,\r
-    // private, used to defer height settings to subclasses\r
-    deferHeight: false,\r
-\r
-    \r
-    setSize : function(w, h){\r
-        // support for standard size objects\r
-        if(typeof w == 'object'){\r
-            h = w.height;\r
-            w = w.width;\r
-        }\r
-        // not rendered\r
-        if(!this.boxReady){\r
-            this.width = w;\r
-            this.height = h;\r
-            return this;\r
-        }\r
-\r
-        // prevent recalcs when not needed\r
-        if(this.lastSize && this.lastSize.width == w && this.lastSize.height == h){\r
-            return this;\r
-        }\r
-        this.lastSize = {width: w, height: h};\r
-        var adj = this.adjustSize(w, h);\r
-        var aw = adj.width, ah = adj.height;\r
-        if(aw !== undefined || ah !== undefined){ // this code is nasty but performs better with floaters\r
-            var rz = this.getResizeEl();\r
-            if(!this.deferHeight && aw !== undefined && ah !== undefined){\r
-                rz.setSize(aw, ah);\r
-            }else if(!this.deferHeight && ah !== undefined){\r
-                rz.setHeight(ah);\r
-            }else if(aw !== undefined){\r
-                rz.setWidth(aw);\r
-            }\r
-            this.onResize(aw, ah, w, h);\r
-            this.fireEvent('resize', this, aw, ah, w, h);\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    setWidth : function(width){\r
-        return this.setSize(width);\r
-    },\r
-\r
-    \r
-    setHeight : function(height){\r
-        return this.setSize(undefined, height);\r
-    },\r
-\r
-    \r
-    getSize : function(){\r
-        return this.el.getSize();\r
-    },\r
-\r
-    \r
-    getPosition : function(local){\r
-        if(local === true){\r
-            return [this.el.getLeft(true), this.el.getTop(true)];\r
-        }\r
-        return this.xy || this.el.getXY();\r
-    },\r
-\r
-    \r
-    getBox : function(local){\r
-        var s = this.el.getSize();\r
-        if(local === true){\r
-            s.x = this.el.getLeft(true);\r
-            s.y = this.el.getTop(true);\r
-        }else{\r
-            var xy = this.xy || this.el.getXY();\r
-            s.x = xy[0];\r
-            s.y = xy[1];\r
-        }\r
-        return s;\r
-    },\r
-\r
-    \r
-    updateBox : function(box){\r
-        this.setSize(box.width, box.height);\r
-        this.setPagePosition(box.x, box.y);\r
-        return this;\r
-    },\r
-\r
-    // protected\r
-    getResizeEl : function(){\r
-        return this.resizeEl || this.el;\r
-    },\r
-\r
-    // protected\r
-    getPositionEl : function(){\r
-        return this.positionEl || this.el;\r
-    },\r
-\r
-    \r
-    setPosition : function(x, y){\r
-        if(x && typeof x[1] == 'number'){\r
-            y = x[1];\r
-            x = x[0];\r
-        }\r
-        this.x = x;\r
-        this.y = y;\r
-        if(!this.boxReady){\r
-            return this;\r
-        }\r
-        var adj = this.adjustPosition(x, y);\r
-        var ax = adj.x, ay = adj.y;\r
-\r
-        var el = this.getPositionEl();\r
-        if(ax !== undefined || ay !== undefined){\r
-            if(ax !== undefined && ay !== undefined){\r
-                el.setLeftTop(ax, ay);\r
-            }else if(ax !== undefined){\r
-                el.setLeft(ax);\r
-            }else if(ay !== undefined){\r
-                el.setTop(ay);\r
-            }\r
-            this.onPosition(ax, ay);\r
-            this.fireEvent('move', this, ax, ay);\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    setPagePosition : function(x, y){\r
-        if(x && typeof x[1] == 'number'){\r
-            y = x[1];\r
-            x = x[0];\r
-        }\r
-        this.pageX = x;\r
-        this.pageY = y;\r
-        if(!this.boxReady){\r
-            return;\r
-        }\r
-        if(x === undefined || y === undefined){ // cannot translate undefined points\r
-            return;\r
-        }\r
-        var p = this.el.translatePoints(x, y);\r
-        this.setPosition(p.left, p.top);\r
-        return this;\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        Ext.BoxComponent.superclass.onRender.call(this, ct, position);\r
-        if(this.resizeEl){\r
-            this.resizeEl = Ext.get(this.resizeEl);\r
-        }\r
-        if(this.positionEl){\r
-            this.positionEl = Ext.get(this.positionEl);\r
-        }\r
-    },\r
-\r
-    // private\r
-    afterRender : function(){\r
-        Ext.BoxComponent.superclass.afterRender.call(this);\r
-        this.boxReady = true;\r
-        this.setSize(this.width, this.height);\r
-        if(this.x || this.y){\r
-            this.setPosition(this.x, this.y);\r
-        }else if(this.pageX || this.pageY){\r
-            this.setPagePosition(this.pageX, this.pageY);\r
-        }\r
-    },\r
-\r
-    \r
-    syncSize : function(){\r
-        delete this.lastSize;\r
-        this.setSize(this.autoWidth ? undefined : this.el.getWidth(), this.autoHeight ? undefined : this.el.getHeight());\r
-        return this;\r
-    },\r
-\r
-    \r
-    onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){\r
-\r
-    },\r
-\r
-    \r
-    onPosition : function(x, y){\r
-\r
-    },\r
-\r
-    // private\r
-    adjustSize : function(w, h){\r
-        if(this.autoWidth){\r
-            w = 'auto';\r
-        }\r
-        if(this.autoHeight){\r
-            h = 'auto';\r
-        }\r
-        return {width : w, height: h};\r
-    },\r
-\r
-    // private\r
-    adjustPosition : function(x, y){\r
-        return {x : x, y: y};\r
-    }\r
-});\r
-Ext.reg('box', Ext.BoxComponent);\r
-\r
-Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){\r
-    \r
-    \r
-    this.el = Ext.get(dragElement, true);\r
-    this.el.dom.unselectable = "on";\r
-    \r
-    this.resizingEl = Ext.get(resizingElement, true);\r
-\r
-    \r
-    this.orientation = orientation || Ext.SplitBar.HORIZONTAL;\r
-    \r
-    \r
-    this.minSize = 0;\r
-    \r
-    \r
-    this.maxSize = 2000;\r
-    \r
-    \r
-    this.animate = false;\r
-    \r
-    \r
-    this.useShim = false;\r
-    \r
-    \r
-    this.shim = null;\r
-    \r
-    if(!existingProxy){\r
-        \r
-        this.proxy = Ext.SplitBar.createProxy(this.orientation);\r
-    }else{\r
-        this.proxy = Ext.get(existingProxy).dom;\r
-    }\r
-    \r
-    this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {dragElId : this.proxy.id});\r
-    \r
-    \r
-    this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this);\r
-    \r
-    \r
-    this.dd.endDrag = this.onEndProxyDrag.createDelegate(this);\r
-    \r
-    \r
-    this.dragSpecs = {};\r
-    \r
-    \r
-    this.adapter = new Ext.SplitBar.BasicLayoutAdapter();\r
-    this.adapter.init(this);\r
-    \r
-    if(this.orientation == Ext.SplitBar.HORIZONTAL){\r
-        \r
-        this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT);\r
-        this.el.addClass("x-splitbar-h");\r
-    }else{\r
-        \r
-        this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM);\r
-        this.el.addClass("x-splitbar-v");\r
-    }\r
-    \r
-    this.addEvents(\r
-        \r
-        "resize",\r
-        \r
-        "moved",\r
-        \r
-        "beforeresize",\r
-\r
-        "beforeapply"\r
-    );\r
-\r
-    Ext.SplitBar.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.SplitBar, Ext.util.Observable, {\r
-    onStartProxyDrag : function(x, y){\r
-        this.fireEvent("beforeresize", this);\r
-        this.overlay =  Ext.DomHelper.append(document.body,  {cls: "x-drag-overlay", html: "&#160;"}, true);\r
-        this.overlay.unselectable();\r
-        this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));\r
-        this.overlay.show();\r
-        Ext.get(this.proxy).setDisplayed("block");\r
-        var size = this.adapter.getElementSize(this);\r
-        this.activeMinSize = this.getMinimumSize();\r
-        this.activeMaxSize = this.getMaximumSize();\r
-        var c1 = size - this.activeMinSize;\r
-        var c2 = Math.max(this.activeMaxSize - size, 0);\r
-        if(this.orientation == Ext.SplitBar.HORIZONTAL){\r
-            this.dd.resetConstraints();\r
-            this.dd.setXConstraint(\r
-                this.placement == Ext.SplitBar.LEFT ? c1 : c2, \r
-                this.placement == Ext.SplitBar.LEFT ? c2 : c1\r
-            );\r
-            this.dd.setYConstraint(0, 0);\r
-        }else{\r
-            this.dd.resetConstraints();\r
-            this.dd.setXConstraint(0, 0);\r
-            this.dd.setYConstraint(\r
-                this.placement == Ext.SplitBar.TOP ? c1 : c2, \r
-                this.placement == Ext.SplitBar.TOP ? c2 : c1\r
-            );\r
-         }\r
-        this.dragSpecs.startSize = size;\r
-        this.dragSpecs.startPoint = [x, y];\r
-        Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, x, y);\r
-    },\r
-    \r
-    \r
-    onEndProxyDrag : function(e){\r
-        Ext.get(this.proxy).setDisplayed(false);\r
-        var endPoint = Ext.lib.Event.getXY(e);\r
-        if(this.overlay){\r
-            Ext.destroy(this.overlay);\r
-            delete this.overlay;\r
-        }\r
-        var newSize;\r
-        if(this.orientation == Ext.SplitBar.HORIZONTAL){\r
-            newSize = this.dragSpecs.startSize + \r
-                (this.placement == Ext.SplitBar.LEFT ?\r
-                    endPoint[0] - this.dragSpecs.startPoint[0] :\r
-                    this.dragSpecs.startPoint[0] - endPoint[0]\r
-                );\r
-        }else{\r
-            newSize = this.dragSpecs.startSize + \r
-                (this.placement == Ext.SplitBar.TOP ?\r
-                    endPoint[1] - this.dragSpecs.startPoint[1] :\r
-                    this.dragSpecs.startPoint[1] - endPoint[1]\r
-                );\r
-        }\r
-        newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize);\r
-        if(newSize != this.dragSpecs.startSize){\r
-            if(this.fireEvent('beforeapply', this, newSize) !== false){\r
-                this.adapter.setElementSize(this, newSize);\r
-                this.fireEvent("moved", this, newSize);\r
-                this.fireEvent("resize", this, newSize);\r
-            }\r
-        }\r
-    },\r
-    \r
-    \r
-    getAdapter : function(){\r
-        return this.adapter;\r
-    },\r
-    \r
-    \r
-    setAdapter : function(adapter){\r
-        this.adapter = adapter;\r
-        this.adapter.init(this);\r
-    },\r
-    \r
-    \r
-    getMinimumSize : function(){\r
-        return this.minSize;\r
-    },\r
-    \r
-    \r
-    setMinimumSize : function(minSize){\r
-        this.minSize = minSize;\r
-    },\r
-    \r
-    \r
-    getMaximumSize : function(){\r
-        return this.maxSize;\r
-    },\r
-    \r
-    \r
-    setMaximumSize : function(maxSize){\r
-        this.maxSize = maxSize;\r
-    },\r
-    \r
-    \r
-    setCurrentSize : function(size){\r
-        var oldAnimate = this.animate;\r
-        this.animate = false;\r
-        this.adapter.setElementSize(this, size);\r
-        this.animate = oldAnimate;\r
-    },\r
-    \r
-    \r
-    destroy : function(removeEl){\r
-        if(this.shim){\r
-            this.shim.remove();\r
-        }\r
-        this.dd.unreg();\r
-        Ext.destroy(Ext.get(this.proxy));\r
-        if(removeEl){\r
-            this.el.remove();\r
-        }\r
-    }\r
-});\r
-\r
-\r
-Ext.SplitBar.createProxy = function(dir){\r
-    var proxy = new Ext.Element(document.createElement("div"));\r
-    proxy.unselectable();\r
-    var cls = 'x-splitbar-proxy';\r
-    proxy.addClass(cls + ' ' + (dir == Ext.SplitBar.HORIZONTAL ? cls +'-h' : cls + '-v'));\r
-    document.body.appendChild(proxy.dom);\r
-    return proxy.dom;\r
-};\r
-\r
-\r
-Ext.SplitBar.BasicLayoutAdapter = function(){\r
-};\r
-\r
-Ext.SplitBar.BasicLayoutAdapter.prototype = {\r
-    // do nothing for now\r
-    init : function(s){\r
-    \r
-    },\r
-    \r
-     getElementSize : function(s){\r
-        if(s.orientation == Ext.SplitBar.HORIZONTAL){\r
-            return s.resizingEl.getWidth();\r
-        }else{\r
-            return s.resizingEl.getHeight();\r
-        }\r
-    },\r
-    \r
-    \r
-    setElementSize : function(s, newSize, onComplete){\r
-        if(s.orientation == Ext.SplitBar.HORIZONTAL){\r
-            if(!s.animate){\r
-                s.resizingEl.setWidth(newSize);\r
-                if(onComplete){\r
-                    onComplete(s, newSize);\r
-                }\r
-            }else{\r
-                s.resizingEl.setWidth(newSize, true, .1, onComplete, 'easeOut');\r
-            }\r
-        }else{\r
-            \r
-            if(!s.animate){\r
-                s.resizingEl.setHeight(newSize);\r
-                if(onComplete){\r
-                    onComplete(s, newSize);\r
-                }\r
-            }else{\r
-                s.resizingEl.setHeight(newSize, true, .1, onComplete, 'easeOut');\r
-            }\r
-        }\r
-    }\r
-};\r
-\r
-\r
-Ext.SplitBar.AbsoluteLayoutAdapter = function(container){\r
-    this.basic = new Ext.SplitBar.BasicLayoutAdapter();\r
-    this.container = Ext.get(container);\r
-};\r
-\r
-Ext.SplitBar.AbsoluteLayoutAdapter.prototype = {\r
-    init : function(s){\r
-        this.basic.init(s);\r
-    },\r
-    \r
-    getElementSize : function(s){\r
-        return this.basic.getElementSize(s);\r
-    },\r
-    \r
-    setElementSize : function(s, newSize, onComplete){\r
-        this.basic.setElementSize(s, newSize, this.moveSplitter.createDelegate(this, [s]));\r
-    },\r
-    \r
-    moveSplitter : function(s){\r
-        var yes = Ext.SplitBar;\r
-        switch(s.placement){\r
-            case yes.LEFT:\r
-                s.el.setX(s.resizingEl.getRight());\r
-                break;\r
-            case yes.RIGHT:\r
-                s.el.setStyle("right", (this.container.getWidth() - s.resizingEl.getLeft()) + "px");\r
-                break;\r
-            case yes.TOP:\r
-                s.el.setY(s.resizingEl.getBottom());\r
-                break;\r
-            case yes.BOTTOM:\r
-                s.el.setY(s.resizingEl.getTop() - s.el.getHeight());\r
-                break;\r
-        }\r
-    }\r
-};\r
-\r
-\r
-Ext.SplitBar.VERTICAL = 1;\r
-\r
-\r
-Ext.SplitBar.HORIZONTAL = 2;\r
-\r
-\r
-Ext.SplitBar.LEFT = 1;\r
-\r
-\r
-Ext.SplitBar.RIGHT = 2;\r
-\r
-\r
-Ext.SplitBar.TOP = 3;\r
-\r
-\r
-Ext.SplitBar.BOTTOM = 4;\r
-\r
-\r
-Ext.Container = Ext.extend(Ext.BoxComponent, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-    \r
-    autoDestroy: true,\r
-    \r
-    \r
-    defaultType: 'panel',\r
-\r
-    // private\r
-    initComponent : function(){\r
-        Ext.Container.superclass.initComponent.call(this);\r
-\r
-        this.addEvents(\r
-            \r
-            'afterlayout',\r
-            \r
-            'beforeadd',\r
-            \r
-            'beforeremove',\r
-            \r
-            'add',\r
-            \r
-            'remove'\r
-        );\r
-\r
-        \r
-        var items = this.items;\r
-        if(items){\r
-            delete this.items;\r
-            if(Ext.isArray(items) && items.length > 0){\r
-                this.add.apply(this, items);\r
-            }else{\r
-                this.add(items);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    initItems : function(){\r
-        if(!this.items){\r
-            this.items = new Ext.util.MixedCollection(false, this.getComponentId);\r
-            this.getLayout(); // initialize the layout\r
-        }\r
-    },\r
-\r
-    // private\r
-    setLayout : function(layout){\r
-        if(this.layout && this.layout != layout){\r
-            this.layout.setContainer(null);\r
-        }\r
-        this.initItems();\r
-        this.layout = layout;\r
-        layout.setContainer(this);\r
-    },\r
-\r
-    // private\r
-    render : function(){\r
-        Ext.Container.superclass.render.apply(this, arguments);\r
-        if(this.layout){\r
-            if(typeof this.layout == 'string'){\r
-                this.layout = new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig);\r
-            }\r
-            this.setLayout(this.layout);\r
-\r
-            if(this.activeItem !== undefined){\r
-                var item = this.activeItem;\r
-                delete this.activeItem;\r
-                this.layout.setActiveItem(item);\r
-                return;\r
-            }\r
-        }\r
-        if(!this.ownerCt){\r
-            this.doLayout();\r
-        }\r
-        if(this.monitorResize === true){\r
-            Ext.EventManager.onWindowResize(this.doLayout, this, [false]);\r
-        }\r
-    },\r
-\r
-    \r
-    getLayoutTarget : function(){\r
-        return this.el;\r
-    },\r
-\r
-    // private - used as the key lookup function for the items collection\r
-    getComponentId : function(comp){\r
-        return comp.itemId || comp.id;\r
-    },\r
-\r
-    \r
-    add : function(comp){\r
-        if(!this.items){\r
-            this.initItems();\r
-        }\r
-        var a = arguments, len = a.length;\r
-        if(len > 1){\r
-            for(var i = 0; i < len; i++) {\r
-                this.add(a[i]);\r
-            }\r
-            return;\r
-        }\r
-        var c = this.lookupComponent(this.applyDefaults(comp));\r
-        var pos = this.items.length;\r
-        if(this.fireEvent('beforeadd', this, c, pos) !== false && this.onBeforeAdd(c) !== false){\r
-            this.items.add(c);\r
-            c.ownerCt = this;\r
-            this.fireEvent('add', this, c, pos);\r
-        }\r
-        return c;\r
-    },\r
-\r
-    \r
-    insert : function(index, comp){\r
-        if(!this.items){\r
-            this.initItems();\r
-        }\r
-        var a = arguments, len = a.length;\r
-        if(len > 2){\r
-            for(var i = len-1; i >= 1; --i) {\r
-                this.insert(index, a[i]);\r
-            }\r
-            return;\r
-        }\r
-        var c = this.lookupComponent(this.applyDefaults(comp));\r
-\r
-        if(c.ownerCt == this && this.items.indexOf(c) < index){\r
-            --index;\r
-        }\r
-\r
-        if(this.fireEvent('beforeadd', this, c, index) !== false && this.onBeforeAdd(c) !== false){\r
-            this.items.insert(index, c);\r
-            c.ownerCt = this;\r
-            this.fireEvent('add', this, c, index);\r
-        }\r
-        return c;\r
-    },\r
-\r
-    // private\r
-    applyDefaults : function(c){\r
-        if(this.defaults){\r
-            if(typeof c == 'string'){\r
-                c = Ext.ComponentMgr.get(c);\r
-                Ext.apply(c, this.defaults);\r
-            }else if(!c.events){\r
-                Ext.applyIf(c, this.defaults);\r
-            }else{\r
-                Ext.apply(c, this.defaults);\r
-            }\r
-        }\r
-        return c;\r
-    },\r
-\r
-    // private\r
-    onBeforeAdd : function(item){\r
-        if(item.ownerCt){\r
-            item.ownerCt.remove(item, false);\r
-        }\r
-        if(this.hideBorders === true){\r
-            item.border = (item.border === true);\r
-        }\r
-    },\r
-\r
-    \r
-    remove : function(comp, autoDestroy){\r
-        var c = this.getComponent(comp);\r
-        if(c && this.fireEvent('beforeremove', this, c) !== false){\r
-            this.items.remove(c);\r
-            delete c.ownerCt;\r
-            if(autoDestroy === true || (autoDestroy !== false && this.autoDestroy)){\r
-                c.destroy();\r
-            }\r
-            if(this.layout && this.layout.activeItem == c){\r
-                delete this.layout.activeItem;\r
-            }\r
-            this.fireEvent('remove', this, c);\r
-        }\r
-        return c;\r
-    },\r
-    \r
-    \r
-    removeAll: function(autoDestroy){\r
-        var item, items = [];\r
-        while((item = this.items.last())){\r
-            items.unshift(this.remove(item, autoDestroy));\r
-        }\r
-        return items;\r
-    },\r
-\r
-    \r
-    getComponent : function(comp){\r
-        if(typeof comp == 'object'){\r
-            return comp;\r
-        }\r
-        return this.items.get(comp);\r
-    },\r
-\r
-    // private\r
-    lookupComponent : function(comp){\r
-        if(typeof comp == 'string'){\r
-            return Ext.ComponentMgr.get(comp);\r
-        }else if(!comp.events){\r
-            return this.createComponent(comp);\r
-        }\r
-        return comp;\r
-    },\r
-\r
-    // private\r
-    createComponent : function(config){\r
-        return Ext.ComponentMgr.create(config, this.defaultType);\r
-    },\r
-\r
-    \r
-    doLayout : function(shallow){\r
-        if(this.rendered && this.layout){\r
-            this.layout.layout();\r
-        }\r
-        if(shallow !== false && this.items){\r
-            var cs = this.items.items;\r
-            for(var i = 0, len = cs.length; i < len; i++) {\r
-                var c  = cs[i];\r
-                if(c.doLayout){\r
-                    c.doLayout();\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    getLayout : function(){\r
-        if(!this.layout){\r
-            var layout = new Ext.layout.ContainerLayout(this.layoutConfig);\r
-            this.setLayout(layout);\r
-        }\r
-        return this.layout;\r
-    },\r
-\r
-    // private\r
-    beforeDestroy : function(){\r
-        if(this.items){\r
-            Ext.destroy.apply(Ext, this.items.items);\r
-        }\r
-        if(this.monitorResize){\r
-            Ext.EventManager.removeResizeListener(this.doLayout, this);\r
-        }\r
-        if (this.layout && this.layout.destroy) {\r
-            this.layout.destroy();\r
-        }\r
-        Ext.Container.superclass.beforeDestroy.call(this);\r
-    },\r
-\r
-    \r
-    bubble : function(fn, scope, args){\r
-        var p = this;\r
-        while(p){\r
-            if(fn.apply(scope || p, args || [p]) === false){\r
-                break;\r
-            }\r
-            p = p.ownerCt;\r
-        }\r
-    },\r
-\r
-    \r
-    cascade : function(fn, scope, args){\r
-        if(fn.apply(scope || this, args || [this]) !== false){\r
-            if(this.items){\r
-                var cs = this.items.items;\r
-                for(var i = 0, len = cs.length; i < len; i++){\r
-                    if(cs[i].cascade){\r
-                        cs[i].cascade(fn, scope, args);\r
-                    }else{\r
-                        fn.apply(scope || cs[i], args || [cs[i]]);\r
-                    }\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    findById : function(id){\r
-        var m, ct = this;\r
-        this.cascade(function(c){\r
-            if(ct != c && c.id === id){\r
-                m = c;\r
-                return false;\r
-            }\r
-        });\r
-        return m || null;\r
-    },\r
-\r
-    \r
-    findByType : function(xtype, shallow){\r
-        return this.findBy(function(c){\r
-            return c.isXType(xtype, shallow);\r
-        });\r
-    },\r
-\r
-    \r
-    find : function(prop, value){\r
-        return this.findBy(function(c){\r
-            return c[prop] === value;\r
-        });\r
-    },\r
-\r
-    \r
-    findBy : function(fn, scope){\r
-        var m = [], ct = this;\r
-        this.cascade(function(c){\r
-            if(ct != c && fn.call(scope || c, c, ct) === true){\r
-                m.push(c);\r
-            }\r
-        });\r
-        return m;\r
-    }\r
-});\r
-\r
-Ext.Container.LAYOUTS = {};\r
-Ext.reg('container', Ext.Container);\r
-\r
-Ext.layout.ContainerLayout = function(config){\r
-    Ext.apply(this, config);\r
-};\r
-\r
-Ext.layout.ContainerLayout.prototype = {\r
-    \r
-    \r
-\r
-    \r
-\r
-    // private\r
-    monitorResize:false,\r
-    // private\r
-    activeItem : null,\r
-\r
-    // private\r
-    layout : function(){\r
-        var target = this.container.getLayoutTarget();\r
-        this.onLayout(this.container, target);\r
-        this.container.fireEvent('afterlayout', this.container, this);\r
-    },\r
-\r
-    // private\r
-    onLayout : function(ct, target){\r
-        this.renderAll(ct, target);\r
-    },\r
-\r
-    // private\r
-    isValidParent : function(c, target){\r
-               var el = c.getPositionEl ? c.getPositionEl() : c.getEl();\r
-               return el.dom.parentNode == target.dom;\r
-    },\r
-\r
-    // private\r
-    renderAll : function(ct, target){\r
-        var items = ct.items.items;\r
-        for(var i = 0, len = items.length; i < len; i++) {\r
-            var c = items[i];\r
-            if(c && (!c.rendered || !this.isValidParent(c, target))){\r
-                this.renderItem(c, i, target);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    renderItem : function(c, position, target){\r
-        if(c && !c.rendered){\r
-            c.render(target, position);\r
-            if(this.extraCls){\r
-               var t = c.getPositionEl ? c.getPositionEl() : c;\r
-               t.addClass(this.extraCls);\r
-            }\r
-            if (this.renderHidden && c != this.activeItem) {\r
-                c.hide();\r
-            }\r
-        }else if(c && !this.isValidParent(c, target)){\r
-            if(this.extraCls){\r
-                var t = c.getPositionEl ? c.getPositionEl() : c;\r
-               t.addClass(this.extraCls);\r
-            }\r
-            if(typeof position == 'number'){\r
-                position = target.dom.childNodes[position];\r
-            }\r
-            target.dom.insertBefore(c.getEl().dom, position || null);\r
-            if (this.renderHidden && c != this.activeItem) {\r
-                c.hide();\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    onResize: function(){\r
-        if(this.container.collapsed){\r
-            return;\r
-        }\r
-        var b = this.container.bufferResize;\r
-        if(b){\r
-            if(!this.resizeTask){\r
-                this.resizeTask = new Ext.util.DelayedTask(this.layout, this);\r
-                this.resizeBuffer = typeof b == 'number' ? b : 100;\r
-            }\r
-            this.resizeTask.delay(this.resizeBuffer);\r
-        }else{\r
-            this.layout();\r
-        }\r
-    },\r
-\r
-    // private\r
-    setContainer : function(ct){\r
-        if(this.monitorResize && ct != this.container){\r
-            if(this.container){\r
-                this.container.un('resize', this.onResize, this);\r
-            }\r
-            if(ct){\r
-                ct.on('resize', this.onResize, this);\r
-            }\r
-        }\r
-        this.container = ct;\r
-    },\r
-\r
-    // private\r
-    parseMargins : function(v){\r
-        var ms = v.split(' ');\r
-        var len = ms.length;\r
-        if(len == 1){\r
-            ms[1] = ms[0];\r
-            ms[2] = ms[0];\r
-            ms[3] = ms[0];\r
-        }\r
-        if(len == 2){\r
-            ms[2] = ms[0];\r
-            ms[3] = ms[1];\r
-        }\r
-        return {\r
-            top:parseInt(ms[0], 10) || 0,\r
-            right:parseInt(ms[1], 10) || 0,\r
-            bottom:parseInt(ms[2], 10) || 0,\r
-            left:parseInt(ms[3], 10) || 0\r
-        };\r
-    },\r
-\r
-    \r
-    destroy : Ext.emptyFn\r
-};\r
-Ext.Container.LAYOUTS['auto'] = Ext.layout.ContainerLayout;\r
-\r
-Ext.layout.FitLayout = Ext.extend(Ext.layout.ContainerLayout, {\r
-    // private\r
-    monitorResize:true,\r
-\r
-    // private\r
-    onLayout : function(ct, target){\r
-        Ext.layout.FitLayout.superclass.onLayout.call(this, ct, target);\r
-        if(!this.container.collapsed){\r
-            this.setItemSize(this.activeItem || ct.items.itemAt(0), target.getStyleSize());\r
-        }\r
-    },\r
-\r
-    // private\r
-    setItemSize : function(item, size){\r
-        if(item && size.height > 0){ // display none?\r
-            item.setSize(size);\r
-        }\r
-    }\r
-});\r
-Ext.Container.LAYOUTS['fit'] = Ext.layout.FitLayout;\r
-\r
-Ext.layout.CardLayout = Ext.extend(Ext.layout.FitLayout, {\r
-    \r
-    deferredRender : false,\r
-\r
-    // private\r
-    renderHidden : true,\r
-\r
-    \r
-    setActiveItem : function(item){\r
-        item = this.container.getComponent(item);\r
-        if(this.activeItem != item){\r
-            if(this.activeItem){\r
-                this.activeItem.hide();\r
-            }\r
-            this.activeItem = item;\r
-            item.show();\r
-            this.layout();\r
-        }\r
-    },\r
-\r
-    // private\r
-    renderAll : function(ct, target){\r
-        if(this.deferredRender){\r
-            this.renderItem(this.activeItem, undefined, target);\r
-        }else{\r
-            Ext.layout.CardLayout.superclass.renderAll.call(this, ct, target);\r
-        }\r
-    }\r
-});\r
-Ext.Container.LAYOUTS['card'] = Ext.layout.CardLayout;\r
-\r
-Ext.layout.AnchorLayout = Ext.extend(Ext.layout.ContainerLayout, {\r
-    // private\r
-    monitorResize:true,\r
-\r
-    // private\r
-    getAnchorViewSize : function(ct, target){\r
-        return target.dom == document.body ?\r
-                   target.getViewSize() : target.getStyleSize();\r
-    },\r
-\r
-    // private\r
-    onLayout : function(ct, target){\r
-        Ext.layout.AnchorLayout.superclass.onLayout.call(this, ct, target);\r
-\r
-        var size = this.getAnchorViewSize(ct, target);\r
-\r
-        var w = size.width, h = size.height;\r
-\r
-        if(w < 20 || h < 20){\r
-            return;\r
-        }\r
-\r
-        // find the container anchoring size\r
-        var aw, ah;\r
-        if(ct.anchorSize){\r
-            if(typeof ct.anchorSize == 'number'){\r
-                aw = ct.anchorSize;\r
-            }else{\r
-                aw = ct.anchorSize.width;\r
-                ah = ct.anchorSize.height;\r
-            }\r
-        }else{\r
-            aw = ct.initialConfig.width;\r
-            ah = ct.initialConfig.height;\r
-        }\r
-\r
-        var cs = ct.items.items, len = cs.length, i, c, a, cw, ch;\r
-        for(i = 0; i < len; i++){\r
-            c = cs[i];\r
-            if(c.anchor){\r
-                a = c.anchorSpec;\r
-                if(!a){ // cache all anchor values\r
-                    var vs = c.anchor.split(' ');\r
-                    c.anchorSpec = a = {\r
-                        right: this.parseAnchor(vs[0], c.initialConfig.width, aw),\r
-                        bottom: this.parseAnchor(vs[1], c.initialConfig.height, ah)\r
-                    };\r
-                }\r
-                cw = a.right ? this.adjustWidthAnchor(a.right(w), c) : undefined;\r
-                ch = a.bottom ? this.adjustHeightAnchor(a.bottom(h), c) : undefined;\r
-\r
-                if(cw || ch){\r
-                    c.setSize(cw || undefined, ch || undefined);\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    parseAnchor : function(a, start, cstart){\r
-        if(a && a != 'none'){\r
-            var last;\r
-            if(/^(r|right|b|bottom)$/i.test(a)){   // standard anchor\r
-                var diff = cstart - start;\r
-                return function(v){\r
-                    if(v !== last){\r
-                        last = v;\r
-                        return v - diff;\r
-                    }\r
-                }\r
-            }else if(a.indexOf('%') != -1){\r
-                var ratio = parseFloat(a.replace('%', ''))*.01;   // percentage\r
-                return function(v){\r
-                    if(v !== last){\r
-                        last = v;\r
-                        return Math.floor(v*ratio);\r
-                    }\r
-                }\r
-            }else{\r
-                a = parseInt(a, 10);\r
-                if(!isNaN(a)){                            // simple offset adjustment\r
-                    return function(v){\r
-                        if(v !== last){\r
-                            last = v;\r
-                            return v + a;\r
-                        }\r
-                    }\r
-                }\r
-            }\r
-        }\r
-        return false;\r
-    },\r
-\r
-    // private\r
-    adjustWidthAnchor : function(value, comp){\r
-        return value;\r
-    },\r
-\r
-    // private\r
-    adjustHeightAnchor : function(value, comp){\r
-        return value;\r
-    }\r
-    \r
-    \r
-});\r
-Ext.Container.LAYOUTS['anchor'] = Ext.layout.AnchorLayout;\r
-\r
-Ext.layout.ColumnLayout = Ext.extend(Ext.layout.ContainerLayout, {\r
-    // private\r
-    monitorResize:true,\r
-    \r
-    \r
-    extraCls: 'x-column',\r
-\r
-    scrollOffset : 0,\r
-\r
-    // private\r
-    isValidParent : function(c, target){\r
-        return (c.getPositionEl ? c.getPositionEl() : c.getEl()).dom.parentNode == this.innerCt.dom;\r
-    },\r
-\r
-    // private\r
-    onLayout : function(ct, target){\r
-        var cs = ct.items.items, len = cs.length, c, i;\r
-\r
-        if(!this.innerCt){\r
-            target.addClass('x-column-layout-ct');\r
-\r
-            // the innerCt prevents wrapping and shuffling while\r
-            // the container is resizing\r
-            this.innerCt = target.createChild({cls:'x-column-inner'});\r
-            this.innerCt.createChild({cls:'x-clear'});\r
-        }\r
-        this.renderAll(ct, this.innerCt);\r
-\r
-        var size = Ext.isIE && target.dom != Ext.getBody().dom ? target.getStyleSize() : target.getViewSize();\r
-\r
-        if(size.width < 1 && size.height < 1){ // display none?\r
-            return;\r
-        }\r
-\r
-        var w = size.width - target.getPadding('lr') - this.scrollOffset,\r
-            h = size.height - target.getPadding('tb'),\r
-            pw = w;\r
-\r
-        this.innerCt.setWidth(w);\r
-        \r
-        // some columns can be percentages while others are fixed\r
-        // so we need to make 2 passes\r
-\r
-        for(i = 0; i < len; i++){\r
-            c = cs[i];\r
-            if(!c.columnWidth){\r
-                pw -= (c.getSize().width + c.getEl().getMargins('lr'));\r
-            }\r
-        }\r
-\r
-        pw = pw < 0 ? 0 : pw;\r
-\r
-        for(i = 0; i < len; i++){\r
-            c = cs[i];\r
-            if(c.columnWidth){\r
-                c.setSize(Math.floor(c.columnWidth*pw) - c.getEl().getMargins('lr'));\r
-            }\r
-        }\r
-    }\r
-    \r
-    \r
-});\r
-\r
-Ext.Container.LAYOUTS['column'] = Ext.layout.ColumnLayout;\r
-\r
-Ext.layout.BorderLayout = Ext.extend(Ext.layout.ContainerLayout, {\r
-    // private\r
-    monitorResize:true,\r
-    // private\r
-    rendered : false,\r
-\r
-    // private\r
-    onLayout : function(ct, target){\r
-        var collapsed;\r
-        if(!this.rendered){\r
-            target.position();\r
-            target.addClass('x-border-layout-ct');\r
-            var items = ct.items.items;\r
-            collapsed = [];\r
-            for(var i = 0, len = items.length; i < len; i++) {\r
-                var c = items[i];\r
-                var pos = c.region;\r
-                if(c.collapsed){\r
-                    collapsed.push(c);\r
-                }\r
-                c.collapsed = false;\r
-                if(!c.rendered){\r
-                    c.cls = c.cls ? c.cls +' x-border-panel' : 'x-border-panel';\r
-                    c.render(target, i);\r
-                }\r
-                this[pos] = pos != 'center' && c.split ?\r
-                    new Ext.layout.BorderLayout.SplitRegion(this, c.initialConfig, pos) :\r
-                    new Ext.layout.BorderLayout.Region(this, c.initialConfig, pos);\r
-                this[pos].render(target, c);\r
-            }\r
-            this.rendered = true;\r
-        }\r
-\r
-        var size = target.getViewSize();\r
-        if(size.width < 20 || size.height < 20){ // display none?\r
-            if(collapsed){\r
-                this.restoreCollapsed = collapsed;\r
-            }\r
-            return;\r
-        }else if(this.restoreCollapsed){\r
-            collapsed = this.restoreCollapsed;\r
-            delete this.restoreCollapsed;\r
-        }\r
-\r
-        var w = size.width, h = size.height;\r
-        var centerW = w, centerH = h, centerY = 0, centerX = 0;\r
-\r
-        var n = this.north, s = this.south, west = this.west, e = this.east, c = this.center;\r
-        if(!c && Ext.layout.BorderLayout.WARN !== false){\r
-            throw 'No center region defined in BorderLayout ' + ct.id;\r
-        }\r
-\r
-        if(n && n.isVisible()){\r
-            var b = n.getSize();\r
-            var m = n.getMargins();\r
-            b.width = w - (m.left+m.right);\r
-            b.x = m.left;\r
-            b.y = m.top;\r
-            centerY = b.height + b.y + m.bottom;\r
-            centerH -= centerY;\r
-            n.applyLayout(b);\r
-        }\r
-        if(s && s.isVisible()){\r
-            var b = s.getSize();\r
-            var m = s.getMargins();\r
-            b.width = w - (m.left+m.right);\r
-            b.x = m.left;\r
-            var totalHeight = (b.height + m.top + m.bottom);\r
-            b.y = h - totalHeight + m.top;\r
-            centerH -= totalHeight;\r
-            s.applyLayout(b);\r
-        }\r
-        if(west && west.isVisible()){\r
-            var b = west.getSize();\r
-            var m = west.getMargins();\r
-            b.height = centerH - (m.top+m.bottom);\r
-            b.x = m.left;\r
-            b.y = centerY + m.top;\r
-            var totalWidth = (b.width + m.left + m.right);\r
-            centerX += totalWidth;\r
-            centerW -= totalWidth;\r
-            west.applyLayout(b);\r
-        }\r
-        if(e && e.isVisible()){\r
-            var b = e.getSize();\r
-            var m = e.getMargins();\r
-            b.height = centerH - (m.top+m.bottom);\r
-            var totalWidth = (b.width + m.left + m.right);\r
-            b.x = w - totalWidth + m.left;\r
-            b.y = centerY + m.top;\r
-            centerW -= totalWidth;\r
-            e.applyLayout(b);\r
-        }\r
-\r
-        if(c){\r
-            var m = c.getMargins();\r
-            var centerBox = {\r
-                x: centerX + m.left,\r
-                y: centerY + m.top,\r
-                width: centerW - (m.left+m.right),\r
-                height: centerH - (m.top+m.bottom)\r
-            };\r
-            c.applyLayout(centerBox);\r
-        }\r
-        if(collapsed){\r
-            for(var i = 0, len = collapsed.length; i < len; i++){\r
-                collapsed[i].collapse(false);\r
-            }\r
-        }\r
-\r
-        if(Ext.isIE && Ext.isStrict){ // workaround IE strict repainting issue\r
-            target.repaint();\r
-        }\r
-    },\r
-\r
-    // inherit docs\r
-    destroy: function() {\r
-        var r = ['north', 'south', 'east', 'west'];\r
-        for (var i = 0; i < r.length; i++) {\r
-            var region = this[r[i]];\r
-            if(region){\r
-                if(region.destroy){\r
-                       region.destroy();\r
-                   }else if (region.split){\r
-                       region.split.destroy(true);\r
-                   }\r
-            }\r
-        }\r
-        Ext.layout.BorderLayout.superclass.destroy.call(this);\r
-    }\r
-    \r
-    \r
-});\r
-\r
-\r
-Ext.layout.BorderLayout.Region = function(layout, config, pos){\r
-    Ext.apply(this, config);\r
-    this.layout = layout;\r
-    this.position = pos;\r
-    this.state = {};\r
-    if(typeof this.margins == 'string'){\r
-        this.margins = this.layout.parseMargins(this.margins);\r
-    }\r
-    this.margins = Ext.applyIf(this.margins || {}, this.defaultMargins);\r
-    if(this.collapsible){\r
-        if(typeof this.cmargins == 'string'){\r
-            this.cmargins = this.layout.parseMargins(this.cmargins);\r
-        }\r
-        if(this.collapseMode == 'mini' && !this.cmargins){\r
-            this.cmargins = {left:0,top:0,right:0,bottom:0};\r
-        }else{\r
-            this.cmargins = Ext.applyIf(this.cmargins || {},\r
-                pos == 'north' || pos == 'south' ? this.defaultNSCMargins : this.defaultEWCMargins);\r
-        }\r
-    }\r
-};\r
-\r
-Ext.layout.BorderLayout.Region.prototype = {\r
-    \r
-    \r
-       \r
-    \r
-    \r
-    \r
-    \r
-    collapsible : false,\r
-    \r
-    split:false,\r
-    \r
-    floatable: true,\r
-    \r
-    minWidth:50,\r
-    \r
-    minHeight:50,\r
-\r
-    // private\r
-    defaultMargins : {left:0,top:0,right:0,bottom:0},\r
-    // private\r
-    defaultNSCMargins : {left:5,top:5,right:5,bottom:5},\r
-    // private\r
-    defaultEWCMargins : {left:5,top:0,right:5,bottom:0},\r
-\r
-    \r
-    isCollapsed : false,\r
-\r
-    \r
-    \r
-    \r
-\r
-    // private\r
-    render : function(ct, p){\r
-        this.panel = p;\r
-        p.el.enableDisplayMode();\r
-        this.targetEl = ct;\r
-        this.el = p.el;\r
-\r
-        var gs = p.getState, ps = this.position;\r
-        p.getState = function(){\r
-            return Ext.apply(gs.call(p) || {}, this.state);\r
-        }.createDelegate(this);\r
-\r
-        if(ps != 'center'){\r
-            p.allowQueuedExpand = false;\r
-            p.on({\r
-                beforecollapse: this.beforeCollapse,\r
-                collapse: this.onCollapse,\r
-                beforeexpand: this.beforeExpand,\r
-                expand: this.onExpand,\r
-                hide: this.onHide,\r
-                show: this.onShow,\r
-                scope: this\r
-            });\r
-            if(this.collapsible){\r
-                p.collapseEl = 'el';\r
-                p.slideAnchor = this.getSlideAnchor();\r
-            }\r
-            if(p.tools && p.tools.toggle){\r
-                p.tools.toggle.addClass('x-tool-collapse-'+ps);\r
-                p.tools.toggle.addClassOnOver('x-tool-collapse-'+ps+'-over');\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    getCollapsedEl : function(){\r
-        if(!this.collapsedEl){\r
-            if(!this.toolTemplate){\r
-                var tt = new Ext.Template(\r
-                     '<div class="x-tool x-tool-{id}">&#160;</div>'\r
-                );\r
-                tt.disableFormats = true;\r
-                tt.compile();\r
-                Ext.layout.BorderLayout.Region.prototype.toolTemplate = tt;\r
-            }\r
-            this.collapsedEl = this.targetEl.createChild({\r
-                cls: "x-layout-collapsed x-layout-collapsed-"+this.position,\r
-                id: this.panel.id + '-xcollapsed'\r
-            });\r
-            this.collapsedEl.enableDisplayMode('block');\r
-\r
-            if(this.collapseMode == 'mini'){\r
-                this.collapsedEl.addClass('x-layout-cmini-'+this.position);\r
-                this.miniCollapsedEl = this.collapsedEl.createChild({\r
-                    cls: "x-layout-mini x-layout-mini-"+this.position, html: "&#160;"\r
-                });\r
-                this.miniCollapsedEl.addClassOnOver('x-layout-mini-over');\r
-                this.collapsedEl.addClassOnOver("x-layout-collapsed-over");\r
-                this.collapsedEl.on('click', this.onExpandClick, this, {stopEvent:true});\r
-            }else {\r
-                var t = this.toolTemplate.append(\r
-                        this.collapsedEl.dom,\r
-                        {id:'expand-'+this.position}, true);\r
-                t.addClassOnOver('x-tool-expand-'+this.position+'-over');\r
-                t.on('click', this.onExpandClick, this, {stopEvent:true});\r
-                \r
-                if(this.floatable !== false){\r
-                   this.collapsedEl.addClassOnOver("x-layout-collapsed-over");\r
-                   this.collapsedEl.on("click", this.collapseClick, this);\r
-                }\r
-            }\r
-        }\r
-        return this.collapsedEl;\r
-    },\r
-\r
-    // private\r
-    onExpandClick : function(e){\r
-        if(this.isSlid){\r
-            this.afterSlideIn();\r
-            this.panel.expand(false);\r
-        }else{\r
-            this.panel.expand();\r
-        }\r
-    },\r
-\r
-    // private\r
-    onCollapseClick : function(e){\r
-        this.panel.collapse();\r
-    },\r
-\r
-    // private\r
-    beforeCollapse : function(p, animate){\r
-        this.lastAnim = animate;\r
-        if(this.splitEl){\r
-            this.splitEl.hide();\r
-        }\r
-        this.getCollapsedEl().show();\r
-        this.panel.el.setStyle('z-index', 100);\r
-        this.isCollapsed = true;\r
-        this.layout.layout();\r
-    },\r
-\r
-    // private\r
-    onCollapse : function(animate){\r
-        this.panel.el.setStyle('z-index', 1);\r
-        if(this.lastAnim === false || this.panel.animCollapse === false){\r
-            this.getCollapsedEl().dom.style.visibility = 'visible';\r
-        }else{\r
-            this.getCollapsedEl().slideIn(this.panel.slideAnchor, {duration:.2});\r
-        }\r
-        this.state.collapsed = true;\r
-        this.panel.saveState();\r
-    },\r
-\r
-    // private\r
-    beforeExpand : function(animate){\r
-        var c = this.getCollapsedEl();\r
-        this.el.show();\r
-        if(this.position == 'east' || this.position == 'west'){\r
-            this.panel.setSize(undefined, c.getHeight());\r
-        }else{\r
-            this.panel.setSize(c.getWidth(), undefined);\r
-        }\r
-        c.hide();\r
-        c.dom.style.visibility = 'hidden';\r
-        this.panel.el.setStyle('z-index', 100);\r
-    },\r
-\r
-    // private\r
-    onExpand : function(){\r
-        this.isCollapsed = false;\r
-        if(this.splitEl){\r
-            this.splitEl.show();\r
-        }\r
-        this.layout.layout();\r
-        this.panel.el.setStyle('z-index', 1);\r
-        this.state.collapsed = false;\r
-        this.panel.saveState();\r
-    },\r
-\r
-    // private\r
-    collapseClick : function(e){\r
-        if(this.isSlid){\r
-           e.stopPropagation();\r
-           this.slideIn();\r
-        }else{\r
-           e.stopPropagation();\r
-           this.slideOut();\r
-        }\r
-    },\r
-\r
-    // private\r
-    onHide : function(){\r
-        if(this.isCollapsed){\r
-            this.getCollapsedEl().hide();\r
-        }else if(this.splitEl){\r
-            this.splitEl.hide();\r
-        }\r
-    },\r
-\r
-    // private\r
-    onShow : function(){\r
-        if(this.isCollapsed){\r
-            this.getCollapsedEl().show();\r
-        }else if(this.splitEl){\r
-            this.splitEl.show();\r
-        }\r
-    },\r
-\r
-    \r
-    isVisible : function(){\r
-        return !this.panel.hidden;\r
-    },\r
-\r
-    \r
-    getMargins : function(){\r
-        return this.isCollapsed && this.cmargins ? this.cmargins : this.margins;\r
-    },\r
-\r
-    \r
-    getSize : function(){\r
-        return this.isCollapsed ? this.getCollapsedEl().getSize() : this.panel.getSize();\r
-    },\r
-\r
-    \r
-    setPanel : function(panel){\r
-        this.panel = panel;\r
-    },\r
-\r
-    \r
-    getMinWidth: function(){\r
-        return this.minWidth;\r
-    },\r
-\r
-    \r
-    getMinHeight: function(){\r
-        return this.minHeight;\r
-    },\r
-\r
-    // private\r
-    applyLayoutCollapsed : function(box){\r
-        var ce = this.getCollapsedEl();\r
-        ce.setLeftTop(box.x, box.y);\r
-        ce.setSize(box.width, box.height);\r
-    },\r
-\r
-    // private\r
-    applyLayout : function(box){\r
-        if(this.isCollapsed){\r
-            this.applyLayoutCollapsed(box);\r
-        }else{\r
-            this.panel.setPosition(box.x, box.y);\r
-            this.panel.setSize(box.width, box.height);\r
-        }\r
-    },\r
-\r
-    // private\r
-    beforeSlide: function(){\r
-        this.panel.beforeEffect();\r
-    },\r
-\r
-    // private\r
-    afterSlide : function(){\r
-        this.panel.afterEffect();\r
-    },\r
-\r
-    // private\r
-    initAutoHide : function(){\r
-        if(this.autoHide !== false){\r
-            if(!this.autoHideHd){\r
-                var st = new Ext.util.DelayedTask(this.slideIn, this);\r
-                this.autoHideHd = {\r
-                    "mouseout": function(e){\r
-                        if(!e.within(this.el, true)){\r
-                            st.delay(500);\r
-                        }\r
-                    },\r
-                    "mouseover" : function(e){\r
-                        st.cancel();\r
-                    },\r
-                    scope : this\r
-                };\r
-            }\r
-            this.el.on(this.autoHideHd);\r
-        }\r
-    },\r
-\r
-    // private\r
-    clearAutoHide : function(){\r
-        if(this.autoHide !== false){\r
-            this.el.un("mouseout", this.autoHideHd.mouseout);\r
-            this.el.un("mouseover", this.autoHideHd.mouseover);\r
-        }\r
-    },\r
-\r
-    // private\r
-    clearMonitor : function(){\r
-        Ext.getDoc().un("click", this.slideInIf, this);\r
-    },\r
-\r
-    // these names are backwards but not changed for compat\r
-    // private\r
-    slideOut : function(){\r
-        if(this.isSlid || this.el.hasActiveFx()){\r
-            return;\r
-        }\r
-        this.isSlid = true;\r
-        var ts = this.panel.tools;\r
-        if(ts && ts.toggle){\r
-            ts.toggle.hide();\r
-        }\r
-        this.el.show();\r
-        if(this.position == 'east' || this.position == 'west'){\r
-            this.panel.setSize(undefined, this.collapsedEl.getHeight());\r
-        }else{\r
-            this.panel.setSize(this.collapsedEl.getWidth(), undefined);\r
-        }\r
-        this.restoreLT = [this.el.dom.style.left, this.el.dom.style.top];\r
-        this.el.alignTo(this.collapsedEl, this.getCollapseAnchor());\r
-        this.el.setStyle("z-index", 102);\r
-        this.panel.el.replaceClass('x-panel-collapsed', 'x-panel-floating');\r
-        if(this.animFloat !== false){\r
-            this.beforeSlide();\r
-            this.el.slideIn(this.getSlideAnchor(), {\r
-                callback: function(){\r
-                    this.afterSlide();\r
-                    this.initAutoHide();\r
-                    Ext.getDoc().on("click", this.slideInIf, this);\r
-                },\r
-                scope: this,\r
-                block: true\r
-            });\r
-        }else{\r
-            this.initAutoHide();\r
-             Ext.getDoc().on("click", this.slideInIf, this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    afterSlideIn : function(){\r
-        this.clearAutoHide();\r
-        this.isSlid = false;\r
-        this.clearMonitor();\r
-        this.el.setStyle("z-index", "");\r
-        this.panel.el.replaceClass('x-panel-floating', 'x-panel-collapsed');\r
-        this.el.dom.style.left = this.restoreLT[0];\r
-        this.el.dom.style.top = this.restoreLT[1];\r
-\r
-        var ts = this.panel.tools;\r
-        if(ts && ts.toggle){\r
-            ts.toggle.show();\r
-        }\r
-    },\r
-\r
-    // private\r
-    slideIn : function(cb){\r
-        if(!this.isSlid || this.el.hasActiveFx()){\r
-            Ext.callback(cb);\r
-            return;\r
-        }\r
-        this.isSlid = false;\r
-        if(this.animFloat !== false){\r
-            this.beforeSlide();\r
-            this.el.slideOut(this.getSlideAnchor(), {\r
-                callback: function(){\r
-                    this.el.hide();\r
-                    this.afterSlide();\r
-                    this.afterSlideIn();\r
-                    Ext.callback(cb);\r
-                },\r
-                scope: this,\r
-                block: true\r
-            });\r
-        }else{\r
-            this.el.hide();\r
-            this.afterSlideIn();\r
-        }\r
-    },\r
-\r
-    // private\r
-    slideInIf : function(e){\r
-        if(!e.within(this.el)){\r
-            this.slideIn();\r
-        }\r
-    },\r
-\r
-    // private\r
-    anchors : {\r
-        "west" : "left",\r
-        "east" : "right",\r
-        "north" : "top",\r
-        "south" : "bottom"\r
-    },\r
-\r
-    // private\r
-    sanchors : {\r
-        "west" : "l",\r
-        "east" : "r",\r
-        "north" : "t",\r
-        "south" : "b"\r
-    },\r
-\r
-    // private\r
-    canchors : {\r
-        "west" : "tl-tr",\r
-        "east" : "tr-tl",\r
-        "north" : "tl-bl",\r
-        "south" : "bl-tl"\r
-    },\r
-\r
-    // private\r
-    getAnchor : function(){\r
-        return this.anchors[this.position];\r
-    },\r
-\r
-    // private\r
-    getCollapseAnchor : function(){\r
-        return this.canchors[this.position];\r
-    },\r
-\r
-    // private\r
-    getSlideAnchor : function(){\r
-        return this.sanchors[this.position];\r
-    },\r
-\r
-    // private\r
-    getAlignAdj : function(){\r
-        var cm = this.cmargins;\r
-        switch(this.position){\r
-            case "west":\r
-                return [0, 0];\r
-            break;\r
-            case "east":\r
-                return [0, 0];\r
-            break;\r
-            case "north":\r
-                return [0, 0];\r
-            break;\r
-            case "south":\r
-                return [0, 0];\r
-            break;\r
-        }\r
-    },\r
-\r
-    // private\r
-    getExpandAdj : function(){\r
-        var c = this.collapsedEl, cm = this.cmargins;\r
-        switch(this.position){\r
-            case "west":\r
-                return [-(cm.right+c.getWidth()+cm.left), 0];\r
-            break;\r
-            case "east":\r
-                return [cm.right+c.getWidth()+cm.left, 0];\r
-            break;\r
-            case "north":\r
-                return [0, -(cm.top+cm.bottom+c.getHeight())];\r
-            break;\r
-            case "south":\r
-                return [0, cm.top+cm.bottom+c.getHeight()];\r
-            break;\r
-        }\r
-    }\r
-};\r
-\r
-\r
-Ext.layout.BorderLayout.SplitRegion = function(layout, config, pos){\r
-    Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, layout, config, pos);\r
-    // prevent switch\r
-    this.applyLayout = this.applyFns[pos];\r
-};\r
-\r
-Ext.extend(Ext.layout.BorderLayout.SplitRegion, Ext.layout.BorderLayout.Region, {\r
-    \r
-    splitTip : "Drag to resize.",\r
-    \r
-    collapsibleSplitTip : "Drag to resize. Double click to hide.",\r
-    \r
-    useSplitTips : false,\r
-\r
-    // private\r
-    splitSettings : {\r
-        north : {\r
-            orientation: Ext.SplitBar.VERTICAL,\r
-            placement: Ext.SplitBar.TOP,\r
-            maxFn : 'getVMaxSize',\r
-            minProp: 'minHeight',\r
-            maxProp: 'maxHeight'\r
-        },\r
-        south : {\r
-            orientation: Ext.SplitBar.VERTICAL,\r
-            placement: Ext.SplitBar.BOTTOM,\r
-            maxFn : 'getVMaxSize',\r
-            minProp: 'minHeight',\r
-            maxProp: 'maxHeight'\r
-        },\r
-        east : {\r
-            orientation: Ext.SplitBar.HORIZONTAL,\r
-            placement: Ext.SplitBar.RIGHT,\r
-            maxFn : 'getHMaxSize',\r
-            minProp: 'minWidth',\r
-            maxProp: 'maxWidth'\r
-        },\r
-        west : {\r
-            orientation: Ext.SplitBar.HORIZONTAL,\r
-            placement: Ext.SplitBar.LEFT,\r
-            maxFn : 'getHMaxSize',\r
-            minProp: 'minWidth',\r
-            maxProp: 'maxWidth'\r
-        }\r
-    },\r
-\r
-    // private\r
-    applyFns : {\r
-        west : function(box){\r
-            if(this.isCollapsed){\r
-                return this.applyLayoutCollapsed(box);\r
-            }\r
-            var sd = this.splitEl.dom, s = sd.style;\r
-            this.panel.setPosition(box.x, box.y);\r
-            var sw = sd.offsetWidth;\r
-            s.left = (box.x+box.width-sw)+'px';\r
-            s.top = (box.y)+'px';\r
-            s.height = Math.max(0, box.height)+'px';\r
-            this.panel.setSize(box.width-sw, box.height);\r
-        },\r
-        east : function(box){\r
-            if(this.isCollapsed){\r
-                return this.applyLayoutCollapsed(box);\r
-            }\r
-            var sd = this.splitEl.dom, s = sd.style;\r
-            var sw = sd.offsetWidth;\r
-            this.panel.setPosition(box.x+sw, box.y);\r
-            s.left = (box.x)+'px';\r
-            s.top = (box.y)+'px';\r
-            s.height = Math.max(0, box.height)+'px';\r
-            this.panel.setSize(box.width-sw, box.height);\r
-        },\r
-        north : function(box){\r
-            if(this.isCollapsed){\r
-                return this.applyLayoutCollapsed(box);\r
-            }\r
-            var sd = this.splitEl.dom, s = sd.style;\r
-            var sh = sd.offsetHeight;\r
-            this.panel.setPosition(box.x, box.y);\r
-            s.left = (box.x)+'px';\r
-            s.top = (box.y+box.height-sh)+'px';\r
-            s.width = Math.max(0, box.width)+'px';\r
-            this.panel.setSize(box.width, box.height-sh);\r
-        },\r
-        south : function(box){\r
-            if(this.isCollapsed){\r
-                return this.applyLayoutCollapsed(box);\r
-            }\r
-            var sd = this.splitEl.dom, s = sd.style;\r
-            var sh = sd.offsetHeight;\r
-            this.panel.setPosition(box.x, box.y+sh);\r
-            s.left = (box.x)+'px';\r
-            s.top = (box.y)+'px';\r
-            s.width = Math.max(0, box.width)+'px';\r
-            this.panel.setSize(box.width, box.height-sh);\r
-        }\r
-    },\r
-\r
-    // private\r
-    render : function(ct, p){\r
-        Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this, ct, p);\r
-\r
-        var ps = this.position;\r
-\r
-        this.splitEl = ct.createChild({\r
-            cls: "x-layout-split x-layout-split-"+ps, html: "&#160;",\r
-            id: this.panel.id + '-xsplit'\r
-        });\r
-\r
-        if(this.collapseMode == 'mini'){\r
-            this.miniSplitEl = this.splitEl.createChild({\r
-                cls: "x-layout-mini x-layout-mini-"+ps, html: "&#160;"\r
-            });\r
-            this.miniSplitEl.addClassOnOver('x-layout-mini-over');\r
-            this.miniSplitEl.on('click', this.onCollapseClick, this, {stopEvent:true});\r
-        }\r
-\r
-        var s = this.splitSettings[ps];\r
-\r
-        this.split = new Ext.SplitBar(this.splitEl.dom, p.el, s.orientation);\r
-        this.split.placement = s.placement;\r
-        this.split.getMaximumSize = this[s.maxFn].createDelegate(this);\r
-        this.split.minSize = this.minSize || this[s.minProp];\r
-        this.split.on("beforeapply", this.onSplitMove, this);\r
-        this.split.useShim = this.useShim === true;\r
-        this.maxSize = this.maxSize || this[s.maxProp];\r
-\r
-        if(p.hidden){\r
-            this.splitEl.hide();\r
-        }\r
-\r
-        if(this.useSplitTips){\r
-            this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip : this.splitTip;\r
-        }\r
-        if(this.collapsible){\r
-            this.splitEl.on("dblclick", this.onCollapseClick,  this);\r
-        }\r
-    },\r
-\r
-    //docs inherit from superclass\r
-    getSize : function(){\r
-        if(this.isCollapsed){\r
-            return this.collapsedEl.getSize();\r
-        }\r
-        var s = this.panel.getSize();\r
-        if(this.position == 'north' || this.position == 'south'){\r
-            s.height += this.splitEl.dom.offsetHeight;\r
-        }else{\r
-            s.width += this.splitEl.dom.offsetWidth;\r
-        }\r
-        return s;\r
-    },\r
-\r
-    // private\r
-    getHMaxSize : function(){\r
-         var cmax = this.maxSize || 10000;\r
-         var center = this.layout.center;\r
-         return Math.min(cmax, (this.el.getWidth()+center.el.getWidth())-center.getMinWidth());\r
-    },\r
-\r
-    // private\r
-    getVMaxSize : function(){\r
-        var cmax = this.maxSize || 10000;\r
-        var center = this.layout.center;\r
-        return Math.min(cmax, (this.el.getHeight()+center.el.getHeight())-center.getMinHeight());\r
-    },\r
-\r
-    // private\r
-    onSplitMove : function(split, newSize){\r
-        var s = this.panel.getSize();\r
-        this.lastSplitSize = newSize;\r
-        if(this.position == 'north' || this.position == 'south'){\r
-            this.panel.setSize(s.width, newSize);\r
-            this.state.height = newSize;\r
-        }else{\r
-            this.panel.setSize(newSize, s.height);\r
-            this.state.width = newSize;\r
-        }\r
-        this.layout.layout();\r
-        this.panel.saveState();\r
-        return false;\r
-    },\r
-\r
-    \r
-    getSplitBar : function(){\r
-        return this.split;\r
-    },\r
-    \r
-    // inherit docs\r
-    destroy : function() {\r
-        Ext.destroy(\r
-            this.miniSplitEl, \r
-            this.split, \r
-            this.splitEl\r
-        );\r
-    }\r
-});\r
-\r
-Ext.Container.LAYOUTS['border'] = Ext.layout.BorderLayout;\r
-\r
-Ext.layout.FormLayout = Ext.extend(Ext.layout.AnchorLayout, {\r
-    \r
-    labelSeparator : ':',\r
-\r
-    // private\r
-    getAnchorViewSize : function(ct, target){\r
-        return (ct.body||ct.el).getStyleSize();\r
-    },\r
-\r
-    // private\r
-    setContainer : function(ct){\r
-        Ext.layout.FormLayout.superclass.setContainer.call(this, ct);\r
-\r
-        if(ct.labelAlign){\r
-            ct.addClass('x-form-label-'+ct.labelAlign);\r
-        }\r
-\r
-        if(ct.hideLabels){\r
-            this.labelStyle = "display:none";\r
-            this.elementStyle = "padding-left:0;";\r
-            this.labelAdjust = 0;\r
-        }else{\r
-            this.labelSeparator = ct.labelSeparator || this.labelSeparator;\r
-            ct.labelWidth = ct.labelWidth || 100;\r
-            if(typeof ct.labelWidth == 'number'){\r
-                var pad = (typeof ct.labelPad == 'number' ? ct.labelPad : 5);\r
-                this.labelAdjust = ct.labelWidth+pad;\r
-                this.labelStyle = "width:"+ct.labelWidth+"px;";\r
-                this.elementStyle = "padding-left:"+(ct.labelWidth+pad)+'px';\r
-            }\r
-            if(ct.labelAlign == 'top'){\r
-                this.labelStyle = "width:auto;";\r
-                this.labelAdjust = 0;\r
-                this.elementStyle = "padding-left:0;";\r
-            }\r
-        }\r
-\r
-        if(!this.fieldTpl){\r
-            // the default field template used by all form layouts\r
-            var t = new Ext.Template(\r
-                '<div class="x-form-item {5}" tabIndex="-1">',\r
-                    '<label for="{0}" style="{2}" class="x-form-item-label">{1}{4}</label>',\r
-                    '<div class="x-form-element" id="x-form-el-{0}" style="{3}">',\r
-                    '</div><div class="{6}"></div>',\r
-                '</div>'\r
-            );\r
-            t.disableFormats = true;\r
-            t.compile();\r
-            Ext.layout.FormLayout.prototype.fieldTpl = t;\r
-        }\r
-    },\r
-    \r
-    //private\r
-    getLabelStyle: function(s){\r
-        var ls = '', items = [this.labelStyle, s];\r
-        for (var i = 0, len = items.length; i < len; ++i){\r
-            if (items[i]){\r
-                ls += items[i];\r
-                if (ls.substr(-1, 1) != ';'){\r
-                    ls += ';'\r
-                }\r
-            }\r
-        }\r
-        return ls;\r
-    },\r
-\r
-    // private\r
-    renderItem : function(c, position, target){\r
-        if(c && !c.rendered && c.isFormField && c.inputType != 'hidden'){\r
-            var args = [\r
-                   c.id, c.fieldLabel,\r
-                   this.getLabelStyle(c.labelStyle),\r
-                   this.elementStyle||'',\r
-                   typeof c.labelSeparator == 'undefined' ? this.labelSeparator : c.labelSeparator,\r
-                   (c.itemCls||this.container.itemCls||'') + (c.hideLabel ? ' x-hide-label' : ''),\r
-                   c.clearCls || 'x-form-clear-left' \r
-            ];\r
-            if(typeof position == 'number'){\r
-                position = target.dom.childNodes[position] || null;\r
-            }\r
-            if(position){\r
-                this.fieldTpl.insertBefore(position, args);\r
-            }else{\r
-                this.fieldTpl.append(target, args);\r
-            }\r
-            c.render('x-form-el-'+c.id);\r
-        }else {\r
-            Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments);\r
-        }\r
-    },\r
-\r
-    // private\r
-    adjustWidthAnchor : function(value, comp){\r
-        return value - (comp.isFormField  ? (comp.hideLabel ? 0 : this.labelAdjust) : 0);\r
-    },\r
-\r
-    // private\r
-    isValidParent : function(c, target){\r
-        return true;\r
-    }\r
-\r
-    \r
-});\r
-\r
-Ext.Container.LAYOUTS['form'] = Ext.layout.FormLayout;\r
-\r
-Ext.layout.Accordion = Ext.extend(Ext.layout.FitLayout, {\r
-    \r
-    fill : true,\r
-    \r
-    autoWidth : true,\r
-    \r
-    titleCollapse : true,\r
-    \r
-    hideCollapseTool : false,\r
-    \r
-    collapseFirst : false,\r
-    \r
-    animate : false,\r
-    \r
-    sequence : false,\r
-    \r
-    activeOnTop : false,\r
-\r
-    renderItem : function(c){\r
-        if(this.animate === false){\r
-            c.animCollapse = false;\r
-        }\r
-        c.collapsible = true;\r
-        if(this.autoWidth){\r
-            c.autoWidth = true;\r
-        }\r
-        if(this.titleCollapse){\r
-            c.titleCollapse = true;\r
-        }\r
-        if(this.hideCollapseTool){\r
-            c.hideCollapseTool = true;\r
-        }\r
-        if(this.collapseFirst !== undefined){\r
-            c.collapseFirst = this.collapseFirst;\r
-        }\r
-        if(!this.activeItem && !c.collapsed){\r
-            this.activeItem = c;\r
-        }else if(this.activeItem){\r
-            c.collapsed = true;\r
-        }\r
-        Ext.layout.Accordion.superclass.renderItem.apply(this, arguments);\r
-        c.header.addClass('x-accordion-hd');\r
-        c.on('beforeexpand', this.beforeExpand, this);\r
-    },\r
-\r
-    // private\r
-    beforeExpand : function(p, anim){\r
-        var ai = this.activeItem;\r
-        if(ai){\r
-            if(this.sequence){\r
-                delete this.activeItem;\r
-                if (!ai.collapsed){\r
-                    ai.collapse({callback:function(){\r
-                        p.expand(anim || true);\r
-                    }, scope: this});\r
-                    return false;\r
-                }\r
-            }else{\r
-                ai.collapse(this.animate);\r
-            }\r
-        }\r
-        this.activeItem = p;\r
-        if(this.activeOnTop){\r
-            p.el.dom.parentNode.insertBefore(p.el.dom, p.el.dom.parentNode.firstChild);\r
-        }\r
-        this.layout();\r
-    },\r
-\r
-    // private\r
-    setItemSize : function(item, size){\r
-        if(this.fill && item){\r
-            var items = this.container.items.items;\r
-            var hh = 0;\r
-            for(var i = 0, len = items.length; i < len; i++){\r
-                var p = items[i];\r
-                if(p != item){\r
-                    hh += (p.getSize().height - p.bwrap.getHeight());\r
-                }\r
-            }\r
-            size.height -= hh;\r
-            item.setSize(size);\r
-        }\r
-    }\r
-});\r
-Ext.Container.LAYOUTS['accordion'] = Ext.layout.Accordion;\r
-\r
-Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, {\r
-    \r
-\r
-    // private\r
-    monitorResize:false,\r
-\r
-    // private\r
-    setContainer : function(ct){\r
-        Ext.layout.TableLayout.superclass.setContainer.call(this, ct);\r
-\r
-        this.currentRow = 0;\r
-        this.currentColumn = 0;\r
-        this.cells = [];\r
-    },\r
-\r
-    // private\r
-    onLayout : function(ct, target){\r
-        var cs = ct.items.items, len = cs.length, c, i;\r
-\r
-        if(!this.table){\r
-            target.addClass('x-table-layout-ct');\r
-\r
-            this.table = target.createChild(\r
-                {tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, null, true);\r
-\r
-            this.renderAll(ct, target);\r
-        }\r
-    },\r
-\r
-    // private\r
-    getRow : function(index){\r
-        var row = this.table.tBodies[0].childNodes[index];\r
-        if(!row){\r
-            row = document.createElement('tr');\r
-            this.table.tBodies[0].appendChild(row);\r
-        }\r
-        return row;\r
-    },\r
-\r
-    // private\r
-       getNextCell : function(c){\r
-               var cell = this.getNextNonSpan(this.currentColumn, this.currentRow);\r
-               var curCol = this.currentColumn = cell[0], curRow = this.currentRow = cell[1];\r
-               for(var rowIndex = curRow; rowIndex < curRow + (c.rowspan || 1); rowIndex++){\r
-                       if(!this.cells[rowIndex]){\r
-                               this.cells[rowIndex] = [];\r
-                       }\r
-                       for(var colIndex = curCol; colIndex < curCol + (c.colspan || 1); colIndex++){\r
-                               this.cells[rowIndex][colIndex] = true;\r
-                       }\r
-               }\r
-               var td = document.createElement('td');\r
-               if(c.cellId){\r
-                       td.id = c.cellId;\r
-               }\r
-               var cls = 'x-table-layout-cell';\r
-               if(c.cellCls){\r
-                       cls += ' ' + c.cellCls;\r
-               }\r
-               td.className = cls;\r
-               if(c.colspan){\r
-                       td.colSpan = c.colspan;\r
-               }\r
-               if(c.rowspan){\r
-                       td.rowSpan = c.rowspan;\r
-               }\r
-               this.getRow(curRow).appendChild(td);\r
-               return td;\r
-       },\r
-    \r
-    // private\r
-       getNextNonSpan: function(colIndex, rowIndex){\r
-               var cols = this.columns;\r
-               while((cols && colIndex >= cols) || (this.cells[rowIndex] && this.cells[rowIndex][colIndex])) {\r
-                       if(cols && colIndex >= cols){\r
-                               rowIndex++;\r
-                               colIndex = 0;\r
-                       }else{\r
-                               colIndex++;\r
-                       }\r
-               }\r
-               return [colIndex, rowIndex];\r
-       },\r
-\r
-    // private\r
-    renderItem : function(c, position, target){\r
-        if(c && !c.rendered){\r
-            c.render(this.getNextCell(c));\r
-            if(this.extraCls){\r
-                var t = c.getPositionEl ? c.getPositionEl() : c;\r
-                t.addClass(this.extraCls);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    isValidParent : function(c, target){\r
-        return true;\r
-    }\r
-\r
-    \r
-});\r
-\r
-Ext.Container.LAYOUTS['table'] = Ext.layout.TableLayout;\r
-\r
-Ext.layout.AbsoluteLayout = Ext.extend(Ext.layout.AnchorLayout, {\r
-    \r
-    extraCls: 'x-abs-layout-item',\r
-    isForm: false,\r
-    // private\r
-    setContainer : function(ct){\r
-        Ext.layout.AbsoluteLayout.superclass.setContainer.call(this, ct);\r
-        if(ct.isXType('form')){\r
-            this.isForm = true;\r
-        }\r
-    },\r
-\r
-    onLayout : function(ct, target){\r
-        if(this.isForm){ ct.body.position(); } else { target.position(); }\r
-        Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, ct, target);\r
-    },\r
-\r
-    // private\r
-    getAnchorViewSize : function(ct, target){\r
-        return this.isForm ? ct.body.getStyleSize() : Ext.layout.AbsoluteLayout.superclass.getAnchorViewSize.call(this, ct, target);\r
-    },\r
-\r
-    // private\r
-    isValidParent : function(c, target){\r
-        return this.isForm ? true : Ext.layout.AbsoluteLayout.superclass.isValidParent.call(this, c, target);\r
-    },\r
-\r
-    // private\r
-    adjustWidthAnchor : function(value, comp){\r
-        return value ? value - comp.getPosition(true)[0] : value;\r
-    },\r
-\r
-    // private\r
-    adjustHeightAnchor : function(value, comp){\r
-        return  value ? value - comp.getPosition(true)[1] : value;\r
-    }\r
-    \r
-});\r
-Ext.Container.LAYOUTS['absolute'] = Ext.layout.AbsoluteLayout;\r
-\r
-Ext.Viewport = Ext.extend(Ext.Container, {\r
-       \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    initComponent : function() {\r
-        Ext.Viewport.superclass.initComponent.call(this);\r
-        document.getElementsByTagName('html')[0].className += ' x-viewport';\r
-        this.el = Ext.getBody();\r
-        this.el.setHeight = Ext.emptyFn;\r
-        this.el.setWidth = Ext.emptyFn;\r
-        this.el.setSize = Ext.emptyFn;\r
-        this.el.dom.scroll = 'no';\r
-        this.allowDomMove = false;\r
-        this.autoWidth = true;\r
-        this.autoHeight = true;\r
-        Ext.EventManager.onWindowResize(this.fireResize, this);\r
-        this.renderTo = this.el;\r
-    },\r
-\r
-    fireResize : function(w, h){\r
-        this.fireEvent('resize', this, w, h, w, h);\r
-    }\r
-});\r
-Ext.reg('viewport', Ext.Viewport);\r
-\r
-Ext.Panel = Ext.extend(Ext.Container, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-     \r
-    \r
-    \r
-    \r
-    \r
-\r
-    \r
-    baseCls : 'x-panel',\r
-    \r
-    collapsedCls : 'x-panel-collapsed',\r
-    \r
-    maskDisabled: true,\r
-    \r
-    animCollapse: Ext.enableFx,\r
-    \r
-    headerAsText: true,\r
-    \r
-    buttonAlign: 'right',\r
-    \r
-    collapsed : false,\r
-    \r
-    collapseFirst: true,\r
-    \r
-    minButtonWidth:75,\r
-    \r
-    elements : 'body',\r
-\r
-    // protected - these could be used to customize the behavior of the window,\r
-    // but changing them would not be useful without further mofifications and\r
-    // could lead to unexpected or undesirable results.\r
-    toolTarget : 'header',\r
-    collapseEl : 'bwrap',\r
-    slideAnchor : 't',\r
-    disabledClass: '',\r
-\r
-    // private, notify box this class will handle heights\r
-    deferHeight: true,\r
-    // private\r
-    expandDefaults: {\r
-        duration:.25\r
-    },\r
-    // private\r
-    collapseDefaults: {\r
-        duration:.25\r
-    },\r
-\r
-    // private\r
-    initComponent : function(){\r
-        Ext.Panel.superclass.initComponent.call(this);\r
-\r
-        this.addEvents(\r
-            \r
-            'bodyresize',\r
-            \r
-            'titlechange',\r
-            \r
-            'iconchange',\r
-            \r
-            'collapse',\r
-            \r
-            'expand',\r
-            \r
-            'beforecollapse',\r
-            \r
-            'beforeexpand',\r
-            \r
-            'beforeclose',\r
-            \r
-            'close',\r
-            \r
-            'activate',\r
-            \r
-            'deactivate'\r
-        );\r
-\r
-        // shortcuts\r
-        if(this.tbar){\r
-            this.elements += ',tbar';\r
-            if(typeof this.tbar == 'object'){\r
-                this.topToolbar = this.tbar;\r
-            }\r
-            delete this.tbar;\r
-        }\r
-        if(this.bbar){\r
-            this.elements += ',bbar';\r
-            if(typeof this.bbar == 'object'){\r
-                this.bottomToolbar = this.bbar;\r
-            }\r
-            delete this.bbar;\r
-        }\r
-\r
-        if(this.header === true){\r
-            this.elements += ',header';\r
-            delete this.header;\r
-        }else if(this.title && this.header !== false){\r
-            this.elements += ',header';\r
-        }\r
-\r
-        if(this.footer === true){\r
-            this.elements += ',footer';\r
-            delete this.footer;\r
-        }\r
-\r
-        if(this.buttons){\r
-            var btns = this.buttons;\r
-            \r
-            this.buttons = [];\r
-            for(var i = 0, len = btns.length; i < len; i++) {\r
-                if(btns[i].render){ // button instance\r
-                    btns[i].ownerCt = this;\r
-                    this.buttons.push(btns[i]);\r
-                }else{\r
-                    this.addButton(btns[i]);\r
-                }\r
-            }\r
-        }\r
-        if(this.autoLoad){\r
-            this.on('render', this.doAutoLoad, this, {delay:10});\r
-        }\r
-    },\r
-\r
-    // private\r
-    createElement : function(name, pnode){\r
-        if(this[name]){\r
-            pnode.appendChild(this[name].dom);\r
-            return;\r
-        }\r
-\r
-        if(name === 'bwrap' || this.elements.indexOf(name) != -1){\r
-            if(this[name+'Cfg']){\r
-                this[name] = Ext.fly(pnode).createChild(this[name+'Cfg']);\r
-            }else{\r
-                var el = document.createElement('div');\r
-                el.className = this[name+'Cls'];\r
-                this[name] = Ext.get(pnode.appendChild(el));\r
-            }\r
-            if(this[name+'CssClass']){\r
-                this[name].addClass(this[name+'CssClass']);\r
-            }\r
-            if(this[name+'Style']){\r
-                this[name].applyStyles(this[name+'Style']);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        Ext.Panel.superclass.onRender.call(this, ct, position);\r
-\r
-        this.createClasses();\r
-\r
-        if(this.el){ // existing markup\r
-            this.el.addClass(this.baseCls);\r
-            this.header = this.el.down('.'+this.headerCls);\r
-            this.bwrap = this.el.down('.'+this.bwrapCls);\r
-            var cp = this.bwrap ? this.bwrap : this.el;\r
-            this.tbar = cp.down('.'+this.tbarCls);\r
-            this.body = cp.down('.'+this.bodyCls);\r
-            this.bbar = cp.down('.'+this.bbarCls);\r
-            this.footer = cp.down('.'+this.footerCls);\r
-            this.fromMarkup = true;\r
-        }else{\r
-            this.el = ct.createChild({\r
-                id: this.id,\r
-                cls: this.baseCls\r
-            }, position);\r
-        }\r
-        var el = this.el, d = el.dom;\r
-\r
-        if(this.cls){\r
-            this.el.addClass(this.cls);\r
-        }\r
-\r
-        if(this.buttons){\r
-            this.elements += ',footer';\r
-        }\r
-\r
-        // This block allows for maximum flexibility and performance when using existing markup\r
-\r
-        // framing requires special markup\r
-        if(this.frame){\r
-            el.insertHtml('afterBegin', String.format(Ext.Element.boxMarkup, this.baseCls));\r
-\r
-            this.createElement('header', d.firstChild.firstChild.firstChild);\r
-            this.createElement('bwrap', d);\r
-\r
-            // append the mid and bottom frame to the bwrap\r
-            var bw = this.bwrap.dom;\r
-            var ml = d.childNodes[1], bl = d.childNodes[2];\r
-            bw.appendChild(ml);\r
-            bw.appendChild(bl);\r
-\r
-            var mc = bw.firstChild.firstChild.firstChild;\r
-            this.createElement('tbar', mc);\r
-            this.createElement('body', mc);\r
-            this.createElement('bbar', mc);\r
-            this.createElement('footer', bw.lastChild.firstChild.firstChild);\r
-\r
-            if(!this.footer){\r
-                this.bwrap.dom.lastChild.className += ' x-panel-nofooter';\r
-            }\r
-        }else{\r
-            this.createElement('header', d);\r
-            this.createElement('bwrap', d);\r
-\r
-            // append the mid and bottom frame to the bwrap\r
-            var bw = this.bwrap.dom;\r
-            this.createElement('tbar', bw);\r
-            this.createElement('body', bw);\r
-            this.createElement('bbar', bw);\r
-            this.createElement('footer', bw);\r
-\r
-            if(!this.header){\r
-                this.body.addClass(this.bodyCls + '-noheader');\r
-                if(this.tbar){\r
-                    this.tbar.addClass(this.tbarCls + '-noheader');\r
-                }\r
-            }\r
-        }\r
-\r
-        if(this.border === false){\r
-            this.el.addClass(this.baseCls + '-noborder');\r
-            this.body.addClass(this.bodyCls + '-noborder');\r
-            if(this.header){\r
-                this.header.addClass(this.headerCls + '-noborder');\r
-            }\r
-            if(this.footer){\r
-                this.footer.addClass(this.footerCls + '-noborder');\r
-            }\r
-            if(this.tbar){\r
-                this.tbar.addClass(this.tbarCls + '-noborder');\r
-            }\r
-            if(this.bbar){\r
-                this.bbar.addClass(this.bbarCls + '-noborder');\r
-            }\r
-        }\r
-\r
-        if(this.bodyBorder === false){\r
-           this.body.addClass(this.bodyCls + '-noborder');\r
-        }\r
-\r
-        this.bwrap.enableDisplayMode('block');\r
-\r
-        if(this.header){\r
-            this.header.unselectable();\r
-\r
-            // for tools, we need to wrap any existing header markup\r
-            if(this.headerAsText){\r
-                this.header.dom.innerHTML =\r
-                    '<span class="' + this.headerTextCls + '">'+this.header.dom.innerHTML+'</span>';\r
-\r
-                if(this.iconCls){\r
-                    this.setIconClass(this.iconCls);\r
-                }\r
-            }\r
-        }\r
-\r
-        if(this.floating){\r
-            this.makeFloating(this.floating);\r
-        }\r
-\r
-        if(this.collapsible){\r
-            this.tools = this.tools ? this.tools.slice(0) : [];\r
-            if(!this.hideCollapseTool){\r
-                this.tools[this.collapseFirst?'unshift':'push']({\r
-                    id: 'toggle',\r
-                    handler : this.toggleCollapse,\r
-                    scope: this\r
-                });\r
-            }\r
-            if(this.titleCollapse && this.header){\r
-                this.header.on('click', this.toggleCollapse, this);\r
-                this.header.setStyle('cursor', 'pointer');\r
-            }\r
-        }\r
-        if(this.tools){\r
-            var ts = this.tools;\r
-            this.tools = {};\r
-            this.addTool.apply(this, ts);\r
-        }else{\r
-            this.tools = {};\r
-        }\r
-\r
-        if(this.buttons && this.buttons.length > 0){\r
-            // tables are required to maintain order and for correct IE layout\r
-            var tb = this.footer.createChild({cls:'x-panel-btns-ct', cn: {\r
-                cls:"x-panel-btns x-panel-btns-"+this.buttonAlign,\r
-                html:'<table cellspacing="0"><tbody><tr></tr></tbody></table><div class="x-clear"></div>'\r
-            }}, null, true);\r
-            var tr = tb.getElementsByTagName('tr')[0];\r
-            for(var i = 0, len = this.buttons.length; i < len; i++) {\r
-                var b = this.buttons[i];\r
-                var td = document.createElement('td');\r
-                td.className = 'x-panel-btn-td';\r
-                b.render(tr.appendChild(td));\r
-            }\r
-        }\r
-\r
-        if(this.tbar && this.topToolbar){\r
-            if(Ext.isArray(this.topToolbar)){\r
-                this.topToolbar = new Ext.Toolbar(this.topToolbar);\r
-            }\r
-            this.topToolbar.render(this.tbar);\r
-            this.topToolbar.ownerCt = this;\r
-        }\r
-        if(this.bbar && this.bottomToolbar){\r
-            if(Ext.isArray(this.bottomToolbar)){\r
-                this.bottomToolbar = new Ext.Toolbar(this.bottomToolbar);\r
-            }\r
-            this.bottomToolbar.render(this.bbar);\r
-            this.bottomToolbar.ownerCt = this;\r
-        }\r
-    },\r
-\r
-    \r
-    setIconClass : function(cls){\r
-        var old = this.iconCls;\r
-        this.iconCls = cls;\r
-        if(this.rendered && this.header){\r
-            if(this.frame){\r
-                this.header.addClass('x-panel-icon');\r
-                this.header.replaceClass(old, this.iconCls);\r
-            }else{\r
-                var hd = this.header.dom;\r
-                var img = hd.firstChild && String(hd.firstChild.tagName).toLowerCase() == 'img' ? hd.firstChild : null;\r
-                if(img){\r
-                    Ext.fly(img).replaceClass(old, this.iconCls);\r
-                }else{\r
-                    Ext.DomHelper.insertBefore(hd.firstChild, {\r
-                        tag:'img', src: Ext.BLANK_IMAGE_URL, cls:'x-panel-inline-icon '+this.iconCls\r
-                    });\r
-                 }\r
-            }\r
-        }\r
-        this.fireEvent('iconchange', this, cls, old);\r
-    },\r
-\r
-    // private\r
-    makeFloating : function(cfg){\r
-        this.floating = true;\r
-        this.el = new Ext.Layer(\r
-            typeof cfg == 'object' ? cfg : {\r
-                shadow: this.shadow !== undefined ? this.shadow : 'sides',\r
-                shadowOffset: this.shadowOffset,\r
-                constrain:false,\r
-                shim: this.shim === false ? false : undefined\r
-            }, this.el\r
-        );\r
-    },\r
-\r
-    \r
-    getTopToolbar : function(){\r
-        return this.topToolbar;\r
-    },\r
-\r
-    \r
-    getBottomToolbar : function(){\r
-        return this.bottomToolbar;\r
-    },\r
-\r
-    \r
-    addButton : function(config, handler, scope){\r
-        var bc = {\r
-            handler: handler,\r
-            scope: scope,\r
-            minWidth: this.minButtonWidth,\r
-            hideParent:true\r
-        };\r
-        if(typeof config == "string"){\r
-            bc.text = config;\r
-        }else{\r
-            Ext.apply(bc, config);\r
-        }\r
-        var btn = new Ext.Button(bc);\r
-        btn.ownerCt = this;\r
-        if(!this.buttons){\r
-            this.buttons = [];\r
-        }\r
-        this.buttons.push(btn);\r
-        return btn;\r
-    },\r
-\r
-    // private\r
-    addTool : function(){\r
-        if(!this[this.toolTarget]) { // no where to render tools!\r
-            return;\r
-        }\r
-        if(!this.toolTemplate){\r
-            // initialize the global tool template on first use\r
-            var tt = new Ext.Template(\r
-                 '<div class="x-tool x-tool-{id}">&#160;</div>'\r
-            );\r
-            tt.disableFormats = true;\r
-            tt.compile();\r
-            Ext.Panel.prototype.toolTemplate = tt;\r
-        }\r
-        for(var i = 0, a = arguments, len = a.length; i < len; i++) {\r
-            var tc = a[i];\r
-            if(!this.tools[tc.id]){\r
-                   var overCls = 'x-tool-'+tc.id+'-over';\r
-                   var t = this.toolTemplate.insertFirst((tc.align !== 'left') ? this[this.toolTarget] : this[this.toolTarget].child('span'), tc, true);\r
-                   this.tools[tc.id] = t;\r
-                   t.enableDisplayMode('block');\r
-                   t.on('click', this.createToolHandler(t, tc, overCls, this));\r
-                   if(tc.on){\r
-                       t.on(tc.on);\r
-                   }\r
-                   if(tc.hidden){\r
-                       t.hide();\r
-                   }\r
-                   if(tc.qtip){\r
-                       if(typeof tc.qtip == 'object'){\r
-                           Ext.QuickTips.register(Ext.apply({\r
-                                 target: t.id\r
-                           }, tc.qtip));\r
-                       } else {\r
-                           t.dom.qtip = tc.qtip;\r
-                       }\r
-                   }\r
-                   t.addClassOnOver(overCls);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    onShow : function(){\r
-        if(this.floating){\r
-            return this.el.show();\r
-        }\r
-        Ext.Panel.superclass.onShow.call(this);\r
-    },\r
-\r
-    // private\r
-    onHide : function(){\r
-        if(this.floating){\r
-            return this.el.hide();\r
-        }\r
-        Ext.Panel.superclass.onHide.call(this);\r
-    },\r
-\r
-    // private\r
-    createToolHandler : function(t, tc, overCls, panel){\r
-        return function(e){\r
-            t.removeClass(overCls);\r
-            e.stopEvent();\r
-            if(tc.handler){\r
-                tc.handler.call(tc.scope || t, e, t, panel);\r
-            }\r
-        };\r
-    },\r
-\r
-    // private\r
-    afterRender : function(){\r
-        if(this.fromMarkup && this.height === undefined && !this.autoHeight){\r
-            this.height = this.el.getHeight();\r
-        }\r
-        if(this.floating && !this.hidden && !this.initHidden){\r
-            this.el.show();\r
-        }\r
-        if(this.title){\r
-            this.setTitle(this.title);\r
-        }\r
-        this.setAutoScroll();\r
-        if(this.html){\r
-            this.body.update(typeof this.html == 'object' ?\r
-                             Ext.DomHelper.markup(this.html) :\r
-                             this.html);\r
-            delete this.html;\r
-        }\r
-        if(this.contentEl){\r
-            var ce = Ext.getDom(this.contentEl);\r
-            Ext.fly(ce).removeClass(['x-hidden', 'x-hide-display']);\r
-            this.body.dom.appendChild(ce);\r
-        }\r
-        if(this.collapsed){\r
-            this.collapsed = false;\r
-            this.collapse(false);\r
-        }\r
-        Ext.Panel.superclass.afterRender.call(this); // do sizing calcs last\r
-        this.initEvents();\r
-    },\r
-\r
-    // private\r
-    setAutoScroll : function(){\r
-        if(this.rendered && this.autoScroll){\r
-            var el = this.body || this.el;\r
-            if(el){\r
-                el.setOverflow('auto');\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    getKeyMap : function(){\r
-        if(!this.keyMap){\r
-            this.keyMap = new Ext.KeyMap(this.el, this.keys);\r
-        }\r
-        return this.keyMap;\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        if(this.keys){\r
-            this.getKeyMap();\r
-        }\r
-        if(this.draggable){\r
-            this.initDraggable();\r
-        }\r
-    },\r
-\r
-    // private\r
-    initDraggable : function(){\r
-        \r
-        this.dd = new Ext.Panel.DD(this, typeof this.draggable == 'boolean' ? null : this.draggable);\r
-    },\r
-\r
-    // private\r
-    beforeEffect : function(){\r
-        if(this.floating){\r
-            this.el.beforeAction();\r
-        }\r
-        this.el.addClass('x-panel-animated');\r
-    },\r
-\r
-    // private\r
-    afterEffect : function(){\r
-        this.syncShadow();\r
-        this.el.removeClass('x-panel-animated');\r
-    },\r
-\r
-    // private - wraps up an animation param with internal callbacks\r
-    createEffect : function(a, cb, scope){\r
-        var o = {\r
-            scope:scope,\r
-            block:true\r
-        };\r
-        if(a === true){\r
-            o.callback = cb;\r
-            return o;\r
-        }else if(!a.callback){\r
-            o.callback = cb;\r
-        }else { // wrap it up\r
-            o.callback = function(){\r
-                cb.call(scope);\r
-                Ext.callback(a.callback, a.scope);\r
-            };\r
-        }\r
-        return Ext.applyIf(o, a);\r
-    },\r
-\r
-    \r
-    collapse : function(animate){\r
-        if(this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforecollapse', this, animate) === false){\r
-            return;\r
-        }\r
-        var doAnim = animate === true || (animate !== false && this.animCollapse);\r
-        this.beforeEffect();\r
-        this.onCollapse(doAnim, animate);\r
-        return this;\r
-    },\r
-\r
-    // private\r
-    onCollapse : function(doAnim, animArg){\r
-        if(doAnim){\r
-            this[this.collapseEl].slideOut(this.slideAnchor,\r
-                    Ext.apply(this.createEffect(animArg||true, this.afterCollapse, this),\r
-                        this.collapseDefaults));\r
-        }else{\r
-            this[this.collapseEl].hide();\r
-            this.afterCollapse();\r
-        }\r
-    },\r
-\r
-    // private\r
-    afterCollapse : function(){\r
-        this.collapsed = true;\r
-        this.el.addClass(this.collapsedCls);\r
-        this.afterEffect();\r
-        this.fireEvent('collapse', this);\r
-    },\r
-\r
-    \r
-    expand : function(animate){\r
-        if(!this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforeexpand', this, animate) === false){\r
-            return;\r
-        }\r
-        var doAnim = animate === true || (animate !== false && this.animCollapse);\r
-        this.el.removeClass(this.collapsedCls);\r
-        this.beforeEffect();\r
-        this.onExpand(doAnim, animate);\r
-        return this;\r
-    },\r
-\r
-    // private\r
-    onExpand : function(doAnim, animArg){\r
-        if(doAnim){\r
-            this[this.collapseEl].slideIn(this.slideAnchor,\r
-                    Ext.apply(this.createEffect(animArg||true, this.afterExpand, this),\r
-                        this.expandDefaults));\r
-        }else{\r
-            this[this.collapseEl].show();\r
-            this.afterExpand();\r
-        }\r
-    },\r
-\r
-    // private\r
-    afterExpand : function(){\r
-        this.collapsed = false;\r
-        this.afterEffect();\r
-        this.fireEvent('expand', this);\r
-    },\r
-\r
-    \r
-    toggleCollapse : function(animate){\r
-        this[this.collapsed ? 'expand' : 'collapse'](animate);\r
-        return this;\r
-    },\r
-\r
-    // private\r
-    onDisable : function(){\r
-        if(this.rendered && this.maskDisabled){\r
-            this.el.mask();\r
-        }\r
-        Ext.Panel.superclass.onDisable.call(this);\r
-    },\r
-\r
-    // private\r
-    onEnable : function(){\r
-        if(this.rendered && this.maskDisabled){\r
-            this.el.unmask();\r
-        }\r
-        Ext.Panel.superclass.onEnable.call(this);\r
-    },\r
-\r
-    // private\r
-    onResize : function(w, h){\r
-        if(w !== undefined || h !== undefined){\r
-            if(!this.collapsed){\r
-                if(typeof w == 'number'){\r
-                    this.body.setWidth(\r
-                            this.adjustBodyWidth(w - this.getFrameWidth()));\r
-                }else if(w == 'auto'){\r
-                    this.body.setWidth(w);\r
-                }\r
-\r
-                if(typeof h == 'number'){\r
-                    this.body.setHeight(\r
-                            this.adjustBodyHeight(h - this.getFrameHeight()));\r
-                }else if(h == 'auto'){\r
-                    this.body.setHeight(h);\r
-                }\r
-                \r
-                if(this.disabled && this.el._mask){\r
-                    this.el._mask.setSize(this.el.dom.clientWidth, this.el.getHeight());\r
-                }\r
-            }else{\r
-                this.queuedBodySize = {width: w, height: h};\r
-                if(!this.queuedExpand && this.allowQueuedExpand !== false){\r
-                    this.queuedExpand = true;\r
-                    this.on('expand', function(){\r
-                        delete this.queuedExpand;\r
-                        this.onResize(this.queuedBodySize.width, this.queuedBodySize.height);\r
-                        this.doLayout();\r
-                    }, this, {single:true});\r
-                }\r
-            }\r
-            this.fireEvent('bodyresize', this, w, h);\r
-        }\r
-        this.syncShadow();\r
-    },\r
-\r
-    // private\r
-    adjustBodyHeight : function(h){\r
-        return h;\r
-    },\r
-\r
-    // private\r
-    adjustBodyWidth : function(w){\r
-        return w;\r
-    },\r
-\r
-    // private\r
-    onPosition : function(){\r
-        this.syncShadow();\r
-    },\r
-\r
-    \r
-    getFrameWidth : function(){\r
-        var w = this.el.getFrameWidth('lr');\r
-\r
-        if(this.frame){\r
-            var l = this.bwrap.dom.firstChild;\r
-            w += (Ext.fly(l).getFrameWidth('l') + Ext.fly(l.firstChild).getFrameWidth('r'));\r
-            var mc = this.bwrap.dom.firstChild.firstChild.firstChild;\r
-            w += Ext.fly(mc).getFrameWidth('lr');\r
-        }\r
-        return w;\r
-    },\r
-\r
-    \r
-    getFrameHeight : function(){\r
-        var h  = this.el.getFrameWidth('tb');\r
-        h += (this.tbar ? this.tbar.getHeight() : 0) +\r
-             (this.bbar ? this.bbar.getHeight() : 0);\r
-\r
-        if(this.frame){\r
-            var hd = this.el.dom.firstChild;\r
-            var ft = this.bwrap.dom.lastChild;\r
-            h += (hd.offsetHeight + ft.offsetHeight);\r
-            var mc = this.bwrap.dom.firstChild.firstChild.firstChild;\r
-            h += Ext.fly(mc).getFrameWidth('tb');\r
-        }else{\r
-            h += (this.header ? this.header.getHeight() : 0) +\r
-                (this.footer ? this.footer.getHeight() : 0);\r
-        }\r
-        return h;\r
-    },\r
-\r
-    \r
-    getInnerWidth : function(){\r
-        return this.getSize().width - this.getFrameWidth();\r
-    },\r
-\r
-    \r
-    getInnerHeight : function(){\r
-        return this.getSize().height - this.getFrameHeight();\r
-    },\r
-\r
-    // private\r
-    syncShadow : function(){\r
-        if(this.floating){\r
-            this.el.sync(true);\r
-        }\r
-    },\r
-\r
-    // private\r
-    getLayoutTarget : function(){\r
-        return this.body;\r
-    },\r
-\r
-    \r
-    setTitle : function(title, iconCls){\r
-        this.title = title;\r
-        if(this.header && this.headerAsText){\r
-            this.header.child('span').update(title);\r
-        }\r
-        if(iconCls){\r
-            this.setIconClass(iconCls);\r
-        }\r
-        this.fireEvent('titlechange', this, title);\r
-        return this;\r
-    },\r
-\r
-    \r
-    getUpdater : function(){\r
-        return this.body.getUpdater();\r
-    },\r
-\r
-     \r
-    load : function(){\r
-        var um = this.body.getUpdater();\r
-        um.update.apply(um, arguments);\r
-        return this;\r
-    },\r
-\r
-    // private\r
-    beforeDestroy : function(){\r
-        if(this.header){\r
-            this.header.removeAllListeners();\r
-            if(this.headerAsText){\r
-                Ext.Element.uncache(this.header.child('span'));\r
-            }\r
-        }\r
-        Ext.Element.uncache(\r
-            this.header,\r
-            this.tbar,\r
-            this.bbar,\r
-            this.footer,\r
-            this.body,\r
-            this.bwrap\r
-        );\r
-        if(this.tools){\r
-            for(var k in this.tools){\r
-                Ext.destroy(this.tools[k]);\r
-            }\r
-        }\r
-        if(this.buttons){\r
-            for(var b in this.buttons){\r
-                Ext.destroy(this.buttons[b]);\r
-            }\r
-        }\r
-        Ext.destroy(\r
-            this.topToolbar,\r
-            this.bottomToolbar\r
-        );\r
-        Ext.Panel.superclass.beforeDestroy.call(this);\r
-    },\r
-\r
-    // private\r
-    createClasses : function(){\r
-        this.headerCls = this.baseCls + '-header';\r
-        this.headerTextCls = this.baseCls + '-header-text';\r
-        this.bwrapCls = this.baseCls + '-bwrap';\r
-        this.tbarCls = this.baseCls + '-tbar';\r
-        this.bodyCls = this.baseCls + '-body';\r
-        this.bbarCls = this.baseCls + '-bbar';\r
-        this.footerCls = this.baseCls + '-footer';\r
-    },\r
-\r
-    // private\r
-    createGhost : function(cls, useShim, appendTo){\r
-        var el = document.createElement('div');\r
-        el.className = 'x-panel-ghost ' + (cls ? cls : '');\r
-        if(this.header){\r
-            el.appendChild(this.el.dom.firstChild.cloneNode(true));\r
-        }\r
-        Ext.fly(el.appendChild(document.createElement('ul'))).setHeight(this.bwrap.getHeight());\r
-        el.style.width = this.el.dom.offsetWidth + 'px';;\r
-        if(!appendTo){\r
-            this.container.dom.appendChild(el);\r
-        }else{\r
-            Ext.getDom(appendTo).appendChild(el);\r
-        }\r
-        if(useShim !== false && this.el.useShim !== false){\r
-            var layer = new Ext.Layer({shadow:false, useDisplay:true, constrain:false}, el);\r
-            layer.show();\r
-            return layer;\r
-        }else{\r
-            return new Ext.Element(el);\r
-        }\r
-    },\r
-\r
-    // private\r
-    doAutoLoad : function(){\r
-        this.body.load(\r
-            typeof this.autoLoad == 'object' ?\r
-                this.autoLoad : {url: this.autoLoad});\r
-    },\r
-    \r
-    \r
-    getTool: function(id) {\r
-        return this.tools[id];\r
-    }\r
-\r
-\r
-});\r
-Ext.reg('panel', Ext.Panel);\r
-\r
-\r
-Ext.Window = Ext.extend(Ext.Panel, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    baseCls : 'x-window',\r
-    \r
-    resizable:true,\r
-    \r
-    draggable:true,\r
-    \r
-    closable : true,\r
-    \r
-    constrain:false,\r
-    \r
-    constrainHeader:false,\r
-    \r
-    plain:false,\r
-    \r
-    minimizable : false,\r
-    \r
-    maximizable : false,\r
-    \r
-    minHeight: 100,\r
-    \r
-    minWidth: 200,\r
-    \r
-    expandOnShow: true,\r
-    \r
-    closeAction: 'close',\r
-    \r
-    elements: 'header,body',\r
-\r
-    // inherited docs, same default\r
-    collapsible:false,\r
-\r
-    // private\r
-    initHidden : true,\r
-    \r
-    monitorResize : true,\r
-    \r
-    frame:true,\r
-    \r
-    floating:true,\r
-\r
-    // private\r
-    initComponent : function(){\r
-        Ext.Window.superclass.initComponent.call(this);\r
-        this.addEvents(\r
-            \r
-            \r
-            \r
-            'resize',\r
-            \r
-            'maximize',\r
-            \r
-            'minimize',\r
-            \r
-            'restore'\r
-        );\r
-    },\r
-\r
-    // private\r
-    getState : function(){\r
-        return Ext.apply(Ext.Window.superclass.getState.call(this) || {}, this.getBox());\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        Ext.Window.superclass.onRender.call(this, ct, position);\r
-\r
-        if(this.plain){\r
-            this.el.addClass('x-window-plain');\r
-        }\r
-\r
-        // this element allows the Window to be focused for keyboard events\r
-        this.focusEl = this.el.createChild({\r
-                    tag: "a", href:"#", cls:"x-dlg-focus",\r
-                    tabIndex:"-1", html: "&#160;"});\r
-        this.focusEl.swallowEvent('click', true);\r
-\r
-        this.proxy = this.el.createProxy("x-window-proxy");\r
-        this.proxy.enableDisplayMode('block');\r
-\r
-        if(this.modal){\r
-            this.mask = this.container.createChild({cls:"ext-el-mask"}, this.el.dom);\r
-            this.mask.enableDisplayMode("block");\r
-            this.mask.hide();\r
-            this.mask.on('click', this.focus, this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        Ext.Window.superclass.initEvents.call(this);\r
-        if(this.animateTarget){\r
-            this.setAnimateTarget(this.animateTarget);\r
-        }\r
-\r
-        if(this.resizable){\r
-            this.resizer = new Ext.Resizable(this.el, {\r
-                minWidth: this.minWidth,\r
-                minHeight:this.minHeight,\r
-                handles: this.resizeHandles || "all",\r
-                pinned: true,\r
-                resizeElement : this.resizerAction\r
-            });\r
-            this.resizer.window = this;\r
-            this.resizer.on("beforeresize", this.beforeResize, this);\r
-        }\r
-\r
-        if(this.draggable){\r
-            this.header.addClass("x-window-draggable");\r
-        }\r
-        this.initTools();\r
-\r
-        this.el.on("mousedown", this.toFront, this);\r
-        this.manager = this.manager || Ext.WindowMgr;\r
-        this.manager.register(this);\r
-        this.hidden = true;\r
-        if(this.maximized){\r
-            this.maximized = false;\r
-            this.maximize();\r
-        }\r
-        if(this.closable){\r
-            var km = this.getKeyMap();\r
-            km.on(27, this.onEsc, this);\r
-            km.disable();\r
-        }\r
-    },\r
-\r
-    initDraggable : function(){\r
-        \r
-        this.dd = new Ext.Window.DD(this);\r
-    },\r
-\r
-   // private\r
-    onEsc : function(){\r
-        this[this.closeAction]();\r
-    },\r
-\r
-    // private\r
-    beforeDestroy : function(){\r
-        this.hide();\r
-        if(this.doAnchor){\r
-            Ext.EventManager.removeResizeListener(this.doAnchor, this);\r
-            Ext.EventManager.un(window, 'scroll', this.doAnchor, this);\r
-        }\r
-        Ext.destroy(\r
-            this.focusEl,\r
-            this.resizer,\r
-            this.dd,\r
-            this.proxy,\r
-            this.mask\r
-        );\r
-        Ext.Window.superclass.beforeDestroy.call(this);\r
-    },\r
-\r
-    // private\r
-    onDestroy : function(){\r
-        if(this.manager){\r
-            this.manager.unregister(this);\r
-        }\r
-        Ext.Window.superclass.onDestroy.call(this);\r
-    },\r
-\r
-    // private\r
-    initTools : function(){\r
-        if(this.minimizable){\r
-            this.addTool({\r
-                id: 'minimize',\r
-                handler: this.minimize.createDelegate(this, [])\r
-            });\r
-        }\r
-        if(this.maximizable){\r
-            this.addTool({\r
-                id: 'maximize',\r
-                handler: this.maximize.createDelegate(this, [])\r
-            });\r
-            this.addTool({\r
-                id: 'restore',\r
-                handler: this.restore.createDelegate(this, []),\r
-                hidden:true\r
-            });\r
-            this.header.on('dblclick', this.toggleMaximize, this);\r
-        }\r
-        if(this.closable){\r
-            this.addTool({\r
-                id: 'close',\r
-                handler: this[this.closeAction].createDelegate(this, [])\r
-            });\r
-        }\r
-    },\r
-\r
-    // private\r
-    resizerAction : function(){\r
-        var box = this.proxy.getBox();\r
-        this.proxy.hide();\r
-        this.window.handleResize(box);\r
-        return box;\r
-    },\r
-\r
-    // private\r
-    beforeResize : function(){\r
-        this.resizer.minHeight = Math.max(this.minHeight, this.getFrameHeight() + 40); // 40 is a magic minimum content size?\r
-        this.resizer.minWidth = Math.max(this.minWidth, this.getFrameWidth() + 40);\r
-        this.resizeBox = this.el.getBox();\r
-    },\r
-\r
-    // private\r
-    updateHandles : function(){\r
-        if(Ext.isIE && this.resizer){\r
-            this.resizer.syncHandleHeight();\r
-            this.el.repaint();\r
-        }\r
-    },\r
-\r
-    // private\r
-    handleResize : function(box){\r
-        var rz = this.resizeBox;\r
-        if(rz.x != box.x || rz.y != box.y){\r
-            this.updateBox(box);\r
-        }else{\r
-            this.setSize(box);\r
-        }\r
-        this.focus();\r
-        this.updateHandles();\r
-        this.saveState();\r
-        if(this.layout){\r
-            this.doLayout();\r
-        }\r
-        this.fireEvent("resize", this, box.width, box.height);\r
-    },\r
-\r
-    \r
-    focus : function(){\r
-        var f = this.focusEl, db = this.defaultButton, t = typeof db;\r
-        if(t != 'undefined'){\r
-            if(t == 'number'){\r
-                f = this.buttons[db];\r
-            }else if(t == 'string'){\r
-                f = Ext.getCmp(db);\r
-            }else{\r
-                f = db;\r
-            }\r
-        }\r
-        f.focus.defer(10, f);\r
-    },\r
-\r
-    \r
-    setAnimateTarget : function(el){\r
-        el = Ext.get(el);\r
-        this.animateTarget = el;\r
-    },\r
-\r
-    // private\r
-    beforeShow : function(){\r
-        delete this.el.lastXY;\r
-        delete this.el.lastLT;\r
-        if(this.x === undefined || this.y === undefined){\r
-            var xy = this.el.getAlignToXY(this.container, 'c-c');\r
-            var pos = this.el.translatePoints(xy[0], xy[1]);\r
-            this.x = this.x === undefined? pos.left : this.x;\r
-            this.y = this.y === undefined? pos.top : this.y;\r
-        }\r
-        this.el.setLeftTop(this.x, this.y);\r
-\r
-        if(this.expandOnShow){\r
-            this.expand(false);\r
-        }\r
-\r
-        if(this.modal){\r
-            Ext.getBody().addClass("x-body-masked");\r
-            this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));\r
-            this.mask.show();\r
-        }\r
-    },\r
-\r
-    \r
-    show : function(animateTarget, cb, scope){\r
-        if(!this.rendered){\r
-            this.render(Ext.getBody());\r
-        }\r
-        if(this.hidden === false){\r
-            this.toFront();\r
-            return;\r
-        }\r
-        if(this.fireEvent("beforeshow", this) === false){\r
-            return;\r
-        }\r
-        if(cb){\r
-            this.on('show', cb, scope, {single:true});\r
-        }\r
-        this.hidden = false;\r
-        if(animateTarget !== undefined){\r
-            this.setAnimateTarget(animateTarget);\r
-        }\r
-        this.beforeShow();\r
-        if(this.animateTarget){\r
-            this.animShow();\r
-        }else{\r
-            this.afterShow();\r
-        }\r
-    },\r
-\r
-    // private\r
-    afterShow : function(){\r
-        this.proxy.hide();\r
-        this.el.setStyle('display', 'block');\r
-        this.el.show();\r
-        if(this.maximized){\r
-            this.fitContainer();\r
-        }\r
-        if(Ext.isMac && Ext.isGecko){ // work around stupid FF 2.0/Mac scroll bar bug\r
-               this.cascade(this.setAutoScroll);\r
-        }\r
-\r
-        if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){\r
-            Ext.EventManager.onWindowResize(this.onWindowResize, this);\r
-        }\r
-        this.doConstrain();\r
-        if(this.layout){\r
-            this.doLayout();\r
-        }\r
-        if(this.keyMap){\r
-            this.keyMap.enable();\r
-        }\r
-        this.toFront();\r
-        this.updateHandles();\r
-        this.fireEvent("show", this);\r
-    },\r
-\r
-    // private\r
-    animShow : function(){\r
-        this.proxy.show();\r
-        this.proxy.setBox(this.animateTarget.getBox());\r
-        this.proxy.setOpacity(0);\r
-        var b = this.getBox(false);\r
-        b.callback = this.afterShow;\r
-        b.scope = this;\r
-        b.duration = .25;\r
-        b.easing = 'easeNone';\r
-        b.opacity = .5;\r
-        b.block = true;\r
-        this.el.setStyle('display', 'none');\r
-        this.proxy.shift(b);\r
-    },\r
-\r
-    \r
-    hide : function(animateTarget, cb, scope){\r
-        if(this.activeGhost){ // drag active?\r
-            this.hide.defer(100, this, [animateTarget, cb, scope]);\r
-            return;\r
-        }\r
-        if(this.hidden || this.fireEvent("beforehide", this) === false){\r
-            return;\r
-        }\r
-        if(cb){\r
-            this.on('hide', cb, scope, {single:true});\r
-        }\r
-        this.hidden = true;\r
-        if(animateTarget !== undefined){\r
-            this.setAnimateTarget(animateTarget);\r
-        }\r
-        if(this.animateTarget){\r
-            this.animHide();\r
-        }else{\r
-            this.el.hide();\r
-            this.afterHide();\r
-        }\r
-    },\r
-\r
-    // private\r
-    afterHide : function(){\r
-        this.proxy.hide();\r
-        if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){\r
-            Ext.EventManager.removeResizeListener(this.onWindowResize, this);\r
-        }\r
-        if(this.modal){\r
-            this.mask.hide();\r
-            Ext.getBody().removeClass("x-body-masked");\r
-        }\r
-        if(this.keyMap){\r
-            this.keyMap.disable();\r
-        }\r
-        this.fireEvent("hide", this);\r
-    },\r
-\r
-    // private\r
-    animHide : function(){\r
-        this.proxy.setOpacity(.5);\r
-        this.proxy.show();\r
-        var tb = this.getBox(false);\r
-        this.proxy.setBox(tb);\r
-        this.el.hide();\r
-        var b = this.animateTarget.getBox();\r
-        b.callback = this.afterHide;\r
-        b.scope = this;\r
-        b.duration = .25;\r
-        b.easing = 'easeNone';\r
-        b.block = true;\r
-        b.opacity = 0;\r
-        this.proxy.shift(b);\r
-    },\r
-\r
-    // private\r
-    onWindowResize : function(){\r
-        if(this.maximized){\r
-            this.fitContainer();\r
-        }\r
-        if(this.modal){\r
-            this.mask.setSize('100%', '100%');\r
-            var force = this.mask.dom.offsetHeight;\r
-            this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));\r
-        }\r
-        this.doConstrain();\r
-    },\r
-\r
-    // private\r
-    doConstrain : function(){\r
-        if(this.constrain || this.constrainHeader){\r
-            var offsets;\r
-            if(this.constrain){\r
-                offsets = {\r
-                    right:this.el.shadowOffset,\r
-                    left:this.el.shadowOffset,\r
-                    bottom:this.el.shadowOffset\r
-                };\r
-            }else {\r
-                var s = this.getSize();\r
-                offsets = {\r
-                    right:-(s.width - 100),\r
-                    bottom:-(s.height - 25)\r
-                };\r
-            }\r
-\r
-            var xy = this.el.getConstrainToXY(this.container, true, offsets);\r
-            if(xy){\r
-                this.setPosition(xy[0], xy[1]);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private - used for dragging\r
-    ghost : function(cls){\r
-        var ghost = this.createGhost(cls);\r
-        var box = this.getBox(true);\r
-        ghost.setLeftTop(box.x, box.y);\r
-        ghost.setWidth(box.width);\r
-        this.el.hide();\r
-        this.activeGhost = ghost;\r
-        return ghost;\r
-    },\r
-\r
-    // private\r
-    unghost : function(show, matchPosition){\r
-        if(show !== false){\r
-            this.el.show();\r
-            this.focus();\r
-               if(Ext.isMac && Ext.isGecko){ // work around stupid FF 2.0/Mac scroll bar bug\r
-                       this.cascade(this.setAutoScroll);\r
-               }\r
-        }\r
-        if(matchPosition !== false){\r
-            this.setPosition(this.activeGhost.getLeft(true), this.activeGhost.getTop(true));\r
-        }\r
-        this.activeGhost.hide();\r
-        this.activeGhost.remove();\r
-        delete this.activeGhost;\r
-    },\r
-\r
-    \r
-    minimize : function(){\r
-        this.fireEvent('minimize', this);\r
-    },\r
-\r
-    \r
-    close : function(){\r
-        if(this.fireEvent("beforeclose", this) !== false){\r
-            this.hide(null, function(){\r
-                this.fireEvent('close', this);\r
-                this.destroy();\r
-            }, this);\r
-        }\r
-    },\r
-\r
-    \r
-    maximize : function(){\r
-        if(!this.maximized){\r
-            this.expand(false);\r
-            this.restoreSize = this.getSize();\r
-            this.restorePos = this.getPosition(true);\r
-            if (this.maximizable){\r
-                this.tools.maximize.hide();\r
-                this.tools.restore.show();\r
-            }\r
-            this.maximized = true;\r
-            this.el.disableShadow();\r
-\r
-            if(this.dd){\r
-                this.dd.lock();\r
-            }\r
-            if(this.collapsible){\r
-                this.tools.toggle.hide();\r
-            }\r
-            this.el.addClass('x-window-maximized');\r
-            this.container.addClass('x-window-maximized-ct');\r
-\r
-            this.setPosition(0, 0);\r
-            this.fitContainer();\r
-            this.fireEvent('maximize', this);\r
-        }\r
-    },\r
-\r
-    \r
-    restore : function(){\r
-        if(this.maximized){\r
-            this.el.removeClass('x-window-maximized');\r
-            this.tools.restore.hide();\r
-            this.tools.maximize.show();\r
-            this.setPosition(this.restorePos[0], this.restorePos[1]);\r
-            this.setSize(this.restoreSize.width, this.restoreSize.height);\r
-            delete this.restorePos;\r
-            delete this.restoreSize;\r
-            this.maximized = false;\r
-            this.el.enableShadow(true);\r
-\r
-            if(this.dd){\r
-                this.dd.unlock();\r
-            }\r
-            if(this.collapsible){\r
-                this.tools.toggle.show();\r
-            }\r
-            this.container.removeClass('x-window-maximized-ct');\r
-\r
-            this.doConstrain();\r
-            this.fireEvent('restore', this);\r
-        }\r
-    },\r
-\r
-    \r
-    toggleMaximize : function(){\r
-        this[this.maximized ? 'restore' : 'maximize']();\r
-    },\r
-\r
-    // private\r
-    fitContainer : function(){\r
-        var vs = this.container.getViewSize();\r
-        this.setSize(vs.width, vs.height);\r
-    },\r
-\r
-    // private\r
-    // z-index is managed by the WindowManager and may be overwritten at any time\r
-    setZIndex : function(index){\r
-        if(this.modal){\r
-            this.mask.setStyle("z-index", index);\r
-        }\r
-        this.el.setZIndex(++index);\r
-        index += 5;\r
-\r
-        if(this.resizer){\r
-            this.resizer.proxy.setStyle("z-index", ++index);\r
-        }\r
-\r
-        this.lastZIndex = index;\r
-    },\r
-\r
-    \r
-    alignTo : function(element, position, offsets){\r
-        var xy = this.el.getAlignToXY(element, position, offsets);\r
-        this.setPagePosition(xy[0], xy[1]);\r
-        return this;\r
-    },\r
-\r
-    \r
-    anchorTo : function(el, alignment, offsets, monitorScroll){\r
-      if(this.doAnchor){\r
-          Ext.EventManager.removeResizeListener(this.doAnchor, this);\r
-          Ext.EventManager.un(window, 'scroll', this.doAnchor, this);\r
-      }\r
-      this.doAnchor = function(){\r
-          this.alignTo(el, alignment, offsets);\r
-      };\r
-      Ext.EventManager.onWindowResize(this.doAnchor, this);\r
-      \r
-      var tm = typeof monitorScroll;\r
-      if(tm != 'undefined'){\r
-          Ext.EventManager.on(window, 'scroll', this.doAnchor, this,\r
-              {buffer: tm == 'number' ? monitorScroll : 50});\r
-      }\r
-      this.doAnchor();\r
-      return this;\r
-    },\r
-\r
-    \r
-    toFront : function(e){\r
-        if(this.manager.bringToFront(this)){\r
-            if(!e || !e.getTarget().focus){\r
-                this.focus();\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    setActive : function(active){\r
-        if(active){\r
-            if(!this.maximized){\r
-                this.el.enableShadow(true);\r
-            }\r
-            this.fireEvent('activate', this);\r
-        }else{\r
-            this.el.disableShadow();\r
-            this.fireEvent('deactivate', this);\r
-        }\r
-    },\r
-\r
-    \r
-    toBack : function(){\r
-        this.manager.sendToBack(this);\r
-        return this;\r
-    },\r
-\r
-    \r
-    center : function(){\r
-        var xy = this.el.getAlignToXY(this.container, 'c-c');\r
-        this.setPagePosition(xy[0], xy[1]);\r
-        return this;\r
-    }\r
-\r
-    \r
-});\r
-Ext.reg('window', Ext.Window);\r
-\r
-// private - custom Window DD implementation\r
-Ext.Window.DD = function(win){\r
-    this.win = win;\r
-    Ext.Window.DD.superclass.constructor.call(this, win.el.id, 'WindowDD-'+win.id);\r
-    this.setHandleElId(win.header.id);\r
-    this.scroll = false;\r
-};\r
-\r
-Ext.extend(Ext.Window.DD, Ext.dd.DD, {\r
-    moveOnly:true,\r
-    headerOffsets:[100, 25],\r
-    startDrag : function(){\r
-        var w = this.win;\r
-        this.proxy = w.ghost();\r
-        if(w.constrain !== false){\r
-            var so = w.el.shadowOffset;\r
-            this.constrainTo(w.container, {right: so, left: so, bottom: so});\r
-        }else if(w.constrainHeader !== false){\r
-            var s = this.proxy.getSize();\r
-            this.constrainTo(w.container, {right: -(s.width-this.headerOffsets[0]), bottom: -(s.height-this.headerOffsets[1])});\r
-        }\r
-    },\r
-    b4Drag : Ext.emptyFn,\r
-\r
-    onDrag : function(e){\r
-        this.alignElWithMouse(this.proxy, e.getPageX(), e.getPageY());\r
-    },\r
-\r
-    endDrag : function(e){\r
-        this.win.unghost();\r
-        this.win.saveState();\r
-    }\r
-});\r
-\r
-\r
-Ext.WindowGroup = function(){\r
-    var list = {};\r
-    var accessList = [];\r
-    var front = null;\r
-\r
-    // private\r
-    var sortWindows = function(d1, d2){\r
-        return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1;\r
-    };\r
-\r
-    // private\r
-    var orderWindows = function(){\r
-        var a = accessList, len = a.length;\r
-        if(len > 0){\r
-            a.sort(sortWindows);\r
-            var seed = a[0].manager.zseed;\r
-            for(var i = 0; i < len; i++){\r
-                var win = a[i];\r
-                if(win && !win.hidden){\r
-                    win.setZIndex(seed + (i*10));\r
-                }\r
-            }\r
-        }\r
-        activateLast();\r
-    };\r
-\r
-    // private\r
-    var setActiveWin = function(win){\r
-        if(win != front){\r
-            if(front){\r
-                front.setActive(false);\r
-            }\r
-            front = win;\r
-            if(win){\r
-                win.setActive(true);\r
-            }\r
-        }\r
-    };\r
-\r
-    // private\r
-    var activateLast = function(){\r
-        for(var i = accessList.length-1; i >=0; --i) {\r
-            if(!accessList[i].hidden){\r
-                setActiveWin(accessList[i]);\r
-                return;\r
-            }\r
-        }\r
-        // none to activate\r
-        setActiveWin(null);\r
-    };\r
-\r
-    return {\r
-        \r
-        zseed : 9000,\r
-\r
-        // private\r
-        register : function(win){\r
-            list[win.id] = win;\r
-            accessList.push(win);\r
-            win.on('hide', activateLast);\r
-        },\r
-\r
-        // private\r
-        unregister : function(win){\r
-            delete list[win.id];\r
-            win.un('hide', activateLast);\r
-            accessList.remove(win);\r
-        },\r
-\r
-        \r
-        get : function(id){\r
-            return typeof id == "object" ? id : list[id];\r
-        },\r
-\r
-        \r
-        bringToFront : function(win){\r
-            win = this.get(win);\r
-            if(win != front){\r
-                win._lastAccess = new Date().getTime();\r
-                orderWindows();\r
-                return true;\r
-            }\r
-            return false;\r
-        },\r
-\r
-        \r
-        sendToBack : function(win){\r
-            win = this.get(win);\r
-            win._lastAccess = -(new Date().getTime());\r
-            orderWindows();\r
-            return win;\r
-        },\r
-\r
-        \r
-        hideAll : function(){\r
-            for(var id in list){\r
-                if(list[id] && typeof list[id] != "function" && list[id].isVisible()){\r
-                    list[id].hide();\r
-                }\r
-            }\r
-        },\r
-\r
-        \r
-        getActive : function(){\r
-            return front;\r
-        },\r
-\r
-        \r
-        getBy : function(fn, scope){\r
-            var r = [];\r
-            for(var i = accessList.length-1; i >=0; --i) {\r
-                var win = accessList[i];\r
-                if(fn.call(scope||win, win) !== false){\r
-                    r.push(win);\r
-                }\r
-            }\r
-            return r;\r
-        },\r
-\r
-        \r
-        each : function(fn, scope){\r
-            for(var id in list){\r
-                if(list[id] && typeof list[id] != "function"){\r
-                    if(fn.call(scope || list[id], list[id]) === false){\r
-                        return;\r
-                    }\r
-                }\r
-            }\r
-        }\r
-    };\r
-};\r
-\r
-\r
-\r
-Ext.WindowMgr = new Ext.WindowGroup();\r
-\r
-Ext.dd.PanelProxy = function(panel, config){\r
-    this.panel = panel;\r
-    this.id = this.panel.id +'-ddproxy';\r
-    Ext.apply(this, config);\r
-};\r
-\r
-Ext.dd.PanelProxy.prototype = {\r
-    \r
-    insertProxy : true,\r
-\r
-    // private overrides\r
-    setStatus : Ext.emptyFn,\r
-    reset : Ext.emptyFn,\r
-    update : Ext.emptyFn,\r
-    stop : Ext.emptyFn,\r
-    sync: Ext.emptyFn,\r
-\r
-    \r
-    getEl : function(){\r
-        return this.ghost;\r
-    },\r
-\r
-    \r
-    getGhost : function(){\r
-        return this.ghost;\r
-    },\r
-\r
-    \r
-    getProxy : function(){\r
-        return this.proxy;\r
-    },\r
-\r
-    \r
-    hide : function(){\r
-        if(this.ghost){\r
-            if(this.proxy){\r
-                this.proxy.remove();\r
-                delete this.proxy;\r
-            }\r
-            this.panel.el.dom.style.display = '';\r
-            this.ghost.remove();\r
-            delete this.ghost;\r
-        }\r
-    },\r
-\r
-    \r
-    show : function(){\r
-        if(!this.ghost){\r
-            this.ghost = this.panel.createGhost(undefined, undefined, Ext.getBody());\r
-            this.ghost.setXY(this.panel.el.getXY())\r
-            if(this.insertProxy){\r
-                this.proxy = this.panel.el.insertSibling({cls:'x-panel-dd-spacer'});\r
-                this.proxy.setSize(this.panel.getSize());\r
-            }\r
-            this.panel.el.dom.style.display = 'none';\r
-        }\r
-    },\r
-\r
-    // private\r
-    repair : function(xy, callback, scope){\r
-        this.hide();\r
-        if(typeof callback == "function"){\r
-            callback.call(scope || this);\r
-        }\r
-    },\r
-\r
-    \r
-    moveProxy : function(parentNode, before){\r
-        if(this.proxy){\r
-            parentNode.insertBefore(this.proxy.dom, before);\r
-        }\r
-    }\r
-};\r
-\r
-// private - DD implementation for Panels\r
-Ext.Panel.DD = function(panel, cfg){\r
-    this.panel = panel;\r
-    this.dragData = {panel: panel};\r
-    this.proxy = new Ext.dd.PanelProxy(panel, cfg);\r
-    Ext.Panel.DD.superclass.constructor.call(this, panel.el, cfg);\r
-    var h = panel.header;\r
-    if(h){\r
-        this.setHandleElId(h.id);\r
-    }\r
-    (h ? h : this.panel.body).setStyle('cursor', 'move');\r
-    this.scroll = false;\r
-};\r
-\r
-Ext.extend(Ext.Panel.DD, Ext.dd.DragSource, {\r
-    showFrame: Ext.emptyFn,\r
-    startDrag: Ext.emptyFn,\r
-    b4StartDrag: function(x, y) {\r
-        this.proxy.show();\r
-    },\r
-    b4MouseDown: function(e) {\r
-        var x = e.getPageX();\r
-        var y = e.getPageY();\r
-        this.autoOffset(x, y);\r
-    },\r
-    onInitDrag : function(x, y){\r
-        this.onStartDrag(x, y);\r
-        return true;\r
-    },\r
-    createFrame : Ext.emptyFn,\r
-    getDragEl : function(e){\r
-        return this.proxy.ghost.dom;\r
-    },\r
-    endDrag : function(e){\r
-        this.proxy.hide();\r
-        this.panel.saveState();\r
-    },\r
-\r
-    autoOffset : function(x, y) {\r
-        x -= this.startPageX;\r
-        y -= this.startPageY;\r
-        this.setDelta(x, y);\r
-    }\r
-});\r
-\r
-Ext.state.Provider = function(){\r
-    \r
-    this.addEvents("statechange");\r
-    this.state = {};\r
-    Ext.state.Provider.superclass.constructor.call(this);\r
-};\r
-Ext.extend(Ext.state.Provider, Ext.util.Observable, {\r
-    \r
-    get : function(name, defaultValue){\r
-        return typeof this.state[name] == "undefined" ?\r
-            defaultValue : this.state[name];\r
-    },\r
-    \r
-    \r
-    clear : function(name){\r
-        delete this.state[name];\r
-        this.fireEvent("statechange", this, name, null);\r
-    },\r
-    \r
-    \r
-    set : function(name, value){\r
-        this.state[name] = value;\r
-        this.fireEvent("statechange", this, name, value);\r
-    },\r
-    \r
-    \r
-    decodeValue : function(cookie){\r
-        var re = /^(a|n|d|b|s|o)\:(.*)$/;\r
-        var matches = re.exec(unescape(cookie));\r
-        if(!matches || !matches[1]) return; // non state cookie\r
-        var type = matches[1];\r
-        var v = matches[2];\r
-        switch(type){\r
-            case "n":\r
-                return parseFloat(v);\r
-            case "d":\r
-                return new Date(Date.parse(v));\r
-            case "b":\r
-                return (v == "1");\r
-            case "a":\r
-                var all = [];\r
-                var values = v.split("^");\r
-                for(var i = 0, len = values.length; i < len; i++){\r
-                    all.push(this.decodeValue(values[i]));\r
-                }\r
-                return all;\r
-           case "o":\r
-                var all = {};\r
-                var values = v.split("^");\r
-                for(var i = 0, len = values.length; i < len; i++){\r
-                    var kv = values[i].split("=");\r
-                    all[kv[0]] = this.decodeValue(kv[1]);\r
-                }\r
-                return all;\r
-           default:\r
-                return v;\r
-        }\r
-    },\r
-    \r
-    \r
-    encodeValue : function(v){\r
-        var enc;\r
-        if(typeof v == "number"){\r
-            enc = "n:" + v;\r
-        }else if(typeof v == "boolean"){\r
-            enc = "b:" + (v ? "1" : "0");\r
-        }else if(Ext.isDate(v)){\r
-            enc = "d:" + v.toGMTString();\r
-        }else if(Ext.isArray(v)){\r
-            var flat = "";\r
-            for(var i = 0, len = v.length; i < len; i++){\r
-                flat += this.encodeValue(v[i]);\r
-                if(i != len-1) flat += "^";\r
-            }\r
-            enc = "a:" + flat;\r
-        }else if(typeof v == "object"){\r
-            var flat = "";\r
-            for(var key in v){\r
-                if(typeof v[key] != "function" && v[key] !== undefined){\r
-                    flat += key + "=" + this.encodeValue(v[key]) + "^";\r
-                }\r
-            }\r
-            enc = "o:" + flat.substring(0, flat.length-1);\r
-        }else{\r
-            enc = "s:" + v;\r
-        }\r
-        return escape(enc);        \r
-    }\r
-});\r
-\r
-\r
-Ext.state.Manager = function(){\r
-    var provider = new Ext.state.Provider();\r
-\r
-    return {\r
-        \r
-        setProvider : function(stateProvider){\r
-            provider = stateProvider;\r
-        },\r
-\r
-        \r
-        get : function(key, defaultValue){\r
-            return provider.get(key, defaultValue);\r
-        },\r
-\r
-        \r
-         set : function(key, value){\r
-            provider.set(key, value);\r
-        },\r
-\r
-        \r
-        clear : function(key){\r
-            provider.clear(key);\r
-        },\r
-\r
-        \r
-        getProvider : function(){\r
-            return provider;\r
-        }\r
-    };\r
-}();\r
-\r
-\r
-Ext.state.CookieProvider = function(config){\r
-    Ext.state.CookieProvider.superclass.constructor.call(this);\r
-    this.path = "/";\r
-    this.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); //7 days\r
-    this.domain = null;\r
-    this.secure = false;\r
-    Ext.apply(this, config);\r
-    this.state = this.readCookies();\r
-};\r
-\r
-Ext.extend(Ext.state.CookieProvider, Ext.state.Provider, {\r
-    // private\r
-    set : function(name, value){\r
-        if(typeof value == "undefined" || value === null){\r
-            this.clear(name);\r
-            return;\r
-        }\r
-        this.setCookie(name, value);\r
-        Ext.state.CookieProvider.superclass.set.call(this, name, value);\r
-    },\r
-\r
-    // private\r
-    clear : function(name){\r
-        this.clearCookie(name);\r
-        Ext.state.CookieProvider.superclass.clear.call(this, name);\r
-    },\r
-\r
-    // private\r
-    readCookies : function(){\r
-        var cookies = {};\r
-        var c = document.cookie + ";";\r
-        var re = /\s?(.*?)=(.*?);/g;\r
-       var matches;\r
-       while((matches = re.exec(c)) != null){\r
-            var name = matches[1];\r
-            var value = matches[2];\r
-            if(name && name.substring(0,3) == "ys-"){\r
-                cookies[name.substr(3)] = this.decodeValue(value);\r
-            }\r
-        }\r
-        return cookies;\r
-    },\r
-\r
-    // private\r
-    setCookie : function(name, value){\r
-        document.cookie = "ys-"+ name + "=" + this.encodeValue(value) +\r
-           ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) +\r
-           ((this.path == null) ? "" : ("; path=" + this.path)) +\r
-           ((this.domain == null) ? "" : ("; domain=" + this.domain)) +\r
-           ((this.secure == true) ? "; secure" : "");\r
-    },\r
-\r
-    // private\r
-    clearCookie : function(name){\r
-        document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +\r
-           ((this.path == null) ? "" : ("; path=" + this.path)) +\r
-           ((this.domain == null) ? "" : ("; domain=" + this.domain)) +\r
-           ((this.secure == true) ? "; secure" : "");\r
-    }\r
-});\r
-\r
-Ext.DataView = Ext.extend(Ext.BoxComponent, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    selectedClass : "x-view-selected",\r
-    \r
-    emptyText : "",\r
-\r
-    \r
-    deferEmptyText: true,\r
-    \r
-    trackOver: false,\r
-\r
-    //private\r
-    last: false,\r
-\r
-\r
-    // private\r
-    initComponent : function(){\r
-        Ext.DataView.superclass.initComponent.call(this);\r
-        if(typeof this.tpl == "string"){\r
-            this.tpl = new Ext.XTemplate(this.tpl);\r
-        }\r
-\r
-        this.addEvents(\r
-            \r
-            "beforeclick",\r
-            \r
-            "click",\r
-            \r
-            "mouseenter",\r
-            \r
-            "mouseleave",\r
-            \r
-            "containerclick",\r
-            \r
-            "dblclick",\r
-            \r
-            "contextmenu",\r
-            \r
-            "selectionchange",\r
-\r
-            \r
-            "beforeselect"\r
-        );\r
-\r
-        this.all = new Ext.CompositeElementLite();\r
-        this.selected = new Ext.CompositeElementLite();\r
-    },\r
-\r
-    // private\r
-    onRender : function(){\r
-        if(!this.el){\r
-            this.el = document.createElement('div');\r
-            this.el.id = this.id;\r
-        }\r
-        Ext.DataView.superclass.onRender.apply(this, arguments);\r
-    },\r
-\r
-    // private\r
-    afterRender : function(){\r
-        Ext.DataView.superclass.afterRender.call(this);\r
-\r
-        this.el.on({\r
-            "click": this.onClick,\r
-            "dblclick": this.onDblClick,\r
-            "contextmenu": this.onContextMenu,\r
-            scope:this\r
-        });\r
-\r
-        if(this.overClass || this.trackOver){\r
-            this.el.on({\r
-                "mouseover": this.onMouseOver,\r
-                "mouseout": this.onMouseOut,\r
-                scope:this\r
-            });\r
-        }\r
-\r
-        if(this.store){\r
-            this.setStore(this.store, true);\r
-        }\r
-    },\r
-\r
-    \r
-    refresh : function(){\r
-        this.clearSelections(false, true);\r
-        this.el.update("");\r
-        var records = this.store.getRange();\r
-        if(records.length < 1){\r
-            if(!this.deferEmptyText || this.hasSkippedEmptyText){\r
-                this.el.update(this.emptyText);\r
-            }\r
-            this.hasSkippedEmptyText = true;\r
-            this.all.clear();\r
-            return;\r
-        }\r
-        this.tpl.overwrite(this.el, this.collectData(records, 0));\r
-        this.all.fill(Ext.query(this.itemSelector, this.el.dom));\r
-        this.updateIndexes(0);\r
-    },\r
-\r
-    \r
-    prepareData : function(data){\r
-        return data;\r
-    },\r
-\r
-    \r
-    collectData : function(records, startIndex){\r
-        var r = [];\r
-        for(var i = 0, len = records.length; i < len; i++){\r
-            r[r.length] = this.prepareData(records[i].data, startIndex+i, records[i]);\r
-        }\r
-        return r;\r
-    },\r
-\r
-    // private\r
-    bufferRender : function(records){\r
-        var div = document.createElement('div');\r
-        this.tpl.overwrite(div, this.collectData(records));\r
-        return Ext.query(this.itemSelector, div);\r
-    },\r
-\r
-    // private\r
-    onUpdate : function(ds, record){\r
-        var index = this.store.indexOf(record);\r
-        var sel = this.isSelected(index);\r
-        var original = this.all.elements[index];\r
-        var node = this.bufferRender([record], index)[0];\r
-\r
-        this.all.replaceElement(index, node, true);\r
-        if(sel){\r
-            this.selected.replaceElement(original, node);\r
-            this.all.item(index).addClass(this.selectedClass);\r
-        }\r
-        this.updateIndexes(index, index);\r
-    },\r
-\r
-    // private\r
-    onAdd : function(ds, records, index){\r
-        if(this.all.getCount() == 0){\r
-            this.refresh();\r
-            return;\r
-        }\r
-        var nodes = this.bufferRender(records, index), n, a = this.all.elements;\r
-        if(index < this.all.getCount()){\r
-            n = this.all.item(index).insertSibling(nodes, 'before', true);\r
-            a.splice.apply(a, [index, 0].concat(nodes));\r
-        }else{\r
-            n = this.all.last().insertSibling(nodes, 'after', true);\r
-            a.push.apply(a, nodes);\r
-        }\r
-        this.updateIndexes(index);\r
-    },\r
-\r
-    // private\r
-    onRemove : function(ds, record, index){\r
-        this.deselect(index);\r
-        this.all.removeElement(index, true);\r
-        this.updateIndexes(index);\r
-    },\r
-\r
-    \r
-    refreshNode : function(index){\r
-        this.onUpdate(this.store, this.store.getAt(index));\r
-    },\r
-\r
-    // private\r
-    updateIndexes : function(startIndex, endIndex){\r
-        var ns = this.all.elements;\r
-        startIndex = startIndex || 0;\r
-        endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length - 1));\r
-        for(var i = startIndex; i <= endIndex; i++){\r
-            ns[i].viewIndex = i;\r
-        }\r
-    },\r
-    \r
-    \r
-    getStore : function(){\r
-        return this.store;\r
-    },\r
-\r
-    \r
-    setStore : function(store, initial){\r
-        if(!initial && this.store){\r
-            this.store.un("beforeload", this.onBeforeLoad, this);\r
-            this.store.un("datachanged", this.refresh, this);\r
-            this.store.un("add", this.onAdd, this);\r
-            this.store.un("remove", this.onRemove, this);\r
-            this.store.un("update", this.onUpdate, this);\r
-            this.store.un("clear", this.refresh, this);\r
-        }\r
-        if(store){\r
-            store = Ext.StoreMgr.lookup(store);\r
-            store.on("beforeload", this.onBeforeLoad, this);\r
-            store.on("datachanged", this.refresh, this);\r
-            store.on("add", this.onAdd, this);\r
-            store.on("remove", this.onRemove, this);\r
-            store.on("update", this.onUpdate, this);\r
-            store.on("clear", this.refresh, this);\r
-        }\r
-        this.store = store;\r
-        if(store){\r
-            this.refresh();\r
-        }\r
-    },\r
-\r
-    \r
-    findItemFromChild : function(node){\r
-        return Ext.fly(node).findParent(this.itemSelector, this.el);\r
-    },\r
-\r
-    // private\r
-    onClick : function(e){\r
-        var item = e.getTarget(this.itemSelector, this.el);\r
-        if(item){\r
-            var index = this.indexOf(item);\r
-            if(this.onItemClick(item, index, e) !== false){\r
-                this.fireEvent("click", this, index, item, e);\r
-            }\r
-        }else{\r
-            if(this.fireEvent("containerclick", this, e) !== false){\r
-                this.clearSelections();\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    onContextMenu : function(e){\r
-        var item = e.getTarget(this.itemSelector, this.el);\r
-        if(item){\r
-            this.fireEvent("contextmenu", this, this.indexOf(item), item, e);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onDblClick : function(e){\r
-        var item = e.getTarget(this.itemSelector, this.el);\r
-        if(item){\r
-            this.fireEvent("dblclick", this, this.indexOf(item), item, e);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onMouseOver : function(e){\r
-        var item = e.getTarget(this.itemSelector, this.el);\r
-        if(item && item !== this.lastItem){\r
-            this.lastItem = item;\r
-            Ext.fly(item).addClass(this.overClass);\r
-            this.fireEvent("mouseenter", this, this.indexOf(item), item, e);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onMouseOut : function(e){\r
-        if(this.lastItem){\r
-            if(!e.within(this.lastItem, true, true)){\r
-                Ext.fly(this.lastItem).removeClass(this.overClass);\r
-                this.fireEvent("mouseleave", this, this.indexOf(this.lastItem), this.lastItem, e);\r
-                delete this.lastItem;\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    onItemClick : function(item, index, e){\r
-        if(this.fireEvent("beforeclick", this, index, item, e) === false){\r
-            return false;\r
-        }\r
-        if(this.multiSelect){\r
-            this.doMultiSelection(item, index, e);\r
-            e.preventDefault();\r
-        }else if(this.singleSelect){\r
-            this.doSingleSelection(item, index, e);\r
-            e.preventDefault();\r
-        }\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    doSingleSelection : function(item, index, e){\r
-        if(e.ctrlKey && this.isSelected(index)){\r
-            this.deselect(index);\r
-        }else{\r
-            this.select(index, false);\r
-        }\r
-    },\r
-\r
-    // private\r
-    doMultiSelection : function(item, index, e){\r
-        if(e.shiftKey && this.last !== false){\r
-            var last = this.last;\r
-            this.selectRange(last, index, e.ctrlKey);\r
-            this.last = last; // reset the last\r
-        }else{\r
-            if((e.ctrlKey||this.simpleSelect) && this.isSelected(index)){\r
-                this.deselect(index);\r
-            }else{\r
-                this.select(index, e.ctrlKey || e.shiftKey || this.simpleSelect);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    getSelectionCount : function(){\r
-        return this.selected.getCount()\r
-    },\r
-\r
-    \r
-    getSelectedNodes : function(){\r
-        return this.selected.elements;\r
-    },\r
-\r
-    \r
-    getSelectedIndexes : function(){\r
-        var indexes = [], s = this.selected.elements;\r
-        for(var i = 0, len = s.length; i < len; i++){\r
-            indexes.push(s[i].viewIndex);\r
-        }\r
-        return indexes;\r
-    },\r
-\r
-    \r
-    getSelectedRecords : function(){\r
-        var r = [], s = this.selected.elements;\r
-        for(var i = 0, len = s.length; i < len; i++){\r
-            r[r.length] = this.store.getAt(s[i].viewIndex);\r
-        }\r
-        return r;\r
-    },\r
-\r
-    \r
-    getRecords : function(nodes){\r
-        var r = [], s = nodes;\r
-        for(var i = 0, len = s.length; i < len; i++){\r
-            r[r.length] = this.store.getAt(s[i].viewIndex);\r
-        }\r
-        return r;\r
-    },\r
-\r
-    \r
-    getRecord : function(node){\r
-        return this.store.getAt(node.viewIndex);\r
-    },\r
-\r
-    \r
-    clearSelections : function(suppressEvent, skipUpdate){\r
-        if((this.multiSelect || this.singleSelect) && this.selected.getCount() > 0){\r
-            if(!skipUpdate){\r
-                this.selected.removeClass(this.selectedClass);\r
-            }\r
-            this.selected.clear();\r
-            this.last = false;\r
-            if(!suppressEvent){\r
-                this.fireEvent("selectionchange", this, this.selected.elements);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    isSelected : function(node){\r
-        return this.selected.contains(this.getNode(node));\r
-    },\r
-\r
-    \r
-    deselect : function(node){\r
-        if(this.isSelected(node)){\r
-            node = this.getNode(node);\r
-            this.selected.removeElement(node);\r
-            if(this.last == node.viewIndex){\r
-                this.last = false;\r
-            }\r
-            Ext.fly(node).removeClass(this.selectedClass);\r
-            this.fireEvent("selectionchange", this, this.selected.elements);\r
-        }\r
-    },\r
-\r
-    \r
-    select : function(nodeInfo, keepExisting, suppressEvent){\r
-        if(Ext.isArray(nodeInfo)){\r
-            if(!keepExisting){\r
-                this.clearSelections(true);\r
-            }\r
-            for(var i = 0, len = nodeInfo.length; i < len; i++){\r
-                this.select(nodeInfo[i], true, true);\r
-            }\r
-               if(!suppressEvent){\r
-                   this.fireEvent("selectionchange", this, this.selected.elements);\r
-               }\r
-        } else{\r
-            var node = this.getNode(nodeInfo);\r
-            if(!keepExisting){\r
-                this.clearSelections(true);\r
-            }\r
-            if(node && !this.isSelected(node)){\r
-                if(this.fireEvent("beforeselect", this, node, this.selected.elements) !== false){\r
-                    Ext.fly(node).addClass(this.selectedClass);\r
-                    this.selected.add(node);\r
-                    this.last = node.viewIndex;\r
-                    if(!suppressEvent){\r
-                        this.fireEvent("selectionchange", this, this.selected.elements);\r
-                    }\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    selectRange : function(start, end, keepExisting){\r
-        if(!keepExisting){\r
-            this.clearSelections(true);\r
-        }\r
-        this.select(this.getNodes(start, end), true);\r
-    },\r
-\r
-    \r
-    getNode : function(nodeInfo){\r
-        if(typeof nodeInfo == "string"){\r
-            return document.getElementById(nodeInfo);\r
-        }else if(typeof nodeInfo == "number"){\r
-            return this.all.elements[nodeInfo];\r
-        }\r
-        return nodeInfo;\r
-    },\r
-\r
-    \r
-    getNodes : function(start, end){\r
-        var ns = this.all.elements;\r
-        start = start || 0;\r
-        end = typeof end == "undefined" ? Math.max(ns.length - 1, 0) : end;\r
-        var nodes = [], i;\r
-        if(start <= end){\r
-            for(i = start; i <= end && ns[i]; i++){\r
-                nodes.push(ns[i]);\r
-            }\r
-        } else{\r
-            for(i = start; i >= end && ns[i]; i--){\r
-                nodes.push(ns[i]);\r
-            }\r
-        }\r
-        return nodes;\r
-    },\r
-\r
-    \r
-    indexOf : function(node){\r
-        node = this.getNode(node);\r
-        if(typeof node.viewIndex == "number"){\r
-            return node.viewIndex;\r
-        }\r
-        return this.all.indexOf(node);\r
-    },\r
-\r
-    // private\r
-    onBeforeLoad : function(){\r
-        if(this.loadingText){\r
-            this.clearSelections(false, true);\r
-            this.el.update('<div class="loading-indicator">'+this.loadingText+'</div>');\r
-            this.all.clear();\r
-        }\r
-    },\r
-\r
-    onDestroy : function(){\r
-        Ext.DataView.superclass.onDestroy.call(this);\r
-        this.setStore(null);\r
-    }\r
-});\r
-\r
-Ext.reg('dataview', Ext.DataView);\r
-\r
-Ext.ColorPalette = function(config){\r
-    Ext.ColorPalette.superclass.constructor.call(this, config);\r
-    this.addEvents(\r
-        \r
-        'select'\r
-    );\r
-\r
-    if(this.handler){\r
-        this.on("select", this.handler, this.scope, true);\r
-    }\r
-};\r
-Ext.extend(Ext.ColorPalette, Ext.Component, {\r
-       \r
-    \r
-    itemCls : "x-color-palette",\r
-    \r
-    value : null,\r
-    clickEvent:'click',\r
-    // private\r
-    ctype: "Ext.ColorPalette",\r
-\r
-    \r
-    allowReselect : false,\r
-\r
-    \r
-    colors : [\r
-        "000000", "993300", "333300", "003300", "003366", "000080", "333399", "333333",\r
-        "800000", "FF6600", "808000", "008000", "008080", "0000FF", "666699", "808080",\r
-        "FF0000", "FF9900", "99CC00", "339966", "33CCCC", "3366FF", "800080", "969696",\r
-        "FF00FF", "FFCC00", "FFFF00", "00FF00", "00FFFF", "00CCFF", "993366", "C0C0C0",\r
-        "FF99CC", "FFCC99", "FFFF99", "CCFFCC", "CCFFFF", "99CCFF", "CC99FF", "FFFFFF"\r
-    ],\r
-\r
-    // private\r
-    onRender : function(container, position){\r
-        var t = this.tpl || new Ext.XTemplate(\r
-            '<tpl for="."><a href="#" class="color-{.}" hidefocus="on"><em><span style="background:#{.}" unselectable="on">&#160;</span></em></a></tpl>'\r
-        );\r
-        var el = document.createElement("div");\r
-        el.id = this.getId();\r
-        el.className = this.itemCls;\r
-        t.overwrite(el, this.colors);\r
-        container.dom.insertBefore(el, position);\r
-        this.el = Ext.get(el);\r
-        this.el.on(this.clickEvent, this.handleClick,  this, {delegate: "a"});\r
-        if(this.clickEvent != 'click'){\r
-            this.el.on('click', Ext.emptyFn,  this, {delegate: "a", preventDefault:true});\r
-        }\r
-    },\r
-\r
-    // private\r
-    afterRender : function(){\r
-        Ext.ColorPalette.superclass.afterRender.call(this);\r
-        if(this.value){\r
-            var s = this.value;\r
-            this.value = null;\r
-            this.select(s);\r
-        }\r
-    },\r
-\r
-    // private\r
-    handleClick : function(e, t){\r
-        e.preventDefault();\r
-        if(!this.disabled){\r
-            var c = t.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];\r
-            this.select(c.toUpperCase());\r
-        }\r
-    },\r
-\r
-    \r
-    select : function(color){\r
-        color = color.replace("#", "");\r
-        if(color != this.value || this.allowReselect){\r
-            var el = this.el;\r
-            if(this.value){\r
-                el.child("a.color-"+this.value).removeClass("x-color-palette-sel");\r
-            }\r
-            el.child("a.color-"+color).addClass("x-color-palette-sel");\r
-            this.value = color;\r
-            this.fireEvent("select", this, color);\r
-        }\r
-    }\r
-\r
-    \r
-});\r
-Ext.reg('colorpalette', Ext.ColorPalette);\r
-\r
-Ext.DatePicker = Ext.extend(Ext.Component, {\r
-    \r
-    todayText : "Today",\r
-    \r
-    okText : "&#160;OK&#160;", // &#160; to give the user extra clicking room\r
-    \r
-    cancelText : "Cancel",\r
-    \r
-    todayTip : "{0} (Spacebar)",\r
-    \r
-    minText : "This date is before the minimum date",\r
-    \r
-    maxText : "This date is after the maximum date",\r
-    \r
-    format : "m/d/y",\r
-    \r
-    disabledDaysText : "Disabled",\r
-    \r
-    disabledDatesText : "Disabled",\r
-    \r
-    constrainToViewport : true,\r
-    \r
-    monthNames : Date.monthNames,\r
-    \r
-    dayNames : Date.dayNames,\r
-    \r
-    nextText: 'Next Month (Control+Right)',\r
-    \r
-    prevText: 'Previous Month (Control+Left)',\r
-    \r
-    monthYearText: 'Choose a month (Control+Up/Down to move years)',\r
-    \r
-    startDay : 0,\r
-    \r
-    showToday : true,\r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-    // private\r
-    initComponent : function(){\r
-        Ext.DatePicker.superclass.initComponent.call(this);\r
-\r
-        this.value = this.value ?\r
-                 this.value.clearTime() : new Date().clearTime();\r
-\r
-        this.addEvents(\r
-            \r
-            'select'\r
-        );\r
-\r
-        if(this.handler){\r
-            this.on("select", this.handler,  this.scope || this);\r
-        }\r
-\r
-        this.initDisabledDays();\r
-    },\r
-\r
-    // private\r
-    initDisabledDays : function(){\r
-        if(!this.disabledDatesRE && this.disabledDates){\r
-            var dd = this.disabledDates;\r
-            var re = "(?:";\r
-            for(var i = 0; i < dd.length; i++){\r
-                re += dd[i];\r
-                if(i != dd.length-1) re += "|";\r
-            }\r
-            this.disabledDatesRE = new RegExp(re + ")");\r
-        }\r
-    },\r
-    \r
-    \r
-    setDisabledDates : function(dd){\r
-        if(Ext.isArray(dd)){\r
-            this.disabledDates = dd;\r
-            this.disabledDatesRE = null;\r
-        }else{\r
-            this.disabledDatesRE = dd;\r
-        }\r
-        this.initDisabledDays();\r
-        this.update(this.value, true);\r
-    },\r
-    \r
-    \r
-    setDisabledDays : function(dd){\r
-        this.disabledDays = dd;\r
-        this.update(this.value, true);\r
-    },\r
-    \r
-    \r
-    setMinDate : function(dt){\r
-        this.minDate = dt;\r
-        this.update(this.value, true);\r
-    },\r
-    \r
-    \r
-    setMaxDate : function(dt){\r
-        this.maxDate = dt;\r
-        this.update(this.value, true);\r
-    },\r
-\r
-    \r
-    setValue : function(value){\r
-        var old = this.value;\r
-        this.value = value.clearTime(true);\r
-        if(this.el){\r
-            this.update(this.value);\r
-        }\r
-    },\r
-\r
-    \r
-    getValue : function(){\r
-        return this.value;\r
-    },\r
-\r
-    // private\r
-    focus : function(){\r
-        if(this.el){\r
-            this.update(this.activeDate);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onRender : function(container, position){\r
-        var m = [\r
-             '<table cellspacing="0">',\r
-                '<tr><td class="x-date-left"><a href="#" title="', this.prevText ,'">&#160;</a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="', this.nextText ,'">&#160;</a></td></tr>',\r
-                '<tr><td colspan="3"><table class="x-date-inner" cellspacing="0"><thead><tr>'];\r
-        var dn = this.dayNames;\r
-        for(var i = 0; i < 7; i++){\r
-            var d = this.startDay+i;\r
-            if(d > 6){\r
-                d = d-7;\r
-            }\r
-            m.push("<th><span>", dn[d].substr(0,1), "</span></th>");\r
-        }\r
-        m[m.length] = "</tr></thead><tbody><tr>";\r
-        for(var i = 0; i < 42; i++) {\r
-            if(i % 7 == 0 && i != 0){\r
-                m[m.length] = "</tr><tr>";\r
-            }\r
-            m[m.length] = '<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>';\r
-        }\r
-        m.push('</tr></tbody></table></td></tr>', \r
-                this.showToday ? '<tr><td colspan="3" class="x-date-bottom" align="center"></td></tr>' : '', \r
-                '</table><div class="x-date-mp"></div>');\r
-\r
-        var el = document.createElement("div");\r
-        el.className = "x-date-picker";\r
-        el.innerHTML = m.join("");\r
-\r
-        container.dom.insertBefore(el, position);\r
-\r
-        this.el = Ext.get(el);\r
-        this.eventEl = Ext.get(el.firstChild);\r
-\r
-        this.leftClickRpt = new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"), {\r
-            handler: this.showPrevMonth,\r
-            scope: this,\r
-            preventDefault:true,\r
-            stopDefault:true\r
-        });\r
-\r
-        this.rightClickRpt = new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"), {\r
-            handler: this.showNextMonth,\r
-            scope: this,\r
-            preventDefault:true,\r
-            stopDefault:true\r
-        });\r
-\r
-        this.eventEl.on("mousewheel", this.handleMouseWheel,  this);\r
-\r
-        this.monthPicker = this.el.down('div.x-date-mp');\r
-        this.monthPicker.enableDisplayMode('block');\r
-        \r
-        var kn = new Ext.KeyNav(this.eventEl, {\r
-            "left" : function(e){\r
-                e.ctrlKey ?\r
-                    this.showPrevMonth() :\r
-                    this.update(this.activeDate.add("d", -1));\r
-            },\r
-\r
-            "right" : function(e){\r
-                e.ctrlKey ?\r
-                    this.showNextMonth() :\r
-                    this.update(this.activeDate.add("d", 1));\r
-            },\r
-\r
-            "up" : function(e){\r
-                e.ctrlKey ?\r
-                    this.showNextYear() :\r
-                    this.update(this.activeDate.add("d", -7));\r
-            },\r
-\r
-            "down" : function(e){\r
-                e.ctrlKey ?\r
-                    this.showPrevYear() :\r
-                    this.update(this.activeDate.add("d", 7));\r
-            },\r
-\r
-            "pageUp" : function(e){\r
-                this.showNextMonth();\r
-            },\r
-\r
-            "pageDown" : function(e){\r
-                this.showPrevMonth();\r
-            },\r
-\r
-            "enter" : function(e){\r
-                e.stopPropagation();\r
-                return true;\r
-            },\r
-\r
-            scope : this\r
-        });\r
-\r
-        this.eventEl.on("click", this.handleDateClick,  this, {delegate: "a.x-date-date"});\r
-\r
-        this.el.unselectable();\r
-        \r
-        this.cells = this.el.select("table.x-date-inner tbody td");\r
-        this.textNodes = this.el.query("table.x-date-inner tbody span");\r
-\r
-        this.mbtn = new Ext.Button({\r
-            text: "&#160;",\r
-            tooltip: this.monthYearText,\r
-            renderTo: this.el.child("td.x-date-middle", true)\r
-        });\r
-\r
-        this.mbtn.on('click', this.showMonthPicker, this);\r
-        this.mbtn.el.child(this.mbtn.menuClassTarget).addClass("x-btn-with-menu");\r
-\r
-        if(this.showToday){\r
-            this.todayKeyListener = this.eventEl.addKeyListener(Ext.EventObject.SPACE, this.selectToday,  this);\r
-            var today = (new Date()).dateFormat(this.format);\r
-            this.todayBtn = new Ext.Button({\r
-                renderTo: this.el.child("td.x-date-bottom", true),\r
-                text: String.format(this.todayText, today),\r
-                tooltip: String.format(this.todayTip, today),\r
-                handler: this.selectToday,\r
-                scope: this\r
-            });\r
-        }\r
-        \r
-        if(Ext.isIE){\r
-            this.el.repaint();\r
-        }\r
-        this.update(this.value);\r
-    },\r
-\r
-    // private\r
-    createMonthPicker : function(){\r
-        if(!this.monthPicker.dom.firstChild){\r
-            var buf = ['<table border="0" cellspacing="0">'];\r
-            for(var i = 0; i < 6; i++){\r
-                buf.push(\r
-                    '<tr><td class="x-date-mp-month"><a href="#">', this.monthNames[i].substr(0, 3), '</a></td>',\r
-                    '<td class="x-date-mp-month x-date-mp-sep"><a href="#">', this.monthNames[i+6].substr(0, 3), '</a></td>',\r
-                    i == 0 ?\r
-                    '<td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-prev"></a></td><td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-next"></a></td></tr>' :\r
-                    '<td class="x-date-mp-year"><a href="#"></a></td><td class="x-date-mp-year"><a href="#"></a></td></tr>'\r
-                );\r
-            }\r
-            buf.push(\r
-                '<tr class="x-date-mp-btns"><td colspan="4"><button type="button" class="x-date-mp-ok">',\r
-                    this.okText,\r
-                    '</button><button type="button" class="x-date-mp-cancel">',\r
-                    this.cancelText,\r
-                    '</button></td></tr>',\r
-                '</table>'\r
-            );\r
-            this.monthPicker.update(buf.join(''));\r
-            this.monthPicker.on('click', this.onMonthClick, this);\r
-            this.monthPicker.on('dblclick', this.onMonthDblClick, this);\r
-\r
-            this.mpMonths = this.monthPicker.select('td.x-date-mp-month');\r
-            this.mpYears = this.monthPicker.select('td.x-date-mp-year');\r
-\r
-            this.mpMonths.each(function(m, a, i){\r
-                i += 1;\r
-                if((i%2) == 0){\r
-                    m.dom.xmonth = 5 + Math.round(i * .5);\r
-                }else{\r
-                    m.dom.xmonth = Math.round((i-1) * .5);\r
-                }\r
-            });\r
-        }\r
-    },\r
-\r
-    // private\r
-    showMonthPicker : function(){\r
-        this.createMonthPicker();\r
-        var size = this.el.getSize();\r
-        this.monthPicker.setSize(size);\r
-        this.monthPicker.child('table').setSize(size);\r
-\r
-        this.mpSelMonth = (this.activeDate || this.value).getMonth();\r
-        this.updateMPMonth(this.mpSelMonth);\r
-        this.mpSelYear = (this.activeDate || this.value).getFullYear();\r
-        this.updateMPYear(this.mpSelYear);\r
-\r
-        this.monthPicker.slideIn('t', {duration:.2});\r
-    },\r
-\r
-    // private\r
-    updateMPYear : function(y){\r
-        this.mpyear = y;\r
-        var ys = this.mpYears.elements;\r
-        for(var i = 1; i <= 10; i++){\r
-            var td = ys[i-1], y2;\r
-            if((i%2) == 0){\r
-                y2 = y + Math.round(i * .5);\r
-                td.firstChild.innerHTML = y2;\r
-                td.xyear = y2;\r
-            }else{\r
-                y2 = y - (5-Math.round(i * .5));\r
-                td.firstChild.innerHTML = y2;\r
-                td.xyear = y2;\r
-            }\r
-            this.mpYears.item(i-1)[y2 == this.mpSelYear ? 'addClass' : 'removeClass']('x-date-mp-sel');\r
-        }\r
-    },\r
-\r
-    // private\r
-    updateMPMonth : function(sm){\r
-        this.mpMonths.each(function(m, a, i){\r
-            m[m.dom.xmonth == sm ? 'addClass' : 'removeClass']('x-date-mp-sel');\r
-        });\r
-    },\r
-\r
-    // private\r
-    selectMPMonth: function(m){\r
-        \r
-    },\r
-\r
-    // private\r
-    onMonthClick : function(e, t){\r
-        e.stopEvent();\r
-        var el = new Ext.Element(t), pn;\r
-        if(el.is('button.x-date-mp-cancel')){\r
-            this.hideMonthPicker();\r
-        }\r
-        else if(el.is('button.x-date-mp-ok')){\r
-            var d = new Date(this.mpSelYear, this.mpSelMonth, (this.activeDate || this.value).getDate());\r
-            if(d.getMonth() != this.mpSelMonth){\r
-                // "fix" the JS rolling date conversion if needed\r
-                d = new Date(this.mpSelYear, this.mpSelMonth, 1).getLastDateOfMonth();\r
-            }\r
-            this.update(d);\r
-            this.hideMonthPicker();\r
-        }\r
-        else if(pn = el.up('td.x-date-mp-month', 2)){\r
-            this.mpMonths.removeClass('x-date-mp-sel');\r
-            pn.addClass('x-date-mp-sel');\r
-            this.mpSelMonth = pn.dom.xmonth;\r
-        }\r
-        else if(pn = el.up('td.x-date-mp-year', 2)){\r
-            this.mpYears.removeClass('x-date-mp-sel');\r
-            pn.addClass('x-date-mp-sel');\r
-            this.mpSelYear = pn.dom.xyear;\r
-        }\r
-        else if(el.is('a.x-date-mp-prev')){\r
-            this.updateMPYear(this.mpyear-10);\r
-        }\r
-        else if(el.is('a.x-date-mp-next')){\r
-            this.updateMPYear(this.mpyear+10);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onMonthDblClick : function(e, t){\r
-        e.stopEvent();\r
-        var el = new Ext.Element(t), pn;\r
-        if(pn = el.up('td.x-date-mp-month', 2)){\r
-            this.update(new Date(this.mpSelYear, pn.dom.xmonth, (this.activeDate || this.value).getDate()));\r
-            this.hideMonthPicker();\r
-        }\r
-        else if(pn = el.up('td.x-date-mp-year', 2)){\r
-            this.update(new Date(pn.dom.xyear, this.mpSelMonth, (this.activeDate || this.value).getDate()));\r
-            this.hideMonthPicker();\r
-        }\r
-    },\r
-\r
-    // private\r
-    hideMonthPicker : function(disableAnim){\r
-        if(this.monthPicker){\r
-            if(disableAnim === true){\r
-                this.monthPicker.hide();\r
-            }else{\r
-                this.monthPicker.slideOut('t', {duration:.2});\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    showPrevMonth : function(e){\r
-        this.update(this.activeDate.add("mo", -1));\r
-    },\r
-\r
-    // private\r
-    showNextMonth : function(e){\r
-        this.update(this.activeDate.add("mo", 1));\r
-    },\r
-\r
-    // private\r
-    showPrevYear : function(){\r
-        this.update(this.activeDate.add("y", -1));\r
-    },\r
-\r
-    // private\r
-    showNextYear : function(){\r
-        this.update(this.activeDate.add("y", 1));\r
-    },\r
-\r
-    // private\r
-    handleMouseWheel : function(e){\r
-        var delta = e.getWheelDelta();\r
-        if(delta > 0){\r
-            this.showPrevMonth();\r
-            e.stopEvent();\r
-        } else if(delta < 0){\r
-            this.showNextMonth();\r
-            e.stopEvent();\r
-        }\r
-    },\r
-\r
-    // private\r
-    handleDateClick : function(e, t){\r
-        e.stopEvent();\r
-        if(t.dateValue && !Ext.fly(t.parentNode).hasClass("x-date-disabled")){\r
-            this.setValue(new Date(t.dateValue));\r
-            this.fireEvent("select", this, this.value);\r
-        }\r
-    },\r
-\r
-    // private\r
-    selectToday : function(){\r
-        if(this.todayBtn && !this.todayBtn.disabled){\r
-               this.setValue(new Date().clearTime());\r
-               this.fireEvent("select", this, this.value);\r
-        }\r
-    },\r
-\r
-    // private\r
-    update : function(date, forceRefresh){\r
-        var vd = this.activeDate;\r
-        this.activeDate = date;\r
-        if(!forceRefresh && vd && this.el){\r
-            var t = date.getTime();\r
-            if(vd.getMonth() == date.getMonth() && vd.getFullYear() == date.getFullYear()){\r
-                this.cells.removeClass("x-date-selected");\r
-                this.cells.each(function(c){\r
-                   if(c.dom.firstChild.dateValue == t){\r
-                       c.addClass("x-date-selected");\r
-                       setTimeout(function(){\r
-                            try{c.dom.firstChild.focus();}catch(e){}\r
-                       }, 50);\r
-                       return false;\r
-                   }\r
-                });\r
-                return;\r
-            }\r
-        }\r
-        var days = date.getDaysInMonth();\r
-        var firstOfMonth = date.getFirstDateOfMonth();\r
-        var startingPos = firstOfMonth.getDay()-this.startDay;\r
-\r
-        if(startingPos <= this.startDay){\r
-            startingPos += 7;\r
-        }\r
-\r
-        var pm = date.add("mo", -1);\r
-        var prevStart = pm.getDaysInMonth()-startingPos;\r
-\r
-        var cells = this.cells.elements;\r
-        var textEls = this.textNodes;\r
-        days += startingPos;\r
-\r
-        // convert everything to numbers so it's fast\r
-        var day = 86400000;\r
-        var d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart)).clearTime();\r
-        var today = new Date().clearTime().getTime();\r
-        var sel = date.clearTime().getTime();\r
-        var min = this.minDate ? this.minDate.clearTime() : Number.NEGATIVE_INFINITY;\r
-        var max = this.maxDate ? this.maxDate.clearTime() : Number.POSITIVE_INFINITY;\r
-        var ddMatch = this.disabledDatesRE;\r
-        var ddText = this.disabledDatesText;\r
-        var ddays = this.disabledDays ? this.disabledDays.join("") : false;\r
-        var ddaysText = this.disabledDaysText;\r
-        var format = this.format;\r
-        \r
-        if(this.showToday){\r
-            var td = new Date().clearTime();\r
-            var disable = (td < min || td > max || \r
-                (ddMatch && format && ddMatch.test(td.dateFormat(format))) || \r
-                (ddays && ddays.indexOf(td.getDay()) != -1));\r
-                        \r
-            this.todayBtn.setDisabled(disable);\r
-            this.todayKeyListener[disable ? 'disable' : 'enable']();\r
-        }\r
-\r
-        var setCellClass = function(cal, cell){\r
-            cell.title = "";\r
-            var t = d.getTime();\r
-            cell.firstChild.dateValue = t;\r
-            if(t == today){\r
-                cell.className += " x-date-today";\r
-                cell.title = cal.todayText;\r
-            }\r
-            if(t == sel){\r
-                cell.className += " x-date-selected";\r
-                setTimeout(function(){\r
-                    try{cell.firstChild.focus();}catch(e){}\r
-                }, 50);\r
-            }\r
-            // disabling\r
-            if(t < min) {\r
-                cell.className = " x-date-disabled";\r
-                cell.title = cal.minText;\r
-                return;\r
-            }\r
-            if(t > max) {\r
-                cell.className = " x-date-disabled";\r
-                cell.title = cal.maxText;\r
-                return;\r
-            }\r
-            if(ddays){\r
-                if(ddays.indexOf(d.getDay()) != -1){\r
-                    cell.title = ddaysText;\r
-                    cell.className = " x-date-disabled";\r
-                }\r
-            }\r
-            if(ddMatch && format){\r
-                var fvalue = d.dateFormat(format);\r
-                if(ddMatch.test(fvalue)){\r
-                    cell.title = ddText.replace("%0", fvalue);\r
-                    cell.className = " x-date-disabled";\r
-                }\r
-            }\r
-        };\r
-\r
-        var i = 0;\r
-        for(; i < startingPos; i++) {\r
-            textEls[i].innerHTML = (++prevStart);\r
-            d.setDate(d.getDate()+1);\r
-            cells[i].className = "x-date-prevday";\r
-            setCellClass(this, cells[i]);\r
-        }\r
-        for(; i < days; i++){\r
-            var intDay = i - startingPos + 1;\r
-            textEls[i].innerHTML = (intDay);\r
-            d.setDate(d.getDate()+1);\r
-            cells[i].className = "x-date-active";\r
-            setCellClass(this, cells[i]);\r
-        }\r
-        var extraDays = 0;\r
-        for(; i < 42; i++) {\r
-             textEls[i].innerHTML = (++extraDays);\r
-             d.setDate(d.getDate()+1);\r
-             cells[i].className = "x-date-nextday";\r
-             setCellClass(this, cells[i]);\r
-        }\r
-\r
-        this.mbtn.setText(this.monthNames[date.getMonth()] + " " + date.getFullYear());\r
-\r
-        if(!this.internalRender){\r
-            var main = this.el.dom.firstChild;\r
-            var w = main.offsetWidth;\r
-            this.el.setWidth(w + this.el.getBorderWidth("lr"));\r
-            Ext.fly(main).setWidth(w);\r
-            this.internalRender = true;\r
-            // opera does not respect the auto grow header center column\r
-            // then, after it gets a width opera refuses to recalculate\r
-            // without a second pass\r
-            if(Ext.isOpera && !this.secondPass){\r
-                main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth)) + "px";\r
-                this.secondPass = true;\r
-                this.update.defer(10, this, [date]);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    beforeDestroy : function() {\r
-        if(this.rendered){\r
-            Ext.destroy(\r
-                this.leftClickRpt,\r
-                this.rightClickRpt,\r
-                this.monthPicker,\r
-                this.eventEl,\r
-                this.mbtn,\r
-                this.todayBtn\r
-            );\r
-        }\r
-    }\r
-\r
-    \r
-});\r
-Ext.reg('datepicker', Ext.DatePicker);\r
-\r
-Ext.TabPanel = Ext.extend(Ext.Panel,  {\r
-    \r
-    \r
-    \r
-    monitorResize : true,\r
-    \r
-    deferredRender : true,\r
-    \r
-    tabWidth: 120,\r
-    \r
-    minTabWidth: 30,\r
-    \r
-    resizeTabs:false,\r
-    \r
-    enableTabScroll: false,\r
-    \r
-    scrollIncrement : 0,\r
-    \r
-    scrollRepeatInterval : 400,\r
-    \r
-    scrollDuration : .35,\r
-    \r
-    animScroll : true,\r
-    \r
-    tabPosition: 'top',\r
-    \r
-    baseCls: 'x-tab-panel',\r
-    \r
-    autoTabs : false,\r
-    \r
-    autoTabSelector:'div.x-tab',\r
-    \r
-    activeTab : null,\r
-    \r
-    tabMargin : 2,\r
-    \r
-    plain: false,\r
-    \r
-    wheelIncrement : 20,\r
-\r
-    \r
-    idDelimiter : '__',\r
-\r
-    // private\r
-    itemCls : 'x-tab-item',\r
-\r
-    // private config overrides\r
-    elements: 'body',\r
-    headerAsText: false,\r
-    frame: false,\r
-    hideBorders:true,\r
-\r
-    // private\r
-    initComponent : function(){\r
-        this.frame = false;\r
-        Ext.TabPanel.superclass.initComponent.call(this);\r
-        this.addEvents(\r
-            \r
-            'beforetabchange',\r
-            \r
-            'tabchange',\r
-            \r
-            'contextmenu'\r
-        );\r
-        this.setLayout(new Ext.layout.CardLayout({\r
-            deferredRender: this.deferredRender\r
-        }));\r
-        if(this.tabPosition == 'top'){\r
-            this.elements += ',header';\r
-            this.stripTarget = 'header';\r
-        }else {\r
-            this.elements += ',footer';\r
-            this.stripTarget = 'footer';\r
-        }\r
-        if(!this.stack){\r
-            this.stack = Ext.TabPanel.AccessStack();\r
-        }\r
-        this.initItems();\r
-    },\r
-\r
-    // private\r
-    render : function(){\r
-        Ext.TabPanel.superclass.render.apply(this, arguments);\r
-        if(this.activeTab !== undefined){\r
-            var item = this.activeTab;\r
-            delete this.activeTab;\r
-            this.setActiveTab(item);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        Ext.TabPanel.superclass.onRender.call(this, ct, position);\r
-\r
-        if(this.plain){\r
-            var pos = this.tabPosition == 'top' ? 'header' : 'footer';\r
-            this[pos].addClass('x-tab-panel-'+pos+'-plain');\r
-        }\r
-\r
-        var st = this[this.stripTarget];\r
-\r
-        this.stripWrap = st.createChild({cls:'x-tab-strip-wrap', cn:{\r
-            tag:'ul', cls:'x-tab-strip x-tab-strip-'+this.tabPosition}});\r
-\r
-        var beforeEl = (this.tabPosition=='bottom' ? this.stripWrap : null);\r
-        this.stripSpacer = st.createChild({cls:'x-tab-strip-spacer'}, beforeEl);\r
-        this.strip = new Ext.Element(this.stripWrap.dom.firstChild);\r
-\r
-        this.edge = this.strip.createChild({tag:'li', cls:'x-tab-edge'});\r
-        this.strip.createChild({cls:'x-clear'});\r
-\r
-        this.body.addClass('x-tab-panel-body-'+this.tabPosition);\r
-\r
-        if(!this.itemTpl){\r
-            var tt = new Ext.Template(\r
-                 '<li class="{cls}" id="{id}"><a class="x-tab-strip-close" onclick="return false;"></a>',\r
-                 '<a class="x-tab-right" href="#" onclick="return false;"><em class="x-tab-left">',\r
-                 '<span class="x-tab-strip-inner"><span class="x-tab-strip-text {iconCls}">{text}</span></span>',\r
-                 '</em></a></li>'\r
-            );\r
-            tt.disableFormats = true;\r
-            tt.compile();\r
-            Ext.TabPanel.prototype.itemTpl = tt;\r
-        }\r
-\r
-        this.items.each(this.initTab, this);\r
-    },\r
-\r
-    // private\r
-    afterRender : function(){\r
-        Ext.TabPanel.superclass.afterRender.call(this);\r
-        if(this.autoTabs){\r
-            this.readTabs(false);\r
-        }\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        Ext.TabPanel.superclass.initEvents.call(this);\r
-        this.on('add', this.onAdd, this);\r
-        this.on('remove', this.onRemove, this);\r
-\r
-        this.strip.on('mousedown', this.onStripMouseDown, this);\r
-        this.strip.on('contextmenu', this.onStripContextMenu, this);\r
-        if(this.enableTabScroll){\r
-            this.strip.on('mousewheel', this.onWheel, this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    findTargets : function(e){\r
-        var item = null;\r
-        var itemEl = e.getTarget('li', this.strip);\r
-        if(itemEl){\r
-            item = this.getComponent(itemEl.id.split(this.idDelimiter)[1]);\r
-            if(item.disabled){\r
-                return {\r
-                    close : null,\r
-                    item : null,\r
-                    el : null\r
-                };\r
-            }\r
-        }\r
-        return {\r
-            close : e.getTarget('.x-tab-strip-close', this.strip),\r
-            item : item,\r
-            el : itemEl\r
-        };\r
-    },\r
-\r
-    // private\r
-    onStripMouseDown : function(e){\r
-        if(e.button != 0){\r
-            return;\r
-        }\r
-        e.preventDefault();\r
-        var t = this.findTargets(e);\r
-        if(t.close){\r
-            this.remove(t.item);\r
-            return;\r
-        }\r
-        if(t.item && t.item != this.activeTab){\r
-            this.setActiveTab(t.item);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onStripContextMenu : function(e){\r
-        e.preventDefault();\r
-        var t = this.findTargets(e);\r
-        if(t.item){\r
-            this.fireEvent('contextmenu', this, t.item, e);\r
-        }\r
-    },\r
-\r
-    \r
-    readTabs : function(removeExisting){\r
-        if(removeExisting === true){\r
-            this.items.each(function(item){\r
-                this.remove(item);\r
-            }, this);\r
-        }\r
-        var tabs = this.el.query(this.autoTabSelector);\r
-        for(var i = 0, len = tabs.length; i < len; i++){\r
-            var tab = tabs[i];\r
-            var title = tab.getAttribute('title');\r
-            tab.removeAttribute('title');\r
-            this.add({\r
-                title: title,\r
-                el: tab\r
-            });\r
-        }\r
-    },\r
-\r
-    // private\r
-    initTab : function(item, index){\r
-        var before = this.strip.dom.childNodes[index];\r
-        var cls = item.closable ? 'x-tab-strip-closable' : '';\r
-        if(item.disabled){\r
-            cls += ' x-item-disabled';\r
-        }\r
-        if(item.iconCls){\r
-            cls += ' x-tab-with-icon';\r
-        }\r
-        if(item.tabCls){\r
-            cls += ' ' + item.tabCls;\r
-        }\r
-\r
-        var p = {\r
-            id: this.id + this.idDelimiter + item.getItemId(),\r
-            text: item.title,\r
-            cls: cls,\r
-            iconCls: item.iconCls || ''\r
-        };\r
-        var el = before ?\r
-                 this.itemTpl.insertBefore(before, p) :\r
-                 this.itemTpl.append(this.strip, p);\r
-\r
-        Ext.fly(el).addClassOnOver('x-tab-strip-over');\r
-\r
-        if(item.tabTip){\r
-            Ext.fly(el).child('span.x-tab-strip-text', true).qtip = item.tabTip;\r
-        }\r
-        item.tabEl = el;\r
-\r
-        item.on('disable', this.onItemDisabled, this);\r
-        item.on('enable', this.onItemEnabled, this);\r
-        item.on('titlechange', this.onItemTitleChanged, this);\r
-        item.on('iconchange', this.onItemIconChanged, this);\r
-        item.on('beforeshow', this.onBeforeShowItem, this);\r
-    },\r
-\r
-    // private\r
-    onAdd : function(tp, item, index){\r
-        this.initTab(item, index);\r
-        if(this.items.getCount() == 1){\r
-            this.syncSize();\r
-        }\r
-        this.delegateUpdates();\r
-    },\r
-\r
-    // private\r
-    onBeforeAdd : function(item){\r
-        var existing = item.events ? (this.items.containsKey(item.getItemId()) ? item : null) : this.items.get(item);\r
-        if(existing){\r
-            this.setActiveTab(item);\r
-            return false;\r
-        }\r
-        Ext.TabPanel.superclass.onBeforeAdd.apply(this, arguments);\r
-        var es = item.elements;\r
-        item.elements = es ? es.replace(',header', '') : es;\r
-        item.border = (item.border === true);\r
-    },\r
-\r
-    // private\r
-    onRemove : function(tp, item){\r
-        Ext.destroy(Ext.get(this.getTabEl(item)));\r
-        this.stack.remove(item);\r
-        item.un('disable', this.onItemDisabled, this);\r
-        item.un('enable', this.onItemEnabled, this);\r
-        item.un('titlechange', this.onItemTitleChanged, this);\r
-        item.un('iconchange', this.onItemIconChanged, this);\r
-        item.un('beforeshow', this.onBeforeShowItem, this);\r
-        if(item == this.activeTab){\r
-            var next = this.stack.next();\r
-            if(next){\r
-                this.setActiveTab(next);\r
-            }else if(this.items.getCount() > 0){\r
-                this.setActiveTab(0);\r
-            }else{\r
-                this.activeTab = null;\r
-            }\r
-        }\r
-        this.delegateUpdates();\r
-    },\r
-\r
-    // private\r
-    onBeforeShowItem : function(item){\r
-        if(item != this.activeTab){\r
-            this.setActiveTab(item);\r
-            return false;\r
-        }\r
-    },\r
-\r
-    // private\r
-    onItemDisabled : function(item){\r
-        var el = this.getTabEl(item);\r
-        if(el){\r
-            Ext.fly(el).addClass('x-item-disabled');\r
-        }\r
-        this.stack.remove(item);\r
-    },\r
-\r
-    // private\r
-    onItemEnabled : function(item){\r
-        var el = this.getTabEl(item);\r
-        if(el){\r
-            Ext.fly(el).removeClass('x-item-disabled');\r
-        }\r
-    },\r
-\r
-    // private\r
-    onItemTitleChanged : function(item){\r
-        var el = this.getTabEl(item);\r
-        if(el){\r
-            Ext.fly(el).child('span.x-tab-strip-text', true).innerHTML = item.title;\r
-        }\r
-    },\r
-    \r
-    //private\r
-    onItemIconChanged: function(item, iconCls, oldCls){\r
-        var el = this.getTabEl(item);\r
-        if(el){\r
-            Ext.fly(el).child('span.x-tab-strip-text').replaceClass(oldCls, iconCls);\r
-        }\r
-    },\r
-\r
-    \r
-    getTabEl : function(item){\r
-        var itemId = (typeof item === 'number')?this.items.items[item].getItemId() : item.getItemId();\r
-        return document.getElementById(this.id+this.idDelimiter+itemId);\r
-    },\r
-\r
-    // private\r
-    onResize : function(){\r
-        Ext.TabPanel.superclass.onResize.apply(this, arguments);\r
-        this.delegateUpdates();\r
-    },\r
-\r
-    \r
-    beginUpdate : function(){\r
-        this.suspendUpdates = true;\r
-    },\r
-\r
-    \r
-    endUpdate : function(){\r
-        this.suspendUpdates = false;\r
-        this.delegateUpdates();\r
-    },\r
-\r
-    \r
-    hideTabStripItem : function(item){\r
-        item = this.getComponent(item);\r
-        var el = this.getTabEl(item);\r
-        if(el){\r
-            el.style.display = 'none';\r
-            this.delegateUpdates();\r
-        }\r
-        this.stack.remove(item);\r
-    },\r
-\r
-    \r
-    unhideTabStripItem : function(item){\r
-        item = this.getComponent(item);\r
-        var el = this.getTabEl(item);\r
-        if(el){\r
-            el.style.display = '';\r
-            this.delegateUpdates();\r
-        }\r
-    },\r
-\r
-    // private\r
-    delegateUpdates : function(){\r
-        if(this.suspendUpdates){\r
-            return;\r
-        }\r
-        if(this.resizeTabs && this.rendered){\r
-            this.autoSizeTabs();\r
-        }\r
-        if(this.enableTabScroll && this.rendered){\r
-            this.autoScrollTabs();\r
-        }\r
-    },\r
-\r
-    // private\r
-    autoSizeTabs : function(){\r
-        var count = this.items.length;\r
-        var ce = this.tabPosition != 'bottom' ? 'header' : 'footer';\r
-        var ow = this[ce].dom.offsetWidth;\r
-        var aw = this[ce].dom.clientWidth;\r
-\r
-        if(!this.resizeTabs || count < 1 || !aw){ // !aw for display:none\r
-            return;\r
-        }\r
-\r
-        var each = Math.max(Math.min(Math.floor((aw-4) / count) - this.tabMargin, this.tabWidth), this.minTabWidth); // -4 for float errors in IE\r
-        this.lastTabWidth = each;\r
-        var lis = this.stripWrap.dom.getElementsByTagName('li');\r
-        for(var i = 0, len = lis.length-1; i < len; i++) { // -1 for the "edge" li\r
-            var li = lis[i];\r
-            var inner = li.childNodes[1].firstChild.firstChild;\r
-            var tw = li.offsetWidth;\r
-            var iw = inner.offsetWidth;\r
-            inner.style.width = (each - (tw-iw)) + 'px';\r
-        }\r
-    },\r
-\r
-    // private\r
-    adjustBodyWidth : function(w){\r
-        if(this.header){\r
-            this.header.setWidth(w);\r
-        }\r
-        if(this.footer){\r
-            this.footer.setWidth(w);\r
-        }\r
-        return w;\r
-    },\r
-\r
-    \r
-    setActiveTab : function(item){\r
-        item = this.getComponent(item);\r
-        if(!item || this.fireEvent('beforetabchange', this, item, this.activeTab) === false){\r
-            return;\r
-        }\r
-        if(!this.rendered){\r
-            this.activeTab = item;\r
-            return;\r
-        }\r
-        if(this.activeTab != item){\r
-            if(this.activeTab){\r
-                var oldEl = this.getTabEl(this.activeTab);\r
-                if(oldEl){\r
-                    Ext.fly(oldEl).removeClass('x-tab-strip-active');\r
-                }\r
-                this.activeTab.fireEvent('deactivate', this.activeTab);\r
-            }\r
-            var el = this.getTabEl(item);\r
-            Ext.fly(el).addClass('x-tab-strip-active');\r
-            this.activeTab = item;\r
-            this.stack.add(item);\r
-\r
-            this.layout.setActiveItem(item);\r
-            if(this.layoutOnTabChange && item.doLayout){\r
-                item.doLayout();\r
-            }\r
-            if(this.scrolling){\r
-                this.scrollToTab(item, this.animScroll);\r
-            }\r
-\r
-            item.fireEvent('activate', item);\r
-            this.fireEvent('tabchange', this, item);\r
-        }\r
-    },\r
-\r
-    \r
-    getActiveTab : function(){\r
-        return this.activeTab || null;\r
-    },\r
-\r
-    \r
-    getItem : function(item){\r
-        return this.getComponent(item);\r
-    },\r
-\r
-    // private\r
-    autoScrollTabs : function(){\r
-        this.pos = this.tabPosition=='bottom' ? this.footer : this.header;\r
-        var count = this.items.length;\r
-        var ow = this.pos.dom.offsetWidth;\r
-        var tw = this.pos.dom.clientWidth;\r
-\r
-        var wrap = this.stripWrap;\r
-        var wd = wrap.dom;\r
-        var cw = wd.offsetWidth;\r
-        var pos = this.getScrollPos();\r
-        var l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos;\r
-\r
-        if(!this.enableTabScroll || count < 1 || cw < 20){ // 20 to prevent display:none issues\r
-            return;\r
-        }\r
-        if(l <= tw){\r
-            wd.scrollLeft = 0;\r
-            wrap.setWidth(tw);\r
-            if(this.scrolling){\r
-                this.scrolling = false;\r
-                this.pos.removeClass('x-tab-scrolling');\r
-                this.scrollLeft.hide();\r
-                this.scrollRight.hide();\r
-                if(Ext.isAir || Ext.isSafari){\r
-                    wd.style.marginLeft = '';\r
-                    wd.style.marginRight = '';\r
-                }\r
-            }\r
-        }else{\r
-            if(!this.scrolling){\r
-                this.pos.addClass('x-tab-scrolling');\r
-                if(Ext.isAir || Ext.isSafari){\r
-                    wd.style.marginLeft = '18px';\r
-                    wd.style.marginRight = '18px';\r
-                }\r
-            }\r
-            tw -= wrap.getMargins('lr');\r
-            wrap.setWidth(tw > 20 ? tw : 20);\r
-            if(!this.scrolling){\r
-                if(!this.scrollLeft){\r
-                    this.createScrollers();\r
-                }else{\r
-                    this.scrollLeft.show();\r
-                    this.scrollRight.show();\r
-                }\r
-            }\r
-            this.scrolling = true;\r
-            if(pos > (l-tw)){ // ensure it stays within bounds\r
-                wd.scrollLeft = l-tw;\r
-            }else{ // otherwise, make sure the active tab is still visible\r
-                this.scrollToTab(this.activeTab, false);\r
-            }\r
-            this.updateScrollButtons();\r
-        }\r
-    },\r
-\r
-    // private\r
-    createScrollers : function(){\r
-        this.pos.addClass('x-tab-scrolling-' + this.tabPosition);\r
-        var h = this.stripWrap.dom.offsetHeight;\r
-\r
-        // left\r
-        var sl = this.pos.insertFirst({\r
-            cls:'x-tab-scroller-left'\r
-        });\r
-        sl.setHeight(h);\r
-        sl.addClassOnOver('x-tab-scroller-left-over');\r
-        this.leftRepeater = new Ext.util.ClickRepeater(sl, {\r
-            interval : this.scrollRepeatInterval,\r
-            handler: this.onScrollLeft,\r
-            scope: this\r
-        });\r
-        this.scrollLeft = sl;\r
-\r
-        // right\r
-        var sr = this.pos.insertFirst({\r
-            cls:'x-tab-scroller-right'\r
-        });\r
-        sr.setHeight(h);\r
-        sr.addClassOnOver('x-tab-scroller-right-over');\r
-        this.rightRepeater = new Ext.util.ClickRepeater(sr, {\r
-            interval : this.scrollRepeatInterval,\r
-            handler: this.onScrollRight,\r
-            scope: this\r
-        });\r
-        this.scrollRight = sr;\r
-    },\r
-\r
-    // private\r
-    getScrollWidth : function(){\r
-        return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos();\r
-    },\r
-\r
-    // private\r
-    getScrollPos : function(){\r
-        return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0;\r
-    },\r
-\r
-    // private\r
-    getScrollArea : function(){\r
-        return parseInt(this.stripWrap.dom.clientWidth, 10) || 0;\r
-    },\r
-\r
-    // private\r
-    getScrollAnim : function(){\r
-        return {duration:this.scrollDuration, callback: this.updateScrollButtons, scope: this};\r
-    },\r
-\r
-    // private\r
-    getScrollIncrement : function(){\r
-        return this.scrollIncrement || (this.resizeTabs ? this.lastTabWidth+2 : 100);\r
-    },\r
-\r
-    \r
-\r
-    scrollToTab : function(item, animate){\r
-        if(!item){ return; }\r
-        var el = this.getTabEl(item);\r
-        var pos = this.getScrollPos(), area = this.getScrollArea();\r
-        var left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos;\r
-        var right = left + el.offsetWidth;\r
-        if(left < pos){\r
-            this.scrollTo(left, animate);\r
-        }else if(right > (pos + area)){\r
-            this.scrollTo(right - area, animate);\r
-        }\r
-    },\r
-\r
-    // private\r
-    scrollTo : function(pos, animate){\r
-        this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false);\r
-        if(!animate){\r
-            this.updateScrollButtons();\r
-        }\r
-    },\r
-\r
-    onWheel : function(e){\r
-        var d = e.getWheelDelta()*this.wheelIncrement*-1;\r
-        e.stopEvent();\r
-\r
-        var pos = this.getScrollPos();\r
-        var newpos = pos + d;\r
-        var sw = this.getScrollWidth()-this.getScrollArea();\r
-\r
-        var s = Math.max(0, Math.min(sw, newpos));\r
-        if(s != pos){\r
-            this.scrollTo(s, false);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onScrollRight : function(){\r
-        var sw = this.getScrollWidth()-this.getScrollArea();\r
-        var pos = this.getScrollPos();\r
-        var s = Math.min(sw, pos + this.getScrollIncrement());\r
-        if(s != pos){\r
-            this.scrollTo(s, this.animScroll);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onScrollLeft : function(){\r
-        var pos = this.getScrollPos();\r
-        var s = Math.max(0, pos - this.getScrollIncrement());\r
-        if(s != pos){\r
-            this.scrollTo(s, this.animScroll);\r
-        }\r
-    },\r
-\r
-    // private\r
-    updateScrollButtons : function(){\r
-        var pos = this.getScrollPos();\r
-        this.scrollLeft[pos == 0 ? 'addClass' : 'removeClass']('x-tab-scroller-left-disabled');\r
-        this.scrollRight[pos >= (this.getScrollWidth()-this.getScrollArea()) ? 'addClass' : 'removeClass']('x-tab-scroller-right-disabled');\r
-    },\r
-\r
-    // private\r
-    beforeDestroy : function() {\r
-        if(this.items){\r
-            this.items.each(function(item){\r
-                if(item && item.tabEl){\r
-                    Ext.get(item.tabEl).removeAllListeners();\r
-                    item.tabEl = null;\r
-                }\r
-            }, this);\r
-        }\r
-        if(this.strip){\r
-            this.strip.removeAllListeners();\r
-        }\r
-        Ext.TabPanel.superclass.beforeDestroy.apply(this);\r
-    }\r
-\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-});\r
-Ext.reg('tabpanel', Ext.TabPanel);\r
-\r
-\r
-Ext.TabPanel.prototype.activate = Ext.TabPanel.prototype.setActiveTab;\r
-\r
-// private utility class used by TabPanel\r
-Ext.TabPanel.AccessStack = function(){\r
-    var items = [];\r
-    return {\r
-        add : function(item){\r
-            items.push(item);\r
-            if(items.length > 10){\r
-                items.shift();\r
-            }\r
-        },\r
-\r
-        remove : function(item){\r
-            var s = [];\r
-            for(var i = 0, len = items.length; i < len; i++) {\r
-                if(items[i] != item){\r
-                    s.push(items[i]);\r
-                }\r
-            }\r
-            items = s;\r
-        },\r
-\r
-        next : function(){\r
-            return items.pop();\r
-        }\r
-    };\r
-};\r
-\r
-\r
-\r
-\r
-Ext.Button = Ext.extend(Ext.Component, {\r
-    \r
-    hidden : false,\r
-    \r
-    disabled : false,\r
-    \r
-    pressed : false,\r
-    \r
-\r
-    \r
-\r
-    \r
-\r
-    \r
-    enableToggle: false,\r
-    \r
-    \r
-    \r
-    menuAlign : "tl-bl?",\r
-\r
-    \r
-    \r
-    type : 'button',\r
-\r
-    // private\r
-    menuClassTarget: 'tr',\r
-\r
-    \r
-    clickEvent : 'click',\r
-\r
-    \r
-    handleMouseEvents : true,\r
-\r
-    \r
-    tooltipType : 'qtip',\r
-\r
-    \r
-    buttonSelector : "button:first-child",\r
-\r
-    \r
-    \r
-\r
-    initComponent : function(){\r
-        Ext.Button.superclass.initComponent.call(this);\r
-\r
-        this.addEvents(\r
-            \r
-            "click",\r
-            \r
-            "toggle",\r
-            \r
-            'mouseover',\r
-            \r
-            'mouseout',\r
-            \r
-            'menushow',\r
-            \r
-            'menuhide',\r
-            \r
-            'menutriggerover',\r
-            \r
-            'menutriggerout'\r
-        );\r
-        if(this.menu){\r
-            this.menu = Ext.menu.MenuMgr.get(this.menu);\r
-        }\r
-        if(typeof this.toggleGroup === 'string'){\r
-            this.enableToggle = true;\r
-        }\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        if(!this.template){\r
-            if(!Ext.Button.buttonTemplate){\r
-                // hideous table template\r
-                Ext.Button.buttonTemplate = new Ext.Template(\r
-                    '<table border="0" cellpadding="0" cellspacing="0" class="x-btn-wrap"><tbody><tr>',\r
-                    '<td class="x-btn-left"><i>&#160;</i></td><td class="x-btn-center"><em unselectable="on"><button class="x-btn-text" type="{1}">{0}</button></em></td><td class="x-btn-right"><i>&#160;</i></td>',\r
-                    "</tr></tbody></table>");\r
-            }\r
-            this.template = Ext.Button.buttonTemplate;\r
-        }\r
-        var btn, targs = [this.text || '&#160;', this.type];\r
-\r
-        if(position){\r
-            btn = this.template.insertBefore(position, targs, true);\r
-        }else{\r
-            btn = this.template.append(ct, targs, true);\r
-        }\r
-        var btnEl = btn.child(this.buttonSelector);\r
-        btnEl.on('focus', this.onFocus, this);\r
-        btnEl.on('blur', this.onBlur, this);\r
-\r
-        this.initButtonEl(btn, btnEl);\r
-\r
-        if(this.menu){\r
-            this.el.child(this.menuClassTarget).addClass("x-btn-with-menu");\r
-        }\r
-        Ext.ButtonToggleMgr.register(this);\r
-    },\r
-\r
-    // private\r
-    initButtonEl : function(btn, btnEl){\r
-\r
-        this.el = btn;\r
-        btn.addClass("x-btn");\r
-\r
-        if(this.id){\r
-            this.el.dom.id = this.el.id = this.id;\r
-        }\r
-        if(this.icon){\r
-            btnEl.setStyle('background-image', 'url(' +this.icon +')');\r
-        }\r
-        if(this.iconCls){\r
-            btnEl.addClass(this.iconCls);\r
-            if(!this.cls){\r
-                btn.addClass(this.text ? 'x-btn-text-icon' : 'x-btn-icon');\r
-            }\r
-        }\r
-        if(this.tabIndex !== undefined){\r
-            btnEl.dom.tabIndex = this.tabIndex;\r
-        }\r
-        if(this.tooltip){\r
-            if(typeof this.tooltip == 'object'){\r
-                Ext.QuickTips.register(Ext.apply({\r
-                      target: btnEl.id\r
-                }, this.tooltip));\r
-            } else {\r
-                btnEl.dom[this.tooltipType] = this.tooltip;\r
-            }\r
-        }\r
-\r
-        if(this.pressed){\r
-            this.el.addClass("x-btn-pressed");\r
-        }\r
-\r
-        if(this.handleMouseEvents){\r
-            btn.on("mouseover", this.onMouseOver, this);\r
-            // new functionality for monitoring on the document level\r
-            //btn.on("mouseout", this.onMouseOut, this);\r
-            btn.on("mousedown", this.onMouseDown, this);\r
-        }\r
-\r
-        if(this.menu){\r
-            this.menu.on("show", this.onMenuShow, this);\r
-            this.menu.on("hide", this.onMenuHide, this);\r
-        }\r
-\r
-        if(this.repeat){\r
-            var repeater = new Ext.util.ClickRepeater(btn,\r
-                typeof this.repeat == "object" ? this.repeat : {}\r
-            );\r
-            repeater.on("click", this.onClick,  this);\r
-        }\r
-\r
-        btn.on(this.clickEvent, this.onClick, this);\r
-    },\r
-\r
-    // private\r
-    afterRender : function(){\r
-        Ext.Button.superclass.afterRender.call(this);\r
-        if(Ext.isIE6){\r
-            this.autoWidth.defer(1, this);\r
-        }else{\r
-            this.autoWidth();\r
-        }\r
-    },\r
-\r
-    \r
-    setIconClass : function(cls){\r
-        if(this.el){\r
-            this.el.child(this.buttonSelector).replaceClass(this.iconCls, cls);\r
-        }\r
-        this.iconCls = cls;\r
-    },\r
-\r
-    // private\r
-    beforeDestroy: function(){\r
-       if(this.rendered){\r
-            var btnEl = this.el.child(this.buttonSelector);\r
-            if(btnEl){\r
-                if(this.tooltip){\r
-                    Ext.QuickTips.unregister(btnEl);\r
-                }\r
-                btnEl.removeAllListeners();\r
-            }\r
-           }\r
-        if(this.menu){\r
-            Ext.destroy(this.menu);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onDestroy : function(){\r
-        if(this.rendered){\r
-            Ext.ButtonToggleMgr.unregister(this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    autoWidth : function(){\r
-        if(this.el){\r
-            this.el.setWidth("auto");\r
-            if(Ext.isIE7 && Ext.isStrict){\r
-                var ib = this.el.child(this.buttonSelector);\r
-                if(ib && ib.getWidth() > 20){\r
-                    ib.clip();\r
-                    ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr'));\r
-                }\r
-            }\r
-            if(this.minWidth){\r
-                if(this.el.getWidth() < this.minWidth){\r
-                    this.el.setWidth(this.minWidth);\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    setHandler : function(handler, scope){\r
-        this.handler = handler;\r
-        this.scope = scope;\r
-    },\r
-\r
-    \r
-    setText : function(text){\r
-        this.text = text;\r
-        if(this.el){\r
-            this.el.child("td.x-btn-center " + this.buttonSelector).update(text);\r
-        }\r
-        this.autoWidth();\r
-    },\r
-\r
-    \r
-    getText : function(){\r
-        return this.text;\r
-    },\r
-\r
-    \r
-    toggle : function(state){\r
-        state = state === undefined ? !this.pressed : state;\r
-        if(state != this.pressed){\r
-            if(state){\r
-                this.el.addClass("x-btn-pressed");\r
-                this.pressed = true;\r
-                this.fireEvent("toggle", this, true);\r
-            }else{\r
-                this.el.removeClass("x-btn-pressed");\r
-                this.pressed = false;\r
-                this.fireEvent("toggle", this, false);\r
-            }\r
-            if(this.toggleHandler){\r
-                this.toggleHandler.call(this.scope || this, this, state);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    focus : function(){\r
-        this.el.child(this.buttonSelector).focus();\r
-    },\r
-\r
-    // private\r
-    onDisable : function(){\r
-        if(this.el){\r
-            if(!Ext.isIE6 || !this.text){\r
-                this.el.addClass(this.disabledClass);\r
-            }\r
-            this.el.dom.disabled = true;\r
-        }\r
-        this.disabled = true;\r
-    },\r
-\r
-    // private\r
-    onEnable : function(){\r
-        if(this.el){\r
-            if(!Ext.isIE6 || !this.text){\r
-                this.el.removeClass(this.disabledClass);\r
-            }\r
-            this.el.dom.disabled = false;\r
-        }\r
-        this.disabled = false;\r
-    },\r
-\r
-    \r
-    showMenu : function(){\r
-        if(this.menu){\r
-            this.menu.show(this.el, this.menuAlign);\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    hideMenu : function(){\r
-        if(this.menu){\r
-            this.menu.hide();\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    hasVisibleMenu : function(){\r
-        return this.menu && this.menu.isVisible();\r
-    },\r
-\r
-    // private\r
-    onClick : function(e){\r
-        if(e){\r
-            e.preventDefault();\r
-        }\r
-        if(e.button != 0){\r
-            return;\r
-        }\r
-        if(!this.disabled){\r
-            if(this.enableToggle && (this.allowDepress !== false || !this.pressed)){\r
-                this.toggle();\r
-            }\r
-            if(this.menu && !this.menu.isVisible() && !this.ignoreNextClick){\r
-                this.showMenu();\r
-            }\r
-            this.fireEvent("click", this, e);\r
-            if(this.handler){\r
-                //this.el.removeClass("x-btn-over");\r
-                this.handler.call(this.scope || this, this, e);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    isMenuTriggerOver : function(e, internal){\r
-        return this.menu && !internal;\r
-    },\r
-\r
-    // private\r
-    isMenuTriggerOut : function(e, internal){\r
-        return this.menu && !internal;\r
-    },\r
-\r
-    // private\r
-    onMouseOver : function(e){\r
-        if(!this.disabled){\r
-            var internal = e.within(this.el,  true);\r
-            if(!internal){\r
-                this.el.addClass("x-btn-over");\r
-                if(!this.monitoringMouseOver){\r
-                    Ext.getDoc().on('mouseover', this.monitorMouseOver, this);\r
-                    this.monitoringMouseOver = true;\r
-                }\r
-                this.fireEvent('mouseover', this, e);\r
-            }\r
-            if(this.isMenuTriggerOver(e, internal)){\r
-                this.fireEvent('menutriggerover', this, this.menu, e);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    monitorMouseOver : function(e){\r
-        if(e.target != this.el.dom && !e.within(this.el)){\r
-            if(this.monitoringMouseOver){\r
-                Ext.getDoc().un('mouseover', this.monitorMouseOver, this);\r
-                this.monitoringMouseOver = false;\r
-            }\r
-            this.onMouseOut(e);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onMouseOut : function(e){\r
-        var internal = e.within(this.el) && e.target != this.el.dom;\r
-        this.el.removeClass("x-btn-over");\r
-        this.fireEvent('mouseout', this, e);\r
-        if(this.isMenuTriggerOut(e, internal)){\r
-            this.fireEvent('menutriggerout', this, this.menu, e);\r
-        }\r
-    },\r
-    // private\r
-    onFocus : function(e){\r
-        if(!this.disabled){\r
-            this.el.addClass("x-btn-focus");\r
-        }\r
-    },\r
-    // private\r
-    onBlur : function(e){\r
-        this.el.removeClass("x-btn-focus");\r
-    },\r
-\r
-    // private\r
-    getClickEl : function(e, isUp){\r
-       return this.el;\r
-    },\r
-\r
-    // private\r
-    onMouseDown : function(e){\r
-        if(!this.disabled && e.button == 0){\r
-            this.getClickEl(e).addClass("x-btn-click");\r
-            Ext.getDoc().on('mouseup', this.onMouseUp, this);\r
-        }\r
-    },\r
-    // private\r
-    onMouseUp : function(e){\r
-        if(e.button == 0){\r
-            this.getClickEl(e, true).removeClass("x-btn-click");\r
-            Ext.getDoc().un('mouseup', this.onMouseUp, this);\r
-        }\r
-    },\r
-    // private\r
-    onMenuShow : function(e){\r
-        this.ignoreNextClick = 0;\r
-        this.el.addClass("x-btn-menu-active");\r
-        this.fireEvent('menushow', this, this.menu);\r
-    },\r
-    // private\r
-    onMenuHide : function(e){\r
-        this.el.removeClass("x-btn-menu-active");\r
-        this.ignoreNextClick = this.restoreClick.defer(250, this);\r
-        this.fireEvent('menuhide', this, this.menu);\r
-    },\r
-\r
-    // private\r
-    restoreClick : function(){\r
-        this.ignoreNextClick = 0;\r
-    }\r
-\r
-\r
-\r
-    \r
-});\r
-Ext.reg('button', Ext.Button);\r
-\r
-// Private utility class used by Button\r
-Ext.ButtonToggleMgr = function(){\r
-   var groups = {};\r
-\r
-   function toggleGroup(btn, state){\r
-       if(state){\r
-           var g = groups[btn.toggleGroup];\r
-           for(var i = 0, l = g.length; i < l; i++){\r
-               if(g[i] != btn){\r
-                   g[i].toggle(false);\r
-               }\r
-           }\r
-       }\r
-   }\r
-\r
-   return {\r
-       register : function(btn){\r
-           if(!btn.toggleGroup){\r
-               return;\r
-           }\r
-           var g = groups[btn.toggleGroup];\r
-           if(!g){\r
-               g = groups[btn.toggleGroup] = [];\r
-           }\r
-           g.push(btn);\r
-           btn.on("toggle", toggleGroup);\r
-       },\r
-\r
-       unregister : function(btn){\r
-           if(!btn.toggleGroup){\r
-               return;\r
-           }\r
-           var g = groups[btn.toggleGroup];\r
-           if(g){\r
-               g.remove(btn);\r
-               btn.un("toggle", toggleGroup);\r
-           }\r
-       }\r
-   };\r
-}();\r
-\r
-Ext.SplitButton = Ext.extend(Ext.Button, {\r
-       // private\r
-    arrowSelector : 'button:last',\r
-\r
-    // private\r
-    initComponent : function(){\r
-        Ext.SplitButton.superclass.initComponent.call(this);\r
-        \r
-        this.addEvents("arrowclick");\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        // this is one sweet looking template!\r
-        var tpl = new Ext.Template(\r
-            '<table cellspacing="0" class="x-btn-menu-wrap x-btn"><tr><td>',\r
-            '<table cellspacing="0" class="x-btn-wrap x-btn-menu-text-wrap"><tbody>',\r
-            '<tr><td class="x-btn-left"><i>&#160;</i></td><td class="x-btn-center"><button class="x-btn-text" type="{1}">{0}</button></td></tr>',\r
-            "</tbody></table></td><td>",\r
-            '<table cellspacing="0" class="x-btn-wrap x-btn-menu-arrow-wrap"><tbody>',\r
-            '<tr><td class="x-btn-center"><button class="x-btn-menu-arrow-el" type="button">&#160;</button></td><td class="x-btn-right"><i>&#160;</i></td></tr>',\r
-            "</tbody></table></td></tr></table>"\r
-        );\r
-        var btn, targs = [this.text || '&#160;', this.type];\r
-        if(position){\r
-            btn = tpl.insertBefore(position, targs, true);\r
-        }else{\r
-            btn = tpl.append(ct, targs, true);\r
-        }\r
-        var btnEl = btn.child(this.buttonSelector);\r
-\r
-        this.initButtonEl(btn, btnEl);\r
-        this.arrowBtnTable = btn.child("table:last");\r
-        if(this.arrowTooltip){\r
-            btn.child(this.arrowSelector).dom[this.tooltipType] = this.arrowTooltip;\r
-        }\r
-    },\r
-\r
-    // private\r
-    autoWidth : function(){\r
-        if(this.el){\r
-            var tbl = this.el.child("table:first");\r
-            var tbl2 = this.el.child("table:last");\r
-            this.el.setWidth("auto");\r
-            tbl.setWidth("auto");\r
-            if(Ext.isIE7 && Ext.isStrict){\r
-                var ib = this.el.child(this.buttonSelector);\r
-                if(ib && ib.getWidth() > 20){\r
-                    ib.clip();\r
-                    ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr'));\r
-                }\r
-            }\r
-            if(this.minWidth){\r
-                if((tbl.getWidth()+tbl2.getWidth()) < this.minWidth){\r
-                    tbl.setWidth(this.minWidth-tbl2.getWidth());\r
-                }\r
-            }\r
-            this.el.setWidth(tbl.getWidth()+tbl2.getWidth());\r
-        } \r
-    },\r
-\r
-    \r
-    setArrowHandler : function(handler, scope){\r
-        this.arrowHandler = handler;\r
-        this.scope = scope;  \r
-    },\r
-\r
-    // private\r
-    onClick : function(e){\r
-        e.preventDefault();\r
-        if(!this.disabled){\r
-            if(e.getTarget(".x-btn-menu-arrow-wrap")){\r
-                if(this.menu && !this.menu.isVisible() && !this.ignoreNextClick){\r
-                    this.showMenu();\r
-                }\r
-                this.fireEvent("arrowclick", this, e);\r
-                if(this.arrowHandler){\r
-                    this.arrowHandler.call(this.scope || this, this, e);\r
-                }\r
-            }else{\r
-                if(this.enableToggle){\r
-                    this.toggle();\r
-                }\r
-                this.fireEvent("click", this, e);\r
-                if(this.handler){\r
-                    this.handler.call(this.scope || this, this, e);\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    getClickEl : function(e, isUp){\r
-        if(!isUp){\r
-            return (this.lastClickEl = e.getTarget("table", 10, true));\r
-        }\r
-        return this.lastClickEl;\r
-    },\r
-\r
-    // private\r
-    onDisable : function(){\r
-        if(this.el){\r
-            if(!Ext.isIE6){\r
-                this.el.addClass("x-item-disabled");\r
-            }\r
-            this.el.child(this.buttonSelector).dom.disabled = true;\r
-            this.el.child(this.arrowSelector).dom.disabled = true;\r
-        }\r
-        this.disabled = true;\r
-    },\r
-\r
-    // private\r
-    onEnable : function(){\r
-        if(this.el){\r
-            if(!Ext.isIE6){\r
-                this.el.removeClass("x-item-disabled");\r
-            }\r
-            this.el.child(this.buttonSelector).dom.disabled = false;\r
-            this.el.child(this.arrowSelector).dom.disabled = false;\r
-        }\r
-        this.disabled = false;\r
-    },\r
-\r
-    // private\r
-    isMenuTriggerOver : function(e){\r
-        return this.menu && e.within(this.arrowBtnTable) && !e.within(this.arrowBtnTable, true);\r
-    },\r
-\r
-    // private\r
-    isMenuTriggerOut : function(e, internal){\r
-        return this.menu && !e.within(this.arrowBtnTable);\r
-    },\r
-\r
-    // private\r
-    onDestroy : function(){\r
-        Ext.destroy(this.arrowBtnTable);\r
-        Ext.SplitButton.superclass.onDestroy.call(this);\r
-    }\r
-});\r
-\r
-// backwards compat\r
-Ext.MenuButton = Ext.SplitButton;\r
-\r
-\r
-Ext.reg('splitbutton', Ext.SplitButton);\r
-\r
-Ext.CycleButton = Ext.extend(Ext.SplitButton, {\r
-    \r
-    \r
-    \r
-    \r
-       \r
-\r
-    // private\r
-    getItemText : function(item){\r
-        if(item && this.showText === true){\r
-            var text = '';\r
-            if(this.prependText){\r
-                text += this.prependText;\r
-            }\r
-            text += item.text;\r
-            return text;\r
-        }\r
-        return undefined;\r
-    },\r
-\r
-    \r
-    setActiveItem : function(item, suppressEvent){\r
-        if(typeof item != 'object'){\r
-            item = this.menu.items.get(item);\r
-        }\r
-        if(item){\r
-            if(!this.rendered){\r
-                this.text = this.getItemText(item);\r
-                this.iconCls = item.iconCls;\r
-            }else{\r
-                var t = this.getItemText(item);\r
-                if(t){\r
-                    this.setText(t);\r
-                }\r
-                this.setIconClass(item.iconCls);\r
-            }\r
-            this.activeItem = item;\r
-            if(!item.checked){\r
-                item.setChecked(true, true);\r
-            }\r
-            if(this.forceIcon){\r
-                this.setIconClass(this.forceIcon);\r
-            }\r
-            if(!suppressEvent){\r
-                this.fireEvent('change', this, item);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    getActiveItem : function(){\r
-        return this.activeItem;\r
-    },\r
-\r
-    // private\r
-    initComponent : function(){\r
-        this.addEvents(\r
-            \r
-            "change"\r
-        );\r
-\r
-        if(this.changeHandler){\r
-            this.on('change', this.changeHandler, this.scope||this);\r
-            delete this.changeHandler;\r
-        }\r
-\r
-        this.itemCount = this.items.length;\r
-\r
-        this.menu = {cls:'x-cycle-menu', items:[]};\r
-        var checked;\r
-        for(var i = 0, len = this.itemCount; i < len; i++){\r
-            var item = this.items[i];\r
-            item.group = item.group || this.id;\r
-            item.itemIndex = i;\r
-            item.checkHandler = this.checkHandler;\r
-            item.scope = this;\r
-            item.checked = item.checked || false;\r
-            this.menu.items.push(item);\r
-            if(item.checked){\r
-                checked = item;\r
-            }\r
-        }\r
-        this.setActiveItem(checked, true);\r
-        Ext.CycleButton.superclass.initComponent.call(this);\r
-\r
-        this.on('click', this.toggleSelected, this);\r
-    },\r
-\r
-    // private\r
-    checkHandler : function(item, pressed){\r
-        if(pressed){\r
-            this.setActiveItem(item);\r
-        }\r
-    },\r
-\r
-    \r
-    toggleSelected : function(){\r
-        this.menu.render();\r
-               \r
-               var nextIdx, checkItem;\r
-               for (var i = 1; i < this.itemCount; i++) {\r
-                       nextIdx = (this.activeItem.itemIndex + i) % this.itemCount;\r
-                       // check the potential item\r
-                       checkItem = this.menu.items.itemAt(nextIdx);\r
-                       // if its not disabled then check it.\r
-                       if (!checkItem.disabled) {\r
-                               checkItem.setChecked(true);\r
-                               break;\r
-                       }\r
-               }\r
-    }\r
-});\r
-Ext.reg('cycle', Ext.CycleButton);\r
\r
- Ext.Toolbar = function(config){\r
-    if(Ext.isArray(config)){\r
-        config = {buttons:config};\r
-    }\r
-    Ext.Toolbar.superclass.constructor.call(this, config);\r
-};\r
-\r
-(function(){\r
-\r
-var T = Ext.Toolbar;\r
-\r
-Ext.extend(T, Ext.BoxComponent, {\r
-\r
-    trackMenus : true,\r
-\r
-    // private\r
-    initComponent : function(){\r
-        T.superclass.initComponent.call(this);\r
-\r
-        if(this.items){\r
-            this.buttons = this.items;\r
-        }\r
-        \r
-        this.items = new Ext.util.MixedCollection(false, function(o){\r
-            return o.itemId || o.id || Ext.id();\r
-        });\r
-    },\r
-\r
-    // private\r
-    autoCreate: {\r
-        cls:'x-toolbar x-small-editor',\r
-        html:'<table cellspacing="0"><tr></tr></table>'\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        this.el = ct.createChild(Ext.apply({ id: this.id },this.autoCreate), position);\r
-        this.tr = this.el.child("tr", true);\r
-    },\r
-\r
-    // private\r
-    afterRender : function(){\r
-        T.superclass.afterRender.call(this);\r
-        if(this.buttons){\r
-            this.add.apply(this, this.buttons);\r
-            delete this.buttons;\r
-        }\r
-    },\r
-\r
-    \r
-    add : function(){\r
-        var a = arguments, l = a.length;\r
-        for(var i = 0; i < l; i++){\r
-            var el = a[i];\r
-            if(el.isFormField){ // some kind of form field\r
-                this.addField(el);\r
-            }else if(el.render){ // some kind of Toolbar.Item\r
-                this.addItem(el);\r
-            }else if(typeof el == "string"){ // string\r
-                if(el == "separator" || el == "-"){\r
-                    this.addSeparator();\r
-                }else if(el == " "){\r
-                    this.addSpacer();\r
-                }else if(el == "->"){\r
-                    this.addFill();\r
-                }else{\r
-                    this.addText(el);\r
-                }\r
-            }else if(el.tagName){ // element\r
-                this.addElement(el);\r
-            }else if(typeof el == "object"){ // must be button config?\r
-                if(el.xtype){\r
-                    this.addField(Ext.ComponentMgr.create(el, 'button'));\r
-                }else{\r
-                    this.addButton(el);\r
-                }\r
-            }\r
-        }\r
-    },\r
-    \r
-    \r
-    addSeparator : function(){\r
-        return this.addItem(new T.Separator());\r
-    },\r
-\r
-    \r
-    addSpacer : function(){\r
-        return this.addItem(new T.Spacer());\r
-    },\r
-\r
-    \r
-    addFill : function(){\r
-        return this.addItem(new T.Fill());\r
-    },\r
-\r
-    \r
-    addElement : function(el){\r
-        return this.addItem(new T.Item(el));\r
-    },\r
-    \r
-    \r
-    addItem : function(item){\r
-        var td = this.nextBlock();\r
-        this.initMenuTracking(item);\r
-        item.render(td);\r
-        this.items.add(item);\r
-        return item;\r
-    },\r
-    \r
-    \r
-    addButton : function(config){\r
-        if(Ext.isArray(config)){\r
-            var buttons = [];\r
-            for(var i = 0, len = config.length; i < len; i++) {\r
-                buttons.push(this.addButton(config[i]));\r
-            }\r
-            return buttons;\r
-        }\r
-        var b = config;\r
-        if(!(config instanceof T.Button)){\r
-            b = config.split ? \r
-                new T.SplitButton(config) :\r
-                new T.Button(config);\r
-        }\r
-        var td = this.nextBlock();\r
-        this.initMenuTracking(b);\r
-        b.render(td);\r
-        this.items.add(b);\r
-        return b;\r
-    },\r
-\r
-    // private\r
-    initMenuTracking : function(item){\r
-        if(this.trackMenus && item.menu){\r
-            item.on({\r
-                'menutriggerover' : this.onButtonTriggerOver,\r
-                'menushow' : this.onButtonMenuShow,\r
-                'menuhide' : this.onButtonMenuHide,\r
-                scope: this\r
-            })\r
-        }\r
-    },\r
-\r
-    \r
-    addText : function(text){\r
-        return this.addItem(new T.TextItem(text));\r
-    },\r
-    \r
-    \r
-    insertButton : function(index, item){\r
-        if(Ext.isArray(item)){\r
-            var buttons = [];\r
-            for(var i = 0, len = item.length; i < len; i++) {\r
-               buttons.push(this.insertButton(index + i, item[i]));\r
-            }\r
-            return buttons;\r
-        }\r
-        if (!(item instanceof T.Button)){\r
-           item = new T.Button(item);\r
-        }\r
-        var td = document.createElement("td");\r
-        this.tr.insertBefore(td, this.tr.childNodes[index]);\r
-        this.initMenuTracking(item);\r
-        item.render(td);\r
-        this.items.insert(index, item);\r
-        return item;\r
-    },\r
-    \r
-    \r
-    addDom : function(config, returnEl){\r
-        var td = this.nextBlock();\r
-        Ext.DomHelper.overwrite(td, config);\r
-        var ti = new T.Item(td.firstChild);\r
-        ti.render(td);\r
-        this.items.add(ti);\r
-        return ti;\r
-    },\r
-\r
-    \r
-    addField : function(field){\r
-        var td = this.nextBlock();\r
-        field.render(td);\r
-        var ti = new T.Item(td.firstChild);\r
-        ti.render(td);\r
-        this.items.add(field);\r
-        return ti;\r
-    },\r
-\r
-    // private\r
-    nextBlock : function(){\r
-        var td = document.createElement("td");\r
-        this.tr.appendChild(td);\r
-        return td;\r
-    },\r
-\r
-    // private\r
-    onDestroy : function(){\r
-        Ext.Toolbar.superclass.onDestroy.call(this);\r
-        if(this.rendered){\r
-            if(this.items){ // rendered?\r
-                Ext.destroy.apply(Ext, this.items.items);\r
-            }\r
-            Ext.Element.uncache(this.tr);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onDisable : function(){\r
-        this.items.each(function(item){\r
-             if(item.disable){\r
-                 item.disable();\r
-             }\r
-        });\r
-    },\r
-\r
-    // private\r
-    onEnable : function(){\r
-        this.items.each(function(item){\r
-             if(item.enable){\r
-                 item.enable();\r
-             }\r
-        });\r
-    },\r
-\r
-    // private\r
-    onButtonTriggerOver : function(btn){\r
-        if(this.activeMenuBtn && this.activeMenuBtn != btn){\r
-            this.activeMenuBtn.hideMenu();\r
-            btn.showMenu();\r
-            this.activeMenuBtn = btn;\r
-        }\r
-    },\r
-\r
-    // private\r
-    onButtonMenuShow : function(btn){\r
-        this.activeMenuBtn = btn;\r
-    },\r
-\r
-    // private\r
-    onButtonMenuHide : function(btn){\r
-        delete this.activeMenuBtn;\r
-    }\r
-\r
-    \r
-});\r
-Ext.reg('toolbar', Ext.Toolbar);\r
-\r
-\r
-T.Item = function(el){\r
-    this.el = Ext.getDom(el);\r
-    this.id = Ext.id(this.el);\r
-    this.hidden = false;\r
-};\r
-\r
-T.Item.prototype = {\r
-    \r
-    \r
-    getEl : function(){\r
-       return this.el;  \r
-    },\r
-\r
-    // private\r
-    render : function(td){\r
-        this.td = td;\r
-        td.appendChild(this.el);\r
-    },\r
-    \r
-    \r
-    destroy : function(){\r
-        if(this.el){\r
-            var el = Ext.get(this.el);\r
-            Ext.destroy(el);\r
-        }\r
-        Ext.removeNode(this.td);\r
-    },\r
-    \r
-    \r
-    show: function(){\r
-        this.hidden = false;\r
-        this.td.style.display = "";\r
-    },\r
-    \r
-    \r
-    hide: function(){\r
-        this.hidden = true;\r
-        this.td.style.display = "none";\r
-    },\r
-    \r
-    \r
-    setVisible: function(visible){\r
-        if(visible) {\r
-            this.show();\r
-        }else{\r
-            this.hide();\r
-        }\r
-    },\r
-    \r
-    \r
-    focus : function(){\r
-        Ext.fly(this.el).focus();\r
-    },\r
-    \r
-    \r
-    disable : function(){\r
-        Ext.fly(this.td).addClass("x-item-disabled");\r
-        this.disabled = true;\r
-        this.el.disabled = true;\r
-    },\r
-    \r
-    \r
-    enable : function(){\r
-        Ext.fly(this.td).removeClass("x-item-disabled");\r
-        this.disabled = false;\r
-        this.el.disabled = false;\r
-    }\r
-};\r
-Ext.reg('tbitem', T.Item);\r
-\r
-\r
-\r
-T.Separator = function(){\r
-    var s = document.createElement("span");\r
-    s.className = "ytb-sep";\r
-    T.Separator.superclass.constructor.call(this, s);\r
-};\r
-Ext.extend(T.Separator, T.Item, {\r
-    enable:Ext.emptyFn,\r
-    disable:Ext.emptyFn,\r
-    focus:Ext.emptyFn\r
-});\r
-Ext.reg('tbseparator', T.Separator);\r
-\r
-\r
-T.Spacer = function(){\r
-    var s = document.createElement("div");\r
-    s.className = "ytb-spacer";\r
-    T.Spacer.superclass.constructor.call(this, s);\r
-};\r
-Ext.extend(T.Spacer, T.Item, {\r
-    enable:Ext.emptyFn,\r
-    disable:Ext.emptyFn,\r
-    focus:Ext.emptyFn\r
-});\r
-\r
-Ext.reg('tbspacer', T.Spacer);\r
-\r
-\r
-T.Fill = Ext.extend(T.Spacer, {\r
-    // private\r
-    render : function(td){\r
-        td.style.width = '100%';\r
-        T.Fill.superclass.render.call(this, td);\r
-    }\r
-});\r
-Ext.reg('tbfill', T.Fill);\r
-\r
-\r
-T.TextItem = function(t){\r
-    var s = document.createElement("span");\r
-    s.className = "ytb-text";\r
-    s.innerHTML = t.text ? t.text : t;\r
-    T.TextItem.superclass.constructor.call(this, s);\r
-};\r
-Ext.extend(T.TextItem, T.Item, {\r
-    enable:Ext.emptyFn,\r
-    disable:Ext.emptyFn,\r
-    focus:Ext.emptyFn\r
-});\r
-Ext.reg('tbtext', T.TextItem);\r
-\r
-\r
-\r
-T.Button = Ext.extend(Ext.Button, {\r
-    hideParent : true,\r
-\r
-    onDestroy : function(){\r
-        T.Button.superclass.onDestroy.call(this);\r
-        if(this.container){\r
-            this.container.remove();\r
-        }\r
-    }\r
-});\r
-Ext.reg('tbbutton', T.Button);\r
-\r
-\r
-T.SplitButton = Ext.extend(Ext.SplitButton, {\r
-    hideParent : true,\r
-\r
-    onDestroy : function(){\r
-        T.SplitButton.superclass.onDestroy.call(this);\r
-        if(this.container){\r
-            this.container.remove();\r
-        }\r
-    }\r
-});\r
-\r
-Ext.reg('tbsplit', T.SplitButton);\r
-// backwards compat\r
-T.MenuButton = T.SplitButton;\r
-\r
-})();\r
-\r
-\r
-Ext.PagingToolbar = Ext.extend(Ext.Toolbar, {\r
-    \r
-    \r
-    \r
-    pageSize: 20,\r
-    \r
-    displayMsg : 'Displaying {0} - {1} of {2}',\r
-    \r
-    emptyMsg : 'No data to display',\r
-    \r
-    beforePageText : "Page",\r
-    \r
-    afterPageText : "of {0}",\r
-    \r
-    firstText : "First Page",\r
-    \r
-    prevText : "Previous Page",\r
-    \r
-    nextText : "Next Page",\r
-    \r
-    lastText : "Last Page",\r
-    \r
-    refreshText : "Refresh",\r
-\r
-    \r
-    paramNames : {start: 'start', limit: 'limit'},\r
-\r
-    // private\r
-    initComponent : function(){\r
-        this.addEvents(\r
-            \r
-            'change',\r
-            \r
-            'beforechange'\r
-        );\r
-        Ext.PagingToolbar.superclass.initComponent.call(this);\r
-        this.cursor = 0;\r
-        this.bind(this.store);\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        Ext.PagingToolbar.superclass.onRender.call(this, ct, position);\r
-        this.first = this.addButton({\r
-            tooltip: this.firstText,\r
-            iconCls: "x-tbar-page-first",\r
-            disabled: true,\r
-            handler: this.onClick.createDelegate(this, ["first"])\r
-        });\r
-        this.prev = this.addButton({\r
-            tooltip: this.prevText,\r
-            iconCls: "x-tbar-page-prev",\r
-            disabled: true,\r
-            handler: this.onClick.createDelegate(this, ["prev"])\r
-        });\r
-        this.addSeparator();\r
-        this.add(this.beforePageText);\r
-        this.field = Ext.get(this.addDom({\r
-           tag: "input",\r
-           type: "text",\r
-           size: "3",\r
-           value: "1",\r
-           cls: "x-tbar-page-number"\r
-        }).el);\r
-        this.field.on("keydown", this.onPagingKeydown, this);\r
-        this.field.on("focus", function(){this.dom.select();});\r
-        this.field.on("blur", this.onPagingBlur, this);\r
-        this.afterTextEl = this.addText(String.format(this.afterPageText, 1));\r
-        this.field.setHeight(18);\r
-        this.addSeparator();\r
-        this.next = this.addButton({\r
-            tooltip: this.nextText,\r
-            iconCls: "x-tbar-page-next",\r
-            disabled: true,\r
-            handler: this.onClick.createDelegate(this, ["next"])\r
-        });\r
-        this.last = this.addButton({\r
-            tooltip: this.lastText,\r
-            iconCls: "x-tbar-page-last",\r
-            disabled: true,\r
-            handler: this.onClick.createDelegate(this, ["last"])\r
-        });\r
-        this.addSeparator();\r
-        this.loading = this.addButton({\r
-            tooltip: this.refreshText,\r
-            iconCls: "x-tbar-loading",\r
-            handler: this.onClick.createDelegate(this, ["refresh"])\r
-        });\r
-\r
-        if(this.displayInfo){\r
-            this.displayEl = Ext.fly(this.el.dom).createChild({cls:'x-paging-info'});\r
-        }\r
-        if(this.dsLoaded){\r
-            this.onLoad.apply(this, this.dsLoaded);\r
-        }\r
-    },\r
-\r
-    // private\r
-    updateInfo : function(){\r
-        if(this.displayEl){\r
-            var count = this.store.getCount();\r
-            var msg = count == 0 ?\r
-                this.emptyMsg :\r
-                String.format(\r
-                    this.displayMsg,\r
-                    this.cursor+1, this.cursor+count, this.store.getTotalCount()\r
-                );\r
-            this.displayEl.update(msg);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onLoad : function(store, r, o){\r
-        if(!this.rendered){\r
-            this.dsLoaded = [store, r, o];\r
-            return;\r
-        }\r
-       this.cursor = o.params ? o.params[this.paramNames.start] : 0;\r
-       var d = this.getPageData(), ap = d.activePage, ps = d.pages;\r
-\r
-        this.afterTextEl.el.innerHTML = String.format(this.afterPageText, d.pages);\r
-        this.field.dom.value = ap;\r
-        this.first.setDisabled(ap == 1);\r
-        this.prev.setDisabled(ap == 1);\r
-        this.next.setDisabled(ap == ps);\r
-        this.last.setDisabled(ap == ps);\r
-        this.loading.enable();\r
-        this.updateInfo();\r
-        this.fireEvent('change', this, d);\r
-    },\r
-\r
-    // private\r
-    getPageData : function(){\r
-        var total = this.store.getTotalCount();\r
-        return {\r
-            total : total,\r
-            activePage : Math.ceil((this.cursor+this.pageSize)/this.pageSize),\r
-            pages :  total < this.pageSize ? 1 : Math.ceil(total/this.pageSize)\r
-        };\r
-    },\r
-\r
-    // private\r
-    onLoadError : function(){\r
-        if(!this.rendered){\r
-            return;\r
-        }\r
-        this.loading.enable();\r
-    },\r
-\r
-    // private\r
-    readPage : function(d){\r
-        var v = this.field.dom.value, pageNum;\r
-        if (!v || isNaN(pageNum = parseInt(v, 10))) {\r
-            this.field.dom.value = d.activePage;\r
-            return false;\r
-        }\r
-        return pageNum;\r
-    },\r
-\r
-    //private\r
-    onPagingBlur: function(e){\r
-        this.field.dom.value = this.getPageData().activePage;\r
-    },\r
-\r
-    // private\r
-    onPagingKeydown : function(e){\r
-        var k = e.getKey(), d = this.getPageData(), pageNum;\r
-        if (k == e.RETURN) {\r
-            e.stopEvent();\r
-            pageNum = this.readPage(d);\r
-            if(pageNum !== false){\r
-                pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1;\r
-                this.doLoad(pageNum * this.pageSize);\r
-            }\r
-        }else if (k == e.HOME || k == e.END){\r
-            e.stopEvent();\r
-            pageNum = k == e.HOME ? 1 : d.pages;\r
-            this.field.dom.value = pageNum;\r
-        }else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN){\r
-            e.stopEvent();\r
-            if(pageNum = this.readPage(d)){\r
-                var increment = e.shiftKey ? 10 : 1;\r
-                if(k == e.DOWN || k == e.PAGEDOWN){\r
-                    increment *= -1;\r
-                }\r
-                pageNum += increment;\r
-                if(pageNum >= 1 & pageNum <= d.pages){\r
-                    this.field.dom.value = pageNum;\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    beforeLoad : function(){\r
-        if(this.rendered && this.loading){\r
-            this.loading.disable();\r
-        }\r
-    },\r
-\r
-    // private\r
-    doLoad : function(start){\r
-        var o = {}, pn = this.paramNames;\r
-        o[pn.start] = start;\r
-        o[pn.limit] = this.pageSize;\r
-        if(this.fireEvent('beforechange', this, o) !== false){\r
-            this.store.load({params:o});\r
-        }\r
-    },\r
-\r
-    \r
-    changePage: function(page){\r
-        this.doLoad(((page-1) * this.pageSize).constrain(0, this.store.getTotalCount()));\r
-    },\r
-\r
-    // private\r
-    onClick : function(which){\r
-        var store = this.store;\r
-        switch(which){\r
-            case "first":\r
-                this.doLoad(0);\r
-            break;\r
-            case "prev":\r
-                this.doLoad(Math.max(0, this.cursor-this.pageSize));\r
-            break;\r
-            case "next":\r
-                this.doLoad(this.cursor+this.pageSize);\r
-            break;\r
-            case "last":\r
-                var total = store.getTotalCount();\r
-                var extra = total % this.pageSize;\r
-                var lastStart = extra ? (total - extra) : total-this.pageSize;\r
-                this.doLoad(lastStart);\r
-            break;\r
-            case "refresh":\r
-                this.doLoad(this.cursor);\r
-            break;\r
-        }\r
-    },\r
-\r
-    \r
-    unbind : function(store){\r
-        store = Ext.StoreMgr.lookup(store);\r
-        store.un("beforeload", this.beforeLoad, this);\r
-        store.un("load", this.onLoad, this);\r
-        store.un("loadexception", this.onLoadError, this);\r
-        this.store = undefined;\r
-    },\r
-\r
-    \r
-    bind : function(store){\r
-        store = Ext.StoreMgr.lookup(store);\r
-        store.on("beforeload", this.beforeLoad, this);\r
-        store.on("load", this.onLoad, this);\r
-        store.on("loadexception", this.onLoadError, this);\r
-        this.store = store;\r
-    },\r
-\r
-    // private\r
-    onDestroy : function(){\r
-        if(this.store){\r
-            this.unbind(this.store);\r
-        }\r
-        Ext.PagingToolbar.superclass.onDestroy.call(this);\r
-    }\r
-});\r
-Ext.reg('paging', Ext.PagingToolbar);\r
-\r
-Ext.Resizable = function(el, config){\r
-    this.el = Ext.get(el);\r
-    \r
-    if(config && config.wrap){\r
-        config.resizeChild = this.el;\r
-        this.el = this.el.wrap(typeof config.wrap == "object" ? config.wrap : {cls:"xresizable-wrap"});\r
-        this.el.id = this.el.dom.id = config.resizeChild.id + "-rzwrap";\r
-        this.el.setStyle("overflow", "hidden");\r
-        this.el.setPositioning(config.resizeChild.getPositioning());\r
-        config.resizeChild.clearPositioning();\r
-        if(!config.width || !config.height){\r
-            var csize = config.resizeChild.getSize();\r
-            this.el.setSize(csize.width, csize.height);\r
-        }\r
-        if(config.pinned && !config.adjustments){\r
-            config.adjustments = "auto";\r
-        }\r
-    }\r
-\r
-    \r
-    this.proxy = this.el.createProxy({tag: "div", cls: "x-resizable-proxy", id: this.el.id + "-rzproxy"}, Ext.getBody());\r
-    this.proxy.unselectable();\r
-    this.proxy.enableDisplayMode('block');\r
-\r
-    Ext.apply(this, config);\r
-    \r
-    if(this.pinned){\r
-        this.disableTrackOver = true;\r
-        this.el.addClass("x-resizable-pinned");\r
-    }\r
-    // if the element isn't positioned, make it relative\r
-    var position = this.el.getStyle("position");\r
-    if(position != "absolute" && position != "fixed"){\r
-        this.el.setStyle("position", "relative");\r
-    }\r
-    if(!this.handles){ // no handles passed, must be legacy style\r
-        this.handles = 's,e,se';\r
-        if(this.multiDirectional){\r
-            this.handles += ',n,w';\r
-        }\r
-    }\r
-    if(this.handles == "all"){\r
-        this.handles = "n s e w ne nw se sw";\r
-    }\r
-    var hs = this.handles.split(/\s*?[,;]\s*?| /);\r
-    var ps = Ext.Resizable.positions;\r
-    for(var i = 0, len = hs.length; i < len; i++){\r
-        if(hs[i] && ps[hs[i]]){\r
-            var pos = ps[hs[i]];\r
-            this[pos] = new Ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent);\r
-        }\r
-    }\r
-    // legacy\r
-    this.corner = this.southeast;\r
-    \r
-    if(this.handles.indexOf("n") != -1 || this.handles.indexOf("w") != -1){\r
-        this.updateBox = true;\r
-    }   \r
-   \r
-    this.activeHandle = null;\r
-    \r
-    if(this.resizeChild){\r
-        if(typeof this.resizeChild == "boolean"){\r
-            this.resizeChild = Ext.get(this.el.dom.firstChild, true);\r
-        }else{\r
-            this.resizeChild = Ext.get(this.resizeChild, true);\r
-        }\r
-    }\r
-    \r
-    if(this.adjustments == "auto"){\r
-        var rc = this.resizeChild;\r
-        var hw = this.west, he = this.east, hn = this.north, hs = this.south;\r
-        if(rc && (hw || hn)){\r
-            rc.position("relative");\r
-            rc.setLeft(hw ? hw.el.getWidth() : 0);\r
-            rc.setTop(hn ? hn.el.getHeight() : 0);\r
-        }\r
-        this.adjustments = [\r
-            (he ? -he.el.getWidth() : 0) + (hw ? -hw.el.getWidth() : 0),\r
-            (hn ? -hn.el.getHeight() : 0) + (hs ? -hs.el.getHeight() : 0) -1 \r
-        ];\r
-    }\r
-    \r
-    if(this.draggable){\r
-        this.dd = this.dynamic ? \r
-            this.el.initDD(null) : this.el.initDDProxy(null, {dragElId: this.proxy.id});\r
-        this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id : this.el.id);\r
-    }\r
-    \r
-    // public events\r
-    this.addEvents(\r
-        "beforeresize",\r
-        "resize"\r
-    );\r
-    \r
-    if(this.width !== null && this.height !== null){\r
-        this.resizeTo(this.width, this.height);\r
-    }else{\r
-        this.updateChildSize();\r
-    }\r
-    if(Ext.isIE){\r
-        this.el.dom.style.zoom = 1;\r
-    }\r
-    Ext.Resizable.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.Resizable, Ext.util.Observable, {\r
-        resizeChild : false,\r
-        adjustments : [0, 0],\r
-        minWidth : 5,\r
-        minHeight : 5,\r
-        maxWidth : 10000,\r
-        maxHeight : 10000,\r
-        enabled : true,\r
-        animate : false,\r
-        duration : .35,\r
-        dynamic : false,\r
-        handles : false,\r
-        multiDirectional : false,\r
-        disableTrackOver : false,\r
-        easing : 'easeOutStrong',\r
-        widthIncrement : 0,\r
-        heightIncrement : 0,\r
-        pinned : false,\r
-        width : null,\r
-        height : null,\r
-        preserveRatio : false,\r
-        transparent: false,\r
-        minX: 0,\r
-        minY: 0,\r
-        draggable: false,\r
-\r
-        \r
-        \r
-\r
-        \r
-        \r
-    \r
-    \r
-    resizeTo : function(width, height){\r
-        this.el.setSize(width, height);\r
-        this.updateChildSize();\r
-        this.fireEvent("resize", this, width, height, null);\r
-    },\r
-\r
-    // private\r
-    startSizing : function(e, handle){\r
-        this.fireEvent("beforeresize", this, e);\r
-        if(this.enabled){ // 2nd enabled check in case disabled before beforeresize handler\r
-\r
-            if(!this.overlay){\r
-                this.overlay = this.el.createProxy({tag: "div", cls: "x-resizable-overlay", html: "&#160;"}, Ext.getBody());\r
-                this.overlay.unselectable();\r
-                this.overlay.enableDisplayMode("block");\r
-                this.overlay.on("mousemove", this.onMouseMove, this);\r
-                this.overlay.on("mouseup", this.onMouseUp, this);\r
-            }\r
-            this.overlay.setStyle("cursor", handle.el.getStyle("cursor"));\r
-\r
-            this.resizing = true;\r
-            this.startBox = this.el.getBox();\r
-            this.startPoint = e.getXY();\r
-            this.offsets = [(this.startBox.x + this.startBox.width) - this.startPoint[0],\r
-                            (this.startBox.y + this.startBox.height) - this.startPoint[1]];\r
-\r
-            this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));\r
-            this.overlay.show();\r
-\r
-            if(this.constrainTo) {\r
-                var ct = Ext.get(this.constrainTo);\r
-                this.resizeRegion = ct.getRegion().adjust(\r
-                    ct.getFrameWidth('t'),\r
-                    ct.getFrameWidth('l'),\r
-                    -ct.getFrameWidth('b'),\r
-                    -ct.getFrameWidth('r')\r
-                );\r
-            }\r
-\r
-            this.proxy.setStyle('visibility', 'hidden'); // workaround display none\r
-            this.proxy.show();\r
-            this.proxy.setBox(this.startBox);\r
-            if(!this.dynamic){\r
-                this.proxy.setStyle('visibility', 'visible');\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    onMouseDown : function(handle, e){\r
-        if(this.enabled){\r
-            e.stopEvent();\r
-            this.activeHandle = handle;\r
-            this.startSizing(e, handle);\r
-        }          \r
-    },\r
-\r
-    // private\r
-    onMouseUp : function(e){\r
-        var size = this.resizeElement();\r
-        this.resizing = false;\r
-        this.handleOut();\r
-        this.overlay.hide();\r
-        this.proxy.hide();\r
-        this.fireEvent("resize", this, size.width, size.height, e);\r
-    },\r
-\r
-    // private\r
-    updateChildSize : function(){\r
-        if(this.resizeChild){\r
-            var el = this.el;\r
-            var child = this.resizeChild;\r
-            var adj = this.adjustments;\r
-            if(el.dom.offsetWidth){\r
-                var b = el.getSize(true);\r
-                child.setSize(b.width+adj[0], b.height+adj[1]);\r
-            }\r
-            // Second call here for IE\r
-            // The first call enables instant resizing and\r
-            // the second call corrects scroll bars if they\r
-            // exist\r
-            if(Ext.isIE){\r
-                setTimeout(function(){\r
-                    if(el.dom.offsetWidth){\r
-                        var b = el.getSize(true);\r
-                        child.setSize(b.width+adj[0], b.height+adj[1]);\r
-                    }\r
-                }, 10);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    snap : function(value, inc, min){\r
-        if(!inc || !value) return value;\r
-        var newValue = value;\r
-        var m = value % inc;\r
-        if(m > 0){\r
-            if(m > (inc/2)){\r
-                newValue = value + (inc-m);\r
-            }else{\r
-                newValue = value - m;\r
-            }\r
-        }\r
-        return Math.max(min, newValue);\r
-    },\r
-\r
-    \r
-    resizeElement : function(){\r
-        var box = this.proxy.getBox();\r
-        if(this.updateBox){\r
-            this.el.setBox(box, false, this.animate, this.duration, null, this.easing);\r
-        }else{\r
-            this.el.setSize(box.width, box.height, this.animate, this.duration, null, this.easing);\r
-        }\r
-        this.updateChildSize();\r
-        if(!this.dynamic){\r
-            this.proxy.hide();\r
-        }\r
-        return box;\r
-    },\r
-\r
-    // private\r
-    constrain : function(v, diff, m, mx){\r
-        if(v - diff < m){\r
-            diff = v - m;    \r
-        }else if(v - diff > mx){\r
-            diff = mx - v; \r
-        }\r
-        return diff;                \r
-    },\r
-\r
-    // private\r
-    onMouseMove : function(e){\r
-        if(this.enabled){\r
-            try{// try catch so if something goes wrong the user doesn't get hung\r
-\r
-            if(this.resizeRegion && !this.resizeRegion.contains(e.getPoint())) {\r
-                return;\r
-            }\r
-\r
-            //var curXY = this.startPoint;\r
-            var curSize = this.curSize || this.startBox;\r
-            var x = this.startBox.x, y = this.startBox.y;\r
-            var ox = x, oy = y;\r
-            var w = curSize.width, h = curSize.height;\r
-            var ow = w, oh = h;\r
-            var mw = this.minWidth, mh = this.minHeight;\r
-            var mxw = this.maxWidth, mxh = this.maxHeight;\r
-            var wi = this.widthIncrement;\r
-            var hi = this.heightIncrement;\r
-            \r
-            var eventXY = e.getXY();\r
-            var diffX = -(this.startPoint[0] - Math.max(this.minX, eventXY[0]));\r
-            var diffY = -(this.startPoint[1] - Math.max(this.minY, eventXY[1]));\r
-            \r
-            var pos = this.activeHandle.position;\r
-            \r
-            switch(pos){\r
-                case "east":\r
-                    w += diffX; \r
-                    w = Math.min(Math.max(mw, w), mxw);\r
-                    break;\r
-                case "south":\r
-                    h += diffY;\r
-                    h = Math.min(Math.max(mh, h), mxh);\r
-                    break;\r
-                case "southeast":\r
-                    w += diffX; \r
-                    h += diffY;\r
-                    w = Math.min(Math.max(mw, w), mxw);\r
-                    h = Math.min(Math.max(mh, h), mxh);\r
-                    break;\r
-                case "north":\r
-                    diffY = this.constrain(h, diffY, mh, mxh);\r
-                    y += diffY;\r
-                    h -= diffY;\r
-                    break;\r
-                case "west":\r
-                    diffX = this.constrain(w, diffX, mw, mxw);\r
-                    x += diffX;\r
-                    w -= diffX;\r
-                    break;\r
-                case "northeast":\r
-                    w += diffX; \r
-                    w = Math.min(Math.max(mw, w), mxw);\r
-                    diffY = this.constrain(h, diffY, mh, mxh);\r
-                    y += diffY;\r
-                    h -= diffY;\r
-                    break;\r
-                case "northwest":\r
-                    diffX = this.constrain(w, diffX, mw, mxw);\r
-                    diffY = this.constrain(h, diffY, mh, mxh);\r
-                    y += diffY;\r
-                    h -= diffY;\r
-                    x += diffX;\r
-                    w -= diffX;\r
-                    break;\r
-               case "southwest":\r
-                    diffX = this.constrain(w, diffX, mw, mxw);\r
-                    h += diffY;\r
-                    h = Math.min(Math.max(mh, h), mxh);\r
-                    x += diffX;\r
-                    w -= diffX;\r
-                    break;\r
-            }\r
-            \r
-            var sw = this.snap(w, wi, mw);\r
-            var sh = this.snap(h, hi, mh);\r
-            if(sw != w || sh != h){\r
-                switch(pos){\r
-                    case "northeast":\r
-                        y -= sh - h;\r
-                    break;\r
-                    case "north":\r
-                        y -= sh - h;\r
-                        break;\r
-                    case "southwest":\r
-                        x -= sw - w;\r
-                    break;\r
-                    case "west":\r
-                        x -= sw - w;\r
-                        break;\r
-                    case "northwest":\r
-                        x -= sw - w;\r
-                        y -= sh - h;\r
-                    break;\r
-                }\r
-                w = sw;\r
-                h = sh;\r
-            }\r
-            \r
-            if(this.preserveRatio){\r
-                switch(pos){\r
-                    case "southeast":\r
-                    case "east":\r
-                        h = oh * (w/ow);\r
-                        h = Math.min(Math.max(mh, h), mxh);\r
-                        w = ow * (h/oh);\r
-                       break;\r
-                    case "south":\r
-                        w = ow * (h/oh);\r
-                        w = Math.min(Math.max(mw, w), mxw);\r
-                        h = oh * (w/ow);\r
-                        break;\r
-                    case "northeast":\r
-                        w = ow * (h/oh);\r
-                        w = Math.min(Math.max(mw, w), mxw);\r
-                        h = oh * (w/ow);\r
-                    break;\r
-                    case "north":\r
-                        var tw = w;\r
-                        w = ow * (h/oh);\r
-                        w = Math.min(Math.max(mw, w), mxw);\r
-                        h = oh * (w/ow);\r
-                        x += (tw - w) / 2;\r
-                        break;\r
-                    case "southwest":\r
-                        h = oh * (w/ow);\r
-                        h = Math.min(Math.max(mh, h), mxh);\r
-                        var tw = w;\r
-                        w = ow * (h/oh);\r
-                        x += tw - w;\r
-                        break;\r
-                    case "west":\r
-                        var th = h;\r
-                        h = oh * (w/ow);\r
-                        h = Math.min(Math.max(mh, h), mxh);\r
-                        y += (th - h) / 2;\r
-                        var tw = w;\r
-                        w = ow * (h/oh);\r
-                        x += tw - w;\r
-                       break;\r
-                    case "northwest":\r
-                        var tw = w;\r
-                        var th = h;\r
-                        h = oh * (w/ow);\r
-                        h = Math.min(Math.max(mh, h), mxh);\r
-                        w = ow * (h/oh);\r
-                        y += th - h;\r
-                         x += tw - w;\r
-                       break;\r
-                        \r
-                }\r
-            }\r
-            this.proxy.setBounds(x, y, w, h);\r
-            if(this.dynamic){\r
-                this.resizeElement();\r
-            }\r
-            }catch(e){}\r
-        }\r
-    },\r
-\r
-    // private\r
-    handleOver : function(){\r
-        if(this.enabled){\r
-            this.el.addClass("x-resizable-over");\r
-        }\r
-    },\r
-\r
-    // private\r
-    handleOut : function(){\r
-        if(!this.resizing){\r
-            this.el.removeClass("x-resizable-over");\r
-        }\r
-    },\r
-    \r
-    \r
-    getEl : function(){\r
-        return this.el;\r
-    },\r
-    \r
-    \r
-    getResizeChild : function(){\r
-        return this.resizeChild;\r
-    },\r
-    \r
-    \r
-    destroy : function(removeEl){\r
-        if(this.dd){\r
-            this.dd.destroy();\r
-        }\r
-        if(this.overlay){\r
-            Ext.destroy(this.overlay);\r
-            this.overlay = null;\r
-        }\r
-        Ext.destroy(this.proxy);\r
-        this.proxy = null;\r
-        \r
-        var ps = Ext.Resizable.positions;\r
-        for(var k in ps){\r
-            if(typeof ps[k] != "function" && this[ps[k]]){\r
-                this[ps[k]].destroy();\r
-            }\r
-        }\r
-        if(removeEl){\r
-            this.el.update("");\r
-            Ext.destroy(this.el);\r
-            this.el = null;\r
-        }\r
-    },\r
-\r
-    syncHandleHeight : function(){\r
-        var h = this.el.getHeight(true);\r
-        if(this.west){\r
-            this.west.el.setHeight(h);\r
-        }\r
-        if(this.east){\r
-            this.east.el.setHeight(h);\r
-        }\r
-    }\r
-});\r
-\r
-// private\r
-// hash to map config positions to true positions\r
-Ext.Resizable.positions = {\r
-    n: "north", s: "south", e: "east", w: "west", se: "southeast", sw: "southwest", nw: "northwest", ne: "northeast"\r
-};\r
-\r
-// private\r
-Ext.Resizable.Handle = function(rz, pos, disableTrackOver, transparent){\r
-    if(!this.tpl){\r
-        // only initialize the template if resizable is used\r
-        var tpl = Ext.DomHelper.createTemplate(\r
-            {tag: "div", cls: "x-resizable-handle x-resizable-handle-{0}"}\r
-        );\r
-        tpl.compile();\r
-        Ext.Resizable.Handle.prototype.tpl = tpl;\r
-    }\r
-    this.position = pos;\r
-    this.rz = rz;\r
-    this.el = this.tpl.append(rz.el.dom, [this.position], true);\r
-    this.el.unselectable();\r
-    if(transparent){\r
-        this.el.setOpacity(0);\r
-    }\r
-    this.el.on("mousedown", this.onMouseDown, this);\r
-    if(!disableTrackOver){\r
-        this.el.on("mouseover", this.onMouseOver, this);\r
-        this.el.on("mouseout", this.onMouseOut, this);\r
-    }\r
-};\r
-\r
-// private\r
-Ext.Resizable.Handle.prototype = {\r
-    // private\r
-    afterResize : function(rz){\r
-        // do nothing    \r
-    },\r
-    // private\r
-    onMouseDown : function(e){\r
-        this.rz.onMouseDown(this, e);\r
-    },\r
-    // private\r
-    onMouseOver : function(e){\r
-        this.rz.handleOver(this, e);\r
-    },\r
-    // private\r
-    onMouseOut : function(e){\r
-        this.rz.handleOut(this, e);\r
-    },\r
-    // private\r
-    destroy : function(){\r
-        Ext.destroy(this.el);\r
-        this.el = null;\r
-    }\r
-};\r
-\r
-\r
-\r
-\r
-\r
-Ext.Editor = function(field, config){\r
-    this.field = field;\r
-    Ext.Editor.superclass.constructor.call(this, config);\r
-};\r
-\r
-Ext.extend(Ext.Editor, Ext.Component, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    value : "",\r
-    \r
-    alignment: "c-c?",\r
-    \r
-    shadow : "frame",\r
-    \r
-    constrain : false,\r
-    \r
-    swallowKeys : true,\r
-    \r
-    completeOnEnter : false,\r
-    \r
-    cancelOnEsc : false,\r
-    \r
-    updateEl : false,\r
-\r
-    initComponent : function(){\r
-        Ext.Editor.superclass.initComponent.call(this);\r
-        this.addEvents(\r
-            \r
-            "beforestartedit",\r
-            \r
-            "startedit",\r
-            \r
-            "beforecomplete",\r
-            \r
-            "complete",\r
-            \r
-            "canceledit",\r
-            \r
-            "specialkey"\r
-        );\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        this.el = new Ext.Layer({\r
-            shadow: this.shadow,\r
-            cls: "x-editor",\r
-            parentEl : ct,\r
-            shim : this.shim,\r
-            shadowOffset:4,\r
-            id: this.id,\r
-            constrain: this.constrain\r
-        });\r
-        this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden");\r
-        if(this.field.msgTarget != 'title'){\r
-            this.field.msgTarget = 'qtip';\r
-        }\r
-        this.field.inEditor = true;\r
-        this.field.render(this.el);\r
-        if(Ext.isGecko){\r
-            this.field.el.dom.setAttribute('autocomplete', 'off');\r
-        }\r
-        this.field.on("specialkey", this.onSpecialKey, this);\r
-        if(this.swallowKeys){\r
-            this.field.el.swallowEvent(['keydown','keypress']);\r
-        }\r
-        this.field.show();\r
-        this.field.on("blur", this.onBlur, this);\r
-        if(this.field.grow){\r
-            this.field.on("autosize", this.el.sync,  this.el, {delay:1});\r
-        }\r
-    },\r
-\r
-    // private\r
-    onSpecialKey : function(field, e){\r
-        var key = e.getKey();\r
-        if(this.completeOnEnter && key == e.ENTER){\r
-            e.stopEvent();\r
-            this.completeEdit();\r
-        }else if(this.cancelOnEsc && key == e.ESC){\r
-            this.cancelEdit();\r
-        }else{\r
-            this.fireEvent('specialkey', field, e);\r
-        }\r
-        if(this.field.triggerBlur && (key == e.ENTER || key == e.ESC || key == e.TAB)){\r
-            this.field.triggerBlur();\r
-        }\r
-    },\r
-\r
-    \r
-    startEdit : function(el, value){\r
-        if(this.editing){\r
-            this.completeEdit();\r
-        }\r
-        this.boundEl = Ext.get(el);\r
-        var v = value !== undefined ? value : this.boundEl.dom.innerHTML;\r
-        if(!this.rendered){\r
-            this.render(this.parentEl || document.body);\r
-        }\r
-        if(this.fireEvent("beforestartedit", this, this.boundEl, v) === false){\r
-            return;\r
-        }\r
-        this.startValue = v;\r
-        this.field.setValue(v);\r
-        this.doAutoSize();\r
-        this.el.alignTo(this.boundEl, this.alignment);\r
-        this.editing = true;\r
-        this.show();\r
-    },\r
-\r
-    // private\r
-    doAutoSize : function(){\r
-        if(this.autoSize){\r
-            var sz = this.boundEl.getSize();\r
-            switch(this.autoSize){\r
-                case "width":\r
-                    this.setSize(sz.width,  "");\r
-                break;\r
-                case "height":\r
-                    this.setSize("",  sz.height);\r
-                break;\r
-                default:\r
-                    this.setSize(sz.width,  sz.height);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    setSize : function(w, h){\r
-        delete this.field.lastSize;\r
-        this.field.setSize(w, h);\r
-        if(this.el){\r
-               if(Ext.isGecko2 || Ext.isOpera){\r
-                   // prevent layer scrollbars\r
-                   this.el.setSize(w, h);\r
-               }\r
-            this.el.sync();\r
-        }\r
-    },\r
-\r
-    \r
-    realign : function(){\r
-        this.el.alignTo(this.boundEl, this.alignment);\r
-    },\r
-\r
-    \r
-    completeEdit : function(remainVisible){\r
-        if(!this.editing){\r
-            return;\r
-        }\r
-        var v = this.getValue();\r
-        if(this.revertInvalid !== false && !this.field.isValid()){\r
-            v = this.startValue;\r
-            this.cancelEdit(true);\r
-        }\r
-        if(String(v) === String(this.startValue) && this.ignoreNoChange){\r
-            this.editing = false;\r
-            this.hide();\r
-            return;\r
-        }\r
-        if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){\r
-            this.editing = false;\r
-            if(this.updateEl && this.boundEl){\r
-                this.boundEl.update(v);\r
-            }\r
-            if(remainVisible !== true){\r
-                this.hide();\r
-            }\r
-            this.fireEvent("complete", this, v, this.startValue);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onShow : function(){\r
-        this.el.show();\r
-        if(this.hideEl !== false){\r
-            this.boundEl.hide();\r
-        }\r
-        this.field.show();\r
-        if(Ext.isIE && !this.fixIEFocus){ // IE has problems with focusing the first time\r
-            this.fixIEFocus = true;\r
-            this.deferredFocus.defer(50, this);\r
-        }else{\r
-            this.field.focus();\r
-        }\r
-        this.fireEvent("startedit", this.boundEl, this.startValue);\r
-    },\r
-\r
-    deferredFocus : function(){\r
-        if(this.editing){\r
-            this.field.focus();\r
-        }\r
-    },\r
-\r
-    \r
-    cancelEdit : function(remainVisible){\r
-        if(this.editing){\r
-            var v = this.getValue();\r
-            this.setValue(this.startValue);\r
-            if(remainVisible !== true){\r
-                this.hide();\r
-            }\r
-            this.fireEvent("canceledit", this, v, this.startValue);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onBlur : function(){\r
-        if(this.allowBlur !== true && this.editing){\r
-            this.completeEdit();\r
-        }\r
-    },\r
-\r
-    // private\r
-    onHide : function(){\r
-        if(this.editing){\r
-            this.completeEdit();\r
-            return;\r
-        }\r
-        this.field.blur();\r
-        if(this.field.collapse){\r
-            this.field.collapse();\r
-        }\r
-        this.el.hide();\r
-        if(this.hideEl !== false){\r
-            this.boundEl.show();\r
-        }\r
-    },\r
-\r
-    \r
-    setValue : function(v){\r
-        this.field.setValue(v);\r
-    },\r
-\r
-    \r
-    getValue : function(){\r
-        return this.field.getValue();\r
-    },\r
-\r
-    beforeDestroy : function(){\r
-        Ext.destroy(this.field);\r
-        this.field = null;\r
-    }\r
-});\r
-Ext.reg('editor', Ext.Editor);\r
-\r
-Ext.MessageBox = function(){\r
-    var dlg, opt, mask, waitTimer;\r
-    var bodyEl, msgEl, textboxEl, textareaEl, progressBar, pp, iconEl, spacerEl;\r
-    var buttons, activeTextEl, bwidth, iconCls = '';\r
-\r
-    // private\r
-    var handleButton = function(button){\r
-        if(dlg.isVisible()){\r
-            dlg.hide();\r
-            Ext.callback(opt.fn, opt.scope||window, [button, activeTextEl.dom.value, opt], 1);\r
-        }\r
-    };\r
-\r
-    // private\r
-    var handleHide = function(){\r
-        if(opt && opt.cls){\r
-            dlg.el.removeClass(opt.cls);\r
-        }\r
-        progressBar.reset();\r
-    };\r
-\r
-    // private\r
-    var handleEsc = function(d, k, e){\r
-        if(opt && opt.closable !== false){\r
-            dlg.hide();\r
-        }\r
-        if(e){\r
-            e.stopEvent();\r
-        }\r
-    };\r
-\r
-    // private\r
-    var updateButtons = function(b){\r
-        var width = 0;\r
-        if(!b){\r
-            buttons["ok"].hide();\r
-            buttons["cancel"].hide();\r
-            buttons["yes"].hide();\r
-            buttons["no"].hide();\r
-            return width;\r
-        }\r
-        dlg.footer.dom.style.display = '';\r
-        for(var k in buttons){\r
-            if(typeof buttons[k] != "function"){\r
-                if(b[k]){\r
-                    buttons[k].show();\r
-                    buttons[k].setText(typeof b[k] == "string" ? b[k] : Ext.MessageBox.buttonText[k]);\r
-                    width += buttons[k].el.getWidth()+15;\r
-                }else{\r
-                    buttons[k].hide();\r
-                }\r
-            }\r
-        }\r
-        return width;\r
-    };\r
-\r
-    return {\r
-        \r
-        getDialog : function(titleText){\r
-           if(!dlg){\r
-                dlg = new Ext.Window({\r
-                    autoCreate : true,\r
-                    title:titleText,\r
-                    resizable:false,\r
-                    constrain:true,\r
-                    constrainHeader:true,\r
-                    minimizable : false,\r
-                    maximizable : false,\r
-                    stateful: false,\r
-                    modal: true,\r
-                    shim:true,\r
-                    buttonAlign:"center",\r
-                    width:400,\r
-                    height:100,\r
-                    minHeight: 80,\r
-                    plain:true,\r
-                    footer:true,\r
-                    closable:true,\r
-                    close : function(){\r
-                        if(opt && opt.buttons && opt.buttons.no && !opt.buttons.cancel){\r
-                            handleButton("no");\r
-                        }else{\r
-                            handleButton("cancel");\r
-                        }\r
-                    }\r
-                });\r
-                buttons = {};\r
-                var bt = this.buttonText;\r
-                //TODO: refactor this block into a buttons config to pass into the Window constructor\r
-                buttons["ok"] = dlg.addButton(bt["ok"], handleButton.createCallback("ok"));\r
-                buttons["yes"] = dlg.addButton(bt["yes"], handleButton.createCallback("yes"));\r
-                buttons["no"] = dlg.addButton(bt["no"], handleButton.createCallback("no"));\r
-                buttons["cancel"] = dlg.addButton(bt["cancel"], handleButton.createCallback("cancel"));\r
-                buttons["ok"].hideMode = buttons["yes"].hideMode = buttons["no"].hideMode = buttons["cancel"].hideMode = 'offsets';\r
-                dlg.render(document.body);\r
-                dlg.getEl().addClass('x-window-dlg');\r
-                mask = dlg.mask;\r
-                bodyEl = dlg.body.createChild({\r
-                    html:'<div class="ext-mb-icon"></div><div class="ext-mb-content"><span class="ext-mb-text"></span><br /><div class="ext-mb-fix-cursor"><input type="text" class="ext-mb-input" /><textarea class="ext-mb-textarea"></textarea></div></div>'\r
-                });\r
-                iconEl = Ext.get(bodyEl.dom.firstChild);\r
-                var contentEl = bodyEl.dom.childNodes[1];\r
-                msgEl = Ext.get(contentEl.firstChild);\r
-                textboxEl = Ext.get(contentEl.childNodes[2].firstChild);\r
-                textboxEl.enableDisplayMode();\r
-                textboxEl.addKeyListener([10,13], function(){\r
-                    if(dlg.isVisible() && opt && opt.buttons){\r
-                        if(opt.buttons.ok){\r
-                            handleButton("ok");\r
-                        }else if(opt.buttons.yes){\r
-                            handleButton("yes");\r
-                        }\r
-                    }\r
-                });\r
-                textareaEl = Ext.get(contentEl.childNodes[2].childNodes[1]);\r
-                textareaEl.enableDisplayMode();\r
-                progressBar = new Ext.ProgressBar({\r
-                    renderTo:bodyEl\r
-                });\r
-               bodyEl.createChild({cls:'x-clear'});\r
-            }\r
-            return dlg;\r
-        },\r
-\r
-        \r
-        updateText : function(text){\r
-            if(!dlg.isVisible() && !opt.width){\r
-                dlg.setSize(this.maxWidth, 100); // resize first so content is never clipped from previous shows\r
-            }\r
-            msgEl.update(text || '&#160;');\r
-\r
-            var iw = iconCls != '' ? (iconEl.getWidth() + iconEl.getMargins('lr')) : 0;\r
-            var mw = msgEl.getWidth() + msgEl.getMargins('lr');\r
-            var fw = dlg.getFrameWidth('lr');\r
-            var bw = dlg.body.getFrameWidth('lr');\r
-            if (Ext.isIE && iw > 0){\r
-                //3 pixels get subtracted in the icon CSS for an IE margin issue,\r
-                //so we have to add it back here for the overall width to be consistent\r
-                iw += 3;\r
-            }\r
-            var w = Math.max(Math.min(opt.width || iw+mw+fw+bw, this.maxWidth),\r
-                        Math.max(opt.minWidth || this.minWidth, bwidth || 0));\r
-\r
-            if(opt.prompt === true){\r
-                activeTextEl.setWidth(w-iw-fw-bw);\r
-            }\r
-            if(opt.progress === true || opt.wait === true){\r
-                progressBar.setSize(w-iw-fw-bw);\r
-            }\r
-            if(Ext.isIE && w == bwidth){\r
-                w += 4; //Add offset when the content width is smaller than the buttons.    \r
-            }\r
-            dlg.setSize(w, 'auto').center();\r
-            return this;\r
-        },\r
-\r
-        \r
-        updateProgress : function(value, progressText, msg){\r
-            progressBar.updateProgress(value, progressText);\r
-            if(msg){\r
-                this.updateText(msg);\r
-            }\r
-            return this;\r
-        },\r
-\r
-        \r
-        isVisible : function(){\r
-            return dlg && dlg.isVisible();\r
-        },\r
-\r
-        \r
-        hide : function(){\r
-            var proxy = dlg.activeGhost;\r
-            if(this.isVisible() || proxy) {\r
-                dlg.hide();\r
-                handleHide();\r
-                if (proxy) {\r
-                    proxy.hide();\r
-                } \r
-            }\r
-            return this;\r
-        },\r
-\r
-        \r
-        show : function(options){\r
-            if(this.isVisible()){\r
-                this.hide();\r
-            }\r
-            opt = options;\r
-            var d = this.getDialog(opt.title || "&#160;");\r
-\r
-            d.setTitle(opt.title || "&#160;");\r
-            var allowClose = (opt.closable !== false && opt.progress !== true && opt.wait !== true);\r
-            d.tools.close.setDisplayed(allowClose);\r
-            activeTextEl = textboxEl;\r
-            opt.prompt = opt.prompt || (opt.multiline ? true : false);\r
-            if(opt.prompt){\r
-                if(opt.multiline){\r
-                    textboxEl.hide();\r
-                    textareaEl.show();\r
-                    textareaEl.setHeight(typeof opt.multiline == "number" ?\r
-                        opt.multiline : this.defaultTextHeight);\r
-                    activeTextEl = textareaEl;\r
-                }else{\r
-                    textboxEl.show();\r
-                    textareaEl.hide();\r
-                }\r
-            }else{\r
-                textboxEl.hide();\r
-                textareaEl.hide();\r
-            }\r
-            activeTextEl.dom.value = opt.value || "";\r
-            if(opt.prompt){\r
-                d.focusEl = activeTextEl;\r
-            }else{\r
-                var bs = opt.buttons;\r
-                var db = null;\r
-                if(bs && bs.ok){\r
-                    db = buttons["ok"];\r
-                }else if(bs && bs.yes){\r
-                    db = buttons["yes"];\r
-                }\r
-                if (db){\r
-                    d.focusEl = db;\r
-                }\r
-            }\r
-            if(opt.iconCls){\r
-              d.setIconClass(opt.iconCls);\r
-            }\r
-            this.setIcon(opt.icon);\r
-            bwidth = updateButtons(opt.buttons);\r
-            progressBar.setVisible(opt.progress === true || opt.wait === true);\r
-            this.updateProgress(0, opt.progressText);\r
-            this.updateText(opt.msg);\r
-            if(opt.cls){\r
-                d.el.addClass(opt.cls);\r
-            }\r
-            d.proxyDrag = opt.proxyDrag === true;\r
-            d.modal = opt.modal !== false;\r
-            d.mask = opt.modal !== false ? mask : false;\r
-            if(!d.isVisible()){\r
-                // force it to the end of the z-index stack so it gets a cursor in FF\r
-                document.body.appendChild(dlg.el.dom);\r
-                d.setAnimateTarget(opt.animEl);\r
-                d.show(opt.animEl);\r
-            }\r
-\r
-            //workaround for window internally enabling keymap in afterShow\r
-            d.on('show', function(){\r
-                if(allowClose === true){\r
-                    d.keyMap.enable();\r
-                }else{\r
-                    d.keyMap.disable();\r
-                }\r
-            }, this, {single:true});\r
-\r
-            if(opt.wait === true){\r
-                progressBar.wait(opt.waitConfig);\r
-            }\r
-            return this;\r
-        },\r
-\r
-        \r
-        setIcon : function(icon){\r
-            if(icon && icon != ''){\r
-                iconEl.removeClass('x-hidden');\r
-                iconEl.replaceClass(iconCls, icon);\r
-                iconCls = icon;\r
-            }else{\r
-                iconEl.replaceClass(iconCls, 'x-hidden');\r
-                iconCls = '';\r
-            }\r
-            return this;\r
-        },\r
-\r
-        \r
-        progress : function(title, msg, progressText){\r
-            this.show({\r
-                title : title,\r
-                msg : msg,\r
-                buttons: false,\r
-                progress:true,\r
-                closable:false,\r
-                minWidth: this.minProgressWidth,\r
-                progressText: progressText\r
-            });\r
-            return this;\r
-        },\r
-\r
-        \r
-        wait : function(msg, title, config){\r
-            this.show({\r
-                title : title,\r
-                msg : msg,\r
-                buttons: false,\r
-                closable:false,\r
-                wait:true,\r
-                modal:true,\r
-                minWidth: this.minProgressWidth,\r
-                waitConfig: config\r
-            });\r
-            return this;\r
-        },\r
-\r
-        \r
-        alert : function(title, msg, fn, scope){\r
-            this.show({\r
-                title : title,\r
-                msg : msg,\r
-                buttons: this.OK,\r
-                fn: fn,\r
-                scope : scope\r
-            });\r
-            return this;\r
-        },\r
-\r
-        \r
-        confirm : function(title, msg, fn, scope){\r
-            this.show({\r
-                title : title,\r
-                msg : msg,\r
-                buttons: this.YESNO,\r
-                fn: fn,\r
-                scope : scope,\r
-                icon: this.QUESTION\r
-            });\r
-            return this;\r
-        },\r
-\r
-        \r
-        prompt : function(title, msg, fn, scope, multiline, value){\r
-            this.show({\r
-                title : title,\r
-                msg : msg,\r
-                buttons: this.OKCANCEL,\r
-                fn: fn,\r
-                minWidth:250,\r
-                scope : scope,\r
-                prompt:true,\r
-                multiline: multiline,\r
-                value: value\r
-            });\r
-            return this;\r
-        },\r
-\r
-        \r
-        OK : {ok:true},\r
-        \r
-        CANCEL : {cancel:true},\r
-        \r
-        OKCANCEL : {ok:true, cancel:true},\r
-        \r
-        YESNO : {yes:true, no:true},\r
-        \r
-        YESNOCANCEL : {yes:true, no:true, cancel:true},\r
-        \r
-        INFO : 'ext-mb-info',\r
-        \r
-        WARNING : 'ext-mb-warning',\r
-        \r
-        QUESTION : 'ext-mb-question',\r
-        \r
-        ERROR : 'ext-mb-error',\r
-\r
-        \r
-        defaultTextHeight : 75,\r
-        \r
-        maxWidth : 600,\r
-        \r
-        minWidth : 100,\r
-        \r
-        minProgressWidth : 250,\r
-        \r
-        buttonText : {\r
-            ok : "OK",\r
-            cancel : "Cancel",\r
-            yes : "Yes",\r
-            no : "No"\r
-        }\r
-    };\r
-}();\r
-\r
-\r
-Ext.Msg = Ext.MessageBox;\r
-\r
-Ext.Tip = Ext.extend(Ext.Panel, {\r
-    \r
-    \r
-    \r
-    minWidth : 40,\r
-    \r
-    maxWidth : 300,\r
-    \r
-    shadow : "sides",\r
-    \r
-    defaultAlign : "tl-bl?",\r
-    autoRender: true,\r
-    quickShowInterval : 250,\r
-\r
-    // private panel overrides\r
-    frame:true,\r
-    hidden:true,\r
-    baseCls: 'x-tip',\r
-    floating:{shadow:true,shim:true,useDisplay:true,constrain:false},\r
-    autoHeight:true,\r
-\r
-    // private\r
-    initComponent : function(){\r
-        Ext.Tip.superclass.initComponent.call(this);\r
-        if(this.closable && !this.title){\r
-            this.elements += ',header';\r
-        }\r
-    },\r
-\r
-    // private\r
-    afterRender : function(){\r
-        Ext.Tip.superclass.afterRender.call(this);\r
-        if(this.closable){\r
-            this.addTool({\r
-                id: 'close',\r
-                handler: this.hide,\r
-                scope: this\r
-            });\r
-        }\r
-    },\r
-\r
-    \r
-    showAt : function(xy){\r
-        Ext.Tip.superclass.show.call(this);\r
-        if(this.measureWidth !== false && (!this.initialConfig || typeof this.initialConfig.width != 'number')){\r
-            this.doAutoWidth();\r
-        }\r
-        if(this.constrainPosition){\r
-            xy = this.el.adjustForConstraints(xy);\r
-        }\r
-        this.setPagePosition(xy[0], xy[1]);\r
-    },\r
-\r
-    // protected\r
-    doAutoWidth : function(){\r
-        var bw = this.body.getTextWidth();\r
-        if(this.title){\r
-            bw = Math.max(bw, this.header.child('span').getTextWidth(this.title));\r
-        }\r
-        bw += this.getFrameWidth() + (this.closable ? 20 : 0) + this.body.getPadding("lr");\r
-        this.setWidth(bw.constrain(this.minWidth, this.maxWidth));\r
-        \r
-        // IE7 repaint bug on initial show\r
-        if(Ext.isIE7 && !this.repainted){\r
-            this.el.repaint();\r
-            this.repainted = true;\r
-        }\r
-    },\r
-\r
-    \r
-    showBy : function(el, pos){\r
-        if(!this.rendered){\r
-            this.render(Ext.getBody());\r
-        }\r
-        this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign));\r
-    },\r
-\r
-    initDraggable : function(){\r
-        this.dd = new Ext.Tip.DD(this, typeof this.draggable == 'boolean' ? null : this.draggable);\r
-        this.header.addClass('x-tip-draggable');\r
-    }\r
-});\r
-\r
-// private - custom Tip DD implementation\r
-Ext.Tip.DD = function(tip, config){\r
-    Ext.apply(this, config);\r
-    this.tip = tip;\r
-    Ext.Tip.DD.superclass.constructor.call(this, tip.el.id, 'WindowDD-'+tip.id);\r
-    this.setHandleElId(tip.header.id);\r
-    this.scroll = false;\r
-};\r
-\r
-Ext.extend(Ext.Tip.DD, Ext.dd.DD, {\r
-    moveOnly:true,\r
-    scroll:false,\r
-    headerOffsets:[100, 25],\r
-    startDrag : function(){\r
-        this.tip.el.disableShadow();\r
-    },\r
-    endDrag : function(e){\r
-        this.tip.el.enableShadow(true);\r
-    }\r
-});\r
-\r
-Ext.ToolTip = Ext.extend(Ext.Tip, {\r
-    \r
-    \r
-    \r
-    showDelay: 500,\r
-    \r
-    hideDelay: 200,\r
-    \r
-    dismissDelay: 5000,\r
-    \r
-    mouseOffset: [15,18],\r
-    \r
-    trackMouse : false,\r
-    constrainPosition: true,\r
-\r
-    // private\r
-    initComponent: function(){\r
-        Ext.ToolTip.superclass.initComponent.call(this);\r
-        this.lastActive = new Date();\r
-        this.initTarget();\r
-    },\r
-\r
-    // private\r
-    initTarget : function(){\r
-        if(this.target){\r
-            this.target = Ext.get(this.target);\r
-            this.target.on('mouseover', this.onTargetOver, this);\r
-            this.target.on('mouseout', this.onTargetOut, this);\r
-            this.target.on('mousemove', this.onMouseMove, this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onMouseMove : function(e){\r
-        this.targetXY = e.getXY();\r
-        if(!this.hidden && this.trackMouse){\r
-            this.setPagePosition(this.getTargetXY());\r
-        }\r
-    },\r
-\r
-    // private\r
-    getTargetXY : function(){\r
-        return [this.targetXY[0]+this.mouseOffset[0], this.targetXY[1]+this.mouseOffset[1]];\r
-    },\r
-\r
-    // private\r
-    onTargetOver : function(e){\r
-        if(this.disabled || e.within(this.target.dom, true)){\r
-            return;\r
-        }\r
-        this.clearTimer('hide');\r
-        this.targetXY = e.getXY();\r
-        this.delayShow();\r
-    },\r
-\r
-    // private\r
-    delayShow : function(){\r
-        if(this.hidden && !this.showTimer){\r
-            if(this.lastActive.getElapsed() < this.quickShowInterval){\r
-                this.show();\r
-            }else{\r
-                this.showTimer = this.show.defer(this.showDelay, this);\r
-            }\r
-        }else if(!this.hidden && this.autoHide !== false){\r
-            this.show();\r
-        }\r
-    },\r
-\r
-    // private\r
-    onTargetOut : function(e){\r
-        if(this.disabled || e.within(this.target.dom, true)){\r
-            return;\r
-        }\r
-        this.clearTimer('show');\r
-        if(this.autoHide !== false){\r
-            this.delayHide();\r
-        }\r
-    },\r
-\r
-    // private\r
-    delayHide : function(){\r
-        if(!this.hidden && !this.hideTimer){\r
-            this.hideTimer = this.hide.defer(this.hideDelay, this);\r
-        }\r
-    },\r
-\r
-    \r
-    hide: function(){\r
-        this.clearTimer('dismiss');\r
-        this.lastActive = new Date();\r
-        Ext.ToolTip.superclass.hide.call(this);\r
-    },\r
-\r
-    \r
-    show : function(){\r
-        this.showAt(this.getTargetXY());\r
-    },\r
-\r
-    // inherit docs\r
-    showAt : function(xy){\r
-        this.lastActive = new Date();\r
-        this.clearTimers();\r
-        Ext.ToolTip.superclass.showAt.call(this, xy);\r
-        if(this.dismissDelay && this.autoHide !== false){\r
-            this.dismissTimer = this.hide.defer(this.dismissDelay, this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    clearTimer : function(name){\r
-        name = name + 'Timer';\r
-        clearTimeout(this[name]);\r
-        delete this[name];\r
-    },\r
-\r
-    // private\r
-    clearTimers : function(){\r
-        this.clearTimer('show');\r
-        this.clearTimer('dismiss');\r
-        this.clearTimer('hide');\r
-    },\r
-\r
-    // private\r
-    onShow : function(){\r
-        Ext.ToolTip.superclass.onShow.call(this);\r
-        Ext.getDoc().on('mousedown', this.onDocMouseDown, this);\r
-    },\r
-\r
-    // private\r
-    onHide : function(){\r
-        Ext.ToolTip.superclass.onHide.call(this);\r
-        Ext.getDoc().un('mousedown', this.onDocMouseDown, this);\r
-    },\r
-\r
-    // private\r
-    onDocMouseDown : function(e){\r
-        if(this.autoHide !== false && !e.within(this.el.dom)){\r
-            this.disable();\r
-            this.enable.defer(100, this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onDisable : function(){\r
-        this.clearTimers();\r
-        this.hide();\r
-    },\r
-\r
-    // private\r
-    adjustPosition : function(x, y){\r
-        // keep the position from being under the mouse\r
-        var ay = this.targetXY[1], h = this.getSize().height;\r
-        if(this.constrainPosition && y <= ay && (y+h) >= ay){\r
-            y = ay-h-5;\r
-        }\r
-        return {x : x, y: y};\r
-    },\r
-\r
-    // private\r
-    onDestroy : function(){\r
-        Ext.ToolTip.superclass.onDestroy.call(this);\r
-        if(this.target){\r
-            this.target.un('mouseover', this.onTargetOver, this);\r
-            this.target.un('mouseout', this.onTargetOut, this);\r
-            this.target.un('mousemove', this.onMouseMove, this);\r
-        }\r
-    }\r
-});\r
-\r
-Ext.QuickTip = Ext.extend(Ext.ToolTip, {\r
-    \r
-    \r
-    interceptTitles : false,\r
-\r
-    // private\r
-    tagConfig : {\r
-        namespace : "ext",\r
-        attribute : "qtip",\r
-        width : "qwidth",\r
-        target : "target",\r
-        title : "qtitle",\r
-        hide : "hide",\r
-        cls : "qclass",\r
-        align : "qalign"\r
-    },\r
-\r
-    // private\r
-    initComponent : function(){\r
-        this.target = this.target || Ext.getDoc();\r
-        this.targets = this.targets || {};\r
-        Ext.QuickTip.superclass.initComponent.call(this);\r
-    },\r
-\r
-    \r
-    register : function(config){\r
-        var cs = Ext.isArray(config) ? config : arguments;\r
-        for(var i = 0, len = cs.length; i < len; i++){\r
-            var c = cs[i];\r
-            var target = c.target;\r
-            if(target){\r
-                if(Ext.isArray(target)){\r
-                    for(var j = 0, jlen = target.length; j < jlen; j++){\r
-                        this.targets[Ext.id(target[j])] = c;\r
-                    }\r
-                } else{\r
-                    this.targets[Ext.id(target)] = c;\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    unregister : function(el){\r
-        delete this.targets[Ext.id(el)];\r
-    },\r
-\r
-    // private\r
-    onTargetOver : function(e){\r
-        if(this.disabled){\r
-            return;\r
-        }\r
-        this.targetXY = e.getXY();\r
-        var t = e.getTarget();\r
-        if(!t || t.nodeType !== 1 || t == document || t == document.body){\r
-            return;\r
-        }\r
-        if(this.activeTarget && t == this.activeTarget.el){\r
-            this.clearTimer('hide');\r
-            this.show();\r
-            return;\r
-        }\r
-        if(t && this.targets[t.id]){\r
-            this.activeTarget = this.targets[t.id];\r
-            this.activeTarget.el = t;\r
-            this.delayShow();\r
-            return;\r
-        }\r
-        var ttp, et = Ext.fly(t), cfg = this.tagConfig;\r
-        var ns = cfg.namespace;\r
-        if(this.interceptTitles && t.title){\r
-            ttp = t.title;\r
-            t.qtip = ttp;\r
-            t.removeAttribute("title");\r
-            e.preventDefault();\r
-        } else{\r
-            ttp = t.qtip || et.getAttributeNS(ns, cfg.attribute);\r
-        }\r
-        if(ttp){\r
-            var autoHide = et.getAttributeNS(ns, cfg.hide);\r
-            this.activeTarget = {\r
-                el: t,\r
-                text: ttp,\r
-                width: et.getAttributeNS(ns, cfg.width),\r
-                autoHide: autoHide != "user" && autoHide !== 'false',\r
-                title: et.getAttributeNS(ns, cfg.title),\r
-                cls: et.getAttributeNS(ns, cfg.cls),\r
-                align: et.getAttributeNS(ns, cfg.align)\r
-            };\r
-            this.delayShow();\r
-        }\r
-    },\r
-\r
-    // private\r
-    onTargetOut : function(e){\r
-        this.clearTimer('show');\r
-        if(this.autoHide !== false){\r
-            this.delayHide();\r
-        }\r
-    },\r
-\r
-    // inherit docs\r
-    showAt : function(xy){\r
-        var t = this.activeTarget;\r
-        if(t){\r
-            if(!this.rendered){\r
-                this.render(Ext.getBody());\r
-                this.activeTarget = t;\r
-            }\r
-            if(t.width){\r
-                this.setWidth(t.width);\r
-                this.body.setWidth(this.adjustBodyWidth(t.width - this.getFrameWidth()));\r
-                this.measureWidth = false;\r
-            } else{\r
-                this.measureWidth = true;\r
-            }\r
-            this.setTitle(t.title || '');\r
-            this.body.update(t.text);\r
-            this.autoHide = t.autoHide;\r
-            this.dismissDelay = t.dismissDelay || this.dismissDelay;\r
-            if(this.lastCls){\r
-                this.el.removeClass(this.lastCls);\r
-                delete this.lastCls;\r
-            }\r
-            if(t.cls){\r
-                this.el.addClass(t.cls);\r
-                this.lastCls = t.cls;\r
-            }\r
-            if(t.align){ // TODO: this doesn't seem to work consistently\r
-                xy = this.el.getAlignToXY(t.el, t.align);\r
-                this.constrainPosition = false;\r
-            } else{\r
-                this.constrainPosition = true;\r
-            }\r
-        }\r
-        Ext.QuickTip.superclass.showAt.call(this, xy);\r
-    },\r
-\r
-    // inherit docs\r
-    hide: function(){\r
-        delete this.activeTarget;\r
-        Ext.QuickTip.superclass.hide.call(this);\r
-    }\r
-});\r
-\r
-Ext.QuickTips = function(){\r
-    var tip, locks = [];\r
-    return {\r
-        \r
-        init : function(autoRender){\r
-                   if(!tip){\r
-                       if(!Ext.isReady){\r
-                           Ext.onReady(function(){\r
-                               Ext.QuickTips.init(autoRender);\r
-                           });\r
-                           return;\r
-                       }\r
-                       tip = new Ext.QuickTip({elements:'header,body'});\r
-                       if(autoRender !== false){\r
-                           tip.render(Ext.getBody());\r
-                       }\r
-                   }\r
-        },\r
-\r
-        \r
-        enable : function(){\r
-            if(tip){\r
-                locks.pop();\r
-                if(locks.length < 1){\r
-                    tip.enable();\r
-                }\r
-            }\r
-        },\r
-\r
-        \r
-        disable : function(){\r
-            if(tip){\r
-                tip.disable();\r
-            }\r
-            locks.push(1);\r
-        },\r
-\r
-        \r
-        isEnabled : function(){\r
-            return tip !== undefined && !tip.disabled;\r
-        },\r
-\r
-        \r
-        getQuickTip : function(){\r
-            return tip;\r
-        },\r
-\r
-        \r
-        register : function(){\r
-            tip.register.apply(tip, arguments);\r
-        },\r
-\r
-        \r
-        unregister : function(){\r
-            tip.unregister.apply(tip, arguments);\r
-        },\r
-\r
-        \r
-        tips :function(){\r
-            tip.register.apply(tip, arguments);\r
-        }\r
-    }\r
-}();\r
-\r
-Ext.tree.TreePanel = Ext.extend(Ext.Panel, {\r
-    rootVisible : true,\r
-    animate: Ext.enableFx,\r
-    lines : true,\r
-    enableDD : false,\r
-    hlDrop : Ext.enableFx,\r
-    pathSeparator: "/",\r
-\r
-    initComponent : function(){\r
-        Ext.tree.TreePanel.superclass.initComponent.call(this);\r
-\r
-        if(!this.eventModel){\r
-            this.eventModel = new Ext.tree.TreeEventModel(this);\r
-        }\r
-        \r
-        // initialize the loader\r
-        var l = this.loader;\r
-        if(!l){\r
-            l = new Ext.tree.TreeLoader({\r
-                dataUrl: this.dataUrl\r
-            });\r
-        }else if(typeof l == 'object' && !l.load){\r
-            l = new Ext.tree.TreeLoader(l);\r
-        }\r
-        this.loader = l;\r
-        \r
-        this.nodeHash = {};\r
-\r
-        \r
-        if(this.root){\r
-           this.setRootNode(this.root);\r
-        }\r
-\r
-        this.addEvents(\r
-\r
-            \r
-           "append",\r
-           \r
-           "remove",\r
-           \r
-           "movenode",\r
-           \r
-           "insert",\r
-           \r
-           "beforeappend",\r
-           \r
-           "beforeremove",\r
-           \r
-           "beforemovenode",\r
-           \r
-            "beforeinsert",\r
-\r
-            \r
-            "beforeload",\r
-            \r
-            "load",\r
-            \r
-            "textchange",\r
-            \r
-            "beforeexpandnode",\r
-            \r
-            "beforecollapsenode",\r
-            \r
-            "expandnode",\r
-            \r
-            "disabledchange",\r
-            \r
-            "collapsenode",\r
-            \r
-            "beforeclick",\r
-            \r
-            "click",\r
-            \r
-            "checkchange",\r
-            \r
-            "dblclick",\r
-            \r
-            "contextmenu",\r
-            \r
-            "beforechildrenrendered",\r
-           \r
-            "startdrag",\r
-            \r
-            "enddrag",\r
-            \r
-            "dragdrop",\r
-            \r
-            "beforenodedrop",\r
-            \r
-            "nodedrop",\r
-             \r
-            "nodedragover"\r
-        );\r
-        if(this.singleExpand){\r
-            this.on("beforeexpandnode", this.restrictExpand, this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    proxyNodeEvent : function(ename, a1, a2, a3, a4, a5, a6){\r
-        if(ename == 'collapse' || ename == 'expand' || ename == 'beforecollapse' || ename == 'beforeexpand' || ename == 'move' || ename == 'beforemove'){\r
-            ename = ename+'node';\r
-        }\r
-        // args inline for performance while bubbling events\r
-        return this.fireEvent(ename, a1, a2, a3, a4, a5, a6);\r
-    },\r
-\r
-\r
-    \r
-    getRootNode : function(){\r
-        return this.root;\r
-    },\r
-\r
-    \r
-    setRootNode : function(node){\r
-        if(!node.render){ // attributes passed\r
-            node = this.loader.createNode(node);\r
-        }\r
-        this.root = node;\r
-        node.ownerTree = this;\r
-        node.isRoot = true;\r
-        this.registerNode(node);\r
-        if(!this.rootVisible){\r
-               var uiP = node.attributes.uiProvider;\r
-               node.ui = uiP ? new uiP(node) : new Ext.tree.RootTreeNodeUI(node); \r
-        }\r
-        return node;\r
-    },\r
-\r
-    \r
-    getNodeById : function(id){\r
-        return this.nodeHash[id];\r
-    },\r
-\r
-    // private\r
-    registerNode : function(node){\r
-        this.nodeHash[node.id] = node;\r
-    },\r
-\r
-    // private\r
-    unregisterNode : function(node){\r
-        delete this.nodeHash[node.id];\r
-    },\r
-\r
-    // private\r
-    toString : function(){\r
-        return "[Tree"+(this.id?" "+this.id:"")+"]";\r
-    },\r
-\r
-    // private\r
-    restrictExpand : function(node){\r
-        var p = node.parentNode;\r
-        if(p){\r
-            if(p.expandedChild && p.expandedChild.parentNode == p){\r
-                p.expandedChild.collapse();\r
-            }\r
-            p.expandedChild = node;\r
-        }\r
-    },\r
-\r
-    \r
-    getChecked : function(a, startNode){\r
-        startNode = startNode || this.root;\r
-        var r = [];\r
-        var f = function(){\r
-            if(this.attributes.checked){\r
-                r.push(!a ? this : (a == 'id' ? this.id : this.attributes[a]));\r
-            }\r
-        }\r
-        startNode.cascade(f);\r
-        return r;\r
-    },\r
-\r
-    \r
-    getEl : function(){\r
-        return this.el;\r
-    },\r
-\r
-    \r
-    getLoader : function(){\r
-        return this.loader;\r
-    },\r
-\r
-    \r
-    expandAll : function(){\r
-        this.root.expand(true);\r
-    },\r
-\r
-    \r
-    collapseAll : function(){\r
-        this.root.collapse(true);\r
-    },\r
-\r
-    \r
-    getSelectionModel : function(){\r
-        if(!this.selModel){\r
-            this.selModel = new Ext.tree.DefaultSelectionModel();\r
-        }\r
-        return this.selModel;\r
-    },\r
-\r
-    \r
-    expandPath : function(path, attr, callback){\r
-        attr = attr || "id";\r
-        var keys = path.split(this.pathSeparator);\r
-        var curNode = this.root;\r
-        if(curNode.attributes[attr] != keys[1]){ // invalid root\r
-            if(callback){\r
-                callback(false, null);\r
-            }\r
-            return;\r
-        }\r
-        var index = 1;\r
-        var f = function(){\r
-            if(++index == keys.length){\r
-                if(callback){\r
-                    callback(true, curNode);\r
-                }\r
-                return;\r
-            }\r
-            var c = curNode.findChild(attr, keys[index]);\r
-            if(!c){\r
-                if(callback){\r
-                    callback(false, curNode);\r
-                }\r
-                return;\r
-            }\r
-            curNode = c;\r
-            c.expand(false, false, f);\r
-        };\r
-        curNode.expand(false, false, f);\r
-    },\r
-\r
-    \r
-    selectPath : function(path, attr, callback){\r
-        attr = attr || "id";\r
-        var keys = path.split(this.pathSeparator);\r
-        var v = keys.pop();\r
-        if(keys.length > 0){\r
-            var f = function(success, node){\r
-                if(success && node){\r
-                    var n = node.findChild(attr, v);\r
-                    if(n){\r
-                        n.select();\r
-                        if(callback){\r
-                            callback(true, n);\r
-                        }\r
-                    }else if(callback){\r
-                        callback(false, n);\r
-                    }\r
-                }else{\r
-                    if(callback){\r
-                        callback(false, n);\r
-                    }\r
-                }\r
-            };\r
-            this.expandPath(keys.join(this.pathSeparator), attr, f);\r
-        }else{\r
-            this.root.select();\r
-            if(callback){\r
-                callback(true, this.root);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    getTreeEl : function(){\r
-        return this.body;\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        Ext.tree.TreePanel.superclass.onRender.call(this, ct, position);\r
-        this.el.addClass('x-tree');\r
-        this.innerCt = this.body.createChild({tag:"ul",\r
-               cls:"x-tree-root-ct " +\r
-               (this.useArrows ? 'x-tree-arrows' : this.lines ? "x-tree-lines" : "x-tree-no-lines")});\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        Ext.tree.TreePanel.superclass.initEvents.call(this);\r
-\r
-        if(this.containerScroll){\r
-            Ext.dd.ScrollManager.register(this.body);\r
-        }\r
-        if((this.enableDD || this.enableDrop) && !this.dropZone){\r
-           \r
-             this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig || {\r
-               ddGroup: this.ddGroup || "TreeDD", appendOnly: this.ddAppendOnly === true\r
-           });\r
-        }\r
-        if((this.enableDD || this.enableDrag) && !this.dragZone){\r
-           \r
-            this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig || {\r
-               ddGroup: this.ddGroup || "TreeDD",\r
-               scroll: this.ddScroll\r
-           });\r
-        }\r
-        this.getSelectionModel().init(this);\r
-    },\r
-\r
-    // private\r
-    afterRender : function(){\r
-        Ext.tree.TreePanel.superclass.afterRender.call(this);\r
-        this.root.render();\r
-        if(!this.rootVisible){\r
-            this.root.renderChildren();\r
-        }\r
-    },\r
-\r
-    onDestroy : function(){\r
-        if(this.rendered){\r
-            this.body.removeAllListeners();\r
-            Ext.dd.ScrollManager.unregister(this.body);\r
-            if(this.dropZone){\r
-                this.dropZone.unreg();\r
-            }\r
-            if(this.dragZone){\r
-               this.dragZone.unreg();\r
-            }\r
-        }\r
-        this.root.destroy();\r
-        this.nodeHash = null;\r
-        Ext.tree.TreePanel.superclass.onDestroy.call(this);\r
-    }\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-\r
-\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-});\r
-\r
-Ext.tree.TreePanel.nodeTypes = {};\r
-\r
-Ext.reg('treepanel', Ext.tree.TreePanel);\r
-Ext.tree.TreeEventModel = function(tree){\r
-    this.tree = tree;\r
-    this.tree.on('render', this.initEvents, this);\r
-}\r
-\r
-Ext.tree.TreeEventModel.prototype = {\r
-    initEvents : function(){\r
-        var el = this.tree.getTreeEl();\r
-        el.on('click', this.delegateClick, this);\r
-        if(this.tree.trackMouseOver !== false){\r
-            el.on('mouseover', this.delegateOver, this);\r
-            el.on('mouseout', this.delegateOut, this);\r
-        }\r
-        el.on('dblclick', this.delegateDblClick, this);\r
-        el.on('contextmenu', this.delegateContextMenu, this);\r
-    },\r
-\r
-    getNode : function(e){\r
-        var t;\r
-        if(t = e.getTarget('.x-tree-node-el', 10)){\r
-            var id = Ext.fly(t, '_treeEvents').getAttributeNS('ext', 'tree-node-id');\r
-            if(id){\r
-                return this.tree.getNodeById(id);\r
-            }\r
-        }\r
-        return null;\r
-    },\r
-\r
-    getNodeTarget : function(e){\r
-        var t = e.getTarget('.x-tree-node-icon', 1);\r
-        if(!t){\r
-            t = e.getTarget('.x-tree-node-el', 6);\r
-        }\r
-        return t;\r
-    },\r
-\r
-    delegateOut : function(e, t){\r
-        if(!this.beforeEvent(e)){\r
-            return;\r
-        }\r
-        if(e.getTarget('.x-tree-ec-icon', 1)){\r
-            var n = this.getNode(e);\r
-            this.onIconOut(e, n);\r
-            if(n == this.lastEcOver){\r
-                delete this.lastEcOver;\r
-            }\r
-        }\r
-        if((t = this.getNodeTarget(e)) && !e.within(t, true)){\r
-            this.onNodeOut(e, this.getNode(e));\r
-        }\r
-    },\r
-\r
-    delegateOver : function(e, t){\r
-        if(!this.beforeEvent(e)){\r
-            return;\r
-        }\r
-        if(this.lastEcOver){ // prevent hung highlight\r
-            this.onIconOut(e, this.lastEcOver);\r
-            delete this.lastEcOver;\r
-        }\r
-        if(e.getTarget('.x-tree-ec-icon', 1)){\r
-            this.lastEcOver = this.getNode(e);\r
-            this.onIconOver(e, this.lastEcOver);\r
-        }\r
-        if(t = this.getNodeTarget(e)){\r
-            this.onNodeOver(e, this.getNode(e));\r
-        }\r
-    },\r
-\r
-    delegateClick : function(e, t){\r
-        if(!this.beforeEvent(e)){\r
-            return;\r
-        }\r
-\r
-        if(e.getTarget('input[type=checkbox]', 1)){\r
-            this.onCheckboxClick(e, this.getNode(e));\r
-        }\r
-        else if(e.getTarget('.x-tree-ec-icon', 1)){\r
-            this.onIconClick(e, this.getNode(e));\r
-        }\r
-        else if(this.getNodeTarget(e)){\r
-            this.onNodeClick(e, this.getNode(e));\r
-        }\r
-    },\r
-\r
-    delegateDblClick : function(e, t){\r
-        if(this.beforeEvent(e) && this.getNodeTarget(e)){\r
-            this.onNodeDblClick(e, this.getNode(e));\r
-        }\r
-    },\r
-\r
-    delegateContextMenu : function(e, t){\r
-        if(this.beforeEvent(e) && this.getNodeTarget(e)){\r
-            this.onNodeContextMenu(e, this.getNode(e));\r
-        }\r
-    },\r
-\r
-    onNodeClick : function(e, node){\r
-        node.ui.onClick(e);\r
-    },\r
-\r
-    onNodeOver : function(e, node){\r
-        node.ui.onOver(e);\r
-    },\r
-\r
-    onNodeOut : function(e, node){\r
-        node.ui.onOut(e);\r
-    },\r
-\r
-    onIconOver : function(e, node){\r
-        node.ui.addClass('x-tree-ec-over');\r
-    },\r
-\r
-    onIconOut : function(e, node){\r
-        node.ui.removeClass('x-tree-ec-over');\r
-    },\r
-\r
-    onIconClick : function(e, node){\r
-        node.ui.ecClick(e);\r
-    },\r
-\r
-    onCheckboxClick : function(e, node){\r
-        node.ui.onCheckChange(e);\r
-    },\r
-\r
-    onNodeDblClick : function(e, node){\r
-        node.ui.onDblClick(e);\r
-    },\r
-\r
-    onNodeContextMenu : function(e, node){\r
-        node.ui.onContextMenu(e);\r
-    },\r
-\r
-    beforeEvent : function(e){\r
-        if(this.disabled){\r
-            e.stopEvent();\r
-            return false;\r
-        }\r
-        return true;\r
-    },\r
-\r
-    disable: function(){\r
-        this.disabled = true;\r
-    },\r
-\r
-    enable: function(){\r
-        this.disabled = false;\r
-    }\r
-};\r
-\r
-Ext.tree.DefaultSelectionModel = function(config){\r
-   this.selNode = null;\r
-   \r
-   this.addEvents(\r
-       \r
-       "selectionchange",\r
-\r
-       \r
-       "beforeselect"\r
-   );\r
-\r
-    Ext.apply(this, config);\r
-    Ext.tree.DefaultSelectionModel.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.tree.DefaultSelectionModel, Ext.util.Observable, {\r
-    init : function(tree){\r
-        this.tree = tree;\r
-        tree.getTreeEl().on("keydown", this.onKeyDown, this);\r
-        tree.on("click", this.onNodeClick, this);\r
-    },\r
-    \r
-    onNodeClick : function(node, e){\r
-        this.select(node);\r
-    },\r
-    \r
-    \r
-    select : function(node){\r
-        var last = this.selNode;\r
-        if(last != node && this.fireEvent('beforeselect', this, node, last) !== false){\r
-            if(last){\r
-                last.ui.onSelectedChange(false);\r
-            }\r
-            this.selNode = node;\r
-            node.ui.onSelectedChange(true);\r
-            this.fireEvent("selectionchange", this, node, last);\r
-        }\r
-        return node;\r
-    },\r
-    \r
-    \r
-    unselect : function(node){\r
-        if(this.selNode == node){\r
-            this.clearSelections();\r
-        }    \r
-    },\r
-    \r
-    \r
-    clearSelections : function(){\r
-        var n = this.selNode;\r
-        if(n){\r
-            n.ui.onSelectedChange(false);\r
-            this.selNode = null;\r
-            this.fireEvent("selectionchange", this, null);\r
-        }\r
-        return n;\r
-    },\r
-    \r
-    \r
-    getSelectedNode : function(){\r
-        return this.selNode;    \r
-    },\r
-    \r
-    \r
-    isSelected : function(node){\r
-        return this.selNode == node;  \r
-    },\r
-\r
-    \r
-    selectPrevious : function(){\r
-        var s = this.selNode || this.lastSelNode;\r
-        if(!s){\r
-            return null;\r
-        }\r
-        var ps = s.previousSibling;\r
-        if(ps){\r
-            if(!ps.isExpanded() || ps.childNodes.length < 1){\r
-                return this.select(ps);\r
-            } else{\r
-                var lc = ps.lastChild;\r
-                while(lc && lc.isExpanded() && lc.childNodes.length > 0){\r
-                    lc = lc.lastChild;\r
-                }\r
-                return this.select(lc);\r
-            }\r
-        } else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){\r
-            return this.select(s.parentNode);\r
-        }\r
-        return null;\r
-    },\r
-\r
-    \r
-    selectNext : function(){\r
-        var s = this.selNode || this.lastSelNode;\r
-        if(!s){\r
-            return null;\r
-        }\r
-        if(s.firstChild && s.isExpanded()){\r
-             return this.select(s.firstChild);\r
-         }else if(s.nextSibling){\r
-             return this.select(s.nextSibling);\r
-         }else if(s.parentNode){\r
-            var newS = null;\r
-            s.parentNode.bubble(function(){\r
-                if(this.nextSibling){\r
-                    newS = this.getOwnerTree().selModel.select(this.nextSibling);\r
-                    return false;\r
-                }\r
-            });\r
-            return newS;\r
-         }\r
-        return null;\r
-    },\r
-\r
-    onKeyDown : function(e){\r
-        var s = this.selNode || this.lastSelNode;\r
-        // undesirable, but required\r
-        var sm = this;\r
-        if(!s){\r
-            return;\r
-        }\r
-        var k = e.getKey();\r
-        switch(k){\r
-             case e.DOWN:\r
-                 e.stopEvent();\r
-                 this.selectNext();\r
-             break;\r
-             case e.UP:\r
-                 e.stopEvent();\r
-                 this.selectPrevious();\r
-             break;\r
-             case e.RIGHT:\r
-                 e.preventDefault();\r
-                 if(s.hasChildNodes()){\r
-                     if(!s.isExpanded()){\r
-                         s.expand();\r
-                     }else if(s.firstChild){\r
-                         this.select(s.firstChild, e);\r
-                     }\r
-                 }\r
-             break;\r
-             case e.LEFT:\r
-                 e.preventDefault();\r
-                 if(s.hasChildNodes() && s.isExpanded()){\r
-                     s.collapse();\r
-                 }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){\r
-                     this.select(s.parentNode, e);\r
-                 }\r
-             break;\r
-        };\r
-    }\r
-});\r
-\r
-\r
-Ext.tree.MultiSelectionModel = function(config){\r
-   this.selNodes = [];\r
-   this.selMap = {};\r
-   this.addEvents(\r
-       \r
-       "selectionchange"\r
-   );\r
-    Ext.apply(this, config);\r
-    Ext.tree.MultiSelectionModel.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.tree.MultiSelectionModel, Ext.util.Observable, {\r
-    init : function(tree){\r
-        this.tree = tree;\r
-        tree.getTreeEl().on("keydown", this.onKeyDown, this);\r
-        tree.on("click", this.onNodeClick, this);\r
-    },\r
-    \r
-    onNodeClick : function(node, e){\r
-        this.select(node, e, e.ctrlKey);\r
-    },\r
-    \r
-    \r
-    select : function(node, e, keepExisting){\r
-        if(keepExisting !== true){\r
-            this.clearSelections(true);\r
-        }\r
-        if(this.isSelected(node)){\r
-            this.lastSelNode = node;\r
-            return node;\r
-        }\r
-        this.selNodes.push(node);\r
-        this.selMap[node.id] = node;\r
-        this.lastSelNode = node;\r
-        node.ui.onSelectedChange(true);\r
-        this.fireEvent("selectionchange", this, this.selNodes);\r
-        return node;\r
-    },\r
-    \r
-    \r
-    unselect : function(node){\r
-        if(this.selMap[node.id]){\r
-            node.ui.onSelectedChange(false);\r
-            var sn = this.selNodes;\r
-            var index = sn.indexOf(node);\r
-            if(index != -1){\r
-                this.selNodes.splice(index, 1);\r
-            }\r
-            delete this.selMap[node.id];\r
-            this.fireEvent("selectionchange", this, this.selNodes);\r
-        }\r
-    },\r
-    \r
-    \r
-    clearSelections : function(suppressEvent){\r
-        var sn = this.selNodes;\r
-        if(sn.length > 0){\r
-            for(var i = 0, len = sn.length; i < len; i++){\r
-                sn[i].ui.onSelectedChange(false);\r
-            }\r
-            this.selNodes = [];\r
-            this.selMap = {};\r
-            if(suppressEvent !== true){\r
-                this.fireEvent("selectionchange", this, this.selNodes);\r
-            }\r
-        }\r
-    },\r
-    \r
-    \r
-    isSelected : function(node){\r
-        return this.selMap[node.id] ? true : false;  \r
-    },\r
-    \r
-    \r
-    getSelectedNodes : function(){\r
-        return this.selNodes;    \r
-    },\r
-\r
-    onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown,\r
-\r
-    selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext,\r
-\r
-    selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious\r
-});\r
-\r
-Ext.tree.TreeNode = function(attributes){\r
-    attributes = attributes || {};\r
-    if(typeof attributes == "string"){\r
-        attributes = {text: attributes};\r
-    }\r
-    this.childrenRendered = false;\r
-    this.rendered = false;\r
-    Ext.tree.TreeNode.superclass.constructor.call(this, attributes);\r
-    this.expanded = attributes.expanded === true;\r
-    this.isTarget = attributes.isTarget !== false;\r
-    this.draggable = attributes.draggable !== false && attributes.allowDrag !== false;\r
-    this.allowChildren = attributes.allowChildren !== false && attributes.allowDrop !== false;\r
-\r
-    \r
-    this.text = attributes.text;\r
-    \r
-    this.disabled = attributes.disabled === true;\r
-\r
-    this.addEvents(\r
-        \r
-        "textchange",\r
-        \r
-        "beforeexpand",\r
-        \r
-        "beforecollapse",\r
-        \r
-        "expand",\r
-        \r
-        "disabledchange",\r
-        \r
-        "collapse",\r
-        \r
-        "beforeclick",\r
-        \r
-        "click",\r
-        \r
-        "checkchange",\r
-        \r
-        "dblclick",\r
-        \r
-        "contextmenu",\r
-        \r
-        "beforechildrenrendered"\r
-    );\r
-\r
-    var uiClass = this.attributes.uiProvider || this.defaultUI || Ext.tree.TreeNodeUI;\r
-\r
-    \r
-    this.ui = new uiClass(this);\r
-};\r
-Ext.extend(Ext.tree.TreeNode, Ext.data.Node, {\r
-    preventHScroll: true,\r
-    \r
-    isExpanded : function(){\r
-        return this.expanded;\r
-    },\r
-\r
-\r
-    getUI : function(){\r
-        return this.ui;\r
-    },\r
-\r
-    getLoader : function(){\r
-        var owner;\r
-        return this.loader || ((owner = this.getOwnerTree()) && owner.loader ? owner.loader : new Ext.tree.TreeLoader());\r
-    },\r
-\r
-    // private override\r
-    setFirstChild : function(node){\r
-        var of = this.firstChild;\r
-        Ext.tree.TreeNode.superclass.setFirstChild.call(this, node);\r
-        if(this.childrenRendered && of && node != of){\r
-            of.renderIndent(true, true);\r
-        }\r
-        if(this.rendered){\r
-            this.renderIndent(true, true);\r
-        }\r
-    },\r
-\r
-    // private override\r
-    setLastChild : function(node){\r
-        var ol = this.lastChild;\r
-        Ext.tree.TreeNode.superclass.setLastChild.call(this, node);\r
-        if(this.childrenRendered && ol && node != ol){\r
-            ol.renderIndent(true, true);\r
-        }\r
-        if(this.rendered){\r
-            this.renderIndent(true, true);\r
-        }\r
-    },\r
-\r
-    // these methods are overridden to provide lazy rendering support\r
-    // private override\r
-    appendChild : function(n){\r
-        if(!n.render && !Ext.isArray(n)){\r
-            n = this.getLoader().createNode(n);\r
-        }\r
-        var node = Ext.tree.TreeNode.superclass.appendChild.call(this, n);\r
-        if(node && this.childrenRendered){\r
-            node.render();\r
-        }\r
-        this.ui.updateExpandIcon();\r
-        return node;\r
-    },\r
-\r
-    // private override\r
-    removeChild : function(node){\r
-        this.ownerTree.getSelectionModel().unselect(node);\r
-        Ext.tree.TreeNode.superclass.removeChild.apply(this, arguments);\r
-        // if it's been rendered remove dom node\r
-        if(this.childrenRendered){\r
-            node.ui.remove();\r
-        }\r
-        if(this.childNodes.length < 1){\r
-            this.collapse(false, false);\r
-        }else{\r
-            this.ui.updateExpandIcon();\r
-        }\r
-        if(!this.firstChild && !this.isHiddenRoot()) {\r
-            this.childrenRendered = false;\r
-        }\r
-        return node;\r
-    },\r
-\r
-    // private override\r
-    insertBefore : function(node, refNode){\r
-        if(!node.render){ \r
-            node = this.getLoader().createNode(node);\r
-        }\r
-        var newNode = Ext.tree.TreeNode.superclass.insertBefore.apply(this, arguments);\r
-        if(newNode && refNode && this.childrenRendered){\r
-            node.render();\r
-        }\r
-        this.ui.updateExpandIcon();\r
-        return newNode;\r
-    },\r
-\r
-    \r
-    setText : function(text){\r
-        var oldText = this.text;\r
-        this.text = text;\r
-        this.attributes.text = text;\r
-        if(this.rendered){ // event without subscribing\r
-            this.ui.onTextChange(this, text, oldText);\r
-        }\r
-        this.fireEvent("textchange", this, text, oldText);\r
-    },\r
-\r
-    \r
-    select : function(){\r
-        this.getOwnerTree().getSelectionModel().select(this);\r
-    },\r
-\r
-    \r
-    unselect : function(){\r
-        this.getOwnerTree().getSelectionModel().unselect(this);\r
-    },\r
-\r
-    \r
-    isSelected : function(){\r
-        return this.getOwnerTree().getSelectionModel().isSelected(this);\r
-    },\r
-\r
-    \r
-    expand : function(deep, anim, callback){\r
-        if(!this.expanded){\r
-            if(this.fireEvent("beforeexpand", this, deep, anim) === false){\r
-                return;\r
-            }\r
-            if(!this.childrenRendered){\r
-                this.renderChildren();\r
-            }\r
-            this.expanded = true;\r
-            if(!this.isHiddenRoot() && (this.getOwnerTree().animate && anim !== false) || anim){\r
-                this.ui.animExpand(function(){\r
-                    this.fireEvent("expand", this);\r
-                    if(typeof callback == "function"){\r
-                        callback(this);\r
-                    }\r
-                    if(deep === true){\r
-                        this.expandChildNodes(true);\r
-                    }\r
-                }.createDelegate(this));\r
-                return;\r
-            }else{\r
-                this.ui.expand();\r
-                this.fireEvent("expand", this);\r
-                if(typeof callback == "function"){\r
-                    callback(this);\r
-                }\r
-            }\r
-        }else{\r
-           if(typeof callback == "function"){\r
-               callback(this);\r
-           }\r
-        }\r
-        if(deep === true){\r
-            this.expandChildNodes(true);\r
-        }\r
-    },\r
-\r
-    isHiddenRoot : function(){\r
-        return this.isRoot && !this.getOwnerTree().rootVisible;\r
-    },\r
-\r
-    \r
-    collapse : function(deep, anim){\r
-        if(this.expanded && !this.isHiddenRoot()){\r
-            if(this.fireEvent("beforecollapse", this, deep, anim) === false){\r
-                return;\r
-            }\r
-            this.expanded = false;\r
-            if((this.getOwnerTree().animate && anim !== false) || anim){\r
-                this.ui.animCollapse(function(){\r
-                    this.fireEvent("collapse", this);\r
-                    if(deep === true){\r
-                        this.collapseChildNodes(true);\r
-                    }\r
-                }.createDelegate(this));\r
-                return;\r
-            }else{\r
-                this.ui.collapse();\r
-                this.fireEvent("collapse", this);\r
-            }\r
-        }\r
-        if(deep === true){\r
-            var cs = this.childNodes;\r
-            for(var i = 0, len = cs.length; i < len; i++) {\r
-               cs[i].collapse(true, false);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    delayedExpand : function(delay){\r
-        if(!this.expandProcId){\r
-            this.expandProcId = this.expand.defer(delay, this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    cancelExpand : function(){\r
-        if(this.expandProcId){\r
-            clearTimeout(this.expandProcId);\r
-        }\r
-        this.expandProcId = false;\r
-    },\r
-\r
-    \r
-    toggle : function(){\r
-        if(this.expanded){\r
-            this.collapse();\r
-        }else{\r
-            this.expand();\r
-        }\r
-    },\r
-\r
-    \r
-    ensureVisible : function(callback){\r
-        var tree = this.getOwnerTree();\r
-        tree.expandPath(this.parentNode ? this.parentNode.getPath() : this.getPath(), false, function(){\r
-            var node = tree.getNodeById(this.id);  // Somehow if we don't do this, we lose changes that happened to node in the meantime\r
-            tree.getTreeEl().scrollChildIntoView(node.ui.anchor);\r
-            Ext.callback(callback);\r
-        }.createDelegate(this));\r
-    },\r
-\r
-    \r
-    expandChildNodes : function(deep){\r
-        var cs = this.childNodes;\r
-        for(var i = 0, len = cs.length; i < len; i++) {\r
-               cs[i].expand(deep);\r
-        }\r
-    },\r
-\r
-    \r
-    collapseChildNodes : function(deep){\r
-        var cs = this.childNodes;\r
-        for(var i = 0, len = cs.length; i < len; i++) {\r
-               cs[i].collapse(deep);\r
-        }\r
-    },\r
-\r
-    \r
-    disable : function(){\r
-        this.disabled = true;\r
-        this.unselect();\r
-        if(this.rendered && this.ui.onDisableChange){ // event without subscribing\r
-            this.ui.onDisableChange(this, true);\r
-        }\r
-        this.fireEvent("disabledchange", this, true);\r
-    },\r
-\r
-    \r
-    enable : function(){\r
-        this.disabled = false;\r
-        if(this.rendered && this.ui.onDisableChange){ // event without subscribing\r
-            this.ui.onDisableChange(this, false);\r
-        }\r
-        this.fireEvent("disabledchange", this, false);\r
-    },\r
-\r
-    // private\r
-    renderChildren : function(suppressEvent){\r
-        if(suppressEvent !== false){\r
-            this.fireEvent("beforechildrenrendered", this);\r
-        }\r
-        var cs = this.childNodes;\r
-        for(var i = 0, len = cs.length; i < len; i++){\r
-            cs[i].render(true);\r
-        }\r
-        this.childrenRendered = true;\r
-    },\r
-\r
-    // private\r
-    sort : function(fn, scope){\r
-        Ext.tree.TreeNode.superclass.sort.apply(this, arguments);\r
-        if(this.childrenRendered){\r
-            var cs = this.childNodes;\r
-            for(var i = 0, len = cs.length; i < len; i++){\r
-                cs[i].render(true);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    render : function(bulkRender){\r
-        this.ui.render(bulkRender);\r
-        if(!this.rendered){\r
-            // make sure it is registered\r
-            this.getOwnerTree().registerNode(this);\r
-            this.rendered = true;\r
-            if(this.expanded){\r
-                this.expanded = false;\r
-                this.expand(false, false);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    renderIndent : function(deep, refresh){\r
-        if(refresh){\r
-            this.ui.childIndent = null;\r
-        }\r
-        this.ui.renderIndent();\r
-        if(deep === true && this.childrenRendered){\r
-            var cs = this.childNodes;\r
-            for(var i = 0, len = cs.length; i < len; i++){\r
-                cs[i].renderIndent(true, refresh);\r
-            }\r
-        }\r
-    },\r
-\r
-    beginUpdate : function(){\r
-        this.childrenRendered = false;\r
-    },\r
-\r
-    endUpdate : function(){\r
-        if(this.expanded && this.rendered){\r
-            this.renderChildren();\r
-        }\r
-    },\r
-\r
-    destroy : function(){\r
-        if(this.childNodes){\r
-               for(var i = 0,l = this.childNodes.length; i < l; i++){\r
-                   this.childNodes[i].destroy();\r
-               }\r
-            this.childNodes = null;\r
-        }\r
-        if(this.ui.destroy){\r
-            this.ui.destroy();\r
-        }\r
-    }\r
-});\r
-\r
-Ext.tree.TreePanel.nodeTypes.node = Ext.tree.TreeNode;\r
-\r
- Ext.tree.AsyncTreeNode = function(config){\r
-    this.loaded = config && config.loaded === true;\r
-    this.loading = false;\r
-    Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments);\r
-    \r
-    this.addEvents('beforeload', 'load');\r
-    \r
-    \r
-};\r
-Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, {\r
-    expand : function(deep, anim, callback){\r
-        if(this.loading){ // if an async load is already running, waiting til it's done\r
-            var timer;\r
-            var f = function(){\r
-                if(!this.loading){ // done loading\r
-                    clearInterval(timer);\r
-                    this.expand(deep, anim, callback);\r
-                }\r
-            }.createDelegate(this);\r
-            timer = setInterval(f, 200);\r
-            return;\r
-        }\r
-        if(!this.loaded){\r
-            if(this.fireEvent("beforeload", this) === false){\r
-                return;\r
-            }\r
-            this.loading = true;\r
-            this.ui.beforeLoad(this);\r
-            var loader = this.loader || this.attributes.loader || this.getOwnerTree().getLoader();\r
-            if(loader){\r
-                loader.load(this, this.loadComplete.createDelegate(this, [deep, anim, callback]));\r
-                return;\r
-            }\r
-        }\r
-        Ext.tree.AsyncTreeNode.superclass.expand.call(this, deep, anim, callback);\r
-    },\r
-    \r
-    \r
-    isLoading : function(){\r
-        return this.loading;  \r
-    },\r
-    \r
-    loadComplete : function(deep, anim, callback){\r
-        this.loading = false;\r
-        this.loaded = true;\r
-        this.ui.afterLoad(this);\r
-        this.fireEvent("load", this);\r
-        this.expand(deep, anim, callback);\r
-    },\r
-    \r
-    \r
-    isLoaded : function(){\r
-        return this.loaded;\r
-    },\r
-    \r
-    hasChildNodes : function(){\r
-        if(!this.isLeaf() && !this.loaded){\r
-            return true;\r
-        }else{\r
-            return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this);\r
-        }\r
-    },\r
-\r
-    \r
-    reload : function(callback){\r
-        this.collapse(false, false);\r
-        while(this.firstChild){\r
-            this.removeChild(this.firstChild).destroy();\r
-        }\r
-        this.childrenRendered = false;\r
-        this.loaded = false;\r
-        if(this.isHiddenRoot()){\r
-            this.expanded = false;\r
-        }\r
-        this.expand(false, false, callback);\r
-    }\r
-});\r
-\r
-Ext.tree.TreePanel.nodeTypes.async = Ext.tree.AsyncTreeNode;\r
-\r
-Ext.tree.TreeNodeUI = function(node){\r
-    this.node = node;\r
-    this.rendered = false;\r
-    this.animating = false;\r
-    this.wasLeaf = true;\r
-    this.ecc = 'x-tree-ec-icon x-tree-elbow';\r
-    this.emptyIcon = Ext.BLANK_IMAGE_URL;\r
-};\r
-\r
-Ext.tree.TreeNodeUI.prototype = {\r
-    // private\r
-    removeChild : function(node){\r
-        if(this.rendered){\r
-            this.ctNode.removeChild(node.ui.getEl());\r
-        } \r
-    },\r
-\r
-    // private\r
-    beforeLoad : function(){\r
-         this.addClass("x-tree-node-loading");\r
-    },\r
-\r
-    // private\r
-    afterLoad : function(){\r
-         this.removeClass("x-tree-node-loading");\r
-    },\r
-\r
-    // private\r
-    onTextChange : function(node, text, oldText){\r
-        if(this.rendered){\r
-            this.textNode.innerHTML = text;\r
-        }\r
-    },\r
-\r
-    // private\r
-    onDisableChange : function(node, state){\r
-        this.disabled = state;\r
-               if (this.checkbox) {\r
-                       this.checkbox.disabled = state;\r
-               }        \r
-        if(state){\r
-            this.addClass("x-tree-node-disabled");\r
-        }else{\r
-            this.removeClass("x-tree-node-disabled");\r
-        } \r
-    },\r
-\r
-    // private\r
-    onSelectedChange : function(state){\r
-        if(state){\r
-            this.focus();\r
-            this.addClass("x-tree-selected");\r
-        }else{\r
-            //this.blur();\r
-            this.removeClass("x-tree-selected");\r
-        }\r
-    },\r
-\r
-    // private\r
-    onMove : function(tree, node, oldParent, newParent, index, refNode){\r
-        this.childIndent = null;\r
-        if(this.rendered){\r
-            var targetNode = newParent.ui.getContainer();\r
-            if(!targetNode){//target not rendered\r
-                this.holder = document.createElement("div");\r
-                this.holder.appendChild(this.wrap);\r
-                return;\r
-            }\r
-            var insertBefore = refNode ? refNode.ui.getEl() : null;\r
-            if(insertBefore){\r
-                targetNode.insertBefore(this.wrap, insertBefore);\r
-            }else{\r
-                targetNode.appendChild(this.wrap);\r
-            }\r
-            this.node.renderIndent(true);\r
-        }\r
-    },\r
-\r
-\r
-    addClass : function(cls){\r
-        if(this.elNode){\r
-            Ext.fly(this.elNode).addClass(cls);\r
-        }\r
-    },\r
-\r
-\r
-    removeClass : function(cls){\r
-        if(this.elNode){\r
-            Ext.fly(this.elNode).removeClass(cls);  \r
-        }\r
-    },\r
-\r
-    // private\r
-    remove : function(){\r
-        if(this.rendered){\r
-            this.holder = document.createElement("div");\r
-            this.holder.appendChild(this.wrap);\r
-        }  \r
-    },\r
-\r
-    // private\r
-    fireEvent : function(){\r
-        return this.node.fireEvent.apply(this.node, arguments);  \r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        this.node.on("move", this.onMove, this);\r
-\r
-        if(this.node.disabled){\r
-            this.addClass("x-tree-node-disabled");\r
-                       if (this.checkbox) {\r
-                               this.checkbox.disabled = true;\r
-                       }            \r
-        }\r
-        if(this.node.hidden){\r
-            this.hide();\r
-        }\r
-        var ot = this.node.getOwnerTree();\r
-        var dd = ot.enableDD || ot.enableDrag || ot.enableDrop;\r
-        if(dd && (!this.node.isRoot || ot.rootVisible)){\r
-            Ext.dd.Registry.register(this.elNode, {\r
-                node: this.node,\r
-                handles: this.getDDHandles(),\r
-                isHandle: false\r
-            });\r
-        }\r
-    },\r
-\r
-    // private\r
-    getDDHandles : function(){\r
-        return [this.iconNode, this.textNode, this.elNode];\r
-    },\r
-\r
-\r
-    hide : function(){\r
-        this.node.hidden = true;\r
-        if(this.wrap){\r
-            this.wrap.style.display = "none";\r
-        }\r
-    },\r
-\r
-\r
-    show : function(){\r
-        this.node.hidden = false;\r
-        if(this.wrap){\r
-            this.wrap.style.display = "";\r
-        } \r
-    },\r
-\r
-    // private\r
-    onContextMenu : function(e){\r
-        if (this.node.hasListener("contextmenu") || this.node.getOwnerTree().hasListener("contextmenu")) {\r
-            e.preventDefault();\r
-            this.focus();\r
-            this.fireEvent("contextmenu", this.node, e);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onClick : function(e){\r
-        if(this.dropping){\r
-            e.stopEvent();\r
-            return;\r
-        }\r
-        if(this.fireEvent("beforeclick", this.node, e) !== false){\r
-            var a = e.getTarget('a');\r
-            if(!this.disabled && this.node.attributes.href && a){\r
-                this.fireEvent("click", this.node, e);\r
-                return;\r
-            }else if(a && e.ctrlKey){\r
-                e.stopEvent();\r
-            }\r
-            e.preventDefault();\r
-            if(this.disabled){\r
-                return;\r
-            }\r
-\r
-            if(this.node.attributes.singleClickExpand && !this.animating && this.node.isExpandable()){\r
-                this.node.toggle();\r
-            }\r
-\r
-            this.fireEvent("click", this.node, e);\r
-        }else{\r
-            e.stopEvent();\r
-        }\r
-    },\r
-\r
-    // private\r
-    onDblClick : function(e){\r
-        e.preventDefault();\r
-        if(this.disabled){\r
-            return;\r
-        }\r
-        if(this.checkbox){\r
-            this.toggleCheck();\r
-        }\r
-        if(!this.animating && this.node.isExpandable()){\r
-            this.node.toggle();\r
-        }\r
-        this.fireEvent("dblclick", this.node, e);\r
-    },\r
-\r
-    onOver : function(e){\r
-        this.addClass('x-tree-node-over');\r
-    },\r
-\r
-    onOut : function(e){\r
-        this.removeClass('x-tree-node-over');\r
-    },\r
-\r
-    // private\r
-    onCheckChange : function(){\r
-        var checked = this.checkbox.checked;\r
-               // fix for IE6\r
-               this.checkbox.defaultChecked = checked;\r
-        this.node.attributes.checked = checked;\r
-        this.fireEvent('checkchange', this.node, checked);\r
-    },\r
-\r
-    // private\r
-    ecClick : function(e){\r
-        if(!this.animating && this.node.isExpandable()){\r
-            this.node.toggle();\r
-        }\r
-    },\r
-\r
-    // private\r
-    startDrop : function(){\r
-        this.dropping = true;\r
-    },\r
-    \r
-    // delayed drop so the click event doesn't get fired on a drop\r
-    endDrop : function(){ \r
-       setTimeout(function(){\r
-           this.dropping = false;\r
-       }.createDelegate(this), 50); \r
-    },\r
-\r
-    // private\r
-    expand : function(){\r
-        this.updateExpandIcon();\r
-        this.ctNode.style.display = "";\r
-    },\r
-\r
-    // private\r
-    focus : function(){\r
-        if(!this.node.preventHScroll){\r
-            try{this.anchor.focus();\r
-            }catch(e){}\r
-        }else{\r
-            try{\r
-                var noscroll = this.node.getOwnerTree().getTreeEl().dom;\r
-                var l = noscroll.scrollLeft;\r
-                this.anchor.focus();\r
-                noscroll.scrollLeft = l;\r
-            }catch(e){}\r
-        }\r
-    },\r
-\r
-\r
-    toggleCheck : function(value){\r
-        var cb = this.checkbox;\r
-        if(cb){\r
-            cb.checked = (value === undefined ? !cb.checked : value);\r
-            this.onCheckChange();\r
-        }\r
-    },\r
-\r
-    // private\r
-    blur : function(){\r
-        try{\r
-            this.anchor.blur();\r
-        }catch(e){} \r
-    },\r
-\r
-    // private\r
-    animExpand : function(callback){\r
-        var ct = Ext.get(this.ctNode);\r
-        ct.stopFx();\r
-        if(!this.node.isExpandable()){\r
-            this.updateExpandIcon();\r
-            this.ctNode.style.display = "";\r
-            Ext.callback(callback);\r
-            return;\r
-        }\r
-        this.animating = true;\r
-        this.updateExpandIcon();\r
-        \r
-        ct.slideIn('t', {\r
-           callback : function(){\r
-               this.animating = false;\r
-               Ext.callback(callback);\r
-            },\r
-            scope: this,\r
-            duration: this.node.ownerTree.duration || .25\r
-        });\r
-    },\r
-\r
-    // private\r
-    highlight : function(){\r
-        var tree = this.node.getOwnerTree();\r
-        Ext.fly(this.wrap).highlight(\r
-            tree.hlColor || "C3DAF9",\r
-            {endColor: tree.hlBaseColor}\r
-        );\r
-    },\r
-\r
-    // private\r
-    collapse : function(){\r
-        this.updateExpandIcon();\r
-        this.ctNode.style.display = "none";\r
-    },\r
-\r
-    // private\r
-    animCollapse : function(callback){\r
-        var ct = Ext.get(this.ctNode);\r
-        ct.enableDisplayMode('block');\r
-        ct.stopFx();\r
-\r
-        this.animating = true;\r
-        this.updateExpandIcon();\r
-\r
-        ct.slideOut('t', {\r
-            callback : function(){\r
-               this.animating = false;\r
-               Ext.callback(callback);\r
-            },\r
-            scope: this,\r
-            duration: this.node.ownerTree.duration || .25\r
-        });\r
-    },\r
-\r
-    // private\r
-    getContainer : function(){\r
-        return this.ctNode;  \r
-    },\r
-\r
-    // private\r
-    getEl : function(){\r
-        return this.wrap;  \r
-    },\r
-\r
-    // private\r
-    appendDDGhost : function(ghostNode){\r
-        ghostNode.appendChild(this.elNode.cloneNode(true));\r
-    },\r
-\r
-    // private\r
-    getDDRepairXY : function(){\r
-        return Ext.lib.Dom.getXY(this.iconNode);\r
-    },\r
-\r
-    // private\r
-    onRender : function(){\r
-        this.render();    \r
-    },\r
-\r
-    // private\r
-    render : function(bulkRender){\r
-        var n = this.node, a = n.attributes;\r
-        var targetNode = n.parentNode ? \r
-              n.parentNode.ui.getContainer() : n.ownerTree.innerCt.dom;\r
-        \r
-        if(!this.rendered){\r
-            this.rendered = true;\r
-\r
-            this.renderElements(n, a, targetNode, bulkRender);\r
-\r
-            if(a.qtip){\r
-               if(this.textNode.setAttributeNS){\r
-                   this.textNode.setAttributeNS("ext", "qtip", a.qtip);\r
-                   if(a.qtipTitle){\r
-                       this.textNode.setAttributeNS("ext", "qtitle", a.qtipTitle);\r
-                   }\r
-               }else{\r
-                   this.textNode.setAttribute("ext:qtip", a.qtip);\r
-                   if(a.qtipTitle){\r
-                       this.textNode.setAttribute("ext:qtitle", a.qtipTitle);\r
-                   }\r
-               } \r
-            }else if(a.qtipCfg){\r
-                a.qtipCfg.target = Ext.id(this.textNode);\r
-                Ext.QuickTips.register(a.qtipCfg);\r
-            }\r
-            this.initEvents();\r
-            if(!this.node.expanded){\r
-                this.updateExpandIcon(true);\r
-            }\r
-        }else{\r
-            if(bulkRender === true) {\r
-                targetNode.appendChild(this.wrap);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    renderElements : function(n, a, targetNode, bulkRender){\r
-        // add some indent caching, this helps performance when rendering a large tree\r
-        this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : '';\r
-\r
-        var cb = typeof a.checked == 'boolean';\r
-\r
-        var href = a.href ? a.href : Ext.isGecko ? "" : "#";\r
-        var buf = ['<li class="x-tree-node"><div ext:tree-node-id="',n.id,'" class="x-tree-node-el x-tree-node-leaf x-unselectable ', a.cls,'" unselectable="on">',\r
-            '<span class="x-tree-node-indent">',this.indentMarkup,"</span>",\r
-            '<img src="', this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow" />',\r
-            '<img src="', a.icon || this.emptyIcon, '" class="x-tree-node-icon',(a.icon ? " x-tree-node-inline-icon" : ""),(a.iconCls ? " "+a.iconCls : ""),'" unselectable="on" />',\r
-            cb ? ('<input class="x-tree-node-cb" type="checkbox" ' + (a.checked ? 'checked="checked" />' : '/>')) : '',\r
-            '<a hidefocus="on" class="x-tree-node-anchor" href="',href,'" tabIndex="1" ',\r
-             a.hrefTarget ? ' target="'+a.hrefTarget+'"' : "", '><span unselectable="on">',n.text,"</span></a></div>",\r
-            '<ul class="x-tree-node-ct" style="display:none;"></ul>',\r
-            "</li>"].join('');\r
-\r
-        var nel;\r
-        if(bulkRender !== true && n.nextSibling && (nel = n.nextSibling.ui.getEl())){\r
-            this.wrap = Ext.DomHelper.insertHtml("beforeBegin", nel, buf);\r
-        }else{\r
-            this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf);\r
-        }\r
-        \r
-        this.elNode = this.wrap.childNodes[0];\r
-        this.ctNode = this.wrap.childNodes[1];\r
-        var cs = this.elNode.childNodes;\r
-        this.indentNode = cs[0];\r
-        this.ecNode = cs[1];\r
-        this.iconNode = cs[2];\r
-        var index = 3;\r
-        if(cb){\r
-            this.checkbox = cs[3];\r
-                       // fix for IE6\r
-                       this.checkbox.defaultChecked = this.checkbox.checked;                   \r
-            index++;\r
-        }\r
-        this.anchor = cs[index];\r
-        this.textNode = cs[index].firstChild;\r
-    },\r
-\r
-\r
-    getAnchor : function(){\r
-        return this.anchor;\r
-    },\r
-    \r
-\r
-    getTextEl : function(){\r
-        return this.textNode;\r
-    },\r
-    \r
-\r
-    getIconEl : function(){\r
-        return this.iconNode;\r
-    },\r
-\r
-\r
-    isChecked : function(){\r
-        return this.checkbox ? this.checkbox.checked : false; \r
-    },\r
-\r
-    // private\r
-    updateExpandIcon : function(){\r
-        if(this.rendered){\r
-            var n = this.node, c1, c2;\r
-            var cls = n.isLast() ? "x-tree-elbow-end" : "x-tree-elbow";\r
-            if(n.isExpandable()){\r
-                if(n.expanded){\r
-                    cls += "-minus";\r
-                    c1 = "x-tree-node-collapsed";\r
-                    c2 = "x-tree-node-expanded";\r
-                }else{\r
-                    cls += "-plus";\r
-                    c1 = "x-tree-node-expanded";\r
-                    c2 = "x-tree-node-collapsed";\r
-                }\r
-                if(this.wasLeaf){\r
-                    this.removeClass("x-tree-node-leaf");\r
-                    this.wasLeaf = false;\r
-                }\r
-                if(this.c1 != c1 || this.c2 != c2){\r
-                    Ext.fly(this.elNode).replaceClass(c1, c2);\r
-                    this.c1 = c1; this.c2 = c2;\r
-                }\r
-            }else{\r
-                if(!this.wasLeaf){\r
-                    Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-leaf");\r
-                    delete this.c1;\r
-                    delete this.c2;\r
-                    this.wasLeaf = true;\r
-                }\r
-            }\r
-            var ecc = "x-tree-ec-icon "+cls;\r
-            if(this.ecc != ecc){\r
-                this.ecNode.className = ecc;\r
-                this.ecc = ecc;\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    getChildIndent : function(){\r
-        if(!this.childIndent){\r
-            var buf = [];\r
-            var p = this.node;\r
-            while(p){\r
-                if(!p.isRoot || (p.isRoot && p.ownerTree.rootVisible)){\r
-                    if(!p.isLast()) {\r
-                        buf.unshift('<img src="'+this.emptyIcon+'" class="x-tree-elbow-line" />');\r
-                    } else {\r
-                        buf.unshift('<img src="'+this.emptyIcon+'" class="x-tree-icon" />');\r
-                    }\r
-                }\r
-                p = p.parentNode;\r
-            }\r
-            this.childIndent = buf.join("");\r
-        }\r
-        return this.childIndent;\r
-    },\r
-\r
-    // private\r
-    renderIndent : function(){\r
-        if(this.rendered){\r
-            var indent = "";\r
-            var p = this.node.parentNode;\r
-            if(p){\r
-                indent = p.ui.getChildIndent();\r
-            }\r
-            if(this.indentMarkup != indent){ // don't rerender if not required\r
-                this.indentNode.innerHTML = indent;\r
-                this.indentMarkup = indent;\r
-            }\r
-            this.updateExpandIcon();\r
-        }\r
-    },\r
-\r
-    destroy : function(){\r
-        if(this.elNode){\r
-            Ext.dd.Registry.unregister(this.elNode.id);\r
-        }\r
-        delete this.elNode;\r
-        delete this.ctNode;\r
-        delete this.indentNode;\r
-        delete this.ecNode;\r
-        delete this.iconNode;\r
-        delete this.checkbox;\r
-        delete this.anchor;\r
-        delete this.textNode;\r
-        \r
-        if (this.holder){\r
-             delete this.wrap;\r
-             Ext.removeNode(this.holder);\r
-             delete this.holder;\r
-        }else{\r
-            Ext.removeNode(this.wrap);\r
-            delete this.wrap;\r
-        }\r
-    }\r
-};\r
-\r
-\r
-Ext.tree.RootTreeNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {\r
-    // private\r
-    render : function(){\r
-        if(!this.rendered){\r
-            var targetNode = this.node.ownerTree.innerCt.dom;\r
-            this.node.expanded = true;\r
-            targetNode.innerHTML = '<div class="x-tree-root-node"></div>';\r
-            this.wrap = this.ctNode = targetNode.firstChild;\r
-        }\r
-    },\r
-    collapse : Ext.emptyFn,\r
-    expand : Ext.emptyFn\r
-});\r
-\r
-Ext.tree.TreeLoader = function(config){\r
-    this.baseParams = {};\r
-    Ext.apply(this, config);\r
-\r
-    this.addEvents(\r
-        \r
-        "beforeload",\r
-        \r
-        "load",\r
-        \r
-        "loadexception"\r
-    );\r
-\r
-    Ext.tree.TreeLoader.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.tree.TreeLoader, Ext.util.Observable, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    uiProviders : {},\r
-\r
-    \r
-    clearOnLoad : true,\r
-\r
-    \r
-    load : function(node, callback){\r
-        if(this.clearOnLoad){\r
-            while(node.firstChild){\r
-                node.removeChild(node.firstChild);\r
-            }\r
-        }\r
-        if(this.doPreload(node)){ // preloaded json children\r
-            if(typeof callback == "function"){\r
-                callback();\r
-            }\r
-        }else if(this.dataUrl||this.url){\r
-            this.requestData(node, callback);\r
-        }\r
-    },\r
-\r
-    doPreload : function(node){\r
-        if(node.attributes.children){\r
-            if(node.childNodes.length < 1){ // preloaded?\r
-                var cs = node.attributes.children;\r
-                node.beginUpdate();\r
-                for(var i = 0, len = cs.length; i < len; i++){\r
-                    var cn = node.appendChild(this.createNode(cs[i]));\r
-                    if(this.preloadChildren){\r
-                        this.doPreload(cn);\r
-                    }\r
-                }\r
-                node.endUpdate();\r
-            }\r
-            return true;\r
-        }else {\r
-            return false;\r
-        }\r
-    },\r
-\r
-    getParams: function(node){\r
-        var buf = [], bp = this.baseParams;\r
-        for(var key in bp){\r
-            if(typeof bp[key] != "function"){\r
-                buf.push(encodeURIComponent(key), "=", encodeURIComponent(bp[key]), "&");\r
-            }\r
-        }\r
-        buf.push("node=", encodeURIComponent(node.id));\r
-        return buf.join("");\r
-    },\r
-\r
-    requestData : function(node, callback){\r
-        if(this.fireEvent("beforeload", this, node, callback) !== false){\r
-            this.transId = Ext.Ajax.request({\r
-                method:this.requestMethod,\r
-                url: this.dataUrl||this.url,\r
-                success: this.handleResponse,\r
-                failure: this.handleFailure,\r
-                scope: this,\r
-                argument: {callback: callback, node: node},\r
-                params: this.getParams(node)\r
-            });\r
-        }else{\r
-            // if the load is cancelled, make sure we notify\r
-            // the node that we are done\r
-            if(typeof callback == "function"){\r
-                callback();\r
-            }\r
-        }\r
-    },\r
-\r
-    isLoading : function(){\r
-        return !!this.transId;\r
-    },\r
-\r
-    abort : function(){\r
-        if(this.isLoading()){\r
-            Ext.Ajax.abort(this.transId);\r
-        }\r
-    },\r
-\r
-    \r
-    createNode : function(attr){\r
-        // apply baseAttrs, nice idea Corey!\r
-        if(this.baseAttrs){\r
-            Ext.applyIf(attr, this.baseAttrs);\r
-        }\r
-        if(this.applyLoader !== false){\r
-            attr.loader = this;\r
-        }\r
-        if(typeof attr.uiProvider == 'string'){\r
-           attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider);\r
-        }\r
-        if(attr.nodeType){\r
-            return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr);\r
-        }else{\r
-            return attr.leaf ?\r
-                        new Ext.tree.TreeNode(attr) :\r
-                        new Ext.tree.AsyncTreeNode(attr);\r
-        }\r
-    },\r
-\r
-    processResponse : function(response, node, callback){\r
-        var json = response.responseText;\r
-        try {\r
-            var o = eval("("+json+")");\r
-            node.beginUpdate();\r
-            for(var i = 0, len = o.length; i < len; i++){\r
-                var n = this.createNode(o[i]);\r
-                if(n){\r
-                    node.appendChild(n);\r
-                }\r
-            }\r
-            node.endUpdate();\r
-            if(typeof callback == "function"){\r
-                callback(this, node);\r
-            }\r
-        }catch(e){\r
-            this.handleFailure(response);\r
-        }\r
-    },\r
-\r
-    handleResponse : function(response){\r
-        this.transId = false;\r
-        var a = response.argument;\r
-        this.processResponse(response, a.node, a.callback);\r
-        this.fireEvent("load", this, a.node, response);\r
-    },\r
-\r
-    handleFailure : function(response){\r
-        this.transId = false;\r
-        var a = response.argument;\r
-        this.fireEvent("loadexception", this, a.node, response);\r
-        if(typeof a.callback == "function"){\r
-            a.callback(this, a.node);\r
-        }\r
-    }\r
-});\r
-\r
-Ext.tree.TreeFilter = function(tree, config){\r
-    this.tree = tree;\r
-    this.filtered = {};\r
-    Ext.apply(this, config);\r
-};\r
-\r
-Ext.tree.TreeFilter.prototype = {\r
-    clearBlank:false,\r
-    reverse:false,\r
-    autoClear:false,\r
-    remove:false,\r
-\r
-     \r
-    filter : function(value, attr, startNode){\r
-        attr = attr || "text";\r
-        var f;\r
-        if(typeof value == "string"){\r
-            var vlen = value.length;\r
-            // auto clear empty filter\r
-            if(vlen == 0 && this.clearBlank){\r
-                this.clear();\r
-                return;\r
-            }\r
-            value = value.toLowerCase();\r
-            f = function(n){\r
-                return n.attributes[attr].substr(0, vlen).toLowerCase() == value;\r
-            };\r
-        }else if(value.exec){ // regex?\r
-            f = function(n){\r
-                return value.test(n.attributes[attr]);\r
-            };\r
-        }else{\r
-            throw 'Illegal filter type, must be string or regex';\r
-        }\r
-        this.filterBy(f, null, startNode);\r
-       },\r
-    \r
-    \r
-    filterBy : function(fn, scope, startNode){\r
-        startNode = startNode || this.tree.root;\r
-        if(this.autoClear){\r
-            this.clear();\r
-        }\r
-        var af = this.filtered, rv = this.reverse;\r
-        var f = function(n){\r
-            if(n == startNode){\r
-                return true;\r
-            }\r
-            if(af[n.id]){\r
-                return false;\r
-            }\r
-            var m = fn.call(scope || n, n);\r
-            if(!m || rv){\r
-                af[n.id] = n;\r
-                n.ui.hide();\r
-                return false;\r
-            }\r
-            return true;\r
-        };\r
-        startNode.cascade(f);\r
-        if(this.remove){\r
-           for(var id in af){\r
-               if(typeof id != "function"){\r
-                   var n = af[id];\r
-                   if(n && n.parentNode){\r
-                       n.parentNode.removeChild(n);\r
-                   }\r
-               }\r
-           } \r
-        }\r
-    },\r
-    \r
-    \r
-    clear : function(){\r
-        var t = this.tree;\r
-        var af = this.filtered;\r
-        for(var id in af){\r
-            if(typeof id != "function"){\r
-                var n = af[id];\r
-                if(n){\r
-                    n.ui.show();\r
-                }\r
-            }\r
-        }\r
-        this.filtered = {}; \r
-    }\r
-};\r
-\r
-\r
-Ext.tree.TreeSorter = function(tree, config){\r
-    \r
-       \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    Ext.apply(this, config);\r
-    tree.on("beforechildrenrendered", this.doSort, this);\r
-    tree.on("append", this.updateSort, this);\r
-    tree.on("insert", this.updateSort, this);\r
-    tree.on("textchange", this.updateSortParent, this);\r
-    \r
-    var dsc = this.dir && this.dir.toLowerCase() == "desc";\r
-    var p = this.property || "text";\r
-    var sortType = this.sortType;\r
-    var fs = this.folderSort;\r
-    var cs = this.caseSensitive === true;\r
-    var leafAttr = this.leafAttr || 'leaf';\r
-\r
-    this.sortFn = function(n1, n2){\r
-        if(fs){\r
-            if(n1.attributes[leafAttr] && !n2.attributes[leafAttr]){\r
-                return 1;\r
-            }\r
-            if(!n1.attributes[leafAttr] && n2.attributes[leafAttr]){\r
-                return -1;\r
-            }\r
-        }\r
-       var v1 = sortType ? sortType(n1) : (cs ? n1.attributes[p] : n1.attributes[p].toUpperCase());\r
-       var v2 = sortType ? sortType(n2) : (cs ? n2.attributes[p] : n2.attributes[p].toUpperCase());\r
-       if(v1 < v2){\r
-                       return dsc ? +1 : -1;\r
-               }else if(v1 > v2){\r
-                       return dsc ? -1 : +1;\r
-        }else{\r
-               return 0;\r
-        }\r
-    };\r
-};\r
-\r
-Ext.tree.TreeSorter.prototype = {\r
-    doSort : function(node){\r
-        node.sort(this.sortFn);\r
-    },\r
-    \r
-    compareNodes : function(n1, n2){\r
-        return (n1.text.toUpperCase() > n2.text.toUpperCase() ? 1 : -1);\r
-    },\r
-    \r
-    updateSort : function(tree, node){\r
-        if(node.childrenRendered){\r
-            this.doSort.defer(1, this, [node]);\r
-        }\r
-    },\r
-    \r
-    updateSortParent : function(node){\r
-               var p = node.parentNode;\r
-               if(p && p.childrenRendered){\r
-            this.doSort.defer(1, this, [p]);\r
-        }\r
-    }\r
-};\r
-\r
-if(Ext.dd.DropZone){\r
-    \r
-Ext.tree.TreeDropZone = function(tree, config){\r
-    \r
-    this.allowParentInsert = false;\r
-    \r
-    this.allowContainerDrop = false;\r
-    \r
-    this.appendOnly = false;\r
-    Ext.tree.TreeDropZone.superclass.constructor.call(this, tree.innerCt, config);\r
-    \r
-    this.tree = tree;\r
-    \r
-    this.dragOverData = {};\r
-    // private\r
-    this.lastInsertClass = "x-tree-no-status";\r
-};\r
-\r
-Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, {\r
-    \r
-    ddGroup : "TreeDD",\r
-\r
-    \r
-    expandDelay : 1000,\r
-\r
-    // private\r
-    expandNode : function(node){\r
-        if(node.hasChildNodes() && !node.isExpanded()){\r
-            node.expand(false, null, this.triggerCacheRefresh.createDelegate(this));\r
-        }\r
-    },\r
-\r
-    // private\r
-    queueExpand : function(node){\r
-        this.expandProcId = this.expandNode.defer(this.expandDelay, this, [node]);\r
-    },\r
-\r
-    // private\r
-    cancelExpand : function(){\r
-        if(this.expandProcId){\r
-            clearTimeout(this.expandProcId);\r
-            this.expandProcId = false;\r
-        }\r
-    },\r
-\r
-    // private\r
-    isValidDropPoint : function(n, pt, dd, e, data){\r
-        if(!n || !data){ return false; }\r
-        var targetNode = n.node;\r
-        var dropNode = data.node;\r
-        // default drop rules\r
-        if(!(targetNode && targetNode.isTarget && pt)){\r
-            return false;\r
-        }\r
-        if(pt == "append" && targetNode.allowChildren === false){\r
-            return false;\r
-        }\r
-        if((pt == "above" || pt == "below") && (targetNode.parentNode && targetNode.parentNode.allowChildren === false)){\r
-            return false;\r
-        }\r
-        if(dropNode && (targetNode == dropNode || dropNode.contains(targetNode))){\r
-            return false;\r
-        }\r
-        // reuse the object\r
-        var overEvent = this.dragOverData;\r
-        overEvent.tree = this.tree;\r
-        overEvent.target = targetNode;\r
-        overEvent.data = data;\r
-        overEvent.point = pt;\r
-        overEvent.source = dd;\r
-        overEvent.rawEvent = e;\r
-        overEvent.dropNode = dropNode;\r
-        overEvent.cancel = false;  \r
-        var result = this.tree.fireEvent("nodedragover", overEvent);\r
-        return overEvent.cancel === false && result !== false;\r
-    },\r
-\r
-    // private\r
-    getDropPoint : function(e, n, dd){\r
-        var tn = n.node;\r
-        if(tn.isRoot){\r
-            return tn.allowChildren !== false ? "append" : false; // always append for root\r
-        }\r
-        var dragEl = n.ddel;\r
-        var t = Ext.lib.Dom.getY(dragEl), b = t + dragEl.offsetHeight;\r
-        var y = Ext.lib.Event.getPageY(e);\r
-        var noAppend = tn.allowChildren === false || tn.isLeaf();\r
-        if(this.appendOnly || tn.parentNode.allowChildren === false){\r
-            return noAppend ? false : "append";\r
-        }\r
-        var noBelow = false;\r
-        if(!this.allowParentInsert){\r
-            noBelow = tn.hasChildNodes() && tn.isExpanded();\r
-        }\r
-        var q = (b - t) / (noAppend ? 2 : 3);\r
-        if(y >= t && y < (t + q)){\r
-            return "above";\r
-        }else if(!noBelow && (noAppend || y >= b-q && y <= b)){\r
-            return "below";\r
-        }else{\r
-            return "append";\r
-        }\r
-    },\r
-\r
-    // private\r
-    onNodeEnter : function(n, dd, e, data){\r
-        this.cancelExpand();\r
-    },\r
-\r
-    // private\r
-    onNodeOver : function(n, dd, e, data){\r
-        var pt = this.getDropPoint(e, n, dd);\r
-        var node = n.node;\r
-        \r
-        // auto node expand check\r
-        if(!this.expandProcId && pt == "append" && node.hasChildNodes() && !n.node.isExpanded()){\r
-            this.queueExpand(node);\r
-        }else if(pt != "append"){\r
-            this.cancelExpand();\r
-        }\r
-        \r
-        // set the insert point style on the target node\r
-        var returnCls = this.dropNotAllowed;\r
-        if(this.isValidDropPoint(n, pt, dd, e, data)){\r
-           if(pt){\r
-               var el = n.ddel;\r
-               var cls;\r
-               if(pt == "above"){\r
-                   returnCls = n.node.isFirst() ? "x-tree-drop-ok-above" : "x-tree-drop-ok-between";\r
-                   cls = "x-tree-drag-insert-above";\r
-               }else if(pt == "below"){\r
-                   returnCls = n.node.isLast() ? "x-tree-drop-ok-below" : "x-tree-drop-ok-between";\r
-                   cls = "x-tree-drag-insert-below";\r
-               }else{\r
-                   returnCls = "x-tree-drop-ok-append";\r
-                   cls = "x-tree-drag-append";\r
-               }\r
-               if(this.lastInsertClass != cls){\r
-                   Ext.fly(el).replaceClass(this.lastInsertClass, cls);\r
-                   this.lastInsertClass = cls;\r
-               }\r
-           }\r
-       }\r
-       return returnCls;\r
-    },\r
-\r
-    // private\r
-    onNodeOut : function(n, dd, e, data){\r
-        this.cancelExpand();\r
-        this.removeDropIndicators(n);\r
-    },\r
-\r
-    // private\r
-    onNodeDrop : function(n, dd, e, data){\r
-        var point = this.getDropPoint(e, n, dd);\r
-        var targetNode = n.node;\r
-        targetNode.ui.startDrop();\r
-        if(!this.isValidDropPoint(n, point, dd, e, data)){\r
-            targetNode.ui.endDrop();\r
-            return false;\r
-        }\r
-        // first try to find the drop node\r
-        var dropNode = data.node || (dd.getTreeNode ? dd.getTreeNode(data, targetNode, point, e) : null);\r
-        var dropEvent = {\r
-            tree : this.tree,\r
-            target: targetNode,\r
-            data: data,\r
-            point: point,\r
-            source: dd,\r
-            rawEvent: e,\r
-            dropNode: dropNode,\r
-            cancel: !dropNode,\r
-            dropStatus: false\r
-        };\r
-        var retval = this.tree.fireEvent("beforenodedrop", dropEvent);\r
-        if(retval === false || dropEvent.cancel === true || !dropEvent.dropNode){\r
-            targetNode.ui.endDrop();\r
-            return dropEvent.dropStatus;\r
-        }\r
-        // allow target changing\r
-        targetNode = dropEvent.target;\r
-        if(point == "append" && !targetNode.isExpanded()){\r
-            targetNode.expand(false, null, function(){\r
-                this.completeDrop(dropEvent);\r
-            }.createDelegate(this));\r
-        }else{\r
-            this.completeDrop(dropEvent);\r
-        }\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    completeDrop : function(de){\r
-        var ns = de.dropNode, p = de.point, t = de.target;\r
-        if(!Ext.isArray(ns)){\r
-            ns = [ns];\r
-        }\r
-        var n;\r
-        for(var i = 0, len = ns.length; i < len; i++){\r
-            n = ns[i];\r
-            if(p == "above"){\r
-                t.parentNode.insertBefore(n, t);\r
-            }else if(p == "below"){\r
-                t.parentNode.insertBefore(n, t.nextSibling);\r
-            }else{\r
-                t.appendChild(n);\r
-            }\r
-        }\r
-        n.ui.focus();\r
-        if(Ext.enableFx && this.tree.hlDrop){\r
-            n.ui.highlight();\r
-        }\r
-        t.ui.endDrop();\r
-        this.tree.fireEvent("nodedrop", de);\r
-    },\r
-\r
-    // private\r
-    afterNodeMoved : function(dd, data, e, targetNode, dropNode){\r
-        if(Ext.enableFx && this.tree.hlDrop){\r
-            dropNode.ui.focus();\r
-            dropNode.ui.highlight();\r
-        }\r
-        this.tree.fireEvent("nodedrop", this.tree, targetNode, data, dd, e);\r
-    },\r
-\r
-    // private\r
-    getTree : function(){\r
-        return this.tree;\r
-    },\r
-\r
-    // private\r
-    removeDropIndicators : function(n){\r
-        if(n && n.ddel){\r
-            var el = n.ddel;\r
-            Ext.fly(el).removeClass([\r
-                    "x-tree-drag-insert-above",\r
-                    "x-tree-drag-insert-below",\r
-                    "x-tree-drag-append"]);\r
-            this.lastInsertClass = "_noclass";\r
-        }\r
-    },\r
-\r
-    // private\r
-    beforeDragDrop : function(target, e, id){\r
-        this.cancelExpand();\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    afterRepair : function(data){\r
-        if(data && Ext.enableFx){\r
-            data.node.ui.highlight();\r
-        }\r
-        this.hideProxy();\r
-    }    \r
-});\r
-\r
-}\r
-\r
-if(Ext.dd.DragZone){\r
-Ext.tree.TreeDragZone = function(tree, config){\r
-    Ext.tree.TreeDragZone.superclass.constructor.call(this, tree.getTreeEl(), config);\r
-    \r
-    this.tree = tree;\r
-};\r
-\r
-Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone, {\r
-    \r
-    ddGroup : "TreeDD",\r
-\r
-    // private\r
-    onBeforeDrag : function(data, e){\r
-        var n = data.node;\r
-        return n && n.draggable && !n.disabled;\r
-    },\r
-\r
-    // private\r
-    onInitDrag : function(e){\r
-        var data = this.dragData;\r
-        this.tree.getSelectionModel().select(data.node);\r
-        this.tree.eventModel.disable();\r
-        this.proxy.update("");\r
-        data.node.ui.appendDDGhost(this.proxy.ghost.dom);\r
-        this.tree.fireEvent("startdrag", this.tree, data.node, e);\r
-    },\r
-\r
-    // private\r
-    getRepairXY : function(e, data){\r
-        return data.node.ui.getDDRepairXY();\r
-    },\r
-\r
-    // private\r
-    onEndDrag : function(data, e){\r
-        this.tree.eventModel.enable.defer(100, this.tree.eventModel);\r
-        this.tree.fireEvent("enddrag", this.tree, data.node, e);\r
-    },\r
-\r
-    // private\r
-    onValidDrop : function(dd, e, id){\r
-        this.tree.fireEvent("dragdrop", this.tree, this.dragData.node, dd, e);\r
-        this.hideProxy();\r
-    },\r
-\r
-    // private\r
-    beforeInvalidDrop : function(e, id){\r
-        // this scrolls the original position back into view\r
-        var sm = this.tree.getSelectionModel();\r
-        sm.clearSelections();\r
-        sm.select(this.dragData.node);\r
-    },\r
-    \r
-    // private\r
-    afterRepair : function(){\r
-        if (Ext.enableFx && this.tree.hlDrop) {\r
-            Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9");\r
-        }\r
-        this.dragging = false;\r
-    }\r
-});\r
-}\r
-\r
-Ext.tree.TreeEditor = function(tree, fc, config){\r
-    fc = fc || {};\r
-    var field = fc.events ? fc : new Ext.form.TextField(fc);\r
-    Ext.tree.TreeEditor.superclass.constructor.call(this, field, config);\r
-\r
-    this.tree = tree;\r
-\r
-    if(!tree.rendered){\r
-        tree.on('render', this.initEditor, this);\r
-    }else{\r
-        this.initEditor(tree);\r
-    }\r
-};\r
-\r
-Ext.extend(Ext.tree.TreeEditor, Ext.Editor, {\r
-    \r
-    alignment: "l-l",\r
-    // inherit\r
-    autoSize: false,\r
-    \r
-    hideEl : false,\r
-    \r
-    cls: "x-small-editor x-tree-editor",\r
-    \r
-    shim:false,\r
-    // inherit\r
-    shadow:"frame",\r
-    \r
-    maxWidth: 250,\r
-    \r
-    editDelay : 350,\r
-\r
-    initEditor : function(tree){\r
-        tree.on('beforeclick', this.beforeNodeClick, this);\r
-        tree.on('dblclick', this.onNodeDblClick, this);\r
-        this.on('complete', this.updateNode, this);\r
-        this.on('beforestartedit', this.fitToTree, this);\r
-        this.on('startedit', this.bindScroll, this, {delay:10});\r
-        this.on('specialkey', this.onSpecialKey, this);\r
-    },\r
-\r
-    // private\r
-    fitToTree : function(ed, el){\r
-        var td = this.tree.getTreeEl().dom, nd = el.dom;\r
-        if(td.scrollLeft >  nd.offsetLeft){ // ensure the node left point is visible\r
-            td.scrollLeft = nd.offsetLeft;\r
-        }\r
-        var w = Math.min(\r
-                this.maxWidth,\r
-                (td.clientWidth > 20 ? td.clientWidth : td.offsetWidth) - Math.max(0, nd.offsetLeft-td.scrollLeft) - 5);\r
-        this.setSize(w, '');\r
-    },\r
-\r
-    // private\r
-    triggerEdit : function(node, defer){\r
-        this.completeEdit();\r
-               if(node.attributes.editable !== false){\r
-              \r
-                       this.editNode = node;\r
-            if(this.tree.autoScroll){\r
-                node.ui.getEl().scrollIntoView(this.tree.body);\r
-            }\r
-            this.autoEditTimer = this.startEdit.defer(this.editDelay, this, [node.ui.textNode, node.text]);\r
-            return false;\r
-        }\r
-    },\r
-\r
-    // private\r
-    bindScroll : function(){\r
-        this.tree.getTreeEl().on('scroll', this.cancelEdit, this);\r
-    },\r
-\r
-    // private\r
-    beforeNodeClick : function(node, e){\r
-        clearTimeout(this.autoEditTimer);\r
-        if(this.tree.getSelectionModel().isSelected(node)){\r
-            e.stopEvent();\r
-            return this.triggerEdit(node);\r
-        }\r
-    },\r
-\r
-    onNodeDblClick : function(node, e){\r
-        clearTimeout(this.autoEditTimer);\r
-    },\r
-\r
-    // private\r
-    updateNode : function(ed, value){\r
-        this.tree.getTreeEl().un('scroll', this.cancelEdit, this);\r
-        this.editNode.setText(value);\r
-    },\r
-\r
-    // private\r
-    onHide : function(){\r
-        Ext.tree.TreeEditor.superclass.onHide.call(this);\r
-        if(this.editNode){\r
-            this.editNode.ui.focus.defer(50, this.editNode.ui);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onSpecialKey : function(field, e){\r
-        var k = e.getKey();\r
-        if(k == e.ESC){\r
-            e.stopEvent();\r
-            this.cancelEdit();\r
-        }else if(k == e.ENTER && !e.hasModifier()){\r
-            e.stopEvent();\r
-            this.completeEdit();\r
-        }\r
-    }\r
-});\r
-\r
-Ext.menu.Menu = function(config){\r
-    if(Ext.isArray(config)){\r
-        config = {items:config};\r
-    }\r
-    Ext.apply(this, config);\r
-    this.id = this.id || Ext.id();\r
-    this.addEvents(\r
-        \r
-        'beforeshow',\r
-        \r
-        'beforehide',\r
-        \r
-        'show',\r
-        \r
-        'hide',\r
-        \r
-        'click',\r
-        \r
-        'mouseover',\r
-        \r
-        'mouseout',\r
-        \r
-        'itemclick'\r
-    );\r
-    Ext.menu.MenuMgr.register(this);\r
-    Ext.menu.Menu.superclass.constructor.call(this);\r
-    var mis = this.items;\r
-    \r
-\r
-    this.items = new Ext.util.MixedCollection();\r
-    if(mis){\r
-        this.add.apply(this, mis);\r
-    }\r
-};\r
-\r
-Ext.extend(Ext.menu.Menu, Ext.util.Observable, {\r
-    \r
-    \r
-    \r
-    minWidth : 120,\r
-    \r
-    shadow : "sides",\r
-    \r
-    subMenuAlign : "tl-tr?",\r
-    \r
-    defaultAlign : "tl-bl?",\r
-    \r
-    allowOtherMenus : false,\r
-    \r
-    ignoreParentClicks : false,\r
-\r
-    // private\r
-    hidden:true,\r
-\r
-    // private\r
-    createEl : function(){\r
-        return new Ext.Layer({\r
-            cls: "x-menu",\r
-            shadow:this.shadow,\r
-            constrain: false,\r
-            parentEl: this.parentEl || document.body,\r
-            zindex:15000\r
-        });\r
-    },\r
-\r
-    // private\r
-    render : function(){\r
-        if(this.el){\r
-            return;\r
-        }\r
-        var el = this.el = this.createEl();\r
-\r
-        if(!this.keyNav){\r
-            this.keyNav = new Ext.menu.MenuNav(this);\r
-        }\r
-        if(this.plain){\r
-            el.addClass("x-menu-plain");\r
-        }\r
-        if(this.cls){\r
-            el.addClass(this.cls);\r
-        }\r
-        // generic focus element\r
-        this.focusEl = el.createChild({\r
-            tag: "a", cls: "x-menu-focus", href: "#", onclick: "return false;", tabIndex:"-1"\r
-        });\r
-        var ul = el.createChild({tag: "ul", cls: "x-menu-list"});\r
-        ul.on("click", this.onClick, this);\r
-        ul.on("mouseover", this.onMouseOver, this);\r
-        ul.on("mouseout", this.onMouseOut, this);\r
-        this.items.each(function(item){\r
-            var li = document.createElement("li");\r
-            li.className = "x-menu-list-item";\r
-            ul.dom.appendChild(li);\r
-            item.render(li, this);\r
-        }, this);\r
-        this.ul = ul;\r
-        this.autoWidth();\r
-    },\r
-\r
-    // private\r
-    autoWidth : function(){\r
-        var el = this.el, ul = this.ul;\r
-        if(!el){\r
-            return;\r
-        }\r
-        var w = this.width;\r
-        if(w){\r
-            el.setWidth(w);\r
-        }else if(Ext.isIE){\r
-            el.setWidth(this.minWidth);\r
-            var t = el.dom.offsetWidth; // force recalc\r
-            el.setWidth(ul.getWidth()+el.getFrameWidth("lr"));\r
-        }\r
-    },\r
-\r
-    // private\r
-    delayAutoWidth : function(){\r
-        if(this.el){\r
-            if(!this.awTask){\r
-                this.awTask = new Ext.util.DelayedTask(this.autoWidth, this);\r
-            }\r
-            this.awTask.delay(20);\r
-        }\r
-    },\r
-\r
-    // private\r
-    findTargetItem : function(e){\r
-        var t = e.getTarget(".x-menu-list-item", this.ul,  true);\r
-        if(t && t.menuItemId){\r
-            return this.items.get(t.menuItemId);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onClick : function(e){\r
-        var t;\r
-        if(t = this.findTargetItem(e)){\r
-            if(t.menu && this.ignoreParentClicks){\r
-                t.expandMenu();\r
-            }else{\r
-                t.onClick(e);\r
-                this.fireEvent("click", this, t, e);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    setActiveItem : function(item, autoExpand){\r
-        if(item != this.activeItem){\r
-            if(this.activeItem){\r
-                this.activeItem.deactivate();\r
-            }\r
-            this.activeItem = item;\r
-            item.activate(autoExpand);\r
-        }else if(autoExpand){\r
-            item.expandMenu();\r
-        }\r
-    },\r
-\r
-    // private\r
-    tryActivate : function(start, step){\r
-        var items = this.items;\r
-        for(var i = start, len = items.length; i >= 0 && i < len; i+= step){\r
-            var item = items.get(i);\r
-            if(!item.disabled && item.canActivate){\r
-                this.setActiveItem(item, false);\r
-                return item;\r
-            }\r
-        }\r
-        return false;\r
-    },\r
-\r
-    // private\r
-    onMouseOver : function(e){\r
-        var t;\r
-        if(t = this.findTargetItem(e)){\r
-            if(t.canActivate && !t.disabled){\r
-                this.setActiveItem(t, true);\r
-            }\r
-        }\r
-        this.over = true;\r
-        this.fireEvent("mouseover", this, e, t);\r
-    },\r
-\r
-    // private\r
-    onMouseOut : function(e){\r
-        var t;\r
-        if(t = this.findTargetItem(e)){\r
-            if(t == this.activeItem && t.shouldDeactivate(e)){\r
-                this.activeItem.deactivate();\r
-                delete this.activeItem;\r
-            }\r
-        }\r
-        this.over = false;\r
-        this.fireEvent("mouseout", this, e, t);\r
-    },\r
-\r
-    \r
-    isVisible : function(){\r
-        return this.el && !this.hidden;\r
-    },\r
-\r
-    \r
-    show : function(el, pos, parentMenu){\r
-        this.parentMenu = parentMenu;\r
-        if(!this.el){\r
-            this.render();\r
-        }\r
-        this.fireEvent("beforeshow", this);\r
-        this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign), parentMenu, false);\r
-    },\r
-\r
-    \r
-    showAt : function(xy, parentMenu, _e){\r
-        this.parentMenu = parentMenu;\r
-        if(!this.el){\r
-            this.render();\r
-        }\r
-        if(_e !== false){\r
-            this.fireEvent("beforeshow", this);\r
-            xy = this.el.adjustForConstraints(xy);\r
-        }\r
-        this.el.setXY(xy);\r
-        this.el.show();\r
-        this.hidden = false;\r
-        this.focus();\r
-        this.fireEvent("show", this);\r
-    },\r
-\r
-\r
-\r
-    focus : function(){\r
-        if(!this.hidden){\r
-            this.doFocus.defer(50, this);\r
-        }\r
-    },\r
-\r
-    doFocus : function(){\r
-        if(!this.hidden){\r
-            this.focusEl.focus();\r
-        }\r
-    },\r
-\r
-    \r
-    hide : function(deep){\r
-        if(this.el && this.isVisible()){\r
-            this.fireEvent("beforehide", this);\r
-            if(this.activeItem){\r
-                this.activeItem.deactivate();\r
-                this.activeItem = null;\r
-            }\r
-            this.el.hide();\r
-            this.hidden = true;\r
-            this.fireEvent("hide", this);\r
-        }\r
-        if(deep === true && this.parentMenu){\r
-            this.parentMenu.hide(true);\r
-        }\r
-    },\r
-\r
-    \r
-    add : function(){\r
-        var a = arguments, l = a.length, item;\r
-        for(var i = 0; i < l; i++){\r
-            var el = a[i];\r
-            if(el.render){ // some kind of Item\r
-                item = this.addItem(el);\r
-            }else if(typeof el == "string"){ // string\r
-                if(el == "separator" || el == "-"){\r
-                    item = this.addSeparator();\r
-                }else{\r
-                    item = this.addText(el);\r
-                }\r
-            }else if(el.tagName || el.el){ // element\r
-                item = this.addElement(el);\r
-            }else if(typeof el == "object"){ // must be menu item config?\r
-                Ext.applyIf(el, this.defaults);\r
-                item = this.addMenuItem(el);\r
-            }\r
-        }\r
-        return item;\r
-    },\r
-\r
-    \r
-    getEl : function(){\r
-        if(!this.el){\r
-            this.render();\r
-        }\r
-        return this.el;\r
-    },\r
-\r
-    \r
-    addSeparator : function(){\r
-        return this.addItem(new Ext.menu.Separator());\r
-    },\r
-\r
-    \r
-    addElement : function(el){\r
-        return this.addItem(new Ext.menu.BaseItem(el));\r
-    },\r
-\r
-    \r
-    addItem : function(item){\r
-        this.items.add(item);\r
-        if(this.ul){\r
-            var li = document.createElement("li");\r
-            li.className = "x-menu-list-item";\r
-            this.ul.dom.appendChild(li);\r
-            item.render(li, this);\r
-            this.delayAutoWidth();\r
-        }\r
-        return item;\r
-    },\r
-\r
-    \r
-    addMenuItem : function(config){\r
-        if(!(config instanceof Ext.menu.Item)){\r
-            if(typeof config.checked == "boolean"){ // must be check menu item config?\r
-                config = new Ext.menu.CheckItem(config);\r
-            }else{\r
-                config = new Ext.menu.Item(config);\r
-            }\r
-        }\r
-        return this.addItem(config);\r
-    },\r
-\r
-    \r
-    addText : function(text){\r
-        return this.addItem(new Ext.menu.TextItem(text));\r
-    },\r
-\r
-    \r
-    insert : function(index, item){\r
-        this.items.insert(index, item);\r
-        if(this.ul){\r
-            var li = document.createElement("li");\r
-            li.className = "x-menu-list-item";\r
-            this.ul.dom.insertBefore(li, this.ul.dom.childNodes[index]);\r
-            item.render(li, this);\r
-            this.delayAutoWidth();\r
-        }\r
-        return item;\r
-    },\r
-\r
-    \r
-    remove : function(item){\r
-        this.items.removeKey(item.id);\r
-        item.destroy();\r
-    },\r
-\r
-    \r
-    removeAll : function(){\r
-       if(this.items){\r
-               var f;\r
-               while(f = this.items.first()){\r
-                   this.remove(f);\r
-               }\r
-       }\r
-    },\r
-\r
-    \r
-    destroy : function(){\r
-        this.beforeDestroy();\r
-        Ext.menu.MenuMgr.unregister(this);\r
-        if (this.keyNav) {\r
-               this.keyNav.disable();\r
-        }\r
-        this.removeAll();\r
-        if (this.ul) {\r
-               this.ul.removeAllListeners();\r
-        }\r
-        if (this.el) {\r
-               this.el.destroy();\r
-        }\r
-    },\r
-\r
-       // private\r
-    beforeDestroy : Ext.emptyFn\r
-\r
-});\r
-\r
-// MenuNav is a private utility class used internally by the Menu\r
-Ext.menu.MenuNav = function(menu){\r
-    Ext.menu.MenuNav.superclass.constructor.call(this, menu.el);\r
-    this.scope = this.menu = menu;\r
-};\r
-\r
-Ext.extend(Ext.menu.MenuNav, Ext.KeyNav, {\r
-    doRelay : function(e, h){\r
-        var k = e.getKey();\r
-        if(!this.menu.activeItem && e.isNavKeyPress() && k != e.SPACE && k != e.RETURN){\r
-            this.menu.tryActivate(0, 1);\r
-            return false;\r
-        }\r
-        return h.call(this.scope || this, e, this.menu);\r
-    },\r
-\r
-    up : function(e, m){\r
-        if(!m.tryActivate(m.items.indexOf(m.activeItem)-1, -1)){\r
-            m.tryActivate(m.items.length-1, -1);\r
-        }\r
-    },\r
-\r
-    down : function(e, m){\r
-        if(!m.tryActivate(m.items.indexOf(m.activeItem)+1, 1)){\r
-            m.tryActivate(0, 1);\r
-        }\r
-    },\r
-\r
-    right : function(e, m){\r
-        if(m.activeItem){\r
-            m.activeItem.expandMenu(true);\r
-        }\r
-    },\r
-\r
-    left : function(e, m){\r
-        m.hide();\r
-        if(m.parentMenu && m.parentMenu.activeItem){\r
-            m.parentMenu.activeItem.activate();\r
-        }\r
-    },\r
-\r
-    enter : function(e, m){\r
-        if(m.activeItem){\r
-            e.stopPropagation();\r
-            m.activeItem.onClick(e);\r
-            m.fireEvent("click", this, m.activeItem);\r
-            return true;\r
-        }\r
-    }\r
-});\r
-\r
-Ext.menu.MenuMgr = function(){\r
-   var menus, active, groups = {}, attached = false, lastShow = new Date();\r
-\r
-   // private - called when first menu is created\r
-   function init(){\r
-       menus = {};\r
-       active = new Ext.util.MixedCollection();\r
-       Ext.getDoc().addKeyListener(27, function(){\r
-           if(active.length > 0){\r
-               hideAll();\r
-           }\r
-       });\r
-   }\r
-\r
-   // private\r
-   function hideAll(){\r
-       if(active && active.length > 0){\r
-           var c = active.clone();\r
-           c.each(function(m){\r
-               m.hide();\r
-           });\r
-       }\r
-   }\r
-\r
-   // private\r
-   function onHide(m){\r
-       active.remove(m);\r
-       if(active.length < 1){\r
-           Ext.getDoc().un("mousedown", onMouseDown);\r
-           attached = false;\r
-       }\r
-   }\r
-\r
-   // private\r
-   function onShow(m){\r
-       var last = active.last();\r
-       lastShow = new Date();\r
-       active.add(m);\r
-       if(!attached){\r
-           Ext.getDoc().on("mousedown", onMouseDown);\r
-           attached = true;\r
-       }\r
-       if(m.parentMenu){\r
-          m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);\r
-          m.parentMenu.activeChild = m;\r
-       }else if(last && last.isVisible()){\r
-          m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);\r
-       }\r
-   }\r
-\r
-   // private\r
-   function onBeforeHide(m){\r
-       if(m.activeChild){\r
-           m.activeChild.hide();\r
-       }\r
-       if(m.autoHideTimer){\r
-           clearTimeout(m.autoHideTimer);\r
-           delete m.autoHideTimer;\r
-       }\r
-   }\r
-\r
-   // private\r
-   function onBeforeShow(m){\r
-       var pm = m.parentMenu;\r
-       if(!pm && !m.allowOtherMenus){\r
-           hideAll();\r
-       }else if(pm && pm.activeChild){\r
-           pm.activeChild.hide();\r
-       }\r
-   }\r
-\r
-   // private\r
-   function onMouseDown(e){\r
-       if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){\r
-           hideAll();\r
-       }\r
-   }\r
-\r
-   // private\r
-   function onBeforeCheck(mi, state){\r
-       if(state){\r
-           var g = groups[mi.group];\r
-           for(var i = 0, l = g.length; i < l; i++){\r
-               if(g[i] != mi){\r
-                   g[i].setChecked(false);\r
-               }\r
-           }\r
-       }\r
-   }\r
-\r
-   return {\r
-\r
-       \r
-       hideAll : function(){\r
-            hideAll();  \r
-       },\r
-\r
-       // private\r
-       register : function(menu){\r
-           if(!menus){\r
-               init();\r
-           }\r
-           menus[menu.id] = menu;\r
-           menu.on("beforehide", onBeforeHide);\r
-           menu.on("hide", onHide);\r
-           menu.on("beforeshow", onBeforeShow);\r
-           menu.on("show", onShow);\r
-           var g = menu.group;\r
-           if(g && menu.events["checkchange"]){\r
-               if(!groups[g]){\r
-                   groups[g] = [];\r
-               }\r
-               groups[g].push(menu);\r
-               menu.on("checkchange", onCheck);\r
-           }\r
-       },\r
-\r
-        \r
-       get : function(menu){\r
-           if(typeof menu == "string"){ // menu id\r
-               if(!menus){  // not initialized, no menus to return\r
-                   return null;\r
-               }\r
-               return menus[menu];\r
-           }else if(menu.events){  // menu instance\r
-               return menu;\r
-           }else if(typeof menu.length == 'number'){ // array of menu items?\r
-               return new Ext.menu.Menu({items:menu});\r
-           }else{ // otherwise, must be a config\r
-               return new Ext.menu.Menu(menu);\r
-           }\r
-       },\r
-\r
-       // private\r
-       unregister : function(menu){\r
-           delete menus[menu.id];\r
-           menu.un("beforehide", onBeforeHide);\r
-           menu.un("hide", onHide);\r
-           menu.un("beforeshow", onBeforeShow);\r
-           menu.un("show", onShow);\r
-           var g = menu.group;\r
-           if(g && menu.events["checkchange"]){\r
-               groups[g].remove(menu);\r
-               menu.un("checkchange", onCheck);\r
-           }\r
-       },\r
-\r
-       // private\r
-       registerCheckable : function(menuItem){\r
-           var g = menuItem.group;\r
-           if(g){\r
-               if(!groups[g]){\r
-                   groups[g] = [];\r
-               }\r
-               groups[g].push(menuItem);\r
-               menuItem.on("beforecheckchange", onBeforeCheck);\r
-           }\r
-       },\r
-\r
-       // private\r
-       unregisterCheckable : function(menuItem){\r
-           var g = menuItem.group;\r
-           if(g){\r
-               groups[g].remove(menuItem);\r
-               menuItem.un("beforecheckchange", onBeforeCheck);\r
-           }\r
-       },\r
-\r
-       getCheckedItem : function(groupId){\r
-           var g = groups[groupId];\r
-           if(g){\r
-               for(var i = 0, l = g.length; i < l; i++){\r
-                   if(g[i].checked){\r
-                       return g[i];\r
-                   }\r
-               }\r
-           }\r
-           return null;\r
-       },\r
-\r
-       setCheckedItem : function(groupId, itemId){\r
-           var g = groups[groupId];\r
-           if(g){\r
-               for(var i = 0, l = g.length; i < l; i++){\r
-                   if(g[i].id == itemId){\r
-                       g[i].setChecked(true);\r
-                   }\r
-               }\r
-           }\r
-           return null;\r
-       }\r
-   };\r
-}();\r
-\r
-\r
-Ext.menu.BaseItem = function(config){\r
-    Ext.menu.BaseItem.superclass.constructor.call(this, config);\r
-\r
-    this.addEvents(\r
-        \r
-        'click',\r
-        \r
-        'activate',\r
-        \r
-        'deactivate'\r
-    );\r
-\r
-    if(this.handler){\r
-        this.on("click", this.handler, this.scope);\r
-    }\r
-};\r
-\r
-Ext.extend(Ext.menu.BaseItem, Ext.Component, {\r
-    \r
-    \r
-    \r
-    canActivate : false,\r
-    \r
-    activeClass : "x-menu-item-active",\r
-    \r
-    hideOnClick : true,\r
-    \r
-    hideDelay : 100,\r
-\r
-    // private\r
-    ctype: "Ext.menu.BaseItem",\r
-\r
-    // private\r
-    actionMode : "container",\r
-\r
-    // private\r
-    render : function(container, parentMenu){\r
-        \r
-        this.parentMenu = parentMenu;\r
-        Ext.menu.BaseItem.superclass.render.call(this, container);\r
-        this.container.menuItemId = this.id;\r
-    },\r
-\r
-    // private\r
-    onRender : function(container, position){\r
-        this.el = Ext.get(this.el);\r
-        if(this.id){\r
-            this.el.id = this.id;\r
-        }\r
-        container.dom.appendChild(this.el.dom);\r
-    },\r
-\r
-    \r
-    setHandler : function(handler, scope){\r
-        if(this.handler){\r
-            this.un("click", this.handler, this.scope);\r
-        }\r
-        this.on("click", this.handler = handler, this.scope = scope);\r
-    },\r
-\r
-    // private\r
-    onClick : function(e){\r
-        if(!this.disabled && this.fireEvent("click", this, e) !== false\r
-                && this.parentMenu.fireEvent("itemclick", this, e) !== false){\r
-            this.handleClick(e);\r
-        }else{\r
-            e.stopEvent();\r
-        }\r
-    },\r
-\r
-    // private\r
-    activate : function(){\r
-        if(this.disabled){\r
-            return false;\r
-        }\r
-        var li = this.container;\r
-        li.addClass(this.activeClass);\r
-        this.region = li.getRegion().adjust(2, 2, -2, -2);\r
-        this.fireEvent("activate", this);\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    deactivate : function(){\r
-        this.container.removeClass(this.activeClass);\r
-        this.fireEvent("deactivate", this);\r
-    },\r
-\r
-    // private\r
-    shouldDeactivate : function(e){\r
-        return !this.region || !this.region.contains(e.getPoint());\r
-    },\r
-\r
-    // private\r
-    handleClick : function(e){\r
-        if(this.hideOnClick){\r
-            this.parentMenu.hide.defer(this.hideDelay, this.parentMenu, [true]);\r
-        }\r
-    },\r
-\r
-    // private\r
-    expandMenu : function(autoActivate){\r
-        // do nothing\r
-    },\r
-\r
-    // private\r
-    hideMenu : function(){\r
-        // do nothing\r
-    }\r
-});\r
-\r
-Ext.menu.TextItem = function(cfg){\r
-    if(typeof cfg == 'string'){\r
-        cfg = {text: cfg}\r
-    }\r
-    Ext.menu.TextItem.superclass.constructor.call(this, cfg);\r
-};\r
-\r
-Ext.extend(Ext.menu.TextItem, Ext.menu.BaseItem, {\r
-    \r
-    \r
-    hideOnClick : false,\r
-    \r
-    itemCls : "x-menu-text",\r
-\r
-    // private\r
-    onRender : function(){\r
-        var s = document.createElement("span");\r
-        s.className = this.itemCls;\r
-        s.innerHTML = this.text;\r
-        this.el = s;\r
-        Ext.menu.TextItem.superclass.onRender.apply(this, arguments);\r
-    }\r
-});\r
-\r
-Ext.menu.Separator = function(config){\r
-    Ext.menu.Separator.superclass.constructor.call(this, config);\r
-};\r
-\r
-Ext.extend(Ext.menu.Separator, Ext.menu.BaseItem, {\r
-    \r
-    itemCls : "x-menu-sep",\r
-    \r
-    hideOnClick : false,\r
-\r
-    // private\r
-    onRender : function(li){\r
-        var s = document.createElement("span");\r
-        s.className = this.itemCls;\r
-        s.innerHTML = "&#160;";\r
-        this.el = s;\r
-        li.addClass("x-menu-sep-li");\r
-        Ext.menu.Separator.superclass.onRender.apply(this, arguments);\r
-    }\r
-});\r
-\r
-Ext.menu.Item = function(config){\r
-    Ext.menu.Item.superclass.constructor.call(this, config);\r
-    if(this.menu){\r
-        this.menu = Ext.menu.MenuMgr.get(this.menu);\r
-    }\r
-};\r
-Ext.extend(Ext.menu.Item, Ext.menu.BaseItem, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    itemCls : "x-menu-item",\r
-    \r
-    canActivate : true,\r
-    \r
-    showDelay: 200,\r
-    // doc'd in BaseItem\r
-    hideDelay: 200,\r
-\r
-    // private\r
-    ctype: "Ext.menu.Item",\r
-\r
-    // private\r
-    onRender : function(container, position){\r
-        var el = document.createElement("a");\r
-        el.hideFocus = true;\r
-        el.unselectable = "on";\r
-        el.href = this.href || "#";\r
-        if(this.hrefTarget){\r
-            el.target = this.hrefTarget;\r
-        }\r
-        el.className = this.itemCls + (this.menu ?  " x-menu-item-arrow" : "") + (this.cls ?  " " + this.cls : "");\r
-        el.innerHTML = String.format(\r
-                '<img src="{0}" class="x-menu-item-icon {2}" />{1}',\r
-                this.icon || Ext.BLANK_IMAGE_URL, this.itemText||this.text, this.iconCls || '');\r
-        this.el = el;\r
-        Ext.menu.Item.superclass.onRender.call(this, container, position);\r
-    },\r
-\r
-    \r
-    setText : function(text){\r
-        this.text = text;\r
-        if(this.rendered){\r
-            this.el.update(String.format(\r
-                '<img src="{0}" class="x-menu-item-icon {2}">{1}',\r
-                this.icon || Ext.BLANK_IMAGE_URL, this.text, this.iconCls || ''));\r
-            this.parentMenu.autoWidth();\r
-        }\r
-    },\r
-\r
-    \r
-    setIconClass : function(cls){\r
-        var oldCls = this.iconCls;\r
-        this.iconCls = cls;\r
-        if(this.rendered){\r
-            this.el.child('img.x-menu-item-icon').replaceClass(oldCls, this.iconCls);\r
-        }\r
-    },\r
-    \r
-    //private\r
-    beforeDestroy: function(){\r
-        if (this.menu){\r
-            this.menu.destroy();\r
-        }\r
-        Ext.menu.Item.superclass.beforeDestroy.call(this);\r
-    },\r
-\r
-    // private\r
-    handleClick : function(e){\r
-        if(!this.href){ // if no link defined, stop the event automatically\r
-            e.stopEvent();\r
-        }\r
-        Ext.menu.Item.superclass.handleClick.apply(this, arguments);\r
-    },\r
-\r
-    // private\r
-    activate : function(autoExpand){\r
-        if(Ext.menu.Item.superclass.activate.apply(this, arguments)){\r
-            this.focus();\r
-            if(autoExpand){\r
-                this.expandMenu();\r
-            }\r
-        }\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    shouldDeactivate : function(e){\r
-        if(Ext.menu.Item.superclass.shouldDeactivate.call(this, e)){\r
-            if(this.menu && this.menu.isVisible()){\r
-                return !this.menu.getEl().getRegion().contains(e.getPoint());\r
-            }\r
-            return true;\r
-        }\r
-        return false;\r
-    },\r
-\r
-    // private\r
-    deactivate : function(){\r
-        Ext.menu.Item.superclass.deactivate.apply(this, arguments);\r
-        this.hideMenu();\r
-    },\r
-\r
-    // private\r
-    expandMenu : function(autoActivate){\r
-        if(!this.disabled && this.menu){\r
-            clearTimeout(this.hideTimer);\r
-            delete this.hideTimer;\r
-            if(!this.menu.isVisible() && !this.showTimer){\r
-                this.showTimer = this.deferExpand.defer(this.showDelay, this, [autoActivate]);\r
-            }else if (this.menu.isVisible() && autoActivate){\r
-                this.menu.tryActivate(0, 1);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    deferExpand : function(autoActivate){\r
-        delete this.showTimer;\r
-        this.menu.show(this.container, this.parentMenu.subMenuAlign || "tl-tr?", this.parentMenu);\r
-        if(autoActivate){\r
-            this.menu.tryActivate(0, 1);\r
-        }\r
-    },\r
-\r
-    // private\r
-    hideMenu : function(){\r
-        clearTimeout(this.showTimer);\r
-        delete this.showTimer;\r
-        if(!this.hideTimer && this.menu && this.menu.isVisible()){\r
-            this.hideTimer = this.deferHide.defer(this.hideDelay, this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    deferHide : function(){\r
-        delete this.hideTimer;\r
-        if(this.menu.over){\r
-            this.parentMenu.setActiveItem(this, false);\r
-        }else{\r
-            this.menu.hide();\r
-        }\r
-    }\r
-});\r
-\r
-Ext.menu.CheckItem = function(config){\r
-    Ext.menu.CheckItem.superclass.constructor.call(this, config);\r
-    this.addEvents(\r
-        \r
-        "beforecheckchange" ,\r
-        \r
-        "checkchange"\r
-    );\r
-    \r
-    if(this.checkHandler){\r
-        this.on('checkchange', this.checkHandler, this.scope);\r
-    }\r
-    Ext.menu.MenuMgr.registerCheckable(this);\r
-};\r
-Ext.extend(Ext.menu.CheckItem, Ext.menu.Item, {\r
-    \r
-    \r
-    itemCls : "x-menu-item x-menu-check-item",\r
-    \r
-    groupClass : "x-menu-group-item",\r
-\r
-    \r
-    checked: false,\r
-\r
-    // private\r
-    ctype: "Ext.menu.CheckItem",\r
-\r
-    // private\r
-    onRender : function(c){\r
-        Ext.menu.CheckItem.superclass.onRender.apply(this, arguments);\r
-        if(this.group){\r
-            this.el.addClass(this.groupClass);\r
-        }\r
-        if(this.checked){\r
-            this.checked = false;\r
-            this.setChecked(true, true);\r
-        }\r
-    },\r
-\r
-    // private\r
-    destroy : function(){\r
-        Ext.menu.MenuMgr.unregisterCheckable(this);\r
-        Ext.menu.CheckItem.superclass.destroy.apply(this, arguments);\r
-    },\r
-\r
-    \r
-    setChecked : function(state, suppressEvent){\r
-        if(this.checked != state && this.fireEvent("beforecheckchange", this, state) !== false){\r
-            if(this.container){\r
-                this.container[state ? "addClass" : "removeClass"]("x-menu-item-checked");\r
-            }\r
-            this.checked = state;\r
-            if(suppressEvent !== true){\r
-                this.fireEvent("checkchange", this, state);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    handleClick : function(e){\r
-       if(!this.disabled && !(this.checked && this.group)){// disable unselect on radio item\r
-           this.setChecked(!this.checked);\r
-       }\r
-       Ext.menu.CheckItem.superclass.handleClick.apply(this, arguments);\r
-    }\r
-});\r
-\r
-Ext.menu.Adapter = function(component, config){\r
-    Ext.menu.Adapter.superclass.constructor.call(this, config);\r
-    this.component = component;\r
-};\r
-Ext.extend(Ext.menu.Adapter, Ext.menu.BaseItem, {\r
-    // private\r
-    canActivate : true,\r
-\r
-    // private\r
-    onRender : function(container, position){\r
-        this.component.render(container);\r
-        this.el = this.component.getEl();\r
-    },\r
-\r
-    // private\r
-    activate : function(){\r
-        if(this.disabled){\r
-            return false;\r
-        }\r
-        this.component.focus();\r
-        this.fireEvent("activate", this);\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    deactivate : function(){\r
-        this.fireEvent("deactivate", this);\r
-    },\r
-\r
-    // private\r
-    disable : function(){\r
-        this.component.disable();\r
-        Ext.menu.Adapter.superclass.disable.call(this);\r
-    },\r
-\r
-    // private\r
-    enable : function(){\r
-        this.component.enable();\r
-        Ext.menu.Adapter.superclass.enable.call(this);\r
-    }\r
-});\r
-\r
-Ext.menu.DateItem = function(config){\r
-    Ext.menu.DateItem.superclass.constructor.call(this, new Ext.DatePicker(config), config);\r
-    \r
-    this.picker = this.component;\r
-    this.addEvents('select');\r
-    \r
-    this.picker.on("render", function(picker){\r
-        picker.getEl().swallowEvent("click");\r
-        picker.container.addClass("x-menu-date-item");\r
-    });\r
-\r
-    this.picker.on("select", this.onSelect, this);\r
-};\r
-\r
-Ext.extend(Ext.menu.DateItem, Ext.menu.Adapter, {\r
-    // private\r
-    onSelect : function(picker, date){\r
-        this.fireEvent("select", this, date, picker);\r
-        Ext.menu.DateItem.superclass.handleClick.call(this);\r
-    }\r
-});\r
-\r
-Ext.menu.ColorItem = function(config){\r
-    Ext.menu.ColorItem.superclass.constructor.call(this, new Ext.ColorPalette(config), config);\r
-    \r
-    this.palette = this.component;\r
-    this.relayEvents(this.palette, ["select"]);\r
-    if(this.selectHandler){\r
-        this.on('select', this.selectHandler, this.scope);\r
-    }\r
-};\r
-Ext.extend(Ext.menu.ColorItem, Ext.menu.Adapter);\r
-\r
-Ext.menu.DateMenu = function(config){\r
-    Ext.menu.DateMenu.superclass.constructor.call(this, config);\r
-    this.plain = true;\r
-    var di = new Ext.menu.DateItem(config);\r
-    this.add(di);\r
-    \r
-    this.picker = di.picker;\r
-    \r
-    this.relayEvents(di, ["select"]);\r
-\r
-    this.on('beforeshow', function(){\r
-        if(this.picker){\r
-            this.picker.hideMonthPicker(true);\r
-        }\r
-    }, this);\r
-};\r
-Ext.extend(Ext.menu.DateMenu, Ext.menu.Menu, {\r
-    cls:'x-date-menu',\r
-\r
-    // private\r
-    beforeDestroy : function() {\r
-        this.picker.destroy();\r
-    }\r
-});\r
-\r
-Ext.menu.ColorMenu = function(config){\r
-    Ext.menu.ColorMenu.superclass.constructor.call(this, config);\r
-    this.plain = true;\r
-    var ci = new Ext.menu.ColorItem(config);\r
-    this.add(ci);\r
-    \r
-    this.palette = ci.palette;\r
-    \r
-    this.relayEvents(ci, ["select"]);\r
-};\r
-Ext.extend(Ext.menu.ColorMenu, Ext.menu.Menu, {\r
-    //private\r
-    beforeDestroy: function(){\r
-        this.palette.destroy();\r
-    }\r
-});\r
-\r
-Ext.form.Field = Ext.extend(Ext.BoxComponent,  {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-    \r
-    invalidClass : "x-form-invalid",\r
-    \r
-    invalidText : "The value in this field is invalid",\r
-    \r
-    focusClass : "x-form-focus",\r
-    \r
-    validationEvent : "keyup",\r
-    \r
-    validateOnBlur : true,\r
-    \r
-    validationDelay : 250,\r
-    \r
-    defaultAutoCreate : {tag: "input", type: "text", size: "20", autocomplete: "off"},\r
-    \r
-    fieldClass : "x-form-field",\r
-    \r
-    msgTarget : 'qtip',\r
-    \r
-    msgFx : 'normal',\r
-    \r
-    readOnly : false,\r
-    \r
-    disabled : false,\r
-\r
-    // private\r
-    isFormField : true,\r
-\r
-    // private\r
-    hasFocus : false,\r
-\r
-       // private\r
-       initComponent : function(){\r
-        Ext.form.Field.superclass.initComponent.call(this);\r
-        this.addEvents(\r
-            \r
-            'focus',\r
-            \r
-            'blur',\r
-            \r
-            'specialkey',\r
-            \r
-            'change',\r
-            \r
-            'invalid',\r
-            \r
-            'valid'\r
-        );\r
-    },\r
-\r
-    \r
-    getName: function(){\r
-         return this.rendered && this.el.dom.name ? this.el.dom.name : (this.hiddenName || '');\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        Ext.form.Field.superclass.onRender.call(this, ct, position);\r
-        if(!this.el){\r
-            var cfg = this.getAutoCreate();\r
-            if(!cfg.name){\r
-                cfg.name = this.name || this.id;\r
-            }\r
-            if(this.inputType){\r
-                cfg.type = this.inputType;\r
-            }\r
-            this.el = ct.createChild(cfg, position);\r
-        }\r
-        var type = this.el.dom.type;\r
-        if(type){\r
-            if(type == 'password'){\r
-                type = 'text';\r
-            }\r
-            this.el.addClass('x-form-'+type);\r
-        }\r
-        if(this.readOnly){\r
-            this.el.dom.readOnly = true;\r
-        }\r
-        if(this.tabIndex !== undefined){\r
-            this.el.dom.setAttribute('tabIndex', this.tabIndex);\r
-        }\r
-\r
-        this.el.addClass([this.fieldClass, this.cls]);\r
-    },\r
-\r
-    // private\r
-    initValue : function(){\r
-        if(this.value !== undefined){\r
-            this.setValue(this.value);\r
-        }else if(this.el.dom.value.length > 0 && this.el.dom.value != this.emptyText){\r
-            this.setValue(this.el.dom.value);\r
-        }\r
-        // reference to original value for reset\r
-        this.originalValue = this.getValue();\r
-    },\r
-\r
-    \r
-    isDirty : function() {\r
-        if(this.disabled) {\r
-            return false;\r
-        }\r
-        return String(this.getValue()) !== String(this.originalValue);\r
-    },\r
-\r
-    // private\r
-    afterRender : function(){\r
-        Ext.form.Field.superclass.afterRender.call(this);\r
-        this.initEvents();\r
-        this.initValue();\r
-    },\r
-\r
-    // private\r
-    fireKey : function(e){\r
-        if(e.isSpecialKey()){\r
-            this.fireEvent("specialkey", this, e);\r
-        }\r
-    },\r
-\r
-    \r
-    reset : function(){\r
-        this.setValue(this.originalValue);\r
-        this.clearInvalid();\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        this.el.on(Ext.isIE || Ext.isSafari3 ? "keydown" : "keypress", this.fireKey,  this);\r
-        this.el.on("focus", this.onFocus,  this);\r
-\r
-        // fix weird FF/Win editor issue when changing OS window focus\r
-        var o = this.inEditor && Ext.isWindows && Ext.isGecko ? {buffer:10} : null;\r
-        this.el.on("blur", this.onBlur,  this, o);\r
-    },\r
-\r
-    // private\r
-    onFocus : function(){\r
-        if(this.focusClass){\r
-            this.el.addClass(this.focusClass);\r
-        }\r
-        if(!this.hasFocus){\r
-            this.hasFocus = true;\r
-            this.startValue = this.getValue();\r
-            this.fireEvent("focus", this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    beforeBlur : Ext.emptyFn,\r
-\r
-    // private\r
-    onBlur : function(){\r
-        this.beforeBlur();\r
-        if(this.focusClass){\r
-            this.el.removeClass(this.focusClass);\r
-        }\r
-        this.hasFocus = false;\r
-        if(this.validationEvent !== false && this.validateOnBlur && this.validationEvent != "blur"){\r
-            this.validate();\r
-        }\r
-        var v = this.getValue();\r
-        if(String(v) !== String(this.startValue)){\r
-            this.fireEvent('change', this, v, this.startValue);\r
-        }\r
-        this.fireEvent("blur", this);\r
-    },\r
-\r
-    \r
-    isValid : function(preventMark){\r
-        if(this.disabled){\r
-            return true;\r
-        }\r
-        var restore = this.preventMark;\r
-        this.preventMark = preventMark === true;\r
-        var v = this.validateValue(this.processValue(this.getRawValue()));\r
-        this.preventMark = restore;\r
-        return v;\r
-    },\r
-\r
-    \r
-    validate : function(){\r
-        if(this.disabled || this.validateValue(this.processValue(this.getRawValue()))){\r
-            this.clearInvalid();\r
-            return true;\r
-        }\r
-        return false;\r
-    },\r
-\r
-    // protected - should be overridden by subclasses if necessary to prepare raw values for validation\r
-    processValue : function(value){\r
-        return value;\r
-    },\r
-\r
-    // private\r
-    // Subclasses should provide the validation implementation by overriding this\r
-    validateValue : function(value){\r
-        return true;\r
-    },\r
-\r
-    \r
-    markInvalid : function(msg){\r
-        if(!this.rendered || this.preventMark){ // not rendered\r
-            return;\r
-        }\r
-        this.el.addClass(this.invalidClass);\r
-        msg = msg || this.invalidText;\r
-\r
-        switch(this.msgTarget){\r
-            case 'qtip':\r
-                this.el.dom.qtip = msg;\r
-                this.el.dom.qclass = 'x-form-invalid-tip';\r
-                if(Ext.QuickTips){ // fix for floating editors interacting with DND\r
-                    Ext.QuickTips.enable();\r
-                }\r
-                break;\r
-            case 'title':\r
-                this.el.dom.title = msg;\r
-                break;\r
-            case 'under':\r
-                if(!this.errorEl){\r
-                    var elp = this.getErrorCt();\r
-                    if(!elp){ // field has no container el\r
-                        this.el.dom.title = msg;\r
-                        break;\r
-                    }\r
-                    this.errorEl = elp.createChild({cls:'x-form-invalid-msg'});\r
-                    this.errorEl.setWidth(elp.getWidth(true)-20);\r
-                }\r
-                this.errorEl.update(msg);\r
-                Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this);\r
-                break;\r
-            case 'side':\r
-                if(!this.errorIcon){\r
-                    var elp = this.getErrorCt();\r
-                    if(!elp){ // field has no container el\r
-                        this.el.dom.title = msg;\r
-                        break;\r
-                    }\r
-                    this.errorIcon = elp.createChild({cls:'x-form-invalid-icon'});\r
-                }\r
-                this.alignErrorIcon();\r
-                this.errorIcon.dom.qtip = msg;\r
-                this.errorIcon.dom.qclass = 'x-form-invalid-tip';\r
-                this.errorIcon.show();\r
-                this.on('resize', this.alignErrorIcon, this);\r
-                break;\r
-            default:\r
-                var t = Ext.getDom(this.msgTarget);\r
-                t.innerHTML = msg;\r
-                t.style.display = this.msgDisplay;\r
-                break;\r
-        }\r
-        this.fireEvent('invalid', this, msg);\r
-    },\r
-\r
-    // private\r
-    getErrorCt : function(){\r
-        return this.el.findParent('.x-form-element', 5, true) || // use form element wrap if available\r
-            this.el.findParent('.x-form-field-wrap', 5, true);   // else direct field wrap\r
-    },\r
-\r
-    // private\r
-    alignErrorIcon : function(){\r
-        this.errorIcon.alignTo(this.el, 'tl-tr', [2, 0]);\r
-    },\r
-\r
-    \r
-    clearInvalid : function(){\r
-        if(!this.rendered || this.preventMark){ // not rendered\r
-            return;\r
-        }\r
-        this.el.removeClass(this.invalidClass);\r
-        switch(this.msgTarget){\r
-            case 'qtip':\r
-                this.el.dom.qtip = '';\r
-                break;\r
-            case 'title':\r
-                this.el.dom.title = '';\r
-                break;\r
-            case 'under':\r
-                if(this.errorEl){\r
-                    Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this);\r
-                }\r
-                break;\r
-            case 'side':\r
-                if(this.errorIcon){\r
-                    this.errorIcon.dom.qtip = '';\r
-                    this.errorIcon.hide();\r
-                    this.un('resize', this.alignErrorIcon, this);\r
-                }\r
-                break;\r
-            default:\r
-                var t = Ext.getDom(this.msgTarget);\r
-                t.innerHTML = '';\r
-                t.style.display = 'none';\r
-                break;\r
-        }\r
-        this.fireEvent('valid', this);\r
-    },\r
-\r
-    \r
-    getRawValue : function(){\r
-        var v = this.rendered ? this.el.getValue() : Ext.value(this.value, '');\r
-        if(v === this.emptyText){\r
-            v = '';\r
-        }\r
-        return v;\r
-    },\r
-\r
-    \r
-    getValue : function(){\r
-        if(!this.rendered) {\r
-            return this.value;\r
-        }\r
-        var v = this.el.getValue();\r
-        if(v === this.emptyText || v === undefined){\r
-            v = '';\r
-        }\r
-        return v;\r
-    },\r
-\r
-    \r
-    setRawValue : function(v){\r
-        return this.el.dom.value = (v === null || v === undefined ? '' : v);\r
-    },\r
-\r
-    \r
-    setValue : function(v){\r
-        this.value = v;\r
-        if(this.rendered){\r
-            this.el.dom.value = (v === null || v === undefined ? '' : v);\r
-            this.validate();\r
-        }\r
-    },\r
-\r
-    // private\r
-    adjustSize : function(w, h){\r
-        var s = Ext.form.Field.superclass.adjustSize.call(this, w, h);\r
-        s.width = this.adjustWidth(this.el.dom.tagName, s.width);\r
-        return s;\r
-    },\r
-\r
-    // private\r
-    adjustWidth : function(tag, w){\r
-        tag = tag.toLowerCase();\r
-        if(typeof w == 'number' && !Ext.isSafari){\r
-            if(Ext.isIE && (tag == 'input' || tag == 'textarea')){\r
-                if(tag == 'input' && !Ext.isStrict){\r
-                    return this.inEditor ? w : w - 3;\r
-                }\r
-                if(tag == 'input' && Ext.isStrict){\r
-                    return w - (Ext.isIE6 ? 4 : 1);\r
-                }\r
-                if(tag == 'textarea' && Ext.isStrict){\r
-                    return w-2;\r
-                }\r
-            }else if(Ext.isOpera && Ext.isStrict){\r
-                if(tag == 'input'){\r
-                    return w + 2;\r
-                }\r
-                if(tag == 'textarea'){\r
-                    return w-2;\r
-                }\r
-            }\r
-        }\r
-        return w;\r
-    }\r
-\r
-    \r
-    \r
-\r
-    \r
-});\r
-\r
-Ext.form.MessageTargets = {\r
-    'qtip' : {\r
-        mark: function(f){\r
-            this.el.dom.qtip = msg;\r
-            this.el.dom.qclass = 'x-form-invalid-tip';\r
-            if(Ext.QuickTips){ // fix for floating editors interacting with DND\r
-                Ext.QuickTips.enable();\r
-            }\r
-        },\r
-        clear: function(f){\r
-            this.el.dom.qtip = '';\r
-        }\r
-    },\r
-    'title' : {\r
-        mark: function(f){\r
-            this.el.dom.title = msg;\r
-        },\r
-        clear: function(f){\r
-            this.el.dom.title = '';\r
-        }\r
-    },\r
-    'under' : {\r
-        mark: function(f){\r
-            if(!this.errorEl){\r
-                var elp = this.getErrorCt();\r
-                if(!elp){ // field has no container el\r
-                    this.el.dom.title = msg;\r
-                    return;\r
-                }\r
-                this.errorEl = elp.createChild({cls:'x-form-invalid-msg'});\r
-                this.errorEl.setWidth(elp.getWidth(true)-20);\r
-            }\r
-            this.errorEl.update(msg);\r
-            Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this);\r
-        },\r
-        clear: function(f){\r
-            if(this.errorEl){\r
-                Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this);\r
-            }else{\r
-                this.el.dom.title = '';\r
-            }\r
-        }\r
-    },\r
-    'side' : {\r
-        mark: function(f){\r
-            if(!this.errorIcon){\r
-                var elp = this.getErrorCt();\r
-                if(!elp){ // field has no container el\r
-                    this.el.dom.title = msg;\r
-                    return;\r
-                }\r
-                this.errorIcon = elp.createChild({cls:'x-form-invalid-icon'});\r
-            }\r
-            this.alignErrorIcon();\r
-            this.errorIcon.dom.qtip = msg;\r
-            this.errorIcon.dom.qclass = 'x-form-invalid-tip';\r
-            this.errorIcon.show();\r
-            this.on('resize', this.alignErrorIcon, this);\r
-        },\r
-        clear: function(f){\r
-            if(this.errorIcon){\r
-                this.errorIcon.dom.qtip = '';\r
-                this.errorIcon.hide();\r
-                this.un('resize', this.alignErrorIcon, this);\r
-            }else{\r
-                this.el.dom.title = '';\r
-            }\r
-        }\r
-    },\r
-    'around' : {\r
-        mark: function(f){\r
-\r
-        },\r
-        clear: function(f){\r
-\r
-        }\r
-    }\r
-};\r
-\r
-\r
-// anything other than normal should be considered experimental\r
-Ext.form.Field.msgFx = {\r
-    normal : {\r
-        show: function(msgEl, f){\r
-            msgEl.setDisplayed('block');\r
-        },\r
-\r
-        hide : function(msgEl, f){\r
-            msgEl.setDisplayed(false).update('');\r
-        }\r
-    },\r
-\r
-    slide : {\r
-        show: function(msgEl, f){\r
-            msgEl.slideIn('t', {stopFx:true});\r
-        },\r
-\r
-        hide : function(msgEl, f){\r
-            msgEl.slideOut('t', {stopFx:true,useDisplay:true});\r
-        }\r
-    },\r
-\r
-    slideRight : {\r
-        show: function(msgEl, f){\r
-            msgEl.fixDisplay();\r
-            msgEl.alignTo(f.el, 'tl-tr');\r
-            msgEl.slideIn('l', {stopFx:true});\r
-        },\r
-\r
-        hide : function(msgEl, f){\r
-            msgEl.slideOut('l', {stopFx:true,useDisplay:true});\r
-        }\r
-    }\r
-};\r
-Ext.reg('field', Ext.form.Field);\r
-\r
-\r
-Ext.form.TextField = Ext.extend(Ext.form.Field,  {\r
-    \r
-    \r
-    \r
-    grow : false,\r
-    \r
-    growMin : 30,\r
-    \r
-    growMax : 800,\r
-    \r
-    vtype : null,\r
-    \r
-    maskRe : null,\r
-    \r
-    disableKeyFilter : false,\r
-    \r
-    allowBlank : true,\r
-    \r
-    minLength : 0,\r
-    \r
-    maxLength : Number.MAX_VALUE,\r
-    \r
-    minLengthText : "The minimum length for this field is {0}",\r
-    \r
-    maxLengthText : "The maximum length for this field is {0}",\r
-    \r
-    selectOnFocus : false,\r
-    \r
-    blankText : "This field is required",\r
-    \r
-    validator : null,\r
-    \r
-    regex : null,\r
-    \r
-    regexText : "",\r
-    \r
-    emptyText : null,\r
-    \r
-    emptyClass : 'x-form-empty-field',\r
-\r
-    \r
-\r
-    initComponent : function(){\r
-        Ext.form.TextField.superclass.initComponent.call(this);\r
-        this.addEvents(\r
-            \r
-            'autosize',\r
-\r
-            \r
-            'keydown',\r
-            \r
-            'keyup',\r
-            \r
-            'keypress'\r
-        );\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        Ext.form.TextField.superclass.initEvents.call(this);\r
-        if(this.validationEvent == 'keyup'){\r
-            this.validationTask = new Ext.util.DelayedTask(this.validate, this);\r
-            this.el.on('keyup', this.filterValidation, this);\r
-        }\r
-        else if(this.validationEvent !== false){\r
-            this.el.on(this.validationEvent, this.validate, this, {buffer: this.validationDelay});\r
-        }\r
-        if(this.selectOnFocus || this.emptyText){\r
-            this.on("focus", this.preFocus, this);\r
-            this.el.on('mousedown', function(){\r
-                if(!this.hasFocus){\r
-                    this.el.on('mouseup', function(e){\r
-                        e.preventDefault();\r
-                    }, this, {single:true});\r
-                }\r
-            }, this);\r
-            if(this.emptyText){\r
-                this.on('blur', this.postBlur, this);\r
-                this.applyEmptyText();\r
-            }\r
-        }\r
-        if(this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype+'Mask']))){\r
-            this.el.on("keypress", this.filterKeys, this);\r
-        }\r
-        if(this.grow){\r
-            this.el.on("keyup", this.onKeyUpBuffered,  this, {buffer:50});\r
-            this.el.on("click", this.autoSize,  this);\r
-        }\r
-\r
-        if(this.enableKeyEvents){\r
-            this.el.on("keyup", this.onKeyUp, this);\r
-            this.el.on("keydown", this.onKeyDown, this);\r
-            this.el.on("keypress", this.onKeyPress, this);\r
-        }\r
-    },\r
-\r
-    processValue : function(value){\r
-        if(this.stripCharsRe){\r
-            var newValue = value.replace(this.stripCharsRe, '');\r
-            if(newValue !== value){\r
-                this.setRawValue(newValue);\r
-                return newValue;\r
-            }\r
-        }\r
-        return value;\r
-    },\r
-\r
-    filterValidation : function(e){\r
-        if(!e.isNavKeyPress()){\r
-            this.validationTask.delay(this.validationDelay);\r
-        }\r
-    },\r
-    \r
-    //private\r
-    onDisable: function(){\r
-        Ext.form.TextField.superclass.onDisable.call(this);\r
-        if(Ext.isIE){\r
-            this.el.dom.unselectable = 'on';\r
-        }\r
-    },\r
-    \r
-    //private\r
-    onEnable: function(){\r
-        Ext.form.TextField.superclass.onEnable.call(this);\r
-        if(Ext.isIE){\r
-            this.el.dom.unselectable = '';\r
-        }\r
-    },\r
-\r
-    // private\r
-    onKeyUpBuffered : function(e){\r
-        if(!e.isNavKeyPress()){\r
-            this.autoSize();\r
-        }\r
-    },\r
-\r
-    // private\r
-    onKeyUp : function(e){\r
-        this.fireEvent('keyup', this, e);\r
-    },\r
-\r
-    // private\r
-    onKeyDown : function(e){\r
-        this.fireEvent('keydown', this, e);\r
-    },\r
-\r
-    // private\r
-    onKeyPress : function(e){\r
-        this.fireEvent('keypress', this, e);\r
-    },\r
-\r
-    \r
-    reset : function(){\r
-        Ext.form.TextField.superclass.reset.call(this);\r
-        this.applyEmptyText();\r
-    },\r
-\r
-    applyEmptyText : function(){\r
-        if(this.rendered && this.emptyText && this.getRawValue().length < 1 && !this.hasFocus){\r
-            this.setRawValue(this.emptyText);\r
-            this.el.addClass(this.emptyClass);\r
-        }\r
-    },\r
-\r
-    // private\r
-    preFocus : function(){\r
-        if(this.emptyText){\r
-            if(this.el.dom.value == this.emptyText){\r
-                this.setRawValue('');\r
-            }\r
-            this.el.removeClass(this.emptyClass);\r
-        }\r
-        if(this.selectOnFocus){\r
-            this.el.dom.select();\r
-        }\r
-    },\r
-\r
-    // private\r
-    postBlur : function(){\r
-        this.applyEmptyText();\r
-    },\r
-\r
-    // private\r
-    filterKeys : function(e){\r
-        if(e.ctrlKey){\r
-            return;\r
-        }\r
-        var k = e.getKey();\r
-        if(Ext.isGecko && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){\r
-            return;\r
-        }\r
-        var c = e.getCharCode(), cc = String.fromCharCode(c);\r
-        if(!Ext.isGecko && e.isSpecialKey() && !cc){\r
-            return;\r
-        }\r
-        if(!this.maskRe.test(cc)){\r
-            e.stopEvent();\r
-        }\r
-    },\r
-\r
-    setValue : function(v){\r
-        if(this.emptyText && this.el && v !== undefined && v !== null && v !== ''){\r
-            this.el.removeClass(this.emptyClass);\r
-        }\r
-        Ext.form.TextField.superclass.setValue.apply(this, arguments);\r
-        this.applyEmptyText();\r
-        this.autoSize();\r
-    },\r
-\r
-    \r
-    validateValue : function(value){\r
-        if(value.length < 1 || value === this.emptyText){ // if it's blank\r
-             if(this.allowBlank){\r
-                 this.clearInvalid();\r
-                 return true;\r
-             }else{\r
-                 this.markInvalid(this.blankText);\r
-                 return false;\r
-             }\r
-        }\r
-        if(value.length < this.minLength){\r
-            this.markInvalid(String.format(this.minLengthText, this.minLength));\r
-            return false;\r
-        }\r
-        if(value.length > this.maxLength){\r
-            this.markInvalid(String.format(this.maxLengthText, this.maxLength));\r
-            return false;\r
-        }\r
-        if(this.vtype){\r
-            var vt = Ext.form.VTypes;\r
-            if(!vt[this.vtype](value, this)){\r
-                this.markInvalid(this.vtypeText || vt[this.vtype +'Text']);\r
-                return false;\r
-            }\r
-        }\r
-        if(typeof this.validator == "function"){\r
-            var msg = this.validator(value);\r
-            if(msg !== true){\r
-                this.markInvalid(msg);\r
-                return false;\r
-            }\r
-        }\r
-        if(this.regex && !this.regex.test(value)){\r
-            this.markInvalid(this.regexText);\r
-            return false;\r
-        }\r
-        return true;\r
-    },\r
-\r
-    \r
-    selectText : function(start, end){\r
-        var v = this.getRawValue();\r
-        var doFocus = false;\r
-        if(v.length > 0){\r
-            start = start === undefined ? 0 : start;\r
-            end = end === undefined ? v.length : end;\r
-            var d = this.el.dom;\r
-            if(d.setSelectionRange){\r
-                d.setSelectionRange(start, end);\r
-            }else if(d.createTextRange){\r
-                var range = d.createTextRange();\r
-                range.moveStart("character", start);\r
-                range.moveEnd("character", end-v.length);\r
-                range.select();\r
-            }\r
-            doFocus = Ext.isGecko || Ext.isOpera;\r
-        }else{\r
-            doFocus = true;\r
-        }\r
-        if(doFocus){\r
-            this.focus();\r
-        }\r
-    },\r
-\r
-    \r
-    autoSize : function(){\r
-        if(!this.grow || !this.rendered){\r
-            return;\r
-        }\r
-        if(!this.metrics){\r
-            this.metrics = Ext.util.TextMetrics.createInstance(this.el);\r
-        }\r
-        var el = this.el;\r
-        var v = el.dom.value;\r
-        var d = document.createElement('div');\r
-        d.appendChild(document.createTextNode(v));\r
-        v = d.innerHTML;\r
-        Ext.removeNode(d);\r
-        d = null;\r
-        v += "&#160;";\r
-        var w = Math.min(this.growMax, Math.max(this.metrics.getWidth(v) +  10, this.growMin));\r
-        this.el.setWidth(w);\r
-        this.fireEvent("autosize", this, w);\r
-    }\r
-});\r
-Ext.reg('textfield', Ext.form.TextField);\r
-\r
-\r
-Ext.form.TriggerField = Ext.extend(Ext.form.TextField,  {\r
-    \r
-    \r
-    defaultAutoCreate : {tag: "input", type: "text", size: "16", autocomplete: "off"},\r
-    \r
-    hideTrigger:false,\r
-\r
-    \r
-    autoSize: Ext.emptyFn,\r
-    // private\r
-    monitorTab : true,\r
-    // private\r
-    deferHeight : true,\r
-    // private\r
-    mimicing : false,\r
-\r
-    // private\r
-    onResize : function(w, h){\r
-        Ext.form.TriggerField.superclass.onResize.call(this, w, h);\r
-        if(typeof w == 'number'){\r
-            this.el.setWidth(this.adjustWidth('input', w - this.trigger.getWidth()));\r
-        }\r
-        this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth());\r
-    },\r
-\r
-    // private\r
-    adjustSize : Ext.BoxComponent.prototype.adjustSize,\r
-\r
-    // private\r
-    getResizeEl : function(){\r
-        return this.wrap;\r
-    },\r
-\r
-    // private\r
-    getPositionEl : function(){\r
-        return this.wrap;\r
-    },\r
-\r
-    // private\r
-    alignErrorIcon : function(){\r
-        if(this.wrap){\r
-            this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        Ext.form.TriggerField.superclass.onRender.call(this, ct, position);\r
-        this.wrap = this.el.wrap({cls: "x-form-field-wrap"});\r
-        this.trigger = this.wrap.createChild(this.triggerConfig ||\r
-                {tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger " + this.triggerClass});\r
-        if(this.hideTrigger){\r
-            this.trigger.setDisplayed(false);\r
-        }\r
-        this.initTrigger();\r
-        if(!this.width){\r
-            this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth());\r
-        }\r
-    },\r
-\r
-    afterRender : function(){\r
-        Ext.form.TriggerField.superclass.afterRender.call(this);\r
-        var y;\r
-        if(Ext.isIE && !this.hideTrigger && this.el.getY() != (y = this.trigger.getY())){\r
-            this.el.position();\r
-            this.el.setY(y);\r
-        }\r
-    },\r
-\r
-    // private\r
-    initTrigger : function(){\r
-        this.trigger.on("click", this.onTriggerClick, this, {preventDefault:true});\r
-        this.trigger.addClassOnOver('x-form-trigger-over');\r
-        this.trigger.addClassOnClick('x-form-trigger-click');\r
-    },\r
-\r
-    // private\r
-    onDestroy : function(){\r
-        if(this.trigger){\r
-            this.trigger.removeAllListeners();\r
-            this.trigger.remove();\r
-        }\r
-        if(this.wrap){\r
-            this.wrap.remove();\r
-        }\r
-        Ext.form.TriggerField.superclass.onDestroy.call(this);\r
-    },\r
-\r
-    // private\r
-    onFocus : function(){\r
-        Ext.form.TriggerField.superclass.onFocus.call(this);\r
-        if(!this.mimicing){\r
-            this.wrap.addClass('x-trigger-wrap-focus');\r
-            this.mimicing = true;\r
-            Ext.get(Ext.isIE ? document.body : document).on("mousedown", this.mimicBlur, this, {delay: 10});\r
-            if(this.monitorTab){\r
-                this.el.on("keydown", this.checkTab, this);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    checkTab : function(e){\r
-        if(e.getKey() == e.TAB){\r
-            this.triggerBlur();\r
-        }\r
-    },\r
-\r
-    // private\r
-    onBlur : function(){\r
-        // do nothing\r
-    },\r
-\r
-    // private\r
-    mimicBlur : function(e){\r
-        if(!this.wrap.contains(e.target) && this.validateBlur(e)){\r
-            this.triggerBlur();\r
-        }\r
-    },\r
-\r
-    // private\r
-    triggerBlur : function(){\r
-        this.mimicing = false;\r
-        Ext.get(Ext.isIE ? document.body : document).un("mousedown", this.mimicBlur, this);\r
-        if(this.monitorTab && this.el){\r
-            this.el.un("keydown", this.checkTab, this);\r
-        }\r
-        this.beforeBlur();\r
-        if(this.wrap){\r
-            this.wrap.removeClass('x-trigger-wrap-focus');\r
-        }\r
-        Ext.form.TriggerField.superclass.onBlur.call(this);\r
-    },\r
-\r
-    beforeBlur : Ext.emptyFn, \r
-\r
-    // private\r
-    // This should be overriden by any subclass that needs to check whether or not the field can be blurred.\r
-    validateBlur : function(e){\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    onDisable : function(){\r
-        Ext.form.TriggerField.superclass.onDisable.call(this);\r
-        if(this.wrap){\r
-            this.wrap.addClass(this.disabledClass);\r
-            this.el.removeClass(this.disabledClass);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onEnable : function(){\r
-        Ext.form.TriggerField.superclass.onEnable.call(this);\r
-        if(this.wrap){\r
-            this.wrap.removeClass(this.disabledClass);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onShow : function(){\r
-        if(this.wrap){\r
-            this.wrap.dom.style.display = '';\r
-            this.wrap.dom.style.visibility = 'visible';\r
-        }\r
-    },\r
-\r
-    // private\r
-    onHide : function(){\r
-        this.wrap.dom.style.display = 'none';\r
-    },\r
-\r
-    \r
-    onTriggerClick : Ext.emptyFn\r
-\r
-    \r
-    \r
-    \r
-});\r
-\r
-// TwinTriggerField is not a public class to be used directly.  It is meant as an abstract base class\r
-// to be extended by an implementing class.  For an example of implementing this class, see the custom\r
-// SearchField implementation here: http://extjs.com/deploy/ext/examples/form/custom.html\r
-Ext.form.TwinTriggerField = Ext.extend(Ext.form.TriggerField, {\r
-    initComponent : function(){\r
-        Ext.form.TwinTriggerField.superclass.initComponent.call(this);\r
-\r
-        this.triggerConfig = {\r
-            tag:'span', cls:'x-form-twin-triggers', cn:[\r
-            {tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger " + this.trigger1Class},\r
-            {tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger " + this.trigger2Class}\r
-        ]};\r
-    },\r
-\r
-    getTrigger : function(index){\r
-        return this.triggers[index];\r
-    },\r
-\r
-    initTrigger : function(){\r
-        var ts = this.trigger.select('.x-form-trigger', true);\r
-        this.wrap.setStyle('overflow', 'hidden');\r
-        var triggerField = this;\r
-        ts.each(function(t, all, index){\r
-            t.hide = function(){\r
-                var w = triggerField.wrap.getWidth();\r
-                this.dom.style.display = 'none';\r
-                triggerField.el.setWidth(w-triggerField.trigger.getWidth());\r
-            };\r
-            t.show = function(){\r
-                var w = triggerField.wrap.getWidth();\r
-                this.dom.style.display = '';\r
-                triggerField.el.setWidth(w-triggerField.trigger.getWidth());\r
-            };\r
-            var triggerIndex = 'Trigger'+(index+1);\r
-\r
-            if(this['hide'+triggerIndex]){\r
-                t.dom.style.display = 'none';\r
-            }\r
-            t.on("click", this['on'+triggerIndex+'Click'], this, {preventDefault:true});\r
-            t.addClassOnOver('x-form-trigger-over');\r
-            t.addClassOnClick('x-form-trigger-click');\r
-        }, this);\r
-        this.triggers = ts.elements;\r
-    },\r
-\r
-    onTrigger1Click : Ext.emptyFn,\r
-    onTrigger2Click : Ext.emptyFn\r
-});\r
-Ext.reg('trigger', Ext.form.TriggerField);\r
-\r
-Ext.form.TextArea = Ext.extend(Ext.form.TextField,  {\r
-    \r
-    growMin : 60,\r
-    \r
-    growMax: 1000,\r
-    growAppend : '&#160;\n&#160;',\r
-    growPad : 0,\r
-\r
-    enterIsSpecial : false,\r
-\r
-    \r
-    preventScrollbars: false,\r
-    \r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        if(!this.el){\r
-            this.defaultAutoCreate = {\r
-                tag: "textarea",\r
-                style:"width:100px;height:60px;",\r
-                autocomplete: "off"\r
-            };\r
-        }\r
-        Ext.form.TextArea.superclass.onRender.call(this, ct, position);\r
-        if(this.grow){\r
-            this.textSizeEl = Ext.DomHelper.append(document.body, {\r
-                tag: "pre", cls: "x-form-grow-sizer"\r
-            });\r
-            if(this.preventScrollbars){\r
-                this.el.setStyle("overflow", "hidden");\r
-            }\r
-            this.el.setHeight(this.growMin);\r
-        }\r
-    },\r
-\r
-    onDestroy : function(){\r
-        if(this.textSizeEl){\r
-            Ext.removeNode(this.textSizeEl);\r
-        }\r
-        Ext.form.TextArea.superclass.onDestroy.call(this);\r
-    },\r
-\r
-    fireKey : function(e){\r
-        if(e.isSpecialKey() && (this.enterIsSpecial || (e.getKey() != e.ENTER || e.hasModifier()))){\r
-            this.fireEvent("specialkey", this, e);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onKeyUp : function(e){\r
-        if(!e.isNavKeyPress() || e.getKey() == e.ENTER){\r
-            this.autoSize();\r
-        }\r
-        Ext.form.TextArea.superclass.onKeyUp.call(this, e);\r
-    },\r
-\r
-    \r
-    autoSize : function(){\r
-        if(!this.grow || !this.textSizeEl){\r
-            return;\r
-        }\r
-        var el = this.el;\r
-        var v = el.dom.value;\r
-        var ts = this.textSizeEl;\r
-        ts.innerHTML = '';\r
-        ts.appendChild(document.createTextNode(v));\r
-        v = ts.innerHTML;\r
-\r
-        Ext.fly(ts).setWidth(this.el.getWidth());\r
-        if(v.length < 1){\r
-            v = "&#160;&#160;";\r
-        }else{\r
-            if(Ext.isIE){\r
-                v = v.replace(/\n/g, '<p>&#160;</p>');\r
-            }\r
-            v += this.growAppend;\r
-        }\r
-        ts.innerHTML = v;\r
-        var h = Math.min(this.growMax, Math.max(ts.offsetHeight, this.growMin)+this.growPad);\r
-        if(h != this.lastHeight){\r
-            this.lastHeight = h;\r
-            this.el.setHeight(h);\r
-            this.fireEvent("autosize", this, h);\r
-        }\r
-    }\r
-});\r
-Ext.reg('textarea', Ext.form.TextArea);\r
-\r
-Ext.form.NumberField = Ext.extend(Ext.form.TextField,  {\r
-    \r
-    \r
-    fieldClass: "x-form-field x-form-num-field",\r
-    \r
-    allowDecimals : true,\r
-    \r
-    decimalSeparator : ".",\r
-    \r
-    decimalPrecision : 2,\r
-    \r
-    allowNegative : true,\r
-    \r
-    minValue : Number.NEGATIVE_INFINITY,\r
-    \r
-    maxValue : Number.MAX_VALUE,\r
-    \r
-    minText : "The minimum value for this field is {0}",\r
-    \r
-    maxText : "The maximum value for this field is {0}",\r
-    \r
-    nanText : "{0} is not a valid number",\r
-    \r
-    baseChars : "0123456789",\r
-\r
-    // private\r
-    initEvents : function(){\r
-        Ext.form.NumberField.superclass.initEvents.call(this);\r
-        var allowed = this.baseChars+'';\r
-        if(this.allowDecimals){\r
-            allowed += this.decimalSeparator;\r
-        }\r
-        if(this.allowNegative){\r
-            allowed += "-";\r
-        }\r
-        this.stripCharsRe = new RegExp('[^'+allowed+']', 'gi');\r
-        var keyPress = function(e){\r
-            var k = e.getKey();\r
-            if(!Ext.isIE && (e.isSpecialKey() || k == e.BACKSPACE || k == e.DELETE)){\r
-                return;\r
-            }\r
-            var c = e.getCharCode();\r
-            if(allowed.indexOf(String.fromCharCode(c)) === -1){\r
-                e.stopEvent();\r
-            }\r
-        };\r
-        this.el.on("keypress", keyPress, this);\r
-    },\r
-\r
-    // private\r
-    validateValue : function(value){\r
-        if(!Ext.form.NumberField.superclass.validateValue.call(this, value)){\r
-            return false;\r
-        }\r
-        if(value.length < 1){ // if it's blank and textfield didn't flag it then it's valid\r
-             return true;\r
-        }\r
-        value = String(value).replace(this.decimalSeparator, ".");\r
-        if(isNaN(value)){\r
-            this.markInvalid(String.format(this.nanText, value));\r
-            return false;\r
-        }\r
-        var num = this.parseValue(value);\r
-        if(num < this.minValue){\r
-            this.markInvalid(String.format(this.minText, this.minValue));\r
-            return false;\r
-        }\r
-        if(num > this.maxValue){\r
-            this.markInvalid(String.format(this.maxText, this.maxValue));\r
-            return false;\r
-        }\r
-        return true;\r
-    },\r
-\r
-    getValue : function(){\r
-        return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this)));\r
-    },\r
-\r
-    setValue : function(v){\r
-       v = typeof v == 'number' ? v : parseFloat(String(v).replace(this.decimalSeparator, "."));\r
-        v = isNaN(v) ? '' : String(v).replace(".", this.decimalSeparator);\r
-        Ext.form.NumberField.superclass.setValue.call(this, v);\r
-    },\r
-\r
-    // private\r
-    parseValue : function(value){\r
-        value = parseFloat(String(value).replace(this.decimalSeparator, "."));\r
-        return isNaN(value) ? '' : value;\r
-    },\r
-\r
-    // private\r
-    fixPrecision : function(value){\r
-        var nan = isNaN(value);\r
-        if(!this.allowDecimals || this.decimalPrecision == -1 || nan || !value){\r
-           return nan ? '' : value;\r
-        }\r
-        return parseFloat(parseFloat(value).toFixed(this.decimalPrecision));\r
-    },\r
-\r
-    beforeBlur : function(){\r
-        var v = this.parseValue(this.getRawValue());\r
-        if(v || v === 0){\r
-            this.setValue(this.fixPrecision(v));\r
-        }\r
-    }\r
-});\r
-Ext.reg('numberfield', Ext.form.NumberField);\r
-\r
-Ext.form.DateField = Ext.extend(Ext.form.TriggerField,  {\r
-    \r
-    format : "m/d/Y",\r
-    \r
-    altFormats : "m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d",\r
-    \r
-    disabledDaysText : "Disabled",\r
-    \r
-    disabledDatesText : "Disabled",\r
-    \r
-    minText : "The date in this field must be equal to or after {0}",\r
-    \r
-    maxText : "The date in this field must be equal to or before {0}",\r
-    \r
-    invalidText : "{0} is not a valid date - it must be in the format {1}",\r
-    \r
-    triggerClass : 'x-form-date-trigger',\r
-    \r
-    showToday : true,\r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-    // private\r
-    defaultAutoCreate : {tag: "input", type: "text", size: "10", autocomplete: "off"},\r
-\r
-    initComponent : function(){\r
-        Ext.form.DateField.superclass.initComponent.call(this);\r
-        \r
-        this.addEvents(\r
-            \r
-            'select'\r
-        );\r
-        \r
-        if(typeof this.minValue == "string"){\r
-            this.minValue = this.parseDate(this.minValue);\r
-        }\r
-        if(typeof this.maxValue == "string"){\r
-            this.maxValue = this.parseDate(this.maxValue);\r
-        }\r
-        this.disabledDatesRE = null;\r
-        this.initDisabledDays();\r
-    },\r
-\r
-    // private\r
-    initDisabledDays : function(){\r
-        if(this.disabledDates){\r
-            var dd = this.disabledDates;\r
-            var re = "(?:";\r
-            for(var i = 0; i < dd.length; i++){\r
-                re += dd[i];\r
-                if(i != dd.length-1) re += "|";\r
-            }\r
-            this.disabledDatesRE = new RegExp(re + ")");\r
-        }\r
-    },\r
-\r
-    \r
-    setDisabledDates : function(dd){\r
-        this.disabledDates = dd;\r
-        this.initDisabledDays();\r
-        if(this.menu){\r
-            this.menu.picker.setDisabledDates(this.disabledDatesRE);\r
-        }\r
-    },\r
-\r
-    \r
-    setDisabledDays : function(dd){\r
-        this.disabledDays = dd;\r
-        if(this.menu){\r
-            this.menu.picker.setDisabledDays(dd);\r
-        }\r
-    },\r
-\r
-    \r
-    setMinValue : function(dt){\r
-        this.minValue = (typeof dt == "string" ? this.parseDate(dt) : dt);\r
-        if(this.menu){\r
-            this.menu.picker.setMinDate(this.minValue);\r
-        }\r
-    },\r
-\r
-    \r
-    setMaxValue : function(dt){\r
-        this.maxValue = (typeof dt == "string" ? this.parseDate(dt) : dt);\r
-        if(this.menu){\r
-            this.menu.picker.setMaxDate(this.maxValue);\r
-        }\r
-    },\r
-\r
-    // private\r
-    validateValue : function(value){\r
-        value = this.formatDate(value);\r
-        if(!Ext.form.DateField.superclass.validateValue.call(this, value)){\r
-            return false;\r
-        }\r
-        if(value.length < 1){ // if it's blank and textfield didn't flag it then it's valid\r
-             return true;\r
-        }\r
-        var svalue = value;\r
-        value = this.parseDate(value);\r
-        if(!value){\r
-            this.markInvalid(String.format(this.invalidText, svalue, this.format));\r
-            return false;\r
-        }\r
-        var time = value.getTime();\r
-        if(this.minValue && time < this.minValue.getTime()){\r
-            this.markInvalid(String.format(this.minText, this.formatDate(this.minValue)));\r
-            return false;\r
-        }\r
-        if(this.maxValue && time > this.maxValue.getTime()){\r
-            this.markInvalid(String.format(this.maxText, this.formatDate(this.maxValue)));\r
-            return false;\r
-        }\r
-        if(this.disabledDays){\r
-            var day = value.getDay();\r
-            for(var i = 0; i < this.disabledDays.length; i++) {\r
-               if(day === this.disabledDays[i]){\r
-                   this.markInvalid(this.disabledDaysText);\r
-                    return false;\r
-               }\r
-            }\r
-        }\r
-        var fvalue = this.formatDate(value);\r
-        if(this.disabledDatesRE && this.disabledDatesRE.test(fvalue)){\r
-            this.markInvalid(String.format(this.disabledDatesText, fvalue));\r
-            return false;\r
-        }\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    // Provides logic to override the default TriggerField.validateBlur which just returns true\r
-    validateBlur : function(){\r
-        return !this.menu || !this.menu.isVisible();\r
-    },\r
-\r
-    \r
-    getValue : function(){\r
-        return this.parseDate(Ext.form.DateField.superclass.getValue.call(this)) || "";\r
-    },\r
-\r
-    \r
-    setValue : function(date){\r
-        Ext.form.DateField.superclass.setValue.call(this, this.formatDate(this.parseDate(date)));\r
-    },\r
-\r
-    // private\r
-    parseDate : function(value){\r
-        if(!value || Ext.isDate(value)){\r
-            return value;\r
-        }\r
-        var v = Date.parseDate(value, this.format);\r
-        if(!v && this.altFormats){\r
-            if(!this.altFormatsArray){\r
-                this.altFormatsArray = this.altFormats.split("|");\r
-            }\r
-            for(var i = 0, len = this.altFormatsArray.length; i < len && !v; i++){\r
-                v = Date.parseDate(value, this.altFormatsArray[i]);\r
-            }\r
-        }\r
-        return v;\r
-    },\r
-\r
-    // private\r
-    onDestroy : function(){\r
-        if(this.menu) {\r
-            this.menu.destroy();\r
-        }\r
-        if(this.wrap){\r
-            this.wrap.remove();\r
-        }\r
-        Ext.form.DateField.superclass.onDestroy.call(this);\r
-    },\r
-\r
-    // private\r
-    formatDate : function(date){\r
-        return Ext.isDate(date) ? date.dateFormat(this.format) : date;\r
-    },\r
-\r
-    // private\r
-    menuListeners : {\r
-        select: function(m, d){\r
-            this.setValue(d);\r
-            this.fireEvent('select', this, d);\r
-        },\r
-        show : function(){ // retain focus styling\r
-            this.onFocus();\r
-        },\r
-        hide : function(){\r
-            this.focus.defer(10, this);\r
-            var ml = this.menuListeners;\r
-            this.menu.un("select", ml.select,  this);\r
-            this.menu.un("show", ml.show,  this);\r
-            this.menu.un("hide", ml.hide,  this);\r
-        }\r
-    },\r
-\r
-    \r
-    // private\r
-    // Implements the default empty TriggerField.onTriggerClick function to display the DatePicker\r
-    onTriggerClick : function(){\r
-        if(this.disabled){\r
-            return;\r
-        }\r
-        if(this.menu == null){\r
-            this.menu = new Ext.menu.DateMenu();\r
-        }\r
-        Ext.apply(this.menu.picker,  {\r
-            minDate : this.minValue,\r
-            maxDate : this.maxValue,\r
-            disabledDatesRE : this.disabledDatesRE,\r
-            disabledDatesText : this.disabledDatesText,\r
-            disabledDays : this.disabledDays,\r
-            disabledDaysText : this.disabledDaysText,\r
-            format : this.format,\r
-            showToday : this.showToday,\r
-            minText : String.format(this.minText, this.formatDate(this.minValue)),\r
-            maxText : String.format(this.maxText, this.formatDate(this.maxValue))\r
-        });\r
-        this.menu.on(Ext.apply({}, this.menuListeners, {\r
-            scope:this\r
-        }));\r
-        this.menu.picker.setValue(this.getValue() || new Date());\r
-        this.menu.show(this.el, "tl-bl?");\r
-    },\r
-\r
-    // private\r
-    beforeBlur : function(){\r
-        var v = this.parseDate(this.getRawValue());\r
-        if(v){\r
-            this.setValue(v);\r
-        }\r
-    }\r
-\r
-    \r
-    \r
-    \r
-    \r
-});\r
-Ext.reg('datefield', Ext.form.DateField);\r
-\r
-Ext.form.ComboBox = Ext.extend(Ext.form.TriggerField, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-    // private\r
-    defaultAutoCreate : {tag: "input", type: "text", size: "24", autocomplete: "off"},\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    listClass: '',\r
-    \r
-    selectedClass: 'x-combo-selected',\r
-    \r
-    triggerClass : 'x-form-arrow-trigger',\r
-    \r
-    shadow:'sides',\r
-    \r
-    listAlign: 'tl-bl?',\r
-    \r
-    maxHeight: 300,\r
-    \r
-    minHeight: 90,\r
-    \r
-    triggerAction: 'query',\r
-    \r
-    minChars : 4,\r
-    \r
-    typeAhead: false,\r
-    \r
-    queryDelay: 500,\r
-    \r
-    pageSize: 0,\r
-    \r
-    selectOnFocus:false,\r
-    \r
-    queryParam: 'query',\r
-    \r
-    loadingText: 'Loading...',\r
-    \r
-    resizable: false,\r
-    \r
-    handleHeight : 8,\r
-    \r
-    editable: true,\r
-    \r
-    allQuery: '',\r
-    \r
-    mode: 'remote',\r
-    \r
-    minListWidth : 70,\r
-    \r
-    forceSelection:false,\r
-    \r
-    typeAheadDelay : 250,\r
-    \r
-\r
-    \r
-    lazyInit : true,\r
-\r
-    \r
-\r
-    // private\r
-    initComponent : function(){\r
-        Ext.form.ComboBox.superclass.initComponent.call(this);\r
-        this.addEvents(\r
-            \r
-            'expand',\r
-            \r
-            'collapse',\r
-            \r
-            'beforeselect',\r
-            \r
-            'select',\r
-            \r
-            'beforequery'\r
-        );\r
-        if(this.transform){\r
-            this.allowDomMove = false;\r
-            var s = Ext.getDom(this.transform);\r
-            if(!this.hiddenName){\r
-                this.hiddenName = s.name;\r
-            }\r
-            if(!this.store){\r
-                this.mode = 'local';\r
-                var d = [], opts = s.options;\r
-                for(var i = 0, len = opts.length;i < len; i++){\r
-                    var o = opts[i];\r
-                    var value = (Ext.isIE ? o.getAttributeNode('value').specified : o.hasAttribute('value')) ? o.value : o.text;\r
-                    if(o.selected) {\r
-                        this.value = value;\r
-                    }\r
-                    d.push([value, o.text]);\r
-                }\r
-                this.store = new Ext.data.SimpleStore({\r
-                    'id': 0,\r
-                    fields: ['value', 'text'],\r
-                    data : d\r
-                });\r
-                this.valueField = 'value';\r
-                this.displayField = 'text';\r
-            }\r
-            s.name = Ext.id(); // wipe out the name in case somewhere else they have a reference\r
-            if(!this.lazyRender){\r
-                this.target = true;\r
-                this.el = Ext.DomHelper.insertBefore(s, this.autoCreate || this.defaultAutoCreate);\r
-                Ext.removeNode(s); // remove it\r
-                this.render(this.el.parentNode);\r
-            }else{\r
-                Ext.removeNode(s); // remove it\r
-            }\r
-        }\r
-        //auto-configure store from local array data\r
-        else if(Ext.isArray(this.store)){\r
-            if (Ext.isArray(this.store[0])){\r
-                this.store = new Ext.data.SimpleStore({\r
-                    fields: ['value','text'],\r
-                    data: this.store\r
-                });\r
-                this.valueField = 'value';\r
-            }else{\r
-                this.store = new Ext.data.SimpleStore({\r
-                    fields: ['text'],\r
-                    data: this.store,\r
-                    expandData: true\r
-                });\r
-                this.valueField = 'text';\r
-            }\r
-            this.displayField = 'text';\r
-            this.mode = 'local';\r
-        }\r
-\r
-        this.selectedIndex = -1;\r
-        if(this.mode == 'local'){\r
-            if(this.initialConfig.queryDelay === undefined){\r
-                this.queryDelay = 10;\r
-            }\r
-            if(this.initialConfig.minChars === undefined){\r
-                this.minChars = 0;\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        Ext.form.ComboBox.superclass.onRender.call(this, ct, position);\r
-        if(this.hiddenName){\r
-            this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName,\r
-                    id: (this.hiddenId||this.hiddenName)}, 'before', true);\r
-\r
-            // prevent input submission\r
-            this.el.dom.removeAttribute('name');\r
-        }\r
-        if(Ext.isGecko){\r
-            this.el.dom.setAttribute('autocomplete', 'off');\r
-        }\r
-\r
-        if(!this.lazyInit){\r
-            this.initList();\r
-        }else{\r
-            this.on('focus', this.initList, this, {single: true});\r
-        }\r
-\r
-        if(!this.editable){\r
-            this.editable = true;\r
-            this.setEditable(false);\r
-        }\r
-    },\r
-\r
-    // private\r
-    initValue : function(){\r
-        Ext.form.ComboBox.superclass.initValue.call(this);\r
-        if(this.hiddenField){\r
-            this.hiddenField.value =\r
-                this.hiddenValue !== undefined ? this.hiddenValue :\r
-                this.value !== undefined ? this.value : '';\r
-        }\r
-    },\r
-\r
-    // private\r
-    initList : function(){\r
-        if(!this.list){\r
-            var cls = 'x-combo-list';\r
-\r
-            this.list = new Ext.Layer({\r
-                shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false\r
-            });\r
-\r
-            var lw = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth);\r
-            this.list.setWidth(lw);\r
-            this.list.swallowEvent('mousewheel');\r
-            this.assetHeight = 0;\r
-\r
-            if(this.title){\r
-                this.header = this.list.createChild({cls:cls+'-hd', html: this.title});\r
-                this.assetHeight += this.header.getHeight();\r
-            }\r
-\r
-            this.innerList = this.list.createChild({cls:cls+'-inner'});\r
-            this.innerList.on('mouseover', this.onViewOver, this);\r
-            this.innerList.on('mousemove', this.onViewMove, this);\r
-            this.innerList.setWidth(lw - this.list.getFrameWidth('lr'));\r
-\r
-            if(this.pageSize){\r
-                this.footer = this.list.createChild({cls:cls+'-ft'});\r
-                this.pageTb = new Ext.PagingToolbar({\r
-                    store:this.store,\r
-                    pageSize: this.pageSize,\r
-                    renderTo:this.footer\r
-                });\r
-                this.assetHeight += this.footer.getHeight();\r
-            }\r
-\r
-            if(!this.tpl){\r
-                \r
-                this.tpl = '<tpl for="."><div class="'+cls+'-item">{' + this.displayField + '}</div></tpl>';\r
-                \r
-            }\r
-\r
-            \r
-            this.view = new Ext.DataView({\r
-                applyTo: this.innerList,\r
-                tpl: this.tpl,\r
-                singleSelect: true,\r
-                selectedClass: this.selectedClass,\r
-                itemSelector: this.itemSelector || '.' + cls + '-item'\r
-            });\r
-\r
-            this.view.on('click', this.onViewClick, this);\r
-\r
-            this.bindStore(this.store, true);\r
-\r
-            if(this.resizable){\r
-                this.resizer = new Ext.Resizable(this.list,  {\r
-                   pinned:true, handles:'se'\r
-                });\r
-                this.resizer.on('resize', function(r, w, h){\r
-                    this.maxHeight = h-this.handleHeight-this.list.getFrameWidth('tb')-this.assetHeight;\r
-                    this.listWidth = w;\r
-                    this.innerList.setWidth(w - this.list.getFrameWidth('lr'));\r
-                    this.restrictHeight();\r
-                }, this);\r
-                this[this.pageSize?'footer':'innerList'].setStyle('margin-bottom', this.handleHeight+'px');\r
-            }\r
-        }\r
-    },\r
-    \r
-    \r
-    getStore : function(){\r
-        return this.store;\r
-    },\r
-\r
-    // private\r
-    bindStore : function(store, initial){\r
-        if(this.store && !initial){\r
-            this.store.un('beforeload', this.onBeforeLoad, this);\r
-            this.store.un('load', this.onLoad, this);\r
-            this.store.un('loadexception', this.collapse, this);\r
-            if(!store){\r
-                this.store = null;\r
-                if(this.view){\r
-                    this.view.setStore(null);\r
-                }\r
-            }\r
-        }\r
-        if(store){\r
-            this.store = Ext.StoreMgr.lookup(store);\r
-\r
-            this.store.on('beforeload', this.onBeforeLoad, this);\r
-            this.store.on('load', this.onLoad, this);\r
-            this.store.on('loadexception', this.collapse, this);\r
-\r
-            if(this.view){\r
-                this.view.setStore(store);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        Ext.form.ComboBox.superclass.initEvents.call(this);\r
-\r
-        this.keyNav = new Ext.KeyNav(this.el, {\r
-            "up" : function(e){\r
-                this.inKeyMode = true;\r
-                this.selectPrev();\r
-            },\r
-\r
-            "down" : function(e){\r
-                if(!this.isExpanded()){\r
-                    this.onTriggerClick();\r
-                }else{\r
-                    this.inKeyMode = true;\r
-                    this.selectNext();\r
-                }\r
-            },\r
-\r
-            "enter" : function(e){\r
-                this.onViewClick();\r
-                this.delayedCheck = true;\r
-                this.unsetDelayCheck.defer(10, this);\r
-            },\r
-\r
-            "esc" : function(e){\r
-                this.collapse();\r
-            },\r
-\r
-            "tab" : function(e){\r
-                this.onViewClick(false);\r
-                return true;\r
-            },\r
-\r
-            scope : this,\r
-\r
-            doRelay : function(foo, bar, hname){\r
-                if(hname == 'down' || this.scope.isExpanded()){\r
-                   return Ext.KeyNav.prototype.doRelay.apply(this, arguments);\r
-                }\r
-                return true;\r
-            },\r
-\r
-            forceKeyDown : true\r
-        });\r
-        this.queryDelay = Math.max(this.queryDelay || 10,\r
-                this.mode == 'local' ? 10 : 250);\r
-        this.dqTask = new Ext.util.DelayedTask(this.initQuery, this);\r
-        if(this.typeAhead){\r
-            this.taTask = new Ext.util.DelayedTask(this.onTypeAhead, this);\r
-        }\r
-        if(this.editable !== false){\r
-            this.el.on("keyup", this.onKeyUp, this);\r
-        }\r
-        if(this.forceSelection){\r
-            this.on('blur', this.doForce, this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onDestroy : function(){\r
-        if(this.view){\r
-            Ext.destroy(this.view);\r
-        }\r
-        if(this.list){\r
-            if(this.innerList){\r
-                this.innerList.un('mouseover', this.onViewOver, this);\r
-                this.innerList.un('mousemove', this.onViewMove, this);\r
-            }\r
-            this.list.destroy();\r
-        }\r
-        if (this.dqTask){\r
-            this.dqTask.cancel();\r
-            this.dqTask = null;\r
-        }\r
-        this.bindStore(null);\r
-        Ext.form.ComboBox.superclass.onDestroy.call(this);\r
-    },\r
-\r
-    // private\r
-    unsetDelayCheck : function(){\r
-        delete this.delayedCheck;\r
-    },\r
-\r
-    // private\r
-    fireKey : function(e){\r
-        if(e.isNavKeyPress() && !this.isExpanded() && !this.delayedCheck){\r
-            this.fireEvent("specialkey", this, e);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onResize: function(w, h){\r
-        Ext.form.ComboBox.superclass.onResize.apply(this, arguments);\r
-        if(this.list && this.listWidth === undefined){\r
-            var lw = Math.max(w, this.minListWidth);\r
-            this.list.setWidth(lw);\r
-            this.innerList.setWidth(lw - this.list.getFrameWidth('lr'));\r
-        }\r
-    },\r
-\r
-    // private\r
-    onEnable: function(){\r
-        Ext.form.ComboBox.superclass.onEnable.apply(this, arguments);\r
-        if(this.hiddenField){\r
-            this.hiddenField.disabled = false;\r
-        }\r
-    },\r
-\r
-    // private\r
-    onDisable: function(){\r
-        Ext.form.ComboBox.superclass.onDisable.apply(this, arguments);\r
-        if(this.hiddenField){\r
-            this.hiddenField.disabled = true;\r
-        }\r
-    },\r
-\r
-    \r
-    setEditable : function(value){\r
-        if(value == this.editable){\r
-            return;\r
-        }\r
-        this.editable = value;\r
-        if(!value){\r
-            this.el.dom.setAttribute('readOnly', true);\r
-            this.el.on('mousedown', this.onTriggerClick,  this);\r
-            this.el.addClass('x-combo-noedit');\r
-        }else{\r
-            this.el.dom.removeAttribute('readOnly');\r
-            this.el.un('mousedown', this.onTriggerClick,  this);\r
-            this.el.removeClass('x-combo-noedit');\r
-        }\r
-    },\r
-\r
-    // private\r
-    onBeforeLoad : function(){\r
-        if(!this.hasFocus){\r
-            return;\r
-        }\r
-        this.innerList.update(this.loadingText ?\r
-               '<div class="loading-indicator">'+this.loadingText+'</div>' : '');\r
-        this.restrictHeight();\r
-        this.selectedIndex = -1;\r
-    },\r
-\r
-    // private\r
-    onLoad : function(){\r
-        if(!this.hasFocus){\r
-            return;\r
-        }\r
-        if(this.store.getCount() > 0){\r
-            this.expand();\r
-            this.restrictHeight();\r
-            if(this.lastQuery == this.allQuery){\r
-                if(this.editable){\r
-                    this.el.dom.select();\r
-                }\r
-                if(!this.selectByValue(this.value, true)){\r
-                    this.select(0, true);\r
-                }\r
-            }else{\r
-                this.selectNext();\r
-                if(this.typeAhead && this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE){\r
-                    this.taTask.delay(this.typeAheadDelay);\r
-                }\r
-            }\r
-        }else{\r
-            this.onEmptyResults();\r
-        }\r
-        //this.el.focus();\r
-    },\r
-\r
-    // private\r
-    onTypeAhead : function(){\r
-        if(this.store.getCount() > 0){\r
-            var r = this.store.getAt(0);\r
-            var newValue = r.data[this.displayField];\r
-            var len = newValue.length;\r
-            var selStart = this.getRawValue().length;\r
-            if(selStart != len){\r
-                this.setRawValue(newValue);\r
-                this.selectText(selStart, newValue.length);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    onSelect : function(record, index){\r
-        if(this.fireEvent('beforeselect', this, record, index) !== false){\r
-            this.setValue(record.data[this.valueField || this.displayField]);\r
-            this.collapse();\r
-            this.fireEvent('select', this, record, index);\r
-        }\r
-    },\r
-\r
-    \r
-    getValue : function(){\r
-        if(this.valueField){\r
-            return typeof this.value != 'undefined' ? this.value : '';\r
-        }else{\r
-            return Ext.form.ComboBox.superclass.getValue.call(this);\r
-        }\r
-    },\r
-\r
-    \r
-    clearValue : function(){\r
-        if(this.hiddenField){\r
-            this.hiddenField.value = '';\r
-        }\r
-        this.setRawValue('');\r
-        this.lastSelectionText = '';\r
-        this.applyEmptyText();\r
-        this.value = '';\r
-    },\r
-\r
-    \r
-    setValue : function(v){\r
-        var text = v;\r
-        if(this.valueField){\r
-            var r = this.findRecord(this.valueField, v);\r
-            if(r){\r
-                text = r.data[this.displayField];\r
-            }else if(this.valueNotFoundText !== undefined){\r
-                text = this.valueNotFoundText;\r
-            }\r
-        }\r
-        this.lastSelectionText = text;\r
-        if(this.hiddenField){\r
-            this.hiddenField.value = v;\r
-        }\r
-        Ext.form.ComboBox.superclass.setValue.call(this, text);\r
-        this.value = v;\r
-    },\r
-\r
-    // private\r
-    findRecord : function(prop, value){\r
-        var record;\r
-        if(this.store.getCount() > 0){\r
-            this.store.each(function(r){\r
-                if(r.data[prop] == value){\r
-                    record = r;\r
-                    return false;\r
-                }\r
-            });\r
-        }\r
-        return record;\r
-    },\r
-\r
-    // private\r
-    onViewMove : function(e, t){\r
-        this.inKeyMode = false;\r
-    },\r
-\r
-    // private\r
-    onViewOver : function(e, t){\r
-        if(this.inKeyMode){ // prevent key nav and mouse over conflicts\r
-            return;\r
-        }\r
-        var item = this.view.findItemFromChild(t);\r
-        if(item){\r
-            var index = this.view.indexOf(item);\r
-            this.select(index, false);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onViewClick : function(doFocus){\r
-        var index = this.view.getSelectedIndexes()[0];\r
-        var r = this.store.getAt(index);\r
-        if(r){\r
-            this.onSelect(r, index);\r
-        }\r
-        if(doFocus !== false){\r
-            this.el.focus();\r
-        }\r
-    },\r
-\r
-    // private\r
-    restrictHeight : function(){\r
-        this.innerList.dom.style.height = '';\r
-        var inner = this.innerList.dom;\r
-        var pad = this.list.getFrameWidth('tb')+(this.resizable?this.handleHeight:0)+this.assetHeight;\r
-        var h = Math.max(inner.clientHeight, inner.offsetHeight, inner.scrollHeight);\r
-        var ha = this.getPosition()[1]-Ext.getBody().getScroll().top;\r
-        var hb = Ext.lib.Dom.getViewHeight()-ha-this.getSize().height;\r
-        var space = Math.max(ha, hb, this.minHeight || 0)-this.list.shadowOffset-pad-5;\r
-        h = Math.min(h, space, this.maxHeight);\r
-\r
-        this.innerList.setHeight(h);\r
-        this.list.beginUpdate();\r
-        this.list.setHeight(h+pad);\r
-        this.list.alignTo(this.wrap, this.listAlign);\r
-        this.list.endUpdate();\r
-    },\r
-\r
-    // private\r
-    onEmptyResults : function(){\r
-        this.collapse();\r
-    },\r
-\r
-    \r
-    isExpanded : function(){\r
-        return this.list && this.list.isVisible();\r
-    },\r
-\r
-    \r
-    selectByValue : function(v, scrollIntoView){\r
-        if(v !== undefined && v !== null){\r
-            var r = this.findRecord(this.valueField || this.displayField, v);\r
-            if(r){\r
-                this.select(this.store.indexOf(r), scrollIntoView);\r
-                return true;\r
-            }\r
-        }\r
-        return false;\r
-    },\r
-\r
-    \r
-    select : function(index, scrollIntoView){\r
-        this.selectedIndex = index;\r
-        this.view.select(index);\r
-        if(scrollIntoView !== false){\r
-            var el = this.view.getNode(index);\r
-            if(el){\r
-                this.innerList.scrollChildIntoView(el, false);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    selectNext : function(){\r
-        var ct = this.store.getCount();\r
-        if(ct > 0){\r
-            if(this.selectedIndex == -1){\r
-                this.select(0);\r
-            }else if(this.selectedIndex < ct-1){\r
-                this.select(this.selectedIndex+1);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    selectPrev : function(){\r
-        var ct = this.store.getCount();\r
-        if(ct > 0){\r
-            if(this.selectedIndex == -1){\r
-                this.select(0);\r
-            }else if(this.selectedIndex != 0){\r
-                this.select(this.selectedIndex-1);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    onKeyUp : function(e){\r
-        if(this.editable !== false && !e.isSpecialKey()){\r
-            this.lastKey = e.getKey();\r
-            this.dqTask.delay(this.queryDelay);\r
-        }\r
-    },\r
-\r
-    // private\r
-    validateBlur : function(){\r
-        return !this.list || !this.list.isVisible();\r
-    },\r
-\r
-    // private\r
-    initQuery : function(){\r
-        this.doQuery(this.getRawValue());\r
-    },\r
-\r
-    // private\r
-    doForce : function(){\r
-        if(this.el.dom.value.length > 0){\r
-            this.el.dom.value =\r
-                this.lastSelectionText === undefined ? '' : this.lastSelectionText;\r
-            this.applyEmptyText();\r
-        }\r
-    },\r
-\r
-    \r
-    doQuery : function(q, forceAll){\r
-        if(q === undefined || q === null){\r
-            q = '';\r
-        }\r
-        var qe = {\r
-            query: q,\r
-            forceAll: forceAll,\r
-            combo: this,\r
-            cancel:false\r
-        };\r
-        if(this.fireEvent('beforequery', qe)===false || qe.cancel){\r
-            return false;\r
-        }\r
-        q = qe.query;\r
-        forceAll = qe.forceAll;\r
-        if(forceAll === true || (q.length >= this.minChars)){\r
-            if(this.lastQuery !== q){\r
-                this.lastQuery = q;\r
-                if(this.mode == 'local'){\r
-                    this.selectedIndex = -1;\r
-                    if(forceAll){\r
-                        this.store.clearFilter();\r
-                    }else{\r
-                        this.store.filter(this.displayField, q);\r
-                    }\r
-                    this.onLoad();\r
-                }else{\r
-                    this.store.baseParams[this.queryParam] = q;\r
-                    this.store.load({\r
-                        params: this.getParams(q)\r
-                    });\r
-                    this.expand();\r
-                }\r
-            }else{\r
-                this.selectedIndex = -1;\r
-                this.onLoad();\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    getParams : function(q){\r
-        var p = {};\r
-        //p[this.queryParam] = q;\r
-        if(this.pageSize){\r
-            p.start = 0;\r
-            p.limit = this.pageSize;\r
-        }\r
-        return p;\r
-    },\r
-\r
-    \r
-    collapse : function(){\r
-        if(!this.isExpanded()){\r
-            return;\r
-        }\r
-        this.list.hide();\r
-        Ext.getDoc().un('mousewheel', this.collapseIf, this);\r
-        Ext.getDoc().un('mousedown', this.collapseIf, this);\r
-        this.fireEvent('collapse', this);\r
-    },\r
-\r
-    // private\r
-    collapseIf : function(e){\r
-        if(!e.within(this.wrap) && !e.within(this.list)){\r
-            this.collapse();\r
-        }\r
-    },\r
-\r
-    \r
-    expand : function(){\r
-        if(this.isExpanded() || !this.hasFocus){\r
-            return;\r
-        }\r
-        this.list.alignTo(this.wrap, this.listAlign);\r
-        this.list.show();\r
-        this.innerList.setOverflow('auto'); // necessary for FF 2.0/Mac\r
-        Ext.getDoc().on('mousewheel', this.collapseIf, this);\r
-        Ext.getDoc().on('mousedown', this.collapseIf, this);\r
-        this.fireEvent('expand', this);\r
-    },\r
-\r
-    \r
-    // private\r
-    // Implements the default empty TriggerField.onTriggerClick function\r
-    onTriggerClick : function(){\r
-        if(this.disabled){\r
-            return;\r
-        }\r
-        if(this.isExpanded()){\r
-            this.collapse();\r
-            this.el.focus();\r
-        }else {\r
-            this.onFocus({});\r
-            if(this.triggerAction == 'all') {\r
-                this.doQuery(this.allQuery, true);\r
-            } else {\r
-                this.doQuery(this.getRawValue());\r
-            }\r
-            this.el.focus();\r
-        }\r
-    }\r
-\r
-    \r
-    \r
-    \r
-    \r
-\r
-});\r
-Ext.reg('combo', Ext.form.ComboBox);\r
-\r
-Ext.form.Checkbox = Ext.extend(Ext.form.Field,  {\r
-    \r
-    checkedCls: 'x-form-check-checked',\r
-    \r
-    focusCls: 'x-form-check-focus',\r
-    \r
-    overCls: 'x-form-check-over',\r
-    \r
-    mouseDownCls: 'x-form-check-down',\r
-    \r
-    tabIndex: 0,\r
-    \r
-    checked: false,\r
-    \r
-    defaultAutoCreate: {tag: 'input', type: 'checkbox', autocomplete: 'off'},\r
-    \r
-    \r
-    \r
-    \r
-\r
-\r
-    // private\r
-    baseCls: 'x-form-check',\r
-\r
-    // private\r
-    initComponent : function(){\r
-        Ext.form.Checkbox.superclass.initComponent.call(this);\r
-        this.addEvents(\r
-            \r
-            'check'\r
-        );\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        Ext.form.Checkbox.superclass.initEvents.call(this);\r
-        this.initCheckEvents();\r
-    },\r
-\r
-    // private\r
-    initCheckEvents : function(){\r
-        this.innerWrap.removeAllListeners();\r
-        this.innerWrap.addClassOnOver(this.overCls);\r
-        this.innerWrap.addClassOnClick(this.mouseDownCls);\r
-        this.innerWrap.on('click', this.onClick, this);\r
-        this.innerWrap.on('keyup', this.onKeyUp, this);\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        Ext.form.Checkbox.superclass.onRender.call(this, ct, position);\r
-        if(this.inputValue !== undefined){\r
-            this.el.dom.value = this.inputValue;\r
-        }\r
-        this.el.addClass('x-hidden');\r
-\r
-        this.innerWrap = this.el.wrap({\r
-            tabIndex: this.tabIndex,\r
-            cls: this.baseCls+'-wrap-inner'\r
-        });\r
-        this.wrap = this.innerWrap.wrap({cls: this.baseCls+'-wrap'});\r
-\r
-        if(this.boxLabel){\r
-            this.labelEl = this.innerWrap.createChild({\r
-                tag: 'label',\r
-                htmlFor: this.el.id,\r
-                cls: 'x-form-cb-label',\r
-                html: this.boxLabel\r
-            });\r
-        }\r
-\r
-        this.imageEl = this.innerWrap.createChild({\r
-            tag: 'img',\r
-            src: Ext.BLANK_IMAGE_URL,\r
-            cls: this.baseCls\r
-        }, this.el);\r
-\r
-        if(this.checked){\r
-            this.setValue(true);\r
-        }else{\r
-            this.checked = this.el.dom.checked;\r
-        }\r
-        this.originalValue = this.checked;\r
-    },\r
-    \r
-    // private\r
-    afterRender : function(){\r
-        Ext.form.Checkbox.superclass.afterRender.call(this);\r
-        this.wrap[this.checked? 'addClass' : 'removeClass'](this.checkedCls);\r
-    },\r
-\r
-    // private\r
-    onDestroy : function(){\r
-        if(this.rendered){\r
-            Ext.destroy(this.imageEl, this.labelEl, this.innerWrap, this.wrap);\r
-        }\r
-        Ext.form.Checkbox.superclass.onDestroy.call(this);\r
-    },\r
-\r
-    // private\r
-    onFocus: function(e) {\r
-        Ext.form.Checkbox.superclass.onFocus.call(this, e);\r
-        this.el.addClass(this.focusCls);\r
-    },\r
-\r
-    // private\r
-    onBlur: function(e) {\r
-        Ext.form.Checkbox.superclass.onBlur.call(this, e);\r
-        this.el.removeClass(this.focusCls);\r
-    },\r
-\r
-    // private\r
-    onResize : function(){\r
-        Ext.form.Checkbox.superclass.onResize.apply(this, arguments);\r
-        if(!this.boxLabel && !this.fieldLabel){\r
-            this.el.alignTo(this.wrap, 'c-c');\r
-        }\r
-    },\r
-\r
-    // private\r
-    onKeyUp : function(e){\r
-        if(e.getKey() == Ext.EventObject.SPACE){\r
-            this.onClick(e);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onClick : function(e){\r
-        if (!this.disabled && !this.readOnly) {\r
-            this.toggleValue();\r
-        }\r
-        e.stopEvent();\r
-    },\r
-\r
-    // private\r
-    onEnable : function(){\r
-        Ext.form.Checkbox.superclass.onEnable.call(this);\r
-        this.initCheckEvents();\r
-    },\r
-\r
-    // private\r
-    onDisable : function(){\r
-        Ext.form.Checkbox.superclass.onDisable.call(this);\r
-        this.innerWrap.removeAllListeners();\r
-    },\r
-\r
-    toggleValue : function(){\r
-        this.setValue(!this.checked);\r
-    },\r
-\r
-    // private\r
-    getResizeEl : function(){\r
-        if(!this.resizeEl){\r
-            this.resizeEl = Ext.isSafari ? this.wrap : (this.wrap.up('.x-form-element', 5) || this.wrap);\r
-        }\r
-        return this.resizeEl;\r
-    },\r
-\r
-    // private\r
-    getPositionEl : function(){\r
-        return this.wrap;\r
-    },\r
-\r
-    // private\r
-    getActionEl : function(){\r
-        return this.wrap;\r
-    },\r
-\r
-    \r
-    markInvalid : Ext.emptyFn,\r
-    \r
-    clearInvalid : Ext.emptyFn,\r
-\r
-    // private\r
-    initValue : Ext.emptyFn,\r
-\r
-    \r
-    getValue : function(){\r
-        if(this.rendered){\r
-            return this.el.dom.checked;\r
-        }\r
-        return this.checked;\r
-    },\r
-\r
-    \r
-    setValue : function(v) {\r
-        var checked = this.checked;\r
-        this.checked = (v === true || v === 'true' || v == '1' || String(v).toLowerCase() == 'on');\r
-        \r
-        if(this.rendered){\r
-            this.el.dom.checked = this.checked;\r
-            this.el.dom.defaultChecked = this.checked;\r
-            this.wrap[this.checked? 'addClass' : 'removeClass'](this.checkedCls);\r
-        }\r
-\r
-        if(checked != this.checked){\r
-            this.fireEvent("check", this, this.checked);\r
-            if(this.handler){\r
-                this.handler.call(this.scope || this, this, this.checked);\r
-            }\r
-        }\r
-    }\r
-\r
-    \r
-    \r
-    \r
-});\r
-Ext.reg('checkbox', Ext.form.Checkbox);\r
-\r
-\r
-Ext.form.CheckboxGroup = Ext.extend(Ext.form.Field, {\r
-    \r
-    \r
-    columns : 'auto',\r
-    \r
-    vertical : false,\r
-    \r
-    allowBlank : true,\r
-    \r
-    blankText : "You must select at least one item in this group",\r
-    \r
-    // private\r
-    defaultType : 'checkbox',\r
-    \r
-    // private\r
-    groupCls: 'x-form-check-group',\r
-    \r
-    // private\r
-    onRender : function(ct, position){\r
-        if(!this.el){\r
-            var panelCfg = {\r
-                cls: this.groupCls,\r
-                layout: 'column',\r
-                border: false,\r
-                renderTo: ct\r
-            };\r
-            var colCfg = {\r
-                defaultType: this.defaultType,\r
-                layout: 'form',\r
-                border: false,\r
-                defaults: {\r
-                    hideLabel: true,\r
-                    anchor: '100%'\r
-                }\r
-            }\r
-            \r
-            if(this.items[0].items){\r
-                \r
-                // The container has standard ColumnLayout configs, so pass them in directly\r
-                \r
-                Ext.apply(panelCfg, {\r
-                    layoutConfig: {columns: this.items.length},\r
-                    defaults: this.defaults,\r
-                    items: this.items\r
-                })\r
-                for(var i=0, len=this.items.length; i<len; i++){\r
-                    Ext.applyIf(this.items[i], colCfg);\r
-                };\r
-                \r
-            }else{\r
-                \r
-                // The container has field item configs, so we have to generate the column\r
-                // panels first then move the items into the columns as needed.\r
-                \r
-                var numCols, cols = [];\r
-                \r
-                if(typeof this.columns == 'string'){ // 'auto' so create a col per item\r
-                    this.columns = this.items.length;\r
-                }\r
-                if(!Ext.isArray(this.columns)){\r
-                    var cs = [];\r
-                    for(var i=0; i<this.columns; i++){\r
-                        cs.push((100/this.columns)*.01); // distribute by even %\r
-                    }\r
-                    this.columns = cs;\r
-                }\r
-                \r
-                numCols = this.columns.length;\r
-                \r
-                // Generate the column configs with the correct width setting\r
-                for(var i=0; i<numCols; i++){\r
-                    var cc = Ext.apply({items:[]}, colCfg);\r
-                    cc[this.columns[i] <= 1 ? 'columnWidth' : 'width'] = this.columns[i];\r
-                    if(this.defaults){\r
-                        cc.defaults = Ext.apply(cc.defaults || {}, this.defaults)\r
-                    }\r
-                    cols.push(cc);\r
-                };\r
-                \r
-                // Distribute the original items into the columns\r
-                if(this.vertical){\r
-                    var rows = Math.ceil(this.items.length / numCols), ri = 0;\r
-                    for(var i=0, len=this.items.length; i<len; i++){\r
-                        if(i>0 && i%rows==0){\r
-                            ri++;\r
-                        }\r
-                        if(this.items[i].fieldLabel){\r
-                            this.items[i].hideLabel = false;\r
-                        }\r
-                        cols[ri].items.push(this.items[i]);\r
-                    };\r
-                }else{\r
-                    for(var i=0, len=this.items.length; i<len; i++){\r
-                        var ci = i % numCols;\r
-                        if(this.items[i].fieldLabel){\r
-                            this.items[i].hideLabel = false;\r
-                        }\r
-                        cols[ci].items.push(this.items[i]);\r
-                    };\r
-                }\r
-                \r
-                Ext.apply(panelCfg, {\r
-                    layoutConfig: {columns: numCols},\r
-                    items: cols\r
-                });\r
-            }\r
-            \r
-            this.panel = new Ext.Panel(panelCfg);\r
-            this.el = this.panel.getEl();\r
-            \r
-            if(this.forId && this.itemCls){\r
-                var l = this.el.up(this.itemCls).child('label', true);\r
-                if(l){\r
-                    l.setAttribute('htmlFor', this.forId);\r
-                }\r
-            }\r
-            \r
-            var fields = this.panel.findBy(function(c){\r
-                return c.isFormField;\r
-            }, this);\r
-            \r
-            this.items = new Ext.util.MixedCollection();\r
-            this.items.addAll(fields);\r
-        }\r
-        Ext.form.CheckboxGroup.superclass.onRender.call(this, ct, position);\r
-    },\r
-    \r
-    // private\r
-    validateValue : function(value){\r
-        if(!this.allowBlank){\r
-            var blank = true;\r
-            this.items.each(function(f){\r
-                if(f.checked){\r
-                    return blank = false;\r
-                }\r
-            }, this);\r
-            if(blank){\r
-                this.markInvalid(this.blankText);\r
-                return false;\r
-            }\r
-        }\r
-        return true;\r
-    },\r
-    \r
-    // private\r
-    onDisable : function(){\r
-        this.items.each(function(item){\r
-            item.disable();\r
-        })\r
-    },\r
-\r
-    // private\r
-    onEnable : function(){\r
-        this.items.each(function(item){\r
-            item.enable();\r
-        })\r
-    },\r
-    \r
-    // private\r
-    onResize : function(w, h){\r
-        this.panel.setSize(w, h);\r
-        this.panel.doLayout();\r
-    },\r
-    \r
-    // inherit docs from Field\r
-    reset : function(){\r
-        Ext.form.CheckboxGroup.superclass.reset.call(this);\r
-        this.items.each(function(c){\r
-            if(c.reset){\r
-                c.reset();\r
-            }\r
-        }, this);\r
-    },\r
-    \r
-    \r
-    \r
-    initValue : Ext.emptyFn,\r
-    \r
-    getValue : Ext.emptyFn,\r
-    \r
-    getRawValue : Ext.emptyFn,\r
-    \r
-    setValue : Ext.emptyFn,\r
-    \r
-    setRawValue : Ext.emptyFn\r
-    \r
-});\r
-\r
-Ext.reg('checkboxgroup', Ext.form.CheckboxGroup);\r
-\r
-\r
-Ext.form.Radio = Ext.extend(Ext.form.Checkbox, {\r
-    // private\r
-    inputType: 'radio',\r
-    // private\r
-    baseCls: 'x-form-radio',\r
-    \r
-    \r
-    getGroupValue : function(){\r
-        var c = this.getParent().child('input[name='+this.el.dom.name+']:checked', true);\r
-        return c ? c.value : null;\r
-    },\r
-    \r
-    // private\r
-    getParent : function(){\r
-        return this.el.up('form') || Ext.getBody();\r
-    },\r
-\r
-    // private\r
-    toggleValue : function() {\r
-        if(!this.checked){\r
-            var els = this.getParent().select('input[name='+this.el.dom.name+']');\r
-            els.each(function(el){\r
-                if(el.dom.id == this.id){\r
-                    this.setValue(true);\r
-                }else{\r
-                    Ext.getCmp(el.dom.id).setValue(false);\r
-                }\r
-            }, this);\r
-        }\r
-    },\r
-    \r
-    \r
-    setValue : function(v){\r
-        if(typeof v=='boolean') {\r
-            Ext.form.Radio.superclass.setValue.call(this, v);\r
-        }else{\r
-            var r = this.getParent().child('input[name='+this.el.dom.name+'][value='+v+']', true);\r
-            if(r && !r.checked){\r
-                Ext.getCmp(r.id).toggleValue();\r
-            };\r
-        }\r
-    },\r
-    \r
-    \r
-    markInvalid : Ext.emptyFn,\r
-    \r
-    clearInvalid : Ext.emptyFn\r
-    \r
-});\r
-Ext.reg('radio', Ext.form.Radio);\r
-\r
-\r
-Ext.form.RadioGroup = Ext.extend(Ext.form.CheckboxGroup, {\r
-    \r
-    allowBlank : true,\r
-    \r
-    blankText : "You must select one item in this group",\r
-    \r
-    // private\r
-    defaultType : 'radio',\r
-    \r
-    // private\r
-    groupCls: 'x-form-radio-group'\r
-});\r
-\r
-Ext.reg('radiogroup', Ext.form.RadioGroup);\r
-\r
-\r
-Ext.form.Hidden = Ext.extend(Ext.form.Field, {\r
-    // private\r
-    inputType : 'hidden',\r
-\r
-    // private\r
-    onRender : function(){\r
-        Ext.form.Hidden.superclass.onRender.apply(this, arguments);\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        this.originalValue = this.getValue();\r
-    },\r
-\r
-    // These are all private overrides\r
-    setSize : Ext.emptyFn,\r
-    setWidth : Ext.emptyFn,\r
-    setHeight : Ext.emptyFn,\r
-    setPosition : Ext.emptyFn,\r
-    setPagePosition : Ext.emptyFn,\r
-    markInvalid : Ext.emptyFn,\r
-    clearInvalid : Ext.emptyFn\r
-});\r
-Ext.reg('hidden', Ext.form.Hidden);\r
-\r
-Ext.form.BasicForm = function(el, config){\r
-    Ext.apply(this, config);\r
-    \r
-    this.items = new Ext.util.MixedCollection(false, function(o){\r
-        return o.id || (o.id = Ext.id());\r
-    });\r
-    this.addEvents(\r
-        \r
-        'beforeaction',\r
-        \r
-        'actionfailed',\r
-        \r
-        'actioncomplete'\r
-    );\r
-\r
-    if(el){\r
-        this.initEl(el);\r
-    }\r
-    Ext.form.BasicForm.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.form.BasicForm, Ext.util.Observable, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    timeout: 30,\r
-\r
-    // private\r
-    activeAction : null,\r
-\r
-    \r
-    trackResetOnLoad : false,\r
-\r
-    \r
-    \r
-\r
-    // private\r
-    initEl : function(el){\r
-        this.el = Ext.get(el);\r
-        this.id = this.el.id || Ext.id();\r
-        if(!this.standardSubmit){\r
-            this.el.on('submit', this.onSubmit, this);\r
-        }\r
-        this.el.addClass('x-form');\r
-    },\r
-\r
-    \r
-    getEl: function(){\r
-        return this.el;\r
-    },\r
-\r
-    // private\r
-    onSubmit : function(e){\r
-        e.stopEvent();\r
-    },\r
-\r
-    // private\r
-    destroy: function() {\r
-        this.items.each(function(f){\r
-            Ext.destroy(f);\r
-        });\r
-        if(this.el){\r
-            this.el.removeAllListeners();\r
-            this.el.remove();\r
-        }\r
-        this.purgeListeners();\r
-    },\r
-\r
-    \r
-    isValid : function(){\r
-        var valid = true;\r
-        this.items.each(function(f){\r
-           if(!f.validate()){\r
-               valid = false;\r
-           }\r
-        });\r
-        return valid;\r
-    },\r
-\r
-    \r
-    isDirty : function(){\r
-        var dirty = false;\r
-        this.items.each(function(f){\r
-           if(f.isDirty()){\r
-               dirty = true;\r
-               return false;\r
-           }\r
-        });\r
-        return dirty;\r
-    },\r
-\r
-    \r
-    doAction : function(action, options){\r
-        if(typeof action == 'string'){\r
-            action = new Ext.form.Action.ACTION_TYPES[action](this, options);\r
-        }\r
-        if(this.fireEvent('beforeaction', this, action) !== false){\r
-            this.beforeAction(action);\r
-            action.run.defer(100, action);\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    submit : function(options){\r
-        if(this.standardSubmit){\r
-            var v = this.isValid();\r
-            if(v){\r
-                this.el.dom.submit();\r
-            }\r
-            return v;\r
-        }\r
-        this.doAction('submit', options);\r
-        return this;\r
-    },\r
-\r
-    \r
-    load : function(options){\r
-        this.doAction('load', options);\r
-        return this;\r
-    },\r
-\r
-    \r
-    updateRecord : function(record){\r
-        record.beginEdit();\r
-        var fs = record.fields;\r
-        fs.each(function(f){\r
-            var field = this.findField(f.name);\r
-            if(field){\r
-                record.set(f.name, field.getValue());\r
-            }\r
-        }, this);\r
-        record.endEdit();\r
-        return this;\r
-    },\r
-\r
-    \r
-    loadRecord : function(record){\r
-        this.setValues(record.data);\r
-        return this;\r
-    },\r
-\r
-    // private\r
-    beforeAction : function(action){\r
-        var o = action.options;\r
-        if(o.waitMsg){\r
-            if(this.waitMsgTarget === true){\r
-                this.el.mask(o.waitMsg, 'x-mask-loading');\r
-            }else if(this.waitMsgTarget){\r
-                this.waitMsgTarget = Ext.get(this.waitMsgTarget);\r
-                this.waitMsgTarget.mask(o.waitMsg, 'x-mask-loading');\r
-            }else{\r
-                Ext.MessageBox.wait(o.waitMsg, o.waitTitle || this.waitTitle || 'Please Wait...');\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    afterAction : function(action, success){\r
-        this.activeAction = null;\r
-        var o = action.options;\r
-        if(o.waitMsg){\r
-            if(this.waitMsgTarget === true){\r
-                this.el.unmask();\r
-            }else if(this.waitMsgTarget){\r
-                this.waitMsgTarget.unmask();\r
-            }else{\r
-                Ext.MessageBox.updateProgress(1);\r
-                Ext.MessageBox.hide();\r
-            }\r
-        }\r
-        if(success){\r
-            if(o.reset){\r
-                this.reset();\r
-            }\r
-            Ext.callback(o.success, o.scope, [this, action]);\r
-            this.fireEvent('actioncomplete', this, action);\r
-        }else{\r
-            Ext.callback(o.failure, o.scope, [this, action]);\r
-            this.fireEvent('actionfailed', this, action);\r
-        }\r
-    },\r
-\r
-    \r
-    findField : function(id){\r
-        var field = this.items.get(id);\r
-        if(!field){\r
-            this.items.each(function(f){\r
-                if(f.isFormField && (f.dataIndex == id || f.id == id || f.getName() == id)){\r
-                    field = f;\r
-                    return false;\r
-                }\r
-            });\r
-        }\r
-        return field || null;\r
-    },\r
-\r
-\r
-    \r
-    markInvalid : function(errors){\r
-        if(Ext.isArray(errors)){\r
-            for(var i = 0, len = errors.length; i < len; i++){\r
-                var fieldError = errors[i];\r
-                var f = this.findField(fieldError.id);\r
-                if(f){\r
-                    f.markInvalid(fieldError.msg);\r
-                }\r
-            }\r
-        }else{\r
-            var field, id;\r
-            for(id in errors){\r
-                if(typeof errors[id] != 'function' && (field = this.findField(id))){\r
-                    field.markInvalid(errors[id]);\r
-                }\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    setValues : function(values){\r
-        if(Ext.isArray(values)){ // array of objects\r
-            for(var i = 0, len = values.length; i < len; i++){\r
-                var v = values[i];\r
-                var f = this.findField(v.id);\r
-                if(f){\r
-                    f.setValue(v.value);\r
-                    if(this.trackResetOnLoad){\r
-                        f.originalValue = f.getValue();\r
-                    }\r
-                }\r
-            }\r
-        }else{ // object hash\r
-            var field, id;\r
-            for(id in values){\r
-                if(typeof values[id] != 'function' && (field = this.findField(id))){\r
-                    field.setValue(values[id]);\r
-                    if(this.trackResetOnLoad){\r
-                        field.originalValue = field.getValue();\r
-                    }\r
-                }\r
-            }\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    getValues : function(asString){\r
-        var fs = Ext.lib.Ajax.serializeForm(this.el.dom);\r
-        if(asString === true){\r
-            return fs;\r
-        }\r
-        return Ext.urlDecode(fs);\r
-    },\r
-\r
-    \r
-    clearInvalid : function(){\r
-        this.items.each(function(f){\r
-           f.clearInvalid();\r
-        });\r
-        return this;\r
-    },\r
-\r
-    \r
-    reset : function(){\r
-        this.items.each(function(f){\r
-            f.reset();\r
-        });\r
-        return this;\r
-    },\r
-\r
-    \r
-    add : function(){\r
-        this.items.addAll(Array.prototype.slice.call(arguments, 0));\r
-        return this;\r
-    },\r
-\r
-\r
-    \r
-    remove : function(field){\r
-        this.items.remove(field);\r
-        return this;\r
-    },\r
-\r
-    \r
-    render : function(){\r
-        this.items.each(function(f){\r
-            if(f.isFormField && !f.rendered && document.getElementById(f.id)){ // if the element exists\r
-                f.applyToMarkup(f.id);\r
-            }\r
-        });\r
-        return this;\r
-    },\r
-\r
-    \r
-    applyToFields : function(o){\r
-        this.items.each(function(f){\r
-           Ext.apply(f, o);\r
-        });\r
-        return this;\r
-    },\r
-\r
-    \r
-    applyIfToFields : function(o){\r
-        this.items.each(function(f){\r
-           Ext.applyIf(f, o);\r
-        });\r
-        return this;\r
-    }\r
-});\r
-\r
-// back compat\r
-Ext.BasicForm = Ext.form.BasicForm;\r
-\r
-Ext.FormPanel = Ext.extend(Ext.Panel, {\r
-       \r
-    \r
-    \r
-    \r
-    \r
-    buttonAlign:'center',\r
-\r
-    \r
-    minButtonWidth:75,\r
-\r
-    \r
-    labelAlign:'left',\r
-\r
-    \r
-    monitorValid : false,\r
-\r
-    \r
-    monitorPoll : 200,\r
-\r
-    \r
-    layout: 'form',\r
-\r
-    // private\r
-    initComponent :function(){\r
-        this.form = this.createForm();\r
-\r
-        this.bodyCfg = {\r
-            tag: 'form',\r
-            cls: this.baseCls + '-body',\r
-            method : this.method || 'POST',\r
-            id : this.formId || Ext.id()\r
-        };\r
-        if(this.fileUpload) {\r
-            this.bodyCfg.enctype = 'multipart/form-data';\r
-        }\r
-\r
-        Ext.FormPanel.superclass.initComponent.call(this);\r
-\r
-        this.initItems();\r
-\r
-        this.addEvents(\r
-            \r
-            'clientvalidation'\r
-        );\r
-\r
-        this.relayEvents(this.form, ['beforeaction', 'actionfailed', 'actioncomplete']);\r
-    },\r
-\r
-    // private\r
-    createForm: function(){\r
-        delete this.initialConfig.listeners;\r
-        return new Ext.form.BasicForm(null, this.initialConfig);\r
-    },\r
-\r
-    // private\r
-    initFields : function(){\r
-        var f = this.form;\r
-        var formPanel = this;\r
-        var fn = function(c){\r
-            if(c.isFormField){\r
-                f.add(c);\r
-            }else if(c.doLayout && c != formPanel){\r
-                Ext.applyIf(c, {\r
-                    labelAlign: c.ownerCt.labelAlign,\r
-                    labelWidth: c.ownerCt.labelWidth,\r
-                    itemCls: c.ownerCt.itemCls\r
-                });\r
-                if(c.items){\r
-                    c.items.each(fn);\r
-                }\r
-            }\r
-        }\r
-        this.items.each(fn);\r
-    },\r
-\r
-    // private\r
-    getLayoutTarget : function(){\r
-        return this.form.el;\r
-    },\r
-\r
-    \r
-    getForm : function(){\r
-        return this.form;\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        this.initFields();\r
-\r
-        Ext.FormPanel.superclass.onRender.call(this, ct, position);\r
-        this.form.initEl(this.body);\r
-    },\r
-    \r
-    // private\r
-    beforeDestroy: function(){\r
-        Ext.FormPanel.superclass.beforeDestroy.call(this);\r
-        this.stopMonitoring();\r
-        Ext.destroy(this.form);\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        Ext.FormPanel.superclass.initEvents.call(this);\r
-        this.items.on('remove', this.onRemove, this);\r
-               this.items.on('add', this.onAdd, this);\r
-        if(this.monitorValid){ // initialize after render\r
-            this.startMonitoring();\r
-        }\r
-    },\r
-    \r
-    // private\r
-       onAdd : function(ct, c) {\r
-               if (c.isFormField) {\r
-                       this.form.add(c);\r
-               }\r
-       },\r
-       \r
-       // private\r
-       onRemove : function(c) {\r
-               if (c.isFormField) {\r
-                       Ext.destroy(c.container.up('.x-form-item'));\r
-                       this.form.remove(c);\r
-               }\r
-       },\r
-\r
-    \r
-    startMonitoring : function(){\r
-        if(!this.bound){\r
-            this.bound = true;\r
-            Ext.TaskMgr.start({\r
-                run : this.bindHandler,\r
-                interval : this.monitorPoll || 200,\r
-                scope: this\r
-            });\r
-        }\r
-    },\r
-\r
-    \r
-    stopMonitoring : function(){\r
-        this.bound = false;\r
-    },\r
-\r
-    \r
-    load : function(){\r
-        this.form.load.apply(this.form, arguments);  \r
-    },\r
-\r
-    // private\r
-    onDisable : function(){\r
-        Ext.FormPanel.superclass.onDisable.call(this);\r
-        if(this.form){\r
-            this.form.items.each(function(){\r
-                 this.disable();\r
-            });\r
-        }\r
-    },\r
-\r
-    // private\r
-    onEnable : function(){\r
-        Ext.FormPanel.superclass.onEnable.call(this);\r
-        if(this.form){\r
-            this.form.items.each(function(){\r
-                 this.enable();\r
-            });\r
-        }\r
-    },\r
-\r
-    // private\r
-    bindHandler : function(){\r
-        if(!this.bound){\r
-            return false; // stops binding\r
-        }\r
-        var valid = true;\r
-        this.form.items.each(function(f){\r
-            if(!f.isValid(true)){\r
-                valid = false;\r
-                return false;\r
-            }\r
-        });\r
-        if(this.buttons){\r
-            for(var i = 0, len = this.buttons.length; i < len; i++){\r
-                var btn = this.buttons[i];\r
-                if(btn.formBind === true && btn.disabled === valid){\r
-                    btn.setDisabled(!valid);\r
-                }\r
-            }\r
-        }\r
-        this.fireEvent('clientvalidation', this, valid);\r
-    }\r
-});\r
-Ext.reg('form', Ext.FormPanel);\r
-\r
-Ext.form.FormPanel = Ext.FormPanel;\r
-\r
-\r
-\r
-Ext.form.FieldSet = Ext.extend(Ext.Panel, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    baseCls:'x-fieldset',\r
-    \r
-    layout: 'form',\r
-    \r
-    animCollapse: false,\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        if(!this.el){\r
-            this.el = document.createElement('fieldset');\r
-            this.el.id = this.id;\r
-            if (this.title || this.header || this.checkboxToggle) {\r
-                this.el.appendChild(document.createElement('legend')).className = 'x-fieldset-header';\r
-            }\r
-        }\r
-\r
-        Ext.form.FieldSet.superclass.onRender.call(this, ct, position);\r
-\r
-        if(this.checkboxToggle){\r
-            var o = typeof this.checkboxToggle == 'object' ?\r
-                    this.checkboxToggle :\r
-                    {tag: 'input', type: 'checkbox', name: this.checkboxName || this.id+'-checkbox'};\r
-            this.checkbox = this.header.insertFirst(o);\r
-            this.checkbox.dom.checked = !this.collapsed;\r
-            this.checkbox.on('click', this.onCheckClick, this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onCollapse : function(doAnim, animArg){\r
-        if(this.checkbox){\r
-            this.checkbox.dom.checked = false;\r
-        }\r
-        Ext.form.FieldSet.superclass.onCollapse.call(this, doAnim, animArg);\r
-\r
-    },\r
-\r
-    // private\r
-    onExpand : function(doAnim, animArg){\r
-        if(this.checkbox){\r
-            this.checkbox.dom.checked = true;\r
-        }\r
-        Ext.form.FieldSet.superclass.onExpand.call(this, doAnim, animArg);\r
-    },\r
-\r
-    \r
-    onCheckClick : function(){\r
-        this[this.checkbox.dom.checked ? 'expand' : 'collapse']();\r
-    },\r
-    \r
-    // private\r
-    beforeDestroy : function(){\r
-        if(this.checkbox){\r
-            this.checkbox.un('click', this.onCheckClick, this);\r
-        }\r
-        Ext.form.FieldSet.superclass.beforeDestroy.call(this);\r
-    }\r
-\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-});\r
-Ext.reg('fieldset', Ext.form.FieldSet);\r
-\r
-\r
-\r
-\r
-Ext.form.HtmlEditor = Ext.extend(Ext.form.Field, {\r
-    \r
-    enableFormat : true,\r
-    \r
-    enableFontSize : true,\r
-    \r
-    enableColors : true,\r
-    \r
-    enableAlignments : true,\r
-    \r
-    enableLists : true,\r
-    \r
-    enableSourceEdit : true,\r
-    \r
-    enableLinks : true,\r
-    \r
-    enableFont : true,\r
-    \r
-    createLinkText : 'Please enter the URL for the link:',\r
-    \r
-    defaultLinkValue : 'http:/'+'/',\r
-    \r
-    fontFamilies : [\r
-        'Arial',\r
-        'Courier New',\r
-        'Tahoma',\r
-        'Times New Roman',\r
-        'Verdana'\r
-    ],\r
-    defaultFont: 'tahoma',\r
-\r
-    // private properties\r
-    validationEvent : false,\r
-    deferHeight: true,\r
-    initialized : false,\r
-    activated : false,\r
-    sourceEditMode : false,\r
-    onFocus : Ext.emptyFn,\r
-    iframePad:3,\r
-    hideMode:'offsets',\r
-    defaultAutoCreate : {\r
-        tag: "textarea",\r
-        style:"width:500px;height:300px;",\r
-        autocomplete: "off"\r
-    },\r
-\r
-    // private\r
-    initComponent : function(){\r
-        this.addEvents(\r
-            \r
-            'initialize',\r
-            \r
-            'activate',\r
-             \r
-            'beforesync',\r
-             \r
-            'beforepush',\r
-             \r
-            'sync',\r
-             \r
-            'push',\r
-             \r
-            'editmodechange'\r
-        )\r
-    },\r
-\r
-    // private\r
-    createFontOptions : function(){\r
-        var buf = [], fs = this.fontFamilies, ff, lc;\r
-        for(var i = 0, len = fs.length; i< len; i++){\r
-            ff = fs[i];\r
-            lc = ff.toLowerCase();\r
-            buf.push(\r
-                '<option value="',lc,'" style="font-family:',ff,';"',\r
-                    (this.defaultFont == lc ? ' selected="true">' : '>'),\r
-                    ff,\r
-                '</option>'\r
-            );\r
-        }\r
-        return buf.join('');\r
-    },\r
-    \r
-    \r
-    createToolbar : function(editor){\r
-        \r
-        var tipsEnabled = Ext.QuickTips && Ext.QuickTips.isEnabled();\r
-        \r
-        function btn(id, toggle, handler){\r
-            return {\r
-                itemId : id,\r
-                cls : 'x-btn-icon x-edit-'+id,\r
-                enableToggle:toggle !== false,\r
-                scope: editor,\r
-                handler:handler||editor.relayBtnCmd,\r
-                clickEvent:'mousedown',\r
-                tooltip: tipsEnabled ? editor.buttonTips[id] || undefined : undefined,\r
-                tabIndex:-1\r
-            };\r
-        }\r
-\r
-        // build the toolbar\r
-        var tb = new Ext.Toolbar({\r
-            renderTo:this.wrap.dom.firstChild\r
-        });\r
-\r
-        // stop form submits\r
-        tb.el.on('click', function(e){\r
-            e.preventDefault();\r
-        });\r
-\r
-        if(this.enableFont && !Ext.isSafari2){\r
-            this.fontSelect = tb.el.createChild({\r
-                tag:'select',\r
-                cls:'x-font-select',\r
-                html: this.createFontOptions()\r
-            });\r
-            this.fontSelect.on('change', function(){\r
-                var font = this.fontSelect.dom.value;\r
-                this.relayCmd('fontname', font);\r
-                this.deferFocus();\r
-            }, this);\r
-            tb.add(\r
-                this.fontSelect.dom,\r
-                '-'\r
-            );\r
-        };\r
-\r
-        if(this.enableFormat){\r
-            tb.add(\r
-                btn('bold'),\r
-                btn('italic'),\r
-                btn('underline')\r
-            );\r
-        };\r
-\r
-        if(this.enableFontSize){\r
-            tb.add(\r
-                '-',\r
-                btn('increasefontsize', false, this.adjustFont),\r
-                btn('decreasefontsize', false, this.adjustFont)\r
-            );\r
-        };\r
-\r
-        if(this.enableColors){\r
-            tb.add(\r
-                '-', {\r
-                    itemId:'forecolor',\r
-                    cls:'x-btn-icon x-edit-forecolor',\r
-                    clickEvent:'mousedown',\r
-                    tooltip: tipsEnabled ? editor.buttonTips['forecolor'] || undefined : undefined,\r
-                    tabIndex:-1,\r
-                    menu : new Ext.menu.ColorMenu({\r
-                        allowReselect: true,\r
-                        focus: Ext.emptyFn,\r
-                        value:'000000',\r
-                        plain:true,\r
-                        selectHandler: function(cp, color){\r
-                            this.execCmd('forecolor', Ext.isSafari || Ext.isIE ? '#'+color : color);\r
-                            this.deferFocus();\r
-                        },\r
-                        scope: this,\r
-                        clickEvent:'mousedown'\r
-                    })\r
-                }, {\r
-                    itemId:'backcolor',\r
-                    cls:'x-btn-icon x-edit-backcolor',\r
-                    clickEvent:'mousedown',\r
-                    tooltip: tipsEnabled ? editor.buttonTips['backcolor'] || undefined : undefined,\r
-                    tabIndex:-1,\r
-                    menu : new Ext.menu.ColorMenu({\r
-                        focus: Ext.emptyFn,\r
-                        value:'FFFFFF',\r
-                        plain:true,\r
-                        allowReselect: true,\r
-                        selectHandler: function(cp, color){\r
-                            if(Ext.isGecko){\r
-                                this.execCmd('useCSS', false);\r
-                                this.execCmd('hilitecolor', color);\r
-                                this.execCmd('useCSS', true);\r
-                                this.deferFocus();\r
-                            }else{\r
-                                this.execCmd(Ext.isOpera ? 'hilitecolor' : 'backcolor', Ext.isSafari || Ext.isIE ? '#'+color : color);\r
-                                this.deferFocus();\r
-                            }\r
-                        },\r
-                        scope:this,\r
-                        clickEvent:'mousedown'\r
-                    })\r
-                }\r
-            );\r
-        };\r
-\r
-        if(this.enableAlignments){\r
-            tb.add(\r
-                '-',\r
-                btn('justifyleft'),\r
-                btn('justifycenter'),\r
-                btn('justifyright')\r
-            );\r
-        };\r
-\r
-        if(!Ext.isSafari2){\r
-            if(this.enableLinks){\r
-                tb.add(\r
-                    '-',\r
-                    btn('createlink', false, this.createLink)\r
-                );\r
-            };\r
-\r
-            if(this.enableLists){\r
-                tb.add(\r
-                    '-',\r
-                    btn('insertorderedlist'),\r
-                    btn('insertunorderedlist')\r
-                );\r
-            }\r
-            if(this.enableSourceEdit){\r
-                tb.add(\r
-                    '-',\r
-                    btn('sourceedit', true, function(btn){\r
-                        this.toggleSourceEdit(btn.pressed);\r
-                    })\r
-                );\r
-            }\r
-        }\r
-\r
-        this.tb = tb;\r
-    },\r
-\r
-    \r
-    getDocMarkup : function(){\r
-        return '<html><head><style type="text/css">body{border:0;margin:0;padding:3px;height:98%;cursor:text;}</style></head><body></body></html>';\r
-    },\r
-\r
-    // private\r
-    getEditorBody : function(){\r
-        return this.doc.body || this.doc.documentElement;\r
-    },\r
-\r
-    // private\r
-    getDoc : function(){\r
-        return Ext.isIE ? this.getWin().document : (this.iframe.contentDocument || this.getWin().document);\r
-    },\r
-\r
-    // private\r
-    getWin : function(){\r
-        return Ext.isIE ? this.iframe.contentWindow : window.frames[this.iframe.name];\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        Ext.form.HtmlEditor.superclass.onRender.call(this, ct, position);\r
-        this.el.dom.style.border = '0 none';\r
-        this.el.dom.setAttribute('tabIndex', -1);\r
-        this.el.addClass('x-hidden');\r
-        if(Ext.isIE){ // fix IE 1px bogus margin\r
-            this.el.applyStyles('margin-top:-1px;margin-bottom:-1px;')\r
-        }\r
-        this.wrap = this.el.wrap({\r
-            cls:'x-html-editor-wrap', cn:{cls:'x-html-editor-tb'}\r
-        });\r
-\r
-        this.createToolbar(this);\r
-\r
-        this.tb.items.each(function(item){\r
-           if(item.itemId != 'sourceedit'){\r
-                item.disable();\r
-            }\r
-        });\r
-\r
-        var iframe = document.createElement('iframe');\r
-        iframe.name = Ext.id();\r
-        iframe.frameBorder = '0';\r
-\r
-        iframe.src = Ext.isIE ? Ext.SSL_SECURE_URL : "javascript:;";\r
-\r
-        this.wrap.dom.appendChild(iframe);\r
-\r
-        this.iframe = iframe;\r
-\r
-        this.initFrame();\r
-\r
-        if(this.autoMonitorDesignMode !== false){\r
-            this.monitorTask = Ext.TaskMgr.start({\r
-                run: this.checkDesignMode,\r
-                scope: this,\r
-                interval:100\r
-            });\r
-        }\r
-\r
-        if(!this.width){\r
-            var sz = this.el.getSize();\r
-            this.setSize(sz.width, this.height || sz.height);\r
-        }\r
-    },\r
-\r
-    initFrame : function(){\r
-        this.doc = this.getDoc();\r
-        this.win = this.getWin();\r
-\r
-        this.doc.open();\r
-        this.doc.write(this.getDocMarkup());\r
-        this.doc.close();\r
-\r
-        var task = { // must defer to wait for browser to be ready\r
-            run : function(){\r
-                if(this.doc.body || this.doc.readyState == 'complete'){\r
-                    Ext.TaskMgr.stop(task);\r
-                    this.doc.designMode="on";\r
-                    this.initEditor.defer(10, this);\r
-                }\r
-            },\r
-            interval : 10,\r
-            duration:10000,\r
-            scope: this\r
-        };\r
-        Ext.TaskMgr.start(task);\r
-    },\r
-\r
-\r
-    checkDesignMode : function(){\r
-        if(this.wrap && this.wrap.dom.offsetWidth){\r
-            var doc = this.getDoc();\r
-            if(!doc){\r
-                return;\r
-            }\r
-            if(!doc.editorInitialized || String(doc.designMode).toLowerCase() != 'on'){\r
-                this.initFrame();\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    onResize : function(w, h){\r
-        Ext.form.HtmlEditor.superclass.onResize.apply(this, arguments);\r
-        if(this.el && this.iframe){\r
-            if(typeof w == 'number'){\r
-                var aw = w - this.wrap.getFrameWidth('lr');\r
-                this.el.setWidth(this.adjustWidth('textarea', aw));\r
-                this.iframe.style.width = Math.max(aw, 0) + 'px';\r
-            }\r
-            if(typeof h == 'number'){\r
-                var ah = h - this.wrap.getFrameWidth('tb') - this.tb.el.getHeight();\r
-                this.el.setHeight(this.adjustWidth('textarea', ah));\r
-                this.iframe.style.height = Math.max(ah, 0) + 'px';\r
-                if(this.doc){\r
-                    this.getEditorBody().style.height = Math.max((ah - (this.iframePad*2)), 0) + 'px';\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    toggleSourceEdit : function(sourceEditMode){\r
-        if(sourceEditMode === undefined){\r
-            sourceEditMode = !this.sourceEditMode;\r
-        }\r
-        this.sourceEditMode = sourceEditMode === true;\r
-        var btn = this.tb.items.get('sourceedit');\r
-        if(btn.pressed !== this.sourceEditMode){\r
-            btn.toggle(this.sourceEditMode);\r
-            return;\r
-        }\r
-        if(this.sourceEditMode){\r
-            this.tb.items.each(function(item){\r
-                if(item.itemId != 'sourceedit'){\r
-                    item.disable();\r
-                }\r
-            });\r
-            this.syncValue();\r
-            this.iframe.className = 'x-hidden';\r
-            this.el.removeClass('x-hidden');\r
-            this.el.dom.removeAttribute('tabIndex');\r
-            this.el.focus();\r
-        }else{\r
-            if(this.initialized){\r
-                this.tb.items.each(function(item){\r
-                    item.enable();\r
-                });\r
-            }\r
-            this.pushValue();\r
-            this.iframe.className = '';\r
-            this.el.addClass('x-hidden');\r
-            this.el.dom.setAttribute('tabIndex', -1);\r
-            this.deferFocus();\r
-        }\r
-        var lastSize = this.lastSize;\r
-        if(lastSize){\r
-            delete this.lastSize;\r
-            this.setSize(lastSize);\r
-        }\r
-        this.fireEvent('editmodechange', this, this.sourceEditMode);\r
-    },\r
-\r
-    // private used internally\r
-    createLink : function(){\r
-        var url = prompt(this.createLinkText, this.defaultLinkValue);\r
-        if(url && url != 'http:/'+'/'){\r
-            this.relayCmd('createlink', url);\r
-        }\r
-    },\r
-\r
-    // private (for BoxComponent)\r
-    adjustSize : Ext.BoxComponent.prototype.adjustSize,\r
-\r
-    // private (for BoxComponent)\r
-    getResizeEl : function(){\r
-        return this.wrap;\r
-    },\r
-\r
-    // private (for BoxComponent)\r
-    getPositionEl : function(){\r
-        return this.wrap;\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        this.originalValue = this.getValue();\r
-    },\r
-\r
-    \r
-    markInvalid : Ext.emptyFn,\r
-    \r
-    \r
-    clearInvalid : Ext.emptyFn,\r
-\r
-    // docs inherit from Field\r
-    setValue : function(v){\r
-        Ext.form.HtmlEditor.superclass.setValue.call(this, v);\r
-        this.pushValue();\r
-    },\r
-\r
-    \r
-    cleanHtml : function(html){\r
-        html = String(html);\r
-        if(html.length > 5){\r
-            if(Ext.isSafari){ // strip safari nonsense\r
-                html = html.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi, '');\r
-            }\r
-        }\r
-        if(html == '&nbsp;'){\r
-            html = '';\r
-        }\r
-        return html;\r
-    },\r
-\r
-    \r
-    syncValue : function(){\r
-        if(this.initialized){\r
-            var bd = this.getEditorBody();\r
-            var html = bd.innerHTML;\r
-            if(Ext.isSafari){\r
-                var bs = bd.getAttribute('style'); // Safari puts text-align styles on the body element!\r
-                var m = bs.match(/text-align:(.*?);/i);\r
-                if(m && m[1]){\r
-                    html = '<div style="'+m[0]+'">' + html + '</div>';\r
-                }\r
-            }\r
-            html = this.cleanHtml(html);\r
-            if(this.fireEvent('beforesync', this, html) !== false){\r
-                this.el.dom.value = html;\r
-                this.fireEvent('sync', this, html);\r
-            }\r
-        }\r
-    },\r
-    \r
-    //docs inherit from Field\r
-    getValue : function() {\r
-        this.syncValue();\r
-        return Ext.form.HtmlEditor.superclass.getValue.call(this);\r
-    },\r
-\r
-\r
-    \r
-    pushValue : function(){\r
-        if(this.initialized){\r
-            var v = this.el.dom.value;\r
-            if(!this.activated && v.length < 1){\r
-                v = '&nbsp;';\r
-            }\r
-            if(this.fireEvent('beforepush', this, v) !== false){\r
-                this.getEditorBody().innerHTML = v;\r
-                this.fireEvent('push', this, v);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    deferFocus : function(){\r
-        this.focus.defer(10, this);\r
-    },\r
-\r
-    // docs inherit from Field\r
-    focus : function(){\r
-        if(this.win && !this.sourceEditMode){\r
-            this.win.focus();\r
-        }else{\r
-            this.el.focus();\r
-        }\r
-    },\r
-\r
-    // private\r
-    initEditor : function(){\r
-        var dbody = this.getEditorBody();\r
-        var ss = this.el.getStyles('font-size', 'font-family', 'background-image', 'background-repeat');\r
-        ss['background-attachment'] = 'fixed'; // w3c\r
-        dbody.bgProperties = 'fixed'; // ie\r
-\r
-        Ext.DomHelper.applyStyles(dbody, ss);\r
-\r
-        if(this.doc){\r
-            try{\r
-                Ext.EventManager.removeAll(this.doc);\r
-            }catch(e){}\r
-        }\r
-\r
-        this.doc = this.getDoc();\r
-\r
-        Ext.EventManager.on(this.doc, {\r
-            'mousedown': this.onEditorEvent,\r
-            'dblclick': this.onEditorEvent,\r
-            'click': this.onEditorEvent,\r
-            'keyup': this.onEditorEvent,\r
-            buffer:100,\r
-            scope: this\r
-        });\r
-\r
-        if(Ext.isGecko){\r
-            Ext.EventManager.on(this.doc, 'keypress', this.applyCommand, this);\r
-        }\r
-        if(Ext.isIE || Ext.isSafari || Ext.isOpera){\r
-            Ext.EventManager.on(this.doc, 'keydown', this.fixKeys, this);\r
-        }\r
-        this.initialized = true;\r
-\r
-        this.fireEvent('initialize', this);\r
-\r
-        this.doc.editorInitialized = true;\r
-\r
-        this.pushValue();\r
-    },\r
-\r
-    // private\r
-    onDestroy : function(){\r
-        if(this.monitorTask){\r
-            Ext.TaskMgr.stop(this.monitorTask);\r
-        }\r
-        if(this.rendered){\r
-            this.tb.items.each(function(item){\r
-                if(item.menu){\r
-                    item.menu.removeAll();\r
-                    if(item.menu.el){\r
-                        item.menu.el.destroy();\r
-                    }\r
-                }\r
-                item.destroy();\r
-            });\r
-            this.wrap.dom.innerHTML = '';\r
-            this.wrap.remove();\r
-        }\r
-    },\r
-\r
-    // private\r
-    onFirstFocus : function(){\r
-        this.activated = true;\r
-        this.tb.items.each(function(item){\r
-           item.enable();\r
-        });\r
-        if(Ext.isGecko){ // prevent silly gecko errors\r
-            this.win.focus();\r
-            var s = this.win.getSelection();\r
-            if(!s.focusNode || s.focusNode.nodeType != 3){\r
-                var r = s.getRangeAt(0);\r
-                r.selectNodeContents(this.getEditorBody());\r
-                r.collapse(true);\r
-                this.deferFocus();\r
-            }\r
-            try{\r
-                this.execCmd('useCSS', true);\r
-                this.execCmd('styleWithCSS', false);\r
-            }catch(e){}\r
-        }\r
-        this.fireEvent('activate', this);\r
-    },\r
-\r
-    // private\r
-    adjustFont: function(btn){\r
-        var adjust = btn.itemId == 'increasefontsize' ? 1 : -1;\r
-\r
-        var v = parseInt(this.doc.queryCommandValue('FontSize') || 2, 10);\r
-        if(Ext.isSafari3 || Ext.isAir){\r
-            // Safari 3 values\r
-            // 1 = 10px, 2 = 13px, 3 = 16px, 4 = 18px, 5 = 24px, 6 = 32px\r
-            if(v <= 10){\r
-                v = 1 + adjust;\r
-            }else if(v <= 13){\r
-                v = 2 + adjust;\r
-            }else if(v <= 16){\r
-                v = 3 + adjust;\r
-            }else if(v <= 18){\r
-                v = 4 + adjust;\r
-            }else if(v <= 24){\r
-                v = 5 + adjust;\r
-            }else {\r
-                v = 6 + adjust;\r
-            }\r
-            v = v.constrain(1, 6);\r
-        }else{\r
-            if(Ext.isSafari){ // safari\r
-                adjust *= 2;\r
-            }\r
-            v = Math.max(1, v+adjust) + (Ext.isSafari ? 'px' : 0);\r
-        }\r
-        this.execCmd('FontSize', v);\r
-    },\r
-\r
-    // private\r
-    onEditorEvent : function(e){\r
-        this.updateToolbar();\r
-    },\r
-\r
-\r
-    \r
-    updateToolbar: function(){\r
-\r
-        if(!this.activated){\r
-            this.onFirstFocus();\r
-            return;\r
-        }\r
-\r
-        var btns = this.tb.items.map, doc = this.doc;\r
-\r
-        if(this.enableFont && !Ext.isSafari2){\r
-            var name = (this.doc.queryCommandValue('FontName')||this.defaultFont).toLowerCase();\r
-            if(name != this.fontSelect.dom.value){\r
-                this.fontSelect.dom.value = name;\r
-            }\r
-        }\r
-        if(this.enableFormat){\r
-            btns.bold.toggle(doc.queryCommandState('bold'));\r
-            btns.italic.toggle(doc.queryCommandState('italic'));\r
-            btns.underline.toggle(doc.queryCommandState('underline'));\r
-        }\r
-        if(this.enableAlignments){\r
-            btns.justifyleft.toggle(doc.queryCommandState('justifyleft'));\r
-            btns.justifycenter.toggle(doc.queryCommandState('justifycenter'));\r
-            btns.justifyright.toggle(doc.queryCommandState('justifyright'));\r
-        }\r
-        if(!Ext.isSafari2 && this.enableLists){\r
-            btns.insertorderedlist.toggle(doc.queryCommandState('insertorderedlist'));\r
-            btns.insertunorderedlist.toggle(doc.queryCommandState('insertunorderedlist'));\r
-        }\r
-        \r
-        Ext.menu.MenuMgr.hideAll();\r
-\r
-        this.syncValue();\r
-    },\r
-\r
-    // private\r
-    relayBtnCmd : function(btn){\r
-        this.relayCmd(btn.itemId);\r
-    },\r
-\r
-    \r
-    relayCmd : function(cmd, value){\r
-        (function(){\r
-            this.focus();\r
-            this.execCmd(cmd, value);\r
-            this.updateToolbar();\r
-        }).defer(10, this);\r
-    },\r
-\r
-    \r
-    execCmd : function(cmd, value){\r
-        this.doc.execCommand(cmd, false, value === undefined ? null : value);\r
-        this.syncValue();\r
-    },\r
-\r
-    // private\r
-    applyCommand : function(e){\r
-        if(e.ctrlKey){\r
-            var c = e.getCharCode(), cmd;\r
-            if(c > 0){\r
-                c = String.fromCharCode(c);\r
-                switch(c){\r
-                    case 'b':\r
-                        cmd = 'bold';\r
-                    break;\r
-                    case 'i':\r
-                        cmd = 'italic';\r
-                    break;\r
-                    case 'u':\r
-                        cmd = 'underline';\r
-                    break;\r
-                }\r
-                if(cmd){\r
-                    this.win.focus();\r
-                    this.execCmd(cmd);\r
-                    this.deferFocus();\r
-                    e.preventDefault();\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    insertAtCursor : function(text){\r
-        if(!this.activated){\r
-            return;\r
-        }\r
-        if(Ext.isIE){\r
-            this.win.focus();\r
-            var r = this.doc.selection.createRange();\r
-            if(r){\r
-                r.collapse(true);\r
-                r.pasteHTML(text);\r
-                this.syncValue();\r
-                this.deferFocus();\r
-            }\r
-        }else if(Ext.isGecko || Ext.isOpera){\r
-            this.win.focus();\r
-            this.execCmd('InsertHTML', text);\r
-            this.deferFocus();\r
-        }else if(Ext.isSafari){\r
-            this.execCmd('InsertText', text);\r
-            this.deferFocus();\r
-        }\r
-    },\r
-\r
-    // private\r
-    fixKeys : function(){ // load time branching for fastest keydown performance\r
-        if(Ext.isIE){\r
-            return function(e){\r
-                var k = e.getKey(), r;\r
-                if(k == e.TAB){\r
-                    e.stopEvent();\r
-                    r = this.doc.selection.createRange();\r
-                    if(r){\r
-                        r.collapse(true);\r
-                        r.pasteHTML('&nbsp;&nbsp;&nbsp;&nbsp;');\r
-                        this.deferFocus();\r
-                    }\r
-                }else if(k == e.ENTER){\r
-                    r = this.doc.selection.createRange();\r
-                    if(r){\r
-                        var target = r.parentElement();\r
-                        if(!target || target.tagName.toLowerCase() != 'li'){\r
-                            e.stopEvent();\r
-                            r.pasteHTML('<br />');\r
-                            r.collapse(false);\r
-                            r.select();\r
-                        }\r
-                    }\r
-                }\r
-            };\r
-        }else if(Ext.isOpera){\r
-            return function(e){\r
-                var k = e.getKey();\r
-                if(k == e.TAB){\r
-                    e.stopEvent();\r
-                    this.win.focus();\r
-                    this.execCmd('InsertHTML','&nbsp;&nbsp;&nbsp;&nbsp;');\r
-                    this.deferFocus();\r
-                }\r
-            };\r
-        }else if(Ext.isSafari){\r
-            return function(e){\r
-                var k = e.getKey();\r
-                if(k == e.TAB){\r
-                    e.stopEvent();\r
-                    this.execCmd('InsertText','\t');\r
-                    this.deferFocus();\r
-                }\r
-             };\r
-        }\r
-    }(),\r
-\r
-    \r
-    getToolbar : function(){\r
-        return this.tb;\r
-    },\r
-\r
-    \r
-    buttonTips : {\r
-        bold : {\r
-            title: 'Bold (Ctrl+B)',\r
-            text: 'Make the selected text bold.',\r
-            cls: 'x-html-editor-tip'\r
-        },\r
-        italic : {\r
-            title: 'Italic (Ctrl+I)',\r
-            text: 'Make the selected text italic.',\r
-            cls: 'x-html-editor-tip'\r
-        },\r
-        underline : {\r
-            title: 'Underline (Ctrl+U)',\r
-            text: 'Underline the selected text.',\r
-            cls: 'x-html-editor-tip'\r
-        },\r
-        increasefontsize : {\r
-            title: 'Grow Text',\r
-            text: 'Increase the font size.',\r
-            cls: 'x-html-editor-tip'\r
-        },\r
-        decreasefontsize : {\r
-            title: 'Shrink Text',\r
-            text: 'Decrease the font size.',\r
-            cls: 'x-html-editor-tip'\r
-        },\r
-        backcolor : {\r
-            title: 'Text Highlight Color',\r
-            text: 'Change the background color of the selected text.',\r
-            cls: 'x-html-editor-tip'\r
-        },\r
-        forecolor : {\r
-            title: 'Font Color',\r
-            text: 'Change the color of the selected text.',\r
-            cls: 'x-html-editor-tip'\r
-        },\r
-        justifyleft : {\r
-            title: 'Align Text Left',\r
-            text: 'Align text to the left.',\r
-            cls: 'x-html-editor-tip'\r
-        },\r
-        justifycenter : {\r
-            title: 'Center Text',\r
-            text: 'Center text in the editor.',\r
-            cls: 'x-html-editor-tip'\r
-        },\r
-        justifyright : {\r
-            title: 'Align Text Right',\r
-            text: 'Align text to the right.',\r
-            cls: 'x-html-editor-tip'\r
-        },\r
-        insertunorderedlist : {\r
-            title: 'Bullet List',\r
-            text: 'Start a bulleted list.',\r
-            cls: 'x-html-editor-tip'\r
-        },\r
-        insertorderedlist : {\r
-            title: 'Numbered List',\r
-            text: 'Start a numbered list.',\r
-            cls: 'x-html-editor-tip'\r
-        },\r
-        createlink : {\r
-            title: 'Hyperlink',\r
-            text: 'Make the selected text a hyperlink.',\r
-            cls: 'x-html-editor-tip'\r
-        },\r
-        sourceedit : {\r
-            title: 'Source Edit',\r
-            text: 'Switch to source editing mode.',\r
-            cls: 'x-html-editor-tip'\r
-        }\r
-    }\r
-\r
-    // hide stuff that is not compatible\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-});\r
-Ext.reg('htmleditor', Ext.form.HtmlEditor);\r
-\r
-Ext.form.TimeField = Ext.extend(Ext.form.ComboBox, {\r
-    \r
-    minValue : null,\r
-    \r
-    maxValue : null,\r
-    \r
-    minText : "The time in this field must be equal to or after {0}",\r
-    \r
-    maxText : "The time in this field must be equal to or before {0}",\r
-    \r
-    invalidText : "{0} is not a valid time",\r
-    \r
-    format : "g:i A",\r
-    \r
-    altFormats : "g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H",\r
-    \r
-    increment: 15,\r
-\r
-    // private override\r
-    mode: 'local',\r
-    // private override\r
-    triggerAction: 'all',\r
-    // private override\r
-    typeAhead: false,\r
-    \r
-    // private - This is the date to use when generating time values in the absence of either minValue\r
-    // or maxValue.  Using the current date causes DST issues on DST boundary dates, so this is an \r
-    // arbitrary "safe" date that can be any date aside from DST boundary dates.\r
-    initDate: '1/1/2008',\r
-\r
-    // private\r
-    initComponent : function(){\r
-        Ext.form.TimeField.superclass.initComponent.call(this);\r
-\r
-        if(typeof this.minValue == "string"){\r
-            this.minValue = this.parseDate(this.minValue);\r
-        }\r
-        if(typeof this.maxValue == "string"){\r
-            this.maxValue = this.parseDate(this.maxValue);\r
-        }\r
-\r
-        if(!this.store){\r
-            var min = this.parseDate(this.minValue);\r
-            if(!min){\r
-                min = new Date(this.initDate).clearTime();\r
-            }\r
-            var max = this.parseDate(this.maxValue);\r
-            if(!max){\r
-                max = new Date(this.initDate).clearTime().add('mi', (24 * 60) - 1);\r
-            }\r
-            var times = [];\r
-            while(min <= max){\r
-                times.push([min.dateFormat(this.format)]);\r
-                min = min.add('mi', this.increment);\r
-            }\r
-            this.store = new Ext.data.SimpleStore({\r
-                fields: ['text'],\r
-                data : times\r
-            });\r
-            this.displayField = 'text';\r
-        }\r
-    },\r
-\r
-    // inherited docs\r
-    getValue : function(){\r
-        var v = Ext.form.TimeField.superclass.getValue.call(this);\r
-        return this.formatDate(this.parseDate(v)) || '';\r
-    },\r
-\r
-    // inherited docs\r
-    setValue : function(value){\r
-        Ext.form.TimeField.superclass.setValue.call(this, this.formatDate(this.parseDate(value)));\r
-    },\r
-\r
-    // private overrides\r
-    validateValue : Ext.form.DateField.prototype.validateValue,\r
-    parseDate : Ext.form.DateField.prototype.parseDate,\r
-    formatDate : Ext.form.DateField.prototype.formatDate,\r
-\r
-    // private\r
-    beforeBlur : function(){\r
-        var v = this.parseDate(this.getRawValue());\r
-        if(v){\r
-            this.setValue(v.dateFormat(this.format));\r
-        }\r
-    }\r
-\r
-    \r
-    \r
-    \r
-    \r
-});\r
-Ext.reg('timefield', Ext.form.TimeField);\r
-\r
-Ext.form.Label = Ext.extend(Ext.BoxComponent, {\r
-    \r
-    \r
-    \r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        if(!this.el){\r
-            this.el = document.createElement('label');\r
-            this.el.id = this.getId();\r
-            this.el.innerHTML = this.text ? Ext.util.Format.htmlEncode(this.text) : (this.html || '');\r
-            if(this.forId){\r
-                this.el.setAttribute('for', this.forId);\r
-            }\r
-        }\r
-        Ext.form.Label.superclass.onRender.call(this, ct, position);\r
-    },\r
-    \r
-    \r
-    setText: function(t, encode){\r
-        this.text = t;\r
-        if(this.rendered){\r
-            this.el.dom.innerHTML = encode !== false ? Ext.util.Format.htmlEncode(t) : t;\r
-        }\r
-        return this;\r
-    }\r
-});\r
-\r
-Ext.reg('label', Ext.form.Label);\r
-\r
-Ext.form.Action = function(form, options){\r
-    this.form = form;\r
-    this.options = options || {};\r
-};\r
-\r
-\r
-Ext.form.Action.CLIENT_INVALID = 'client';\r
-\r
-Ext.form.Action.SERVER_INVALID = 'server';\r
-\r
-Ext.form.Action.CONNECT_FAILURE = 'connect';\r
-\r
-Ext.form.Action.LOAD_FAILURE = 'load';\r
-\r
-Ext.form.Action.prototype = {\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-    type : 'default',\r
-\r
-\r
-    // interface method\r
-    run : function(options){\r
-\r
-    },\r
-\r
-    // interface method\r
-    success : function(response){\r
-\r
-    },\r
-\r
-    // interface method\r
-    handleResponse : function(response){\r
-\r
-    },\r
-\r
-    // default connection failure\r
-    failure : function(response){\r
-        this.response = response;\r
-        this.failureType = Ext.form.Action.CONNECT_FAILURE;\r
-        this.form.afterAction(this, false);\r
-    },\r
-\r
-    // private\r
-    processResponse : function(response){\r
-        this.response = response;\r
-        if(!response.responseText){\r
-            return true;\r
-        }\r
-        this.result = this.handleResponse(response);\r
-        return this.result;\r
-    },\r
-\r
-    // utility functions used internally\r
-    getUrl : function(appendParams){\r
-        var url = this.options.url || this.form.url || this.form.el.dom.action;\r
-        if(appendParams){\r
-            var p = this.getParams();\r
-            if(p){\r
-                url += (url.indexOf('?') != -1 ? '&' : '?') + p;\r
-            }\r
-        }\r
-        return url;\r
-    },\r
-\r
-    // private\r
-    getMethod : function(){\r
-        return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase();\r
-    },\r
-\r
-    // private\r
-    getParams : function(){\r
-        var bp = this.form.baseParams;\r
-        var p = this.options.params;\r
-        if(p){\r
-            if(typeof p == "object"){\r
-                p = Ext.urlEncode(Ext.applyIf(p, bp));\r
-            }else if(typeof p == 'string' && bp){\r
-                p += '&' + Ext.urlEncode(bp);\r
-            }\r
-        }else if(bp){\r
-            p = Ext.urlEncode(bp);\r
-        }\r
-        return p;\r
-    },\r
-\r
-    // private\r
-    createCallback : function(opts){\r
-               var opts = opts || {};\r
-        return {\r
-            success: this.success,\r
-            failure: this.failure,\r
-            scope: this,\r
-            timeout: (opts.timeout*1000) || (this.form.timeout*1000),\r
-            upload: this.form.fileUpload ? this.success : undefined\r
-        };\r
-    }\r
-};\r
-\r
-\r
-Ext.form.Action.Submit = function(form, options){\r
-    Ext.form.Action.Submit.superclass.constructor.call(this, form, options);\r
-};\r
-\r
-Ext.extend(Ext.form.Action.Submit, Ext.form.Action, {\r
-    \r
-    \r
-    type : 'submit',\r
-\r
-    // private\r
-    run : function(){\r
-        var o = this.options;\r
-        var method = this.getMethod();\r
-        var isGet = method == 'GET';\r
-        if(o.clientValidation === false || this.form.isValid()){\r
-            Ext.Ajax.request(Ext.apply(this.createCallback(o), {\r
-                form:this.form.el.dom,\r
-                url:this.getUrl(isGet),\r
-                method: method,\r
-                headers: o.headers,\r
-                params:!isGet ? this.getParams() : null,\r
-                isUpload: this.form.fileUpload\r
-            }));\r
-        }else if (o.clientValidation !== false){ // client validation failed\r
-            this.failureType = Ext.form.Action.CLIENT_INVALID;\r
-            this.form.afterAction(this, false);\r
-        }\r
-    },\r
-\r
-    // private\r
-    success : function(response){\r
-        var result = this.processResponse(response);\r
-        if(result === true || result.success){\r
-            this.form.afterAction(this, true);\r
-            return;\r
-        }\r
-        if(result.errors){\r
-            this.form.markInvalid(result.errors);\r
-            this.failureType = Ext.form.Action.SERVER_INVALID;\r
-        }\r
-        this.form.afterAction(this, false);\r
-    },\r
-\r
-    // private\r
-    handleResponse : function(response){\r
-        if(this.form.errorReader){\r
-            var rs = this.form.errorReader.read(response);\r
-            var errors = [];\r
-            if(rs.records){\r
-                for(var i = 0, len = rs.records.length; i < len; i++) {\r
-                    var r = rs.records[i];\r
-                    errors[i] = r.data;\r
-                }\r
-            }\r
-            if(errors.length < 1){\r
-                errors = null;\r
-            }\r
-            return {\r
-                success : rs.success,\r
-                errors : errors\r
-            };\r
-        }\r
-        return Ext.decode(response.responseText);\r
-    }\r
-});\r
-\r
-\r
-\r
-Ext.form.Action.Load = function(form, options){\r
-    Ext.form.Action.Load.superclass.constructor.call(this, form, options);\r
-    this.reader = this.form.reader;\r
-};\r
-\r
-Ext.extend(Ext.form.Action.Load, Ext.form.Action, {\r
-    // private\r
-    type : 'load',\r
-\r
-    // private\r
-    run : function(){\r
-        Ext.Ajax.request(Ext.apply(\r
-                this.createCallback(this.options), {\r
-                    method:this.getMethod(),\r
-                    url:this.getUrl(false),\r
-                    headers: this.options.headers,\r
-                    params:this.getParams()\r
-        }));\r
-    },\r
-\r
-    // private\r
-    success : function(response){\r
-        var result = this.processResponse(response);\r
-        if(result === true || !result.success || !result.data){\r
-            this.failureType = Ext.form.Action.LOAD_FAILURE;\r
-            this.form.afterAction(this, false);\r
-            return;\r
-        }\r
-        this.form.clearInvalid();\r
-        this.form.setValues(result.data);\r
-        this.form.afterAction(this, true);\r
-    },\r
-\r
-    // private\r
-    handleResponse : function(response){\r
-        if(this.form.reader){\r
-            var rs = this.form.reader.read(response);\r
-            var data = rs.records && rs.records[0] ? rs.records[0].data : null;\r
-            return {\r
-                success : rs.success,\r
-                data : data\r
-            };\r
-        }\r
-        return Ext.decode(response.responseText);\r
-    }\r
-});\r
-\r
-Ext.form.Action.ACTION_TYPES = {\r
-    'load' : Ext.form.Action.Load,\r
-    'submit' : Ext.form.Action.Submit\r
-};\r
-\r
-\r
-Ext.form.VTypes = function(){\r
-    // closure these in so they are only created once.\r
-    var alpha = /^[a-zA-Z_]+$/;\r
-    var alphanum = /^[a-zA-Z0-9_]+$/;\r
-    var email = /^([\w]+)(\.[\w]+)*@([\w\-]+\.){1,5}([A-Za-z]){2,4}$/;\r
-    var url = /(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;\r
-\r
-    // All these messages and functions are configurable\r
-    return {\r
-        \r
-        'email' : function(v){\r
-            return email.test(v);\r
-        },\r
-        \r
-        'emailText' : 'This field should be an e-mail address in the format "user@domain.com"',\r
-        \r
-        'emailMask' : /[a-z0-9_\.\-@]/i,\r
-\r
-        \r
-        'url' : function(v){\r
-            return url.test(v);\r
-        },\r
-        \r
-        'urlText' : 'This field should be a URL in the format "http:/'+'/www.domain.com"',\r
-        \r
-        \r
-        'alpha' : function(v){\r
-            return alpha.test(v);\r
-        },\r
-        \r
-        'alphaText' : 'This field should only contain letters and _',\r
-        \r
-        'alphaMask' : /[a-z_]/i,\r
-\r
-        \r
-        'alphanum' : function(v){\r
-            return alphanum.test(v);\r
-        },\r
-        \r
-        'alphanumText' : 'This field should only contain letters, numbers and _',\r
-        \r
-        'alphanumMask' : /[a-z0-9_]/i\r
-    };\r
-}();\r
-\r
-Ext.grid.GridPanel = Ext.extend(Ext.Panel, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-    \r
-    ddText : "{0} selected row{1}",\r
-    \r
-    minColumnWidth : 25,\r
-    \r
-    trackMouseOver : true,\r
-    \r
-    enableDragDrop : false,\r
-    \r
-    enableColumnMove : true,\r
-    \r
-    enableColumnHide : true,\r
-    \r
-    enableHdMenu : true,\r
-    \r
-    stripeRows : false,\r
-    \r
-    autoExpandColumn : false,\r
-    \r
-    autoExpandMin : 50,\r
-    \r
-    autoExpandMax : 1000,\r
-    \r
-    view : null,\r
-    \r
-    loadMask : false,\r
-\r
-    \r
-    deferRowRender : true,\r
-\r
-    // private\r
-    rendered : false,\r
-    // private\r
-    viewReady: false,\r
-    \r
-    stateEvents: ["columnmove", "columnresize", "sortchange"],\r
-\r
-    // private\r
-    initComponent : function(){\r
-        Ext.grid.GridPanel.superclass.initComponent.call(this);\r
-\r
-        // override any provided value since it isn't valid\r
-        this.autoScroll = false;\r
-        this.autoWidth = false;\r
-\r
-        if(Ext.isArray(this.columns)){\r
-            this.colModel = new Ext.grid.ColumnModel(this.columns);\r
-            delete this.columns;\r
-        }\r
-\r
-        // check and correct shorthanded configs\r
-        if(this.ds){\r
-            this.store = this.ds;\r
-            delete this.ds;\r
-        }\r
-        if(this.cm){\r
-            this.colModel = this.cm;\r
-            delete this.cm;\r
-        }\r
-        if(this.sm){\r
-            this.selModel = this.sm;\r
-            delete this.sm;\r
-        }\r
-        this.store = Ext.StoreMgr.lookup(this.store);\r
-\r
-        this.addEvents(\r
-            // raw events\r
-            \r
-            "click",\r
-            \r
-            "dblclick",\r
-            \r
-            "contextmenu",\r
-            \r
-            "mousedown",\r
-            \r
-            "mouseup",\r
-            \r
-            "mouseover",\r
-            \r
-            "mouseout",\r
-            \r
-            "keypress",\r
-            \r
-            "keydown",\r
-\r
-            // custom events\r
-            \r
-            "cellmousedown",\r
-            \r
-            "rowmousedown",\r
-            \r
-            "headermousedown",\r
-\r
-            \r
-            "cellclick",\r
-            \r
-            "celldblclick",\r
-            \r
-            "rowclick",\r
-            \r
-            "rowdblclick",\r
-            \r
-            "headerclick",\r
-            \r
-            "headerdblclick",\r
-            \r
-            "rowcontextmenu",\r
-            \r
-            "cellcontextmenu",\r
-            \r
-            "headercontextmenu",\r
-            \r
-            "bodyscroll",\r
-            \r
-            "columnresize",\r
-            \r
-            "columnmove",\r
-            \r
-            "sortchange"\r
-        );\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        Ext.grid.GridPanel.superclass.onRender.apply(this, arguments);\r
-\r
-        var c = this.body;\r
-\r
-        this.el.addClass('x-grid-panel');\r
-\r
-        var view = this.getView();\r
-        view.init(this);\r
-\r
-        c.on("mousedown", this.onMouseDown, this);\r
-        c.on("click", this.onClick, this);\r
-        c.on("dblclick", this.onDblClick, this);\r
-        c.on("contextmenu", this.onContextMenu, this);\r
-        c.on("keydown", this.onKeyDown, this);\r
-\r
-        this.relayEvents(c, ["mousedown","mouseup","mouseover","mouseout","keypress"]);\r
-\r
-        this.getSelectionModel().init(this);\r
-        this.view.render();\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        Ext.grid.GridPanel.superclass.initEvents.call(this);\r
-\r
-        if(this.loadMask){\r
-            this.loadMask = new Ext.LoadMask(this.bwrap,\r
-                    Ext.apply({store:this.store}, this.loadMask));\r
-        }\r
-    },\r
-\r
-    initStateEvents : function(){\r
-        Ext.grid.GridPanel.superclass.initStateEvents.call(this);\r
-        this.colModel.on('hiddenchange', this.saveState, this, {delay: 100});\r
-    },\r
-\r
-    applyState : function(state){\r
-        var cm = this.colModel;\r
-        var cs = state.columns;\r
-        if(cs){\r
-            for(var i = 0, len = cs.length; i < len; i++){\r
-                var s = cs[i];\r
-                var c = cm.getColumnById(s.id);\r
-                if(c){\r
-                    c.hidden = s.hidden;\r
-                    c.width = s.width;\r
-                    var oldIndex = cm.getIndexById(s.id);\r
-                    if(oldIndex != i){\r
-                        cm.moveColumn(oldIndex, i);\r
-                    }\r
-                }\r
-            }\r
-        }\r
-        if(state.sort){\r
-            this.store[this.store.remoteSort ? 'setDefaultSort' : 'sort'](state.sort.field, state.sort.direction);\r
-        }\r
-    },\r
-\r
-    getState : function(){\r
-        var o = {columns: []};\r
-        for(var i = 0, c; c = this.colModel.config[i]; i++){\r
-            o.columns[i] = {\r
-                id: c.id,\r
-                width: c.width\r
-            };\r
-            if(c.hidden){\r
-                o.columns[i].hidden = true;\r
-            }\r
-        }\r
-        var ss = this.store.getSortState();\r
-        if(ss){\r
-            o.sort = ss;\r
-        }\r
-        return o;\r
-    },\r
-\r
-    // private\r
-    afterRender : function(){\r
-        Ext.grid.GridPanel.superclass.afterRender.call(this);\r
-        this.view.layout();\r
-        if(this.deferRowRender){\r
-            this.view.afterRender.defer(10, this.view);\r
-        }else{\r
-            this.view.afterRender();\r
-        }\r
-        this.viewReady = true;\r
-    },\r
-\r
-    \r
-    reconfigure : function(store, colModel){\r
-        if(this.loadMask){\r
-            this.loadMask.destroy();\r
-            this.loadMask = new Ext.LoadMask(this.bwrap,\r
-                    Ext.apply({store:store}, this.initialConfig.loadMask));\r
-        }\r
-        this.view.bind(store, colModel);\r
-        this.store = store;\r
-        this.colModel = colModel;\r
-        if(this.rendered){\r
-            this.view.refresh(true);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onKeyDown : function(e){\r
-        this.fireEvent("keydown", e);\r
-    },\r
-\r
-    // private\r
-    onDestroy : function(){\r
-        if(this.rendered){\r
-            if(this.loadMask){\r
-                this.loadMask.destroy();\r
-            }\r
-            var c = this.body;\r
-            c.removeAllListeners();\r
-            this.view.destroy();\r
-            c.update("");\r
-        }\r
-        this.colModel.purgeListeners();\r
-        Ext.grid.GridPanel.superclass.onDestroy.call(this);\r
-    },\r
-\r
-    // private\r
-    processEvent : function(name, e){\r
-        this.fireEvent(name, e);\r
-        var t = e.getTarget();\r
-        var v = this.view;\r
-        var header = v.findHeaderIndex(t);\r
-        if(header !== false){\r
-            this.fireEvent("header" + name, this, header, e);\r
-        }else{\r
-            var row = v.findRowIndex(t);\r
-            var cell = v.findCellIndex(t);\r
-            if(row !== false){\r
-                this.fireEvent("row" + name, this, row, e);\r
-                if(cell !== false){\r
-                    this.fireEvent("cell" + name, this, row, cell, e);\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    onClick : function(e){\r
-        this.processEvent("click", e);\r
-    },\r
-\r
-    // private\r
-    onMouseDown : function(e){\r
-        this.processEvent("mousedown", e);\r
-    },\r
-\r
-    // private\r
-    onContextMenu : function(e, t){\r
-        this.processEvent("contextmenu", e);\r
-    },\r
-\r
-    // private\r
-    onDblClick : function(e){\r
-        this.processEvent("dblclick", e);\r
-    },\r
-\r
-    // private\r
-    walkCells : function(row, col, step, fn, scope){\r
-        var cm = this.colModel, clen = cm.getColumnCount();\r
-        var ds = this.store, rlen = ds.getCount(), first = true;\r
-        if(step < 0){\r
-            if(col < 0){\r
-                row--;\r
-                first = false;\r
-            }\r
-            while(row >= 0){\r
-                if(!first){\r
-                    col = clen-1;\r
-                }\r
-                first = false;\r
-                while(col >= 0){\r
-                    if(fn.call(scope || this, row, col, cm) === true){\r
-                        return [row, col];\r
-                    }\r
-                    col--;\r
-                }\r
-                row--;\r
-            }\r
-        } else {\r
-            if(col >= clen){\r
-                row++;\r
-                first = false;\r
-            }\r
-            while(row < rlen){\r
-                if(!first){\r
-                    col = 0;\r
-                }\r
-                first = false;\r
-                while(col < clen){\r
-                    if(fn.call(scope || this, row, col, cm) === true){\r
-                        return [row, col];\r
-                    }\r
-                    col++;\r
-                }\r
-                row++;\r
-            }\r
-        }\r
-        return null;\r
-    },\r
-\r
-    // private\r
-    getSelections : function(){\r
-        return this.selModel.getSelections();\r
-    },\r
-\r
-    // private\r
-    onResize : function(){\r
-        Ext.grid.GridPanel.superclass.onResize.apply(this, arguments);\r
-        if(this.viewReady){\r
-            this.view.layout();\r
-        }\r
-    },\r
-\r
-    \r
-    getGridEl : function(){\r
-        return this.body;\r
-    },\r
-\r
-    // private for compatibility, overridden by editor grid\r
-    stopEditing : Ext.emptyFn,\r
-\r
-    \r
-    getSelectionModel : function(){\r
-        if(!this.selModel){\r
-            this.selModel = new Ext.grid.RowSelectionModel(\r
-                    this.disableSelection ? {selectRow: Ext.emptyFn} : null);\r
-        }\r
-        return this.selModel;\r
-    },\r
-\r
-    \r
-    getStore : function(){\r
-        return this.store;\r
-    },\r
-\r
-    \r
-    getColumnModel : function(){\r
-        return this.colModel;\r
-    },\r
-\r
-    \r
-    getView : function(){\r
-        if(!this.view){\r
-            this.view = new Ext.grid.GridView(this.viewConfig);\r
-        }\r
-        return this.view;\r
-    },\r
-    \r
-    getDragDropText : function(){\r
-        var count = this.selModel.getCount();\r
-        return String.format(this.ddText, count, count == 1 ? '' : 's');\r
-    }\r
-\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-\r
-\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-});\r
-Ext.reg('grid', Ext.grid.GridPanel);\r
-\r
-Ext.grid.GridView = function(config){\r
-    Ext.apply(this, config);\r
-    // These events are only used internally by the grid components\r
-    this.addEvents(\r
-      \r
-      "beforerowremoved",\r
-      \r
-      "beforerowsinserted",\r
-      \r
-      "beforerefresh",\r
-      \r
-      "rowremoved",\r
-      \r
-      "rowsinserted",\r
-      \r
-      "rowupdated",\r
-      \r
-      "refresh"\r
-  );\r
-    Ext.grid.GridView.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.grid.GridView, Ext.util.Observable, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    deferEmptyText: true,\r
-    \r
-    scrollOffset: 19,\r
-    \r
-    autoFill: false,\r
-    \r
-    forceFit: false,\r
-    \r
-    sortClasses : ["sort-asc", "sort-desc"],\r
-    \r
-    sortAscText : "Sort Ascending",\r
-    \r
-    sortDescText : "Sort Descending",\r
-    \r
-    columnsText : "Columns",\r
-\r
-    // private\r
-    borderWidth: 2,\r
-    tdClass: 'x-grid3-cell',\r
-    hdCls: 'x-grid3-hd',\r
-\r
-    \r
-    cellSelectorDepth: 4,\r
-    \r
-    rowSelectorDepth: 10,\r
-\r
-    \r
-    cellSelector: 'td.x-grid3-cell',\r
-    \r
-    rowSelector: 'div.x-grid3-row',\r
-\r
-    \r
-\r
-    // private\r
-    initTemplates : function(){\r
-        var ts = this.templates || {};\r
-        if(!ts.master){\r
-            ts.master = new Ext.Template(\r
-                    '<div class="x-grid3" hidefocus="true">',\r
-                        '<div class="x-grid3-viewport">',\r
-                            '<div class="x-grid3-header"><div class="x-grid3-header-inner"><div class="x-grid3-header-offset">{header}</div></div><div class="x-clear"></div></div>',\r
-                            '<div class="x-grid3-scroller"><div class="x-grid3-body">{body}</div><a href="#" class="x-grid3-focus" tabIndex="-1"></a></div>',\r
-                        "</div>",\r
-                        '<div class="x-grid3-resize-marker">&#160;</div>',\r
-                        '<div class="x-grid3-resize-proxy">&#160;</div>',\r
-                    "</div>"\r
-                    );\r
-        }\r
-\r
-        if(!ts.header){\r
-            ts.header = new Ext.Template(\r
-                    '<table border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',\r
-                    '<thead><tr class="x-grid3-hd-row">{cells}</tr></thead>',\r
-                    "</table>"\r
-                    );\r
-        }\r
-\r
-        if(!ts.hcell){\r
-            ts.hcell = new Ext.Template(\r
-                    '<td class="x-grid3-hd x-grid3-cell x-grid3-td-{id} {css}" style="{style}"><div {tooltip} {attr} class="x-grid3-hd-inner x-grid3-hd-{id}" unselectable="on" style="{istyle}">', this.grid.enableHdMenu ? '<a class="x-grid3-hd-btn" href="#"></a>' : '',\r
-                    '{value}<img class="x-grid3-sort-icon" src="', Ext.BLANK_IMAGE_URL, '" />',\r
-                    "</div></td>"\r
-                    );\r
-        }\r
-\r
-        if(!ts.body){\r
-            ts.body = new Ext.Template('{rows}');\r
-        }\r
-\r
-        if(!ts.row){\r
-            ts.row = new Ext.Template(\r
-                    '<div class="x-grid3-row {alt}" style="{tstyle}"><table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',\r
-                    '<tbody><tr>{cells}</tr>',\r
-                    (this.enableRowBody ? '<tr class="x-grid3-row-body-tr" style="{bodyStyle}"><td colspan="{cols}" class="x-grid3-body-cell" tabIndex="0" hidefocus="on"><div class="x-grid3-row-body">{body}</div></td></tr>' : ''),\r
-                    '</tbody></table></div>'\r
-                    );\r
-        }\r
-\r
-        if(!ts.cell){\r
-            ts.cell = new Ext.Template(\r
-                    '<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} {css}" style="{style}" tabIndex="0" {cellAttr}>',\r
-                    '<div class="x-grid3-cell-inner x-grid3-col-{id}" unselectable="on" {attr}>{value}</div>',\r
-                    "</td>"\r
-                    );\r
-        }\r
-\r
-        for(var k in ts){\r
-            var t = ts[k];\r
-            if(t && typeof t.compile == 'function' && !t.compiled){\r
-                t.disableFormats = true;\r
-                t.compile();\r
-            }\r
-        }\r
-\r
-        this.templates = ts;\r
-        this.colRe = new RegExp("x-grid3-td-([^\\s]+)", "");\r
-    },\r
-\r
-    // private\r
-    fly : function(el){\r
-        if(!this._flyweight){\r
-            this._flyweight = new Ext.Element.Flyweight(document.body);\r
-        }\r
-        this._flyweight.dom = el;\r
-        return this._flyweight;\r
-    },\r
-\r
-    // private\r
-    getEditorParent : function(){\r
-        return this.scroller.dom;\r
-    },\r
-\r
-    // private\r
-    initElements : function(){\r
-        var E = Ext.Element;\r
-\r
-        var el = this.grid.getGridEl().dom.firstChild;\r
-        var cs = el.childNodes;\r
-\r
-        this.el = new E(el);\r
-\r
-        this.mainWrap = new E(cs[0]);\r
-        this.mainHd = new E(this.mainWrap.dom.firstChild);\r
-\r
-        if(this.grid.hideHeaders){\r
-            this.mainHd.setDisplayed(false);\r
-        }\r
-\r
-        this.innerHd = this.mainHd.dom.firstChild;\r
-        this.scroller = new E(this.mainWrap.dom.childNodes[1]);\r
-        if(this.forceFit){\r
-            this.scroller.setStyle('overflow-x', 'hidden');\r
-        }\r
-        \r
-        this.mainBody = new E(this.scroller.dom.firstChild);\r
-\r
-        this.focusEl = new E(this.scroller.dom.childNodes[1]);\r
-        this.focusEl.swallowEvent("click", true);\r
-\r
-        this.resizeMarker = new E(cs[1]);\r
-        this.resizeProxy = new E(cs[2]);\r
-    },\r
-\r
-    // private\r
-    getRows : function(){\r
-        return this.hasRows() ? this.mainBody.dom.childNodes : [];\r
-    },\r
-\r
-    // finder methods, used with delegation\r
-\r
-    // private\r
-    findCell : function(el){\r
-        if(!el){\r
-            return false;\r
-        }\r
-        return this.fly(el).findParent(this.cellSelector, this.cellSelectorDepth);\r
-    },\r
-\r
-    // private\r
-    findCellIndex : function(el, requiredCls){\r
-        var cell = this.findCell(el);\r
-        if(cell && (!requiredCls || this.fly(cell).hasClass(requiredCls))){\r
-            return this.getCellIndex(cell);\r
-        }\r
-        return false;\r
-    },\r
-\r
-    // private\r
-    getCellIndex : function(el){\r
-        if(el){\r
-            var m = el.className.match(this.colRe);\r
-            if(m && m[1]){\r
-                return this.cm.getIndexById(m[1]);\r
-            }\r
-        }\r
-        return false;\r
-    },\r
-\r
-    // private\r
-    findHeaderCell : function(el){\r
-        var cell = this.findCell(el);\r
-        return cell && this.fly(cell).hasClass(this.hdCls) ? cell : null;\r
-    },\r
-\r
-    // private\r
-    findHeaderIndex : function(el){\r
-        return this.findCellIndex(el, this.hdCls);\r
-    },\r
-\r
-\r
-    findRow : function(el){\r
-        if(!el){\r
-            return false;\r
-        }\r
-        return this.fly(el).findParent(this.rowSelector, this.rowSelectorDepth);\r
-    },\r
-\r
-\r
-    findRowIndex : function(el){\r
-        var r = this.findRow(el);\r
-        return r ? r.rowIndex : false;\r
-    },\r
-\r
-    // getter methods for fetching elements dynamically in the grid\r
-\r
-\r
-    getRow : function(row){\r
-        return this.getRows()[row];\r
-    },\r
-\r
-\r
-    getCell : function(row, col){\r
-        return this.getRow(row).getElementsByTagName('td')[col];\r
-    },\r
-\r
-\r
-    getHeaderCell : function(index){\r
-      return this.mainHd.dom.getElementsByTagName('td')[index];\r
-    },\r
-\r
-    // manipulating elements\r
-\r
-    // private - use getRowClass to apply custom row classes\r
-    addRowClass : function(row, cls){\r
-        var r = this.getRow(row);\r
-        if(r){\r
-            this.fly(r).addClass(cls);\r
-        }\r
-    },\r
-\r
-    // private\r
-    removeRowClass : function(row, cls){\r
-        var r = this.getRow(row);\r
-        if(r){\r
-            this.fly(r).removeClass(cls);\r
-        }\r
-    },\r
-\r
-    // private\r
-    removeRow : function(row){\r
-        Ext.removeNode(this.getRow(row));\r
-        this.syncFocusEl(row);\r
-    },\r
-    \r
-    // private\r
-    removeRows : function(firstRow, lastRow){\r
-        var bd = this.mainBody.dom;\r
-        for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){\r
-            Ext.removeNode(bd.childNodes[firstRow]);\r
-        }\r
-        this.syncFocusEl(firstRow);\r
-    },\r
-\r
-    // scrolling stuff\r
-\r
-    // private\r
-    getScrollState : function(){\r
-        var sb = this.scroller.dom;\r
-        return {left: sb.scrollLeft, top: sb.scrollTop};\r
-    },\r
-\r
-    // private\r
-    restoreScroll : function(state){\r
-        var sb = this.scroller.dom;\r
-        sb.scrollLeft = state.left;\r
-        sb.scrollTop = state.top;\r
-    },\r
-\r
-    \r
-    scrollToTop : function(){\r
-        this.scroller.dom.scrollTop = 0;\r
-        this.scroller.dom.scrollLeft = 0;\r
-    },\r
-\r
-    // private\r
-    syncScroll : function(){\r
-      this.syncHeaderScroll();\r
-      var mb = this.scroller.dom;\r
-        this.grid.fireEvent("bodyscroll", mb.scrollLeft, mb.scrollTop);\r
-    },\r
-\r
-    // private\r
-    syncHeaderScroll : function(){\r
-        var mb = this.scroller.dom;\r
-        this.innerHd.scrollLeft = mb.scrollLeft;\r
-        this.innerHd.scrollLeft = mb.scrollLeft; // second time for IE (1/2 time first fails, other browsers ignore)\r
-    },\r
-\r
-    // private\r
-    updateSortIcon : function(col, dir){\r
-        var sc = this.sortClasses;\r
-        var hds = this.mainHd.select('td').removeClass(sc);\r
-        hds.item(col).addClass(sc[dir == "DESC" ? 1 : 0]);\r
-    },\r
-\r
-    // private\r
-    updateAllColumnWidths : function(){\r
-        var tw = this.getTotalWidth();\r
-        var clen = this.cm.getColumnCount();\r
-        var ws = [];\r
-        for(var i = 0; i < clen; i++){\r
-            ws[i] = this.getColumnWidth(i);\r
-        }\r
-\r
-        this.innerHd.firstChild.firstChild.style.width = tw;\r
-\r
-        for(var i = 0; i < clen; i++){\r
-            var hd = this.getHeaderCell(i);\r
-            hd.style.width = ws[i];\r
-        }\r
-\r
-        var ns = this.getRows(), row, trow;\r
-        for(var i = 0, len = ns.length; i < len; i++){\r
-            row = ns[i];\r
-            row.style.width = tw;\r
-            if(row.firstChild){\r
-                row.firstChild.style.width = tw;\r
-                trow = row.firstChild.rows[0];\r
-                for (var j = 0; j < clen; j++) {\r
-                   trow.childNodes[j].style.width = ws[j];\r
-                }\r
-            }\r
-        }\r
-\r
-        this.onAllColumnWidthsUpdated(ws, tw);\r
-    },\r
-\r
-    // private\r
-    updateColumnWidth : function(col, width){\r
-        var w = this.getColumnWidth(col);\r
-        var tw = this.getTotalWidth();\r
-\r
-        this.innerHd.firstChild.firstChild.style.width = tw;\r
-        var hd = this.getHeaderCell(col);\r
-        hd.style.width = w;\r
-\r
-        var ns = this.getRows(), row;\r
-        for(var i = 0, len = ns.length; i < len; i++){\r
-            row = ns[i];\r
-            row.style.width = tw;\r
-            if(row.firstChild){\r
-                row.firstChild.style.width = tw;\r
-                row.firstChild.rows[0].childNodes[col].style.width = w;\r
-            }\r
-        }\r
-\r
-        this.onColumnWidthUpdated(col, w, tw);\r
-    },\r
-\r
-    // private\r
-    updateColumnHidden : function(col, hidden){\r
-        var tw = this.getTotalWidth();\r
-\r
-        this.innerHd.firstChild.firstChild.style.width = tw;\r
-\r
-        var display = hidden ? 'none' : '';\r
-\r
-        var hd = this.getHeaderCell(col);\r
-        hd.style.display = display;\r
-\r
-        var ns = this.getRows(), row;\r
-        for(var i = 0, len = ns.length; i < len; i++){\r
-            row = ns[i];\r
-            row.style.width = tw;\r
-            if(row.firstChild){\r
-                row.firstChild.style.width = tw;\r
-                row.firstChild.rows[0].childNodes[col].style.display = display;\r
-            }\r
-        }\r
-\r
-        this.onColumnHiddenUpdated(col, hidden, tw);\r
-\r
-        delete this.lastViewWidth; // force recalc\r
-        this.layout();\r
-    },\r
-\r
-    // private\r
-    doRender : function(cs, rs, ds, startRow, colCount, stripe){\r
-        var ts = this.templates, ct = ts.cell, rt = ts.row, last = colCount-1;\r
-        var tstyle = 'width:'+this.getTotalWidth()+';';\r
-        // buffers\r
-        var buf = [], cb, c, p = {}, rp = {tstyle: tstyle}, r;\r
-        for(var j = 0, len = rs.length; j < len; j++){\r
-            r = rs[j]; cb = [];\r
-            var rowIndex = (j+startRow);\r
-            for(var i = 0; i < colCount; i++){\r
-                c = cs[i];\r
-                p.id = c.id;\r
-                p.css = i == 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');\r
-                p.attr = p.cellAttr = "";\r
-                p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds);\r
-                p.style = c.style;\r
-                if(p.value == undefined || p.value === "") p.value = "&#160;";\r
-                if(r.dirty && typeof r.modified[c.name] !== 'undefined'){\r
-                    p.css += ' x-grid3-dirty-cell';\r
-                }\r
-                cb[cb.length] = ct.apply(p);\r
-            }\r
-            var alt = [];\r
-            if(stripe && ((rowIndex+1) % 2 == 0)){\r
-                alt[0] = "x-grid3-row-alt";\r
-            }\r
-            if(r.dirty){\r
-                alt[1] = " x-grid3-dirty-row";\r
-            }\r
-            rp.cols = colCount;\r
-            if(this.getRowClass){\r
-                alt[2] = this.getRowClass(r, rowIndex, rp, ds);\r
-            }\r
-            rp.alt = alt.join(" ");\r
-            rp.cells = cb.join("");\r
-            buf[buf.length] =  rt.apply(rp);\r
-        }\r
-        return buf.join("");\r
-    },\r
-\r
-    // private\r
-    processRows : function(startRow, skipStripe){\r
-        if(this.ds.getCount() < 1){\r
-            return;\r
-        }\r
-        skipStripe = skipStripe || !this.grid.stripeRows;\r
-        startRow = startRow || 0;\r
-        var rows = this.getRows();\r
-        var cls = ' x-grid3-row-alt ';\r
-        rows[0].className += ' x-grid3-row-first';\r
-        rows[rows.length - 1].className += ' x-grid3-row-last';\r
-        for(var i = startRow, len = rows.length; i < len; i++){\r
-            var row = rows[i];\r
-            row.rowIndex = i;\r
-            if(!skipStripe){\r
-                var isAlt = ((i+1) % 2 == 0);\r
-                var hasAlt = (' '+row.className + ' ').indexOf(cls) != -1;\r
-                if(isAlt == hasAlt){\r
-                    continue;\r
-                }\r
-                if(isAlt){\r
-                    row.className += " x-grid3-row-alt";\r
-                }else{\r
-                    row.className = row.className.replace("x-grid3-row-alt", "");\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    afterRender: function(){\r
-        this.mainBody.dom.innerHTML = this.renderRows();\r
-        this.processRows(0, true);\r
-\r
-        if(this.deferEmptyText !== true){\r
-            this.applyEmptyText();\r
-        }\r
-    },\r
-\r
-    // private\r
-    renderUI : function(){\r
-\r
-        var header = this.renderHeaders();\r
-        var body = this.templates.body.apply({rows:''});\r
-\r
-\r
-        var html = this.templates.master.apply({\r
-            body: body,\r
-            header: header\r
-        });\r
-\r
-        var g = this.grid;\r
-\r
-        g.getGridEl().dom.innerHTML = html;\r
-\r
-        this.initElements();\r
-\r
-        // get mousedowns early\r
-        Ext.fly(this.innerHd).on("click", this.handleHdDown, this);\r
-        this.mainHd.on("mouseover", this.handleHdOver, this);\r
-        this.mainHd.on("mouseout", this.handleHdOut, this);\r
-        this.mainHd.on("mousemove", this.handleHdMove, this);\r
-\r
-        this.scroller.on('scroll', this.syncScroll,  this);\r
-        if(g.enableColumnResize !== false){\r
-            this.splitZone = new Ext.grid.GridView.SplitDragZone(g, this.mainHd.dom);\r
-        }\r
-\r
-        if(g.enableColumnMove){\r
-            this.columnDrag = new Ext.grid.GridView.ColumnDragZone(g, this.innerHd);\r
-            this.columnDrop = new Ext.grid.HeaderDropZone(g, this.mainHd.dom);\r
-        }\r
-\r
-        if(g.enableHdMenu !== false){\r
-            if(g.enableColumnHide !== false){\r
-                this.colMenu = new Ext.menu.Menu({id:g.id + "-hcols-menu"});\r
-                this.colMenu.on("beforeshow", this.beforeColMenuShow, this);\r
-                this.colMenu.on("itemclick", this.handleHdMenuClick, this);\r
-            }\r
-            this.hmenu = new Ext.menu.Menu({id: g.id + "-hctx"});\r
-            this.hmenu.add(\r
-                {id:"asc", text: this.sortAscText, cls: "xg-hmenu-sort-asc"},\r
-                {id:"desc", text: this.sortDescText, cls: "xg-hmenu-sort-desc"}\r
-            );\r
-            if(g.enableColumnHide !== false){\r
-                this.hmenu.add('-',\r
-                    {id:"columns", text: this.columnsText, menu: this.colMenu, iconCls: 'x-cols-icon'}\r
-                );\r
-            }\r
-            this.hmenu.on("itemclick", this.handleHdMenuClick, this);\r
-\r
-            //g.on("headercontextmenu", this.handleHdCtx, this);\r
-        }\r
-\r
-        if(g.trackMouseOver){\r
-            this.mainBody.on("mouseover", this.onRowOver, this);\r
-            this.mainBody.on("mouseout", this.onRowOut, this);\r
-        }\r
-        if(g.enableDragDrop || g.enableDrag){\r
-            this.dragZone = new Ext.grid.GridDragZone(g, {\r
-                ddGroup : g.ddGroup || 'GridDD'\r
-            });\r
-        }\r
-\r
-        this.updateHeaderSortState();\r
-\r
-    },\r
-\r
-    // private\r
-    layout : function(){\r
-        if(!this.mainBody){\r
-            return; // not rendered\r
-        }\r
-        var g = this.grid;\r
-        var c = g.getGridEl();\r
-        var csize = c.getSize(true);\r
-        var vw = csize.width;\r
-\r
-        if(vw < 20 || csize.height < 20){ // display: none?\r
-            return;\r
-        }\r
-\r
-        if(g.autoHeight){\r
-            this.scroller.dom.style.overflow = 'visible';\r
-            if(Ext.isSafari){\r
-                this.scroller.dom.style.position = 'static';\r
-            }\r
-        }else{\r
-            this.el.setSize(csize.width, csize.height);\r
-\r
-            var hdHeight = this.mainHd.getHeight();\r
-            var vh = csize.height - (hdHeight);\r
-\r
-            this.scroller.setSize(vw, vh);\r
-            if(this.innerHd){\r
-                this.innerHd.style.width = (vw)+'px';\r
-            }\r
-        }\r
-        if(this.forceFit){\r
-            if(this.lastViewWidth != vw){\r
-                this.fitColumns(false, false);\r
-                this.lastViewWidth = vw;\r
-            }\r
-        }else {\r
-            this.autoExpand();\r
-            this.syncHeaderScroll();\r
-        }\r
-        this.onLayout(vw, vh);\r
-    },\r
-\r
-    // template functions for subclasses and plugins\r
-    // these functions include precalculated values\r
-    onLayout : function(vw, vh){\r
-        // do nothing\r
-    },\r
-\r
-    onColumnWidthUpdated : function(col, w, tw){\r
-        //template method\r
-        this.focusEl.setWidth(tw);\r
-    },\r
-\r
-    onAllColumnWidthsUpdated : function(ws, tw){\r
-        //template method\r
-        this.focusEl.setWidth(tw);\r
-    },\r
-\r
-    onColumnHiddenUpdated : function(col, hidden, tw){\r
-        // template method\r
-        this.focusEl.setWidth(tw);\r
-    },\r
-\r
-    updateColumnText : function(col, text){\r
-        // template method\r
-    },\r
-\r
-    afterMove : function(colIndex){\r
-        // template method\r
-    },\r
-\r
-    \r
-    // private\r
-    init: function(grid){\r
-        this.grid = grid;\r
-\r
-        this.initTemplates();\r
-        this.initData(grid.store, grid.colModel);\r
-        this.initUI(grid);\r
-    },\r
-\r
-    // private\r
-    getColumnId : function(index){\r
-      return this.cm.getColumnId(index);\r
-    },\r
-\r
-    // private\r
-    renderHeaders : function(){\r
-        var cm = this.cm, ts = this.templates;\r
-        var ct = ts.hcell;\r
-\r
-        var cb = [], sb = [], p = {};\r
-        var len = cm.getColumnCount();\r
-        var last = len - 1;\r
-        for(var i = 0; i < len; i++){\r
-            p.id = cm.getColumnId(i);\r
-            p.value = cm.getColumnHeader(i) || "";\r
-            p.style = this.getColumnStyle(i, true);\r
-            p.tooltip = this.getColumnTooltip(i);\r
-            p.css = i == 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');\r
-            if(cm.config[i].align == 'right'){\r
-                p.istyle = 'padding-right:16px';\r
-            } else {\r
-                delete p.istyle;\r
-            }\r
-            cb[cb.length] = ct.apply(p);\r
-        }\r
-        return ts.header.apply({cells: cb.join(""), tstyle:'width:'+this.getTotalWidth()+';'});\r
-    },\r
-\r
-    // private\r
-    getColumnTooltip : function(i){\r
-        var tt = this.cm.getColumnTooltip(i);\r
-        if(tt){\r
-            if(Ext.QuickTips.isEnabled()){\r
-                return 'ext:qtip="'+tt+'"';\r
-            }else{\r
-                return 'title="'+tt+'"';\r
-            }\r
-        }\r
-        return "";\r
-    },\r
-\r
-    // private\r
-    beforeUpdate : function(){\r
-        this.grid.stopEditing(true);\r
-    },\r
-\r
-    // private\r
-    updateHeaders : function(){\r
-        this.innerHd.firstChild.innerHTML = this.renderHeaders();\r
-    },\r
-\r
-    \r
-    focusRow : function(row){\r
-        this.focusCell(row, 0, false);\r
-    },\r
-\r
-    \r
-    focusCell : function(row, col, hscroll){\r
-               this.syncFocusEl(this.ensureVisible(row, col, hscroll));\r
-        if(Ext.isGecko){\r
-            this.focusEl.focus();\r
-        }else{\r
-            this.focusEl.focus.defer(1, this.focusEl);\r
-        }\r
-    },\r
-\r
-       resolveCell : function(row, col, hscroll){\r
-               if(typeof row != "number"){\r
-            row = row.rowIndex;\r
-        }\r
-        if(!this.ds){\r
-            return null;\r
-        }\r
-        if(row < 0 || row >= this.ds.getCount()){\r
-            return null;\r
-        }\r
-        col = (col !== undefined ? col : 0);\r
-\r
-        var rowEl = this.getRow(row), cellEl;\r
-        if(!(hscroll === false && col === 0)){\r
-            while(this.cm.isHidden(col)){\r
-                col++;\r
-            }\r
-            cellEl = this.getCell(row, col);\r
-        }\r
-\r
-               return {row: rowEl, cell: cellEl};\r
-       },\r
-\r
-       getResolvedXY : function(resolved){\r
-               if(!resolved){\r
-                       return null;\r
-               }\r
-               var s = this.scroller.dom, c = resolved.cell, r = resolved.row;\r
-               return c ? Ext.fly(c).getXY() : [this.el.getX(), Ext.fly(r).getY()];\r
-       },\r
-\r
-       syncFocusEl : function(row, col, hscroll){\r
-               var xy = row;\r
-               if(!Ext.isArray(xy)){\r
-                       row = Math.min(row, Math.max(0, this.getRows().length-1));\r
-               xy = this.getResolvedXY(this.resolveCell(row, col, hscroll));\r
-               }\r
-        this.focusEl.setXY(xy||this.scroller.getXY());\r
-    },\r
-\r
-       ensureVisible : function(row, col, hscroll){\r
-        var resolved = this.resolveCell(row, col, hscroll);\r
-               if(!resolved || !resolved.row){\r
-                       return;\r
-               }\r
-\r
-               var rowEl = resolved.row, cellEl = resolved.cell;\r
-\r
-               var c = this.scroller.dom;\r
-\r
-        var ctop = 0;\r
-        var p = rowEl, stop = this.el.dom;\r
-        while(p && p != stop){\r
-            ctop += p.offsetTop;\r
-            p = p.offsetParent;\r
-        }\r
-        ctop -= this.mainHd.dom.offsetHeight;\r
-\r
-        var cbot = ctop + rowEl.offsetHeight;\r
-\r
-        var ch = c.clientHeight;\r
-        var stop = parseInt(c.scrollTop, 10);\r
-        var sbot = stop + ch;\r
-\r
-               if(ctop < stop){\r
-          c.scrollTop = ctop;\r
-        }else if(cbot > sbot){\r
-            c.scrollTop = cbot-ch;\r
-        }\r
-\r
-        if(hscroll !== false){\r
-            var cleft = parseInt(cellEl.offsetLeft, 10);\r
-            var cright = cleft + cellEl.offsetWidth;\r
-\r
-            var sleft = parseInt(c.scrollLeft, 10);\r
-            var sright = sleft + c.clientWidth;\r
-            if(cleft < sleft){\r
-                c.scrollLeft = cleft;\r
-            }else if(cright > sright){\r
-                c.scrollLeft = cright-c.clientWidth;\r
-            }\r
-        }\r
-        return this.getResolvedXY(resolved);\r
-    },\r
-\r
-    // private\r
-    insertRows : function(dm, firstRow, lastRow, isUpdate){\r
-        if(!isUpdate && firstRow === 0 && lastRow >= dm.getCount()-1){\r
-            this.refresh();\r
-        }else{\r
-            if(!isUpdate){\r
-                this.fireEvent("beforerowsinserted", this, firstRow, lastRow);\r
-            }\r
-            var html = this.renderRows(firstRow, lastRow);\r
-            var before = this.getRow(firstRow);\r
-            if(before){\r
-                Ext.DomHelper.insertHtml('beforeBegin', before, html);\r
-            }else{\r
-                Ext.DomHelper.insertHtml('beforeEnd', this.mainBody.dom, html);\r
-            }\r
-            if(!isUpdate){\r
-                this.fireEvent("rowsinserted", this, firstRow, lastRow);\r
-                this.processRows(firstRow);\r
-            }\r
-        }\r
-        this.syncFocusEl(firstRow);\r
-    },\r
-\r
-    // private\r
-    deleteRows : function(dm, firstRow, lastRow){\r
-        if(dm.getRowCount()<1){\r
-            this.refresh();\r
-        }else{\r
-            this.fireEvent("beforerowsdeleted", this, firstRow, lastRow);\r
-\r
-            this.removeRows(firstRow, lastRow);\r
-\r
-            this.processRows(firstRow);\r
-            this.fireEvent("rowsdeleted", this, firstRow, lastRow);\r
-        }\r
-    },\r
-\r
-    // private\r
-    getColumnStyle : function(col, isHeader){\r
-        var style = !isHeader ? (this.cm.config[col].css || '') : '';\r
-        style += 'width:'+this.getColumnWidth(col)+';';\r
-        if(this.cm.isHidden(col)){\r
-            style += 'display:none;';\r
-        }\r
-        var align = this.cm.config[col].align;\r
-        if(align){\r
-            style += 'text-align:'+align+';';\r
-        }\r
-        return style;\r
-    },\r
-\r
-    // private\r
-    getColumnWidth : function(col){\r
-        var w = this.cm.getColumnWidth(col);\r
-        if(typeof w == 'number'){\r
-            return (Ext.isBorderBox ? w : (w-this.borderWidth > 0 ? w-this.borderWidth:0)) + 'px';\r
-        }\r
-        return w;\r
-    },\r
-\r
-    // private\r
-    getTotalWidth : function(){\r
-        return this.cm.getTotalWidth()+'px';\r
-    },\r
-\r
-    // private\r
-    fitColumns : function(preventRefresh, onlyExpand, omitColumn){\r
-        var cm = this.cm, leftOver, dist, i;\r
-        var tw = cm.getTotalWidth(false);\r
-        var aw = this.grid.getGridEl().getWidth(true)-this.scrollOffset;\r
-\r
-        if(aw < 20){ // not initialized, so don't screw up the default widths\r
-            return;\r
-        }\r
-        var extra = aw - tw;\r
-\r
-        if(extra === 0){\r
-            return false;\r
-        }\r
-\r
-        var vc = cm.getColumnCount(true);\r
-        var ac = vc-(typeof omitColumn == 'number' ? 1 : 0);\r
-        if(ac === 0){\r
-            ac = 1;\r
-            omitColumn = undefined;\r
-        }\r
-        var colCount = cm.getColumnCount();\r
-        var cols = [];\r
-        var extraCol = 0;\r
-        var width = 0;\r
-        var w;\r
-        for (i = 0; i < colCount; i++){\r
-            if(!cm.isHidden(i) && !cm.isFixed(i) && i !== omitColumn){\r
-                w = cm.getColumnWidth(i);\r
-                cols.push(i);\r
-                extraCol = i;\r
-                cols.push(w);\r
-                width += w;\r
-            }\r
-        }\r
-        var frac = (aw - cm.getTotalWidth())/width;\r
-        while (cols.length){\r
-            w = cols.pop();\r
-            i = cols.pop();\r
-            cm.setColumnWidth(i, Math.max(this.grid.minColumnWidth, Math.floor(w + w*frac)), true);\r
-        }\r
-\r
-        if((tw = cm.getTotalWidth(false)) > aw){\r
-            var adjustCol = ac != vc ? omitColumn : extraCol;\r
-             cm.setColumnWidth(adjustCol, Math.max(1,\r
-                     cm.getColumnWidth(adjustCol)- (tw-aw)), true);\r
-        }\r
-\r
-        if(preventRefresh !== true){\r
-            this.updateAllColumnWidths();\r
-        }\r
-\r
-\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    autoExpand : function(preventUpdate){\r
-        var g = this.grid, cm = this.cm;\r
-        if(!this.userResized && g.autoExpandColumn){\r
-            var tw = cm.getTotalWidth(false);\r
-            var aw = this.grid.getGridEl().getWidth(true)-this.scrollOffset;\r
-            if(tw != aw){\r
-                var ci = cm.getIndexById(g.autoExpandColumn);\r
-                var currentWidth = cm.getColumnWidth(ci);\r
-                var cw = Math.min(Math.max(((aw-tw)+currentWidth), g.autoExpandMin), g.autoExpandMax);\r
-                if(cw != currentWidth){\r
-                    cm.setColumnWidth(ci, cw, true);\r
-                    if(preventUpdate !== true){\r
-                        this.updateColumnWidth(ci, cw);\r
-                    }\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    getColumnData : function(){\r
-        // build a map for all the columns\r
-        var cs = [], cm = this.cm, colCount = cm.getColumnCount();\r
-        for(var i = 0; i < colCount; i++){\r
-            var name = cm.getDataIndex(i);\r
-            cs[i] = {\r
-                name : (typeof name == 'undefined' ? this.ds.fields.get(i).name : name),\r
-                renderer : cm.getRenderer(i),\r
-                id : cm.getColumnId(i),\r
-                style : this.getColumnStyle(i)\r
-            };\r
-        }\r
-        return cs;\r
-    },\r
-\r
-    // private\r
-    renderRows : function(startRow, endRow){\r
-        // pull in all the crap needed to render rows\r
-        var g = this.grid, cm = g.colModel, ds = g.store, stripe = g.stripeRows;\r
-        var colCount = cm.getColumnCount();\r
-\r
-        if(ds.getCount() < 1){\r
-            return "";\r
-        }\r
-\r
-        var cs = this.getColumnData();\r
-\r
-        startRow = startRow || 0;\r
-        endRow = typeof endRow == "undefined"? ds.getCount()-1 : endRow;\r
-\r
-        // records to render\r
-        var rs = ds.getRange(startRow, endRow);\r
-\r
-        return this.doRender(cs, rs, ds, startRow, colCount, stripe);\r
-    },\r
-\r
-    // private\r
-    renderBody : function(){\r
-        var markup = this.renderRows();\r
-        return this.templates.body.apply({rows: markup});\r
-    },\r
-\r
-    // private\r
-    refreshRow : function(record){\r
-        var ds = this.ds, index;\r
-        if(typeof record == 'number'){\r
-            index = record;\r
-            record = ds.getAt(index);\r
-        }else{\r
-            index = ds.indexOf(record);\r
-        }\r
-        var cls = [];\r
-        this.insertRows(ds, index, index, true);\r
-        this.getRow(index).rowIndex = index;\r
-        this.onRemove(ds, record, index+1, true);\r
-        this.fireEvent("rowupdated", this, index, record);\r
-    },\r
-\r
-    \r
-    refresh : function(headersToo){\r
-        this.fireEvent("beforerefresh", this);\r
-        this.grid.stopEditing(true);\r
-\r
-        var result = this.renderBody();\r
-        this.mainBody.update(result);\r
-\r
-        if(headersToo === true){\r
-            this.updateHeaders();\r
-            this.updateHeaderSortState();\r
-        }\r
-        this.processRows(0, true);\r
-        this.layout();\r
-        this.applyEmptyText();\r
-        this.fireEvent("refresh", this);\r
-    },\r
-\r
-    // private\r
-    applyEmptyText : function(){\r
-        if(this.emptyText && !this.hasRows()){\r
-            this.mainBody.update('<div class="x-grid-empty">' + this.emptyText + '</div>');\r
-        }\r
-    },\r
-\r
-    // private\r
-    updateHeaderSortState : function(){\r
-        var state = this.ds.getSortState();\r
-        if(!state){\r
-            return;\r
-        }\r
-        if(!this.sortState || (this.sortState.field != state.field || this.sortState.direction != state.direction)){\r
-            this.grid.fireEvent('sortchange', this.grid, state);\r
-        }\r
-        this.sortState = state;\r
-        var sortColumn = this.cm.findColumnIndex(state.field);\r
-        if(sortColumn != -1){\r
-            var sortDir = state.direction;\r
-            this.updateSortIcon(sortColumn, sortDir);\r
-        }\r
-    },\r
-\r
-    // private\r
-    destroy : function(){\r
-        if(this.colMenu){\r
-            Ext.menu.MenuMgr.unregister(this.colMenu);\r
-            this.colMenu.destroy();\r
-            delete this.colMenu;\r
-        }\r
-        if(this.hmenu){\r
-            Ext.menu.MenuMgr.unregister(this.hmenu);\r
-            this.hmenu.destroy();\r
-            delete this.hmenu;\r
-        }\r
-        if(this.grid.enableColumnMove){\r
-            var dds = Ext.dd.DDM.ids['gridHeader' + this.grid.getGridEl().id];\r
-            if(dds){\r
-                for(var dd in dds){\r
-                    if(!dds[dd].config.isTarget && dds[dd].dragElId){\r
-                        var elid = dds[dd].dragElId;\r
-                        dds[dd].unreg();\r
-                        Ext.get(elid).remove();\r
-                    } else if(dds[dd].config.isTarget){\r
-                        dds[dd].proxyTop.remove();\r
-                        dds[dd].proxyBottom.remove();\r
-                        dds[dd].unreg();\r
-                    }\r
-                    if(Ext.dd.DDM.locationCache[dd]){\r
-                        delete Ext.dd.DDM.locationCache[dd];\r
-                    }\r
-                }\r
-                delete Ext.dd.DDM.ids['gridHeader' + this.grid.getGridEl().id];\r
-            }\r
-        }\r
-        \r
-        if(this.dragZone){\r
-            this.dragZone.unreg();\r
-        }\r
-        \r
-        Ext.fly(this.innerHd).removeAllListeners();\r
-        Ext.removeNode(this.innerHd);\r
-        \r
-        Ext.destroy(this.resizeMarker, this.resizeProxy, this.focusEl, this.mainBody, \r
-                    this.scroller, this.mainHd, this.mainWrap, this.dragZone, \r
-                    this.splitZone, this.columnDrag, this.columnDrop);\r
-\r
-        this.initData(null, null);\r
-        Ext.EventManager.removeResizeListener(this.onWindowResize, this);\r
-        this.purgeListeners();\r
-    },\r
-\r
-    // private\r
-    onDenyColumnHide : function(){\r
-\r
-    },\r
-\r
-    // private\r
-    render : function(){\r
-        if(this.autoFill){\r
-            var ct = this.grid.ownerCt;\r
-            if (ct && ct.getLayout()){\r
-                ct.on('afterlayout', function(){ \r
-                    this.fitColumns(true, true);\r
-                    this.updateHeaders(); \r
-                }, this, {single: true}); \r
-            }else{ \r
-                this.fitColumns(true, true); \r
-            }\r
-        }else if(this.forceFit){\r
-            this.fitColumns(true, false);\r
-        }else if(this.grid.autoExpandColumn){\r
-            this.autoExpand(true);\r
-        }\r
-\r
-        this.renderUI();\r
-    },\r
-\r
-    \r
-    // private\r
-    initData : function(ds, cm){\r
-        if(this.ds){\r
-            this.ds.un("load", this.onLoad, this);\r
-            this.ds.un("datachanged", this.onDataChange, this);\r
-            this.ds.un("add", this.onAdd, this);\r
-            this.ds.un("remove", this.onRemove, this);\r
-            this.ds.un("update", this.onUpdate, this);\r
-            this.ds.un("clear", this.onClear, this);\r
-        }\r
-        if(ds){\r
-            ds.on("load", this.onLoad, this);\r
-            ds.on("datachanged", this.onDataChange, this);\r
-            ds.on("add", this.onAdd, this);\r
-            ds.on("remove", this.onRemove, this);\r
-            ds.on("update", this.onUpdate, this);\r
-            ds.on("clear", this.onClear, this);\r
-        }\r
-        this.ds = ds;\r
-\r
-        if(this.cm){\r
-            this.cm.un("configchange", this.onColConfigChange, this);\r
-            this.cm.un("widthchange", this.onColWidthChange, this);\r
-            this.cm.un("headerchange", this.onHeaderChange, this);\r
-            this.cm.un("hiddenchange", this.onHiddenChange, this);\r
-            this.cm.un("columnmoved", this.onColumnMove, this);\r
-            this.cm.un("columnlockchange", this.onColumnLock, this);\r
-        }\r
-        if(cm){\r
-            delete this.lastViewWidth;\r
-            cm.on("configchange", this.onColConfigChange, this);\r
-            cm.on("widthchange", this.onColWidthChange, this);\r
-            cm.on("headerchange", this.onHeaderChange, this);\r
-            cm.on("hiddenchange", this.onHiddenChange, this);\r
-            cm.on("columnmoved", this.onColumnMove, this);\r
-            cm.on("columnlockchange", this.onColumnLock, this);\r
-        }\r
-        this.cm = cm;\r
-    },\r
-\r
-    // private\r
-    onDataChange : function(){\r
-        this.refresh();\r
-        this.updateHeaderSortState();\r
-        this.syncFocusEl(0);\r
-    },\r
-\r
-    // private\r
-    onClear : function(){\r
-        this.refresh();\r
-        this.syncFocusEl(0);\r
-    },\r
-\r
-    // private\r
-    onUpdate : function(ds, record){\r
-        this.refreshRow(record);\r
-    },\r
-\r
-    // private\r
-    onAdd : function(ds, records, index){\r
-        this.insertRows(ds, index, index + (records.length-1));\r
-    },\r
-\r
-    // private\r
-    onRemove : function(ds, record, index, isUpdate){\r
-        if(isUpdate !== true){\r
-            this.fireEvent("beforerowremoved", this, index, record);\r
-        }\r
-        this.removeRow(index);\r
-        if(isUpdate !== true){\r
-            this.processRows(index);\r
-            this.applyEmptyText();\r
-            this.fireEvent("rowremoved", this, index, record);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onLoad : function(){\r
-        this.scrollToTop();\r
-    },\r
-\r
-    // private\r
-    onColWidthChange : function(cm, col, width){\r
-        this.updateColumnWidth(col, width);\r
-    },\r
-\r
-    // private\r
-    onHeaderChange : function(cm, col, text){\r
-        this.updateHeaders();\r
-    },\r
-\r
-    // private\r
-    onHiddenChange : function(cm, col, hidden){\r
-        this.updateColumnHidden(col, hidden);\r
-    },\r
-\r
-    // private\r
-    onColumnMove : function(cm, oldIndex, newIndex){\r
-        this.indexMap = null;\r
-        var s = this.getScrollState();\r
-        this.refresh(true);\r
-        this.restoreScroll(s);\r
-        this.afterMove(newIndex);\r
-    },\r
-\r
-    // private\r
-    onColConfigChange : function(){\r
-        delete this.lastViewWidth;\r
-        this.indexMap = null;\r
-        this.refresh(true);\r
-    },\r
-\r
-    \r
-    // private\r
-    initUI : function(grid){\r
-        grid.on("headerclick", this.onHeaderClick, this);\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-\r
-    },\r
-\r
-    // private\r
-    onHeaderClick : function(g, index){\r
-        if(this.headersDisabled || !this.cm.isSortable(index)){\r
-            return;\r
-        }\r
-        g.stopEditing(true);\r
-        g.store.sort(this.cm.getDataIndex(index));\r
-    },\r
-\r
-    // private\r
-    onRowOver : function(e, t){\r
-        var row;\r
-        if((row = this.findRowIndex(t)) !== false){\r
-            this.addRowClass(row, "x-grid3-row-over");\r
-        }\r
-    },\r
-\r
-    // private\r
-    onRowOut : function(e, t){\r
-        var row;\r
-        if((row = this.findRowIndex(t)) !== false && !e.within(this.getRow(row), true)){\r
-            this.removeRowClass(row, "x-grid3-row-over");\r
-        }\r
-    },\r
-\r
-    // private\r
-    handleWheel : function(e){\r
-        e.stopPropagation();\r
-    },\r
-\r
-    // private\r
-    onRowSelect : function(row){\r
-        this.addRowClass(row, "x-grid3-row-selected");\r
-    },\r
-\r
-    // private\r
-    onRowDeselect : function(row){\r
-        this.removeRowClass(row, "x-grid3-row-selected");\r
-    },\r
-\r
-    // private\r
-    onCellSelect : function(row, col){\r
-        var cell = this.getCell(row, col);\r
-        if(cell){\r
-            this.fly(cell).addClass("x-grid3-cell-selected");\r
-        }\r
-    },\r
-\r
-    // private\r
-    onCellDeselect : function(row, col){\r
-        var cell = this.getCell(row, col);\r
-        if(cell){\r
-            this.fly(cell).removeClass("x-grid3-cell-selected");\r
-        }\r
-    },\r
-\r
-    // private\r
-    onColumnSplitterMoved : function(i, w){\r
-        this.userResized = true;\r
-        var cm = this.grid.colModel;\r
-        cm.setColumnWidth(i, w, true);\r
-\r
-        if(this.forceFit){\r
-            this.fitColumns(true, false, i);\r
-            this.updateAllColumnWidths();\r
-        }else{\r
-            this.updateColumnWidth(i, w);\r
-            this.syncHeaderScroll();\r
-        }\r
-\r
-        this.grid.fireEvent("columnresize", i, w);\r
-    },\r
-\r
-    // private\r
-    handleHdMenuClick : function(item){\r
-        var index = this.hdCtxIndex;\r
-        var cm = this.cm, ds = this.ds;\r
-        switch(item.id){\r
-            case "asc":\r
-                ds.sort(cm.getDataIndex(index), "ASC");\r
-                break;\r
-            case "desc":\r
-                ds.sort(cm.getDataIndex(index), "DESC");\r
-                break;\r
-            default:\r
-                index = cm.getIndexById(item.id.substr(4));\r
-                if(index != -1){\r
-                    if(item.checked && cm.getColumnsBy(this.isHideableColumn, this).length <= 1){\r
-                        this.onDenyColumnHide();\r
-                        return false;\r
-                    }\r
-                    cm.setHidden(index, item.checked);\r
-                }\r
-        }\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    isHideableColumn : function(c){\r
-        return !c.hidden && !c.fixed;\r
-    },\r
-\r
-    // private\r
-    beforeColMenuShow : function(){\r
-        var cm = this.cm,  colCount = cm.getColumnCount();\r
-        this.colMenu.removeAll();\r
-        for(var i = 0; i < colCount; i++){\r
-            if(cm.config[i].fixed !== true && cm.config[i].hideable !== false){\r
-                this.colMenu.add(new Ext.menu.CheckItem({\r
-                    id: "col-"+cm.getColumnId(i),\r
-                    text: cm.getColumnHeader(i),\r
-                    checked: !cm.isHidden(i),\r
-                    hideOnClick:false,\r
-                    disabled: cm.config[i].hideable === false\r
-                }));\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    handleHdDown : function(e, t){\r
-        if(Ext.fly(t).hasClass('x-grid3-hd-btn')){\r
-            e.stopEvent();\r
-            var hd = this.findHeaderCell(t);\r
-            Ext.fly(hd).addClass('x-grid3-hd-menu-open');\r
-            var index = this.getCellIndex(hd);\r
-            this.hdCtxIndex = index;\r
-            var ms = this.hmenu.items, cm = this.cm;\r
-            ms.get("asc").setDisabled(!cm.isSortable(index));\r
-            ms.get("desc").setDisabled(!cm.isSortable(index));\r
-            this.hmenu.on("hide", function(){\r
-                Ext.fly(hd).removeClass('x-grid3-hd-menu-open');\r
-            }, this, {single:true});\r
-            this.hmenu.show(t, "tl-bl?");\r
-        }\r
-    },\r
-\r
-    // private\r
-    handleHdOver : function(e, t){\r
-        var hd = this.findHeaderCell(t);\r
-        if(hd && !this.headersDisabled){\r
-            this.activeHd = hd;\r
-            this.activeHdIndex = this.getCellIndex(hd);\r
-            var fly = this.fly(hd);\r
-            this.activeHdRegion = fly.getRegion();\r
-            if(!this.cm.isMenuDisabled(this.activeHdIndex)){\r
-                fly.addClass("x-grid3-hd-over");\r
-                this.activeHdBtn = fly.child('.x-grid3-hd-btn');\r
-                if(this.activeHdBtn){\r
-                    this.activeHdBtn.dom.style.height = (hd.firstChild.offsetHeight-1)+'px';\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    handleHdMove : function(e, t){\r
-        if(this.activeHd && !this.headersDisabled){\r
-            var hw = this.splitHandleWidth || 5;\r
-            var r = this.activeHdRegion;\r
-            var x = e.getPageX();\r
-            var ss = this.activeHd.style;\r
-            if(x - r.left <= hw && this.cm.isResizable(this.activeHdIndex-1)){\r
-                ss.cursor = Ext.isAir ? 'move' : Ext.isSafari ? 'e-resize' : 'col-resize'; // col-resize not always supported\r
-            }else if(r.right - x <= (!this.activeHdBtn ? hw : 2) && this.cm.isResizable(this.activeHdIndex)){\r
-                ss.cursor = Ext.isAir ? 'move' : Ext.isSafari ? 'w-resize' : 'col-resize';\r
-            }else{\r
-                ss.cursor = '';\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    handleHdOut : function(e, t){\r
-        var hd = this.findHeaderCell(t);\r
-        if(hd && (!Ext.isIE || !e.within(hd, true))){\r
-            this.activeHd = null;\r
-            this.fly(hd).removeClass("x-grid3-hd-over");\r
-            hd.style.cursor = '';\r
-        }\r
-    },\r
-\r
-    // private\r
-    hasRows : function(){\r
-        var fc = this.mainBody.dom.firstChild;\r
-        return fc && fc.className != 'x-grid-empty';\r
-    },\r
-\r
-    // back compat\r
-    bind : function(d, c){\r
-        this.initData(d, c);\r
-    }\r
-});\r
-\r
-\r
-// private\r
-// This is a support class used internally by the Grid components\r
-Ext.grid.GridView.SplitDragZone = function(grid, hd){\r
-    this.grid = grid;\r
-    this.view = grid.getView();\r
-    this.marker = this.view.resizeMarker;\r
-    this.proxy = this.view.resizeProxy;\r
-    Ext.grid.GridView.SplitDragZone.superclass.constructor.call(this, hd,\r
-        "gridSplitters" + this.grid.getGridEl().id, {\r
-        dragElId : Ext.id(this.proxy.dom), resizeFrame:false\r
-    });\r
-    this.scroll = false;\r
-    this.hw = this.view.splitHandleWidth || 5;\r
-};\r
-Ext.extend(Ext.grid.GridView.SplitDragZone, Ext.dd.DDProxy, {\r
-\r
-    b4StartDrag : function(x, y){\r
-        this.view.headersDisabled = true;\r
-        var h = this.view.mainWrap.getHeight();\r
-        this.marker.setHeight(h);\r
-        this.marker.show();\r
-        this.marker.alignTo(this.view.getHeaderCell(this.cellIndex), 'tl-tl', [-2, 0]);\r
-        this.proxy.setHeight(h);\r
-        var w = this.cm.getColumnWidth(this.cellIndex);\r
-        var minw = Math.max(w-this.grid.minColumnWidth, 0);\r
-        this.resetConstraints();\r
-        this.setXConstraint(minw, 1000);\r
-        this.setYConstraint(0, 0);\r
-        this.minX = x - minw;\r
-        this.maxX = x + 1000;\r
-        this.startPos = x;\r
-        Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y);\r
-    },\r
-\r
-\r
-    handleMouseDown : function(e){\r
-        var t = this.view.findHeaderCell(e.getTarget());\r
-        if(t){\r
-            var xy = this.view.fly(t).getXY(), x = xy[0], y = xy[1];\r
-            var exy = e.getXY(), ex = exy[0], ey = exy[1];\r
-            var w = t.offsetWidth, adjust = false;\r
-            if((ex - x) <= this.hw){\r
-                adjust = -1;\r
-            }else if((x+w) - ex <= this.hw){\r
-                adjust = 0;\r
-            }\r
-            if(adjust !== false){\r
-                this.cm = this.grid.colModel;\r
-                var ci = this.view.getCellIndex(t);\r
-                if(adjust == -1){\r
-                  if (ci + adjust < 0) {\r
-                    return;\r
-                  }\r
-                    while(this.cm.isHidden(ci+adjust)){\r
-                        --adjust;\r
-                        if(ci+adjust < 0){\r
-                            return;\r
-                        }\r
-                    }\r
-                }\r
-                this.cellIndex = ci+adjust;\r
-                this.split = t.dom;\r
-                if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){\r
-                    Ext.grid.GridView.SplitDragZone.superclass.handleMouseDown.apply(this, arguments);\r
-                }\r
-            }else if(this.view.columnDrag){\r
-                this.view.columnDrag.callHandleMouseDown(e);\r
-            }\r
-        }\r
-    },\r
-\r
-    endDrag : function(e){\r
-        this.marker.hide();\r
-        var v = this.view;\r
-        var endX = Math.max(this.minX, e.getPageX());\r
-        var diff = endX - this.startPos;\r
-        v.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff);\r
-        setTimeout(function(){\r
-            v.headersDisabled = false;\r
-        }, 50);\r
-    },\r
-\r
-    autoOffset : function(){\r
-        this.setDelta(0,0);\r
-    }\r
-});\r
-\r
-\r
-Ext.grid.GroupingView = Ext.extend(Ext.grid.GridView, {\r
-    \r
-    hideGroupedColumn:false,\r
-    \r
-    showGroupName:true,\r
-    \r
-    startCollapsed:false,\r
-    \r
-    enableGrouping:true,\r
-    \r
-    enableGroupingMenu:true,\r
-    \r
-    enableNoGroups:true,\r
-    \r
-    emptyGroupText : '(None)',\r
-    \r
-    ignoreAdd: false,\r
-    \r
-    groupTextTpl : '{text}',\r
-    \r
-    \r
-\r
-    // private\r
-    gidSeed : 1000,\r
-\r
-    // private\r
-    initTemplates : function(){\r
-        Ext.grid.GroupingView.superclass.initTemplates.call(this);\r
-        this.state = {};\r
-\r
-        var sm = this.grid.getSelectionModel();\r
-        sm.on(sm.selectRow ? 'beforerowselect' : 'beforecellselect',\r
-                this.onBeforeRowSelect, this);\r
-\r
-        if(!this.startGroup){\r
-            this.startGroup = new Ext.XTemplate(\r
-                '<div id="{groupId}" class="x-grid-group {cls}">',\r
-                    '<div id="{groupId}-hd" class="x-grid-group-hd" style="{style}"><div>', this.groupTextTpl ,'</div></div>',\r
-                    '<div id="{groupId}-bd" class="x-grid-group-body">'\r
-            );\r
-        }\r
-        this.startGroup.compile();\r
-        this.endGroup = '</div></div>';\r
-    },\r
-\r
-    // private\r
-    findGroup : function(el){\r
-        return Ext.fly(el).up('.x-grid-group', this.mainBody.dom);\r
-    },\r
-\r
-    // private\r
-    getGroups : function(){\r
-        return this.hasRows() ? this.mainBody.dom.childNodes : [];\r
-    },\r
-\r
-    // private\r
-    onAdd : function(){\r
-        if(this.enableGrouping && !this.ignoreAdd){\r
-            var ss = this.getScrollState();\r
-            this.refresh();\r
-            this.restoreScroll(ss);\r
-        }else if(!this.enableGrouping){\r
-            Ext.grid.GroupingView.superclass.onAdd.apply(this, arguments);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onRemove : function(ds, record, index, isUpdate){\r
-        Ext.grid.GroupingView.superclass.onRemove.apply(this, arguments);\r
-        var g = document.getElementById(record._groupId);\r
-        if(g && g.childNodes[1].childNodes.length < 1){\r
-            Ext.removeNode(g);\r
-        }\r
-        this.applyEmptyText();\r
-    },\r
-\r
-    // private\r
-    refreshRow : function(record){\r
-        if(this.ds.getCount()==1){\r
-            this.refresh();\r
-        }else{\r
-            this.isUpdating = true;\r
-            Ext.grid.GroupingView.superclass.refreshRow.apply(this, arguments);\r
-            this.isUpdating = false;\r
-        }\r
-    },\r
-\r
-    // private\r
-    beforeMenuShow : function(){\r
-        var field = this.getGroupField();\r
-        var g = this.hmenu.items.get('groupBy');\r
-        if(g){\r
-            g.setDisabled(this.cm.config[this.hdCtxIndex].groupable === false);\r
-        }\r
-        var s = this.hmenu.items.get('showGroups');\r
-        if(s){\r
-           s.setDisabled(!field && this.cm.config[this.hdCtxIndex].groupable === false);\r
-                       s.setChecked(!!field, true);\r
-        }\r
-    },\r
-\r
-    // private\r
-    renderUI : function(){\r
-        Ext.grid.GroupingView.superclass.renderUI.call(this);\r
-        this.mainBody.on('mousedown', this.interceptMouse, this);\r
-\r
-        if(this.enableGroupingMenu && this.hmenu){\r
-            this.hmenu.add('-',{\r
-                id:'groupBy',\r
-                text: this.groupByText,\r
-                handler: this.onGroupByClick,\r
-                scope: this,\r
-                iconCls:'x-group-by-icon'\r
-            });\r
-            if(this.enableNoGroups){\r
-                this.hmenu.add({\r
-                    id:'showGroups',\r
-                    text: this.showGroupsText,\r
-                    checked: true,\r
-                    checkHandler: this.onShowGroupsClick,\r
-                    scope: this\r
-                });\r
-            }\r
-            this.hmenu.on('beforeshow', this.beforeMenuShow, this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onGroupByClick : function(){\r
-        this.grid.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex));\r
-        this.beforeMenuShow(); // Make sure the checkboxes get properly set when changing groups\r
-    },\r
-\r
-    // private\r
-    onShowGroupsClick : function(mi, checked){\r
-        if(checked){\r
-            this.onGroupByClick();\r
-        }else{\r
-            this.grid.store.clearGrouping();\r
-        }\r
-    },\r
-\r
-    \r
-    toggleGroup : function(group, expanded){\r
-        this.grid.stopEditing(true);\r
-        group = Ext.getDom(group);\r
-        var gel = Ext.fly(group);\r
-        expanded = expanded !== undefined ?\r
-                expanded : gel.hasClass('x-grid-group-collapsed');\r
-\r
-        this.state[gel.dom.id] = expanded;\r
-        gel[expanded ? 'removeClass' : 'addClass']('x-grid-group-collapsed');\r
-    },\r
-\r
-    \r
-    toggleAllGroups : function(expanded){\r
-        var groups = this.getGroups();\r
-        for(var i = 0, len = groups.length; i < len; i++){\r
-            this.toggleGroup(groups[i], expanded);\r
-        }\r
-    },\r
-\r
-    \r
-    expandAllGroups : function(){\r
-        this.toggleAllGroups(true);\r
-    },\r
-\r
-    \r
-    collapseAllGroups : function(){\r
-        this.toggleAllGroups(false);\r
-    },\r
-\r
-    // private\r
-    interceptMouse : function(e){\r
-        var hd = e.getTarget('.x-grid-group-hd', this.mainBody);\r
-        if(hd){\r
-            e.stopEvent();\r
-            this.toggleGroup(hd.parentNode);\r
-        }\r
-    },\r
-\r
-    // private\r
-    getGroup : function(v, r, groupRenderer, rowIndex, colIndex, ds){\r
-        var g = groupRenderer ? groupRenderer(v, {}, r, rowIndex, colIndex, ds) : String(v);\r
-        if(g === ''){\r
-            g = this.cm.config[colIndex].emptyGroupText || this.emptyGroupText;\r
-        }\r
-        return g;\r
-    },\r
-\r
-    // private\r
-    getGroupField : function(){\r
-        return this.grid.store.getGroupState();\r
-    },\r
-\r
-    // private\r
-    renderRows : function(){\r
-        var groupField = this.getGroupField();\r
-        var eg = !!groupField;\r
-        // if they turned off grouping and the last grouped field is hidden\r
-        if(this.hideGroupedColumn) {\r
-            var colIndex = this.cm.findColumnIndex(groupField);\r
-            if(!eg && this.lastGroupField !== undefined) {\r
-                this.mainBody.update('');\r
-                this.cm.setHidden(this.cm.findColumnIndex(this.lastGroupField), false);\r
-                delete this.lastGroupField;\r
-            }else if (eg && this.lastGroupField === undefined) {\r
-                this.lastGroupField = groupField;\r
-                this.cm.setHidden(colIndex, true);\r
-            }else if (eg && this.lastGroupField !== undefined && groupField !== this.lastGroupField) {\r
-                this.mainBody.update('');\r
-                var oldIndex = this.cm.findColumnIndex(this.lastGroupField);\r
-                this.cm.setHidden(oldIndex, false);\r
-                this.lastGroupField = groupField;\r
-                this.cm.setHidden(colIndex, true);\r
-            }\r
-        }\r
-        return Ext.grid.GroupingView.superclass.renderRows.apply(\r
-                    this, arguments);\r
-    },\r
-\r
-    // private\r
-    doRender : function(cs, rs, ds, startRow, colCount, stripe){\r
-        if(rs.length < 1){\r
-            return '';\r
-        }\r
-        var groupField = this.getGroupField();\r
-        var colIndex = this.cm.findColumnIndex(groupField);\r
-\r
-        this.enableGrouping = !!groupField;\r
-\r
-        if(!this.enableGrouping || this.isUpdating){\r
-            return Ext.grid.GroupingView.superclass.doRender.apply(\r
-                    this, arguments);\r
-        }\r
-        var gstyle = 'width:'+this.getTotalWidth()+';';\r
-\r
-        var gidPrefix = this.grid.getGridEl().id;\r
-        var cfg = this.cm.config[colIndex];\r
-        var groupRenderer = cfg.groupRenderer || cfg.renderer;\r
-        var prefix = this.showGroupName ?\r
-                     (cfg.groupName || cfg.header)+': ' : '';\r
-\r
-        var groups = [], curGroup, i, len, gid;\r
-        for(i = 0, len = rs.length; i < len; i++){\r
-            var rowIndex = startRow + i;\r
-            var r = rs[i],\r
-                gvalue = r.data[groupField],\r
-                g = this.getGroup(gvalue, r, groupRenderer, rowIndex, colIndex, ds);\r
-            if(!curGroup || curGroup.group != g){\r
-                gid = gidPrefix + '-gp-' + groupField + '-' + Ext.util.Format.htmlEncode(g);\r
-                       // if state is defined use it, however state is in terms of expanded\r
-                               // so negate it, otherwise use the default.\r
-                               var isCollapsed  = typeof this.state[gid] !== 'undefined' ? !this.state[gid] : this.startCollapsed;\r
-                               var gcls = isCollapsed ? 'x-grid-group-collapsed' : ''; \r
-                curGroup = {\r
-                    group: g,\r
-                    gvalue: gvalue,\r
-                    text: prefix + g,\r
-                    groupId: gid,\r
-                    startRow: rowIndex,\r
-                    rs: [r],\r
-                    cls: gcls,\r
-                    style: gstyle\r
-                };\r
-                groups.push(curGroup);\r
-            }else{\r
-                curGroup.rs.push(r);\r
-            }\r
-            r._groupId = gid;\r
-        }\r
-\r
-        var buf = [];\r
-        for(i = 0, len = groups.length; i < len; i++){\r
-            var g = groups[i];\r
-            this.doGroupStart(buf, g, cs, ds, colCount);\r
-            buf[buf.length] = Ext.grid.GroupingView.superclass.doRender.call(\r
-                    this, cs, g.rs, ds, g.startRow, colCount, stripe);\r
-\r
-            this.doGroupEnd(buf, g, cs, ds, colCount);\r
-        }\r
-        return buf.join('');\r
-    },\r
-\r
-    \r
-    getGroupId : function(value){\r
-        var gidPrefix = this.grid.getGridEl().id;\r
-        var groupField = this.getGroupField();\r
-        var colIndex = this.cm.findColumnIndex(groupField);\r
-        var cfg = this.cm.config[colIndex];\r
-        var groupRenderer = cfg.groupRenderer || cfg.renderer;\r
-        var gtext = this.getGroup(value, {data:{}}, groupRenderer, 0, colIndex, this.ds);\r
-        return gidPrefix + '-gp-' + groupField + '-' + Ext.util.Format.htmlEncode(value);\r
-    },\r
-\r
-    // private\r
-    doGroupStart : function(buf, g, cs, ds, colCount){\r
-        buf[buf.length] = this.startGroup.apply(g);\r
-    },\r
-\r
-    // private\r
-    doGroupEnd : function(buf, g, cs, ds, colCount){\r
-        buf[buf.length] = this.endGroup;\r
-    },\r
-\r
-    // private\r
-    getRows : function(){\r
-        if(!this.enableGrouping){\r
-            return Ext.grid.GroupingView.superclass.getRows.call(this);\r
-        }\r
-        var r = [];\r
-        var g, gs = this.getGroups();\r
-        for(var i = 0, len = gs.length; i < len; i++){\r
-            g = gs[i].childNodes[1].childNodes;\r
-            for(var j = 0, jlen = g.length; j < jlen; j++){\r
-                r[r.length] = g[j];\r
-            }\r
-        }\r
-        return r;\r
-    },\r
-\r
-    // private\r
-    updateGroupWidths : function(){\r
-        if(!this.enableGrouping || !this.hasRows()){\r
-            return;\r
-        }\r
-        var tw = Math.max(this.cm.getTotalWidth(), this.el.dom.offsetWidth-this.scrollOffset) +'px';\r
-        var gs = this.getGroups();\r
-        for(var i = 0, len = gs.length; i < len; i++){\r
-            gs[i].firstChild.style.width = tw;\r
-        }\r
-    },\r
-\r
-    // private\r
-    onColumnWidthUpdated : function(col, w, tw){\r
-        Ext.grid.GroupingView.superclass.onColumnWidthUpdated.call(this, col, w, tw);\r
-        this.updateGroupWidths();\r
-    },\r
-\r
-    // private\r
-    onAllColumnWidthsUpdated : function(ws, tw){\r
-        Ext.grid.GroupingView.superclass.onAllColumnWidthsUpdated.call(this, ws, tw);\r
-        this.updateGroupWidths();\r
-    },\r
-\r
-    // private\r
-    onColumnHiddenUpdated : function(col, hidden, tw){\r
-        Ext.grid.GroupingView.superclass.onColumnHiddenUpdated.call(this, col, hidden, tw);\r
-        this.updateGroupWidths();\r
-    },\r
-\r
-    // private\r
-    onLayout : function(){\r
-        this.updateGroupWidths();\r
-    },\r
-\r
-    // private\r
-    onBeforeRowSelect : function(sm, rowIndex){\r
-        if(!this.enableGrouping){\r
-            return;\r
-        }\r
-        var row = this.getRow(rowIndex);\r
-        if(row && !row.offsetParent){\r
-            var g = this.findGroup(row);\r
-            this.toggleGroup(g, true);\r
-        }\r
-    },\r
-\r
-    \r
-    groupByText: 'Group By This Field',\r
-    \r
-    showGroupsText: 'Show in Groups'\r
-});\r
-// private\r
-Ext.grid.GroupingView.GROUP_ID = 1000;\r
-// private\r
-// This is a support class used internally by the Grid components\r
-Ext.grid.HeaderDragZone = function(grid, hd, hd2){\r
-    this.grid = grid;\r
-    this.view = grid.getView();\r
-    this.ddGroup = "gridHeader" + this.grid.getGridEl().id;\r
-    Ext.grid.HeaderDragZone.superclass.constructor.call(this, hd);\r
-    if(hd2){\r
-        this.setHandleElId(Ext.id(hd));\r
-        this.setOuterHandleElId(Ext.id(hd2));\r
-    }\r
-    this.scroll = false;\r
-};\r
-Ext.extend(Ext.grid.HeaderDragZone, Ext.dd.DragZone, {\r
-    maxDragWidth: 120,\r
-    getDragData : function(e){\r
-        var t = Ext.lib.Event.getTarget(e);\r
-        var h = this.view.findHeaderCell(t);\r
-        if(h){\r
-            return {ddel: h.firstChild, header:h};\r
-        }\r
-        return false;\r
-    },\r
-\r
-    onInitDrag : function(e){\r
-        this.view.headersDisabled = true;\r
-        var clone = this.dragData.ddel.cloneNode(true);\r
-        clone.id = Ext.id();\r
-        clone.style.width = Math.min(this.dragData.header.offsetWidth,this.maxDragWidth) + "px";\r
-        this.proxy.update(clone);\r
-        return true;\r
-    },\r
-\r
-    afterValidDrop : function(){\r
-        var v = this.view;\r
-        setTimeout(function(){\r
-            v.headersDisabled = false;\r
-        }, 50);\r
-    },\r
-\r
-    afterInvalidDrop : function(){\r
-        var v = this.view;\r
-        setTimeout(function(){\r
-            v.headersDisabled = false;\r
-        }, 50);\r
-    }\r
-});\r
-\r
-// private\r
-// This is a support class used internally by the Grid components\r
-Ext.grid.HeaderDropZone = function(grid, hd, hd2){\r
-    this.grid = grid;\r
-    this.view = grid.getView();\r
-    // split the proxies so they don't interfere with mouse events\r
-    this.proxyTop = Ext.DomHelper.append(document.body, {\r
-        cls:"col-move-top", html:"&#160;"\r
-    }, true);\r
-    this.proxyBottom = Ext.DomHelper.append(document.body, {\r
-        cls:"col-move-bottom", html:"&#160;"\r
-    }, true);\r
-    this.proxyTop.hide = this.proxyBottom.hide = function(){\r
-        this.setLeftTop(-100,-100);\r
-        this.setStyle("visibility", "hidden");\r
-    };\r
-    this.ddGroup = "gridHeader" + this.grid.getGridEl().id;\r
-    // temporarily disabled\r
-    //Ext.dd.ScrollManager.register(this.view.scroller.dom);\r
-    Ext.grid.HeaderDropZone.superclass.constructor.call(this, grid.getGridEl().dom);\r
-};\r
-Ext.extend(Ext.grid.HeaderDropZone, Ext.dd.DropZone, {\r
-    proxyOffsets : [-4, -9],\r
-    fly: Ext.Element.fly,\r
-\r
-    getTargetFromEvent : function(e){\r
-        var t = Ext.lib.Event.getTarget(e);\r
-        var cindex = this.view.findCellIndex(t);\r
-        if(cindex !== false){\r
-            return this.view.getHeaderCell(cindex);\r
-        }\r
-    },\r
-\r
-    nextVisible : function(h){\r
-        var v = this.view, cm = this.grid.colModel;\r
-        h = h.nextSibling;\r
-        while(h){\r
-            if(!cm.isHidden(v.getCellIndex(h))){\r
-                return h;\r
-            }\r
-            h = h.nextSibling;\r
-        }\r
-        return null;\r
-    },\r
-\r
-    prevVisible : function(h){\r
-        var v = this.view, cm = this.grid.colModel;\r
-        h = h.prevSibling;\r
-        while(h){\r
-            if(!cm.isHidden(v.getCellIndex(h))){\r
-                return h;\r
-            }\r
-            h = h.prevSibling;\r
-        }\r
-        return null;\r
-    },\r
-\r
-    positionIndicator : function(h, n, e){\r
-        var x = Ext.lib.Event.getPageX(e);\r
-        var r = Ext.lib.Dom.getRegion(n.firstChild);\r
-        var px, pt, py = r.top + this.proxyOffsets[1];\r
-        if((r.right - x) <= (r.right-r.left)/2){\r
-            px = r.right+this.view.borderWidth;\r
-            pt = "after";\r
-        }else{\r
-            px = r.left;\r
-            pt = "before";\r
-        }\r
-        var oldIndex = this.view.getCellIndex(h);\r
-        var newIndex = this.view.getCellIndex(n);\r
-\r
-        if(this.grid.colModel.isFixed(newIndex)){\r
-            return false;\r
-        }\r
-\r
-        var locked = this.grid.colModel.isLocked(newIndex);\r
-\r
-        if(pt == "after"){\r
-            newIndex++;\r
-        }\r
-        if(oldIndex < newIndex){\r
-            newIndex--;\r
-        }\r
-        if(oldIndex == newIndex && (locked == this.grid.colModel.isLocked(oldIndex))){\r
-            return false;\r
-        }\r
-        px +=  this.proxyOffsets[0];\r
-        this.proxyTop.setLeftTop(px, py);\r
-        this.proxyTop.show();\r
-        if(!this.bottomOffset){\r
-            this.bottomOffset = this.view.mainHd.getHeight();\r
-        }\r
-        this.proxyBottom.setLeftTop(px, py+this.proxyTop.dom.offsetHeight+this.bottomOffset);\r
-        this.proxyBottom.show();\r
-        return pt;\r
-    },\r
-\r
-    onNodeEnter : function(n, dd, e, data){\r
-        if(data.header != n){\r
-            this.positionIndicator(data.header, n, e);\r
-        }\r
-    },\r
-\r
-    onNodeOver : function(n, dd, e, data){\r
-        var result = false;\r
-        if(data.header != n){\r
-            result = this.positionIndicator(data.header, n, e);\r
-        }\r
-        if(!result){\r
-            this.proxyTop.hide();\r
-            this.proxyBottom.hide();\r
-        }\r
-        return result ? this.dropAllowed : this.dropNotAllowed;\r
-    },\r
-\r
-    onNodeOut : function(n, dd, e, data){\r
-        this.proxyTop.hide();\r
-        this.proxyBottom.hide();\r
-    },\r
-\r
-    onNodeDrop : function(n, dd, e, data){\r
-        var h = data.header;\r
-        if(h != n){\r
-            var cm = this.grid.colModel;\r
-            var x = Ext.lib.Event.getPageX(e);\r
-            var r = Ext.lib.Dom.getRegion(n.firstChild);\r
-            var pt = (r.right - x) <= ((r.right-r.left)/2) ? "after" : "before";\r
-            var oldIndex = this.view.getCellIndex(h);\r
-            var newIndex = this.view.getCellIndex(n);\r
-            var locked = cm.isLocked(newIndex);\r
-            if(pt == "after"){\r
-                newIndex++;\r
-            }\r
-            if(oldIndex < newIndex){\r
-                newIndex--;\r
-            }\r
-            if(oldIndex == newIndex && (locked == cm.isLocked(oldIndex))){\r
-                return false;\r
-            }\r
-            cm.setLocked(oldIndex, locked, true);\r
-            cm.moveColumn(oldIndex, newIndex);\r
-            this.grid.fireEvent("columnmove", oldIndex, newIndex);\r
-            return true;\r
-        }\r
-        return false;\r
-    }\r
-});\r
-\r
-\r
-Ext.grid.GridView.ColumnDragZone = function(grid, hd){\r
-    Ext.grid.GridView.ColumnDragZone.superclass.constructor.call(this, grid, hd, null);\r
-    this.proxy.el.addClass('x-grid3-col-dd');\r
-};\r
-\r
-Ext.extend(Ext.grid.GridView.ColumnDragZone, Ext.grid.HeaderDragZone, {\r
-    handleMouseDown : function(e){\r
-\r
-    },\r
-\r
-    callHandleMouseDown : function(e){\r
-        Ext.grid.GridView.ColumnDragZone.superclass.handleMouseDown.call(this, e);\r
-    }\r
-});\r
-// private\r
-// This is a support class used internally by the Grid components\r
-Ext.grid.SplitDragZone = function(grid, hd, hd2){\r
-    this.grid = grid;\r
-    this.view = grid.getView();\r
-    this.proxy = this.view.resizeProxy;\r
-    Ext.grid.SplitDragZone.superclass.constructor.call(this, hd,\r
-        "gridSplitters" + this.grid.getGridEl().id, {\r
-        dragElId : Ext.id(this.proxy.dom), resizeFrame:false\r
-    });\r
-    this.setHandleElId(Ext.id(hd));\r
-    this.setOuterHandleElId(Ext.id(hd2));\r
-    this.scroll = false;\r
-};\r
-Ext.extend(Ext.grid.SplitDragZone, Ext.dd.DDProxy, {\r
-    fly: Ext.Element.fly,\r
-\r
-    b4StartDrag : function(x, y){\r
-        this.view.headersDisabled = true;\r
-        this.proxy.setHeight(this.view.mainWrap.getHeight());\r
-        var w = this.cm.getColumnWidth(this.cellIndex);\r
-        var minw = Math.max(w-this.grid.minColumnWidth, 0);\r
-        this.resetConstraints();\r
-        this.setXConstraint(minw, 1000);\r
-        this.setYConstraint(0, 0);\r
-        this.minX = x - minw;\r
-        this.maxX = x + 1000;\r
-        this.startPos = x;\r
-        Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y);\r
-    },\r
-\r
-\r
-    handleMouseDown : function(e){\r
-        ev = Ext.EventObject.setEvent(e);\r
-        var t = this.fly(ev.getTarget());\r
-        if(t.hasClass("x-grid-split")){\r
-            this.cellIndex = this.view.getCellIndex(t.dom);\r
-            this.split = t.dom;\r
-            this.cm = this.grid.colModel;\r
-            if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){\r
-                Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this, arguments);\r
-            }\r
-        }\r
-    },\r
-\r
-    endDrag : function(e){\r
-        this.view.headersDisabled = false;\r
-        var endX = Math.max(this.minX, Ext.lib.Event.getPageX(e));\r
-        var diff = endX - this.startPos;\r
-        this.view.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff);\r
-    },\r
-\r
-    autoOffset : function(){\r
-        this.setDelta(0,0);\r
-    }\r
-});\r
-\r
-Ext.grid.GridDragZone = function(grid, config){\r
-    this.view = grid.getView();\r
-    Ext.grid.GridDragZone.superclass.constructor.call(this, this.view.mainBody.dom, config);\r
-    if(this.view.lockedBody){\r
-        this.setHandleElId(Ext.id(this.view.mainBody.dom));\r
-        this.setOuterHandleElId(Ext.id(this.view.lockedBody.dom));\r
-    }\r
-    this.scroll = false;\r
-    this.grid = grid;\r
-    this.ddel = document.createElement('div');\r
-    this.ddel.className = 'x-grid-dd-wrap';\r
-};\r
-\r
-Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, {\r
-    ddGroup : "GridDD",\r
-\r
-    \r
-    getDragData : function(e){\r
-        var t = Ext.lib.Event.getTarget(e);\r
-        var rowIndex = this.view.findRowIndex(t);\r
-        if(rowIndex !== false){\r
-            var sm = this.grid.selModel;\r
-            if(!sm.isSelected(rowIndex) || e.hasModifier()){\r
-                sm.handleMouseDown(this.grid, rowIndex, e);\r
-            }\r
-            return {grid: this.grid, ddel: this.ddel, rowIndex: rowIndex, selections:sm.getSelections()};\r
-        }\r
-        return false;\r
-    },\r
-\r
-    \r
-    onInitDrag : function(e){\r
-        var data = this.dragData;\r
-        this.ddel.innerHTML = this.grid.getDragDropText();\r
-        this.proxy.update(this.ddel);\r
-        // fire start drag?\r
-    },\r
-\r
-    \r
-    afterRepair : function(){\r
-        this.dragging = false;\r
-    },\r
-\r
-    \r
-    getRepairXY : function(e, data){\r
-        return false;\r
-    },\r
-\r
-    onEndDrag : function(data, e){\r
-        // fire end drag?\r
-    },\r
-\r
-    onValidDrop : function(dd, e, id){\r
-        // fire drag drop?\r
-        this.hideProxy();\r
-    },\r
-\r
-    beforeInvalidDrop : function(e, id){\r
-\r
-    }\r
-});\r
-\r
-\r
-Ext.grid.ColumnModel = function(config){\r
-    \r
-    this.defaultWidth = 100;\r
-\r
-    \r
-    this.defaultSortable = false;\r
-\r
-    \r
-    if(config.columns){\r
-        Ext.apply(this, config);\r
-        this.setConfig(config.columns, true);\r
-    }else{\r
-        this.setConfig(config, true);\r
-    }\r
-    this.addEvents(\r
-        \r
-        "widthchange",\r
-        \r
-        "headerchange",\r
-        \r
-        "hiddenchange",\r
-        \r
-        "columnmoved",\r
-        // deprecated - to be removed\r
-        "columnlockchange",\r
-        \r
-        "configchange"\r
-    );\r
-    Ext.grid.ColumnModel.superclass.constructor.call(this);\r
-};\r
-Ext.extend(Ext.grid.ColumnModel, Ext.util.Observable, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-\r
-    \r
-    getColumnId : function(index){\r
-        return this.config[index].id;\r
-    },\r
-\r
-    \r
-    setConfig : function(config, initial){\r
-        if(!initial){ // cleanup\r
-            delete this.totalWidth;\r
-            for(var i = 0, len = this.config.length; i < len; i++){\r
-                var c = this.config[i];\r
-                if(c.editor){\r
-                    c.editor.destroy();\r
-                }\r
-            }\r
-        }\r
-        this.config = config;\r
-        this.lookup = {};\r
-        // if no id, create one\r
-        for(var i = 0, len = config.length; i < len; i++){\r
-            var c = config[i];\r
-            if(typeof c.renderer == "string"){\r
-                c.renderer = Ext.util.Format[c.renderer];\r
-            }\r
-            if(typeof c.id == "undefined"){\r
-                c.id = i;\r
-            }\r
-            if(c.editor && c.editor.isFormField){\r
-                c.editor = new Ext.grid.GridEditor(c.editor);\r
-            }\r
-            this.lookup[c.id] = c;\r
-        }\r
-        if(!initial){\r
-            this.fireEvent('configchange', this);\r
-        }\r
-    },\r
-\r
-    \r
-    getColumnById : function(id){\r
-        return this.lookup[id];\r
-    },\r
-\r
-    \r
-    getIndexById : function(id){\r
-        for(var i = 0, len = this.config.length; i < len; i++){\r
-            if(this.config[i].id == id){\r
-                return i;\r
-            }\r
-        }\r
-        return -1;\r
-    },\r
-\r
-    \r
-    moveColumn : function(oldIndex, newIndex){\r
-        var c = this.config[oldIndex];\r
-        this.config.splice(oldIndex, 1);\r
-        this.config.splice(newIndex, 0, c);\r
-        this.dataMap = null;\r
-        this.fireEvent("columnmoved", this, oldIndex, newIndex);\r
-    },\r
-\r
-    // deprecated - to be removed\r
-    isLocked : function(colIndex){\r
-        return this.config[colIndex].locked === true;\r
-    },\r
-\r
-    // deprecated - to be removed\r
-    setLocked : function(colIndex, value, suppressEvent){\r
-        if(this.isLocked(colIndex) == value){\r
-            return;\r
-        }\r
-        this.config[colIndex].locked = value;\r
-        if(!suppressEvent){\r
-            this.fireEvent("columnlockchange", this, colIndex, value);\r
-        }\r
-    },\r
-\r
-    // deprecated - to be removed\r
-    getTotalLockedWidth : function(){\r
-        var totalWidth = 0;\r
-        for(var i = 0; i < this.config.length; i++){\r
-            if(this.isLocked(i) && !this.isHidden(i)){\r
-                this.totalWidth += this.getColumnWidth(i);\r
-            }\r
-        }\r
-        return totalWidth;\r
-    },\r
-\r
-    // deprecated - to be removed\r
-    getLockedCount : function(){\r
-        for(var i = 0, len = this.config.length; i < len; i++){\r
-            if(!this.isLocked(i)){\r
-                return i;\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    getColumnCount : function(visibleOnly){\r
-        if(visibleOnly === true){\r
-            var c = 0;\r
-            for(var i = 0, len = this.config.length; i < len; i++){\r
-                if(!this.isHidden(i)){\r
-                    c++;\r
-                }\r
-            }\r
-            return c;\r
-        }\r
-        return this.config.length;\r
-    },\r
-\r
-    \r
-    getColumnsBy : function(fn, scope){\r
-        var r = [];\r
-        for(var i = 0, len = this.config.length; i < len; i++){\r
-            var c = this.config[i];\r
-            if(fn.call(scope||this, c, i) === true){\r
-                r[r.length] = c;\r
-            }\r
-        }\r
-        return r;\r
-    },\r
-\r
-    \r
-    isSortable : function(col){\r
-        if(typeof this.config[col].sortable == "undefined"){\r
-            return this.defaultSortable;\r
-        }\r
-        return this.config[col].sortable;\r
-    },\r
-\r
-    \r
-    isMenuDisabled : function(col){\r
-        return !!this.config[col].menuDisabled;\r
-    },\r
-\r
-    \r
-    getRenderer : function(col){\r
-        if(!this.config[col].renderer){\r
-            return Ext.grid.ColumnModel.defaultRenderer;\r
-        }\r
-        return this.config[col].renderer;\r
-    },\r
-\r
-    \r
-    setRenderer : function(col, fn){\r
-        this.config[col].renderer = fn;\r
-    },\r
-\r
-    \r
-    getColumnWidth : function(col){\r
-        return this.config[col].width || this.defaultWidth;\r
-    },\r
-\r
-    \r
-    setColumnWidth : function(col, width, suppressEvent){\r
-        this.config[col].width = width;\r
-        this.totalWidth = null;\r
-        if(!suppressEvent){\r
-             this.fireEvent("widthchange", this, col, width);\r
-        }\r
-    },\r
-\r
-    \r
-    getTotalWidth : function(includeHidden){\r
-        if(!this.totalWidth){\r
-            this.totalWidth = 0;\r
-            for(var i = 0, len = this.config.length; i < len; i++){\r
-                if(includeHidden || !this.isHidden(i)){\r
-                    this.totalWidth += this.getColumnWidth(i);\r
-                }\r
-            }\r
-        }\r
-        return this.totalWidth;\r
-    },\r
-\r
-    \r
-    getColumnHeader : function(col){\r
-        return this.config[col].header;\r
-    },\r
-\r
-    \r
-    setColumnHeader : function(col, header){\r
-        this.config[col].header = header;\r
-        this.fireEvent("headerchange", this, col, header);\r
-    },\r
-\r
-    \r
-    getColumnTooltip : function(col){\r
-            return this.config[col].tooltip;\r
-    },\r
-    \r
-    setColumnTooltip : function(col, tooltip){\r
-            this.config[col].tooltip = tooltip;\r
-    },\r
-\r
-    \r
-    getDataIndex : function(col){\r
-        return this.config[col].dataIndex;\r
-    },\r
-\r
-    \r
-    setDataIndex : function(col, dataIndex){\r
-        this.config[col].dataIndex = dataIndex;\r
-    },\r
-\r
-    \r
-    findColumnIndex : function(dataIndex){\r
-        var c = this.config;\r
-        for(var i = 0, len = c.length; i < len; i++){\r
-            if(c[i].dataIndex == dataIndex){\r
-                return i;\r
-            }\r
-        }\r
-        return -1;\r
-    },\r
-\r
-    \r
-    isCellEditable : function(colIndex, rowIndex){\r
-        return (this.config[colIndex].editable || (typeof this.config[colIndex].editable == "undefined" && this.config[colIndex].editor)) ? true : false;\r
-    },\r
-\r
-    \r
-    getCellEditor : function(colIndex, rowIndex){\r
-        return this.config[colIndex].editor;\r
-    },\r
-\r
-    \r
-    setEditable : function(col, editable){\r
-        this.config[col].editable = editable;\r
-    },\r
-\r
-\r
-    \r
-    isHidden : function(colIndex){\r
-        return this.config[colIndex].hidden;\r
-    },\r
-\r
-\r
-    \r
-    isFixed : function(colIndex){\r
-        return this.config[colIndex].fixed;\r
-    },\r
-\r
-    \r
-    isResizable : function(colIndex){\r
-        return colIndex >= 0 && this.config[colIndex].resizable !== false && this.config[colIndex].fixed !== true;\r
-    },\r
-    \r
-    setHidden : function(colIndex, hidden){\r
-        var c = this.config[colIndex];\r
-        if(c.hidden !== hidden){\r
-            c.hidden = hidden;\r
-            this.totalWidth = null;\r
-            this.fireEvent("hiddenchange", this, colIndex, hidden);\r
-        }\r
-    },\r
-\r
-    \r
-    setEditor : function(col, editor){\r
-        this.config[col].editor = editor;\r
-    }\r
-});\r
-\r
-// private\r
-Ext.grid.ColumnModel.defaultRenderer = function(value){\r
-    if(typeof value == "string" && value.length < 1){\r
-        return "&#160;";\r
-    }\r
-    return value;\r
-};\r
-\r
-// Alias for backwards compatibility\r
-Ext.grid.DefaultColumnModel = Ext.grid.ColumnModel;\r
-\r
-Ext.grid.AbstractSelectionModel = function(){\r
-    this.locked = false;\r
-    Ext.grid.AbstractSelectionModel.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.grid.AbstractSelectionModel, Ext.util.Observable,  {\r
-    \r
-    init : function(grid){\r
-        this.grid = grid;\r
-        this.initEvents();\r
-    },\r
-\r
-    \r
-    lock : function(){\r
-        this.locked = true;\r
-    },\r
-\r
-    \r
-    unlock : function(){\r
-        this.locked = false;\r
-    },\r
-\r
-    \r
-    isLocked : function(){\r
-        return this.locked;\r
-    }\r
-});\r
-\r
-Ext.grid.RowSelectionModel = function(config){\r
-    Ext.apply(this, config);\r
-    this.selections = new Ext.util.MixedCollection(false, function(o){\r
-        return o.id;\r
-    });\r
-\r
-    this.last = false;\r
-    this.lastActive = false;\r
-\r
-    this.addEvents(\r
-        \r
-           "selectionchange",\r
-        \r
-           "beforerowselect",\r
-        \r
-           "rowselect",\r
-        \r
-           "rowdeselect"\r
-    );\r
-\r
-    Ext.grid.RowSelectionModel.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.grid.RowSelectionModel, Ext.grid.AbstractSelectionModel,  {\r
-    \r
-    singleSelect : false,\r
-\r
-       \r
-    // private\r
-    initEvents : function(){\r
-\r
-        if(!this.grid.enableDragDrop && !this.grid.enableDrag){\r
-            this.grid.on("rowmousedown", this.handleMouseDown, this);\r
-        }else{ // allow click to work like normal\r
-            this.grid.on("rowclick", function(grid, rowIndex, e) {\r
-                if(e.button === 0 && !e.shiftKey && !e.ctrlKey) {\r
-                    this.selectRow(rowIndex, false);\r
-                    grid.view.focusRow(rowIndex);\r
-                }\r
-            }, this);\r
-        }\r
-\r
-        this.rowNav = new Ext.KeyNav(this.grid.getGridEl(), {\r
-            "up" : function(e){\r
-                if(!e.shiftKey || this.singleSelect){\r
-                    this.selectPrevious(false);\r
-                }else if(this.last !== false && this.lastActive !== false){\r
-                    var last = this.last;\r
-                    this.selectRange(this.last,  this.lastActive-1);\r
-                    this.grid.getView().focusRow(this.lastActive);\r
-                    if(last !== false){\r
-                        this.last = last;\r
-                    }\r
-                }else{\r
-                    this.selectFirstRow();\r
-                }\r
-            },\r
-            "down" : function(e){\r
-                if(!e.shiftKey || this.singleSelect){\r
-                    this.selectNext(false);\r
-                }else if(this.last !== false && this.lastActive !== false){\r
-                    var last = this.last;\r
-                    this.selectRange(this.last,  this.lastActive+1);\r
-                    this.grid.getView().focusRow(this.lastActive);\r
-                    if(last !== false){\r
-                        this.last = last;\r
-                    }\r
-                }else{\r
-                    this.selectFirstRow();\r
-                }\r
-            },\r
-            scope: this\r
-        });\r
-\r
-        var view = this.grid.view;\r
-        view.on("refresh", this.onRefresh, this);\r
-        view.on("rowupdated", this.onRowUpdated, this);\r
-        view.on("rowremoved", this.onRemove, this);\r
-    },\r
-\r
-    // private\r
-    onRefresh : function(){\r
-        var ds = this.grid.store, index;\r
-        var s = this.getSelections();\r
-        this.clearSelections(true);\r
-        for(var i = 0, len = s.length; i < len; i++){\r
-            var r = s[i];\r
-            if((index = ds.indexOfId(r.id)) != -1){\r
-                this.selectRow(index, true);\r
-            }\r
-        }\r
-        if(s.length != this.selections.getCount()){\r
-            this.fireEvent("selectionchange", this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onRemove : function(v, index, r){\r
-        if(this.selections.remove(r) !== false){\r
-            this.fireEvent('selectionchange', this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onRowUpdated : function(v, index, r){\r
-        if(this.isSelected(r)){\r
-            v.onRowSelect(index);\r
-        }\r
-    },\r
-\r
-    \r
-    selectRecords : function(records, keepExisting){\r
-        if(!keepExisting){\r
-            this.clearSelections();\r
-        }\r
-        var ds = this.grid.store;\r
-        for(var i = 0, len = records.length; i < len; i++){\r
-            this.selectRow(ds.indexOf(records[i]), true);\r
-        }\r
-    },\r
-\r
-    \r
-    getCount : function(){\r
-        return this.selections.length;\r
-    },\r
-\r
-    \r
-    selectFirstRow : function(){\r
-        this.selectRow(0);\r
-    },\r
-\r
-    \r
-    selectLastRow : function(keepExisting){\r
-        this.selectRow(this.grid.store.getCount() - 1, keepExisting);\r
-    },\r
-\r
-    \r
-    selectNext : function(keepExisting){\r
-        if(this.hasNext()){\r
-            this.selectRow(this.last+1, keepExisting);\r
-            this.grid.getView().focusRow(this.last);\r
-                       return true;\r
-        }\r
-               return false;\r
-    },\r
-\r
-    \r
-    selectPrevious : function(keepExisting){\r
-        if(this.hasPrevious()){\r
-            this.selectRow(this.last-1, keepExisting);\r
-            this.grid.getView().focusRow(this.last);\r
-                       return true;\r
-        }\r
-               return false;\r
-    },\r
-\r
-    \r
-    hasNext : function(){\r
-        return this.last !== false && (this.last+1) < this.grid.store.getCount();\r
-    },\r
-\r
-    \r
-    hasPrevious : function(){\r
-        return !!this.last;\r
-    },\r
-\r
-\r
-    \r
-    getSelections : function(){\r
-        return [].concat(this.selections.items);\r
-    },\r
-\r
-    \r
-    getSelected : function(){\r
-        return this.selections.itemAt(0);\r
-    },\r
-\r
-    \r
-    each : function(fn, scope){\r
-        var s = this.getSelections();\r
-        for(var i = 0, len = s.length; i < len; i++){\r
-            if(fn.call(scope || this, s[i], i) === false){\r
-                return false;\r
-            }\r
-        }\r
-        return true;\r
-    },\r
-\r
-    \r
-    clearSelections : function(fast){\r
-        if(this.isLocked()) return;\r
-        if(fast !== true){\r
-            var ds = this.grid.store;\r
-            var s = this.selections;\r
-            s.each(function(r){\r
-                this.deselectRow(ds.indexOfId(r.id));\r
-            }, this);\r
-            s.clear();\r
-        }else{\r
-            this.selections.clear();\r
-        }\r
-        this.last = false;\r
-    },\r
-\r
-\r
-    \r
-    selectAll : function(){\r
-        if(this.isLocked()) return;\r
-        this.selections.clear();\r
-        for(var i = 0, len = this.grid.store.getCount(); i < len; i++){\r
-            this.selectRow(i, true);\r
-        }\r
-    },\r
-\r
-    \r
-    hasSelection : function(){\r
-        return this.selections.length > 0;\r
-    },\r
-\r
-    \r
-    isSelected : function(index){\r
-        var r = typeof index == "number" ? this.grid.store.getAt(index) : index;\r
-        return (r && this.selections.key(r.id) ? true : false);\r
-    },\r
-\r
-    \r
-    isIdSelected : function(id){\r
-        return (this.selections.key(id) ? true : false);\r
-    },\r
-\r
-    // private\r
-    handleMouseDown : function(g, rowIndex, e){\r
-        if(e.button !== 0 || this.isLocked()){\r
-            return;\r
-        };\r
-        var view = this.grid.getView();\r
-        if(e.shiftKey && !this.singleSelect && this.last !== false){\r
-            var last = this.last;\r
-            this.selectRange(last, rowIndex, e.ctrlKey);\r
-            this.last = last; // reset the last\r
-            view.focusRow(rowIndex);\r
-        }else{\r
-            var isSelected = this.isSelected(rowIndex);\r
-            if(e.ctrlKey && isSelected){\r
-                this.deselectRow(rowIndex);\r
-            }else if(!isSelected || this.getCount() > 1){\r
-                this.selectRow(rowIndex, e.ctrlKey || e.shiftKey);\r
-                view.focusRow(rowIndex);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    selectRows : function(rows, keepExisting){\r
-        if(!keepExisting){\r
-            this.clearSelections();\r
-        }\r
-        for(var i = 0, len = rows.length; i < len; i++){\r
-            this.selectRow(rows[i], true);\r
-        }\r
-    },\r
-\r
-    \r
-    selectRange : function(startRow, endRow, keepExisting){\r
-        if(this.isLocked()) return;\r
-        if(!keepExisting){\r
-            this.clearSelections();\r
-        }\r
-        if(startRow <= endRow){\r
-            for(var i = startRow; i <= endRow; i++){\r
-                this.selectRow(i, true);\r
-            }\r
-        }else{\r
-            for(var i = startRow; i >= endRow; i--){\r
-                this.selectRow(i, true);\r
-            }\r
-        }\r
-    },\r
-\r
-    \r
-    deselectRange : function(startRow, endRow, preventViewNotify){\r
-        if(this.isLocked()) return;\r
-        for(var i = startRow; i <= endRow; i++){\r
-            this.deselectRow(i, preventViewNotify);\r
-        }\r
-    },\r
-\r
-    \r
-    selectRow : function(index, keepExisting, preventViewNotify){\r
-        if(this.isLocked() || (index < 0 || index >= this.grid.store.getCount()) || this.isSelected(index)) return;\r
-        var r = this.grid.store.getAt(index);\r
-        if(r && this.fireEvent("beforerowselect", this, index, keepExisting, r) !== false){\r
-            if(!keepExisting || this.singleSelect){\r
-                this.clearSelections();\r
-            }\r
-            this.selections.add(r);\r
-            this.last = this.lastActive = index;\r
-            if(!preventViewNotify){\r
-                this.grid.getView().onRowSelect(index);\r
-            }\r
-            this.fireEvent("rowselect", this, index, r);\r
-            this.fireEvent("selectionchange", this);\r
-        }\r
-    },\r
-\r
-    \r
-    deselectRow : function(index, preventViewNotify){\r
-        if(this.isLocked()) return;\r
-        if(this.last == index){\r
-            this.last = false;\r
-        }\r
-        if(this.lastActive == index){\r
-            this.lastActive = false;\r
-        }\r
-        var r = this.grid.store.getAt(index);\r
-        if(r){\r
-            this.selections.remove(r);\r
-            if(!preventViewNotify){\r
-                this.grid.getView().onRowDeselect(index);\r
-            }\r
-            this.fireEvent("rowdeselect", this, index, r);\r
-            this.fireEvent("selectionchange", this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    restoreLast : function(){\r
-        if(this._last){\r
-            this.last = this._last;\r
-        }\r
-    },\r
-\r
-    // private\r
-    acceptsNav : function(row, col, cm){\r
-        return !cm.isHidden(col) && cm.isCellEditable(col, row);\r
-    },\r
-\r
-    // private\r
-    onEditorKey : function(field, e){\r
-        var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor;\r
-        var shift = e.shiftKey;\r
-        if(k == e.TAB){\r
-            e.stopEvent();\r
-            ed.completeEdit();\r
-            if(shift){\r
-                newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this);\r
-            }else{\r
-                newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this);\r
-            }\r
-        }else if(k == e.ENTER){\r
-            e.stopEvent();\r
-            ed.completeEdit();\r
-                       if(this.moveEditorOnEnter !== false){\r
-                               if(shift){\r
-                                       newCell = g.walkCells(ed.row - 1, ed.col, -1, this.acceptsNav, this);\r
-                               }else{\r
-                                       newCell = g.walkCells(ed.row + 1, ed.col, 1, this.acceptsNav, this);\r
-                               }\r
-                       }\r
-        }else if(k == e.ESC){\r
-            ed.cancelEdit();\r
-        }\r
-        if(newCell){\r
-            g.startEditing(newCell[0], newCell[1]);\r
-        }\r
-    }\r
-});\r
-\r
-Ext.grid.CellSelectionModel = function(config){\r
-    Ext.apply(this, config);\r
-\r
-    this.selection = null;\r
-\r
-    this.addEvents(\r
-        \r
-           "beforecellselect",\r
-        \r
-           "cellselect",\r
-        \r
-           "selectionchange"\r
-    );\r
-\r
-    Ext.grid.CellSelectionModel.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.grid.CellSelectionModel, Ext.grid.AbstractSelectionModel,  {\r
-\r
-    \r
-    initEvents : function(){\r
-        this.grid.on("cellmousedown", this.handleMouseDown, this);\r
-        this.grid.getGridEl().on(Ext.isIE || Ext.isSafari3 ? "keydown" : "keypress", this.handleKeyDown, this);\r
-        var view = this.grid.view;\r
-        view.on("refresh", this.onViewChange, this);\r
-        view.on("rowupdated", this.onRowUpdated, this);\r
-        view.on("beforerowremoved", this.clearSelections, this);\r
-        view.on("beforerowsinserted", this.clearSelections, this);\r
-        if(this.grid.isEditor){\r
-            this.grid.on("beforeedit", this.beforeEdit,  this);\r
-        }\r
-    },\r
-\r
-       //private\r
-    beforeEdit : function(e){\r
-        this.select(e.row, e.column, false, true, e.record);\r
-    },\r
-\r
-       //private\r
-    onRowUpdated : function(v, index, r){\r
-        if(this.selection && this.selection.record == r){\r
-            v.onCellSelect(index, this.selection.cell[1]);\r
-        }\r
-    },\r
-\r
-       //private\r
-    onViewChange : function(){\r
-        this.clearSelections(true);\r
-    },\r
-\r
-       \r
-    getSelectedCell : function(){\r
-        return this.selection ? this.selection.cell : null;\r
-    },\r
-\r
-    \r
-    clearSelections : function(preventNotify){\r
-        var s = this.selection;\r
-        if(s){\r
-            if(preventNotify !== true){\r
-                this.grid.view.onCellDeselect(s.cell[0], s.cell[1]);\r
-            }\r
-            this.selection = null;\r
-            this.fireEvent("selectionchange", this, null);\r
-        }\r
-    },\r
-\r
-    \r
-    hasSelection : function(){\r
-        return this.selection ? true : false;\r
-    },\r
-\r
-    \r
-    handleMouseDown : function(g, row, cell, e){\r
-        if(e.button !== 0 || this.isLocked()){\r
-            return;\r
-        };\r
-        this.select(row, cell);\r
-    },\r
-\r
-    \r
-    select : function(rowIndex, colIndex, preventViewNotify, preventFocus,  r){\r
-        if(this.fireEvent("beforecellselect", this, rowIndex, colIndex) !== false){\r
-            this.clearSelections();\r
-            r = r || this.grid.store.getAt(rowIndex);\r
-            this.selection = {\r
-                record : r,\r
-                cell : [rowIndex, colIndex]\r
-            };\r
-            if(!preventViewNotify){\r
-                var v = this.grid.getView();\r
-                v.onCellSelect(rowIndex, colIndex);\r
-                if(preventFocus !== true){\r
-                    v.focusCell(rowIndex, colIndex);\r
-                }\r
-            }\r
-            this.fireEvent("cellselect", this, rowIndex, colIndex);\r
-            this.fireEvent("selectionchange", this, this.selection);\r
-        }\r
-    },\r
-\r
-       //private\r
-    isSelectable : function(rowIndex, colIndex, cm){\r
-        return !cm.isHidden(colIndex);\r
-    },\r
-\r
-    \r
-    handleKeyDown : function(e){\r
-        if(!e.isNavKeyPress()){\r
-            return;\r
-        }\r
-        var g = this.grid, s = this.selection;\r
-        if(!s){\r
-            e.stopEvent();\r
-            var cell = g.walkCells(0, 0, 1, this.isSelectable,  this);\r
-            if(cell){\r
-                this.select(cell[0], cell[1]);\r
-            }\r
-            return;\r
-        }\r
-        var sm = this;\r
-        var walk = function(row, col, step){\r
-            return g.walkCells(row, col, step, sm.isSelectable,  sm);\r
-        };\r
-        var k = e.getKey(), r = s.cell[0], c = s.cell[1];\r
-        var newCell;\r
-\r
-        switch(k){\r
-             case e.TAB:\r
-                 if(e.shiftKey){\r
-                     newCell = walk(r, c-1, -1);\r
-                 }else{\r
-                     newCell = walk(r, c+1, 1);\r
-                 }\r
-             break;\r
-             case e.DOWN:\r
-                 newCell = walk(r+1, c, 1);\r
-             break;\r
-             case e.UP:\r
-                 newCell = walk(r-1, c, -1);\r
-             break;\r
-             case e.RIGHT:\r
-                 newCell = walk(r, c+1, 1);\r
-             break;\r
-             case e.LEFT:\r
-                 newCell = walk(r, c-1, -1);\r
-             break;\r
-             case e.ENTER:\r
-                 if(g.isEditor && !g.editing){\r
-                    g.startEditing(r, c);\r
-                    e.stopEvent();\r
-                    return;\r
-                }\r
-             break;\r
-        };\r
-        if(newCell){\r
-            this.select(newCell[0], newCell[1]);\r
-            e.stopEvent();\r
-        }\r
-    },\r
-\r
-    acceptsNav : function(row, col, cm){\r
-        return !cm.isHidden(col) && cm.isCellEditable(col, row);\r
-    },\r
-\r
-    onEditorKey : function(field, e){\r
-        var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor;\r
-        if(k == e.TAB){\r
-            if(e.shiftKey){\r
-                newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this);\r
-            }else{\r
-                newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this);\r
-            }\r
-            e.stopEvent();\r
-        }else if(k == e.ENTER){\r
-            ed.completeEdit();\r
-            e.stopEvent();\r
-        }else if(k == e.ESC){\r
-               e.stopEvent();\r
-            ed.cancelEdit();\r
-        }\r
-        if(newCell){\r
-            g.startEditing(newCell[0], newCell[1]);\r
-        }\r
-    }\r
-});\r
-\r
-Ext.grid.EditorGridPanel = Ext.extend(Ext.grid.GridPanel, {\r
-    \r
-    clicksToEdit: 2,\r
-\r
-    // private\r
-    isEditor : true,\r
-    // private\r
-    detectEdit: false,\r
-\r
-       \r
-       autoEncode : false,\r
-\r
-       \r
-    // private\r
-    trackMouseOver: false, // causes very odd FF errors\r
-\r
-    // private\r
-    initComponent : function(){\r
-        Ext.grid.EditorGridPanel.superclass.initComponent.call(this);\r
-\r
-        if(!this.selModel){\r
-            \r
-            this.selModel = new Ext.grid.CellSelectionModel();\r
-        }\r
-\r
-        this.activeEditor = null;\r
-\r
-           this.addEvents(\r
-            \r
-            "beforeedit",\r
-            \r
-            "afteredit",\r
-            \r
-            "validateedit"\r
-        );\r
-    },\r
-\r
-    // private\r
-    initEvents : function(){\r
-        Ext.grid.EditorGridPanel.superclass.initEvents.call(this);\r
-\r
-        this.on("bodyscroll", this.stopEditing, this, [true]);\r
-        this.on("columnresize", this.stopEditing, this, [true]);\r
-\r
-        if(this.clicksToEdit == 1){\r
-            this.on("cellclick", this.onCellDblClick, this);\r
-        }else {\r
-            if(this.clicksToEdit == 'auto' && this.view.mainBody){\r
-                this.view.mainBody.on("mousedown", this.onAutoEditClick, this);\r
-            }\r
-            this.on("celldblclick", this.onCellDblClick, this);\r
-        }\r
-    },\r
-\r
-    // private\r
-    onCellDblClick : function(g, row, col){\r
-        this.startEditing(row, col);\r
-    },\r
-\r
-    // private\r
-    onAutoEditClick : function(e, t){\r
-        if(e.button !== 0){\r
-            return;\r
-        }\r
-        var row = this.view.findRowIndex(t);\r
-        var col = this.view.findCellIndex(t);\r
-        if(row !== false && col !== false){\r
-            this.stopEditing();\r
-            if(this.selModel.getSelectedCell){ // cell sm\r
-                var sc = this.selModel.getSelectedCell();\r
-                if(sc && sc.cell[0] === row && sc.cell[1] === col){\r
-                    this.startEditing(row, col);\r
-                }\r
-            }else{\r
-                if(this.selModel.isSelected(row)){\r
-                    this.startEditing(row, col);\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    onEditComplete : function(ed, value, startValue){\r
-        this.editing = false;\r
-        this.activeEditor = null;\r
-        ed.un("specialkey", this.selModel.onEditorKey, this.selModel);\r
-               var r = ed.record;\r
-        var field = this.colModel.getDataIndex(ed.col);\r
-        value = this.postEditValue(value, startValue, r, field);\r
-        if(String(value) !== String(startValue)){\r
-            var e = {\r
-                grid: this,\r
-                record: r,\r
-                field: field,\r
-                originalValue: startValue,\r
-                value: value,\r
-                row: ed.row,\r
-                column: ed.col,\r
-                cancel:false\r
-            };\r
-            if(this.fireEvent("validateedit", e) !== false && !e.cancel){\r
-                r.set(field, e.value);\r
-                delete e.cancel;\r
-                this.fireEvent("afteredit", e);\r
-            }\r
-        }\r
-        this.view.focusCell(ed.row, ed.col);\r
-    },\r
-\r
-    \r
-    startEditing : function(row, col){\r
-        this.stopEditing();\r
-        if(this.colModel.isCellEditable(col, row)){\r
-            this.view.ensureVisible(row, col, true);\r
-            var r = this.store.getAt(row);\r
-            var field = this.colModel.getDataIndex(col);\r
-            var e = {\r
-                grid: this,\r
-                record: r,\r
-                field: field,\r
-                value: r.data[field],\r
-                row: row,\r
-                column: col,\r
-                cancel:false\r
-            };\r
-            if(this.fireEvent("beforeedit", e) !== false && !e.cancel){\r
-                this.editing = true;\r
-                var ed = this.colModel.getCellEditor(col, row);\r
-                if(!ed.rendered){\r
-                    ed.render(this.view.getEditorParent(ed));\r
-                }\r
-                (function(){ // complex but required for focus issues in safari, ie and opera\r
-                    ed.row = row;\r
-                    ed.col = col;\r
-                    ed.record = r;\r
-                    ed.on("complete", this.onEditComplete, this, {single: true});\r
-                    ed.on("specialkey", this.selModel.onEditorKey, this.selModel);\r
-                    \r
-                    this.activeEditor = ed;\r
-                    var v = this.preEditValue(r, field);\r
-                    ed.startEdit(this.view.getCell(row, col).firstChild, v === undefined ? '' : v);\r
-                }).defer(50, this);\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-       preEditValue : function(r, field){\r
-        var value = r.data[field];\r
-               return this.autoEncode && typeof value == 'string' ? Ext.util.Format.htmlDecode(value) : value;\r
-       },\r
-\r
-    // private\r
-       postEditValue : function(value, originalValue, r, field){\r
-               return this.autoEncode && typeof value == 'string' ? Ext.util.Format.htmlEncode(value) : value;\r
-       },\r
-\r
-    \r
-    stopEditing : function(cancel){\r
-        if(this.activeEditor){\r
-            this.activeEditor[cancel === true ? 'cancelEdit' : 'completeEdit']();\r
-        }\r
-        this.activeEditor = null;\r
-    },\r
-\r
-    // private\r
-    onDestroy: function() {\r
-        if(this.rendered){\r
-            var cols = this.colModel.config;\r
-            for(var i = 0, len = cols.length; i < len; i++){\r
-                var c = cols[i];\r
-                Ext.destroy(c.editor);\r
-            }\r
-        }\r
-        Ext.grid.EditorGridPanel.superclass.onDestroy.call(this);\r
-    }\r
-});\r
-Ext.reg('editorgrid', Ext.grid.EditorGridPanel);\r
-// private\r
-// This is a support class used internally by the Grid components\r
-Ext.grid.GridEditor = function(field, config){\r
-    Ext.grid.GridEditor.superclass.constructor.call(this, field, config);\r
-    field.monitorTab = false;\r
-};\r
-\r
-Ext.extend(Ext.grid.GridEditor, Ext.Editor, {\r
-    alignment: "tl-tl",\r
-    autoSize: "width",\r
-    hideEl : false,\r
-    cls: "x-small-editor x-grid-editor",\r
-    shim:false,\r
-    shadow:false\r
-});\r
-\r
-Ext.grid.PropertyRecord = Ext.data.Record.create([\r
-    {name:'name',type:'string'}, 'value'\r
-]);\r
-\r
-\r
-Ext.grid.PropertyStore = function(grid, source){\r
-    this.grid = grid;\r
-    this.store = new Ext.data.Store({\r
-        recordType : Ext.grid.PropertyRecord\r
-    });\r
-    this.store.on('update', this.onUpdate,  this);\r
-    if(source){\r
-        this.setSource(source);\r
-    }\r
-    Ext.grid.PropertyStore.superclass.constructor.call(this);\r
-};\r
-Ext.extend(Ext.grid.PropertyStore, Ext.util.Observable, {\r
-    // protected - should only be called by the grid.  Use grid.setSource instead.\r
-    setSource : function(o){\r
-        this.source = o;\r
-        this.store.removeAll();\r
-        var data = [];\r
-        for(var k in o){\r
-            if(this.isEditableValue(o[k])){\r
-                data.push(new Ext.grid.PropertyRecord({name: k, value: o[k]}, k));\r
-            }\r
-        }\r
-        this.store.loadRecords({records: data}, {}, true);\r
-    },\r
-\r
-    // private\r
-    onUpdate : function(ds, record, type){\r
-        if(type == Ext.data.Record.EDIT){\r
-            var v = record.data['value'];\r
-            var oldValue = record.modified['value'];\r
-            if(this.grid.fireEvent('beforepropertychange', this.source, record.id, v, oldValue) !== false){\r
-                this.source[record.id] = v;\r
-                record.commit();\r
-                this.grid.fireEvent('propertychange', this.source, record.id, v, oldValue);\r
-            }else{\r
-                record.reject();\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    getProperty : function(row){\r
-       return this.store.getAt(row);\r
-    },\r
-\r
-    // private\r
-    isEditableValue: function(val){\r
-        if(Ext.isDate(val)){\r
-            return true;\r
-        }else if(typeof val == 'object' || typeof val == 'function'){\r
-            return false;\r
-        }\r
-        return true;\r
-    },\r
-\r
-    // private\r
-    setValue : function(prop, value){\r
-        this.source[prop] = value;\r
-        this.store.getById(prop).set('value', value);\r
-    },\r
-\r
-    // protected - should only be called by the grid.  Use grid.getSource instead.\r
-    getSource : function(){\r
-        return this.source;\r
-    }\r
-});\r
-\r
-\r
-Ext.grid.PropertyColumnModel = function(grid, store){\r
-    this.grid = grid;\r
-    var g = Ext.grid;\r
-    g.PropertyColumnModel.superclass.constructor.call(this, [\r
-        {header: this.nameText, width:50, sortable: true, dataIndex:'name', id: 'name', menuDisabled:true},\r
-        {header: this.valueText, width:50, resizable:false, dataIndex: 'value', id: 'value', menuDisabled:true}\r
-    ]);\r
-    this.store = store;\r
-    this.bselect = Ext.DomHelper.append(document.body, {\r
-        tag: 'select', cls: 'x-grid-editor x-hide-display', children: [\r
-            {tag: 'option', value: 'true', html: 'true'},\r
-            {tag: 'option', value: 'false', html: 'false'}\r
-        ]\r
-    });\r
-    var f = Ext.form;\r
-\r
-    var bfield = new f.Field({\r
-        el:this.bselect,\r
-        bselect : this.bselect,\r
-        autoShow: true,\r
-        getValue : function(){\r
-            return this.bselect.value == 'true';\r
-        }\r
-    });\r
-    this.editors = {\r
-        'date' : new g.GridEditor(new f.DateField({selectOnFocus:true})),\r
-        'string' : new g.GridEditor(new f.TextField({selectOnFocus:true})),\r
-        'number' : new g.GridEditor(new f.NumberField({selectOnFocus:true, style:'text-align:left;'})),\r
-        'boolean' : new g.GridEditor(bfield)\r
-    };\r
-    this.renderCellDelegate = this.renderCell.createDelegate(this);\r
-    this.renderPropDelegate = this.renderProp.createDelegate(this);\r
-};\r
-\r
-Ext.extend(Ext.grid.PropertyColumnModel, Ext.grid.ColumnModel, {\r
-    // private - strings used for locale support\r
-    nameText : 'Name',\r
-    valueText : 'Value',\r
-    dateFormat : 'm/j/Y',\r
-\r
-    // private\r
-    renderDate : function(dateVal){\r
-        return dateVal.dateFormat(this.dateFormat);\r
-    },\r
-\r
-    // private\r
-    renderBool : function(bVal){\r
-        return bVal ? 'true' : 'false';\r
-    },\r
-\r
-    // private\r
-    isCellEditable : function(colIndex, rowIndex){\r
-        return colIndex == 1;\r
-    },\r
-\r
-    // private\r
-    getRenderer : function(col){\r
-        return col == 1 ?\r
-            this.renderCellDelegate : this.renderPropDelegate;\r
-    },\r
-\r
-    // private\r
-    renderProp : function(v){\r
-        return this.getPropertyName(v);\r
-    },\r
-\r
-    // private\r
-    renderCell : function(val){\r
-        var rv = val;\r
-        if(Ext.isDate(val)){\r
-            rv = this.renderDate(val);\r
-        }else if(typeof val == 'boolean'){\r
-            rv = this.renderBool(val);\r
-        }\r
-        return Ext.util.Format.htmlEncode(rv);\r
-    },\r
-\r
-    // private\r
-    getPropertyName : function(name){\r
-        var pn = this.grid.propertyNames;\r
-        return pn && pn[name] ? pn[name] : name;\r
-    },\r
-\r
-    // private\r
-    getCellEditor : function(colIndex, rowIndex){\r
-        var p = this.store.getProperty(rowIndex);\r
-        var n = p.data['name'], val = p.data['value'];\r
-        if(this.grid.customEditors[n]){\r
-            return this.grid.customEditors[n];\r
-        }\r
-        if(Ext.isDate(val)){\r
-            return this.editors['date'];\r
-        }else if(typeof val == 'number'){\r
-            return this.editors['number'];\r
-        }else if(typeof val == 'boolean'){\r
-            return this.editors['boolean'];\r
-        }else{\r
-            return this.editors['string'];\r
-        }\r
-    }\r
-});\r
-\r
-\r
-Ext.grid.PropertyGrid = Ext.extend(Ext.grid.EditorGridPanel, {\r
-    \r
-    \r
-    \r
-\r
-    // private config overrides\r
-    enableColumnMove:false,\r
-    stripeRows:false,\r
-    trackMouseOver: false,\r
-    clicksToEdit:1,\r
-    enableHdMenu : false,\r
-    viewConfig : {\r
-        forceFit:true\r
-    },\r
-\r
-    // private\r
-    initComponent : function(){\r
-        this.customEditors = this.customEditors || {};\r
-        this.lastEditRow = null;\r
-        var store = new Ext.grid.PropertyStore(this);\r
-        this.propStore = store;\r
-        var cm = new Ext.grid.PropertyColumnModel(this, store);\r
-        store.store.sort('name', 'ASC');\r
-        this.addEvents(\r
-            \r
-            'beforepropertychange',\r
-            \r
-            'propertychange'\r
-        );\r
-        this.cm = cm;\r
-        this.ds = store.store;\r
-        Ext.grid.PropertyGrid.superclass.initComponent.call(this);\r
-\r
-        this.selModel.on('beforecellselect', function(sm, rowIndex, colIndex){\r
-            if(colIndex === 0){\r
-                this.startEditing.defer(200, this, [rowIndex, 1]);\r
-                return false;\r
-            }\r
-        }, this);\r
-    },\r
-\r
-    // private\r
-    onRender : function(){\r
-        Ext.grid.PropertyGrid.superclass.onRender.apply(this, arguments);\r
-\r
-        this.getGridEl().addClass('x-props-grid');\r
-    },\r
-\r
-    // private\r
-    afterRender: function(){\r
-        Ext.grid.PropertyGrid.superclass.afterRender.apply(this, arguments);\r
-        if(this.source){\r
-            this.setSource(this.source);\r
-        }\r
-    },\r
-\r
-    \r
-    setSource : function(source){\r
-        this.propStore.setSource(source);\r
-    },\r
-\r
-    \r
-    getSource : function(){\r
-        return this.propStore.getSource();\r
-    }\r
-});\r
-Ext.reg("propertygrid", Ext.grid.PropertyGrid);\r
-\r
-\r
-Ext.grid.RowNumberer = function(config){\r
-    Ext.apply(this, config);\r
-    if(this.rowspan){\r
-        this.renderer = this.renderer.createDelegate(this);\r
-    }\r
-};\r
-\r
-Ext.grid.RowNumberer.prototype = {\r
-    \r
-    header: "",\r
-    \r
-    width: 23,\r
-    \r
-    sortable: false,\r
-\r
-    // private\r
-    fixed:true,\r
-    menuDisabled:true,\r
-    dataIndex: '',\r
-    id: 'numberer',\r
-    rowspan: undefined,\r
-\r
-    // private\r
-    renderer : function(v, p, record, rowIndex){\r
-        if(this.rowspan){\r
-            p.cellAttr = 'rowspan="'+this.rowspan+'"';\r
-        }\r
-        return rowIndex+1;\r
-    }\r
-};\r
-\r
-Ext.grid.CheckboxSelectionModel = Ext.extend(Ext.grid.RowSelectionModel, {\r
-    \r
-    header: '<div class="x-grid3-hd-checker">&#160;</div>',\r
-    \r
-    width: 20,\r
-    \r
-    sortable: false,\r
-\r
-    // private\r
-    menuDisabled:true,\r
-    fixed:true,\r
-    dataIndex: '',\r
-    id: 'checker',\r
-\r
-    // private\r
-    initEvents : function(){\r
-        Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this);\r
-        this.grid.on('render', function(){\r
-            var view = this.grid.getView();\r
-            view.mainBody.on('mousedown', this.onMouseDown, this);\r
-            Ext.fly(view.innerHd).on('mousedown', this.onHdMouseDown, this);\r
-\r
-        }, this);\r
-    },\r
-\r
-    // private\r
-    onMouseDown : function(e, t){\r
-        if(e.button === 0 && t.className == 'x-grid3-row-checker'){ // Only fire if left-click\r
-            e.stopEvent();\r
-            var row = e.getTarget('.x-grid3-row');\r
-            if(row){\r
-                var index = row.rowIndex;\r
-                if(this.isSelected(index)){\r
-                    this.deselectRow(index);\r
-                }else{\r
-                    this.selectRow(index, true);\r
-                }\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    onHdMouseDown : function(e, t){\r
-        if(t.className == 'x-grid3-hd-checker'){\r
-            e.stopEvent();\r
-            var hd = Ext.fly(t.parentNode);\r
-            var isChecked = hd.hasClass('x-grid3-hd-checker-on');\r
-            if(isChecked){\r
-                hd.removeClass('x-grid3-hd-checker-on');\r
-                this.clearSelections();\r
-            }else{\r
-                hd.addClass('x-grid3-hd-checker-on');\r
-                this.selectAll();\r
-            }\r
-        }\r
-    },\r
-\r
-    // private\r
-    renderer : function(v, p, record){\r
-        return '<div class="x-grid3-row-checker">&#160;</div>';\r
-    }\r
-});\r
-\r
-Ext.LoadMask = function(el, config){\r
-    this.el = Ext.get(el);\r
-    Ext.apply(this, config);\r
-    if(this.store){\r
-        this.store.on('beforeload', this.onBeforeLoad, this);\r
-        this.store.on('load', this.onLoad, this);\r
-        this.store.on('loadexception', this.onLoad, this);\r
-        this.removeMask = Ext.value(this.removeMask, false);\r
-    }else{\r
-        var um = this.el.getUpdater();\r
-        um.showLoadIndicator = false; // disable the default indicator\r
-        um.on('beforeupdate', this.onBeforeLoad, this);\r
-        um.on('update', this.onLoad, this);\r
-        um.on('failure', this.onLoad, this);\r
-        this.removeMask = Ext.value(this.removeMask, true);\r
-    }\r
-};\r
-\r
-Ext.LoadMask.prototype = {\r
-    \r
-    \r
-    \r
-    msg : 'Loading...',\r
-    \r
-    msgCls : 'x-mask-loading',\r
-\r
-    \r
-    disabled: false,\r
-\r
-    \r
-    disable : function(){\r
-       this.disabled = true;\r
-    },\r
-\r
-    \r
-    enable : function(){\r
-        this.disabled = false;\r
-    },\r
-\r
-    // private\r
-    onLoad : function(){\r
-        this.el.unmask(this.removeMask);\r
-    },\r
-\r
-    // private\r
-    onBeforeLoad : function(){\r
-        if(!this.disabled){\r
-            this.el.mask(this.msg, this.msgCls);\r
-        }\r
-    },\r
-\r
-    \r
-    show: function(){\r
-        this.onBeforeLoad();\r
-    },\r
-\r
-    \r
-    hide: function(){\r
-        this.onLoad();    \r
-    },\r
-\r
-    // private\r
-    destroy : function(){\r
-        if(this.store){\r
-            this.store.un('beforeload', this.onBeforeLoad, this);\r
-            this.store.un('load', this.onLoad, this);\r
-            this.store.un('loadexception', this.onLoad, this);\r
-        }else{\r
-            var um = this.el.getUpdater();\r
-            um.un('beforeupdate', this.onBeforeLoad, this);\r
-            um.un('update', this.onLoad, this);\r
-            um.un('failure', this.onLoad, this);\r
-        }\r
-    }\r
-};\r
-\r
-Ext.ProgressBar = Ext.extend(Ext.BoxComponent, {\r
-   \r
-    baseCls : 'x-progress',\r
-    \r
-    \r
-    animate : false,\r
-\r
-    // private\r
-    waitTimer : null,\r
-\r
-    // private\r
-    initComponent : function(){\r
-        Ext.ProgressBar.superclass.initComponent.call(this);\r
-        this.addEvents(\r
-            \r
-            "update"\r
-        );\r
-    },\r
-\r
-    // private\r
-    onRender : function(ct, position){\r
-        Ext.ProgressBar.superclass.onRender.call(this, ct, position);\r
-\r
-        var tpl = new Ext.Template(\r
-            '<div class="{cls}-wrap">',\r
-                '<div class="{cls}-inner">',\r
-                    '<div class="{cls}-bar">',\r
-                        '<div class="{cls}-text">',\r
-                            '<div>&#160;</div>',\r
-                        '</div>',\r
-                    '</div>',\r
-                    '<div class="{cls}-text {cls}-text-back">',\r
-                        '<div>&#160;</div>',\r
-                    '</div>',\r
-                '</div>',\r
-            '</div>'\r
-        );\r
-\r
-        if(position){\r
-            this.el = tpl.insertBefore(position, {cls: this.baseCls}, true);\r
-        }else{\r
-            this.el = tpl.append(ct, {cls: this.baseCls}, true);\r
-        }\r
-        if(this.id){\r
-            this.el.dom.id = this.id;\r
-        }\r
-        var inner = this.el.dom.firstChild;\r
-        this.progressBar = Ext.get(inner.firstChild);\r
-\r
-        if(this.textEl){\r
-            //use an external text el\r
-            this.textEl = Ext.get(this.textEl);\r
-            delete this.textTopEl;\r
-        }else{\r
-            //setup our internal layered text els\r
-            this.textTopEl = Ext.get(this.progressBar.dom.firstChild);\r
-            var textBackEl = Ext.get(inner.childNodes[1]);\r
-            this.textTopEl.setStyle("z-index", 99).addClass('x-hidden');\r
-            this.textEl = new Ext.CompositeElement([this.textTopEl.dom.firstChild, textBackEl.dom.firstChild]);\r
-            this.textEl.setWidth(inner.offsetWidth);\r
-        }\r
-        this.progressBar.setHeight(inner.offsetHeight);\r
-    },\r
-    \r
-    // private\r
-       afterRender : function(){\r
-               Ext.ProgressBar.superclass.afterRender.call(this);\r
-               if(this.value){\r
-                       this.updateProgress(this.value, this.text);\r
-               }else{\r
-                       this.updateText(this.text);\r
-               }\r
-       },\r
-\r
-    \r
-    updateProgress : function(value, text, animate){\r
-        this.value = value || 0;\r
-        if(text){\r
-            this.updateText(text);\r
-        }\r
-        if(this.rendered){\r
-               var w = Math.floor(value*this.el.dom.firstChild.offsetWidth);\r
-               this.progressBar.setWidth(w, animate === true || (animate !== false && this.animate));\r
-               if(this.textTopEl){\r
-                   //textTopEl should be the same width as the bar so overflow will clip as the bar moves\r
-                   this.textTopEl.removeClass('x-hidden').setWidth(w);\r
-               }\r
-        }\r
-        this.fireEvent('update', this, value, text);\r
-        return this;\r
-    },\r
-\r
-    \r
-    wait : function(o){\r
-        if(!this.waitTimer){\r
-            var scope = this;\r
-            o = o || {};\r
-            this.updateText(o.text);\r
-            this.waitTimer = Ext.TaskMgr.start({\r
-                run: function(i){\r
-                    var inc = o.increment || 10;\r
-                    this.updateProgress(((((i+inc)%inc)+1)*(100/inc))*.01, null, o.animate);\r
-                },\r
-                interval: o.interval || 1000,\r
-                duration: o.duration,\r
-                onStop: function(){\r
-                    if(o.fn){\r
-                        o.fn.apply(o.scope || this);\r
-                    }\r
-                    this.reset();\r
-                },\r
-                scope: scope\r
-            });\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    isWaiting : function(){\r
-        return this.waitTimer != null;\r
-    },\r
-\r
-    \r
-    updateText : function(text){\r
-        this.text = text || '&#160;';\r
-        if(this.rendered){\r
-            this.textEl.update(this.text);\r
-        }\r
-        return this;\r
-    },\r
-    \r
-    \r
-    syncProgressBar : function(){\r
-        if(this.value){\r
-            this.updateProgress(this.value, this.text);\r
-        }\r
-        return this;\r
-    },\r
-\r
-    \r
-    setSize : function(w, h){\r
-        Ext.ProgressBar.superclass.setSize.call(this, w, h);\r
-        if(this.textTopEl){\r
-            var inner = this.el.dom.firstChild;\r
-            this.textEl.setSize(inner.offsetWidth, inner.offsetHeight);\r
-        }\r
-        this.syncProgressBar();\r
-        return this;\r
-    },\r
-\r
-    \r
-    reset : function(hide){\r
-        this.updateProgress(0);\r
-        if(this.textTopEl){\r
-            this.textTopEl.addClass('x-hidden');\r
-        }\r
-        if(this.waitTimer){\r
-            this.waitTimer.onStop = null; //prevent recursion\r
-            Ext.TaskMgr.stop(this.waitTimer);\r
-            this.waitTimer = null;\r
-        }\r
-        if(hide === true){\r
-            this.hide();\r
-        }\r
-        return this;\r
-    }\r
-});\r
-Ext.reg('progress', Ext.ProgressBar);\r
-\r
-Ext.Slider = Ext.extend(Ext.BoxComponent, {\r
-       \r
-       \r
-    vertical: false,\r
-       \r
-    minValue: 0,\r
-               \r
-    maxValue: 100,\r
-       \r
-    keyIncrement: 1,\r
-       \r
-    increment: 0,\r
-       // private\r
-    clickRange: [5,15],\r
-       \r
-    clickToChange : true,\r
-       \r
-    animate: true,\r
-\r
-    \r
-    dragging: false,\r
-\r
-    // private override\r
-    initComponent : function(){\r
-        if(this.value === undefined){\r
-            this.value = this.minValue;\r
-        }\r
-        Ext.Slider.superclass.initComponent.call(this);\r
-        this.keyIncrement = Math.max(this.increment, this.keyIncrement); \r
-        this.addEvents(\r
-                       \r
-                       'beforechange', \r
-                       \r
-                       'change',\r
-                       \r
-                       'changecomplete',\r
-                       \r
-                       'dragstart', \r
-                       \r
-                       'drag', \r
-                       \r
-                       'dragend'\r
-               );\r
-\r
-        if(this.vertical){\r
-            Ext.apply(this, Ext.Slider.Vertical);\r
-        }\r
-    },\r
-\r
-       // private override\r
-    onRender : function(){\r
-        this.autoEl = {\r
-            cls: 'x-slider ' + (this.vertical ? 'x-slider-vert' : 'x-slider-horz'),\r
-            cn:{cls:'x-slider-end',cn:{cls:'x-slider-inner',cn:[{cls:'x-slider-thumb'},{tag:'a', cls:'x-slider-focus', href:"#", tabIndex: '-1', hidefocus:'on'}]}}\r
-        };\r
-        Ext.Slider.superclass.onRender.apply(this, arguments);\r
-        this.endEl = this.el.first();\r
-        this.innerEl = this.endEl.first();\r
-        this.thumb = this.innerEl.first();\r
-        this.halfThumb = (this.vertical ? this.thumb.getHeight() : this.thumb.getWidth())/2;\r
-        this.focusEl = this.thumb.next();\r
-        this.initEvents();\r
-    },\r
-\r
-       // private override\r
-    initEvents : function(){\r
-        this.thumb.addClassOnOver('x-slider-thumb-over');\r
-        this.mon(this.el, 'mousedown', this.onMouseDown, this);\r
-        this.mon(this.el, 'keydown', this.onKeyDown, this);\r
-\r
-        this.focusEl.swallowEvent("click", true);\r
-\r
-        this.tracker = new Ext.dd.DragTracker({\r
-            onBeforeStart: this.onBeforeDragStart.createDelegate(this),\r
-            onStart: this.onDragStart.createDelegate(this),\r
-            onDrag: this.onDrag.createDelegate(this),\r
-            onEnd: this.onDragEnd.createDelegate(this),\r
-            tolerance: 3,\r
-            autoStart: 300\r
-        });\r
-        this.tracker.initEl(this.thumb);\r
-        this.on('beforedestroy', this.tracker.destroy, this.tracker);\r
-    },\r
-\r
-       // private override\r
-    onMouseDown : function(e){\r
-        if(this.disabled) {return;}\r
-        if(this.clickToChange && e.target != this.thumb.dom){\r
-            var local = this.innerEl.translatePoints(e.getXY());\r
-            this.onClickChange(local);\r
-        }\r
-        this.focus();\r
-    },\r
-\r
-       // private\r
-    onClickChange : function(local){\r
-        if(local.top > this.clickRange[0] && local.top < this.clickRange[1]){\r
-            this.setValue(Math.round(this.reverseValue(local.left)), undefined, true);\r
-        }\r
-    },\r
-       \r
-       // private\r
-    onKeyDown : function(e){\r
-        if(this.disabled){e.preventDefault();return;}\r
-        var k = e.getKey();\r
-        switch(k){\r
-            case e.UP:\r
-            case e.RIGHT:\r
-                e.stopEvent();\r
-                if(e.ctrlKey){\r
-                    this.setValue(this.maxValue, undefined, true);\r
-                }else{\r
-                    this.setValue(this.value+this.keyIncrement, undefined, true);\r
-                }\r
-            break;\r
-            case e.DOWN:\r
-            case e.LEFT:\r
-                e.stopEvent();\r
-                if(e.ctrlKey){\r
-                    this.setValue(this.minValue, undefined, true);\r
-                }else{\r
-                    this.setValue(this.value-this.keyIncrement, undefined, true);\r
-                }\r
-            break;\r
-            default:\r
-                e.preventDefault();\r
-        }\r
-    },\r
-       \r
-       // private\r
-    doSnap : function(value){\r
-        if(!this.increment || this.increment == 1 || !value) {\r
-            return value;\r
-        }\r
-        var newValue = value, inc = this.increment;\r
-        var m = value % inc;\r
-        if(m > 0){\r
-            if(m > (inc/2)){\r
-                newValue = value + (inc-m);\r
-            }else{\r
-                newValue = value - m;\r
-            }\r
-        }\r
-        return newValue.constrain(this.minValue,  this.maxValue);\r
-    },\r
-       \r
-       // private\r
-    afterRender : function(){\r
-        Ext.Slider.superclass.afterRender.apply(this, arguments);\r
-        if(this.value !== undefined){\r
-            var v = this.normalizeValue(this.value);\r
-            if(v !== this.value){\r
-                delete this.value;\r
-                this.setValue(v, false);\r
-            }else{\r
-                this.moveThumb(this.translateValue(v), false);\r
-            }\r
-        }\r
-    },\r
-\r
-       // private\r
-    getRatio : function(){\r
-        var w = this.innerEl.getWidth();\r
-        var v = this.maxValue - this.minValue;\r
-        return v == 0 ? w : (w/v);\r
-    },\r
-\r
-       // private\r
-    normalizeValue : function(v){\r
-       if(typeof v != 'number'){\r
-            v = parseInt(v);\r
-        }\r
-        v = Math.round(v);\r
-        v = this.doSnap(v);\r
-        v = v.constrain(this.minValue, this.maxValue);\r
-        return v;\r
-    },\r
-\r
-       \r
-    setValue : function(v, animate, changeComplete){\r
-        v = this.normalizeValue(v);\r
-        if(v !== this.value && this.fireEvent('beforechange', this, v, this.value) !== false){\r
-            this.value = v;\r
-            this.moveThumb(this.translateValue(v), animate !== false);\r
-            this.fireEvent('change', this, v);\r
-            if(changeComplete){\r
-                this.fireEvent('changecomplete', this, v);\r
-            }\r
-        }\r
-    },\r
-\r
-       // private\r
-    translateValue : function(v){\r
-        var ratio = this.getRatio();\r
-        return (v * ratio)-(this.minValue * ratio)-this.halfThumb;\r
-    },\r
-\r
-       reverseValue : function(pos){\r
-        var ratio = this.getRatio();\r
-        return (pos+this.halfThumb+(this.minValue * ratio))/ratio;\r
-    },\r
-\r
-       // private\r
-    moveThumb: function(v, animate){\r
-        if(!animate || this.animate === false){\r
-            this.thumb.setLeft(v);\r
-        }else{\r
-            this.thumb.shift({left: v, stopFx: true, duration:.35});\r
-        }\r
-    },\r
-\r
-       // private\r
-    focus : function(){\r
-        this.focusEl.focus(10);\r
-    },\r
-\r
-       // private\r
-    onBeforeDragStart : function(e){\r
-        return !this.disabled;\r
-    },\r
-\r
-       // private\r
-    onDragStart: function(e){\r
-        this.thumb.addClass('x-slider-thumb-drag');\r
-        this.dragging = true;\r
-        this.dragStartValue = this.value;\r
-        this.fireEvent('dragstart', this, e);\r
-    },\r
-\r
-       // private\r
-    onDrag: function(e){\r
-        var pos = this.innerEl.translatePoints(this.tracker.getXY());\r
-        this.setValue(Math.round(this.reverseValue(pos.left)), false);\r
-        this.fireEvent('drag', this, e);\r
-    },\r
-       \r
-       // private\r
-    onDragEnd: function(e){\r
-        this.thumb.removeClass('x-slider-thumb-drag');\r
-        this.dragging = false;\r
-        this.fireEvent('dragend', this, e);\r
-        if(this.dragStartValue != this.value){\r
-            this.fireEvent('changecomplete', this, this.value);\r
-        }\r
-    },\r
-    \r
-    //private\r
-    onDisable: function(){\r
-        Ext.Slider.superclass.onDisable.call(this);\r
-        this.thumb.addClass(this.disabledClass);\r
-        if(Ext.isIE){\r
-            //IE breaks when using overflow visible and opacity other than 1.\r
-            //Create a place holder for the thumb and display it.\r
-            var xy = this.thumb.getXY();\r
-            this.thumb.hide();\r
-            this.innerEl.addClass(this.disabledClass).dom.disabled = true;\r
-            if (!this.thumbHolder){\r
-                this.thumbHolder = this.endEl.createChild({cls: 'x-slider-thumb ' + this.disabledClass});    \r
-            }\r
-            this.thumbHolder.show().setXY(xy);\r
-        }\r
-    },\r
-    \r
-    //private\r
-    onEnable: function(){\r
-        Ext.Slider.superclass.onEnable.call(this);\r
-        this.thumb.removeClass(this.disabledClass);\r
-        if(Ext.isIE){\r
-            this.innerEl.removeClass(this.disabledClass).dom.disabled = false;\r
-            if (this.thumbHolder){\r
-                this.thumbHolder.hide();\r
-            }\r
-            this.thumb.show();\r
-            this.syncThumb();\r
-        }\r
-    },\r
-\r
-    // private\r
-    onResize : function(w, h){\r
-        this.innerEl.setWidth(w - (this.el.getPadding('l') + this.endEl.getPadding('r')));\r
-        this.syncThumb();\r
-    },\r
-    \r
-    \r
-    syncThumb : function(){\r
-        if(this.rendered){\r
-            this.moveThumb(this.translateValue(this.value));\r
-        }\r
-    },\r
-       \r
-       \r
-    getValue : function(){\r
-        return this.value;\r
-    }\r
-});\r
-Ext.reg('slider', Ext.Slider);\r
-\r
-// private class to support vertical sliders\r
-Ext.Slider.Vertical = {\r
-    onResize : function(w, h){\r
-        this.innerEl.setHeight(h - (this.el.getPadding('t') + this.endEl.getPadding('b')));\r
-        this.syncThumb();\r
-    },\r
-\r
-    getRatio : function(){\r
-        var h = this.innerEl.getHeight();\r
-        var v = this.maxValue - this.minValue;\r
-        return h/v;\r
-    },\r
-\r
-    moveThumb: function(v, animate){\r
-        if(!animate || this.animate === false){\r
-            this.thumb.setBottom(v);\r
-        }else{\r
-            this.thumb.shift({bottom: v, stopFx: true, duration:.35});\r
-        }\r
-    },\r
-\r
-    onDrag: function(e){\r
-        var pos = this.innerEl.translatePoints(this.tracker.getXY());\r
-        var bottom = this.innerEl.getHeight()-pos.top;\r
-        this.setValue(this.minValue + Math.round(bottom/this.getRatio()), false);\r
-        this.fireEvent('drag', this, e);\r
-    },\r
-\r
-    onClickChange : function(local){\r
-        if(local.left > this.clickRange[0] && local.left < this.clickRange[1]){\r
-            var bottom = this.innerEl.getHeight()-local.top;\r
-            this.setValue(this.minValue + Math.round(bottom/this.getRatio()), undefined, true);\r
-        }\r
-    }\r
-};\r
-\r
-Ext.StatusBar = Ext.extend(Ext.Toolbar, {\r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    \r
-    cls : 'x-statusbar',\r
-    \r
-    busyIconCls : 'x-status-busy',\r
-    \r
-    busyText : 'Loading...',\r
-    \r
-    autoClear : 5000,\r
-    \r
-    // private\r
-    activeThreadId : 0,\r
-    \r
-    // private\r
-    initComponent : function(){\r
-        if(this.statusAlign=='right'){\r
-            this.cls += ' x-status-right';\r
-        }\r
-        Ext.StatusBar.superclass.initComponent.call(this);\r
-    },\r
-    \r
-    // private\r
-    afterRender : function(){\r
-        Ext.StatusBar.superclass.afterRender.call(this);\r
-        \r
-        var right = this.statusAlign=='right',\r
-            td = Ext.get(this.nextBlock());\r
-        \r
-        if(right){\r
-            this.tr.appendChild(td.dom);\r
-        }else{\r
-            td.insertBefore(this.tr.firstChild);\r
-        }\r
-        \r
-        this.statusEl = td.createChild({\r
-            cls: 'x-status-text ' + (this.iconCls || this.defaultIconCls || ''),\r
-            html: this.text || this.defaultText || ''\r
-        });\r
-        this.statusEl.unselectable();\r
-        \r
-        this.spacerEl = td.insertSibling({\r
-            tag: 'td',\r
-            style: 'width:100%',\r
-            cn: [{cls:'ytb-spacer'}]\r
-        }, right ? 'before' : 'after');\r
-    },\r
-\r
-    \r
-    setStatus : function(o){\r
-        o = o || {};\r
-        \r
-        if(typeof o == 'string'){\r
-            o = {text:o};\r
-        }\r
-        if(o.text !== undefined){\r
-            this.setText(o.text);\r
-        }\r
-        if(o.iconCls !== undefined){\r
-            this.setIcon(o.iconCls);\r
-        }\r
-        \r
-        if(o.clear){\r
-            var c = o.clear,\r
-                wait = this.autoClear,\r
-                defaults = {useDefaults: true, anim: true};\r
-            \r
-            if(typeof c == 'object'){\r
-                c = Ext.applyIf(c, defaults);\r
-                if(c.wait){\r
-                    wait = c.wait;\r
-                }\r
-            }else if(typeof c == 'number'){\r
-                wait = c;\r
-                c = defaults;\r
-            }else if(typeof c == 'boolean'){\r
-                c = defaults;\r
-            }\r
-            \r
-            c.threadId = this.activeThreadId;\r
-            this.clearStatus.defer(wait, this, [c]);\r
-        }\r
-        return this;\r
-    },\r
-     \r
-    \r
-    clearStatus : function(o){\r
-        o = o || {};\r
-        \r
-        if(o.threadId && o.threadId !== this.activeThreadId){\r
-            // this means the current call was made internally, but a newer\r
-            // thread has set a message since this call was deferred.  Since\r
-            // we don't want to overwrite a newer message just ignore.\r
-            return this;\r
-        }\r
-        \r
-        var text = o.useDefaults ? this.defaultText : '',\r
-            iconCls = o.useDefaults ? (this.defaultIconCls ? this.defaultIconCls : '') : '';\r
-            \r
-        if(o.anim){\r
-            this.statusEl.fadeOut({\r
-                remove: false,\r
-                useDisplay: true,\r
-                scope: this,\r
-                callback: function(){\r
-                    this.setStatus({\r
-                           text: text, \r
-                           iconCls: iconCls\r
-                       });\r
-                    this.statusEl.show();\r
-                }\r
-            });\r
-        }else{\r
-            // hide/show the el to avoid jumpy text or icon\r
-            this.statusEl.hide();\r
-               this.setStatus({\r
-                   text: text,\r
-                   iconCls: iconCls\r
-               });\r
-            this.statusEl.show();\r
-        }\r
-        return this;\r
-    },\r
-    \r
-    \r
-    setText : function(text){\r
-        this.activeThreadId++;\r
-        this.text = text || '';\r
-        if(this.rendered){\r
-            this.statusEl.update(this.text);\r
-        }\r
-        return this;\r
-    },\r
-    \r
-    \r
-    getText : function(){\r
-        return this.text;\r
-    },\r
-\r
-    \r
-    setIcon : function(cls){\r
-        this.activeThreadId++;\r
-        cls = cls || '';\r
-        \r
-        if(this.rendered){\r
-               if(this.currIconCls){\r
-                   this.statusEl.removeClass(this.currIconCls);\r
-                   this.currIconCls = null;\r
-               }\r
-               if(cls.length > 0){\r
-                   this.statusEl.addClass(cls);\r
-                   this.currIconCls = cls;\r
-               }\r
-        }else{\r
-            this.currIconCls = cls;\r
-        }\r
-        return this;\r
-    },\r
-    \r
-    \r
-    showBusy : function(o){\r
-        if(typeof o == 'string'){\r
-            o = {text:o};\r
-        }\r
-        o = Ext.applyIf(o || {}, {\r
-            text: this.busyText,\r
-            iconCls: this.busyIconCls\r
-        });\r
-        return this.setStatus(o);\r
-    }\r
-});\r
-Ext.reg('statusbar', Ext.StatusBar);\r
-\r
-\r
-Ext.History = (function () {\r
-    var iframe, hiddenField;\r
-    var ready = false;\r
-    var currentToken;\r
-\r
-    function getHash() {\r
-        var href = top.location.href, i = href.indexOf("#");\r
-        return i >= 0 ? href.substr(i + 1) : null;\r
-    }\r
-\r
-    function doSave() {\r
-        hiddenField.value = currentToken;\r
-    }\r
-\r
-    function handleStateChange(token) {\r
-        currentToken = token;\r
-        Ext.History.fireEvent('change', token);\r
-    }\r
-\r
-    function updateIFrame (token) {\r
-        var html = ['<html><body><div id="state">',token,'</div></body></html>'].join('');\r
-        try {\r
-            var doc = iframe.contentWindow.document;\r
-            doc.open();\r
-            doc.write(html);\r
-            doc.close();\r
-            return true;\r
-        } catch (e) {\r
-            return false;\r
-        }\r
-    }\r
-\r
-    function checkIFrame() {\r
-        if (!iframe.contentWindow || !iframe.contentWindow.document) {\r
-            setTimeout(checkIFrame, 10);\r
-            return;\r
-        }\r
-\r
-        var doc = iframe.contentWindow.document;\r
-        var elem = doc.getElementById("state");\r
-        var token = elem ? elem.innerText : null;\r
-\r
-        var hash = getHash();\r
-\r
-        setInterval(function () {\r
-\r
-            doc = iframe.contentWindow.document;\r
-            elem = doc.getElementById("state");\r
-\r
-            var newtoken = elem ? elem.innerText : null;\r
-\r
-            var newHash = getHash();\r
-\r
-            if (newtoken !== token) {\r
-                token = newtoken;\r
-                handleStateChange(token);\r
-                top.location.hash = token;\r
-                hash = token;\r
-                doSave();\r
-            } else if (newHash !== hash) {\r
-                hash = newHash;\r
-                updateIFrame(newHash);\r
-            }\r
-\r
-        }, 50);\r
-\r
-        ready = true;\r
-\r
-        Ext.History.fireEvent('ready', Ext.History);\r
-    }\r
-\r
-    function startUp() {\r
-        currentToken = hiddenField.value ? hiddenField.value : getHash();\r
-        \r
-        if (Ext.isIE) {\r
-            checkIFrame();\r
-        } else {\r
-            var hash = getHash();\r
-            setInterval(function () {\r
-                var newHash = getHash();\r
-                if (newHash !== hash) {\r
-                    hash = newHash;\r
-                    handleStateChange(hash);\r
-                    doSave();\r
-                }\r
-            }, 50);\r
-            ready = true;\r
-            Ext.History.fireEvent('ready', Ext.History);\r
-        }\r
-    }\r
-\r
-    return {\r
-        \r
-        fieldId: 'x-history-field',\r
-        \r
-        iframeId: 'x-history-frame',\r
-        \r
-        events:{},\r
-\r
-        \r
-        init: function (onReady, scope) {\r
-            if(ready) {\r
-                Ext.callback(onReady, scope, [this]);\r
-                return;\r
-            }\r
-            if(!Ext.isReady){\r
-                Ext.onReady(function(){\r
-                    Ext.History.init(onReady, scope);\r
-                });\r
-                return;\r
-            }\r
-            hiddenField = Ext.getDom(Ext.History.fieldId);\r
-                       if (Ext.isIE) {\r
-                iframe = Ext.getDom(Ext.History.iframeId);\r
-            }\r
-            this.addEvents('ready', 'change');\r
-            if(onReady){\r
-                this.on('ready', onReady, scope, {single:true});\r
-            }\r
-            startUp();\r
-        },\r
-\r
-        \r
-        add: function (token, preventDup) {\r
-            if(preventDup !== false){\r
-                if(this.getToken() == token){\r
-                    return true;\r
-                }\r
-            }\r
-            if (Ext.isIE) {\r
-                return updateIFrame(token);\r
-            } else {\r
-                top.location.hash = token;\r
-                return true;\r
-            }\r
-        },\r
-\r
-        \r
-        back: function(){\r
-            history.go(-1);\r
-        },\r
-\r
-        \r
-        forward: function(){\r
-            history.go(1);\r
-        },\r
-\r
-        \r
-        getToken: function() {\r
-            return ready ? currentToken : getHash();\r
-        }\r
-    };\r
-})();\r
-Ext.apply(Ext.History, new Ext.util.Observable());\r
-Ext.debug = {};\r
-\r
-(function(){\r
-\r
-var cp;\r
-\r
-function createConsole(){\r
-\r
-    var scriptPanel = new Ext.debug.ScriptsPanel();\r
-    var logView = new Ext.debug.LogPanel();\r
-    var tree = new Ext.debug.DomTree();\r
-\r
-    var tabs = new Ext.TabPanel({\r
-        activeTab: 0,\r
-        border: false,\r
-        tabPosition: 'bottom',\r
-        items: [{\r
-            title: 'Debug Console',\r
-            layout:'border',\r
-            items: [logView, scriptPanel]\r
-        },{\r
-            title: 'DOM Inspector',\r
-            layout:'border',\r
-            items: [tree]\r
-        }]\r
-    });\r
-\r
-    cp = new Ext.Panel({\r
-        id: 'x-debug-browser',\r
-        title: 'Console',\r
-        collapsible: true,\r
-        animCollapse: false,\r
-        style: 'position:absolute;left:0;bottom:0;',\r
-        height:200,\r
-        logView: logView,\r
-        layout: 'fit',\r
-        \r
-        tools:[{\r
-            id: 'close',\r
-            handler: function(){\r
-                cp.destroy();\r
-                cp = null;\r
-                Ext.EventManager.removeResizeListener(handleResize);\r
-            }\r
-        }],\r
-\r
-        items: tabs\r
-    });\r
-\r
-    cp.render(document.body);\r
-\r
-    cp.resizer = new Ext.Resizable(cp.el, {\r
-        minHeight:50,\r
-        handles: "n",\r
-        pinned: true,\r
-        transparent:true,\r
-        resizeElement : function(){\r
-            var box = this.proxy.getBox();\r
-            this.proxy.hide();\r
-            cp.setHeight(box.height);\r
-            return box;\r
-        }\r
-    });\r
-\r
-    function handleResize(){\r
-        cp.setWidth(Ext.getBody().getViewSize().width);\r
-    }\r
-    Ext.EventManager.onWindowResize(handleResize);\r
-\r
-    handleResize();\r
-}\r
-\r
-\r
-Ext.apply(Ext, {\r
-    log : function(){\r
-        if(!cp){\r
-            createConsole();\r
-        }\r
-        cp.logView.log.apply(cp.logView, arguments);\r
-    },\r
-\r
-    logf : function(format, arg1, arg2, etc){\r
-        Ext.log(String.format.apply(String, arguments));\r
-    },\r
-\r
-    dump : function(o){\r
-        if(typeof o == 'string' || typeof o == 'number' || typeof o == 'undefined' || Ext.isDate(o)){\r
-            Ext.log(o);\r
-        }else if(!o){\r
-            Ext.log("null");\r
-        }else if(typeof o != "object"){\r
-            Ext.log('Unknown return type');\r
-        }else if(Ext.isArray(o)){\r
-            Ext.log('['+o.join(',')+']');\r
-        }else{\r
-            var b = ["{\n"];\r
-            for(var key in o){\r
-                var to = typeof o[key];\r
-                if(to != "function" && to != "object"){\r
-                    b.push(String.format("  {0}: {1},\n", key, o[key]));\r
-                }\r
-            }\r
-            var s = b.join("");\r
-            if(s.length > 3){\r
-                s = s.substr(0, s.length-2);\r
-            }\r
-            Ext.log(s + "\n}");\r
-        }\r
-    },\r
-\r
-    _timers : {},\r
-\r
-    time : function(name){\r
-        name = name || "def";\r
-        Ext._timers[name] = new Date().getTime();\r
-    },\r
-\r
-    timeEnd : function(name, printResults){\r
-        var t = new Date().getTime();\r
-        name = name || "def";\r
-        var v = String.format("{0} ms", t-Ext._timers[name]);\r
-        Ext._timers[name] = new Date().getTime();\r
-        if(printResults !== false){\r
-            Ext.log('Timer ' + (name == "def" ? v : name + ": " + v));\r
-        }\r
-        return v;\r
-    }\r
-});\r
-\r
-})();\r
-\r
-\r
-Ext.debug.ScriptsPanel = Ext.extend(Ext.Panel, {\r
-    id:'x-debug-scripts',\r
-    region: 'east',\r
-    minWidth: 200,\r
-    split: true,\r
-    width: 350,\r
-    border: false,\r
-    layout:'anchor',\r
-    style:'border-width:0 0 0 1px;',\r
-\r
-    initComponent : function(){\r
-\r
-        this.scriptField = new Ext.form.TextArea({\r
-            anchor: '100% -26',\r
-            style:'border-width:0;'\r
-        });\r
-\r
-        this.trapBox = new Ext.form.Checkbox({\r
-            id: 'console-trap',\r
-            boxLabel: 'Trap Errors',\r
-            checked: true\r
-        });\r
-\r
-        this.toolbar = new Ext.Toolbar([{\r
-                text: 'Run',\r
-                scope: this,\r
-                handler: this.evalScript\r
-            },{\r
-                text: 'Clear',\r
-                scope: this,\r
-                handler: this.clear\r
-            },\r
-            '->',\r
-            this.trapBox,\r
-            ' ', ' '\r
-        ]);\r
-\r
-        this.items = [this.toolbar, this.scriptField];\r
-\r
-        Ext.debug.ScriptsPanel.superclass.initComponent.call(this);\r
-    },\r
-\r
-    evalScript : function(){\r
-        var s = this.scriptField.getValue();\r
-        if(this.trapBox.getValue()){\r
-            try{\r
-                var rt = eval(s);\r
-                Ext.dump(rt === undefined? '(no return)' : rt);\r
-            }catch(e){\r
-                Ext.log(e.message || e.descript);\r
-            }\r
-        }else{\r
-            var rt = eval(s);\r
-            Ext.dump(rt === undefined? '(no return)' : rt);\r
-        }\r
-    },\r
-\r
-    clear : function(){\r
-        this.scriptField.setValue('');\r
-        this.scriptField.focus();\r
-    }\r
-\r
-});\r
-\r
-Ext.debug.LogPanel = Ext.extend(Ext.Panel, {\r
-    autoScroll: true,\r
-    region: 'center',\r
-    border: false,\r
-    style:'border-width:0 1px 0 0',\r
-\r
-    log : function(){\r
-        var markup = [  '<div style="padding:5px !important;border-bottom:1px solid #ccc;">',\r
-                    Ext.util.Format.htmlEncode(Array.prototype.join.call(arguments, ', ')).replace(/\n/g, '<br />').replace(/\s/g, '&#160;'),\r
-                    '</div>'].join('');\r
-\r
-        this.body.insertHtml('beforeend', markup);\r
-        this.body.scrollTo('top', 100000);\r
-    },\r
-\r
-    clear : function(){\r
-        this.body.update('');\r
-        this.body.dom.scrollTop = 0;\r
-    }\r
-});\r
-\r
-Ext.debug.DomTree = Ext.extend(Ext.tree.TreePanel, {\r
-    enableDD:false ,\r
-    lines:false,\r
-    rootVisible:false,\r
-    animate:false,\r
-    hlColor:'ffff9c',\r
-    autoScroll: true,\r
-    region:'center',\r
-    border:false,\r
-\r
-    initComponent : function(){\r
-\r
-\r
-        Ext.debug.DomTree.superclass.initComponent.call(this);\r
-        \r
-        // tree related stuff\r
-        var styles = false, hnode;\r
-        var nonSpace = /^\s*$/;\r
-        var html = Ext.util.Format.htmlEncode;\r
-        var ellipsis = Ext.util.Format.ellipsis;\r
-        var styleRe = /\s?([a-z\-]*)\:([^;]*)(?:[;\s\n\r]*)/gi;\r
-\r
-        function findNode(n){\r
-            if(!n || n.nodeType != 1 || n == document.body || n == document){\r
-                return false;\r
-            }\r
-            var pn = [n], p = n;\r
-            while((p = p.parentNode) && p.nodeType == 1 && p.tagName.toUpperCase() != 'HTML'){\r
-                pn.unshift(p);\r
-            }\r
-            var cn = hnode;\r
-            for(var i = 0, len = pn.length; i < len; i++){\r
-                cn.expand();\r
-                cn = cn.findChild('htmlNode', pn[i]);\r
-                if(!cn){ // in this dialog?\r
-                    return false;\r
-                }\r
-            }\r
-            cn.select();\r
-            var a = cn.ui.anchor;\r
-            treeEl.dom.scrollTop = Math.max(0 ,a.offsetTop-10);\r
-            //treeEl.dom.scrollLeft = Math.max(0 ,a.offsetLeft-10); no likey\r
-            cn.highlight();\r
-            return true;\r
-        }\r
-\r
-        function nodeTitle(n){\r
-            var s = n.tagName;\r
-            if(n.id){\r
-                s += '#'+n.id;\r
-            }else if(n.className){\r
-                s += '.'+n.className;\r
-            }\r
-            return s;\r
-        }\r
-\r
-        function onNodeSelect(t, n, last){\r
-            return;\r
-            if(last && last.unframe){\r
-                last.unframe();\r
-            }\r
-            var props = {};\r
-            if(n && n.htmlNode){\r
-                if(frameEl.pressed){\r
-                    n.frame();\r
-                }\r
-                if(inspecting){\r
-                    return;\r
-                }\r
-                addStyle.enable();\r
-                reload.setDisabled(n.leaf);\r
-                var dom = n.htmlNode;\r
-                stylePanel.setTitle(nodeTitle(dom));\r
-                if(styles && !showAll.pressed){\r
-                    var s = dom.style ? dom.style.cssText : '';\r
-                    if(s){\r
-                        var m;\r
-                        while ((m = styleRe.exec(s)) != null){\r
-                            props[m[1].toLowerCase()] = m[2];\r
-                        }\r
-                    }\r
-                }else if(styles){\r
-                    var cl = Ext.debug.cssList;\r
-                    var s = dom.style, fly = Ext.fly(dom);\r
-                    if(s){\r
-                        for(var i = 0, len = cl.length; i<len; i++){\r
-                            var st = cl[i];\r
-                            var v = s[st] || fly.getStyle(st);\r
-                            if(v != undefined && v !== null && v !== ''){\r
-                                props[st] = v;\r
-                            }\r
-                        }\r
-                    }\r
-                }else{\r
-                    for(var a in dom){\r
-                        var v = dom[a];\r
-                        if((isNaN(a+10)) && v != undefined && v !== null && v !== '' && !(Ext.isGecko && a[0] == a[0].toUpperCase())){\r
-                            props[a] = v;\r
-                        }\r
-                    }\r
-                }\r
-            }else{\r
-                if(inspecting){\r
-                    return;\r
-                }\r
-                addStyle.disable();\r
-                reload.disabled();\r
-            }\r
-            stylesGrid.setSource(props);\r
-            stylesGrid.treeNode = n;\r
-            stylesGrid.view.fitColumns();\r
-        }\r
-\r
-        this.loader = new Ext.tree.TreeLoader();\r
-        this.loader.load = function(n, cb){\r
-            var isBody = n.htmlNode == document.body;\r
-            var cn = n.htmlNode.childNodes;\r
-            for(var i = 0, c; c = cn[i]; i++){\r
-                if(isBody && c.id == 'x-debug-browser'){\r
-                    continue;\r
-                }\r
-                if(c.nodeType == 1){\r
-                    n.appendChild(new Ext.debug.HtmlNode(c));\r
-                }else if(c.nodeType == 3 && !nonSpace.test(c.nodeValue)){\r
-                    n.appendChild(new Ext.tree.TreeNode({\r
-                        text:'<em>' + ellipsis(html(String(c.nodeValue)), 35) + '</em>',\r
-                        cls: 'x-tree-noicon'\r
-                    }));\r
-                }\r
-            }\r
-            cb();\r
-        };\r
-\r
-        //tree.getSelectionModel().on('selectionchange', onNodeSelect, null, {buffer:250});\r
-\r
-        this.root = this.setRootNode(new Ext.tree.TreeNode('Ext'));\r
-\r
-        hnode = this.root.appendChild(new Ext.debug.HtmlNode(\r
-                document.getElementsByTagName('html')[0]\r
-        ));\r
-\r
-    }\r
-});\r
-\r
-\r
-// highly unusual class declaration\r
-Ext.debug.HtmlNode = function(){\r
-    var html = Ext.util.Format.htmlEncode;\r
-    var ellipsis = Ext.util.Format.ellipsis;\r
-    var nonSpace = /^\s*$/;\r
-\r
-    var attrs = [\r
-        {n: 'id', v: 'id'},\r
-        {n: 'className', v: 'class'},\r
-        {n: 'name', v: 'name'},\r
-        {n: 'type', v: 'type'},\r
-        {n: 'src', v: 'src'},\r
-        {n: 'href', v: 'href'}\r
-    ];\r
-\r
-    function hasChild(n){\r
-        for(var i = 0, c; c = n.childNodes[i]; i++){\r
-            if(c.nodeType == 1){\r
-                return true;\r
-            }\r
-        }\r
-        return false;\r
-    }\r
-\r
-    function renderNode(n, leaf){\r
-        var tag = n.tagName.toLowerCase();\r
-        var s = '&lt;' + tag;\r
-        for(var i = 0, len = attrs.length; i < len; i++){\r
-            var a = attrs[i];\r
-            var v = n[a.n];\r
-            if(v && !nonSpace.test(v)){\r
-                s += ' ' + a.v + '=&quot;<i>' + html(v) +'</i>&quot;';\r
-            }\r
-        }\r
-        var style = n.style ? n.style.cssText : '';\r
-        if(style){\r
-            s += ' style=&quot;<i>' + html(style.toLowerCase()) +'</i>&quot;';\r
-        }\r
-        if(leaf && n.childNodes.length > 0){\r
-            s+='&gt;<em>' + ellipsis(html(String(n.innerHTML)), 35) + '</em>&lt;/'+tag+'&gt;';\r
-        }else if(leaf){\r
-            s += ' /&gt;';\r
-        }else{\r
-            s += '&gt;';\r
-        }\r
-        return s;\r
-    }\r
-\r
-    var HtmlNode = function(n){\r
-        var leaf = !hasChild(n);\r
-        this.htmlNode = n;\r
-        this.tagName = n.tagName.toLowerCase();\r
-        var attr = {\r
-            text : renderNode(n, leaf),\r
-            leaf : leaf,\r
-            cls: 'x-tree-noicon'\r
-        };\r
-        HtmlNode.superclass.constructor.call(this, attr);\r
-        this.attributes.htmlNode = n; // for searching\r
-        if(!leaf){\r
-            this.on('expand', this.onExpand,  this);\r
-            this.on('collapse', this.onCollapse,  this);\r
-        }\r
-    };\r
-\r
-\r
-    Ext.extend(HtmlNode, Ext.tree.AsyncTreeNode, {\r
-        cls: 'x-tree-noicon',\r
-        preventHScroll: true,\r
-        refresh : function(highlight){\r
-            var leaf = !hasChild(this.htmlNode);\r
-            this.setText(renderNode(this.htmlNode, leaf));\r
-            if(highlight){\r
-                Ext.fly(this.ui.textNode).highlight();\r
-            }\r
-        },\r
-\r
-        onExpand : function(){\r
-            if(!this.closeNode && this.parentNode){\r
-                this.closeNode = this.parentNode.insertBefore(new Ext.tree.TreeNode({\r
-                    text:'&lt;/' + this.tagName + '&gt;',\r
-                    cls: 'x-tree-noicon'\r
-                }), this.nextSibling);\r
-            }else if(this.closeNode){\r
-                this.closeNode.ui.show();\r
-            }\r
-        },\r
-\r
-        onCollapse : function(){\r
-            if(this.closeNode){\r
-                this.closeNode.ui.hide();\r
-            }\r
-        },\r
-\r
-        render : function(bulkRender){\r
-            HtmlNode.superclass.render.call(this, bulkRender);\r
-        },\r
-\r
-        highlightNode : function(){\r
-            //Ext.fly(this.htmlNode).highlight();\r
-        },\r
-\r
-        highlight : function(){\r
-            //Ext.fly(this.ui.textNode).highlight();\r
-        },\r
-\r
-        frame : function(){\r
-            this.htmlNode.style.border = '1px solid #0000ff';\r
-            //this.highlightNode();\r
-        },\r
-\r
-        unframe : function(){\r
-            //Ext.fly(this.htmlNode).removeClass('x-debug-frame');\r
-            this.htmlNode.style.border = '';\r
-        }\r
-    });\r
-\r
-    return HtmlNode;\r
-}();\r
-\r
-\r
-\r
+
+(function(){
+
+var EXTUTIL = Ext.util,
+    EACH = Ext.each,
+    TRUE = true,
+    FALSE = false;
+
+EXTUTIL.Observable = function(){
+    
+    var me = this, e = me.events;
+    if(me.listeners){
+        me.on(me.listeners);
+        delete me.listeners;
+    }
+    me.events = e || {};
+};
+
+EXTUTIL.Observable.prototype = {
+    
+    filterOptRe : /^(?:scope|delay|buffer|single)$/,
+
+    
+    fireEvent : function(){
+        var a = Array.prototype.slice.call(arguments, 0),
+            ename = a[0].toLowerCase(),
+            me = this,
+            ret = TRUE,
+            ce = me.events[ename],
+            cc,
+            q,
+            c;
+        if (me.eventsSuspended === TRUE) {
+            if (q = me.eventQueue) {
+                q.push(a);
+            }
+        }
+        else if(typeof ce == 'object') {
+            if (ce.bubble){
+                if(ce.fire.apply(ce, a.slice(1)) === FALSE) {
+                    return FALSE;
+                }
+                c = me.getBubbleTarget && me.getBubbleTarget();
+                if(c && c.enableBubble) {
+                    cc = c.events[ename];
+                    if(!cc || typeof cc != 'object' || !cc.bubble) {
+                        c.enableBubble(ename);
+                    }
+                    return c.fireEvent.apply(c, a);
+                }
+            }
+            else {
+                a.shift();
+                ret = ce.fire.apply(ce, a);
+            }
+        }
+        return ret;
+    },
+
+    
+    addListener : function(eventName, fn, scope, o){
+        var me = this,
+            e,
+            oe,
+            ce;
+            
+        if (typeof eventName == 'object') {
+            o = eventName;
+            for (e in o) {
+                oe = o[e];
+                if (!me.filterOptRe.test(e)) {
+                    me.addListener(e, oe.fn || oe, oe.scope || o.scope, oe.fn ? oe : o);
+                }
+            }
+        } else {
+            eventName = eventName.toLowerCase();
+            ce = me.events[eventName] || TRUE;
+            if (typeof ce == 'boolean') {
+                me.events[eventName] = ce = new EXTUTIL.Event(me, eventName);
+            }
+            ce.addListener(fn, scope, typeof o == 'object' ? o : {});
+        }
+    },
+
+    
+    removeListener : function(eventName, fn, scope){
+        var ce = this.events[eventName.toLowerCase()];
+        if (typeof ce == 'object') {
+            ce.removeListener(fn, scope);
+        }
+    },
+
+    
+    purgeListeners : function(){
+        var events = this.events,
+            evt,
+            key;
+        for(key in events){
+            evt = events[key];
+            if(typeof evt == 'object'){
+                evt.clearListeners();
+            }
+        }
+    },
+
+    
+    addEvents : function(o){
+        var me = this;
+        me.events = me.events || {};
+        if (typeof o == 'string') {
+            var a = arguments,
+                i = a.length;
+            while(i--) {
+                me.events[a[i]] = me.events[a[i]] || TRUE;
+            }
+        } else {
+            Ext.applyIf(me.events, o);
+        }
+    },
+
+    
+    hasListener : function(eventName){
+        var e = this.events[eventName.toLowerCase()];
+        return typeof e == 'object' && e.listeners.length > 0;
+    },
+
+    
+    suspendEvents : function(queueSuspended){
+        this.eventsSuspended = TRUE;
+        if(queueSuspended && !this.eventQueue){
+            this.eventQueue = [];
+        }
+    },
+
+    
+    resumeEvents : function(){
+        var me = this,
+            queued = me.eventQueue || [];
+        me.eventsSuspended = FALSE;
+        delete me.eventQueue;
+        EACH(queued, function(e) {
+            me.fireEvent.apply(me, e);
+        });
+    }
+};
+
+var OBSERVABLE = EXTUTIL.Observable.prototype;
+
+OBSERVABLE.on = OBSERVABLE.addListener;
+
+OBSERVABLE.un = OBSERVABLE.removeListener;
+
+
+EXTUTIL.Observable.releaseCapture = function(o){
+    o.fireEvent = OBSERVABLE.fireEvent;
+};
+
+function createTargeted(h, o, scope){
+    return function(){
+        if(o.target == arguments[0]){
+            h.apply(scope, Array.prototype.slice.call(arguments, 0));
+        }
+    };
+};
+
+function createBuffered(h, o, l, scope){
+    l.task = new EXTUTIL.DelayedTask();
+    return function(){
+        l.task.delay(o.buffer, h, scope, Array.prototype.slice.call(arguments, 0));
+    };
+};
+
+function createSingle(h, e, fn, scope){
+    return function(){
+        e.removeListener(fn, scope);
+        return h.apply(scope, arguments);
+    };
+};
+
+function createDelayed(h, o, l, scope){
+    return function(){
+        var task = new EXTUTIL.DelayedTask(),
+            args = Array.prototype.slice.call(arguments, 0);
+        if(!l.tasks) {
+            l.tasks = [];
+        }
+        l.tasks.push(task);
+        task.delay(o.delay || 10, function(){
+            l.tasks.remove(task);
+            h.apply(scope, args);
+        }, scope);
+    };
+};
+
+EXTUTIL.Event = function(obj, name){
+    this.name = name;
+    this.obj = obj;
+    this.listeners = [];
+};
+
+EXTUTIL.Event.prototype = {
+    addListener : function(fn, scope, options){
+        var me = this,
+            l;
+        scope = scope || me.obj;
+        if(!me.isListening(fn, scope)){
+            l = me.createListener(fn, scope, options);
+            if(me.firing){ 
+                me.listeners = me.listeners.slice(0);
+            }
+            me.listeners.push(l);
+        }
+    },
+
+    createListener: function(fn, scope, o){
+        o = o || {};
+        scope = scope || this.obj;
+        var l = {
+            fn: fn,
+            scope: scope,
+            options: o
+        }, h = fn;
+        if(o.target){
+            h = createTargeted(h, o, scope);
+        }
+        if(o.delay){
+            h = createDelayed(h, o, l, scope);
+        }
+        if(o.single){
+            h = createSingle(h, this, fn, scope);
+        }
+        if(o.buffer){
+            h = createBuffered(h, o, l, scope);
+        }
+        l.fireFn = h;
+        return l;
+    },
+
+    findListener : function(fn, scope){
+        var list = this.listeners,
+            i = list.length,
+            l;
+
+        scope = scope || this.obj;
+        while(i--){
+            l = list[i];
+            if(l){
+                if(l.fn == fn && l.scope == scope){
+                    return i;
+                }
+            }
+        }
+        return -1;
+    },
+
+    isListening : function(fn, scope){
+        return this.findListener(fn, scope) != -1;
+    },
+
+    removeListener : function(fn, scope){
+        var index,
+            l,
+            k,
+            me = this,
+            ret = FALSE;
+        if((index = me.findListener(fn, scope)) != -1){
+            if (me.firing) {
+                me.listeners = me.listeners.slice(0);
+            }
+            l = me.listeners[index];
+            if(l.task) {
+                l.task.cancel();
+                delete l.task;
+            }
+            k = l.tasks && l.tasks.length;
+            if(k) {
+                while(k--) {
+                    l.tasks[k].cancel();
+                }
+                delete l.tasks;
+            }
+            me.listeners.splice(index, 1);
+            ret = TRUE;
+        }
+        return ret;
+    },
+
+    
+    clearListeners : function(){
+        var me = this,
+            l = me.listeners,
+            i = l.length;
+        while(i--) {
+            me.removeListener(l[i].fn, l[i].scope);
+        }
+    },
+
+    fire : function(){
+        var me = this,
+            listeners = me.listeners,
+            len = listeners.length,
+            i = 0,
+            l;
+
+        if(len > 0){
+            me.firing = TRUE;
+            var args = Array.prototype.slice.call(arguments, 0);
+            for (; i < len; i++) {
+                l = listeners[i];
+                if(l && l.fireFn.apply(l.scope || me.obj || window, args) === FALSE) {
+                    return (me.firing = FALSE);
+                }
+            }
+        }
+        me.firing = FALSE;
+        return TRUE;
+    }
+
+};
+})();
+
+Ext.DomHelper = function(){
+    var tempTableEl = null,
+        emptyTags = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i,
+        tableRe = /^table|tbody|tr|td$/i,
+        confRe = /tag|children|cn|html$/i,
+        tableElRe = /td|tr|tbody/i,
+        cssRe = /([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,
+        endRe = /end/i,
+        pub,
+        
+        afterbegin = 'afterbegin',
+        afterend = 'afterend',
+        beforebegin = 'beforebegin',
+        beforeend = 'beforeend',
+        ts = '<table>',
+        te = '</table>',
+        tbs = ts+'<tbody>',
+        tbe = '</tbody>'+te,
+        trs = tbs + '<tr>',
+        tre = '</tr>'+tbe;
+
+    
+    function doInsert(el, o, returnElement, pos, sibling, append){
+        var newNode = pub.insertHtml(pos, Ext.getDom(el), createHtml(o));
+        return returnElement ? Ext.get(newNode, true) : newNode;
+    }
+
+    
+    function createHtml(o){
+        var b = '',
+            attr,
+            val,
+            key,
+            cn;
+
+        if(typeof o == "string"){
+            b = o;
+        } else if (Ext.isArray(o)) {
+            for (var i=0; i < o.length; i++) {
+                if(o[i]) {
+                    b += createHtml(o[i]);
+                }
+            };
+        } else {
+            b += '<' + (o.tag = o.tag || 'div');
+            for (attr in o) {
+                val = o[attr];
+                if(!confRe.test(attr)){
+                    if (typeof val == "object") {
+                        b += ' ' + attr + '="';
+                        for (key in val) {
+                            b += key + ':' + val[key] + ';';
+                        };
+                        b += '"';
+                    }else{
+                        b += ' ' + ({cls : 'class', htmlFor : 'for'}[attr] || attr) + '="' + val + '"';
+                    }
+                }
+            };
+            
+            if (emptyTags.test(o.tag)) {
+                b += '/>';
+            } else {
+                b += '>';
+                if ((cn = o.children || o.cn)) {
+                    b += createHtml(cn);
+                } else if(o.html){
+                    b += o.html;
+                }
+                b += '</' + o.tag + '>';
+            }
+        }
+        return b;
+    }
+
+    function ieTable(depth, s, h, e){
+        tempTableEl.innerHTML = [s, h, e].join('');
+        var i = -1,
+            el = tempTableEl,
+            ns;
+        while(++i < depth){
+            el = el.firstChild;
+        }
+
+        if(ns = el.nextSibling){
+            var df = document.createDocumentFragment();
+            while(el){
+                ns = el.nextSibling;
+                df.appendChild(el);
+                el = ns;
+            }
+            el = df;
+        }
+        return el;
+    }
+
+    
+    function insertIntoTable(tag, where, el, html) {
+        var node,
+            before;
+
+        tempTableEl = tempTableEl || document.createElement('div');
+
+        if(tag == 'td' && (where == afterbegin || where == beforeend) ||
+           !tableElRe.test(tag) && (where == beforebegin || where == afterend)) {
+            return;
+        }
+        before = where == beforebegin ? el :
+                 where == afterend ? el.nextSibling :
+                 where == afterbegin ? el.firstChild : null;
+
+        if (where == beforebegin || where == afterend) {
+            el = el.parentNode;
+        }
+
+        if (tag == 'td' || (tag == 'tr' && (where == beforeend || where == afterbegin))) {
+            node = ieTable(4, trs, html, tre);
+        } else if ((tag == 'tbody' && (where == beforeend || where == afterbegin)) ||
+                   (tag == 'tr' && (where == beforebegin || where == afterend))) {
+            node = ieTable(3, tbs, html, tbe);
+        } else {
+            node = ieTable(2, ts, html, te);
+        }
+        el.insertBefore(node, before);
+        return node;
+    }
+
+
+    pub = {
+        
+        markup : function(o){
+            return createHtml(o);
+        },
+
+        
+        applyStyles : function(el, styles){
+            if (styles) {
+                var matches;
+
+                el = Ext.fly(el);
+                if (typeof styles == "function") {
+                    styles = styles.call();
+                }
+                if (typeof styles == "string") {
+                    
+                    cssRe.lastIndex = 0;
+                    while ((matches = cssRe.exec(styles))) {
+                        el.setStyle(matches[1], matches[2]);
+                    }
+                } else if (typeof styles == "object") {
+                    el.setStyle(styles);
+                }
+            }
+        },
+
+        
+        insertHtml : function(where, el, html){
+            var hash = {},
+                hashVal,
+                setStart,
+                range,
+                frag,
+                rangeEl,
+                rs;
+
+            where = where.toLowerCase();
+            
+            hash[beforebegin] = ['BeforeBegin', 'previousSibling'];
+            hash[afterend] = ['AfterEnd', 'nextSibling'];
+
+            if (el.insertAdjacentHTML) {
+                if(tableRe.test(el.tagName) && (rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html))){
+                    return rs;
+                }
+                
+                hash[afterbegin] = ['AfterBegin', 'firstChild'];
+                hash[beforeend] = ['BeforeEnd', 'lastChild'];
+                if ((hashVal = hash[where])) {
+                    el.insertAdjacentHTML(hashVal[0], html);
+                    return el[hashVal[1]];
+                }
+            } else {
+                range = el.ownerDocument.createRange();
+                setStart = 'setStart' + (endRe.test(where) ? 'After' : 'Before');
+                if (hash[where]) {
+                    range[setStart](el);
+                    frag = range.createContextualFragment(html);
+                    el.parentNode.insertBefore(frag, where == beforebegin ? el : el.nextSibling);
+                    return el[(where == beforebegin ? 'previous' : 'next') + 'Sibling'];
+                } else {
+                    rangeEl = (where == afterbegin ? 'first' : 'last') + 'Child';
+                    if (el.firstChild) {
+                        range[setStart](el[rangeEl]);
+                        frag = range.createContextualFragment(html);
+                        if(where == afterbegin){
+                            el.insertBefore(frag, el.firstChild);
+                        }else{
+                            el.appendChild(frag);
+                        }
+                    } else {
+                        el.innerHTML = html;
+                    }
+                    return el[rangeEl];
+                }
+            }
+            throw 'Illegal insertion point -> "' + where + '"';
+        },
+
+        
+        insertBefore : function(el, o, returnElement){
+            return doInsert(el, o, returnElement, beforebegin);
+        },
+
+        
+        insertAfter : function(el, o, returnElement){
+            return doInsert(el, o, returnElement, afterend, 'nextSibling');
+        },
+
+        
+        insertFirst : function(el, o, returnElement){
+            return doInsert(el, o, returnElement, afterbegin, 'firstChild');
+        },
+
+        
+        append : function(el, o, returnElement){
+            return doInsert(el, o, returnElement, beforeend, '', true);
+        },
+
+        
+        overwrite : function(el, o, returnElement){
+            el = Ext.getDom(el);
+            el.innerHTML = createHtml(o);
+            return returnElement ? Ext.get(el.firstChild) : el.firstChild;
+        },
+
+        createHtml : createHtml
+    };
+    return pub;
+}();
+
+Ext.Template = function(html){
+    var me = this,
+        a = arguments,
+        buf = [],
+        v;
+
+    if (Ext.isArray(html)) {
+        html = html.join("");
+    } else if (a.length > 1) {
+        for(var i = 0, len = a.length; i < len; i++){
+            v = a[i];
+            if(typeof v == 'object'){
+                Ext.apply(me, v);
+            } else {
+                buf.push(v);
+            }
+        };
+        html = buf.join('');
+    }
+
+    
+    me.html = html;
+    
+    if (me.compiled) {
+        me.compile();
+    }
+};
+Ext.Template.prototype = {
+    
+    re : /\{([\w-]+)\}/g,
+    
+
+    
+    applyTemplate : function(values){
+        var me = this;
+
+        return me.compiled ?
+                me.compiled(values) :
+                me.html.replace(me.re, function(m, name){
+                    return values[name] !== undefined ? values[name] : "";
+                });
+    },
+
+    
+    set : function(html, compile){
+        var me = this;
+        me.html = html;
+        me.compiled = null;
+        return compile ? me.compile() : me;
+    },
+
+    
+    compile : function(){
+        var me = this,
+            sep = Ext.isGecko ? "+" : ",";
+
+        function fn(m, name){
+            name = "values['" + name + "']";
+            return "'"+ sep + '(' + name + " == undefined ? '' : " + name + ')' + sep + "'";
+        }
+
+        eval("this.compiled = function(values){ return " + (Ext.isGecko ? "'" : "['") +
+             me.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn) +
+             (Ext.isGecko ?  "';};" : "'].join('');};"));
+        return me;
+    },
+
+    
+    insertFirst: function(el, values, returnElement){
+        return this.doInsert('afterBegin', el, values, returnElement);
+    },
+
+    
+    insertBefore: function(el, values, returnElement){
+        return this.doInsert('beforeBegin', el, values, returnElement);
+    },
+
+    
+    insertAfter : function(el, values, returnElement){
+        return this.doInsert('afterEnd', el, values, returnElement);
+    },
+
+    
+    append : function(el, values, returnElement){
+        return this.doInsert('beforeEnd', el, values, returnElement);
+    },
+
+    doInsert : function(where, el, values, returnEl){
+        el = Ext.getDom(el);
+        var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values));
+        return returnEl ? Ext.get(newNode, true) : newNode;
+    },
+
+    
+    overwrite : function(el, values, returnElement){
+        el = Ext.getDom(el);
+        el.innerHTML = this.applyTemplate(values);
+        return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
+    }
+};
+
+Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
+
+
+Ext.Template.from = function(el, config){
+    el = Ext.getDom(el);
+    return new Ext.Template(el.value || el.innerHTML, config || '');
+};
+
+
+Ext.DomQuery = function(){
+    var cache = {}, 
+       simpleCache = {}, 
+       valueCache = {},
+       nonSpace = /\S/,
+       trimRe = /^\s+|\s+$/g,
+       tplRe = /\{(\d+)\}/g,
+       modeRe = /^(\s?[\/>+~]\s?|\s|$)/,
+       tagTokenRe = /^(#)?([\w-\*]+)/,
+       nthRe = /(\d*)n\+?(\d*)/, 
+       nthRe2 = /\D/,
+       
+       
+       
+       isIE = window.ActiveXObject ? true : false,
+       key = 30803;
+    
+    
+    
+    eval("var batch = 30803;");        
+
+    
+    
+    function child(parent, index){
+        var i = 0,
+            n = parent.firstChild;
+        while(n){
+            if(n.nodeType == 1){
+               if(++i == index){
+                   return n;
+               }
+            }
+            n = n.nextSibling;
+        }
+        return null;
+    }
+
+    
+    function next(n){  
+        while((n = n.nextSibling) && n.nodeType != 1);
+        return n;
+    }
+
+    
+    function prev(n){
+        while((n = n.previousSibling) && n.nodeType != 1);
+        return n;
+    }
+
+    
+    
+    function children(parent){
+        var n = parent.firstChild,
+           nodeIndex = -1,
+           nextNode;
+       while(n){
+           nextNode = n.nextSibling;
+           
+           if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){
+               parent.removeChild(n);
+           }else{
+               
+               n.nodeIndex = ++nodeIndex;
+           }
+           n = nextNode;
+       }
+       return this;
+    }
+
+
+    
+    
+    function byClassName(nodeSet, cls){
+        if(!cls){
+            return nodeSet;
+        }
+        var result = [], ri = -1;
+        for(var i = 0, ci; ci = nodeSet[i]; i++){
+            if((' '+ci.className+' ').indexOf(cls) != -1){
+                result[++ri] = ci;
+            }
+        }
+        return result;
+    };
+
+    function attrValue(n, attr){
+       
+        if(!n.tagName && typeof n.length != "undefined"){
+            n = n[0];
+        }
+        if(!n){
+            return null;
+        }
+
+        if(attr == "for"){
+            return n.htmlFor;
+        }
+        if(attr == "class" || attr == "className"){
+            return n.className;
+        }
+        return n.getAttribute(attr) || n[attr];
+
+    };
+
+
+    
+    
+    
+    function getNodes(ns, mode, tagName){
+        var result = [], ri = -1, cs;
+        if(!ns){
+            return result;
+        }
+        tagName = tagName || "*";
+       
+        if(typeof ns.getElementsByTagName != "undefined"){
+            ns = [ns];
+        }
+       
+       
+       
+        if(!mode){
+            for(var i = 0, ni; ni = ns[i]; i++){
+                cs = ni.getElementsByTagName(tagName);
+                for(var j = 0, ci; ci = cs[j]; j++){
+                    result[++ri] = ci;
+                }
+            }
+       
+       
+        } else if(mode == "/" || mode == ">"){
+            var utag = tagName.toUpperCase();
+            for(var i = 0, ni, cn; ni = ns[i]; i++){
+                cn = ni.childNodes;
+                for(var j = 0, cj; cj = cn[j]; j++){
+                    if(cj.nodeName == utag || cj.nodeName == tagName  || tagName == '*'){
+                        result[++ri] = cj;
+                    }
+                }
+            }
+       
+       
+        }else if(mode == "+"){
+            var utag = tagName.toUpperCase();
+            for(var i = 0, n; n = ns[i]; i++){
+                while((n = n.nextSibling) && n.nodeType != 1);
+                if(n && (n.nodeName == utag || n.nodeName == tagName || tagName == '*')){
+                    result[++ri] = n;
+                }
+            }
+       
+       
+        }else if(mode == "~"){
+            var utag = tagName.toUpperCase();
+            for(var i = 0, n; n = ns[i]; i++){
+                while((n = n.nextSibling)){
+                    if (n.nodeName == utag || n.nodeName == tagName || tagName == '*'){
+                        result[++ri] = n;
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    function concat(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, tagName){
+        if(cs.tagName || cs == document){
+            cs = [cs];
+        }
+        if(!tagName){
+            return cs;
+        }
+        var result = [], ri = -1;
+        tagName = tagName.toLowerCase();
+        for(var i = 0, ci; ci = cs[i]; i++){
+            if(ci.nodeType == 1 && ci.tagName.toLowerCase() == tagName){
+                result[++ri] = ci;
+            }
+        }
+        return result;
+    }
+
+    function byId(cs, id){
+        if(cs.tagName || cs == document){
+            cs = [cs];
+        }
+        if(!id){
+            return cs;
+        }
+        var result = [], ri = -1;
+        for(var i = 0, ci; ci = cs[i]; i++){
+            if(ci && ci.id == id){
+                result[++ri] = ci;
+                return result;
+            }
+        }
+        return result;
+    }
+
+    
+    
+    function byAttribute(cs, attr, value, op, custom){
+        var result = [], 
+            ri = -1, 
+            useGetStyle = custom == "{",           
+            fn = Ext.DomQuery.operators[op],       
+            a,
+            xml,
+            hasXml;
+            
+        for(var i = 0, ci; ci = cs[i]; i++){
+           
+            if(ci.nodeType != 1){
+                continue;
+            }
+            
+            if(!hasXml){
+                xml = Ext.DomQuery.isXml(ci);
+                hasXml = true;
+            }
+           
+            
+            if(!xml){
+                if(useGetStyle){
+                    a = Ext.DomQuery.getStyle(ci, attr);
+                } else if (attr == "class" || attr == "className"){
+                    a = ci.className;
+                } else if (attr == "for"){
+                    a = ci.htmlFor;
+                } else if (attr == "href"){
+                   
+                   
+                    a = ci.getAttribute("href", 2);
+                } else{
+                    a = ci.getAttribute(attr);
+                }
+            }else{
+                a = ci.getAttribute(attr);
+            }
+            if((fn && fn(a, value)) || (!fn && a)){
+                result[++ri] = ci;
+            }
+        }
+        return result;
+    }
+
+    function byPseudo(cs, name, value){
+        return Ext.DomQuery.pseudos[name](cs, value);
+    }
+
+    function nodupIEXml(cs){
+        var d = ++key, 
+            r;
+        cs[0].setAttribute("_nodup", d);
+        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 len = cs.length, c, i, r = cs, cj, ri = -1;
+        if(!len || typeof cs.nodeType != "undefined" || len == 1){
+            return cs;
+        }
+        if(isIE && typeof cs[0].selectSingleNode != "undefined"){
+            return nodupIEXml(cs);
+        }
+        var d = ++key;
+        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 quickDiffIEXml(c1, c2){
+        var d = ++key,
+            r = [];
+        for(var i = 0, len = c1.length; i < len; i++){
+            c1[i].setAttribute("_qdiff", d);
+        }        
+        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 quickDiff(c1, c2){
+        var len1 = c1.length,
+               d = ++key,
+               r = [];
+        if(!len1){
+            return c2;
+        }
+        if(isIE && typeof c1[0].selectSingleNode != "undefined"){
+            return quickDiffIEXml(c1, c2);
+        }        
+        for(var i = 0; i < len1; i++){
+            c1[i]._qdiff = d;
+        }        
+        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, mode, root, id){
+        if(ns == root){
+           var d = root.ownerDocument || root;
+           return d.getElementById(id);
+        }
+        ns = getNodes(ns, mode, "*");
+        return byId(ns, id);
+    }
+
+    return {
+        getStyle : function(el, name){
+            return Ext.fly(el).getStyle(name);
+        },
+        
+        compile : function(path, type){
+            type = type || "select";
+
+           
+            var fn = ["var f = function(root){\n var mode; ++batch; var n = root || document;\n"],
+                       mode,           
+                       lastPath,
+               matchers = Ext.DomQuery.matchers,
+               matchersLn = matchers.length,
+               modeMatch,
+               
+               lmode = path.match(modeRe);
+            
+            if(lmode && lmode[1]){
+                fn[fn.length] = 'mode="'+lmode[1].replace(trimRe, "")+'";';
+                path = path.replace(lmode[1], "");
+            }
+           
+            
+            while(path.substr(0, 1)=="/"){
+                path = path.substr(1);
+            }
+
+            while(path && lastPath != path){
+                lastPath = path;
+                var tokenMatch = path.match(tagTokenRe);
+                if(type == "select"){
+                    if(tokenMatch){
+                       
+                        if(tokenMatch[1] == "#"){
+                            fn[fn.length] = 'n = quickId(n, mode, root, "'+tokenMatch[2]+'");';                        
+                        }else{
+                            fn[fn.length] = 'n = getNodes(n, mode, "'+tokenMatch[2]+'");';
+                        }
+                        path = path.replace(tokenMatch[0], "");
+                    }else if(path.substr(0, 1) != '@'){
+                        fn[fn.length] = 'n = getNodes(n, mode, "*");';
+                    }
+               
+                }else{
+                    if(tokenMatch){
+                        if(tokenMatch[1] == "#"){
+                            fn[fn.length] = 'n = byId(n, "'+tokenMatch[2]+'");';
+                        }else{
+                            fn[fn.length] = 'n = byTag(n, "'+tokenMatch[2]+'");';
+                        }
+                        path = path.replace(tokenMatch[0], "");
+                    }
+                }
+                while(!(modeMatch = path.match(modeRe))){
+                    var matched = false;
+                    for(var j = 0; j < matchersLn; j++){
+                        var t = matchers[j];
+                        var m = path.match(t.re);
+                        if(m){
+                            fn[fn.length] = t.select.replace(tplRe, function(x, i){
+                               return m[i];
+                           });
+                            path = path.replace(m[0], "");
+                            matched = true;
+                            break;
+                        }
+                    }
+                    
+                    if(!matched){
+                        throw 'Error parsing selector, parsing failed at "' + path + '"';
+                    }
+                }
+                if(modeMatch[1]){
+                    fn[fn.length] = 'mode="'+modeMatch[1].replace(trimRe, "")+'";';
+                    path = path.replace(modeMatch[1], "");
+                }
+            }
+           
+            fn[fn.length] = "return nodup(n);\n}";
+           
+           
+            eval(fn.join(""));
+            return f;
+        },
+
+        
+       jsSelect: function(path, root, type){
+           
+           root = root || document;
+           
+            if(typeof root == "string"){
+                root = document.getElementById(root);
+            }
+            var paths = path.split(","),
+               results = [];
+               
+           
+            for(var i = 0, len = paths.length; i < len; i++){          
+                var subPath = paths[i].replace(trimRe, "");
+               
+                if(!cache[subPath]){
+                    cache[subPath] = Ext.DomQuery.compile(subPath);
+                    if(!cache[subPath]){
+                        throw subPath + " is not a valid selector";
+                    }
+                }
+                var result = cache[subPath](root);
+                if(result && result != document){
+                    results = results.concat(result);
+                }
+            }
+           
+           
+           
+            if(paths.length > 1){
+                return nodup(results);
+            }
+            return results;
+        },
+       isXml: function(el) {
+           var docEl = (el ? el.ownerDocument || el : 0).documentElement;
+           return docEl ? docEl.nodeName !== "HTML" : false;
+       },
+        select : document.querySelectorAll ? function(path, root, type) {
+           root = root || document;
+           if (!Ext.DomQuery.isXml(root)) {
+               try {
+                   var cs = root.querySelectorAll(path);
+                   return Ext.toArray(cs);
+               }
+               catch (ex) {}           
+           }       
+           return Ext.DomQuery.jsSelect.call(this, path, root, type);
+       } : function(path, root, type) {
+           return Ext.DomQuery.jsSelect.call(this, path, root, type);
+       },
+
+        
+        selectNode : function(path, root){
+            return Ext.DomQuery.select(path, root)[0];
+        },
+
+        
+        selectValue : function(path, root, defaultValue){
+            path = path.replace(trimRe, "");
+            if(!valueCache[path]){
+                valueCache[path] = Ext.DomQuery.compile(path, "select");
+            }
+            var n = valueCache[path](root), v;
+            n = n[0] ? n[0] : n;
+                   
+           
+           
+           
+           
+            if (typeof n.normalize == 'function') n.normalize();
+            
+            v = (n && n.firstChild ? n.firstChild.nodeValue : null);
+            return ((v === null||v === undefined||v==='') ? defaultValue : v);
+        },
+
+        
+        selectNumber : function(path, root, defaultValue){
+            var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0);
+            return parseFloat(v);
+        },
+
+        
+        is : function(el, ss){
+            if(typeof el == "string"){
+                el = document.getElementById(el);
+            }
+            var isArray = Ext.isArray(el),
+               result = Ext.DomQuery.filter(isArray ? el : [el], ss);
+            return isArray ? (result.length == el.length) : (result.length > 0);
+        },
+
+        
+        filter : function(els, ss, nonMatches){
+            ss = ss.replace(trimRe, "");
+            if(!simpleCache[ss]){
+                simpleCache[ss] = Ext.DomQuery.compile(ss, "simple");
+            }
+            var result = simpleCache[ss](els);
+            return nonMatches ? quickDiff(result, els) : result;
+        },
+
+        
+        matchers : [{
+                re: /^\.([\w-]+)/,
+                select: 'n = byClassName(n, " {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, "{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,
+                       m = nthRe.exec(a == "even" && "2n" || a == "odd" && "2n+1" || !nthRe2.test(a) && "n+" + a || a),
+                       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(!prev(ci) && !next(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 Ext.DomQuery.filter(c, ss, true);
+            },
+
+            "any" : function(c, selectors){
+                var ss = selectors.split('|'),
+                       r = [], ri = -1, s;
+                for(var i = 0, ci; ci = c[i]; i++){
+                    for(var j = 0; s = ss[j]; j++){
+                        if(Ext.DomQuery.is(ci, s)){
+                            r[++ri] = ci;
+                            break;
+                        }
+                    }
+                }
+                return r;
+            },
+
+            "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 = Ext.DomQuery.select,
+                       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 = Ext.DomQuery.is,
+                       r = [], ri = -1;
+                for(var i = 0, ci; ci = c[i]; i++){
+                    var n = next(ci);
+                    if(n && is(n, ss)){
+                        r[++ri] = ci;
+                    }
+                }
+                return r;
+            },
+
+            "prev" : function(c, ss){
+                var is = Ext.DomQuery.is,
+                       r = [], ri = -1;
+                for(var i = 0, ci; ci = c[i]; i++){
+                    var n = prev(ci);
+                    if(n && is(n, ss)){
+                        r[++ri] = ci;
+                    }
+                }
+                return r;
+            }
+        }
+    };
+}();
+
+
+Ext.query = Ext.DomQuery.select;
+
+Ext.util.DelayedTask = function(fn, scope, args){
+    var me = this,
+       id,     
+       call = function(){
+               clearInterval(id);
+               id = null;
+               fn.apply(scope, args || []);
+           };
+           
+    
+    me.delay = function(delay, newFn, newScope, newArgs){
+        me.cancel();
+        fn = newFn || fn;
+        scope = newScope || scope;
+        args = newArgs || args;
+        id = setInterval(call, delay);
+    };
+
+    
+    me.cancel = function(){
+        if(id){
+            clearInterval(id);
+            id = null;
+        }
+    };
+};
+(function(){
+var DOC = document;
+
+Ext.Element = function(element, forceNew){
+    var dom = typeof element == "string" ?
+              DOC.getElementById(element) : element,
+        id;
+
+    if(!dom) return null;
+
+    id = dom.id;
+
+    if(!forceNew && id && Ext.elCache[id]){ 
+        return Ext.elCache[id].el;
+    }
+
+    
+    this.dom = dom;
+
+    
+    this.id = id || Ext.id(dom);
+};
+
+var DH = Ext.DomHelper,
+    El = Ext.Element,
+    EC = Ext.elCache;
+
+El.prototype = {
+    
+    set : function(o, useSet){
+        var el = this.dom,
+            attr,
+            val,
+            useSet = (useSet !== false) && !!el.setAttribute;
+
+        for (attr in o) {
+            if (o.hasOwnProperty(attr)) {
+                val = o[attr];
+                if (attr == 'style') {
+                    DH.applyStyles(el, val);
+                } else if (attr == 'cls') {
+                    el.className = val;
+                } else if (useSet) {
+                    el.setAttribute(attr, val);
+                } else {
+                    el[attr] = val;
+                }
+            }
+        }
+        return this;
+    },
+
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+
+
+    
+    
+    
+
+
+
+    
+    
+    
+    
+    
+    
+
+
+    
+    
+    
+    
+    
+    
+
+
+    
+    
+    
+
+
+    
+    
+    
+    
+    
+    
+    
+
+    
+    defaultUnit : "px",
+
+    
+    is : function(simpleSelector){
+        return Ext.DomQuery.is(this.dom, simpleSelector);
+    },
+
+    
+    focus : function(defer,  dom) {
+        var me = this,
+            dom = dom || me.dom;
+        try{
+            if(Number(defer)){
+                me.focus.defer(defer, null, [null, dom]);
+            }else{
+                dom.focus();
+            }
+        }catch(e){}
+        return me;
+    },
+
+    
+    blur : function() {
+        try{
+            this.dom.blur();
+        }catch(e){}
+        return this;
+    },
+
+    
+    getValue : function(asNumber){
+        var val = this.dom.value;
+        return asNumber ? parseInt(val, 10) : val;
+    },
+
+    
+    addListener : function(eventName, fn, scope, options){
+        Ext.EventManager.on(this.dom,  eventName, fn, scope || this, options);
+        return this;
+    },
+
+    
+    removeListener : function(eventName, fn, scope){
+        Ext.EventManager.removeListener(this.dom,  eventName, fn, scope || this);
+        return this;
+    },
+
+    
+    removeAllListeners : function(){
+        Ext.EventManager.removeAll(this.dom);
+        return this;
+    },
+
+    
+    purgeAllListeners : function() {
+        Ext.EventManager.purgeElement(this, true);
+        return this;
+    },
+    
+    addUnits : function(size){
+        if(size === "" || size == "auto" || size === undefined){
+            size = size || '';
+        } else if(!isNaN(size) || !unitPattern.test(size)){
+            size = size + (this.defaultUnit || 'px');
+        }
+        return size;
+    },
+
+    
+    load : function(url, params, cb){
+        Ext.Ajax.request(Ext.apply({
+            params: params,
+            url: url.url || url,
+            callback: cb,
+            el: this.dom,
+            indicatorText: url.indicatorText || ''
+        }, Ext.isObject(url) ? url : {}));
+        return this;
+    },
+
+    
+    isBorderBox : function(){
+        return Ext.isBorderBox || Ext.isForcedBorderBox || noBoxAdjust[(this.dom.tagName || "").toLowerCase()];
+    },
+
+    
+    remove : function(){
+        var me = this,
+            dom = me.dom;
+
+        if (dom) {
+            delete me.dom;
+            Ext.removeNode(dom);
+        }
+    },
+
+    
+    hover : function(overFn, outFn, scope, options){
+        var me = this;
+        me.on('mouseenter', overFn, scope || me.dom, options);
+        me.on('mouseleave', outFn, scope || me.dom, options);
+        return me;
+    },
+
+    
+    contains : function(el){
+        return !el ? false : Ext.lib.Dom.isAncestor(this.dom, el.dom ? el.dom : el);
+    },
+
+    
+    getAttributeNS : function(ns, name){
+        return this.getAttribute(name, ns);
+    },
+
+    
+    getAttribute : Ext.isIE ? function(name, ns){
+        var d = this.dom,
+            type = typeof d[ns + ":" + name];
+
+        if(['undefined', 'unknown'].indexOf(type) == -1){
+            return d[ns + ":" + name];
+        }
+        return d[name];
+    } : function(name, ns){
+        var d = this.dom;
+        return d.getAttributeNS(ns, name) || d.getAttribute(ns + ":" + name) || d.getAttribute(name) || d[name];
+    },
+
+    
+    update : function(html) {
+        if (this.dom) {
+            this.dom.innerHTML = html;
+        }
+        return this;
+    }
+};
+
+var ep = El.prototype;
+
+El.addMethods = function(o){
+   Ext.apply(ep, o);
+};
+
+
+ep.on = ep.addListener;
+
+
+ep.un = ep.removeListener;
+
+
+ep.autoBoxAdjust = true;
+
+
+var unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,
+    docEl;
+
+
+
+
+El.get = function(el){
+    var ex,
+        elm,
+        id;
+    if(!el){ return null; }
+    if (typeof el == "string") { 
+        if (!(elm = DOC.getElementById(el))) {
+            return null;
+        }
+        if (EC[el] && EC[el].el) {
+            ex = EC[el].el;
+            ex.dom = elm;
+        } else {
+            ex = El.addToCache(new El(elm));
+        }
+        return ex;
+    } else if (el.tagName) { 
+        if(!(id = el.id)){
+            id = Ext.id(el);
+        }
+        if (EC[id] && EC[id].el) {
+            ex = EC[id].el;
+            ex.dom = el;
+        } else {
+            ex = El.addToCache(new El(el));
+        }
+        return ex;
+    } else if (el instanceof El) {
+        if(el != docEl){
+            
+            
+
+            
+            if (Ext.isIE && (el.id == undefined || el.id == '')) {
+                el.dom = el.dom;
+            } else {
+                el.dom = DOC.getElementById(el.id) || el.dom;
+            }
+        }
+        return el;
+    } else if(el.isComposite) {
+        return el;
+    } else if(Ext.isArray(el)) {
+        return El.select(el);
+    } else if(el == DOC) {
+        
+        if(!docEl){
+            var f = function(){};
+            f.prototype = El.prototype;
+            docEl = new f();
+            docEl.dom = DOC;
+        }
+        return docEl;
+    }
+    return null;
+};
+
+El.addToCache = function(el, id){
+    id = id || el.id;
+    EC[id] = {
+        el:  el,
+        data: {},
+        events: {}
+    };
+    return el;
+};
+
+
+El.data = function(el, key, value){
+    el = El.get(el);
+    if (!el) {
+        return null;
+    }
+    var c = EC[el.id].data;
+    if(arguments.length == 2){
+        return c[key];
+    }else{
+        return (c[key] = value);
+    }
+};
+
+
+
+
+function garbageCollect(){
+    if(!Ext.enableGarbageCollector){
+        clearInterval(El.collectorThreadId);
+    } else {
+        var eid,
+            el,
+            d,
+            o;
+
+        for(eid in EC){
+            o = EC[eid];
+            if(o.skipGC){
+                continue;
+            }
+            el = o.el;
+            d = el.dom;
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            if(!d || !d.parentNode || (!d.offsetParent && !DOC.getElementById(eid))){
+                if(Ext.enableListenerCollection){
+                    Ext.EventManager.removeAll(d);
+                }
+                delete EC[eid];
+            }
+        }
+        
+        if (Ext.isIE) {
+            var t = {};
+            for (eid in EC) {
+                t[eid] = EC[eid];
+            }
+            EC = Ext.elCache = t;
+        }
+    }
+}
+El.collectorThreadId = setInterval(garbageCollect, 30000);
+
+var flyFn = function(){};
+flyFn.prototype = El.prototype;
+
+
+El.Flyweight = function(dom){
+    this.dom = dom;
+};
+
+El.Flyweight.prototype = new flyFn();
+El.Flyweight.prototype.isFlyweight = true;
+El._flyweights = {};
+
+
+El.fly = function(el, named){
+    var ret = null;
+    named = named || '_global';
+
+    if (el = Ext.getDom(el)) {
+        (El._flyweights[named] = El._flyweights[named] || new El.Flyweight()).dom = el;
+        ret = El._flyweights[named];
+    }
+    return ret;
+};
+
+
+Ext.get = El.get;
+
+
+Ext.fly = El.fly;
+
+
+var noBoxAdjust = Ext.isStrict ? {
+    select:1
+} : {
+    input:1, select:1, textarea:1
+};
+if(Ext.isIE || Ext.isGecko){
+    noBoxAdjust['button'] = 1;
+}
+
+})();
+
+Ext.Element.addMethods(function(){
+       var PARENTNODE = 'parentNode',
+               NEXTSIBLING = 'nextSibling',
+               PREVIOUSSIBLING = 'previousSibling',
+               DQ = Ext.DomQuery,
+               GET = Ext.get;
+       
+       return {
+               
+           findParent : function(simpleSelector, maxDepth, returnEl){
+               var p = this.dom,
+                       b = document.body, 
+                       depth = 0,                      
+                       stopEl;         
+            if(Ext.isGecko && Object.prototype.toString.call(p) == '[object XULElement]') {
+                return null;
+            }
+               maxDepth = maxDepth || 50;
+               if (isNaN(maxDepth)) {
+                   stopEl = Ext.getDom(maxDepth);
+                   maxDepth = Number.MAX_VALUE;
+               }
+               while(p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl){
+                   if(DQ.is(p, simpleSelector)){
+                       return returnEl ? GET(p) : p;
+                   }
+                   depth++;
+                   p = p.parentNode;
+               }
+               return null;
+           },
+       
+           
+           findParentNode : function(simpleSelector, maxDepth, returnEl){
+               var p = Ext.fly(this.dom.parentNode, '_internal');
+               return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null;
+           },
+       
+           
+           up : function(simpleSelector, maxDepth){
+               return this.findParentNode(simpleSelector, maxDepth, true);
+           },
+       
+           
+           select : function(selector){
+               return Ext.Element.select(selector, this.dom);
+           },
+       
+           
+           query : function(selector){
+               return DQ.select(selector, this.dom);
+           },
+       
+           
+           child : function(selector, returnDom){
+               var n = DQ.selectNode(selector, this.dom);
+               return returnDom ? n : GET(n);
+           },
+       
+           
+           down : function(selector, returnDom){
+               var n = DQ.selectNode(" > " + selector, this.dom);
+               return returnDom ? n : GET(n);
+           },
+       
+                
+           parent : function(selector, returnDom){
+               return this.matchNode(PARENTNODE, PARENTNODE, selector, returnDom);
+           },
+       
+            
+           next : function(selector, returnDom){
+               return this.matchNode(NEXTSIBLING, NEXTSIBLING, selector, returnDom);
+           },
+       
+           
+           prev : function(selector, returnDom){
+               return this.matchNode(PREVIOUSSIBLING, PREVIOUSSIBLING, selector, returnDom);
+           },
+       
+       
+           
+           first : function(selector, returnDom){
+               return this.matchNode(NEXTSIBLING, 'firstChild', selector, returnDom);
+           },
+       
+           
+           last : function(selector, returnDom){
+               return this.matchNode(PREVIOUSSIBLING, 'lastChild', selector, returnDom);
+           },
+           
+           matchNode : function(dir, start, selector, returnDom){
+               var n = this.dom[start];
+               while(n){
+                   if(n.nodeType == 1 && (!selector || DQ.is(n, selector))){
+                       return !returnDom ? GET(n) : n;
+                   }
+                   n = n[dir];
+               }
+               return null;
+           }   
+    };
+}());
+Ext.Element.addMethods(
+function() {
+       var GETDOM = Ext.getDom,
+               GET = Ext.get,
+               DH = Ext.DomHelper;
+       
+       return {
+           
+           appendChild: function(el){        
+               return GET(el).appendTo(this);        
+           },
+       
+           
+           appendTo: function(el){        
+               GETDOM(el).appendChild(this.dom);        
+               return this;
+           },
+       
+           
+           insertBefore: function(el){                   
+               (el = GETDOM(el)).parentNode.insertBefore(this.dom, el);
+               return this;
+           },
+       
+           
+           insertAfter: function(el){
+               (el = GETDOM(el)).parentNode.insertBefore(this.dom, el.nextSibling);
+               return this;
+           },
+       
+           
+           insertFirst: function(el, returnDom){
+            el = el || {};
+            if(el.nodeType || el.dom || typeof el == 'string'){ 
+                el = GETDOM(el);
+                this.dom.insertBefore(el, this.dom.firstChild);
+                return !returnDom ? GET(el) : el;
+            }else{ 
+                return this.createChild(el, this.dom.firstChild, returnDom);
+            }
+        },
+       
+           
+           replace: function(el){
+               el = GET(el);
+               this.insertBefore(el);
+               el.remove();
+               return this;
+           },
+       
+           
+           replaceWith: function(el){
+                   var me = this;
+                
+            if(el.nodeType || el.dom || typeof el == 'string'){
+                el = GETDOM(el);
+                me.dom.parentNode.insertBefore(el, me.dom);
+            }else{
+                el = DH.insertBefore(me.dom, el);
+            }
+               
+               delete Ext.elCache[me.id];
+               Ext.removeNode(me.dom);      
+               me.id = Ext.id(me.dom = el);
+               Ext.Element.addToCache(me.isFlyweight ? new Ext.Element(me.dom) : me);     
+            return me;
+           },
+           
+               
+               createChild: function(config, insertBefore, returnDom){
+                   config = config || {tag:'div'};
+                   return insertBefore ? 
+                          DH.insertBefore(insertBefore, config, returnDom !== true) :  
+                          DH[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, config,  returnDom !== true);
+               },
+               
+               
+               wrap: function(config, returnDom){        
+                   var newEl = DH.insertBefore(this.dom, config || {tag: "div"}, !returnDom);
+                   newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom);
+                   return newEl;
+               },
+               
+               
+               insertHtml : function(where, html, returnEl){
+                   var el = DH.insertHtml(where, this.dom, html);
+                   return returnEl ? Ext.get(el) : el;
+               }
+       };
+}());
+Ext.Element.addMethods(function(){
+    
+    var supports = Ext.supports,
+        propCache = {},
+        camelRe = /(-[a-z])/gi,
+        view = document.defaultView,
+        opacityRe = /alpha\(opacity=(.*)\)/i,
+        trimRe = /^\s+|\s+$/g,
+        EL = Ext.Element,
+        spacesRe = /\s+/,
+        wordsRe = /\w/g,
+        PADDING = "padding",
+        MARGIN = "margin",
+        BORDER = "border",
+        LEFT = "-left",
+        RIGHT = "-right",
+        TOP = "-top",
+        BOTTOM = "-bottom",
+        WIDTH = "-width",
+        MATH = Math,
+        HIDDEN = 'hidden',
+        ISCLIPPED = 'isClipped',
+        OVERFLOW = 'overflow',
+        OVERFLOWX = 'overflow-x',
+        OVERFLOWY = 'overflow-y',
+        ORIGINALCLIP = 'originalClip',
+        
+        borders = {l: BORDER + LEFT + WIDTH, r: BORDER + RIGHT + WIDTH, t: BORDER + TOP + WIDTH, b: BORDER + BOTTOM + WIDTH},
+        paddings = {l: PADDING + LEFT, r: PADDING + RIGHT, t: PADDING + TOP, b: PADDING + BOTTOM},
+        margins = {l: MARGIN + LEFT, r: MARGIN + RIGHT, t: MARGIN + TOP, b: MARGIN + BOTTOM},
+        data = Ext.Element.data;
+
+
+    
+    function camelFn(m, a) {
+        return a.charAt(1).toUpperCase();
+    }
+
+    function chkCache(prop) {
+        return propCache[prop] || (propCache[prop] = prop == 'float' ? (supports.cssFloat ? 'cssFloat' : 'styleFloat') : prop.replace(camelRe, camelFn));
+    }
+
+    return {
+        
+        adjustWidth : function(width) {
+            var me = this;
+            var isNum = (typeof width == "number");
+            if(isNum && me.autoBoxAdjust && !me.isBorderBox()){
+               width -= (me.getBorderWidth("lr") + me.getPadding("lr"));
+            }
+            return (isNum && width < 0) ? 0 : width;
+        },
+
+        
+        adjustHeight : function(height) {
+            var me = this;
+            var isNum = (typeof height == "number");
+            if(isNum && me.autoBoxAdjust && !me.isBorderBox()){
+               height -= (me.getBorderWidth("tb") + me.getPadding("tb"));
+            }
+            return (isNum && height < 0) ? 0 : height;
+        },
+
+
+        
+        addClass : function(className){
+            var me = this,
+                i,
+                len,
+                v,
+                cls = [];
+            
+            if (!Ext.isArray(className)) {
+                if (typeof className == 'string' && !this.hasClass(className)) {
+                    me.dom.className += " " + className;
+                }
+            }
+            else {
+                for (i = 0, len = className.length; i < len; i++) {
+                    v = className[i];
+                    if (typeof v == 'string' && (' ' + me.dom.className + ' ').indexOf(' ' + v + ' ') == -1) {
+                        cls.push(v);
+                    }
+                }
+                if (cls.length) {
+                    me.dom.className += " " + cls.join(" ");
+                }
+            }
+            return me;
+        },
+
+        
+        removeClass : function(className){
+            var me = this,
+                i,
+                idx,
+                len,
+                cls,
+                elClasses;
+            if (!Ext.isArray(className)){
+                className = [className];
+            }
+            if (me.dom && me.dom.className) {
+                elClasses = me.dom.className.replace(trimRe, '').split(spacesRe);
+                for (i = 0, len = className.length; i < len; i++) {
+                    cls = className[i];
+                    if (typeof cls == 'string') {
+                        cls = cls.replace(trimRe, '');
+                        idx = elClasses.indexOf(cls);
+                        if (idx != -1) {
+                            elClasses.splice(idx, 1);
+                        }
+                    }
+                }
+                me.dom.className = elClasses.join(" ");
+            }
+            return me;
+        },
+
+        
+        radioClass : function(className){
+            var cn = this.dom.parentNode.childNodes,
+                v,
+                i,
+                len;
+            className = Ext.isArray(className) ? className : [className];
+            for (i = 0, len = cn.length; i < len; i++) {
+                v = cn[i];
+                if (v && v.nodeType == 1) {
+                    Ext.fly(v, '_internal').removeClass(className);
+                }
+            };
+            return this.addClass(className);
+        },
+
+        
+        toggleClass : function(className){
+            return this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
+        },
+
+        
+        hasClass : function(className){
+            return className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1;
+        },
+
+        
+        replaceClass : function(oldClassName, newClassName){
+            return this.removeClass(oldClassName).addClass(newClassName);
+        },
+
+        isStyle : function(style, val) {
+            return this.getStyle(style) == val;
+        },
+
+        
+        getStyle : function(){
+            return view && view.getComputedStyle ?
+                function(prop){
+                    var el = this.dom,
+                        v,
+                        cs,
+                        out,
+                        display;
+
+                    if(el == document){
+                        return null;
+                    }
+                    prop = chkCache(prop);
+                    out = (v = el.style[prop]) ? v :
+                           (cs = view.getComputedStyle(el, "")) ? cs[prop] : null;
+                           
+                    
+                    
+                    if(prop == 'marginRight' && out != '0px' && !supports.correctRightMargin){
+                        display = el.style.display;
+                        el.style.display = 'inline-block';
+                        out = view.getComputedStyle(el, '').marginRight;
+                        el.style.display = display;
+                    }
+                    
+                    if(prop == 'backgroundColor' && out == 'rgba(0, 0, 0, 0)' && !supports.correctTransparentColor){
+                        out = 'transparent';
+                    }
+                    return out;
+                } :
+                function(prop){
+                    var el = this.dom,
+                        m,
+                        cs;
+
+                    if(el == document) return null;
+                    if (prop == 'opacity') {
+                        if (el.style.filter.match) {
+                            if(m = el.style.filter.match(opacityRe)){
+                                var fv = parseFloat(m[1]);
+                                if(!isNaN(fv)){
+                                    return fv ? fv / 100 : 0;
+                                }
+                            }
+                        }
+                        return 1;
+                    }
+                    prop = chkCache(prop);
+                    return el.style[prop] || ((cs = el.currentStyle) ? cs[prop] : null);
+                };
+        }(),
+
+        
+        getColor : function(attr, defaultValue, prefix){
+            var v = this.getStyle(attr),
+                color = (typeof prefix != 'undefined') ? prefix : '#',
+                h;
+
+            if(!v || (/transparent|inherit/.test(v))) {
+                return defaultValue;
+            }
+            if(/^r/.test(v)){
+                Ext.each(v.slice(4, v.length -1).split(','), function(s){
+                    h = parseInt(s, 10);
+                    color += (h < 16 ? '0' : '') + h.toString(16);
+                });
+            }else{
+                v = v.replace('#', '');
+                color += v.length == 3 ? v.replace(/^(\w)(\w)(\w)$/, '$1$1$2$2$3$3') : v;
+            }
+            return(color.length > 5 ? color.toLowerCase() : defaultValue);
+        },
+
+        
+        setStyle : function(prop, value){
+            var tmp, style;
+            
+            if (typeof prop != 'object') {
+                tmp = {};
+                tmp[prop] = value;
+                prop = tmp;
+            }
+            for (style in prop) {
+                value = prop[style];
+                style == 'opacity' ?
+                    this.setOpacity(value) :
+                    this.dom.style[chkCache(style)] = value;
+            }
+            return this;
+        },
+
+        
+         setOpacity : function(opacity, animate){
+            var me = this,
+                s = me.dom.style;
+
+            if(!animate || !me.anim){
+                if(Ext.isIE){
+                    var opac = opacity < 1 ? 'alpha(opacity=' + opacity * 100 + ')' : '',
+                    val = s.filter.replace(opacityRe, '').replace(trimRe, '');
+
+                    s.zoom = 1;
+                    s.filter = val + (val.length > 0 ? ' ' : '') + opac;
+                }else{
+                    s.opacity = opacity;
+                }
+            }else{
+                me.anim({opacity: {to: opacity}}, me.preanim(arguments, 1), null, .35, 'easeIn');
+            }
+            return me;
+        },
+
+        
+        clearOpacity : function(){
+            var style = this.dom.style;
+            if(Ext.isIE){
+                if(!Ext.isEmpty(style.filter)){
+                    style.filter = style.filter.replace(opacityRe, '').replace(trimRe, '');
+                }
+            }else{
+                style.opacity = style['-moz-opacity'] = style['-khtml-opacity'] = '';
+            }
+            return this;
+        },
+
+        
+        getHeight : function(contentHeight){
+            var me = this,
+                dom = me.dom,
+                hidden = Ext.isIE && me.isStyle('display', 'none'),
+                h = MATH.max(dom.offsetHeight, hidden ? 0 : dom.clientHeight) || 0;
+
+            h = !contentHeight ? h : h - me.getBorderWidth("tb") - me.getPadding("tb");
+            return h < 0 ? 0 : h;
+        },
+
+        
+        getWidth : function(contentWidth){
+            var me = this,
+                dom = me.dom,
+                hidden = Ext.isIE && me.isStyle('display', 'none'),
+                w = MATH.max(dom.offsetWidth, hidden ? 0 : dom.clientWidth) || 0;
+            w = !contentWidth ? w : w - me.getBorderWidth("lr") - me.getPadding("lr");
+            return w < 0 ? 0 : w;
+        },
+
+        
+        setWidth : function(width, animate){
+            var me = this;
+            width = me.adjustWidth(width);
+            !animate || !me.anim ?
+                me.dom.style.width = me.addUnits(width) :
+                me.anim({width : {to : width}}, me.preanim(arguments, 1));
+            return me;
+        },
+
+        
+         setHeight : function(height, animate){
+            var me = this;
+            height = me.adjustHeight(height);
+            !animate || !me.anim ?
+                me.dom.style.height = me.addUnits(height) :
+                me.anim({height : {to : height}}, me.preanim(arguments, 1));
+            return me;
+        },
+
+        
+        getBorderWidth : function(side){
+            return this.addStyles(side, borders);
+        },
+
+        
+        getPadding : function(side){
+            return this.addStyles(side, paddings);
+        },
+
+        
+        clip : function(){
+            var me = this,
+                dom = me.dom;
+
+            if(!data(dom, ISCLIPPED)){
+                data(dom, ISCLIPPED, true);
+                data(dom, ORIGINALCLIP, {
+                    o: me.getStyle(OVERFLOW),
+                    x: me.getStyle(OVERFLOWX),
+                    y: me.getStyle(OVERFLOWY)
+                });
+                me.setStyle(OVERFLOW, HIDDEN);
+                me.setStyle(OVERFLOWX, HIDDEN);
+                me.setStyle(OVERFLOWY, HIDDEN);
+            }
+            return me;
+        },
+
+        
+        unclip : function(){
+            var me = this,
+                dom = me.dom;
+
+            if(data(dom, ISCLIPPED)){
+                data(dom, ISCLIPPED, false);
+                var o = data(dom, ORIGINALCLIP);
+                if(o.o){
+                    me.setStyle(OVERFLOW, o.o);
+                }
+                if(o.x){
+                    me.setStyle(OVERFLOWX, o.x);
+                }
+                if(o.y){
+                    me.setStyle(OVERFLOWY, o.y);
+                }
+            }
+            return me;
+        },
+
+        
+        addStyles : function(sides, styles){
+            var ttlSize = 0,
+                sidesArr = sides.match(wordsRe),
+                side,
+                size,
+                i,
+                len = sidesArr.length;
+            for (i = 0; i < len; i++) {
+                side = sidesArr[i];
+                size = side && parseInt(this.getStyle(styles[side]), 10);
+                if (size) {
+                    ttlSize += MATH.abs(size);
+                }
+            }
+            return ttlSize;
+        },
+
+        margins : margins
+    };
+}()
+);
+
+(function(){
+var D = Ext.lib.Dom,
+        LEFT = "left",
+        RIGHT = "right",
+        TOP = "top",
+        BOTTOM = "bottom",
+        POSITION = "position",
+        STATIC = "static",
+        RELATIVE = "relative",
+        AUTO = "auto",
+        ZINDEX = "z-index";
+
+Ext.Element.addMethods({
+       
+    getX : function(){
+        return D.getX(this.dom);
+    },
+
+    
+    getY : function(){
+        return D.getY(this.dom);
+    },
+
+    
+    getXY : function(){
+        return D.getXY(this.dom);
+    },
+
+    
+    getOffsetsTo : function(el){
+        var o = this.getXY(),
+               e = Ext.fly(el, '_internal').getXY();
+        return [o[0]-e[0],o[1]-e[1]];
+    },
+
+    
+    setX : function(x, animate){           
+           return this.setXY([x, this.getY()], this.animTest(arguments, animate, 1));
+    },
+
+    
+    setY : function(y, animate){           
+           return this.setXY([this.getX(), y], this.animTest(arguments, animate, 1));
+    },
+
+    
+    setLeft : function(left){
+        this.setStyle(LEFT, this.addUnits(left));
+        return this;
+    },
+
+    
+    setTop : function(top){
+        this.setStyle(TOP, this.addUnits(top));
+        return this;
+    },
+
+    
+    setRight : function(right){
+        this.setStyle(RIGHT, this.addUnits(right));
+        return this;
+    },
+
+    
+    setBottom : function(bottom){
+        this.setStyle(BOTTOM, this.addUnits(bottom));
+        return this;
+    },
+
+    
+    setXY : function(pos, animate){
+           var me = this;
+        if(!animate || !me.anim){
+            D.setXY(me.dom, pos);
+        }else{
+            me.anim({points: {to: pos}}, me.preanim(arguments, 1), 'motion');
+        }
+        return me;
+    },
+
+    
+    setLocation : function(x, y, animate){
+        return this.setXY([x, y], this.animTest(arguments, animate, 2));
+    },
+
+    
+    moveTo : function(x, y, animate){
+        return this.setXY([x, y], this.animTest(arguments, animate, 2));        
+    },    
+    
+    
+    getLeft : function(local){
+           return !local ? this.getX() : parseInt(this.getStyle(LEFT), 10) || 0;
+    },
+
+    
+    getRight : function(local){
+           var me = this;
+           return !local ? me.getX() + me.getWidth() : (me.getLeft(true) + me.getWidth()) || 0;
+    },
+
+    
+    getTop : function(local) {
+           return !local ? this.getY() : parseInt(this.getStyle(TOP), 10) || 0;
+    },
+
+    
+    getBottom : function(local){
+           var me = this;
+           return !local ? me.getY() + me.getHeight() : (me.getTop(true) + me.getHeight()) || 0;
+    },
+
+    
+    position : function(pos, zIndex, x, y){
+           var me = this;
+           
+        if(!pos && me.isStyle(POSITION, STATIC)){           
+            me.setStyle(POSITION, RELATIVE);           
+        } else if(pos) {
+            me.setStyle(POSITION, pos);
+        }
+        if(zIndex){
+            me.setStyle(ZINDEX, zIndex);
+        }
+        if(x || y) me.setXY([x || false, y || false]);
+    },
+
+    
+    clearPositioning : function(value){
+        value = value || '';
+        this.setStyle({
+            left : value,
+            right : value,
+            top : value,
+            bottom : value,
+            "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(ZINDEX)
+        };
+    },
+    
+    
+    setPositioning : function(pc){
+           var me = this,
+               style = me.dom.style;
+               
+        me.setStyle(pc);
+        
+        if(pc.right == AUTO){
+            style.right = "";
+        }
+        if(pc.bottom == AUTO){
+            style.bottom = "";
+        }
+        
+        return me;
+    },    
+       
+    
+    translatePoints : function(x, y){               
+           y = isNaN(x[1]) ? y : x[1];
+        x = isNaN(x[0]) ? x : x[0];
+        var me = this,
+               relative = me.isStyle(POSITION, RELATIVE),
+               o = me.getXY(),
+               l = parseInt(me.getStyle(LEFT), 10),
+               t = parseInt(me.getStyle(TOP), 10);
+        
+        l = !isNaN(l) ? l : (relative ? 0 : me.dom.offsetLeft);
+        t = !isNaN(t) ? t : (relative ? 0 : me.dom.offsetTop);        
+
+        return {left: (x - o[0] + l), top: (y - o[1] + t)}; 
+    },
+    
+    animTest : function(args, animate, i) {
+        return !!animate && this.preanim ? this.preanim(args, i) : false;
+    }
+});
+})();
+Ext.Element.addMethods({
+    
+    isScrollable : function(){
+        var dom = this.dom;
+        return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth;
+    },
+
+    
+    scrollTo : function(side, value){
+        this.dom["scroll" + (/top/i.test(side) ? "Top" : "Left")] = value;
+        return this;
+    },
+
+    
+    getScroll : function(){
+        var d = this.dom, 
+            doc = document,
+            body = doc.body,
+            docElement = doc.documentElement,
+            l,
+            t,
+            ret;
+
+        if(d == doc || d == body){
+            if(Ext.isIE && Ext.isStrict){
+                l = docElement.scrollLeft; 
+                t = docElement.scrollTop;
+            }else{
+                l = window.pageXOffset;
+                t = window.pageYOffset;
+            }
+            ret = {left: l || (body ? body.scrollLeft : 0), top: t || (body ? body.scrollTop : 0)};
+        }else{
+            ret = {left: d.scrollLeft, top: d.scrollTop};
+        }
+        return ret;
+    }
+});
+
+Ext.Element.VISIBILITY = 1;
+
+Ext.Element.DISPLAY = 2;
+
+
+Ext.Element.OFFSETS = 3;
+
+
+Ext.Element.ASCLASS = 4;
+
+
+Ext.Element.visibilityCls = 'x-hide-nosize';
+
+Ext.Element.addMethods(function(){
+    var El = Ext.Element,
+        OPACITY = "opacity",
+        VISIBILITY = "visibility",
+        DISPLAY = "display",
+        HIDDEN = "hidden",
+        OFFSETS = "offsets",
+        ASCLASS = "asclass",
+        NONE = "none",
+        NOSIZE = 'nosize',
+        ORIGINALDISPLAY = 'originalDisplay',
+        VISMODE = 'visibilityMode',
+        ISVISIBLE = 'isVisible',
+        data = El.data,
+        getDisplay = function(dom){
+            var d = data(dom, ORIGINALDISPLAY);
+            if(d === undefined){
+                data(dom, ORIGINALDISPLAY, d = '');
+            }
+            return d;
+        },
+        getVisMode = function(dom){
+            var m = data(dom, VISMODE);
+            if(m === undefined){
+                data(dom, VISMODE, m = 1);
+            }
+            return m;
+        };
+
+    return {
+        
+        originalDisplay : "",
+        visibilityMode : 1,
+
+        
+        setVisibilityMode : function(visMode){
+            data(this.dom, VISMODE, visMode);
+            return this;
+        },
+
+        
+        animate : function(args, duration, onComplete, easing, animType){
+            this.anim(args, {duration: duration, callback: onComplete, easing: easing}, animType);
+            return this;
+        },
+
+        
+        anim : function(args, opt, animType, defaultDur, defaultEase, cb){
+            animType = animType || 'run';
+            opt = opt || {};
+            var me = this,
+                anim = Ext.lib.Anim[animType](
+                    me.dom,
+                    args,
+                    (opt.duration || defaultDur) || .35,
+                    (opt.easing || defaultEase) || 'easeOut',
+                    function(){
+                        if(cb) cb.call(me);
+                        if(opt.callback) opt.callback.call(opt.scope || me, me, opt);
+                    },
+                    me
+                );
+            opt.anim = anim;
+            return anim;
+        },
+
+        
+        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]});
+        },
+
+        
+        isVisible : function() {
+            var me = this,
+                dom = me.dom,
+                visible = data(dom, ISVISIBLE);
+
+            if(typeof visible == 'boolean'){ 
+                return visible;
+            }
+            
+            visible = !me.isStyle(VISIBILITY, HIDDEN) &&
+                      !me.isStyle(DISPLAY, NONE) &&
+                      !((getVisMode(dom) == El.ASCLASS) && me.hasClass(me.visibilityCls || El.visibilityCls));
+
+            data(dom, ISVISIBLE, visible);
+            return visible;
+        },
+
+        
+        setVisible : function(visible, animate){
+            var me = this, isDisplay, isVisibility, isOffsets, isNosize,
+                dom = me.dom,
+                visMode = getVisMode(dom);
+
+
+            
+            if (typeof animate == 'string'){
+                switch (animate) {
+                    case DISPLAY:
+                        visMode = El.DISPLAY;
+                        break;
+                    case VISIBILITY:
+                        visMode = El.VISIBILITY;
+                        break;
+                    case OFFSETS:
+                        visMode = El.OFFSETS;
+                        break;
+                    case NOSIZE:
+                    case ASCLASS:
+                        visMode = El.ASCLASS;
+                        break;
+                }
+                me.setVisibilityMode(visMode);
+                animate = false;
+            }
+
+            if (!animate || !me.anim) {
+                if(visMode == El.ASCLASS ){
+
+                    me[visible?'removeClass':'addClass'](me.visibilityCls || El.visibilityCls);
+
+                } else if (visMode == El.DISPLAY){
+
+                    return me.setDisplayed(visible);
+
+                } else if (visMode == El.OFFSETS){
+
+                    if (!visible){
+                        me.hideModeStyles = {
+                            position: me.getStyle('position'),
+                            top: me.getStyle('top'),
+                            left: me.getStyle('left')
+                        };
+                        me.applyStyles({position: 'absolute', top: '-10000px', left: '-10000px'});
+                    } else {
+                        me.applyStyles(me.hideModeStyles || {position: '', top: '', left: ''});
+                        delete me.hideModeStyles;
+                    }
+
+                }else{
+                    me.fixDisplay();
+                    dom.style.visibility = visible ? "visible" : HIDDEN;
+                }
+            }else{
+                
+                if(visible){
+                    me.setOpacity(.01);
+                    me.setVisible(true);
+                }
+                me.anim({opacity: { to: (visible?1:0) }},
+                        me.preanim(arguments, 1),
+                        null,
+                        .35,
+                        'easeIn',
+                        function(){
+                            visible || me.setVisible(false).setOpacity(1);
+                        });
+            }
+            data(dom, ISVISIBLE, visible);  
+            return me;
+        },
+
+
+        
+        hasMetrics  : function(){
+            var dom = this.dom;
+            return this.isVisible() || (getVisMode(dom) == El.VISIBILITY);
+        },
+
+        
+        toggle : function(animate){
+            var me = this;
+            me.setVisible(!me.isVisible(), me.preanim(arguments, 0));
+            return me;
+        },
+
+        
+        setDisplayed : function(value) {
+            if(typeof value == "boolean"){
+               value = value ? getDisplay(this.dom) : NONE;
+            }
+            this.setStyle(DISPLAY, value);
+            return this;
+        },
+
+        
+        fixDisplay : function(){
+            var me = this;
+            if(me.isStyle(DISPLAY, NONE)){
+                me.setStyle(VISIBILITY, HIDDEN);
+                me.setStyle(DISPLAY, getDisplay(this.dom)); 
+                if(me.isStyle(DISPLAY, NONE)){ 
+                    me.setStyle(DISPLAY, "block");
+                }
+            }
+        },
+
+        
+        hide : function(animate){
+            
+            if (typeof animate == 'string'){
+                this.setVisible(false, animate);
+                return this;
+            }
+            this.setVisible(false, this.preanim(arguments, 0));
+            return this;
+        },
+
+        
+        show : function(animate){
+            
+            if (typeof animate == 'string'){
+                this.setVisible(true, animate);
+                return this;
+            }
+            this.setVisible(true, this.preanim(arguments, 0));
+            return this;
+        }
+    };
+}());(function(){
+    
+    var NULL = null,
+        UNDEFINED = undefined,
+        TRUE = true,
+        FALSE = false,
+        SETX = "setX",
+        SETY = "setY",
+        SETXY = "setXY",
+        LEFT = "left",
+        BOTTOM = "bottom",
+        TOP = "top",
+        RIGHT = "right",
+        HEIGHT = "height",
+        WIDTH = "width",
+        POINTS = "points",
+        HIDDEN = "hidden",
+        ABSOLUTE = "absolute",
+        VISIBLE = "visible",
+        MOTION = "motion",
+        POSITION = "position",
+        EASEOUT = "easeOut",
+        
+        flyEl = new Ext.Element.Flyweight(),
+        queues = {},
+        getObject = function(o){
+            return o || {};
+        },
+        fly = function(dom){
+            flyEl.dom = dom;
+            flyEl.id = Ext.id(dom);
+            return flyEl;
+        },
+        
+        getQueue = function(id){
+            if(!queues[id]){
+                queues[id] = [];
+            }
+            return queues[id];
+        },
+        setQueue = function(id, value){
+            queues[id] = value;
+        };
+        
+
+Ext.enableFx = TRUE;
+
+
+Ext.Fx = {
+    
+    
+    
+    switchStatements : function(key, fn, argHash){
+        return fn.apply(this, argHash[key]);
+    },
+    
+    
+    slideIn : function(anchor, o){ 
+        o = getObject(o);
+        var me = this,
+            dom = me.dom,
+            st = dom.style,
+            xy,
+            r,
+            b,              
+            wrap,               
+            after,
+            st,
+            args, 
+            pt,
+            bw,
+            bh;
+            
+        anchor = anchor || "t";
+
+        me.queueFx(o, function(){            
+            xy = fly(dom).getXY();
+            
+            fly(dom).fixDisplay();            
+            
+            
+            r = fly(dom).getFxRestore();      
+            b = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: dom.offsetWidth, height: dom.offsetHeight};
+            b.right = b.x + b.width;
+            b.bottom = b.y + b.height;
+            
+            
+            fly(dom).setWidth(b.width).setHeight(b.height);            
+            
+            
+            wrap = fly(dom).fxWrap(r.pos, o, HIDDEN);
+            
+            st.visibility = VISIBLE;
+            st.position = ABSOLUTE;
+            
+            
+            function after(){
+                 fly(dom).fxUnwrap(wrap, r.pos, o);
+                 st.width = r.width;
+                 st.height = r.height;
+                 fly(dom).afterFx(o);
+            }
+            
+            
+            pt = {to: [b.x, b.y]}; 
+            bw = {to: b.width};
+            bh = {to: b.height};
+                
+            function argCalc(wrap, style, ww, wh, sXY, sXYval, s1, s2, w, h, p){                    
+                var ret = {};
+                fly(wrap).setWidth(ww).setHeight(wh);
+                if(fly(wrap)[sXY]){
+                    fly(wrap)[sXY](sXYval);                  
+                }
+                style[s1] = style[s2] = "0";                    
+                if(w){
+                    ret.width = w;
+                }
+                if(h){
+                    ret.height = h;
+                }
+                if(p){
+                    ret.points = p;
+                }
+                return ret;
+            };
+
+            args = fly(dom).switchStatements(anchor.toLowerCase(), argCalc, {
+                    t  : [wrap, st, b.width, 0, NULL, NULL, LEFT, BOTTOM, NULL, bh, NULL],
+                    l  : [wrap, st, 0, b.height, NULL, NULL, RIGHT, TOP, bw, NULL, NULL],
+                    r  : [wrap, st, b.width, b.height, SETX, b.right, LEFT, TOP, NULL, NULL, pt],
+                    b  : [wrap, st, b.width, b.height, SETY, b.bottom, LEFT, TOP, NULL, bh, pt],
+                    tl : [wrap, st, 0, 0, NULL, NULL, RIGHT, BOTTOM, bw, bh, pt],
+                    bl : [wrap, st, 0, 0, SETY, b.y + b.height, RIGHT, TOP, bw, bh, pt],
+                    br : [wrap, st, 0, 0, SETXY, [b.right, b.bottom], LEFT, TOP, bw, bh, pt],
+                    tr : [wrap, st, 0, 0, SETX, b.x + b.width, LEFT, BOTTOM, bw, bh, pt]
+                });
+            
+            st.visibility = VISIBLE;
+            fly(wrap).show();
+
+            arguments.callee.anim = fly(wrap).fxanim(args,
+                o,
+                MOTION,
+                .5,
+                EASEOUT, 
+                after);
+        });
+        return me;
+    },
+    
+    
+    slideOut : function(anchor, o){
+        o = getObject(o);
+        var me = this,
+            dom = me.dom,
+            st = dom.style,
+            xy = me.getXY(),
+            wrap,
+            r,
+            b,
+            a,
+            zero = {to: 0}; 
+                    
+        anchor = anchor || "t";
+
+        me.queueFx(o, function(){
+            
+            
+            r = fly(dom).getFxRestore(); 
+            b = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: dom.offsetWidth, height: dom.offsetHeight};
+            b.right = b.x + b.width;
+            b.bottom = b.y + b.height;
+                
+            
+            fly(dom).setWidth(b.width).setHeight(b.height);
+
+            
+            wrap = fly(dom).fxWrap(r.pos, o, VISIBLE);
+                
+            st.visibility = VISIBLE;
+            st.position = ABSOLUTE;
+            fly(wrap).setWidth(b.width).setHeight(b.height);            
+
+            function after(){
+                o.useDisplay ? fly(dom).setDisplayed(FALSE) : fly(dom).hide();                
+                fly(dom).fxUnwrap(wrap, r.pos, o);
+                st.width = r.width;
+                st.height = r.height;
+                fly(dom).afterFx(o);
+            }            
+            
+            function argCalc(style, s1, s2, p1, v1, p2, v2, p3, v3){                    
+                var ret = {};
+                
+                style[s1] = style[s2] = "0";
+                ret[p1] = v1;               
+                if(p2){
+                    ret[p2] = v2;               
+                }
+                if(p3){
+                    ret[p3] = v3;
+                }
+                
+                return ret;
+            };
+            
+            a = fly(dom).switchStatements(anchor.toLowerCase(), argCalc, {
+                t  : [st, LEFT, BOTTOM, HEIGHT, zero],
+                l  : [st, RIGHT, TOP, WIDTH, zero],
+                r  : [st, LEFT, TOP, WIDTH, zero, POINTS, {to : [b.right, b.y]}],
+                b  : [st, LEFT, TOP, HEIGHT, zero, POINTS, {to : [b.x, b.bottom]}],
+                tl : [st, RIGHT, BOTTOM, WIDTH, zero, HEIGHT, zero],
+                bl : [st, RIGHT, TOP, WIDTH, zero, HEIGHT, zero, POINTS, {to : [b.x, b.bottom]}],
+                br : [st, LEFT, TOP, WIDTH, zero, HEIGHT, zero, POINTS, {to : [b.x + b.width, b.bottom]}],
+                tr : [st, LEFT, BOTTOM, WIDTH, zero, HEIGHT, zero, POINTS, {to : [b.right, b.y]}]
+            });
+            
+            arguments.callee.anim = fly(wrap).fxanim(a,
+                o,
+                MOTION,
+                .5,
+                EASEOUT, 
+                after);
+        });
+        return me;
+    },
+
+    
+    puff : function(o){
+        o = getObject(o);
+        var me = this,
+            dom = me.dom,
+            st = dom.style,
+            width,
+            height,
+            r;
+
+        me.queueFx(o, function(){
+            width = fly(dom).getWidth();
+            height = fly(dom).getHeight();
+            fly(dom).clearOpacity();
+            fly(dom).show();
+
+            
+            r = fly(dom).getFxRestore();                   
+            
+            function after(){
+                o.useDisplay ? fly(dom).setDisplayed(FALSE) : fly(dom).hide();                  
+                fly(dom).clearOpacity();  
+                fly(dom).setPositioning(r.pos);
+                st.width = r.width;
+                st.height = r.height;
+                st.fontSize = '';
+                fly(dom).afterFx(o);
+            }   
+
+            arguments.callee.anim = fly(dom).fxanim({
+                    width : {to : fly(dom).adjustWidth(width * 2)},
+                    height : {to : fly(dom).adjustHeight(height * 2)},
+                    points : {by : [-width * .5, -height * .5]},
+                    opacity : {to : 0},
+                    fontSize: {to : 200, unit: "%"}
+                },
+                o,
+                MOTION,
+                .5,
+                EASEOUT,
+                 after);
+        });
+        return me;
+    },
+
+    
+    switchOff : function(o){
+        o = getObject(o);
+        var me = this,
+            dom = me.dom,
+            st = dom.style,
+            r;
+
+        me.queueFx(o, function(){
+            fly(dom).clearOpacity();
+            fly(dom).clip();
+
+            
+            r = fly(dom).getFxRestore();
+                
+            function after(){
+                o.useDisplay ? fly(dom).setDisplayed(FALSE) : fly(dom).hide();  
+                fly(dom).clearOpacity();
+                fly(dom).setPositioning(r.pos);
+                st.width = r.width;
+                st.height = r.height;   
+                fly(dom).afterFx(o);
+            };
+
+            fly(dom).fxanim({opacity : {to : 0.3}}, 
+                NULL, 
+                NULL, 
+                .1, 
+                NULL, 
+                function(){                                 
+                    fly(dom).clearOpacity();
+                        (function(){                            
+                            fly(dom).fxanim({
+                                height : {to : 1},
+                                points : {by : [0, fly(dom).getHeight() * .5]}
+                            }, 
+                            o, 
+                            MOTION, 
+                            0.3, 
+                            'easeIn', 
+                            after);
+                        }).defer(100);
+                });
+        });
+        return me;
+    },
+
+     
+    highlight : function(color, o){
+        o = getObject(o);
+        var me = this,
+            dom = me.dom,
+            attr = o.attr || "backgroundColor",
+            a = {},
+            restore;
+
+        me.queueFx(o, function(){
+            fly(dom).clearOpacity();
+            fly(dom).show();
+
+            function after(){
+                dom.style[attr] = restore;
+                fly(dom).afterFx(o);
+            }            
+            restore = dom.style[attr];
+            a[attr] = {from: color || "ffff9c", to: o.endColor || fly(dom).getColor(attr) || "ffffff"};
+            arguments.callee.anim = fly(dom).fxanim(a,
+                o,
+                'color',
+                1,
+                'easeIn', 
+                after);
+        });
+        return me;
+    },
+
+   
+    frame : function(color, count, o){
+        o = getObject(o);
+        var me = this,
+            dom = me.dom,
+            proxy,
+            active;
+
+        me.queueFx(o, function(){
+            color = color || '#C3DAF9';
+            if(color.length == 6){
+                color = '#' + color;
+            }            
+            count = count || 1;
+            fly(dom).show();
+
+            var xy = fly(dom).getXY(),
+                b = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: dom.offsetWidth, height: dom.offsetHeight},
+                queue = function(){
+                    proxy = fly(document.body || document.documentElement).createChild({
+                        style:{
+                            position : ABSOLUTE,
+                            'z-index': 35000, 
+                            border : '0px solid ' + color
+                        }
+                    });
+                    return proxy.queueFx({}, animFn);
+                };
+            
+            
+            arguments.callee.anim = {
+                isAnimated: true,
+                stop: function() {
+                    count = 0;
+                    proxy.stopFx();
+                }
+            };
+            
+            function animFn(){
+                var scale = Ext.isBorderBox ? 2 : 1;
+                active = proxy.anim({
+                    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 * scale},
+                    width : {from : b.width, to : b.width + 20 * scale}
+                },{
+                    duration: o.duration || 1,
+                    callback: function() {
+                        proxy.remove();
+                        --count > 0 ? queue() : fly(dom).afterFx(o);
+                    }
+                });
+                arguments.callee.anim = {
+                    isAnimated: true,
+                    stop: function(){
+                        active.stop();
+                    }
+                };
+            };
+            queue();
+        });
+        return me;
+    },
+
+   
+    pause : function(seconds){        
+        var dom = this.dom,
+            t;
+
+        this.queueFx({}, function(){
+            t = setTimeout(function(){
+                fly(dom).afterFx({});
+            }, seconds * 1000);
+            arguments.callee.anim = {
+                isAnimated: true,
+                stop: function(){
+                    clearTimeout(t);
+                    fly(dom).afterFx({});
+                }
+            };
+        });
+        return this;
+    },
+
+   
+    fadeIn : function(o){
+        o = getObject(o);
+        var me = this,
+            dom = me.dom,
+            to = o.endOpacity || 1;
+        
+        me.queueFx(o, function(){
+            fly(dom).setOpacity(0);
+            fly(dom).fixDisplay();
+            dom.style.visibility = VISIBLE;
+            arguments.callee.anim = fly(dom).fxanim({opacity:{to:to}},
+                o, NULL, .5, EASEOUT, function(){
+                if(to == 1){
+                    fly(dom).clearOpacity();
+                }
+                fly(dom).afterFx(o);
+            });
+        });
+        return me;
+    },
+
+   
+    fadeOut : function(o){
+        o = getObject(o);
+        var me = this,
+            dom = me.dom,
+            style = dom.style,
+            to = o.endOpacity || 0;         
+        
+        me.queueFx(o, function(){  
+            arguments.callee.anim = fly(dom).fxanim({ 
+                opacity : {to : to}},
+                o, 
+                NULL, 
+                .5, 
+                EASEOUT, 
+                function(){
+                    if(to == 0){
+                        Ext.Element.data(dom, 'visibilityMode') == Ext.Element.DISPLAY || o.useDisplay ? 
+                            style.display = "none" :
+                            style.visibility = HIDDEN;
+                            
+                        fly(dom).clearOpacity();
+                    }
+                    fly(dom).afterFx(o);
+            });
+        });
+        return me;
+    },
+
+   
+    scale : function(w, h, o){
+        this.shift(Ext.apply({}, o, {
+            width: w,
+            height: h
+        }));
+        return this;
+    },
+
+   
+    shift : function(o){
+        o = getObject(o);
+        var dom = this.dom,
+            a = {};
+                
+        this.queueFx(o, function(){
+            for (var prop in o) {
+                if (o[prop] != UNDEFINED) {                                                 
+                    a[prop] = {to : o[prop]};                   
+                }
+            } 
+            
+            a.width ? a.width.to = fly(dom).adjustWidth(o.width) : a;
+            a.height ? a.height.to = fly(dom).adjustWidth(o.height) : a;   
+            
+            if (a.x || a.y || a.xy) {
+                a.points = a.xy || 
+                           {to : [ a.x ? a.x.to : fly(dom).getX(),
+                                   a.y ? a.y.to : fly(dom).getY()]};                  
+            }
+
+            arguments.callee.anim = fly(dom).fxanim(a,
+                o, 
+                MOTION, 
+                .35, 
+                EASEOUT, 
+                function(){
+                    fly(dom).afterFx(o);
+                });
+        });
+        return this;
+    },
+
+    
+    ghost : function(anchor, o){
+        o = getObject(o);
+        var me = this,
+            dom = me.dom,
+            st = dom.style,
+            a = {opacity: {to: 0}, points: {}},
+            pt = a.points,
+            r,
+            w,
+            h;
+            
+        anchor = anchor || "b";
+
+        me.queueFx(o, function(){
+            
+            r = fly(dom).getFxRestore();
+            w = fly(dom).getWidth();
+            h = fly(dom).getHeight();
+            
+            function after(){
+                o.useDisplay ? fly(dom).setDisplayed(FALSE) : fly(dom).hide();   
+                fly(dom).clearOpacity();
+                fly(dom).setPositioning(r.pos);
+                st.width = r.width;
+                st.height = r.height;
+                fly(dom).afterFx(o);
+            }
+                
+            pt.by = fly(dom).switchStatements(anchor.toLowerCase(), function(v1,v2){ return [v1, v2];}, {
+               t  : [0, -h],
+               l  : [-w, 0],
+               r  : [w, 0],
+               b  : [0, h],
+               tl : [-w, -h],
+               bl : [-w, h],
+               br : [w, h],
+               tr : [w, -h] 
+            });
+                
+            arguments.callee.anim = fly(dom).fxanim(a,
+                o,
+                MOTION,
+                .5,
+                EASEOUT, after);
+        });
+        return me;
+    },
+
+    
+    syncFx : function(){
+        var me = this;
+        me.fxDefaults = Ext.apply(me.fxDefaults || {}, {
+            block : FALSE,
+            concurrent : TRUE,
+            stopFx : FALSE
+        });
+        return me;
+    },
+
+    
+    sequenceFx : function(){
+        var me = this;
+        me.fxDefaults = Ext.apply(me.fxDefaults || {}, {
+            block : FALSE,
+            concurrent : FALSE,
+            stopFx : FALSE
+        });
+        return me;
+    },
+
+    
+    nextFx : function(){        
+        var ef = getQueue(this.dom.id)[0];
+        if(ef){
+            ef.call(this);
+        }
+    },
+
+    
+    hasActiveFx : function(){
+        return getQueue(this.dom.id)[0];
+    },
+
+    
+    stopFx : function(finish){
+        var me = this,
+            id = me.dom.id;
+        if(me.hasActiveFx()){
+            var cur = getQueue(id)[0];
+            if(cur && cur.anim){
+                if(cur.anim.isAnimated){
+                    setQueue(id, [cur]); 
+                    cur.anim.stop(finish !== undefined ? finish : TRUE);
+                }else{
+                    setQueue(id, []);
+                }
+            }
+        }
+        return me;
+    },
+
+    
+    beforeFx : function(o){
+        if(this.hasActiveFx() && !o.concurrent){
+           if(o.stopFx){
+               this.stopFx();
+               return TRUE;
+           }
+           return FALSE;
+        }
+        return TRUE;
+    },
+
+    
+    hasFxBlock : function(){
+        var q = getQueue(this.dom.id);
+        return q && q[0] && q[0].block;
+    },
+
+    
+    queueFx : function(o, fn){
+        var me = fly(this.dom);
+        if(!me.hasFxBlock()){
+            Ext.applyIf(o, me.fxDefaults);
+            if(!o.concurrent){
+                var run = me.beforeFx(o);
+                fn.block = o.block;
+                getQueue(me.dom.id).push(fn);
+                if(run){
+                    me.nextFx();
+                }
+            }else{
+                fn.call(me);
+            }
+        }
+        return me;
+    },
+
+    
+    fxWrap : function(pos, o, vis){ 
+        var dom = this.dom,
+            wrap,
+            wrapXY;
+        if(!o.wrap || !(wrap = Ext.getDom(o.wrap))){            
+            if(o.fixPosition){
+                wrapXY = fly(dom).getXY();
+            }
+            var div = document.createElement("div");
+            div.style.visibility = vis;
+            wrap = dom.parentNode.insertBefore(div, dom);
+            fly(wrap).setPositioning(pos);
+            if(fly(wrap).isStyle(POSITION, "static")){
+                fly(wrap).position("relative");
+            }
+            fly(dom).clearPositioning('auto');
+            fly(wrap).clip();
+            wrap.appendChild(dom);
+            if(wrapXY){
+                fly(wrap).setXY(wrapXY);
+            }
+        }
+        return wrap;
+    },
+
+    
+    fxUnwrap : function(wrap, pos, o){      
+        var dom = this.dom;
+        fly(dom).clearPositioning();
+        fly(dom).setPositioning(pos);
+        if(!o.wrap){
+            var pn = fly(wrap).dom.parentNode;
+            pn.insertBefore(dom, wrap); 
+            fly(wrap).remove();
+        }
+    },
+
+    
+    getFxRestore : function(){
+        var st = this.dom.style;
+        return {pos: this.getPositioning(), width: st.width, height : st.height};
+    },
+
+    
+    afterFx : function(o){
+        var dom = this.dom,
+            id = dom.id;
+        if(o.afterStyle){
+            fly(dom).setStyle(o.afterStyle);            
+        }
+        if(o.afterCls){
+            fly(dom).addClass(o.afterCls);
+        }
+        if(o.remove == TRUE){
+            fly(dom).remove();
+        }
+        if(o.callback){
+            o.callback.call(o.scope, fly(dom));
+        }
+        if(!o.concurrent){
+            getQueue(id).shift();
+            fly(dom).nextFx();
+        }
+    },
+
+    
+    fxanim : function(args, opt, animType, defaultDur, defaultEase, cb){
+        animType = animType || 'run';
+        opt = opt || {};
+        var anim = Ext.lib.Anim[animType](
+                this.dom, 
+                args,
+                (opt.duration || defaultDur) || .35,
+                (opt.easing || defaultEase) || EASEOUT,
+                cb,            
+                this
+            );
+        opt.anim = anim;
+        return anim;
+    }
+};
+
+
+Ext.Fx.resize = Ext.Fx.scale;
+
+
+
+Ext.Element.addMethods(Ext.Fx);
+})();
+
+Ext.CompositeElementLite = function(els, root){
+    
+    this.elements = [];
+    this.add(els, root);
+    this.el = new Ext.Element.Flyweight();
+};
+
+Ext.CompositeElementLite.prototype = {
+    isComposite: true,
+
+    
+    getElement : function(el){
+        
+        var e = this.el;
+        e.dom = el;
+        e.id = el.id;
+        return e;
+    },
+
+    
+    transformElement : function(el){
+        return Ext.getDom(el);
+    },
+
+    
+    getCount : function(){
+        return this.elements.length;
+    },
+    
+    add : function(els, root){
+        var me = this,
+            elements = me.elements;
+        if(!els){
+            return this;
+        }
+        if(typeof els == "string"){
+            els = Ext.Element.selectorFunction(els, root);
+        }else if(els.isComposite){
+            els = els.elements;
+        }else if(!Ext.isIterable(els)){
+            els = [els];
+        }
+
+        for(var i = 0, len = els.length; i < len; ++i){
+            elements.push(me.transformElement(els[i]));
+        }
+        return me;
+    },
+
+    invoke : function(fn, args){
+        var me = this,
+            els = me.elements,
+            len = els.length,
+            e,
+            i;
+
+        for(i = 0; i < len; i++) {
+            e = els[i];
+            if(e){
+                Ext.Element.prototype[fn].apply(me.getElement(e), args);
+            }
+        }
+        return me;
+    },
+    
+    item : function(index){
+        var me = this,
+            el = me.elements[index],
+            out = null;
+
+        if(el){
+            out = me.getElement(el);
+        }
+        return out;
+    },
+
+    
+    addListener : function(eventName, handler, scope, opt){
+        var els = this.elements,
+            len = els.length,
+            i, e;
+
+        for(i = 0; i<len; i++) {
+            e = els[i];
+            if(e) {
+                Ext.EventManager.on(e, eventName, handler, scope || e, opt);
+            }
+        }
+        return this;
+    },
+    
+    each : function(fn, scope){
+        var me = this,
+            els = me.elements,
+            len = els.length,
+            i, e;
+
+        for(i = 0; i<len; i++) {
+            e = els[i];
+            if(e){
+                e = this.getElement(e);
+                if(fn.call(scope || e, e, me, i) === false){
+                    break;
+                }
+            }
+        }
+        return me;
+    },
+
+    
+    fill : function(els){
+        var me = this;
+        me.elements = [];
+        me.add(els);
+        return me;
+    },
+
+    
+    filter : function(selector){
+        var els = [],
+            me = this,
+            fn = Ext.isFunction(selector) ? selector
+                : function(el){
+                    return el.is(selector);
+                };
+
+        me.each(function(el, self, i) {
+            if (fn(el, i) !== false) {
+                els[els.length] = me.transformElement(el);
+            }
+        });
+        
+        me.elements = els;
+        return me;
+    },
+
+    
+    indexOf : function(el){
+        return this.elements.indexOf(this.transformElement(el));
+    },
+
+    
+    replaceElement : function(el, replacement, domReplace){
+        var index = !isNaN(el) ? el : this.indexOf(el),
+            d;
+        if(index > -1){
+            replacement = Ext.getDom(replacement);
+            if(domReplace){
+                d = this.elements[index];
+                d.parentNode.insertBefore(replacement, d);
+                Ext.removeNode(d);
+            }
+            this.elements.splice(index, 1, replacement);
+        }
+        return this;
+    },
+
+    
+    clear : function(){
+        this.elements = [];
+    }
+};
+
+Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener;
+
+
+Ext.CompositeElementLite.importElementMethods = function() {
+    var fnName,
+        ElProto = Ext.Element.prototype,
+        CelProto = Ext.CompositeElementLite.prototype;
+
+    for (fnName in ElProto) {
+        if (typeof ElProto[fnName] == 'function'){
+            (function(fnName) {
+                CelProto[fnName] = CelProto[fnName] || function() {
+                    return this.invoke(fnName, arguments);
+                };
+            }).call(CelProto, fnName);
+
+        }
+    }
+};
+
+Ext.CompositeElementLite.importElementMethods();
+
+if(Ext.DomQuery){
+    Ext.Element.selectorFunction = Ext.DomQuery.select;
+}
+
+
+Ext.Element.select = function(selector, root){
+    var els;
+    if(typeof selector == "string"){
+        els = Ext.Element.selectorFunction(selector, root);
+    }else if(selector.length !== undefined){
+        els = selector;
+    }else{
+        throw "Invalid selector";
+    }
+    return new Ext.CompositeElementLite(els);
+};
+
+Ext.select = Ext.Element.select;
+(function(){
+    var BEFOREREQUEST = "beforerequest",
+        REQUESTCOMPLETE = "requestcomplete",
+        REQUESTEXCEPTION = "requestexception",
+        UNDEFINED = undefined,
+        LOAD = 'load',
+        POST = 'POST',
+        GET = 'GET',
+        WINDOW = window;
+
+    
+    Ext.data.Connection = function(config){
+        Ext.apply(this, config);
+        this.addEvents(
+            
+            BEFOREREQUEST,
+            
+            REQUESTCOMPLETE,
+            
+            REQUESTEXCEPTION
+        );
+        Ext.data.Connection.superclass.constructor.call(this);
+    };
+
+    Ext.extend(Ext.data.Connection, Ext.util.Observable, {
+        
+        
+        
+        
+        
+        timeout : 30000,
+        
+        autoAbort:false,
+
+        
+        disableCaching: true,
+
+        
+        disableCachingParam: '_dc',
+
+        
+        request : function(o){
+            var me = this;
+            if(me.fireEvent(BEFOREREQUEST, me, o)){
+                if (o.el) {
+                    if(!Ext.isEmpty(o.indicatorText)){
+                        me.indicatorText = '<div class="loading-indicator">'+o.indicatorText+"</div>";
+                    }
+                    if(me.indicatorText) {
+                        Ext.getDom(o.el).innerHTML = me.indicatorText;
+                    }
+                    o.success = (Ext.isFunction(o.success) ? o.success : function(){}).createInterceptor(function(response) {
+                        Ext.getDom(o.el).innerHTML = response.responseText;
+                    });
+                }
+
+                var p = o.params,
+                    url = o.url || me.url,
+                    method,
+                    cb = {success: me.handleResponse,
+                          failure: me.handleFailure,
+                          scope: me,
+                          argument: {options: o},
+                          timeout : Ext.num(o.timeout, me.timeout)
+                    },
+                    form,
+                    serForm;
+
+
+                if (Ext.isFunction(p)) {
+                    p = p.call(o.scope||WINDOW, o);
+                }
+
+                p = Ext.urlEncode(me.extraParams, Ext.isObject(p) ? Ext.urlEncode(p) : p);
+
+                if (Ext.isFunction(url)) {
+                    url = url.call(o.scope || WINDOW, o);
+                }
+
+                if((form = Ext.getDom(o.form))){
+                    url = url || form.action;
+                     if(o.isUpload || (/multipart\/form-data/i.test(form.getAttribute("enctype")))) {
+                         return me.doFormUpload.call(me, o, p, url);
+                     }
+                    serForm = Ext.lib.Ajax.serializeForm(form);
+                    p = p ? (p + '&' + serForm) : serForm;
+                }
+
+                method = o.method || me.method || ((p || o.xmlData || o.jsonData) ? POST : GET);
+
+                if(method === GET && (me.disableCaching && o.disableCaching !== false) || o.disableCaching === true){
+                    var dcp = o.disableCachingParam || me.disableCachingParam;
+                    url = Ext.urlAppend(url, dcp + '=' + (new Date().getTime()));
+                }
+
+                o.headers = Ext.apply(o.headers || {}, me.defaultHeaders || {});
+
+                if(o.autoAbort === true || me.autoAbort) {
+                    me.abort();
+                }
+
+                if((method == GET || o.xmlData || o.jsonData) && p){
+                    url = Ext.urlAppend(url, p);
+                    p = '';
+                }
+                return (me.transId = Ext.lib.Ajax.request(method, url, cb, p, o));
+            }else{
+                return o.callback ? o.callback.apply(o.scope, [o,UNDEFINED,UNDEFINED]) : null;
+            }
+        },
+
+        
+        isLoading : function(transId){
+            return transId ? Ext.lib.Ajax.isCallInProgress(transId) : !! this.transId;
+        },
+
+        
+        abort : function(transId){
+            if(transId || this.isLoading()){
+                Ext.lib.Ajax.abort(transId || this.transId);
+            }
+        },
+
+        
+        handleResponse : function(response){
+            this.transId = false;
+            var options = response.argument.options;
+            response.argument = options ? options.argument : null;
+            this.fireEvent(REQUESTCOMPLETE, this, response, options);
+            if(options.success){
+                options.success.call(options.scope, response, options);
+            }
+            if(options.callback){
+                options.callback.call(options.scope, options, true, response);
+            }
+        },
+
+        
+        handleFailure : function(response, e){
+            this.transId = false;
+            var options = response.argument.options;
+            response.argument = options ? options.argument : null;
+            this.fireEvent(REQUESTEXCEPTION, this, response, options, e);
+            if(options.failure){
+                options.failure.call(options.scope, response, options);
+            }
+            if(options.callback){
+                options.callback.call(options.scope, options, false, response);
+            }
+        },
+
+        
+        doFormUpload : function(o, ps, url){
+            var id = Ext.id(),
+                doc = document,
+                frame = doc.createElement('iframe'),
+                form = Ext.getDom(o.form),
+                hiddens = [],
+                hd,
+                encoding = 'multipart/form-data',
+                buf = {
+                    target: form.target,
+                    method: form.method,
+                    encoding: form.encoding,
+                    enctype: form.enctype,
+                    action: form.action
+                };
+
+            
+            Ext.fly(frame).set({
+                id: id,
+                name: id,
+                cls: 'x-hidden',
+                src: Ext.SSL_SECURE_URL
+            }); 
+
+            doc.body.appendChild(frame);
+
+            
+            if(Ext.isIE){
+               document.frames[id].name = id;
+            }
+
+
+            Ext.fly(form).set({
+                target: id,
+                method: POST,
+                enctype: encoding,
+                encoding: encoding,
+                action: url || buf.action
+            });
+
+            
+            Ext.iterate(Ext.urlDecode(ps, false), function(k, v){
+                hd = doc.createElement('input');
+                Ext.fly(hd).set({
+                    type: 'hidden',
+                    value: v,
+                    name: k
+                });
+                form.appendChild(hd);
+                hiddens.push(hd);
+            });
+
+            function cb(){
+                var me = this,
+                    
+                    r = {responseText : '',
+                         responseXML : null,
+                         argument : o.argument},
+                    doc,
+                    firstChild;
+
+                try{
+                    doc = frame.contentWindow.document || frame.contentDocument || WINDOW.frames[id].document;
+                    if(doc){
+                        if(doc.body){
+                            if(/textarea/i.test((firstChild = doc.body.firstChild || {}).tagName)){ 
+                                r.responseText = firstChild.value;
+                            }else{
+                                r.responseText = doc.body.innerHTML;
+                            }
+                        }
+                        
+                        r.responseXML = doc.XMLDocument || doc;
+                    }
+                }
+                catch(e) {}
+
+                Ext.EventManager.removeListener(frame, LOAD, cb, me);
+
+                me.fireEvent(REQUESTCOMPLETE, me, r, o);
+
+                function runCallback(fn, scope, args){
+                    if(Ext.isFunction(fn)){
+                        fn.apply(scope, args);
+                    }
+                }
+
+                runCallback(o.success, o.scope, [r, o]);
+                runCallback(o.callback, o.scope, [o, true, r]);
+
+                if(!me.debugUploads){
+                    setTimeout(function(){Ext.removeNode(frame);}, 100);
+                }
+            }
+
+            Ext.EventManager.on(frame, LOAD, cb, this);
+            form.submit();
+
+            Ext.fly(form).set(buf);
+            Ext.each(hiddens, function(h) {
+                Ext.removeNode(h);
+            });
+        }
+    });
+})();
+
+
+Ext.Ajax = new Ext.data.Connection({
+    
+    
+    
+    
+    
+    
+
+    
+
+    
+    
+    
+    
+    
+    
+
+    
+    autoAbort : false,
+
+    
+    serializeForm : function(form){
+        return Ext.lib.Ajax.serializeForm(form);
+    }
+});
+
+Ext.util.JSON = new (function(){
+    var useHasOwn = !!{}.hasOwnProperty,
+        isNative = function() {
+            var useNative = null;
+
+            return function() {
+                if (useNative === null) {
+                    useNative = Ext.USE_NATIVE_JSON && window.JSON && JSON.toString() == '[object JSON]';
+                }
+        
+                return useNative;
+            };
+        }(),
+        pad = function(n) {
+            return n < 10 ? "0" + n : n;
+        },
+        doDecode = function(json){
+            return eval("(" + json + ")");    
+        },
+        doEncode = function(o){
+            if(!Ext.isDefined(o) || o === null){
+                return "null";
+            }else if(Ext.isArray(o)){
+                return encodeArray(o);
+            }else if(Ext.isDate(o)){
+                return Ext.util.JSON.encodeDate(o);
+            }else if(Ext.isString(o)){
+                return encodeString(o);
+            }else if(typeof o == "number"){
+                
+                return isFinite(o) ? String(o) : "null";
+            }else if(Ext.isBoolean(o)){
+                return String(o);
+            }else {
+                var a = ["{"], b, i, v;
+                for (i in o) {
+                    
+                    if(!o.getElementsByTagName){
+                        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(doEncode(i), ":",
+                                        v === null ? "null" : doEncode(v));
+                                b = true;
+                            }
+                        }
+                    }
+                }
+                a.push("}");
+                return a.join("");
+            }    
+        },
+        m = {
+            "\b": '\\b',
+            "\t": '\\t',
+            "\n": '\\n',
+            "\f": '\\f',
+            "\r": '\\r',
+            '"' : '\\"',
+            "\\": '\\\\'
+        },
+        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 + '"';
+        },
+        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" : Ext.util.JSON.encode(v));
+                            b = true;
+                    }
+                }
+                a.push("]");
+                return a.join("");
+        };
+
+    
+    this.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() {
+        var ec;
+        return function(o) {
+            if (!ec) {
+                
+                ec = isNative() ? JSON.stringify : doEncode;
+            }
+            return ec(o);
+        };
+    }();
+
+
+    
+    this.decode = function() {
+        var dc;
+        return function(json) {
+            if (!dc) {
+                
+                dc = isNative() ? JSON.parse : doDecode;
+            }
+            return dc(json);
+        };
+    }();
+
+})();
+
+Ext.encode = Ext.util.JSON.encode;
+
+Ext.decode = Ext.util.JSON.decode;
+
+Ext.EventManager = function(){
+    var docReadyEvent,
+        docReadyProcId,
+        docReadyState = false,
+        DETECT_NATIVE = Ext.isGecko || Ext.isWebKit || Ext.isSafari,
+        E = Ext.lib.Event,
+        D = Ext.lib.Dom,
+        DOC = document,
+        WINDOW = window,
+        DOMCONTENTLOADED = "DOMContentLoaded",
+        COMPLETE = 'complete',
+        propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,
+        
+        specialElCache = [];
+
+     function getId(el){
+        var id = false,
+            i = 0,
+            len = specialElCache.length,
+            skip = false,
+            o;
+            
+        if (el) {
+            if (el.getElementById || el.navigator) {
+                
+                for(; i < len; ++i){
+                    o = specialElCache[i];
+                    if(o.el === el){
+                        id = o.id;
+                        break;
+                    }
+                }
+                if(!id){
+                    
+                    id = Ext.id(el);
+                    specialElCache.push({
+                        id: id,
+                        el: el
+                    });
+                    skip = true;
+                }
+            }else{
+                id = Ext.id(el);
+            }
+            if(!Ext.elCache[id]){
+                Ext.Element.addToCache(new Ext.Element(el), id);
+                if(skip){
+                    Ext.elCache[id].skipGC = true;
+                }
+            }
+        }
+        return id;
+     }
+
+    
+    function addListener(el, ename, fn, task, wrap, scope){
+        el = Ext.getDom(el);
+        var id = getId(el),
+            es = Ext.elCache[id].events,
+            wfn;
+
+        wfn = E.on(el, ename, wrap);
+        es[ename] = es[ename] || [];
+
+        
+        es[ename].push([fn, wrap, scope, wfn, task]);
+
+        
+        
+
+        
+        if(el.addEventListener && ename == "mousewheel"){
+            var args = ["DOMMouseScroll", wrap, false];
+            el.addEventListener.apply(el, args);
+            Ext.EventManager.addListener(WINDOW, 'unload', function(){
+                el.removeEventListener.apply(el, args);
+            });
+        }
+
+        
+        if(el == DOC && ename == "mousedown"){
+            Ext.EventManager.stoppedMouseDownEvent.addListener(wrap);
+        }
+    }
+
+    function doScrollChk(){
+        
+        if(window != top){
+            return false;
+        }
+
+        try{
+            DOC.documentElement.doScroll('left');
+        }catch(e){
+             return false;
+        }
+
+        fireDocReady();
+        return true;
+    }
+    
+    function checkReadyState(e){
+
+        if(Ext.isIE && doScrollChk()){
+            return true;
+        }
+        if(DOC.readyState == COMPLETE){
+            fireDocReady();
+            return true;
+        }
+        docReadyState || (docReadyProcId = setTimeout(arguments.callee, 2));
+        return false;
+    }
+
+    var styles;
+    function checkStyleSheets(e){
+        styles || (styles = Ext.query('style, link[rel=stylesheet]'));
+        if(styles.length == DOC.styleSheets.length){
+            fireDocReady();
+            return true;
+        }
+        docReadyState || (docReadyProcId = setTimeout(arguments.callee, 2));
+        return false;
+    }
+
+    function OperaDOMContentLoaded(e){
+        DOC.removeEventListener(DOMCONTENTLOADED, arguments.callee, false);
+        checkStyleSheets();
+    }
+
+    function fireDocReady(e){
+        if(!docReadyState){
+            docReadyState = true; 
+
+            if(docReadyProcId){
+                clearTimeout(docReadyProcId);
+            }
+            if(DETECT_NATIVE) {
+                DOC.removeEventListener(DOMCONTENTLOADED, fireDocReady, false);
+            }
+            if(Ext.isIE && checkReadyState.bindIE){  
+                DOC.detachEvent('onreadystatechange', checkReadyState);
+            }
+            E.un(WINDOW, "load", arguments.callee);
+        }
+        if(docReadyEvent && !Ext.isReady){
+            Ext.isReady = true;
+            docReadyEvent.fire();
+            docReadyEvent.listeners = [];
+        }
+
+    }
+
+    function initDocReady(){
+        docReadyEvent || (docReadyEvent = new Ext.util.Event());
+        if (DETECT_NATIVE) {
+            DOC.addEventListener(DOMCONTENTLOADED, fireDocReady, false);
+        }
+        
+        if (Ext.isIE){
+            
+            
+            if(!checkReadyState()){
+                checkReadyState.bindIE = true;
+                DOC.attachEvent('onreadystatechange', checkReadyState);
+            }
+
+        }else if(Ext.isOpera ){
+            
+
+            
+            (DOC.readyState == COMPLETE && checkStyleSheets()) ||
+                DOC.addEventListener(DOMCONTENTLOADED, OperaDOMContentLoaded, false);
+
+        }else if (Ext.isWebKit){
+            
+            checkReadyState();
+        }
+        
+        E.on(WINDOW, "load", fireDocReady);
+    }
+
+    function createTargeted(h, o){
+        return function(){
+            var args = Ext.toArray(arguments);
+            if(o.target == Ext.EventObject.setEvent(args[0]).target){
+                h.apply(this, args);
+            }
+        };
+    }
+
+    function createBuffered(h, o, task){
+        return function(e){
+            
+            task.delay(o.buffer, h, null, [new Ext.EventObjectImpl(e)]);
+        };
+    }
+
+    function createSingle(h, el, ename, fn, scope){
+        return function(e){
+            Ext.EventManager.removeListener(el, ename, fn, scope);
+            h(e);
+        };
+    }
+
+    function createDelayed(h, o, fn){
+        return function(e){
+            var task = new Ext.util.DelayedTask(h);
+            if(!fn.tasks) {
+                fn.tasks = [];
+            }
+            fn.tasks.push(task);
+            task.delay(o.delay || 10, h, null, [new Ext.EventObjectImpl(e)]);
+        };
+    }
+
+    function listen(element, ename, opt, fn, scope){
+        var o = (!opt || typeof opt == "boolean") ? {} : opt,
+            el = Ext.getDom(element), task;
+
+        fn = fn || o.fn;
+        scope = scope || o.scope;
+
+        if(!el){
+            throw "Error listening for \"" + ename + '\". Element "' + element + '" doesn\'t exist.';
+        }
+        function h(e){
+            
+            if(!Ext){
+                return;
+            }
+            e = Ext.EventObject.setEvent(e);
+            var t;
+            if (o.delegate) {
+                if(!(t = e.getTarget(o.delegate, el))){
+                    return;
+                }
+            } else {
+                t = e.target;
+            }
+            if (o.stopEvent) {
+                e.stopEvent();
+            }
+            if (o.preventDefault) {
+               e.preventDefault();
+            }
+            if (o.stopPropagation) {
+                e.stopPropagation();
+            }
+            if (o.normalized === false) {
+                e = e.browserEvent;
+            }
+
+            fn.call(scope || el, e, t, o);
+        }
+        if(o.target){
+            h = createTargeted(h, o);
+        }
+        if(o.delay){
+            h = createDelayed(h, o, fn);
+        }
+        if(o.single){
+            h = createSingle(h, el, ename, fn, scope);
+        }
+        if(o.buffer){
+            task = new Ext.util.DelayedTask(h);
+            h = createBuffered(h, o, task);
+        }
+
+        addListener(el, ename, fn, task, h, scope);
+        return h;
+    }
+
+    var pub = {
+        
+        addListener : function(element, eventName, fn, scope, options){
+            if(typeof eventName == 'object'){
+                var o = eventName, e, val;
+                for(e in o){
+                    val = o[e];
+                    if(!propRe.test(e)){
+                        if(Ext.isFunction(val)){
+                            
+                            listen(element, e, o, val, o.scope);
+                        }else{
+                            
+                            listen(element, e, val);
+                        }
+                    }
+                }
+            } else {
+                listen(element, eventName, options, fn, scope);
+            }
+        },
+
+        
+        removeListener : function(el, eventName, fn, scope){
+            el = Ext.getDom(el);
+            var id = getId(el),
+                f = el && (Ext.elCache[id].events)[eventName] || [],
+                wrap, i, l, k, len, fnc;
+
+            for (i = 0, len = f.length; i < len; i++) {
+
+                
+                if (Ext.isArray(fnc = f[i]) && fnc[0] == fn && (!scope || fnc[2] == scope)) {
+                    if(fnc[4]) {
+                        fnc[4].cancel();
+                    }
+                    k = fn.tasks && fn.tasks.length;
+                    if(k) {
+                        while(k--) {
+                            fn.tasks[k].cancel();
+                        }
+                        delete fn.tasks;
+                    }
+                    wrap = fnc[1];
+                    E.un(el, eventName, E.extAdapter ? fnc[3] : wrap);
+
+                    
+                    if(wrap && el.addEventListener && eventName == "mousewheel"){
+                        el.removeEventListener("DOMMouseScroll", wrap, false);
+                    }
+
+                    
+                    if(wrap && el == DOC && eventName == "mousedown"){
+                        Ext.EventManager.stoppedMouseDownEvent.removeListener(wrap);
+                    }
+
+                    f.splice(i, 1);
+                    if (f.length === 0) {
+                        delete Ext.elCache[id].events[eventName];
+                    }
+                    for (k in Ext.elCache[id].events) {
+                        return false;
+                    }
+                    Ext.elCache[id].events = {};
+                    return false;
+                }
+            }
+        },
+
+        
+        removeAll : function(el){
+            el = Ext.getDom(el);
+            var id = getId(el),
+                ec = Ext.elCache[id] || {},
+                es = ec.events || {},
+                f, i, len, ename, fn, k, wrap;
+
+            for(ename in es){
+                if(es.hasOwnProperty(ename)){
+                    f = es[ename];
+                    
+                    for (i = 0, len = f.length; i < len; i++) {
+                        fn = f[i];
+                        if(fn[4]) {
+                            fn[4].cancel();
+                        }
+                        if(fn[0].tasks && (k = fn[0].tasks.length)) {
+                            while(k--) {
+                                fn[0].tasks[k].cancel();
+                            }
+                            delete fn.tasks;
+                        }
+                        wrap =  fn[1];
+                        E.un(el, ename, E.extAdapter ? fn[3] : wrap);
+
+                        
+                        if(el.addEventListener && wrap && ename == "mousewheel"){
+                            el.removeEventListener("DOMMouseScroll", wrap, false);
+                        }
+
+                        
+                        if(wrap && el == DOC &&  ename == "mousedown"){
+                            Ext.EventManager.stoppedMouseDownEvent.removeListener(wrap);
+                        }
+                    }
+                }
+            }
+            if (Ext.elCache[id]) {
+                Ext.elCache[id].events = {};
+            }
+        },
+
+        getListeners : function(el, eventName) {
+            el = Ext.getDom(el);
+            var id = getId(el),
+                ec = Ext.elCache[id] || {},
+                es = ec.events || {},
+                results = [];
+            if (es && es[eventName]) {
+                return es[eventName];
+            } else {
+                return null;
+            }
+        },
+
+        purgeElement : function(el, recurse, eventName) {
+            el = Ext.getDom(el);
+            var id = getId(el),
+                ec = Ext.elCache[id] || {},
+                es = ec.events || {},
+                i, f, len;
+            if (eventName) {
+                if (es && es.hasOwnProperty(eventName)) {
+                    f = es[eventName];
+                    for (i = 0, len = f.length; i < len; i++) {
+                        Ext.EventManager.removeListener(el, eventName, f[i][0]);
+                    }
+                }
+            } else {
+                Ext.EventManager.removeAll(el);
+            }
+            if (recurse && el && el.childNodes) {
+                for (i = 0, len = el.childNodes.length; i < len; i++) {
+                    Ext.EventManager.purgeElement(el.childNodes[i], recurse, eventName);
+                }
+            }
+        },
+
+        _unload : function() {
+            var el;
+            for (el in Ext.elCache) {
+                Ext.EventManager.removeAll(el);
+            }
+            delete Ext.elCache;
+            delete Ext.Element._flyweights;
+
+            
+            var c,
+                conn,
+                tid,
+                ajax = Ext.lib.Ajax;
+            (typeof ajax.conn == 'object') ? conn = ajax.conn : conn = {};
+            for (tid in conn) {
+                c = conn[tid];
+                if (c) {
+                    ajax.abort({conn: c, tId: tid});
+                }
+            }
+        },
+        
+        onDocumentReady : function(fn, scope, options){
+            if (Ext.isReady) { 
+                docReadyEvent || (docReadyEvent = new Ext.util.Event());
+                docReadyEvent.addListener(fn, scope, options);
+                docReadyEvent.fire();
+                docReadyEvent.listeners = [];
+            } else {
+                if (!docReadyEvent) {
+                    initDocReady();
+                }
+                options = options || {};
+                options.delay = options.delay || 1;
+                docReadyEvent.addListener(fn, scope, options);
+            }
+        },
+
+        
+        fireDocReady  : fireDocReady
+    };
+     
+    pub.on = pub.addListener;
+    
+    pub.un = pub.removeListener;
+
+    pub.stoppedMouseDownEvent = new Ext.util.Event();
+    return pub;
+}();
+
+Ext.onReady = Ext.EventManager.onDocumentReady;
+
+
+
+(function(){
+    var initExtCss = function() {
+        
+        var bd = document.body || document.getElementsByTagName('body')[0];
+        if (!bd) {
+            return false;
+        }
+        
+        var cls = [' ',
+                Ext.isIE ? "ext-ie " + (Ext.isIE6 ? 'ext-ie6' : (Ext.isIE7 ? 'ext-ie7' : 'ext-ie8'))
+                : Ext.isGecko ? "ext-gecko " + (Ext.isGecko2 ? 'ext-gecko2' : 'ext-gecko3')
+                : Ext.isOpera ? "ext-opera"
+                : Ext.isWebKit ? "ext-webkit" : ""];
+
+        if (Ext.isSafari) {
+            cls.push("ext-safari " + (Ext.isSafari2 ? 'ext-safari2' : (Ext.isSafari3 ? 'ext-safari3' : 'ext-safari4')));
+        } else if(Ext.isChrome) {
+            cls.push("ext-chrome");
+        }
+
+        if (Ext.isMac) {
+            cls.push("ext-mac");
+        }
+        if (Ext.isLinux) {
+            cls.push("ext-linux");
+        }
+
+        
+        if (Ext.isStrict || Ext.isBorderBox) {
+            var p = bd.parentNode;
+            if (p) {
+                Ext.fly(p, '_internal').addClass(((Ext.isStrict && Ext.isIE ) || (!Ext.enableForcedBoxModel && !Ext.isIE)) ? ' ext-strict' : ' ext-border-box');
+            }
+        }
+        
+        
+        if (Ext.enableForcedBoxModel && !Ext.isIE) {
+            Ext.isForcedBorderBox = true;
+            cls.push("ext-forced-border-box");
+        }
+        
+        Ext.fly(bd, '_internal').addClass(cls);
+        return true;
+    };
+    
+    if (!initExtCss()) {
+        Ext.onReady(initExtCss);
+    }
+})();
+
+
+(function(){
+    var supports = Ext.apply(Ext.supports, {
+        
+        correctRightMargin: true,
+        
+        
+        correctTransparentColor: true,
+        
+        
+        cssFloat: true
+    });
+    
+    var supportTests = function(){
+            var div = document.createElement('div'),
+                doc = document,
+                view,
+                last;
+                
+            div.innerHTML = '<div style="height:30px;width:50px;"><div style="height:20px;width:20px;"></div></div><div style="float:left;background-color:transparent;">';
+            doc.body.appendChild(div);
+            last = div.lastChild;
+            
+            if((view = doc.defaultView)){
+                if(view.getComputedStyle(div.firstChild.firstChild, null).marginRight != '0px'){
+                    supports.correctRightMargin = false;
+                }
+                if(view.getComputedStyle(last, null).backgroundColor != 'transparent'){
+                    supports.correctTransparentColor = false;
+                }
+            }
+            supports.cssFloat = !!last.style.cssFloat;
+            doc.body.removeChild(div);
+    };
+    
+    if (Ext.isReady) {
+        supportTests();    
+    } else {
+        Ext.onReady(supportTests);
+    }
+})();
+
+
+
+Ext.EventObject = function(){
+    var E = Ext.lib.Event,
+        clickRe = /(dbl)?click/,
+        
+        safariKeys = {
+            3 : 13, 
+            63234 : 37, 
+            63235 : 39, 
+            63232 : 38, 
+            63233 : 40, 
+            63276 : 33, 
+            63277 : 34, 
+            63272 : 46, 
+            63273 : 36, 
+            63275 : 35  
+        },
+        
+        btnMap = Ext.isIE ? {1:0,4:1,2:2} : {0:0,1:1,2:2};
+
+    Ext.EventObjectImpl = function(e){
+        if(e){
+            this.setEvent(e.browserEvent || e);
+        }
+    };
+
+    Ext.EventObjectImpl.prototype = {
+           
+        setEvent : function(e){
+            var me = this;
+            if(e == me || (e && e.browserEvent)){ 
+                return e;
+            }
+            me.browserEvent = e;
+            if(e){
+                
+                me.button = e.button ? btnMap[e.button] : (e.which ? e.which - 1 : -1);
+                if(clickRe.test(e.type) && me.button == -1){
+                    me.button = 0;
+                }
+                me.type = e.type;
+                me.shiftKey = e.shiftKey;
+                
+                me.ctrlKey = e.ctrlKey || e.metaKey || false;
+                me.altKey = e.altKey;
+                
+                me.keyCode = e.keyCode;
+                me.charCode = e.charCode;
+                
+                me.target = E.getTarget(e);
+                
+                me.xy = E.getXY(e);
+            }else{
+                me.button = -1;
+                me.shiftKey = false;
+                me.ctrlKey = false;
+                me.altKey = false;
+                me.keyCode = 0;
+                me.charCode = 0;
+                me.target = null;
+                me.xy = [0, 0];
+            }
+            return me;
+        },
+
+        
+        stopEvent : function(){
+            var me = this;
+            if(me.browserEvent){
+                if(me.browserEvent.type == 'mousedown'){
+                    Ext.EventManager.stoppedMouseDownEvent.fire(me);
+                }
+                E.stopEvent(me.browserEvent);
+            }
+        },
+
+        
+        preventDefault : function(){
+            if(this.browserEvent){
+                E.preventDefault(this.browserEvent);
+            }
+        },
+
+        
+        stopPropagation : function(){
+            var me = this;
+            if(me.browserEvent){
+                if(me.browserEvent.type == 'mousedown'){
+                    Ext.EventManager.stoppedMouseDownEvent.fire(me);
+                }
+                E.stopPropagation(me.browserEvent);
+            }
+        },
+
+        
+        getCharCode : function(){
+            return this.charCode || this.keyCode;
+        },
+
+        
+        getKey : function(){
+            return this.normalizeKey(this.keyCode || this.charCode);
+        },
+
+        
+        normalizeKey: function(k){
+            return Ext.isSafari ? (safariKeys[k] || k) : k;
+        },
+
+        
+        getPageX : function(){
+            return this.xy[0];
+        },
+
+        
+        getPageY : function(){
+            return this.xy[1];
+        },
+
+        
+        getXY : function(){
+            return this.xy;
+        },
+
+        
+        getTarget : function(selector, maxDepth, returnEl){
+            return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : (returnEl ? Ext.get(this.target) : this.target);
+        },
+
+        
+        getRelatedTarget : function(){
+            return this.browserEvent ? E.getRelatedTarget(this.browserEvent) : null;
+        },
+
+        
+        getWheelDelta : function(){
+            var e = this.browserEvent;
+            var delta = 0;
+            if(e.wheelDelta){ 
+                delta = e.wheelDelta/120;
+            }else if(e.detail){ 
+                delta = -e.detail/3;
+            }
+            return delta;
+        },
+
+        
+        within : function(el, related, allowEl){
+            if(el){
+                var t = this[related ? "getRelatedTarget" : "getTarget"]();
+                return t && ((allowEl ? (t == Ext.getDom(el)) : false) || Ext.fly(el).contains(t));
+            }
+            return false;
+        }
+     };
+
+    return new Ext.EventObjectImpl();
+}();
+
+Ext.Loader = Ext.apply({}, {
+    
+    load: function(fileList, callback, scope, preserveOrder) {
+        var scope       = scope || this,
+            head        = document.getElementsByTagName("head")[0],
+            fragment    = document.createDocumentFragment(),
+            numFiles    = fileList.length,
+            loadedFiles = 0,
+            me          = this;
+        
+        
+        var loadFileIndex = function(index) {
+            head.appendChild(
+                me.buildScriptTag(fileList[index], onFileLoaded)
+            );
+        };
+        
+        
+        var onFileLoaded = function() {
+            loadedFiles ++;
+            
+            
+            if (numFiles == loadedFiles && typeof callback == 'function') {
+                callback.call(scope);
+            } else {
+                if (preserveOrder === true) {
+                    loadFileIndex(loadedFiles);
+                }
+            }
+        };
+        
+        if (preserveOrder === true) {
+            loadFileIndex.call(this, 0);
+        } else {
+            
+            Ext.each(fileList, function(file, index) {
+                fragment.appendChild(
+                    this.buildScriptTag(file, onFileLoaded)
+                );  
+            }, this);
+            
+            head.appendChild(fragment);
+        }
+    },
+    
+    
+    buildScriptTag: function(filename, callback) {
+        var script  = document.createElement('script');
+        script.type = "text/javascript";
+        script.src  = filename;
+        
+        
+        if (script.readyState) {
+            script.onreadystatechange = function() {
+                if (script.readyState == "loaded" || script.readyState == "complete") {
+                    script.onreadystatechange = null;
+                    callback();
+                }
+            };
+        } else {
+            script.onload = callback;
+        }    
+        
+        return script;
+    }
+});
+
+
+Ext.ns("Ext.grid", "Ext.list", "Ext.dd", "Ext.tree", "Ext.form", "Ext.menu",
+       "Ext.state", "Ext.layout", "Ext.app", "Ext.ux", "Ext.chart", "Ext.direct");
+    
+
+Ext.apply(Ext, function(){
+    var E = Ext,
+        idSeed = 0,
+        scrollWidth = null;
+
+    return {
+        
+        emptyFn : function(){},
+
+        
+        BLANK_IMAGE_URL : Ext.isIE6 || Ext.isIE7 || Ext.isAir ?
+                            'http:/' + '/www.extjs.com/s.gif' :
+                            'data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==',
+
+        extendX : function(supr, fn){
+            return Ext.extend(supr, fn(supr.prototype));
+        },
+
+        
+        getDoc : function(){
+            return Ext.get(document);
+        },
+
+        
+        num : function(v, defaultValue){
+            v = Number(Ext.isEmpty(v) || Ext.isArray(v) || typeof v == 'boolean' || (typeof v == 'string' && v.trim().length == 0) ? NaN : v);
+            return isNaN(v) ? defaultValue : v;
+        },
+
+        
+        value : function(v, defaultValue, allowBlank){
+            return Ext.isEmpty(v, allowBlank) ? defaultValue : v;
+        },
+
+        
+        escapeRe : function(s) {
+            return s.replace(/([-.*+?^${}()|[\]\/\\])/g, "\\$1");
+        },
+
+        sequence : function(o, name, fn, scope){
+            o[name] = o[name].createSequence(fn, scope);
+        },
+
+        
+        addBehaviors : function(o){
+            if(!Ext.isReady){
+                Ext.onReady(function(){
+                    Ext.addBehaviors(o);
+                });
+            } else {
+                var cache = {}, 
+                    parts,
+                    b,
+                    s;
+                for (b in o) {
+                    if ((parts = b.split('@'))[1]) { 
+                        s = parts[0];
+                        if(!cache[s]){
+                            cache[s] = Ext.select(s);
+                        }
+                        cache[s].on(parts[1], o[b]);
+                    }
+                }
+                cache = null;
+            }
+        },
+
+        
+        getScrollBarWidth: function(force){
+            if(!Ext.isReady){
+                return 0;
+            }
+
+            if(force === true || scrollWidth === null){
+                    
+                var div = Ext.getBody().createChild('<div class="x-hide-offsets" style="width:100px;height:50px;overflow:hidden;"><div style="height:200px;"></div></div>'),
+                    child = div.child('div', true);
+                var w1 = child.offsetWidth;
+                div.setStyle('overflow', (Ext.isWebKit || Ext.isGecko) ? 'auto' : 'scroll');
+                var w2 = child.offsetWidth;
+                div.remove();
+                
+                scrollWidth = w1 - w2 + 2;
+            }
+            return scrollWidth;
+        },
+
+
+        
+        combine : function(){
+            var as = arguments, l = as.length, r = [];
+            for(var i = 0; i < l; i++){
+                var a = as[i];
+                if(Ext.isArray(a)){
+                    r = r.concat(a);
+                }else if(a.length !== undefined && !a.substr){
+                    r = r.concat(Array.prototype.slice.call(a, 0));
+                }else{
+                    r.push(a);
+                }
+            }
+            return r;
+        },
+
+        
+        copyTo : function(dest, source, names){
+            if(typeof names == 'string'){
+                names = names.split(/[,;\s]/);
+            }
+            Ext.each(names, function(name){
+                if(source.hasOwnProperty(name)){
+                    dest[name] = source[name];
+                }
+            }, this);
+            return dest;
+        },
+
+        
+        destroy : function(){
+            Ext.each(arguments, function(arg){
+                if(arg){
+                    if(Ext.isArray(arg)){
+                        this.destroy.apply(this, arg);
+                    }else if(typeof arg.destroy == 'function'){
+                        arg.destroy();
+                    }else if(arg.dom){
+                        arg.remove();
+                    }
+                }
+            }, this);
+        },
+
+        
+        destroyMembers : function(o, arg1, arg2, etc){
+            for(var i = 1, a = arguments, len = a.length; i < len; i++) {
+                Ext.destroy(o[a[i]]);
+                delete o[a[i]];
+            }
+        },
+
+        
+        clean : function(arr){
+            var ret = [];
+            Ext.each(arr, function(v){
+                if(!!v){
+                    ret.push(v);
+                }
+            });
+            return ret;
+        },
+
+        
+        unique : function(arr){
+            var ret = [],
+                collect = {};
+
+            Ext.each(arr, function(v) {
+                if(!collect[v]){
+                    ret.push(v);
+                }
+                collect[v] = true;
+            });
+            return ret;
+        },
+
+        
+        flatten : function(arr){
+            var worker = [];
+            function rFlatten(a) {
+                Ext.each(a, function(v) {
+                    if(Ext.isArray(v)){
+                        rFlatten(v);
+                    }else{
+                        worker.push(v);
+                    }
+                });
+                return worker;
+            }
+            return rFlatten(arr);
+        },
+
+        
+        min : function(arr, comp){
+            var ret = arr[0];
+            comp = comp || function(a,b){ return a < b ? -1 : 1; };
+            Ext.each(arr, function(v) {
+                ret = comp(ret, v) == -1 ? ret : v;
+            });
+            return ret;
+        },
+
+        
+        max : function(arr, comp){
+            var ret = arr[0];
+            comp = comp || function(a,b){ return a > b ? 1 : -1; };
+            Ext.each(arr, function(v) {
+                ret = comp(ret, v) == 1 ? ret : v;
+            });
+            return ret;
+        },
+
+        
+        mean : function(arr){
+           return arr.length > 0 ? Ext.sum(arr) / arr.length : undefined;
+        },
+
+        
+        sum : function(arr){
+           var ret = 0;
+           Ext.each(arr, function(v) {
+               ret += v;
+           });
+           return ret;
+        },
+
+        
+        partition : function(arr, truth){
+            var ret = [[],[]];
+            Ext.each(arr, function(v, i, a) {
+                ret[ (truth && truth(v, i, a)) || (!truth && v) ? 0 : 1].push(v);
+            });
+            return ret;
+        },
+
+        
+        invoke : function(arr, methodName){
+            var ret = [],
+                args = Array.prototype.slice.call(arguments, 2);
+            Ext.each(arr, function(v,i) {
+                if (v && typeof v[methodName] == 'function') {
+                    ret.push(v[methodName].apply(v, args));
+                } else {
+                    ret.push(undefined);
+                }
+            });
+            return ret;
+        },
+
+        
+        pluck : function(arr, prop){
+            var ret = [];
+            Ext.each(arr, function(v) {
+                ret.push( v[prop] );
+            });
+            return ret;
+        },
+
+        
+        zip : function(){
+            var parts = Ext.partition(arguments, function( val ){ return typeof val != 'function'; }),
+                arrs = parts[0],
+                fn = parts[1][0],
+                len = Ext.max(Ext.pluck(arrs, "length")),
+                ret = [];
+
+            for (var i = 0; i < len; i++) {
+                ret[i] = [];
+                if(fn){
+                    ret[i] = fn.apply(fn, Ext.pluck(arrs, i));
+                }else{
+                    for (var j = 0, aLen = arrs.length; j < aLen; j++){
+                        ret[i].push( arrs[j][i] );
+                    }
+                }
+            }
+            return ret;
+        },
+
+        
+        getCmp : function(id){
+            return Ext.ComponentMgr.get(id);
+        },
+
+        
+        useShims: E.isIE6 || (E.isMac && E.isGecko2),
+
+        
+        
+        type : function(o){
+            if(o === undefined || o === null){
+                return false;
+            }
+            if(o.htmlElement){
+                return 'element';
+            }
+            var t = typeof o;
+            if(t == 'object' && o.nodeName) {
+                switch(o.nodeType) {
+                    case 1: return 'element';
+                    case 3: return (/\S/).test(o.nodeValue) ? 'textnode' : 'whitespace';
+                }
+            }
+            if(t == 'object' || t == 'function') {
+                switch(o.constructor) {
+                    case Array: return 'array';
+                    case RegExp: return 'regexp';
+                    case Date: return 'date';
+                }
+                if(typeof o.length == 'number' && typeof o.item == 'function') {
+                    return 'nodelist';
+                }
+            }
+            return t;
+        },
+
+        intercept : function(o, name, fn, scope){
+            o[name] = o[name].createInterceptor(fn, scope);
+        },
+
+        
+        callback : function(cb, scope, args, delay){
+            if(typeof cb == 'function'){
+                if(delay){
+                    cb.defer(delay, scope, args || []);
+                }else{
+                    cb.apply(scope, args || []);
+                }
+            }
+        }
+    };
+}());
+
+
+Ext.apply(Function.prototype, {
+    
+    createSequence : function(fcn, scope){
+        var method = this;
+        return (typeof fcn != 'function') ?
+                this :
+                function(){
+                    var retval = method.apply(this || window, arguments);
+                    fcn.apply(scope || this || window, arguments);
+                    return retval;
+                };
+    }
+});
+
+
+
+Ext.applyIf(String, {
+
+    
+    escape : function(string) {
+        return string.replace(/('|\\)/g, "\\$1");
+    },
+
+    
+    leftPad : function (val, size, ch) {
+        var result = String(val);
+        if(!ch) {
+            ch = " ";
+        }
+        while (result.length < size) {
+            result = ch + result;
+        }
+        return result;
+    }
+});
+
+
+String.prototype.toggle = function(value, other){
+    return this == value ? other : value;
+};
+
+
+String.prototype.trim = function(){
+    var re = /^\s+|\s+$/g;
+    return function(){ return this.replace(re, ""); };
+}();
+
+
+
+Date.prototype.getElapsed = function(date) {
+    return Math.abs((date || new Date()).getTime()-this.getTime());
+};
+
+
+
+Ext.applyIf(Number.prototype, {
+    
+    constrain : function(min, max){
+        return Math.min(Math.max(this, min), max);
+    }
+});
+Ext.lib.Dom.getRegion = function(el) {
+    return Ext.lib.Region.getRegion(el);
+};     Ext.lib.Region = function(t, r, b, l) {
+               var me = this;
+        me.top = t;
+        me[1] = t;
+        me.right = r;
+        me.bottom = b;
+        me.left = l;
+        me[0] = l;
+    };
+
+    Ext.lib.Region.prototype = {
+        contains : function(region) {
+               var me = this;
+            return ( region.left >= me.left &&
+                     region.right <= me.right &&
+                     region.top >= me.top &&
+                     region.bottom <= me.bottom );
+
+        },
+
+        getArea : function() {
+               var me = this;
+            return ( (me.bottom - me.top) * (me.right - me.left) );
+        },
+
+        intersect : function(region) {
+            var me = this,
+               t = Math.max(me.top, region.top),
+               r = Math.min(me.right, region.right),
+               b = Math.min(me.bottom, region.bottom),
+               l = Math.max(me.left, region.left);
+
+            if (b >= t && r >= l) {
+                return new Ext.lib.Region(t, r, b, l);
+            }
+        },
+        
+        union : function(region) {
+               var me = this,
+               t = Math.min(me.top, region.top),
+               r = Math.max(me.right, region.right),
+               b = Math.max(me.bottom, region.bottom),
+               l = Math.min(me.left, region.left);
+
+            return new Ext.lib.Region(t, r, b, l);
+        },
+
+        constrainTo : function(r) {
+               var me = this;
+            me.top = me.top.constrain(r.top, r.bottom);
+            me.bottom = me.bottom.constrain(r.top, r.bottom);
+            me.left = me.left.constrain(r.left, r.right);
+            me.right = me.right.constrain(r.left, r.right);
+            return me;
+        },
+
+        adjust : function(t, l, b, r) {
+               var me = this;
+            me.top += t;
+            me.left += l;
+            me.right += r;
+            me.bottom += b;
+            return me;
+        }
+    };
+
+    Ext.lib.Region.getRegion = function(el) {
+        var p = Ext.lib.Dom.getXY(el),
+               t = p[1],
+               r = p[0] + el.offsetWidth,
+               b = p[1] + el.offsetHeight,
+               l = p[0];
+
+        return new Ext.lib.Region(t, r, b, l);
+    }; Ext.lib.Point = function(x, y) {
+        if (Ext.isArray(x)) {
+            y = x[1];
+            x = x[0];
+        }
+        var me = this;
+        me.x = me.right = me.left = me[0] = x;
+        me.y = me.top = me.bottom = me[1] = y;
+    };
+
+    Ext.lib.Point.prototype = new Ext.lib.Region();
+
+Ext.apply(Ext.DomHelper,
+function(){
+    var pub,
+        afterbegin = 'afterbegin',
+        afterend = 'afterend',
+        beforebegin = 'beforebegin',
+        beforeend = 'beforeend',
+        confRe = /tag|children|cn|html$/i;
+
+    
+    function doInsert(el, o, returnElement, pos, sibling, append){
+        el = Ext.getDom(el);
+        var newNode;
+        if (pub.useDom) {
+            newNode = createDom(o, null);
+            if (append) {
+                el.appendChild(newNode);
+            } else {
+                (sibling == 'firstChild' ? el : el.parentNode).insertBefore(newNode, el[sibling] || el);
+            }
+        } else {
+            newNode = Ext.DomHelper.insertHtml(pos, el, Ext.DomHelper.createHtml(o));
+        }
+        return returnElement ? Ext.get(newNode, true) : newNode;
+    }
+
+    
+    
+    function createDom(o, parentNode){
+        var el,
+            doc = document,
+            useSet,
+            attr,
+            val,
+            cn;
+
+        if (Ext.isArray(o)) {                       
+            el = doc.createDocumentFragment(); 
+            for (var i = 0, l = o.length; i < l; i++) {
+                createDom(o[i], el);
+            }
+        } else if (typeof o == 'string') {         
+            el = doc.createTextNode(o);
+        } else {
+            el = doc.createElement( o.tag || 'div' );
+            useSet = !!el.setAttribute; 
+            for (var attr in o) {
+                if(!confRe.test(attr)){
+                    val = o[attr];
+                    if(attr == 'cls'){
+                        el.className = val;
+                    }else{
+                        if(useSet){
+                            el.setAttribute(attr, val);
+                        }else{
+                            el[attr] = val;
+                        }
+                    }
+                }
+            }
+            Ext.DomHelper.applyStyles(el, o.style);
+
+            if ((cn = o.children || o.cn)) {
+                createDom(cn, el);
+            } else if (o.html) {
+                el.innerHTML = o.html;
+            }
+        }
+        if(parentNode){
+           parentNode.appendChild(el);
+        }
+        return el;
+    }
+
+    pub = {
+        
+        createTemplate : function(o){
+            var html = Ext.DomHelper.createHtml(o);
+            return new Ext.Template(html);
+        },
+
+        
+        useDom : false,
+
+        
+        insertBefore : function(el, o, returnElement){
+            return doInsert(el, o, returnElement, beforebegin);
+        },
+
+        
+        insertAfter : function(el, o, returnElement){
+            return doInsert(el, o, returnElement, afterend, 'nextSibling');
+        },
+
+        
+        insertFirst : function(el, o, returnElement){
+            return doInsert(el, o, returnElement, afterbegin, 'firstChild');
+        },
+
+        
+        append: function(el, o, returnElement){
+            return doInsert(el, o, returnElement, beforeend, '', true);
+        },
+
+        
+        createDom: createDom
+    };
+    return pub;
+}());
+
+Ext.apply(Ext.Template.prototype, {
+    
+    disableFormats : false,
+    
+
+    
+    re : /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,
+    argsRe : /^\s*['"](.*)["']\s*$/,
+    compileARe : /\\/g,
+    compileBRe : /(\r\n|\n)/g,
+    compileCRe : /'/g,
+
+    /**
+     * Returns an HTML fragment of this template with the specified values applied.
+     * @param {Object/Array} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
+     * @return {String} The HTML fragment
+     * @hide repeat doc
+     */
+    applyTemplate : function(values){
+        var me = this,
+            useF = me.disableFormats !== true,
+            fm = Ext.util.Format,
+            tpl = me;
+
+        if(me.compiled){
+            return me.compiled(values);
+        }
+        function fn(m, name, format, args){
+            if (format && useF) {
+                if (format.substr(0, 5) == "this.") {
+                    return tpl.call(format.substr(5), values[name], values);
+                } else {
+                    if (args) {
+                        // quoted values are required for strings in compiled templates,
+                        // but for non compiled we need to strip them
+                        // quoted reversed for jsmin
+                        var re = me.argsRe;
+                        args = args.split(',');
+                        for(var i = 0, len = args.length; i < len; i++){
+                            args[i] = args[i].replace(re, "$1");
+                        }
+                        args = [values[name]].concat(args);
+                    } else {
+                        args = [values[name]];
+                    }
+                    return fm[format].apply(fm, args);
+                }
+            } else {
+                return values[name] !== undefined ? values[name] : "";
+            }
+        }
+        return me.html.replace(me.re, fn);
+    },
+
+    /**
+     * Compiles the template into an internal function, eliminating the RegEx overhead.
+     * @return {Ext.Template} this
+     * @hide repeat doc
+     */
+    compile : function(){
+        var me = this,
+            fm = Ext.util.Format,
+            useF = me.disableFormats !== true,
+            sep = Ext.isGecko ? "+" : ",",
+            body;
+
+        function fn(m, name, format, args){
+            if(format && useF){
+                args = args ? ',' + args : "";
+                if(format.substr(0, 5) != "this."){
+                    format = "fm." + format + '(';
+                }else{
+                    format = 'this.call("'+ format.substr(5) + '", ';
+                    args = ", values";
+                }
+            }else{
+                args= ''; format = "(values['" + name + "'] == undefined ? '' : ";
+            }
+            return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'";
+        }
+
+        // branched to use + in gecko and [].join() in others
+        if(Ext.isGecko){
+            body = "this.compiled = function(values){ return '" +
+                   me.html.replace(me.compileARe, '\\\\').replace(me.compileBRe, '\\n').replace(me.compileCRe, "\\'").replace(me.re, fn) +
+                    "';};";
+        }else{
+            body = ["this.compiled = function(values){ return ['"];
+            body.push(me.html.replace(me.compileARe, '\\\\').replace(me.compileBRe, '\\n').replace(me.compileCRe, "\\'").replace(me.re, fn));
+            body.push("'].join('');};");
+            body = body.join('');
+        }
+        eval(body);
+        return me;
+    },
+
+    // private function used to call members
+    call : function(fnName, value, allValues){
+        return this[fnName](value, allValues);
+    }
+});
+Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
+/**
+ * @class Ext.util.Functions
+ * @singleton
+ */
+Ext.util.Functions = {
+    /**
+     * Creates an interceptor function. The passed function is called before the original one. If it returns false,
+     * the original one is not called. The resulting function returns the results of the original function.
+     * The passed function is called with the parameters of the original function. Example usage:
+     * <pre><code>
+var sayHi = function(name){
+    alert('Hi, ' + name);
+}
+
+sayHi('Fred'); // alerts "Hi, Fred"
+
+// create a new function that validates input without
+// directly modifying the original function:
+var sayHiToFriend = Ext.createInterceptor(sayHi, function(name){
+    return name == 'Brian';
+});
+
+sayHiToFriend('Fred');  // no alert
+sayHiToFriend('Brian'); // alerts "Hi, Brian"
+       </code></pre>
+     * @param {Function} origFn The original function.
+     * @param {Function} newFn The function to call before the original
+     * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the passed function is executed.
+     * <b>If omitted, defaults to the scope in which the original function is called or the browser window.</b>
+     * @return {Function} The new function
+     */
+    createInterceptor: function(origFn, newFn, scope) { 
+        var method = origFn;
+        if (!Ext.isFunction(newFn)) {
+            return origFn;
+        }
+        else {
+            return function() {
+                var me = this,
+                    args = arguments;
+                newFn.target = me;
+                newFn.method = origFn;
+                return (newFn.apply(scope || me || window, args) !== false) ?
+                        origFn.apply(me || window, args) :
+                        null;
+            };
+        }
+    },
+
+    /**
+     * Creates a delegate (callback) that sets the scope to obj.
+     * Call directly on any function. Example: <code>Ext.createDelegate(this.myFunction, this, [arg1, arg2])</code>
+     * Will create a function that is automatically scoped to obj so that the <tt>this</tt> variable inside the
+     * callback points to obj. Example usage:
+     * <pre><code>
+var sayHi = function(name){
+    // Note this use of "this.text" here.  This function expects to
+    // execute within a scope that contains a text property.  In this
+    // example, the "this" variable is pointing to the btn object that
+    // was passed in createDelegate below.
+    alert('Hi, ' + name + '. You clicked the "' + this.text + '" button.');
+}
+
+var btn = new Ext.Button({
+    text: 'Say Hi',
+    renderTo: Ext.getBody()
+});
+
+// This callback will execute in the scope of the
+// button instance. Clicking the button alerts
+// "Hi, Fred. You clicked the "Say Hi" button."
+btn.on('click', Ext.createDelegate(sayHi, btn, ['Fred']));
+       </code></pre>
+     * @param {Function} fn The function to delegate.
+     * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the function is executed.
+     * <b>If omitted, defaults to the browser window.</b>
+     * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
+     * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
+     * if a number the args are inserted at the specified position
+     * @return {Function} The new function
+     */
+    createDelegate: function(fn, obj, args, appendArgs) {
+        if (!Ext.isFunction(fn)) {
+            return fn;
+        }
+        return function() {
+            var callArgs = args || arguments;
+            if (appendArgs === true) {
+                callArgs = Array.prototype.slice.call(arguments, 0);
+                callArgs = callArgs.concat(args);
+            }
+            else if (Ext.isNumber(appendArgs)) {
+                callArgs = Array.prototype.slice.call(arguments, 0);
+                // copy arguments first
+                var applyArgs = [appendArgs, 0].concat(args);
+                // create method call params
+                Array.prototype.splice.apply(callArgs, applyArgs);
+                // splice them in
+            }
+            return fn.apply(obj || window, callArgs);
+        };
+    },
+
+    /**
+     * Calls this function after the number of millseconds specified, optionally in a specific scope. Example usage:
+     * <pre><code>
+var sayHi = function(name){
+    alert('Hi, ' + name);
+}
+
+// executes immediately:
+sayHi('Fred');
+
+// executes after 2 seconds:
+Ext.defer(sayHi, 2000, this, ['Fred']);
+
+// this syntax is sometimes useful for deferring
+// execution of an anonymous function:
+Ext.defer(function(){
+    alert('Anonymous');
+}, 100);
+       </code></pre>
+     * @param {Function} fn The function to defer.
+     * @param {Number} millis The number of milliseconds for the setTimeout call (if less than or equal to 0 the function is executed immediately)
+     * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the function is executed.
+     * <b>If omitted, defaults to the browser window.</b>
+     * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
+     * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
+     * if a number the args are inserted at the specified position
+     * @return {Number} The timeout id that can be used with clearTimeout
+     */
+    defer: function(fn, millis, obj, args, appendArgs) {
+        fn = Ext.util.Functions.createDelegate(fn, obj, args, appendArgs);
+        if (millis > 0) {
+            return setTimeout(fn, millis);
+        }
+        fn();
+        return 0;
+    },
+
+
+    /**
+     * Create a combined function call sequence of the original function + the passed function.
+     * The resulting function returns the results of the original function.
+     * The passed fcn is called with the parameters of the original function. Example usage:
+     * 
+
+var sayHi = function(name){
+    alert('Hi, ' + name);
+}
+
+sayHi('Fred'); // alerts "Hi, Fred"
+
+var sayGoodbye = Ext.createSequence(sayHi, function(name){
+    alert('Bye, ' + name);
+});
+
+sayGoodbye('Fred'); // both alerts show
+
+     * @param {Function} origFn The original function.
+     * @param {Function} newFn The function to sequence
+     * @param {Object} scope (optional) The scope (this reference) in which the passed function is executed.
+     * If omitted, defaults to the scope in which the original function is called or the browser window.
+     * @return {Function} The new function
+     */
+    createSequence: function(origFn, newFn, scope) {
+        if (!Ext.isFunction(newFn)) {
+            return origFn;
+        }
+        else {
+            return function() {
+                var retval = origFn.apply(this || window, arguments);
+                newFn.apply(scope || this || window, arguments);
+                return retval;
+            };
+        }
+    }
+};
+
+/**
+ * Shorthand for {@link Ext.util.Functions#defer}   
+ * @param {Function} fn The function to defer.
+ * @param {Number} millis The number of milliseconds for the setTimeout call (if less than or equal to 0 the function is executed immediately)
+ * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the function is executed.
+ * <b>If omitted, defaults to the browser window.</b>
+ * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
+ * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
+ * if a number the args are inserted at the specified position
+ * @return {Number} The timeout id that can be used with clearTimeout
+ * @member Ext
+ * @method defer
+ */
+
+Ext.defer = Ext.util.Functions.defer;
+
+/**
+ * Shorthand for {@link Ext.util.Functions#createInterceptor}   
+ * @param {Function} origFn The original function.
+ * @param {Function} newFn The function to call before the original
+ * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the passed function is executed.
+ * <b>If omitted, defaults to the scope in which the original function is called or the browser window.</b>
+ * @return {Function} The new function
+ * @member Ext
+ * @method defer
+ */
+
+Ext.createInterceptor = Ext.util.Functions.createInterceptor;
+
+/**
+ * Shorthand for {@link Ext.util.Functions#createSequence}
+ * @param {Function} origFn The original function.
+ * @param {Function} newFn The function to sequence
+ * @param {Object} scope (optional) The scope (this reference) in which the passed function is executed.
+ * If omitted, defaults to the scope in which the original function is called or the browser window.
+ * @return {Function} The new function
+ * @member Ext
+ * @method defer
+ */
+
+Ext.createSequence = Ext.util.Functions.createSequence;
+
+/**
+ * Shorthand for {@link Ext.util.Functions#createDelegate}
+ * @param {Function} fn The function to delegate.
+ * @param {Object} scope (optional) The scope (<code><b>this</b></code> reference) in which the function is executed.
+ * <b>If omitted, defaults to the browser window.</b>
+ * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
+ * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
+ * if a number the args are inserted at the specified position
+ * @return {Function} The new function
+ * @member Ext
+ * @method defer
+ */
+Ext.createDelegate = Ext.util.Functions.createDelegate;
+/**
+ * @class Ext.util.Observable
+ */
+Ext.apply(Ext.util.Observable.prototype, function(){
+    // this is considered experimental (along with beforeMethod, afterMethod, removeMethodListener?)
+    // allows for easier interceptor and sequences, including cancelling and overwriting the return value of the call
+    // private
+    function getMethodEvent(method){
+        var e = (this.methodEvents = this.methodEvents ||
+        {})[method], returnValue, v, cancel, obj = this;
+
+        if (!e) {
+            this.methodEvents[method] = e = {};
+            e.originalFn = this[method];
+            e.methodName = method;
+            e.before = [];
+            e.after = [];
+
+            var makeCall = function(fn, scope, args){
+                if((v = fn.apply(scope || obj, args)) !== undefined){
+                    if (typeof v == 'object') {
+                        if(v.returnValue !== undefined){
+                            returnValue = v.returnValue;
+                        }else{
+                            returnValue = v;
+                        }
+                        cancel = !!v.cancel;
+                    }
+                    else
+                        if (v === false) {
+                            cancel = true;
+                        }
+                        else {
+                            returnValue = v;
+                        }
+                }
+            };
+
+            this[method] = function(){
+                var args = Array.prototype.slice.call(arguments, 0),
+                    b;
+                returnValue = v = undefined;
+                cancel = false;
+
+                for(var i = 0, len = e.before.length; i < len; i++){
+                    b = e.before[i];
+                    makeCall(b.fn, b.scope, args);
+                    if (cancel) {
+                        return returnValue;
+                    }
+                }
+
+                if((v = e.originalFn.apply(obj, args)) !== undefined){
+                    returnValue = v;
+                }
+
+                for(var i = 0, len = e.after.length; i < len; i++){
+                    b = e.after[i];
+                    makeCall(b.fn, b.scope, args);
+                    if (cancel) {
+                        return returnValue;
+                    }
+                }
+                return returnValue;
+            };
+        }
+        return e;
+    }
+
+    return {
+        // these are considered experimental
+        // allows for easier interceptor and sequences, including cancelling and overwriting the return value of the call
+        // adds an 'interceptor' called before the original method
+        beforeMethod : function(method, fn, scope){
+            getMethodEvent.call(this, method).before.push({
+                fn: fn,
+                scope: scope
+            });
+        },
+
+        // adds a 'sequence' called after the original method
+        afterMethod : function(method, fn, scope){
+            getMethodEvent.call(this, method).after.push({
+                fn: fn,
+                scope: scope
+            });
+        },
+
+        removeMethodListener: function(method, fn, scope){
+            var e = this.getMethodEvent(method);
+            for(var i = 0, len = e.before.length; i < len; i++){
+                if(e.before[i].fn == fn && e.before[i].scope == scope){
+                    e.before.splice(i, 1);
+                    return;
+                }
+            }
+            for(var i = 0, len = e.after.length; i < len; i++){
+                if(e.after[i].fn == fn && e.after[i].scope == scope){
+                    e.after.splice(i, 1);
+                    return;
+                }
+            }
+        },
+
+        /**
+         * Relays selected events from the specified Observable as if the events were fired by <tt><b>this</b></tt>.
+         * @param {Object} o The Observable whose events this object is to relay.
+         * @param {Array} events Array of event names to relay.
+         */
+        relayEvents : function(o, events){
+            var me = this;
+            function createHandler(ename){
+                return function(){
+                    return me.fireEvent.apply(me, [ename].concat(Array.prototype.slice.call(arguments, 0)));
+                };
+            }
+            for(var i = 0, len = events.length; i < len; i++){
+                var ename = events[i];
+                me.events[ename] = me.events[ename] || true;
+                o.on(ename, createHandler(ename), me);
+            }
+        },
+
+        /**
+         * <p>Enables events fired by this Observable to bubble up an owner hierarchy by calling
+         * <code>this.getBubbleTarget()</code> if present. There is no implementation in the Observable base class.</p>
+         * <p>This is commonly used by Ext.Components to bubble events to owner Containers. See {@link Ext.Component.getBubbleTarget}. The default
+         * implementation in Ext.Component returns the Component's immediate owner. But if a known target is required, this can be overridden to
+         * access the required target more quickly.</p>
+         * <p>Example:</p><pre><code>
+Ext.override(Ext.form.Field, {
+    
+    initComponent : Ext.form.Field.prototype.initComponent.createSequence(function() {
+        this.enableBubble('change');
+    }),
+
+    
+    getBubbleTarget : function() {
+        if (!this.formPanel) {
+            this.formPanel = this.findParentByType('form');
+        }
+        return this.formPanel;
+    }
+});
+
+var myForm = new Ext.formPanel({
+    title: 'User Details',
+    items: [{
+        ...
+    }],
+    listeners: {
+        change: function() {
+            
+            myForm.header.setStyle('color', 'red');
+        }
+    }
+});
+</code></pre>
+         * @param {String/Array} events The event name to bubble, or an Array of event names.
+         */
+        enableBubble : function(events){
+            var me = this;
+            if(!Ext.isEmpty(events)){
+                events = Ext.isArray(events) ? events : Array.prototype.slice.call(arguments, 0);
+                for(var i = 0, len = events.length; i < len; i++){
+                    var ename = events[i];
+                    ename = ename.toLowerCase();
+                    var ce = me.events[ename] || true;
+                    if (typeof ce == 'boolean') {
+                        ce = new Ext.util.Event(me, ename);
+                        me.events[ename] = ce;
+                    }
+                    ce.bubble = true;
+                }
+            }
+        }
+    };
+}());
+
+
+
+Ext.util.Observable.capture = function(o, fn, scope){
+    o.fireEvent = o.fireEvent.createInterceptor(fn, scope);
+};
+
+
+
+Ext.util.Observable.observeClass = function(c, listeners){
+    if(c){
+      if(!c.fireEvent){
+          Ext.apply(c, new Ext.util.Observable());
+          Ext.util.Observable.capture(c.prototype, c.fireEvent, c);
+      }
+      if(typeof listeners == 'object'){
+          c.on(listeners);
+      }
+      return c;
+   }
+};
+
+Ext.apply(Ext.EventManager, function(){
+   var resizeEvent,
+       resizeTask,
+       textEvent,
+       textSize,
+       D = Ext.lib.Dom,
+       propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,
+       curWidth = 0,
+       curHeight = 0,
+       
+       
+       
+       useKeydown = Ext.isWebKit ?
+                   Ext.num(navigator.userAgent.match(/AppleWebKit\/(\d+)/)[1]) >= 525 :
+                   !((Ext.isGecko && !Ext.isWindows) || Ext.isOpera);
+
+   return {
+       
+       doResizeEvent: function(){
+           var h = D.getViewHeight(),
+               w = D.getViewWidth();
+
+            
+            if(curHeight != h || curWidth != w){
+               resizeEvent.fire(curWidth = w, curHeight = h);
+            }
+       },
+
+       
+       onWindowResize : function(fn, scope, options){
+           if(!resizeEvent){
+               resizeEvent = new Ext.util.Event();
+               resizeTask = new Ext.util.DelayedTask(this.doResizeEvent);
+               Ext.EventManager.on(window, "resize", this.fireWindowResize, this);
+           }
+           resizeEvent.addListener(fn, scope, options);
+       },
+
+       
+       fireWindowResize : function(){
+           if(resizeEvent){
+               resizeTask.delay(100);
+           }
+       },
+
+       
+       onTextResize : function(fn, scope, options){
+           if(!textEvent){
+               textEvent = new Ext.util.Event();
+               var textEl = new Ext.Element(document.createElement('div'));
+               textEl.dom.className = 'x-text-resize';
+               textEl.dom.innerHTML = 'X';
+               textEl.appendTo(document.body);
+               textSize = textEl.dom.offsetHeight;
+               setInterval(function(){
+                   if(textEl.dom.offsetHeight != textSize){
+                       textEvent.fire(textSize, textSize = textEl.dom.offsetHeight);
+                   }
+               }, this.textResizeInterval);
+           }
+           textEvent.addListener(fn, scope, options);
+       },
+
+       
+       removeResizeListener : function(fn, scope){
+           if(resizeEvent){
+               resizeEvent.removeListener(fn, scope);
+           }
+       },
+
+       
+       fireResize : function(){
+           if(resizeEvent){
+               resizeEvent.fire(D.getViewWidth(), D.getViewHeight());
+           }
+       },
+
+        
+       textResizeInterval : 50,
+
+       
+       ieDeferSrc : false,
+       
+       
+       getKeyEvent : function(){
+           return useKeydown ? 'keydown' : 'keypress';
+       },
+
+       
+       
+       useKeydown: useKeydown
+   };
+}());
+
+Ext.EventManager.on = Ext.EventManager.addListener;
+
+
+Ext.apply(Ext.EventObjectImpl.prototype, {
+   
+   BACKSPACE: 8,
+   
+   TAB: 9,
+   
+   NUM_CENTER: 12,
+   
+   ENTER: 13,
+   
+   RETURN: 13,
+   
+   SHIFT: 16,
+   
+   CTRL: 17,
+   CONTROL : 17, 
+   
+   ALT: 18,
+   
+   PAUSE: 19,
+   
+   CAPS_LOCK: 20,
+   
+   ESC: 27,
+   
+   SPACE: 32,
+   
+   PAGE_UP: 33,
+   PAGEUP : 33, 
+   
+   PAGE_DOWN: 34,
+   PAGEDOWN : 34, 
+   
+   END: 35,
+   
+   HOME: 36,
+   
+   LEFT: 37,
+   
+   UP: 38,
+   
+   RIGHT: 39,
+   
+   DOWN: 40,
+   
+   PRINT_SCREEN: 44,
+   
+   INSERT: 45,
+   
+   DELETE: 46,
+   
+   ZERO: 48,
+   
+   ONE: 49,
+   
+   TWO: 50,
+   
+   THREE: 51,
+   
+   FOUR: 52,
+   
+   FIVE: 53,
+   
+   SIX: 54,
+   
+   SEVEN: 55,
+   
+   EIGHT: 56,
+   
+   NINE: 57,
+   
+   A: 65,
+   
+   B: 66,
+   
+   C: 67,
+   
+   D: 68,
+   
+   E: 69,
+   
+   F: 70,
+   
+   G: 71,
+   
+   H: 72,
+   
+   I: 73,
+   
+   J: 74,
+   
+   K: 75,
+   
+   L: 76,
+   
+   M: 77,
+   
+   N: 78,
+   
+   O: 79,
+   
+   P: 80,
+   
+   Q: 81,
+   
+   R: 82,
+   
+   S: 83,
+   
+   T: 84,
+   
+   U: 85,
+   
+   V: 86,
+   
+   W: 87,
+   
+   X: 88,
+   
+   Y: 89,
+   
+   Z: 90,
+   
+   CONTEXT_MENU: 93,
+   
+   NUM_ZERO: 96,
+   
+   NUM_ONE: 97,
+   
+   NUM_TWO: 98,
+   
+   NUM_THREE: 99,
+   
+   NUM_FOUR: 100,
+   
+   NUM_FIVE: 101,
+   
+   NUM_SIX: 102,
+   
+   NUM_SEVEN: 103,
+   
+   NUM_EIGHT: 104,
+   
+   NUM_NINE: 105,
+   
+   NUM_MULTIPLY: 106,
+   
+   NUM_PLUS: 107,
+   
+   NUM_MINUS: 109,
+   
+   NUM_PERIOD: 110,
+   
+   NUM_DIVISION: 111,
+   
+   F1: 112,
+   
+   F2: 113,
+   
+   F3: 114,
+   
+   F4: 115,
+   
+   F5: 116,
+   
+   F6: 117,
+   
+   F7: 118,
+   
+   F8: 119,
+   
+   F9: 120,
+   
+   F10: 121,
+   
+   F11: 122,
+   
+   F12: 123,
+
+   
+   isNavKeyPress : function(){
+       var me = this,
+           k = this.normalizeKey(me.keyCode);
+       return (k >= 33 && k <= 40) ||  
+       k == me.RETURN ||
+       k == me.TAB ||
+       k == me.ESC;
+   },
+
+   isSpecialKey : function(){
+       var k = this.normalizeKey(this.keyCode);
+       return (this.type == 'keypress' && this.ctrlKey) ||
+       this.isNavKeyPress() ||
+       (k == this.BACKSPACE) || 
+       (k >= 16 && k <= 20) || 
+       (k >= 44 && k <= 46);   
+   },
+
+   getPoint : function(){
+       return new Ext.lib.Point(this.xy[0], this.xy[1]);
+   },
+
+   
+   hasModifier : function(){
+       return ((this.ctrlKey || this.altKey) || this.shiftKey);
+   }
+});
+Ext.Element.addMethods({
+    
+    swallowEvent : function(eventName, preventDefault) {
+        var me = this;
+        function fn(e) {
+            e.stopPropagation();
+            if (preventDefault) {
+                e.preventDefault();
+            }
+        }
+        
+        if (Ext.isArray(eventName)) {
+            Ext.each(eventName, function(e) {
+                 me.on(e, fn);
+            });
+            return me;
+        }
+        me.on(eventName, fn);
+        return me;
+    },
+
+    
+    relayEvent : function(eventName, observable) {
+        this.on(eventName, function(e) {
+            observable.fireEvent(eventName, e);
+        });
+    },
+
+    
+    clean : function(forceReclean) {
+        var me  = this,
+            dom = me.dom,
+            n   = dom.firstChild,
+            ni  = -1;
+
+        if (Ext.Element.data(dom, 'isCleaned') && forceReclean !== true) {
+            return me;
+        }
+
+        while (n) {
+            var nx = n.nextSibling;
+            if (n.nodeType == 3 && !(/\S/.test(n.nodeValue))) {
+                dom.removeChild(n);
+            } else {
+                n.nodeIndex = ++ni;
+            }
+            n = nx;
+        }
+        
+        Ext.Element.data(dom, 'isCleaned', true);
+        return me;
+    },
+
+    
+    load : function() {
+        var updateManager = this.getUpdater();
+        updateManager.update.apply(updateManager, arguments);
+        
+        return this;
+    },
+
+    
+    getUpdater : function() {
+        return this.updateManager || (this.updateManager = new Ext.Updater(this));
+    },
+
+    
+    update : function(html, loadScripts, callback) {
+        if (!this.dom) {
+            return this;
+        }
+        html = html || "";
+
+        if (loadScripts !== true) {
+            this.dom.innerHTML = html;
+            if (typeof callback == 'function') {
+                callback();
+            }
+            return this;
+        }
+
+        var id  = Ext.id(),
+            dom = this.dom;
+
+        html += '<span id="' + id + '"></span>';
+
+        Ext.lib.Event.onAvailable(id, function() {
+            var DOC    = document,
+                hd     = DOC.getElementsByTagName("head")[0],
+                re     = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig,
+                srcRe  = /\ssrc=([\'\"])(.*?)\1/i,
+                typeRe = /\stype=([\'\"])(.*?)\1/i,
+                match,
+                attrs,
+                srcMatch,
+                typeMatch,
+                el,
+                s;
+
+            while ((match = re.exec(html))) {
+                attrs = match[1];
+                srcMatch = attrs ? attrs.match(srcRe) : false;
+                if (srcMatch && srcMatch[2]) {
+                   s = DOC.createElement("script");
+                   s.src = srcMatch[2];
+                   typeMatch = attrs.match(typeRe);
+                   if (typeMatch && typeMatch[2]) {
+                       s.type = typeMatch[2];
+                   }
+                   hd.appendChild(s);
+                } else if (match[2] && match[2].length > 0) {
+                    if (window.execScript) {
+                       window.execScript(match[2]);
+                    } else {
+                       window.eval(match[2]);
+                    }
+                }
+            }
+            
+            el = DOC.getElementById(id);
+            if (el) {
+                Ext.removeNode(el);
+            }
+            
+            if (typeof callback == 'function') {
+                callback();
+            }
+        });
+        dom.innerHTML = html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, "");
+        return this;
+    },
+
+    
+    removeAllListeners : function() {
+        this.removeAnchor();
+        Ext.EventManager.removeAll(this.dom);
+        return this;
+    },
+
+    
+    createProxy : function(config, renderTo, matchBox) {
+        config = (typeof config == 'object') ? config : {tag : "div", cls: config};
+
+        var me = this,
+            proxy = renderTo ? Ext.DomHelper.append(renderTo, config, true) :
+                               Ext.DomHelper.insertBefore(me.dom, config, true);
+
+        if (matchBox && me.setBox && me.getBox) { 
+           proxy.setBox(me.getBox());
+        }
+        return proxy;
+    }
+});
+
+Ext.Element.prototype.getUpdateManager = Ext.Element.prototype.getUpdater;
+
+Ext.Element.addMethods({
+    
+    getAnchorXY : function(anchor, local, s){
+        
+        
+               anchor = (anchor || "tl").toLowerCase();
+        s = s || {};
+        
+        var me = this,        
+               vp = me.dom == document.body || me.dom == document,
+               w = s.width || vp ? Ext.lib.Dom.getViewWidth() : me.getWidth(),
+               h = s.height || vp ? Ext.lib.Dom.getViewHeight() : me.getHeight(),                              
+               xy,             
+               r = Math.round,
+               o = me.getXY(),
+               scroll = me.getScroll(),
+               extraX = vp ? scroll.left : !local ? o[0] : 0,
+               extraY = vp ? scroll.top : !local ? o[1] : 0,
+               hash = {
+                       c  : [r(w * 0.5), r(h * 0.5)],
+                       t  : [r(w * 0.5), 0],
+                       l  : [0, r(h * 0.5)],
+                       r  : [w, r(h * 0.5)],
+                       b  : [r(w * 0.5), h],
+                       tl : [0, 0],    
+                       bl : [0, h],
+                       br : [w, h],
+                       tr : [w, 0]
+               };
+        
+        xy = hash[anchor];     
+        return [xy[0] + extraX, xy[1] + extraY]; 
+    },
+
+    
+    anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){        
+           var me = this,
+            dom = me.dom,
+            scroll = !Ext.isEmpty(monitorScroll),
+            action = function(){
+                Ext.fly(dom).alignTo(el, alignment, offsets, animate);
+                Ext.callback(callback, Ext.fly(dom));
+            },
+            anchor = this.getAnchor();
+            
+        
+        this.removeAnchor();
+        Ext.apply(anchor, {
+            fn: action,
+            scroll: scroll
+        });
+
+        Ext.EventManager.onWindowResize(action, null);
+        
+        if(scroll){
+            Ext.EventManager.on(window, 'scroll', action, null,
+                {buffer: !isNaN(monitorScroll) ? monitorScroll : 50});
+        }
+        action.call(me); 
+        return me;
+    },
+    
+    
+    removeAnchor : function(){
+        var me = this,
+            anchor = this.getAnchor();
+            
+        if(anchor && anchor.fn){
+            Ext.EventManager.removeResizeListener(anchor.fn);
+            if(anchor.scroll){
+                Ext.EventManager.un(window, 'scroll', anchor.fn);
+            }
+            delete anchor.fn;
+        }
+        return me;
+    },
+    
+    
+    getAnchor : function(){
+        var data = Ext.Element.data,
+            dom = this.dom;
+            if (!dom) {
+                return;
+            }
+            var anchor = data(dom, '_anchor');
+            
+        if(!anchor){
+            anchor = data(dom, '_anchor', {});
+        }
+        return anchor;
+    },
+
+    
+    getAlignToXY : function(el, p, o){     
+        el = Ext.get(el);
+        
+        if(!el || !el.dom){
+            throw "Element.alignToXY with an element that doesn't exist";
+        }
+        
+        o = o || [0,0];
+        p = (!p || p == "?" ? "tl-bl?" : (!(/-/).test(p) && p !== "" ? "tl-" + p : p || "tl-bl")).toLowerCase();       
+                
+        var me = this,
+               d = me.dom,
+               a1,
+               a2,
+               x,
+               y,
+               
+               w,
+               h,
+               r,
+               dw = Ext.lib.Dom.getViewWidth() -10, 
+               dh = Ext.lib.Dom.getViewHeight()-10, 
+               p1y,
+               p1x,            
+               p2y,
+               p2x,
+               swapY,
+               swapX,
+               doc = document,
+               docElement = doc.documentElement,
+               docBody = doc.body,
+               scrollX = (docElement.scrollLeft || docBody.scrollLeft || 0)+5,
+               scrollY = (docElement.scrollTop || docBody.scrollTop || 0)+5,
+               c = false, 
+               p1 = "", 
+               p2 = "",
+               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];
+
+        
+        
+        a1 = me.getAnchorXY(p1, true);
+        a2 = el.getAnchorXY(p2, false);
+
+        x = a2[0] - a1[0] + o[0];
+        y = a2[1] - a1[1] + o[1];
+
+        if(c){    
+              w = me.getWidth();
+           h = me.getHeight();
+           r = el.getRegion();       
+           
+           
+           
+           p1y = p1.charAt(0);
+           p1x = p1.charAt(p1.length-1);
+           p2y = p2.charAt(0);
+           p2x = p2.charAt(p2.length-1);
+           swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t"));
+           swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r"));          
+           
+
+           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];
+    },
+
+    
+    alignTo : function(element, position, offsets, animate){
+           var me = this;
+        return me.setXY(me.getAlignToXY(element, position, offsets),
+                               me.preanim && !!animate ? me.preanim(arguments, 3) : false);
+    },
+    
+    
+    adjustForConstraints : function(xy, parent, offsets){
+        return this.getConstrainToXY(parent || document, false, offsets, xy) ||  xy;
+    },
+
+    
+    getConstrainToXY : function(el, local, offsets, proposedXY){   
+           var os = {top:0, left:0, bottom:0, right: 0};
+
+        return function(el, local, offsets, proposedXY){
+            el = Ext.get(el);
+            offsets = offsets ? Ext.applyIf(offsets, os) : os;
+
+            var vw, vh, vx = 0, vy = 0;
+            if(el.dom == document.body || el.dom == document){
+                vw =Ext.lib.Dom.getViewWidth();
+                vh = Ext.lib.Dom.getViewHeight();
+            }else{
+                vw = el.dom.clientWidth;
+                vh = el.dom.clientHeight;
+                if(!local){
+                    var vxy = el.getXY();
+                    vx = vxy[0];
+                    vy = vxy[1];
+                }
+            }
+
+            var s = el.getScroll();
+
+            vx += offsets.left + s.left;
+            vy += offsets.top + s.top;
+
+            vw -= offsets.right;
+            vh -= offsets.bottom;
+
+            var vr = vx + vw,
+                vb = vy + vh,
+                xy = proposedXY || (!local ? this.getXY() : [this.getLeft(true), this.getTop(true)]),
+                x = xy[0], y = xy[1],
+                offset = this.getConstrainOffset(),
+                w = this.dom.offsetWidth + offset, 
+                h = this.dom.offsetHeight + offset;
+
+            
+            var moved = false;
+
+            
+            if((x + w) > vr){
+                x = vr - w;
+                moved = true;
+            }
+            if((y + h) > vb){
+                y = vb - h;
+                moved = true;
+            }
+            
+            if(x < vx){
+                x = vx;
+                moved = true;
+            }
+            if(y < vy){
+                y = vy;
+                moved = true;
+            }
+            return moved ? [x, y] : false;
+        };
+    }(),
+           
+           
+               
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    
+    getConstrainOffset : function(){
+        return 0;
+    },
+    
+    
+    getCenterXY : function(){
+        return this.getAlignToXY(document, 'c-c');
+    },
+
+    
+    center : function(centerIn){
+        return this.alignTo(centerIn || document, 'c-c');        
+    }    
+});
+
+Ext.Element.addMethods({
+    
+    select : function(selector, unique){
+        return Ext.Element.select(selector, unique, this.dom);
+    }
+});
+Ext.apply(Ext.Element.prototype, function() {
+       var GETDOM = Ext.getDom,
+               GET = Ext.get,
+               DH = Ext.DomHelper;
+       
+       return {        
+               
+           insertSibling: function(el, where, returnDom){
+               var me = this,
+                       rt,
+                isAfter = (where || 'before').toLowerCase() == 'after',
+                insertEl;
+                       
+               if(Ext.isArray(el)){
+                insertEl = me;
+                   Ext.each(el, function(e) {
+                           rt = Ext.fly(insertEl, '_internal').insertSibling(e, where, returnDom);
+                    if(isAfter){
+                        insertEl = rt;
+                    }
+                   });
+                   return rt;
+               }
+                       
+               el = el || {};
+               
+            if(el.nodeType || el.dom){
+                rt = me.dom.parentNode.insertBefore(GETDOM(el), isAfter ? me.dom.nextSibling : me.dom);
+                if (!returnDom) {
+                    rt = GET(rt);
+                }
+            }else{
+                if (isAfter && !me.dom.nextSibling) {
+                    rt = DH.append(me.dom.parentNode, el, !returnDom);
+                } else {                    
+                    rt = DH[isAfter ? 'insertAfter' : 'insertBefore'](me.dom, el, !returnDom);
+                }
+            }
+               return rt;
+           }
+    };
+}());
+
+
+Ext.Element.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>';
+
+Ext.Element.addMethods(function(){
+    var INTERNAL = "_internal",
+        pxMatch = /(\d+\.?\d+)px/;
+    return {
+        
+        applyStyles : function(style){
+            Ext.DomHelper.applyStyles(this.dom, style);
+            return this;
+        },
+
+        
+        getStyles : function(){
+            var ret = {};
+            Ext.each(arguments, function(v) {
+               ret[v] = this.getStyle(v);
+            },
+            this);
+            return ret;
+        },
+
+        
+        setOverflow : function(v){
+            var dom = this.dom;
+            if(v=='auto' && Ext.isMac && Ext.isGecko2){ 
+                dom.style.overflow = 'hidden';
+                (function(){dom.style.overflow = 'auto';}).defer(1);
+            }else{
+                dom.style.overflow = v;
+            }
+        },
+
+       
+        boxWrap : function(cls){
+            cls = cls || 'x-box';
+            var el = Ext.get(this.insertHtml("beforeBegin", "<div class='" + cls + "'>" + String.format(Ext.Element.boxMarkup, cls) + "</div>"));        
+            Ext.DomQuery.selectNode('.' + cls + '-mc', el.dom).appendChild(this.dom);
+            return el;
+        },
+
+        
+        setSize : function(width, height, animate){
+            var me = this;
+            if(typeof width == 'object'){ 
+                height = width.height;
+                width = width.width;
+            }
+            width = me.adjustWidth(width);
+            height = me.adjustHeight(height);
+            if(!animate || !me.anim){
+                me.dom.style.width = me.addUnits(width);
+                me.dom.style.height = me.addUnits(height);
+            }else{
+                me.anim({width: {to: width}, height: {to: height}}, me.preanim(arguments, 2));
+            }
+            return me;
+        },
+
+        
+        getComputedHeight : function(){
+            var me = this,
+                h = Math.max(me.dom.offsetHeight, me.dom.clientHeight);
+            if(!h){
+                h = parseFloat(me.getStyle('height')) || 0;
+                if(!me.isBorderBox()){
+                    h += me.getFrameWidth('tb');
+                }
+            }
+            return h;
+        },
+
+        
+        getComputedWidth : function(){
+            var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth);
+            if(!w){
+                w = parseFloat(this.getStyle('width')) || 0;
+                if(!this.isBorderBox()){
+                    w += this.getFrameWidth('lr');
+                }
+            }
+            return w;
+        },
+
+        
+        getFrameWidth : function(sides, onlyContentBox){
+            return onlyContentBox && this.isBorderBox() ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides));
+        },
+
+        
+        addClassOnOver : function(className){
+            this.hover(
+                function(){
+                    Ext.fly(this, INTERNAL).addClass(className);
+                },
+                function(){
+                    Ext.fly(this, INTERNAL).removeClass(className);
+                }
+            );
+            return this;
+        },
+
+        
+        addClassOnFocus : function(className){
+            this.on("focus", function(){
+                Ext.fly(this, INTERNAL).addClass(className);
+            }, this.dom);
+            this.on("blur", function(){
+                Ext.fly(this, INTERNAL).removeClass(className);
+            }, this.dom);
+            return this;
+        },
+
+        
+        addClassOnClick : function(className){
+            var dom = this.dom;
+            this.on("mousedown", function(){
+                Ext.fly(dom, INTERNAL).addClass(className);
+                var d = Ext.getDoc(),
+                    fn = function(){
+                        Ext.fly(dom, INTERNAL).removeClass(className);
+                        d.removeListener("mouseup", fn);
+                    };
+                d.on("mouseup", fn);
+            });
+            return this;
+        },
+
+        
+
+        getViewSize : function(){
+            var doc = document,
+                d = this.dom,
+                isDoc = (d == doc || d == doc.body);
+
+            
+            if (isDoc) {
+                var extdom = Ext.lib.Dom;
+                return {
+                    width : extdom.getViewWidth(),
+                    height : extdom.getViewHeight()
+                };
+
+            
+            } else {
+                return {
+                    width : d.clientWidth,
+                    height : d.clientHeight
+                };
+            }
+        },
+
+        
+
+        getStyleSize : function(){
+            var me = this,
+                w, h,
+                doc = document,
+                d = this.dom,
+                isDoc = (d == doc || d == doc.body),
+                s = d.style;
+
+            
+            if (isDoc) {
+                var extdom = Ext.lib.Dom;
+                return {
+                    width : extdom.getViewWidth(),
+                    height : extdom.getViewHeight()
+                };
+            }
+            
+            if(s.width && s.width != 'auto'){
+                w = parseFloat(s.width);
+                if(me.isBorderBox()){
+                   w -= me.getFrameWidth('lr');
+                }
+            }
+            
+            if(s.height && s.height != 'auto'){
+                h = parseFloat(s.height);
+                if(me.isBorderBox()){
+                   h -= me.getFrameWidth('tb');
+                }
+            }
+            
+            return {width: w || me.getWidth(true), height: h || me.getHeight(true)};
+        },
+
+        
+        getSize : function(contentSize){
+            return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)};
+        },
+
+        
+        repaint : function(){
+            var dom = this.dom;
+            this.addClass("x-repaint");
+            setTimeout(function(){
+                Ext.fly(dom).removeClass("x-repaint");
+            }, 1);
+            return this;
+        },
+
+        
+        unselectable : function(){
+            this.dom.unselectable = "on";
+            return this.swallowEvent("selectstart", true).
+                        applyStyles("-moz-user-select:none;-khtml-user-select:none;").
+                        addClass("x-unselectable");
+        },
+
+        
+        getMargins : function(side){
+            var me = this,
+                key,
+                hash = {t:"top", l:"left", r:"right", b: "bottom"},
+                o = {};
+
+            if (!side) {
+                for (key in me.margins){
+                    o[hash[key]] = parseFloat(me.getStyle(me.margins[key])) || 0;
+                }
+                return o;
+            } else {
+                return me.addStyles.call(me, side, me.margins);
+            }
+        }
+    };
+}());
+
+Ext.Element.addMethods({
+    
+    setBox : function(box, adjust, animate){
+        var me = this,
+               w = box.width, 
+               h = box.height;
+        if((adjust && !me.autoBoxAdjust) && !me.isBorderBox()){
+           w -= (me.getBorderWidth("lr") + me.getPadding("lr"));
+           h -= (me.getBorderWidth("tb") + me.getPadding("tb"));
+        }
+        me.setBounds(box.x, box.y, w, h, me.animTest.call(me, arguments, animate, 2));
+        return me;
+    },
+
+    
+       getBox : function(contentBox, local) {      
+           var me = this,
+               xy,
+               left,
+               top,
+               getBorderWidth = me.getBorderWidth,
+               getPadding = me.getPadding, 
+               l,
+               r,
+               t,
+               b;
+        if(!local){
+            xy = me.getXY();
+        }else{
+            left = parseInt(me.getStyle("left"), 10) || 0;
+            top = parseInt(me.getStyle("top"), 10) || 0;
+            xy = [left, top];
+        }
+        var el = me.dom, w = el.offsetWidth, h = el.offsetHeight, bx;
+        if(!contentBox){
+            bx = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: w, height: h};
+        }else{
+            l = getBorderWidth.call(me, "l") + getPadding.call(me, "l");
+            r = getBorderWidth.call(me, "r") + getPadding.call(me, "r");
+            t = getBorderWidth.call(me, "t") + getPadding.call(me, "t");
+            b = getBorderWidth.call(me, "b") + getPadding.call(me, "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;
+       },
+       
+    
+     move : function(direction, distance, animate){
+        var me = this,         
+               xy = me.getXY(),
+               x = xy[0],
+               y = xy[1],              
+               left = [x - distance, y],
+               right = [x + distance, y],
+               top = [x, y - distance],
+               bottom = [x, y + distance],
+               hash = {
+                       l :     left,
+                       left : left,
+                       r : right,
+                       right : right,
+                       t : top,
+                       top : top,
+                       up : top,
+                       b : bottom, 
+                       bottom : bottom,
+                       down : bottom                           
+               };
+        
+           direction = direction.toLowerCase();    
+           me.moveTo(hash[direction][0], hash[direction][1], me.animTest.call(me, arguments, animate, 2));
+    },
+    
+    
+     setLeftTop : function(left, top){
+           var me = this,
+               style = me.dom.style;
+        style.left = me.addUnits(left);
+        style.top = me.addUnits(top);
+        return me;
+    },
+    
+    
+    getRegion : function(){
+        return Ext.lib.Dom.getRegion(this.dom);
+    },
+    
+    
+    setBounds : function(x, y, width, height, animate){
+           var me = this;
+        if (!animate || !me.anim) {
+            me.setSize(width, height);
+            me.setLocation(x, y);
+        } else {
+            me.anim({points: {to: [x, y]}, 
+                        width: {to: me.adjustWidth(width)}, 
+                        height: {to: me.adjustHeight(height)}},
+                     me.preanim(arguments, 4), 
+                     'motion');
+        }
+        return me;
+    },
+
+    
+    setRegion : function(region, animate) {
+        return this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, this.animTest.call(this, arguments, animate, 1));
+    }
+});
+Ext.Element.addMethods({
+    
+    scrollTo : function(side, value, animate) {
+        
+        var top = /top/i.test(side),
+            me = this,
+            dom = me.dom,
+            prop;
+        if (!animate || !me.anim) {
+            
+            prop = 'scroll' + (top ? 'Top' : 'Left');
+            dom[prop] = value;
+        }
+        else {
+            
+            prop = 'scroll' + (top ? 'Left' : 'Top');
+            me.anim({scroll: {to: top ? [dom[prop], value] : [value, dom[prop]]}}, me.preanim(arguments, 2), 'scroll');
+        }
+        return me;
+    },
+    
+    
+    scrollIntoView : function(container, hscroll) {
+        var c = Ext.getDom(container) || Ext.getBody().dom,
+            el = this.dom,
+            o = this.getOffsetsTo(c),
+            l = o[0] + c.scrollLeft,
+            t = o[1] + c.scrollTop,
+            b = t + el.offsetHeight,
+            r = l + el.offsetWidth,
+            ch = c.clientHeight,
+            ct = parseInt(c.scrollTop, 10),
+            cl = parseInt(c.scrollLeft, 10),
+            cb = ct + ch,
+            cr = cl + c.clientWidth;
+
+        if (el.offsetHeight > ch || t < ct) {
+            c.scrollTop = t;
+        }
+        else if (b > cb) {
+            c.scrollTop = b-ch;
+        }
+        
+        c.scrollTop = c.scrollTop;
+
+        if (hscroll !== false) {
+            if (el.offsetWidth > c.clientWidth || l < cl) {
+                c.scrollLeft = l;
+            }
+            else if (r > cr) {
+                c.scrollLeft = r - c.clientWidth;
+            }
+            c.scrollLeft = c.scrollLeft;
+        }
+        return this;
+    },
+
+    
+    scrollChildIntoView : function(child, hscroll) {
+        Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll);
+    },
+    
+    
+     scroll : function(direction, distance, animate) {
+        if (!this.isScrollable()) {
+            return false;
+        }
+        var el = this.dom,
+            l = el.scrollLeft, t = el.scrollTop,
+            w = el.scrollWidth, h = el.scrollHeight,
+            cw = el.clientWidth, ch = el.clientHeight,
+            scrolled = false, v,
+            hash = {
+                l: Math.min(l + distance, w-cw),
+                r: v = Math.max(l - distance, 0),
+                t: Math.max(t - distance, 0),
+                b: Math.min(t + distance, h-ch)
+            };
+            hash.d = hash.b;
+            hash.u = hash.t;
+        
+        direction = direction.substr(0, 1);
+        if ((v = hash[direction]) > -1) {
+            scrolled = true;
+            this.scrollTo(direction == 'l' || direction == 'r' ? 'left' : 'top', v, this.preanim(arguments, 2));
+        }
+        return scrolled;
+    }
+});
+Ext.Element.addMethods(
+    function() {
+        var VISIBILITY      = "visibility",
+            DISPLAY         = "display",
+            HIDDEN          = "hidden",
+            NONE            = "none",
+            XMASKED         = "x-masked",
+            XMASKEDRELATIVE = "x-masked-relative",
+            data            = Ext.Element.data;
+
+        return {
+            
+            isVisible : function(deep) {
+                var vis = !this.isStyle(VISIBILITY, HIDDEN) && !this.isStyle(DISPLAY, NONE),
+                    p   = this.dom.parentNode;
+                
+                if (deep !== true || !vis) {
+                    return vis;
+                }
+                
+                while (p && !(/^body/i.test(p.tagName))) {
+                    if (!Ext.fly(p, '_isVisible').isVisible()) {
+                        return false;
+                    }
+                    p = p.parentNode;
+                }
+                return true;
+            },
+
+            
+            isDisplayed : function() {
+                return !this.isStyle(DISPLAY, NONE);
+            },
+
+            
+            enableDisplayMode : function(display) {
+                this.setVisibilityMode(Ext.Element.DISPLAY);
+                
+                if (!Ext.isEmpty(display)) {
+                    data(this.dom, 'originalDisplay', display);
+                }
+                
+                return this;
+            },
+
+            
+            mask : function(msg, msgCls) {
+                var me  = this,
+                    dom = me.dom,
+                    dh  = Ext.DomHelper,
+                    EXTELMASKMSG = "ext-el-mask-msg",
+                    el,
+                    mask;
+
+                if (!(/^body/i.test(dom.tagName) && me.getStyle('position') == 'static')) {
+                    me.addClass(XMASKEDRELATIVE);
+                }
+                if (el = data(dom, 'maskMsg')) {
+                    el.remove();
+                }
+                if (el = data(dom, 'mask')) {
+                    el.remove();
+                }
+
+                mask = dh.append(dom, {cls : "ext-el-mask"}, true);
+                data(dom, 'mask', mask);
+
+                me.addClass(XMASKED);
+                mask.setDisplayed(true);
+                
+                if (typeof msg == 'string') {
+                    var mm = dh.append(dom, {cls : EXTELMASKMSG, cn:{tag:'div'}}, true);
+                    data(dom, 'maskMsg', mm);
+                    mm.dom.className = msgCls ? EXTELMASKMSG + " " + msgCls : EXTELMASKMSG;
+                    mm.dom.firstChild.innerHTML = msg;
+                    mm.setDisplayed(true);
+                    mm.center(me);
+                }
+                
+                
+                if (Ext.isIE && !(Ext.isIE7 && Ext.isStrict) && me.getStyle('height') == 'auto') {
+                    mask.setSize(undefined, me.getHeight());
+                }
+                
+                return mask;
+            },
+
+            
+            unmask : function() {
+                var me      = this,
+                    dom     = me.dom,
+                    mask    = data(dom, 'mask'),
+                    maskMsg = data(dom, 'maskMsg');
+
+                if (mask) {
+                    if (maskMsg) {
+                        maskMsg.remove();
+                        data(dom, 'maskMsg', undefined);
+                    }
+                    
+                    mask.remove();
+                    data(dom, 'mask', undefined);
+                    me.removeClass([XMASKED, XMASKEDRELATIVE]);
+                }
+            },
+
+            
+            isMasked : function() {
+                var m = data(this.dom, 'mask');
+                return m && m.isVisible();
+            },
+
+            
+            createShim : function() {
+                var el = document.createElement('iframe'),
+                    shim;
+                
+                el.frameBorder = '0';
+                el.className = 'ext-shim';
+                el.src = Ext.SSL_SECURE_URL;
+                shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom));
+                shim.autoBoxAdjust = false;
+                return shim;
+            }
+        };
+    }()
+);
+Ext.Element.addMethods({
+    
+    addKeyListener : function(key, fn, scope){
+        var config;
+        if(typeof key != 'object' || Ext.isArray(key)){
+            config = {
+                key: key,
+                fn: fn,
+                scope: scope
+            };
+        }else{
+            config = {
+                key : key.key,
+                shift : key.shift,
+                ctrl : key.ctrl,
+                alt : key.alt,
+                fn: fn,
+                scope: scope
+            };
+        }
+        return new Ext.KeyMap(this, config);
+    },
+
+    
+    addKeyMap : function(config){
+        return new Ext.KeyMap(this, config);
+    }
+});
+
+
+
+Ext.CompositeElementLite.importElementMethods();
+Ext.apply(Ext.CompositeElementLite.prototype, {
+    addElements : function(els, root){
+        if(!els){
+            return this;
+        }
+        if(typeof els == "string"){
+            els = Ext.Element.selectorFunction(els, root);
+        }
+        var yels = this.elements;
+        Ext.each(els, function(e) {
+            yels.push(Ext.get(e));
+        });
+        return this;
+    },
+
+    
+    first : function(){
+        return this.item(0);
+    },
+
+    
+    last : function(){
+        return this.item(this.getCount()-1);
+    },
+
+    
+    contains : function(el){
+        return this.indexOf(el) != -1;
+    },
+
+    
+    removeElement : function(keys, removeDom){
+        var me = this,
+            els = this.elements,
+            el;
+        Ext.each(keys, function(val){
+            if ((el = (els[val] || els[val = me.indexOf(val)]))) {
+                if(removeDom){
+                    if(el.dom){
+                        el.remove();
+                    }else{
+                        Ext.removeNode(el);
+                    }
+                }
+                els.splice(val, 1);
+            }
+        });
+        return this;
+    }
+});
+
+Ext.CompositeElement = Ext.extend(Ext.CompositeElementLite, {
+    
+    constructor : function(els, root){
+        this.elements = [];
+        this.add(els, root);
+    },
+    
+    
+    getElement : function(el){
+        
+        return el;
+    },
+    
+    
+    transformElement : function(el){
+        return Ext.get(el);
+    }
+
+    
+
+    
+
+    
+});
+
+
+Ext.Element.select = function(selector, unique, root){
+    var els;
+    if(typeof selector == "string"){
+        els = Ext.Element.selectorFunction(selector, root);
+    }else if(selector.length !== undefined){
+        els = selector;
+    }else{
+        throw "Invalid selector";
+    }
+
+    return (unique === true) ? new Ext.CompositeElement(els) : new Ext.CompositeElementLite(els);
+};
+
+
+Ext.select = Ext.Element.select;
+Ext.UpdateManager = Ext.Updater = Ext.extend(Ext.util.Observable,
+function() {
+    var BEFOREUPDATE = "beforeupdate",
+        UPDATE = "update",
+        FAILURE = "failure";
+
+    
+    function processSuccess(response){
+        var me = this;
+        me.transaction = null;
+        if (response.argument.form && response.argument.reset) {
+            try { 
+                response.argument.form.reset();
+            } catch(e){}
+        }
+        if (me.loadScripts) {
+            me.renderer.render(me.el, response, me,
+               updateComplete.createDelegate(me, [response]));
+        } else {
+            me.renderer.render(me.el, response, me);
+            updateComplete.call(me, response);
+        }
+    }
+
+    
+    function updateComplete(response, type, success){
+        this.fireEvent(type || UPDATE, this.el, response);
+        if(Ext.isFunction(response.argument.callback)){
+            response.argument.callback.call(response.argument.scope, this.el, Ext.isEmpty(success) ? true : false, response, response.argument.options);
+        }
+    }
+
+    
+    function processFailure(response){
+        updateComplete.call(this, response, FAILURE, !!(this.transaction = null));
+    }
+
+    return {
+        constructor: function(el, forceNew){
+            var me = this;
+            el = Ext.get(el);
+            if(!forceNew && el.updateManager){
+                return el.updateManager;
+            }
+            
+            me.el = el;
+            
+            me.defaultUrl = null;
+
+            me.addEvents(
+                
+                BEFOREUPDATE,
+                
+                UPDATE,
+                
+                FAILURE
+            );
+
+            Ext.apply(me, Ext.Updater.defaults);
+            
+            
+            
+            
+            
+            
+
+            
+            me.transaction = null;
+            
+            me.refreshDelegate = me.refresh.createDelegate(me);
+            
+            me.updateDelegate = me.update.createDelegate(me);
+            
+            me.formUpdateDelegate = (me.formUpdate || function(){}).createDelegate(me);
+
+            
+            me.renderer = me.renderer || me.getDefaultRenderer();
+
+            Ext.Updater.superclass.constructor.call(me);
+        },
+
+        
+        setRenderer : function(renderer){
+            this.renderer = renderer;
+        },
+
+        
+        getRenderer : function(){
+           return this.renderer;
+        },
+
+        
+        getDefaultRenderer: function() {
+            return new Ext.Updater.BasicRenderer();
+        },
+
+        
+        setDefaultUrl : function(defaultUrl){
+            this.defaultUrl = defaultUrl;
+        },
+
+        
+        getEl : function(){
+            return this.el;
+        },
+
+        
+        update : function(url, params, callback, discardUrl){
+            var me = this,
+                cfg,
+                callerScope;
+
+            if(me.fireEvent(BEFOREUPDATE, me.el, url, params) !== false){
+                if(Ext.isObject(url)){ 
+                    cfg = url;
+                    url = cfg.url;
+                    params = params || cfg.params;
+                    callback = callback || cfg.callback;
+                    discardUrl = discardUrl || cfg.discardUrl;
+                    callerScope = cfg.scope;
+                    if(!Ext.isEmpty(cfg.nocache)){me.disableCaching = cfg.nocache;};
+                    if(!Ext.isEmpty(cfg.text)){me.indicatorText = '<div class="loading-indicator">'+cfg.text+"</div>";};
+                    if(!Ext.isEmpty(cfg.scripts)){me.loadScripts = cfg.scripts;};
+                    if(!Ext.isEmpty(cfg.timeout)){me.timeout = cfg.timeout;};
+                }
+                me.showLoading();
+
+                if(!discardUrl){
+                    me.defaultUrl = url;
+                }
+                if(Ext.isFunction(url)){
+                    url = url.call(me);
+                }
+
+                var o = Ext.apply({}, {
+                    url : url,
+                    params: (Ext.isFunction(params) && callerScope) ? params.createDelegate(callerScope) : params,
+                    success: processSuccess,
+                    failure: processFailure,
+                    scope: me,
+                    callback: undefined,
+                    timeout: (me.timeout*1000),
+                    disableCaching: me.disableCaching,
+                    argument: {
+                        "options": cfg,
+                        "url": url,
+                        "form": null,
+                        "callback": callback,
+                        "scope": callerScope || window,
+                        "params": params
+                    }
+                }, cfg);
+
+                me.transaction = Ext.Ajax.request(o);
+            }
+        },
+
+        
+        formUpdate : function(form, url, reset, callback){
+            var me = this;
+            if(me.fireEvent(BEFOREUPDATE, me.el, form, url) !== false){
+                if(Ext.isFunction(url)){
+                    url = url.call(me);
+                }
+                form = Ext.getDom(form);
+                me.transaction = Ext.Ajax.request({
+                    form: form,
+                    url:url,
+                    success: processSuccess,
+                    failure: processFailure,
+                    scope: me,
+                    timeout: (me.timeout*1000),
+                    argument: {
+                        "url": url,
+                        "form": form,
+                        "callback": callback,
+                        "reset": reset
+                    }
+                });
+                me.showLoading.defer(1, me);
+            }
+        },
+
+        
+        startAutoRefresh : function(interval, url, params, callback, refreshNow){
+            var me = this;
+            if(refreshNow){
+                me.update(url || me.defaultUrl, params, callback, true);
+            }
+            if(me.autoRefreshProcId){
+                clearInterval(me.autoRefreshProcId);
+            }
+            me.autoRefreshProcId = setInterval(me.update.createDelegate(me, [url || me.defaultUrl, params, callback, true]), interval * 1000);
+        },
+
+        
+        stopAutoRefresh : function(){
+            if(this.autoRefreshProcId){
+                clearInterval(this.autoRefreshProcId);
+                delete this.autoRefreshProcId;
+            }
+        },
+
+        
+        isAutoRefreshing : function(){
+           return !!this.autoRefreshProcId;
+        },
+
+        
+        showLoading : function(){
+            if(this.showLoadIndicator){
+                this.el.dom.innerHTML = this.indicatorText;
+            }
+        },
+
+        
+        abort : function(){
+            if(this.transaction){
+                Ext.Ajax.abort(this.transaction);
+            }
+        },
+
+        
+        isUpdating : function(){
+            return this.transaction ? Ext.Ajax.isLoading(this.transaction) : false;
+        },
+
+        
+        refresh : function(callback){
+            if(this.defaultUrl){
+                this.update(this.defaultUrl, null, callback, true);
+            }
+        }
+    };
+}());
+
+
+Ext.Updater.defaults = {
+   
+    timeout : 30,
+    
+    disableCaching : false,
+    
+    showLoadIndicator : true,
+    
+    indicatorText : '<div class="loading-indicator">Loading...</div>',
+     
+    loadScripts : false,
+    
+    sslBlankUrl : Ext.SSL_SECURE_URL
+};
+
+
+
+Ext.Updater.updateElement = function(el, url, params, options){
+    var um = Ext.get(el).getUpdater();
+    Ext.apply(um, options);
+    um.update(url, params, options ? options.callback : null);
+};
+
+
+Ext.Updater.BasicRenderer = function(){};
+
+Ext.Updater.BasicRenderer.prototype = {
+    
+     render : function(el, response, updateManager, callback){
+        el.update(response.responseText, updateManager.loadScripts, callback);
+    }
+};
+
+
+
+(function() {
+
+
+Date.useStrict = false;
+
+
+
+
+
+function xf(format) {
+    var args = Array.prototype.slice.call(arguments, 1);
+    return format.replace(/\{(\d+)\}/g, function(m, i) {
+        return args[i];
+    });
+}
+
+
+
+Date.formatCodeToRegex = function(character, currentGroup) {
+    
+    var p = Date.parseCodes[character];
+
+    if (p) {
+      p = typeof p == 'function'? p() : p;
+      Date.parseCodes[character] = p; 
+    }
+
+    return p ? Ext.applyIf({
+      c: p.c ? xf(p.c, currentGroup || "{0}") : p.c
+    }, p) : {
+        g:0,
+        c:null,
+        s:Ext.escapeRe(character) 
+    };
+};
+
+
+var $f = Date.formatCodeToRegex;
+
+Ext.apply(Date, {
+    
+    parseFunctions: {
+        "M$": function(input, strict) {
+            
+            
+            var re = new RegExp('\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/');
+            var r = (input || '').match(re);
+            return r? new Date(((r[1] || '') + r[2]) * 1) : null;
+        }
+    },
+    parseRegexes: [],
+
+    
+    formatFunctions: {
+        "M$": function() {
+            
+            return '\\/Date(' + this.getTime() + ')\\/';
+        }
+    },
+
+    y2kYear : 50,
+
+    
+    MILLI : "ms",
+
+    
+    SECOND : "s",
+
+    
+    MINUTE : "mi",
+
+    
+    HOUR : "h",
+
+    
+    DAY : "d",
+
+    
+    MONTH : "mo",
+
+    
+    YEAR : "y",
+
+    
+    defaults: {},
+
+    
+    dayNames : [
+        "Sunday",
+        "Monday",
+        "Tuesday",
+        "Wednesday",
+        "Thursday",
+        "Friday",
+        "Saturday"
+    ],
+
+    
+    monthNames : [
+        "January",
+        "February",
+        "March",
+        "April",
+        "May",
+        "June",
+        "July",
+        "August",
+        "September",
+        "October",
+        "November",
+        "December"
+    ],
+
+    
+    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
+    },
+
+    
+    getShortMonthName : function(month) {
+        return Date.monthNames[month].substring(0, 3);
+    },
+
+    
+    getShortDayName : function(day) {
+        return Date.dayNames[day].substring(0, 3);
+    },
+
+    
+    getMonthNumber : function(name) {
+        
+        return Date.monthNumbers[name.substring(0, 1).toUpperCase() + name.substring(1, 3).toLowerCase()];
+    },
+
+    
+    formatCodes : {
+        d: "String.leftPad(this.getDate(), 2, '0')",
+        D: "Date.getShortDayName(this.getDay())", 
+        j: "this.getDate()",
+        l: "Date.dayNames[this.getDay()]",
+        N: "(this.getDay() ? this.getDay() : 7)",
+        S: "this.getSuffix()",
+        w: "this.getDay()",
+        z: "this.getDayOfYear()",
+        W: "String.leftPad(this.getWeekOfYear(), 2, '0')",
+        F: "Date.monthNames[this.getMonth()]",
+        m: "String.leftPad(this.getMonth() + 1, 2, '0')",
+        M: "Date.getShortMonthName(this.getMonth())", 
+        n: "(this.getMonth() + 1)",
+        t: "this.getDaysInMonth()",
+        L: "(this.isLeapYear() ? 1 : 0)",
+        o: "(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0)))",
+        Y: "String.leftPad(this.getFullYear(), 4, '0')",
+        y: "('' + this.getFullYear()).substring(2, 4)",
+        a: "(this.getHours() < 12 ? 'am' : 'pm')",
+        A: "(this.getHours() < 12 ? 'AM' : 'PM')",
+        g: "((this.getHours() % 12) ? this.getHours() % 12 : 12)",
+        G: "this.getHours()",
+        h: "String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",
+        H: "String.leftPad(this.getHours(), 2, '0')",
+        i: "String.leftPad(this.getMinutes(), 2, '0')",
+        s: "String.leftPad(this.getSeconds(), 2, '0')",
+        u: "String.leftPad(this.getMilliseconds(), 3, '0')",
+        O: "this.getGMTOffset()",
+        P: "this.getGMTOffset(true)",
+        T: "this.getTimezone()",
+        Z: "(this.getTimezoneOffset() * -60)",
+
+        c: function() { 
+            for (var c = "Y-m-dTH:i:sP", code = [], i = 0, l = c.length; i < l; ++i) {
+                var e = c.charAt(i);
+                code.push(e == "T" ? "'T'" : Date.getFormatCode(e)); 
+            }
+            return code.join(" + ");
+        },
+        
+
+        U: "Math.round(this.getTime() / 1000)"
+    },
+
+    
+    isValid : function(y, m, d, h, i, s, ms) {
+        
+        h = h || 0;
+        i = i || 0;
+        s = s || 0;
+        ms = ms || 0;
+
+        
+        var dt = new Date(y < 100 ? 100 : y, m - 1, d, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);
+
+        return y == dt.getFullYear() &&
+            m == dt.getMonth() + 1 &&
+            d == dt.getDate() &&
+            h == dt.getHours() &&
+            i == dt.getMinutes() &&
+            s == dt.getSeconds() &&
+            ms == dt.getMilliseconds();
+    },
+
+    
+    parseDate : function(input, format, strict) {
+        var p = Date.parseFunctions;
+        if (p[format] == null) {
+            Date.createParser(format);
+        }
+        return p[format](input, Ext.isDefined(strict) ? strict : Date.useStrict);
+    },
+
+    
+    getFormatCode : function(character) {
+        var f = Date.formatCodes[character];
+
+        if (f) {
+          f = typeof f == 'function'? f() : f;
+          Date.formatCodes[character] = f; 
+        }
+
+        
+        return f || ("'" + String.escape(character) + "'");
+    },
+
+    
+    createFormat : function(format) {
+        var code = [],
+            special = false,
+            ch = '';
+
+        for (var i = 0; i < format.length; ++i) {
+            ch = format.charAt(i);
+            if (!special && ch == "\\") {
+                special = true;
+            } else if (special) {
+                special = false;
+                code.push("'" + String.escape(ch) + "'");
+            } else {
+                code.push(Date.getFormatCode(ch));
+            }
+        }
+        Date.formatFunctions[format] = new Function("return " + code.join('+'));
+    },
+
+    
+    createParser : function() {
+        var code = [
+            "var dt, y, m, d, h, i, s, ms, o, z, zz, u, v,",
+                "def = Date.defaults,",
+                "results = String(input).match(Date.parseRegexes[{0}]);", 
+
+            "if(results){",
+                "{1}",
+
+                "if(u != null){", 
+                    "v = new Date(u * 1000);", 
+                "}else{",
+                    
+                    
+                    
+                    "dt = (new Date()).clearTime();",
+
+                    
+                    "y = Ext.num(y, Ext.num(def.y, dt.getFullYear()));",
+                    "m = Ext.num(m, Ext.num(def.m - 1, dt.getMonth()));",
+                    "d = Ext.num(d, Ext.num(def.d, dt.getDate()));",
+
+                    
+                    "h  = Ext.num(h, Ext.num(def.h, dt.getHours()));",
+                    "i  = Ext.num(i, Ext.num(def.i, dt.getMinutes()));",
+                    "s  = Ext.num(s, Ext.num(def.s, dt.getSeconds()));",
+                    "ms = Ext.num(ms, Ext.num(def.ms, dt.getMilliseconds()));",
+
+                    "if(z >= 0 && y >= 0){",
+                        
+                        
+
+                        
+                        
+                        "v = new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);",
+
+                        
+                        "v = !strict? v : (strict === true && (z <= 364 || (v.isLeapYear() && z <= 365))? v.add(Date.DAY, z) : null);",
+                    "}else if(strict === true && !Date.isValid(y, m + 1, d, h, i, s, ms)){", 
+                        "v = null;", 
+                    "}else{",
+                        
+                        
+                        "v = new Date(y < 100 ? 100 : y, m, d, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);",
+                    "}",
+                "}",
+            "}",
+
+            "if(v){",
+                
+                "if(zz != null){",
+                    
+                    "v = v.add(Date.SECOND, -v.getTimezoneOffset() * 60 - zz);",
+                "}else if(o){",
+                    
+                    "v = v.add(Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));",
+                "}",
+            "}",
+
+            "return v;"
+        ].join('\n');
+
+        return function(format) {
+            var regexNum = Date.parseRegexes.length,
+                currentGroup = 1,
+                calc = [],
+                regex = [],
+                special = false,
+                ch = "",
+                i = 0,
+                obj,
+                last;
+
+            for (; i < format.length; ++i) {
+                ch = format.charAt(i);
+                if (!special && ch == "\\") {
+                    special = true;
+                } else if (special) {
+                    special = false;
+                    regex.push(String.escape(ch));
+                } else {
+                    obj = $f(ch, currentGroup);
+                    currentGroup += obj.g;
+                    regex.push(obj.s);
+                    if (obj.g && obj.c) {
+                        if (obj.calcLast) {
+                            last = obj.c;
+                        } else {
+                            calc.push(obj.c);
+                        }
+                    }
+                }
+            }
+            
+            if (last) {
+                calc.push(last);
+            }
+
+            Date.parseRegexes[regexNum] = new RegExp("^" + regex.join('') + "$", 'i');
+            Date.parseFunctions[format] = new Function("input", "strict", xf(code, regexNum, calc.join('')));
+        };
+    }(),
+
+    
+    parseCodes : {
+        
+        d: {
+            g:1,
+            c:"d = parseInt(results[{0}], 10);\n",
+            s:"(\\d{2})" 
+        },
+        j: {
+            g:1,
+            c:"d = parseInt(results[{0}], 10);\n",
+            s:"(\\d{1,2})" 
+        },
+        D: function() {
+            for (var a = [], i = 0; i < 7; a.push(Date.getShortDayName(i)), ++i); 
+            return {
+                g:0,
+                c:null,
+                s:"(?:" + a.join("|") +")"
+            };
+        },
+        l: function() {
+            return {
+                g:0,
+                c:null,
+                s:"(?:" + Date.dayNames.join("|") + ")"
+            };
+        },
+        N: {
+            g:0,
+            c:null,
+            s:"[1-7]" 
+        },
+        S: {
+            g:0,
+            c:null,
+            s:"(?:st|nd|rd|th)"
+        },
+        w: {
+            g:0,
+            c:null,
+            s:"[0-6]" 
+        },
+        z: {
+            g:1,
+            c:"z = parseInt(results[{0}], 10);\n",
+            s:"(\\d{1,3})" 
+        },
+        W: {
+            g:0,
+            c:null,
+            s:"(?:\\d{2})" 
+        },
+        F: function() {
+            return {
+                g:1,
+                c:"m = parseInt(Date.getMonthNumber(results[{0}]), 10);\n", 
+                s:"(" + Date.monthNames.join("|") + ")"
+            };
+        },
+        M: function() {
+            for (var a = [], i = 0; i < 12; a.push(Date.getShortMonthName(i)), ++i); 
+            return Ext.applyIf({
+                s:"(" + a.join("|") + ")"
+            }, $f("F"));
+        },
+        m: {
+            g:1,
+            c:"m = parseInt(results[{0}], 10) - 1;\n",
+            s:"(\\d{2})" 
+        },
+        n: {
+            g:1,
+            c:"m = parseInt(results[{0}], 10) - 1;\n",
+            s:"(\\d{1,2})" 
+        },
+        t: {
+            g:0,
+            c:null,
+            s:"(?:\\d{2})" 
+        },
+        L: {
+            g:0,
+            c:null,
+            s:"(?:1|0)"
+        },
+        o: function() {
+            return $f("Y");
+        },
+        Y: {
+            g:1,
+            c:"y = parseInt(results[{0}], 10);\n",
+            s:"(\\d{4})" 
+        },
+        y: {
+            g:1,
+            c:"var ty = parseInt(results[{0}], 10);\n"
+                + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n", 
+            s:"(\\d{1,2})"
+        },
+        
+        a: function(){
+            return $f("A");
+        },
+        A: {
+            
+            calcLast: true,
+            g:1,
+            c:"if (/(am)/i.test(results[{0}])) {\n"
+                + "if (!h || h == 12) { h = 0; }\n"
+                + "} else { if (!h || h < 12) { h = (h || 0) + 12; }}",
+            s:"(AM|PM|am|pm)"
+        },
+        g: function() {
+            return $f("G");
+        },
+        G: {
+            g:1,
+            c:"h = parseInt(results[{0}], 10);\n",
+            s:"(\\d{1,2})" 
+        },
+        h: function() {
+            return $f("H");
+        },
+        H: {
+            g:1,
+            c:"h = parseInt(results[{0}], 10);\n",
+            s:"(\\d{2})" 
+        },
+        i: {
+            g:1,
+            c:"i = parseInt(results[{0}], 10);\n",
+            s:"(\\d{2})" 
+        },
+        s: {
+            g:1,
+            c:"s = parseInt(results[{0}], 10);\n",
+            s:"(\\d{2})" 
+        },
+        u: {
+            g:1,
+            c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",
+            s:"(\\d+)" 
+        },
+        O: {
+            g:1,
+            c:[
+                "o = results[{0}];",
+                "var sn = o.substring(0,1),", 
+                    "hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),", 
+                    "mn = o.substring(3,5) % 60;", 
+                "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n" 
+            ].join("\n"),
+            s: "([+\-]\\d{4})" 
+        },
+        P: {
+            g:1,
+            c:[
+                "o = results[{0}];",
+                "var sn = o.substring(0,1),", 
+                    "hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),", 
+                    "mn = o.substring(4,6) % 60;", 
+                "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n" 
+            ].join("\n"),
+            s: "([+\-]\\d{2}:\\d{2})" 
+        },
+        T: {
+            g:0,
+            c:null,
+            s:"[A-Z]{1,4}" 
+        },
+        Z: {
+            g:1,
+            c:"zz = results[{0}] * 1;\n" 
+                  + "zz = (-43200 <= zz && zz <= 50400)? zz : null;\n",
+            s:"([+\-]?\\d{1,5})" 
+        },
+        c: function() {
+            var calc = [],
+                arr = [
+                    $f("Y", 1), 
+                    $f("m", 2), 
+                    $f("d", 3), 
+                    $f("h", 4), 
+                    $f("i", 5), 
+                    $f("s", 6), 
+                    {c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"}, 
+                    {c:[ 
+                        "if(results[8]) {", 
+                            "if(results[8] == 'Z'){",
+                                "zz = 0;", 
+                            "}else if (results[8].indexOf(':') > -1){",
+                                $f("P", 8).c, 
+                            "}else{",
+                                $f("O", 8).c, 
+                            "}",
+                        "}"
+                    ].join('\n')}
+                ];
+
+            for (var i = 0, l = arr.length; i < l; ++i) {
+                calc.push(arr[i].c);
+            }
+
+            return {
+                g:1,
+                c:calc.join(""),
+                s:[
+                    arr[0].s, 
+                    "(?:", "-", arr[1].s, 
+                        "(?:", "-", arr[2].s, 
+                            "(?:",
+                                "(?:T| )?", 
+                                arr[3].s, ":", arr[4].s,  
+                                "(?::", arr[5].s, ")?", 
+                                "(?:(?:\\.|,)(\\d+))?", 
+                                "(Z|(?:[-+]\\d{2}(?::)?\\d{2}))?", 
+                            ")?",
+                        ")?",
+                    ")?"
+                ].join("")
+            };
+        },
+        U: {
+            g:1,
+            c:"u = parseInt(results[{0}], 10);\n",
+            s:"(-?\\d+)" 
+        }
+    }
+});
+
+}());
+
+Ext.apply(Date.prototype, {
+    
+    dateFormat : function(format) {
+        if (Date.formatFunctions[format] == null) {
+            Date.createFormat(format);
+        }
+        return Date.formatFunctions[format].call(this);
+    },
+
+    
+    getTimezone : function() {
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        return this.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, "");
+    },
+
+    
+    getGMTOffset : function(colon) {
+        return (this.getTimezoneOffset() > 0 ? "-" : "+")
+            + String.leftPad(Math.floor(Math.abs(this.getTimezoneOffset()) / 60), 2, "0")
+            + (colon ? ":" : "")
+            + String.leftPad(Math.abs(this.getTimezoneOffset() % 60), 2, "0");
+    },
+
+    
+    getDayOfYear: function() {
+        var num = 0,
+            d = this.clone(),
+            m = this.getMonth(),
+            i;
+
+        for (i = 0, d.setDate(1), d.setMonth(0); i < m; d.setMonth(++i)) {
+            num += d.getDaysInMonth();
+        }
+        return num + this.getDate() - 1;
+    },
+
+    
+    getWeekOfYear : function() {
+        
+        var ms1d = 864e5, 
+            ms7d = 7 * ms1d; 
+
+        return function() { 
+            var DC3 = Date.UTC(this.getFullYear(), this.getMonth(), this.getDate() + 3) / ms1d, 
+                AWN = Math.floor(DC3 / 7), 
+                Wyr = new Date(AWN * ms7d).getUTCFullYear();
+
+            return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;
+        };
+    }(),
+
+    
+    isLeapYear : function() {
+        var year = this.getFullYear();
+        return !!((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
+    },
+
+    
+    getFirstDayOfMonth : function() {
+        var day = (this.getDay() - (this.getDate() - 1)) % 7;
+        return (day < 0) ? (day + 7) : day;
+    },
+
+    
+    getLastDayOfMonth : function() {
+        return this.getLastDateOfMonth().getDay();
+    },
+
+
+    
+    getFirstDateOfMonth : function() {
+        return new Date(this.getFullYear(), this.getMonth(), 1);
+    },
+
+    
+    getLastDateOfMonth : function() {
+        return new Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth());
+    },
+
+    
+    getDaysInMonth: function() {
+        var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+
+        return function() { 
+            var m = this.getMonth();
+
+            return m == 1 && this.isLeapYear() ? 29 : daysInMonth[m];
+        };
+    }(),
+
+    
+    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";
+        }
+    },
+
+    
+    clone : function() {
+        return new Date(this.getTime());
+    },
+
+    
+    isDST : function() {
+        
+        
+        return new Date(this.getFullYear(), 0, 1).getTimezoneOffset() != this.getTimezoneOffset();
+    },
+
+    
+    clearTime : function(clone) {
+        if (clone) {
+            return this.clone().clearTime();
+        }
+
+        
+        var d = this.getDate();
+
+        
+        this.setHours(0);
+        this.setMinutes(0);
+        this.setSeconds(0);
+        this.setMilliseconds(0);
+
+        if (this.getDate() != d) { 
+            
+            
+
+            
+            for (var hr = 1, c = this.add(Date.HOUR, hr); c.getDate() != d; hr++, c = this.add(Date.HOUR, hr));
+
+            this.setDate(d);
+            this.setHours(c.getHours());
+        }
+
+        return this;
+    },
+
+    
+    add : function(interval, value) {
+        var d = this.clone();
+        if (!interval || value === 0) return d;
+
+        switch(interval.toLowerCase()) {
+            case Date.MILLI:
+                d.setMilliseconds(this.getMilliseconds() + value);
+                break;
+            case Date.SECOND:
+                d.setSeconds(this.getSeconds() + value);
+                break;
+            case Date.MINUTE:
+                d.setMinutes(this.getMinutes() + value);
+                break;
+            case Date.HOUR:
+                d.setHours(this.getHours() + value);
+                break;
+            case Date.DAY:
+                d.setDate(this.getDate() + value);
+                break;
+            case Date.MONTH:
+                var day = this.getDate();
+                if (day > 28) {
+                    day = Math.min(day, this.getFirstDateOfMonth().add('mo', value).getLastDateOfMonth().getDate());
+                }
+                d.setDate(day);
+                d.setMonth(this.getMonth() + value);
+                break;
+            case Date.YEAR:
+                d.setFullYear(this.getFullYear() + value);
+                break;
+        }
+        return d;
+    },
+
+    
+    between : function(start, end) {
+        var t = this.getTime();
+        return start.getTime() <= t && t <= end.getTime();
+    }
+});
+
+
+
+Date.prototype.format = Date.prototype.dateFormat;
+
+
+
+if (Ext.isSafari && (navigator.userAgent.match(/WebKit\/(\d+)/)[1] || NaN) < 420) {
+    Ext.apply(Date.prototype, {
+        _xMonth : Date.prototype.setMonth,
+        _xDate  : Date.prototype.setDate,
+
+        
+        
+        setMonth : function(num) {
+            if (num <= -1) {
+                var n = Math.ceil(-num),
+                    back_year = Math.ceil(n / 12),
+                    month = (n % 12) ? 12 - n % 12 : 0;
+
+                this.setFullYear(this.getFullYear() - back_year);
+
+                return this._xMonth(month);
+            } else {
+                return this._xMonth(num);
+            }
+        },
+
+        
+        
+        
+        setDate : function(d) {
+            
+            
+            return this.setTime(this.getTime() - (this.getDate() - d) * 864e5);
+        }
+    });
+}
+
+
+
+
+
+Ext.util.MixedCollection = function(allowFunctions, keyFn){
+    this.items = [];
+    this.map = {};
+    this.keys = [];
+    this.length = 0;
+    this.addEvents(
+        
+        'clear',
+        
+        'add',
+        
+        'replace',
+        
+        'remove',
+        'sort'
+    );
+    this.allowFunctions = allowFunctions === true;
+    if(keyFn){
+        this.getKey = keyFn;
+    }
+    Ext.util.MixedCollection.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.util.MixedCollection, Ext.util.Observable, {
+
+    
+    allowFunctions : false,
+
+    
+    add : function(key, o){
+        if(arguments.length == 1){
+            o = arguments[0];
+            key = this.getKey(o);
+        }
+        if(typeof key != 'undefined' && key !== null){
+            var old = this.map[key];
+            if(typeof old != 'undefined'){
+                return this.replace(key, o);
+            }
+            this.map[key] = o;
+        }
+        this.length++;
+        this.items.push(o);
+        this.keys.push(key);
+        this.fireEvent('add', this.length-1, o, key);
+        return o;
+    },
+
+    
+    getKey : function(o){
+         return o.id;
+    },
+
+    
+    replace : function(key, o){
+        if(arguments.length == 1){
+            o = arguments[0];
+            key = this.getKey(o);
+        }
+        var old = this.map[key];
+        if(typeof key == 'undefined' || key === null || typeof old == 'undefined'){
+             return this.add(key, o);
+        }
+        var index = this.indexOfKey(key);
+        this.items[index] = o;
+        this.map[key] = o;
+        this.fireEvent('replace', key, old, o);
+        return o;
+    },
+
+    
+    addAll : function(objs){
+        if(arguments.length > 1 || Ext.isArray(objs)){
+            var args = arguments.length > 1 ? arguments : objs;
+            for(var i = 0, len = args.length; i < len; i++){
+                this.add(args[i]);
+            }
+        }else{
+            for(var key in objs){
+                if(this.allowFunctions || typeof objs[key] != 'function'){
+                    this.add(key, objs[key]);
+                }
+            }
+        }
+    },
+
+    
+    each : function(fn, scope){
+        var items = [].concat(this.items); 
+        for(var i = 0, len = items.length; i < len; i++){
+            if(fn.call(scope || items[i], items[i], i, len) === false){
+                break;
+            }
+        }
+    },
+
+    
+    eachKey : function(fn, scope){
+        for(var i = 0, len = this.keys.length; i < len; i++){
+            fn.call(scope || window, this.keys[i], this.items[i], i, len);
+        }
+    },
+
+    
+    find : function(fn, scope){
+        for(var i = 0, len = this.items.length; i < len; i++){
+            if(fn.call(scope || window, this.items[i], this.keys[i])){
+                return this.items[i];
+            }
+        }
+        return null;
+    },
+
+    
+    insert : function(index, key, o){
+        if(arguments.length == 2){
+            o = arguments[1];
+            key = this.getKey(o);
+        }
+        if(this.containsKey(key)){
+            this.suspendEvents();
+            this.removeKey(key);
+            this.resumeEvents();
+        }
+        if(index >= this.length){
+            return this.add(key, o);
+        }
+        this.length++;
+        this.items.splice(index, 0, o);
+        if(typeof key != 'undefined' && key !== null){
+            this.map[key] = o;
+        }
+        this.keys.splice(index, 0, key);
+        this.fireEvent('add', index, o, key);
+        return o;
+    },
+
+    
+    remove : function(o){
+        return this.removeAt(this.indexOf(o));
+    },
+
+    
+    removeAt : function(index){
+        if(index < this.length && index >= 0){
+            this.length--;
+            var o = this.items[index];
+            this.items.splice(index, 1);
+            var key = this.keys[index];
+            if(typeof key != 'undefined'){
+                delete this.map[key];
+            }
+            this.keys.splice(index, 1);
+            this.fireEvent('remove', o, key);
+            return o;
+        }
+        return false;
+    },
+
+    
+    removeKey : function(key){
+        return this.removeAt(this.indexOfKey(key));
+    },
+
+    
+    getCount : function(){
+        return this.length;
+    },
+
+    
+    indexOf : function(o){
+        return this.items.indexOf(o);
+    },
+
+    
+    indexOfKey : function(key){
+        return this.keys.indexOf(key);
+    },
+
+    
+    item : function(key){
+        var mk = this.map[key],
+            item = mk !== undefined ? mk : (typeof key == 'number') ? this.items[key] : undefined;
+        return typeof item != 'function' || this.allowFunctions ? item : null; 
+    },
+
+    
+    itemAt : function(index){
+        return this.items[index];
+    },
+
+    
+    key : function(key){
+        return this.map[key];
+    },
+
+    
+    contains : function(o){
+        return this.indexOf(o) != -1;
+    },
+
+    
+    containsKey : function(key){
+        return typeof this.map[key] != '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(property, dir, fn){
+        var i, len,
+            dsc   = String(dir).toUpperCase() == 'DESC' ? -1 : 1,
+
+            
+            c     = [],
+            keys  = this.keys,
+            items = this.items;
+
+        
+        fn = fn || function(a, b) {
+            return a - b;
+        };
+
+        
+        for(i = 0, len = items.length; i < len; i++){
+            c[c.length] = {
+                key  : keys[i],
+                value: items[i],
+                index: i
+            };
+        }
+
+        
+        c.sort(function(a, b){
+            var v = fn(a[property], b[property]) * dsc;
+            if(v === 0){
+                v = (a.index < b.index ? -1 : 1);
+            }
+            return v;
+        });
+
+        
+        for(i = 0, len = c.length; i < len; i++){
+            items[i] = c[i].value;
+            keys[i]  = c[i].key;
+        }
+
+        this.fireEvent('sort', this);
+    },
+
+    
+    sort : function(dir, fn){
+        this._sort('value', dir, fn);
+    },
+
+    
+    reorder: function(mapping) {
+        this.suspendEvents();
+
+        var items = this.items,
+            index = 0,
+            length = items.length,
+            order = [],
+            remaining = [],
+            oldIndex;
+
+        
+        for (oldIndex in mapping) {
+            order[mapping[oldIndex]] = items[oldIndex];
+        }
+
+        for (index = 0; index < length; index++) {
+            if (mapping[index] == undefined) {
+                remaining.push(items[index]);
+            }
+        }
+
+        for (index = 0; index < length; index++) {
+            if (order[index] == undefined) {
+                order[index] = remaining.shift();
+            }
+        }
+
+        this.clear();
+        this.addAll(order);
+
+        this.resumeEvents();
+        this.fireEvent('sort', this);
+    },
+
+    
+    keySort : function(dir, fn){
+        this._sort('key', dir, fn || function(a, b){
+            var v1 = String(a).toUpperCase(), v2 = String(b).toUpperCase();
+            return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
+        });
+    },
+
+    
+    getRange : function(start, end){
+        var items = this.items;
+        if(items.length < 1){
+            return [];
+        }
+        start = start || 0;
+        end = Math.min(typeof end == 'undefined' ? this.length-1 : end, this.length-1);
+        var i, r = [];
+        if(start <= end){
+            for(i = start; i <= end; i++) {
+                r[r.length] = items[i];
+            }
+        }else{
+            for(i = start; i >= end; i--) {
+                r[r.length] = items[i];
+            }
+        }
+        return r;
+    },
+
+    
+    filter : function(property, value, anyMatch, caseSensitive){
+        if(Ext.isEmpty(value, false)){
+            return this.clone();
+        }
+        value = this.createValueMatcher(value, anyMatch, caseSensitive);
+        return this.filterBy(function(o){
+            return o && value.test(o[property]);
+        });
+    },
+
+    
+    filterBy : function(fn, scope){
+        var r = new Ext.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(scope||this, it[i], k[i])){
+                r.add(k[i], it[i]);
+            }
+        }
+        return r;
+    },
+
+    
+    findIndex : function(property, value, start, anyMatch, caseSensitive){
+        if(Ext.isEmpty(value, false)){
+            return -1;
+        }
+        value = this.createValueMatcher(value, anyMatch, caseSensitive);
+        return this.findIndexBy(function(o){
+            return o && value.test(o[property]);
+        }, null, start);
+    },
+
+    
+    findIndexBy : function(fn, scope, start){
+        var k = this.keys, it = this.items;
+        for(var i = (start||0), len = it.length; i < len; i++){
+            if(fn.call(scope||this, it[i], k[i])){
+                return i;
+            }
+        }
+        return -1;
+    },
+
+    
+    createValueMatcher : function(value, anyMatch, caseSensitive, exactMatch) {
+        if (!value.exec) { 
+            var er = Ext.escapeRe;
+            value = String(value);
+
+            if (anyMatch === true) {
+                value = er(value);
+            } else {
+                value = '^' + er(value);
+                if (exactMatch === true) {
+                    value += '$';
+                }
+            }
+            value = new RegExp(value, caseSensitive ? '' : 'i');
+         }
+         return value;
+    },
+
+    
+    clone : function(){
+        var r = new Ext.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;
+    }
+});
+
+Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item;
+
+Ext.AbstractManager = Ext.extend(Object, {
+    typeName: 'type',
+    
+    constructor: function(config) {
+        Ext.apply(this, config || {});
+        
+        
+        this.all = new Ext.util.MixedCollection();
+        
+        this.types = {};
+    },
+    
+    
+    get : function(id){
+        return this.all.get(id);
+    },
+    
+    
+    register: function(item) {
+        this.all.add(item);
+    },
+    
+    
+    unregister: function(item) {
+        this.all.remove(item);        
+    },
+    
+    
+    registerType : function(type, cls){
+        this.types[type] = cls;
+        cls[this.typeName] = type;
+    },
+    
+    
+    isRegistered : function(type){
+        return this.types[type] !== undefined;    
+    },
+    
+    
+    create: function(config, defaultType) {
+        var type        = config[this.typeName] || config.type || defaultType,
+            Constructor = this.types[type];
+        
+        if (Constructor == undefined) {
+            throw new Error(String.format("The '{0}' type has not been registered with this manager", type));
+        }
+        
+        return new Constructor(config);
+    },
+    
+    
+    onAvailable : function(id, fn, scope){
+        var all = this.all;
+        
+        all.on("add", function(index, o){
+            if (o.id == id) {
+                fn.call(scope || o, o);
+                all.un("add", fn, scope);
+            }
+        });
+    }
+});
+Ext.util.Format = function() {
+    var trimRe         = /^\s+|\s+$/g,
+        stripTagsRE    = /<\/?[^>]+>/gi,
+        stripScriptsRe = /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,
+        nl2brRe        = /\r?\n/g;
+
+    return {
+        
+        ellipsis : function(value, len, word) {
+            if (value && value.length > len) {
+                if (word) {
+                    var vs    = value.substr(0, len - 2),
+                        index = Math.max(vs.lastIndexOf(' '), vs.lastIndexOf('.'), vs.lastIndexOf('!'), vs.lastIndexOf('?'));
+                    if (index == -1 || index < (len - 15)) {
+                        return value.substr(0, len - 3) + "...";
+                    } else {
+                        return vs.substr(0, index) + "...";
+                    }
+                } else {
+                    return value.substr(0, len - 3) + "...";
+                }
+            }
+            return value;
+        },
+
+        
+        undef : function(value) {
+            return value !== undefined ? value : "";
+        },
+
+        
+        defaultValue : function(value, defaultValue) {
+            return value !== undefined && value !== '' ? value : defaultValue;
+        },
+
+        
+        htmlEncode : function(value) {
+            return !value ? value : String(value).replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
+        },
+
+        
+        htmlDecode : function(value) {
+            return !value ? value : String(value).replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&quot;/g, '"').replace(/&amp;/g, "&");
+        },
+
+        
+        trim : function(value) {
+            return String(value).replace(trimRe, "");
+        },
+
+        
+        substr : function(value, start, length) {
+            return String(value).substr(start, length);
+        },
+
+        
+        lowercase : function(value) {
+            return String(value).toLowerCase();
+        },
+
+        
+        uppercase : function(value) {
+            return String(value).toUpperCase();
+        },
+
+        
+        capitalize : function(value) {
+            return !value ? value : value.charAt(0).toUpperCase() + value.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('.'),
+                whole = ps[0],
+                sub = ps[1] ? '.'+ ps[1] : '.00',
+                r = /(\d+)(\d{3})/;
+            while (r.test(whole)) {
+                whole = whole.replace(r, '$1' + ',' + '$2');
+            }
+            v = whole + sub;
+            if (v.charAt(0) == '-') {
+                return '-$' + v.substr(1);
+            }
+            return "$" +  v;
+        },
+
+        
+        date : function(v, format) {
+            if (!v) {
+                return "";
+            }
+            if (!Ext.isDate(v)) {
+                v = new Date(Date.parse(v));
+            }
+            return v.dateFormat(format || "m/d/Y");
+        },
+
+        
+        dateRenderer : function(format) {
+            return function(v) {
+                return Ext.util.Format.date(v, format);
+            };
+        },
+
+        
+        stripTags : function(v) {
+            return !v ? v : String(v).replace(stripTagsRE, "");
+        },
+
+        
+        stripScripts : function(v) {
+            return !v ? v : String(v).replace(stripScriptsRe, "");
+        },
+
+        
+        fileSize : function(size) {
+            if (size < 1024) {
+                return size + " bytes";
+            } else if (size < 1048576) {
+                return (Math.round(((size*10) / 1024))/10) + " KB";
+            } else {
+                return (Math.round(((size*10) / 1048576))/10) + " MB";
+            }
+        },
+
+        
+        math : function(){
+            var fns = {};
+            
+            return function(v, a){
+                if (!fns[a]) {
+                    fns[a] = new Function('v', 'return v ' + a + ';');
+                }
+                return fns[a](v);
+            };
+        }(),
+
+        
+        round : function(value, precision) {
+            var result = Number(value);
+            if (typeof precision == 'number') {
+                precision = Math.pow(10, precision);
+                result = Math.round(value * precision) / precision;
+            }
+            return result;
+        },
+
+        
+        number: function(v, format) {
+            if (!format) {
+                return v;
+            }
+            v = Ext.num(v, NaN);
+            if (isNaN(v)) {
+                return '';
+            }
+            var comma = ',',
+                dec   = '.',
+                i18n  = false,
+                neg   = v < 0;
+
+            v = Math.abs(v);
+            if (format.substr(format.length - 2) == '/i') {
+                format = format.substr(0, format.length - 2);
+                i18n   = true;
+                comma  = '.';
+                dec    = ',';
+            }
+
+            var hasComma = format.indexOf(comma) != -1,
+                psplit   = (i18n ? format.replace(/[^\d\,]/g, '') : format.replace(/[^\d\.]/g, '')).split(dec);
+
+            if (1 < psplit.length) {
+                v = v.toFixed(psplit[1].length);
+            } else if(2 < psplit.length) {
+                throw ('NumberFormatException: invalid format, formats should have no more than 1 period: ' + format);
+            } else {
+                v = v.toFixed(0);
+            }
+
+            var fnum = v.toString();
+
+            psplit = fnum.split('.');
+
+            if (hasComma) {
+                var cnum = psplit[0], 
+                    parr = [], 
+                    j    = cnum.length, 
+                    m    = Math.floor(j / 3),
+                    n    = cnum.length % 3 || 3,
+                    i;
+
+                for (i = 0; i < j; i += n) {
+                    if (i != 0) {
+                        n = 3;
+                    }
+                    
+                    parr[parr.length] = cnum.substr(i, n);
+                    m -= 1;
+                }
+                fnum = parr.join(comma);
+                if (psplit[1]) {
+                    fnum += dec + psplit[1];
+                }
+            } else {
+                if (psplit[1]) {
+                    fnum = psplit[0] + dec + psplit[1];
+                }
+            }
+
+            return (neg ? '-' : '') + format.replace(/[\d,?\.?]+/, fnum);
+        },
+
+        
+        numberRenderer : function(format) {
+            return function(v) {
+                return Ext.util.Format.number(v, format);
+            };
+        },
+
+        
+        plural : function(v, s, p) {
+            return v +' ' + (v == 1 ? s : (p ? p : s+'s'));
+        },
+
+        
+        nl2br : function(v) {
+            return Ext.isEmpty(v) ? '' : v.replace(nl2brRe, '<br/>');
+        }
+    };
+}();
+
+Ext.XTemplate = function(){
+    Ext.XTemplate.superclass.constructor.apply(this, arguments);
+
+    var me = this,
+        s = me.html,
+        re = /<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/,
+        nameRe = /^<tpl\b[^>]*?for="(.*?)"/,
+        ifRe = /^<tpl\b[^>]*?if="(.*?)"/,
+        execRe = /^<tpl\b[^>]*?exec="(.*?)"/,
+        m,
+        id = 0,
+        tpls = [],
+        VALUES = 'values',
+        PARENT = 'parent',
+        XINDEX = 'xindex',
+        XCOUNT = 'xcount',
+        RETURN = 'return ',
+        WITHVALUES = 'with(values){ ';
+
+    s = ['<tpl>', s, '</tpl>'].join('');
+
+    while((m = s.match(re))){
+        var m2 = m[0].match(nameRe),
+            m3 = m[0].match(ifRe),
+            m4 = m[0].match(execRe),
+            exp = null,
+            fn = null,
+            exec = null,
+            name = m2 && m2[1] ? m2[1] : '';
+
+       if (m3) {
+           exp = m3 && m3[1] ? m3[1] : null;
+           if(exp){
+               fn = new Function(VALUES, PARENT, XINDEX, XCOUNT, WITHVALUES + RETURN +(Ext.util.Format.htmlDecode(exp))+'; }');
+           }
+       }
+       if (m4) {
+           exp = m4 && m4[1] ? m4[1] : null;
+           if(exp){
+               exec = new Function(VALUES, PARENT, XINDEX, XCOUNT, WITHVALUES +(Ext.util.Format.htmlDecode(exp))+'; }');
+           }
+       }
+       if(name){
+           switch(name){
+               case '.': name = new Function(VALUES, PARENT, WITHVALUES + RETURN + VALUES + '; }'); break;
+               case '..': name = new Function(VALUES, PARENT, WITHVALUES + RETURN + PARENT + '; }'); break;
+               default: name = new Function(VALUES, PARENT, WITHVALUES + RETURN + name + '; }');
+           }
+       }
+       tpls.push({
+            id: id,
+            target: name,
+            exec: exec,
+            test: fn,
+            body: m[1]||''
+        });
+       s = s.replace(m[0], '{xtpl'+ id + '}');
+       ++id;
+    }
+    for(var i = tpls.length-1; i >= 0; --i){
+        me.compileTpl(tpls[i]);
+    }
+    me.master = tpls[tpls.length-1];
+    me.tpls = tpls;
+};
+Ext.extend(Ext.XTemplate, Ext.Template, {
+    
+    re : /\{([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,
+    
+    codeRe : /\{\[((?:\\\]|.|\n)*?)\]\}/g,
+
+    
+    applySubTemplate : function(id, values, parent, xindex, xcount){
+        var me = this,
+            len,
+            t = me.tpls[id],
+            vs,
+            buf = [];
+        if ((t.test && !t.test.call(me, values, parent, xindex, xcount)) ||
+            (t.exec && t.exec.call(me, values, parent, xindex, xcount))) {
+            return '';
+        }
+        vs = t.target ? t.target.call(me, values, parent) : values;
+        len = vs.length;
+        parent = t.target ? values : parent;
+        if(t.target && Ext.isArray(vs)){
+            for(var i = 0, len = vs.length; i < len; i++){
+                buf[buf.length] = t.compiled.call(me, vs[i], parent, i+1, len);
+            }
+            return buf.join('');
+        }
+        return t.compiled.call(me, vs, parent, xindex, xcount);
+    },
+
+    
+    compileTpl : function(tpl){
+        var fm = Ext.util.Format,
+            useF = this.disableFormats !== true,
+            sep = Ext.isGecko ? "+" : ",",
+            body;
+
+        function fn(m, name, format, args, math){
+            if(name.substr(0, 4) == 'xtpl'){
+                return "'"+ sep +'this.applySubTemplate('+name.substr(4)+', values, parent, xindex, xcount)'+sep+"'";
+            }
+            var v;
+            if(name === '.'){
+                v = 'values';
+            }else if(name === '#'){
+                v = 'xindex';
+            }else if(name.indexOf('.') != -1){
+                v = name;
+            }else{
+                v = "values['" + name + "']";
+            }
+            if(math){
+                v = '(' + v + math + ')';
+            }
+            if (format && useF) {
+                args = args ? ',' + args : "";
+                if(format.substr(0, 5) != "this."){
+                    format = "fm." + format + '(';
+                }else{
+                    format = 'this.call("'+ format.substr(5) + '", ';
+                    args = ", values";
+                }
+            } else {
+                args= ''; format = "("+v+" === undefined ? '' : ";
+            }
+            return "'"+ sep + format + v + args + ")"+sep+"'";
+        }
+
+        function codeFn(m, code){
+            
+            return "'" + sep + '(' + code.replace(/\\'/g, "'") + ')' + sep + "'";
+        }
+
+        
+        if(Ext.isGecko){
+            body = "tpl.compiled = function(values, parent, xindex, xcount){ return '" +
+                   tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn) +
+                    "';};";
+        }else{
+            body = ["tpl.compiled = function(values, parent, xindex, xcount){ return ['"];
+            body.push(tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn));
+            body.push("'].join('');};");
+            body = body.join('');
+        }
+        eval(body);
+        return this;
+    },
+
+    
+    applyTemplate : function(values){
+        return this.master.compiled.call(this, values, {}, 1, 1);
+    },
+
+    
+    compile : function(){return this;}
+
+    
+    
+    
+
+});
+
+Ext.XTemplate.prototype.apply = Ext.XTemplate.prototype.applyTemplate;
+
+
+Ext.XTemplate.from = function(el){
+    el = Ext.getDom(el);
+    return new Ext.XTemplate(el.value || el.innerHTML);
+};
+
+Ext.util.CSS = function(){
+       var rules = null;
+       var doc = document;
+
+    var camelRe = /(-[a-z])/gi;
+    var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); };
+
+   return {
+   
+   createStyleSheet : function(cssText, id){
+       var ss;
+       var head = doc.getElementsByTagName("head")[0];
+       var rules = doc.createElement("style");
+       rules.setAttribute("type", "text/css");
+       if(id){
+           rules.setAttribute("id", id);
+       }
+       if(Ext.isIE){
+           head.appendChild(rules);
+           ss = rules.styleSheet;
+           ss.cssText = cssText;
+       }else{
+           try{
+                rules.appendChild(doc.createTextNode(cssText));
+           }catch(e){
+               rules.cssText = cssText;
+           }
+           head.appendChild(rules);
+           ss = rules.styleSheet ? rules.styleSheet : (rules.sheet || doc.styleSheets[doc.styleSheets.length-1]);
+       }
+       this.cacheStyleSheet(ss);
+       return ss;
+   },
+
+   
+   removeStyleSheet : function(id){
+       var existing = doc.getElementById(id);
+       if(existing){
+           existing.parentNode.removeChild(existing);
+       }
+   },
+
+   
+   swapStyleSheet : function(id, url){
+       this.removeStyleSheet(id);
+       var ss = doc.createElement("link");
+       ss.setAttribute("rel", "stylesheet");
+       ss.setAttribute("type", "text/css");
+       ss.setAttribute("id", id);
+       ss.setAttribute("href", url);
+       doc.getElementsByTagName("head")[0].appendChild(ss);
+   },
+   
+   
+   refreshCache : function(){
+       return this.getRules(true);
+   },
+
+   
+   cacheStyleSheet : function(ss){
+       if(!rules){
+           rules = {};
+       }
+       try{
+           var ssRules = ss.cssRules || ss.rules;
+           for(var j = ssRules.length-1; j >= 0; --j){
+               rules[ssRules[j].selectorText.toLowerCase()] = ssRules[j];
+           }
+       }catch(e){}
+   },
+   
+   
+   getRules : function(refreshCache){
+               if(rules === null || refreshCache){
+                       rules = {};
+                       var ds = doc.styleSheets;
+                       for(var i =0, len = ds.length; i < len; i++){
+                           try{
+                       this.cacheStyleSheet(ds[i]);
+                   }catch(e){} 
+               }
+               }
+               return rules;
+       },
+       
+       
+   getRule : function(selector, refreshCache){
+               var rs = this.getRules(refreshCache);
+               if(!Ext.isArray(selector)){
+                   return rs[selector.toLowerCase()];
+               }
+               for(var i = 0; i < selector.length; i++){
+                       if(rs[selector[i]]){
+                               return rs[selector[i].toLowerCase()];
+                       }
+               }
+               return null;
+       },
+       
+       
+       
+   updateRule : function(selector, property, value){
+               if(!Ext.isArray(selector)){
+                       var rule = this.getRule(selector);
+                       if(rule){
+                               rule.style[property.replace(camelRe, camelFn)] = value;
+                               return true;
+                       }
+               }else{
+                       for(var i = 0; i < selector.length; i++){
+                               if(this.updateRule(selector[i], property, value)){
+                                       return true;
+                               }
+                       }
+               }
+               return false;
+       }
+   };  
+}();
+Ext.util.ClickRepeater = Ext.extend(Ext.util.Observable, {
+    
+    constructor : function(el, config){
+        this.el = Ext.get(el);
+        this.el.unselectable();
+
+        Ext.apply(this, config);
+
+        this.addEvents(
+        
+        "mousedown",
+        
+        "click",
+        
+        "mouseup"
+        );
+
+        if(!this.disabled){
+            this.disabled = true;
+            this.enable();
+        }
+
+        
+        if(this.handler){
+            this.on("click", this.handler,  this.scope || this);
+        }
+
+        Ext.util.ClickRepeater.superclass.constructor.call(this);        
+    },
+    
+    interval : 20,
+    delay: 250,
+    preventDefault : true,
+    stopDefault : false,
+    timer : 0,
+
+    
+    enable: function(){
+        if(this.disabled){
+            this.el.on('mousedown', this.handleMouseDown, this);
+            if (Ext.isIE){
+                this.el.on('dblclick', this.handleDblClick, this);
+            }
+            if(this.preventDefault || this.stopDefault){
+                this.el.on('click', this.eventOptions, this);
+            }
+        }
+        this.disabled = false;
+    },
+
+    
+    disable: function( force){
+        if(force || !this.disabled){
+            clearTimeout(this.timer);
+            if(this.pressClass){
+                this.el.removeClass(this.pressClass);
+            }
+            Ext.getDoc().un('mouseup', this.handleMouseUp, this);
+            this.el.removeAllListeners();
+        }
+        this.disabled = true;
+    },
+
+    
+    setDisabled: function(disabled){
+        this[disabled ? 'disable' : 'enable']();
+    },
+
+    eventOptions: function(e){
+        if(this.preventDefault){
+            e.preventDefault();
+        }
+        if(this.stopDefault){
+            e.stopEvent();
+        }
+    },
+
+    
+    destroy : function() {
+        this.disable(true);
+        Ext.destroy(this.el);
+        this.purgeListeners();
+    },
+
+    handleDblClick : function(e){
+        clearTimeout(this.timer);
+        this.el.blur();
+
+        this.fireEvent("mousedown", this, e);
+        this.fireEvent("click", this, e);
+    },
+
+    
+    handleMouseDown : function(e){
+        clearTimeout(this.timer);
+        this.el.blur();
+        if(this.pressClass){
+            this.el.addClass(this.pressClass);
+        }
+        this.mousedownTime = new Date();
+
+        Ext.getDoc().on("mouseup", this.handleMouseUp, this);
+        this.el.on("mouseout", this.handleMouseOut, this);
+
+        this.fireEvent("mousedown", this, e);
+        this.fireEvent("click", this, e);
+
+        
+        if (this.accelerate) {
+            this.delay = 400;
+        }
+        this.timer = this.click.defer(this.delay || this.interval, this, [e]);
+    },
+
+    
+    click : function(e){
+        this.fireEvent("click", this, e);
+        this.timer = this.click.defer(this.accelerate ?
+            this.easeOutExpo(this.mousedownTime.getElapsed(),
+                400,
+                -390,
+                12000) :
+            this.interval, this, [e]);
+    },
+
+    easeOutExpo : function (t, b, c, d) {
+        return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+    },
+
+    
+    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, this);
+        if(this.pressClass){
+            this.el.addClass(this.pressClass);
+        }
+        this.click();
+    },
+
+    
+    handleMouseUp : function(e){
+        clearTimeout(this.timer);
+        this.el.un("mouseover", this.handleMouseReturn, this);
+        this.el.un("mouseout", this.handleMouseOut, this);
+        Ext.getDoc().un("mouseup", this.handleMouseUp, this);
+        this.el.removeClass(this.pressClass);
+        this.fireEvent("mouseup", this, e);
+    }
+});
+Ext.KeyNav = function(el, config){
+    this.el = Ext.get(el);
+    Ext.apply(this, config);
+    if(!this.disabled){
+        this.disabled = true;
+        this.enable();
+    }
+};
+
+Ext.KeyNav.prototype = {
+    
+    disabled : false,
+    
+    defaultEventAction: "stopEvent",
+    
+    forceKeyDown : false,
+
+    
+    relay : function(e){
+        var k = e.getKey(),
+            h = this.keyToHandler[k];
+        if(h && this[h]){
+            if(this.doRelay(e, this[h], h) !== true){
+                e[this.defaultEventAction]();
+            }
+        }
+    },
+
+    
+    doRelay : function(e, h, hname){
+        return h.call(this.scope || this, e, hname);
+    },
+
+    
+    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"
+    },
+    
+    stopKeyUp: function(e) {
+        var k = e.getKey();
+
+        if (k >= 37 && k <= 40) {
+            
+            
+            e.stopEvent();
+        }
+    },
+    
+    
+    destroy: function(){
+        this.disable();    
+    },
+
+       
+       enable: function() {
+        if (this.disabled) {
+            if (Ext.isSafari2) {
+                
+                this.el.on('keyup', this.stopKeyUp, this);
+            }
+
+            this.el.on(this.isKeydown()? 'keydown' : 'keypress', this.relay, this);
+            this.disabled = false;
+        }
+    },
+
+       
+       disable: function() {
+        if (!this.disabled) {
+            if (Ext.isSafari2) {
+                
+                this.el.un('keyup', this.stopKeyUp, this);
+            }
+
+            this.el.un(this.isKeydown()? 'keydown' : 'keypress', this.relay, this);
+            this.disabled = true;
+        }
+    },
+    
+    
+    setDisabled : function(disabled){
+        this[disabled ? "disable" : "enable"]();
+    },
+    
+    
+    isKeydown: function(){
+        return this.forceKeyDown || Ext.EventManager.useKeydown;
+    }
+};
+
+Ext.KeyMap = function(el, config, eventName){
+    this.el  = Ext.get(el);
+    this.eventName = eventName || "keydown";
+    this.bindings = [];
+    if(config){
+        this.addBinding(config);
+    }
+    this.enable();
+};
+
+Ext.KeyMap.prototype = {
+    
+    stopEvent : false,
+
+    
+       addBinding : function(config){
+        if(Ext.isArray(config)){
+            Ext.each(config, function(c){
+                this.addBinding(c);
+            }, this);
+            return;
+        }
+        var keyCode = config.key,
+            fn = config.fn || config.handler,
+            scope = config.scope;
+
+       if (config.stopEvent) {
+           this.stopEvent = config.stopEvent;    
+       }       
+
+        if(typeof keyCode == "string"){
+            var ks = [];
+            var keyString = keyCode.toUpperCase();
+            for(var j = 0, len = keyString.length; j < len; j++){
+                ks.push(keyString.charCodeAt(j));
+            }
+            keyCode = ks;
+        }
+        var keyArray = Ext.isArray(keyCode);
+        
+        var handler = function(e){
+            if(this.checkModifiers(config, e)){
+                var k = e.getKey();
+                if(keyArray){
+                    for(var i = 0, len = keyCode.length; i < len; i++){
+                        if(keyCode[i] == k){
+                          if(this.stopEvent){
+                              e.stopEvent();
+                          }
+                          fn.call(scope || window, k, e);
+                          return;
+                        }
+                    }
+                }else{
+                    if(k == keyCode){
+                        if(this.stopEvent){
+                           e.stopEvent();
+                        }
+                        fn.call(scope || window, k, e);
+                    }
+                }
+            }
+        };
+        this.bindings.push(handler);
+       },
+    
+    
+    checkModifiers: function(config, e){
+        var val, key, keys = ['shift', 'ctrl', 'alt'];
+        for (var i = 0, len = keys.length; i < len; ++i){
+            key = keys[i];
+            val = config[key];
+            if(!(val === undefined || (val === e[key + 'Key']))){
+                return false;
+            }
+        }
+        return true;
+    },
+
+    
+    on : function(key, fn, scope){
+        var keyCode, shift, ctrl, alt;
+        if(typeof key == "object" && !Ext.isArray(key)){
+            keyCode = key.key;
+            shift = key.shift;
+            ctrl = key.ctrl;
+            alt = key.alt;
+        }else{
+            keyCode = key;
+        }
+        this.addBinding({
+            key: keyCode,
+            shift: shift,
+            ctrl: ctrl,
+            alt: alt,
+            fn: fn,
+            scope: scope
+        });
+    },
+
+    
+    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;
+               }
+       },
+    
+    
+    setDisabled : function(disabled){
+        this[disabled ? "disable" : "enable"]();
+    }
+};
+Ext.util.TextMetrics = function(){
+    var shared;
+    return {
+        
+        measure : function(el, text, fixedWidth){
+            if(!shared){
+                shared = Ext.util.TextMetrics.Instance(el, fixedWidth);
+            }
+            shared.bind(el);
+            shared.setFixedWidth(fixedWidth || 'auto');
+            return shared.getSize(text);
+        },
+
+        
+        createInstance : function(el, fixedWidth){
+            return Ext.util.TextMetrics.Instance(el, fixedWidth);
+        }
+    };
+}();
+
+Ext.util.TextMetrics.Instance = function(bindTo, fixedWidth){
+    var ml = new Ext.Element(document.createElement('div'));
+    document.body.appendChild(ml.dom);
+    ml.position('absolute');
+    ml.setLeftTop(-1000, -1000);
+    ml.hide();
+
+    if(fixedWidth){
+        ml.setWidth(fixedWidth);
+    }
+
+    var instance = {
+        
+        getSize : function(text){
+            ml.update(text);
+            var s = ml.getSize();
+            ml.update('');
+            return s;
+        },
+
+        
+        bind : function(el){
+            ml.setStyle(
+                Ext.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing')
+            );
+        },
+
+        
+        setFixedWidth : function(width){
+            ml.setWidth(width);
+        },
+
+        
+        getWidth : function(text){
+            ml.dom.style.width = 'auto';
+            return this.getSize(text).width;
+        },
+
+        
+        getHeight : function(text){
+            return this.getSize(text).height;
+        }
+    };
+
+    instance.bind(bindTo);
+
+    return instance;
+};
+
+Ext.Element.addMethods({
+    
+    getTextWidth : function(text, min, max){
+        return (Ext.util.TextMetrics.measure(this.dom, Ext.value(text, this.dom.innerHTML, true)).width).constrain(min || 0, max || 1000000);
+    }
+});
+
+Ext.util.Cookies = {
+    
+    set : function(name, value){
+        var argv = arguments;
+        var argc = arguments.length;
+        var expires = (argc > 2) ? argv[2] : null;
+        var path = (argc > 3) ? argv[3] : '/';
+        var domain = (argc > 4) ? argv[4] : null;
+        var secure = (argc > 5) ? argv[5] : false;
+        document.cookie = name + "=" + escape(value) + ((expires === null) ? "" : ("; expires=" + expires.toGMTString())) + ((path === null) ? "" : ("; path=" + path)) + ((domain === null) ? "" : ("; domain=" + domain)) + ((secure === true) ? "; secure" : "");
+    },
+
+    
+    get : function(name){
+        var arg = name + "=";
+        var alen = arg.length;
+        var clen = document.cookie.length;
+        var i = 0;
+        var j = 0;
+        while(i < clen){
+            j = i + alen;
+            if(document.cookie.substring(i, j) == arg){
+                return Ext.util.Cookies.getCookieVal(j);
+            }
+            i = document.cookie.indexOf(" ", i) + 1;
+            if(i === 0){
+                break;
+            }
+        }
+        return null;
+    },
+
+    
+    clear : function(name){
+        if(Ext.util.Cookies.get(name)){
+            document.cookie = name + "=" + "; expires=Thu, 01-Jan-70 00:00:01 GMT";
+        }
+    },
+    
+    getCookieVal : function(offset){
+        var endstr = document.cookie.indexOf(";", offset);
+        if(endstr == -1){
+            endstr = document.cookie.length;
+        }
+        return unescape(document.cookie.substring(offset, endstr));
+    }
+};
+Ext.handleError = function(e) {
+    throw e;
+};
+
+
+Ext.Error = function(message) {
+    
+    this.message = (this.lang[message]) ? this.lang[message] : message;
+};
+
+Ext.Error.prototype = new Error();
+Ext.apply(Ext.Error.prototype, {
+    
+    lang: {},
+
+    name: 'Ext.Error',
+    
+    getName : function() {
+        return this.name;
+    },
+    
+    getMessage : function() {
+        return this.message;
+    },
+    
+    toJson : function() {
+        return Ext.encode(this);
+    }
+});
+
+Ext.ComponentMgr = function(){
+    var all = new Ext.util.MixedCollection();
+    var types = {};
+    var ptypes = {};
+
+    return {
+        
+        register : function(c){
+            all.add(c);
+        },
+
+        
+        unregister : function(c){
+            all.remove(c);
+        },
+
+        
+        get : function(id){
+            return all.get(id);
+        },
+
+        
+        onAvailable : function(id, fn, scope){
+            all.on("add", function(index, o){
+                if(o.id == id){
+                    fn.call(scope || o, o);
+                    all.un("add", fn, scope);
+                }
+            });
+        },
+
+        
+        all : all,
+        
+        
+        types : types,
+        
+        
+        ptypes: ptypes,
+        
+        
+        isRegistered : function(xtype){
+            return types[xtype] !== undefined;    
+        },
+        
+        
+        isPluginRegistered : function(ptype){
+            return ptypes[ptype] !== undefined;    
+        },        
+
+        
+        registerType : function(xtype, cls){
+            types[xtype] = cls;
+            cls.xtype = xtype;
+        },
+
+        
+        create : function(config, defaultType){
+            return config.render ? config : new types[config.xtype || defaultType](config);
+        },
+
+        
+        registerPlugin : function(ptype, cls){
+            ptypes[ptype] = cls;
+            cls.ptype = ptype;
+        },
+
+        
+        createPlugin : function(config, defaultType){
+            var PluginCls = ptypes[config.ptype || defaultType];
+            if (PluginCls.init) {
+                return PluginCls;                
+            } else {
+                return new PluginCls(config);
+            }            
+        }
+    };
+}();
+
+
+Ext.reg = Ext.ComponentMgr.registerType; 
+
+Ext.preg = Ext.ComponentMgr.registerPlugin;
+
+Ext.create = Ext.ComponentMgr.create;
+Ext.Component = function(config){
+    config = config || {};
+    if(config.initialConfig){
+        if(config.isAction){           
+            this.baseAction = config;
+        }
+        config = config.initialConfig; 
+    }else if(config.tagName || config.dom || Ext.isString(config)){ 
+        config = {applyTo: config, id: config.id || config};
+    }
+
+    
+    this.initialConfig = config;
+
+    Ext.apply(this, config);
+    this.addEvents(
+        
+        'added',
+        
+        'disable',
+        
+        'enable',
+        
+        'beforeshow',
+        
+        'show',
+        
+        'beforehide',
+        
+        'hide',
+        
+        'removed',
+        
+        'beforerender',
+        
+        'render',
+        
+        'afterrender',
+        
+        'beforedestroy',
+        
+        'destroy',
+        
+        'beforestaterestore',
+        
+        'staterestore',
+        
+        'beforestatesave',
+        
+        'statesave'
+    );
+    this.getId();
+    Ext.ComponentMgr.register(this);
+    Ext.Component.superclass.constructor.call(this);
+
+    if(this.baseAction){
+        this.baseAction.addComponent(this);
+    }
+
+    this.initComponent();
+
+    if(this.plugins){
+        if(Ext.isArray(this.plugins)){
+            for(var i = 0, len = this.plugins.length; i < len; i++){
+                this.plugins[i] = this.initPlugin(this.plugins[i]);
+            }
+        }else{
+            this.plugins = this.initPlugin(this.plugins);
+        }
+    }
+
+    if(this.stateful !== false){
+        this.initState();
+    }
+
+    if(this.applyTo){
+        this.applyToMarkup(this.applyTo);
+        delete this.applyTo;
+    }else if(this.renderTo){
+        this.render(this.renderTo);
+        delete this.renderTo;
+    }
+};
+
+
+Ext.Component.AUTO_ID = 1000;
+
+Ext.extend(Ext.Component, Ext.util.Observable, {
+    
+    
+    
+    
+    
+    
+    
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    disabled : false,
+    
+    hidden : false,
+    
+    
+    
+    
+    
+    
+    
+    autoEl : 'div',
+
+    
+    disabledClass : 'x-item-disabled',
+    
+    allowDomMove : true,
+    
+    autoShow : false,
+    
+    hideMode : 'display',
+    
+    hideParent : false,
+    
+    
+    
+    
+    
+    rendered : false,
+
+    
+    
+
+    
+
+    
+    tplWriteMode : 'overwrite',
+
+    
+    
+    
+    bubbleEvents: [],
+
+
+    
+    ctype : 'Ext.Component',
+
+    
+    actionMode : 'el',
+
+    
+    getActionEl : function(){
+        return this[this.actionMode];
+    },
+
+    initPlugin : function(p){
+        if(p.ptype && !Ext.isFunction(p.init)){
+            p = Ext.ComponentMgr.createPlugin(p);
+        }else if(Ext.isString(p)){
+            p = Ext.ComponentMgr.createPlugin({
+                ptype: p
+            });
+        }
+        p.init(this);
+        return p;
+    },
+
+    
+    initComponent : function(){
+        
+        if(this.listeners){
+            this.on(this.listeners);
+            delete this.listeners;
+        }
+        this.enableBubble(this.bubbleEvents);
+    },
+
+    
+    render : function(container, position){
+        if(!this.rendered && this.fireEvent('beforerender', this) !== false){
+            if(!container && this.el){
+                this.el = Ext.get(this.el);
+                container = this.el.dom.parentNode;
+                this.allowDomMove = false;
+            }
+            this.container = Ext.get(container);
+            if(this.ctCls){
+                this.container.addClass(this.ctCls);
+            }
+            this.rendered = true;
+            if(position !== undefined){
+                if(Ext.isNumber(position)){
+                    position = this.container.dom.childNodes[position];
+                }else{
+                    position = Ext.getDom(position);
+                }
+            }
+            this.onRender(this.container, position || null);
+            if(this.autoShow){
+                this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]);
+            }
+            if(this.cls){
+                this.el.addClass(this.cls);
+                delete this.cls;
+            }
+            if(this.style){
+                this.el.applyStyles(this.style);
+                delete this.style;
+            }
+            if(this.overCls){
+                this.el.addClassOnOver(this.overCls);
+            }
+            this.fireEvent('render', this);
+
+
+            
+            
+            var contentTarget = this.getContentTarget();
+            if (this.html){
+                contentTarget.update(Ext.DomHelper.markup(this.html));
+                delete this.html;
+            }
+            if (this.contentEl){
+                var ce = Ext.getDom(this.contentEl);
+                Ext.fly(ce).removeClass(['x-hidden', 'x-hide-display']);
+                contentTarget.appendChild(ce);
+            }
+            if (this.tpl) {
+                if (!this.tpl.compile) {
+                    this.tpl = new Ext.XTemplate(this.tpl);
+                }
+                if (this.data) {
+                    this.tpl[this.tplWriteMode](contentTarget, this.data);
+                    delete this.data;
+                }
+            }
+            this.afterRender(this.container);
+
+
+            if(this.hidden){
+                
+                this.doHide();
+            }
+            if(this.disabled){
+                
+                this.disable(true);
+            }
+
+            if(this.stateful !== false){
+                this.initStateEvents();
+            }
+            this.fireEvent('afterrender', this);
+        }
+        return this;
+    },
+
+
+    
+    update: function(htmlOrData, loadScripts, cb) {
+        var contentTarget = this.getContentTarget();
+        if (this.tpl && typeof htmlOrData !== "string") {
+            this.tpl[this.tplWriteMode](contentTarget, htmlOrData || {});
+        } else {
+            var html = Ext.isObject(htmlOrData) ? Ext.DomHelper.markup(htmlOrData) : htmlOrData;
+            contentTarget.update(html, loadScripts, cb);
+        }
+    },
+
+
+    
+    onAdded : function(container, pos) {
+        this.ownerCt = container;
+        this.initRef();
+        this.fireEvent('added', this, container, pos);
+    },
+
+    
+    onRemoved : function() {
+        this.removeRef();
+        this.fireEvent('removed', this, this.ownerCt);
+        delete this.ownerCt;
+    },
+
+    
+    initRef : function() {
+        
+        if(this.ref && !this.refOwner){
+            var levels = this.ref.split('/'),
+                last = levels.length,
+                i = 0,
+                t = this;
+
+            while(t && i < last){
+                t = t.ownerCt;
+                ++i;
+            }
+            if(t){
+                t[this.refName = levels[--i]] = this;
+                
+                this.refOwner = t;
+            }
+        }
+    },
+
+    removeRef : function() {
+        if (this.refOwner && this.refName) {
+            delete this.refOwner[this.refName];
+            delete this.refOwner;
+        }
+    },
+
+    
+    initState : function(){
+        if(Ext.state.Manager){
+            var id = this.getStateId();
+            if(id){
+                var state = Ext.state.Manager.get(id);
+                if(state){
+                    if(this.fireEvent('beforestaterestore', this, state) !== false){
+                        this.applyState(Ext.apply({}, state));
+                        this.fireEvent('staterestore', this, state);
+                    }
+                }
+            }
+        }
+    },
+
+    
+    getStateId : function(){
+        return this.stateId || ((/^(ext-comp-|ext-gen)/).test(String(this.id)) ? null : this.id);
+    },
+
+    
+    initStateEvents : function(){
+        if(this.stateEvents){
+            for(var i = 0, e; e = this.stateEvents[i]; i++){
+                this.on(e, this.saveState, this, {delay:100});
+            }
+        }
+    },
+
+    
+    applyState : function(state){
+        if(state){
+            Ext.apply(this, state);
+        }
+    },
+
+    
+    getState : function(){
+        return null;
+    },
+
+    
+    saveState : function(){
+        if(Ext.state.Manager && this.stateful !== false){
+            var id = this.getStateId();
+            if(id){
+                var state = this.getState();
+                if(this.fireEvent('beforestatesave', this, state) !== false){
+                    Ext.state.Manager.set(id, state);
+                    this.fireEvent('statesave', this, state);
+                }
+            }
+        }
+    },
+
+    
+    applyToMarkup : function(el){
+        this.allowDomMove = false;
+        this.el = Ext.get(el);
+        this.render(this.el.dom.parentNode);
+    },
+
+    
+    addClass : function(cls){
+        if(this.el){
+            this.el.addClass(cls);
+        }else{
+            this.cls = this.cls ? this.cls + ' ' + cls : cls;
+        }
+        return this;
+    },
+
+    
+    removeClass : function(cls){
+        if(this.el){
+            this.el.removeClass(cls);
+        }else if(this.cls){
+            this.cls = this.cls.split(' ').remove(cls).join(' ');
+        }
+        return this;
+    },
+
+    
+    
+    onRender : function(ct, position){
+        if(!this.el && this.autoEl){
+            if(Ext.isString(this.autoEl)){
+                this.el = document.createElement(this.autoEl);
+            }else{
+                var div = document.createElement('div');
+                Ext.DomHelper.overwrite(div, this.autoEl);
+                this.el = div.firstChild;
+            }
+            if (!this.el.id) {
+                this.el.id = this.getId();
+            }
+        }
+        if(this.el){
+            this.el = Ext.get(this.el);
+            if(this.allowDomMove !== false){
+                ct.dom.insertBefore(this.el.dom, position);
+                if (div) {
+                    Ext.removeNode(div);
+                    div = null;
+                }
+            }
+        }
+    },
+
+    
+    getAutoCreate : function(){
+        var cfg = Ext.isObject(this.autoCreate) ?
+                      this.autoCreate : Ext.apply({}, this.defaultAutoCreate);
+        if(this.id && !cfg.id){
+            cfg.id = this.id;
+        }
+        return cfg;
+    },
+
+    
+    afterRender : Ext.emptyFn,
+
+    
+    destroy : function(){
+        if(!this.isDestroyed){
+            if(this.fireEvent('beforedestroy', this) !== false){
+                this.destroying = true;
+                this.beforeDestroy();
+                if(this.ownerCt && this.ownerCt.remove){
+                    this.ownerCt.remove(this, false);
+                }
+                if(this.rendered){
+                    this.el.remove();
+                    if(this.actionMode == 'container' || this.removeMode == 'container'){
+                        this.container.remove();
+                    }
+                }
+                
+                if(this.focusTask && this.focusTask.cancel){
+                    this.focusTask.cancel();
+                }
+                this.onDestroy();
+                Ext.ComponentMgr.unregister(this);
+                this.fireEvent('destroy', this);
+                this.purgeListeners();
+                this.destroying = false;
+                this.isDestroyed = true;
+            }
+        }
+    },
+
+    deleteMembers : function(){
+        var args = arguments;
+        for(var i = 0, len = args.length; i < len; ++i){
+            delete this[args[i]];
+        }
+    },
+
+    
+    beforeDestroy : Ext.emptyFn,
+
+    
+    onDestroy  : Ext.emptyFn,
+
+    
+    getEl : function(){
+        return this.el;
+    },
+
+    
+    getContentTarget : function(){
+        return this.el;
+    },
+
+    
+    getId : function(){
+        return this.id || (this.id = 'ext-comp-' + (++Ext.Component.AUTO_ID));
+    },
+
+    
+    getItemId : function(){
+        return this.itemId || this.getId();
+    },
+
+    
+    focus : function(selectText, delay){
+        if(delay){
+            this.focusTask = new Ext.util.DelayedTask(this.focus, this, [selectText, false]);
+            this.focusTask.delay(Ext.isNumber(delay) ? delay : 10);
+            return this;
+        }
+        if(this.rendered && !this.isDestroyed){
+            this.el.focus();
+            if(selectText === true){
+                this.el.dom.select();
+            }
+        }
+        return this;
+    },
+
+    
+    blur : function(){
+        if(this.rendered){
+            this.el.blur();
+        }
+        return this;
+    },
+
+    
+    disable : function( silent){
+        if(this.rendered){
+            this.onDisable();
+        }
+        this.disabled = true;
+        if(silent !== true){
+            this.fireEvent('disable', this);
+        }
+        return this;
+    },
+
+    
+    onDisable : function(){
+        this.getActionEl().addClass(this.disabledClass);
+        this.el.dom.disabled = true;
+    },
+
+    
+    enable : function(){
+        if(this.rendered){
+            this.onEnable();
+        }
+        this.disabled = false;
+        this.fireEvent('enable', this);
+        return this;
+    },
+
+    
+    onEnable : function(){
+        this.getActionEl().removeClass(this.disabledClass);
+        this.el.dom.disabled = false;
+    },
+
+    
+    setDisabled : function(disabled){
+        return this[disabled ? 'disable' : 'enable']();
+    },
+
+    
+    show : function(){
+        if(this.fireEvent('beforeshow', this) !== false){
+            this.hidden = false;
+            if(this.autoRender){
+                this.render(Ext.isBoolean(this.autoRender) ? Ext.getBody() : this.autoRender);
+            }
+            if(this.rendered){
+                this.onShow();
+            }
+            this.fireEvent('show', this);
+        }
+        return this;
+    },
+
+    
+    onShow : function(){
+        this.getVisibilityEl().removeClass('x-hide-' + this.hideMode);
+    },
+
+    
+    hide : function(){
+        if(this.fireEvent('beforehide', this) !== false){
+            this.doHide();
+            this.fireEvent('hide', this);
+        }
+        return this;
+    },
+
+    
+    doHide: function(){
+        this.hidden = true;
+        if(this.rendered){
+            this.onHide();
+        }
+    },
+
+    
+    onHide : function(){
+        this.getVisibilityEl().addClass('x-hide-' + this.hideMode);
+    },
+
+    
+    getVisibilityEl : function(){
+        return this.hideParent ? this.container : this.getActionEl();
+    },
+
+    
+    setVisible : function(visible){
+        return this[visible ? 'show' : 'hide']();
+    },
+
+    
+    isVisible : function(){
+        return this.rendered && this.getVisibilityEl().isVisible();
+    },
+
+    
+    cloneConfig : function(overrides){
+        overrides = overrides || {};
+        var id = overrides.id || Ext.id();
+        var cfg = Ext.applyIf(overrides, this.initialConfig);
+        cfg.id = id; 
+        return new this.constructor(cfg);
+    },
+
+    
+    getXType : function(){
+        return this.constructor.xtype;
+    },
+
+    
+    isXType : function(xtype, shallow){
+        
+        if (Ext.isFunction(xtype)){
+            xtype = xtype.xtype; 
+        }else if (Ext.isObject(xtype)){
+            xtype = xtype.constructor.xtype; 
+        }
+
+        return !shallow ? ('/' + this.getXTypes() + '/').indexOf('/' + xtype + '/') != -1 : this.constructor.xtype == xtype;
+    },
+
+    
+    getXTypes : function(){
+        var tc = this.constructor;
+        if(!tc.xtypes){
+            var c = [], sc = this;
+            while(sc && sc.constructor.xtype){
+                c.unshift(sc.constructor.xtype);
+                sc = sc.constructor.superclass;
+            }
+            tc.xtypeChain = c;
+            tc.xtypes = c.join('/');
+        }
+        return tc.xtypes;
+    },
+
+    
+    findParentBy : function(fn) {
+        for (var p = this.ownerCt; (p != null) && !fn(p, this); p = p.ownerCt);
+        return p || null;
+    },
+
+    
+    findParentByType : function(xtype, shallow){
+        return this.findParentBy(function(c){
+            return c.isXType(xtype, shallow);
+        });
+    },
+    
+    
+    bubble : function(fn, scope, args){
+        var p = this;
+        while(p){
+            if(fn.apply(scope || p, args || [p]) === false){
+                break;
+            }
+            p = p.ownerCt;
+        }
+        return this;
+    },
+
+    
+    getPositionEl : function(){
+        return this.positionEl || this.el;
+    },
+
+    
+    purgeListeners : function(){
+        Ext.Component.superclass.purgeListeners.call(this);
+        if(this.mons){
+            this.on('beforedestroy', this.clearMons, this, {single: true});
+        }
+    },
+
+    
+    clearMons : function(){
+        Ext.each(this.mons, function(m){
+            m.item.un(m.ename, m.fn, m.scope);
+        }, this);
+        this.mons = [];
+    },
+
+    
+    createMons: function(){
+        if(!this.mons){
+            this.mons = [];
+            this.on('beforedestroy', this.clearMons, this, {single: true});
+        }
+    },
+
+    
+    mon : function(item, ename, fn, scope, opt){
+        this.createMons();
+        if(Ext.isObject(ename)){
+            var propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;
+
+            var o = ename;
+            for(var e in o){
+                if(propRe.test(e)){
+                    continue;
+                }
+                if(Ext.isFunction(o[e])){
+                    
+                    this.mons.push({
+                        item: item, ename: e, fn: o[e], scope: o.scope
+                    });
+                    item.on(e, o[e], o.scope, o);
+                }else{
+                    
+                    this.mons.push({
+                        item: item, ename: e, fn: o[e], scope: o.scope
+                    });
+                    item.on(e, o[e]);
+                }
+            }
+            return;
+        }
+
+        this.mons.push({
+            item: item, ename: ename, fn: fn, scope: scope
+        });
+        item.on(ename, fn, scope, opt);
+    },
+
+    
+    mun : function(item, ename, fn, scope){
+        var found, mon;
+        this.createMons();
+        for(var i = 0, len = this.mons.length; i < len; ++i){
+            mon = this.mons[i];
+            if(item === mon.item && ename == mon.ename && fn === mon.fn && scope === mon.scope){
+                this.mons.splice(i, 1);
+                item.un(ename, fn, scope);
+                found = true;
+                break;
+            }
+        }
+        return found;
+    },
+
+    
+    nextSibling : function(){
+        if(this.ownerCt){
+            var index = this.ownerCt.items.indexOf(this);
+            if(index != -1 && index+1 < this.ownerCt.items.getCount()){
+                return this.ownerCt.items.itemAt(index+1);
+            }
+        }
+        return null;
+    },
+
+    
+    previousSibling : function(){
+        if(this.ownerCt){
+            var index = this.ownerCt.items.indexOf(this);
+            if(index > 0){
+                return this.ownerCt.items.itemAt(index-1);
+            }
+        }
+        return null;
+    },
+
+    
+    getBubbleTarget : function(){
+        return this.ownerCt;
+    }
+});
+
+Ext.reg('component', Ext.Component);
+
+Ext.Action = Ext.extend(Object, {
+    
+    
+    
+    
+    
+    
+    
+
+    constructor : function(config){
+        this.initialConfig = config;
+        this.itemId = config.itemId = (config.itemId || config.id || Ext.id());
+        this.items = [];
+    },
+    
+    
+    isAction : true,
+
+    
+    setText : function(text){
+        this.initialConfig.text = text;
+        this.callEach('setText', [text]);
+    },
+
+    
+    getText : function(){
+        return this.initialConfig.text;
+    },
+
+    
+    setIconClass : function(cls){
+        this.initialConfig.iconCls = cls;
+        this.callEach('setIconClass', [cls]);
+    },
+
+    
+    getIconClass : function(){
+        return this.initialConfig.iconCls;
+    },
+
+    
+    setDisabled : function(v){
+        this.initialConfig.disabled = v;
+        this.callEach('setDisabled', [v]);
+    },
+
+    
+    enable : function(){
+        this.setDisabled(false);
+    },
+
+    
+    disable : function(){
+        this.setDisabled(true);
+    },
+
+    
+    isDisabled : function(){
+        return this.initialConfig.disabled;
+    },
+
+    
+    setHidden : function(v){
+        this.initialConfig.hidden = v;
+        this.callEach('setVisible', [!v]);
+    },
+
+    
+    show : function(){
+        this.setHidden(false);
+    },
+
+    
+    hide : function(){
+        this.setHidden(true);
+    },
+
+    
+    isHidden : function(){
+        return this.initialConfig.hidden;
+    },
+
+    
+    setHandler : function(fn, scope){
+        this.initialConfig.handler = fn;
+        this.initialConfig.scope = scope;
+        this.callEach('setHandler', [fn, scope]);
+    },
+
+    
+    each : function(fn, scope){
+        Ext.each(this.items, fn, scope);
+    },
+
+    
+    callEach : function(fnName, args){
+        var cs = this.items;
+        for(var i = 0, len = cs.length; i < len; i++){
+            cs[i][fnName].apply(cs[i], args);
+        }
+    },
+
+    
+    addComponent : function(comp){
+        this.items.push(comp);
+        comp.on('destroy', this.removeComponent, this);
+    },
+
+    
+    removeComponent : function(comp){
+        this.items.remove(comp);
+    },
+
+    
+    execute : function(){
+        this.initialConfig.handler.apply(this.initialConfig.scope || window, arguments);
+    }
+});
+
+(function(){
+Ext.Layer = function(config, existingEl){
+    config = config || {};
+    var dh = Ext.DomHelper,
+        cp = config.parentEl, pel = cp ? Ext.getDom(cp) : document.body;
+        
+    if (existingEl) {
+        this.dom = Ext.getDom(existingEl);
+    }
+    if(!this.dom){
+        var o = config.dh || {tag: 'div', cls: 'x-layer'};
+        this.dom = dh.append(pel, o);
+    }
+    if(config.cls){
+        this.addClass(config.cls);
+    }
+    this.constrain = config.constrain !== false;
+    this.setVisibilityMode(Ext.Element.VISIBILITY);
+    if(config.id){
+        this.id = this.dom.id = config.id;
+    }else{
+        this.id = Ext.id(this.dom);
+    }
+    this.zindex = config.zindex || this.getZIndex();
+    this.position('absolute', this.zindex);
+    if(config.shadow){
+        this.shadowOffset = config.shadowOffset || 4;
+        this.shadow = new Ext.Shadow({
+            offset : this.shadowOffset,
+            mode : config.shadow
+        });
+    }else{
+        this.shadowOffset = 0;
+    }
+    this.useShim = config.shim !== false && Ext.useShims;
+    this.useDisplay = config.useDisplay;
+    this.hide();
+};
+
+var supr = Ext.Element.prototype;
+
+
+var shims = [];
+
+Ext.extend(Ext.Layer, Ext.Element, {
+
+    getZIndex : function(){
+        return this.zindex || parseInt((this.getShim() || this).getStyle('z-index'), 10) || 11000;
+    },
+
+    getShim : function(){
+        if(!this.useShim){
+            return null;
+        }
+        if(this.shim){
+            return this.shim;
+        }
+        var shim = shims.shift();
+        if(!shim){
+            shim = this.createShim();
+            shim.enableDisplayMode('block');
+            shim.dom.style.display = 'none';
+            shim.dom.style.visibility = 'visible';
+        }
+        var pn = this.dom.parentNode;
+        if(shim.dom.parentNode != pn){
+            pn.insertBefore(shim.dom, this.dom);
+        }
+        shim.setStyle('z-index', this.getZIndex()-2);
+        this.shim = shim;
+        return shim;
+    },
+
+    hideShim : function(){
+        if(this.shim){
+            this.shim.setDisplayed(false);
+            shims.push(this.shim);
+            delete this.shim;
+        }
+    },
+
+    disableShadow : function(){
+        if(this.shadow){
+            this.shadowDisabled = true;
+            this.shadow.hide();
+            this.lastShadowOffset = this.shadowOffset;
+            this.shadowOffset = 0;
+        }
+    },
+
+    enableShadow : function(show){
+        if(this.shadow){
+            this.shadowDisabled = false;
+            this.shadowOffset = this.lastShadowOffset;
+            delete this.lastShadowOffset;
+            if(show){
+                this.sync(true);
+            }
+        }
+    },
+
+    
+    
+    
+    sync : function(doShow){
+        var shadow = this.shadow;
+        if(!this.updating && this.isVisible() && (shadow || this.useShim)){
+            var shim = this.getShim(),
+                w = this.getWidth(),
+                h = this.getHeight(),
+                l = this.getLeft(true),
+                t = this.getTop(true);
+
+            if(shadow && !this.shadowDisabled){
+                if(doShow && !shadow.isVisible()){
+                    shadow.show(this);
+                }else{
+                    shadow.realign(l, t, w, h);
+                }
+                if(shim){
+                    if(doShow){
+                       shim.show();
+                    }
+                    
+                    var shadowAdj = shadow.el.getXY(), shimStyle = shim.dom.style,
+                        shadowSize = shadow.el.getSize();
+                    shimStyle.left = (shadowAdj[0])+'px';
+                    shimStyle.top = (shadowAdj[1])+'px';
+                    shimStyle.width = (shadowSize.width)+'px';
+                    shimStyle.height = (shadowSize.height)+'px';
+                }
+            }else if(shim){
+                if(doShow){
+                   shim.show();
+                }
+                shim.setSize(w, h);
+                shim.setLeftTop(l, t);
+            }
+        }
+    },
+
+    
+    destroy : function(){
+        this.hideShim();
+        if(this.shadow){
+            this.shadow.hide();
+        }
+        this.removeAllListeners();
+        Ext.removeNode(this.dom);
+        delete this.dom;
+    },
+
+    remove : function(){
+        this.destroy();
+    },
+
+    
+    beginUpdate : function(){
+        this.updating = true;
+    },
+
+    
+    endUpdate : function(){
+        this.updating = false;
+        this.sync(true);
+    },
+
+    
+    hideUnders : function(negOffset){
+        if(this.shadow){
+            this.shadow.hide();
+        }
+        this.hideShim();
+    },
+
+    
+    constrainXY : function(){
+        if(this.constrain){
+            var vw = Ext.lib.Dom.getViewWidth(),
+                vh = Ext.lib.Dom.getViewHeight();
+            var s = Ext.getDoc().getScroll();
+
+            var xy = this.getXY();
+            var x = xy[0], y = xy[1];
+            var so = this.shadowOffset;
+            var w = this.dom.offsetWidth+so, h = this.dom.offsetHeight+so;
+            
+            var moved = false;
+            
+            if((x + w) > vw+s.left){
+                x = vw - w - so;
+                moved = true;
+            }
+            if((y + h) > vh+s.top){
+                y = vh - h - so;
+                moved = true;
+            }
+            
+            if(x < s.left){
+                x = s.left;
+                moved = true;
+            }
+            if(y < s.top){
+                y = s.top;
+                moved = true;
+            }
+            if(moved){
+                if(this.avoidY){
+                    var ay = this.avoidY;
+                    if(y <= ay && (y+h) >= ay){
+                        y = ay-h-5;
+                    }
+                }
+                xy = [x, y];
+                this.storeXY(xy);
+                supr.setXY.call(this, xy);
+                this.sync();
+            }
+        }
+        return this;
+    },
+    
+    getConstrainOffset : function(){
+        return this.shadowOffset;    
+    },
+
+    isVisible : function(){
+        return this.visible;
+    },
+
+    
+    showAction : function(){
+        this.visible = true; 
+        if(this.useDisplay === true){
+            this.setDisplayed('');
+        }else if(this.lastXY){
+            supr.setXY.call(this, this.lastXY);
+        }else if(this.lastLT){
+            supr.setLeftTop.call(this, this.lastLT[0], this.lastLT[1]);
+        }
+    },
+
+    
+    hideAction : function(){
+        this.visible = false;
+        if(this.useDisplay === true){
+            this.setDisplayed(false);
+        }else{
+            this.setLeftTop(-10000,-10000);
+        }
+    },
+
+    
+    setVisible : function(v, a, d, c, e){
+        if(v){
+            this.showAction();
+        }
+        if(a && v){
+            var cb = function(){
+                this.sync(true);
+                if(c){
+                    c();
+                }
+            }.createDelegate(this);
+            supr.setVisible.call(this, true, true, d, cb, e);
+        }else{
+            if(!v){
+                this.hideUnders(true);
+            }
+            var cb = c;
+            if(a){
+                cb = function(){
+                    this.hideAction();
+                    if(c){
+                        c();
+                    }
+                }.createDelegate(this);
+            }
+            supr.setVisible.call(this, v, a, d, cb, e);
+            if(v){
+                this.sync(true);
+            }else if(!a){
+                this.hideAction();
+            }
+        }
+        return this;
+    },
+
+    storeXY : function(xy){
+        delete this.lastLT;
+        this.lastXY = xy;
+    },
+
+    storeLeftTop : function(left, top){
+        delete this.lastXY;
+        this.lastLT = [left, top];
+    },
+
+    
+    beforeFx : function(){
+        this.beforeAction();
+        return Ext.Layer.superclass.beforeFx.apply(this, arguments);
+    },
+
+    
+    afterFx : function(){
+        Ext.Layer.superclass.afterFx.apply(this, arguments);
+        this.sync(this.isVisible());
+    },
+
+    
+    beforeAction : function(){
+        if(!this.updating && this.shadow){
+            this.shadow.hide();
+        }
+    },
+
+    
+    setLeft : function(left){
+        this.storeLeftTop(left, this.getTop(true));
+        supr.setLeft.apply(this, arguments);
+        this.sync();
+        return this;
+    },
+
+    setTop : function(top){
+        this.storeLeftTop(this.getLeft(true), top);
+        supr.setTop.apply(this, arguments);
+        this.sync();
+        return this;
+    },
+
+    setLeftTop : function(left, top){
+        this.storeLeftTop(left, top);
+        supr.setLeftTop.apply(this, arguments);
+        this.sync();
+        return this;
+    },
+
+    setXY : function(xy, a, d, c, e){
+        this.fixDisplay();
+        this.beforeAction();
+        this.storeXY(xy);
+        var cb = this.createCB(c);
+        supr.setXY.call(this, xy, a, d, cb, e);
+        if(!a){
+            cb();
+        }
+        return this;
+    },
+
+    
+    createCB : function(c){
+        var el = this;
+        return function(){
+            el.constrainXY();
+            el.sync(true);
+            if(c){
+                c();
+            }
+        };
+    },
+
+    
+    setX : function(x, a, d, c, e){
+        this.setXY([x, this.getY()], a, d, c, e);
+        return this;
+    },
+
+    
+    setY : function(y, a, d, c, e){
+        this.setXY([this.getX(), y], a, d, c, e);
+        return this;
+    },
+
+    
+    setSize : function(w, h, a, d, c, e){
+        this.beforeAction();
+        var cb = this.createCB(c);
+        supr.setSize.call(this, w, h, a, d, cb, e);
+        if(!a){
+            cb();
+        }
+        return this;
+    },
+
+    
+    setWidth : function(w, a, d, c, e){
+        this.beforeAction();
+        var cb = this.createCB(c);
+        supr.setWidth.call(this, w, a, d, cb, e);
+        if(!a){
+            cb();
+        }
+        return this;
+    },
+
+    
+    setHeight : function(h, a, d, c, e){
+        this.beforeAction();
+        var cb = this.createCB(c);
+        supr.setHeight.call(this, h, a, d, cb, e);
+        if(!a){
+            cb();
+        }
+        return this;
+    },
+
+    
+    setBounds : function(x, y, w, h, a, d, c, e){
+        this.beforeAction();
+        var cb = this.createCB(c);
+        if(!a){
+            this.storeXY([x, y]);
+            supr.setXY.call(this, [x, y]);
+            supr.setSize.call(this, w, h, a, d, cb, e);
+            cb();
+        }else{
+            supr.setBounds.call(this, x, y, w, h, a, d, cb, e);
+        }
+        return this;
+    },
+
+    
+    setZIndex : function(zindex){
+        this.zindex = zindex;
+        this.setStyle('z-index', zindex + 2);
+        if(this.shadow){
+            this.shadow.setZIndex(zindex + 1);
+        }
+        if(this.shim){
+            this.shim.setStyle('z-index', zindex);
+        }
+        return this;
+    }
+});
+})();
+
+Ext.Shadow = function(config) {
+    Ext.apply(this, config);
+    if (typeof this.mode != "string") {
+        this.mode = this.defaultMode;
+    }
+    var o = this.offset,
+        a = {
+            h: 0
+        },
+        rad = Math.floor(this.offset / 2);
+    switch (this.mode.toLowerCase()) {
+        
+        case "drop":
+            a.w = 0;
+            a.l = a.t = o;
+            a.t -= 1;
+            if (Ext.isIE) {
+                a.l -= this.offset + rad;
+                a.t -= this.offset + rad;
+                a.w -= rad;
+                a.h -= rad;
+                a.t += 1;
+            }
+        break;
+        case "sides":
+            a.w = (o * 2);
+            a.l = -o;
+            a.t = o - 1;
+            if (Ext.isIE) {
+                a.l -= (this.offset - rad);
+                a.t -= this.offset + rad;
+                a.l += 1;
+                a.w -= (this.offset - rad) * 2;
+                a.w -= rad + 1;
+                a.h -= 1;
+            }
+        break;
+        case "frame":
+            a.w = a.h = (o * 2);
+            a.l = a.t = -o;
+            a.t += 1;
+            a.h -= 2;
+            if (Ext.isIE) {
+                a.l -= (this.offset - rad);
+                a.t -= (this.offset - rad);
+                a.l += 1;
+                a.w -= (this.offset + rad + 1);
+                a.h -= (this.offset + rad);
+                a.h += 1;
+            }
+        break;
+    };
+
+    this.adjusts = a;
+};
+
+Ext.Shadow.prototype = {
+    
+    
+    offset: 4,
+
+    
+    defaultMode: "drop",
+
+    
+    show: function(target) {
+        target = Ext.get(target);
+        if (!this.el) {
+            this.el = Ext.Shadow.Pool.pull();
+            if (this.el.dom.nextSibling != target.dom) {
+                this.el.insertBefore(target);
+            }
+        }
+        this.el.setStyle("z-index", this.zIndex || parseInt(target.getStyle("z-index"), 10) - 1);
+        if (Ext.isIE) {
+            this.el.dom.style.filter = "progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius=" + (this.offset) + ")";
+        }
+        this.realign(
+        target.getLeft(true),
+        target.getTop(true),
+        target.getWidth(),
+        target.getHeight()
+        );
+        this.el.dom.style.display = "block";
+    },
+
+    
+    isVisible: function() {
+        return this.el ? true: false;
+    },
+
+    
+    realign: function(l, t, w, h) {
+        if (!this.el) {
+            return;
+        }
+        var a = this.adjusts,
+            d = this.el.dom,
+            s = d.style,
+            iea = 0,
+            sw = (w + a.w),
+            sh = (h + a.h),
+            sws = sw + "px",
+            shs = sh + "px",
+            cn,
+            sww;
+        s.left = (l + a.l) + "px";
+        s.top = (t + a.t) + "px";
+        if (s.width != sws || s.height != shs) {
+            s.width = sws;
+            s.height = shs;
+            if (!Ext.isIE) {
+                cn = d.childNodes;
+                sww = Math.max(0, (sw - 12)) + "px";
+                cn[0].childNodes[1].style.width = sww;
+                cn[1].childNodes[1].style.width = sww;
+                cn[2].childNodes[1].style.width = sww;
+                cn[1].style.height = Math.max(0, (sh - 12)) + "px";
+            }
+        }
+    },
+
+    
+    hide: function() {
+        if (this.el) {
+            this.el.dom.style.display = "none";
+            Ext.Shadow.Pool.push(this.el);
+            delete this.el;
+        }
+    },
+
+    
+    setZIndex: function(z) {
+        this.zIndex = z;
+        if (this.el) {
+            this.el.setStyle("z-index", z);
+        }
+    }
+};
+
+
+Ext.Shadow.Pool = function() {
+    var p = [],
+        markup = Ext.isIE ?
+            '<div class="x-ie-shadow"></div>':
+            '<div class="x-shadow"><div class="xst"><div class="xstl"></div><div class="xstc"></div><div class="xstr"></div></div><div class="xsc"><div class="xsml"></div><div class="xsmc"></div><div class="xsmr"></div></div><div class="xsb"><div class="xsbl"></div><div class="xsbc"></div><div class="xsbr"></div></div></div>';
+    return {
+        pull: function() {
+            var sh = p.shift();
+            if (!sh) {
+                sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, markup));
+                sh.autoBoxAdjust = false;
+            }
+            return sh;
+        },
+
+        push: function(sh) {
+            p.push(sh);
+        }
+    };
+}();
+Ext.BoxComponent = Ext.extend(Ext.Component, {
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+
+    
+
+    
+    initComponent : function(){
+        Ext.BoxComponent.superclass.initComponent.call(this);
+        this.addEvents(
+            
+            'resize',
+            
+            'move'
+        );
+    },
+
+    
+    boxReady : false,
+    
+    deferHeight: false,
+
+    
+    setSize : function(w, h){
+
+        
+        if(typeof w == 'object'){
+            h = w.height;
+            w = w.width;
+        }
+        if (Ext.isDefined(w) && Ext.isDefined(this.boxMinWidth) && (w < this.boxMinWidth)) {
+            w = this.boxMinWidth;
+        }
+        if (Ext.isDefined(h) && Ext.isDefined(this.boxMinHeight) && (h < this.boxMinHeight)) {
+            h = this.boxMinHeight;
+        }
+        if (Ext.isDefined(w) && Ext.isDefined(this.boxMaxWidth) && (w > this.boxMaxWidth)) {
+            w = this.boxMaxWidth;
+        }
+        if (Ext.isDefined(h) && Ext.isDefined(this.boxMaxHeight) && (h > this.boxMaxHeight)) {
+            h = this.boxMaxHeight;
+        }
+        
+        if(!this.boxReady){
+            this.width  = w;
+            this.height = h;
+            return this;
+        }
+
+        
+        if(this.cacheSizes !== false && this.lastSize && this.lastSize.width == w && this.lastSize.height == h){
+            return this;
+        }
+        this.lastSize = {width: w, height: h};
+        var adj = this.adjustSize(w, h),
+            aw = adj.width,
+            ah = adj.height,
+            rz;
+        if(aw !== undefined || ah !== undefined){ 
+            rz = this.getResizeEl();
+            if(!this.deferHeight && aw !== undefined && ah !== undefined){
+                rz.setSize(aw, ah);
+            }else if(!this.deferHeight && ah !== undefined){
+                rz.setHeight(ah);
+            }else if(aw !== undefined){
+                rz.setWidth(aw);
+            }
+            this.onResize(aw, ah, w, h);
+            this.fireEvent('resize', this, aw, ah, w, h);
+        }
+        return this;
+    },
+
+    
+    setWidth : function(width){
+        return this.setSize(width);
+    },
+
+    
+    setHeight : function(height){
+        return this.setSize(undefined, height);
+    },
+
+    
+    getSize : function(){
+        return this.getResizeEl().getSize();
+    },
+
+    
+    getWidth : function(){
+        return this.getResizeEl().getWidth();
+    },
+
+    
+    getHeight : function(){
+        return this.getResizeEl().getHeight();
+    },
+
+    
+    getOuterSize : function(){
+        var el = this.getResizeEl();
+        return {width: el.getWidth() + el.getMargins('lr'),
+                height: el.getHeight() + el.getMargins('tb')};
+    },
+
+    
+    getPosition : function(local){
+        var el = this.getPositionEl();
+        if(local === true){
+            return [el.getLeft(true), el.getTop(true)];
+        }
+        return this.xy || el.getXY();
+    },
+
+    
+    getBox : function(local){
+        var pos = this.getPosition(local);
+        var s = this.getSize();
+        s.x = pos[0];
+        s.y = pos[1];
+        return s;
+    },
+
+    
+    updateBox : function(box){
+        this.setSize(box.width, box.height);
+        this.setPagePosition(box.x, box.y);
+        return this;
+    },
+
+    
+    getResizeEl : function(){
+        return this.resizeEl || this.el;
+    },
+
+    
+    setAutoScroll : function(scroll){
+        if(this.rendered){
+            this.getContentTarget().setOverflow(scroll ? 'auto' : '');
+        }
+        this.autoScroll = scroll;
+        return this;
+    },
+
+    
+    setPosition : function(x, y){
+        if(x && typeof x[1] == 'number'){
+            y = x[1];
+            x = x[0];
+        }
+        this.x = x;
+        this.y = y;
+        if(!this.boxReady){
+            return this;
+        }
+        var adj = this.adjustPosition(x, y);
+        var ax = adj.x, ay = adj.y;
+
+        var el = this.getPositionEl();
+        if(ax !== undefined || ay !== undefined){
+            if(ax !== undefined && ay !== undefined){
+                el.setLeftTop(ax, ay);
+            }else if(ax !== undefined){
+                el.setLeft(ax);
+            }else if(ay !== undefined){
+                el.setTop(ay);
+            }
+            this.onPosition(ax, ay);
+            this.fireEvent('move', this, ax, ay);
+        }
+        return this;
+    },
+
+    
+    setPagePosition : function(x, y){
+        if(x && typeof x[1] == 'number'){
+            y = x[1];
+            x = x[0];
+        }
+        this.pageX = x;
+        this.pageY = y;
+        if(!this.boxReady){
+            return;
+        }
+        if(x === undefined || y === undefined){ 
+            return;
+        }
+        var p = this.getPositionEl().translatePoints(x, y);
+        this.setPosition(p.left, p.top);
+        return this;
+    },
+
+    
+    afterRender : function(){
+        Ext.BoxComponent.superclass.afterRender.call(this);
+        if(this.resizeEl){
+            this.resizeEl = Ext.get(this.resizeEl);
+        }
+        if(this.positionEl){
+            this.positionEl = Ext.get(this.positionEl);
+        }
+        this.boxReady = true;
+        Ext.isDefined(this.autoScroll) && this.setAutoScroll(this.autoScroll);
+        this.setSize(this.width, this.height);
+        if(this.x || this.y){
+            this.setPosition(this.x, this.y);
+        }else if(this.pageX || this.pageY){
+            this.setPagePosition(this.pageX, this.pageY);
+        }
+    },
+
+    
+    syncSize : function(){
+        delete this.lastSize;
+        this.setSize(this.autoWidth ? undefined : this.getResizeEl().getWidth(), this.autoHeight ? undefined : this.getResizeEl().getHeight());
+        return this;
+    },
+
+    
+    onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){
+    },
+
+    
+    onPosition : function(x, y){
+
+    },
+
+    
+    adjustSize : function(w, h){
+        if(this.autoWidth){
+            w = 'auto';
+        }
+        if(this.autoHeight){
+            h = 'auto';
+        }
+        return {width : w, height: h};
+    },
+
+    
+    adjustPosition : function(x, y){
+        return {x : x, y: y};
+    }
+});
+Ext.reg('box', Ext.BoxComponent);
+
+
+
+Ext.Spacer = Ext.extend(Ext.BoxComponent, {
+    autoEl:'div'
+});
+Ext.reg('spacer', Ext.Spacer);
+Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){
+
+    
+    this.el = Ext.get(dragElement, true);
+    this.el.dom.unselectable = "on";
+    
+    this.resizingEl = Ext.get(resizingElement, true);
+
+    
+    this.orientation = orientation || Ext.SplitBar.HORIZONTAL;
+
+    
+    
+    this.minSize = 0;
+
+    
+    this.maxSize = 2000;
+
+    
+    this.animate = false;
+
+    
+    this.useShim = false;
+
+    
+    this.shim = null;
+
+    if(!existingProxy){
+        
+        this.proxy = Ext.SplitBar.createProxy(this.orientation);
+    }else{
+        this.proxy = Ext.get(existingProxy).dom;
+    }
+    
+    this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {dragElId : this.proxy.id});
+
+    
+    this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this);
+
+    
+    this.dd.endDrag = this.onEndProxyDrag.createDelegate(this);
+
+    
+    this.dragSpecs = {};
+
+    
+    this.adapter = new Ext.SplitBar.BasicLayoutAdapter();
+    this.adapter.init(this);
+
+    if(this.orientation == Ext.SplitBar.HORIZONTAL){
+        
+        this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT);
+        this.el.addClass("x-splitbar-h");
+    }else{
+        
+        this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM);
+        this.el.addClass("x-splitbar-v");
+    }
+
+    this.addEvents(
+        
+        "resize",
+        
+        "moved",
+        
+        "beforeresize",
+
+        "beforeapply"
+    );
+
+    Ext.SplitBar.superclass.constructor.call(this);
+};
+
+Ext.extend(Ext.SplitBar, Ext.util.Observable, {
+    onStartProxyDrag : function(x, y){
+        this.fireEvent("beforeresize", this);
+        this.overlay =  Ext.DomHelper.append(document.body,  {cls: "x-drag-overlay", html: "&#160;"}, true);
+        this.overlay.unselectable();
+        this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
+        this.overlay.show();
+        Ext.get(this.proxy).setDisplayed("block");
+        var size = this.adapter.getElementSize(this);
+        this.activeMinSize = this.getMinimumSize();
+        this.activeMaxSize = this.getMaximumSize();
+        var c1 = size - this.activeMinSize;
+        var c2 = Math.max(this.activeMaxSize - size, 0);
+        if(this.orientation == Ext.SplitBar.HORIZONTAL){
+            this.dd.resetConstraints();
+            this.dd.setXConstraint(
+                this.placement == Ext.SplitBar.LEFT ? c1 : c2,
+                this.placement == Ext.SplitBar.LEFT ? c2 : c1,
+                this.tickSize
+            );
+            this.dd.setYConstraint(0, 0);
+        }else{
+            this.dd.resetConstraints();
+            this.dd.setXConstraint(0, 0);
+            this.dd.setYConstraint(
+                this.placement == Ext.SplitBar.TOP ? c1 : c2,
+                this.placement == Ext.SplitBar.TOP ? c2 : c1,
+                this.tickSize
+            );
+         }
+        this.dragSpecs.startSize = size;
+        this.dragSpecs.startPoint = [x, y];
+        Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, x, y);
+    },
+
+    
+    onEndProxyDrag : function(e){
+        Ext.get(this.proxy).setDisplayed(false);
+        var endPoint = Ext.lib.Event.getXY(e);
+        if(this.overlay){
+            Ext.destroy(this.overlay);
+            delete this.overlay;
+        }
+        var newSize;
+        if(this.orientation == Ext.SplitBar.HORIZONTAL){
+            newSize = this.dragSpecs.startSize +
+                (this.placement == Ext.SplitBar.LEFT ?
+                    endPoint[0] - this.dragSpecs.startPoint[0] :
+                    this.dragSpecs.startPoint[0] - endPoint[0]
+                );
+        }else{
+            newSize = this.dragSpecs.startSize +
+                (this.placement == Ext.SplitBar.TOP ?
+                    endPoint[1] - this.dragSpecs.startPoint[1] :
+                    this.dragSpecs.startPoint[1] - endPoint[1]
+                );
+        }
+        newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize);
+        if(newSize != this.dragSpecs.startSize){
+            if(this.fireEvent('beforeapply', this, newSize) !== false){
+                this.adapter.setElementSize(this, newSize);
+                this.fireEvent("moved", this, newSize);
+                this.fireEvent("resize", this, newSize);
+            }
+        }
+    },
+
+    
+    getAdapter : function(){
+        return this.adapter;
+    },
+
+    
+    setAdapter : function(adapter){
+        this.adapter = adapter;
+        this.adapter.init(this);
+    },
+
+    
+    getMinimumSize : function(){
+        return this.minSize;
+    },
+
+    
+    setMinimumSize : function(minSize){
+        this.minSize = minSize;
+    },
+
+    
+    getMaximumSize : function(){
+        return this.maxSize;
+    },
+
+    
+    setMaximumSize : function(maxSize){
+        this.maxSize = maxSize;
+    },
+
+    
+    setCurrentSize : function(size){
+        var oldAnimate = this.animate;
+        this.animate = false;
+        this.adapter.setElementSize(this, size);
+        this.animate = oldAnimate;
+    },
+
+    
+    destroy : function(removeEl){
+        Ext.destroy(this.shim, Ext.get(this.proxy));
+        this.dd.unreg();
+        if(removeEl){
+            this.el.remove();
+        }
+        this.purgeListeners();
+    }
+});
+
+
+Ext.SplitBar.createProxy = function(dir){
+    var proxy = new Ext.Element(document.createElement("div"));
+    document.body.appendChild(proxy.dom);
+    proxy.unselectable();
+    var cls = 'x-splitbar-proxy';
+    proxy.addClass(cls + ' ' + (dir == Ext.SplitBar.HORIZONTAL ? cls +'-h' : cls + '-v'));
+    return proxy.dom;
+};
+
+
+Ext.SplitBar.BasicLayoutAdapter = function(){
+};
+
+Ext.SplitBar.BasicLayoutAdapter.prototype = {
+    
+    init : function(s){
+
+    },
+    
+     getElementSize : function(s){
+        if(s.orientation == Ext.SplitBar.HORIZONTAL){
+            return s.resizingEl.getWidth();
+        }else{
+            return s.resizingEl.getHeight();
+        }
+    },
+
+    
+    setElementSize : function(s, newSize, onComplete){
+        if(s.orientation == Ext.SplitBar.HORIZONTAL){
+            if(!s.animate){
+                s.resizingEl.setWidth(newSize);
+                if(onComplete){
+                    onComplete(s, newSize);
+                }
+            }else{
+                s.resizingEl.setWidth(newSize, true, .1, onComplete, 'easeOut');
+            }
+        }else{
+
+            if(!s.animate){
+                s.resizingEl.setHeight(newSize);
+                if(onComplete){
+                    onComplete(s, newSize);
+                }
+            }else{
+                s.resizingEl.setHeight(newSize, true, .1, onComplete, 'easeOut');
+            }
+        }
+    }
+};
+
+
+Ext.SplitBar.AbsoluteLayoutAdapter = function(container){
+    this.basic = new Ext.SplitBar.BasicLayoutAdapter();
+    this.container = Ext.get(container);
+};
+
+Ext.SplitBar.AbsoluteLayoutAdapter.prototype = {
+    init : function(s){
+        this.basic.init(s);
+    },
+
+    getElementSize : function(s){
+        return this.basic.getElementSize(s);
+    },
+
+    setElementSize : function(s, newSize, onComplete){
+        this.basic.setElementSize(s, newSize, this.moveSplitter.createDelegate(this, [s]));
+    },
+
+    moveSplitter : function(s){
+        var yes = Ext.SplitBar;
+        switch(s.placement){
+            case yes.LEFT:
+                s.el.setX(s.resizingEl.getRight());
+                break;
+            case yes.RIGHT:
+                s.el.setStyle("right", (this.container.getWidth() - s.resizingEl.getLeft()) + "px");
+                break;
+            case yes.TOP:
+                s.el.setY(s.resizingEl.getBottom());
+                break;
+            case yes.BOTTOM:
+                s.el.setY(s.resizingEl.getTop() - s.el.getHeight());
+                break;
+        }
+    }
+};
+
+
+Ext.SplitBar.VERTICAL = 1;
+
+
+Ext.SplitBar.HORIZONTAL = 2;
+
+
+Ext.SplitBar.LEFT = 1;
+
+
+Ext.SplitBar.RIGHT = 2;
+
+
+Ext.SplitBar.TOP = 3;
+
+
+Ext.SplitBar.BOTTOM = 4;
+
+Ext.Container = Ext.extend(Ext.BoxComponent, {
+    
+    
+    
+    
+    bufferResize: 50,
+
+    
+    
+    
+
+
+    
+    autoDestroy : true,
+
+    
+    forceLayout: false,
+
+    
+    
+    defaultType : 'panel',
+
+    
+    resizeEvent: 'resize',
+
+    
+    bubbleEvents: ['add', 'remove'],
+
+    
+    initComponent : function(){
+        Ext.Container.superclass.initComponent.call(this);
+
+        this.addEvents(
+            
+            'afterlayout',
+            
+            'beforeadd',
+            
+            'beforeremove',
+            
+            'add',
+            
+            'remove'
+        );
+
+        
+        var items = this.items;
+        if(items){
+            delete this.items;
+            this.add(items);
+        }
+    },
+
+    
+    initItems : function(){
+        if(!this.items){
+            this.items = new Ext.util.MixedCollection(false, this.getComponentId);
+            this.getLayout(); 
+        }
+    },
+
+    
+    setLayout : function(layout){
+        if(this.layout && this.layout != layout){
+            this.layout.setContainer(null);
+        }
+        this.layout = layout;
+        this.initItems();
+        layout.setContainer(this);
+    },
+
+    afterRender: function(){
+        
+        
+        Ext.Container.superclass.afterRender.call(this);
+        if(!this.layout){
+            this.layout = 'auto';
+        }
+        if(Ext.isObject(this.layout) && !this.layout.layout){
+            this.layoutConfig = this.layout;
+            this.layout = this.layoutConfig.type;
+        }
+        if(Ext.isString(this.layout)){
+            this.layout = new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig);
+        }
+        this.setLayout(this.layout);
+
+        
+        if(this.activeItem !== undefined && this.layout.setActiveItem){
+            var item = this.activeItem;
+            delete this.activeItem;
+            this.layout.setActiveItem(item);
+        }
+
+        
+        if(!this.ownerCt){
+            this.doLayout(false, true);
+        }
+
+        
+        
+        if(this.monitorResize === true){
+            Ext.EventManager.onWindowResize(this.doLayout, this, [false]);
+        }
+    },
+
+    
+    getLayoutTarget : function(){
+        return this.el;
+    },
+
+    
+    getComponentId : function(comp){
+        return comp.getItemId();
+    },
+
+    
+    add : function(comp){
+        this.initItems();
+        var args = arguments.length > 1;
+        if(args || Ext.isArray(comp)){
+            var result = [];
+            Ext.each(args ? arguments : comp, function(c){
+                result.push(this.add(c));
+            }, this);
+            return result;
+        }
+        var c = this.lookupComponent(this.applyDefaults(comp));
+        var index = this.items.length;
+        if(this.fireEvent('beforeadd', this, c, index) !== false && this.onBeforeAdd(c) !== false){
+            this.items.add(c);
+            
+            c.onAdded(this, index);
+            this.onAdd(c);
+            this.fireEvent('add', this, c, index);
+        }
+        return c;
+    },
+
+    onAdd : function(c){
+        
+    },
+
+    
+    onAdded : function(container, pos) {
+        
+        this.ownerCt = container;
+        this.initRef();
+        
+        this.cascade(function(c){
+            c.initRef();
+        });
+        this.fireEvent('added', this, container, pos);
+    },
+
+    
+    insert : function(index, comp) {
+        var args   = arguments,
+            length = args.length,
+            result = [],
+            i, c;
+        
+        this.initItems();
+        
+        if (length > 2) {
+            for (i = length - 1; i >= 1; --i) {
+                result.push(this.insert(index, args[i]));
+            }
+            return result;
+        }
+        
+        c = this.lookupComponent(this.applyDefaults(comp));
+        index = Math.min(index, this.items.length);
+        
+        if (this.fireEvent('beforeadd', this, c, index) !== false && this.onBeforeAdd(c) !== false) {
+            if (c.ownerCt == this) {
+                this.items.remove(c);
+            }
+            this.items.insert(index, c);
+            c.onAdded(this, index);
+            this.onAdd(c);
+            this.fireEvent('add', this, c, index);
+        }
+        
+        return c;
+    },
+
+    
+    applyDefaults : function(c){
+        var d = this.defaults;
+        if(d){
+            if(Ext.isFunction(d)){
+                d = d.call(this, c);
+            }
+            if(Ext.isString(c)){
+                c = Ext.ComponentMgr.get(c);
+                Ext.apply(c, d);
+            }else if(!c.events){
+                Ext.applyIf(c.isAction ? c.initialConfig : c, d);
+            }else{
+                Ext.apply(c, d);
+            }
+        }
+        return c;
+    },
+
+    
+    onBeforeAdd : function(item){
+        if(item.ownerCt){
+            item.ownerCt.remove(item, false);
+        }
+        if(this.hideBorders === true){
+            item.border = (item.border === true);
+        }
+    },
+
+    
+    remove : function(comp, autoDestroy){
+        this.initItems();
+        var c = this.getComponent(comp);
+        if(c && this.fireEvent('beforeremove', this, c) !== false){
+            this.doRemove(c, autoDestroy);
+            this.fireEvent('remove', this, c);
+        }
+        return c;
+    },
+
+    onRemove: function(c){
+        
+    },
+
+    
+    doRemove: function(c, autoDestroy){
+        var l = this.layout,
+            hasLayout = l && this.rendered;
+
+        if(hasLayout){
+            l.onRemove(c);
+        }
+        this.items.remove(c);
+        c.onRemoved();
+        this.onRemove(c);
+        if(autoDestroy === true || (autoDestroy !== false && this.autoDestroy)){
+            c.destroy();
+        }
+        if(hasLayout){
+            l.afterRemove(c);
+        }
+    },
+
+    
+    removeAll: function(autoDestroy){
+        this.initItems();
+        var item, rem = [], items = [];
+        this.items.each(function(i){
+            rem.push(i);
+        });
+        for (var i = 0, len = rem.length; i < len; ++i){
+            item = rem[i];
+            this.remove(item, autoDestroy);
+            if(item.ownerCt !== this){
+                items.push(item);
+            }
+        }
+        return items;
+    },
+
+    
+    getComponent : function(comp){
+        if(Ext.isObject(comp)){
+            comp = comp.getItemId();
+        }
+        return this.items.get(comp);
+    },
+
+    
+    lookupComponent : function(comp){
+        if(Ext.isString(comp)){
+            return Ext.ComponentMgr.get(comp);
+        }else if(!comp.events){
+            return this.createComponent(comp);
+        }
+        return comp;
+    },
+
+    
+    createComponent : function(config, defaultType){
+        if (config.render) {
+            return config;
+        }
+        
+        
+        var c = Ext.create(Ext.apply({
+            ownerCt: this
+        }, config), defaultType || this.defaultType);
+        delete c.initialConfig.ownerCt;
+        delete c.ownerCt;
+        return c;
+    },
+
+    
+    canLayout : function() {
+        var el = this.getVisibilityEl();
+        return el && el.dom && !el.isStyle("display", "none");
+    },
+
+    
+
+    doLayout : function(shallow, force){
+        var rendered = this.rendered,
+            forceLayout = force || this.forceLayout;
+
+        if(this.collapsed || !this.canLayout()){
+            this.deferLayout = this.deferLayout || !shallow;
+            if(!forceLayout){
+                return;
+            }
+            shallow = shallow && !this.deferLayout;
+        } else {
+            delete this.deferLayout;
+        }
+        if(rendered && this.layout){
+            this.layout.layout();
+        }
+        if(shallow !== true && this.items){
+            var cs = this.items.items;
+            for(var i = 0, len = cs.length; i < len; i++){
+                var c = cs[i];
+                if(c.doLayout){
+                    c.doLayout(false, forceLayout);
+                }
+            }
+        }
+        if(rendered){
+            this.onLayout(shallow, forceLayout);
+        }
+        
+        this.hasLayout = true;
+        delete this.forceLayout;
+    },
+
+    onLayout : Ext.emptyFn,
+
+    
+    shouldBufferLayout: function(){
+        
+        var hl = this.hasLayout;
+        if(this.ownerCt){
+            
+            return hl ? !this.hasLayoutPending() : false;
+        }
+        
+        return hl;
+    },
+
+    
+    hasLayoutPending: function(){
+        
+        var pending = false;
+        this.ownerCt.bubble(function(c){
+            if(c.layoutPending){
+                pending = true;
+                return false;
+            }
+        });
+        return pending;
+    },
+
+    onShow : function(){
+        
+        Ext.Container.superclass.onShow.call(this);
+        
+        if(Ext.isDefined(this.deferLayout)){
+            delete this.deferLayout;
+            this.doLayout(true);
+        }
+    },
+
+    
+    getLayout : function(){
+        if(!this.layout){
+            var layout = new Ext.layout.AutoLayout(this.layoutConfig);
+            this.setLayout(layout);
+        }
+        return this.layout;
+    },
+
+    
+    beforeDestroy : function(){
+        var c;
+        if(this.items){
+            while(c = this.items.first()){
+                this.doRemove(c, true);
+            }
+        }
+        if(this.monitorResize){
+            Ext.EventManager.removeResizeListener(this.doLayout, this);
+        }
+        Ext.destroy(this.layout);
+        Ext.Container.superclass.beforeDestroy.call(this);
+    },
+
+    
+    cascade : function(fn, scope, args){
+        if(fn.apply(scope || this, args || [this]) !== false){
+            if(this.items){
+                var cs = this.items.items;
+                for(var i = 0, len = cs.length; i < len; i++){
+                    if(cs[i].cascade){
+                        cs[i].cascade(fn, scope, args);
+                    }else{
+                        fn.apply(scope || cs[i], args || [cs[i]]);
+                    }
+                }
+            }
+        }
+        return this;
+    },
+
+    
+    findById : function(id){
+        var m = null, 
+            ct = this;
+        this.cascade(function(c){
+            if(ct != c && c.id === id){
+                m = c;
+                return false;
+            }
+        });
+        return m;
+    },
+
+    
+    findByType : function(xtype, shallow){
+        return this.findBy(function(c){
+            return c.isXType(xtype, shallow);
+        });
+    },
+
+    
+    find : function(prop, value){
+        return this.findBy(function(c){
+            return c[prop] === value;
+        });
+    },
+
+    
+    findBy : function(fn, scope){
+        var m = [], ct = this;
+        this.cascade(function(c){
+            if(ct != c && fn.call(scope || c, c, ct) === true){
+                m.push(c);
+            }
+        });
+        return m;
+    },
+
+    
+    get : function(key){
+        return this.getComponent(key);
+    }
+});
+
+Ext.Container.LAYOUTS = {};
+Ext.reg('container', Ext.Container);
+
+Ext.layout.ContainerLayout = Ext.extend(Object, {
+    
+    
+
+    
+
+    
+    monitorResize:false,
+    
+    activeItem : null,
+
+    constructor : function(config){
+        this.id = Ext.id(null, 'ext-layout-');
+        Ext.apply(this, config);
+    },
+
+    type: 'container',
+
+    
+    IEMeasureHack : function(target, viewFlag) {
+        var tChildren = target.dom.childNodes, tLen = tChildren.length, c, d = [], e, i, ret;
+        for (i = 0 ; i < tLen ; i++) {
+            c = tChildren[i];
+            e = Ext.get(c);
+            if (e) {
+                d[i] = e.getStyle('display');
+                e.setStyle({display: 'none'});
+            }
+        }
+        ret = target ? target.getViewSize(viewFlag) : {};
+        for (i = 0 ; i < tLen ; i++) {
+            c = tChildren[i];
+            e = Ext.get(c);
+            if (e) {
+                e.setStyle({display: d[i]});
+            }
+        }
+        return ret;
+    },
+
+    
+    getLayoutTargetSize : Ext.EmptyFn,
+
+    
+    layout : function(){
+        var ct = this.container, target = ct.getLayoutTarget();
+        if(!(this.hasLayout || Ext.isEmpty(this.targetCls))){
+            target.addClass(this.targetCls);
+        }
+        this.onLayout(ct, target);
+        ct.fireEvent('afterlayout', ct, this);
+    },
+
+    
+    onLayout : function(ct, target){
+        this.renderAll(ct, target);
+    },
+
+    
+    isValidParent : function(c, target){
+        return target && c.getPositionEl().dom.parentNode == (target.dom || target);
+    },
+
+    
+    renderAll : function(ct, target){
+        var items = ct.items.items, i, c, len = items.length;
+        for(i = 0; i < len; i++) {
+            c = items[i];
+            if(c && (!c.rendered || !this.isValidParent(c, target))){
+                this.renderItem(c, i, target);
+            }
+        }
+    },
+
+    
+    renderItem : function(c, position, target){
+        if (c) {
+            if (!c.rendered) {
+                c.render(target, position);
+                this.configureItem(c);
+            } else if (!this.isValidParent(c, target)) {
+                if (Ext.isNumber(position)) {
+                    position = target.dom.childNodes[position];
+                }
+                
+                target.dom.insertBefore(c.getPositionEl().dom, position || null);
+                c.container = target;
+                this.configureItem(c);
+            }
+        }
+    },
+
+    
+    
+    getRenderedItems: function(ct){
+        var t = ct.getLayoutTarget(), cti = ct.items.items, len = cti.length, i, c, items = [];
+        for (i = 0; i < len; i++) {
+            if((c = cti[i]).rendered && this.isValidParent(c, t) && c.shouldLayout !== false){
+                items.push(c);
+            }
+        };
+        return items;
+    },
+
+    
+    configureItem: function(c){
+        if (this.extraCls) {
+            var t = c.getPositionEl ? c.getPositionEl() : c;
+            t.addClass(this.extraCls);
+        }
+        
+        
+        if (c.doLayout && this.forceLayout) {
+            c.doLayout();
+        }
+        if (this.renderHidden && c != this.activeItem) {
+            c.hide();
+        }
+    },
+
+    onRemove: function(c){
+        if(this.activeItem == c){
+            delete this.activeItem;
+        }
+        if(c.rendered && this.extraCls){
+            var t = c.getPositionEl ? c.getPositionEl() : c;
+            t.removeClass(this.extraCls);
+        }
+    },
+
+    afterRemove: function(c){
+        if(c.removeRestore){
+            c.removeMode = 'container';
+            delete c.removeRestore;
+        }
+    },
+
+    
+    onResize: function(){
+        var ct = this.container,
+            b;
+        if(ct.collapsed){
+            return;
+        }
+        if(b = ct.bufferResize && ct.shouldBufferLayout()){
+            if(!this.resizeTask){
+                this.resizeTask = new Ext.util.DelayedTask(this.runLayout, this);
+                this.resizeBuffer = Ext.isNumber(b) ? b : 50;
+            }
+            ct.layoutPending = true;
+            this.resizeTask.delay(this.resizeBuffer);
+        }else{
+            this.runLayout();
+        }
+    },
+
+    runLayout: function(){
+        var ct = this.container;
+        this.layout();
+        ct.onLayout();
+        delete ct.layoutPending;
+    },
+
+    
+    setContainer : function(ct){
+        
+        if(this.monitorResize && ct != this.container){
+            var old = this.container;
+            if(old){
+                old.un(old.resizeEvent, this.onResize, this);
+            }
+            if(ct){
+                ct.on(ct.resizeEvent, this.onResize, this);
+            }
+        }
+        this.container = ct;
+    },
+
+    
+    parseMargins : function(v){
+        if (Ext.isNumber(v)) {
+            v = v.toString();
+        }
+        var ms  = v.split(' '),
+            len = ms.length;
+            
+        if (len == 1) {
+            ms[1] = ms[2] = ms[3] = ms[0];
+        } else if(len == 2) {
+            ms[2] = ms[0];
+            ms[3] = ms[1];
+        } else if(len == 3) {
+            ms[3] = ms[1];
+        }
+        
+        return {
+            top   :parseInt(ms[0], 10) || 0,
+            right :parseInt(ms[1], 10) || 0,
+            bottom:parseInt(ms[2], 10) || 0,
+            left  :parseInt(ms[3], 10) || 0
+        };
+    },
+
+    
+    fieldTpl: (function() {
+        var t = new Ext.Template(
+            '<div class="x-form-item {itemCls}" tabIndex="-1">',
+                '<label for="{id}" style="{labelStyle}" class="x-form-item-label">{label}{labelSeparator}</label>',
+                '<div class="x-form-element" id="x-form-el-{id}" style="{elementStyle}">',
+                '</div><div class="{clearCls}"></div>',
+            '</div>'
+        );
+        t.disableFormats = true;
+        return t.compile();
+    })(),
+
+    
+    destroy : function(){
+        
+        if(this.resizeTask && this.resizeTask.cancel){
+            this.resizeTask.cancel();
+        }
+        if(this.container) {
+            this.container.un(this.container.resizeEvent, this.onResize, this);
+        }
+        if(!Ext.isEmpty(this.targetCls)){
+            var target = this.container.getLayoutTarget();
+            if(target){
+                target.removeClass(this.targetCls);
+            }
+        }
+    }
+});
+Ext.layout.AutoLayout = Ext.extend(Ext.layout.ContainerLayout, {
+    type: 'auto',
+
+    monitorResize: true,
+
+    onLayout : function(ct, target){
+        Ext.layout.AutoLayout.superclass.onLayout.call(this, ct, target);
+        var cs = this.getRenderedItems(ct), len = cs.length, i, c;
+        for(i = 0; i < len; i++){
+            c = cs[i];
+            if (c.doLayout){
+                
+                c.doLayout(true);
+            }
+        }
+    }
+});
+
+Ext.Container.LAYOUTS['auto'] = Ext.layout.AutoLayout;
+
+Ext.layout.FitLayout = Ext.extend(Ext.layout.ContainerLayout, {
+    
+    monitorResize:true,
+
+    type: 'fit',
+
+    getLayoutTargetSize : function() {
+        var target = this.container.getLayoutTarget();
+        if (!target) {
+            return {};
+        }
+        
+        return target.getStyleSize();
+    },
+
+    
+    onLayout : function(ct, target){
+        Ext.layout.FitLayout.superclass.onLayout.call(this, ct, target);
+        if(!ct.collapsed){
+            this.setItemSize(this.activeItem || ct.items.itemAt(0), this.getLayoutTargetSize());
+        }
+    },
+
+    
+    setItemSize : function(item, size){
+        if(item && size.height > 0){ 
+            item.setSize(size);
+        }
+    }
+});
+Ext.Container.LAYOUTS['fit'] = Ext.layout.FitLayout;
+Ext.layout.CardLayout = Ext.extend(Ext.layout.FitLayout, {
+    
+    deferredRender : false,
+
+    
+    layoutOnCardChange : false,
+
+    
+    
+    renderHidden : true,
+
+    type: 'card',
+
+    
+    setActiveItem : function(item){
+        var ai = this.activeItem,
+            ct = this.container;
+        item = ct.getComponent(item);
+
+        
+        if(item && ai != item){
+
+            
+            if(ai){
+                ai.hide();
+                if (ai.hidden !== true) {
+                    return false;
+                }
+                ai.fireEvent('deactivate', ai);
+            }
+
+            var layout = item.doLayout && (this.layoutOnCardChange || !item.rendered);
+
+            
+            this.activeItem = item;
+
+            
+            
+            delete item.deferLayout;
+
+            
+            item.show();
+
+            this.layout();
+
+            if(layout){
+                item.doLayout();
+            }
+            item.fireEvent('activate', item);
+        }
+    },
+
+    
+    renderAll : function(ct, target){
+        if(this.deferredRender){
+            this.renderItem(this.activeItem, undefined, target);
+        }else{
+            Ext.layout.CardLayout.superclass.renderAll.call(this, ct, target);
+        }
+    }
+});
+Ext.Container.LAYOUTS['card'] = Ext.layout.CardLayout;
+
+Ext.layout.AnchorLayout = Ext.extend(Ext.layout.ContainerLayout, {
+    
+
+    
+    monitorResize : true,
+
+    type : 'anchor',
+
+    
+    defaultAnchor : '100%',
+
+    parseAnchorRE : /^(r|right|b|bottom)$/i,
+
+
+    getLayoutTargetSize : function() {
+        var target = this.container.getLayoutTarget(), ret = {};
+        if (target) {
+            ret = target.getViewSize();
+
+            
+            
+            
+            if (Ext.isIE && Ext.isStrict && ret.width == 0){
+                ret =  target.getStyleSize();
+            }
+            ret.width -= target.getPadding('lr');
+            ret.height -= target.getPadding('tb');
+        }
+        return ret;
+    },
+
+    
+    onLayout : function(container, target) {
+        Ext.layout.AnchorLayout.superclass.onLayout.call(this, container, target);
+
+        var size = this.getLayoutTargetSize(),
+            containerWidth = size.width,
+            containerHeight = size.height,
+            overflow = target.getStyle('overflow'),
+            components = this.getRenderedItems(container),
+            len = components.length,
+            boxes = [],
+            box,
+            anchorWidth,
+            anchorHeight,
+            component,
+            anchorSpec,
+            calcWidth,
+            calcHeight,
+            anchorsArray,
+            totalHeight = 0,
+            i,
+            el;
+
+        if(containerWidth < 20 && containerHeight < 20){
+            return;
+        }
+
+        
+        if(container.anchorSize) {
+            if(typeof container.anchorSize == 'number') {
+                anchorWidth = container.anchorSize;
+            } else {
+                anchorWidth = container.anchorSize.width;
+                anchorHeight = container.anchorSize.height;
+            }
+        } else {
+            anchorWidth = container.initialConfig.width;
+            anchorHeight = container.initialConfig.height;
+        }
+
+        for(i = 0; i < len; i++) {
+            component = components[i];
+            el = component.getPositionEl();
+
+            
+            if (!component.anchor && component.items && !Ext.isNumber(component.width) && !(Ext.isIE6 && Ext.isStrict)){
+                component.anchor = this.defaultAnchor;
+            }
+
+            if(component.anchor) {
+                anchorSpec = component.anchorSpec;
+                
+                if(!anchorSpec){
+                    anchorsArray = component.anchor.split(' ');
+                    component.anchorSpec = anchorSpec = {
+                        right: this.parseAnchor(anchorsArray[0], component.initialConfig.width, anchorWidth),
+                        bottom: this.parseAnchor(anchorsArray[1], component.initialConfig.height, anchorHeight)
+                    };
+                }
+                calcWidth = anchorSpec.right ? this.adjustWidthAnchor(anchorSpec.right(containerWidth) - el.getMargins('lr'), component) : undefined;
+                calcHeight = anchorSpec.bottom ? this.adjustHeightAnchor(anchorSpec.bottom(containerHeight) - el.getMargins('tb'), component) : undefined;
+
+                if(calcWidth || calcHeight) {
+                    boxes.push({
+                        component: component,
+                        width: calcWidth || undefined,
+                        height: calcHeight || undefined
+                    });
+                }
+            }
+        }
+        for (i = 0, len = boxes.length; i < len; i++) {
+            box = boxes[i];
+            box.component.setSize(box.width, box.height);
+        }
+
+        if (overflow && overflow != 'hidden' && !this.adjustmentPass) {
+            var newTargetSize = this.getLayoutTargetSize();
+            if (newTargetSize.width != size.width || newTargetSize.height != size.height){
+                this.adjustmentPass = true;
+                this.onLayout(container, target);
+            }
+        }
+
+        delete this.adjustmentPass;
+    },
+
+    
+    parseAnchor : function(a, start, cstart) {
+        if (a && a != 'none') {
+            var last;
+            
+            if (this.parseAnchorRE.test(a)) {
+                var diff = cstart - start;
+                return function(v){
+                    if(v !== last){
+                        last = v;
+                        return v - diff;
+                    }
+                };
+            
+            } else if(a.indexOf('%') != -1) {
+                var ratio = parseFloat(a.replace('%', ''))*.01;
+                return function(v){
+                    if(v !== last){
+                        last = v;
+                        return Math.floor(v*ratio);
+                    }
+                };
+            
+            } else {
+                a = parseInt(a, 10);
+                if (!isNaN(a)) {
+                    return function(v) {
+                        if (v !== last) {
+                            last = v;
+                            return v + a;
+                        }
+                    };
+                }
+            }
+        }
+        return false;
+    },
+
+    
+    adjustWidthAnchor : function(value, comp){
+        return value;
+    },
+
+    
+    adjustHeightAnchor : function(value, comp){
+        return value;
+    }
+
+    
+});
+Ext.Container.LAYOUTS['anchor'] = Ext.layout.AnchorLayout;
+
+Ext.layout.ColumnLayout = Ext.extend(Ext.layout.ContainerLayout, {
+    
+    monitorResize:true,
+
+    type: 'column',
+
+    extraCls: 'x-column',
+
+    scrollOffset : 0,
+
+    
+
+    targetCls: 'x-column-layout-ct',
+
+    isValidParent : function(c, target){
+        return this.innerCt && c.getPositionEl().dom.parentNode == this.innerCt.dom;
+    },
+
+    getLayoutTargetSize : function() {
+        var target = this.container.getLayoutTarget(), ret;
+        if (target) {
+            ret = target.getViewSize();
+
+            
+            
+            
+            if (Ext.isIE && Ext.isStrict && ret.width == 0){
+                ret =  target.getStyleSize();
+            }
+
+            ret.width -= target.getPadding('lr');
+            ret.height -= target.getPadding('tb');
+        }
+        return ret;
+    },
+
+    renderAll : function(ct, target) {
+        if(!this.innerCt){
+            
+            
+            this.innerCt = target.createChild({cls:'x-column-inner'});
+            this.innerCt.createChild({cls:'x-clear'});
+        }
+        Ext.layout.ColumnLayout.superclass.renderAll.call(this, ct, this.innerCt);
+    },
+
+    
+    onLayout : function(ct, target){
+        var cs = ct.items.items,
+            len = cs.length,
+            c,
+            i,
+            m,
+            margins = [];
+
+        this.renderAll(ct, target);
+
+        var size = this.getLayoutTargetSize();
+
+        if(size.width < 1 && size.height < 1){ 
+            return;
+        }
+
+        var w = size.width - this.scrollOffset,
+            h = size.height,
+            pw = w;
+
+        this.innerCt.setWidth(w);
+
+        
+        
+
+        for(i = 0; i < len; i++){
+            c = cs[i];
+            m = c.getPositionEl().getMargins('lr');
+            margins[i] = m;
+            if(!c.columnWidth){
+                pw -= (c.getWidth() + m);
+            }
+        }
+
+        pw = pw < 0 ? 0 : pw;
+
+        for(i = 0; i < len; i++){
+            c = cs[i];
+            m = margins[i];
+            if(c.columnWidth){
+                c.setSize(Math.floor(c.columnWidth * pw) - m);
+            }
+        }
+
+        
+        
+        if (Ext.isIE) {
+            if (i = target.getStyle('overflow') && i != 'hidden' && !this.adjustmentPass) {
+                var ts = this.getLayoutTargetSize();
+                if (ts.width != size.width){
+                    this.adjustmentPass = true;
+                    this.onLayout(ct, target);
+                }
+            }
+        }
+        delete this.adjustmentPass;
+    }
+
+    
+});
+
+Ext.Container.LAYOUTS['column'] = Ext.layout.ColumnLayout;
+
+Ext.layout.BorderLayout = Ext.extend(Ext.layout.ContainerLayout, {
+    
+    monitorResize:true,
+    
+    rendered : false,
+
+    type: 'border',
+
+    targetCls: 'x-border-layout-ct',
+
+    getLayoutTargetSize : function() {
+        var target = this.container.getLayoutTarget();
+        return target ? target.getViewSize() : {};
+    },
+
+    
+    onLayout : function(ct, target){
+        var collapsed, i, c, pos, items = ct.items.items, len = items.length;
+        if(!this.rendered){
+            collapsed = [];
+            for(i = 0; i < len; i++) {
+                c = items[i];
+                pos = c.region;
+                if(c.collapsed){
+                    collapsed.push(c);
+                }
+                c.collapsed = false;
+                if(!c.rendered){
+                    c.render(target, i);
+                    c.getPositionEl().addClass('x-border-panel');
+                }
+                this[pos] = pos != 'center' && c.split ?
+                    new Ext.layout.BorderLayout.SplitRegion(this, c.initialConfig, pos) :
+                    new Ext.layout.BorderLayout.Region(this, c.initialConfig, pos);
+                this[pos].render(target, c);
+            }
+            this.rendered = true;
+        }
+
+        var size = this.getLayoutTargetSize();
+        if(size.width < 20 || size.height < 20){ 
+            if(collapsed){
+                this.restoreCollapsed = collapsed;
+            }
+            return;
+        }else if(this.restoreCollapsed){
+            collapsed = this.restoreCollapsed;
+            delete this.restoreCollapsed;
+        }
+
+        var w = size.width, h = size.height,
+            centerW = w, centerH = h, centerY = 0, centerX = 0,
+            n = this.north, s = this.south, west = this.west, e = this.east, c = this.center,
+            b, m, totalWidth, totalHeight;
+        if(!c && Ext.layout.BorderLayout.WARN !== false){
+            throw 'No center region defined in BorderLayout ' + ct.id;
+        }
+
+        if(n && n.isVisible()){
+            b = n.getSize();
+            m = n.getMargins();
+            b.width = w - (m.left+m.right);
+            b.x = m.left;
+            b.y = m.top;
+            centerY = b.height + b.y + m.bottom;
+            centerH -= centerY;
+            n.applyLayout(b);
+        }
+        if(s && s.isVisible()){
+            b = s.getSize();
+            m = s.getMargins();
+            b.width = w - (m.left+m.right);
+            b.x = m.left;
+            totalHeight = (b.height + m.top + m.bottom);
+            b.y = h - totalHeight + m.top;
+            centerH -= totalHeight;
+            s.applyLayout(b);
+        }
+        if(west && west.isVisible()){
+            b = west.getSize();
+            m = west.getMargins();
+            b.height = centerH - (m.top+m.bottom);
+            b.x = m.left;
+            b.y = centerY + m.top;
+            totalWidth = (b.width + m.left + m.right);
+            centerX += totalWidth;
+            centerW -= totalWidth;
+            west.applyLayout(b);
+        }
+        if(e && e.isVisible()){
+            b = e.getSize();
+            m = e.getMargins();
+            b.height = centerH - (m.top+m.bottom);
+            totalWidth = (b.width + m.left + m.right);
+            b.x = w - totalWidth + m.left;
+            b.y = centerY + m.top;
+            centerW -= totalWidth;
+            e.applyLayout(b);
+        }
+        if(c){
+            m = c.getMargins();
+            var centerBox = {
+                x: centerX + m.left,
+                y: centerY + m.top,
+                width: centerW - (m.left+m.right),
+                height: centerH - (m.top+m.bottom)
+            };
+            c.applyLayout(centerBox);
+        }
+        if(collapsed){
+            for(i = 0, len = collapsed.length; i < len; i++){
+                collapsed[i].collapse(false);
+            }
+        }
+        if(Ext.isIE && Ext.isStrict){ 
+            target.repaint();
+        }
+        
+        if (i = target.getStyle('overflow') && i != 'hidden' && !this.adjustmentPass) {
+            var ts = this.getLayoutTargetSize();
+            if (ts.width != size.width || ts.height != size.height){
+                this.adjustmentPass = true;
+                this.onLayout(ct, target);
+            }
+        }
+        delete this.adjustmentPass;
+    },
+
+    destroy: function() {
+        var r = ['north', 'south', 'east', 'west'], i, region;
+        for (i = 0; i < r.length; i++) {
+            region = this[r[i]];
+            if(region){
+                if(region.destroy){
+                    region.destroy();
+                }else if (region.split){
+                    region.split.destroy(true);
+                }
+            }
+        }
+        Ext.layout.BorderLayout.superclass.destroy.call(this);
+    }
+
+    
+});
+
+
+Ext.layout.BorderLayout.Region = function(layout, config, pos){
+    Ext.apply(this, config);
+    this.layout = layout;
+    this.position = pos;
+    this.state = {};
+    if(typeof this.margins == 'string'){
+        this.margins = this.layout.parseMargins(this.margins);
+    }
+    this.margins = Ext.applyIf(this.margins || {}, this.defaultMargins);
+    if(this.collapsible){
+        if(typeof this.cmargins == 'string'){
+            this.cmargins = this.layout.parseMargins(this.cmargins);
+        }
+        if(this.collapseMode == 'mini' && !this.cmargins){
+            this.cmargins = {left:0,top:0,right:0,bottom:0};
+        }else{
+            this.cmargins = Ext.applyIf(this.cmargins || {},
+                pos == 'north' || pos == 'south' ? this.defaultNSCMargins : this.defaultEWCMargins);
+        }
+    }
+};
+
+Ext.layout.BorderLayout.Region.prototype = {
+    
+    
+    
+    
+    
+    
+    collapsible : false,
+    
+    split:false,
+    
+    floatable: true,
+    
+    minWidth:50,
+    
+    minHeight:50,
+
+    
+    defaultMargins : {left:0,top:0,right:0,bottom:0},
+    
+    defaultNSCMargins : {left:5,top:5,right:5,bottom:5},
+    
+    defaultEWCMargins : {left:5,top:0,right:5,bottom:0},
+    floatingZIndex: 100,
+
+    
+    isCollapsed : false,
+
+    
+    
+    
+
+    
+    render : function(ct, p){
+        this.panel = p;
+        p.el.enableDisplayMode();
+        this.targetEl = ct;
+        this.el = p.el;
+
+        var gs = p.getState, ps = this.position;
+        p.getState = function(){
+            return Ext.apply(gs.call(p) || {}, this.state);
+        }.createDelegate(this);
+
+        if(ps != 'center'){
+            p.allowQueuedExpand = false;
+            p.on({
+                beforecollapse: this.beforeCollapse,
+                collapse: this.onCollapse,
+                beforeexpand: this.beforeExpand,
+                expand: this.onExpand,
+                hide: this.onHide,
+                show: this.onShow,
+                scope: this
+            });
+            if(this.collapsible || this.floatable){
+                p.collapseEl = 'el';
+                p.slideAnchor = this.getSlideAnchor();
+            }
+            if(p.tools && p.tools.toggle){
+                p.tools.toggle.addClass('x-tool-collapse-'+ps);
+                p.tools.toggle.addClassOnOver('x-tool-collapse-'+ps+'-over');
+            }
+        }
+    },
+
+    
+    getCollapsedEl : function(){
+        if(!this.collapsedEl){
+            if(!this.toolTemplate){
+                var tt = new Ext.Template(
+                     '<div class="x-tool x-tool-{id}">&#160;</div>'
+                );
+                tt.disableFormats = true;
+                tt.compile();
+                Ext.layout.BorderLayout.Region.prototype.toolTemplate = tt;
+            }
+            this.collapsedEl = this.targetEl.createChild({
+                cls: "x-layout-collapsed x-layout-collapsed-"+this.position,
+                id: this.panel.id + '-xcollapsed'
+            });
+            this.collapsedEl.enableDisplayMode('block');
+
+            if(this.collapseMode == 'mini'){
+                this.collapsedEl.addClass('x-layout-cmini-'+this.position);
+                this.miniCollapsedEl = this.collapsedEl.createChild({
+                    cls: "x-layout-mini x-layout-mini-"+this.position, html: "&#160;"
+                });
+                this.miniCollapsedEl.addClassOnOver('x-layout-mini-over');
+                this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
+                this.collapsedEl.on('click', this.onExpandClick, this, {stopEvent:true});
+            }else {
+                if(this.collapsible !== false && !this.hideCollapseTool) {
+                    var t = this.expandToolEl = this.toolTemplate.append(
+                            this.collapsedEl.dom,
+                            {id:'expand-'+this.position}, true);
+                    t.addClassOnOver('x-tool-expand-'+this.position+'-over');
+                    t.on('click', this.onExpandClick, this, {stopEvent:true});
+                }
+                if(this.floatable !== false || this.titleCollapse){
+                   this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
+                   this.collapsedEl.on("click", this[this.floatable ? 'collapseClick' : 'onExpandClick'], this);
+                }
+            }
+        }
+        return this.collapsedEl;
+    },
+
+    
+    onExpandClick : function(e){
+        if(this.isSlid){
+            this.panel.expand(false);
+        }else{
+            this.panel.expand();
+        }
+    },
+
+    
+    onCollapseClick : function(e){
+        this.panel.collapse();
+    },
+
+    
+    beforeCollapse : function(p, animate){
+        this.lastAnim = animate;
+        if(this.splitEl){
+            this.splitEl.hide();
+        }
+        this.getCollapsedEl().show();
+        var el = this.panel.getEl();
+        this.originalZIndex = el.getStyle('z-index');
+        el.setStyle('z-index', 100);
+        this.isCollapsed = true;
+        this.layout.layout();
+    },
+
+    
+    onCollapse : function(animate){
+        this.panel.el.setStyle('z-index', 1);
+        if(this.lastAnim === false || this.panel.animCollapse === false){
+            this.getCollapsedEl().dom.style.visibility = 'visible';
+        }else{
+            this.getCollapsedEl().slideIn(this.panel.slideAnchor, {duration:.2});
+        }
+        this.state.collapsed = true;
+        this.panel.saveState();
+    },
+
+    
+    beforeExpand : function(animate){
+        if(this.isSlid){
+            this.afterSlideIn();
+        }
+        var c = this.getCollapsedEl();
+        this.el.show();
+        if(this.position == 'east' || this.position == 'west'){
+            this.panel.setSize(undefined, c.getHeight());
+        }else{
+            this.panel.setSize(c.getWidth(), undefined);
+        }
+        c.hide();
+        c.dom.style.visibility = 'hidden';
+        this.panel.el.setStyle('z-index', this.floatingZIndex);
+    },
+
+    
+    onExpand : function(){
+        this.isCollapsed = false;
+        if(this.splitEl){
+            this.splitEl.show();
+        }
+        this.layout.layout();
+        this.panel.el.setStyle('z-index', this.originalZIndex);
+        this.state.collapsed = false;
+        this.panel.saveState();
+    },
+
+    
+    collapseClick : function(e){
+        if(this.isSlid){
+           e.stopPropagation();
+           this.slideIn();
+        }else{
+           e.stopPropagation();
+           this.slideOut();
+        }
+    },
+
+    
+    onHide : function(){
+        if(this.isCollapsed){
+            this.getCollapsedEl().hide();
+        }else if(this.splitEl){
+            this.splitEl.hide();
+        }
+    },
+
+    
+    onShow : function(){
+        if(this.isCollapsed){
+            this.getCollapsedEl().show();
+        }else if(this.splitEl){
+            this.splitEl.show();
+        }
+    },
+
+    
+    isVisible : function(){
+        return !this.panel.hidden;
+    },
+
+    
+    getMargins : function(){
+        return this.isCollapsed && this.cmargins ? this.cmargins : this.margins;
+    },
+
+    
+    getSize : function(){
+        return this.isCollapsed ? this.getCollapsedEl().getSize() : this.panel.getSize();
+    },
+
+    
+    setPanel : function(panel){
+        this.panel = panel;
+    },
+
+    
+    getMinWidth: function(){
+        return this.minWidth;
+    },
+
+    
+    getMinHeight: function(){
+        return this.minHeight;
+    },
+
+    
+    applyLayoutCollapsed : function(box){
+        var ce = this.getCollapsedEl();
+        ce.setLeftTop(box.x, box.y);
+        ce.setSize(box.width, box.height);
+    },
+
+    
+    applyLayout : function(box){
+        if(this.isCollapsed){
+            this.applyLayoutCollapsed(box);
+        }else{
+            this.panel.setPosition(box.x, box.y);
+            this.panel.setSize(box.width, box.height);
+        }
+    },
+
+    
+    beforeSlide: function(){
+        this.panel.beforeEffect();
+    },
+
+    
+    afterSlide : function(){
+        this.panel.afterEffect();
+    },
+
+    
+    initAutoHide : function(){
+        if(this.autoHide !== false){
+            if(!this.autoHideHd){
+                this.autoHideSlideTask = new Ext.util.DelayedTask(this.slideIn, this);
+                this.autoHideHd = {
+                    "mouseout": function(e){
+                        if(!e.within(this.el, true)){
+                            this.autoHideSlideTask.delay(500);
+                        }
+                    },
+                    "mouseover" : function(e){
+                        this.autoHideSlideTask.cancel();
+                    },
+                    scope : this
+                };
+            }
+            this.el.on(this.autoHideHd);
+            this.collapsedEl.on(this.autoHideHd);
+        }
+    },
+
+    
+    clearAutoHide : function(){
+        if(this.autoHide !== false){
+            this.el.un("mouseout", this.autoHideHd.mouseout);
+            this.el.un("mouseover", this.autoHideHd.mouseover);
+            this.collapsedEl.un("mouseout", this.autoHideHd.mouseout);
+            this.collapsedEl.un("mouseover", this.autoHideHd.mouseover);
+        }
+    },
+
+    
+    clearMonitor : function(){
+        Ext.getDoc().un("click", this.slideInIf, this);
+    },
+
+    
+    slideOut : function(){
+        if(this.isSlid || this.el.hasActiveFx()){
+            return;
+        }
+        this.isSlid = true;
+        var ts = this.panel.tools, dh, pc;
+        if(ts && ts.toggle){
+            ts.toggle.hide();
+        }
+        this.el.show();
+
+        
+        pc = this.panel.collapsed;
+        this.panel.collapsed = false;
+
+        if(this.position == 'east' || this.position == 'west'){
+            
+            dh = this.panel.deferHeight;
+            this.panel.deferHeight = false;
+
+            this.panel.setSize(undefined, this.collapsedEl.getHeight());
+
+            
+            this.panel.deferHeight = dh;
+        }else{
+            this.panel.setSize(this.collapsedEl.getWidth(), undefined);
+        }
+
+        
+        this.panel.collapsed = pc;
+
+        this.restoreLT = [this.el.dom.style.left, this.el.dom.style.top];
+        this.el.alignTo(this.collapsedEl, this.getCollapseAnchor());
+        this.el.setStyle("z-index", this.floatingZIndex+2);
+        this.panel.el.replaceClass('x-panel-collapsed', 'x-panel-floating');
+        if(this.animFloat !== false){
+            this.beforeSlide();
+            this.el.slideIn(this.getSlideAnchor(), {
+                callback: function(){
+                    this.afterSlide();
+                    this.initAutoHide();
+                    Ext.getDoc().on("click", this.slideInIf, this);
+                },
+                scope: this,
+                block: true
+            });
+        }else{
+            this.initAutoHide();
+             Ext.getDoc().on("click", this.slideInIf, this);
+        }
+    },
+
+    
+    afterSlideIn : function(){
+        this.clearAutoHide();
+        this.isSlid = false;
+        this.clearMonitor();
+        this.el.setStyle("z-index", "");
+        this.panel.el.replaceClass('x-panel-floating', 'x-panel-collapsed');
+        this.el.dom.style.left = this.restoreLT[0];
+        this.el.dom.style.top = this.restoreLT[1];
+
+        var ts = this.panel.tools;
+        if(ts && ts.toggle){
+            ts.toggle.show();
+        }
+    },
+
+    
+    slideIn : function(cb){
+        if(!this.isSlid || this.el.hasActiveFx()){
+            Ext.callback(cb);
+            return;
+        }
+        this.isSlid = false;
+        if(this.animFloat !== false){
+            this.beforeSlide();
+            this.el.slideOut(this.getSlideAnchor(), {
+                callback: function(){
+                    this.el.hide();
+                    this.afterSlide();
+                    this.afterSlideIn();
+                    Ext.callback(cb);
+                },
+                scope: this,
+                block: true
+            });
+        }else{
+            this.el.hide();
+            this.afterSlideIn();
+        }
+    },
+
+    
+    slideInIf : function(e){
+        if(!e.within(this.el)){
+            this.slideIn();
+        }
+    },
+
+    
+    anchors : {
+        "west" : "left",
+        "east" : "right",
+        "north" : "top",
+        "south" : "bottom"
+    },
+
+    
+    sanchors : {
+        "west" : "l",
+        "east" : "r",
+        "north" : "t",
+        "south" : "b"
+    },
+
+    
+    canchors : {
+        "west" : "tl-tr",
+        "east" : "tr-tl",
+        "north" : "tl-bl",
+        "south" : "bl-tl"
+    },
+
+    
+    getAnchor : function(){
+        return this.anchors[this.position];
+    },
+
+    
+    getCollapseAnchor : function(){
+        return this.canchors[this.position];
+    },
+
+    
+    getSlideAnchor : function(){
+        return this.sanchors[this.position];
+    },
+
+    
+    getAlignAdj : function(){
+        var cm = this.cmargins;
+        switch(this.position){
+            case "west":
+                return [0, 0];
+            break;
+            case "east":
+                return [0, 0];
+            break;
+            case "north":
+                return [0, 0];
+            break;
+            case "south":
+                return [0, 0];
+            break;
+        }
+    },
+
+    
+    getExpandAdj : function(){
+        var c = this.collapsedEl, cm = this.cmargins;
+        switch(this.position){
+            case "west":
+                return [-(cm.right+c.getWidth()+cm.left), 0];
+            break;
+            case "east":
+                return [cm.right+c.getWidth()+cm.left, 0];
+            break;
+            case "north":
+                return [0, -(cm.top+cm.bottom+c.getHeight())];
+            break;
+            case "south":
+                return [0, cm.top+cm.bottom+c.getHeight()];
+            break;
+        }
+    },
+
+    destroy : function(){
+        if (this.autoHideSlideTask && this.autoHideSlideTask.cancel){
+            this.autoHideSlideTask.cancel();
+        }
+        Ext.destroyMembers(this, 'miniCollapsedEl', 'collapsedEl', 'expandToolEl');
+    }
+};
+
+
+Ext.layout.BorderLayout.SplitRegion = function(layout, config, pos){
+    Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, layout, config, pos);
+    
+    this.applyLayout = this.applyFns[pos];
+};
+
+Ext.extend(Ext.layout.BorderLayout.SplitRegion, Ext.layout.BorderLayout.Region, {
+    
+    
+    splitTip : "Drag to resize.",
+    
+    collapsibleSplitTip : "Drag to resize. Double click to hide.",
+    
+    useSplitTips : false,
+
+    
+    splitSettings : {
+        north : {
+            orientation: Ext.SplitBar.VERTICAL,
+            placement: Ext.SplitBar.TOP,
+            maxFn : 'getVMaxSize',
+            minProp: 'minHeight',
+            maxProp: 'maxHeight'
+        },
+        south : {
+            orientation: Ext.SplitBar.VERTICAL,
+            placement: Ext.SplitBar.BOTTOM,
+            maxFn : 'getVMaxSize',
+            minProp: 'minHeight',
+            maxProp: 'maxHeight'
+        },
+        east : {
+            orientation: Ext.SplitBar.HORIZONTAL,
+            placement: Ext.SplitBar.RIGHT,
+            maxFn : 'getHMaxSize',
+            minProp: 'minWidth',
+            maxProp: 'maxWidth'
+        },
+        west : {
+            orientation: Ext.SplitBar.HORIZONTAL,
+            placement: Ext.SplitBar.LEFT,
+            maxFn : 'getHMaxSize',
+            minProp: 'minWidth',
+            maxProp: 'maxWidth'
+        }
+    },
+
+    
+    applyFns : {
+        west : function(box){
+            if(this.isCollapsed){
+                return this.applyLayoutCollapsed(box);
+            }
+            var sd = this.splitEl.dom, s = sd.style;
+            this.panel.setPosition(box.x, box.y);
+            var sw = sd.offsetWidth;
+            s.left = (box.x+box.width-sw)+'px';
+            s.top = (box.y)+'px';
+            s.height = Math.max(0, box.height)+'px';
+            this.panel.setSize(box.width-sw, box.height);
+        },
+        east : function(box){
+            if(this.isCollapsed){
+                return this.applyLayoutCollapsed(box);
+            }
+            var sd = this.splitEl.dom, s = sd.style;
+            var sw = sd.offsetWidth;
+            this.panel.setPosition(box.x+sw, box.y);
+            s.left = (box.x)+'px';
+            s.top = (box.y)+'px';
+            s.height = Math.max(0, box.height)+'px';
+            this.panel.setSize(box.width-sw, box.height);
+        },
+        north : function(box){
+            if(this.isCollapsed){
+                return this.applyLayoutCollapsed(box);
+            }
+            var sd = this.splitEl.dom, s = sd.style;
+            var sh = sd.offsetHeight;
+            this.panel.setPosition(box.x, box.y);
+            s.left = (box.x)+'px';
+            s.top = (box.y+box.height-sh)+'px';
+            s.width = Math.max(0, box.width)+'px';
+            this.panel.setSize(box.width, box.height-sh);
+        },
+        south : function(box){
+            if(this.isCollapsed){
+                return this.applyLayoutCollapsed(box);
+            }
+            var sd = this.splitEl.dom, s = sd.style;
+            var sh = sd.offsetHeight;
+            this.panel.setPosition(box.x, box.y+sh);
+            s.left = (box.x)+'px';
+            s.top = (box.y)+'px';
+            s.width = Math.max(0, box.width)+'px';
+            this.panel.setSize(box.width, box.height-sh);
+        }
+    },
+
+    
+    render : function(ct, p){
+        Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this, ct, p);
+
+        var ps = this.position;
+
+        this.splitEl = ct.createChild({
+            cls: "x-layout-split x-layout-split-"+ps, html: "&#160;",
+            id: this.panel.id + '-xsplit'
+        });
+
+        if(this.collapseMode == 'mini'){
+            this.miniSplitEl = this.splitEl.createChild({
+                cls: "x-layout-mini x-layout-mini-"+ps, html: "&#160;"
+            });
+            this.miniSplitEl.addClassOnOver('x-layout-mini-over');
+            this.miniSplitEl.on('click', this.onCollapseClick, this, {stopEvent:true});
+        }
+
+        var s = this.splitSettings[ps];
+
+        this.split = new Ext.SplitBar(this.splitEl.dom, p.el, s.orientation);
+        this.split.tickSize = this.tickSize;
+        this.split.placement = s.placement;
+        this.split.getMaximumSize = this[s.maxFn].createDelegate(this);
+        this.split.minSize = this.minSize || this[s.minProp];
+        this.split.on("beforeapply", this.onSplitMove, this);
+        this.split.useShim = this.useShim === true;
+        this.maxSize = this.maxSize || this[s.maxProp];
+
+        if(p.hidden){
+            this.splitEl.hide();
+        }
+
+        if(this.useSplitTips){
+            this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip : this.splitTip;
+        }
+        if(this.collapsible){
+            this.splitEl.on("dblclick", this.onCollapseClick,  this);
+        }
+    },
+
+    
+    getSize : function(){
+        if(this.isCollapsed){
+            return this.collapsedEl.getSize();
+        }
+        var s = this.panel.getSize();
+        if(this.position == 'north' || this.position == 'south'){
+            s.height += this.splitEl.dom.offsetHeight;
+        }else{
+            s.width += this.splitEl.dom.offsetWidth;
+        }
+        return s;
+    },
+
+    
+    getHMaxSize : function(){
+         var cmax = this.maxSize || 10000;
+         var center = this.layout.center;
+         return Math.min(cmax, (this.el.getWidth()+center.el.getWidth())-center.getMinWidth());
+    },
+
+    
+    getVMaxSize : function(){
+        var cmax = this.maxSize || 10000;
+        var center = this.layout.center;
+        return Math.min(cmax, (this.el.getHeight()+center.el.getHeight())-center.getMinHeight());
+    },
+
+    
+    onSplitMove : function(split, newSize){
+        var s = this.panel.getSize();
+        this.lastSplitSize = newSize;
+        if(this.position == 'north' || this.position == 'south'){
+            this.panel.setSize(s.width, newSize);
+            this.state.height = newSize;
+        }else{
+            this.panel.setSize(newSize, s.height);
+            this.state.width = newSize;
+        }
+        this.layout.layout();
+        this.panel.saveState();
+        return false;
+    },
+
+    
+    getSplitBar : function(){
+        return this.split;
+    },
+
+    
+    destroy : function() {
+        Ext.destroy(this.miniSplitEl, this.split, this.splitEl);
+        Ext.layout.BorderLayout.SplitRegion.superclass.destroy.call(this);
+    }
+});
+
+Ext.Container.LAYOUTS['border'] = Ext.layout.BorderLayout;
+
+Ext.layout.FormLayout = Ext.extend(Ext.layout.AnchorLayout, {
+
+    
+    labelSeparator : ':',
+
+    
+
+    
+    trackLabels: true,
+
+    type: 'form',
+
+    onRemove: function(c){
+        Ext.layout.FormLayout.superclass.onRemove.call(this, c);
+        if(this.trackLabels){
+            c.un('show', this.onFieldShow, this);
+            c.un('hide', this.onFieldHide, this);
+        }
+        
+        var el = c.getPositionEl(),
+            ct = c.getItemCt && c.getItemCt();
+        if (c.rendered && ct) {
+            if (el && el.dom) {
+                el.insertAfter(ct);
+            }
+            Ext.destroy(ct);
+            Ext.destroyMembers(c, 'label', 'itemCt');
+            if (c.customItemCt) {
+                Ext.destroyMembers(c, 'getItemCt', 'customItemCt');
+            }
+        }
+    },
+
+    
+    setContainer : function(ct){
+        Ext.layout.FormLayout.superclass.setContainer.call(this, ct);
+        if(ct.labelAlign){
+            ct.addClass('x-form-label-'+ct.labelAlign);
+        }
+
+        if(ct.hideLabels){
+            Ext.apply(this, {
+                labelStyle: 'display:none',
+                elementStyle: 'padding-left:0;',
+                labelAdjust: 0
+            });
+        }else{
+            this.labelSeparator = Ext.isDefined(ct.labelSeparator) ? ct.labelSeparator : this.labelSeparator;
+            ct.labelWidth = ct.labelWidth || 100;
+            if(Ext.isNumber(ct.labelWidth)){
+                var pad = Ext.isNumber(ct.labelPad) ? ct.labelPad : 5;
+                Ext.apply(this, {
+                    labelAdjust: ct.labelWidth + pad,
+                    labelStyle: 'width:' + ct.labelWidth + 'px;',
+                    elementStyle: 'padding-left:' + (ct.labelWidth + pad) + 'px'
+                });
+            }
+            if(ct.labelAlign == 'top'){
+                Ext.apply(this, {
+                    labelStyle: 'width:auto;',
+                    labelAdjust: 0,
+                    elementStyle: 'padding-left:0;'
+                });
+            }
+        }
+    },
+
+    
+    isHide: function(c){
+        return c.hideLabel || this.container.hideLabels;
+    },
+
+    onFieldShow: function(c){
+        c.getItemCt().removeClass('x-hide-' + c.hideMode);
+
+        
+        if (c.isComposite) {
+            c.doLayout();
+        }
+    },
+
+    onFieldHide: function(c){
+        c.getItemCt().addClass('x-hide-' + c.hideMode);
+    },
+
+    
+    getLabelStyle: function(s){
+        var ls = '', items = [this.labelStyle, s];
+        for (var i = 0, len = items.length; i < len; ++i){
+            if (items[i]){
+                ls += items[i];
+                if (ls.substr(-1, 1) != ';'){
+                    ls += ';';
+                }
+            }
+        }
+        return ls;
+    },
+
+    
+
+    
+    renderItem : function(c, position, target){
+        if(c && (c.isFormField || c.fieldLabel) && c.inputType != 'hidden'){
+            var args = this.getTemplateArgs(c);
+            if(Ext.isNumber(position)){
+                position = target.dom.childNodes[position] || null;
+            }
+            if(position){
+                c.itemCt = this.fieldTpl.insertBefore(position, args, true);
+            }else{
+                c.itemCt = this.fieldTpl.append(target, args, true);
+            }
+            if(!c.getItemCt){
+                
+                
+                Ext.apply(c, {
+                    getItemCt: function(){
+                        return c.itemCt;
+                    },
+                    customItemCt: true
+                });
+            }
+            c.label = c.getItemCt().child('label.x-form-item-label');
+            if(!c.rendered){
+                c.render('x-form-el-' + c.id);
+            }else if(!this.isValidParent(c, target)){
+                Ext.fly('x-form-el-' + c.id).appendChild(c.getPositionEl());
+            }
+            if(this.trackLabels){
+                if(c.hidden){
+                    this.onFieldHide(c);
+                }
+                c.on({
+                    scope: this,
+                    show: this.onFieldShow,
+                    hide: this.onFieldHide
+                });
+            }
+            this.configureItem(c);
+        }else {
+            Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments);
+        }
+    },
+
+    
+    getTemplateArgs: function(field) {
+        var noLabelSep = !field.fieldLabel || field.hideLabel;
+
+        return {
+            id            : field.id,
+            label         : field.fieldLabel,
+            itemCls       : (field.itemCls || this.container.itemCls || '') + (field.hideLabel ? ' x-hide-label' : ''),
+            clearCls      : field.clearCls || 'x-form-clear-left',
+            labelStyle    : this.getLabelStyle(field.labelStyle),
+            elementStyle  : this.elementStyle || '',
+            labelSeparator: noLabelSep ? '' : (Ext.isDefined(field.labelSeparator) ? field.labelSeparator : this.labelSeparator)
+        };
+    },
+
+    
+    adjustWidthAnchor: function(value, c){
+        if(c.label && !this.isHide(c) && (this.container.labelAlign != 'top')){
+            var adjust = Ext.isIE6 || (Ext.isIE && !Ext.isStrict);
+            return value - this.labelAdjust + (adjust ? -3 : 0);
+        }
+        return value;
+    },
+
+    adjustHeightAnchor : function(value, c){
+        if(c.label && !this.isHide(c) && (this.container.labelAlign == 'top')){
+            return value - c.label.getHeight();
+        }
+        return value;
+    },
+
+    
+    isValidParent : function(c, target){
+        return target && this.container.getEl().contains(c.getPositionEl());
+    }
+
+    
+});
+
+Ext.Container.LAYOUTS['form'] = Ext.layout.FormLayout;
+
+Ext.layout.AccordionLayout = Ext.extend(Ext.layout.FitLayout, {
+    
+    fill : true,
+    
+    autoWidth : true,
+    
+    titleCollapse : true,
+    
+    hideCollapseTool : false,
+    
+    collapseFirst : false,
+    
+    animate : false,
+    
+    sequence : false,
+    
+    activeOnTop : false,
+
+    type: 'accordion',
+
+    renderItem : function(c){
+        if(this.animate === false){
+            c.animCollapse = false;
+        }
+        c.collapsible = true;
+        if(this.autoWidth){
+            c.autoWidth = true;
+        }
+        if(this.titleCollapse){
+            c.titleCollapse = true;
+        }
+        if(this.hideCollapseTool){
+            c.hideCollapseTool = true;
+        }
+        if(this.collapseFirst !== undefined){
+            c.collapseFirst = this.collapseFirst;
+        }
+        if(!this.activeItem && !c.collapsed){
+            this.setActiveItem(c, true);
+        }else if(this.activeItem && this.activeItem != c){
+            c.collapsed = true;
+        }
+        Ext.layout.AccordionLayout.superclass.renderItem.apply(this, arguments);
+        c.header.addClass('x-accordion-hd');
+        c.on('beforeexpand', this.beforeExpand, this);
+    },
+
+    onRemove: function(c){
+        Ext.layout.AccordionLayout.superclass.onRemove.call(this, c);
+        if(c.rendered){
+            c.header.removeClass('x-accordion-hd');
+        }
+        c.un('beforeexpand', this.beforeExpand, this);
+    },
+
+    
+    beforeExpand : function(p, anim){
+        var ai = this.activeItem;
+        if(ai){
+            if(this.sequence){
+                delete this.activeItem;
+                if (!ai.collapsed){
+                    ai.collapse({callback:function(){
+                        p.expand(anim || true);
+                    }, scope: this});
+                    return false;
+                }
+            }else{
+                ai.collapse(this.animate);
+            }
+        }
+        this.setActive(p);
+        if(this.activeOnTop){
+            p.el.dom.parentNode.insertBefore(p.el.dom, p.el.dom.parentNode.firstChild);
+        }
+        
+        this.layout();
+    },
+
+    
+    setItemSize : function(item, size){
+        if(this.fill && item){
+            var hh = 0, i, ct = this.getRenderedItems(this.container), len = ct.length, p;
+            
+            for (i = 0; i < len; i++) {
+                if((p = ct[i]) != item && !p.hidden){
+                    hh += p.header.getHeight();
+                }
+            };
+            
+            size.height -= hh;
+            
+            
+            item.setSize(size);
+        }
+    },
+
+    
+    setActiveItem : function(item){
+        this.setActive(item, true);
+    },
+
+    
+    setActive : function(item, expand){
+        var ai = this.activeItem;
+        item = this.container.getComponent(item);
+        if(ai != item){
+            if(item.rendered && item.collapsed && expand){
+                item.expand();
+            }else{
+                if(ai){
+                   ai.fireEvent('deactivate', ai);
+                }
+                this.activeItem = item;
+                item.fireEvent('activate', item);
+            }
+        }
+    }
+});
+Ext.Container.LAYOUTS.accordion = Ext.layout.AccordionLayout;
+
+
+Ext.layout.Accordion = Ext.layout.AccordionLayout;
+Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, {
+    
+
+    
+    monitorResize:false,
+
+    type: 'table',
+
+    targetCls: 'x-table-layout-ct',
+
+    
+    tableAttrs:null,
+
+    
+    setContainer : function(ct){
+        Ext.layout.TableLayout.superclass.setContainer.call(this, ct);
+
+        this.currentRow = 0;
+        this.currentColumn = 0;
+        this.cells = [];
+    },
+    
+    
+    onLayout : function(ct, target){
+        var cs = ct.items.items, len = cs.length, c, i;
+
+        if(!this.table){
+            target.addClass('x-table-layout-ct');
+
+            this.table = target.createChild(
+                Ext.apply({tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, this.tableAttrs), null, true);
+        }
+        this.renderAll(ct, target);
+    },
+
+    
+    getRow : function(index){
+        var row = this.table.tBodies[0].childNodes[index];
+        if(!row){
+            row = document.createElement('tr');
+            this.table.tBodies[0].appendChild(row);
+        }
+        return row;
+    },
+
+    
+    getNextCell : function(c){
+        var cell = this.getNextNonSpan(this.currentColumn, this.currentRow);
+        var curCol = this.currentColumn = cell[0], curRow = this.currentRow = cell[1];
+        for(var rowIndex = curRow; rowIndex < curRow + (c.rowspan || 1); rowIndex++){
+            if(!this.cells[rowIndex]){
+                this.cells[rowIndex] = [];
+            }
+            for(var colIndex = curCol; colIndex < curCol + (c.colspan || 1); colIndex++){
+                this.cells[rowIndex][colIndex] = true;
+            }
+        }
+        var td = document.createElement('td');
+        if(c.cellId){
+            td.id = c.cellId;
+        }
+        var cls = 'x-table-layout-cell';
+        if(c.cellCls){
+            cls += ' ' + c.cellCls;
+        }
+        td.className = cls;
+        if(c.colspan){
+            td.colSpan = c.colspan;
+        }
+        if(c.rowspan){
+            td.rowSpan = c.rowspan;
+        }
+        this.getRow(curRow).appendChild(td);
+        return td;
+    },
+
+    
+    getNextNonSpan: function(colIndex, rowIndex){
+        var cols = this.columns;
+        while((cols && colIndex >= cols) || (this.cells[rowIndex] && this.cells[rowIndex][colIndex])) {
+            if(cols && colIndex >= cols){
+                rowIndex++;
+                colIndex = 0;
+            }else{
+                colIndex++;
+            }
+        }
+        return [colIndex, rowIndex];
+    },
+
+    
+    renderItem : function(c, position, target){
+        
+        if(!this.table){
+            this.table = target.createChild(
+                Ext.apply({tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, this.tableAttrs), null, true);
+        }
+        if(c && !c.rendered){
+            c.render(this.getNextCell(c));
+            this.configureItem(c);
+        }else if(c && !this.isValidParent(c, target)){
+            var container = this.getNextCell(c);
+            container.insertBefore(c.getPositionEl().dom, null);
+            c.container = Ext.get(container);
+            this.configureItem(c);
+        }
+    },
+
+    
+    isValidParent : function(c, target){
+        return c.getPositionEl().up('table', 5).dom.parentNode === (target.dom || target);
+    },
+    
+    destroy: function(){
+        delete this.table;
+        Ext.layout.TableLayout.superclass.destroy.call(this);
+    }
+
+    
+});
+
+Ext.Container.LAYOUTS['table'] = Ext.layout.TableLayout;
+Ext.layout.AbsoluteLayout = Ext.extend(Ext.layout.AnchorLayout, {
+
+    extraCls: 'x-abs-layout-item',
+
+    type: 'absolute',
+
+    onLayout : function(ct, target){
+        target.position();
+        this.paddingLeft = target.getPadding('l');
+        this.paddingTop = target.getPadding('t');
+        Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, ct, target);
+    },
+
+    
+    adjustWidthAnchor : function(value, comp){
+        return value ? value - comp.getPosition(true)[0] + this.paddingLeft : value;
+    },
+
+    
+    adjustHeightAnchor : function(value, comp){
+        return  value ? value - comp.getPosition(true)[1] + this.paddingTop : value;
+    }
+    
+});
+Ext.Container.LAYOUTS['absolute'] = Ext.layout.AbsoluteLayout;
+
+Ext.layout.BoxLayout = Ext.extend(Ext.layout.ContainerLayout, {
+    
+    defaultMargins : {left:0,top:0,right:0,bottom:0},
+    
+    padding : '0',
+    
+    pack : 'start',
+
+    
+    monitorResize : true,
+    type: 'box',
+    scrollOffset : 0,
+    extraCls : 'x-box-item',
+    targetCls : 'x-box-layout-ct',
+    innerCls : 'x-box-inner',
+
+    constructor : function(config){
+        Ext.layout.BoxLayout.superclass.constructor.call(this, config);
+
+        if (Ext.isString(this.defaultMargins)) {
+            this.defaultMargins = this.parseMargins(this.defaultMargins);
+        }
+        
+        var handler = this.overflowHandler;
+        
+        if (typeof handler == 'string') {
+            handler = {
+                type: handler
+            };
+        }
+        
+        var handlerType = 'none';
+        if (handler && handler.type != undefined) {
+            handlerType = handler.type;
+        }
+        
+        var constructor = Ext.layout.boxOverflow[handlerType];
+        if (constructor[this.type]) {
+            constructor = constructor[this.type];
+        }
+        
+        this.overflowHandler = new constructor(this, handler);
+    },
+
+    
+    onLayout: function(container, target) {
+        Ext.layout.BoxLayout.superclass.onLayout.call(this, container, target);
+
+        var tSize = this.getLayoutTargetSize(),
+            items = this.getVisibleItems(container),
+            calcs = this.calculateChildBoxes(items, tSize),
+            boxes = calcs.boxes,
+            meta  = calcs.meta;
+        
+        
+        if (tSize.width > 0) {
+            var handler = this.overflowHandler,
+                method  = meta.tooNarrow ? 'handleOverflow' : 'clearOverflow';
+            
+            var results = handler[method](calcs, tSize);
+            
+            if (results) {
+                if (results.targetSize) {
+                    tSize = results.targetSize;
+                }
+                
+                if (results.recalculate) {
+                    items = this.getVisibleItems(container);
+                    calcs = this.calculateChildBoxes(items, tSize);
+                    boxes = calcs.boxes;
+                }
+            }
+        }
+        
+        
+        this.layoutTargetLastSize = tSize;
+        
+        
+        this.childBoxCache = calcs;
+        
+        this.updateInnerCtSize(tSize, calcs);
+        this.updateChildBoxes(boxes);
+
+        
+        this.handleTargetOverflow(tSize, container, target);
+    },
+
+    
+    updateChildBoxes: function(boxes) {
+        for (var i = 0, length = boxes.length; i < length; i++) {
+            var box  = boxes[i],
+                comp = box.component;
+            
+            if (box.dirtySize) {
+                comp.setSize(box.width, box.height);
+            }
+            
+            if (isNaN(box.left) || isNaN(box.top)) {
+                continue;
+            }
+            
+            comp.setPosition(box.left, box.top);
+        }
+    },
+
+    
+    updateInnerCtSize: function(tSize, calcs) {
+        var align   = this.align,
+            padding = this.padding,
+            width   = tSize.width,
+            height  = tSize.height;
+        
+        if (this.type == 'hbox') {
+            var innerCtWidth  = width,
+                innerCtHeight = calcs.meta.maxHeight + padding.top + padding.bottom;
+
+            if (align == 'stretch') {
+                innerCtHeight = height;
+            } else if (align == 'middle') {
+                innerCtHeight = Math.max(height, innerCtHeight);
+            }
+        } else {
+            var innerCtHeight = height,
+                innerCtWidth  = calcs.meta.maxWidth + padding.left + padding.right;
+
+            if (align == 'stretch') {
+                innerCtWidth = width;
+            } else if (align == 'center') {
+                innerCtWidth = Math.max(width, innerCtWidth);
+            }
+        }
+
+        this.innerCt.setSize(innerCtWidth || undefined, innerCtHeight || undefined);
+    },
+
+    
+    handleTargetOverflow: function(previousTargetSize, container, target) {
+        var overflow = target.getStyle('overflow');
+
+        if (overflow && overflow != 'hidden' &&!this.adjustmentPass) {
+            var newTargetSize = this.getLayoutTargetSize();
+            if (newTargetSize.width != previousTargetSize.width || newTargetSize.height != previousTargetSize.height){
+                this.adjustmentPass = true;
+                this.onLayout(container, target);
+            }
+        }
+
+        delete this.adjustmentPass;
+    },
+
+    
+    isValidParent : function(c, target) {
+        return this.innerCt && c.getPositionEl().dom.parentNode == this.innerCt.dom;
+    },
+
+    
+    getVisibleItems: function(ct) {
+        var ct  = ct || this.container,
+            t   = ct.getLayoutTarget(),
+            cti = ct.items.items,
+            len = cti.length,
+
+            i, c, items = [];
+
+        for (i = 0; i < len; i++) {
+            if((c = cti[i]).rendered && this.isValidParent(c, t) && c.hidden !== true  && c.collapsed !== true && c.shouldLayout !== false){
+                items.push(c);
+            }
+        }
+
+        return items;
+    },
+
+    
+    renderAll : function(ct, target) {
+        if (!this.innerCt) {
+            
+            this.innerCt = target.createChild({cls:this.innerCls});
+            this.padding = this.parseMargins(this.padding);
+        }
+        Ext.layout.BoxLayout.superclass.renderAll.call(this, ct, this.innerCt);
+    },
+
+    getLayoutTargetSize : function() {
+        var target = this.container.getLayoutTarget(), ret;
+        
+        if (target) {
+            ret = target.getViewSize();
+
+            
+            
+            
+            if (Ext.isIE && Ext.isStrict && ret.width == 0){
+                ret =  target.getStyleSize();
+            }
+
+            ret.width  -= target.getPadding('lr');
+            ret.height -= target.getPadding('tb');
+        }
+        
+        return ret;
+    },
+
+    
+    renderItem : function(c) {
+        if(Ext.isString(c.margins)){
+            c.margins = this.parseMargins(c.margins);
+        }else if(!c.margins){
+            c.margins = this.defaultMargins;
+        }
+        Ext.layout.BoxLayout.superclass.renderItem.apply(this, arguments);
+    },
+    
+    
+    destroy: function() {
+        Ext.destroy(this.overflowHandler);
+        
+        Ext.layout.BoxLayout.superclass.destroy.apply(this, arguments);
+    }
+});
+
+
+
+Ext.ns('Ext.layout.boxOverflow');
+
+
+
+Ext.layout.boxOverflow.None = Ext.extend(Object, {
+    constructor: function(layout, config) {
+        this.layout = layout;
+        
+        Ext.apply(this, config || {});
+    },
+    
+    handleOverflow: Ext.emptyFn,
+    
+    clearOverflow: Ext.emptyFn
+});
+
+
+Ext.layout.boxOverflow.none = Ext.layout.boxOverflow.None;
+
+Ext.layout.boxOverflow.Menu = Ext.extend(Ext.layout.boxOverflow.None, {
+    
+    afterCls: 'x-strip-right',
+    
+    
+    noItemsMenuText : '<div class="x-toolbar-no-items">(None)</div>',
+    
+    constructor: function(layout) {
+        Ext.layout.boxOverflow.Menu.superclass.constructor.apply(this, arguments);
+        
+        
+        this.menuItems = [];
+    },
+    
+    
+    createInnerElements: function() {
+        if (!this.afterCt) {
+            this.afterCt  = this.layout.innerCt.insertSibling({cls: this.afterCls},  'before');
+        }
+    },
+    
+    
+    clearOverflow: function(calculations, targetSize) {
+        var newWidth = targetSize.width + (this.afterCt ? this.afterCt.getWidth() : 0),
+            items    = this.menuItems;
+        
+        this.hideTrigger();
+        
+        for (var index = 0, length = items.length; index < length; index++) {
+            items.pop().component.show();
+        }
+        
+        return {
+            targetSize: {
+                height: targetSize.height,
+                width : newWidth
+            }
+        };
+    },
+    
+    
+    showTrigger: function() {
+        this.createMenu();
+        this.menuTrigger.show();
+    },
+    
+    
+    hideTrigger: function() {
+        if (this.menuTrigger != undefined) {
+            this.menuTrigger.hide();
+        }
+    },
+    
+    
+    beforeMenuShow: function(menu) {
+        var items = this.menuItems,
+            len   = items.length,
+            item,
+            prev;
+
+        var needsSep = function(group, item){
+            return group.isXType('buttongroup') && !(item instanceof Ext.Toolbar.Separator);
+        };
+        
+        this.clearMenu();
+        menu.removeAll();
+        
+        for (var i = 0; i < len; i++) {
+            item = items[i].component;
+            
+            if (prev && (needsSep(item, prev) || needsSep(prev, item))) {
+                menu.add('-');
+            }
+            
+            this.addComponentToMenu(menu, item);
+            prev = item;
+        }
+
+        
+        if (menu.items.length < 1) {
+            menu.add(this.noItemsMenuText);
+        }
+    },
+    
+    
+    createMenuConfig : function(component, hideOnClick){
+        var config = Ext.apply({}, component.initialConfig),
+            group  = component.toggleGroup;
+
+        Ext.copyTo(config, component, [
+            'iconCls', 'icon', 'itemId', 'disabled', 'handler', 'scope', 'menu'
+        ]);
+
+        Ext.apply(config, {
+            text       : component.overflowText || component.text,
+            hideOnClick: hideOnClick
+        });
+
+        if (group || component.enableToggle) {
+            Ext.apply(config, {
+                group  : group,
+                checked: component.pressed,
+                listeners: {
+                    checkchange: function(item, checked){
+                        component.toggle(checked);
+                    }
+                }
+            });
+        }
+
+        delete config.ownerCt;
+        delete config.xtype;
+        delete config.id;
+
+        return config;
+    },
+
+    
+    addComponentToMenu : function(menu, component) {
+        if (component instanceof Ext.Toolbar.Separator) {
+            menu.add('-');
+
+        } else if (Ext.isFunction(component.isXType)) {
+            if (component.isXType('splitbutton')) {
+                menu.add(this.createMenuConfig(component, true));
+
+            } else if (component.isXType('button')) {
+                menu.add(this.createMenuConfig(component, !component.menu));
+
+            } else if (component.isXType('buttongroup')) {
+                component.items.each(function(item){
+                     this.addComponentToMenu(menu, item);
+                }, this);
+            }
+        }
+    },
+    
+    
+    clearMenu : function(){
+        var menu = this.moreMenu;
+        if (menu && menu.items) {
+            menu.items.each(function(item){
+                delete item.menu;
+            });
+        }
+    },
+    
+    
+    createMenu: function() {
+        if (!this.menuTrigger) {
+            this.createInnerElements();
+            
+            
+            this.menu = new Ext.menu.Menu({
+                ownerCt : this.layout.container,
+                listeners: {
+                    scope: this,
+                    beforeshow: this.beforeMenuShow
+                }
+            });
+
+            
+            this.menuTrigger = new Ext.Button({
+                iconCls : 'x-toolbar-more-icon',
+                cls     : 'x-toolbar-more',
+                menu    : this.menu,
+                renderTo: this.afterCt
+            });
+        }
+    },
+    
+    
+    destroy: function() {
+        Ext.destroy(this.menu, this.menuTrigger);
+    }
+});
+
+Ext.layout.boxOverflow.menu = Ext.layout.boxOverflow.Menu;
+
+
+
+Ext.layout.boxOverflow.HorizontalMenu = Ext.extend(Ext.layout.boxOverflow.Menu, {
+    
+    constructor: function() {
+        Ext.layout.boxOverflow.HorizontalMenu.superclass.constructor.apply(this, arguments);
+        
+        var me = this,
+            layout = me.layout,
+            origFunction = layout.calculateChildBoxes;
+        
+        layout.calculateChildBoxes = function(visibleItems, targetSize) {
+            var calcs = origFunction.apply(layout, arguments),
+                meta  = calcs.meta,
+                items = me.menuItems;
+            
+            
+            
+            var hiddenWidth = 0;
+            for (var index = 0, length = items.length; index < length; index++) {
+                hiddenWidth += items[index].width;
+            }
+            
+            meta.minimumWidth += hiddenWidth;
+            meta.tooNarrow = meta.minimumWidth > targetSize.width;
+            
+            return calcs;
+        };        
+    },
+    
+    handleOverflow: function(calculations, targetSize) {
+        this.showTrigger();
+        
+        var newWidth    = targetSize.width - this.afterCt.getWidth(),
+            boxes       = calculations.boxes,
+            usedWidth   = 0,
+            recalculate = false;
+        
+        
+        for (var index = 0, length = boxes.length; index < length; index++) {
+            usedWidth += boxes[index].width;
+        }
+        
+        var spareWidth = newWidth - usedWidth,
+            showCount  = 0;
+        
+        
+        for (var index = 0, length = this.menuItems.length; index < length; index++) {
+            var hidden = this.menuItems[index],
+                comp   = hidden.component,
+                width  = hidden.width;
+            
+            if (width < spareWidth) {
+                comp.show();
+                
+                spareWidth -= width;
+                showCount ++;
+                recalculate = true;
+            } else {
+                break;
+            }
+        }
+                
+        if (recalculate) {
+            this.menuItems = this.menuItems.slice(showCount);
+        } else {
+            for (var i = boxes.length - 1; i >= 0; i--) {
+                var item  = boxes[i].component,
+                    right = boxes[i].left + boxes[i].width;
+
+                if (right >= newWidth) {
+                    this.menuItems.unshift({
+                        component: item,
+                        width    : boxes[i].width
+                    });
+
+                    item.hide();
+                } else {
+                    break;
+                }
+            }
+        }
+        
+        if (this.menuItems.length == 0) {
+            this.hideTrigger();
+        }
+        
+        return {
+            targetSize: {
+                height: targetSize.height,
+                width : newWidth
+            },
+            recalculate: recalculate
+        };
+    }
+});
+
+Ext.layout.boxOverflow.menu.hbox = Ext.layout.boxOverflow.HorizontalMenu;
+Ext.layout.boxOverflow.Scroller = Ext.extend(Ext.layout.boxOverflow.None, {
+    
+    animateScroll: true,
+    
+    
+    scrollIncrement: 100,
+    
+    
+    wheelIncrement: 3,
+    
+    
+    scrollRepeatInterval: 400,
+    
+    
+    scrollDuration: 0.4,
+    
+    
+    beforeCls: 'x-strip-left',
+    
+    
+    afterCls: 'x-strip-right',
+    
+    
+    scrollerCls: 'x-strip-scroller',
+    
+    
+    beforeScrollerCls: 'x-strip-scroller-left',
+    
+    
+    afterScrollerCls: 'x-strip-scroller-right',
+    
+    
+    createWheelListener: function() {
+        this.layout.innerCt.on({
+            scope     : this,
+            mousewheel: function(e) {
+                e.stopEvent();
+
+                this.scrollBy(e.getWheelDelta() * this.wheelIncrement * -1, false);
+            }
+        });
+    },
+    
+    
+    handleOverflow: function(calculations, targetSize) {
+        this.createInnerElements();
+        this.showScrollers();
+    },
+    
+    
+    clearOverflow: function() {
+        this.hideScrollers();
+    },
+    
+    
+    showScrollers: function() {
+        this.createScrollers();
+        
+        this.beforeScroller.show();
+        this.afterScroller.show();
+        
+        this.updateScrollButtons();
+    },
+    
+    
+    hideScrollers: function() {
+        if (this.beforeScroller != undefined) {
+            this.beforeScroller.hide();
+            this.afterScroller.hide();          
+        }
+    },
+    
+    
+    createScrollers: function() {
+        if (!this.beforeScroller && !this.afterScroller) {
+            var before = this.beforeCt.createChild({
+                cls: String.format("{0} {1} ", this.scrollerCls, this.beforeScrollerCls)
+            });
+            
+            var after = this.afterCt.createChild({
+                cls: String.format("{0} {1}", this.scrollerCls, this.afterScrollerCls)
+            });
+            
+            before.addClassOnOver(this.beforeScrollerCls + '-hover');
+            after.addClassOnOver(this.afterScrollerCls + '-hover');
+            
+            before.setVisibilityMode(Ext.Element.DISPLAY);
+            after.setVisibilityMode(Ext.Element.DISPLAY);
+            
+            this.beforeRepeater = new Ext.util.ClickRepeater(before, {
+                interval: this.scrollRepeatInterval,
+                handler : this.scrollLeft,
+                scope   : this
+            });
+            
+            this.afterRepeater = new Ext.util.ClickRepeater(after, {
+                interval: this.scrollRepeatInterval,
+                handler : this.scrollRight,
+                scope   : this
+            });
+            
+            
+            this.beforeScroller = before;
+            
+            
+            this.afterScroller = after;
+        }
+    },
+    
+    
+    destroy: function() {
+        Ext.destroy(this.beforeScroller, this.afterScroller, this.beforeRepeater, this.afterRepeater, this.beforeCt, this.afterCt);
+    },
+    
+    
+    scrollBy: function(delta, animate) {
+        this.scrollTo(this.getScrollPosition() + delta, animate);
+    },
+    
+    
+    getItem: function(item) {
+        if (Ext.isString(item)) {
+            item = Ext.getCmp(item);
+        } else if (Ext.isNumber(item)) {
+            item = this.items[item];
+        }
+        
+        return item;
+    },
+    
+    
+    getScrollAnim: function() {
+        return {
+            duration: this.scrollDuration, 
+            callback: this.updateScrollButtons, 
+            scope   : this
+        };
+    },
+    
+    
+    updateScrollButtons: function() {
+        if (this.beforeScroller == undefined || this.afterScroller == undefined) {
+            return;
+        }
+        
+        var beforeMeth = this.atExtremeBefore()  ? 'addClass' : 'removeClass',
+            afterMeth  = this.atExtremeAfter() ? 'addClass' : 'removeClass',
+            beforeCls  = this.beforeScrollerCls + '-disabled',
+            afterCls   = this.afterScrollerCls  + '-disabled';
+        
+        this.beforeScroller[beforeMeth](beforeCls);
+        this.afterScroller[afterMeth](afterCls);
+        this.scrolling = false;
+    },
+    
+    
+    atExtremeBefore: function() {
+        return this.getScrollPosition() === 0;
+    },
+    
+    
+    scrollLeft: function(animate) {
+        this.scrollBy(-this.scrollIncrement, animate);
+    },
+    
+    
+    scrollRight: function(animate) {
+        this.scrollBy(this.scrollIncrement, animate);
+    },
+    
+    
+    scrollToItem: function(item, animate) {
+        item = this.getItem(item);
+        
+        if (item != undefined) {
+            var visibility = this.getItemVisibility(item);
+            
+            if (!visibility.fullyVisible) {
+                var box  = item.getBox(true, true),
+                    newX = box.x;
+                    
+                if (visibility.hiddenRight) {
+                    newX -= (this.layout.innerCt.getWidth() - box.width);
+                }
+                
+                this.scrollTo(newX, animate);
+            }
+        }
+    },
+    
+    
+    getItemVisibility: function(item) {
+        var box         = this.getItem(item).getBox(true, true),
+            itemLeft    = box.x,
+            itemRight   = box.x + box.width,
+            scrollLeft  = this.getScrollPosition(),
+            scrollRight = this.layout.innerCt.getWidth() + scrollLeft;
+        
+        return {
+            hiddenLeft  : itemLeft < scrollLeft,
+            hiddenRight : itemRight > scrollRight,
+            fullyVisible: itemLeft > scrollLeft && itemRight < scrollRight
+        };
+    }
+});
+
+Ext.layout.boxOverflow.scroller = Ext.layout.boxOverflow.Scroller;
+
+
+\r
+Ext.layout.boxOverflow.VerticalScroller = Ext.extend(Ext.layout.boxOverflow.Scroller, {
+    scrollIncrement: 75,
+    wheelIncrement : 2,
+    
+    handleOverflow: function(calculations, targetSize) {
+        Ext.layout.boxOverflow.VerticalScroller.superclass.handleOverflow.apply(this, arguments);
+        
+        return {
+            targetSize: {
+                height: targetSize.height - (this.beforeCt.getHeight() + this.afterCt.getHeight()),
+                width : targetSize.width
+            }
+        };
+    },
+    
+    
+    createInnerElements: function() {
+        var target = this.layout.innerCt;
+        
+        
+        
+        if (!this.beforeCt) {
+            this.beforeCt = target.insertSibling({cls: this.beforeCls}, 'before');
+            this.afterCt  = target.insertSibling({cls: this.afterCls},  'after');
+
+            this.createWheelListener();
+        }
+    },
+    
+    
+    scrollTo: function(position, animate) {
+        var oldPosition = this.getScrollPosition(),
+            newPosition = position.constrain(0, this.getMaxScrollBottom());
+        
+        if (newPosition != oldPosition && !this.scrolling) {
+            if (animate == undefined) {
+                animate = this.animateScroll;
+            }
+            
+            this.layout.innerCt.scrollTo('top', newPosition, animate ? this.getScrollAnim() : false);
+            
+            if (animate) {
+                this.scrolling = true;
+            } else {
+                this.scrolling = false;
+                this.updateScrollButtons();
+            }
+        }
+    },
+    
+    
+    getScrollPosition: function(){
+        return parseInt(this.layout.innerCt.dom.scrollTop, 10) || 0;
+    },
+    
+    
+    getMaxScrollBottom: function() {
+        return this.layout.innerCt.dom.scrollHeight - this.layout.innerCt.getHeight();
+    },
+    
+    
+    atExtremeAfter: function() {
+        return this.getScrollPosition() >= this.getMaxScrollBottom();
+    }
+});
+
+Ext.layout.boxOverflow.scroller.vbox = Ext.layout.boxOverflow.VerticalScroller;
+
+
+
+Ext.layout.boxOverflow.HorizontalScroller = Ext.extend(Ext.layout.boxOverflow.Scroller, {
+    handleOverflow: function(calculations, targetSize) {
+        Ext.layout.boxOverflow.HorizontalScroller.superclass.handleOverflow.apply(this, arguments);
+        
+        return {
+            targetSize: {
+                height: targetSize.height,
+                width : targetSize.width - (this.beforeCt.getWidth() + this.afterCt.getWidth())
+            }
+        };
+    },
+    
+    
+    createInnerElements: function() {
+        var target = this.layout.innerCt;
+        
+        
+        
+        if (!this.beforeCt) {
+            this.afterCt  = target.insertSibling({cls: this.afterCls},  'before');
+            this.beforeCt = target.insertSibling({cls: this.beforeCls}, 'before');
+            
+            this.createWheelListener();
+        }
+    },
+    
+    
+    scrollTo: function(position, animate) {
+        var oldPosition = this.getScrollPosition(),
+            newPosition = position.constrain(0, this.getMaxScrollRight());
+        
+        if (newPosition != oldPosition && !this.scrolling) {
+            if (animate == undefined) {
+                animate = this.animateScroll;
+            }
+            
+            this.layout.innerCt.scrollTo('left', newPosition, animate ? this.getScrollAnim() : false);
+            
+            if (animate) {
+                this.scrolling = true;
+            } else {
+                this.scrolling = false;
+                this.updateScrollButtons();
+            }
+        }
+    },
+    
+    
+    getScrollPosition: function(){
+        return parseInt(this.layout.innerCt.dom.scrollLeft, 10) || 0;
+    },
+    
+    
+    getMaxScrollRight: function() {
+        return this.layout.innerCt.dom.scrollWidth - this.layout.innerCt.getWidth();
+    },
+    
+    
+    atExtremeAfter: function() {
+        return this.getScrollPosition() >= this.getMaxScrollRight();
+    }
+});
+
+Ext.layout.boxOverflow.scroller.hbox = Ext.layout.boxOverflow.HorizontalScroller;
+Ext.layout.HBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
+    
+    align: 'top', 
+
+    type : 'hbox',
+
+    
+    
+
+    
+    calculateChildBoxes: function(visibleItems, targetSize) {
+        var visibleCount = visibleItems.length,
+
+            padding      = this.padding,
+            topOffset    = padding.top,
+            leftOffset   = padding.left,
+            paddingVert  = topOffset  + padding.bottom,
+            paddingHoriz = leftOffset + padding.right,
+
+            width        = targetSize.width - this.scrollOffset,
+            height       = targetSize.height,
+            availHeight  = Math.max(0, height - paddingVert),
+
+            isStart      = this.pack == 'start',
+            isCenter     = this.pack == 'center',
+            isEnd        = this.pack == 'end',
+
+            nonFlexWidth = 0,
+            maxHeight    = 0,
+            totalFlex    = 0,
+            desiredWidth = 0,
+            minimumWidth = 0,
+
+            
+            boxes        = [],
+
+            
+            child, childWidth, childHeight, childSize, childMargins, canLayout, i, calcs, flexedWidth, 
+            horizMargins, vertMargins, stretchHeight;
+
+        
+        for (i = 0; i < visibleCount; i++) {
+            child       = visibleItems[i];
+            childHeight = child.height;
+            childWidth  = child.width;
+            canLayout   = !child.hasLayout && typeof child.doLayout == 'function';
+
+            
+            if (typeof childWidth != 'number') {
+
+                
+                if (child.flex && !childWidth) {
+                    totalFlex += child.flex;
+
+                
+                } else {
+                    
+                    
+                    if (!childWidth && canLayout) {
+                        child.doLayout();
+                    }
+
+                    childSize   = child.getSize();
+                    childWidth  = childSize.width;
+                    childHeight = childSize.height;
+                }
+            }
+
+            childMargins = child.margins;
+            horizMargins = childMargins.left + childMargins.right;
+
+            nonFlexWidth += horizMargins + (childWidth || 0);
+            desiredWidth += horizMargins + (child.flex ? child.minWidth || 0 : childWidth);
+            minimumWidth += horizMargins + (child.minWidth || childWidth || 0);
+
+            
+            if (typeof childHeight != 'number') {
+                if (canLayout) {
+                    child.doLayout();
+                }
+                childHeight = child.getHeight();
+            }
+
+            maxHeight = Math.max(maxHeight, childHeight + childMargins.top + childMargins.bottom);
+
+            
+            boxes.push({
+                component: child,
+                height   : childHeight || undefined,
+                width    : childWidth  || undefined
+            });
+        }
+                
+        var shortfall = desiredWidth - width,
+            tooNarrow = minimumWidth > width;
+            
+        
+        var availableWidth = Math.max(0, width - nonFlexWidth - paddingHoriz);
+        
+        if (tooNarrow) {
+            for (i = 0; i < visibleCount; i++) {
+                boxes[i].width = visibleItems[i].minWidth || visibleItems[i].width || boxes[i].width;
+            }
+        } else {
+            
+            
+            if (shortfall > 0) {
+                var minWidths = [];
+                
+                
+                for (var index = 0, length = visibleCount; index < length; index++) {
+                    var item     = visibleItems[index],
+                        minWidth = item.minWidth || 0;
+
+                    
+                    
+                    if (item.flex) {
+                        boxes[index].width = minWidth;
+                    } else {
+                        minWidths.push({
+                            minWidth : minWidth,
+                            available: boxes[index].width - minWidth,
+                            index    : index
+                        });
+                    }
+                }
+                
+                
+                minWidths.sort(function(a, b) {
+                    return a.available > b.available ? 1 : -1;
+                });
+                
+                
+                for (var i = 0, length = minWidths.length; i < length; i++) {
+                    var itemIndex = minWidths[i].index;
+                    
+                    if (itemIndex == undefined) {
+                        continue;
+                    }
+                        
+                    var item      = visibleItems[itemIndex],
+                        box       = boxes[itemIndex],
+                        oldWidth  = box.width,
+                        minWidth  = item.minWidth,
+                        newWidth  = Math.max(minWidth, oldWidth - Math.ceil(shortfall / (length - i))),
+                        reduction = oldWidth - newWidth;
+                    
+                    boxes[itemIndex].width = newWidth;
+                    shortfall -= reduction;                    
+                }
+            } else {
+                
+                var remainingWidth = availableWidth,
+                    remainingFlex  = totalFlex;
+
+                
+                for (i = 0; i < visibleCount; i++) {
+                    child = visibleItems[i];
+                    calcs = boxes[i];
+
+                    childMargins = child.margins;
+                    vertMargins  = childMargins.top + childMargins.bottom;
+
+                    if (isStart && child.flex && !child.width) {
+                        flexedWidth     = Math.ceil((child.flex / remainingFlex) * remainingWidth);
+                        remainingWidth -= flexedWidth;
+                        remainingFlex  -= child.flex;
+
+                        calcs.width = flexedWidth;
+                        calcs.dirtySize = true;
+                    }
+                }
+            }
+        }
+        
+        if (isCenter) {
+            leftOffset += availableWidth / 2;
+        } else if (isEnd) {
+            leftOffset += availableWidth;
+        }
+        
+        
+        for (i = 0; i < visibleCount; i++) {
+            child = visibleItems[i];
+            calcs = boxes[i];
+            
+            childMargins = child.margins;
+            leftOffset  += childMargins.left;
+            vertMargins  = childMargins.top + childMargins.bottom;
+            
+            calcs.left = leftOffset;
+            calcs.top  = topOffset + childMargins.top;
+
+            switch (this.align) {
+                case 'stretch':
+                    stretchHeight = availHeight - vertMargins;
+                    calcs.height  = stretchHeight.constrain(child.minHeight || 0, child.maxHeight || 1000000);
+                    calcs.dirtySize = true;
+                    break;
+                case 'stretchmax':
+                    stretchHeight = maxHeight - vertMargins;
+                    calcs.height  = stretchHeight.constrain(child.minHeight || 0, child.maxHeight || 1000000);
+                    calcs.dirtySize = true;
+                    break;
+                case 'middle':
+                    var diff = availHeight - calcs.height - vertMargins;
+                    if (diff > 0) {
+                        calcs.top = topOffset + vertMargins + (diff / 2);
+                    }
+            }
+            
+            leftOffset += calcs.width + childMargins.right;
+        }
+
+        return {
+            boxes: boxes,
+            meta : {
+                maxHeight   : maxHeight,
+                nonFlexWidth: nonFlexWidth,
+                desiredWidth: desiredWidth,
+                minimumWidth: minimumWidth,
+                shortfall   : desiredWidth - width,
+                tooNarrow   : tooNarrow
+            }
+        };
+    }
+});
+
+Ext.Container.LAYOUTS.hbox = Ext.layout.HBoxLayout;
+Ext.layout.VBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
+    
+    align : 'left', 
+    type: 'vbox',
+
+    
+
+    
+
+    
+    calculateChildBoxes: function(visibleItems, targetSize) {
+        var visibleCount = visibleItems.length,
+
+            padding      = this.padding,
+            topOffset    = padding.top,
+            leftOffset   = padding.left,
+            paddingVert  = topOffset  + padding.bottom,
+            paddingHoriz = leftOffset + padding.right,
+
+            width        = targetSize.width - this.scrollOffset,
+            height       = targetSize.height,
+            availWidth   = Math.max(0, width - paddingHoriz),
+
+            isStart      = this.pack == 'start',
+            isCenter     = this.pack == 'center',
+            isEnd        = this.pack == 'end',
+
+            nonFlexHeight= 0,
+            maxWidth     = 0,
+            totalFlex    = 0,
+            desiredHeight= 0,
+            minimumHeight= 0,
+
+            
+            boxes        = [],
+            
+            
+            child, childWidth, childHeight, childSize, childMargins, canLayout, i, calcs, flexedWidth, 
+            horizMargins, vertMargins, stretchWidth;
+
+        
+        for (i = 0; i < visibleCount; i++) {
+            child = visibleItems[i];
+            childHeight = child.height;
+            childWidth  = child.width;
+            canLayout   = !child.hasLayout && typeof child.doLayout == 'function';
+
+            
+            if (typeof childHeight != 'number') {
+
+                
+                if (child.flex && !childHeight) {
+                    totalFlex += child.flex;
+
+                
+                } else {
+                    
+                    
+                    if (!childHeight && canLayout) {
+                        child.doLayout();
+                    }
+
+                    childSize = child.getSize();
+                    childWidth = childSize.width;
+                    childHeight = childSize.height;
+                }
+            }
+            
+            childMargins = child.margins;
+            vertMargins  = childMargins.top + childMargins.bottom;
+
+            nonFlexHeight += vertMargins + (childHeight || 0);
+            desiredHeight += vertMargins + (child.flex ? child.minHeight || 0 : childHeight);
+            minimumHeight += vertMargins + (child.minHeight || childHeight || 0);
+
+            
+            if (typeof childWidth != 'number') {
+                if (canLayout) {
+                    child.doLayout();
+                }
+                childWidth = child.getWidth();
+            }
+
+            maxWidth = Math.max(maxWidth, childWidth + childMargins.left + childMargins.right);
+
+            
+            boxes.push({
+                component: child,
+                height   : childHeight || undefined,
+                width    : childWidth || undefined
+            });
+        }
+                
+        var shortfall = desiredHeight - height,
+            tooNarrow = minimumHeight > height;
+
+        
+        var availableHeight = Math.max(0, (height - nonFlexHeight - paddingVert));
+        
+        if (tooNarrow) {
+            for (i = 0, length = visibleCount; i < length; i++) {
+                boxes[i].height = visibleItems[i].minHeight || visibleItems[i].height || boxes[i].height;
+            }
+        } else {
+            
+            
+            if (shortfall > 0) {
+                var minHeights = [];
+
+                
+                for (var index = 0, length = visibleCount; index < length; index++) {
+                    var item      = visibleItems[index],
+                        minHeight = item.minHeight || 0;
+
+                    
+                    
+                    if (item.flex) {
+                        boxes[index].height = minHeight;
+                    } else {
+                        minHeights.push({
+                            minHeight: minHeight, 
+                            available: boxes[index].height - minHeight,
+                            index    : index
+                        });
+                    }
+                }
+
+                
+                minHeights.sort(function(a, b) {
+                    return a.available > b.available ? 1 : -1;
+                });
+
+                
+                for (var i = 0, length = minHeights.length; i < length; i++) {
+                    var itemIndex = minHeights[i].index;
+
+                    if (itemIndex == undefined) {
+                        continue;
+                    }
+
+                    var item      = visibleItems[itemIndex],
+                        box       = boxes[itemIndex],
+                        oldHeight  = box.height,
+                        minHeight  = item.minHeight,
+                        newHeight  = Math.max(minHeight, oldHeight - Math.ceil(shortfall / (length - i))),
+                        reduction = oldHeight - newHeight;
+
+                    boxes[itemIndex].height = newHeight;
+                    shortfall -= reduction;
+                }
+            } else {
+                
+                var remainingHeight = availableHeight,
+                    remainingFlex   = totalFlex;
+                
+                
+                for (i = 0; i < visibleCount; i++) {
+                    child = visibleItems[i];
+                    calcs = boxes[i];
+
+                    childMargins = child.margins;
+                    horizMargins = childMargins.left + childMargins.right;
+
+                    if (isStart && child.flex && !child.height) {
+                        flexedHeight     = Math.ceil((child.flex / remainingFlex) * remainingHeight);
+                        remainingHeight -= flexedHeight;
+                        remainingFlex   -= child.flex;
+
+                        calcs.height = flexedHeight;
+                        calcs.dirtySize = true;
+                    }
+                }
+            }
+        }
+
+        if (isCenter) {
+            topOffset += availableHeight / 2;
+        } else if (isEnd) {
+            topOffset += availableHeight;
+        }
+
+        
+        for (i = 0; i < visibleCount; i++) {
+            child = visibleItems[i];
+            calcs = boxes[i];
+
+            childMargins = child.margins;
+            topOffset   += childMargins.top;
+            horizMargins = childMargins.left + childMargins.right;
+            
+
+            calcs.left = leftOffset + childMargins.left;
+            calcs.top  = topOffset;
+            
+            switch (this.align) {
+                case 'stretch':
+                    stretchWidth = availWidth - horizMargins;
+                    calcs.width  = stretchWidth.constrain(child.minWidth || 0, child.maxWidth || 1000000);
+                    calcs.dirtySize = true;
+                    break;
+                case 'stretchmax':
+                    stretchWidth = maxWidth - horizMargins;
+                    calcs.width  = stretchWidth.constrain(child.minWidth || 0, child.maxWidth || 1000000);
+                    calcs.dirtySize = true;
+                    break;
+                case 'center':
+                    var diff = availWidth - calcs.width - horizMargins;
+                    if (diff > 0) {
+                        calcs.left = leftOffset + horizMargins + (diff / 2);
+                    }
+            }
+
+            topOffset += calcs.height + childMargins.bottom;
+        }
+        
+        return {
+            boxes: boxes,
+            meta : {
+                maxWidth     : maxWidth,
+                nonFlexHeight: nonFlexHeight,
+                desiredHeight: desiredHeight,
+                minimumHeight: minimumHeight,
+                shortfall    : desiredHeight - height,
+                tooNarrow    : tooNarrow
+            }
+        };
+    }
+});
+
+Ext.Container.LAYOUTS.vbox = Ext.layout.VBoxLayout;
+
+Ext.layout.ToolbarLayout = Ext.extend(Ext.layout.ContainerLayout, {
+    monitorResize : true,
+
+    type: 'toolbar',
+
+    
+    triggerWidth: 18,
+
+    
+    noItemsMenuText : '<div class="x-toolbar-no-items">(None)</div>',
+
+    
+    lastOverflow: false,
+
+    
+    tableHTML: [
+        '<table cellspacing="0" class="x-toolbar-ct">',
+            '<tbody>',
+                '<tr>',
+                    '<td class="x-toolbar-left" align="{0}">',
+                        '<table cellspacing="0">',
+                            '<tbody>',
+                                '<tr class="x-toolbar-left-row"></tr>',
+                            '</tbody>',
+                        '</table>',
+                    '</td>',
+                    '<td class="x-toolbar-right" align="right">',
+                        '<table cellspacing="0" class="x-toolbar-right-ct">',
+                            '<tbody>',
+                                '<tr>',
+                                    '<td>',
+                                        '<table cellspacing="0">',
+                                            '<tbody>',
+                                                '<tr class="x-toolbar-right-row"></tr>',
+                                            '</tbody>',
+                                        '</table>',
+                                    '</td>',
+                                    '<td>',
+                                        '<table cellspacing="0">',
+                                            '<tbody>',
+                                                '<tr class="x-toolbar-extras-row"></tr>',
+                                            '</tbody>',
+                                        '</table>',
+                                    '</td>',
+                                '</tr>',
+                            '</tbody>',
+                        '</table>',
+                    '</td>',
+                '</tr>',
+            '</tbody>',
+        '</table>'
+    ].join(""),
+
+    
+    onLayout : function(ct, target) {
+        
+        if (!this.leftTr) {
+            var align = ct.buttonAlign == 'center' ? 'center' : 'left';
+
+            target.addClass('x-toolbar-layout-ct');
+            target.insertHtml('beforeEnd', String.format(this.tableHTML, align));
+
+            this.leftTr   = target.child('tr.x-toolbar-left-row', true);
+            this.rightTr  = target.child('tr.x-toolbar-right-row', true);
+            this.extrasTr = target.child('tr.x-toolbar-extras-row', true);
+
+            if (this.hiddenItem == undefined) {
+                
+                this.hiddenItems = [];
+            }
+        }
+
+        var side     = ct.buttonAlign == 'right' ? this.rightTr : this.leftTr,
+            items    = ct.items.items,
+            position = 0;
+
+        
+        for (var i = 0, len = items.length, c; i < len; i++, position++) {
+            c = items[i];
+
+            if (c.isFill) {
+                side   = this.rightTr;
+                position = -1;
+            } else if (!c.rendered) {
+                c.render(this.insertCell(c, side, position));
+                this.configureItem(c);
+            } else {
+                if (!c.xtbHidden && !this.isValidParent(c, side.childNodes[position])) {
+                    var td = this.insertCell(c, side, position);
+                    td.appendChild(c.getPositionEl().dom);
+                    c.container = Ext.get(td);
+                }
+            }
+        }
+
+        
+        this.cleanup(this.leftTr);
+        this.cleanup(this.rightTr);
+        this.cleanup(this.extrasTr);
+        this.fitToSize(target);
+    },
+
+    
+    cleanup : function(el) {
+        var cn = el.childNodes, i, c;
+
+        for (i = cn.length-1; i >= 0 && (c = cn[i]); i--) {
+            if (!c.firstChild) {
+                el.removeChild(c);
+            }
+        }
+    },
+
+    
+    insertCell : function(c, target, position) {
+        var td = document.createElement('td');
+        td.className = 'x-toolbar-cell';
+
+        target.insertBefore(td, target.childNodes[position] || null);
+
+        return td;
+    },
+
+    
+    hideItem : function(item) {
+        this.hiddenItems.push(item);
+
+        item.xtbHidden = true;
+        item.xtbWidth = item.getPositionEl().dom.parentNode.offsetWidth;
+        item.hide();
+    },
+
+    
+    unhideItem : function(item) {
+        item.show();
+        item.xtbHidden = false;
+        this.hiddenItems.remove(item);
+    },
+
+    
+    getItemWidth : function(c) {
+        return c.hidden ? (c.xtbWidth || 0) : c.getPositionEl().dom.parentNode.offsetWidth;
+    },
+
+    
+    fitToSize : function(target) {
+        if (this.container.enableOverflow === false) {
+            return;
+        }
+
+        var width       = target.dom.clientWidth,
+            tableWidth  = target.dom.firstChild.offsetWidth,
+            clipWidth   = width - this.triggerWidth,
+            lastWidth   = this.lastWidth || 0,
+
+            hiddenItems = this.hiddenItems,
+            hasHiddens  = hiddenItems.length != 0,
+            isLarger    = width >= lastWidth;
+
+        this.lastWidth  = width;
+
+        if (tableWidth > width || (hasHiddens && isLarger)) {
+            var items     = this.container.items.items,
+                len       = items.length,
+                loopWidth = 0,
+                item;
+
+            for (var i = 0; i < len; i++) {
+                item = items[i];
+
+                if (!item.isFill) {
+                    loopWidth += this.getItemWidth(item);
+                    if (loopWidth > clipWidth) {
+                        if (!(item.hidden || item.xtbHidden)) {
+                            this.hideItem(item);
+                        }
+                    } else if (item.xtbHidden) {
+                        this.unhideItem(item);
+                    }
+                }
+            }
+        }
+
+        
+        hasHiddens = hiddenItems.length != 0;
+
+        if (hasHiddens) {
+            this.initMore();
+
+            if (!this.lastOverflow) {
+                this.container.fireEvent('overflowchange', this.container, true);
+                this.lastOverflow = true;
+            }
+        } else if (this.more) {
+            this.clearMenu();
+            this.more.destroy();
+            delete this.more;
+
+            if (this.lastOverflow) {
+                this.container.fireEvent('overflowchange', this.container, false);
+                this.lastOverflow = false;
+            }
+        }
+    },
+
+    
+    createMenuConfig : function(component, hideOnClick){
+        var config = Ext.apply({}, component.initialConfig),
+            group  = component.toggleGroup;
+
+        Ext.copyTo(config, component, [
+            'iconCls', 'icon', 'itemId', 'disabled', 'handler', 'scope', 'menu'
+        ]);
+
+        Ext.apply(config, {
+            text       : component.overflowText || component.text,
+            hideOnClick: hideOnClick
+        });
+
+        if (group || component.enableToggle) {
+            Ext.apply(config, {
+                group  : group,
+                checked: component.pressed,
+                listeners: {
+                    checkchange: function(item, checked){
+                        component.toggle(checked);
+                    }
+                }
+            });
+        }
+
+        delete config.ownerCt;
+        delete config.xtype;
+        delete config.id;
+
+        return config;
+    },
+
+    
+    addComponentToMenu : function(menu, component) {
+        if (component instanceof Ext.Toolbar.Separator) {
+            menu.add('-');
+
+        } else if (Ext.isFunction(component.isXType)) {
+            if (component.isXType('splitbutton')) {
+                menu.add(this.createMenuConfig(component, true));
+
+            } else if (component.isXType('button')) {
+                menu.add(this.createMenuConfig(component, !component.menu));
+
+            } else if (component.isXType('buttongroup')) {
+                component.items.each(function(item){
+                     this.addComponentToMenu(menu, item);
+                }, this);
+            }
+        }
+    },
+
+    
+    clearMenu : function(){
+        var menu = this.moreMenu;
+        if (menu && menu.items) {
+            menu.items.each(function(item){
+                delete item.menu;
+            });
+        }
+    },
+
+    
+    beforeMoreShow : function(menu) {
+        var items = this.container.items.items,
+            len   = items.length,
+            item,
+            prev;
+
+        var needsSep = function(group, item){
+            return group.isXType('buttongroup') && !(item instanceof Ext.Toolbar.Separator);
+        };
+
+        this.clearMenu();
+        menu.removeAll();
+        for (var i = 0; i < len; i++) {
+            item = items[i];
+            if (item.xtbHidden) {
+                if (prev && (needsSep(item, prev) || needsSep(prev, item))) {
+                    menu.add('-');
+                }
+                this.addComponentToMenu(menu, item);
+                prev = item;
+            }
+        }
+
+        
+        if (menu.items.length < 1) {
+            menu.add(this.noItemsMenuText);
+        }
+    },
+
+    
+    initMore : function(){
+        if (!this.more) {
+            
+            this.moreMenu = new Ext.menu.Menu({
+                ownerCt : this.container,
+                listeners: {
+                    beforeshow: this.beforeMoreShow,
+                    scope: this
+                }
+            });
+
+            
+            this.more = new Ext.Button({
+                iconCls: 'x-toolbar-more-icon',
+                cls    : 'x-toolbar-more',
+                menu   : this.moreMenu,
+                ownerCt: this.container
+            });
+
+            var td = this.insertCell(this.more, this.extrasTr, 100);
+            this.more.render(td);
+        }
+    },
+
+    destroy : function(){
+        Ext.destroy(this.more, this.moreMenu);
+        delete this.leftTr;
+        delete this.rightTr;
+        delete this.extrasTr;
+        Ext.layout.ToolbarLayout.superclass.destroy.call(this);
+    }
+});
+
+Ext.Container.LAYOUTS.toolbar = Ext.layout.ToolbarLayout;
+
+ Ext.layout.MenuLayout = Ext.extend(Ext.layout.ContainerLayout, {
+    monitorResize : true,
+
+    type: 'menu',
+
+    setContainer : function(ct){
+        this.monitorResize = !ct.floating;
+        
+        
+        ct.on('autosize', this.doAutoSize, this);
+        Ext.layout.MenuLayout.superclass.setContainer.call(this, ct);
+    },
+
+    renderItem : function(c, position, target){
+        if (!this.itemTpl) {
+            this.itemTpl = Ext.layout.MenuLayout.prototype.itemTpl = new Ext.XTemplate(
+                '<li id="{itemId}" class="{itemCls}">',
+                    '<tpl if="needsIcon">',
+                        '<img alt="{altText}" src="{icon}" class="{iconCls}"/>',
+                    '</tpl>',
+                '</li>'
+            );
+        }
+
+        if(c && !c.rendered){
+            if(Ext.isNumber(position)){
+                position = target.dom.childNodes[position];
+            }
+            var a = this.getItemArgs(c);
+
+
+            c.render(c.positionEl = position ?
+                this.itemTpl.insertBefore(position, a, true) :
+                this.itemTpl.append(target, a, true));
+
+
+            c.positionEl.menuItemId = c.getItemId();
+
+
+
+            if (!a.isMenuItem && a.needsIcon) {
+                c.positionEl.addClass('x-menu-list-item-indent');
+            }
+            this.configureItem(c);
+        }else if(c && !this.isValidParent(c, target)){
+            if(Ext.isNumber(position)){
+                position = target.dom.childNodes[position];
+            }
+            target.dom.insertBefore(c.getActionEl().dom, position || null);
+        }
+    },
+
+    getItemArgs : function(c) {
+        var isMenuItem = c instanceof Ext.menu.Item,
+            canHaveIcon = !(isMenuItem || c instanceof Ext.menu.Separator);
+
+        return {
+            isMenuItem: isMenuItem,
+            needsIcon: canHaveIcon && (c.icon || c.iconCls),
+            icon: c.icon || Ext.BLANK_IMAGE_URL,
+            iconCls: 'x-menu-item-icon ' + (c.iconCls || ''),
+            itemId: 'x-menu-el-' + c.id,
+            itemCls: 'x-menu-list-item ',
+            altText: c.altText || ''
+        };
+    },
+
+    
+    isValidParent : function(c, target) {
+        return c.el.up('li.x-menu-list-item', 5).dom.parentNode === (target.dom || target);
+    },
+
+    onLayout : function(ct, target){
+        Ext.layout.MenuLayout.superclass.onLayout.call(this, ct, target);
+        this.doAutoSize();
+    },
+
+    doAutoSize : function(){
+        var ct = this.container, w = ct.width;
+        if(ct.floating){
+            if(w){
+                ct.setWidth(w);
+            }else if(Ext.isIE){
+                ct.setWidth(Ext.isStrict && (Ext.isIE7 || Ext.isIE8) ? 'auto' : ct.minWidth);
+                var el = ct.getEl(), t = el.dom.offsetWidth; 
+                ct.setWidth(ct.getLayoutTarget().getWidth() + el.getFrameWidth('lr'));
+            }
+        }
+    }
+});
+Ext.Container.LAYOUTS['menu'] = Ext.layout.MenuLayout;
+
+Ext.Viewport = Ext.extend(Ext.Container, {
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+
+    initComponent : function() {
+        Ext.Viewport.superclass.initComponent.call(this);
+        document.getElementsByTagName('html')[0].className += ' x-viewport';
+        this.el = Ext.getBody();
+        this.el.setHeight = Ext.emptyFn;
+        this.el.setWidth = Ext.emptyFn;
+        this.el.setSize = Ext.emptyFn;
+        this.el.dom.scroll = 'no';
+        this.allowDomMove = false;
+        this.autoWidth = true;
+        this.autoHeight = true;
+        Ext.EventManager.onWindowResize(this.fireResize, this);
+        this.renderTo = this.el;
+    },
+
+    fireResize : function(w, h){
+        this.fireEvent('resize', this, w, h, w, h);
+    }
+});
+Ext.reg('viewport', Ext.Viewport);
+
+Ext.Panel = Ext.extend(Ext.Container, {
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+
+    
+    
+    
+    
+    
+    
+    
+    
+
+
+    
+    baseCls : 'x-panel',
+    
+    collapsedCls : 'x-panel-collapsed',
+    
+    maskDisabled : true,
+    
+    animCollapse : Ext.enableFx,
+    
+    headerAsText : true,
+    
+    buttonAlign : 'right',
+    
+    collapsed : false,
+    
+    collapseFirst : true,
+    
+    minButtonWidth : 75,
+    
+    
+    elements : 'body',
+    
+    preventBodyReset : false,
+
+    
+    padding: undefined,
+
+    
+    resizeEvent: 'bodyresize',
+
+    
+    
+    
+    toolTarget : 'header',
+    collapseEl : 'bwrap',
+    slideAnchor : 't',
+    disabledClass : '',
+
+    
+    deferHeight : true,
+    
+    expandDefaults: {
+        duration : 0.25
+    },
+    
+    collapseDefaults : {
+        duration : 0.25
+    },
+
+    
+    initComponent : function(){
+        Ext.Panel.superclass.initComponent.call(this);
+
+        this.addEvents(
+            
+            'bodyresize',
+            
+            'titlechange',
+            
+            'iconchange',
+            
+            'collapse',
+            
+            'expand',
+            
+            'beforecollapse',
+            
+            'beforeexpand',
+            
+            'beforeclose',
+            
+            'close',
+            
+            'activate',
+            
+            'deactivate'
+        );
+
+        if(this.unstyled){
+            this.baseCls = 'x-plain';
+        }
+
+
+        this.toolbars = [];
+        
+        if(this.tbar){
+            this.elements += ',tbar';
+            this.topToolbar = this.createToolbar(this.tbar);
+            this.tbar = null;
+
+        }
+        if(this.bbar){
+            this.elements += ',bbar';
+            this.bottomToolbar = this.createToolbar(this.bbar);
+            this.bbar = null;
+        }
+
+        if(this.header === true){
+            this.elements += ',header';
+            this.header = null;
+        }else if(this.headerCfg || (this.title && this.header !== false)){
+            this.elements += ',header';
+        }
+
+        if(this.footerCfg || this.footer === true){
+            this.elements += ',footer';
+            this.footer = null;
+        }
+
+        if(this.buttons){
+            this.fbar = this.buttons;
+            this.buttons = null;
+        }
+        if(this.fbar){
+            this.createFbar(this.fbar);
+        }
+        if(this.autoLoad){
+            this.on('render', this.doAutoLoad, this, {delay:10});
+        }
+    },
+
+    
+    createFbar : function(fbar){
+        var min = this.minButtonWidth;
+        this.elements += ',footer';
+        this.fbar = this.createToolbar(fbar, {
+            buttonAlign: this.buttonAlign,
+            toolbarCls: 'x-panel-fbar',
+            enableOverflow: false,
+            defaults: function(c){
+                return {
+                    minWidth: c.minWidth || min
+                };
+            }
+        });
+        
+        
+        
+        this.fbar.items.each(function(c){
+            c.minWidth = c.minWidth || this.minButtonWidth;
+        }, this);
+        this.buttons = this.fbar.items.items;
+    },
+
+    
+    createToolbar: function(tb, options){
+        var result;
+        
+        if(Ext.isArray(tb)){
+            tb = {
+                items: tb
+            };
+        }
+        result = tb.events ? Ext.apply(tb, options) : this.createComponent(Ext.apply({}, tb, options), 'toolbar');
+        this.toolbars.push(result);
+        return result;
+    },
+
+    
+    createElement : function(name, pnode){
+        if(this[name]){
+            pnode.appendChild(this[name].dom);
+            return;
+        }
+
+        if(name === 'bwrap' || this.elements.indexOf(name) != -1){
+            if(this[name+'Cfg']){
+                this[name] = Ext.fly(pnode).createChild(this[name+'Cfg']);
+            }else{
+                var el = document.createElement('div');
+                el.className = this[name+'Cls'];
+                this[name] = Ext.get(pnode.appendChild(el));
+            }
+            if(this[name+'CssClass']){
+                this[name].addClass(this[name+'CssClass']);
+            }
+            if(this[name+'Style']){
+                this[name].applyStyles(this[name+'Style']);
+            }
+        }
+    },
+
+    
+    onRender : function(ct, position){
+        Ext.Panel.superclass.onRender.call(this, ct, position);
+        this.createClasses();
+
+        var el = this.el,
+            d = el.dom,
+            bw,
+            ts;
+
+
+        if(this.collapsible && !this.hideCollapseTool){
+            this.tools = this.tools ? this.tools.slice(0) : [];
+            this.tools[this.collapseFirst?'unshift':'push']({
+                id: 'toggle',
+                handler : this.toggleCollapse,
+                scope: this
+            });
+        }
+
+        if(this.tools){
+            ts = this.tools;
+            this.elements += (this.header !== false) ? ',header' : '';
+        }
+        this.tools = {};
+
+        el.addClass(this.baseCls);
+        if(d.firstChild){ 
+            this.header = el.down('.'+this.headerCls);
+            this.bwrap = el.down('.'+this.bwrapCls);
+            var cp = this.bwrap ? this.bwrap : el;
+            this.tbar = cp.down('.'+this.tbarCls);
+            this.body = cp.down('.'+this.bodyCls);
+            this.bbar = cp.down('.'+this.bbarCls);
+            this.footer = cp.down('.'+this.footerCls);
+            this.fromMarkup = true;
+        }
+        if (this.preventBodyReset === true) {
+            el.addClass('x-panel-reset');
+        }
+        if(this.cls){
+            el.addClass(this.cls);
+        }
+
+        if(this.buttons){
+            this.elements += ',footer';
+        }
+
+        
+
+        
+        if(this.frame){
+            el.insertHtml('afterBegin', String.format(Ext.Element.boxMarkup, this.baseCls));
+
+            this.createElement('header', d.firstChild.firstChild.firstChild);
+            this.createElement('bwrap', d);
+
+            
+            bw = this.bwrap.dom;
+            var ml = d.childNodes[1], bl = d.childNodes[2];
+            bw.appendChild(ml);
+            bw.appendChild(bl);
+
+            var mc = bw.firstChild.firstChild.firstChild;
+            this.createElement('tbar', mc);
+            this.createElement('body', mc);
+            this.createElement('bbar', mc);
+            this.createElement('footer', bw.lastChild.firstChild.firstChild);
+
+            if(!this.footer){
+                this.bwrap.dom.lastChild.className += ' x-panel-nofooter';
+            }
+            
+            this.ft = Ext.get(this.bwrap.dom.lastChild);
+            this.mc = Ext.get(mc);
+        }else{
+            this.createElement('header', d);
+            this.createElement('bwrap', d);
+
+            
+            bw = this.bwrap.dom;
+            this.createElement('tbar', bw);
+            this.createElement('body', bw);
+            this.createElement('bbar', bw);
+            this.createElement('footer', bw);
+
+            if(!this.header){
+                this.body.addClass(this.bodyCls + '-noheader');
+                if(this.tbar){
+                    this.tbar.addClass(this.tbarCls + '-noheader');
+                }
+            }
+        }
+
+        if(Ext.isDefined(this.padding)){
+            this.body.setStyle('padding', this.body.addUnits(this.padding));
+        }
+
+        if(this.border === false){
+            this.el.addClass(this.baseCls + '-noborder');
+            this.body.addClass(this.bodyCls + '-noborder');
+            if(this.header){
+                this.header.addClass(this.headerCls + '-noborder');
+            }
+            if(this.footer){
+                this.footer.addClass(this.footerCls + '-noborder');
+            }
+            if(this.tbar){
+                this.tbar.addClass(this.tbarCls + '-noborder');
+            }
+            if(this.bbar){
+                this.bbar.addClass(this.bbarCls + '-noborder');
+            }
+        }
+
+        if(this.bodyBorder === false){
+           this.body.addClass(this.bodyCls + '-noborder');
+        }
+
+        this.bwrap.enableDisplayMode('block');
+
+        if(this.header){
+            this.header.unselectable();
+
+            
+            if(this.headerAsText){
+                this.header.dom.innerHTML =
+                    '<span class="' + this.headerTextCls + '">'+this.header.dom.innerHTML+'</span>';
+
+                if(this.iconCls){
+                    this.setIconClass(this.iconCls);
+                }
+            }
+        }
+
+        if(this.floating){
+            this.makeFloating(this.floating);
+        }
+
+        if(this.collapsible && this.titleCollapse && this.header){
+            this.mon(this.header, 'click', this.toggleCollapse, this);
+            this.header.setStyle('cursor', 'pointer');
+        }
+        if(ts){
+            this.addTool.apply(this, ts);
+        }
+
+        
+        if(this.fbar){
+            this.footer.addClass('x-panel-btns');
+            this.fbar.ownerCt = this;
+            this.fbar.render(this.footer);
+            this.footer.createChild({cls:'x-clear'});
+        }
+        if(this.tbar && this.topToolbar){
+            this.topToolbar.ownerCt = this;
+            this.topToolbar.render(this.tbar);
+        }
+        if(this.bbar && this.bottomToolbar){
+            this.bottomToolbar.ownerCt = this;
+            this.bottomToolbar.render(this.bbar);
+        }
+    },
+
+    
+    setIconClass : function(cls){
+        var old = this.iconCls;
+        this.iconCls = cls;
+        if(this.rendered && this.header){
+            if(this.frame){
+                this.header.addClass('x-panel-icon');
+                this.header.replaceClass(old, this.iconCls);
+            }else{
+                var hd = this.header,
+                    img = hd.child('img.x-panel-inline-icon');
+                if(img){
+                    Ext.fly(img).replaceClass(old, this.iconCls);
+                }else{
+                    var hdspan = hd.child('span.' + this.headerTextCls);
+                    if (hdspan) {
+                        Ext.DomHelper.insertBefore(hdspan.dom, {
+                            tag:'img', alt: '', src: Ext.BLANK_IMAGE_URL, cls:'x-panel-inline-icon '+this.iconCls
+                        });
+                    }
+                 }
+            }
+        }
+        this.fireEvent('iconchange', this, cls, old);
+    },
+
+    
+    makeFloating : function(cfg){
+        this.floating = true;
+        this.el = new Ext.Layer(Ext.apply({}, cfg, {
+            shadow: Ext.isDefined(this.shadow) ? this.shadow : 'sides',
+            shadowOffset: this.shadowOffset,
+            constrain:false,
+            shim: this.shim === false ? false : undefined
+        }), this.el);
+    },
+
+    
+    getTopToolbar : function(){
+        return this.topToolbar;
+    },
+
+    
+    getBottomToolbar : function(){
+        return this.bottomToolbar;
+    },
+
+    
+    getFooterToolbar : function() {
+        return this.fbar;
+    },
+
+    
+    addButton : function(config, handler, scope){
+        if(!this.fbar){
+            this.createFbar([]);
+        }
+        if(handler){
+            if(Ext.isString(config)){
+                config = {text: config};
+            }
+            config = Ext.apply({
+                handler: handler,
+                scope: scope
+            }, config);
+        }
+        return this.fbar.add(config);
+    },
+
+    
+    addTool : function(){
+        if(!this.rendered){
+            if(!this.tools){
+                this.tools = [];
+            }
+            Ext.each(arguments, function(arg){
+                this.tools.push(arg);
+            }, this);
+            return;
+        }
+         
+        if(!this[this.toolTarget]){
+            return;
+        }
+        if(!this.toolTemplate){
+            
+            var tt = new Ext.Template(
+                 '<div class="x-tool x-tool-{id}">&#160;</div>'
+            );
+            tt.disableFormats = true;
+            tt.compile();
+            Ext.Panel.prototype.toolTemplate = tt;
+        }
+        for(var i = 0, a = arguments, len = a.length; i < len; i++) {
+            var tc = a[i];
+            if(!this.tools[tc.id]){
+                var overCls = 'x-tool-'+tc.id+'-over';
+                var t = this.toolTemplate.insertFirst(this[this.toolTarget], tc, true);
+                this.tools[tc.id] = t;
+                t.enableDisplayMode('block');
+                this.mon(t, 'click',  this.createToolHandler(t, tc, overCls, this));
+                if(tc.on){
+                    this.mon(t, tc.on);
+                }
+                if(tc.hidden){
+                    t.hide();
+                }
+                if(tc.qtip){
+                    if(Ext.isObject(tc.qtip)){
+                        Ext.QuickTips.register(Ext.apply({
+                              target: t.id
+                        }, tc.qtip));
+                    } else {
+                        t.dom.qtip = tc.qtip;
+                    }
+                }
+                t.addClassOnOver(overCls);
+            }
+        }
+    },
+
+    onLayout : function(shallow, force){
+        Ext.Panel.superclass.onLayout.apply(this, arguments);
+        if(this.hasLayout && this.toolbars.length > 0){
+            Ext.each(this.toolbars, function(tb){
+                tb.doLayout(undefined, force);
+            });
+            this.syncHeight();
+        }
+    },
+
+    syncHeight : function(){
+        var h = this.toolbarHeight,
+                bd = this.body,
+                lsh = this.lastSize.height,
+                sz;
+
+        if(this.autoHeight || !Ext.isDefined(lsh) || lsh == 'auto'){
+            return;
+        }
+
+
+        if(h != this.getToolbarHeight()){
+            h = Math.max(0, lsh - this.getFrameHeight());
+            bd.setHeight(h);
+            sz = bd.getSize();
+            this.toolbarHeight = this.getToolbarHeight();
+            this.onBodyResize(sz.width, sz.height);
+        }
+    },
+
+    
+    onShow : function(){
+        if(this.floating){
+            return this.el.show();
+        }
+        Ext.Panel.superclass.onShow.call(this);
+    },
+
+    
+    onHide : function(){
+        if(this.floating){
+            return this.el.hide();
+        }
+        Ext.Panel.superclass.onHide.call(this);
+    },
+
+    
+    createToolHandler : function(t, tc, overCls, panel){
+        return function(e){
+            t.removeClass(overCls);
+            if(tc.stopEvent !== false){
+                e.stopEvent();
+            }
+            if(tc.handler){
+                tc.handler.call(tc.scope || t, e, t, panel, tc);
+            }
+        };
+    },
+
+    
+    afterRender : function(){
+        if(this.floating && !this.hidden){
+            this.el.show();
+        }
+        if(this.title){
+            this.setTitle(this.title);
+        }
+        Ext.Panel.superclass.afterRender.call(this); 
+        if (this.collapsed) {
+            this.collapsed = false;
+            this.collapse(false);
+        }
+        this.initEvents();
+    },
+
+    
+    getKeyMap : function(){
+        if(!this.keyMap){
+            this.keyMap = new Ext.KeyMap(this.el, this.keys);
+        }
+        return this.keyMap;
+    },
+
+    
+    initEvents : function(){
+        if(this.keys){
+            this.getKeyMap();
+        }
+        if(this.draggable){
+            this.initDraggable();
+        }
+        if(this.toolbars.length > 0){
+            Ext.each(this.toolbars, function(tb){
+                tb.doLayout();
+                tb.on({
+                    scope: this,
+                    afterlayout: this.syncHeight,
+                    remove: this.syncHeight
+                });
+            }, this);
+            this.syncHeight();
+        }
+
+    },
+
+    
+    initDraggable : function(){
+        
+        this.dd = new Ext.Panel.DD(this, Ext.isBoolean(this.draggable) ? null : this.draggable);
+    },
+
+    
+    beforeEffect : function(anim){
+        if(this.floating){
+            this.el.beforeAction();
+        }
+        if(anim !== false){
+            this.el.addClass('x-panel-animated');
+        }
+    },
+
+    
+    afterEffect : function(anim){
+        this.syncShadow();
+        this.el.removeClass('x-panel-animated');
+    },
+
+    
+    createEffect : function(a, cb, scope){
+        var o = {
+            scope:scope,
+            block:true
+        };
+        if(a === true){
+            o.callback = cb;
+            return o;
+        }else if(!a.callback){
+            o.callback = cb;
+        }else { 
+            o.callback = function(){
+                cb.call(scope);
+                Ext.callback(a.callback, a.scope);
+            };
+        }
+        return Ext.applyIf(o, a);
+    },
+
+    
+    collapse : function(animate){
+        if(this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforecollapse', this, animate) === false){
+            return;
+        }
+        var doAnim = animate === true || (animate !== false && this.animCollapse);
+        this.beforeEffect(doAnim);
+        this.onCollapse(doAnim, animate);
+        return this;
+    },
+
+    
+    onCollapse : function(doAnim, animArg){
+        if(doAnim){
+            this[this.collapseEl].slideOut(this.slideAnchor,
+                    Ext.apply(this.createEffect(animArg||true, this.afterCollapse, this),
+                        this.collapseDefaults));
+        }else{
+            this[this.collapseEl].hide(this.hideMode);
+            this.afterCollapse(false);
+        }
+    },
+
+    
+    afterCollapse : function(anim){
+        this.collapsed = true;
+        this.el.addClass(this.collapsedCls);
+        if(anim !== false){
+            this[this.collapseEl].hide(this.hideMode);
+        }
+        this.afterEffect(anim);
+
+        
+        this.cascade(function(c) {
+            if (c.lastSize) {
+                c.lastSize = { width: undefined, height: undefined };
+            }
+        });
+        this.fireEvent('collapse', this);
+    },
+
+    
+    expand : function(animate){
+        if(!this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforeexpand', this, animate) === false){
+            return;
+        }
+        var doAnim = animate === true || (animate !== false && this.animCollapse);
+        this.el.removeClass(this.collapsedCls);
+        this.beforeEffect(doAnim);
+        this.onExpand(doAnim, animate);
+        return this;
+    },
+
+    
+    onExpand : function(doAnim, animArg){
+        if(doAnim){
+            this[this.collapseEl].slideIn(this.slideAnchor,
+                    Ext.apply(this.createEffect(animArg||true, this.afterExpand, this),
+                        this.expandDefaults));
+        }else{
+            this[this.collapseEl].show(this.hideMode);
+            this.afterExpand(false);
+        }
+    },
+
+    
+    afterExpand : function(anim){
+        this.collapsed = false;
+        if(anim !== false){
+            this[this.collapseEl].show(this.hideMode);
+        }
+        this.afterEffect(anim);
+        if (this.deferLayout) {
+            delete this.deferLayout;
+            this.doLayout(true);
+        }
+        this.fireEvent('expand', this);
+    },
+
+    
+    toggleCollapse : function(animate){
+        this[this.collapsed ? 'expand' : 'collapse'](animate);
+        return this;
+    },
+
+    
+    onDisable : function(){
+        if(this.rendered && this.maskDisabled){
+            this.el.mask();
+        }
+        Ext.Panel.superclass.onDisable.call(this);
+    },
+
+    
+    onEnable : function(){
+        if(this.rendered && this.maskDisabled){
+            this.el.unmask();
+        }
+        Ext.Panel.superclass.onEnable.call(this);
+    },
+
+    
+    onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){
+        var w = adjWidth,
+            h = adjHeight;
+
+        if(Ext.isDefined(w) || Ext.isDefined(h)){
+            if(!this.collapsed){
+                
+                
+                
+
+                if(Ext.isNumber(w)){
+                    this.body.setWidth(w = this.adjustBodyWidth(w - this.getFrameWidth()));
+                } else if (w == 'auto') {
+                    w = this.body.setWidth('auto').dom.offsetWidth;
+                } else {
+                    w = this.body.dom.offsetWidth;
+                }
+
+                if(this.tbar){
+                    this.tbar.setWidth(w);
+                    if(this.topToolbar){
+                        this.topToolbar.setSize(w);
+                    }
+                }
+                if(this.bbar){
+                    this.bbar.setWidth(w);
+                    if(this.bottomToolbar){
+                        this.bottomToolbar.setSize(w);
+                        
+                        if (Ext.isIE) {
+                            this.bbar.setStyle('position', 'static');
+                            this.bbar.setStyle('position', '');
+                        }
+                    }
+                }
+                if(this.footer){
+                    this.footer.setWidth(w);
+                    if(this.fbar){
+                        this.fbar.setSize(Ext.isIE ? (w - this.footer.getFrameWidth('lr')) : 'auto');
+                    }
+                }
+
+                
+                if(Ext.isNumber(h)){
+                    h = Math.max(0, h - this.getFrameHeight());
+                    
+                    this.body.setHeight(h);
+                }else if(h == 'auto'){
+                    this.body.setHeight(h);
+                }
+
+                if(this.disabled && this.el._mask){
+                    this.el._mask.setSize(this.el.dom.clientWidth, this.el.getHeight());
+                }
+            }else{
+                
+                this.queuedBodySize = {width: w, height: h};
+                if(!this.queuedExpand && this.allowQueuedExpand !== false){
+                    this.queuedExpand = true;
+                    this.on('expand', function(){
+                        delete this.queuedExpand;
+                        this.onResize(this.queuedBodySize.width, this.queuedBodySize.height);
+                    }, this, {single:true});
+                }
+            }
+            this.onBodyResize(w, h);
+        }
+        this.syncShadow();
+        Ext.Panel.superclass.onResize.call(this, adjWidth, adjHeight, rawWidth, rawHeight);
+
+    },
+
+    
+    onBodyResize: function(w, h){
+        this.fireEvent('bodyresize', this, w, h);
+    },
+
+    
+    getToolbarHeight: function(){
+        var h = 0;
+        if(this.rendered){
+            Ext.each(this.toolbars, function(tb){
+                h += tb.getHeight();
+            }, this);
+        }
+        return h;
+    },
+
+    
+    adjustBodyHeight : function(h){
+        return h;
+    },
+
+    
+    adjustBodyWidth : function(w){
+        return w;
+    },
+
+    
+    onPosition : function(){
+        this.syncShadow();
+    },
+
+    
+    getFrameWidth : function(){
+        var w = this.el.getFrameWidth('lr') + this.bwrap.getFrameWidth('lr');
+
+        if(this.frame){
+            var l = this.bwrap.dom.firstChild;
+            w += (Ext.fly(l).getFrameWidth('l') + Ext.fly(l.firstChild).getFrameWidth('r'));
+            w += this.mc.getFrameWidth('lr');
+        }
+        return w;
+    },
+
+    
+    getFrameHeight : function() {
+        var h  = this.el.getFrameWidth('tb') + this.bwrap.getFrameWidth('tb');
+        h += (this.tbar ? this.tbar.getHeight() : 0) +
+             (this.bbar ? this.bbar.getHeight() : 0);
+
+        if(this.frame){
+            h += this.el.dom.firstChild.offsetHeight + this.ft.dom.offsetHeight + this.mc.getFrameWidth('tb');
+        }else{
+            h += (this.header ? this.header.getHeight() : 0) +
+                (this.footer ? this.footer.getHeight() : 0);
+        }
+        return h;
+    },
+
+    
+    getInnerWidth : function(){
+        return this.getSize().width - this.getFrameWidth();
+    },
+
+    
+    getInnerHeight : function(){
+        return this.body.getHeight();
+        
+    },
+
+    
+    syncShadow : function(){
+        if(this.floating){
+            this.el.sync(true);
+        }
+    },
+
+    
+    getLayoutTarget : function(){
+        return this.body;
+    },
+
+    
+    getContentTarget : function(){
+        return this.body;
+    },
+
+    
+    setTitle : function(title, iconCls){
+        this.title = title;
+        if(this.header && this.headerAsText){
+            this.header.child('span').update(title);
+        }
+        if(iconCls){
+            this.setIconClass(iconCls);
+        }
+        this.fireEvent('titlechange', this, title);
+        return this;
+    },
+
+    
+    getUpdater : function(){
+        return this.body.getUpdater();
+    },
+
+     
+    load : function(){
+        var um = this.body.getUpdater();
+        um.update.apply(um, arguments);
+        return this;
+    },
+
+    
+    beforeDestroy : function(){
+        Ext.Panel.superclass.beforeDestroy.call(this);
+        if(this.header){
+            this.header.removeAllListeners();
+        }
+        if(this.tools){
+            for(var k in this.tools){
+                Ext.destroy(this.tools[k]);
+            }
+        }
+        if(this.toolbars.length > 0){
+            Ext.each(this.toolbars, function(tb){
+                tb.un('afterlayout', this.syncHeight, this);
+                tb.un('remove', this.syncHeight, this);
+            }, this);
+        }
+        if(Ext.isArray(this.buttons)){
+            while(this.buttons.length) {
+                Ext.destroy(this.buttons[0]);
+            }
+        }
+        if(this.rendered){
+            Ext.destroy(
+                this.ft,
+                this.header,
+                this.footer,
+                this.tbar,
+                this.bbar,
+                this.body,
+                this.mc,
+                this.bwrap,
+                this.dd
+            );
+            if (this.fbar) {
+                Ext.destroy(
+                    this.fbar,
+                    this.fbar.el
+                );
+            }
+        }
+        Ext.destroy(this.toolbars);
+    },
+
+    
+    createClasses : function(){
+        this.headerCls = this.baseCls + '-header';
+        this.headerTextCls = this.baseCls + '-header-text';
+        this.bwrapCls = this.baseCls + '-bwrap';
+        this.tbarCls = this.baseCls + '-tbar';
+        this.bodyCls = this.baseCls + '-body';
+        this.bbarCls = this.baseCls + '-bbar';
+        this.footerCls = this.baseCls + '-footer';
+    },
+
+    
+    createGhost : function(cls, useShim, appendTo){
+        var el = document.createElement('div');
+        el.className = 'x-panel-ghost ' + (cls ? cls : '');
+        if(this.header){
+            el.appendChild(this.el.dom.firstChild.cloneNode(true));
+        }
+        Ext.fly(el.appendChild(document.createElement('ul'))).setHeight(this.bwrap.getHeight());
+        el.style.width = this.el.dom.offsetWidth + 'px';;
+        if(!appendTo){
+            this.container.dom.appendChild(el);
+        }else{
+            Ext.getDom(appendTo).appendChild(el);
+        }
+        if(useShim !== false && this.el.useShim !== false){
+            var layer = new Ext.Layer({shadow:false, useDisplay:true, constrain:false}, el);
+            layer.show();
+            return layer;
+        }else{
+            return new Ext.Element(el);
+        }
+    },
+
+    
+    doAutoLoad : function(){
+        var u = this.body.getUpdater();
+        if(this.renderer){
+            u.setRenderer(this.renderer);
+        }
+        u.update(Ext.isObject(this.autoLoad) ? this.autoLoad : {url: this.autoLoad});
+    },
+
+    
+    getTool : function(id) {
+        return this.tools[id];
+    }
+
+
+});
+Ext.reg('panel', Ext.Panel);
+
+Ext.Editor = function(field, config){
+    if(field.field){
+        this.field = Ext.create(field.field, 'textfield');
+        config = Ext.apply({}, field); 
+        delete config.field;
+    }else{
+        this.field = field;
+    }
+    Ext.Editor.superclass.constructor.call(this, config);
+};
+
+Ext.extend(Ext.Editor, Ext.Component, {
+    
+    
+    allowBlur: true,
+    
+    
+    
+    
+    
+    value : "",
+    
+    alignment: "c-c?",
+    
+    offsets: [0, 0],
+    
+    shadow : "frame",
+    
+    constrain : false,
+    
+    swallowKeys : true,
+    
+    completeOnEnter : true,
+    
+    cancelOnEsc : true,
+    
+    updateEl : false,
+
+    initComponent : function(){
+        Ext.Editor.superclass.initComponent.call(this);
+        this.addEvents(
+            
+            "beforestartedit",
+            
+            "startedit",
+            
+            "beforecomplete",
+            
+            "complete",
+            
+            "canceledit",
+            
+            "specialkey"
+        );
+    },
+
+    
+    onRender : function(ct, position){
+        this.el = new Ext.Layer({
+            shadow: this.shadow,
+            cls: "x-editor",
+            parentEl : ct,
+            shim : this.shim,
+            shadowOffset: this.shadowOffset || 4,
+            id: this.id,
+            constrain: this.constrain
+        });
+        if(this.zIndex){
+            this.el.setZIndex(this.zIndex);
+        }
+        this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden");
+        if(this.field.msgTarget != 'title'){
+            this.field.msgTarget = 'qtip';
+        }
+        this.field.inEditor = true;
+        this.mon(this.field, {
+            scope: this,
+            blur: this.onBlur,
+            specialkey: this.onSpecialKey
+        });
+        if(this.field.grow){
+            this.mon(this.field, "autosize", this.el.sync,  this.el, {delay:1});
+        }
+        this.field.render(this.el).show();
+        this.field.getEl().dom.name = '';
+        if(this.swallowKeys){
+            this.field.el.swallowEvent([
+                'keypress', 
+                'keydown'   
+            ]);
+        }
+    },
+
+    
+    onSpecialKey : function(field, e){
+        var key = e.getKey(),
+            complete = this.completeOnEnter && key == e.ENTER,
+            cancel = this.cancelOnEsc && key == e.ESC;
+        if(complete || cancel){
+            e.stopEvent();
+            if(complete){
+                this.completeEdit();
+            }else{
+                this.cancelEdit();
+            }
+            if(field.triggerBlur){
+                field.triggerBlur();
+            }
+        }
+        this.fireEvent('specialkey', field, e);
+    },
+
+    
+    startEdit : function(el, value){
+        if(this.editing){
+            this.completeEdit();
+        }
+        this.boundEl = Ext.get(el);
+        var v = value !== undefined ? value : this.boundEl.dom.innerHTML;
+        if(!this.rendered){
+            this.render(this.parentEl || document.body);
+        }
+        if(this.fireEvent("beforestartedit", this, this.boundEl, v) !== false){
+            this.startValue = v;
+            this.field.reset();
+            this.field.setValue(v);
+            this.realign(true);
+            this.editing = true;
+            this.show();
+        }
+    },
+
+    
+    doAutoSize : function(){
+        if(this.autoSize){
+            var sz = this.boundEl.getSize(),
+                fs = this.field.getSize();
+
+            switch(this.autoSize){
+                case "width":
+                    this.setSize(sz.width, fs.height);
+                    break;
+                case "height":
+                    this.setSize(fs.width, sz.height);
+                    break;
+                case "none":
+                    this.setSize(fs.width, fs.height);
+                    break;
+                default:
+                    this.setSize(sz.width, sz.height);
+            }
+        }
+    },
+
+    
+    setSize : function(w, h){
+        delete this.field.lastSize;
+        this.field.setSize(w, h);
+        if(this.el){
+            
+            if(Ext.isGecko2 || Ext.isOpera || (Ext.isIE7 && Ext.isStrict)){
+                
+                this.el.setSize(w, h);
+            }
+            this.el.sync();
+        }
+    },
+
+    
+    realign : function(autoSize){
+        if(autoSize === true){
+            this.doAutoSize();
+        }
+        this.el.alignTo(this.boundEl, this.alignment, this.offsets);
+    },
+
+    
+    completeEdit : function(remainVisible){
+        if(!this.editing){
+            return;
+        }
+        
+        if (this.field.assertValue) {
+            this.field.assertValue();
+        }
+        var v = this.getValue();
+        if(!this.field.isValid()){
+            if(this.revertInvalid !== false){
+                this.cancelEdit(remainVisible);
+            }
+            return;
+        }
+        if(String(v) === String(this.startValue) && this.ignoreNoChange){
+            this.hideEdit(remainVisible);
+            return;
+        }
+        if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){
+            v = this.getValue();
+            if(this.updateEl && this.boundEl){
+                this.boundEl.update(v);
+            }
+            this.hideEdit(remainVisible);
+            this.fireEvent("complete", this, v, this.startValue);
+        }
+    },
+
+    
+    onShow : function(){
+        this.el.show();
+        if(this.hideEl !== false){
+            this.boundEl.hide();
+        }
+        this.field.show().focus(false, true);
+        this.fireEvent("startedit", this.boundEl, this.startValue);
+    },
+
+    
+    cancelEdit : function(remainVisible){
+        if(this.editing){
+            var v = this.getValue();
+            this.setValue(this.startValue);
+            this.hideEdit(remainVisible);
+            this.fireEvent("canceledit", this, v, this.startValue);
+        }
+    },
+
+    
+    hideEdit: function(remainVisible){
+        if(remainVisible !== true){
+            this.editing = false;
+            this.hide();
+        }
+    },
+
+    
+    onBlur : function(){
+        
+        if(this.allowBlur === true && this.editing && this.selectSameEditor !== true){
+            this.completeEdit();
+        }
+    },
+
+    
+    onHide : function(){
+        if(this.editing){
+            this.completeEdit();
+            return;
+        }
+        this.field.blur();
+        if(this.field.collapse){
+            this.field.collapse();
+        }
+        this.el.hide();
+        if(this.hideEl !== false){
+            this.boundEl.show();
+        }
+    },
+
+    
+    setValue : function(v){
+        this.field.setValue(v);
+    },
+
+    
+    getValue : function(){
+        return this.field.getValue();
+    },
+
+    beforeDestroy : function(){
+        Ext.destroyMembers(this, 'field');
+
+        delete this.parentEl;
+        delete this.boundEl;
+    }
+});
+Ext.reg('editor', Ext.Editor);
+
+Ext.ColorPalette = Ext.extend(Ext.Component, {
+       
+    
+    itemCls : 'x-color-palette',
+    
+    value : null,
+    
+    clickEvent :'click',
+    
+    ctype : 'Ext.ColorPalette',
+
+    
+    allowReselect : false,
+
+    
+    colors : [
+        '000000', '993300', '333300', '003300', '003366', '000080', '333399', '333333',
+        '800000', 'FF6600', '808000', '008000', '008080', '0000FF', '666699', '808080',
+        'FF0000', 'FF9900', '99CC00', '339966', '33CCCC', '3366FF', '800080', '969696',
+        'FF00FF', 'FFCC00', 'FFFF00', '00FF00', '00FFFF', '00CCFF', '993366', 'C0C0C0',
+        'FF99CC', 'FFCC99', 'FFFF99', 'CCFFCC', 'CCFFFF', '99CCFF', 'CC99FF', 'FFFFFF'
+    ],
+
+    
+    
+    
+    
+    initComponent : function(){
+        Ext.ColorPalette.superclass.initComponent.call(this);
+        this.addEvents(
+            
+            'select'
+        );
+
+        if(this.handler){
+            this.on('select', this.handler, this.scope, true);
+        }    
+    },
+
+    
+    onRender : function(container, position){
+        this.autoEl = {
+            tag: 'div',
+            cls: this.itemCls
+        };
+        Ext.ColorPalette.superclass.onRender.call(this, container, position);
+        var t = this.tpl || new Ext.XTemplate(
+            '<tpl for="."><a href="#" class="color-{.}" hidefocus="on"><em><span style="background:#{.}" unselectable="on">&#160;</span></em></a></tpl>'
+        );
+        t.overwrite(this.el, this.colors);
+        this.mon(this.el, this.clickEvent, this.handleClick, this, {delegate: 'a'});
+        if(this.clickEvent != 'click'){
+               this.mon(this.el, 'click', Ext.emptyFn, this, {delegate: 'a', preventDefault: true});
+        }
+    },
+
+    
+    afterRender : function(){
+        Ext.ColorPalette.superclass.afterRender.call(this);
+        if(this.value){
+            var s = this.value;
+            this.value = null;
+            this.select(s, true);
+        }
+    },
+
+    
+    handleClick : function(e, t){
+        e.preventDefault();
+        if(!this.disabled){
+            var c = t.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];
+            this.select(c.toUpperCase());
+        }
+    },
+
+    
+    select : function(color, suppressEvent){
+        color = color.replace('#', '');
+        if(color != this.value || this.allowReselect){
+            var el = this.el;
+            if(this.value){
+                el.child('a.color-'+this.value).removeClass('x-color-palette-sel');
+            }
+            el.child('a.color-'+color).addClass('x-color-palette-sel');
+            this.value = color;
+            if(suppressEvent !== true){
+                this.fireEvent('select', this, color);
+            }
+        }
+    }
+
+    
+});
+Ext.reg('colorpalette', Ext.ColorPalette);
+Ext.DatePicker = Ext.extend(Ext.BoxComponent, {
+    
+    todayText : 'Today',
+    
+    okText : '&#160;OK&#160;',
+    
+    cancelText : 'Cancel',
+    
+    
+    
+    todayTip : '{0} (Spacebar)',
+    
+    minText : 'This date is before the minimum date',
+    
+    maxText : 'This date is after the maximum date',
+    
+    format : 'm/d/y',
+    
+    disabledDaysText : 'Disabled',
+    
+    disabledDatesText : 'Disabled',
+    
+    monthNames : Date.monthNames,
+    
+    dayNames : Date.dayNames,
+    
+    nextText : 'Next Month (Control+Right)',
+    
+    prevText : 'Previous Month (Control+Left)',
+    
+    monthYearText : 'Choose a month (Control+Up/Down to move years)',
+    
+    startDay : 0,
+    
+    showToday : true,
+    
+    
+    
+    
+    
+
+    
+    
+    focusOnSelect: true,
+
+    
+    
+    initHour: 12, 
+
+    
+    initComponent : function(){
+        Ext.DatePicker.superclass.initComponent.call(this);
+
+        this.value = this.value ?
+                 this.value.clearTime(true) : new Date().clearTime();
+
+        this.addEvents(
+            
+            'select'
+        );
+
+        if(this.handler){
+            this.on('select', this.handler,  this.scope || this);
+        }
+
+        this.initDisabledDays();
+    },
+
+    
+    initDisabledDays : function(){
+        if(!this.disabledDatesRE && this.disabledDates){
+            var dd = this.disabledDates,
+                len = dd.length - 1,
+                re = '(?:';
+
+            Ext.each(dd, function(d, i){
+                re += Ext.isDate(d) ? '^' + Ext.escapeRe(d.dateFormat(this.format)) + '$' : dd[i];
+                if(i != len){
+                    re += '|';
+                }
+            }, this);
+            this.disabledDatesRE = new RegExp(re + ')');
+        }
+    },
+
+    
+    setDisabledDates : function(dd){
+        if(Ext.isArray(dd)){
+            this.disabledDates = dd;
+            this.disabledDatesRE = null;
+        }else{
+            this.disabledDatesRE = dd;
+        }
+        this.initDisabledDays();
+        this.update(this.value, true);
+    },
+
+    
+    setDisabledDays : function(dd){
+        this.disabledDays = dd;
+        this.update(this.value, true);
+    },
+
+    
+    setMinDate : function(dt){
+        this.minDate = dt;
+        this.update(this.value, true);
+    },
+
+    
+    setMaxDate : function(dt){
+        this.maxDate = dt;
+        this.update(this.value, true);
+    },
+
+    
+    setValue : function(value){
+        this.value = value.clearTime(true);
+        this.update(this.value);
+    },
+
+    
+    getValue : function(){
+        return this.value;
+    },
+
+    
+    focus : function(){
+        this.update(this.activeDate);
+    },
+
+    
+    onEnable: function(initial){
+        Ext.DatePicker.superclass.onEnable.call(this);
+        this.doDisabled(false);
+        this.update(initial ? this.value : this.activeDate);
+        if(Ext.isIE){
+            this.el.repaint();
+        }
+
+    },
+
+    
+    onDisable : function(){
+        Ext.DatePicker.superclass.onDisable.call(this);
+        this.doDisabled(true);
+        if(Ext.isIE && !Ext.isIE8){
+            
+             Ext.each([].concat(this.textNodes, this.el.query('th span')), function(el){
+                 Ext.fly(el).repaint();
+             });
+        }
+    },
+
+    
+    doDisabled : function(disabled){
+        this.keyNav.setDisabled(disabled);
+        this.prevRepeater.setDisabled(disabled);
+        this.nextRepeater.setDisabled(disabled);
+        if(this.showToday){
+            this.todayKeyListener.setDisabled(disabled);
+            this.todayBtn.setDisabled(disabled);
+        }
+    },
+
+    
+    onRender : function(container, position){
+        var m = [
+             '<table cellspacing="0">',
+                '<tr><td class="x-date-left"><a href="#" title="', this.prevText ,'">&#160;</a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="', this.nextText ,'">&#160;</a></td></tr>',
+                '<tr><td colspan="3"><table class="x-date-inner" cellspacing="0"><thead><tr>'],
+                dn = this.dayNames,
+                i;
+        for(i = 0; i < 7; i++){
+            var d = this.startDay+i;
+            if(d > 6){
+                d = d-7;
+            }
+            m.push('<th><span>', dn[d].substr(0,1), '</span></th>');
+        }
+        m[m.length] = '</tr></thead><tbody><tr>';
+        for(i = 0; i < 42; i++) {
+            if(i % 7 === 0 && i !== 0){
+                m[m.length] = '</tr><tr>';
+            }
+            m[m.length] = '<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>';
+        }
+        m.push('</tr></tbody></table></td></tr>',
+                this.showToday ? '<tr><td colspan="3" class="x-date-bottom" align="center"></td></tr>' : '',
+                '</table><div class="x-date-mp"></div>');
+
+        var el = document.createElement('div');
+        el.className = 'x-date-picker';
+        el.innerHTML = m.join('');
+
+        container.dom.insertBefore(el, position);
+
+        this.el = Ext.get(el);
+        this.eventEl = Ext.get(el.firstChild);
+
+        this.prevRepeater = new Ext.util.ClickRepeater(this.el.child('td.x-date-left a'), {
+            handler: this.showPrevMonth,
+            scope: this,
+            preventDefault:true,
+            stopDefault:true
+        });
+
+        this.nextRepeater = new Ext.util.ClickRepeater(this.el.child('td.x-date-right a'), {
+            handler: this.showNextMonth,
+            scope: this,
+            preventDefault:true,
+            stopDefault:true
+        });
+
+        this.monthPicker = this.el.down('div.x-date-mp');
+        this.monthPicker.enableDisplayMode('block');
+
+        this.keyNav = new Ext.KeyNav(this.eventEl, {
+            'left' : function(e){
+                if(e.ctrlKey){
+                    this.showPrevMonth();
+                }else{
+                    this.update(this.activeDate.add('d', -1));
+                }
+            },
+
+            'right' : function(e){
+                if(e.ctrlKey){
+                    this.showNextMonth();
+                }else{
+                    this.update(this.activeDate.add('d', 1));
+                }
+            },
+
+            'up' : function(e){
+                if(e.ctrlKey){
+                    this.showNextYear();
+                }else{
+                    this.update(this.activeDate.add('d', -7));
+                }
+            },
+
+            'down' : function(e){
+                if(e.ctrlKey){
+                    this.showPrevYear();
+                }else{
+                    this.update(this.activeDate.add('d', 7));
+                }
+            },
+
+            'pageUp' : function(e){
+                this.showNextMonth();
+            },
+
+            'pageDown' : function(e){
+                this.showPrevMonth();
+            },
+
+            'enter' : function(e){
+                e.stopPropagation();
+                return true;
+            },
+
+            scope : this
+        });
+
+        this.el.unselectable();
+
+        this.cells = this.el.select('table.x-date-inner tbody td');
+        this.textNodes = this.el.query('table.x-date-inner tbody span');
+
+        this.mbtn = new Ext.Button({
+            text: '&#160;',
+            tooltip: this.monthYearText,
+            renderTo: this.el.child('td.x-date-middle', true)
+        });
+        this.mbtn.el.child('em').addClass('x-btn-arrow');
+
+        if(this.showToday){
+            this.todayKeyListener = this.eventEl.addKeyListener(Ext.EventObject.SPACE, this.selectToday,  this);
+            var today = (new Date()).dateFormat(this.format);
+            this.todayBtn = new Ext.Button({
+                renderTo: this.el.child('td.x-date-bottom', true),
+                text: String.format(this.todayText, today),
+                tooltip: String.format(this.todayTip, today),
+                handler: this.selectToday,
+                scope: this
+            });
+        }
+        this.mon(this.eventEl, 'mousewheel', this.handleMouseWheel, this);
+        this.mon(this.eventEl, 'click', this.handleDateClick,  this, {delegate: 'a.x-date-date'});
+        this.mon(this.mbtn, 'click', this.showMonthPicker, this);
+        this.onEnable(true);
+    },
+
+    
+    createMonthPicker : function(){
+        if(!this.monthPicker.dom.firstChild){
+            var buf = ['<table border="0" cellspacing="0">'];
+            for(var i = 0; i < 6; i++){
+                buf.push(
+                    '<tr><td class="x-date-mp-month"><a href="#">', Date.getShortMonthName(i), '</a></td>',
+                    '<td class="x-date-mp-month x-date-mp-sep"><a href="#">', Date.getShortMonthName(i + 6), '</a></td>',
+                    i === 0 ?
+                    '<td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-prev"></a></td><td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-next"></a></td></tr>' :
+                    '<td class="x-date-mp-year"><a href="#"></a></td><td class="x-date-mp-year"><a href="#"></a></td></tr>'
+                );
+            }
+            buf.push(
+                '<tr class="x-date-mp-btns"><td colspan="4"><button type="button" class="x-date-mp-ok">',
+                    this.okText,
+                    '</button><button type="button" class="x-date-mp-cancel">',
+                    this.cancelText,
+                    '</button></td></tr>',
+                '</table>'
+            );
+            this.monthPicker.update(buf.join(''));
+
+            this.mon(this.monthPicker, 'click', this.onMonthClick, this);
+            this.mon(this.monthPicker, 'dblclick', this.onMonthDblClick, this);
+
+            this.mpMonths = this.monthPicker.select('td.x-date-mp-month');
+            this.mpYears = this.monthPicker.select('td.x-date-mp-year');
+
+            this.mpMonths.each(function(m, a, i){
+                i += 1;
+                if((i%2) === 0){
+                    m.dom.xmonth = 5 + Math.round(i * 0.5);
+                }else{
+                    m.dom.xmonth = Math.round((i-1) * 0.5);
+                }
+            });
+        }
+    },
+
+    
+    showMonthPicker : function(){
+        if(!this.disabled){
+            this.createMonthPicker();
+            var size = this.el.getSize();
+            this.monthPicker.setSize(size);
+            this.monthPicker.child('table').setSize(size);
+
+            this.mpSelMonth = (this.activeDate || this.value).getMonth();
+            this.updateMPMonth(this.mpSelMonth);
+            this.mpSelYear = (this.activeDate || this.value).getFullYear();
+            this.updateMPYear(this.mpSelYear);
+
+            this.monthPicker.slideIn('t', {duration:0.2});
+        }
+    },
+
+    
+    updateMPYear : function(y){
+        this.mpyear = y;
+        var ys = this.mpYears.elements;
+        for(var i = 1; i <= 10; i++){
+            var td = ys[i-1], y2;
+            if((i%2) === 0){
+                y2 = y + Math.round(i * 0.5);
+                td.firstChild.innerHTML = y2;
+                td.xyear = y2;
+            }else{
+                y2 = y - (5-Math.round(i * 0.5));
+                td.firstChild.innerHTML = y2;
+                td.xyear = y2;
+            }
+            this.mpYears.item(i-1)[y2 == this.mpSelYear ? 'addClass' : 'removeClass']('x-date-mp-sel');
+        }
+    },
+
+    
+    updateMPMonth : function(sm){
+        this.mpMonths.each(function(m, a, i){
+            m[m.dom.xmonth == sm ? 'addClass' : 'removeClass']('x-date-mp-sel');
+        });
+    },
+
+    
+    selectMPMonth : function(m){
+
+    },
+
+    
+    onMonthClick : function(e, t){
+        e.stopEvent();
+        var el = new Ext.Element(t), pn;
+        if(el.is('button.x-date-mp-cancel')){
+            this.hideMonthPicker();
+        }
+        else if(el.is('button.x-date-mp-ok')){
+            var d = new Date(this.mpSelYear, this.mpSelMonth, (this.activeDate || this.value).getDate());
+            if(d.getMonth() != this.mpSelMonth){
+                
+                d = new Date(this.mpSelYear, this.mpSelMonth, 1).getLastDateOfMonth();
+            }
+            this.update(d);
+            this.hideMonthPicker();
+        }
+        else if((pn = el.up('td.x-date-mp-month', 2))){
+            this.mpMonths.removeClass('x-date-mp-sel');
+            pn.addClass('x-date-mp-sel');
+            this.mpSelMonth = pn.dom.xmonth;
+        }
+        else if((pn = el.up('td.x-date-mp-year', 2))){
+            this.mpYears.removeClass('x-date-mp-sel');
+            pn.addClass('x-date-mp-sel');
+            this.mpSelYear = pn.dom.xyear;
+        }
+        else if(el.is('a.x-date-mp-prev')){
+            this.updateMPYear(this.mpyear-10);
+        }
+        else if(el.is('a.x-date-mp-next')){
+            this.updateMPYear(this.mpyear+10);
+        }
+    },
+
+    
+    onMonthDblClick : function(e, t){
+        e.stopEvent();
+        var el = new Ext.Element(t), pn;
+        if((pn = el.up('td.x-date-mp-month', 2))){
+            this.update(new Date(this.mpSelYear, pn.dom.xmonth, (this.activeDate || this.value).getDate()));
+            this.hideMonthPicker();
+        }
+        else if((pn = el.up('td.x-date-mp-year', 2))){
+            this.update(new Date(pn.dom.xyear, this.mpSelMonth, (this.activeDate || this.value).getDate()));
+            this.hideMonthPicker();
+        }
+    },
+
+    
+    hideMonthPicker : function(disableAnim){
+        if(this.monthPicker){
+            if(disableAnim === true){
+                this.monthPicker.hide();
+            }else{
+                this.monthPicker.slideOut('t', {duration:0.2});
+            }
+        }
+    },
+
+    
+    showPrevMonth : function(e){
+        this.update(this.activeDate.add('mo', -1));
+    },
+
+    
+    showNextMonth : function(e){
+        this.update(this.activeDate.add('mo', 1));
+    },
+
+    
+    showPrevYear : function(){
+        this.update(this.activeDate.add('y', -1));
+    },
+
+    
+    showNextYear : function(){
+        this.update(this.activeDate.add('y', 1));
+    },
+
+    
+    handleMouseWheel : function(e){
+        e.stopEvent();
+        if(!this.disabled){
+            var delta = e.getWheelDelta();
+            if(delta > 0){
+                this.showPrevMonth();
+            } else if(delta < 0){
+                this.showNextMonth();
+            }
+        }
+    },
+
+    
+    handleDateClick : function(e, t){
+        e.stopEvent();
+        if(!this.disabled && t.dateValue && !Ext.fly(t.parentNode).hasClass('x-date-disabled')){
+            this.cancelFocus = this.focusOnSelect === false;
+            this.setValue(new Date(t.dateValue));
+            delete this.cancelFocus;
+            this.fireEvent('select', this, this.value);
+        }
+    },
+
+    
+    selectToday : function(){
+        if(this.todayBtn && !this.todayBtn.disabled){
+            this.setValue(new Date().clearTime());
+            this.fireEvent('select', this, this.value);
+        }
+    },
+
+    
+    update : function(date, forceRefresh){
+        if(this.rendered){
+            var vd = this.activeDate, vis = this.isVisible();
+            this.activeDate = date;
+            if(!forceRefresh && vd && this.el){
+                var t = date.getTime();
+                if(vd.getMonth() == date.getMonth() && vd.getFullYear() == date.getFullYear()){
+                    this.cells.removeClass('x-date-selected');
+                    this.cells.each(function(c){
+                       if(c.dom.firstChild.dateValue == t){
+                           c.addClass('x-date-selected');
+                           if(vis && !this.cancelFocus){
+                               Ext.fly(c.dom.firstChild).focus(50);
+                           }
+                           return false;
+                       }
+                    }, this);
+                    return;
+                }
+            }
+            var days = date.getDaysInMonth(),
+                firstOfMonth = date.getFirstDateOfMonth(),
+                startingPos = firstOfMonth.getDay()-this.startDay;
+
+            if(startingPos < 0){
+                startingPos += 7;
+            }
+            days += startingPos;
+
+            var pm = date.add('mo', -1),
+                prevStart = pm.getDaysInMonth()-startingPos,
+                cells = this.cells.elements,
+                textEls = this.textNodes,
+                
+                d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart, this.initHour)),
+                today = new Date().clearTime().getTime(),
+                sel = date.clearTime(true).getTime(),
+                min = this.minDate ? this.minDate.clearTime(true) : Number.NEGATIVE_INFINITY,
+                max = this.maxDate ? this.maxDate.clearTime(true) : Number.POSITIVE_INFINITY,
+                ddMatch = this.disabledDatesRE,
+                ddText = this.disabledDatesText,
+                ddays = this.disabledDays ? this.disabledDays.join('') : false,
+                ddaysText = this.disabledDaysText,
+                format = this.format;
+
+            if(this.showToday){
+                var td = new Date().clearTime(),
+                    disable = (td < min || td > max ||
+                    (ddMatch && format && ddMatch.test(td.dateFormat(format))) ||
+                    (ddays && ddays.indexOf(td.getDay()) != -1));
+
+                if(!this.disabled){
+                    this.todayBtn.setDisabled(disable);
+                    this.todayKeyListener[disable ? 'disable' : 'enable']();
+                }
+            }
+
+            var setCellClass = function(cal, cell){
+                cell.title = '';
+                var t = d.clearTime(true).getTime();
+                cell.firstChild.dateValue = t;
+                if(t == today){
+                    cell.className += ' x-date-today';
+                    cell.title = cal.todayText;
+                }
+                if(t == sel){
+                    cell.className += ' x-date-selected';
+                    if(vis){
+                        Ext.fly(cell.firstChild).focus(50);
+                    }
+                }
+                
+                if(t < min) {
+                    cell.className = ' x-date-disabled';
+                    cell.title = cal.minText;
+                    return;
+                }
+                if(t > max) {
+                    cell.className = ' x-date-disabled';
+                    cell.title = cal.maxText;
+                    return;
+                }
+                if(ddays){
+                    if(ddays.indexOf(d.getDay()) != -1){
+                        cell.title = ddaysText;
+                        cell.className = ' x-date-disabled';
+                    }
+                }
+                if(ddMatch && format){
+                    var fvalue = d.dateFormat(format);
+                    if(ddMatch.test(fvalue)){
+                        cell.title = ddText.replace('%0', fvalue);
+                        cell.className = ' x-date-disabled';
+                    }
+                }
+            };
+
+            var i = 0;
+            for(; i < startingPos; i++) {
+                textEls[i].innerHTML = (++prevStart);
+                d.setDate(d.getDate()+1);
+                cells[i].className = 'x-date-prevday';
+                setCellClass(this, cells[i]);
+            }
+            for(; i < days; i++){
+                var intDay = i - startingPos + 1;
+                textEls[i].innerHTML = (intDay);
+                d.setDate(d.getDate()+1);
+                cells[i].className = 'x-date-active';
+                setCellClass(this, cells[i]);
+            }
+            var extraDays = 0;
+            for(; i < 42; i++) {
+                 textEls[i].innerHTML = (++extraDays);
+                 d.setDate(d.getDate()+1);
+                 cells[i].className = 'x-date-nextday';
+                 setCellClass(this, cells[i]);
+            }
+
+            this.mbtn.setText(this.monthNames[date.getMonth()] + ' ' + date.getFullYear());
+
+            if(!this.internalRender){
+                var main = this.el.dom.firstChild,
+                    w = main.offsetWidth;
+                this.el.setWidth(w + this.el.getBorderWidth('lr'));
+                Ext.fly(main).setWidth(w);
+                this.internalRender = true;
+                
+                
+                
+                if(Ext.isOpera && !this.secondPass){
+                    main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth)) + 'px';
+                    this.secondPass = true;
+                    this.update.defer(10, this, [date]);
+                }
+            }
+        }
+    },
+
+    
+    beforeDestroy : function() {
+        if(this.rendered){
+            Ext.destroy(
+                this.keyNav,
+                this.monthPicker,
+                this.eventEl,
+                this.mbtn,
+                this.nextRepeater,
+                this.prevRepeater,
+                this.cells.el,
+                this.todayBtn
+            );
+            delete this.textNodes;
+            delete this.cells.elements;
+        }
+    }
+
+    
+});
+
+Ext.reg('datepicker', Ext.DatePicker);
+
+Ext.LoadMask = function(el, config){
+    this.el = Ext.get(el);
+    Ext.apply(this, config);
+    if(this.store){
+        this.store.on({
+            scope: this,
+            beforeload: this.onBeforeLoad,
+            load: this.onLoad,
+            exception: this.onLoad
+        });
+        this.removeMask = Ext.value(this.removeMask, false);
+    }else{
+        var um = this.el.getUpdater();
+        um.showLoadIndicator = false; 
+        um.on({
+            scope: this,
+            beforeupdate: this.onBeforeLoad,
+            update: this.onLoad,
+            failure: this.onLoad
+        });
+        this.removeMask = Ext.value(this.removeMask, true);
+    }
+};
+
+Ext.LoadMask.prototype = {
+    
+    
+    
+    msg : 'Loading...',
+    
+    msgCls : 'x-mask-loading',
+
+    
+    disabled: false,
+
+    
+    disable : function(){
+       this.disabled = true;
+    },
+
+    
+    enable : function(){
+        this.disabled = false;
+    },
+
+    
+    onLoad : function(){
+        this.el.unmask(this.removeMask);
+    },
+
+    
+    onBeforeLoad : function(){
+        if(!this.disabled){
+            this.el.mask(this.msg, this.msgCls);
+        }
+    },
+
+    
+    show: function(){
+        this.onBeforeLoad();
+    },
+
+    
+    hide: function(){
+        this.onLoad();
+    },
+
+    
+    destroy : function(){
+        if(this.store){
+            this.store.un('beforeload', this.onBeforeLoad, this);
+            this.store.un('load', this.onLoad, this);
+            this.store.un('exception', this.onLoad, this);
+        }else{
+            var um = this.el.getUpdater();
+            um.un('beforeupdate', this.onBeforeLoad, this);
+            um.un('update', this.onLoad, this);
+            um.un('failure', this.onLoad, this);
+        }
+    }
+};Ext.ns('Ext.slider');
+
+
+Ext.slider.Thumb = Ext.extend(Object, {
+    
+    
+    dragging: false,
+
+    
+    constructor: function(config) {
+        
+        Ext.apply(this, config || {}, {
+            cls: 'x-slider-thumb',
+
+            
+            constrain: false
+        });
+
+        Ext.slider.Thumb.superclass.constructor.call(this, config);
+
+        if (this.slider.vertical) {
+            Ext.apply(this, Ext.slider.Thumb.Vertical);
+        }
+    },
+
+    
+    render: function() {
+        this.el = this.slider.innerEl.insertFirst({cls: this.cls});
+
+        this.initEvents();
+    },
+
+    
+    enable: function() {
+        this.disabled = false;
+        this.el.removeClass(this.slider.disabledClass);
+    },
+
+    
+    disable: function() {
+        this.disabled = true;
+        this.el.addClass(this.slider.disabledClass);
+    },
+
+    
+    initEvents: function() {
+        var el = this.el;
+
+        el.addClassOnOver('x-slider-thumb-over');
+
+        this.tracker = new Ext.dd.DragTracker({
+            onBeforeStart: this.onBeforeDragStart.createDelegate(this),
+            onStart      : this.onDragStart.createDelegate(this),
+            onDrag       : this.onDrag.createDelegate(this),
+            onEnd        : this.onDragEnd.createDelegate(this),
+            tolerance    : 3,
+            autoStart    : 300
+        });
+
+        this.tracker.initEl(el);
+    },
+
+    
+    onBeforeDragStart : function(e) {
+        if (this.disabled) {
+            return false;
+        } else {
+            this.slider.promoteThumb(this);
+            return true;
+        }
+    },
+
+    
+    onDragStart: function(e){
+        this.el.addClass('x-slider-thumb-drag');
+        this.dragging = true;
+        this.dragStartValue = this.value;
+
+        this.slider.fireEvent('dragstart', this.slider, e, this);
+    },
+
+    
+    onDrag: function(e) {
+        var slider   = this.slider,
+            index    = this.index,
+            newValue = this.getNewValue();
+
+        if (this.constrain) {
+            var above = slider.thumbs[index + 1],
+                below = slider.thumbs[index - 1];
+
+            if (below != undefined && newValue <= below.value) newValue = below.value;
+            if (above != undefined && newValue >= above.value) newValue = above.value;
+        }
+
+        slider.setValue(index, newValue, false);
+        slider.fireEvent('drag', slider, e, this);
+    },
+
+    getNewValue: function() {
+        var slider   = this.slider,
+            pos      = slider.innerEl.translatePoints(this.tracker.getXY());
+
+        return Ext.util.Format.round(slider.reverseValue(pos.left), slider.decimalPrecision);
+    },
+
+    
+    onDragEnd: function(e) {
+        var slider = this.slider,
+            value  = this.value;
+
+        this.el.removeClass('x-slider-thumb-drag');
+
+        this.dragging = false;
+        slider.fireEvent('dragend', slider, e);
+
+        if (this.dragStartValue != value) {
+            slider.fireEvent('changecomplete', slider, value, this);
+        }
+    },
+    
+    
+    destroy: function(){
+        Ext.destroyMembers(this, 'tracker', 'el');
+    }
+});
+
+
+Ext.slider.MultiSlider = Ext.extend(Ext.BoxComponent, {
+    
+    
+    vertical: false,
+    
+    minValue: 0,
+    
+    maxValue: 100,
+    
+    decimalPrecision: 0,
+    
+    keyIncrement: 1,
+    
+    increment: 0,
+
+    
+    clickRange: [5,15],
+
+    
+    clickToChange : true,
+    
+    animate: true,
+    
+    constrainThumbs: true,
+
+    
+    topThumbZIndex: 10000,
+
+    
+    initComponent : function(){
+        if(!Ext.isDefined(this.value)){
+            this.value = this.minValue;
+        }
+
+        
+        this.thumbs = [];
+
+        Ext.slider.MultiSlider.superclass.initComponent.call(this);
+
+        this.keyIncrement = Math.max(this.increment, this.keyIncrement);
+        this.addEvents(
+            
+            'beforechange',
+
+            
+            'change',
+
+            
+            'changecomplete',
+
+            
+            'dragstart',
+
+            
+            'drag',
+
+            
+            'dragend'
+        );
+
+        
+        if (this.values == undefined || Ext.isEmpty(this.values)) this.values = [0];
+
+        var values = this.values;
+
+        for (var i=0; i < values.length; i++) {
+            this.addThumb(values[i]);
+        }
+
+        if(this.vertical){
+            Ext.apply(this, Ext.slider.Vertical);
+        }
+    },
+
+    
+    addThumb: function(value) {
+        var thumb = new Ext.slider.Thumb({
+            value    : value,
+            slider   : this,
+            index    : this.thumbs.length,
+            constrain: this.constrainThumbs
+        });
+        this.thumbs.push(thumb);
+
+        
+        if (this.rendered) thumb.render();
+    },
+
+    
+    promoteThumb: function(topThumb) {
+        var thumbs = this.thumbs,
+            zIndex, thumb;
+
+        for (var i = 0, j = thumbs.length; i < j; i++) {
+            thumb = thumbs[i];
+
+            if (thumb == topThumb) {
+                zIndex = this.topThumbZIndex;
+            } else {
+                zIndex = '';
+            }
+
+            thumb.el.setStyle('zIndex', zIndex);
+        }
+    },
+
+    
+    onRender : function() {
+        this.autoEl = {
+            cls: 'x-slider ' + (this.vertical ? 'x-slider-vert' : 'x-slider-horz'),
+            cn : {
+                cls: 'x-slider-end',
+                cn : {
+                    cls:'x-slider-inner',
+                    cn : [{tag:'a', cls:'x-slider-focus', href:"#", tabIndex: '-1', hidefocus:'on'}]
+                }
+            }
+        };
+
+        Ext.slider.MultiSlider.superclass.onRender.apply(this, arguments);
+
+        this.endEl   = this.el.first();
+        this.innerEl = this.endEl.first();
+        this.focusEl = this.innerEl.child('.x-slider-focus');
+
+        
+        for (var i=0; i < this.thumbs.length; i++) {
+            this.thumbs[i].render();
+        }
+
+        
+        var thumb      = this.innerEl.child('.x-slider-thumb');
+        this.halfThumb = (this.vertical ? thumb.getHeight() : thumb.getWidth()) / 2;
+
+        this.initEvents();
+    },
+
+    
+    initEvents : function(){
+        this.mon(this.el, {
+            scope    : this,
+            mousedown: this.onMouseDown,
+            keydown  : this.onKeyDown
+        });
+
+        this.focusEl.swallowEvent("click", true);
+    },
+
+    
+    onMouseDown : function(e){
+        if(this.disabled){
+            return;
+        }
+
+        
+        var thumbClicked = false;
+        for (var i=0; i < this.thumbs.length; i++) {
+            thumbClicked = thumbClicked || e.target == this.thumbs[i].el.dom;
+        }
+
+        if (this.clickToChange && !thumbClicked) {
+            var local = this.innerEl.translatePoints(e.getXY());
+            this.onClickChange(local);
+        }
+        this.focus();
+    },
+
+    
+    onClickChange : function(local) {
+        if (local.top > this.clickRange[0] && local.top < this.clickRange[1]) {
+            
+            var thumb = this.getNearest(local, 'left'),
+                index = thumb.index;
+
+            this.setValue(index, Ext.util.Format.round(this.reverseValue(local.left), this.decimalPrecision), undefined, true);
+        }
+    },
+
+    
+    getNearest: function(local, prop) {
+        var localValue = prop == 'top' ? this.innerEl.getHeight() - local[prop] : local[prop],
+            clickValue = this.reverseValue(localValue),
+            nearestDistance = (this.maxValue - this.minValue) + 5, 
+            index = 0,
+            nearest = null;
+
+        for (var i=0; i < this.thumbs.length; i++) {
+            var thumb = this.thumbs[i],
+                value = thumb.value,
+                dist  = Math.abs(value - clickValue);
+
+            if (Math.abs(dist <= nearestDistance)) {
+                nearest = thumb;
+                index = i;
+                nearestDistance = dist;
+            }
+        }
+        return nearest;
+    },
+
+    
+    onKeyDown : function(e){
+        
+        if(this.disabled || this.thumbs.length !== 1){
+            e.preventDefault();
+            return;
+        }
+        var k = e.getKey(),
+            val;
+        switch(k){
+            case e.UP:
+            case e.RIGHT:
+                e.stopEvent();
+                val = e.ctrlKey ? this.maxValue : this.getValue(0) + this.keyIncrement;
+                this.setValue(0, val, undefined, true);
+            break;
+            case e.DOWN:
+            case e.LEFT:
+                e.stopEvent();
+                val = e.ctrlKey ? this.minValue : this.getValue(0) - this.keyIncrement;
+                this.setValue(0, val, undefined, true);
+            break;
+            default:
+                e.preventDefault();
+        }
+    },
+
+    
+    doSnap : function(value){
+        if (!(this.increment && value)) {
+            return value;
+        }
+        var newValue = value,
+            inc = this.increment,
+            m = value % inc;
+        if (m != 0) {
+            newValue -= m;
+            if (m * 2 >= inc) {
+                newValue += inc;
+            } else if (m * 2 < -inc) {
+                newValue -= inc;
+            }
+        }
+        return newValue.constrain(this.minValue,  this.maxValue);
+    },
+
+    
+    afterRender : function(){
+        Ext.slider.MultiSlider.superclass.afterRender.apply(this, arguments);
+
+        for (var i=0; i < this.thumbs.length; i++) {
+            var thumb = this.thumbs[i];
+
+            if (thumb.value !== undefined) {
+                var v = this.normalizeValue(thumb.value);
+
+                if (v !== thumb.value) {
+                    
+                    this.setValue(i, v, false);
+                } else {
+                    this.moveThumb(i, this.translateValue(v), false);
+                }
+            }
+        };
+    },
+
+    
+    getRatio : function(){
+        var w = this.innerEl.getWidth(),
+            v = this.maxValue - this.minValue;
+        return v == 0 ? w : (w/v);
+    },
+
+    
+    normalizeValue : function(v){
+        v = this.doSnap(v);
+        v = Ext.util.Format.round(v, this.decimalPrecision);
+        v = v.constrain(this.minValue, this.maxValue);
+        return v;
+    },
+
+    
+    setMinValue : function(val){
+        this.minValue = val;
+        var i = 0,
+            thumbs = this.thumbs,
+            len = thumbs.length,
+            t;
+            
+        for(; i < len; ++i){
+            t = thumbs[i];
+            t.value = t.value < val ? val : t.value;
+        }
+        this.syncThumb();
+    },
+
+    
+    setMaxValue : function(val){
+        this.maxValue = val;
+        var i = 0,
+            thumbs = this.thumbs,
+            len = thumbs.length,
+            t;
+            
+        for(; i < len; ++i){
+            t = thumbs[i];
+            t.value = t.value > val ? val : t.value;
+        }
+        this.syncThumb();
+    },
+
+    
+    setValue : function(index, v, animate, changeComplete) {
+        var thumb = this.thumbs[index],
+            el    = thumb.el;
+
+        v = this.normalizeValue(v);
+
+        if (v !== thumb.value && this.fireEvent('beforechange', this, v, thumb.value, thumb) !== false) {
+            thumb.value = v;
+            if(this.rendered){
+                this.moveThumb(index, this.translateValue(v), animate !== false);
+                this.fireEvent('change', this, v, thumb);
+                if(changeComplete){
+                    this.fireEvent('changecomplete', this, v, thumb);
+                }
+            }
+        }
+    },
+
+    
+    translateValue : function(v) {
+        var ratio = this.getRatio();
+        return (v * ratio) - (this.minValue * ratio) - this.halfThumb;
+    },
+
+    
+    reverseValue : function(pos){
+        var ratio = this.getRatio();
+        return (pos + (this.minValue * ratio)) / ratio;
+    },
+
+    
+    moveThumb: function(index, v, animate){
+        var thumb = this.thumbs[index].el;
+
+        if(!animate || this.animate === false){
+            thumb.setLeft(v);
+        }else{
+            thumb.shift({left: v, stopFx: true, duration:.35});
+        }
+    },
+
+    
+    focus : function(){
+        this.focusEl.focus(10);
+    },
+
+    
+    onResize : function(w, h){
+        var thumbs = this.thumbs,
+            len = thumbs.length,
+            i = 0;
+            
+        
+        for(; i < len; ++i){
+            thumbs[i].el.stopFx();    
+        }
+        
+        if(Ext.isNumber(w)){
+            this.innerEl.setWidth(w - (this.el.getPadding('l') + this.endEl.getPadding('r')));
+        }
+        this.syncThumb();
+        Ext.slider.MultiSlider.superclass.onResize.apply(this, arguments);
+    },
+
+    
+    onDisable: function(){
+        Ext.slider.MultiSlider.superclass.onDisable.call(this);
+
+        for (var i=0; i < this.thumbs.length; i++) {
+            var thumb = this.thumbs[i],
+                el    = thumb.el;
+
+            thumb.disable();
+
+            if(Ext.isIE){
+                
+                
+                var xy = el.getXY();
+                el.hide();
+
+                this.innerEl.addClass(this.disabledClass).dom.disabled = true;
+
+                if (!this.thumbHolder) {
+                    this.thumbHolder = this.endEl.createChild({cls: 'x-slider-thumb ' + this.disabledClass});
+                }
+
+                this.thumbHolder.show().setXY(xy);
+            }
+        }
+    },
+
+    
+    onEnable: function(){
+        Ext.slider.MultiSlider.superclass.onEnable.call(this);
+
+        for (var i=0; i < this.thumbs.length; i++) {
+            var thumb = this.thumbs[i],
+                el    = thumb.el;
+
+            thumb.enable();
+
+            if (Ext.isIE) {
+                this.innerEl.removeClass(this.disabledClass).dom.disabled = false;
+
+                if (this.thumbHolder) this.thumbHolder.hide();
+
+                el.show();
+                this.syncThumb();
+            }
+        }
+    },
+
+    
+    syncThumb : function() {
+        if (this.rendered) {
+            for (var i=0; i < this.thumbs.length; i++) {
+                this.moveThumb(i, this.translateValue(this.thumbs[i].value));
+            }
+        }
+    },
+
+    
+    getValue : function(index) {
+        return this.thumbs[index].value;
+    },
+
+    
+    getValues: function() {
+        var values = [];
+
+        for (var i=0; i < this.thumbs.length; i++) {
+            values.push(this.thumbs[i].value);
+        }
+
+        return values;
+    },
+
+    
+    beforeDestroy : function(){
+        var thumbs = this.thumbs;
+        for(var i = 0, len = thumbs.length; i < len; ++i){
+            thumbs[i].destroy();
+            thumbs[i] = null;
+        }
+        Ext.destroyMembers(this, 'endEl', 'innerEl', 'focusEl', 'thumbHolder');
+        Ext.slider.MultiSlider.superclass.beforeDestroy.call(this);
+    }
+});
+
+Ext.reg('multislider', Ext.slider.MultiSlider);
+
+
+Ext.slider.SingleSlider = Ext.extend(Ext.slider.MultiSlider, {
+    constructor: function(config) {
+      config = config || {};
+
+      Ext.applyIf(config, {
+          values: [config.value || 0]
+      });
+
+      Ext.slider.SingleSlider.superclass.constructor.call(this, config);
+    },
+
+    
+    getValue: function() {
+        
+        return Ext.slider.SingleSlider.superclass.getValue.call(this, 0);
+    },
+
+    
+    setValue: function(value, animate) {
+        var args = Ext.toArray(arguments),
+            len  = args.length;
+
+        
+        
+        
+        if (len == 1 || (len <= 3 && typeof arguments[1] != 'number')) {
+            args.unshift(0);
+        }
+
+        return Ext.slider.SingleSlider.superclass.setValue.apply(this, args);
+    },
+
+    
+    syncThumb : function() {
+        return Ext.slider.SingleSlider.superclass.syncThumb.apply(this, [0].concat(arguments));
+    },
+    
+    
+    getNearest : function(){
+        
+        return this.thumbs[0];    
+    }
+});
+
+
+Ext.Slider = Ext.slider.SingleSlider;
+
+Ext.reg('slider', Ext.slider.SingleSlider);
+
+
+Ext.slider.Vertical = {
+    onResize : function(w, h){
+        this.innerEl.setHeight(h - (this.el.getPadding('t') + this.endEl.getPadding('b')));
+        this.syncThumb();
+    },
+
+    getRatio : function(){
+        var h = this.innerEl.getHeight(),
+            v = this.maxValue - this.minValue;
+        return h/v;
+    },
+
+    moveThumb: function(index, v, animate) {
+        var thumb = this.thumbs[index],
+            el    = thumb.el;
+
+        if (!animate || this.animate === false) {
+            el.setBottom(v);
+        } else {
+            el.shift({bottom: v, stopFx: true, duration:.35});
+        }
+    },
+
+    onClickChange : function(local) {
+        if (local.left > this.clickRange[0] && local.left < this.clickRange[1]) {
+            var thumb = this.getNearest(local, 'top'),
+                index = thumb.index,
+                value = this.minValue + this.reverseValue(this.innerEl.getHeight() - local.top);
+
+            this.setValue(index, Ext.util.Format.round(value, this.decimalPrecision), undefined, true);
+        }
+    }
+};
+
+
+Ext.slider.Thumb.Vertical = {
+    getNewValue: function() {
+        var slider   = this.slider,
+            innerEl  = slider.innerEl,
+            pos      = innerEl.translatePoints(this.tracker.getXY()),
+            bottom   = innerEl.getHeight() - pos.top;
+
+        return slider.minValue + Ext.util.Format.round(bottom / slider.getRatio(), slider.decimalPrecision);
+    }
+};
+
+Ext.ProgressBar = Ext.extend(Ext.BoxComponent, {
+   
+    baseCls : 'x-progress',
+    
+    
+    animate : false,
+
+    
+    waitTimer : null,
+
+    
+    initComponent : function(){
+        Ext.ProgressBar.superclass.initComponent.call(this);
+        this.addEvents(
+            
+            "update"
+        );
+    },
+
+    
+    onRender : function(ct, position){
+        var tpl = new Ext.Template(
+            '<div class="{cls}-wrap">',
+                '<div class="{cls}-inner">',
+                    '<div class="{cls}-bar">',
+                        '<div class="{cls}-text">',
+                            '<div>&#160;</div>',
+                        '</div>',
+                    '</div>',
+                    '<div class="{cls}-text {cls}-text-back">',
+                        '<div>&#160;</div>',
+                    '</div>',
+                '</div>',
+            '</div>'
+        );
+
+        this.el = position ? tpl.insertBefore(position, {cls: this.baseCls}, true)
+            : tpl.append(ct, {cls: this.baseCls}, true);
+                
+        if(this.id){
+            this.el.dom.id = this.id;
+        }
+        var inner = this.el.dom.firstChild;
+        this.progressBar = Ext.get(inner.firstChild);
+
+        if(this.textEl){
+            
+            this.textEl = Ext.get(this.textEl);
+            delete this.textTopEl;
+        }else{
+            
+            this.textTopEl = Ext.get(this.progressBar.dom.firstChild);
+            var textBackEl = Ext.get(inner.childNodes[1]);
+            this.textTopEl.setStyle("z-index", 99).addClass('x-hidden');
+            this.textEl = new Ext.CompositeElement([this.textTopEl.dom.firstChild, textBackEl.dom.firstChild]);
+            this.textEl.setWidth(inner.offsetWidth);
+        }
+        this.progressBar.setHeight(inner.offsetHeight);
+    },
+    
+    
+    afterRender : function(){
+        Ext.ProgressBar.superclass.afterRender.call(this);
+        if(this.value){
+            this.updateProgress(this.value, this.text);
+        }else{
+            this.updateText(this.text);
+        }
+    },
+
+    
+    updateProgress : function(value, text, animate){
+        this.value = value || 0;
+        if(text){
+            this.updateText(text);
+        }
+        if(this.rendered && !this.isDestroyed){
+            var w = Math.floor(value*this.el.dom.firstChild.offsetWidth);
+            this.progressBar.setWidth(w, animate === true || (animate !== false && this.animate));
+            if(this.textTopEl){
+                
+                this.textTopEl.removeClass('x-hidden').setWidth(w);
+            }
+        }
+        this.fireEvent('update', this, value, text);
+        return this;
+    },
+
+    
+    wait : function(o){
+        if(!this.waitTimer){
+            var scope = this;
+            o = o || {};
+            this.updateText(o.text);
+            this.waitTimer = Ext.TaskMgr.start({
+                run: function(i){
+                    var inc = o.increment || 10;
+                    i -= 1;
+                    this.updateProgress(((((i+inc)%inc)+1)*(100/inc))*0.01, null, o.animate);
+                },
+                interval: o.interval || 1000,
+                duration: o.duration,
+                onStop: function(){
+                    if(o.fn){
+                        o.fn.apply(o.scope || this);
+                    }
+                    this.reset();
+                },
+                scope: scope
+            });
+        }
+        return this;
+    },
+
+    
+    isWaiting : function(){
+        return this.waitTimer !== null;
+    },
+
+    
+    updateText : function(text){
+        this.text = text || '&#160;';
+        if(this.rendered){
+            this.textEl.update(this.text);
+        }
+        return this;
+    },
+    
+    
+    syncProgressBar : function(){
+        if(this.value){
+            this.updateProgress(this.value, this.text);
+        }
+        return this;
+    },
+
+    
+    setSize : function(w, h){
+        Ext.ProgressBar.superclass.setSize.call(this, w, h);
+        if(this.textTopEl){
+            var inner = this.el.dom.firstChild;
+            this.textEl.setSize(inner.offsetWidth, inner.offsetHeight);
+        }
+        this.syncProgressBar();
+        return this;
+    },
+
+    
+    reset : function(hide){
+        this.updateProgress(0);
+        if(this.textTopEl){
+            this.textTopEl.addClass('x-hidden');
+        }
+        this.clearTimer();
+        if(hide === true){
+            this.hide();
+        }
+        return this;
+    },
+    
+    
+    clearTimer : function(){
+        if(this.waitTimer){
+            this.waitTimer.onStop = null; 
+            Ext.TaskMgr.stop(this.waitTimer);
+            this.waitTimer = null;
+        }
+    },
+    
+    onDestroy: function(){
+        this.clearTimer();
+        if(this.rendered){
+            if(this.textEl.isComposite){
+                this.textEl.clear();
+            }
+            Ext.destroyMembers(this, 'textEl', 'progressBar', 'textTopEl');
+        }
+        Ext.ProgressBar.superclass.onDestroy.call(this);
+    }
+});
+Ext.reg('progress', Ext.ProgressBar);
+
+(function() {
+
+var Event=Ext.EventManager;
+var Dom=Ext.lib.Dom;
+
+
+Ext.dd.DragDrop = function(id, sGroup, config) {
+    if(id) {
+        this.init(id, sGroup, config);
+    }
+};
+
+Ext.dd.DragDrop.prototype = {
+
+    
+
+    
+    id: null,
+
+    
+    config: null,
+
+    
+    dragElId: null,
+
+    
+    handleElId: null,
+
+    
+    invalidHandleTypes: null,
+
+    
+    invalidHandleIds: null,
+
+    
+    invalidHandleClasses: null,
+
+    
+    startPageX: 0,
+
+    
+    startPageY: 0,
+
+    
+    groups: null,
+
+    
+    locked: false,
+
+    
+    lock: function() {
+        this.locked = true;
+    },
+
+    
+    moveOnly: false,
+
+    
+    unlock: function() {
+        this.locked = false;
+    },
+
+    
+    isTarget: true,
+
+    
+    padding: null,
+
+    
+    _domRef: null,
+
+    
+    __ygDragDrop: true,
+
+    
+    constrainX: false,
+
+    
+    constrainY: false,
+
+    
+    minX: 0,
+
+    
+    maxX: 0,
+
+    
+    minY: 0,
+
+    
+    maxY: 0,
+
+    
+    maintainOffset: false,
+
+    
+    xTicks: null,
+
+    
+    yTicks: null,
+
+    
+    primaryButtonOnly: true,
+
+    
+    available: false,
+
+    
+    hasOuterHandles: false,
+
+    
+    b4StartDrag: function(x, y) { },
+
+    
+    startDrag: function(x, y) {  },
+
+    
+    b4Drag: function(e) { },
+
+    
+    onDrag: function(e) {  },
+
+    
+    onDragEnter: function(e, id) {  },
+
+    
+    b4DragOver: function(e) { },
+
+    
+    onDragOver: function(e, id) {  },
+
+    
+    b4DragOut: function(e) { },
+
+    
+    onDragOut: function(e, id) {  },
+
+    
+    b4DragDrop: function(e) { },
+
+    
+    onDragDrop: function(e, id) {  },
+
+    
+    onInvalidDrop: function(e) {  },
+
+    
+    b4EndDrag: function(e) { },
+
+    
+    endDrag: function(e) {  },
+
+    
+    b4MouseDown: function(e) {  },
+
+    
+    onMouseDown: function(e) {  },
+
+    
+    onMouseUp: function(e) {  },
+
+    
+    onAvailable: function () {
+    },
+
+    
+    defaultPadding : {left:0, right:0, top:0, bottom:0},
+
+    
+    constrainTo : function(constrainTo, pad, inContent){
+        if(Ext.isNumber(pad)){
+            pad = {left: pad, right:pad, top:pad, bottom:pad};
+        }
+        pad = pad || this.defaultPadding;
+        var b = Ext.get(this.getEl()).getBox(),
+            ce = Ext.get(constrainTo),
+            s = ce.getScroll(),
+            c, 
+            cd = ce.dom;
+        if(cd == document.body){
+            c = { x: s.left, y: s.top, width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()};
+        }else{
+            var xy = ce.getXY();
+            c = {x : xy[0], y: xy[1], width: cd.clientWidth, height: cd.clientHeight};
+        }
+
+
+        var topSpace = b.y - c.y,
+            leftSpace = b.x - c.x;
+
+        this.resetConstraints();
+        this.setXConstraint(leftSpace - (pad.left||0), 
+                c.width - leftSpace - b.width - (pad.right||0), 
+                               this.xTickSize
+        );
+        this.setYConstraint(topSpace - (pad.top||0), 
+                c.height - topSpace - b.height - (pad.bottom||0), 
+                               this.yTickSize
+        );
+    },
+
+    
+    getEl: function() {
+        if (!this._domRef) {
+            this._domRef = Ext.getDom(this.id);
+        }
+
+        return this._domRef;
+    },
+
+    
+    getDragEl: function() {
+        return Ext.getDom(this.dragElId);
+    },
+
+    
+    init: function(id, sGroup, config) {
+        this.initTarget(id, sGroup, config);
+        Event.on(this.id, "mousedown", this.handleMouseDown, this);
+        
+    },
+
+    
+    initTarget: function(id, sGroup, config) {
+
+        
+        this.config = config || {};
+
+        
+        this.DDM = Ext.dd.DDM;
+        
+        this.groups = {};
+
+        
+        
+        if (typeof id !== "string") {
+            id = Ext.id(id);
+        }
+
+        
+        this.id = id;
+
+        
+        this.addToGroup((sGroup) ? sGroup : "default");
+
+        
+        
+        this.handleElId = id;
+
+        
+        this.setDragElId(id);
+
+        
+        this.invalidHandleTypes = { A: "A" };
+        this.invalidHandleIds = {};
+        this.invalidHandleClasses = [];
+
+        this.applyConfig();
+
+        this.handleOnAvailable();
+    },
+
+    
+    applyConfig: function() {
+
+        
+        
+        this.padding           = this.config.padding || [0, 0, 0, 0];
+        this.isTarget          = (this.config.isTarget !== false);
+        this.maintainOffset    = (this.config.maintainOffset);
+        this.primaryButtonOnly = (this.config.primaryButtonOnly !== false);
+
+    },
+
+    
+    handleOnAvailable: function() {
+        this.available = true;
+        this.resetConstraints();
+        this.onAvailable();
+    },
+
+     
+    setPadding: function(iTop, iRight, iBot, iLeft) {
+        
+        if (!iRight && 0 !== iRight) {
+            this.padding = [iTop, iTop, iTop, iTop];
+        } else if (!iBot && 0 !== iBot) {
+            this.padding = [iTop, iRight, iTop, iRight];
+        } else {
+            this.padding = [iTop, iRight, iBot, iLeft];
+        }
+    },
+
+    
+    setInitPosition: function(diffX, diffY) {
+        var el = this.getEl();
+
+        if (!this.DDM.verifyEl(el)) {
+            return;
+        }
+
+        var dx = diffX || 0;
+        var dy = diffY || 0;
+
+        var p = Dom.getXY( el );
+
+        this.initPageX = p[0] - dx;
+        this.initPageY = p[1] - dy;
+
+        this.lastPageX = p[0];
+        this.lastPageY = p[1];
+
+        this.setStartPosition(p);
+    },
+
+    
+    setStartPosition: function(pos) {
+        var p = pos || Dom.getXY( this.getEl() );
+        this.deltaSetXY = null;
+
+        this.startPageX = p[0];
+        this.startPageY = p[1];
+    },
+
+    
+    addToGroup: function(sGroup) {
+        this.groups[sGroup] = true;
+        this.DDM.regDragDrop(this, sGroup);
+    },
+
+    
+    removeFromGroup: function(sGroup) {
+        if (this.groups[sGroup]) {
+            delete this.groups[sGroup];
+        }
+
+        this.DDM.removeDDFromGroup(this, sGroup);
+    },
+
+    
+    setDragElId: function(id) {
+        this.dragElId = id;
+    },
+
+    
+    setHandleElId: function(id) {
+        if (typeof id !== "string") {
+            id = Ext.id(id);
+        }
+        this.handleElId = id;
+        this.DDM.regHandle(this.id, id);
+    },
+
+    
+    setOuterHandleElId: function(id) {
+        if (typeof id !== "string") {
+            id = Ext.id(id);
+        }
+        Event.on(id, "mousedown",
+                this.handleMouseDown, this);
+        this.setHandleElId(id);
+
+        this.hasOuterHandles = true;
+    },
+
+    
+    unreg: function() {
+        Event.un(this.id, "mousedown",
+                this.handleMouseDown);
+        this._domRef = null;
+        this.DDM._remove(this);
+    },
+
+    destroy : function(){
+        this.unreg();
+    },
+
+    
+    isLocked: function() {
+        return (this.DDM.isLocked() || this.locked);
+    },
+
+    
+    handleMouseDown: function(e, oDD){
+        if (this.primaryButtonOnly && e.button != 0) {
+            return;
+        }
+
+        if (this.isLocked()) {
+            return;
+        }
+
+        this.DDM.refreshCache(this.groups);
+
+        var pt = new Ext.lib.Point(Ext.lib.Event.getPageX(e), Ext.lib.Event.getPageY(e));
+        if (!this.hasOuterHandles && !this.DDM.isOverTarget(pt, this) )  {
+        } else {
+            if (this.clickValidator(e)) {
+
+                
+                this.setStartPosition();
+
+                this.b4MouseDown(e);
+                this.onMouseDown(e);
+
+                this.DDM.handleMouseDown(e, this);
+
+                this.DDM.stopEvent(e);
+            } else {
+
+
+            }
+        }
+    },
+
+    clickValidator: function(e) {
+        var target = e.getTarget();
+        return ( this.isValidHandleChild(target) &&
+                    (this.id == this.handleElId ||
+                        this.DDM.handleWasClicked(target, this.id)) );
+    },
+
+    
+    addInvalidHandleType: function(tagName) {
+        var type = tagName.toUpperCase();
+        this.invalidHandleTypes[type] = type;
+    },
+
+    
+    addInvalidHandleId: function(id) {
+        if (typeof id !== "string") {
+            id = Ext.id(id);
+        }
+        this.invalidHandleIds[id] = id;
+    },
+
+    
+    addInvalidHandleClass: function(cssClass) {
+        this.invalidHandleClasses.push(cssClass);
+    },
+
+    
+    removeInvalidHandleType: function(tagName) {
+        var type = tagName.toUpperCase();
+        
+        delete this.invalidHandleTypes[type];
+    },
+
+    
+    removeInvalidHandleId: function(id) {
+        if (typeof id !== "string") {
+            id = Ext.id(id);
+        }
+        delete this.invalidHandleIds[id];
+    },
+
+    
+    removeInvalidHandleClass: function(cssClass) {
+        for (var i=0, len=this.invalidHandleClasses.length; i<len; ++i) {
+            if (this.invalidHandleClasses[i] == cssClass) {
+                delete this.invalidHandleClasses[i];
+            }
+        }
+    },
+
+    
+    isValidHandleChild: function(node) {
+
+        var valid = true;
+        
+        var nodeName;
+        try {
+            nodeName = node.nodeName.toUpperCase();
+        } catch(e) {
+            nodeName = node.nodeName;
+        }
+        valid = valid && !this.invalidHandleTypes[nodeName];
+        valid = valid && !this.invalidHandleIds[node.id];
+
+        for (var i=0, len=this.invalidHandleClasses.length; valid && i<len; ++i) {
+            valid = !Ext.fly(node).hasClass(this.invalidHandleClasses[i]);
+        }
+
+
+        return valid;
+
+    },
+
+    
+    setXTicks: function(iStartX, iTickSize) {
+        this.xTicks = [];
+        this.xTickSize = iTickSize;
+
+        var tickMap = {};
+
+        for (var i = this.initPageX; i >= this.minX; i = i - iTickSize) {
+            if (!tickMap[i]) {
+                this.xTicks[this.xTicks.length] = i;
+                tickMap[i] = true;
+            }
+        }
+
+        for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) {
+            if (!tickMap[i]) {
+                this.xTicks[this.xTicks.length] = i;
+                tickMap[i] = true;
+            }
+        }
+
+        this.xTicks.sort(this.DDM.numericSort) ;
+    },
+
+    
+    setYTicks: function(iStartY, iTickSize) {
+        this.yTicks = [];
+        this.yTickSize = iTickSize;
+
+        var tickMap = {};
+
+        for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) {
+            if (!tickMap[i]) {
+                this.yTicks[this.yTicks.length] = i;
+                tickMap[i] = true;
+            }
+        }
+
+        for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) {
+            if (!tickMap[i]) {
+                this.yTicks[this.yTicks.length] = i;
+                tickMap[i] = true;
+            }
+        }
+
+        this.yTicks.sort(this.DDM.numericSort) ;
+    },
+
+    
+    setXConstraint: function(iLeft, iRight, iTickSize) {
+        this.leftConstraint = iLeft;
+        this.rightConstraint = iRight;
+
+        this.minX = this.initPageX - iLeft;
+        this.maxX = this.initPageX + iRight;
+        if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); }
+
+        this.constrainX = true;
+    },
+
+    
+    clearConstraints: function() {
+        this.constrainX = false;
+        this.constrainY = false;
+        this.clearTicks();
+    },
+
+    
+    clearTicks: function() {
+        this.xTicks = null;
+        this.yTicks = null;
+        this.xTickSize = 0;
+        this.yTickSize = 0;
+    },
+
+    
+    setYConstraint: function(iUp, iDown, iTickSize) {
+        this.topConstraint = iUp;
+        this.bottomConstraint = iDown;
+
+        this.minY = this.initPageY - iUp;
+        this.maxY = this.initPageY + iDown;
+        if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); }
+
+        this.constrainY = true;
+
+    },
+
+    
+    resetConstraints: function() {
+        
+        if (this.initPageX || this.initPageX === 0) {
+            
+            var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0;
+            var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0;
+
+            this.setInitPosition(dx, dy);
+
+        
+        } else {
+            this.setInitPosition();
+        }
+
+        if (this.constrainX) {
+            this.setXConstraint( this.leftConstraint,
+                                 this.rightConstraint,
+                                 this.xTickSize        );
+        }
+
+        if (this.constrainY) {
+            this.setYConstraint( this.topConstraint,
+                                 this.bottomConstraint,
+                                 this.yTickSize         );
+        }
+    },
+
+    
+    getTick: function(val, tickArray) {
+        if (!tickArray) {
+            
+            
+            return val;
+        } else if (tickArray[0] >= val) {
+            
+            
+            return tickArray[0];
+        } else {
+            for (var i=0, len=tickArray.length; i<len; ++i) {
+                var next = i + 1;
+                if (tickArray[next] && tickArray[next] >= val) {
+                    var diff1 = val - tickArray[i];
+                    var diff2 = tickArray[next] - val;
+                    return (diff2 > diff1) ? tickArray[i] : tickArray[next];
+                }
+            }
+
+            
+            
+            return tickArray[tickArray.length - 1];
+        }
+    },
+
+    
+    toString: function() {
+        return ("DragDrop " + this.id);
+    }
+
+};
+
+})();
+
+
+
+
+if (!Ext.dd.DragDropMgr) {
+
+
+Ext.dd.DragDropMgr = function() {
+
+    var Event = Ext.EventManager;
+
+    return {
+
+        
+        ids: {},
+
+        
+        handleIds: {},
+
+        
+        dragCurrent: null,
+
+        
+        dragOvers: {},
+
+        
+        deltaX: 0,
+
+        
+        deltaY: 0,
+
+        
+        preventDefault: true,
+
+        
+        stopPropagation: true,
+
+        
+        initialized: false,
+
+        
+        locked: false,
+
+        
+        init: function() {
+            this.initialized = true;
+        },
+
+        
+        POINT: 0,
+
+        
+        INTERSECT: 1,
+
+        
+        mode: 0,
+
+        
+        _execOnAll: function(sMethod, args) {
+            for (var i in this.ids) {
+                for (var j in this.ids[i]) {
+                    var oDD = this.ids[i][j];
+                    if (! this.isTypeOfDD(oDD)) {
+                        continue;
+                    }
+                    oDD[sMethod].apply(oDD, args);
+                }
+            }
+        },
+
+        
+        _onLoad: function() {
+
+            this.init();
+
+
+            Event.on(document, "mouseup",   this.handleMouseUp, this, true);
+            Event.on(document, "mousemove", this.handleMouseMove, this, true);
+            Event.on(window,   "unload",    this._onUnload, this, true);
+            Event.on(window,   "resize",    this._onResize, this, true);
+            
+
+        },
+
+        
+        _onResize: function(e) {
+            this._execOnAll("resetConstraints", []);
+        },
+
+        
+        lock: function() { this.locked = true; },
+
+        
+        unlock: function() { this.locked = false; },
+
+        
+        isLocked: function() { return this.locked; },
+
+        
+        locationCache: {},
+
+        
+        useCache: true,
+
+        
+        clickPixelThresh: 3,
+
+        
+        clickTimeThresh: 350,
+
+        
+        dragThreshMet: false,
+
+        
+        clickTimeout: null,
+
+        
+        startX: 0,
+
+        
+        startY: 0,
+
+        
+        regDragDrop: function(oDD, sGroup) {
+            if (!this.initialized) { this.init(); }
+
+            if (!this.ids[sGroup]) {
+                this.ids[sGroup] = {};
+            }
+            this.ids[sGroup][oDD.id] = oDD;
+        },
+
+        
+        removeDDFromGroup: function(oDD, sGroup) {
+            if (!this.ids[sGroup]) {
+                this.ids[sGroup] = {};
+            }
+
+            var obj = this.ids[sGroup];
+            if (obj && obj[oDD.id]) {
+                delete obj[oDD.id];
+            }
+        },
+
+        
+        _remove: function(oDD) {
+            for (var g in oDD.groups) {
+                if (g && this.ids[g] && this.ids[g][oDD.id]) {
+                    delete this.ids[g][oDD.id];
+                }
+            }
+            delete this.handleIds[oDD.id];
+        },
+
+        
+        regHandle: function(sDDId, sHandleId) {
+            if (!this.handleIds[sDDId]) {
+                this.handleIds[sDDId] = {};
+            }
+            this.handleIds[sDDId][sHandleId] = sHandleId;
+        },
+
+        
+        isDragDrop: function(id) {
+            return ( this.getDDById(id) ) ? true : false;
+        },
+
+        
+        getRelated: function(p_oDD, bTargetsOnly) {
+            var oDDs = [];
+            for (var i in p_oDD.groups) {
+                for (var j in this.ids[i]) {
+                    var dd = this.ids[i][j];
+                    if (! this.isTypeOfDD(dd)) {
+                        continue;
+                    }
+                    if (!bTargetsOnly || dd.isTarget) {
+                        oDDs[oDDs.length] = dd;
+                    }
+                }
+            }
+
+            return oDDs;
+        },
+
+        
+        isLegalTarget: function (oDD, oTargetDD) {
+            var targets = this.getRelated(oDD, true);
+            for (var i=0, len=targets.length;i<len;++i) {
+                if (targets[i].id == oTargetDD.id) {
+                    return true;
+                }
+            }
+
+            return false;
+        },
+
+        
+        isTypeOfDD: function (oDD) {
+            return (oDD && oDD.__ygDragDrop);
+        },
+
+        
+        isHandle: function(sDDId, sHandleId) {
+            return ( this.handleIds[sDDId] &&
+                            this.handleIds[sDDId][sHandleId] );
+        },
+
+        
+        getDDById: function(id) {
+            for (var i in this.ids) {
+                if (this.ids[i][id]) {
+                    return this.ids[i][id];
+                }
+            }
+            return null;
+        },
+
+        
+        handleMouseDown: function(e, oDD) {
+            if(Ext.QuickTips){
+                Ext.QuickTips.ddDisable();
+            }
+            if(this.dragCurrent){
+                
+                
+                this.handleMouseUp(e);
+            }
+            
+            this.currentTarget = e.getTarget();
+            this.dragCurrent = oDD;
+
+            var el = oDD.getEl();
+
+            
+            this.startX = e.getPageX();
+            this.startY = e.getPageY();
+
+            this.deltaX = this.startX - el.offsetLeft;
+            this.deltaY = this.startY - el.offsetTop;
+
+            this.dragThreshMet = false;
+
+            this.clickTimeout = setTimeout(
+                    function() {
+                        var DDM = Ext.dd.DDM;
+                        DDM.startDrag(DDM.startX, DDM.startY);
+                    },
+                    this.clickTimeThresh );
+        },
+
+        
+        startDrag: function(x, y) {
+            clearTimeout(this.clickTimeout);
+            if (this.dragCurrent) {
+                this.dragCurrent.b4StartDrag(x, y);
+                this.dragCurrent.startDrag(x, y);
+            }
+            this.dragThreshMet = true;
+        },
+
+        
+        handleMouseUp: function(e) {
+
+            if(Ext.QuickTips){
+                Ext.QuickTips.ddEnable();
+            }
+            if (! this.dragCurrent) {
+                return;
+            }
+
+            clearTimeout(this.clickTimeout);
+
+            if (this.dragThreshMet) {
+                this.fireEvents(e, true);
+            } else {
+            }
+
+            this.stopDrag(e);
+
+            this.stopEvent(e);
+        },
+
+        
+        stopEvent: function(e){
+            if(this.stopPropagation) {
+                e.stopPropagation();
+            }
+
+            if (this.preventDefault) {
+                e.preventDefault();
+            }
+        },
+
+        
+        stopDrag: function(e) {
+            
+            if (this.dragCurrent) {
+                if (this.dragThreshMet) {
+                    this.dragCurrent.b4EndDrag(e);
+                    this.dragCurrent.endDrag(e);
+                }
+
+                this.dragCurrent.onMouseUp(e);
+            }
+
+            this.dragCurrent = null;
+            this.dragOvers = {};
+        },
+
+        
+        handleMouseMove: function(e) {
+            if (! this.dragCurrent) {
+                return true;
+            }
+            
+
+            
+            if (Ext.isIE && (e.button !== 0 && e.button !== 1 && e.button !== 2)) {
+                this.stopEvent(e);
+                return this.handleMouseUp(e);
+            }
+
+            if (!this.dragThreshMet) {
+                var diffX = Math.abs(this.startX - e.getPageX());
+                var diffY = Math.abs(this.startY - e.getPageY());
+                if (diffX > this.clickPixelThresh ||
+                            diffY > this.clickPixelThresh) {
+                    this.startDrag(this.startX, this.startY);
+                }
+            }
+
+            if (this.dragThreshMet) {
+                this.dragCurrent.b4Drag(e);
+                this.dragCurrent.onDrag(e);
+                if(!this.dragCurrent.moveOnly){
+                    this.fireEvents(e, false);
+                }
+            }
+
+            this.stopEvent(e);
+
+            return true;
+        },
+
+        
+        fireEvents: function(e, isDrop) {
+            var dc = this.dragCurrent;
+
+            
+            
+            if (!dc || dc.isLocked()) {
+                return;
+            }
+
+            var pt = e.getPoint();
+
+            
+            var oldOvers = [];
+
+            var outEvts   = [];
+            var overEvts  = [];
+            var dropEvts  = [];
+            var enterEvts = [];
+
+            
+            
+            for (var i in this.dragOvers) {
+
+                var ddo = this.dragOvers[i];
+
+                if (! this.isTypeOfDD(ddo)) {
+                    continue;
+                }
+
+                if (! this.isOverTarget(pt, ddo, this.mode)) {
+                    outEvts.push( ddo );
+                }
+
+                oldOvers[i] = true;
+                delete this.dragOvers[i];
+            }
+
+            for (var sGroup in dc.groups) {
+
+                if ("string" != typeof sGroup) {
+                    continue;
+                }
+
+                for (i in this.ids[sGroup]) {
+                    var oDD = this.ids[sGroup][i];
+                    if (! this.isTypeOfDD(oDD)) {
+                        continue;
+                    }
+
+                    if (oDD.isTarget && !oDD.isLocked() && ((oDD != dc) || (dc.ignoreSelf === false))) {
+                        if (this.isOverTarget(pt, oDD, this.mode)) {
+                            
+                            if (isDrop) {
+                                dropEvts.push( oDD );
+                            
+                            } else {
+
+                                
+                                if (!oldOvers[oDD.id]) {
+                                    enterEvts.push( oDD );
+                                
+                                } else {
+                                    overEvts.push( oDD );
+                                }
+
+                                this.dragOvers[oDD.id] = oDD;
+                            }
+                        }
+                    }
+                }
+            }
+
+            if (this.mode) {
+                if (outEvts.length) {
+                    dc.b4DragOut(e, outEvts);
+                    dc.onDragOut(e, outEvts);
+                }
+
+                if (enterEvts.length) {
+                    dc.onDragEnter(e, enterEvts);
+                }
+
+                if (overEvts.length) {
+                    dc.b4DragOver(e, overEvts);
+                    dc.onDragOver(e, overEvts);
+                }
+
+                if (dropEvts.length) {
+                    dc.b4DragDrop(e, dropEvts);
+                    dc.onDragDrop(e, dropEvts);
+                }
+
+            } else {
+                
+                var len = 0;
+                for (i=0, len=outEvts.length; i<len; ++i) {
+                    dc.b4DragOut(e, outEvts[i].id);
+                    dc.onDragOut(e, outEvts[i].id);
+                }
+
+                
+                for (i=0,len=enterEvts.length; i<len; ++i) {
+                    
+                    dc.onDragEnter(e, enterEvts[i].id);
+                }
+
+                
+                for (i=0,len=overEvts.length; i<len; ++i) {
+                    dc.b4DragOver(e, overEvts[i].id);
+                    dc.onDragOver(e, overEvts[i].id);
+                }
+
+                
+                for (i=0, len=dropEvts.length; i<len; ++i) {
+                    dc.b4DragDrop(e, dropEvts[i].id);
+                    dc.onDragDrop(e, dropEvts[i].id);
+                }
+
+            }
+
+            
+            if (isDrop && !dropEvts.length) {
+                dc.onInvalidDrop(e);
+            }
+
+        },
+
+        
+        getBestMatch: function(dds) {
+            var winner = null;
+            
+            
+               
+            
+            
+
+            var len = dds.length;
+
+            if (len == 1) {
+                winner = dds[0];
+            } else {
+                
+                for (var i=0; i<len; ++i) {
+                    var dd = dds[i];
+                    
+                    
+                    
+                    if (dd.cursorIsOver) {
+                        winner = dd;
+                        break;
+                    
+                    } else {
+                        if (!winner ||
+                            winner.overlap.getArea() < dd.overlap.getArea()) {
+                            winner = dd;
+                        }
+                    }
+                }
+            }
+
+            return winner;
+        },
+
+        
+        refreshCache: function(groups) {
+            for (var sGroup in groups) {
+                if ("string" != typeof sGroup) {
+                    continue;
+                }
+                for (var i in this.ids[sGroup]) {
+                    var oDD = this.ids[sGroup][i];
+
+                    if (this.isTypeOfDD(oDD)) {
+                    
+                        var loc = this.getLocation(oDD);
+                        if (loc) {
+                            this.locationCache[oDD.id] = loc;
+                        } else {
+                            delete this.locationCache[oDD.id];
+                            
+                            
+                            
+                        }
+                    }
+                }
+            }
+        },
+
+        
+        verifyEl: function(el) {
+            if (el) {
+                var parent;
+                if(Ext.isIE){
+                    try{
+                        parent = el.offsetParent;
+                    }catch(e){}
+                }else{
+                    parent = el.offsetParent;
+                }
+                if (parent) {
+                    return true;
+                }
+            }
+
+            return false;
+        },
+
+        
+        getLocation: function(oDD) {
+            if (! this.isTypeOfDD(oDD)) {
+                return null;
+            }
+
+            var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l;
+
+            try {
+                pos= Ext.lib.Dom.getXY(el);
+            } catch (e) { }
+
+            if (!pos) {
+                return null;
+            }
+
+            x1 = pos[0];
+            x2 = x1 + el.offsetWidth;
+            y1 = pos[1];
+            y2 = y1 + el.offsetHeight;
+
+            t = y1 - oDD.padding[0];
+            r = x2 + oDD.padding[1];
+            b = y2 + oDD.padding[2];
+            l = x1 - oDD.padding[3];
+
+            return new Ext.lib.Region( t, r, b, l );
+        },
+
+        
+        isOverTarget: function(pt, oTarget, intersect) {
+            
+            var loc = this.locationCache[oTarget.id];
+            if (!loc || !this.useCache) {
+                loc = this.getLocation(oTarget);
+                this.locationCache[oTarget.id] = loc;
+
+            }
+
+            if (!loc) {
+                return false;
+            }
+
+            oTarget.cursorIsOver = loc.contains( pt );
+
+            
+            
+            
+            
+            
+            var dc = this.dragCurrent;
+            if (!dc || !dc.getTargetCoord ||
+                    (!intersect && !dc.constrainX && !dc.constrainY)) {
+                return oTarget.cursorIsOver;
+            }
+
+            oTarget.overlap = null;
+
+            
+            
+            
+            
+            var pos = dc.getTargetCoord(pt.x, pt.y);
+
+            var el = dc.getDragEl();
+            var curRegion = new Ext.lib.Region( pos.y,
+                                                   pos.x + el.offsetWidth,
+                                                   pos.y + el.offsetHeight,
+                                                   pos.x );
+
+            var overlap = curRegion.intersect(loc);
+
+            if (overlap) {
+                oTarget.overlap = overlap;
+                return (intersect) ? true : oTarget.cursorIsOver;
+            } else {
+                return false;
+            }
+        },
+
+        
+        _onUnload: function(e, me) {
+            Ext.dd.DragDropMgr.unregAll();
+        },
+
+        
+        unregAll: function() {
+
+            if (this.dragCurrent) {
+                this.stopDrag();
+                this.dragCurrent = null;
+            }
+
+            this._execOnAll("unreg", []);
+
+            for (var i in this.elementCache) {
+                delete this.elementCache[i];
+            }
+
+            this.elementCache = {};
+            this.ids = {};
+        },
+
+        
+        elementCache: {},
+
+        
+        getElWrapper: function(id) {
+            var oWrapper = this.elementCache[id];
+            if (!oWrapper || !oWrapper.el) {
+                oWrapper = this.elementCache[id] =
+                    new this.ElementWrapper(Ext.getDom(id));
+            }
+            return oWrapper;
+        },
+
+        
+        getElement: function(id) {
+            return Ext.getDom(id);
+        },
+
+        
+        getCss: function(id) {
+            var el = Ext.getDom(id);
+            return (el) ? el.style : null;
+        },
+
+        
+        ElementWrapper: function(el) {
+                
+                this.el = el || null;
+                
+                this.id = this.el && el.id;
+                
+                this.css = this.el && el.style;
+            },
+
+        
+        getPosX: function(el) {
+            return Ext.lib.Dom.getX(el);
+        },
+
+        
+        getPosY: function(el) {
+            return Ext.lib.Dom.getY(el);
+        },
+
+        
+        swapNode: function(n1, n2) {
+            if (n1.swapNode) {
+                n1.swapNode(n2);
+            } else {
+                var p = n2.parentNode;
+                var s = n2.nextSibling;
+
+                if (s == n1) {
+                    p.insertBefore(n1, n2);
+                } else if (n2 == n1.nextSibling) {
+                    p.insertBefore(n2, n1);
+                } else {
+                    n1.parentNode.replaceChild(n2, n1);
+                    p.insertBefore(n1, s);
+                }
+            }
+        },
+
+        
+        getScroll: function () {
+            var t, l, dde=document.documentElement, db=document.body;
+            if (dde && (dde.scrollTop || dde.scrollLeft)) {
+                t = dde.scrollTop;
+                l = dde.scrollLeft;
+            } else if (db) {
+                t = db.scrollTop;
+                l = db.scrollLeft;
+            } else {
+
+            }
+            return { top: t, left: l };
+        },
+
+        
+        getStyle: function(el, styleProp) {
+            return Ext.fly(el).getStyle(styleProp);
+        },
+
+        
+        getScrollTop: function () {
+            return this.getScroll().top;
+        },
+
+        
+        getScrollLeft: function () {
+            return this.getScroll().left;
+        },
+
+        
+        moveToEl: function (moveEl, targetEl) {
+            var aCoord = Ext.lib.Dom.getXY(targetEl);
+            Ext.lib.Dom.setXY(moveEl, aCoord);
+        },
+
+        
+        numericSort: function(a, b) {
+            return (a - b);
+        },
+
+        
+        _timeoutCount: 0,
+
+        
+        _addListeners: function() {
+            var DDM = Ext.dd.DDM;
+            if ( Ext.lib.Event && document ) {
+                DDM._onLoad();
+            } else {
+                if (DDM._timeoutCount > 2000) {
+                } else {
+                    setTimeout(DDM._addListeners, 10);
+                    if (document && document.body) {
+                        DDM._timeoutCount += 1;
+                    }
+                }
+            }
+        },
+
+        
+        handleWasClicked: function(node, id) {
+            if (this.isHandle(id, node.id)) {
+                return true;
+            } else {
+                
+                var p = node.parentNode;
+
+                while (p) {
+                    if (this.isHandle(id, p.id)) {
+                        return true;
+                    } else {
+                        p = p.parentNode;
+                    }
+                }
+            }
+
+            return false;
+        }
+
+    };
+
+}();
+
+
+Ext.dd.DDM = Ext.dd.DragDropMgr;
+Ext.dd.DDM._addListeners();
+
+}
+
+
+Ext.dd.DD = function(id, sGroup, config) {
+    if (id) {
+        this.init(id, sGroup, config);
+    }
+};
+
+Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, {
+
+    
+    scroll: true,
+
+    
+    autoOffset: function(iPageX, iPageY) {
+        var x = iPageX - this.startPageX;
+        var y = iPageY - this.startPageY;
+        this.setDelta(x, y);
+    },
+
+    
+    setDelta: function(iDeltaX, iDeltaY) {
+        this.deltaX = iDeltaX;
+        this.deltaY = iDeltaY;
+    },
+
+    
+    setDragElPos: function(iPageX, iPageY) {
+        
+        
+
+        var el = this.getDragEl();
+        this.alignElWithMouse(el, iPageX, iPageY);
+    },
+
+    
+    alignElWithMouse: function(el, iPageX, iPageY) {
+        var oCoord = this.getTargetCoord(iPageX, iPageY);
+        var fly = el.dom ? el : Ext.fly(el, '_dd');
+        if (!this.deltaSetXY) {
+            var aCoord = [oCoord.x, oCoord.y];
+            fly.setXY(aCoord);
+            var newLeft = fly.getLeft(true);
+            var newTop  = fly.getTop(true);
+            this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ];
+        } else {
+            fly.setLeftTop(oCoord.x + this.deltaSetXY[0], oCoord.y + this.deltaSetXY[1]);
+        }
+
+        this.cachePosition(oCoord.x, oCoord.y);
+        this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth);
+        return oCoord;
+    },
+
+    
+    cachePosition: function(iPageX, iPageY) {
+        if (iPageX) {
+            this.lastPageX = iPageX;
+            this.lastPageY = iPageY;
+        } else {
+            var aCoord = Ext.lib.Dom.getXY(this.getEl());
+            this.lastPageX = aCoord[0];
+            this.lastPageY = aCoord[1];
+        }
+    },
+
+    
+    autoScroll: function(x, y, h, w) {
+
+        if (this.scroll) {
+            
+            var clientH = Ext.lib.Dom.getViewHeight();
+
+            
+            var clientW = Ext.lib.Dom.getViewWidth();
+
+            
+            var st = this.DDM.getScrollTop();
+
+            
+            var sl = this.DDM.getScrollLeft();
+
+            
+            var bot = h + y;
+
+            
+            var right = w + x;
+
+            
+            
+            
+            var toBot = (clientH + st - y - this.deltaY);
+
+            
+            var toRight = (clientW + sl - x - this.deltaX);
+
+
+            
+            
+            var thresh = 40;
+
+            
+            
+            
+            var scrAmt = (document.all) ? 80 : 30;
+
+            
+            
+            if ( bot > clientH && toBot < thresh ) {
+                window.scrollTo(sl, st + scrAmt);
+            }
+
+            
+            
+            if ( y < st && st > 0 && y - st < thresh ) {
+                window.scrollTo(sl, st - scrAmt);
+            }
+
+            
+            
+            if ( right > clientW && toRight < thresh ) {
+                window.scrollTo(sl + scrAmt, st);
+            }
+
+            
+            
+            if ( x < sl && sl > 0 && x - sl < thresh ) {
+                window.scrollTo(sl - scrAmt, st);
+            }
+        }
+    },
+
+    
+    getTargetCoord: function(iPageX, iPageY) {
+        var x = iPageX - this.deltaX;
+        var y = iPageY - this.deltaY;
+
+        if (this.constrainX) {
+            if (x < this.minX) { x = this.minX; }
+            if (x > this.maxX) { x = this.maxX; }
+        }
+
+        if (this.constrainY) {
+            if (y < this.minY) { y = this.minY; }
+            if (y > this.maxY) { y = this.maxY; }
+        }
+
+        x = this.getTick(x, this.xTicks);
+        y = this.getTick(y, this.yTicks);
+
+
+        return {x:x, y:y};
+    },
+
+    
+    applyConfig: function() {
+        Ext.dd.DD.superclass.applyConfig.call(this);
+        this.scroll = (this.config.scroll !== false);
+    },
+
+    
+    b4MouseDown: function(e) {
+        
+        this.autoOffset(e.getPageX(),
+                            e.getPageY());
+    },
+
+    
+    b4Drag: function(e) {
+        this.setDragElPos(e.getPageX(),
+                            e.getPageY());
+    },
+
+    toString: function() {
+        return ("DD " + this.id);
+    }
+
+    
+    
+    
+    
+
+});
+
+Ext.dd.DDProxy = function(id, sGroup, config) {
+    if (id) {
+        this.init(id, sGroup, config);
+        this.initFrame();
+    }
+};
+
+
+Ext.dd.DDProxy.dragElId = "ygddfdiv";
+
+Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, {
+
+    
+    resizeFrame: true,
+
+    
+    centerFrame: false,
+
+    
+    createFrame: function() {
+        var self = this;
+        var body = document.body;
+
+        if (!body || !body.firstChild) {
+            setTimeout( function() { self.createFrame(); }, 50 );
+            return;
+        }
+
+        var div = this.getDragEl();
+
+        if (!div) {
+            div    = document.createElement("div");
+            div.id = this.dragElId;
+            var s  = div.style;
+
+            s.position   = "absolute";
+            s.visibility = "hidden";
+            s.cursor     = "move";
+            s.border     = "2px solid #aaa";
+            s.zIndex     = 999;
+
+            
+            
+            
+            body.insertBefore(div, body.firstChild);
+        }
+    },
+
+    
+    initFrame: function() {
+        this.createFrame();
+    },
+
+    applyConfig: function() {
+        Ext.dd.DDProxy.superclass.applyConfig.call(this);
+
+        this.resizeFrame = (this.config.resizeFrame !== false);
+        this.centerFrame = (this.config.centerFrame);
+        this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId);
+    },
+
+    
+    showFrame: function(iPageX, iPageY) {
+        var el = this.getEl();
+        var dragEl = this.getDragEl();
+        var s = dragEl.style;
+
+        this._resizeProxy();
+
+        if (this.centerFrame) {
+            this.setDelta( Math.round(parseInt(s.width,  10)/2),
+                           Math.round(parseInt(s.height, 10)/2) );
+        }
+
+        this.setDragElPos(iPageX, iPageY);
+
+        Ext.fly(dragEl).show();
+    },
+
+    
+    _resizeProxy: function() {
+        if (this.resizeFrame) {
+            var el = this.getEl();
+            Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight);
+        }
+    },
+
+    
+    b4MouseDown: function(e) {
+        var x = e.getPageX();
+        var y = e.getPageY();
+        this.autoOffset(x, y);
+        this.setDragElPos(x, y);
+    },
+
+    
+    b4StartDrag: function(x, y) {
+        
+        this.showFrame(x, y);
+    },
+
+    
+    b4EndDrag: function(e) {
+        Ext.fly(this.getDragEl()).hide();
+    },
+
+    
+    
+    
+    endDrag: function(e) {
+
+        var lel = this.getEl();
+        var del = this.getDragEl();
+
+        
+        del.style.visibility = "";
+
+        this.beforeMove();
+        
+        
+        lel.style.visibility = "hidden";
+        Ext.dd.DDM.moveToEl(lel, del);
+        del.style.visibility = "hidden";
+        lel.style.visibility = "";
+
+        this.afterDrag();
+    },
+
+    beforeMove : function(){
+
+    },
+
+    afterDrag : function(){
+
+    },
+
+    toString: function() {
+        return ("DDProxy " + this.id);
+    }
+
+});
+
+Ext.dd.DDTarget = function(id, sGroup, config) {
+    if (id) {
+        this.initTarget(id, sGroup, config);
+    }
+};
+
+
+Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, {
+    
+    getDragEl: Ext.emptyFn,
+    
+    isValidHandleChild: Ext.emptyFn,
+    
+    startDrag: Ext.emptyFn,
+    
+    endDrag: Ext.emptyFn,
+    
+    onDrag: Ext.emptyFn,
+    
+    onDragDrop: Ext.emptyFn,
+    
+    onDragEnter: Ext.emptyFn,
+    
+    onDragOut: Ext.emptyFn,
+    
+    onDragOver: Ext.emptyFn,
+    
+    onInvalidDrop: Ext.emptyFn,
+    
+    onMouseDown: Ext.emptyFn,
+    
+    onMouseUp: Ext.emptyFn,
+    
+    setXConstraint: Ext.emptyFn,
+    
+    setYConstraint: Ext.emptyFn,
+    
+    resetConstraints: Ext.emptyFn,
+    
+    clearConstraints: Ext.emptyFn,
+    
+    clearTicks: Ext.emptyFn,
+    
+    setInitPosition: Ext.emptyFn,
+    
+    setDragElId: Ext.emptyFn,
+    
+    setHandleElId: Ext.emptyFn,
+    
+    setOuterHandleElId: Ext.emptyFn,
+    
+    addInvalidHandleClass: Ext.emptyFn,
+    
+    addInvalidHandleId: Ext.emptyFn,
+    
+    addInvalidHandleType: Ext.emptyFn,
+    
+    removeInvalidHandleClass: Ext.emptyFn,
+    
+    removeInvalidHandleId: Ext.emptyFn,
+    
+    removeInvalidHandleType: Ext.emptyFn,
+
+    toString: function() {
+        return ("DDTarget " + this.id);
+    }
+});
+Ext.dd.DragTracker = Ext.extend(Ext.util.Observable,  {    
+       
+    active: false,
+       
+    tolerance: 5,
+       
+    autoStart: false,
+    
+    constructor : function(config){
+        Ext.apply(this, config);
+           this.addEvents(
+               
+               'mousedown',
+               
+               'mouseup',
+               
+               'mousemove',
+               
+               'dragstart',
+               
+               'dragend',
+               
+               'drag'
+           );
+       
+           this.dragRegion = new Ext.lib.Region(0,0,0,0);
+       
+           if(this.el){
+               this.initEl(this.el);
+           }
+        Ext.dd.DragTracker.superclass.constructor.call(this, config);
+    },
+
+    initEl: function(el){
+        this.el = Ext.get(el);
+        el.on('mousedown', this.onMouseDown, this,
+                this.delegate ? {delegate: this.delegate} : undefined);
+    },
+
+    destroy : function(){
+        this.el.un('mousedown', this.onMouseDown, this);
+        delete this.el;
+    },
+
+    onMouseDown: function(e, target){
+        if(this.fireEvent('mousedown', this, e) !== false && this.onBeforeStart(e) !== false){
+            this.startXY = this.lastXY = e.getXY();
+            this.dragTarget = this.delegate ? target : this.el.dom;
+            if(this.preventDefault !== false){
+                e.preventDefault();
+            }
+            Ext.getDoc().on({
+                scope: this,
+                mouseup: this.onMouseUp,
+                mousemove: this.onMouseMove,
+                selectstart: this.stopSelect
+            });
+            if(this.autoStart){
+                this.timer = this.triggerStart.defer(this.autoStart === true ? 1000 : this.autoStart, this, [e]);
+            }
+        }
+    },
+
+    onMouseMove: function(e, target){
+        
+        if(this.active && Ext.isIE && !e.browserEvent.button){
+            e.preventDefault();
+            this.onMouseUp(e);
+            return;
+        }
+
+        e.preventDefault();
+        var xy = e.getXY(), s = this.startXY;
+        this.lastXY = xy;
+        if(!this.active){
+            if(Math.abs(s[0]-xy[0]) > this.tolerance || Math.abs(s[1]-xy[1]) > this.tolerance){
+                this.triggerStart(e);
+            }else{
+                return;
+            }
+        }
+        this.fireEvent('mousemove', this, e);
+        this.onDrag(e);
+        this.fireEvent('drag', this, e);
+    },
+
+    onMouseUp: function(e) {
+        var doc = Ext.getDoc(),
+            wasActive = this.active;
+            
+        doc.un('mousemove', this.onMouseMove, this);
+        doc.un('mouseup', this.onMouseUp, this);
+        doc.un('selectstart', this.stopSelect, this);
+        e.preventDefault();
+        this.clearStart();
+        this.active = false;
+        delete this.elRegion;
+        this.fireEvent('mouseup', this, e);
+        if(wasActive){
+            this.onEnd(e);
+            this.fireEvent('dragend', this, e);
+        }
+    },
+
+    triggerStart: function(e) {
+        this.clearStart();
+        this.active = true;
+        this.onStart(e);
+        this.fireEvent('dragstart', this, e);
+    },
+
+    clearStart : function() {
+        if(this.timer){
+            clearTimeout(this.timer);
+            delete this.timer;
+        }
+    },
+
+    stopSelect : function(e) {
+        e.stopEvent();
+        return false;
+    },
+    
+    
+    onBeforeStart : function(e) {
+
+    },
+
+    
+    onStart : function(xy) {
+
+    },
+
+    
+    onDrag : function(e) {
+
+    },
+
+    
+    onEnd : function(e) {
+
+    },
+
+    
+    getDragTarget : function(){
+        return this.dragTarget;
+    },
+
+    getDragCt : function(){
+        return this.el;
+    },
+
+    getXY : function(constrain){
+        return constrain ?
+               this.constrainModes[constrain].call(this, this.lastXY) : this.lastXY;
+    },
+
+    getOffset : function(constrain){
+        var xy = this.getXY(constrain),
+            s = this.startXY;
+        return [s[0]-xy[0], s[1]-xy[1]];
+    },
+
+    constrainModes: {
+        'point' : function(xy){
+
+            if(!this.elRegion){
+                this.elRegion = this.getDragCt().getRegion();
+            }
+
+            var dr = this.dragRegion;
+
+            dr.left = xy[0];
+            dr.top = xy[1];
+            dr.right = xy[0];
+            dr.bottom = xy[1];
+
+            dr.constrainTo(this.elRegion);
+
+            return [dr.left, dr.top];
+        }
+    }
+});
+Ext.dd.ScrollManager = function(){
+    var ddm = Ext.dd.DragDropMgr;
+    var els = {};
+    var dragEl = null;
+    var proc = {};
+    
+    var onStop = function(e){
+        dragEl = null;
+        clearProc();
+    };
+    
+    var triggerRefresh = function(){
+        if(ddm.dragCurrent){
+             ddm.refreshCache(ddm.dragCurrent.groups);
+        }
+    };
+    
+    var doScroll = function(){
+        if(ddm.dragCurrent){
+            var dds = Ext.dd.ScrollManager;
+            var inc = proc.el.ddScrollConfig ?
+                      proc.el.ddScrollConfig.increment : dds.increment;
+            if(!dds.animate){
+                if(proc.el.scroll(proc.dir, inc)){
+                    triggerRefresh();
+                }
+            }else{
+                proc.el.scroll(proc.dir, inc, true, dds.animDuration, triggerRefresh);
+            }
+        }
+    };
+    
+    var clearProc = function(){
+        if(proc.id){
+            clearInterval(proc.id);
+        }
+        proc.id = 0;
+        proc.el = null;
+        proc.dir = "";
+    };
+
+    var startProc = function(el, dir){
+        clearProc();
+        proc.el = el;
+        proc.dir = dir;
+        var group = el.ddScrollConfig ? el.ddScrollConfig.ddGroup : undefined,
+            freq  = (el.ddScrollConfig && el.ddScrollConfig.frequency)
+                  ? el.ddScrollConfig.frequency
+                  : Ext.dd.ScrollManager.frequency;
+
+        if (group === undefined || ddm.dragCurrent.ddGroup == group) {
+            proc.id = setInterval(doScroll, freq);
+        }
+    };
+    
+    var onFire = function(e, isDrop){
+        if(isDrop || !ddm.dragCurrent){ return; }
+        var dds = Ext.dd.ScrollManager;
+        if(!dragEl || dragEl != ddm.dragCurrent){
+            dragEl = ddm.dragCurrent;
+            
+            dds.refreshCache();
+        }
+        
+        var xy = Ext.lib.Event.getXY(e);
+        var pt = new Ext.lib.Point(xy[0], xy[1]);
+        for(var id in els){
+            var el = els[id], r = el._region;
+            var c = el.ddScrollConfig ? el.ddScrollConfig : dds;
+            if(r && r.contains(pt) && el.isScrollable()){
+                if(r.bottom - pt.y <= c.vthresh){
+                    if(proc.el != el){
+                        startProc(el, "down");
+                    }
+                    return;
+                }else if(r.right - pt.x <= c.hthresh){
+                    if(proc.el != el){
+                        startProc(el, "left");
+                    }
+                    return;
+                }else if(pt.y - r.top <= c.vthresh){
+                    if(proc.el != el){
+                        startProc(el, "up");
+                    }
+                    return;
+                }else if(pt.x - r.left <= c.hthresh){
+                    if(proc.el != el){
+                        startProc(el, "right");
+                    }
+                    return;
+                }
+            }
+        }
+        clearProc();
+    };
+    
+    ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm);
+    ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm);
+    
+    return {
+        
+        register : function(el){
+            if(Ext.isArray(el)){
+                for(var i = 0, len = el.length; i < len; i++) {
+                       this.register(el[i]);
+                }
+            }else{
+                el = Ext.get(el);
+                els[el.id] = el;
+            }
+        },
+        
+        
+        unregister : function(el){
+            if(Ext.isArray(el)){
+                for(var i = 0, len = el.length; i < len; i++) {
+                       this.unregister(el[i]);
+                }
+            }else{
+                el = Ext.get(el);
+                delete els[el.id];
+            }
+        },
+        
+        
+        vthresh : 25,
+        
+        hthresh : 25,
+
+        
+        increment : 100,
+        
+        
+        frequency : 500,
+        
+        
+        animate: true,
+        
+        
+        animDuration: .4,
+        
+        
+        ddGroup: undefined,
+        
+        
+        refreshCache : function(){
+            for(var id in els){
+                if(typeof els[id] == 'object'){ 
+                    els[id]._region = els[id].getRegion();
+                }
+            }
+        }
+    };
+}();
+Ext.dd.Registry = function(){
+    var elements = {}; 
+    var handles = {}; 
+    var autoIdSeed = 0;
+
+    var getId = function(el, autogen){
+        if(typeof el == "string"){
+            return el;
+        }
+        var id = el.id;
+        if(!id && autogen !== false){
+            id = "extdd-" + (++autoIdSeed);
+            el.id = id;
+        }
+        return id;
+    };
+    
+    return {
+    
+        register : function(el, data){
+            data = data || {};
+            if(typeof el == "string"){
+                el = document.getElementById(el);
+            }
+            data.ddel = el;
+            elements[getId(el)] = data;
+            if(data.isHandle !== false){
+                handles[data.ddel.id] = data;
+            }
+            if(data.handles){
+                var hs = data.handles;
+                for(var i = 0, len = hs.length; i < len; i++){
+                       handles[getId(hs[i])] = data;
+                }
+            }
+        },
+
+    
+        unregister : function(el){
+            var id = getId(el, false);
+            var data = elements[id];
+            if(data){
+                delete elements[id];
+                if(data.handles){
+                    var hs = data.handles;
+                    for(var i = 0, len = hs.length; i < len; i++){
+                       delete handles[getId(hs[i], false)];
+                    }
+                }
+            }
+        },
+
+    
+        getHandle : function(id){
+            if(typeof id != "string"){ 
+                id = id.id;
+            }
+            return handles[id];
+        },
+
+    
+        getHandleFromEvent : function(e){
+            var t = Ext.lib.Event.getTarget(e);
+            return t ? handles[t.id] : null;
+        },
+
+    
+        getTarget : function(id){
+            if(typeof id != "string"){ 
+                id = id.id;
+            }
+            return elements[id];
+        },
+
+    
+        getTargetFromEvent : function(e){
+            var t = Ext.lib.Event.getTarget(e);
+            return t ? elements[t.id] || handles[t.id] : null;
+        }
+    };
+}();
+Ext.dd.StatusProxy = function(config){
+    Ext.apply(this, config);
+    this.id = this.id || Ext.id();
+    this.el = new Ext.Layer({
+        dh: {
+            id: this.id, tag: "div", cls: "x-dd-drag-proxy "+this.dropNotAllowed, children: [
+                {tag: "div", cls: "x-dd-drop-icon"},
+                {tag: "div", cls: "x-dd-drag-ghost"}
+            ]
+        }, 
+        shadow: !config || config.shadow !== false
+    });
+    this.ghost = Ext.get(this.el.dom.childNodes[1]);
+    this.dropStatus = this.dropNotAllowed;
+};
+
+Ext.dd.StatusProxy.prototype = {
+    
+    dropAllowed : "x-dd-drop-ok",
+    
+    dropNotAllowed : "x-dd-drop-nodrop",
+
+    
+    setStatus : function(cssClass){
+        cssClass = cssClass || this.dropNotAllowed;
+        if(this.dropStatus != cssClass){
+            this.el.replaceClass(this.dropStatus, cssClass);
+            this.dropStatus = cssClass;
+        }
+    },
+
+    
+    reset : function(clearGhost){
+        this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed;
+        this.dropStatus = this.dropNotAllowed;
+        if(clearGhost){
+            this.ghost.update("");
+        }
+    },
+
+    
+    update : function(html){
+        if(typeof html == "string"){
+            this.ghost.update(html);
+        }else{
+            this.ghost.update("");
+            html.style.margin = "0";
+            this.ghost.dom.appendChild(html);
+        }
+        var el = this.ghost.dom.firstChild; 
+        if(el){
+            Ext.fly(el).setStyle('float', 'none');
+        }
+    },
+
+    
+    getEl : function(){
+        return this.el;
+    },
+
+    
+    getGhost : function(){
+        return this.ghost;
+    },
+
+    
+    hide : function(clear){
+        this.el.hide();
+        if(clear){
+            this.reset(true);
+        }
+    },
+
+    
+    stop : function(){
+        if(this.anim && this.anim.isAnimated && this.anim.isAnimated()){
+            this.anim.stop();
+        }
+    },
+
+    
+    show : function(){
+        this.el.show();
+    },
+
+    
+    sync : function(){
+        this.el.sync();
+    },
+
+    
+    repair : function(xy, callback, scope){
+        this.callback = callback;
+        this.scope = scope;
+        if(xy && this.animRepair !== false){
+            this.el.addClass("x-dd-drag-repair");
+            this.el.hideUnders(true);
+            this.anim = this.el.shift({
+                duration: this.repairDuration || .5,
+                easing: 'easeOut',
+                xy: xy,
+                stopFx: true,
+                callback: this.afterRepair,
+                scope: this
+            });
+        }else{
+            this.afterRepair();
+        }
+    },
+
+    
+    afterRepair : function(){
+        this.hide(true);
+        if(typeof this.callback == "function"){
+            this.callback.call(this.scope || this);
+        }
+        this.callback = null;
+        this.scope = null;
+    },
+    
+    destroy: function(){
+        Ext.destroy(this.ghost, this.el);    
+    }
+};
+Ext.dd.DragSource = function(el, config){
+    this.el = Ext.get(el);
+    if(!this.dragData){
+        this.dragData = {};
+    }
+    
+    Ext.apply(this, config);
+    
+    if(!this.proxy){
+        this.proxy = new Ext.dd.StatusProxy();
+    }
+    Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, 
+          {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true});
+    
+    this.dragging = false;
+};
+
+Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, {
+    
+    
+    dropAllowed : "x-dd-drop-ok",
+    
+    dropNotAllowed : "x-dd-drop-nodrop",
+
+    
+    getDragData : function(e){
+        return this.dragData;
+    },
+
+    
+    onDragEnter : function(e, id){
+        var target = Ext.dd.DragDropMgr.getDDById(id);
+        this.cachedTarget = target;
+        if(this.beforeDragEnter(target, e, id) !== false){
+            if(target.isNotifyTarget){
+                var status = target.notifyEnter(this, e, this.dragData);
+                this.proxy.setStatus(status);
+            }else{
+                this.proxy.setStatus(this.dropAllowed);
+            }
+            
+            if(this.afterDragEnter){
+                
+                this.afterDragEnter(target, e, id);
+            }
+        }
+    },
+
+    
+    beforeDragEnter : function(target, e, id){
+        return true;
+    },
+
+    
+    alignElWithMouse: function() {
+        Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments);
+        this.proxy.sync();
+    },
+
+    
+    onDragOver : function(e, id){
+        var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
+        if(this.beforeDragOver(target, e, id) !== false){
+            if(target.isNotifyTarget){
+                var status = target.notifyOver(this, e, this.dragData);
+                this.proxy.setStatus(status);
+            }
+
+            if(this.afterDragOver){
+                
+                this.afterDragOver(target, e, id);
+            }
+        }
+    },
+
+    
+    beforeDragOver : function(target, e, id){
+        return true;
+    },
+
+    
+    onDragOut : function(e, id){
+        var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
+        if(this.beforeDragOut(target, e, id) !== false){
+            if(target.isNotifyTarget){
+                target.notifyOut(this, e, this.dragData);
+            }
+            this.proxy.reset();
+            if(this.afterDragOut){
+                
+                this.afterDragOut(target, e, id);
+            }
+        }
+        this.cachedTarget = null;
+    },
+
+    
+    beforeDragOut : function(target, e, id){
+        return true;
+    },
+    
+    
+    onDragDrop : function(e, id){
+        var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);
+        if(this.beforeDragDrop(target, e, id) !== false){
+            if(target.isNotifyTarget){
+                if(target.notifyDrop(this, e, this.dragData)){ 
+                    this.onValidDrop(target, e, id);
+                }else{
+                    this.onInvalidDrop(target, e, id);
+                }
+            }else{
+                this.onValidDrop(target, e, id);
+            }
+            
+            if(this.afterDragDrop){
+                
+                this.afterDragDrop(target, e, id);
+            }
+        }
+        delete this.cachedTarget;
+    },
+
+    
+    beforeDragDrop : function(target, e, id){
+        return true;
+    },
+
+    
+    onValidDrop : function(target, e, id){
+        this.hideProxy();
+        if(this.afterValidDrop){
+            
+            this.afterValidDrop(target, e, id);
+        }
+    },
+
+    
+    getRepairXY : function(e, data){
+        return this.el.getXY();  
+    },
+
+    
+    onInvalidDrop : function(target, e, id){
+        this.beforeInvalidDrop(target, e, id);
+        if(this.cachedTarget){
+            if(this.cachedTarget.isNotifyTarget){
+                this.cachedTarget.notifyOut(this, e, this.dragData);
+            }
+            this.cacheTarget = null;
+        }
+        this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this);
+
+        if(this.afterInvalidDrop){
+            
+            this.afterInvalidDrop(e, id);
+        }
+    },
+
+    
+    afterRepair : function(){
+        if(Ext.enableFx){
+            this.el.highlight(this.hlColor || "c3daf9");
+        }
+        this.dragging = false;
+    },
+
+    
+    beforeInvalidDrop : function(target, e, id){
+        return true;
+    },
+
+    
+    handleMouseDown : function(e){
+        if(this.dragging) {
+            return;
+        }
+        var data = this.getDragData(e);
+        if(data && this.onBeforeDrag(data, e) !== false){
+            this.dragData = data;
+            this.proxy.stop();
+            Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments);
+        } 
+    },
+
+    
+    onBeforeDrag : function(data, e){
+        return true;
+    },
+
+    
+    onStartDrag : Ext.emptyFn,
+
+    
+    startDrag : function(x, y){
+        this.proxy.reset();
+        this.dragging = true;
+        this.proxy.update("");
+        this.onInitDrag(x, y);
+        this.proxy.show();
+    },
+
+    
+    onInitDrag : function(x, y){
+        var clone = this.el.dom.cloneNode(true);
+        clone.id = Ext.id(); 
+        this.proxy.update(clone);
+        this.onStartDrag(x, y);
+        return true;
+    },
+
+    
+    getProxy : function(){
+        return this.proxy;  
+    },
+
+    
+    hideProxy : function(){
+        this.proxy.hide();  
+        this.proxy.reset(true);
+        this.dragging = false;
+    },
+
+    
+    triggerCacheRefresh : function(){
+        Ext.dd.DDM.refreshCache(this.groups);
+    },
+
+    
+    b4EndDrag: function(e) {
+    },
+
+    
+    endDrag : function(e){
+        this.onEndDrag(this.dragData, e);
+    },
+
+    
+    onEndDrag : function(data, e){
+    },
+    
+    
+    autoOffset : function(x, y) {
+        this.setDelta(-12, -20);
+    },
+    
+    destroy: function(){
+        Ext.dd.DragSource.superclass.destroy.call(this);
+        Ext.destroy(this.proxy);
+    }
+});
+Ext.dd.DropTarget = Ext.extend(Ext.dd.DDTarget, {
+    
+    constructor : function(el, config){
+        this.el = Ext.get(el);
+    
+        Ext.apply(this, config);
+    
+        if(this.containerScroll){
+            Ext.dd.ScrollManager.register(this.el);
+        }
+    
+        Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, 
+              {isTarget: true});        
+    },
+    
+    
+    
+    
+    dropAllowed : "x-dd-drop-ok",
+    
+    dropNotAllowed : "x-dd-drop-nodrop",
+
+    
+    isTarget : true,
+
+    
+    isNotifyTarget : true,
+
+    
+    notifyEnter : function(dd, e, data){
+        if(this.overClass){
+            this.el.addClass(this.overClass);
+        }
+        return this.dropAllowed;
+    },
+
+    
+    notifyOver : function(dd, e, data){
+        return this.dropAllowed;
+    },
+
+    
+    notifyOut : function(dd, e, data){
+        if(this.overClass){
+            this.el.removeClass(this.overClass);
+        }
+    },
+
+    
+    notifyDrop : function(dd, e, data){
+        return false;
+    },
+    
+    destroy : function(){
+        Ext.dd.DropTarget.superclass.destroy.call(this);
+        if(this.containerScroll){
+            Ext.dd.ScrollManager.unregister(this.el);
+        }
+    }
+});
+Ext.dd.DragZone = Ext.extend(Ext.dd.DragSource, {
+    
+    constructor : function(el, config){
+        Ext.dd.DragZone.superclass.constructor.call(this, el, config);
+        if(this.containerScroll){
+            Ext.dd.ScrollManager.register(this.el);
+        }
+    },
+    
+    
+    
+    
+
+    
+    getDragData : function(e){
+        return Ext.dd.Registry.getHandleFromEvent(e);
+    },
+    
+    
+    onInitDrag : function(x, y){
+        this.proxy.update(this.dragData.ddel.cloneNode(true));
+        this.onStartDrag(x, y);
+        return true;
+    },
+    
+    
+    afterRepair : function(){
+        if(Ext.enableFx){
+            Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9");
+        }
+        this.dragging = false;
+    },
+
+    
+    getRepairXY : function(e){
+        return Ext.Element.fly(this.dragData.ddel).getXY();  
+    },
+    
+    destroy : function(){
+        Ext.dd.DragZone.superclass.destroy.call(this);
+        if(this.containerScroll){
+            Ext.dd.ScrollManager.unregister(this.el);
+        }
+    }
+});
+Ext.dd.DropZone = function(el, config){
+    Ext.dd.DropZone.superclass.constructor.call(this, el, config);
+};
+
+Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, {
+    
+    getTargetFromEvent : function(e){
+        return Ext.dd.Registry.getTargetFromEvent(e);
+    },
+
+    
+    onNodeEnter : function(n, dd, e, data){
+        
+    },
+
+    
+    onNodeOver : function(n, dd, e, data){
+        return this.dropAllowed;
+    },
+
+    
+    onNodeOut : function(n, dd, e, data){
+        
+    },
+
+    
+    onNodeDrop : function(n, dd, e, data){
+        return false;
+    },
+
+    
+    onContainerOver : function(dd, e, data){
+        return this.dropNotAllowed;
+    },
+
+    
+    onContainerDrop : function(dd, e, data){
+        return false;
+    },
+
+    
+    notifyEnter : function(dd, e, data){
+        return this.dropNotAllowed;
+    },
+
+    
+    notifyOver : function(dd, e, data){
+        var n = this.getTargetFromEvent(e);
+        if(!n){ 
+            if(this.lastOverNode){
+                this.onNodeOut(this.lastOverNode, dd, e, data);
+                this.lastOverNode = null;
+            }
+            return this.onContainerOver(dd, e, data);
+        }
+        if(this.lastOverNode != n){
+            if(this.lastOverNode){
+                this.onNodeOut(this.lastOverNode, dd, e, data);
+            }
+            this.onNodeEnter(n, dd, e, data);
+            this.lastOverNode = n;
+        }
+        return this.onNodeOver(n, dd, e, data);
+    },
+
+    
+    notifyOut : function(dd, e, data){
+        if(this.lastOverNode){
+            this.onNodeOut(this.lastOverNode, dd, e, data);
+            this.lastOverNode = null;
+        }
+    },
+
+    
+    notifyDrop : function(dd, e, data){
+        if(this.lastOverNode){
+            this.onNodeOut(this.lastOverNode, dd, e, data);
+            this.lastOverNode = null;
+        }
+        var n = this.getTargetFromEvent(e);
+        return n ?
+            this.onNodeDrop(n, dd, e, data) :
+            this.onContainerDrop(dd, e, data);
+    },
+
+    
+    triggerCacheRefresh : function(){
+        Ext.dd.DDM.refreshCache(this.groups);
+    }  
+});
+Ext.Element.addMethods({
+    
+    initDD : function(group, config, overrides){
+        var dd = new Ext.dd.DD(Ext.id(this.dom), group, config);
+        return Ext.apply(dd, overrides);
+    },
+
+    
+    initDDProxy : function(group, config, overrides){
+        var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config);
+        return Ext.apply(dd, overrides);
+    },
+
+    
+    initDDTarget : function(group, config, overrides){
+        var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config);
+        return Ext.apply(dd, overrides);
+    }
+});
+
+Ext.data.Api = (function() {
+
+    
+    
+    
+    
+    var validActions = {};
+
+    return {
+        
+        actions : {
+            create  : 'create',
+            read    : 'read',
+            update  : 'update',
+            destroy : 'destroy'
+        },
+
+        
+        restActions : {
+            create  : 'POST',
+            read    : 'GET',
+            update  : 'PUT',
+            destroy : 'DELETE'
+        },
+
+        
+        isAction : function(action) {
+            return (Ext.data.Api.actions[action]) ? true : false;
+        },
+
+        
+        getVerb : function(name) {
+            if (validActions[name]) {
+                return validActions[name];  
+            }
+            for (var verb in this.actions) {
+                if (this.actions[verb] === name) {
+                    validActions[name] = verb;
+                    break;
+                }
+            }
+            return (validActions[name] !== undefined) ? validActions[name] : null;
+        },
+
+        
+        isValid : function(api){
+            var invalid = [];
+            var crud = this.actions; 
+            for (var action in api) {
+                if (!(action in crud)) {
+                    invalid.push(action);
+                }
+            }
+            return (!invalid.length) ? true : invalid;
+        },
+
+        
+        hasUniqueUrl : function(proxy, verb) {
+            var url = (proxy.api[verb]) ? proxy.api[verb].url : null;
+            var unique = true;
+            for (var action in proxy.api) {
+                if ((unique = (action === verb) ? true : (proxy.api[action].url != url) ? true : false) === false) {
+                    break;
+                }
+            }
+            return unique;
+        },
+
+        
+        prepare : function(proxy) {
+            if (!proxy.api) {
+                proxy.api = {}; 
+            }
+            for (var verb in this.actions) {
+                var action = this.actions[verb];
+                proxy.api[action] = proxy.api[action] || proxy.url || proxy.directFn;
+                if (typeof(proxy.api[action]) == 'string') {
+                    proxy.api[action] = {
+                        url: proxy.api[action],
+                        method: (proxy.restful === true) ? Ext.data.Api.restActions[action] : undefined
+                    };
+                }
+            }
+        },
+
+        
+        restify : function(proxy) {
+            proxy.restful = true;
+            for (var verb in this.restActions) {
+                proxy.api[this.actions[verb]].method ||
+                    (proxy.api[this.actions[verb]].method = this.restActions[verb]);
+            }
+            
+            
+            proxy.onWrite = proxy.onWrite.createInterceptor(function(action, o, response, rs) {
+                var reader = o.reader;
+                var res = new Ext.data.Response({
+                    action: action,
+                    raw: response
+                });
+
+                switch (response.status) {
+                    case 200:   
+                        return true;
+                        break;
+                    case 201:   
+                        if (Ext.isEmpty(res.raw.responseText)) {
+                          res.success = true;
+                        } else {
+                          
+                          return true;
+                        }
+                        break;
+                    case 204:  
+                        res.success = true;
+                        res.data = null;
+                        break;
+                    default:
+                        return true;
+                        break;
+                }
+                if (res.success === true) {
+                    this.fireEvent("write", this, action, res.data, res, rs, o.request.arg);
+                } else {
+                    this.fireEvent('exception', this, 'remote', action, o, res, rs);
+                }
+                o.request.callback.call(o.request.scope, res.data, res, res.success);
+
+                return false;   
+            }, proxy);
+        }
+    };
+})();
+
+
+Ext.data.Response = function(params, response) {
+    Ext.apply(this, params, {
+        raw: response
+    });
+};
+Ext.data.Response.prototype = {
+    message : null,
+    success : false,
+    status : null,
+    root : null,
+    raw : null,
+
+    getMessage : function() {
+        return this.message;
+    },
+    getSuccess : function() {
+        return this.success;
+    },
+    getStatus : function() {
+        return this.status;
+    },
+    getRoot : function() {
+        return this.root;
+    },
+    getRawResponse : function() {
+        return this.raw;
+    }
+};
+
+
+Ext.data.Api.Error = Ext.extend(Ext.Error, {
+    constructor : function(message, arg) {
+        this.arg = arg;
+        Ext.Error.call(this, message);
+    },
+    name: 'Ext.data.Api'
+});
+Ext.apply(Ext.data.Api.Error.prototype, {
+    lang: {
+        'action-url-undefined': 'No fallback url defined for this action.  When defining a DataProxy api, please be sure to define an url for each CRUD action in Ext.data.Api.actions or define a default url in addition to your api-configuration.',
+        'invalid': 'received an invalid API-configuration.  Please ensure your proxy API-configuration contains only the actions defined in Ext.data.Api.actions',
+        'invalid-url': 'Invalid url.  Please review your proxy configuration.',
+        'execute': 'Attempted to execute an unknown action.  Valid API actions are defined in Ext.data.Api.actions"'
+    }
+});
+
+
+
+
+Ext.data.SortTypes = {
+    
+    none : function(s){
+        return s;
+    },
+    
+    
+    stripTagsRE : /<\/?[^>]+>/gi,
+    
+    
+    asText : function(s){
+        return String(s).replace(this.stripTagsRE, "");
+    },
+    
+    
+    asUCText : function(s){
+        return String(s).toUpperCase().replace(this.stripTagsRE, "");
+    },
+    
+    
+    asUCString : function(s) {
+       return String(s).toUpperCase();
+    },
+    
+    
+    asDate : function(s) {
+        if(!s){
+            return 0;
+        }
+        if(Ext.isDate(s)){
+            return s.getTime();
+        }
+       return Date.parse(String(s));
+    },
+    
+    
+    asFloat : function(s) {
+       var val = parseFloat(String(s).replace(/,/g, ""));
+       return isNaN(val) ? 0 : val;
+    },
+    
+    
+    asInt : function(s) {
+        var val = parseInt(String(s).replace(/,/g, ""), 10);
+        return isNaN(val) ? 0 : val;
+    }
+};
+Ext.data.Record = function(data, id){
+    
+    this.id = (id || id === 0) ? id : Ext.data.Record.id(this);
+    this.data = data || {};
+};
+
+
+Ext.data.Record.create = function(o){
+    var f = Ext.extend(Ext.data.Record, {});
+    var p = f.prototype;
+    p.fields = new Ext.util.MixedCollection(false, function(field){
+        return field.name;
+    });
+    for(var i = 0, len = o.length; i < len; i++){
+        p.fields.add(new Ext.data.Field(o[i]));
+    }
+    f.getField = function(name){
+        return p.fields.get(name);
+    };
+    return f;
+};
+
+Ext.data.Record.PREFIX = 'ext-record';
+Ext.data.Record.AUTO_ID = 1;
+Ext.data.Record.EDIT = 'edit';
+Ext.data.Record.REJECT = 'reject';
+Ext.data.Record.COMMIT = 'commit';
+
+
+
+Ext.data.Record.id = function(rec) {
+    rec.phantom = true;
+    return [Ext.data.Record.PREFIX, '-', Ext.data.Record.AUTO_ID++].join('');
+};
+
+Ext.data.Record.prototype = {
+    
+    
+    
+    
+    
+    
+    dirty : false,
+    editing : false,
+    error : null,
+    
+    modified : null,
+    
+    phantom : false,
+
+    
+    join : function(store){
+        
+        this.store = store;
+    },
+
+    
+    set : function(name, value){
+        var encode = Ext.isPrimitive(value) ? String : Ext.encode;
+        if(encode(this.data[name]) == encode(value)) {
+            return;
+        }        
+        this.dirty = true;
+        if(!this.modified){
+            this.modified = {};
+        }
+        if(this.modified[name] === undefined){
+            this.modified[name] = this.data[name];
+        }
+        this.data[name] = value;
+        if(!this.editing){
+            this.afterEdit();
+        }
+    },
+
+    
+    afterEdit : function(){
+        if (this.store != undefined && typeof this.store.afterEdit == "function") {
+            this.store.afterEdit(this);
+        }
+    },
+
+    
+    afterReject : function(){
+        if(this.store){
+            this.store.afterReject(this);
+        }
+    },
+
+    
+    afterCommit : function(){
+        if(this.store){
+            this.store.afterCommit(this);
+        }
+    },
+
+    
+    get : function(name){
+        return this.data[name];
+    },
+
+    
+    beginEdit : function(){
+        this.editing = true;
+        this.modified = this.modified || {};
+    },
+
+    
+    cancelEdit : function(){
+        this.editing = false;
+        delete this.modified;
+    },
+
+    
+    endEdit : function(){
+        this.editing = false;
+        if(this.dirty){
+            this.afterEdit();
+        }
+    },
+
+    
+    reject : function(silent){
+        var m = this.modified;
+        for(var n in m){
+            if(typeof m[n] != "function"){
+                this.data[n] = m[n];
+            }
+        }
+        this.dirty = false;
+        delete this.modified;
+        this.editing = false;
+        if(silent !== true){
+            this.afterReject();
+        }
+    },
+
+    
+    commit : function(silent){
+        this.dirty = false;
+        delete this.modified;
+        this.editing = false;
+        if(silent !== true){
+            this.afterCommit();
+        }
+    },
+
+    
+    getChanges : function(){
+        var m = this.modified, cs = {};
+        for(var n in m){
+            if(m.hasOwnProperty(n)){
+                cs[n] = this.data[n];
+            }
+        }
+        return cs;
+    },
+
+    
+    hasError : function(){
+        return this.error !== null;
+    },
+
+    
+    clearError : function(){
+        this.error = null;
+    },
+
+    
+    copy : function(newId) {
+        return new this.constructor(Ext.apply({}, this.data), newId || this.id);
+    },
+
+    
+    isModified : function(fieldName){
+        return !!(this.modified && this.modified.hasOwnProperty(fieldName));
+    },
+
+    
+    isValid : function() {
+        return this.fields.find(function(f) {
+            return (f.allowBlank === false && Ext.isEmpty(this.data[f.name])) ? true : false;
+        },this) ? false : true;
+    },
+
+    
+    markDirty : function(){
+        this.dirty = true;
+        if(!this.modified){
+            this.modified = {};
+        }
+        this.fields.each(function(f) {
+            this.modified[f.name] = this.data[f.name];
+        },this);
+    }
+};
+
+Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), {
+    
+
+    
+    register : function(){
+        for(var i = 0, s; (s = arguments[i]); i++){
+            this.add(s);
+        }
+    },
+
+    
+    unregister : function(){
+        for(var i = 0, s; (s = arguments[i]); i++){
+            this.remove(this.lookup(s));
+        }
+    },
+
+    
+    lookup : function(id){
+        if(Ext.isArray(id)){
+            var fields = ['field1'], expand = !Ext.isArray(id[0]);
+            if(!expand){
+                for(var i = 2, len = id[0].length; i <= len; ++i){
+                    fields.push('field' + i);
+                }
+            }
+            return new Ext.data.ArrayStore({
+                fields: fields,
+                data: id,
+                expandData: expand,
+                autoDestroy: true,
+                autoCreated: true
+
+            });
+        }
+        return Ext.isObject(id) ? (id.events ? id : Ext.create(id, 'store')) : this.get(id);
+    },
+
+    
+    getKey : function(o){
+         return o.storeId;
+    }
+});
+Ext.data.Store = Ext.extend(Ext.util.Observable, {
+    
+    
+    
+    
+    
+    
+    
+    writer : undefined,
+    
+    
+    
+    remoteSort : false,
+
+    
+    autoDestroy : false,
+
+    
+    pruneModifiedRecords : false,
+
+    
+    lastOptions : null,
+
+    
+    autoSave : true,
+
+    
+    batch : true,
+
+    
+    restful: false,
+
+    
+    paramNames : undefined,
+
+    
+    defaultParamNames : {
+        start : 'start',
+        limit : 'limit',
+        sort : 'sort',
+        dir : 'dir'
+    },
+
+    isDestroyed: false,    
+    hasMultiSort: false,
+
+    
+    batchKey : '_ext_batch_',
+
+    constructor : function(config){
+        
+        
+        
+        
+        this.data = new Ext.util.MixedCollection(false);
+        this.data.getKey = function(o){
+            return o.id;
+        };
+        
+
+        
+        this.removed = [];
+
+        if(config && config.data){
+            this.inlineData = config.data;
+            delete config.data;
+        }
+
+        Ext.apply(this, config);
+
+        
+        this.baseParams = Ext.isObject(this.baseParams) ? this.baseParams : {};
+
+        this.paramNames = Ext.applyIf(this.paramNames || {}, this.defaultParamNames);
+
+        if((this.url || this.api) && !this.proxy){
+            this.proxy = new Ext.data.HttpProxy({url: this.url, api: this.api});
+        }
+        
+        if (this.restful === true && this.proxy) {
+            
+            
+            this.batch = false;
+            Ext.data.Api.restify(this.proxy);
+        }
+
+        if(this.reader){ 
+            if(!this.recordType){
+                this.recordType = this.reader.recordType;
+            }
+            if(this.reader.onMetaChange){
+                this.reader.onMetaChange = this.reader.onMetaChange.createSequence(this.onMetaChange, this);
+            }
+            if (this.writer) { 
+                if (this.writer instanceof(Ext.data.DataWriter) === false) {    
+                    this.writer = this.buildWriter(this.writer);
+                }
+                this.writer.meta = this.reader.meta;
+                this.pruneModifiedRecords = true;
+            }
+        }
+
+        
+
+        if(this.recordType){
+            
+            this.fields = this.recordType.prototype.fields;
+        }
+        this.modified = [];
+
+        this.addEvents(
+            
+            'datachanged',
+            
+            'metachange',
+            
+            'add',
+            
+            'remove',
+            
+            'update',
+            
+            'clear',
+            
+            'exception',
+            
+            'beforeload',
+            
+            'load',
+            
+            'loadexception',
+            
+            'beforewrite',
+            
+            'write',
+            
+            'beforesave',
+            
+            'save'
+
+        );
+
+        if(this.proxy){
+            
+            this.relayEvents(this.proxy,  ['loadexception', 'exception']);
+        }
+        
+        if (this.writer) {
+            this.on({
+                scope: this,
+                add: this.createRecords,
+                remove: this.destroyRecord,
+                update: this.updateRecord,
+                clear: this.onClear
+            });
+        }
+
+        this.sortToggle = {};
+        if(this.sortField){
+            this.setDefaultSort(this.sortField, this.sortDir);
+        }else if(this.sortInfo){
+            this.setDefaultSort(this.sortInfo.field, this.sortInfo.direction);
+        }
+
+        Ext.data.Store.superclass.constructor.call(this);
+
+        if(this.id){
+            this.storeId = this.id;
+            delete this.id;
+        }
+        if(this.storeId){
+            Ext.StoreMgr.register(this);
+        }
+        if(this.inlineData){
+            this.loadData(this.inlineData);
+            delete this.inlineData;
+        }else if(this.autoLoad){
+            this.load.defer(10, this, [
+                typeof this.autoLoad == 'object' ?
+                    this.autoLoad : undefined]);
+        }
+        
+        this.batchCounter = 0;
+        this.batches = {};
+    },
+
+    
+    buildWriter : function(config) {
+        var klass = undefined,
+            type = (config.format || 'json').toLowerCase();
+        switch (type) {
+            case 'json':
+                klass = Ext.data.JsonWriter;
+                break;
+            case 'xml':
+                klass = Ext.data.XmlWriter;
+                break;
+            default:
+                klass = Ext.data.JsonWriter;
+        }
+        return new klass(config);
+    },
+
+    
+    destroy : function(){
+        if(!this.isDestroyed){
+            if(this.storeId){
+                Ext.StoreMgr.unregister(this);
+            }
+            this.clearData();
+            this.data = null;
+            Ext.destroy(this.proxy);
+            this.reader = this.writer = null;
+            this.purgeListeners();
+            this.isDestroyed = true;
+        }
+    },
+
+    
+    add : function(records) {
+        var i, len, record, index;
+        
+        records = [].concat(records);
+        if (records.length < 1) {
+            return;
+        }
+        
+        for (i = 0, len = records.length; i < len; i++) {
+            record = records[i];
+            
+            record.join(this);
+            
+            if (record.dirty || record.phantom) {
+                this.modified.push(record);
+            }
+        }
+        
+        index = this.data.length;
+        this.data.addAll(records);
+        
+        if (this.snapshot) {
+            this.snapshot.addAll(records);
+        }
+        
+        this.fireEvent('add', this, records, index);
+    },
+
+    
+    addSorted : function(record){
+        var index = this.findInsertIndex(record);
+        this.insert(index, record);
+    },
+    
+    
+    doUpdate : function(rec){
+        this.data.replace(rec.id, rec);
+        if(this.snapshot){
+            this.snapshot.replace(rec.id, rec);
+        }
+        this.fireEvent('update', this, rec, Ext.data.Record.COMMIT);
+    },
+
+    
+    remove : function(record){
+        if(Ext.isArray(record)){
+            Ext.each(record, function(r){
+                this.remove(r);
+            }, this);
+            return;
+        }
+        var index = this.data.indexOf(record);
+        if(index > -1){
+            record.join(null);
+            this.data.removeAt(index);
+        }
+        if(this.pruneModifiedRecords){
+            this.modified.remove(record);
+        }
+        if(this.snapshot){
+            this.snapshot.remove(record);
+        }
+        if(index > -1){
+            this.fireEvent('remove', this, record, index);
+        }
+    },
+
+    
+    removeAt : function(index){
+        this.remove(this.getAt(index));
+    },
+
+    
+    removeAll : function(silent){
+        var items = [];
+        this.each(function(rec){
+            items.push(rec);
+        });
+        this.clearData();
+        if(this.snapshot){
+            this.snapshot.clear();
+        }
+        if(this.pruneModifiedRecords){
+            this.modified = [];
+        }
+        if (silent !== true) {  
+            this.fireEvent('clear', this, items);
+        }
+    },
+
+    
+    onClear: function(store, records){
+        Ext.each(records, function(rec, index){
+            this.destroyRecord(this, rec, index);
+        }, this);
+    },
+
+    
+    insert : function(index, records) {
+        var i, len, record;
+        
+        records = [].concat(records);
+        for (i = 0, len = records.length; i < len; i++) {
+            record = records[i];
+            
+            this.data.insert(index + i, record);
+            record.join(this);
+            
+            if (record.dirty || record.phantom) {
+                this.modified.push(record);
+            }
+        }
+        
+        if (this.snapshot) {
+            this.snapshot.addAll(records);
+        }
+        
+        this.fireEvent('add', this, records, index);
+    },
+
+    
+    indexOf : function(record){
+        return this.data.indexOf(record);
+    },
+
+    
+    indexOfId : function(id){
+        return this.data.indexOfKey(id);
+    },
+
+    
+    getById : function(id){
+        return (this.snapshot || this.data).key(id);
+    },
+
+    
+    getAt : function(index){
+        return this.data.itemAt(index);
+    },
+
+    
+    getRange : function(start, end){
+        return this.data.getRange(start, end);
+    },
+
+    
+    storeOptions : function(o){
+        o = Ext.apply({}, o);
+        delete o.callback;
+        delete o.scope;
+        this.lastOptions = o;
+    },
+
+    
+    clearData: function(){
+        this.data.each(function(rec) {
+            rec.join(null);
+        });
+        this.data.clear();
+    },
+
+    
+    load : function(options) {
+        options = Ext.apply({}, options);
+        this.storeOptions(options);
+        if(this.sortInfo && this.remoteSort){
+            var pn = this.paramNames;
+            options.params = Ext.apply({}, options.params);
+            options.params[pn.sort] = this.sortInfo.field;
+            options.params[pn.dir] = this.sortInfo.direction;
+        }
+        try {
+            return this.execute('read', null, options); 
+        } catch(e) {
+            this.handleException(e);
+            return false;
+        }
+    },
+
+    
+    updateRecord : function(store, record, action) {
+        if (action == Ext.data.Record.EDIT && this.autoSave === true && (!record.phantom || (record.phantom && record.isValid()))) {
+            this.save();
+        }
+    },
+
+    
+    createRecords : function(store, records, index) {
+        var modified = this.modified,
+            length   = records.length,
+            record, i;
+        
+        for (i = 0; i < length; i++) {
+            record = records[i];
+            
+            if (record.phantom && record.isValid()) {
+                record.markDirty();  
+                
+                if (modified.indexOf(record) == -1) {
+                    modified.push(record);
+                }
+            }
+        }
+        if (this.autoSave === true) {
+            this.save();
+        }
+    },
+
+    
+    destroyRecord : function(store, record, index) {
+        if (this.modified.indexOf(record) != -1) {  
+            this.modified.remove(record);
+        }
+        if (!record.phantom) {
+            this.removed.push(record);
+
+            
+            
+            
+            record.lastIndex = index;
+
+            if (this.autoSave === true) {
+                this.save();
+            }
+        }
+    },
+
+    
+    execute : function(action, rs, options,  batch) {
+        
+        if (!Ext.data.Api.isAction(action)) {
+            throw new Ext.data.Api.Error('execute', action);
+        }
+        
+        options = Ext.applyIf(options||{}, {
+            params: {}
+        });
+        if(batch !== undefined){
+            this.addToBatch(batch);
+        }
+        
+        
+        var doRequest = true;
+
+        if (action === 'read') {
+            doRequest = this.fireEvent('beforeload', this, options);
+            Ext.applyIf(options.params, this.baseParams);
+        }
+        else {
+            
+            
+            if (this.writer.listful === true && this.restful !== true) {
+                rs = (Ext.isArray(rs)) ? rs : [rs];
+            }
+            
+            else if (Ext.isArray(rs) && rs.length == 1) {
+                rs = rs.shift();
+            }
+            
+            if ((doRequest = this.fireEvent('beforewrite', this, action, rs, options)) !== false) {
+                this.writer.apply(options.params, this.baseParams, action, rs);
+            }
+        }
+        if (doRequest !== false) {
+            
+            if (this.writer && this.proxy.url && !this.proxy.restful && !Ext.data.Api.hasUniqueUrl(this.proxy, action)) {
+                options.params.xaction = action;    
+            }
+            
+            
+            
+            
+            
+            this.proxy.request(Ext.data.Api.actions[action], rs, options.params, this.reader, this.createCallback(action, rs, batch), this, options);
+        }
+        return doRequest;
+    },
+
+    
+    save : function() {
+        if (!this.writer) {
+            throw new Ext.data.Store.Error('writer-undefined');
+        }
+
+        var queue = [],
+            len,
+            trans,
+            batch,
+            data = {},
+            i;
+        
+        if(this.removed.length){
+            queue.push(['destroy', this.removed]);
+        }
+
+        
+        var rs = [].concat(this.getModifiedRecords());
+        if(rs.length){
+            
+            var phantoms = [];
+            for(i = rs.length-1; i >= 0; i--){
+                if(rs[i].phantom === true){
+                    var rec = rs.splice(i, 1).shift();
+                    if(rec.isValid()){
+                        phantoms.push(rec);
+                    }
+                }else if(!rs[i].isValid()){ 
+                    rs.splice(i,1);
+                }
+            }
+            
+            if(phantoms.length){
+                queue.push(['create', phantoms]);
+            }
+
+            
+            if(rs.length){
+                queue.push(['update', rs]);
+            }
+        }
+        len = queue.length;
+        if(len){
+            batch = ++this.batchCounter;
+            for(i = 0; i < len; ++i){
+                trans = queue[i];
+                data[trans[0]] = trans[1];
+            }
+            if(this.fireEvent('beforesave', this, data) !== false){
+                for(i = 0; i < len; ++i){
+                    trans = queue[i];
+                    this.doTransaction(trans[0], trans[1], batch);
+                }
+                return batch;
+            }
+        }
+        return -1;
+    },
+
+    
+    doTransaction : function(action, rs, batch) {
+        function transaction(records) {
+            try{
+                this.execute(action, records, undefined, batch);
+            }catch (e){
+                this.handleException(e);
+            }
+        }
+        if(this.batch === false){
+            for(var i = 0, len = rs.length; i < len; i++){
+                transaction.call(this, rs[i]);
+            }
+        }else{
+            transaction.call(this, rs);
+        }
+    },
+
+    
+    addToBatch : function(batch){
+        var b = this.batches,
+            key = this.batchKey + batch,
+            o = b[key];
+
+        if(!o){
+            b[key] = o = {
+                id: batch,
+                count: 0,
+                data: {}
+            };
+        }
+        ++o.count;
+    },
+
+    removeFromBatch : function(batch, action, data){
+        var b = this.batches,
+            key = this.batchKey + batch,
+            o = b[key],
+            arr;
+
+
+        if(o){
+            arr = o.data[action] || [];
+            o.data[action] = arr.concat(data);
+            if(o.count === 1){
+                data = o.data;
+                delete b[key];
+                this.fireEvent('save', this, batch, data);
+            }else{
+                --o.count;
+            }
+        }
+    },
+
+    
+    
+    createCallback : function(action, rs, batch) {
+        var actions = Ext.data.Api.actions;
+        return (action == 'read') ? this.loadRecords : function(data, response, success) {
+            
+            this['on' + Ext.util.Format.capitalize(action) + 'Records'](success, rs, [].concat(data));
+            
+            if (success === true) {
+                this.fireEvent('write', this, action, data, response, rs);
+            }
+            this.removeFromBatch(batch, action, data);
+        };
+    },
+
+    
+    
+    
+    clearModified : function(rs) {
+        if (Ext.isArray(rs)) {
+            for (var n=rs.length-1;n>=0;n--) {
+                this.modified.splice(this.modified.indexOf(rs[n]), 1);
+            }
+        } else {
+            this.modified.splice(this.modified.indexOf(rs), 1);
+        }
+    },
+
+    
+    reMap : function(record) {
+        if (Ext.isArray(record)) {
+            for (var i = 0, len = record.length; i < len; i++) {
+                this.reMap(record[i]);
+            }
+        } else {
+            delete this.data.map[record._phid];
+            this.data.map[record.id] = record;
+            var index = this.data.keys.indexOf(record._phid);
+            this.data.keys.splice(index, 1, record.id);
+            delete record._phid;
+        }
+    },
+
+    
+    onCreateRecords : function(success, rs, data) {
+        if (success === true) {
+            try {
+                this.reader.realize(rs, data);
+                this.reMap(rs);
+            }
+            catch (e) {
+                this.handleException(e);
+                if (Ext.isArray(rs)) {
+                    
+                    this.onCreateRecords(success, rs, data);
+                }
+            }
+        }
+    },
+
+    
+    onUpdateRecords : function(success, rs, data) {
+        if (success === true) {
+            try {
+                this.reader.update(rs, data);
+            } catch (e) {
+                this.handleException(e);
+                if (Ext.isArray(rs)) {
+                    
+                    this.onUpdateRecords(success, rs, data);
+                }
+            }
+        }
+    },
+
+    
+    onDestroyRecords : function(success, rs, data) {
+        
+        rs = (rs instanceof Ext.data.Record) ? [rs] : [].concat(rs);
+        for (var i=0,len=rs.length;i<len;i++) {
+            this.removed.splice(this.removed.indexOf(rs[i]), 1);
+        }
+        if (success === false) {
+            
+            
+            for (i=rs.length-1;i>=0;i--) {
+                this.insert(rs[i].lastIndex, rs[i]);    
+            }
+        }
+    },
+
+    
+    handleException : function(e) {
+        
+        Ext.handleError(e);
+    },
+
+    
+    reload : function(options){
+        this.load(Ext.applyIf(options||{}, this.lastOptions));
+    },
+
+    
+    
+    loadRecords : function(o, options, success){
+        var i, len;
+        
+        if (this.isDestroyed === true) {
+            return;
+        }
+        if(!o || success === false){
+            if(success !== false){
+                this.fireEvent('load', this, [], options);
+            }
+            if(options.callback){
+                options.callback.call(options.scope || this, [], options, false, o);
+            }
+            return;
+        }
+        var r = o.records, t = o.totalRecords || r.length;
+        if(!options || options.add !== true){
+            if(this.pruneModifiedRecords){
+                this.modified = [];
+            }
+            for(i = 0, len = r.length; i < len; i++){
+                r[i].join(this);
+            }
+            if(this.snapshot){
+                this.data = this.snapshot;
+                delete this.snapshot;
+            }
+            this.clearData();
+            this.data.addAll(r);
+            this.totalLength = t;
+            this.applySort();
+            this.fireEvent('datachanged', this);
+        }else{
+            var toAdd = [],
+                rec,
+                cnt = 0;
+            for(i = 0, len = r.length; i < len; ++i){
+                rec = r[i];
+                if(this.indexOfId(rec.id) > -1){
+                    this.doUpdate(rec);
+                }else{
+                    toAdd.push(rec);
+                    ++cnt;
+                }
+            }
+            this.totalLength = Math.max(t, this.data.length + cnt);
+            this.add(toAdd);
+        }
+        this.fireEvent('load', this, r, options);
+        if(options.callback){
+            options.callback.call(options.scope || this, r, options, true);
+        }
+    },
+
+    
+    loadData : function(o, append){
+        var r = this.reader.readRecords(o);
+        this.loadRecords(r, {add: append}, true);
+    },
+
+    
+    getCount : function(){
+        return this.data.length || 0;
+    },
+
+    
+    getTotalCount : function(){
+        return this.totalLength || 0;
+    },
+
+    
+    getSortState : function(){
+        return this.sortInfo;
+    },
+
+    
+    applySort : function(){
+        if ((this.sortInfo || this.multiSortInfo) && !this.remoteSort) {
+            this.sortData();
+        }
+    },
+
+    
+    sortData : function() {
+        var sortInfo  = this.hasMultiSort ? this.multiSortInfo : this.sortInfo,
+            direction = sortInfo.direction || "ASC",
+            sorters   = sortInfo.sorters,
+            sortFns   = [];
+
+        
+        if (!this.hasMultiSort) {
+            sorters = [{direction: direction, field: sortInfo.field}];
+        }
+
+        
+        for (var i=0, j = sorters.length; i < j; i++) {
+            sortFns.push(this.createSortFunction(sorters[i].field, sorters[i].direction));
+        }
+        
+        if (sortFns.length == 0) {
+            return;
+        }
+
+        
+        
+        var directionModifier = direction.toUpperCase() == "DESC" ? -1 : 1;
+
+        
+        var fn = function(r1, r2) {
+          var result = sortFns[0].call(this, r1, r2);
+
+          
+          if (sortFns.length > 1) {
+              for (var i=1, j = sortFns.length; i < j; i++) {
+                  result = result || sortFns[i].call(this, r1, r2);
+              }
+          }
+
+          return directionModifier * result;
+        };
+
+        
+        this.data.sort(direction, fn);
+        if (this.snapshot && this.snapshot != this.data) {
+            this.snapshot.sort(direction, fn);
+        }
+    },
+
+    
+    createSortFunction: function(field, direction) {
+        direction = direction || "ASC";
+        var directionModifier = direction.toUpperCase() == "DESC" ? -1 : 1;
+
+        var sortType = this.fields.get(field).sortType;
+
+        
+        
+        return function(r1, r2) {
+            var v1 = sortType(r1.data[field]),
+                v2 = sortType(r2.data[field]);
+
+            return directionModifier * (v1 > v2 ? 1 : (v1 < v2 ? -1 : 0));
+        };
+    },
+
+    
+    setDefaultSort : function(field, dir) {
+        dir = dir ? dir.toUpperCase() : 'ASC';
+        this.sortInfo = {field: field, direction: dir};
+        this.sortToggle[field] = dir;
+    },
+
+    
+    sort : function(fieldName, dir) {
+        if (Ext.isArray(arguments[0])) {
+            return this.multiSort.call(this, fieldName, dir);
+        } else {
+            return this.singleSort(fieldName, dir);
+        }
+    },
+
+    
+    singleSort: function(fieldName, dir) {
+        var field = this.fields.get(fieldName);
+        if (!field) {
+            return false;
+        }
+
+        var name       = field.name,
+            sortInfo   = this.sortInfo || null,
+            sortToggle = this.sortToggle ? this.sortToggle[name] : null;
+
+        if (!dir) {
+            if (sortInfo && sortInfo.field == name) { 
+                dir = (this.sortToggle[name] || 'ASC').toggle('ASC', 'DESC');
+            } else {
+                dir = field.sortDir;
+            }
+        }
+
+        this.sortToggle[name] = dir;
+        this.sortInfo = {field: name, direction: dir};
+        this.hasMultiSort = false;
+
+        if (this.remoteSort) {
+            if (!this.load(this.lastOptions)) {
+                if (sortToggle) {
+                    this.sortToggle[name] = sortToggle;
+                }
+                if (sortInfo) {
+                    this.sortInfo = sortInfo;
+                }
+            }
+        } else {
+            this.applySort();
+            this.fireEvent('datachanged', this);
+        }
+        return true;
+    },
+
+    
+    multiSort: function(sorters, direction) {
+        this.hasMultiSort = true;
+        direction = direction || "ASC";
+
+        
+        if (this.multiSortInfo && direction == this.multiSortInfo.direction) {
+            direction = direction.toggle("ASC", "DESC");
+        }
+
+        
+        this.multiSortInfo = {
+            sorters  : sorters,
+            direction: direction
+        };
+        
+        if (this.remoteSort) {
+            this.singleSort(sorters[0].field, sorters[0].direction);
+
+        } else {
+            this.applySort();
+            this.fireEvent('datachanged', this);
+        }
+    },
+
+    
+    each : function(fn, scope){
+        this.data.each(fn, scope);
+    },
+
+    
+    getModifiedRecords : function(){
+        return this.modified;
+    },
+
+    
+    sum : function(property, start, end){
+        var rs = this.data.items, v = 0;
+        start = start || 0;
+        end = (end || end === 0) ? end : rs.length-1;
+
+        for(var i = start; i <= end; i++){
+            v += (rs[i].data[property] || 0);
+        }
+        return v;
+    },
+
+    
+    createFilterFn : function(property, value, anyMatch, caseSensitive, exactMatch){
+        if(Ext.isEmpty(value, false)){
+            return false;
+        }
+        value = this.data.createValueMatcher(value, anyMatch, caseSensitive, exactMatch);
+        return function(r) {
+            return value.test(r.data[property]);
+        };
+    },
+
+    
+    createMultipleFilterFn: function(filters) {
+        return function(record) {
+            var isMatch = true;
+
+            for (var i=0, j = filters.length; i < j; i++) {
+                var filter = filters[i],
+                    fn     = filter.fn,
+                    scope  = filter.scope;
+
+                isMatch = isMatch && fn.call(scope, record);
+            }
+
+            return isMatch;
+        };
+    },
+
+    
+    filter : function(property, value, anyMatch, caseSensitive, exactMatch){
+        var fn;
+        
+        if (Ext.isObject(property)) {
+            property = [property];
+        }
+
+        if (Ext.isArray(property)) {
+            var filters = [];
+
+            
+            for (var i=0, j = property.length; i < j; i++) {
+                var filter = property[i],
+                    func   = filter.fn,
+                    scope  = filter.scope || this;
+
+                
+                if (!Ext.isFunction(func)) {
+                    func = this.createFilterFn(filter.property, filter.value, filter.anyMatch, filter.caseSensitive, filter.exactMatch);
+                }
+
+                filters.push({fn: func, scope: scope});
+            }
+
+            fn = this.createMultipleFilterFn(filters);
+        } else {
+            
+            fn = this.createFilterFn(property, value, anyMatch, caseSensitive, exactMatch);
+        }
+
+        return fn ? this.filterBy(fn) : this.clearFilter();
+    },
+
+    
+    filterBy : function(fn, scope){
+        this.snapshot = this.snapshot || this.data;
+        this.data = this.queryBy(fn, scope || this);
+        this.fireEvent('datachanged', this);
+    },
+
+    
+    clearFilter : function(suppressEvent){
+        if(this.isFiltered()){
+            this.data = this.snapshot;
+            delete this.snapshot;
+            if(suppressEvent !== true){
+                this.fireEvent('datachanged', this);
+            }
+        }
+    },
+
+    
+    isFiltered : function(){
+        return !!this.snapshot && this.snapshot != this.data;
+    },
+
+    
+    query : function(property, value, anyMatch, caseSensitive){
+        var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);
+        return fn ? this.queryBy(fn) : this.data.clone();
+    },
+
+    
+    queryBy : function(fn, scope){
+        var data = this.snapshot || this.data;
+        return data.filterBy(fn, scope||this);
+    },
+
+    
+    find : function(property, value, start, anyMatch, caseSensitive){
+        var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);
+        return fn ? this.data.findIndexBy(fn, null, start) : -1;
+    },
+
+    
+    findExact: function(property, value, start){
+        return this.data.findIndexBy(function(rec){
+            return rec.get(property) === value;
+        }, this, start);
+    },
+
+    
+    findBy : function(fn, scope, start){
+        return this.data.findIndexBy(fn, scope, start);
+    },
+
+    
+    collect : function(dataIndex, allowNull, bypassFilter){
+        var d = (bypassFilter === true && this.snapshot) ?
+                this.snapshot.items : this.data.items;
+        var v, sv, r = [], l = {};
+        for(var i = 0, len = d.length; i < len; i++){
+            v = d[i].data[dataIndex];
+            sv = String(v);
+            if((allowNull || !Ext.isEmpty(v)) && !l[sv]){
+                l[sv] = true;
+                r[r.length] = v;
+            }
+        }
+        return r;
+    },
+
+    
+    afterEdit : function(record){
+        if(this.modified.indexOf(record) == -1){
+            this.modified.push(record);
+        }
+        this.fireEvent('update', this, record, Ext.data.Record.EDIT);
+    },
+
+    
+    afterReject : function(record){
+        this.modified.remove(record);
+        this.fireEvent('update', this, record, Ext.data.Record.REJECT);
+    },
+
+    
+    afterCommit : function(record){
+        this.modified.remove(record);
+        this.fireEvent('update', this, record, Ext.data.Record.COMMIT);
+    },
+
+    
+    commitChanges : function(){
+        var modified = this.modified.slice(0),
+            length   = modified.length,
+            i;
+            
+        for (i = 0; i < length; i++){
+            modified[i].commit();
+        }
+        
+        this.modified = [];
+        this.removed  = [];
+    },
+
+    
+    rejectChanges : function() {
+        var modified = this.modified.slice(0),
+            removed  = this.removed.slice(0).reverse(),
+            mLength  = modified.length,
+            rLength  = removed.length,
+            i;
+        
+        for (i = 0; i < mLength; i++) {
+            modified[i].reject();
+        }
+        
+        for (i = 0; i < rLength; i++) {
+            this.insert(removed[i].lastIndex || 0, removed[i]);
+            removed[i].reject();
+        }
+        
+        this.modified = [];
+        this.removed  = [];
+    },
+
+    
+    onMetaChange : function(meta){
+        this.recordType = this.reader.recordType;
+        this.fields = this.recordType.prototype.fields;
+        delete this.snapshot;
+        if(this.reader.meta.sortInfo){
+            this.sortInfo = this.reader.meta.sortInfo;
+        }else if(this.sortInfo  && !this.fields.get(this.sortInfo.field)){
+            delete this.sortInfo;
+        }
+        if(this.writer){
+            this.writer.meta = this.reader.meta;
+        }
+        this.modified = [];
+        this.fireEvent('metachange', this, this.reader.meta);
+    },
+
+    
+    findInsertIndex : function(record){
+        this.suspendEvents();
+        var data = this.data.clone();
+        this.data.add(record);
+        this.applySort();
+        var index = this.data.indexOf(record);
+        this.data = data;
+        this.resumeEvents();
+        return index;
+    },
+
+    
+    setBaseParam : function (name, value){
+        this.baseParams = this.baseParams || {};
+        this.baseParams[name] = value;
+    }
+});
+
+Ext.reg('store', Ext.data.Store);
+
+
+Ext.data.Store.Error = Ext.extend(Ext.Error, {
+    name: 'Ext.data.Store'
+});
+Ext.apply(Ext.data.Store.Error.prototype, {
+    lang: {
+        'writer-undefined' : 'Attempted to execute a write-action without a DataWriter installed.'
+    }
+});
+
+Ext.data.Field = Ext.extend(Object, {
+    
+    constructor : function(config){
+        if(Ext.isString(config)){
+            config = {name: config};
+        }
+        Ext.apply(this, config);
+        
+        var types = Ext.data.Types,
+            st = this.sortType,
+            t;
+
+        if(this.type){
+            if(Ext.isString(this.type)){
+                this.type = Ext.data.Types[this.type.toUpperCase()] || types.AUTO;
+            }
+        }else{
+            this.type = types.AUTO;
+        }
+
+        
+        if(Ext.isString(st)){
+            this.sortType = Ext.data.SortTypes[st];
+        }else if(Ext.isEmpty(st)){
+            this.sortType = this.type.sortType;
+        }
+
+        if(!this.convert){
+            this.convert = this.type.convert;
+        }
+    },
+    
+    
+    
+    
+    
+    dateFormat: null,
+    
+    
+    useNull: false,
+    
+    
+    defaultValue: "",
+    
+    mapping: null,
+    
+    sortType : null,
+    
+    sortDir : "ASC",
+    
+    allowBlank : true
+});
+
+Ext.data.DataReader = function(meta, recordType){
+    
+    this.meta = meta;
+    
+    this.recordType = Ext.isArray(recordType) ?
+        Ext.data.Record.create(recordType) : recordType;
+
+    
+    if (this.recordType){
+        this.buildExtractors();
+    }
+};
+
+Ext.data.DataReader.prototype = {
+    
+    
+    getTotal: Ext.emptyFn,
+    
+    getRoot: Ext.emptyFn,
+    
+    getMessage: Ext.emptyFn,
+    
+    getSuccess: Ext.emptyFn,
+    
+    getId: Ext.emptyFn,
+    
+    buildExtractors : Ext.emptyFn,
+    
+    extractValues : Ext.emptyFn,
+
+    
+    realize: function(rs, data){
+        if (Ext.isArray(rs)) {
+            for (var i = rs.length - 1; i >= 0; i--) {
+                
+                if (Ext.isArray(data)) {
+                    this.realize(rs.splice(i,1).shift(), data.splice(i,1).shift());
+                }
+                else {
+                    
+                    
+                    this.realize(rs.splice(i,1).shift(), data);
+                }
+            }
+        }
+        else {
+            
+            if (Ext.isArray(data) && data.length == 1) {
+                data = data.shift();
+            }
+            if (!this.isData(data)) {
+                
+                
+                throw new Ext.data.DataReader.Error('realize', rs);
+            }
+            rs.phantom = false; 
+            rs._phid = rs.id;  
+            rs.id = this.getId(data);
+            rs.data = data;
+
+            rs.commit();
+        }
+    },
+
+    
+    update : function(rs, data) {
+        if (Ext.isArray(rs)) {
+            for (var i=rs.length-1; i >= 0; i--) {
+                if (Ext.isArray(data)) {
+                    this.update(rs.splice(i,1).shift(), data.splice(i,1).shift());
+                }
+                else {
+                    
+                    
+                    this.update(rs.splice(i,1).shift(), data);
+                }
+            }
+        }
+        else {
+            
+            if (Ext.isArray(data) && data.length == 1) {
+                data = data.shift();
+            }
+            if (this.isData(data)) {
+                rs.data = Ext.apply(rs.data, data);
+            }
+            rs.commit();
+        }
+    },
+
+    
+    extractData : function(root, returnRecords) {
+        
+        var rawName = (this instanceof Ext.data.JsonReader) ? 'json' : 'node';
+
+        var rs = [];
+
+        
+        
+        if (this.isData(root) && !(this instanceof Ext.data.XmlReader)) {
+            root = [root];
+        }
+        var f       = this.recordType.prototype.fields,
+            fi      = f.items,
+            fl      = f.length,
+            rs      = [];
+        if (returnRecords === true) {
+            var Record = this.recordType;
+            for (var i = 0; i < root.length; i++) {
+                var n = root[i];
+                var record = new Record(this.extractValues(n, fi, fl), this.getId(n));
+                record[rawName] = n;    
+                rs.push(record);
+            }
+        }
+        else {
+            for (var i = 0; i < root.length; i++) {
+                var data = this.extractValues(root[i], fi, fl);
+                data[this.meta.idProperty] = this.getId(root[i]);
+                rs.push(data);
+            }
+        }
+        return rs;
+    },
+
+    
+    isData : function(data) {
+        return (data && Ext.isObject(data) && !Ext.isEmpty(this.getId(data))) ? true : false;
+    },
+
+    
+    onMetaChange : function(meta){
+        delete this.ef;
+        this.meta = meta;
+        this.recordType = Ext.data.Record.create(meta.fields);
+        this.buildExtractors();
+    }
+};
+
+
+Ext.data.DataReader.Error = Ext.extend(Ext.Error, {
+    constructor : function(message, arg) {
+        this.arg = arg;
+        Ext.Error.call(this, message);
+    },
+    name: 'Ext.data.DataReader'
+});
+Ext.apply(Ext.data.DataReader.Error.prototype, {
+    lang : {
+        'update': "#update received invalid data from server.  Please see docs for DataReader#update and review your DataReader configuration.",
+        'realize': "#realize was called with invalid remote-data.  Please see the docs for DataReader#realize and review your DataReader configuration.",
+        'invalid-response': "#readResponse received an invalid response from the server."
+    }
+});
+
+Ext.data.DataWriter = function(config){
+    Ext.apply(this, config);
+};
+Ext.data.DataWriter.prototype = {
+
+    
+    writeAllFields : false,
+    
+    listful : false,    
+
+    
+    apply : function(params, baseParams, action, rs) {
+        var data    = [],
+        renderer    = action + 'Record';
+        
+        if (Ext.isArray(rs)) {
+            Ext.each(rs, function(rec){
+                data.push(this[renderer](rec));
+            }, this);
+        }
+        else if (rs instanceof Ext.data.Record) {
+            data = this[renderer](rs);
+        }
+        this.render(params, baseParams, data);
+    },
+
+    
+    render : Ext.emptyFn,
+
+    
+    updateRecord : Ext.emptyFn,
+
+    
+    createRecord : Ext.emptyFn,
+
+    
+    destroyRecord : Ext.emptyFn,
+
+    
+    toHash : function(rec, config) {
+        var map = rec.fields.map,
+            data = {},
+            raw = (this.writeAllFields === false && rec.phantom === false) ? rec.getChanges() : rec.data,
+            m;
+        Ext.iterate(raw, function(prop, value){
+            if((m = map[prop])){
+                data[m.mapping ? m.mapping : m.name] = value;
+            }
+        });
+        
+        
+        
+        if (rec.phantom) {
+            if (rec.fields.containsKey(this.meta.idProperty) && Ext.isEmpty(rec.data[this.meta.idProperty])) {
+                delete data[this.meta.idProperty];
+            }
+        } else {
+            data[this.meta.idProperty] = rec.id;
+        }
+        return data;
+    },
+
+    
+    toArray : function(data) {
+        var fields = [];
+        Ext.iterate(data, function(k, v) {fields.push({name: k, value: v});},this);
+        return fields;
+    }
+};
+Ext.data.DataProxy = function(conn){
+    
+    
+    conn = conn || {};
+
+    
+    
+    
+
+    this.api     = conn.api;
+    this.url     = conn.url;
+    this.restful = conn.restful;
+    this.listeners = conn.listeners;
+
+    
+    this.prettyUrls = conn.prettyUrls;
+
+    
+
+    this.addEvents(
+        
+        'exception',
+        
+        'beforeload',
+        
+        'load',
+        
+        'loadexception',
+        
+        'beforewrite',
+        
+        'write'
+    );
+    Ext.data.DataProxy.superclass.constructor.call(this);
+
+    
+    try {
+        Ext.data.Api.prepare(this);
+    } catch (e) {
+        if (e instanceof Ext.data.Api.Error) {
+            e.toConsole();
+        }
+    }
+    
+    Ext.data.DataProxy.relayEvents(this, ['beforewrite', 'write', 'exception']);
+};
+
+Ext.extend(Ext.data.DataProxy, Ext.util.Observable, {
+    
+    restful: false,
+
+    
+    setApi : function() {
+        if (arguments.length == 1) {
+            var valid = Ext.data.Api.isValid(arguments[0]);
+            if (valid === true) {
+                this.api = arguments[0];
+            }
+            else {
+                throw new Ext.data.Api.Error('invalid', valid);
+            }
+        }
+        else if (arguments.length == 2) {
+            if (!Ext.data.Api.isAction(arguments[0])) {
+                throw new Ext.data.Api.Error('invalid', arguments[0]);
+            }
+            this.api[arguments[0]] = arguments[1];
+        }
+        Ext.data.Api.prepare(this);
+    },
+
+    
+    isApiAction : function(action) {
+        return (this.api[action]) ? true : false;
+    },
+
+    
+    request : function(action, rs, params, reader, callback, scope, options) {
+        if (!this.api[action] && !this.load) {
+            throw new Ext.data.DataProxy.Error('action-undefined', action);
+        }
+        params = params || {};
+        if ((action === Ext.data.Api.actions.read) ? this.fireEvent("beforeload", this, params) : this.fireEvent("beforewrite", this, action, rs, params) !== false) {
+            this.doRequest.apply(this, arguments);
+        }
+        else {
+            callback.call(scope || this, null, options, false);
+        }
+    },
+
+
+    
+    load : null,
+
+    
+    doRequest : function(action, rs, params, reader, callback, scope, options) {
+        
+        
+        
+        this.load(params, reader, callback, scope, options);
+    },
+
+    
+    onRead : Ext.emptyFn,
+    
+    onWrite : Ext.emptyFn,
+    
+    buildUrl : function(action, record) {
+        record = record || null;
+
+        
+        
+        
+        var url = (this.conn && this.conn.url) ? this.conn.url : (this.api[action]) ? this.api[action].url : this.url;
+        if (!url) {
+            throw new Ext.data.Api.Error('invalid-url', action);
+        }
+
+        
+        
+        
+        
+        
+        
+        var provides = null;
+        var m = url.match(/(.*)(\.json|\.xml|\.html)$/);
+        if (m) {
+            provides = m[2];    
+            url      = m[1];    
+        }
+        
+        if ((this.restful === true || this.prettyUrls === true) && record instanceof Ext.data.Record && !record.phantom) {
+            url += '/' + record.id;
+        }
+        return (provides === null) ? url : url + provides;
+    },
+
+    
+    destroy: function(){
+        this.purgeListeners();
+    }
+});
+
+
+
+Ext.apply(Ext.data.DataProxy, Ext.util.Observable.prototype);
+Ext.util.Observable.call(Ext.data.DataProxy);
+
+
+Ext.data.DataProxy.Error = Ext.extend(Ext.Error, {
+    constructor : function(message, arg) {
+        this.arg = arg;
+        Ext.Error.call(this, message);
+    },
+    name: 'Ext.data.DataProxy'
+});
+Ext.apply(Ext.data.DataProxy.Error.prototype, {
+    lang: {
+        'action-undefined': "DataProxy attempted to execute an API-action but found an undefined url / function.  Please review your Proxy url/api-configuration.",
+        'api-invalid': 'Recieved an invalid API-configuration.  Please ensure your proxy API-configuration contains only the actions from Ext.data.Api.actions.'
+    }
+});
+
+
+
+Ext.data.Request = function(params) {
+    Ext.apply(this, params);
+};
+Ext.data.Request.prototype = {
+    
+    action : undefined,
+    
+    rs : undefined,
+    
+    params: undefined,
+    
+    callback : Ext.emptyFn,
+    
+    scope : undefined,
+    
+    reader : undefined
+};
+
+Ext.data.Response = function(params) {
+    Ext.apply(this, params);
+};
+Ext.data.Response.prototype = {
+    
+    action: undefined,
+    
+    success : undefined,
+    
+    message : undefined,
+    
+    data: undefined,
+    
+    raw: undefined,
+    
+    records: undefined
+};
+
+Ext.data.ScriptTagProxy = function(config){
+    Ext.apply(this, config);
+
+    Ext.data.ScriptTagProxy.superclass.constructor.call(this, config);
+
+    this.head = document.getElementsByTagName("head")[0];
+
+    
+};
+
+Ext.data.ScriptTagProxy.TRANS_ID = 1000;
+
+Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, {
+    
+    
+    timeout : 30000,
+    
+    callbackParam : "callback",
+    
+    nocache : true,
+
+    
+    doRequest : function(action, rs, params, reader, callback, scope, arg) {
+        var p = Ext.urlEncode(Ext.apply(params, this.extraParams));
+
+        var url = this.buildUrl(action, rs);
+        if (!url) {
+            throw new Ext.data.Api.Error('invalid-url', url);
+        }
+        url = Ext.urlAppend(url, p);
+
+        if(this.nocache){
+            url = Ext.urlAppend(url, '_dc=' + (new Date().getTime()));
+        }
+        var transId = ++Ext.data.ScriptTagProxy.TRANS_ID;
+        var trans = {
+            id : transId,
+            action: action,
+            cb : "stcCallback"+transId,
+            scriptId : "stcScript"+transId,
+            params : params,
+            arg : arg,
+            url : url,
+            callback : callback,
+            scope : scope,
+            reader : reader
+        };
+        window[trans.cb] = this.createCallback(action, rs, trans);
+        url += String.format("&{0}={1}", this.callbackParam, trans.cb);
+        if(this.autoAbort !== false){
+            this.abort();
+        }
+
+        trans.timeoutId = this.handleFailure.defer(this.timeout, this, [trans]);
+
+        var script = document.createElement("script");
+        script.setAttribute("src", url);
+        script.setAttribute("type", "text/javascript");
+        script.setAttribute("id", trans.scriptId);
+        this.head.appendChild(script);
+
+        this.trans = trans;
+    },
+
+    
+    createCallback : function(action, rs, trans) {
+        var self = this;
+        return function(res) {
+            self.trans = false;
+            self.destroyTrans(trans, true);
+            if (action === Ext.data.Api.actions.read) {
+                self.onRead.call(self, action, trans, res);
+            } else {
+                self.onWrite.call(self, action, trans, res, rs);
+            }
+        };
+    },
+    
+    onRead : function(action, trans, res) {
+        var result;
+        try {
+            result = trans.reader.readRecords(res);
+        }catch(e){
+            
+            this.fireEvent("loadexception", this, trans, res, e);
+
+            this.fireEvent('exception', this, 'response', action, trans, res, e);
+            trans.callback.call(trans.scope||window, null, trans.arg, false);
+            return;
+        }
+        if (result.success === false) {
+            
+            this.fireEvent('loadexception', this, trans, res);
+
+            this.fireEvent('exception', this, 'remote', action, trans, res, null);
+        } else {
+            this.fireEvent("load", this, res, trans.arg);
+        }
+        trans.callback.call(trans.scope||window, result, trans.arg, result.success);
+    },
+    
+    onWrite : function(action, trans, response, rs) {
+        var reader = trans.reader;
+        try {
+            
+            var res = reader.readResponse(action, response);
+        } catch (e) {
+            this.fireEvent('exception', this, 'response', action, trans, res, e);
+            trans.callback.call(trans.scope||window, null, res, false);
+            return;
+        }
+        if(!res.success === true){
+            this.fireEvent('exception', this, 'remote', action, trans, res, rs);
+            trans.callback.call(trans.scope||window, null, res, false);
+            return;
+        }
+        this.fireEvent("write", this, action, res.data, res, rs, trans.arg );
+        trans.callback.call(trans.scope||window, res.data, res, true);
+    },
+
+    
+    isLoading : function(){
+        return this.trans ? true : false;
+    },
+
+    
+    abort : function(){
+        if(this.isLoading()){
+            this.destroyTrans(this.trans);
+        }
+    },
+
+    
+    destroyTrans : function(trans, isLoaded){
+        this.head.removeChild(document.getElementById(trans.scriptId));
+        clearTimeout(trans.timeoutId);
+        if(isLoaded){
+            window[trans.cb] = undefined;
+            try{
+                delete window[trans.cb];
+            }catch(e){}
+        }else{
+            
+            window[trans.cb] = function(){
+                window[trans.cb] = undefined;
+                try{
+                    delete window[trans.cb];
+                }catch(e){}
+            };
+        }
+    },
+
+    
+    handleFailure : function(trans){
+        this.trans = false;
+        this.destroyTrans(trans, false);
+        if (trans.action === Ext.data.Api.actions.read) {
+            
+            this.fireEvent("loadexception", this, null, trans.arg);
+        }
+
+        this.fireEvent('exception', this, 'response', trans.action, {
+            response: null,
+            options: trans.arg
+        });
+        trans.callback.call(trans.scope||window, null, trans.arg, false);
+    },
+
+    
+    destroy: function(){
+        this.abort();
+        Ext.data.ScriptTagProxy.superclass.destroy.call(this);
+    }
+});
+Ext.data.HttpProxy = function(conn){
+    Ext.data.HttpProxy.superclass.constructor.call(this, conn);
+
+    
+    this.conn = conn;
+
+    
+    
+    
+    
+    this.conn.url = null;
+
+    this.useAjax = !conn || !conn.events;
+
+    
+    var actions = Ext.data.Api.actions;
+    this.activeRequest = {};
+    for (var verb in actions) {
+        this.activeRequest[actions[verb]] = undefined;
+    }
+};
+
+Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, {
+    
+    getConnection : function() {
+        return this.useAjax ? Ext.Ajax : this.conn;
+    },
+
+    
+    setUrl : function(url, makePermanent) {
+        this.conn.url = url;
+        if (makePermanent === true) {
+            this.url = url;
+            this.api = null;
+            Ext.data.Api.prepare(this);
+        }
+    },
+
+    
+    doRequest : function(action, rs, params, reader, cb, scope, arg) {
+        var  o = {
+            method: (this.api[action]) ? this.api[action]['method'] : undefined,
+            request: {
+                callback : cb,
+                scope : scope,
+                arg : arg
+            },
+            reader: reader,
+            callback : this.createCallback(action, rs),
+            scope: this
+        };
+
+        
+        
+        if (params.jsonData) {
+            o.jsonData = params.jsonData;
+        } else if (params.xmlData) {
+            o.xmlData = params.xmlData;
+        } else {
+            o.params = params || {};
+        }
+        
+        
+        
+        this.conn.url = this.buildUrl(action, rs);
+
+        if(this.useAjax){
+
+            Ext.applyIf(o, this.conn);
+
+            
+            if (this.activeRequest[action]) {
+                
+                
+                
+                
+                
+            }
+            this.activeRequest[action] = Ext.Ajax.request(o);
+        }else{
+            this.conn.request(o);
+        }
+        
+        this.conn.url = null;
+    },
+
+    
+    createCallback : function(action, rs) {
+        return function(o, success, response) {
+            this.activeRequest[action] = undefined;
+            if (!success) {
+                if (action === Ext.data.Api.actions.read) {
+                    
+                    
+                    this.fireEvent('loadexception', this, o, response);
+                }
+                this.fireEvent('exception', this, 'response', action, o, response);
+                o.request.callback.call(o.request.scope, null, o.request.arg, false);
+                return;
+            }
+            if (action === Ext.data.Api.actions.read) {
+                this.onRead(action, o, response);
+            } else {
+                this.onWrite(action, o, response, rs);
+            }
+        };
+    },
+
+    
+    onRead : function(action, o, response) {
+        var result;
+        try {
+            result = o.reader.read(response);
+        }catch(e){
+            
+            
+            this.fireEvent('loadexception', this, o, response, e);
+
+            this.fireEvent('exception', this, 'response', action, o, response, e);
+            o.request.callback.call(o.request.scope, null, o.request.arg, false);
+            return;
+        }
+        if (result.success === false) {
+            
+            
+            this.fireEvent('loadexception', this, o, response);
+
+            
+            var res = o.reader.readResponse(action, response);
+            this.fireEvent('exception', this, 'remote', action, o, res, null);
+        }
+        else {
+            this.fireEvent('load', this, o, o.request.arg);
+        }
+        
+        
+        
+        o.request.callback.call(o.request.scope, result, o.request.arg, result.success);
+    },
+    
+    onWrite : function(action, o, response, rs) {
+        var reader = o.reader;
+        var res;
+        try {
+            res = reader.readResponse(action, response);
+        } catch (e) {
+            this.fireEvent('exception', this, 'response', action, o, response, e);
+            o.request.callback.call(o.request.scope, null, o.request.arg, false);
+            return;
+        }
+        if (res.success === true) {
+            this.fireEvent('write', this, action, res.data, res, rs, o.request.arg);
+        } else {
+            this.fireEvent('exception', this, 'remote', action, o, res, rs);
+        }
+        
+        
+        
+        o.request.callback.call(o.request.scope, res.data, res, res.success);
+    },
+
+    
+    destroy: function(){
+        if(!this.useAjax){
+            this.conn.abort();
+        }else if(this.activeRequest){
+            var actions = Ext.data.Api.actions;
+            for (var verb in actions) {
+                if(this.activeRequest[actions[verb]]){
+                    Ext.Ajax.abort(this.activeRequest[actions[verb]]);
+                }
+            }
+        }
+        Ext.data.HttpProxy.superclass.destroy.call(this);
+    }
+});
+Ext.data.MemoryProxy = function(data){
+    
+    var api = {};
+    api[Ext.data.Api.actions.read] = true;
+    Ext.data.MemoryProxy.superclass.constructor.call(this, {
+        api: api
+    });
+    this.data = data;
+};
+
+Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, {
+    
+
+       
+    doRequest : function(action, rs, params, reader, callback, scope, arg) {
+        
+        params = params || {};
+        var result;
+        try {
+            result = reader.readRecords(this.data);
+        }catch(e){
+            
+            this.fireEvent("loadexception", this, null, arg, e);
+
+            this.fireEvent('exception', this, 'response', action, arg, null, e);
+            callback.call(scope, null, arg, false);
+            return;
+        }
+        callback.call(scope, result, arg, true);
+    }
+});
+Ext.data.Types = new function(){
+    var st = Ext.data.SortTypes;
+    Ext.apply(this, {
+        
+        stripRe: /[\$,%]/g,
+        
+        
+        AUTO: {
+            convert: function(v){ return v; },
+            sortType: st.none,
+            type: 'auto'
+        },
+
+        
+        STRING: {
+            convert: function(v){ return (v === undefined || v === null) ? '' : String(v); },
+            sortType: st.asUCString,
+            type: 'string'
+        },
+
+        
+        INT: {
+            convert: function(v){
+                return v !== undefined && v !== null && v !== '' ?
+                    parseInt(String(v).replace(Ext.data.Types.stripRe, ''), 10) : (this.useNull ? null : 0);
+            },
+            sortType: st.none,
+            type: 'int'
+        },
+        
+        
+        FLOAT: {
+            convert: function(v){
+                return v !== undefined && v !== null && v !== '' ?
+                    parseFloat(String(v).replace(Ext.data.Types.stripRe, ''), 10) : (this.useNull ? null : 0);
+            },
+            sortType: st.none,
+            type: 'float'
+        },
+        
+        
+        BOOL: {
+            convert: function(v){ return v === true || v === 'true' || v == 1; },
+            sortType: st.none,
+            type: 'bool'
+        },
+        
+        
+        DATE: {
+            convert: function(v){
+                var df = this.dateFormat;
+                if(!v){
+                    return null;
+                }
+                if(Ext.isDate(v)){
+                    return v;
+                }
+                if(df){
+                    if(df == 'timestamp'){
+                        return new Date(v*1000);
+                    }
+                    if(df == 'time'){
+                        return new Date(parseInt(v, 10));
+                    }
+                    return Date.parseDate(v, df);
+                }
+                var parsed = Date.parse(v);
+                return parsed ? new Date(parsed) : null;
+            },
+            sortType: st.asDate,
+            type: 'date'
+        }
+    });
+    
+    Ext.apply(this, {
+        
+        BOOLEAN: this.BOOL,
+        
+        INTEGER: this.INT,
+        
+        NUMBER: this.FLOAT    
+    });
+};
+Ext.data.JsonWriter = Ext.extend(Ext.data.DataWriter, {
+    
+    encode : true,
+    
+    encodeDelete: false,
+    
+    constructor : function(config){
+        Ext.data.JsonWriter.superclass.constructor.call(this, config);    
+    },
+
+    
+    render : function(params, baseParams, data) {
+        if (this.encode === true) {
+            
+            Ext.apply(params, baseParams);
+            params[this.meta.root] = Ext.encode(data);
+        } else {
+            
+            var jdata = Ext.apply({}, baseParams);
+            jdata[this.meta.root] = data;
+            params.jsonData = jdata;
+        }
+    },
+    
+    createRecord : function(rec) {
+       return this.toHash(rec);
+    },
+    
+    updateRecord : function(rec) {
+        return this.toHash(rec);
+
+    },
+    
+    destroyRecord : function(rec){
+        if(this.encodeDelete){
+            var data = {};
+            data[this.meta.idProperty] = rec.id;
+            return data;
+        }else{
+            return rec.id;
+        }
+    }
+});
+Ext.data.JsonReader = function(meta, recordType){
+    meta = meta || {};
+    
+    
+    
+    
+    Ext.applyIf(meta, {
+        idProperty: 'id',
+        successProperty: 'success',
+        totalProperty: 'total'
+    });
+
+    Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType || meta.fields);
+};
+Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, {
+    
+    
+    read : function(response){
+        var json = response.responseText;
+        var o = Ext.decode(json);
+        if(!o) {
+            throw {message: 'JsonReader.read: Json object not found'};
+        }
+        return this.readRecords(o);
+    },
+
+    
+    
+    readResponse : function(action, response) {
+        var o = (response.responseText !== undefined) ? Ext.decode(response.responseText) : response;
+        if(!o) {
+            throw new Ext.data.JsonReader.Error('response');
+        }
+
+        var root = this.getRoot(o);
+        if (action === Ext.data.Api.actions.create) {
+            var def = Ext.isDefined(root);
+            if (def && Ext.isEmpty(root)) {
+                throw new Ext.data.JsonReader.Error('root-empty', this.meta.root);
+            }
+            else if (!def) {
+                throw new Ext.data.JsonReader.Error('root-undefined-response', this.meta.root);
+            }
+        }
+
+        
+        var res = new Ext.data.Response({
+            action: action,
+            success: this.getSuccess(o),
+            data: (root) ? this.extractData(root, false) : [],
+            message: this.getMessage(o),
+            raw: o
+        });
+
+        
+        if (Ext.isEmpty(res.success)) {
+            throw new Ext.data.JsonReader.Error('successProperty-response', this.meta.successProperty);
+        }
+        return res;
+    },
+
+    
+    readRecords : function(o){
+        
+        this.jsonData = o;
+        if(o.metaData){
+            this.onMetaChange(o.metaData);
+        }
+        var s = this.meta, Record = this.recordType,
+            f = Record.prototype.fields, fi = f.items, fl = f.length, v;
+
+        var root = this.getRoot(o), c = root.length, totalRecords = c, success = true;
+        if(s.totalProperty){
+            v = parseInt(this.getTotal(o), 10);
+            if(!isNaN(v)){
+                totalRecords = v;
+            }
+        }
+        if(s.successProperty){
+            v = this.getSuccess(o);
+            if(v === false || v === 'false'){
+                success = false;
+            }
+        }
+
+        
+        return {
+            success : success,
+            records : this.extractData(root, true), 
+            totalRecords : totalRecords
+        };
+    },
+
+    
+    buildExtractors : function() {
+        if(this.ef){
+            return;
+        }
+        var s = this.meta, Record = this.recordType,
+            f = Record.prototype.fields, fi = f.items, fl = f.length;
+
+        if(s.totalProperty) {
+            this.getTotal = this.createAccessor(s.totalProperty);
+        }
+        if(s.successProperty) {
+            this.getSuccess = this.createAccessor(s.successProperty);
+        }
+        if (s.messageProperty) {
+            this.getMessage = this.createAccessor(s.messageProperty);
+        }
+        this.getRoot = s.root ? this.createAccessor(s.root) : function(p){return p;};
+        if (s.id || s.idProperty) {
+            var g = this.createAccessor(s.id || s.idProperty);
+            this.getId = function(rec) {
+                var r = g(rec);
+                return (r === undefined || r === '') ? null : r;
+            };
+        } else {
+            this.getId = function(){return null;};
+        }
+        var ef = [];
+        for(var i = 0; i < fl; i++){
+            f = fi[i];
+            var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name;
+            ef.push(this.createAccessor(map));
+        }
+        this.ef = ef;
+    },
+
+    
+    simpleAccess : function(obj, subsc) {
+        return obj[subsc];
+    },
+
+    
+    createAccessor : function(){
+        var re = /[\[\.]/;
+        return function(expr) {
+            if(Ext.isEmpty(expr)){
+                return Ext.emptyFn;
+            }
+            if(Ext.isFunction(expr)){
+                return expr;
+            }
+            var i = String(expr).search(re);
+            if(i >= 0){
+                return new Function('obj', 'return obj' + (i > 0 ? '.' : '') + expr);
+            }
+            return function(obj){
+                return obj[expr];
+            };
+
+        };
+    }(),
+
+    
+    extractValues : function(data, items, len) {
+        var f, values = {};
+        for(var j = 0; j < len; j++){
+            f = items[j];
+            var v = this.ef[j](data);
+            values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue, data);
+        }
+        return values;
+    }
+});
+
+
+Ext.data.JsonReader.Error = Ext.extend(Ext.Error, {
+    constructor : function(message, arg) {
+        this.arg = arg;
+        Ext.Error.call(this, message);
+    },
+    name : 'Ext.data.JsonReader'
+});
+Ext.apply(Ext.data.JsonReader.Error.prototype, {
+    lang: {
+        'response': 'An error occurred while json-decoding your server response',
+        'successProperty-response': 'Could not locate your "successProperty" in your server response.  Please review your JsonReader config to ensure the config-property "successProperty" matches the property in your server-response.  See the JsonReader docs.',
+        'root-undefined-config': 'Your JsonReader was configured without a "root" property.  Please review your JsonReader config and make sure to define the root property.  See the JsonReader docs.',
+        'idProperty-undefined' : 'Your JsonReader was configured without an "idProperty"  Please review your JsonReader configuration and ensure the "idProperty" is set (e.g.: "id").  See the JsonReader docs.',
+        'root-empty': 'Data was expected to be returned by the server in the "root" property of the response.  Please review your JsonReader configuration to ensure the "root" property matches that returned in the server-response.  See JsonReader docs.'
+    }
+});
+
+Ext.data.ArrayReader = Ext.extend(Ext.data.JsonReader, {
+    
+    
+    
+    
+    readRecords : function(o){
+        this.arrayData = o;
+        var s = this.meta,
+            sid = s ? Ext.num(s.idIndex, s.id) : null,
+            recordType = this.recordType,
+            fields = recordType.prototype.fields,
+            records = [],
+            success = true,
+            v;
+
+        var root = this.getRoot(o);
+
+        for(var i = 0, len = root.length; i < len; i++) {
+            var n = root[i],
+                values = {},
+                id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);
+            for(var j = 0, jlen = fields.length; j < jlen; j++) {
+                var f = fields.items[j],
+                    k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j;
+                v = n[k] !== undefined ? n[k] : f.defaultValue;
+                v = f.convert(v, n);
+                values[f.name] = v;
+            }
+            var record = new recordType(values, id);
+            record.json = n;
+            records[records.length] = record;
+        }
+
+        var totalRecords = records.length;
+
+        if(s.totalProperty) {
+            v = parseInt(this.getTotal(o), 10);
+            if(!isNaN(v)) {
+                totalRecords = v;
+            }
+        }
+        if(s.successProperty){
+            v = this.getSuccess(o);
+            if(v === false || v === 'false'){
+                success = false;
+            }
+        }
+
+        return {
+            success : success,
+            records : records,
+            totalRecords : totalRecords
+        };
+    }
+});
+Ext.data.ArrayStore = Ext.extend(Ext.data.Store, {
+    
+    constructor: function(config){
+        Ext.data.ArrayStore.superclass.constructor.call(this, Ext.apply(config, {
+            reader: new Ext.data.ArrayReader(config)
+        }));
+    },
+
+    loadData : function(data, append){
+        if(this.expandData === true){
+            var r = [];
+            for(var i = 0, len = data.length; i < len; i++){
+                r[r.length] = [data[i]];
+            }
+            data = r;
+        }
+        Ext.data.ArrayStore.superclass.loadData.call(this, data, append);
+    }
+});
+Ext.reg('arraystore', Ext.data.ArrayStore);
+
+
+Ext.data.SimpleStore = Ext.data.ArrayStore;
+Ext.reg('simplestore', Ext.data.SimpleStore);
+Ext.data.JsonStore = Ext.extend(Ext.data.Store, {
+    
+    constructor: function(config){
+        Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(config, {
+            reader: new Ext.data.JsonReader(config)
+        }));
+    }
+});
+Ext.reg('jsonstore', Ext.data.JsonStore);
+Ext.data.XmlWriter = function(params) {
+    Ext.data.XmlWriter.superclass.constructor.apply(this, arguments);
+    
+    this.tpl = (typeof(this.tpl) === 'string') ? new Ext.XTemplate(this.tpl).compile() : this.tpl.compile();
+};
+Ext.extend(Ext.data.XmlWriter, Ext.data.DataWriter, {
+    
+    documentRoot: 'xrequest',
+    
+    forceDocumentRoot: false,
+    
+    root: 'records',
+    
+    xmlVersion : '1.0',
+    
+    xmlEncoding: 'ISO-8859-15',
+    
+    
+    tpl: '<tpl for="."><\u003fxml version="{version}" encoding="{encoding}"\u003f><tpl if="documentRoot"><{documentRoot}><tpl for="baseParams"><tpl for="."><{name}>{value}</{name}></tpl></tpl></tpl><tpl if="records.length&gt;1"><{root}></tpl><tpl for="records"><{parent.record}><tpl for="."><{name}>{value}</{name}></tpl></{parent.record}></tpl><tpl if="records.length&gt;1"></{root}></tpl><tpl if="documentRoot"></{documentRoot}></tpl></tpl>',
+
+
+    
+    render : function(params, baseParams, data) {
+        baseParams = this.toArray(baseParams);
+        params.xmlData = this.tpl.applyTemplate({
+            version: this.xmlVersion,
+            encoding: this.xmlEncoding,
+            documentRoot: (baseParams.length > 0 || this.forceDocumentRoot === true) ? this.documentRoot : false,
+            record: this.meta.record,
+            root: this.root,
+            baseParams: baseParams,
+            records: (Ext.isArray(data[0])) ? data : [data]
+        });
+    },
+
+    
+    createRecord : function(rec) {
+        return this.toArray(this.toHash(rec));
+    },
+
+    
+    updateRecord : function(rec) {
+        return this.toArray(this.toHash(rec));
+
+    },
+    
+    destroyRecord : function(rec) {
+        var data = {};
+        data[this.meta.idProperty] = rec.id;
+        return this.toArray(data);
+    }
+});
+
+Ext.data.XmlReader = function(meta, recordType){
+    meta = meta || {};
+
+    
+    Ext.applyIf(meta, {
+        idProperty: meta.idProperty || meta.idPath || meta.id,
+        successProperty: meta.successProperty || meta.success
+    });
+
+    Ext.data.XmlReader.superclass.constructor.call(this, meta, recordType || meta.fields);
+};
+Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, {
+    
+    read : function(response){
+        var doc = response.responseXML;
+        if(!doc) {
+            throw {message: "XmlReader.read: XML Document not available"};
+        }
+        return this.readRecords(doc);
+    },
+
+    
+    readRecords : function(doc){
+        
+        this.xmlData = doc;
+
+        var root    = doc.documentElement || doc,
+            q       = Ext.DomQuery,
+            totalRecords = 0,
+            success = true;
+
+        if(this.meta.totalProperty){
+            totalRecords = this.getTotal(root, 0);
+        }
+        if(this.meta.successProperty){
+            success = this.getSuccess(root);
+        }
+
+        var records = this.extractData(q.select(this.meta.record, root), true); 
+
+        
+        return {
+            success : success,
+            records : records,
+            totalRecords : totalRecords || records.length
+        };
+    },
+
+    
+    readResponse : function(action, response) {
+        var q = Ext.DomQuery,
+            doc = response.responseXML,
+            root = doc.documentElement || doc;
+
+        
+        var res = new Ext.data.Response({
+            action: action,
+            success : this.getSuccess(root),
+            message: this.getMessage(root),
+            data: this.extractData(q.select(this.meta.record, root) || q.select(this.meta.root, root), false),
+            raw: doc
+        });
+
+        if (Ext.isEmpty(res.success)) {
+            throw new Ext.data.DataReader.Error('successProperty-response', this.meta.successProperty);
+        }
+
+        
+        if (action === Ext.data.Api.actions.create) {
+            var def = Ext.isDefined(res.data);
+            if (def && Ext.isEmpty(res.data)) {
+                throw new Ext.data.JsonReader.Error('root-empty', this.meta.root);
+            }
+            else if (!def) {
+                throw new Ext.data.JsonReader.Error('root-undefined-response', this.meta.root);
+            }
+        }
+        return res;
+    },
+
+    getSuccess : function() {
+        return true;
+    },
+
+    
+    buildExtractors : function() {
+        if(this.ef){
+            return;
+        }
+        var s       = this.meta,
+            Record  = this.recordType,
+            f       = Record.prototype.fields,
+            fi      = f.items,
+            fl      = f.length;
+
+        if(s.totalProperty) {
+            this.getTotal = this.createAccessor(s.totalProperty);
+        }
+        if(s.successProperty) {
+            this.getSuccess = this.createAccessor(s.successProperty);
+        }
+        if (s.messageProperty) {
+            this.getMessage = this.createAccessor(s.messageProperty);
+        }
+        this.getRoot = function(res) {
+            return (!Ext.isEmpty(res[this.meta.record])) ? res[this.meta.record] : res[this.meta.root];
+        };
+        if (s.idPath || s.idProperty) {
+            var g = this.createAccessor(s.idPath || s.idProperty);
+            this.getId = function(rec) {
+                var id = g(rec) || rec.id;
+                return (id === undefined || id === '') ? null : id;
+            };
+        } else {
+            this.getId = function(){return null;};
+        }
+        var ef = [];
+        for(var i = 0; i < fl; i++){
+            f = fi[i];
+            var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name;
+            ef.push(this.createAccessor(map));
+        }
+        this.ef = ef;
+    },
+
+    
+    createAccessor : function(){
+        var q = Ext.DomQuery;
+        return function(key) {
+            if (Ext.isFunction(key)) {
+                return key;
+            }
+            switch(key) {
+                case this.meta.totalProperty:
+                    return function(root, def){
+                        return q.selectNumber(key, root, def);
+                    };
+                    break;
+                case this.meta.successProperty:
+                    return function(root, def) {
+                        var sv = q.selectValue(key, root, true);
+                        var success = sv !== false && sv !== 'false';
+                        return success;
+                    };
+                    break;
+                default:
+                    return function(root, def) {
+                        return q.selectValue(key, root, def);
+                    };
+                    break;
+            }
+        };
+    }(),
+
+    
+    extractValues : function(data, items, len) {
+        var f, values = {};
+        for(var j = 0; j < len; j++){
+            f = items[j];
+            var v = this.ef[j](data);
+            values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue, data);
+        }
+        return values;
+    }
+});
+Ext.data.XmlStore = Ext.extend(Ext.data.Store, {
+    
+    constructor: function(config){
+        Ext.data.XmlStore.superclass.constructor.call(this, Ext.apply(config, {
+            reader: new Ext.data.XmlReader(config)
+        }));
+    }
+});
+Ext.reg('xmlstore', Ext.data.XmlStore);
+Ext.data.GroupingStore = Ext.extend(Ext.data.Store, {
+
+    
+    constructor: function(config) {
+        config = config || {};
+
+        
+        
+        
+        
+        this.hasMultiSort  = true;
+        this.multiSortInfo = this.multiSortInfo || {sorters: []};
+
+        var sorters    = this.multiSortInfo.sorters,
+            groupField = config.groupField || this.groupField,
+            sortInfo   = config.sortInfo || this.sortInfo,
+            groupDir   = config.groupDir || this.groupDir;
+
+        
+        if(groupField){
+            sorters.push({
+                field    : groupField,
+                direction: groupDir
+            });
+        }
+
+        
+        if (sortInfo) {
+            sorters.push(sortInfo);
+        }
+
+        Ext.data.GroupingStore.superclass.constructor.call(this, config);
+
+        this.addEvents(
+          
+          'groupchange'
+        );
+
+        this.applyGroupField();
+    },
+
+    
+    
+    remoteGroup : false,
+    
+    groupOnSort:false,
+
+    
+    groupDir : 'ASC',
+
+    
+    clearGrouping : function(){
+        this.groupField = false;
+
+        if(this.remoteGroup){
+            if(this.baseParams){
+                delete this.baseParams.groupBy;
+                delete this.baseParams.groupDir;
+            }
+            var lo = this.lastOptions;
+            if(lo && lo.params){
+                delete lo.params.groupBy;
+                delete lo.params.groupDir;
+            }
+
+            this.reload();
+        }else{
+            this.sort();
+            this.fireEvent('datachanged', this);
+        }
+    },
+
+    
+    groupBy : function(field, forceRegroup, direction) {
+        direction = direction ? (String(direction).toUpperCase() == 'DESC' ? 'DESC' : 'ASC') : this.groupDir;
+
+        if (this.groupField == field && this.groupDir == direction && !forceRegroup) {
+            return; 
+        }
+
+        
+        
+        var sorters = this.multiSortInfo.sorters;
+        if (sorters.length > 0 && sorters[0].field == this.groupField) {
+            sorters.shift();
+        }
+
+        this.groupField = field;
+        this.groupDir = direction;
+        this.applyGroupField();
+
+        var fireGroupEvent = function() {
+            this.fireEvent('groupchange', this, this.getGroupState());
+        };
+
+        if (this.groupOnSort) {
+            this.sort(field, direction);
+            fireGroupEvent.call(this);
+            return;
+        }
+
+        if (this.remoteGroup) {
+            this.on('load', fireGroupEvent, this, {single: true});
+            this.reload();
+        } else {
+            this.sort(sorters);
+            fireGroupEvent.call(this);
+        }
+    },
+
+    
+    
+    sort : function(fieldName, dir) {
+        if (this.remoteSort) {
+            return Ext.data.GroupingStore.superclass.sort.call(this, fieldName, dir);
+        }
+
+        var sorters = [];
+
+        
+        if (Ext.isArray(arguments[0])) {
+            sorters = arguments[0];
+        } else if (fieldName == undefined) {
+            
+            
+            sorters = this.sortInfo ? [this.sortInfo] : [];
+        } else {
+            
+            
+            var field = this.fields.get(fieldName);
+            if (!field) return false;
+
+            var name       = field.name,
+                sortInfo   = this.sortInfo || null,
+                sortToggle = this.sortToggle ? this.sortToggle[name] : null;
+
+            if (!dir) {
+                if (sortInfo && sortInfo.field == name) { 
+                    dir = (this.sortToggle[name] || 'ASC').toggle('ASC', 'DESC');
+                } else {
+                    dir = field.sortDir;
+                }
+            }
+
+            this.sortToggle[name] = dir;
+            this.sortInfo = {field: name, direction: dir};
+
+            sorters = [this.sortInfo];
+        }
+
+        
+        if (this.groupField) {
+            sorters.unshift({direction: this.groupDir, field: this.groupField});
+        }
+
+        return this.multiSort.call(this, sorters, dir);
+    },
+
+    
+    applyGroupField: function(){
+        if (this.remoteGroup) {
+            if(!this.baseParams){
+                this.baseParams = {};
+            }
+
+            Ext.apply(this.baseParams, {
+                groupBy : this.groupField,
+                groupDir: this.groupDir
+            });
+
+            var lo = this.lastOptions;
+            if (lo && lo.params) {
+                lo.params.groupDir = this.groupDir;
+
+                
+                delete lo.params.groupBy;
+            }
+        }
+    },
+
+    
+    applyGrouping : function(alwaysFireChange){
+        if(this.groupField !== false){
+            this.groupBy(this.groupField, true, this.groupDir);
+            return true;
+        }else{
+            if(alwaysFireChange === true){
+                this.fireEvent('datachanged', this);
+            }
+            return false;
+        }
+    },
+
+    
+    getGroupState : function(){
+        return this.groupOnSort && this.groupField !== false ?
+               (this.sortInfo ? this.sortInfo.field : undefined) : this.groupField;
+    }
+});
+Ext.reg('groupingstore', Ext.data.GroupingStore);
+
+Ext.data.DirectProxy = function(config){
+    Ext.apply(this, config);
+    if(typeof this.paramOrder == 'string'){
+        this.paramOrder = this.paramOrder.split(/[\s,|]/);
+    }
+    Ext.data.DirectProxy.superclass.constructor.call(this, config);
+};
+
+Ext.extend(Ext.data.DirectProxy, Ext.data.DataProxy, {
+    
+    paramOrder: undefined,
+
+    
+    paramsAsHash: true,
+
+    
+    directFn : undefined,
+
+    
+    doRequest : function(action, rs, params, reader, callback, scope, options) {
+        var args = [],
+            directFn = this.api[action] || this.directFn;
+
+        switch (action) {
+            case Ext.data.Api.actions.create:
+                args.push(params.jsonData);            
+                break;
+            case Ext.data.Api.actions.read:
+                
+                if(directFn.directCfg.method.len > 0){
+                    if(this.paramOrder){
+                        for(var i = 0, len = this.paramOrder.length; i < len; i++){
+                            args.push(params[this.paramOrder[i]]);
+                        }
+                    }else if(this.paramsAsHash){
+                        args.push(params);
+                    }
+                }
+                break;
+            case Ext.data.Api.actions.update:
+                args.push(params.jsonData);        
+                break;
+            case Ext.data.Api.actions.destroy:
+                args.push(params.jsonData);        
+                break;
+        }
+
+        var trans = {
+            params : params || {},
+            request: {
+                callback : callback,
+                scope : scope,
+                arg : options
+            },
+            reader: reader
+        };
+
+        args.push(this.createCallback(action, rs, trans), this);
+        directFn.apply(window, args);
+    },
+
+    
+    createCallback : function(action, rs, trans) {
+        var me = this;
+        return function(result, res) {
+            if (!res.status) {
+                
+                if (action === Ext.data.Api.actions.read) {
+                    me.fireEvent("loadexception", me, trans, res, null);
+                }
+                me.fireEvent('exception', me, 'remote', action, trans, res, null);
+                trans.request.callback.call(trans.request.scope, null, trans.request.arg, false);
+                return;
+            }
+            if (action === Ext.data.Api.actions.read) {
+                me.onRead(action, trans, result, res);
+            } else {
+                me.onWrite(action, trans, result, res, rs);
+            }
+        };
+    },
+
+    
+    onRead : function(action, trans, result, res) {
+        var records;
+        try {
+            records = trans.reader.readRecords(result);
+        }
+        catch (ex) {
+            
+            this.fireEvent("loadexception", this, trans, res, ex);
+
+            this.fireEvent('exception', this, 'response', action, trans, res, ex);
+            trans.request.callback.call(trans.request.scope, null, trans.request.arg, false);
+            return;
+        }
+        this.fireEvent("load", this, res, trans.request.arg);
+        trans.request.callback.call(trans.request.scope, records, trans.request.arg, true);
+    },
+    
+    onWrite : function(action, trans, result, res, rs) {
+        var data = trans.reader.extractData(trans.reader.getRoot(result), false);
+        var success = trans.reader.getSuccess(result);
+        success = (success !== false);
+        if (success){
+            this.fireEvent("write", this, action, data, res, rs, trans.request.arg);
+        }else{
+            this.fireEvent('exception', this, 'remote', action, trans, result, rs);
+        }
+        trans.request.callback.call(trans.request.scope, data, res, success);
+    }
+});
+
+Ext.data.DirectStore = Ext.extend(Ext.data.Store, {
+    constructor : function(config){
+        
+        var c = Ext.apply({}, {
+            batchTransactions: false
+        }, config);
+        Ext.data.DirectStore.superclass.constructor.call(this, Ext.apply(c, {
+            proxy: Ext.isDefined(c.proxy) ? c.proxy : new Ext.data.DirectProxy(Ext.copyTo({}, c, 'paramOrder,paramsAsHash,directFn,api')),
+            reader: (!Ext.isDefined(c.reader) && c.fields) ? new Ext.data.JsonReader(Ext.copyTo({}, c, 'totalProperty,root,idProperty'), c.fields) : c.reader
+        }));
+    }
+});
+Ext.reg('directstore', Ext.data.DirectStore);
+
+Ext.Direct = Ext.extend(Ext.util.Observable, {
+    
+
+    
+    exceptions: {
+        TRANSPORT: 'xhr',
+        PARSE: 'parse',
+        LOGIN: 'login',
+        SERVER: 'exception'
+    },
+
+    
+    constructor: function(){
+        this.addEvents(
+            
+            'event',
+            
+            'exception'
+        );
+        this.transactions = {};
+        this.providers = {};
+    },
+
+    
+    addProvider : function(provider){
+        var a = arguments;
+        if(a.length > 1){
+            for(var i = 0, len = a.length; i < len; i++){
+                this.addProvider(a[i]);
+            }
+            return;
+        }
+
+        
+        if(!provider.events){
+            provider = new Ext.Direct.PROVIDERS[provider.type](provider);
+        }
+        provider.id = provider.id || Ext.id();
+        this.providers[provider.id] = provider;
+
+        provider.on('data', this.onProviderData, this);
+        provider.on('exception', this.onProviderException, this);
+
+
+        if(!provider.isConnected()){
+            provider.connect();
+        }
+
+        return provider;
+    },
+
+    
+    getProvider : function(id){
+        return this.providers[id];
+    },
+
+    removeProvider : function(id){
+        var provider = id.id ? id : this.providers[id];
+        provider.un('data', this.onProviderData, this);
+        provider.un('exception', this.onProviderException, this);
+        delete this.providers[provider.id];
+        return provider;
+    },
+
+    addTransaction: function(t){
+        this.transactions[t.tid] = t;
+        return t;
+    },
+
+    removeTransaction: function(t){
+        delete this.transactions[t.tid || t];
+        return t;
+    },
+
+    getTransaction: function(tid){
+        return this.transactions[tid.tid || tid];
+    },
+
+    onProviderData : function(provider, e){
+        if(Ext.isArray(e)){
+            for(var i = 0, len = e.length; i < len; i++){
+                this.onProviderData(provider, e[i]);
+            }
+            return;
+        }
+        if(e.name && e.name != 'event' && e.name != 'exception'){
+            this.fireEvent(e.name, e);
+        }else if(e.type == 'exception'){
+            this.fireEvent('exception', e);
+        }
+        this.fireEvent('event', e, provider);
+    },
+
+    createEvent : function(response, extraProps){
+        return new Ext.Direct.eventTypes[response.type](Ext.apply(response, extraProps));
+    }
+});
+
+Ext.Direct = new Ext.Direct();
+
+Ext.Direct.TID = 1;
+Ext.Direct.PROVIDERS = {};
+Ext.Direct.Transaction = function(config){
+    Ext.apply(this, config);
+    this.tid = ++Ext.Direct.TID;
+    this.retryCount = 0;
+};
+Ext.Direct.Transaction.prototype = {
+    send: function(){
+        this.provider.queueTransaction(this);
+    },
+
+    retry: function(){
+        this.retryCount++;
+        this.send();
+    },
+
+    getProvider: function(){
+        return this.provider;
+    }
+};Ext.Direct.Event = function(config){
+    Ext.apply(this, config);
+};
+
+Ext.Direct.Event.prototype = {
+    status: true,
+    getData: function(){
+        return this.data;
+    }
+};
+
+Ext.Direct.RemotingEvent = Ext.extend(Ext.Direct.Event, {
+    type: 'rpc',
+    getTransaction: function(){
+        return this.transaction || Ext.Direct.getTransaction(this.tid);
+    }
+});
+
+Ext.Direct.ExceptionEvent = Ext.extend(Ext.Direct.RemotingEvent, {
+    status: false,
+    type: 'exception'
+});
+
+Ext.Direct.eventTypes = {
+    'rpc':  Ext.Direct.RemotingEvent,
+    'event':  Ext.Direct.Event,
+    'exception':  Ext.Direct.ExceptionEvent
+};
+
+Ext.direct.Provider = Ext.extend(Ext.util.Observable, {    
+    
+        
+        
+    priority: 1,
+
+        
+    
+    constructor : function(config){
+        Ext.apply(this, config);
+        this.addEvents(
+                        
+            'connect',
+                        
+            'disconnect',
+                        
+            'data',
+                                    
+            'exception'
+        );
+        Ext.direct.Provider.superclass.constructor.call(this, config);
+    },
+
+    
+    isConnected: function(){
+        return false;
+    },
+
+    
+    connect: Ext.emptyFn,
+    
+    
+    disconnect: Ext.emptyFn
+});
+
+Ext.direct.JsonProvider = Ext.extend(Ext.direct.Provider, {
+    parseResponse: function(xhr){
+        if(!Ext.isEmpty(xhr.responseText)){
+            if(typeof xhr.responseText == 'object'){
+                return xhr.responseText;
+            }
+            return Ext.decode(xhr.responseText);
+        }
+        return null;
+    },
+
+    getEvents: function(xhr){
+        var data = null;
+        try{
+            data = this.parseResponse(xhr);
+        }catch(e){
+            var event = new Ext.Direct.ExceptionEvent({
+                data: e,
+                xhr: xhr,
+                code: Ext.Direct.exceptions.PARSE,
+                message: 'Error parsing json response: \n\n ' + data
+            });
+            return [event];
+        }
+        var events = [];
+        if(Ext.isArray(data)){
+            for(var i = 0, len = data.length; i < len; i++){
+                events.push(Ext.Direct.createEvent(data[i]));
+            }
+        }else{
+            events.push(Ext.Direct.createEvent(data));
+        }
+        return events;
+    }
+});
+Ext.direct.PollingProvider = Ext.extend(Ext.direct.JsonProvider, {
+    
+    
+    priority: 3,
+    
+    
+    interval: 3000,
+
+    
+    
+    
+
+    
+    constructor : function(config){
+        Ext.direct.PollingProvider.superclass.constructor.call(this, config);
+        this.addEvents(
+            
+            'beforepoll',            
+            
+            'poll'
+        );
+    },
+
+    
+    isConnected: function(){
+        return !!this.pollTask;
+    },
+
+    
+    connect: function(){
+        if(this.url && !this.pollTask){
+            this.pollTask = Ext.TaskMgr.start({
+                run: function(){
+                    if(this.fireEvent('beforepoll', this) !== false){
+                        if(typeof this.url == 'function'){
+                            this.url(this.baseParams);
+                        }else{
+                            Ext.Ajax.request({
+                                url: this.url,
+                                callback: this.onData,
+                                scope: this,
+                                params: this.baseParams
+                            });
+                        }
+                    }
+                },
+                interval: this.interval,
+                scope: this
+            });
+            this.fireEvent('connect', this);
+        }else if(!this.url){
+            throw 'Error initializing PollingProvider, no url configured.';
+        }
+    },
+
+    
+    disconnect: function(){
+        if(this.pollTask){
+            Ext.TaskMgr.stop(this.pollTask);
+            delete this.pollTask;
+            this.fireEvent('disconnect', this);
+        }
+    },
+
+    
+    onData: function(opt, success, xhr){
+        if(success){
+            var events = this.getEvents(xhr);
+            for(var i = 0, len = events.length; i < len; i++){
+                var e = events[i];
+                this.fireEvent('data', this, e);
+            }
+        }else{
+            var e = new Ext.Direct.ExceptionEvent({
+                data: e,
+                code: Ext.Direct.exceptions.TRANSPORT,
+                message: 'Unable to connect to the server.',
+                xhr: xhr
+            });
+            this.fireEvent('data', this, e);
+        }
+    }
+});
+
+Ext.Direct.PROVIDERS['polling'] = Ext.direct.PollingProvider;
+Ext.direct.RemotingProvider = Ext.extend(Ext.direct.JsonProvider, {       
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    enableBuffer: 10,
+    
+    
+    maxRetries: 1,
+    
+    
+    timeout: undefined,
+
+    constructor : function(config){
+        Ext.direct.RemotingProvider.superclass.constructor.call(this, config);
+        this.addEvents(
+                        
+            'beforecall',            
+                        
+            'call'
+        );
+        this.namespace = (Ext.isString(this.namespace)) ? Ext.ns(this.namespace) : this.namespace || window;
+        this.transactions = {};
+        this.callBuffer = [];
+    },
+
+    
+    initAPI : function(){
+        var o = this.actions;
+        for(var c in o){
+            var cls = this.namespace[c] || (this.namespace[c] = {}),
+                ms = o[c];
+            for(var i = 0, len = ms.length; i < len; i++){
+                var m = ms[i];
+                cls[m.name] = this.createMethod(c, m);
+            }
+        }
+    },
+
+    
+    isConnected: function(){
+        return !!this.connected;
+    },
+
+    connect: function(){
+        if(this.url){
+            this.initAPI();
+            this.connected = true;
+            this.fireEvent('connect', this);
+        }else if(!this.url){
+            throw 'Error initializing RemotingProvider, no url configured.';
+        }
+    },
+
+    disconnect: function(){
+        if(this.connected){
+            this.connected = false;
+            this.fireEvent('disconnect', this);
+        }
+    },
+
+    onData: function(opt, success, xhr){
+        if(success){
+            var events = this.getEvents(xhr);
+            for(var i = 0, len = events.length; i < len; i++){
+                var e = events[i],
+                    t = this.getTransaction(e);
+                this.fireEvent('data', this, e);
+                if(t){
+                    this.doCallback(t, e, true);
+                    Ext.Direct.removeTransaction(t);
+                }
+            }
+        }else{
+            var ts = [].concat(opt.ts);
+            for(var i = 0, len = ts.length; i < len; i++){
+                var t = this.getTransaction(ts[i]);
+                if(t && t.retryCount < this.maxRetries){
+                    t.retry();
+                }else{
+                    var e = new Ext.Direct.ExceptionEvent({
+                        data: e,
+                        transaction: t,
+                        code: Ext.Direct.exceptions.TRANSPORT,
+                        message: 'Unable to connect to the server.',
+                        xhr: xhr
+                    });
+                    this.fireEvent('data', this, e);
+                    if(t){
+                        this.doCallback(t, e, false);
+                        Ext.Direct.removeTransaction(t);
+                    }
+                }
+            }
+        }
+    },
+
+    getCallData: function(t){
+        return {
+            action: t.action,
+            method: t.method,
+            data: t.data,
+            type: 'rpc',
+            tid: t.tid
+        };
+    },
+
+    doSend : function(data){
+        var o = {
+            url: this.url,
+            callback: this.onData,
+            scope: this,
+            ts: data,
+            timeout: this.timeout
+        }, callData;
+
+        if(Ext.isArray(data)){
+            callData = [];
+            for(var i = 0, len = data.length; i < len; i++){
+                callData.push(this.getCallData(data[i]));
+            }
+        }else{
+            callData = this.getCallData(data);
+        }
+
+        if(this.enableUrlEncode){
+            var params = {};
+            params[Ext.isString(this.enableUrlEncode) ? this.enableUrlEncode : 'data'] = Ext.encode(callData);
+            o.params = params;
+        }else{
+            o.jsonData = callData;
+        }
+        Ext.Ajax.request(o);
+    },
+
+    combineAndSend : function(){
+        var len = this.callBuffer.length;
+        if(len > 0){
+            this.doSend(len == 1 ? this.callBuffer[0] : this.callBuffer);
+            this.callBuffer = [];
+        }
+    },
+
+    queueTransaction: function(t){
+        if(t.form){
+            this.processForm(t);
+            return;
+        }
+        this.callBuffer.push(t);
+        if(this.enableBuffer){
+            if(!this.callTask){
+                this.callTask = new Ext.util.DelayedTask(this.combineAndSend, this);
+            }
+            this.callTask.delay(Ext.isNumber(this.enableBuffer) ? this.enableBuffer : 10);
+        }else{
+            this.combineAndSend();
+        }
+    },
+
+    doCall : function(c, m, args){
+        var data = null, hs = args[m.len], scope = args[m.len+1];
+
+        if(m.len !== 0){
+            data = args.slice(0, m.len);
+        }
+
+        var t = new Ext.Direct.Transaction({
+            provider: this,
+            args: args,
+            action: c,
+            method: m.name,
+            data: data,
+            cb: scope && Ext.isFunction(hs) ? hs.createDelegate(scope) : hs
+        });
+
+        if(this.fireEvent('beforecall', this, t, m) !== false){
+            Ext.Direct.addTransaction(t);
+            this.queueTransaction(t);
+            this.fireEvent('call', this, t, m);
+        }
+    },
+
+    doForm : function(c, m, form, callback, scope){
+        var t = new Ext.Direct.Transaction({
+            provider: this,
+            action: c,
+            method: m.name,
+            args:[form, callback, scope],
+            cb: scope && Ext.isFunction(callback) ? callback.createDelegate(scope) : callback,
+            isForm: true
+        });
+
+        if(this.fireEvent('beforecall', this, t, m) !== false){
+            Ext.Direct.addTransaction(t);
+            var isUpload = String(form.getAttribute("enctype")).toLowerCase() == 'multipart/form-data',
+                params = {
+                    extTID: t.tid,
+                    extAction: c,
+                    extMethod: m.name,
+                    extType: 'rpc',
+                    extUpload: String(isUpload)
+                };
+            
+            
+            
+            Ext.apply(t, {
+                form: Ext.getDom(form),
+                isUpload: isUpload,
+                params: callback && Ext.isObject(callback.params) ? Ext.apply(params, callback.params) : params
+            });
+            this.fireEvent('call', this, t, m);
+            this.processForm(t);
+        }
+    },
+    
+    processForm: function(t){
+        Ext.Ajax.request({
+            url: this.url,
+            params: t.params,
+            callback: this.onData,
+            scope: this,
+            form: t.form,
+            isUpload: t.isUpload,
+            ts: t
+        });
+    },
+
+    createMethod : function(c, m){
+        var f;
+        if(!m.formHandler){
+            f = function(){
+                this.doCall(c, m, Array.prototype.slice.call(arguments, 0));
+            }.createDelegate(this);
+        }else{
+            f = function(form, callback, scope){
+                this.doForm(c, m, form, callback, scope);
+            }.createDelegate(this);
+        }
+        f.directCfg = {
+            action: c,
+            method: m
+        };
+        return f;
+    },
+
+    getTransaction: function(opt){
+        return opt && opt.tid ? Ext.Direct.getTransaction(opt.tid) : null;
+    },
+
+    doCallback: function(t, e){
+        var fn = e.status ? 'success' : 'failure';
+        if(t && t.cb){
+            var hs = t.cb,
+                result = Ext.isDefined(e.result) ? e.result : e.data;
+            if(Ext.isFunction(hs)){
+                hs(result, e);
+            } else{
+                Ext.callback(hs[fn], hs.scope, [result, e]);
+                Ext.callback(hs.callback, hs.scope, [result, e]);
+            }
+        }
+    }
+});
+Ext.Direct.PROVIDERS['remoting'] = Ext.direct.RemotingProvider;
+Ext.Resizable = Ext.extend(Ext.util.Observable, {
+
+    constructor: function(el, config){
+        this.el = Ext.get(el);
+        if(config && config.wrap){
+            config.resizeChild = this.el;
+            this.el = this.el.wrap(typeof config.wrap == 'object' ? config.wrap : {cls:'xresizable-wrap'});
+            this.el.id = this.el.dom.id = config.resizeChild.id + '-rzwrap';
+            this.el.setStyle('overflow', 'hidden');
+            this.el.setPositioning(config.resizeChild.getPositioning());
+            config.resizeChild.clearPositioning();
+            if(!config.width || !config.height){
+                var csize = config.resizeChild.getSize();
+                this.el.setSize(csize.width, csize.height);
+            }
+            if(config.pinned && !config.adjustments){
+                config.adjustments = 'auto';
+            }
+        }
+
+        
+        this.proxy = this.el.createProxy({tag: 'div', cls: 'x-resizable-proxy', id: this.el.id + '-rzproxy'}, Ext.getBody());
+        this.proxy.unselectable();
+        this.proxy.enableDisplayMode('block');
+
+        Ext.apply(this, config);
+
+        if(this.pinned){
+            this.disableTrackOver = true;
+            this.el.addClass('x-resizable-pinned');
+        }
+        
+        var position = this.el.getStyle('position');
+        if(position != 'absolute' && position != 'fixed'){
+            this.el.setStyle('position', 'relative');
+        }
+        if(!this.handles){ 
+            this.handles = 's,e,se';
+            if(this.multiDirectional){
+                this.handles += ',n,w';
+            }
+        }
+        if(this.handles == 'all'){
+            this.handles = 'n s e w ne nw se sw';
+        }
+        var hs = this.handles.split(/\s*?[,;]\s*?| /);
+        var ps = Ext.Resizable.positions;
+        for(var i = 0, len = hs.length; i < len; i++){
+            if(hs[i] && ps[hs[i]]){
+                var pos = ps[hs[i]];
+                this[pos] = new Ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent, this.handleCls);
+            }
+        }
+        
+        this.corner = this.southeast;
+
+        if(this.handles.indexOf('n') != -1 || this.handles.indexOf('w') != -1){
+            this.updateBox = true;
+        }
+
+        this.activeHandle = null;
+
+        if(this.resizeChild){
+            if(typeof this.resizeChild == 'boolean'){
+                this.resizeChild = Ext.get(this.el.dom.firstChild, true);
+            }else{
+                this.resizeChild = Ext.get(this.resizeChild, true);
+            }
+        }
+
+        if(this.adjustments == 'auto'){
+            var rc = this.resizeChild;
+            var hw = this.west, he = this.east, hn = this.north, hs = this.south;
+            if(rc && (hw || hn)){
+                rc.position('relative');
+                rc.setLeft(hw ? hw.el.getWidth() : 0);
+                rc.setTop(hn ? hn.el.getHeight() : 0);
+            }
+            this.adjustments = [
+                (he ? -he.el.getWidth() : 0) + (hw ? -hw.el.getWidth() : 0),
+                (hn ? -hn.el.getHeight() : 0) + (hs ? -hs.el.getHeight() : 0) -1
+            ];
+        }
+
+        if(this.draggable){
+            this.dd = this.dynamic ?
+                this.el.initDD(null) : this.el.initDDProxy(null, {dragElId: this.proxy.id});
+            this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id : this.el.id);
+            if(this.constrainTo){
+                this.dd.constrainTo(this.constrainTo);
+            }
+        }
+
+        this.addEvents(
+            
+            'beforeresize',
+            
+            'resize'
+        );
+
+        if(this.width !== null && this.height !== null){
+            this.resizeTo(this.width, this.height);
+        }else{
+            this.updateChildSize();
+        }
+        if(Ext.isIE){
+            this.el.dom.style.zoom = 1;
+        }
+        Ext.Resizable.superclass.constructor.call(this);
+    },
+
+    
+    adjustments : [0, 0],
+    
+    animate : false,
+    
+    
+    disableTrackOver : false,
+    
+    draggable: false,
+    
+    duration : 0.35,
+    
+    dynamic : false,
+    
+    easing : 'easeOutStrong',
+    
+    enabled : true,
+    
+    
+    handles : false,
+    
+    multiDirectional : false,
+    
+    height : null,
+    
+    width : null,
+    
+    heightIncrement : 0,
+    
+    widthIncrement : 0,
+    
+    minHeight : 5,
+    
+    minWidth : 5,
+    
+    maxHeight : 10000,
+    
+    maxWidth : 10000,
+    
+    minX: 0,
+    
+    minY: 0,
+    
+    pinned : false,
+    
+    preserveRatio : false,
+    
+    resizeChild : false,
+    
+    transparent: false,
+    
+    
+    
+
+
+    
+    resizeTo : function(width, height){
+        this.el.setSize(width, height);
+        this.updateChildSize();
+        this.fireEvent('resize', this, width, height, null);
+    },
+
+    
+    startSizing : function(e, handle){
+        this.fireEvent('beforeresize', this, e);
+        if(this.enabled){ 
+
+            if(!this.overlay){
+                this.overlay = this.el.createProxy({tag: 'div', cls: 'x-resizable-overlay', html: '&#160;'}, Ext.getBody());
+                this.overlay.unselectable();
+                this.overlay.enableDisplayMode('block');
+                this.overlay.on({
+                    scope: this,
+                    mousemove: this.onMouseMove,
+                    mouseup: this.onMouseUp
+                });
+            }
+            this.overlay.setStyle('cursor', handle.el.getStyle('cursor'));
+
+            this.resizing = true;
+            this.startBox = this.el.getBox();
+            this.startPoint = e.getXY();
+            this.offsets = [(this.startBox.x + this.startBox.width) - this.startPoint[0],
+                            (this.startBox.y + this.startBox.height) - this.startPoint[1]];
+
+            this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
+            this.overlay.show();
+
+            if(this.constrainTo) {
+                var ct = Ext.get(this.constrainTo);
+                this.resizeRegion = ct.getRegion().adjust(
+                    ct.getFrameWidth('t'),
+                    ct.getFrameWidth('l'),
+                    -ct.getFrameWidth('b'),
+                    -ct.getFrameWidth('r')
+                );
+            }
+
+            this.proxy.setStyle('visibility', 'hidden'); 
+            this.proxy.show();
+            this.proxy.setBox(this.startBox);
+            if(!this.dynamic){
+                this.proxy.setStyle('visibility', 'visible');
+            }
+        }
+    },
+
+    
+    onMouseDown : function(handle, e){
+        if(this.enabled){
+            e.stopEvent();
+            this.activeHandle = handle;
+            this.startSizing(e, handle);
+        }
+    },
+
+    
+    onMouseUp : function(e){
+        this.activeHandle = null;
+        var size = this.resizeElement();
+        this.resizing = false;
+        this.handleOut();
+        this.overlay.hide();
+        this.proxy.hide();
+        this.fireEvent('resize', this, size.width, size.height, e);
+    },
+
+    
+    updateChildSize : function(){
+        if(this.resizeChild){
+            var el = this.el;
+            var child = this.resizeChild;
+            var adj = this.adjustments;
+            if(el.dom.offsetWidth){
+                var b = el.getSize(true);
+                child.setSize(b.width+adj[0], b.height+adj[1]);
+            }
+            
+            
+            
+            
+            if(Ext.isIE){
+                setTimeout(function(){
+                    if(el.dom.offsetWidth){
+                        var b = el.getSize(true);
+                        child.setSize(b.width+adj[0], b.height+adj[1]);
+                    }
+                }, 10);
+            }
+        }
+    },
+
+    
+    snap : function(value, inc, min){
+        if(!inc || !value){
+            return value;
+        }
+        var newValue = value;
+        var m = value % inc;
+        if(m > 0){
+            if(m > (inc/2)){
+                newValue = value + (inc-m);
+            }else{
+                newValue = value - m;
+            }
+        }
+        return Math.max(min, newValue);
+    },
+
+    
+    resizeElement : function(){
+        var box = this.proxy.getBox();
+        if(this.updateBox){
+            this.el.setBox(box, false, this.animate, this.duration, null, this.easing);
+        }else{
+            this.el.setSize(box.width, box.height, this.animate, this.duration, null, this.easing);
+        }
+        this.updateChildSize();
+        if(!this.dynamic){
+            this.proxy.hide();
+        }
+        if(this.draggable && this.constrainTo){
+            this.dd.resetConstraints();
+            this.dd.constrainTo(this.constrainTo);
+        }
+        return box;
+    },
+
+    
+    constrain : function(v, diff, m, mx){
+        if(v - diff < m){
+            diff = v - m;
+        }else if(v - diff > mx){
+            diff = v - mx;
+        }
+        return diff;
+    },
+
+    
+    onMouseMove : function(e){
+        if(this.enabled && this.activeHandle){
+            try{
+
+            if(this.resizeRegion && !this.resizeRegion.contains(e.getPoint())) {
+                return;
+            }
+
+            
+            var curSize = this.curSize || this.startBox,
+                x = this.startBox.x, y = this.startBox.y,
+                ox = x,
+                oy = y,
+                w = curSize.width,
+                h = curSize.height,
+                ow = w,
+                oh = h,
+                mw = this.minWidth,
+                mh = this.minHeight,
+                mxw = this.maxWidth,
+                mxh = this.maxHeight,
+                wi = this.widthIncrement,
+                hi = this.heightIncrement,
+                eventXY = e.getXY(),
+                diffX = -(this.startPoint[0] - Math.max(this.minX, eventXY[0])),
+                diffY = -(this.startPoint[1] - Math.max(this.minY, eventXY[1])),
+                pos = this.activeHandle.position,
+                tw,
+                th;
+
+            switch(pos){
+                case 'east':
+                    w += diffX;
+                    w = Math.min(Math.max(mw, w), mxw);
+                    break;
+                case 'south':
+                    h += diffY;
+                    h = Math.min(Math.max(mh, h), mxh);
+                    break;
+                case 'southeast':
+                    w += diffX;
+                    h += diffY;
+                    w = Math.min(Math.max(mw, w), mxw);
+                    h = Math.min(Math.max(mh, h), mxh);
+                    break;
+                case 'north':
+                    diffY = this.constrain(h, diffY, mh, mxh);
+                    y += diffY;
+                    h -= diffY;
+                    break;
+                case 'west':
+                    diffX = this.constrain(w, diffX, mw, mxw);
+                    x += diffX;
+                    w -= diffX;
+                    break;
+                case 'northeast':
+                    w += diffX;
+                    w = Math.min(Math.max(mw, w), mxw);
+                    diffY = this.constrain(h, diffY, mh, mxh);
+                    y += diffY;
+                    h -= diffY;
+                    break;
+                case 'northwest':
+                    diffX = this.constrain(w, diffX, mw, mxw);
+                    diffY = this.constrain(h, diffY, mh, mxh);
+                    y += diffY;
+                    h -= diffY;
+                    x += diffX;
+                    w -= diffX;
+                    break;
+               case 'southwest':
+                    diffX = this.constrain(w, diffX, mw, mxw);
+                    h += diffY;
+                    h = Math.min(Math.max(mh, h), mxh);
+                    x += diffX;
+                    w -= diffX;
+                    break;
+            }
+
+            var sw = this.snap(w, wi, mw);
+            var sh = this.snap(h, hi, mh);
+            if(sw != w || sh != h){
+                switch(pos){
+                    case 'northeast':
+                        y -= sh - h;
+                    break;
+                    case 'north':
+                        y -= sh - h;
+                        break;
+                    case 'southwest':
+                        x -= sw - w;
+                    break;
+                    case 'west':
+                        x -= sw - w;
+                        break;
+                    case 'northwest':
+                        x -= sw - w;
+                        y -= sh - h;
+                    break;
+                }
+                w = sw;
+                h = sh;
+            }
+
+            if(this.preserveRatio){
+                switch(pos){
+                    case 'southeast':
+                    case 'east':
+                        h = oh * (w/ow);
+                        h = Math.min(Math.max(mh, h), mxh);
+                        w = ow * (h/oh);
+                       break;
+                    case 'south':
+                        w = ow * (h/oh);
+                        w = Math.min(Math.max(mw, w), mxw);
+                        h = oh * (w/ow);
+                        break;
+                    case 'northeast':
+                        w = ow * (h/oh);
+                        w = Math.min(Math.max(mw, w), mxw);
+                        h = oh * (w/ow);
+                    break;
+                    case 'north':
+                        tw = w;
+                        w = ow * (h/oh);
+                        w = Math.min(Math.max(mw, w), mxw);
+                        h = oh * (w/ow);
+                        x += (tw - w) / 2;
+                        break;
+                    case 'southwest':
+                        h = oh * (w/ow);
+                        h = Math.min(Math.max(mh, h), mxh);
+                        tw = w;
+                        w = ow * (h/oh);
+                        x += tw - w;
+                        break;
+                    case 'west':
+                        th = h;
+                        h = oh * (w/ow);
+                        h = Math.min(Math.max(mh, h), mxh);
+                        y += (th - h) / 2;
+                        tw = w;
+                        w = ow * (h/oh);
+                        x += tw - w;
+                       break;
+                    case 'northwest':
+                        tw = w;
+                        th = h;
+                        h = oh * (w/ow);
+                        h = Math.min(Math.max(mh, h), mxh);
+                        w = ow * (h/oh);
+                        y += th - h;
+                        x += tw - w;
+                        break;
+
+                }
+            }
+            this.proxy.setBounds(x, y, w, h);
+            if(this.dynamic){
+                this.resizeElement();
+            }
+            }catch(ex){}
+        }
+    },
+
+    
+    handleOver : function(){
+        if(this.enabled){
+            this.el.addClass('x-resizable-over');
+        }
+    },
+
+    
+    handleOut : function(){
+        if(!this.resizing){
+            this.el.removeClass('x-resizable-over');
+        }
+    },
+
+    
+    getEl : function(){
+        return this.el;
+    },
+
+    
+    getResizeChild : function(){
+        return this.resizeChild;
+    },
+
+    
+    destroy : function(removeEl){
+        Ext.destroy(this.dd, this.overlay, this.proxy);
+        this.overlay = null;
+        this.proxy = null;
+
+        var ps = Ext.Resizable.positions;
+        for(var k in ps){
+            if(typeof ps[k] != 'function' && this[ps[k]]){
+                this[ps[k]].destroy();
+            }
+        }
+        if(removeEl){
+            this.el.update('');
+            Ext.destroy(this.el);
+            this.el = null;
+        }
+        this.purgeListeners();
+    },
+
+    syncHandleHeight : function(){
+        var h = this.el.getHeight(true);
+        if(this.west){
+            this.west.el.setHeight(h);
+        }
+        if(this.east){
+            this.east.el.setHeight(h);
+        }
+    }
+});
+
+
+
+Ext.Resizable.positions = {
+    n: 'north', s: 'south', e: 'east', w: 'west', se: 'southeast', sw: 'southwest', nw: 'northwest', ne: 'northeast'
+};
+
+Ext.Resizable.Handle = Ext.extend(Object, {
+    constructor : function(rz, pos, disableTrackOver, transparent, cls){
+       if(!this.tpl){
+            
+            var tpl = Ext.DomHelper.createTemplate(
+                {tag: 'div', cls: 'x-resizable-handle x-resizable-handle-{0}'}
+            );
+            tpl.compile();
+            Ext.Resizable.Handle.prototype.tpl = tpl;
+        }
+        this.position = pos;
+        this.rz = rz;
+        this.el = this.tpl.append(rz.el.dom, [this.position], true);
+        this.el.unselectable();
+        if(transparent){
+            this.el.setOpacity(0);
+        }
+        if(!Ext.isEmpty(cls)){
+            this.el.addClass(cls);
+        }
+        this.el.on('mousedown', this.onMouseDown, this);
+        if(!disableTrackOver){
+            this.el.on({
+                scope: this,
+                mouseover: this.onMouseOver,
+                mouseout: this.onMouseOut
+            });
+        }
+    },
+
+    
+    afterResize : function(rz){
+        
+    },
+    
+    onMouseDown : function(e){
+        this.rz.onMouseDown(this, e);
+    },
+    
+    onMouseOver : function(e){
+        this.rz.handleOver(this, e);
+    },
+    
+    onMouseOut : function(e){
+        this.rz.handleOut(this, e);
+    },
+    
+    destroy : function(){
+        Ext.destroy(this.el);
+        this.el = null;
+    }
+});
+
+Ext.Window = Ext.extend(Ext.Panel, {
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+
+    
+    baseCls : 'x-window',
+    
+    resizable : true,
+    
+    draggable : true,
+    
+    closable : true,
+    
+    closeAction : 'close',
+    
+    constrain : false,
+    
+    constrainHeader : false,
+    
+    plain : false,
+    
+    minimizable : false,
+    
+    maximizable : false,
+    
+    minHeight : 100,
+    
+    minWidth : 200,
+    
+    expandOnShow : true,
+    
+    
+    showAnimDuration: 0.25,
+    
+    
+    hideAnimDuration: 0.25,
+
+    
+    collapsible : false,
+
+    
+    initHidden : undefined,
+
+    
+    hidden : true,
+
+    
+    
+    
+    
+    
+    elements : 'header,body',
+    
+    frame : true,
+    
+    floating : true,
+
+    
+    initComponent : function(){
+        this.initTools();
+        Ext.Window.superclass.initComponent.call(this);
+        this.addEvents(
+            
+            
+            
+            'resize',
+            
+            'maximize',
+            
+            'minimize',
+            
+            'restore'
+        );
+        
+        if(Ext.isDefined(this.initHidden)){
+            this.hidden = this.initHidden;
+        }
+        if(this.hidden === false){
+            this.hidden = true;
+            this.show();
+        }
+    },
+
+    
+    getState : function(){
+        return Ext.apply(Ext.Window.superclass.getState.call(this) || {}, this.getBox(true));
+    },
+
+    
+    onRender : function(ct, position){
+        Ext.Window.superclass.onRender.call(this, ct, position);
+
+        if(this.plain){
+            this.el.addClass('x-window-plain');
+        }
+
+        
+        this.focusEl = this.el.createChild({
+                    tag: 'a', href:'#', cls:'x-dlg-focus',
+                    tabIndex:'-1', html: '&#160;'});
+        this.focusEl.swallowEvent('click', true);
+
+        this.proxy = this.el.createProxy('x-window-proxy');
+        this.proxy.enableDisplayMode('block');
+
+        if(this.modal){
+            this.mask = this.container.createChild({cls:'ext-el-mask'}, this.el.dom);
+            this.mask.enableDisplayMode('block');
+            this.mask.hide();
+            this.mon(this.mask, 'click', this.focus, this);
+        }
+        if(this.maximizable){
+            this.mon(this.header, 'dblclick', this.toggleMaximize, this);
+        }
+    },
+
+    
+    initEvents : function(){
+        Ext.Window.superclass.initEvents.call(this);
+        if(this.animateTarget){
+            this.setAnimateTarget(this.animateTarget);
+        }
+
+        if(this.resizable){
+            this.resizer = new Ext.Resizable(this.el, {
+                minWidth: this.minWidth,
+                minHeight:this.minHeight,
+                handles: this.resizeHandles || 'all',
+                pinned: true,
+                resizeElement : this.resizerAction,
+                handleCls: 'x-window-handle'
+            });
+            this.resizer.window = this;
+            this.mon(this.resizer, 'beforeresize', this.beforeResize, this);
+        }
+
+        if(this.draggable){
+            this.header.addClass('x-window-draggable');
+        }
+        this.mon(this.el, 'mousedown', this.toFront, this);
+        this.manager = this.manager || Ext.WindowMgr;
+        this.manager.register(this);
+        if(this.maximized){
+            this.maximized = false;
+            this.maximize();
+        }
+        if(this.closable){
+            var km = this.getKeyMap();
+            km.on(27, this.onEsc, this);
+            km.disable();
+        }
+    },
+
+    initDraggable : function(){
+        
+        this.dd = new Ext.Window.DD(this);
+    },
+
+   
+    onEsc : function(k, e){
+        e.stopEvent();
+        this[this.closeAction]();
+    },
+
+    
+    beforeDestroy : function(){
+        if(this.rendered){
+            this.hide();
+            this.clearAnchor();
+            Ext.destroy(
+                this.focusEl,
+                this.resizer,
+                this.dd,
+                this.proxy,
+                this.mask
+            );
+        }
+        Ext.Window.superclass.beforeDestroy.call(this);
+    },
+
+    
+    onDestroy : function(){
+        if(this.manager){
+            this.manager.unregister(this);
+        }
+        Ext.Window.superclass.onDestroy.call(this);
+    },
+
+    
+    initTools : function(){
+        if(this.minimizable){
+            this.addTool({
+                id: 'minimize',
+                handler: this.minimize.createDelegate(this, [])
+            });
+        }
+        if(this.maximizable){
+            this.addTool({
+                id: 'maximize',
+                handler: this.maximize.createDelegate(this, [])
+            });
+            this.addTool({
+                id: 'restore',
+                handler: this.restore.createDelegate(this, []),
+                hidden:true
+            });
+        }
+        if(this.closable){
+            this.addTool({
+                id: 'close',
+                handler: this[this.closeAction].createDelegate(this, [])
+            });
+        }
+    },
+
+    
+    resizerAction : function(){
+        var box = this.proxy.getBox();
+        this.proxy.hide();
+        this.window.handleResize(box);
+        return box;
+    },
+
+    
+    beforeResize : function(){
+        this.resizer.minHeight = Math.max(this.minHeight, this.getFrameHeight() + 40); 
+        this.resizer.minWidth = Math.max(this.minWidth, this.getFrameWidth() + 40);
+        this.resizeBox = this.el.getBox();
+    },
+
+    
+    updateHandles : function(){
+        if(Ext.isIE && this.resizer){
+            this.resizer.syncHandleHeight();
+            this.el.repaint();
+        }
+    },
+
+    
+    handleResize : function(box){
+        var rz = this.resizeBox;
+        if(rz.x != box.x || rz.y != box.y){
+            this.updateBox(box);
+        }else{
+            this.setSize(box);
+            if (Ext.isIE6 && Ext.isStrict) {
+                this.doLayout();
+            }
+        }
+        this.focus();
+        this.updateHandles();
+        this.saveState();
+    },
+
+    
+    focus : function(){
+        var f = this.focusEl,
+            db = this.defaultButton,
+            t = typeof db,
+            el,
+            ct;
+        if(Ext.isDefined(db)){
+            if(Ext.isNumber(db) && this.fbar){
+                f = this.fbar.items.get(db);
+            }else if(Ext.isString(db)){
+                f = Ext.getCmp(db);
+            }else{
+                f = db;
+            }
+            el = f.getEl();
+            ct = Ext.getDom(this.container);
+            if (el && ct) {
+                if (ct != document.body && !Ext.lib.Region.getRegion(ct).contains(Ext.lib.Region.getRegion(el.dom))){
+                    return;
+                }
+            }
+        }
+        f = f || this.focusEl;
+        f.focus.defer(10, f);
+    },
+
+    
+    setAnimateTarget : function(el){
+        el = Ext.get(el);
+        this.animateTarget = el;
+    },
+
+    
+    beforeShow : function(){
+        delete this.el.lastXY;
+        delete this.el.lastLT;
+        if(this.x === undefined || this.y === undefined){
+            var xy = this.el.getAlignToXY(this.container, 'c-c');
+            var pos = this.el.translatePoints(xy[0], xy[1]);
+            this.x = this.x === undefined? pos.left : this.x;
+            this.y = this.y === undefined? pos.top : this.y;
+        }
+        this.el.setLeftTop(this.x, this.y);
+
+        if(this.expandOnShow){
+            this.expand(false);
+        }
+
+        if(this.modal){
+            Ext.getBody().addClass('x-body-masked');
+            this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
+            this.mask.show();
+        }
+    },
+
+    
+    show : function(animateTarget, cb, scope){
+        if(!this.rendered){
+            this.render(Ext.getBody());
+        }
+        if(this.hidden === false){
+            this.toFront();
+            return this;
+        }
+        if(this.fireEvent('beforeshow', this) === false){
+            return this;
+        }
+        if(cb){
+            this.on('show', cb, scope, {single:true});
+        }
+        this.hidden = false;
+        if(Ext.isDefined(animateTarget)){
+            this.setAnimateTarget(animateTarget);
+        }
+        this.beforeShow();
+        if(this.animateTarget){
+            this.animShow();
+        }else{
+            this.afterShow();
+        }
+        return this;
+    },
+
+    
+    afterShow : function(isAnim){
+        if (this.isDestroyed){
+            return false;
+        }
+        this.proxy.hide();
+        this.el.setStyle('display', 'block');
+        this.el.show();
+        if(this.maximized){
+            this.fitContainer();
+        }
+        if(Ext.isMac && Ext.isGecko2){ 
+            this.cascade(this.setAutoScroll);
+        }
+
+        if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){
+            Ext.EventManager.onWindowResize(this.onWindowResize, this);
+        }
+        this.doConstrain();
+        this.doLayout();
+        if(this.keyMap){
+            this.keyMap.enable();
+        }
+        this.toFront();
+        this.updateHandles();
+        if(isAnim && (Ext.isIE || Ext.isWebKit)){
+            var sz = this.getSize();
+            this.onResize(sz.width, sz.height);
+        }
+        this.onShow();
+        this.fireEvent('show', this);
+    },
+
+    
+    animShow : function(){
+        this.proxy.show();
+        this.proxy.setBox(this.animateTarget.getBox());
+        this.proxy.setOpacity(0);
+        var b = this.getBox();
+        this.el.setStyle('display', 'none');
+        this.proxy.shift(Ext.apply(b, {
+            callback: this.afterShow.createDelegate(this, [true], false),
+            scope: this,
+            easing: 'easeNone',
+            duration: this.showAnimDuration,
+            opacity: 0.5
+        }));
+    },
+
+    
+    hide : function(animateTarget, cb, scope){
+        if(this.hidden || this.fireEvent('beforehide', this) === false){
+            return this;
+        }
+        if(cb){
+            this.on('hide', cb, scope, {single:true});
+        }
+        this.hidden = true;
+        if(animateTarget !== undefined){
+            this.setAnimateTarget(animateTarget);
+        }
+        if(this.modal){
+            this.mask.hide();
+            Ext.getBody().removeClass('x-body-masked');
+        }
+        if(this.animateTarget){
+            this.animHide();
+        }else{
+            this.el.hide();
+            this.afterHide();
+        }
+        return this;
+    },
+
+    
+    afterHide : function(){
+        this.proxy.hide();
+        if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){
+            Ext.EventManager.removeResizeListener(this.onWindowResize, this);
+        }
+        if(this.keyMap){
+            this.keyMap.disable();
+        }
+        this.onHide();
+        this.fireEvent('hide', this);
+    },
+
+    
+    animHide : function(){
+        this.proxy.setOpacity(0.5);
+        this.proxy.show();
+        var tb = this.getBox(false);
+        this.proxy.setBox(tb);
+        this.el.hide();
+        this.proxy.shift(Ext.apply(this.animateTarget.getBox(), {
+            callback: this.afterHide,
+            scope: this,
+            duration: this.hideAnimDuration,
+            easing: 'easeNone',
+            opacity: 0
+        }));
+    },
+
+    
+    onShow : Ext.emptyFn,
+
+    
+    onHide : Ext.emptyFn,
+
+    
+    onWindowResize : function(){
+        if(this.maximized){
+            this.fitContainer();
+        }
+        if(this.modal){
+            this.mask.setSize('100%', '100%');
+            var force = this.mask.dom.offsetHeight;
+            this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
+        }
+        this.doConstrain();
+    },
+
+    
+    doConstrain : function(){
+        if(this.constrain || this.constrainHeader){
+            var offsets;
+            if(this.constrain){
+                offsets = {
+                    right:this.el.shadowOffset,
+                    left:this.el.shadowOffset,
+                    bottom:this.el.shadowOffset
+                };
+            }else {
+                var s = this.getSize();
+                offsets = {
+                    right:-(s.width - 100),
+                    bottom:-(s.height - 25)
+                };
+            }
+
+            var xy = this.el.getConstrainToXY(this.container, true, offsets);
+            if(xy){
+                this.setPosition(xy[0], xy[1]);
+            }
+        }
+    },
+
+    
+    ghost : function(cls){
+        var ghost = this.createGhost(cls);
+        var box = this.getBox(true);
+        ghost.setLeftTop(box.x, box.y);
+        ghost.setWidth(box.width);
+        this.el.hide();
+        this.activeGhost = ghost;
+        return ghost;
+    },
+
+    
+    unghost : function(show, matchPosition){
+        if(!this.activeGhost) {
+            return;
+        }
+        if(show !== false){
+            this.el.show();
+            this.focus.defer(10, this);
+            if(Ext.isMac && Ext.isGecko2){ 
+                this.cascade(this.setAutoScroll);
+            }
+        }
+        if(matchPosition !== false){
+            this.setPosition(this.activeGhost.getLeft(true), this.activeGhost.getTop(true));
+        }
+        this.activeGhost.hide();
+        this.activeGhost.remove();
+        delete this.activeGhost;
+    },
+
+    
+    minimize : function(){
+        this.fireEvent('minimize', this);
+        return this;
+    },
+
+    
+    close : function(){
+        if(this.fireEvent('beforeclose', this) !== false){
+            if(this.hidden){
+                this.doClose();
+            }else{
+                this.hide(null, this.doClose, this);
+            }
+        }
+    },
+
+    
+    doClose : function(){
+        this.fireEvent('close', this);
+        this.destroy();
+    },
+
+    
+    maximize : function(){
+        if(!this.maximized){
+            this.expand(false);
+            this.restoreSize = this.getSize();
+            this.restorePos = this.getPosition(true);
+            if (this.maximizable){
+                this.tools.maximize.hide();
+                this.tools.restore.show();
+            }
+            this.maximized = true;
+            this.el.disableShadow();
+
+            if(this.dd){
+                this.dd.lock();
+            }
+            if(this.collapsible){
+                this.tools.toggle.hide();
+            }
+            this.el.addClass('x-window-maximized');
+            this.container.addClass('x-window-maximized-ct');
+
+            this.setPosition(0, 0);
+            this.fitContainer();
+            this.fireEvent('maximize', this);
+        }
+        return this;
+    },
+
+    
+    restore : function(){
+        if(this.maximized){
+            var t = this.tools;
+            this.el.removeClass('x-window-maximized');
+            if(t.restore){
+                t.restore.hide();
+            }
+            if(t.maximize){
+                t.maximize.show();
+            }
+            this.setPosition(this.restorePos[0], this.restorePos[1]);
+            this.setSize(this.restoreSize.width, this.restoreSize.height);
+            delete this.restorePos;
+            delete this.restoreSize;
+            this.maximized = false;
+            this.el.enableShadow(true);
+
+            if(this.dd){
+                this.dd.unlock();
+            }
+            if(this.collapsible && t.toggle){
+                t.toggle.show();
+            }
+            this.container.removeClass('x-window-maximized-ct');
+
+            this.doConstrain();
+            this.fireEvent('restore', this);
+        }
+        return this;
+    },
+
+    
+    toggleMaximize : function(){
+        return this[this.maximized ? 'restore' : 'maximize']();
+    },
+
+    
+    fitContainer : function(){
+        var vs = this.container.getViewSize(false);
+        this.setSize(vs.width, vs.height);
+    },
+
+    
+    
+    setZIndex : function(index){
+        if(this.modal){
+            this.mask.setStyle('z-index', index);
+        }
+        this.el.setZIndex(++index);
+        index += 5;
+
+        if(this.resizer){
+            this.resizer.proxy.setStyle('z-index', ++index);
+        }
+
+        this.lastZIndex = index;
+    },
+
+    
+    alignTo : function(element, position, offsets){
+        var xy = this.el.getAlignToXY(element, position, offsets);
+        this.setPagePosition(xy[0], xy[1]);
+        return this;
+    },
+
+    
+    anchorTo : function(el, alignment, offsets, monitorScroll){
+        this.clearAnchor();
+        this.anchorTarget = {
+            el: el,
+            alignment: alignment,
+            offsets: offsets
+        };
+
+        Ext.EventManager.onWindowResize(this.doAnchor, this);
+        var tm = typeof monitorScroll;
+        if(tm != 'undefined'){
+            Ext.EventManager.on(window, 'scroll', this.doAnchor, this,
+                {buffer: tm == 'number' ? monitorScroll : 50});
+        }
+        return this.doAnchor();
+    },
+
+    
+    doAnchor : function(){
+        var o = this.anchorTarget;
+        this.alignTo(o.el, o.alignment, o.offsets);
+        return this;
+    },
+
+    
+    clearAnchor : function(){
+        if(this.anchorTarget){
+            Ext.EventManager.removeResizeListener(this.doAnchor, this);
+            Ext.EventManager.un(window, 'scroll', this.doAnchor, this);
+            delete this.anchorTarget;
+        }
+        return this;
+    },
+
+    
+    toFront : function(e){
+        if(this.manager.bringToFront(this)){
+            if(!e || !e.getTarget().focus){
+                this.focus();
+            }
+        }
+        return this;
+    },
+
+    
+    setActive : function(active){
+        if(active){
+            if(!this.maximized){
+                this.el.enableShadow(true);
+            }
+            this.fireEvent('activate', this);
+        }else{
+            this.el.disableShadow();
+            this.fireEvent('deactivate', this);
+        }
+    },
+
+    
+    toBack : function(){
+        this.manager.sendToBack(this);
+        return this;
+    },
+
+    
+    center : function(){
+        var xy = this.el.getAlignToXY(this.container, 'c-c');
+        this.setPagePosition(xy[0], xy[1]);
+        return this;
+    }
+
+    
+});
+Ext.reg('window', Ext.Window);
+
+
+Ext.Window.DD = Ext.extend(Ext.dd.DD, {
+    
+    constructor : function(win){
+        this.win = win;
+        Ext.Window.DD.superclass.constructor.call(this, win.el.id, 'WindowDD-'+win.id);
+        this.setHandleElId(win.header.id);
+        this.scroll = false;        
+    },
+    
+    moveOnly:true,
+    headerOffsets:[100, 25],
+    startDrag : function(){
+        var w = this.win;
+        this.proxy = w.ghost(w.initialConfig.cls);
+        if(w.constrain !== false){
+            var so = w.el.shadowOffset;
+            this.constrainTo(w.container, {right: so, left: so, bottom: so});
+        }else if(w.constrainHeader !== false){
+            var s = this.proxy.getSize();
+            this.constrainTo(w.container, {right: -(s.width-this.headerOffsets[0]), bottom: -(s.height-this.headerOffsets[1])});
+        }
+    },
+    b4Drag : Ext.emptyFn,
+
+    onDrag : function(e){
+        this.alignElWithMouse(this.proxy, e.getPageX(), e.getPageY());
+    },
+
+    endDrag : function(e){
+        this.win.unghost();
+        this.win.saveState();
+    }
+});
+
+Ext.WindowGroup = function(){
+    var list = {};
+    var accessList = [];
+    var front = null;
+
+    
+    var sortWindows = function(d1, d2){
+        return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1;
+    };
+
+    
+    var orderWindows = function(){
+        var a = accessList, len = a.length;
+        if(len > 0){
+            a.sort(sortWindows);
+            var seed = a[0].manager.zseed;
+            for(var i = 0; i < len; i++){
+                var win = a[i];
+                if(win && !win.hidden){
+                    win.setZIndex(seed + (i*10));
+                }
+            }
+        }
+        activateLast();
+    };
+
+    
+    var setActiveWin = function(win){
+        if(win != front){
+            if(front){
+                front.setActive(false);
+            }
+            front = win;
+            if(win){
+                win.setActive(true);
+            }
+        }
+    };
+
+    
+    var activateLast = function(){
+        for(var i = accessList.length-1; i >=0; --i) {
+            if(!accessList[i].hidden){
+                setActiveWin(accessList[i]);
+                return;
+            }
+        }
+        
+        setActiveWin(null);
+    };
+
+    return {
+        
+        zseed : 9000,
+
+        
+        register : function(win){
+            if(win.manager){
+                win.manager.unregister(win);
+            }
+            win.manager = this;
+
+            list[win.id] = win;
+            accessList.push(win);
+            win.on('hide', activateLast);
+        },
+
+        
+        unregister : function(win){
+            delete win.manager;
+            delete list[win.id];
+            win.un('hide', activateLast);
+            accessList.remove(win);
+        },
+
+        
+        get : function(id){
+            return typeof id == "object" ? id : list[id];
+        },
+
+        
+        bringToFront : function(win){
+            win = this.get(win);
+            if(win != front){
+                win._lastAccess = new Date().getTime();
+                orderWindows();
+                return true;
+            }
+            return false;
+        },
+
+        
+        sendToBack : function(win){
+            win = this.get(win);
+            win._lastAccess = -(new Date().getTime());
+            orderWindows();
+            return win;
+        },
+
+        
+        hideAll : function(){
+            for(var id in list){
+                if(list[id] && typeof list[id] != "function" && list[id].isVisible()){
+                    list[id].hide();
+                }
+            }
+        },
+
+        
+        getActive : function(){
+            return front;
+        },
+
+        
+        getBy : function(fn, scope){
+            var r = [];
+            for(var i = accessList.length-1; i >=0; --i) {
+                var win = accessList[i];
+                if(fn.call(scope||win, win) !== false){
+                    r.push(win);
+                }
+            }
+            return r;
+        },
+
+        
+        each : function(fn, scope){
+            for(var id in list){
+                if(list[id] && typeof list[id] != "function"){
+                    if(fn.call(scope || list[id], list[id]) === false){
+                        return;
+                    }
+                }
+            }
+        }
+    };
+};
+
+
+
+Ext.WindowMgr = new Ext.WindowGroup();
+Ext.MessageBox = function(){
+    var dlg, opt, mask, waitTimer,
+        bodyEl, msgEl, textboxEl, textareaEl, progressBar, pp, iconEl, spacerEl,
+        buttons, activeTextEl, bwidth, bufferIcon = '', iconCls = '',
+        buttonNames = ['ok', 'yes', 'no', 'cancel'];
+
+    
+    var handleButton = function(button){
+        buttons[button].blur();
+        if(dlg.isVisible()){
+            dlg.hide();
+            handleHide();
+            Ext.callback(opt.fn, opt.scope||window, [button, activeTextEl.dom.value, opt], 1);
+        }
+    };
+
+    
+    var handleHide = function(){
+        if(opt && opt.cls){
+            dlg.el.removeClass(opt.cls);
+        }
+        progressBar.reset();        
+    };
+
+    
+    var handleEsc = function(d, k, e){
+        if(opt && opt.closable !== false){
+            dlg.hide();
+            handleHide();
+        }
+        if(e){
+            e.stopEvent();
+        }
+    };
+
+    
+    var updateButtons = function(b){
+        var width = 0,
+            cfg;
+        if(!b){
+            Ext.each(buttonNames, function(name){
+                buttons[name].hide();
+            });
+            return width;
+        }
+        dlg.footer.dom.style.display = '';
+        Ext.iterate(buttons, function(name, btn){
+            cfg = b[name];
+            if(cfg){
+                btn.show();
+                btn.setText(Ext.isString(cfg) ? cfg : Ext.MessageBox.buttonText[name]);
+                width += btn.getEl().getWidth() + 15;
+            }else{
+                btn.hide();
+            }
+        });
+        return width;
+    };
+
+    return {
+        
+        getDialog : function(titleText){
+           if(!dlg){
+                var btns = [];
+                
+                buttons = {};
+                Ext.each(buttonNames, function(name){
+                    btns.push(buttons[name] = new Ext.Button({
+                        text: this.buttonText[name],
+                        handler: handleButton.createCallback(name),
+                        hideMode: 'offsets'
+                    }));
+                }, this);
+                dlg = new Ext.Window({
+                    autoCreate : true,
+                    title:titleText,
+                    resizable:false,
+                    constrain:true,
+                    constrainHeader:true,
+                    minimizable : false,
+                    maximizable : false,
+                    stateful: false,
+                    modal: true,
+                    shim:true,
+                    buttonAlign:"center",
+                    width:400,
+                    height:100,
+                    minHeight: 80,
+                    plain:true,
+                    footer:true,
+                    closable:true,
+                    close : function(){
+                        if(opt && opt.buttons && opt.buttons.no && !opt.buttons.cancel){
+                            handleButton("no");
+                        }else{
+                            handleButton("cancel");
+                        }
+                    },
+                    fbar: new Ext.Toolbar({
+                        items: btns,
+                        enableOverflow: false
+                    })
+                });
+                dlg.render(document.body);
+                dlg.getEl().addClass('x-window-dlg');
+                mask = dlg.mask;
+                bodyEl = dlg.body.createChild({
+                    html:'<div class="ext-mb-icon"></div><div class="ext-mb-content"><span class="ext-mb-text"></span><br /><div class="ext-mb-fix-cursor"><input type="text" class="ext-mb-input" /><textarea class="ext-mb-textarea"></textarea></div></div>'
+                });
+                iconEl = Ext.get(bodyEl.dom.firstChild);
+                var contentEl = bodyEl.dom.childNodes[1];
+                msgEl = Ext.get(contentEl.firstChild);
+                textboxEl = Ext.get(contentEl.childNodes[2].firstChild);
+                textboxEl.enableDisplayMode();
+                textboxEl.addKeyListener([10,13], function(){
+                    if(dlg.isVisible() && opt && opt.buttons){
+                        if(opt.buttons.ok){
+                            handleButton("ok");
+                        }else if(opt.buttons.yes){
+                            handleButton("yes");
+                        }
+                    }
+                });
+                textareaEl = Ext.get(contentEl.childNodes[2].childNodes[1]);
+                textareaEl.enableDisplayMode();
+                progressBar = new Ext.ProgressBar({
+                    renderTo:bodyEl
+                });
+               bodyEl.createChild({cls:'x-clear'});
+            }
+            return dlg;
+        },
+
+        
+        updateText : function(text){
+            if(!dlg.isVisible() && !opt.width){
+                dlg.setSize(this.maxWidth, 100); 
+            }
+            
+            msgEl.update(text ? text + ' ' : '&#160;');
+
+            var iw = iconCls != '' ? (iconEl.getWidth() + iconEl.getMargins('lr')) : 0,
+                mw = msgEl.getWidth() + msgEl.getMargins('lr'),
+                fw = dlg.getFrameWidth('lr'),
+                bw = dlg.body.getFrameWidth('lr'),
+                w;
+                
+            w = Math.max(Math.min(opt.width || iw+mw+fw+bw, opt.maxWidth || this.maxWidth),
+                    Math.max(opt.minWidth || this.minWidth, bwidth || 0));
+
+            if(opt.prompt === true){
+                activeTextEl.setWidth(w-iw-fw-bw);
+            }
+            if(opt.progress === true || opt.wait === true){
+                progressBar.setSize(w-iw-fw-bw);
+            }
+            if(Ext.isIE && w == bwidth){
+                w += 4; 
+            }
+            msgEl.update(text || '&#160;');
+            dlg.setSize(w, 'auto').center();
+            return this;
+        },
+
+        
+        updateProgress : function(value, progressText, msg){
+            progressBar.updateProgress(value, progressText);
+            if(msg){
+                this.updateText(msg);
+            }
+            return this;
+        },
+
+        
+        isVisible : function(){
+            return dlg && dlg.isVisible();
+        },
+
+        
+        hide : function(){
+            var proxy = dlg ? dlg.activeGhost : null;
+            if(this.isVisible() || proxy){
+                dlg.hide();
+                handleHide();
+                if (proxy){
+                    
+                    
+                    dlg.unghost(false, false);
+                } 
+            }
+            return this;
+        },
+
+        
+        show : function(options){
+            if(this.isVisible()){
+                this.hide();
+            }
+            opt = options;
+            var d = this.getDialog(opt.title || "&#160;");
+
+            d.setTitle(opt.title || "&#160;");
+            var allowClose = (opt.closable !== false && opt.progress !== true && opt.wait !== true);
+            d.tools.close.setDisplayed(allowClose);
+            activeTextEl = textboxEl;
+            opt.prompt = opt.prompt || (opt.multiline ? true : false);
+            if(opt.prompt){
+                if(opt.multiline){
+                    textboxEl.hide();
+                    textareaEl.show();
+                    textareaEl.setHeight(Ext.isNumber(opt.multiline) ? opt.multiline : this.defaultTextHeight);
+                    activeTextEl = textareaEl;
+                }else{
+                    textboxEl.show();
+                    textareaEl.hide();
+                }
+            }else{
+                textboxEl.hide();
+                textareaEl.hide();
+            }
+            activeTextEl.dom.value = opt.value || "";
+            if(opt.prompt){
+                d.focusEl = activeTextEl;
+            }else{
+                var bs = opt.buttons;
+                var db = null;
+                if(bs && bs.ok){
+                    db = buttons["ok"];
+                }else if(bs && bs.yes){
+                    db = buttons["yes"];
+                }
+                if (db){
+                    d.focusEl = db;
+                }
+            }
+            if(Ext.isDefined(opt.iconCls)){
+              d.setIconClass(opt.iconCls);
+            }
+            this.setIcon(Ext.isDefined(opt.icon) ? opt.icon : bufferIcon);
+            bwidth = updateButtons(opt.buttons);
+            progressBar.setVisible(opt.progress === true || opt.wait === true);
+            this.updateProgress(0, opt.progressText);
+            this.updateText(opt.msg);
+            if(opt.cls){
+                d.el.addClass(opt.cls);
+            }
+            d.proxyDrag = opt.proxyDrag === true;
+            d.modal = opt.modal !== false;
+            d.mask = opt.modal !== false ? mask : false;
+            if(!d.isVisible()){
+                
+                document.body.appendChild(dlg.el.dom);
+                d.setAnimateTarget(opt.animEl);
+                
+                d.on('show', function(){
+                    if(allowClose === true){
+                        d.keyMap.enable();
+                    }else{
+                        d.keyMap.disable();
+                    }
+                }, this, {single:true});
+                d.show(opt.animEl);
+            }
+            if(opt.wait === true){
+                progressBar.wait(opt.waitConfig);
+            }
+            return this;
+        },
+
+        
+        setIcon : function(icon){
+            if(!dlg){
+                bufferIcon = icon;
+                return;
+            }
+            bufferIcon = undefined;
+            if(icon && icon != ''){
+                iconEl.removeClass('x-hidden');
+                iconEl.replaceClass(iconCls, icon);
+                bodyEl.addClass('x-dlg-icon');
+                iconCls = icon;
+            }else{
+                iconEl.replaceClass(iconCls, 'x-hidden');
+                bodyEl.removeClass('x-dlg-icon');
+                iconCls = '';
+            }
+            return this;
+        },
+
+        
+        progress : function(title, msg, progressText){
+            this.show({
+                title : title,
+                msg : msg,
+                buttons: false,
+                progress:true,
+                closable:false,
+                minWidth: this.minProgressWidth,
+                progressText: progressText
+            });
+            return this;
+        },
+
+        
+        wait : function(msg, title, config){
+            this.show({
+                title : title,
+                msg : msg,
+                buttons: false,
+                closable:false,
+                wait:true,
+                modal:true,
+                minWidth: this.minProgressWidth,
+                waitConfig: config
+            });
+            return this;
+        },
+
+        
+        alert : function(title, msg, fn, scope){
+            this.show({
+                title : title,
+                msg : msg,
+                buttons: this.OK,
+                fn: fn,
+                scope : scope,
+                minWidth: this.minWidth
+            });
+            return this;
+        },
+
+        
+        confirm : function(title, msg, fn, scope){
+            this.show({
+                title : title,
+                msg : msg,
+                buttons: this.YESNO,
+                fn: fn,
+                scope : scope,
+                icon: this.QUESTION,
+                minWidth: this.minWidth
+            });
+            return this;
+        },
+
+        
+        prompt : function(title, msg, fn, scope, multiline, value){
+            this.show({
+                title : title,
+                msg : msg,
+                buttons: this.OKCANCEL,
+                fn: fn,
+                minWidth: this.minPromptWidth,
+                scope : scope,
+                prompt:true,
+                multiline: multiline,
+                value: value
+            });
+            return this;
+        },
+
+        
+        OK : {ok:true},
+        
+        CANCEL : {cancel:true},
+        
+        OKCANCEL : {ok:true, cancel:true},
+        
+        YESNO : {yes:true, no:true},
+        
+        YESNOCANCEL : {yes:true, no:true, cancel:true},
+        
+        INFO : 'ext-mb-info',
+        
+        WARNING : 'ext-mb-warning',
+        
+        QUESTION : 'ext-mb-question',
+        
+        ERROR : 'ext-mb-error',
+
+        
+        defaultTextHeight : 75,
+        
+        maxWidth : 600,
+        
+        minWidth : 100,
+        
+        minProgressWidth : 250,
+        
+        minPromptWidth: 250,
+        
+        buttonText : {
+            ok : "OK",
+            cancel : "Cancel",
+            yes : "Yes",
+            no : "No"
+        }
+    };
+}();
+
+
+Ext.Msg = Ext.MessageBox;
+Ext.dd.PanelProxy  = Ext.extend(Object, {
+    
+    constructor : function(panel, config){
+        this.panel = panel;
+        this.id = this.panel.id +'-ddproxy';
+        Ext.apply(this, config);        
+    },
+    
+    
+    insertProxy : true,
+
+    
+    setStatus : Ext.emptyFn,
+    reset : Ext.emptyFn,
+    update : Ext.emptyFn,
+    stop : Ext.emptyFn,
+    sync: Ext.emptyFn,
+
+    
+    getEl : function(){
+        return this.ghost;
+    },
+
+    
+    getGhost : function(){
+        return this.ghost;
+    },
+
+    
+    getProxy : function(){
+        return this.proxy;
+    },
+
+    
+    hide : function(){
+        if(this.ghost){
+            if(this.proxy){
+                this.proxy.remove();
+                delete this.proxy;
+            }
+            this.panel.el.dom.style.display = '';
+            this.ghost.remove();
+            delete this.ghost;
+        }
+    },
+
+    
+    show : function(){
+        if(!this.ghost){
+            this.ghost = this.panel.createGhost(this.panel.initialConfig.cls, undefined, Ext.getBody());
+            this.ghost.setXY(this.panel.el.getXY());
+            if(this.insertProxy){
+                this.proxy = this.panel.el.insertSibling({cls:'x-panel-dd-spacer'});
+                this.proxy.setSize(this.panel.getSize());
+            }
+            this.panel.el.dom.style.display = 'none';
+        }
+    },
+
+    
+    repair : function(xy, callback, scope){
+        this.hide();
+        if(typeof callback == "function"){
+            callback.call(scope || this);
+        }
+    },
+
+    
+    moveProxy : function(parentNode, before){
+        if(this.proxy){
+            parentNode.insertBefore(this.proxy.dom, before);
+        }
+    }
+});
+
+
+Ext.Panel.DD = Ext.extend(Ext.dd.DragSource, {
+    
+    constructor : function(panel, cfg){
+        this.panel = panel;
+        this.dragData = {panel: panel};
+        this.proxy = new Ext.dd.PanelProxy(panel, cfg);
+        Ext.Panel.DD.superclass.constructor.call(this, panel.el, cfg);
+        var h = panel.header,
+            el = panel.body;
+        if(h){
+            this.setHandleElId(h.id);
+            el = panel.header;
+        }
+        el.setStyle('cursor', 'move');
+        this.scroll = false;        
+    },
+    
+    showFrame: Ext.emptyFn,
+    startDrag: Ext.emptyFn,
+    b4StartDrag: function(x, y) {
+        this.proxy.show();
+    },
+    b4MouseDown: function(e) {
+        var x = e.getPageX(),
+            y = e.getPageY();
+        this.autoOffset(x, y);
+    },
+    onInitDrag : function(x, y){
+        this.onStartDrag(x, y);
+        return true;
+    },
+    createFrame : Ext.emptyFn,
+    getDragEl : function(e){
+        return this.proxy.ghost.dom;
+    },
+    endDrag : function(e){
+        this.proxy.hide();
+        this.panel.saveState();
+    },
+
+    autoOffset : function(x, y) {
+        x -= this.startPageX;
+        y -= this.startPageY;
+        this.setDelta(x, y);
+    }
+});
+Ext.state.Provider = Ext.extend(Ext.util.Observable, {
+    
+    constructor : function(){
+        
+        this.addEvents("statechange");
+        this.state = {};
+        Ext.state.Provider.superclass.constructor.call(this);
+    },
+    
+    
+    get : function(name, defaultValue){
+        return typeof this.state[name] == "undefined" ?
+            defaultValue : this.state[name];
+    },
+
+    
+    clear : function(name){
+        delete this.state[name];
+        this.fireEvent("statechange", this, name, null);
+    },
+
+    
+    set : function(name, value){
+        this.state[name] = value;
+        this.fireEvent("statechange", this, name, value);
+    },
+
+    
+    decodeValue : function(cookie){
+        
+        var re = /^(a|n|d|b|s|o|e)\:(.*)$/,
+            matches = re.exec(unescape(cookie)),
+            all,
+            type,
+            v,
+            kv;
+        if(!matches || !matches[1]){
+            return; 
+        }
+        type = matches[1];
+        v = matches[2];
+        switch(type){
+            case 'e':
+                return null;
+            case 'n':
+                return parseFloat(v);
+            case 'd':
+                return new Date(Date.parse(v));
+            case 'b':
+                return (v == '1');
+            case 'a':
+                all = [];
+                if(v != ''){
+                    Ext.each(v.split('^'), function(val){
+                        all.push(this.decodeValue(val));
+                    }, this);
+                }
+                return all;
+           case 'o':
+                all = {};
+                if(v != ''){
+                    Ext.each(v.split('^'), function(val){
+                        kv = val.split('=');
+                        all[kv[0]] = this.decodeValue(kv[1]);
+                    }, this);
+                }
+                return all;
+           default:
+                return v;
+        }
+    },
+
+    
+    encodeValue : function(v){
+        var enc,
+            flat = '',
+            i = 0,
+            len,
+            key;
+        if(v == null){
+            return 'e:1';    
+        }else if(typeof v == 'number'){
+            enc = 'n:' + v;
+        }else if(typeof v == 'boolean'){
+            enc = 'b:' + (v ? '1' : '0');
+        }else if(Ext.isDate(v)){
+            enc = 'd:' + v.toGMTString();
+        }else if(Ext.isArray(v)){
+            for(len = v.length; i < len; i++){
+                flat += this.encodeValue(v[i]);
+                if(i != len - 1){
+                    flat += '^';
+                }
+            }
+            enc = 'a:' + flat;
+        }else if(typeof v == 'object'){
+            for(key in v){
+                if(typeof v[key] != 'function' && v[key] !== undefined){
+                    flat += key + '=' + this.encodeValue(v[key]) + '^';
+                }
+            }
+            enc = 'o:' + flat.substring(0, flat.length-1);
+        }else{
+            enc = 's:' + v;
+        }
+        return escape(enc);
+    }
+});
+
+Ext.state.Manager = function(){
+    var provider = new Ext.state.Provider();
+
+    return {
+        
+        setProvider : function(stateProvider){
+            provider = stateProvider;
+        },
+
+        
+        get : function(key, defaultValue){
+            return provider.get(key, defaultValue);
+        },
+
+        
+         set : function(key, value){
+            provider.set(key, value);
+        },
+
+        
+        clear : function(key){
+            provider.clear(key);
+        },
+
+        
+        getProvider : function(){
+            return provider;
+        }
+    };
+}();
+
+Ext.state.CookieProvider = Ext.extend(Ext.state.Provider, {
+    
+    constructor : function(config){
+        Ext.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;
+        Ext.apply(this, config);
+        this.state = this.readCookies();
+    },
+    
+    
+    set : function(name, value){
+        if(typeof value == "undefined" || value === null){
+            this.clear(name);
+            return;
+        }
+        this.setCookie(name, value);
+        Ext.state.CookieProvider.superclass.set.call(this, name, value);
+    },
+
+    
+    clear : function(name){
+        this.clearCookie(name);
+        Ext.state.CookieProvider.superclass.clear.call(this, name);
+    },
+
+    
+    readCookies : function(){
+        var cookies = {},
+            c = document.cookie + ";",
+            re = /\s?(.*?)=(.*?);/g,
+           matches,
+            name,
+            value;
+       while((matches = re.exec(c)) != null){
+            name = matches[1];
+            value = matches[2];
+            if(name && name.substring(0,3) == "ys-"){
+                cookies[name.substr(3)] = this.decodeValue(value);
+            }
+        }
+        return cookies;
+    },
+
+    
+    setCookie : function(name, value){
+        document.cookie = "ys-"+ name + "=" + this.encodeValue(value) +
+           ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) +
+           ((this.path == null) ? "" : ("; path=" + this.path)) +
+           ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
+           ((this.secure == true) ? "; secure" : "");
+    },
+
+    
+    clearCookie : function(name){
+        document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +
+           ((this.path == null) ? "" : ("; path=" + this.path)) +
+           ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
+           ((this.secure == true) ? "; secure" : "");
+    }
+});
+Ext.DataView = Ext.extend(Ext.BoxComponent, {
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    selectedClass : "x-view-selected",
+    
+    emptyText : "",
+
+    
+    deferEmptyText: true,
+    
+    trackOver: false,
+    
+    
+    blockRefresh: false,
+
+    
+    last: false,
+
+    
+    initComponent : function(){
+        Ext.DataView.superclass.initComponent.call(this);
+        if(Ext.isString(this.tpl) || Ext.isArray(this.tpl)){
+            this.tpl = new Ext.XTemplate(this.tpl);
+        }
+
+        this.addEvents(
+            
+            "beforeclick",
+            
+            "click",
+            
+            "mouseenter",
+            
+            "mouseleave",
+            
+            "containerclick",
+            
+            "dblclick",
+            
+            "contextmenu",
+            
+            "containercontextmenu",
+            
+            "selectionchange",
+
+            
+            "beforeselect"
+        );
+
+        this.store = Ext.StoreMgr.lookup(this.store);
+        this.all = new Ext.CompositeElementLite();
+        this.selected = new Ext.CompositeElementLite();
+    },
+
+    
+    afterRender : function(){
+        Ext.DataView.superclass.afterRender.call(this);
+
+               this.mon(this.getTemplateTarget(), {
+            "click": this.onClick,
+            "dblclick": this.onDblClick,
+            "contextmenu": this.onContextMenu,
+            scope:this
+        });
+
+        if(this.overClass || this.trackOver){
+            this.mon(this.getTemplateTarget(), {
+                "mouseover": this.onMouseOver,
+                "mouseout": this.onMouseOut,
+                scope:this
+            });
+        }
+
+        if(this.store){
+            this.bindStore(this.store, true);
+        }
+    },
+
+    
+    refresh : function() {
+        this.clearSelections(false, true);
+        var el = this.getTemplateTarget(),
+            records = this.store.getRange();
+            
+        el.update('');
+        if(records.length < 1){
+            if(!this.deferEmptyText || this.hasSkippedEmptyText){
+                el.update(this.emptyText);
+            }
+            this.all.clear();
+        }else{
+            this.tpl.overwrite(el, this.collectData(records, 0));
+            this.all.fill(Ext.query(this.itemSelector, el.dom));
+            this.updateIndexes(0);
+        }
+        this.hasSkippedEmptyText = true;
+    },
+
+    getTemplateTarget: function(){
+        return this.el;
+    },
+
+    
+    prepareData : function(data){
+        return data;
+    },
+
+    
+    collectData : function(records, startIndex){
+        var r = [],
+            i = 0,
+            len = records.length;
+        for(; i < len; i++){
+            r[r.length] = this.prepareData(records[i].data, startIndex + i, records[i]);
+        }
+        return r;
+    },
+
+    
+    bufferRender : function(records, index){
+        var div = document.createElement('div');
+        this.tpl.overwrite(div, this.collectData(records, index));
+        return Ext.query(this.itemSelector, div);
+    },
+
+    
+    onUpdate : function(ds, record){
+        var index = this.store.indexOf(record);
+        if(index > -1){
+            var sel = this.isSelected(index),
+                original = this.all.elements[index],
+                node = this.bufferRender([record], index)[0];
+
+            this.all.replaceElement(index, node, true);
+            if(sel){
+                this.selected.replaceElement(original, node);
+                this.all.item(index).addClass(this.selectedClass);
+            }
+            this.updateIndexes(index, index);
+        }
+    },
+
+    
+    onAdd : function(ds, records, index){
+        if(this.all.getCount() === 0){
+            this.refresh();
+            return;
+        }
+        var nodes = this.bufferRender(records, index), n, a = this.all.elements;
+        if(index < this.all.getCount()){
+            n = this.all.item(index).insertSibling(nodes, 'before', true);
+            a.splice.apply(a, [index, 0].concat(nodes));
+        }else{
+            n = this.all.last().insertSibling(nodes, 'after', true);
+            a.push.apply(a, nodes);
+        }
+        this.updateIndexes(index);
+    },
+
+    
+    onRemove : function(ds, record, index){
+        this.deselect(index);
+        this.all.removeElement(index, true);
+        this.updateIndexes(index);
+        if (this.store.getCount() === 0){
+            this.refresh();
+        }
+    },
+
+    
+    refreshNode : function(index){
+        this.onUpdate(this.store, this.store.getAt(index));
+    },
+
+    
+    updateIndexes : function(startIndex, endIndex){
+        var ns = this.all.elements;
+        startIndex = startIndex || 0;
+        endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length - 1));
+        for(var i = startIndex; i <= endIndex; i++){
+            ns[i].viewIndex = i;
+        }
+    },
+    
+    
+    getStore : function(){
+        return this.store;
+    },
+
+    
+    bindStore : function(store, initial){
+        if(!initial && this.store){
+            if(store !== this.store && this.store.autoDestroy){
+                this.store.destroy();
+            }else{
+                this.store.un("beforeload", this.onBeforeLoad, this);
+                this.store.un("datachanged", this.onDataChanged, this);
+                this.store.un("add", this.onAdd, this);
+                this.store.un("remove", this.onRemove, this);
+                this.store.un("update", this.onUpdate, this);
+                this.store.un("clear", this.refresh, this);
+            }
+            if(!store){
+                this.store = null;
+            }
+        }
+        if(store){
+            store = Ext.StoreMgr.lookup(store);
+            store.on({
+                scope: this,
+                beforeload: this.onBeforeLoad,
+                datachanged: this.onDataChanged,
+                add: this.onAdd,
+                remove: this.onRemove,
+                update: this.onUpdate,
+                clear: this.refresh
+            });
+        }
+        this.store = store;
+        if(store){
+            this.refresh();
+        }
+    },
+    
+    
+    onDataChanged: function() {
+        if (this.blockRefresh !== true) {
+            this.refresh.apply(this, arguments);
+        }
+    },
+
+    
+    findItemFromChild : function(node){
+        return Ext.fly(node).findParent(this.itemSelector, this.getTemplateTarget());
+    },
+
+    
+    onClick : function(e){
+        var item = e.getTarget(this.itemSelector, this.getTemplateTarget()),
+            index;
+        if(item){
+            index = this.indexOf(item);
+            if(this.onItemClick(item, index, e) !== false){
+                this.fireEvent("click", this, index, item, e);
+            }
+        }else{
+            if(this.fireEvent("containerclick", this, e) !== false){
+                this.onContainerClick(e);
+            }
+        }
+    },
+
+    onContainerClick : function(e){
+        this.clearSelections();
+    },
+
+    
+    onContextMenu : function(e){
+        var item = e.getTarget(this.itemSelector, this.getTemplateTarget());
+        if(item){
+            this.fireEvent("contextmenu", this, this.indexOf(item), item, e);
+        }else{
+            this.fireEvent("containercontextmenu", this, e);
+        }
+    },
+
+    
+    onDblClick : function(e){
+        var item = e.getTarget(this.itemSelector, this.getTemplateTarget());
+        if(item){
+            this.fireEvent("dblclick", this, this.indexOf(item), item, e);
+        }
+    },
+
+    
+    onMouseOver : function(e){
+        var item = e.getTarget(this.itemSelector, this.getTemplateTarget());
+        if(item && item !== this.lastItem){
+            this.lastItem = item;
+            Ext.fly(item).addClass(this.overClass);
+            this.fireEvent("mouseenter", this, this.indexOf(item), item, e);
+        }
+    },
+
+    
+    onMouseOut : function(e){
+        if(this.lastItem){
+            if(!e.within(this.lastItem, true, true)){
+                Ext.fly(this.lastItem).removeClass(this.overClass);
+                this.fireEvent("mouseleave", this, this.indexOf(this.lastItem), this.lastItem, e);
+                delete this.lastItem;
+            }
+        }
+    },
+
+    
+    onItemClick : function(item, index, e){
+        if(this.fireEvent("beforeclick", this, index, item, e) === false){
+            return false;
+        }
+        if(this.multiSelect){
+            this.doMultiSelection(item, index, e);
+            e.preventDefault();
+        }else if(this.singleSelect){
+            this.doSingleSelection(item, index, e);
+            e.preventDefault();
+        }
+        return true;
+    },
+
+    
+    doSingleSelection : function(item, index, e){
+        if(e.ctrlKey && this.isSelected(index)){
+            this.deselect(index);
+        }else{
+            this.select(index, false);
+        }
+    },
+
+    
+    doMultiSelection : function(item, index, e){
+        if(e.shiftKey && this.last !== false){
+            var last = this.last;
+            this.selectRange(last, index, e.ctrlKey);
+            this.last = last; 
+        }else{
+            if((e.ctrlKey||this.simpleSelect) && this.isSelected(index)){
+                this.deselect(index);
+            }else{
+                this.select(index, e.ctrlKey || e.shiftKey || this.simpleSelect);
+            }
+        }
+    },
+
+    
+    getSelectionCount : function(){
+        return this.selected.getCount();
+    },
+
+    
+    getSelectedNodes : function(){
+        return this.selected.elements;
+    },
+
+    
+    getSelectedIndexes : function(){
+        var indexes = [], 
+            selected = this.selected.elements,
+            i = 0,
+            len = selected.length;
+            
+        for(; i < len; i++){
+            indexes.push(selected[i].viewIndex);
+        }
+        return indexes;
+    },
+
+    
+    getSelectedRecords : function(){
+        return this.getRecords(this.selected.elements);
+    },
+
+    
+    getRecords : function(nodes){
+        var records = [], 
+            i = 0,
+            len = nodes.length;
+            
+        for(; i < len; i++){
+            records[records.length] = this.store.getAt(nodes[i].viewIndex);
+        }
+        return records;
+    },
+
+    
+    getRecord : function(node){
+        return this.store.getAt(node.viewIndex);
+    },
+
+    
+    clearSelections : function(suppressEvent, skipUpdate){
+        if((this.multiSelect || this.singleSelect) && this.selected.getCount() > 0){
+            if(!skipUpdate){
+                this.selected.removeClass(this.selectedClass);
+            }
+            this.selected.clear();
+            this.last = false;
+            if(!suppressEvent){
+                this.fireEvent("selectionchange", this, this.selected.elements);
+            }
+        }
+    },
+
+    
+    isSelected : function(node){
+        return this.selected.contains(this.getNode(node));
+    },
+
+    
+    deselect : function(node){
+        if(this.isSelected(node)){
+            node = this.getNode(node);
+            this.selected.removeElement(node);
+            if(this.last == node.viewIndex){
+                this.last = false;
+            }
+            Ext.fly(node).removeClass(this.selectedClass);
+            this.fireEvent("selectionchange", this, this.selected.elements);
+        }
+    },
+
+    
+    select : function(nodeInfo, keepExisting, suppressEvent){
+        if(Ext.isArray(nodeInfo)){
+            if(!keepExisting){
+                this.clearSelections(true);
+            }
+            for(var i = 0, len = nodeInfo.length; i < len; i++){
+                this.select(nodeInfo[i], true, true);
+            }
+            if(!suppressEvent){
+                this.fireEvent("selectionchange", this, this.selected.elements);
+            }
+        } else{
+            var node = this.getNode(nodeInfo);
+            if(!keepExisting){
+                this.clearSelections(true);
+            }
+            if(node && !this.isSelected(node)){
+                if(this.fireEvent("beforeselect", this, node, this.selected.elements) !== false){
+                    Ext.fly(node).addClass(this.selectedClass);
+                    this.selected.add(node);
+                    this.last = node.viewIndex;
+                    if(!suppressEvent){
+                        this.fireEvent("selectionchange", this, this.selected.elements);
+                    }
+                }
+            }
+        }
+    },
+
+    
+    selectRange : function(start, end, keepExisting){
+        if(!keepExisting){
+            this.clearSelections(true);
+        }
+        this.select(this.getNodes(start, end), true);
+    },
+
+    
+    getNode : function(nodeInfo){
+        if(Ext.isString(nodeInfo)){
+            return document.getElementById(nodeInfo);
+        }else if(Ext.isNumber(nodeInfo)){
+            return this.all.elements[nodeInfo];
+        }else if(nodeInfo instanceof Ext.data.Record){
+            var idx = this.store.indexOf(nodeInfo);
+            return this.all.elements[idx];
+        }
+        return nodeInfo;
+    },
+
+    
+    getNodes : function(start, end){
+        var ns = this.all.elements,
+            nodes = [],
+            i;
+            
+        start = start || 0;
+        end = !Ext.isDefined(end) ? Math.max(ns.length - 1, 0) : end;
+        if(start <= end){
+            for(i = start; i <= end && ns[i]; i++){
+                nodes.push(ns[i]);
+            }
+        } else{
+            for(i = start; i >= end && ns[i]; i--){
+                nodes.push(ns[i]);
+            }
+        }
+        return nodes;
+    },
+
+    
+    indexOf : function(node){
+        node = this.getNode(node);
+        if(Ext.isNumber(node.viewIndex)){
+            return node.viewIndex;
+        }
+        return this.all.indexOf(node);
+    },
+
+    
+    onBeforeLoad : function(){
+        if(this.loadingText){
+            this.clearSelections(false, true);
+            this.getTemplateTarget().update('<div class="loading-indicator">'+this.loadingText+'</div>');
+            this.all.clear();
+        }
+    },
+
+    onDestroy : function(){
+        this.all.clear();
+        this.selected.clear();
+        Ext.DataView.superclass.onDestroy.call(this);
+        this.bindStore(null);
+    }
+});
+
+
+Ext.DataView.prototype.setStore = Ext.DataView.prototype.bindStore;
+
+Ext.reg('dataview', Ext.DataView);
+
+Ext.list.ListView = Ext.extend(Ext.DataView, {
+    
+    
+    
+    itemSelector: 'dl',
+    
+    selectedClass:'x-list-selected',
+    
+    overClass:'x-list-over',
+    
+    
+    scrollOffset : undefined,
+    
+    columnResize: true,
+    
+    
+    columnSort: true,
+    
+
+    
+    maxColumnWidth: Ext.isIE ? 99 : 100,
+
+    initComponent : function(){
+        if(this.columnResize){
+            this.colResizer = new Ext.list.ColumnResizer(this.colResizer);
+            this.colResizer.init(this);
+        }
+        if(this.columnSort){
+            this.colSorter = new Ext.list.Sorter(this.columnSort);
+            this.colSorter.init(this);
+        }
+        if(!this.internalTpl){
+            this.internalTpl = new Ext.XTemplate(
+                '<div class="x-list-header"><div class="x-list-header-inner">',
+                    '<tpl for="columns">',
+                    '<div style="width:{[values.width*100]}%;text-align:{align};"><em unselectable="on" id="',this.id, '-xlhd-{#}">',
+                        '{header}',
+                    '</em></div>',
+                    '</tpl>',
+                    '<div class="x-clear"></div>',
+                '</div></div>',
+                '<div class="x-list-body"><div class="x-list-body-inner">',
+                '</div></div>'
+            );
+        }
+        if(!this.tpl){
+            this.tpl = new Ext.XTemplate(
+                '<tpl for="rows">',
+                    '<dl>',
+                        '<tpl for="parent.columns">',
+                        '<dt style="width:{[values.width*100]}%;text-align:{align};">',
+                        '<em unselectable="on"<tpl if="cls"> class="{cls}</tpl>">',
+                            '{[values.tpl.apply(parent)]}',
+                        '</em></dt>',
+                        '</tpl>',
+                        '<div class="x-clear"></div>',
+                    '</dl>',
+                '</tpl>'
+            );
+        };
+
+        var cs = this.columns,
+            allocatedWidth = 0,
+            colsWithWidth = 0,
+            len = cs.length,
+            columns = [];
+
+        for(var i = 0; i < len; i++){
+            var c = cs[i];
+            if(!c.isColumn) {
+                c.xtype = c.xtype ? (/^lv/.test(c.xtype) ? c.xtype : 'lv' + c.xtype) : 'lvcolumn';
+                c = Ext.create(c);
+            }
+            if(c.width) {
+                allocatedWidth += c.width*100;
+                if(allocatedWidth > this.maxColumnWidth){
+                    c.width -= (allocatedWidth - this.maxColumnWidth) / 100;
+                }
+                colsWithWidth++;
+            }
+            columns.push(c);
+        }
+
+        cs = this.columns = columns;
+
+        
+        if(colsWithWidth < len){
+            var remaining = len - colsWithWidth;
+            if(allocatedWidth < this.maxColumnWidth){
+                var perCol = ((this.maxColumnWidth-allocatedWidth) / remaining)/100;
+                for(var j = 0; j < len; j++){
+                    var c = cs[j];
+                    if(!c.width){
+                        c.width = perCol;
+                    }
+                }
+            }
+        }
+        Ext.list.ListView.superclass.initComponent.call(this);
+    },
+
+    onRender : function(){
+        this.autoEl = {
+            cls: 'x-list-wrap'
+        };
+        Ext.list.ListView.superclass.onRender.apply(this, arguments);
+
+        this.internalTpl.overwrite(this.el, {columns: this.columns});
+
+        this.innerBody = Ext.get(this.el.dom.childNodes[1].firstChild);
+        this.innerHd = Ext.get(this.el.dom.firstChild.firstChild);
+
+        if(this.hideHeaders){
+            this.el.dom.firstChild.style.display = 'none';
+        }
+    },
+
+    getTemplateTarget : function(){
+        return this.innerBody;
+    },
+
+    
+    collectData : function(){
+        var rs = Ext.list.ListView.superclass.collectData.apply(this, arguments);
+        return {
+            columns: this.columns,
+            rows: rs
+        };
+    },
+
+    verifyInternalSize : function(){
+        if(this.lastSize){
+            this.onResize(this.lastSize.width, this.lastSize.height);
+        }
+    },
+
+    
+    onResize : function(w, h){
+        var body = this.innerBody.dom,
+            header = this.innerHd.dom,
+            scrollWidth = w - Ext.num(this.scrollOffset, Ext.getScrollBarWidth()) + 'px',
+            parentNode;
+            
+        if(!body){
+            return;
+        }
+        parentNode = body.parentNode;
+        if(Ext.isNumber(w)){
+            if(this.reserveScrollOffset || ((parentNode.offsetWidth - parentNode.clientWidth) > 10)){
+                body.style.width = scrollWidth;
+                header.style.width = scrollWidth;
+            }else{
+                body.style.width = w + 'px';
+                header.style.width = w + 'px';
+                setTimeout(function(){
+                    if((parentNode.offsetWidth - parentNode.clientWidth) > 10){
+                        body.style.width = scrollWidth;
+                        header.style.width = scrollWidth;
+                    }
+                }, 10);
+            }
+        }
+        if(Ext.isNumber(h)){
+            parentNode.style.height = Math.max(0, h - header.parentNode.offsetHeight) + 'px';
+        }
+    },
+
+    updateIndexes : function(){
+        Ext.list.ListView.superclass.updateIndexes.apply(this, arguments);
+        this.verifyInternalSize();
+    },
+
+    findHeaderIndex : function(header){
+        header = header.dom || header;
+        var parentNode = header.parentNode, 
+            children = parentNode.parentNode.childNodes,
+            i = 0,
+            c;
+        for(; c = children[i]; i++){
+            if(c == parentNode){
+                return i;
+            }
+        }
+        return -1;
+    },
+
+    setHdWidths : function(){
+        var els = this.innerHd.dom.getElementsByTagName('div'),
+            i = 0,
+            columns = this.columns,
+            len = columns.length;
+            
+        for(; i < len; i++){
+            els[i].style.width = (columns[i].width*100) + '%';
+        }
+    }
+});
+
+Ext.reg('listview', Ext.list.ListView);
+
+
+Ext.ListView = Ext.list.ListView;
+Ext.list.Column = Ext.extend(Object, {
+    
+    isColumn: true,
+    
+            
+    align: 'left',
+        
+    header: '',
+    
+        
+    width: null,
+
+    
+    cls: '',
+    
+    
+
+    
+    
+    constructor : function(c){
+        if(!c.tpl){
+            c.tpl = new Ext.XTemplate('{' + c.dataIndex + '}');
+        }
+        else if(Ext.isString(c.tpl)){
+            c.tpl = new Ext.XTemplate(c.tpl);
+        }
+        
+        Ext.apply(this, c);
+    }
+});
+
+Ext.reg('lvcolumn', Ext.list.Column);
+
+
+Ext.list.NumberColumn = Ext.extend(Ext.list.Column, {
+        
+    format: '0,000.00',
+    
+    constructor : function(c) {
+        c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':number("' + (c.format || this.format) + '")}');       
+        Ext.list.NumberColumn.superclass.constructor.call(this, c);
+    }
+});
+
+Ext.reg('lvnumbercolumn', Ext.list.NumberColumn);
+
+
+Ext.list.DateColumn = Ext.extend(Ext.list.Column, {
+    format: 'm/d/Y',
+    constructor : function(c) {
+        c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':date("' + (c.format || this.format) + '")}');      
+        Ext.list.DateColumn.superclass.constructor.call(this, c);
+    }
+});
+Ext.reg('lvdatecolumn', Ext.list.DateColumn);
+
+
+Ext.list.BooleanColumn = Ext.extend(Ext.list.Column, {
+    
+    trueText: 'true',
+    
+    falseText: 'false',
+    
+    undefinedText: '&#160;',
+    
+    constructor : function(c) {
+        c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':this.format}');
+        
+        var t = this.trueText, f = this.falseText, u = this.undefinedText;
+        c.tpl.format = function(v){
+            if(v === undefined){
+                return u;
+            }
+            if(!v || v === 'false'){
+                return f;
+            }
+            return t;
+        };
+        
+        Ext.list.DateColumn.superclass.constructor.call(this, c);
+    }
+});
+
+Ext.reg('lvbooleancolumn', Ext.list.BooleanColumn);
+Ext.list.ColumnResizer = Ext.extend(Ext.util.Observable, {
+    
+    minPct: .05,
+
+    constructor: function(config){
+        Ext.apply(this, config);
+        Ext.list.ColumnResizer.superclass.constructor.call(this);
+    },
+    init : function(listView){
+        this.view = listView;
+        listView.on('render', this.initEvents, this);
+    },
+
+    initEvents : function(view){
+        view.mon(view.innerHd, 'mousemove', this.handleHdMove, this);
+        this.tracker = new Ext.dd.DragTracker({
+            onBeforeStart: this.onBeforeStart.createDelegate(this),
+            onStart: this.onStart.createDelegate(this),
+            onDrag: this.onDrag.createDelegate(this),
+            onEnd: this.onEnd.createDelegate(this),
+            tolerance: 3,
+            autoStart: 300
+        });
+        this.tracker.initEl(view.innerHd);
+        view.on('beforedestroy', this.tracker.destroy, this.tracker);
+    },
+
+    handleHdMove : function(e, t){
+        var handleWidth = 5,
+            x = e.getPageX(),
+            header = e.getTarget('em', 3, true);
+        if(header){
+            var region = header.getRegion(),
+                style = header.dom.style,
+                parentNode = header.dom.parentNode;
+
+            if(x - region.left <= handleWidth && parentNode != parentNode.parentNode.firstChild){
+                this.activeHd = Ext.get(parentNode.previousSibling.firstChild);
+                style.cursor = Ext.isWebKit ? 'e-resize' : 'col-resize';
+            } else if(region.right - x <= handleWidth && parentNode != parentNode.parentNode.lastChild.previousSibling){
+                this.activeHd = header;
+                style.cursor = Ext.isWebKit ? 'w-resize' : 'col-resize';
+            } else{
+                delete this.activeHd;
+                style.cursor = '';
+            }
+        }
+    },
+
+    onBeforeStart : function(e){
+        this.dragHd = this.activeHd;
+        return !!this.dragHd;
+    },
+
+    onStart: function(e){
+        
+        var me = this,
+            view = me.view,
+            dragHeader = me.dragHd,
+            x = me.tracker.getXY()[0];            
+        
+        me.proxy = view.el.createChild({cls:'x-list-resizer'});
+        me.dragX = dragHeader.getX();
+        me.headerIndex = view.findHeaderIndex(dragHeader);
+        
+        me.headersDisabled = view.disableHeaders;
+        view.disableHeaders = true;
+        
+        me.proxy.setHeight(view.el.getHeight());
+        me.proxy.setX(me.dragX);
+        me.proxy.setWidth(x - me.dragX);
+        
+        this.setBoundaries();
+        
+    },
+    
+    
+    setBoundaries: function(relativeX){
+        var view = this.view,
+            headerIndex = this.headerIndex,
+            width = view.innerHd.getWidth(),
+            relativeX = view.innerHd.getX(),
+            minWidth = Math.ceil(width * this.minPct),
+            maxWidth = width - minWidth,
+            numColumns = view.columns.length,
+            headers = view.innerHd.select('em', true),
+            minX = minWidth + relativeX,
+            maxX = maxWidth + relativeX,
+            header;
+          
+        if (numColumns == 2) {
+            this.minX = minX;
+            this.maxX = maxX;
+        }else{
+            header = headers.item(headerIndex + 2);
+            this.minX = headers.item(headerIndex).getX() + minWidth;
+            this.maxX = header ? header.getX() - minWidth : maxX;
+            if (headerIndex == 0) {
+                
+                this.minX = minX;
+            } else if (headerIndex == numColumns - 2) {
+                
+                this.maxX = maxX;
+            }
+        }
+    },
+
+    onDrag: function(e){
+        var me = this,
+            cursorX = me.tracker.getXY()[0].constrain(me.minX, me.maxX);
+            
+        me.proxy.setWidth(cursorX - this.dragX);
+    },
+
+    onEnd: function(e){
+        
+        var newWidth = this.proxy.getWidth(),
+            index = this.headerIndex,
+            view = this.view,
+            columns = view.columns,
+            width = view.innerHd.getWidth(),
+            newPercent = Math.ceil(newWidth * view.maxColumnWidth / width) / 100,
+            disabled = this.headersDisabled,
+            headerCol = columns[index],
+            otherCol = columns[index + 1],
+            totalPercent = headerCol.width + otherCol.width;
+
+        this.proxy.remove();
+
+        headerCol.width = newPercent;
+        otherCol.width = totalPercent - newPercent;
+      
+        delete this.dragHd;
+        view.setHdWidths();
+        view.refresh();
+        
+        setTimeout(function(){
+            view.disableHeaders = disabled;
+        }, 100);
+    }
+});
+
+
+Ext.ListView.ColumnResizer = Ext.list.ColumnResizer;
+Ext.list.Sorter = Ext.extend(Ext.util.Observable, {
+    
+    sortClasses : ["sort-asc", "sort-desc"],
+
+    constructor: function(config){
+        Ext.apply(this, config);
+        Ext.list.Sorter.superclass.constructor.call(this);
+    },
+
+    init : function(listView){
+        this.view = listView;
+        listView.on('render', this.initEvents, this);
+    },
+
+    initEvents : function(view){
+        view.mon(view.innerHd, 'click', this.onHdClick, this);
+        view.innerHd.setStyle('cursor', 'pointer');
+        view.mon(view.store, 'datachanged', this.updateSortState, this);
+        this.updateSortState.defer(10, this, [view.store]);
+    },
+
+    updateSortState : function(store){
+        var state = store.getSortState();
+        if(!state){
+            return;
+        }
+        this.sortState = state;
+        var cs = this.view.columns, sortColumn = -1;
+        for(var i = 0, len = cs.length; i < len; i++){
+            if(cs[i].dataIndex == state.field){
+                sortColumn = i;
+                break;
+            }
+        }
+        if(sortColumn != -1){
+            var sortDir = state.direction;
+            this.updateSortIcon(sortColumn, sortDir);
+        }
+    },
+
+    updateSortIcon : function(col, dir){
+        var sc = this.sortClasses;
+        var hds = this.view.innerHd.select('em').removeClass(sc);
+        hds.item(col).addClass(sc[dir == "DESC" ? 1 : 0]);
+    },
+
+    onHdClick : function(e){
+        var hd = e.getTarget('em', 3);
+        if(hd && !this.view.disableHeaders){
+            var index = this.view.findHeaderIndex(hd);
+            this.view.store.sort(this.view.columns[index].dataIndex);
+        }
+    }
+});
+
+
+Ext.ListView.Sorter = Ext.list.Sorter;
+Ext.TabPanel = Ext.extend(Ext.Panel,  {
+    
+    
+    
+    deferredRender : true,
+    
+    tabWidth : 120,
+    
+    minTabWidth : 30,
+    
+    resizeTabs : false,
+    
+    enableTabScroll : false,
+    
+    scrollIncrement : 0,
+    
+    scrollRepeatInterval : 400,
+    
+    scrollDuration : 0.35,
+    
+    animScroll : true,
+    
+    tabPosition : 'top',
+    
+    baseCls : 'x-tab-panel',
+    
+    autoTabs : false,
+    
+    autoTabSelector : 'div.x-tab',
+    
+    activeTab : undefined,
+    
+    tabMargin : 2,
+    
+    plain : false,
+    
+    wheelIncrement : 20,
+
+    
+    idDelimiter : '__',
+
+    
+    itemCls : 'x-tab-item',
+
+    
+    elements : 'body',
+    headerAsText : false,
+    frame : false,
+    hideBorders :true,
+
+    
+    initComponent : function(){
+        this.frame = false;
+        Ext.TabPanel.superclass.initComponent.call(this);
+        this.addEvents(
+            
+            'beforetabchange',
+            
+            'tabchange',
+            
+            'contextmenu'
+        );
+        
+        this.setLayout(new Ext.layout.CardLayout(Ext.apply({
+            layoutOnCardChange: this.layoutOnTabChange,
+            deferredRender: this.deferredRender
+        }, this.layoutConfig)));
+
+        if(this.tabPosition == 'top'){
+            this.elements += ',header';
+            this.stripTarget = 'header';
+        }else {
+            this.elements += ',footer';
+            this.stripTarget = 'footer';
+        }
+        if(!this.stack){
+            this.stack = Ext.TabPanel.AccessStack();
+        }
+        this.initItems();
+    },
+
+    
+    onRender : function(ct, position){
+        Ext.TabPanel.superclass.onRender.call(this, ct, position);
+
+        if(this.plain){
+            var pos = this.tabPosition == 'top' ? 'header' : 'footer';
+            this[pos].addClass('x-tab-panel-'+pos+'-plain');
+        }
+
+        var st = this[this.stripTarget];
+
+        this.stripWrap = st.createChild({cls:'x-tab-strip-wrap', cn:{
+            tag:'ul', cls:'x-tab-strip x-tab-strip-'+this.tabPosition}});
+
+        var beforeEl = (this.tabPosition=='bottom' ? this.stripWrap : null);
+        st.createChild({cls:'x-tab-strip-spacer'}, beforeEl);
+        this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
+
+        
+        this.edge = this.strip.createChild({tag:'li', cls:'x-tab-edge', cn: [{tag: 'span', cls: 'x-tab-strip-text', cn: '&#160;'}]});
+        this.strip.createChild({cls:'x-clear'});
+
+        this.body.addClass('x-tab-panel-body-'+this.tabPosition);
+
+        
+        if(!this.itemTpl){
+            var tt = new Ext.Template(
+                 '<li class="{cls}" id="{id}"><a class="x-tab-strip-close"></a>',
+                 '<a class="x-tab-right" href="#"><em class="x-tab-left">',
+                 '<span class="x-tab-strip-inner"><span class="x-tab-strip-text {iconCls}">{text}</span></span>',
+                 '</em></a></li>'
+            );
+            tt.disableFormats = true;
+            tt.compile();
+            Ext.TabPanel.prototype.itemTpl = tt;
+        }
+
+        this.items.each(this.initTab, this);
+    },
+
+    
+    afterRender : function(){
+        Ext.TabPanel.superclass.afterRender.call(this);
+        if(this.autoTabs){
+            this.readTabs(false);
+        }
+        if(this.activeTab !== undefined){
+            var item = Ext.isObject(this.activeTab) ? this.activeTab : this.items.get(this.activeTab);
+            delete this.activeTab;
+            this.setActiveTab(item);
+        }
+    },
+
+    
+    initEvents : function(){
+        Ext.TabPanel.superclass.initEvents.call(this);
+        this.mon(this.strip, {
+            scope: this,
+            mousedown: this.onStripMouseDown,
+            contextmenu: this.onStripContextMenu
+        });
+        if(this.enableTabScroll){
+            this.mon(this.strip, 'mousewheel', this.onWheel, this);
+        }
+    },
+
+    
+    findTargets : function(e){
+        var item = null,
+            itemEl = e.getTarget('li:not(.x-tab-edge)', this.strip);
+
+        if(itemEl){
+            item = this.getComponent(itemEl.id.split(this.idDelimiter)[1]);
+            if(item.disabled){
+                return {
+                    close : null,
+                    item : null,
+                    el : null
+                };
+            }
+        }
+        return {
+            close : e.getTarget('.x-tab-strip-close', this.strip),
+            item : item,
+            el : itemEl
+        };
+    },
+
+    
+    onStripMouseDown : function(e){
+        if(e.button !== 0){
+            return;
+        }
+        e.preventDefault();
+        var t = this.findTargets(e);
+        if(t.close){
+            if (t.item.fireEvent('beforeclose', t.item) !== false) {
+                t.item.fireEvent('close', t.item);
+                this.remove(t.item);
+            }
+            return;
+        }
+        if(t.item && t.item != this.activeTab){
+            this.setActiveTab(t.item);
+        }
+    },
+
+    
+    onStripContextMenu : function(e){
+        e.preventDefault();
+        var t = this.findTargets(e);
+        if(t.item){
+            this.fireEvent('contextmenu', this, t.item, e);
+        }
+    },
+
+    
+    readTabs : function(removeExisting){
+        if(removeExisting === true){
+            this.items.each(function(item){
+                this.remove(item);
+            }, this);
+        }
+        var tabs = this.el.query(this.autoTabSelector);
+        for(var i = 0, len = tabs.length; i < len; i++){
+            var tab = tabs[i],
+                title = tab.getAttribute('title');
+            tab.removeAttribute('title');
+            this.add({
+                title: title,
+                contentEl: tab
+            });
+        }
+    },
+
+    
+    initTab : function(item, index){
+        var before = this.strip.dom.childNodes[index],
+            p = this.getTemplateArgs(item),
+            el = before ?
+                 this.itemTpl.insertBefore(before, p) :
+                 this.itemTpl.append(this.strip, p),
+            cls = 'x-tab-strip-over',
+            tabEl = Ext.get(el);
+
+        tabEl.hover(function(){
+            if(!item.disabled){
+                tabEl.addClass(cls);
+            }
+        }, function(){
+            tabEl.removeClass(cls);
+        });
+
+        if(item.tabTip){
+            tabEl.child('span.x-tab-strip-text', true).qtip = item.tabTip;
+        }
+        item.tabEl = el;
+
+        
+        tabEl.select('a').on('click', function(e){
+            if(!e.getPageX()){
+                this.onStripMouseDown(e);
+            }
+        }, this, {preventDefault: true});
+
+        item.on({
+            scope: this,
+            disable: this.onItemDisabled,
+            enable: this.onItemEnabled,
+            titlechange: this.onItemTitleChanged,
+            iconchange: this.onItemIconChanged,
+            beforeshow: this.onBeforeShowItem
+        });
+    },
+
+
+
+    
+    getTemplateArgs : function(item) {
+        var cls = item.closable ? 'x-tab-strip-closable' : '';
+        if(item.disabled){
+            cls += ' x-item-disabled';
+        }
+        if(item.iconCls){
+            cls += ' x-tab-with-icon';
+        }
+        if(item.tabCls){
+            cls += ' ' + item.tabCls;
+        }
+
+        return {
+            id: this.id + this.idDelimiter + item.getItemId(),
+            text: item.title,
+            cls: cls,
+            iconCls: item.iconCls || ''
+        };
+    },
+
+    
+    onAdd : function(c){
+        Ext.TabPanel.superclass.onAdd.call(this, c);
+        if(this.rendered){
+            var items = this.items;
+            this.initTab(c, items.indexOf(c));
+            this.delegateUpdates();
+        }
+    },
+
+    
+    onBeforeAdd : function(item){
+        var existing = item.events ? (this.items.containsKey(item.getItemId()) ? item : null) : this.items.get(item);
+        if(existing){
+            this.setActiveTab(item);
+            return false;
+        }
+        Ext.TabPanel.superclass.onBeforeAdd.apply(this, arguments);
+        var es = item.elements;
+        item.elements = es ? es.replace(',header', '') : es;
+        item.border = (item.border === true);
+    },
+
+    
+    onRemove : function(c){
+        var te = Ext.get(c.tabEl);
+        
+        if(te){
+            te.select('a').removeAllListeners();
+            Ext.destroy(te);
+        }
+        Ext.TabPanel.superclass.onRemove.call(this, c);
+        this.stack.remove(c);
+        delete c.tabEl;
+        c.un('disable', this.onItemDisabled, this);
+        c.un('enable', this.onItemEnabled, this);
+        c.un('titlechange', this.onItemTitleChanged, this);
+        c.un('iconchange', this.onItemIconChanged, this);
+        c.un('beforeshow', this.onBeforeShowItem, this);
+        if(c == this.activeTab){
+            var next = this.stack.next();
+            if(next){
+                this.setActiveTab(next);
+            }else if(this.items.getCount() > 0){
+                this.setActiveTab(0);
+            }else{
+                this.setActiveTab(null);
+            }
+        }
+        if(!this.destroying){
+            this.delegateUpdates();
+        }
+    },
+
+    
+    onBeforeShowItem : function(item){
+        if(item != this.activeTab){
+            this.setActiveTab(item);
+            return false;
+        }
+    },
+
+    
+    onItemDisabled : function(item){
+        var el = this.getTabEl(item);
+        if(el){
+            Ext.fly(el).addClass('x-item-disabled');
+        }
+        this.stack.remove(item);
+    },
+
+    
+    onItemEnabled : function(item){
+        var el = this.getTabEl(item);
+        if(el){
+            Ext.fly(el).removeClass('x-item-disabled');
+        }
+    },
+
+    
+    onItemTitleChanged : function(item){
+        var el = this.getTabEl(item);
+        if(el){
+            Ext.fly(el).child('span.x-tab-strip-text', true).innerHTML = item.title;
+        }
+    },
+
+    
+    onItemIconChanged : function(item, iconCls, oldCls){
+        var el = this.getTabEl(item);
+        if(el){
+            el = Ext.get(el);
+            el.child('span.x-tab-strip-text').replaceClass(oldCls, iconCls);
+            el[Ext.isEmpty(iconCls) ? 'removeClass' : 'addClass']('x-tab-with-icon');
+        }
+    },
+
+    
+    getTabEl : function(item){
+        var c = this.getComponent(item);
+        return c ? c.tabEl : null;
+    },
+
+    
+    onResize : function(){
+        Ext.TabPanel.superclass.onResize.apply(this, arguments);
+        this.delegateUpdates();
+    },
+
+    
+    beginUpdate : function(){
+        this.suspendUpdates = true;
+    },
+
+    
+    endUpdate : function(){
+        this.suspendUpdates = false;
+        this.delegateUpdates();
+    },
+
+    
+    hideTabStripItem : function(item){
+        item = this.getComponent(item);
+        var el = this.getTabEl(item);
+        if(el){
+            el.style.display = 'none';
+            this.delegateUpdates();
+        }
+        this.stack.remove(item);
+    },
+
+    
+    unhideTabStripItem : function(item){
+        item = this.getComponent(item);
+        var el = this.getTabEl(item);
+        if(el){
+            el.style.display = '';
+            this.delegateUpdates();
+        }
+    },
+
+    
+    delegateUpdates : function(){
+        var rendered = this.rendered;
+        if(this.suspendUpdates){
+            return;
+        }
+        if(this.resizeTabs && rendered){
+            this.autoSizeTabs();
+        }
+        if(this.enableTabScroll && rendered){
+            this.autoScrollTabs();
+        }
+    },
+
+    
+    autoSizeTabs : function(){
+        var count = this.items.length,
+            ce = this.tabPosition != 'bottom' ? 'header' : 'footer',
+            ow = this[ce].dom.offsetWidth,
+            aw = this[ce].dom.clientWidth;
+
+        if(!this.resizeTabs || count < 1 || !aw){ 
+            return;
+        }
+
+        var each = Math.max(Math.min(Math.floor((aw-4) / count) - this.tabMargin, this.tabWidth), this.minTabWidth); 
+        this.lastTabWidth = each;
+        var lis = this.strip.query('li:not(.x-tab-edge)');
+        for(var i = 0, len = lis.length; i < len; i++) {
+            var li = lis[i],
+                inner = Ext.fly(li).child('.x-tab-strip-inner', true),
+                tw = li.offsetWidth,
+                iw = inner.offsetWidth;
+            inner.style.width = (each - (tw-iw)) + 'px';
+        }
+    },
+
+    
+    adjustBodyWidth : function(w){
+        if(this.header){
+            this.header.setWidth(w);
+        }
+        if(this.footer){
+            this.footer.setWidth(w);
+        }
+        return w;
+    },
+
+    
+    setActiveTab : function(item){
+        item = this.getComponent(item);
+        if(this.fireEvent('beforetabchange', this, item, this.activeTab) === false){
+            return;
+        }
+        if(!this.rendered){
+            this.activeTab = item;
+            return;
+        }
+        if(this.activeTab != item){
+            if(this.activeTab){
+                var oldEl = this.getTabEl(this.activeTab);
+                if(oldEl){
+                    Ext.fly(oldEl).removeClass('x-tab-strip-active');
+                }
+            }
+            this.activeTab = item;
+            if(item){
+                var el = this.getTabEl(item);
+                Ext.fly(el).addClass('x-tab-strip-active');
+                this.stack.add(item);
+
+                this.layout.setActiveItem(item);
+                
+                this.delegateUpdates();
+                if(this.scrolling){
+                    this.scrollToTab(item, this.animScroll);
+                }
+            }
+            this.fireEvent('tabchange', this, item);
+        }
+    },
+
+    
+    getActiveTab : function(){
+        return this.activeTab || null;
+    },
+
+    
+    getItem : function(item){
+        return this.getComponent(item);
+    },
+
+    
+    autoScrollTabs : function(){
+        this.pos = this.tabPosition=='bottom' ? this.footer : this.header;
+        var count = this.items.length,
+            ow = this.pos.dom.offsetWidth,
+            tw = this.pos.dom.clientWidth,
+            wrap = this.stripWrap,
+            wd = wrap.dom,
+            cw = wd.offsetWidth,
+            pos = this.getScrollPos(),
+            l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos;
+
+        if(!this.enableTabScroll || cw < 20){ 
+            return;
+        }
+        if(count == 0 || l <= tw){
+            
+            wd.scrollLeft = 0;
+            wrap.setWidth(tw);
+            if(this.scrolling){
+                this.scrolling = false;
+                this.pos.removeClass('x-tab-scrolling');
+                this.scrollLeft.hide();
+                this.scrollRight.hide();
+                
+                if(Ext.isAir || Ext.isWebKit){
+                    wd.style.marginLeft = '';
+                    wd.style.marginRight = '';
+                }
+            }
+        }else{
+            if(!this.scrolling){
+                this.pos.addClass('x-tab-scrolling');
+                
+                if(Ext.isAir || Ext.isWebKit){
+                    wd.style.marginLeft = '18px';
+                    wd.style.marginRight = '18px';
+                }
+            }
+            tw -= wrap.getMargins('lr');
+            wrap.setWidth(tw > 20 ? tw : 20);
+            if(!this.scrolling){
+                if(!this.scrollLeft){
+                    this.createScrollers();
+                }else{
+                    this.scrollLeft.show();
+                    this.scrollRight.show();
+                }
+            }
+            this.scrolling = true;
+            if(pos > (l-tw)){ 
+                wd.scrollLeft = l-tw;
+            }else{ 
+                this.scrollToTab(this.activeTab, false);
+            }
+            this.updateScrollButtons();
+        }
+    },
+
+    
+    createScrollers : function(){
+        this.pos.addClass('x-tab-scrolling-' + this.tabPosition);
+        var h = this.stripWrap.dom.offsetHeight;
+
+        
+        var sl = this.pos.insertFirst({
+            cls:'x-tab-scroller-left'
+        });
+        sl.setHeight(h);
+        sl.addClassOnOver('x-tab-scroller-left-over');
+        this.leftRepeater = new Ext.util.ClickRepeater(sl, {
+            interval : this.scrollRepeatInterval,
+            handler: this.onScrollLeft,
+            scope: this
+        });
+        this.scrollLeft = sl;
+
+        
+        var sr = this.pos.insertFirst({
+            cls:'x-tab-scroller-right'
+        });
+        sr.setHeight(h);
+        sr.addClassOnOver('x-tab-scroller-right-over');
+        this.rightRepeater = new Ext.util.ClickRepeater(sr, {
+            interval : this.scrollRepeatInterval,
+            handler: this.onScrollRight,
+            scope: this
+        });
+        this.scrollRight = sr;
+    },
+
+    
+    getScrollWidth : function(){
+        return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos();
+    },
+
+    
+    getScrollPos : function(){
+        return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0;
+    },
+
+    
+    getScrollArea : function(){
+        return parseInt(this.stripWrap.dom.clientWidth, 10) || 0;
+    },
+
+    
+    getScrollAnim : function(){
+        return {duration:this.scrollDuration, callback: this.updateScrollButtons, scope: this};
+    },
+
+    
+    getScrollIncrement : function(){
+        return this.scrollIncrement || (this.resizeTabs ? this.lastTabWidth+2 : 100);
+    },
+
+    
+
+    scrollToTab : function(item, animate){
+        if(!item){
+            return;
+        }
+        var el = this.getTabEl(item),
+            pos = this.getScrollPos(),
+            area = this.getScrollArea(),
+            left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos,
+            right = left + el.offsetWidth;
+        if(left < pos){
+            this.scrollTo(left, animate);
+        }else if(right > (pos + area)){
+            this.scrollTo(right - area, animate);
+        }
+    },
+
+    
+    scrollTo : function(pos, animate){
+        this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false);
+        if(!animate){
+            this.updateScrollButtons();
+        }
+    },
+
+    onWheel : function(e){
+        var d = e.getWheelDelta()*this.wheelIncrement*-1;
+        e.stopEvent();
+
+        var pos = this.getScrollPos(),
+            newpos = pos + d,
+            sw = this.getScrollWidth()-this.getScrollArea();
+
+        var s = Math.max(0, Math.min(sw, newpos));
+        if(s != pos){
+            this.scrollTo(s, false);
+        }
+    },
+
+    
+    onScrollRight : function(){
+        var sw = this.getScrollWidth()-this.getScrollArea(),
+            pos = this.getScrollPos(),
+            s = Math.min(sw, pos + this.getScrollIncrement());
+        if(s != pos){
+            this.scrollTo(s, this.animScroll);
+        }
+    },
+
+    
+    onScrollLeft : function(){
+        var pos = this.getScrollPos(),
+            s = Math.max(0, pos - this.getScrollIncrement());
+        if(s != pos){
+            this.scrollTo(s, this.animScroll);
+        }
+    },
+
+    
+    updateScrollButtons : function(){
+        var pos = this.getScrollPos();
+        this.scrollLeft[pos === 0 ? 'addClass' : 'removeClass']('x-tab-scroller-left-disabled');
+        this.scrollRight[pos >= (this.getScrollWidth()-this.getScrollArea()) ? 'addClass' : 'removeClass']('x-tab-scroller-right-disabled');
+    },
+
+    
+    beforeDestroy : function() {
+        Ext.destroy(this.leftRepeater, this.rightRepeater);
+        this.deleteMembers('strip', 'edge', 'scrollLeft', 'scrollRight', 'stripWrap');
+        this.activeTab = null;
+        Ext.TabPanel.superclass.beforeDestroy.apply(this);
+    }
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+});
+Ext.reg('tabpanel', Ext.TabPanel);
+
+
+Ext.TabPanel.prototype.activate = Ext.TabPanel.prototype.setActiveTab;
+
+
+Ext.TabPanel.AccessStack = function(){
+    var items = [];
+    return {
+        add : function(item){
+            items.push(item);
+            if(items.length > 10){
+                items.shift();
+            }
+        },
+
+        remove : function(item){
+            var s = [];
+            for(var i = 0, len = items.length; i < len; i++) {
+                if(items[i] != item){
+                    s.push(items[i]);
+                }
+            }
+            items = s;
+        },
+
+        next : function(){
+            return items.pop();
+        }
+    };
+};
+
+Ext.Button = Ext.extend(Ext.BoxComponent, {
+    
+    hidden : false,
+    
+    disabled : false,
+    
+    pressed : false,
+
+    
+
+    
+
+    
+    enableToggle : false,
+    
+    
+    
+    menuAlign : 'tl-bl?',
+
+    
+    
+    
+    type : 'button',
+
+    
+    menuClassTarget : 'tr:nth(2)',
+
+    
+    clickEvent : 'click',
+
+    
+    handleMouseEvents : true,
+
+    
+    tooltipType : 'qtip',
+
+    
+    buttonSelector : 'button:first-child',
+
+    
+    scale : 'small',
+
+    
+
+    
+    iconAlign : 'left',
+
+    
+    arrowAlign : 'right',
+
+    
+    
+    
+    
+
+    initComponent : function(){
+        if(this.menu){
+            this.menu = Ext.menu.MenuMgr.get(this.menu);
+            this.menu.ownerCt = this;
+        }
+        
+        Ext.Button.superclass.initComponent.call(this);
+
+        this.addEvents(
+            
+            'click',
+            
+            'toggle',
+            
+            'mouseover',
+            
+            'mouseout',
+            
+            'menushow',
+            
+            'menuhide',
+            
+            'menutriggerover',
+            
+            'menutriggerout'
+        );
+        
+        if (this.menu){
+            this.menu.ownerCt = undefined;
+        }
+        if(Ext.isString(this.toggleGroup)){
+            this.enableToggle = true;
+        }
+    },
+
+
+    getTemplateArgs : function(){
+        return [this.type, 'x-btn-' + this.scale + ' x-btn-icon-' + this.scale + '-' + this.iconAlign, this.getMenuClass(), this.cls, this.id];
+    },
+
+    
+    setButtonClass : function(){
+        if(this.useSetClass){
+            if(!Ext.isEmpty(this.oldCls)){
+                this.el.removeClass([this.oldCls, 'x-btn-pressed']);
+            }
+            this.oldCls = (this.iconCls || this.icon) ? (this.text ? 'x-btn-text-icon' : 'x-btn-icon') : 'x-btn-noicon';
+            this.el.addClass([this.oldCls, this.pressed ? 'x-btn-pressed' : null]);
+        }
+    },
+
+    
+    getMenuClass : function(){
+        return this.menu ? (this.arrowAlign != 'bottom' ? 'x-btn-arrow' : 'x-btn-arrow-bottom') : '';
+    },
+
+    
+    onRender : function(ct, position){
+        if(!this.template){
+            if(!Ext.Button.buttonTemplate){
+                
+                Ext.Button.buttonTemplate = new Ext.Template(
+                    '<table id="{4}" cellspacing="0" class="x-btn {3}"><tbody class="{1}">',
+                    '<tr><td class="x-btn-tl"><i>&#160;</i></td><td class="x-btn-tc"></td><td class="x-btn-tr"><i>&#160;</i></td></tr>',
+                    '<tr><td class="x-btn-ml"><i>&#160;</i></td><td class="x-btn-mc"><em class="{2}" unselectable="on"><button type="{0}"></button></em></td><td class="x-btn-mr"><i>&#160;</i></td></tr>',
+                    '<tr><td class="x-btn-bl"><i>&#160;</i></td><td class="x-btn-bc"></td><td class="x-btn-br"><i>&#160;</i></td></tr>',
+                    '</tbody></table>');
+                Ext.Button.buttonTemplate.compile();
+            }
+            this.template = Ext.Button.buttonTemplate;
+        }
+
+        var btn, targs = this.getTemplateArgs();
+
+        if(position){
+            btn = this.template.insertBefore(position, targs, true);
+        }else{
+            btn = this.template.append(ct, targs, true);
+        }
+        
+        this.btnEl = btn.child(this.buttonSelector);
+        this.mon(this.btnEl, {
+            scope: this,
+            focus: this.onFocus,
+            blur: this.onBlur
+        });
+
+        this.initButtonEl(btn, this.btnEl);
+
+        Ext.ButtonToggleMgr.register(this);
+    },
+
+    
+    initButtonEl : function(btn, btnEl){
+        this.el = btn;
+        this.setIcon(this.icon);
+        this.setText(this.text);
+        this.setIconClass(this.iconCls);
+        if(Ext.isDefined(this.tabIndex)){
+            btnEl.dom.tabIndex = this.tabIndex;
+        }
+        if(this.tooltip){
+            this.setTooltip(this.tooltip, true);
+        }
+
+        if(this.handleMouseEvents){
+            this.mon(btn, {
+                scope: this,
+                mouseover: this.onMouseOver,
+                mousedown: this.onMouseDown
+            });
+
+            
+            
+        }
+
+        if(this.menu){
+            this.mon(this.menu, {
+                scope: this,
+                show: this.onMenuShow,
+                hide: this.onMenuHide
+            });
+        }
+
+        if(this.repeat){
+            var repeater = new Ext.util.ClickRepeater(btn, Ext.isObject(this.repeat) ? this.repeat : {});
+            this.mon(repeater, 'click', this.onRepeatClick, this);
+        }else{
+            this.mon(btn, this.clickEvent, this.onClick, this);
+        }
+    },
+
+    
+    afterRender : function(){
+        Ext.Button.superclass.afterRender.call(this);
+        this.useSetClass = true;
+        this.setButtonClass();
+        this.doc = Ext.getDoc();
+        this.doAutoWidth();
+    },
+
+    
+    setIconClass : function(cls){
+        this.iconCls = cls;
+        if(this.el){
+            this.btnEl.dom.className = '';
+            this.btnEl.addClass(['x-btn-text', cls || '']);
+            this.setButtonClass();
+        }
+        return this;
+    },
+
+    
+    setTooltip : function(tooltip,  initial){
+        if(this.rendered){
+            if(!initial){
+                this.clearTip();
+            }
+            if(Ext.isObject(tooltip)){
+                Ext.QuickTips.register(Ext.apply({
+                      target: this.btnEl.id
+                }, tooltip));
+                this.tooltip = tooltip;
+            }else{
+                this.btnEl.dom[this.tooltipType] = tooltip;
+            }
+        }else{
+            this.tooltip = tooltip;
+        }
+        return this;
+    },
+
+    
+    clearTip : function(){
+        if(Ext.isObject(this.tooltip)){
+            Ext.QuickTips.unregister(this.btnEl);
+        }
+    },
+
+    
+    beforeDestroy : function(){
+        if(this.rendered){
+            this.clearTip();
+        }
+        if(this.menu && this.destroyMenu !== false) {
+            Ext.destroy(this.btnEl, this.menu);
+        }
+        Ext.destroy(this.repeater);
+    },
+
+    
+    onDestroy : function(){
+        if(this.rendered){
+            this.doc.un('mouseover', this.monitorMouseOver, this);
+            this.doc.un('mouseup', this.onMouseUp, this);
+            delete this.doc;
+            delete this.btnEl;
+            Ext.ButtonToggleMgr.unregister(this);
+        }
+        Ext.Button.superclass.onDestroy.call(this);
+    },
+
+    
+    doAutoWidth : function(){
+        if(this.autoWidth !== false && this.el && this.text && this.width === undefined){
+            this.el.setWidth('auto');
+            if(Ext.isIE7 && Ext.isStrict){
+                var ib = this.btnEl;
+                if(ib && ib.getWidth() > 20){
+                    ib.clip();
+                    ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr'));
+                }
+            }
+            if(this.minWidth){
+                if(this.el.getWidth() < this.minWidth){
+                    this.el.setWidth(this.minWidth);
+                }
+            }
+        }
+    },
+
+    
+    setHandler : function(handler, scope){
+        this.handler = handler;
+        this.scope = scope;
+        return this;
+    },
+
+    
+    setText : function(text){
+        this.text = text;
+        if(this.el){
+            this.btnEl.update(text || '&#160;');
+            this.setButtonClass();
+        }
+        this.doAutoWidth();
+        return this;
+    },
+
+    
+    setIcon : function(icon){
+        this.icon = icon;
+        if(this.el){
+            this.btnEl.setStyle('background-image', icon ? 'url(' + icon + ')' : '');
+            this.setButtonClass();
+        }
+        return this;
+    },
+
+    
+    getText : function(){
+        return this.text;
+    },
+
+    
+    toggle : function(state, suppressEvent){
+        state = state === undefined ? !this.pressed : !!state;
+        if(state != this.pressed){
+            if(this.rendered){
+                this.el[state ? 'addClass' : 'removeClass']('x-btn-pressed');
+            }
+            this.pressed = state;
+            if(!suppressEvent){
+                this.fireEvent('toggle', this, state);
+                if(this.toggleHandler){
+                    this.toggleHandler.call(this.scope || this, this, state);
+                }
+            }
+        }
+        return this;
+    },
+
+    
+    onDisable : function(){
+        this.onDisableChange(true);
+    },
+
+    
+    onEnable : function(){
+        this.onDisableChange(false);
+    },
+
+    onDisableChange : function(disabled){
+        if(this.el){
+            if(!Ext.isIE6 || !this.text){
+                this.el[disabled ? 'addClass' : 'removeClass'](this.disabledClass);
+            }
+            this.el.dom.disabled = disabled;
+        }
+        this.disabled = disabled;
+    },
+
+    
+    showMenu : function(){
+        if(this.rendered && this.menu){
+            if(this.tooltip){
+                Ext.QuickTips.getQuickTip().cancelShow(this.btnEl);
+            }
+            if(this.menu.isVisible()){
+                this.menu.hide();
+            }
+            this.menu.ownerCt = this;
+            this.menu.show(this.el, this.menuAlign);
+        }
+        return this;
+    },
+
+    
+    hideMenu : function(){
+        if(this.hasVisibleMenu()){
+            this.menu.hide();
+        }
+        return this;
+    },
+
+    
+    hasVisibleMenu : function(){
+        return this.menu && this.menu.ownerCt == this && this.menu.isVisible();
+    },
+    
+    
+    onRepeatClick : function(repeat, e){
+        this.onClick(e);
+    },
+
+    
+    onClick : function(e){
+        if(e){
+            e.preventDefault();
+        }
+        if(e.button !== 0){
+            return;
+        }
+        if(!this.disabled){
+            this.doToggle();
+            if(this.menu && !this.hasVisibleMenu() && !this.ignoreNextClick){
+                this.showMenu();
+            }
+            this.fireEvent('click', this, e);
+            if(this.handler){
+                
+                this.handler.call(this.scope || this, this, e);
+            }
+        }
+    },
+    
+    
+    doToggle: function(){
+        if (this.enableToggle && (this.allowDepress !== false || !this.pressed)) {
+            this.toggle();
+        }
+    },
+
+    
+    isMenuTriggerOver : function(e, internal){
+        return this.menu && !internal;
+    },
+
+    
+    isMenuTriggerOut : function(e, internal){
+        return this.menu && !internal;
+    },
+
+    
+    onMouseOver : function(e){
+        if(!this.disabled){
+            var internal = e.within(this.el,  true);
+            if(!internal){
+                this.el.addClass('x-btn-over');
+                if(!this.monitoringMouseOver){
+                    this.doc.on('mouseover', this.monitorMouseOver, this);
+                    this.monitoringMouseOver = true;
+                }
+                this.fireEvent('mouseover', this, e);
+            }
+            if(this.isMenuTriggerOver(e, internal)){
+                this.fireEvent('menutriggerover', this, this.menu, e);
+            }
+        }
+    },
+
+    
+    monitorMouseOver : function(e){
+        if(e.target != this.el.dom && !e.within(this.el)){
+            if(this.monitoringMouseOver){
+                this.doc.un('mouseover', this.monitorMouseOver, this);
+                this.monitoringMouseOver = false;
+            }
+            this.onMouseOut(e);
+        }
+    },
+
+    
+    onMouseOut : function(e){
+        var internal = e.within(this.el) && e.target != this.el.dom;
+        this.el.removeClass('x-btn-over');
+        this.fireEvent('mouseout', this, e);
+        if(this.isMenuTriggerOut(e, internal)){
+            this.fireEvent('menutriggerout', this, this.menu, e);
+        }
+    },
+
+    focus : function() {
+        this.btnEl.focus();
+    },
+
+    blur : function() {
+        this.btnEl.blur();
+    },
+
+    
+    onFocus : function(e){
+        if(!this.disabled){
+            this.el.addClass('x-btn-focus');
+        }
+    },
+    
+    onBlur : function(e){
+        this.el.removeClass('x-btn-focus');
+    },
+
+    
+    getClickEl : function(e, isUp){
+       return this.el;
+    },
+
+    
+    onMouseDown : function(e){
+        if(!this.disabled && e.button === 0){
+            this.getClickEl(e).addClass('x-btn-click');
+            this.doc.on('mouseup', this.onMouseUp, this);
+        }
+    },
+    
+    onMouseUp : function(e){
+        if(e.button === 0){
+            this.getClickEl(e, true).removeClass('x-btn-click');
+            this.doc.un('mouseup', this.onMouseUp, this);
+        }
+    },
+    
+    onMenuShow : function(e){
+        if(this.menu.ownerCt == this){
+            this.menu.ownerCt = this;
+            this.ignoreNextClick = 0;
+            this.el.addClass('x-btn-menu-active');
+            this.fireEvent('menushow', this, this.menu);
+        }
+    },
+    
+    onMenuHide : function(e){
+        if(this.menu.ownerCt == this){
+            this.el.removeClass('x-btn-menu-active');
+            this.ignoreNextClick = this.restoreClick.defer(250, this);
+            this.fireEvent('menuhide', this, this.menu);
+            delete this.menu.ownerCt;
+        }
+    },
+
+    
+    restoreClick : function(){
+        this.ignoreNextClick = 0;
+    }
+
+    
+    
+    
+    
+    
+    
+});
+Ext.reg('button', Ext.Button);
+
+
+Ext.ButtonToggleMgr = function(){
+   var groups = {};
+
+   function toggleGroup(btn, state){
+       if(state){
+           var g = groups[btn.toggleGroup];
+           for(var i = 0, l = g.length; i < l; i++){
+               if(g[i] != btn){
+                   g[i].toggle(false);
+               }
+           }
+       }
+   }
+
+   return {
+       register : function(btn){
+           if(!btn.toggleGroup){
+               return;
+           }
+           var g = groups[btn.toggleGroup];
+           if(!g){
+               g = groups[btn.toggleGroup] = [];
+           }
+           g.push(btn);
+           btn.on('toggle', toggleGroup);
+       },
+
+       unregister : function(btn){
+           if(!btn.toggleGroup){
+               return;
+           }
+           var g = groups[btn.toggleGroup];
+           if(g){
+               g.remove(btn);
+               btn.un('toggle', toggleGroup);
+           }
+       },
+
+       
+       getPressed : function(group){
+           var g = groups[group];
+           if(g){
+               for(var i = 0, len = g.length; i < len; i++){
+                   if(g[i].pressed === true){
+                       return g[i];
+                   }
+               }
+           }
+           return null;
+       }
+   };
+}();
+
+Ext.SplitButton = Ext.extend(Ext.Button, {
+       
+    arrowSelector : 'em',
+    split: true,
+
+    
+    initComponent : function(){
+        Ext.SplitButton.superclass.initComponent.call(this);
+        
+        this.addEvents("arrowclick");
+    },
+
+    
+    onRender : function(){
+        Ext.SplitButton.superclass.onRender.apply(this, arguments);
+        if(this.arrowTooltip){
+            this.el.child(this.arrowSelector).dom[this.tooltipType] = this.arrowTooltip;
+        }
+    },
+
+    
+    setArrowHandler : function(handler, scope){
+        this.arrowHandler = handler;
+        this.scope = scope;
+    },
+
+    getMenuClass : function(){
+        return 'x-btn-split' + (this.arrowAlign == 'bottom' ? '-bottom' : '');
+    },
+
+    isClickOnArrow : function(e){
+       if (this.arrowAlign != 'bottom') {
+           var visBtn = this.el.child('em.x-btn-split');
+           var right = visBtn.getRegion().right - visBtn.getPadding('r');
+           return e.getPageX() > right;
+       } else {
+           return e.getPageY() > this.btnEl.getRegion().bottom;
+       }
+    },
+
+    
+    onClick : function(e, t){
+        e.preventDefault();
+        if(!this.disabled){
+            if(this.isClickOnArrow(e)){
+                if(this.menu && !this.menu.isVisible() && !this.ignoreNextClick){
+                    this.showMenu();
+                }
+                this.fireEvent("arrowclick", this, e);
+                if(this.arrowHandler){
+                    this.arrowHandler.call(this.scope || this, this, e);
+                }
+            }else{
+                this.doToggle();
+                this.fireEvent("click", this, e);
+                if(this.handler){
+                    this.handler.call(this.scope || this, this, e);
+                }
+            }
+        }
+    },
+
+    
+    isMenuTriggerOver : function(e){
+        return this.menu && e.target.tagName == this.arrowSelector;
+    },
+
+    
+    isMenuTriggerOut : function(e, internal){
+        return this.menu && e.target.tagName != this.arrowSelector;
+    }
+});
+
+Ext.reg('splitbutton', Ext.SplitButton);
+Ext.CycleButton = Ext.extend(Ext.SplitButton, {
+    
+    
+    
+    
+    
+    
+
+    
+    getItemText : function(item){
+        if(item && this.showText === true){
+            var text = '';
+            if(this.prependText){
+                text += this.prependText;
+            }
+            text += item.text;
+            return text;
+        }
+        return undefined;
+    },
+
+    
+    setActiveItem : function(item, suppressEvent){
+        if(!Ext.isObject(item)){
+            item = this.menu.getComponent(item);
+        }
+        if(item){
+            if(!this.rendered){
+                this.text = this.getItemText(item);
+                this.iconCls = item.iconCls;
+            }else{
+                var t = this.getItemText(item);
+                if(t){
+                    this.setText(t);
+                }
+                this.setIconClass(item.iconCls);
+            }
+            this.activeItem = item;
+            if(!item.checked){
+                item.setChecked(true, false);
+            }
+            if(this.forceIcon){
+                this.setIconClass(this.forceIcon);
+            }
+            if(!suppressEvent){
+                this.fireEvent('change', this, item);
+            }
+        }
+    },
+
+    
+    getActiveItem : function(){
+        return this.activeItem;
+    },
+
+    
+    initComponent : function(){
+        this.addEvents(
+            
+            "change"
+        );
+
+        if(this.changeHandler){
+            this.on('change', this.changeHandler, this.scope||this);
+            delete this.changeHandler;
+        }
+
+        this.itemCount = this.items.length;
+
+        this.menu = {cls:'x-cycle-menu', items:[]};
+        var checked = 0;
+        Ext.each(this.items, function(item, i){
+            Ext.apply(item, {
+                group: item.group || this.id,
+                itemIndex: i,
+                checkHandler: this.checkHandler,
+                scope: this,
+                checked: item.checked || false
+            });
+            this.menu.items.push(item);
+            if(item.checked){
+                checked = i;
+            }
+        }, this);
+        Ext.CycleButton.superclass.initComponent.call(this);
+        this.on('click', this.toggleSelected, this);
+        this.setActiveItem(checked, true);
+    },
+
+    
+    checkHandler : function(item, pressed){
+        if(pressed){
+            this.setActiveItem(item);
+        }
+    },
+
+    
+    toggleSelected : function(){
+        var m = this.menu;
+        m.render();
+        
+        if(!m.hasLayout){
+            m.doLayout();
+        }
+        
+        var nextIdx, checkItem;
+        for (var i = 1; i < this.itemCount; i++) {
+            nextIdx = (this.activeItem.itemIndex + i) % this.itemCount;
+            
+            checkItem = m.items.itemAt(nextIdx);
+            
+            if (!checkItem.disabled) {
+                checkItem.setChecked(true);
+                break;
+            }
+        }
+    }
+});
+Ext.reg('cycle', Ext.CycleButton);
+Ext.Toolbar = function(config){
+    if(Ext.isArray(config)){
+        config = {items: config, layout: 'toolbar'};
+    } else {
+        config = Ext.apply({
+            layout: 'toolbar'
+        }, config);
+        if(config.buttons) {
+            config.items = config.buttons;
+        }
+    }
+    Ext.Toolbar.superclass.constructor.call(this, config);
+};
+
+(function(){
+
+var T = Ext.Toolbar;
+
+Ext.extend(T, Ext.Container, {
+
+    defaultType: 'button',
+
+    
+
+    enableOverflow : false,
+
+    
+    
+
+    trackMenus : true,
+    internalDefaults: {removeMode: 'container', hideParent: true},
+    toolbarCls: 'x-toolbar',
+
+    initComponent : function(){
+        T.superclass.initComponent.call(this);
+
+        
+        this.addEvents('overflowchange');
+    },
+
+    
+    onRender : function(ct, position){
+        if(!this.el){
+            if(!this.autoCreate){
+                this.autoCreate = {
+                    cls: this.toolbarCls + ' x-small-editor'
+                };
+            }
+            this.el = ct.createChild(Ext.apply({ id: this.id },this.autoCreate), position);
+            Ext.Toolbar.superclass.onRender.apply(this, arguments);
+        }
+    },
+
+    
+
+    
+    lookupComponent : function(c){
+        if(Ext.isString(c)){
+            if(c == '-'){
+                c = new T.Separator();
+            }else if(c == ' '){
+                c = new T.Spacer();
+            }else if(c == '->'){
+                c = new T.Fill();
+            }else{
+                c = new T.TextItem(c);
+            }
+            this.applyDefaults(c);
+        }else{
+            if(c.isFormField || c.render){ 
+                c = this.createComponent(c);
+            }else if(c.tag){ 
+                c = new T.Item({autoEl: c});
+            }else if(c.tagName){ 
+                c = new T.Item({el:c});
+            }else if(Ext.isObject(c)){ 
+                c = c.xtype ? this.createComponent(c) : this.constructButton(c);
+            }
+        }
+        return c;
+    },
+
+    
+    applyDefaults : function(c){
+        if(!Ext.isString(c)){
+            c = Ext.Toolbar.superclass.applyDefaults.call(this, c);
+            var d = this.internalDefaults;
+            if(c.events){
+                Ext.applyIf(c.initialConfig, d);
+                Ext.apply(c, d);
+            }else{
+                Ext.applyIf(c, d);
+            }
+        }
+        return c;
+    },
+
+    
+    addSeparator : function(){
+        return this.add(new T.Separator());
+    },
+
+    
+    addSpacer : function(){
+        return this.add(new T.Spacer());
+    },
+
+    
+    addFill : function(){
+        this.add(new T.Fill());
+    },
+
+    
+    addElement : function(el){
+        return this.addItem(new T.Item({el:el}));
+    },
+
+    
+    addItem : function(item){
+        return this.add.apply(this, arguments);
+    },
+
+    
+    addButton : function(config){
+        if(Ext.isArray(config)){
+            var buttons = [];
+            for(var i = 0, len = config.length; i < len; i++) {
+                buttons.push(this.addButton(config[i]));
+            }
+            return buttons;
+        }
+        return this.add(this.constructButton(config));
+    },
+
+    
+    addText : function(text){
+        return this.addItem(new T.TextItem(text));
+    },
+
+    
+    addDom : function(config){
+        return this.add(new T.Item({autoEl: config}));
+    },
+
+    
+    addField : function(field){
+        return this.add(field);
+    },
+
+    
+    insertButton : function(index, item){
+        if(Ext.isArray(item)){
+            var buttons = [];
+            for(var i = 0, len = item.length; i < len; i++) {
+               buttons.push(this.insertButton(index + i, item[i]));
+            }
+            return buttons;
+        }
+        return Ext.Toolbar.superclass.insert.call(this, index, item);
+    },
+
+    
+    trackMenu : function(item, remove){
+        if(this.trackMenus && item.menu){
+            var method = remove ? 'mun' : 'mon';
+            this[method](item, 'menutriggerover', this.onButtonTriggerOver, this);
+            this[method](item, 'menushow', this.onButtonMenuShow, this);
+            this[method](item, 'menuhide', this.onButtonMenuHide, this);
+        }
+    },
+
+    
+    constructButton : function(item){
+        var b = item.events ? item : this.createComponent(item, item.split ? 'splitbutton' : this.defaultType);
+        return b;
+    },
+
+    
+    onAdd : function(c){
+        Ext.Toolbar.superclass.onAdd.call(this);
+        this.trackMenu(c);
+        if(this.disabled){
+            c.disable();
+        }
+    },
+
+    
+    onRemove : function(c){
+        Ext.Toolbar.superclass.onRemove.call(this);
+        if (c == this.activeMenuBtn) {
+            delete this.activeMenuBtn;
+        }
+        this.trackMenu(c, true);
+    },
+
+    
+    onDisable : function(){
+        this.items.each(function(item){
+             if(item.disable){
+                 item.disable();
+             }
+        });
+    },
+
+    
+    onEnable : function(){
+        this.items.each(function(item){
+             if(item.enable){
+                 item.enable();
+             }
+        });
+    },
+
+    
+    onButtonTriggerOver : function(btn){
+        if(this.activeMenuBtn && this.activeMenuBtn != btn){
+            this.activeMenuBtn.hideMenu();
+            btn.showMenu();
+            this.activeMenuBtn = btn;
+        }
+    },
+
+    
+    onButtonMenuShow : function(btn){
+        this.activeMenuBtn = btn;
+    },
+
+    
+    onButtonMenuHide : function(btn){
+        delete this.activeMenuBtn;
+    }
+});
+Ext.reg('toolbar', Ext.Toolbar);
+
+
+T.Item = Ext.extend(Ext.BoxComponent, {
+    hideParent: true, 
+    enable:Ext.emptyFn,
+    disable:Ext.emptyFn,
+    focus:Ext.emptyFn
+    
+});
+Ext.reg('tbitem', T.Item);
+
+
+T.Separator = Ext.extend(T.Item, {
+    onRender : function(ct, position){
+        this.el = ct.createChild({tag:'span', cls:'xtb-sep'}, position);
+    }
+});
+Ext.reg('tbseparator', T.Separator);
+
+
+T.Spacer = Ext.extend(T.Item, {
+    
+
+    onRender : function(ct, position){
+        this.el = ct.createChild({tag:'div', cls:'xtb-spacer', style: this.width?'width:'+this.width+'px':''}, position);
+    }
+});
+Ext.reg('tbspacer', T.Spacer);
+
+
+T.Fill = Ext.extend(T.Item, {
+    
+    render : Ext.emptyFn,
+    isFill : true
+});
+Ext.reg('tbfill', T.Fill);
+
+
+T.TextItem = Ext.extend(T.Item, {
+    
+
+    constructor: function(config){
+        T.TextItem.superclass.constructor.call(this, Ext.isString(config) ? {text: config} : config);
+    },
+
+    
+    onRender : function(ct, position) {
+        this.autoEl = {cls: 'xtb-text', html: this.text || ''};
+        T.TextItem.superclass.onRender.call(this, ct, position);
+    },
+
+    
+    setText : function(t) {
+        if(this.rendered){
+            this.el.update(t);
+        }else{
+            this.text = t;
+        }
+    }
+});
+Ext.reg('tbtext', T.TextItem);
+
+
+T.Button = Ext.extend(Ext.Button, {});
+T.SplitButton = Ext.extend(Ext.SplitButton, {});
+Ext.reg('tbbutton', T.Button);
+Ext.reg('tbsplit', T.SplitButton);
+
+})();
+
+Ext.ButtonGroup = Ext.extend(Ext.Panel, {
+    
+    
+    baseCls: 'x-btn-group',
+    
+    layout:'table',
+    defaultType: 'button',
+    
+    frame: true,
+    internalDefaults: {removeMode: 'container', hideParent: true},
+
+    initComponent : function(){
+        this.layoutConfig = this.layoutConfig || {};
+        Ext.applyIf(this.layoutConfig, {
+            columns : this.columns
+        });
+        if(!this.title){
+            this.addClass('x-btn-group-notitle');
+        }
+        this.on('afterlayout', this.onAfterLayout, this);
+        Ext.ButtonGroup.superclass.initComponent.call(this);
+    },
+
+    applyDefaults : function(c){
+        c = Ext.ButtonGroup.superclass.applyDefaults.call(this, c);
+        var d = this.internalDefaults;
+        if(c.events){
+            Ext.applyIf(c.initialConfig, d);
+            Ext.apply(c, d);
+        }else{
+            Ext.applyIf(c, d);
+        }
+        return c;
+    },
+
+    onAfterLayout : function(){
+        var bodyWidth = this.body.getFrameWidth('lr') + this.body.dom.firstChild.offsetWidth;
+        this.body.setWidth(bodyWidth);
+        this.el.setWidth(bodyWidth + this.getFrameWidth());
+    }
+    
+});
+
+Ext.reg('buttongroup', Ext.ButtonGroup);
+
+(function() {
+
+var T = Ext.Toolbar;
+
+Ext.PagingToolbar = Ext.extend(Ext.Toolbar, {
+    
+    
+    
+    pageSize : 20,
+    
+    
+    displayMsg : 'Displaying {0} - {1} of {2}',
+    
+    emptyMsg : 'No data to display',
+    
+    beforePageText : 'Page',
+    
+    afterPageText : 'of {0}',
+    
+    firstText : 'First Page',
+    
+    prevText : 'Previous Page',
+    
+    nextText : 'Next Page',
+    
+    lastText : 'Last Page',
+    
+    refreshText : 'Refresh',
+
+    
+
+    
+
+    
+
+    initComponent : function(){
+        var pagingItems = [this.first = new T.Button({
+            tooltip: this.firstText,
+            overflowText: this.firstText,
+            iconCls: 'x-tbar-page-first',
+            disabled: true,
+            handler: this.moveFirst,
+            scope: this
+        }), this.prev = new T.Button({
+            tooltip: this.prevText,
+            overflowText: this.prevText,
+            iconCls: 'x-tbar-page-prev',
+            disabled: true,
+            handler: this.movePrevious,
+            scope: this
+        }), '-', this.beforePageText,
+        this.inputItem = new Ext.form.NumberField({
+            cls: 'x-tbar-page-number',
+            allowDecimals: false,
+            allowNegative: false,
+            enableKeyEvents: true,
+            selectOnFocus: true,
+            submitValue: false,
+            listeners: {
+                scope: this,
+                keydown: this.onPagingKeyDown,
+                blur: this.onPagingBlur
+            }
+        }), this.afterTextItem = new T.TextItem({
+            text: String.format(this.afterPageText, 1)
+        }), '-', this.next = new T.Button({
+            tooltip: this.nextText,
+            overflowText: this.nextText,
+            iconCls: 'x-tbar-page-next',
+            disabled: true,
+            handler: this.moveNext,
+            scope: this
+        }), this.last = new T.Button({
+            tooltip: this.lastText,
+            overflowText: this.lastText,
+            iconCls: 'x-tbar-page-last',
+            disabled: true,
+            handler: this.moveLast,
+            scope: this
+        }), '-', this.refresh = new T.Button({
+            tooltip: this.refreshText,
+            overflowText: this.refreshText,
+            iconCls: 'x-tbar-loading',
+            handler: this.doRefresh,
+            scope: this
+        })];
+
+
+        var userItems = this.items || this.buttons || [];
+        if (this.prependButtons) {
+            this.items = userItems.concat(pagingItems);
+        }else{
+            this.items = pagingItems.concat(userItems);
+        }
+        delete this.buttons;
+        if(this.displayInfo){
+            this.items.push('->');
+            this.items.push(this.displayItem = new T.TextItem({}));
+        }
+        Ext.PagingToolbar.superclass.initComponent.call(this);
+        this.addEvents(
+            
+            'change',
+            
+            'beforechange'
+        );
+        this.on('afterlayout', this.onFirstLayout, this, {single: true});
+        this.cursor = 0;
+        this.bindStore(this.store, true);
+    },
+
+    
+    onFirstLayout : function(){
+        if(this.dsLoaded){
+            this.onLoad.apply(this, this.dsLoaded);
+        }
+    },
+
+    
+    updateInfo : function(){
+        if(this.displayItem){
+            var count = this.store.getCount();
+            var msg = count == 0 ?
+                this.emptyMsg :
+                String.format(
+                    this.displayMsg,
+                    this.cursor+1, this.cursor+count, this.store.getTotalCount()
+                );
+            this.displayItem.setText(msg);
+        }
+    },
+
+    
+    onLoad : function(store, r, o){
+        if(!this.rendered){
+            this.dsLoaded = [store, r, o];
+            return;
+        }
+        var p = this.getParams();
+        this.cursor = (o.params && o.params[p.start]) ? o.params[p.start] : 0;
+        var d = this.getPageData(), ap = d.activePage, ps = d.pages;
+
+        this.afterTextItem.setText(String.format(this.afterPageText, d.pages));
+        this.inputItem.setValue(ap);
+        this.first.setDisabled(ap == 1);
+        this.prev.setDisabled(ap == 1);
+        this.next.setDisabled(ap == ps);
+        this.last.setDisabled(ap == ps);
+        this.refresh.enable();
+        this.updateInfo();
+        this.fireEvent('change', this, d);
+    },
+
+    
+    getPageData : function(){
+        var total = this.store.getTotalCount();
+        return {
+            total : total,
+            activePage : Math.ceil((this.cursor+this.pageSize)/this.pageSize),
+            pages :  total < this.pageSize ? 1 : Math.ceil(total/this.pageSize)
+        };
+    },
+
+    
+    changePage : function(page){
+        this.doLoad(((page-1) * this.pageSize).constrain(0, this.store.getTotalCount()));
+    },
+
+    
+    onLoadError : function(){
+        if(!this.rendered){
+            return;
+        }
+        this.refresh.enable();
+    },
+
+    
+    readPage : function(d){
+        var v = this.inputItem.getValue(), pageNum;
+        if (!v || isNaN(pageNum = parseInt(v, 10))) {
+            this.inputItem.setValue(d.activePage);
+            return false;
+        }
+        return pageNum;
+    },
+
+    onPagingFocus : function(){
+        this.inputItem.select();
+    },
+
+    
+    onPagingBlur : function(e){
+        this.inputItem.setValue(this.getPageData().activePage);
+    },
+
+    
+    onPagingKeyDown : function(field, e){
+        var k = e.getKey(), d = this.getPageData(), pageNum;
+        if (k == e.RETURN) {
+            e.stopEvent();
+            pageNum = this.readPage(d);
+            if(pageNum !== false){
+                pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1;
+                this.doLoad(pageNum * this.pageSize);
+            }
+        }else if (k == e.HOME || k == e.END){
+            e.stopEvent();
+            pageNum = k == e.HOME ? 1 : d.pages;
+            field.setValue(pageNum);
+        }else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN){
+            e.stopEvent();
+            if((pageNum = this.readPage(d))){
+                var increment = e.shiftKey ? 10 : 1;
+                if(k == e.DOWN || k == e.PAGEDOWN){
+                    increment *= -1;
+                }
+                pageNum += increment;
+                if(pageNum >= 1 & pageNum <= d.pages){
+                    field.setValue(pageNum);
+                }
+            }
+        }
+    },
+
+    
+    getParams : function(){
+        
+        return this.paramNames || this.store.paramNames;
+    },
+
+    
+    beforeLoad : function(){
+        if(this.rendered && this.refresh){
+            this.refresh.disable();
+        }
+    },
+
+    
+    doLoad : function(start){
+        var o = {}, pn = this.getParams();
+        o[pn.start] = start;
+        o[pn.limit] = this.pageSize;
+        if(this.fireEvent('beforechange', this, o) !== false){
+            this.store.load({params:o});
+        }
+    },
+
+    
+    moveFirst : function(){
+        this.doLoad(0);
+    },
+
+    
+    movePrevious : function(){
+        this.doLoad(Math.max(0, this.cursor-this.pageSize));
+    },
+
+    
+    moveNext : function(){
+        this.doLoad(this.cursor+this.pageSize);
+    },
+
+    
+    moveLast : function(){
+        var total = this.store.getTotalCount(),
+            extra = total % this.pageSize;
+
+        this.doLoad(extra ? (total - extra) : total - this.pageSize);
+    },
+
+    
+    doRefresh : function(){
+        this.doLoad(this.cursor);
+    },
+
+    
+    bindStore : function(store, initial){
+        var doLoad;
+        if(!initial && this.store){
+            if(store !== this.store && this.store.autoDestroy){
+                this.store.destroy();
+            }else{
+                this.store.un('beforeload', this.beforeLoad, this);
+                this.store.un('load', this.onLoad, this);
+                this.store.un('exception', this.onLoadError, this);
+            }
+            if(!store){
+                this.store = null;
+            }
+        }
+        if(store){
+            store = Ext.StoreMgr.lookup(store);
+            store.on({
+                scope: this,
+                beforeload: this.beforeLoad,
+                load: this.onLoad,
+                exception: this.onLoadError
+            });
+            doLoad = true;
+        }
+        this.store = store;
+        if(doLoad){
+            this.onLoad(store, null, {});
+        }
+    },
+
+    
+    unbind : function(store){
+        this.bindStore(null);
+    },
+
+    
+    bind : function(store){
+        this.bindStore(store);
+    },
+
+    
+    onDestroy : function(){
+        this.bindStore(null);
+        Ext.PagingToolbar.superclass.onDestroy.call(this);
+    }
+});
+
+})();
+Ext.reg('paging', Ext.PagingToolbar);
+Ext.History = (function () {
+    var iframe, hiddenField;
+    var ready = false;
+    var currentToken;
+
+    function getHash() {
+        var href = location.href, i = href.indexOf("#");
+        return i >= 0 ? href.substr(i + 1) : null;
+    }
+
+    function doSave() {
+        hiddenField.value = currentToken;
+    }
+
+    function handleStateChange(token) {
+        currentToken = token;
+        Ext.History.fireEvent('change', token);
+    }
+
+    function updateIFrame (token) {
+        var html = ['<html><body><div id="state">',Ext.util.Format.htmlEncode(token),'</div></body></html>'].join('');
+        try {
+            var doc = iframe.contentWindow.document;
+            doc.open();
+            doc.write(html);
+            doc.close();
+            return true;
+        } catch (e) {
+            return false;
+        }
+    }
+
+    function checkIFrame() {
+        if (!iframe.contentWindow || !iframe.contentWindow.document) {
+            setTimeout(checkIFrame, 10);
+            return;
+        }
+
+        var doc = iframe.contentWindow.document;
+        var elem = doc.getElementById("state");
+        var token = elem ? elem.innerText : null;
+
+        var hash = getHash();
+
+        setInterval(function () {
+
+            doc = iframe.contentWindow.document;
+            elem = doc.getElementById("state");
+
+            var newtoken = elem ? elem.innerText : null;
+
+            var newHash = getHash();
+
+            if (newtoken !== token) {
+                token = newtoken;
+                handleStateChange(token);
+                top.location.hash = token;
+                hash = token;
+                doSave();
+            } else if (newHash !== hash) {
+                hash = newHash;
+                updateIFrame(newHash);
+            }
+
+        }, 50);
+
+        ready = true;
+
+        Ext.History.fireEvent('ready', Ext.History);
+    }
+
+    function startUp() {
+        currentToken = hiddenField.value ? hiddenField.value : getHash();
+
+        if (Ext.isIE) {
+            checkIFrame();
+        } else {
+            var hash = getHash();
+            setInterval(function () {
+                var newHash = getHash();
+                if (newHash !== hash) {
+                    hash = newHash;
+                    handleStateChange(hash);
+                    doSave();
+                }
+            }, 50);
+            ready = true;
+            Ext.History.fireEvent('ready', Ext.History);
+        }
+    }
+
+    return {
+        
+        fieldId: 'x-history-field',
+        
+        iframeId: 'x-history-frame',
+
+        events:{},
+
+        
+        init: function (onReady, scope) {
+            if(ready) {
+                Ext.callback(onReady, scope, [this]);
+                return;
+            }
+            if(!Ext.isReady){
+                Ext.onReady(function(){
+                    Ext.History.init(onReady, scope);
+                });
+                return;
+            }
+            hiddenField = Ext.getDom(Ext.History.fieldId);
+            if (Ext.isIE) {
+                iframe = Ext.getDom(Ext.History.iframeId);
+            }
+            this.addEvents(
+                
+                'ready',
+                
+                'change'
+            );
+            if(onReady){
+                this.on('ready', onReady, scope, {single:true});
+            }
+            startUp();
+        },
+
+        
+        add: function (token, preventDup) {
+            if(preventDup !== false){
+                if(this.getToken() == token){
+                    return true;
+                }
+            }
+            if (Ext.isIE) {
+                return updateIFrame(token);
+            } else {
+                top.location.hash = token;
+                return true;
+            }
+        },
+
+        
+        back: function(){
+            history.go(-1);
+        },
+
+        
+        forward: function(){
+            history.go(1);
+        },
+
+        
+        getToken: function() {
+            return ready ? currentToken : getHash();
+        }
+    };
+})();
+Ext.apply(Ext.History, new Ext.util.Observable());
+Ext.Tip = Ext.extend(Ext.Panel, {
+    
+    
+    
+    minWidth : 40,
+    
+    maxWidth : 300,
+    
+    shadow : "sides",
+    
+    defaultAlign : "tl-bl?",
+    autoRender: true,
+    quickShowInterval : 250,
+
+    
+    frame:true,
+    hidden:true,
+    baseCls: 'x-tip',
+    floating:{shadow:true,shim:true,useDisplay:true,constrain:false},
+    autoHeight:true,
+
+    closeAction: 'hide',
+
+    
+    initComponent : function(){
+        Ext.Tip.superclass.initComponent.call(this);
+        if(this.closable && !this.title){
+            this.elements += ',header';
+        }
+    },
+
+    
+    afterRender : function(){
+        Ext.Tip.superclass.afterRender.call(this);
+        if(this.closable){
+            this.addTool({
+                id: 'close',
+                handler: this[this.closeAction],
+                scope: this
+            });
+        }
+    },
+
+    
+    showAt : function(xy){
+        Ext.Tip.superclass.show.call(this);
+        if(this.measureWidth !== false && (!this.initialConfig || typeof this.initialConfig.width != 'number')){
+            this.doAutoWidth();
+        }
+        if(this.constrainPosition){
+            xy = this.el.adjustForConstraints(xy);
+        }
+        this.setPagePosition(xy[0], xy[1]);
+    },
+
+    
+    doAutoWidth : function(adjust){
+        adjust = adjust || 0;
+        var bw = this.body.getTextWidth();
+        if(this.title){
+            bw = Math.max(bw, this.header.child('span').getTextWidth(this.title));
+        }
+        bw += this.getFrameWidth() + (this.closable ? 20 : 0) + this.body.getPadding("lr") + adjust;
+        this.setWidth(bw.constrain(this.minWidth, this.maxWidth));
+        
+        
+        if(Ext.isIE7 && !this.repainted){
+            this.el.repaint();
+            this.repainted = true;
+        }
+    },
+
+    
+    showBy : function(el, pos){
+        if(!this.rendered){
+            this.render(Ext.getBody());
+        }
+        this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign));
+    },
+
+    initDraggable : function(){
+        this.dd = new Ext.Tip.DD(this, typeof this.draggable == 'boolean' ? null : this.draggable);
+        this.header.addClass('x-tip-draggable');
+    }
+});
+
+Ext.reg('tip', Ext.Tip);
+
+
+Ext.Tip.DD = function(tip, config){
+    Ext.apply(this, config);
+    this.tip = tip;
+    Ext.Tip.DD.superclass.constructor.call(this, tip.el.id, 'WindowDD-'+tip.id);
+    this.setHandleElId(tip.header.id);
+    this.scroll = false;
+};
+
+Ext.extend(Ext.Tip.DD, Ext.dd.DD, {
+    moveOnly:true,
+    scroll:false,
+    headerOffsets:[100, 25],
+    startDrag : function(){
+        this.tip.el.disableShadow();
+    },
+    endDrag : function(e){
+        this.tip.el.enableShadow(true);
+    }
+});
+Ext.ToolTip = Ext.extend(Ext.Tip, {
+    
+    
+    
+    
+    showDelay : 500,
+    
+    hideDelay : 200,
+    
+    dismissDelay : 5000,
+    
+    
+    trackMouse : false,
+    
+    anchorToTarget : true,
+    
+    anchorOffset : 0,
+    
+
+    
+    targetCounter : 0,
+
+    constrainPosition : false,
+
+    
+    initComponent : function(){
+        Ext.ToolTip.superclass.initComponent.call(this);
+        this.lastActive = new Date();
+        this.initTarget(this.target);
+        this.origAnchor = this.anchor;
+    },
+
+    
+    onRender : function(ct, position){
+        Ext.ToolTip.superclass.onRender.call(this, ct, position);
+        this.anchorCls = 'x-tip-anchor-' + this.getAnchorPosition();
+        this.anchorEl = this.el.createChild({
+            cls: 'x-tip-anchor ' + this.anchorCls
+        });
+    },
+
+    
+    afterRender : function(){
+        Ext.ToolTip.superclass.afterRender.call(this);
+        this.anchorEl.setStyle('z-index', this.el.getZIndex() + 1).setVisibilityMode(Ext.Element.DISPLAY);
+    },
+
+    
+    initTarget : function(target){
+        var t;
+        if((t = Ext.get(target))){
+            if(this.target){
+                var tg = Ext.get(this.target);
+                this.mun(tg, 'mouseover', this.onTargetOver, this);
+                this.mun(tg, 'mouseout', this.onTargetOut, this);
+                this.mun(tg, 'mousemove', this.onMouseMove, this);
+            }
+            this.mon(t, {
+                mouseover: this.onTargetOver,
+                mouseout: this.onTargetOut,
+                mousemove: this.onMouseMove,
+                scope: this
+            });
+            this.target = t;
+        }
+        if(this.anchor){
+            this.anchorTarget = this.target;
+        }
+    },
+
+    
+    onMouseMove : function(e){
+        var t = this.delegate ? e.getTarget(this.delegate) : this.triggerElement = true;
+        if (t) {
+            this.targetXY = e.getXY();
+            if (t === this.triggerElement) {
+                if(!this.hidden && this.trackMouse){
+                    this.setPagePosition(this.getTargetXY());
+                }
+            } else {
+                this.hide();
+                this.lastActive = new Date(0);
+                this.onTargetOver(e);
+            }
+        } else if (!this.closable && this.isVisible()) {
+            this.hide();
+        }
+    },
+
+    
+    getTargetXY : function(){
+        if(this.delegate){
+            this.anchorTarget = this.triggerElement;
+        }
+        if(this.anchor){
+            this.targetCounter++;
+            var offsets = this.getOffsets(),
+                xy = (this.anchorToTarget && !this.trackMouse) ? this.el.getAlignToXY(this.anchorTarget, this.getAnchorAlign()) : this.targetXY,
+                dw = Ext.lib.Dom.getViewWidth() - 5,
+                dh = Ext.lib.Dom.getViewHeight() - 5,
+                de = document.documentElement,
+                bd = document.body,
+                scrollX = (de.scrollLeft || bd.scrollLeft || 0) + 5,
+                scrollY = (de.scrollTop || bd.scrollTop || 0) + 5,
+                axy = [xy[0] + offsets[0], xy[1] + offsets[1]],
+                sz = this.getSize();
+                
+            this.anchorEl.removeClass(this.anchorCls);
+
+            if(this.targetCounter < 2){
+                if(axy[0] < scrollX){
+                    if(this.anchorToTarget){
+                        this.defaultAlign = 'l-r';
+                        if(this.mouseOffset){this.mouseOffset[0] *= -1;}
+                    }
+                    this.anchor = 'left';
+                    return this.getTargetXY();
+                }
+                if(axy[0]+sz.width > dw){
+                    if(this.anchorToTarget){
+                        this.defaultAlign = 'r-l';
+                        if(this.mouseOffset){this.mouseOffset[0] *= -1;}
+                    }
+                    this.anchor = 'right';
+                    return this.getTargetXY();
+                }
+                if(axy[1] < scrollY){
+                    if(this.anchorToTarget){
+                        this.defaultAlign = 't-b';
+                        if(this.mouseOffset){this.mouseOffset[1] *= -1;}
+                    }
+                    this.anchor = 'top';
+                    return this.getTargetXY();
+                }
+                if(axy[1]+sz.height > dh){
+                    if(this.anchorToTarget){
+                        this.defaultAlign = 'b-t';
+                        if(this.mouseOffset){this.mouseOffset[1] *= -1;}
+                    }
+                    this.anchor = 'bottom';
+                    return this.getTargetXY();
+                }
+            }
+
+            this.anchorCls = 'x-tip-anchor-'+this.getAnchorPosition();
+            this.anchorEl.addClass(this.anchorCls);
+            this.targetCounter = 0;
+            return axy;
+        }else{
+            var mouseOffset = this.getMouseOffset();
+            return [this.targetXY[0]+mouseOffset[0], this.targetXY[1]+mouseOffset[1]];
+        }
+    },
+
+    getMouseOffset : function(){
+        var offset = this.anchor ? [0,0] : [15,18];
+        if(this.mouseOffset){
+            offset[0] += this.mouseOffset[0];
+            offset[1] += this.mouseOffset[1];
+        }
+        return offset;
+    },
+
+    
+    getAnchorPosition : function(){
+        if(this.anchor){
+            this.tipAnchor = this.anchor.charAt(0);
+        }else{
+            var m = this.defaultAlign.match(/^([a-z]+)-([a-z]+)(\?)?$/);
+            if(!m){
+               throw 'AnchorTip.defaultAlign is invalid';
+            }
+            this.tipAnchor = m[1].charAt(0);
+        }
+
+        switch(this.tipAnchor){
+            case 't': return 'top';
+            case 'b': return 'bottom';
+            case 'r': return 'right';
+        }
+        return 'left';
+    },
+
+    
+    getAnchorAlign : function(){
+        switch(this.anchor){
+            case 'top'  : return 'tl-bl';
+            case 'left' : return 'tl-tr';
+            case 'right': return 'tr-tl';
+            default     : return 'bl-tl';
+        }
+    },
+
+    
+    getOffsets : function(){
+        var offsets, 
+            ap = this.getAnchorPosition().charAt(0);
+        if(this.anchorToTarget && !this.trackMouse){
+            switch(ap){
+                case 't':
+                    offsets = [0, 9];
+                    break;
+                case 'b':
+                    offsets = [0, -13];
+                    break;
+                case 'r':
+                    offsets = [-13, 0];
+                    break;
+                default:
+                    offsets = [9, 0];
+                    break;
+            }
+        }else{
+            switch(ap){
+                case 't':
+                    offsets = [-15-this.anchorOffset, 30];
+                    break;
+                case 'b':
+                    offsets = [-19-this.anchorOffset, -13-this.el.dom.offsetHeight];
+                    break;
+                case 'r':
+                    offsets = [-15-this.el.dom.offsetWidth, -13-this.anchorOffset];
+                    break;
+                default:
+                    offsets = [25, -13-this.anchorOffset];
+                    break;
+            }
+        }
+        var mouseOffset = this.getMouseOffset();
+        offsets[0] += mouseOffset[0];
+        offsets[1] += mouseOffset[1];
+
+        return offsets;
+    },
+
+    
+    onTargetOver : function(e){
+        if(this.disabled || e.within(this.target.dom, true)){
+            return;
+        }
+        var t = e.getTarget(this.delegate);
+        if (t) {
+            this.triggerElement = t;
+            this.clearTimer('hide');
+            this.targetXY = e.getXY();
+            this.delayShow();
+        }
+    },
+
+    
+    delayShow : function(){
+        if(this.hidden && !this.showTimer){
+            if(this.lastActive.getElapsed() < this.quickShowInterval){
+                this.show();
+            }else{
+                this.showTimer = this.show.defer(this.showDelay, this);
+            }
+        }else if(!this.hidden && this.autoHide !== false){
+            this.show();
+        }
+    },
+
+    
+    onTargetOut : function(e){
+        if(this.disabled || e.within(this.target.dom, true)){
+            return;
+        }
+        this.clearTimer('show');
+        if(this.autoHide !== false){
+            this.delayHide();
+        }
+    },
+
+    
+    delayHide : function(){
+        if(!this.hidden && !this.hideTimer){
+            this.hideTimer = this.hide.defer(this.hideDelay, this);
+        }
+    },
+
+    
+    hide: function(){
+        this.clearTimer('dismiss');
+        this.lastActive = new Date();
+        if(this.anchorEl){
+            this.anchorEl.hide();
+        }
+        Ext.ToolTip.superclass.hide.call(this);
+        delete this.triggerElement;
+    },
+
+    
+    show : function(){
+        if(this.anchor){
+            
+            
+            this.showAt([-1000,-1000]);
+            this.origConstrainPosition = this.constrainPosition;
+            this.constrainPosition = false;
+            this.anchor = this.origAnchor;
+        }
+        this.showAt(this.getTargetXY());
+
+        if(this.anchor){
+            this.anchorEl.show();
+            this.syncAnchor();
+            this.constrainPosition = this.origConstrainPosition;
+        }else{
+            this.anchorEl.hide();
+        }
+    },
+
+    
+    showAt : function(xy){
+        this.lastActive = new Date();
+        this.clearTimers();
+        Ext.ToolTip.superclass.showAt.call(this, xy);
+        if(this.dismissDelay && this.autoHide !== false){
+            this.dismissTimer = this.hide.defer(this.dismissDelay, this);
+        }
+        if(this.anchor && !this.anchorEl.isVisible()){
+            this.syncAnchor();
+            this.anchorEl.show();
+        }else{
+            this.anchorEl.hide();
+        }
+    },
+
+    
+    syncAnchor : function(){
+        var anchorPos, targetPos, offset;
+        switch(this.tipAnchor.charAt(0)){
+            case 't':
+                anchorPos = 'b';
+                targetPos = 'tl';
+                offset = [20+this.anchorOffset, 2];
+                break;
+            case 'r':
+                anchorPos = 'l';
+                targetPos = 'tr';
+                offset = [-2, 11+this.anchorOffset];
+                break;
+            case 'b':
+                anchorPos = 't';
+                targetPos = 'bl';
+                offset = [20+this.anchorOffset, -2];
+                break;
+            default:
+                anchorPos = 'r';
+                targetPos = 'tl';
+                offset = [2, 11+this.anchorOffset];
+                break;
+        }
+        this.anchorEl.alignTo(this.el, anchorPos+'-'+targetPos, offset);
+    },
+
+    
+    setPagePosition : function(x, y){
+        Ext.ToolTip.superclass.setPagePosition.call(this, x, y);
+        if(this.anchor){
+            this.syncAnchor();
+        }
+    },
+
+    
+    clearTimer : function(name){
+        name = name + 'Timer';
+        clearTimeout(this[name]);
+        delete this[name];
+    },
+
+    
+    clearTimers : function(){
+        this.clearTimer('show');
+        this.clearTimer('dismiss');
+        this.clearTimer('hide');
+    },
+
+    
+    onShow : function(){
+        Ext.ToolTip.superclass.onShow.call(this);
+        Ext.getDoc().on('mousedown', this.onDocMouseDown, this);
+    },
+
+    
+    onHide : function(){
+        Ext.ToolTip.superclass.onHide.call(this);
+        Ext.getDoc().un('mousedown', this.onDocMouseDown, this);
+    },
+
+    
+    onDocMouseDown : function(e){
+        if(this.autoHide !== true && !this.closable && !e.within(this.el.dom)){
+            this.disable();
+            this.doEnable.defer(100, this);
+        }
+    },
+    
+    
+    doEnable : function(){
+        if(!this.isDestroyed){
+            this.enable();
+        }
+    },
+
+    
+    onDisable : function(){
+        this.clearTimers();
+        this.hide();
+    },
+
+    
+    adjustPosition : function(x, y){
+        if(this.contstrainPosition){
+            var ay = this.targetXY[1], h = this.getSize().height;
+            if(y <= ay && (y+h) >= ay){
+                y = ay-h-5;
+            }
+        }
+        return {x : x, y: y};
+    },
+    
+    beforeDestroy : function(){
+        this.clearTimers();
+        Ext.destroy(this.anchorEl);
+        delete this.anchorEl;
+        delete this.target;
+        delete this.anchorTarget;
+        delete this.triggerElement;
+        Ext.ToolTip.superclass.beforeDestroy.call(this);    
+    },
+
+    
+    onDestroy : function(){
+        Ext.getDoc().un('mousedown', this.onDocMouseDown, this);
+        Ext.ToolTip.superclass.onDestroy.call(this);
+    }
+});
+
+Ext.reg('tooltip', Ext.ToolTip);
+Ext.QuickTip = Ext.extend(Ext.ToolTip, {
+    
+    
+    interceptTitles : false,
+
+    
+    tagConfig : {
+        namespace : "ext",
+        attribute : "qtip",
+        width : "qwidth",
+        target : "target",
+        title : "qtitle",
+        hide : "hide",
+        cls : "qclass",
+        align : "qalign",
+        anchor : "anchor"
+    },
+
+    
+    initComponent : function(){
+        this.target = this.target || Ext.getDoc();
+        this.targets = this.targets || {};
+        Ext.QuickTip.superclass.initComponent.call(this);
+    },
+
+    
+    register : function(config){
+        var cs = Ext.isArray(config) ? config : arguments;
+        for(var i = 0, len = cs.length; i < len; i++){
+            var c = cs[i];
+            var target = c.target;
+            if(target){
+                if(Ext.isArray(target)){
+                    for(var j = 0, jlen = target.length; j < jlen; j++){
+                        this.targets[Ext.id(target[j])] = c;
+                    }
+                } else{
+                    this.targets[Ext.id(target)] = c;
+                }
+            }
+        }
+    },
+
+    
+    unregister : function(el){
+        delete this.targets[Ext.id(el)];
+    },
+    
+    
+    cancelShow: function(el){
+        var at = this.activeTarget;
+        el = Ext.get(el).dom;
+        if(this.isVisible()){
+            if(at && at.el == el){
+                this.hide();
+            }
+        }else if(at && at.el == el){
+            this.clearTimer('show');
+        }
+    },
+    
+    getTipCfg: function(e) {
+        var t = e.getTarget(), 
+            ttp, 
+            cfg;
+        if(this.interceptTitles && t.title && Ext.isString(t.title)){
+            ttp = t.title;
+            t.qtip = ttp;
+            t.removeAttribute("title");
+            e.preventDefault();
+        }else{
+            cfg = this.tagConfig;
+            ttp = t.qtip || Ext.fly(t).getAttribute(cfg.attribute, cfg.namespace);
+        }
+        return ttp;
+    },
+
+    
+    onTargetOver : function(e){
+        if(this.disabled){
+            return;
+        }
+        this.targetXY = e.getXY();
+        var t = e.getTarget();
+        if(!t || t.nodeType !== 1 || t == document || t == document.body){
+            return;
+        }
+        if(this.activeTarget && ((t == this.activeTarget.el) || Ext.fly(this.activeTarget.el).contains(t))){
+            this.clearTimer('hide');
+            this.show();
+            return;
+        }
+        if(t && this.targets[t.id]){
+            this.activeTarget = this.targets[t.id];
+            this.activeTarget.el = t;
+            this.anchor = this.activeTarget.anchor;
+            if(this.anchor){
+                this.anchorTarget = t;
+            }
+            this.delayShow();
+            return;
+        }
+        var ttp, et = Ext.fly(t), cfg = this.tagConfig, ns = cfg.namespace;
+        if(ttp = this.getTipCfg(e)){
+            var autoHide = et.getAttribute(cfg.hide, ns);
+            this.activeTarget = {
+                el: t,
+                text: ttp,
+                width: et.getAttribute(cfg.width, ns),
+                autoHide: autoHide != "user" && autoHide !== 'false',
+                title: et.getAttribute(cfg.title, ns),
+                cls: et.getAttribute(cfg.cls, ns),
+                align: et.getAttribute(cfg.align, ns)
+                
+            };
+            this.anchor = et.getAttribute(cfg.anchor, ns);
+            if(this.anchor){
+                this.anchorTarget = t;
+            }
+            this.delayShow();
+        }
+    },
+
+    
+    onTargetOut : function(e){
+
+        
+        if (this.activeTarget && e.within(this.activeTarget.el) && !this.getTipCfg(e)) {
+            return;
+        }
+
+        this.clearTimer('show');
+        if(this.autoHide !== false){
+            this.delayHide();
+        }
+    },
+
+    
+    showAt : function(xy){
+        var t = this.activeTarget;
+        if(t){
+            if(!this.rendered){
+                this.render(Ext.getBody());
+                this.activeTarget = t;
+            }
+            if(t.width){
+                this.setWidth(t.width);
+                this.body.setWidth(this.adjustBodyWidth(t.width - this.getFrameWidth()));
+                this.measureWidth = false;
+            } else{
+                this.measureWidth = true;
+            }
+            this.setTitle(t.title || '');
+            this.body.update(t.text);
+            this.autoHide = t.autoHide;
+            this.dismissDelay = t.dismissDelay || this.dismissDelay;
+            if(this.lastCls){
+                this.el.removeClass(this.lastCls);
+                delete this.lastCls;
+            }
+            if(t.cls){
+                this.el.addClass(t.cls);
+                this.lastCls = t.cls;
+            }
+            if(this.anchor){
+                this.constrainPosition = false;
+            }else if(t.align){ 
+                xy = this.el.getAlignToXY(t.el, t.align);
+                this.constrainPosition = false;
+            }else{
+                this.constrainPosition = true;
+            }
+        }
+        Ext.QuickTip.superclass.showAt.call(this, xy);
+    },
+
+    
+    hide: function(){
+        delete this.activeTarget;
+        Ext.QuickTip.superclass.hide.call(this);
+    }
+});
+Ext.reg('quicktip', Ext.QuickTip);
+Ext.QuickTips = function(){
+    var tip,
+        disabled = false;
+        
+    return {
+        
+        init : function(autoRender){
+            if(!tip){
+                if(!Ext.isReady){
+                    Ext.onReady(function(){
+                        Ext.QuickTips.init(autoRender);
+                    });
+                    return;
+                }
+                tip = new Ext.QuickTip({
+                    elements:'header,body', 
+                    disabled: disabled
+                });
+                if(autoRender !== false){
+                    tip.render(Ext.getBody());
+                }
+            }
+        },
+        
+        
+        ddDisable : function(){
+            
+            if(tip && !disabled){
+                tip.disable();
+            }    
+        },
+        
+        
+        ddEnable : function(){
+            
+            if(tip && !disabled){
+                tip.enable();
+            }
+        },
+
+        
+        enable : function(){
+            if(tip){
+                tip.enable();
+            }
+            disabled = false;
+        },
+
+        
+        disable : function(){
+            if(tip){
+                tip.disable();
+            }
+            disabled = true;
+        },
+
+        
+        isEnabled : function(){
+            return tip !== undefined && !tip.disabled;
+        },
+
+        
+        getQuickTip : function(){
+            return tip;
+        },
+
+        
+        register : function(){
+            tip.register.apply(tip, arguments);
+        },
+
+        
+        unregister : function(){
+            tip.unregister.apply(tip, arguments);
+        },
+
+        
+        tips : function(){
+            tip.register.apply(tip, arguments);
+        }
+    };
+}();
+Ext.slider.Tip = Ext.extend(Ext.Tip, {
+    minWidth: 10,
+    offsets : [0, -10],
+    
+    init: function(slider) {
+        slider.on({
+            scope    : this,
+            dragstart: this.onSlide,
+            drag     : this.onSlide,
+            dragend  : this.hide,
+            destroy  : this.destroy
+        });
+    },
+    
+    
+    onSlide : function(slider, e, thumb) {
+        this.show();
+        this.body.update(this.getText(thumb));
+        this.doAutoWidth();
+        this.el.alignTo(thumb.el, 'b-t?', this.offsets);
+    },
+
+    
+    getText : function(thumb) {
+        return String(thumb.value);
+    }
+});
+
+
+Ext.ux.SliderTip = Ext.slider.Tip;
+Ext.tree.TreePanel = Ext.extend(Ext.Panel, {
+    rootVisible : true,
+    animate : Ext.enableFx,
+    lines : true,
+    enableDD : false,
+    hlDrop : Ext.enableFx,
+    pathSeparator : '/',
+
+    
+    bubbleEvents : [],
+
+    initComponent : function(){
+        Ext.tree.TreePanel.superclass.initComponent.call(this);
+
+        if(!this.eventModel){
+            this.eventModel = new Ext.tree.TreeEventModel(this);
+        }
+
+        
+        var l = this.loader;
+        if(!l){
+            l = new Ext.tree.TreeLoader({
+                dataUrl: this.dataUrl,
+                requestMethod: this.requestMethod
+            });
+        }else if(Ext.isObject(l) && !l.load){
+            l = new Ext.tree.TreeLoader(l);
+        }
+        this.loader = l;
+
+        this.nodeHash = {};
+
+        
+        if(this.root){
+            var r = this.root;
+            delete this.root;
+            this.setRootNode(r);
+        }
+
+
+        this.addEvents(
+
+            
+           'append',
+           
+           'remove',
+           
+           'movenode',
+           
+           'insert',
+           
+           'beforeappend',
+           
+           'beforeremove',
+           
+           'beforemovenode',
+           
+            'beforeinsert',
+
+            
+            'beforeload',
+            
+            'load',
+            
+            'textchange',
+            
+            'beforeexpandnode',
+            
+            'beforecollapsenode',
+            
+            'expandnode',
+            
+            'disabledchange',
+            
+            'collapsenode',
+            
+            'beforeclick',
+            
+            'click',
+            
+            'containerclick',
+            
+            'checkchange',
+            
+            'beforedblclick',
+            
+            'dblclick',
+            
+            'containerdblclick',
+            
+            'contextmenu',
+            
+            'containercontextmenu',
+            
+            'beforechildrenrendered',
+           
+            'startdrag',
+            
+            'enddrag',
+            
+            'dragdrop',
+            
+            'beforenodedrop',
+            
+            'nodedrop',
+             
+            'nodedragover'
+        );
+        if(this.singleExpand){
+            this.on('beforeexpandnode', this.restrictExpand, this);
+        }
+    },
+
+    
+    proxyNodeEvent : function(ename, a1, a2, a3, a4, a5, a6){
+        if(ename == 'collapse' || ename == 'expand' || ename == 'beforecollapse' || ename == 'beforeexpand' || ename == 'move' || ename == 'beforemove'){
+            ename = ename+'node';
+        }
+        
+        return this.fireEvent(ename, a1, a2, a3, a4, a5, a6);
+    },
+
+
+    
+    getRootNode : function(){
+        return this.root;
+    },
+
+    
+    setRootNode : function(node){
+        this.destroyRoot();
+        if(!node.render){ 
+            node = this.loader.createNode(node);
+        }
+        this.root = node;
+        node.ownerTree = this;
+        node.isRoot = true;
+        this.registerNode(node);
+        if(!this.rootVisible){
+            var uiP = node.attributes.uiProvider;
+            node.ui = uiP ? new uiP(node) : new Ext.tree.RootTreeNodeUI(node);
+        }
+        if(this.innerCt){
+            this.clearInnerCt();
+            this.renderRoot();
+        }
+        return node;
+    },
+    
+    clearInnerCt : function(){
+        this.innerCt.update('');    
+    },
+    
+    
+    renderRoot : function(){
+        this.root.render();
+        if(!this.rootVisible){
+            this.root.renderChildren();
+        }
+    },
+
+    
+    getNodeById : function(id){
+        return this.nodeHash[id];
+    },
+
+    
+    registerNode : function(node){
+        this.nodeHash[node.id] = node;
+    },
+
+    
+    unregisterNode : function(node){
+        delete this.nodeHash[node.id];
+    },
+
+    
+    toString : function(){
+        return '[Tree'+(this.id?' '+this.id:'')+']';
+    },
+
+    
+    restrictExpand : function(node){
+        var p = node.parentNode;
+        if(p){
+            if(p.expandedChild && p.expandedChild.parentNode == p){
+                p.expandedChild.collapse();
+            }
+            p.expandedChild = node;
+        }
+    },
+
+    
+    getChecked : function(a, startNode){
+        startNode = startNode || this.root;
+        var r = [];
+        var f = function(){
+            if(this.attributes.checked){
+                r.push(!a ? this : (a == 'id' ? this.id : this.attributes[a]));
+            }
+        };
+        startNode.cascade(f);
+        return r;
+    },
+
+    
+    getLoader : function(){
+        return this.loader;
+    },
+
+    
+    expandAll : function(){
+        this.root.expand(true);
+    },
+
+    
+    collapseAll : function(){
+        this.root.collapse(true);
+    },
+
+    
+    getSelectionModel : function(){
+        if(!this.selModel){
+            this.selModel = new Ext.tree.DefaultSelectionModel();
+        }
+        return this.selModel;
+    },
+
+    
+    expandPath : function(path, attr, callback){
+        if(Ext.isEmpty(path)){
+            if(callback){
+                callback(false, undefined);
+            }
+            return;
+        }
+        attr = attr || 'id';
+        var keys = path.split(this.pathSeparator);
+        var curNode = this.root;
+        if(curNode.attributes[attr] != keys[1]){ 
+            if(callback){
+                callback(false, null);
+            }
+            return;
+        }
+        var index = 1;
+        var f = function(){
+            if(++index == keys.length){
+                if(callback){
+                    callback(true, curNode);
+                }
+                return;
+            }
+            var c = curNode.findChild(attr, keys[index]);
+            if(!c){
+                if(callback){
+                    callback(false, curNode);
+                }
+                return;
+            }
+            curNode = c;
+            c.expand(false, false, f);
+        };
+        curNode.expand(false, false, f);
+    },
+
+    
+    selectPath : function(path, attr, callback){
+        if(Ext.isEmpty(path)){
+            if(callback){
+                callback(false, undefined);
+            }
+            return;
+        }
+        attr = attr || 'id';
+        var keys = path.split(this.pathSeparator),
+            v = keys.pop();
+        if(keys.length > 1){
+            var f = function(success, node){
+                if(success && node){
+                    var n = node.findChild(attr, v);
+                    if(n){
+                        n.select();
+                        if(callback){
+                            callback(true, n);
+                        }
+                    }else if(callback){
+                        callback(false, n);
+                    }
+                }else{
+                    if(callback){
+                        callback(false, n);
+                    }
+                }
+            };
+            this.expandPath(keys.join(this.pathSeparator), attr, f);
+        }else{
+            this.root.select();
+            if(callback){
+                callback(true, this.root);
+            }
+        }
+    },
+
+    
+    getTreeEl : function(){
+        return this.body;
+    },
+
+    
+    onRender : function(ct, position){
+        Ext.tree.TreePanel.superclass.onRender.call(this, ct, position);
+        this.el.addClass('x-tree');
+        this.innerCt = this.body.createChild({tag:'ul',
+               cls:'x-tree-root-ct ' +
+               (this.useArrows ? 'x-tree-arrows' : this.lines ? 'x-tree-lines' : 'x-tree-no-lines')});
+    },
+
+    
+    initEvents : function(){
+        Ext.tree.TreePanel.superclass.initEvents.call(this);
+
+        if(this.containerScroll){
+            Ext.dd.ScrollManager.register(this.body);
+        }
+        if((this.enableDD || this.enableDrop) && !this.dropZone){
+           
+             this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig || {
+               ddGroup: this.ddGroup || 'TreeDD', appendOnly: this.ddAppendOnly === true
+           });
+        }
+        if((this.enableDD || this.enableDrag) && !this.dragZone){
+           
+            this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig || {
+               ddGroup: this.ddGroup || 'TreeDD',
+               scroll: this.ddScroll
+           });
+        }
+        this.getSelectionModel().init(this);
+    },
+
+    
+    afterRender : function(){
+        Ext.tree.TreePanel.superclass.afterRender.call(this);
+        this.renderRoot();
+    },
+
+    beforeDestroy : function(){
+        if(this.rendered){
+            Ext.dd.ScrollManager.unregister(this.body);
+            Ext.destroy(this.dropZone, this.dragZone);
+        }
+        this.destroyRoot();
+        Ext.destroy(this.loader);
+        this.nodeHash = this.root = this.loader = null;
+        Ext.tree.TreePanel.superclass.beforeDestroy.call(this);
+    },
+    
+    
+    destroyRoot : function(){
+        if(this.root && this.root.destroy){
+            this.root.destroy(true);
+        }
+    }
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+
+
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+});
+
+Ext.tree.TreePanel.nodeTypes = {};
+
+Ext.reg('treepanel', Ext.tree.TreePanel);Ext.tree.TreeEventModel = function(tree){
+    this.tree = tree;
+    this.tree.on('render', this.initEvents, this);
+};
+
+Ext.tree.TreeEventModel.prototype = {
+    initEvents : function(){
+        var t = this.tree;
+
+        if(t.trackMouseOver !== false){
+            t.mon(t.innerCt, {
+                scope: this,
+                mouseover: this.delegateOver,
+                mouseout: this.delegateOut
+            });
+        }
+        t.mon(t.getTreeEl(), {
+            scope: this,
+            click: this.delegateClick,
+            dblclick: this.delegateDblClick,
+            contextmenu: this.delegateContextMenu
+        });
+    },
+
+    getNode : function(e){
+        var t;
+        if(t = e.getTarget('.x-tree-node-el', 10)){
+            var id = Ext.fly(t, '_treeEvents').getAttribute('tree-node-id', 'ext');
+            if(id){
+                return this.tree.getNodeById(id);
+            }
+        }
+        return null;
+    },
+
+    getNodeTarget : function(e){
+        var t = e.getTarget('.x-tree-node-icon', 1);
+        if(!t){
+            t = e.getTarget('.x-tree-node-el', 6);
+        }
+        return t;
+    },
+
+    delegateOut : function(e, t){
+        if(!this.beforeEvent(e)){
+            return;
+        }
+        if(e.getTarget('.x-tree-ec-icon', 1)){
+            var n = this.getNode(e);
+            this.onIconOut(e, n);
+            if(n == this.lastEcOver){
+                delete this.lastEcOver;
+            }
+        }
+        if((t = this.getNodeTarget(e)) && !e.within(t, true)){
+            this.onNodeOut(e, this.getNode(e));
+        }
+    },
+
+    delegateOver : function(e, t){
+        if(!this.beforeEvent(e)){
+            return;
+        }
+        if(Ext.isGecko && !this.trackingDoc){ 
+            Ext.getBody().on('mouseover', this.trackExit, this);
+            this.trackingDoc = true;
+        }
+        if(this.lastEcOver){ 
+            this.onIconOut(e, this.lastEcOver);
+            delete this.lastEcOver;
+        }
+        if(e.getTarget('.x-tree-ec-icon', 1)){
+            this.lastEcOver = this.getNode(e);
+            this.onIconOver(e, this.lastEcOver);
+        }
+        if(t = this.getNodeTarget(e)){
+            this.onNodeOver(e, this.getNode(e));
+        }
+    },
+
+    trackExit : function(e){
+        if(this.lastOverNode){
+            if(this.lastOverNode.ui && !e.within(this.lastOverNode.ui.getEl())){
+                this.onNodeOut(e, this.lastOverNode);
+            }
+            delete this.lastOverNode;
+            Ext.getBody().un('mouseover', this.trackExit, this);
+            this.trackingDoc = false;
+        }
+
+    },
+
+    delegateClick : function(e, t){
+        if(this.beforeEvent(e)){
+            if(e.getTarget('input[type=checkbox]', 1)){
+                this.onCheckboxClick(e, this.getNode(e));
+            }else if(e.getTarget('.x-tree-ec-icon', 1)){
+                this.onIconClick(e, this.getNode(e));
+            }else if(this.getNodeTarget(e)){
+                this.onNodeClick(e, this.getNode(e));
+            }
+        }else{
+            this.checkContainerEvent(e, 'click');
+        }
+    },
+
+    delegateDblClick : function(e, t){
+        if(this.beforeEvent(e)){
+            if(this.getNodeTarget(e)){
+                this.onNodeDblClick(e, this.getNode(e));
+            }
+        }else{
+            this.checkContainerEvent(e, 'dblclick');
+        }
+    },
+
+    delegateContextMenu : function(e, t){
+        if(this.beforeEvent(e)){
+            if(this.getNodeTarget(e)){
+                this.onNodeContextMenu(e, this.getNode(e));
+            }
+        }else{
+            this.checkContainerEvent(e, 'contextmenu');
+        }
+    },
+    
+    checkContainerEvent: function(e, type){
+        if(this.disabled){
+            e.stopEvent();
+            return false;
+        }
+        this.onContainerEvent(e, type);    
+    },
+
+    onContainerEvent: function(e, type){
+        this.tree.fireEvent('container' + type, this.tree, e);
+    },
+
+    onNodeClick : function(e, node){
+        node.ui.onClick(e);
+    },
+
+    onNodeOver : function(e, node){
+        this.lastOverNode = node;
+        node.ui.onOver(e);
+    },
+
+    onNodeOut : function(e, node){
+        node.ui.onOut(e);
+    },
+
+    onIconOver : function(e, node){
+        node.ui.addClass('x-tree-ec-over');
+    },
+
+    onIconOut : function(e, node){
+        node.ui.removeClass('x-tree-ec-over');
+    },
+
+    onIconClick : function(e, node){
+        node.ui.ecClick(e);
+    },
+
+    onCheckboxClick : function(e, node){
+        node.ui.onCheckChange(e);
+    },
+
+    onNodeDblClick : function(e, node){
+        node.ui.onDblClick(e);
+    },
+
+    onNodeContextMenu : function(e, node){
+        node.ui.onContextMenu(e);
+    },
+
+    beforeEvent : function(e){
+        var node = this.getNode(e);
+        if(this.disabled || !node || !node.ui){
+            e.stopEvent();
+            return false;
+        }
+        return true;
+    },
+
+    disable: function(){
+        this.disabled = true;
+    },
+
+    enable: function(){
+        this.disabled = false;
+    }
+};
+Ext.tree.DefaultSelectionModel = Ext.extend(Ext.util.Observable, {
+    
+    constructor : function(config){
+        this.selNode = null;
+   
+        this.addEvents(
+            
+            'selectionchange',
+
+            
+            'beforeselect'
+        );
+
+        Ext.apply(this, config);
+        Ext.tree.DefaultSelectionModel.superclass.constructor.call(this);    
+    },
+    
+    init : function(tree){
+        this.tree = tree;
+        tree.mon(tree.getTreeEl(), 'keydown', this.onKeyDown, this);
+        tree.on('click', this.onNodeClick, this);
+    },
+    
+    onNodeClick : function(node, e){
+        this.select(node);
+    },
+    
+    
+    select : function(node,  selectNextNode){
+        
+        if (!Ext.fly(node.ui.wrap).isVisible() && selectNextNode) {
+            return selectNextNode.call(this, node);
+        }
+        var last = this.selNode;
+        if(node == last){
+            node.ui.onSelectedChange(true);
+        }else if(this.fireEvent('beforeselect', this, node, last) !== false){
+            if(last && last.ui){
+                last.ui.onSelectedChange(false);
+            }
+            this.selNode = node;
+            node.ui.onSelectedChange(true);
+            this.fireEvent('selectionchange', this, node, last);
+        }
+        return node;
+    },
+    
+    
+    unselect : function(node, silent){
+        if(this.selNode == node){
+            this.clearSelections(silent);
+        }    
+    },
+    
+    
+    clearSelections : function(silent){
+        var n = this.selNode;
+        if(n){
+            n.ui.onSelectedChange(false);
+            this.selNode = null;
+            if(silent !== true){
+                this.fireEvent('selectionchange', this, null);
+            }
+        }
+        return n;
+    },
+    
+    
+    getSelectedNode : function(){
+        return this.selNode;    
+    },
+    
+    
+    isSelected : function(node){
+        return this.selNode == node;  
+    },
+
+    
+    selectPrevious : function( s){
+        if(!(s = s || this.selNode || this.lastSelNode)){
+            return null;
+        }
+        
+        var ps = s.previousSibling;
+        if(ps){
+            if(!ps.isExpanded() || ps.childNodes.length < 1){
+                return this.select(ps, this.selectPrevious);
+            } else{
+                var lc = ps.lastChild;
+                while(lc && lc.isExpanded() && Ext.fly(lc.ui.wrap).isVisible() && lc.childNodes.length > 0){
+                    lc = lc.lastChild;
+                }
+                return this.select(lc, this.selectPrevious);
+            }
+        } else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){
+            return this.select(s.parentNode, this.selectPrevious);
+        }
+        return null;
+    },
+
+    
+    selectNext : function( s){
+        if(!(s = s || this.selNode || this.lastSelNode)){
+            return null;
+        }
+        
+        if(s.firstChild && s.isExpanded() && Ext.fly(s.ui.wrap).isVisible()){
+             return this.select(s.firstChild, this.selectNext);
+         }else if(s.nextSibling){
+             return this.select(s.nextSibling, this.selectNext);
+         }else if(s.parentNode){
+            var newS = null;
+            s.parentNode.bubble(function(){
+                if(this.nextSibling){
+                    newS = this.getOwnerTree().selModel.select(this.nextSibling, this.selectNext);
+                    return false;
+                }
+            });
+            return newS;
+         }
+        return null;
+    },
+
+    onKeyDown : function(e){
+        var s = this.selNode || this.lastSelNode;
+        
+        var sm = this;
+        if(!s){
+            return;
+        }
+        var k = e.getKey();
+        switch(k){
+             case e.DOWN:
+                 e.stopEvent();
+                 this.selectNext();
+             break;
+             case e.UP:
+                 e.stopEvent();
+                 this.selectPrevious();
+             break;
+             case e.RIGHT:
+                 e.preventDefault();
+                 if(s.hasChildNodes()){
+                     if(!s.isExpanded()){
+                         s.expand();
+                     }else if(s.firstChild){
+                         this.select(s.firstChild, e);
+                     }
+                 }
+             break;
+             case e.LEFT:
+                 e.preventDefault();
+                 if(s.hasChildNodes() && s.isExpanded()){
+                     s.collapse();
+                 }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){
+                     this.select(s.parentNode, e);
+                 }
+             break;
+        };
+    }
+});
+
+
+Ext.tree.MultiSelectionModel = Ext.extend(Ext.util.Observable, {
+    
+    constructor : function(config){
+        this.selNodes = [];
+        this.selMap = {};
+        this.addEvents(
+            
+            'selectionchange'
+        );
+        Ext.apply(this, config);
+        Ext.tree.MultiSelectionModel.superclass.constructor.call(this);    
+    },
+    
+    init : function(tree){
+        this.tree = tree;
+        tree.mon(tree.getTreeEl(), 'keydown', this.onKeyDown, this);
+        tree.on('click', this.onNodeClick, this);
+    },
+    
+    onNodeClick : function(node, e){
+        if(e.ctrlKey && this.isSelected(node)){
+            this.unselect(node);
+        }else{
+            this.select(node, e, e.ctrlKey);
+        }
+    },
+    
+    
+    select : function(node, e, keepExisting){
+        if(keepExisting !== true){
+            this.clearSelections(true);
+        }
+        if(this.isSelected(node)){
+            this.lastSelNode = node;
+            return node;
+        }
+        this.selNodes.push(node);
+        this.selMap[node.id] = node;
+        this.lastSelNode = node;
+        node.ui.onSelectedChange(true);
+        this.fireEvent('selectionchange', this, this.selNodes);
+        return node;
+    },
+    
+    
+    unselect : function(node){
+        if(this.selMap[node.id]){
+            node.ui.onSelectedChange(false);
+            var sn = this.selNodes;
+            var index = sn.indexOf(node);
+            if(index != -1){
+                this.selNodes.splice(index, 1);
+            }
+            delete this.selMap[node.id];
+            this.fireEvent('selectionchange', this, this.selNodes);
+        }
+    },
+    
+    
+    clearSelections : function(suppressEvent){
+        var sn = this.selNodes;
+        if(sn.length > 0){
+            for(var i = 0, len = sn.length; i < len; i++){
+                sn[i].ui.onSelectedChange(false);
+            }
+            this.selNodes = [];
+            this.selMap = {};
+            if(suppressEvent !== true){
+                this.fireEvent('selectionchange', this, this.selNodes);
+            }
+        }
+    },
+    
+    
+    isSelected : function(node){
+        return this.selMap[node.id] ? true : false;  
+    },
+    
+    
+    getSelectedNodes : function(){
+        return this.selNodes.concat([]);
+    },
+
+    onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown,
+
+    selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext,
+
+    selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious
+});
+Ext.data.Tree = Ext.extend(Ext.util.Observable, {
+    
+    constructor: function(root){
+        this.nodeHash = {};
+        
+        this.root = null;
+        if(root){
+            this.setRootNode(root);
+        }
+        this.addEvents(
+            
+            "append",
+            
+            "remove",
+            
+            "move",
+            
+            "insert",
+            
+            "beforeappend",
+            
+            "beforeremove",
+            
+            "beforemove",
+            
+            "beforeinsert"
+        );
+        Ext.data.Tree.superclass.constructor.call(this);        
+    },
+    
+    
+    pathSeparator: "/",
+
+    
+    proxyNodeEvent : function(){
+        return this.fireEvent.apply(this, arguments);
+    },
+
+    
+    getRootNode : function(){
+        return this.root;
+    },
+
+    
+    setRootNode : function(node){
+        this.root = node;
+        node.ownerTree = this;
+        node.isRoot = true;
+        this.registerNode(node);
+        return node;
+    },
+
+    
+    getNodeById : function(id){
+        return this.nodeHash[id];
+    },
+
+    
+    registerNode : function(node){
+        this.nodeHash[node.id] = node;
+    },
+
+    
+    unregisterNode : function(node){
+        delete this.nodeHash[node.id];
+    },
+
+    toString : function(){
+        return "[Tree"+(this.id?" "+this.id:"")+"]";
+    }
+});
+
+
+Ext.data.Node = Ext.extend(Ext.util.Observable, {
+    
+    constructor: function(attributes){
+        
+        this.attributes = attributes || {};
+        this.leaf = this.attributes.leaf;
+        
+        this.id = this.attributes.id;
+        if(!this.id){
+            this.id = Ext.id(null, "xnode-");
+            this.attributes.id = this.id;
+        }
+        
+        this.childNodes = [];
+        
+        this.parentNode = null;
+        
+        this.firstChild = null;
+        
+        this.lastChild = null;
+        
+        this.previousSibling = null;
+        
+        this.nextSibling = null;
+
+        this.addEvents({
+            
+            "append" : true,
+            
+            "remove" : true,
+            
+            "move" : true,
+            
+            "insert" : true,
+            
+            "beforeappend" : true,
+            
+            "beforeremove" : true,
+            
+            "beforemove" : true,
+             
+            "beforeinsert" : true
+        });
+        this.listeners = this.attributes.listeners;
+        Ext.data.Node.superclass.constructor.call(this);    
+    },
+    
+    
+    fireEvent : function(evtName){
+        
+        if(Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false){
+            return false;
+        }
+        
+        var ot = this.getOwnerTree();
+        if(ot){
+            if(ot.proxyNodeEvent.apply(ot, arguments) === false){
+                return false;
+            }
+        }
+        return true;
+    },
+
+    
+    isLeaf : function(){
+        return this.leaf === true;
+    },
+
+    
+    setFirstChild : function(node){
+        this.firstChild = node;
+    },
+
+    
+    setLastChild : function(node){
+        this.lastChild = node;
+    },
+
+
+    
+    isLast : function(){
+       return (!this.parentNode ? true : this.parentNode.lastChild == this);
+    },
+
+    
+    isFirst : function(){
+       return (!this.parentNode ? true : this.parentNode.firstChild == this);
+    },
+
+    
+    hasChildNodes : function(){
+        return !this.isLeaf() && this.childNodes.length > 0;
+    },
+
+    
+    isExpandable : function(){
+        return this.attributes.expandable || this.hasChildNodes();
+    },
+
+    
+    appendChild : function(node){
+        var multi = false;
+        if(Ext.isArray(node)){
+            multi = node;
+        }else if(arguments.length > 1){
+            multi = arguments;
+        }
+        
+        if(multi){
+            for(var i = 0, len = multi.length; i < len; i++) {
+                this.appendChild(multi[i]);
+            }
+        }else{
+            if(this.fireEvent("beforeappend", this.ownerTree, this, node) === false){
+                return false;
+            }
+            var index = this.childNodes.length;
+            var oldParent = node.parentNode;
+            
+            if(oldParent){
+                if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index) === false){
+                    return false;
+                }
+                oldParent.removeChild(node);
+            }
+            index = this.childNodes.length;
+            if(index === 0){
+                this.setFirstChild(node);
+            }
+            this.childNodes.push(node);
+            node.parentNode = this;
+            var ps = this.childNodes[index-1];
+            if(ps){
+                node.previousSibling = ps;
+                ps.nextSibling = node;
+            }else{
+                node.previousSibling = null;
+            }
+            node.nextSibling = null;
+            this.setLastChild(node);
+            node.setOwnerTree(this.getOwnerTree());
+            this.fireEvent("append", this.ownerTree, this, node, index);
+            if(oldParent){
+                node.fireEvent("move", this.ownerTree, node, oldParent, this, index);
+            }
+            return node;
+        }
+    },
+
+    
+    removeChild : function(node, destroy){
+        var index = this.childNodes.indexOf(node);
+        if(index == -1){
+            return false;
+        }
+        if(this.fireEvent("beforeremove", this.ownerTree, this, node) === false){
+            return false;
+        }
+
+        
+        this.childNodes.splice(index, 1);
+
+        
+        if(node.previousSibling){
+            node.previousSibling.nextSibling = node.nextSibling;
+        }
+        if(node.nextSibling){
+            node.nextSibling.previousSibling = node.previousSibling;
+        }
+
+        
+        if(this.firstChild == node){
+            this.setFirstChild(node.nextSibling);
+        }
+        if(this.lastChild == node){
+            this.setLastChild(node.previousSibling);
+        }
+
+        this.fireEvent("remove", this.ownerTree, this, node);
+        if(destroy){
+            node.destroy(true);
+        }else{
+            node.clear();
+        }
+        return node;
+    },
+
+    
+    clear : function(destroy){
+        
+        this.setOwnerTree(null, destroy);
+        this.parentNode = this.previousSibling = this.nextSibling = null;
+        if(destroy){
+            this.firstChild = this.lastChild = null;
+        }
+    },
+
+    
+    destroy : function( silent){
+        
+        if(silent === true){
+            this.purgeListeners();
+            this.clear(true);
+            Ext.each(this.childNodes, function(n){
+                n.destroy(true);
+            });
+            this.childNodes = null;
+        }else{
+            this.remove(true);
+        }
+    },
+
+    
+    insertBefore : function(node, refNode){
+        if(!refNode){ 
+            return this.appendChild(node);
+        }
+        
+        if(node == refNode){
+            return false;
+        }
+
+        if(this.fireEvent("beforeinsert", this.ownerTree, this, node, refNode) === false){
+            return false;
+        }
+        var index = this.childNodes.indexOf(refNode);
+        var oldParent = node.parentNode;
+        var refIndex = index;
+
+        
+        if(oldParent == this && this.childNodes.indexOf(node) < index){
+            refIndex--;
+        }
+
+        
+        if(oldParent){
+            if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index, refNode) === false){
+                return false;
+            }
+            oldParent.removeChild(node);
+        }
+        if(refIndex === 0){
+            this.setFirstChild(node);
+        }
+        this.childNodes.splice(refIndex, 0, node);
+        node.parentNode = this;
+        var ps = this.childNodes[refIndex-1];
+        if(ps){
+            node.previousSibling = ps;
+            ps.nextSibling = node;
+        }else{
+            node.previousSibling = null;
+        }
+        node.nextSibling = refNode;
+        refNode.previousSibling = node;
+        node.setOwnerTree(this.getOwnerTree());
+        this.fireEvent("insert", this.ownerTree, this, node, refNode);
+        if(oldParent){
+            node.fireEvent("move", this.ownerTree, node, oldParent, this, refIndex, refNode);
+        }
+        return node;
+    },
+
+    
+    remove : function(destroy){
+        if (this.parentNode) {
+            this.parentNode.removeChild(this, destroy);
+        }
+        return this;
+    },
+
+    
+    removeAll : function(destroy){
+        var cn = this.childNodes,
+            n;
+        while((n = cn[0])){
+            this.removeChild(n, destroy);
+        }
+        return this;
+    },
+
+    
+    item : function(index){
+        return this.childNodes[index];
+    },
+
+    
+    replaceChild : function(newChild, oldChild){
+        var s = oldChild ? oldChild.nextSibling : null;
+        this.removeChild(oldChild);
+        this.insertBefore(newChild, s);
+        return oldChild;
+    },
+
+    
+    indexOf : function(child){
+        return this.childNodes.indexOf(child);
+    },
+
+    
+    getOwnerTree : function(){
+        
+        if(!this.ownerTree){
+            var p = this;
+            while(p){
+                if(p.ownerTree){
+                    this.ownerTree = p.ownerTree;
+                    break;
+                }
+                p = p.parentNode;
+            }
+        }
+        return this.ownerTree;
+    },
+
+    
+    getDepth : function(){
+        var depth = 0;
+        var p = this;
+        while(p.parentNode){
+            ++depth;
+            p = p.parentNode;
+        }
+        return depth;
+    },
+
+    
+    setOwnerTree : function(tree, destroy){
+        
+        if(tree != this.ownerTree){
+            if(this.ownerTree){
+                this.ownerTree.unregisterNode(this);
+            }
+            this.ownerTree = tree;
+            
+            if(destroy !== true){
+                Ext.each(this.childNodes, function(n){
+                    n.setOwnerTree(tree);
+                });
+            }
+            if(tree){
+                tree.registerNode(this);
+            }
+        }
+    },
+
+    
+    setId: function(id){
+        if(id !== this.id){
+            var t = this.ownerTree;
+            if(t){
+                t.unregisterNode(this);
+            }
+            this.id = this.attributes.id = id;
+            if(t){
+                t.registerNode(this);
+            }
+            this.onIdChange(id);
+        }
+    },
+
+    
+    onIdChange: Ext.emptyFn,
+
+    
+    getPath : function(attr){
+        attr = attr || "id";
+        var p = this.parentNode;
+        var b = [this.attributes[attr]];
+        while(p){
+            b.unshift(p.attributes[attr]);
+            p = p.parentNode;
+        }
+        var sep = this.getOwnerTree().pathSeparator;
+        return sep + b.join(sep);
+    },
+
+    
+    bubble : function(fn, scope, args){
+        var p = this;
+        while(p){
+            if(fn.apply(scope || p, args || [p]) === false){
+                break;
+            }
+            p = p.parentNode;
+        }
+    },
+
+    
+    cascade : function(fn, scope, args){
+        if(fn.apply(scope || this, args || [this]) !== false){
+            var cs = this.childNodes;
+            for(var i = 0, len = cs.length; i < len; i++) {
+                cs[i].cascade(fn, scope, args);
+            }
+        }
+    },
+
+    
+    eachChild : function(fn, scope, args){
+        var cs = this.childNodes;
+        for(var i = 0, len = cs.length; i < len; i++) {
+            if(fn.apply(scope || cs[i], args || [cs[i]]) === false){
+                break;
+            }
+        }
+    },
+
+    
+    findChild : function(attribute, value, deep){
+        return this.findChildBy(function(){
+            return this.attributes[attribute] == value;
+        }, null, deep);
+    },
+
+    
+    findChildBy : function(fn, scope, deep){
+        var cs = this.childNodes,
+            len = cs.length,
+            i = 0,
+            n,
+            res;
+        for(; i < len; i++){
+            n = cs[i];
+            if(fn.call(scope || n, n) === true){
+                return n;
+            }else if (deep){
+                res = n.findChildBy(fn, scope, deep);
+                if(res != null){
+                    return res;
+                }
+            }
+            
+        }
+        return null;
+    },
+
+    
+    sort : function(fn, scope){
+        var cs = this.childNodes;
+        var len = cs.length;
+        if(len > 0){
+            var sortFn = scope ? function(){fn.apply(scope, arguments);} : fn;
+            cs.sort(sortFn);
+            for(var i = 0; i < len; i++){
+                var n = cs[i];
+                n.previousSibling = cs[i-1];
+                n.nextSibling = cs[i+1];
+                if(i === 0){
+                    this.setFirstChild(n);
+                }
+                if(i == len-1){
+                    this.setLastChild(n);
+                }
+            }
+        }
+    },
+
+    
+    contains : function(node){
+        return node.isAncestor(this);
+    },
+
+    
+    isAncestor : function(node){
+        var p = this.parentNode;
+        while(p){
+            if(p == node){
+                return true;
+            }
+            p = p.parentNode;
+        }
+        return false;
+    },
+
+    toString : function(){
+        return "[Node"+(this.id?" "+this.id:"")+"]";
+    }
+});
+Ext.tree.TreeNode = Ext.extend(Ext.data.Node, {
+    
+    constructor : function(attributes){
+        attributes = attributes || {};
+        if(Ext.isString(attributes)){
+            attributes = {text: attributes};
+        }
+        this.childrenRendered = false;
+        this.rendered = false;
+        Ext.tree.TreeNode.superclass.constructor.call(this, attributes);
+        this.expanded = attributes.expanded === true;
+        this.isTarget = attributes.isTarget !== false;
+        this.draggable = attributes.draggable !== false && attributes.allowDrag !== false;
+        this.allowChildren = attributes.allowChildren !== false && attributes.allowDrop !== false;
+
+        
+        this.text = attributes.text;
+        
+        this.disabled = attributes.disabled === true;
+        
+        this.hidden = attributes.hidden === true;
+    
+        this.addEvents(
+            
+            'textchange',
+            
+            'beforeexpand',
+            
+            'beforecollapse',
+            
+            'expand',
+            
+            'disabledchange',
+            
+            'collapse',
+            
+            'beforeclick',
+            
+            'click',
+            
+            'checkchange',
+            
+            'beforedblclick',
+            
+            'dblclick',
+            
+            'contextmenu',
+            
+            'beforechildrenrendered'
+        );
+    
+        var uiClass = this.attributes.uiProvider || this.defaultUI || Ext.tree.TreeNodeUI;
+    
+        
+        this.ui = new uiClass(this);    
+    },
+    
+    preventHScroll : true,
+    
+    isExpanded : function(){
+        return this.expanded;
+    },
+
+
+    getUI : function(){
+        return this.ui;
+    },
+
+    getLoader : function(){
+        var owner;
+        return this.loader || ((owner = this.getOwnerTree()) && owner.loader ? owner.loader : (this.loader = new Ext.tree.TreeLoader()));
+    },
+
+    
+    setFirstChild : function(node){
+        var of = this.firstChild;
+        Ext.tree.TreeNode.superclass.setFirstChild.call(this, node);
+        if(this.childrenRendered && of && node != of){
+            of.renderIndent(true, true);
+        }
+        if(this.rendered){
+            this.renderIndent(true, true);
+        }
+    },
+
+    
+    setLastChild : function(node){
+        var ol = this.lastChild;
+        Ext.tree.TreeNode.superclass.setLastChild.call(this, node);
+        if(this.childrenRendered && ol && node != ol){
+            ol.renderIndent(true, true);
+        }
+        if(this.rendered){
+            this.renderIndent(true, true);
+        }
+    },
+
+    
+    
+    appendChild : function(n){
+        if(!n.render && !Ext.isArray(n)){
+            n = this.getLoader().createNode(n);
+        }
+        var node = Ext.tree.TreeNode.superclass.appendChild.call(this, n);
+        if(node && this.childrenRendered){
+            node.render();
+        }
+        this.ui.updateExpandIcon();
+        return node;
+    },
+
+    
+    removeChild : function(node, destroy){
+        this.ownerTree.getSelectionModel().unselect(node);
+        Ext.tree.TreeNode.superclass.removeChild.apply(this, arguments);
+        
+        if(!destroy){
+            var rendered = node.ui.rendered;
+            
+            if(rendered){
+                node.ui.remove();
+            }
+            if(rendered && this.childNodes.length < 1){
+                this.collapse(false, false);
+            }else{
+                this.ui.updateExpandIcon();
+            }
+            if(!this.firstChild && !this.isHiddenRoot()){
+                this.childrenRendered = false;
+            }
+        }
+        return node;
+    },
+
+    
+    insertBefore : function(node, refNode){
+        if(!node.render){
+            node = this.getLoader().createNode(node);
+        }
+        var newNode = Ext.tree.TreeNode.superclass.insertBefore.call(this, node, refNode);
+        if(newNode && refNode && this.childrenRendered){
+            node.render();
+        }
+        this.ui.updateExpandIcon();
+        return newNode;
+    },
+
+    
+    setText : function(text){
+        var oldText = this.text;
+        this.text = this.attributes.text = text;
+        if(this.rendered){ 
+            this.ui.onTextChange(this, text, oldText);
+        }
+        this.fireEvent('textchange', this, text, oldText);
+    },
+    
+    
+    setIconCls : function(cls){
+        var old = this.attributes.iconCls;
+        this.attributes.iconCls = cls;
+        if(this.rendered){
+            this.ui.onIconClsChange(this, cls, old);
+        }
+    },
+    
+    
+    setTooltip : function(tip, title){
+        this.attributes.qtip = tip;
+        this.attributes.qtipTitle = title;
+        if(this.rendered){
+            this.ui.onTipChange(this, tip, title);
+        }
+    },
+    
+    
+    setIcon : function(icon){
+        this.attributes.icon = icon;
+        if(this.rendered){
+            this.ui.onIconChange(this, icon);
+        }
+    },
+    
+    
+    setHref : function(href, target){
+        this.attributes.href = href;
+        this.attributes.hrefTarget = target;
+        if(this.rendered){
+            this.ui.onHrefChange(this, href, target);
+        }
+    },
+    
+    
+    setCls : function(cls){
+        var old = this.attributes.cls;
+        this.attributes.cls = cls;
+        if(this.rendered){
+            this.ui.onClsChange(this, cls, old);
+        }
+    },
+
+    
+    select : function(){
+        var t = this.getOwnerTree();
+        if(t){
+            t.getSelectionModel().select(this);
+        }
+    },
+
+    
+    unselect : function(silent){
+        var t = this.getOwnerTree();
+        if(t){
+            t.getSelectionModel().unselect(this, silent);
+        }
+    },
+
+    
+    isSelected : function(){
+        var t = this.getOwnerTree();
+        return t ? t.getSelectionModel().isSelected(this) : false;
+    },
+
+    
+    expand : function(deep, anim, callback, scope){
+        if(!this.expanded){
+            if(this.fireEvent('beforeexpand', this, deep, anim) === false){
+                return;
+            }
+            if(!this.childrenRendered){
+                this.renderChildren();
+            }
+            this.expanded = true;
+            if(!this.isHiddenRoot() && (this.getOwnerTree().animate && anim !== false) || anim){
+                this.ui.animExpand(function(){
+                    this.fireEvent('expand', this);
+                    this.runCallback(callback, scope || this, [this]);
+                    if(deep === true){
+                        this.expandChildNodes(true, true);
+                    }
+                }.createDelegate(this));
+                return;
+            }else{
+                this.ui.expand();
+                this.fireEvent('expand', this);
+                this.runCallback(callback, scope || this, [this]);
+            }
+        }else{
+           this.runCallback(callback, scope || this, [this]);
+        }
+        if(deep === true){
+            this.expandChildNodes(true);
+        }
+    },
+
+    runCallback : function(cb, scope, args){
+        if(Ext.isFunction(cb)){
+            cb.apply(scope, args);
+        }
+    },
+
+    isHiddenRoot : function(){
+        return this.isRoot && !this.getOwnerTree().rootVisible;
+    },
+
+    
+    collapse : function(deep, anim, callback, scope){
+        if(this.expanded && !this.isHiddenRoot()){
+            if(this.fireEvent('beforecollapse', this, deep, anim) === false){
+                return;
+            }
+            this.expanded = false;
+            if((this.getOwnerTree().animate && anim !== false) || anim){
+                this.ui.animCollapse(function(){
+                    this.fireEvent('collapse', this);
+                    this.runCallback(callback, scope || this, [this]);
+                    if(deep === true){
+                        this.collapseChildNodes(true);
+                    }
+                }.createDelegate(this));
+                return;
+            }else{
+                this.ui.collapse();
+                this.fireEvent('collapse', this);
+                this.runCallback(callback, scope || this, [this]);
+            }
+        }else if(!this.expanded){
+            this.runCallback(callback, scope || this, [this]);
+        }
+        if(deep === true){
+            var cs = this.childNodes;
+            for(var i = 0, len = cs.length; i < len; i++) {
+               cs[i].collapse(true, false);
+            }
+        }
+    },
+
+    
+    delayedExpand : function(delay){
+        if(!this.expandProcId){
+            this.expandProcId = this.expand.defer(delay, this);
+        }
+    },
+
+    
+    cancelExpand : function(){
+        if(this.expandProcId){
+            clearTimeout(this.expandProcId);
+        }
+        this.expandProcId = false;
+    },
+
+    
+    toggle : function(){
+        if(this.expanded){
+            this.collapse();
+        }else{
+            this.expand();
+        }
+    },
+
+    
+    ensureVisible : function(callback, scope){
+        var tree = this.getOwnerTree();
+        tree.expandPath(this.parentNode ? this.parentNode.getPath() : this.getPath(), false, function(){
+            var node = tree.getNodeById(this.id);  
+            tree.getTreeEl().scrollChildIntoView(node.ui.anchor);
+            this.runCallback(callback, scope || this, [this]);
+        }.createDelegate(this));
+    },
+
+    
+    expandChildNodes : function(deep, anim) {
+        var cs = this.childNodes,
+            i,
+            len = cs.length;
+        for (i = 0; i < len; i++) {
+               cs[i].expand(deep, anim);
+        }
+    },
+
+    
+    collapseChildNodes : function(deep){
+        var cs = this.childNodes;
+        for(var i = 0, len = cs.length; i < len; i++) {
+               cs[i].collapse(deep);
+        }
+    },
+
+    
+    disable : function(){
+        this.disabled = true;
+        this.unselect();
+        if(this.rendered && this.ui.onDisableChange){ 
+            this.ui.onDisableChange(this, true);
+        }
+        this.fireEvent('disabledchange', this, true);
+    },
+
+    
+    enable : function(){
+        this.disabled = false;
+        if(this.rendered && this.ui.onDisableChange){ 
+            this.ui.onDisableChange(this, false);
+        }
+        this.fireEvent('disabledchange', this, false);
+    },
+
+    
+    renderChildren : function(suppressEvent){
+        if(suppressEvent !== false){
+            this.fireEvent('beforechildrenrendered', this);
+        }
+        var cs = this.childNodes;
+        for(var i = 0, len = cs.length; i < len; i++){
+            cs[i].render(true);
+        }
+        this.childrenRendered = true;
+    },
+
+    
+    sort : function(fn, scope){
+        Ext.tree.TreeNode.superclass.sort.apply(this, arguments);
+        if(this.childrenRendered){
+            var cs = this.childNodes;
+            for(var i = 0, len = cs.length; i < len; i++){
+                cs[i].render(true);
+            }
+        }
+    },
+
+    
+    render : function(bulkRender){
+        this.ui.render(bulkRender);
+        if(!this.rendered){
+            
+            this.getOwnerTree().registerNode(this);
+            this.rendered = true;
+            if(this.expanded){
+                this.expanded = false;
+                this.expand(false, false);
+            }
+        }
+    },
+
+    
+    renderIndent : function(deep, refresh){
+        if(refresh){
+            this.ui.childIndent = null;
+        }
+        this.ui.renderIndent();
+        if(deep === true && this.childrenRendered){
+            var cs = this.childNodes;
+            for(var i = 0, len = cs.length; i < len; i++){
+                cs[i].renderIndent(true, refresh);
+            }
+        }
+    },
+
+    beginUpdate : function(){
+        this.childrenRendered = false;
+    },
+
+    endUpdate : function(){
+        if(this.expanded && this.rendered){
+            this.renderChildren();
+        }
+    },
+
+    
+    destroy : function(silent){
+        if(silent === true){
+            this.unselect(true);
+        }
+        Ext.tree.TreeNode.superclass.destroy.call(this, silent);
+        Ext.destroy(this.ui, this.loader);
+        this.ui = this.loader = null;
+    },
+
+    
+    onIdChange : function(id){
+        this.ui.onIdChange(id);
+    }
+});
+
+Ext.tree.TreePanel.nodeTypes.node = Ext.tree.TreeNode;
+ Ext.tree.AsyncTreeNode = function(config){
+    this.loaded = config && config.loaded === true;
+    this.loading = false;
+    Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments);
+    
+    this.addEvents('beforeload', 'load');
+    
+    
+};
+Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, {
+    expand : function(deep, anim, callback, scope){
+        if(this.loading){ 
+            var timer;
+            var f = function(){
+                if(!this.loading){ 
+                    clearInterval(timer);
+                    this.expand(deep, anim, callback, scope);
+                }
+            }.createDelegate(this);
+            timer = setInterval(f, 200);
+            return;
+        }
+        if(!this.loaded){
+            if(this.fireEvent("beforeload", this) === false){
+                return;
+            }
+            this.loading = true;
+            this.ui.beforeLoad(this);
+            var loader = this.loader || this.attributes.loader || this.getOwnerTree().getLoader();
+            if(loader){
+                loader.load(this, this.loadComplete.createDelegate(this, [deep, anim, callback, scope]), this);
+                return;
+            }
+        }
+        Ext.tree.AsyncTreeNode.superclass.expand.call(this, deep, anim, callback, scope);
+    },
+    
+    
+    isLoading : function(){
+        return this.loading;  
+    },
+    
+    loadComplete : function(deep, anim, callback, scope){
+        this.loading = false;
+        this.loaded = true;
+        this.ui.afterLoad(this);
+        this.fireEvent("load", this);
+        this.expand(deep, anim, callback, scope);
+    },
+    
+    
+    isLoaded : function(){
+        return this.loaded;
+    },
+    
+    hasChildNodes : function(){
+        if(!this.isLeaf() && !this.loaded){
+            return true;
+        }else{
+            return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this);
+        }
+    },
+
+    
+    reload : function(callback, scope){
+        this.collapse(false, false);
+        while(this.firstChild){
+            this.removeChild(this.firstChild).destroy();
+        }
+        this.childrenRendered = false;
+        this.loaded = false;
+        if(this.isHiddenRoot()){
+            this.expanded = false;
+        }
+        this.expand(false, false, callback, scope);
+    }
+});
+
+Ext.tree.TreePanel.nodeTypes.async = Ext.tree.AsyncTreeNode;
+Ext.tree.TreeNodeUI = Ext.extend(Object, {
+    
+    constructor : function(node){
+        Ext.apply(this, {
+            node: node,
+            rendered: false,
+            animating: false,
+            wasLeaf: true,
+            ecc: 'x-tree-ec-icon x-tree-elbow',
+            emptyIcon: Ext.BLANK_IMAGE_URL    
+        });
+    },
+    
+    
+    removeChild : function(node){
+        if(this.rendered){
+            this.ctNode.removeChild(node.ui.getEl());
+        }
+    },
+
+    
+    beforeLoad : function(){
+         this.addClass("x-tree-node-loading");
+    },
+
+    
+    afterLoad : function(){
+         this.removeClass("x-tree-node-loading");
+    },
+
+    
+    onTextChange : function(node, text, oldText){
+        if(this.rendered){
+            this.textNode.innerHTML = text;
+        }
+    },
+    
+    
+    onIconClsChange : function(node, cls, oldCls){
+        if(this.rendered){
+            Ext.fly(this.iconNode).replaceClass(oldCls, cls);
+        }
+    },
+    
+    
+    onIconChange : function(node, icon){
+        if(this.rendered){
+            
+            var empty = Ext.isEmpty(icon);
+            this.iconNode.src = empty ? this.emptyIcon : icon;
+            Ext.fly(this.iconNode)[empty ? 'removeClass' : 'addClass']('x-tree-node-inline-icon');
+        }
+    },
+    
+    
+    onTipChange : function(node, tip, title){
+        if(this.rendered){
+            var hasTitle = Ext.isDefined(title);
+            if(this.textNode.setAttributeNS){
+                this.textNode.setAttributeNS("ext", "qtip", tip);
+                if(hasTitle){
+                    this.textNode.setAttributeNS("ext", "qtitle", title);
+                }
+            }else{
+                this.textNode.setAttribute("ext:qtip", tip);
+                if(hasTitle){
+                    this.textNode.setAttribute("ext:qtitle", title);
+                }
+            }
+        }
+    },
+    
+    
+    onHrefChange : function(node, href, target){
+        if(this.rendered){
+            this.anchor.href = this.getHref(href);
+            if(Ext.isDefined(target)){
+                this.anchor.target = target;
+            }
+        }
+    },
+    
+    
+    onClsChange : function(node, cls, oldCls){
+        if(this.rendered){
+            Ext.fly(this.elNode).replaceClass(oldCls, cls);
+        }    
+    },
+
+    
+    onDisableChange : function(node, state){
+        this.disabled = state;
+        if (this.checkbox) {
+            this.checkbox.disabled = state;
+        }
+        this[state ? 'addClass' : 'removeClass']('x-tree-node-disabled');
+    },
+
+    
+    onSelectedChange : function(state){
+        if(state){
+            this.focus();
+            this.addClass("x-tree-selected");
+        }else{
+            
+            this.removeClass("x-tree-selected");
+        }
+    },
+
+    
+    onMove : function(tree, node, oldParent, newParent, index, refNode){
+        this.childIndent = null;
+        if(this.rendered){
+            var targetNode = newParent.ui.getContainer();
+            if(!targetNode){
+                this.holder = document.createElement("div");
+                this.holder.appendChild(this.wrap);
+                return;
+            }
+            var insertBefore = refNode ? refNode.ui.getEl() : null;
+            if(insertBefore){
+                targetNode.insertBefore(this.wrap, insertBefore);
+            }else{
+                targetNode.appendChild(this.wrap);
+            }
+            this.node.renderIndent(true, oldParent != newParent);
+        }
+    },
+
+
+    addClass : function(cls){
+        if(this.elNode){
+            Ext.fly(this.elNode).addClass(cls);
+        }
+    },
+
+
+    removeClass : function(cls){
+        if(this.elNode){
+            Ext.fly(this.elNode).removeClass(cls);
+        }
+    },
+
+    
+    remove : function(){
+        if(this.rendered){
+            this.holder = document.createElement("div");
+            this.holder.appendChild(this.wrap);
+        }
+    },
+
+    
+    fireEvent : function(){
+        return this.node.fireEvent.apply(this.node, arguments);
+    },
+
+    
+    initEvents : function(){
+        this.node.on("move", this.onMove, this);
+
+        if(this.node.disabled){
+            this.onDisableChange(this.node, true);
+        }
+        if(this.node.hidden){
+            this.hide();
+        }
+        var ot = this.node.getOwnerTree();
+        var dd = ot.enableDD || ot.enableDrag || ot.enableDrop;
+        if(dd && (!this.node.isRoot || ot.rootVisible)){
+            Ext.dd.Registry.register(this.elNode, {
+                node: this.node,
+                handles: this.getDDHandles(),
+                isHandle: false
+            });
+        }
+    },
+
+    
+    getDDHandles : function(){
+        return [this.iconNode, this.textNode, this.elNode];
+    },
+
+
+    hide : function(){
+        this.node.hidden = true;
+        if(this.wrap){
+            this.wrap.style.display = "none";
+        }
+    },
+
+
+    show : function(){
+        this.node.hidden = false;
+        if(this.wrap){
+            this.wrap.style.display = "";
+        }
+    },
+
+    
+    onContextMenu : function(e){
+        if (this.node.hasListener("contextmenu") || this.node.getOwnerTree().hasListener("contextmenu")) {
+            e.preventDefault();
+            this.focus();
+            this.fireEvent("contextmenu", this.node, e);
+        }
+    },
+
+    
+    onClick : function(e){
+        if(this.dropping){
+            e.stopEvent();
+            return;
+        }
+        if(this.fireEvent("beforeclick", this.node, e) !== false){
+            var a = e.getTarget('a');
+            if(!this.disabled && this.node.attributes.href && a){
+                this.fireEvent("click", this.node, e);
+                return;
+            }else if(a && e.ctrlKey){
+                e.stopEvent();
+            }
+            e.preventDefault();
+            if(this.disabled){
+                return;
+            }
+
+            if(this.node.attributes.singleClickExpand && !this.animating && this.node.isExpandable()){
+                this.node.toggle();
+            }
+
+            this.fireEvent("click", this.node, e);
+        }else{
+            e.stopEvent();
+        }
+    },
+
+    
+    onDblClick : function(e){
+        e.preventDefault();
+        if(this.disabled){
+            return;
+        }
+        if(this.fireEvent("beforedblclick", this.node, e) !== false){
+            if(this.checkbox){
+                this.toggleCheck();
+            }
+            if(!this.animating && this.node.isExpandable()){
+                this.node.toggle();
+            }
+            this.fireEvent("dblclick", this.node, e);
+        }
+    },
+
+    onOver : function(e){
+        this.addClass('x-tree-node-over');
+    },
+
+    onOut : function(e){
+        this.removeClass('x-tree-node-over');
+    },
+
+    
+    onCheckChange : function(){
+        var checked = this.checkbox.checked;
+        
+        this.checkbox.defaultChecked = checked;
+        this.node.attributes.checked = checked;
+        this.fireEvent('checkchange', this.node, checked);
+    },
+
+    
+    ecClick : function(e){
+        if(!this.animating && this.node.isExpandable()){
+            this.node.toggle();
+        }
+    },
+
+    
+    startDrop : function(){
+        this.dropping = true;
+    },
+
+    
+    endDrop : function(){
+       setTimeout(function(){
+           this.dropping = false;
+       }.createDelegate(this), 50);
+    },
+
+    
+    expand : function(){
+        this.updateExpandIcon();
+        this.ctNode.style.display = "";
+    },
+
+    
+    focus : function(){
+        if(!this.node.preventHScroll){
+            try{this.anchor.focus();
+            }catch(e){}
+        }else{
+            try{
+                var noscroll = this.node.getOwnerTree().getTreeEl().dom;
+                var l = noscroll.scrollLeft;
+                this.anchor.focus();
+                noscroll.scrollLeft = l;
+            }catch(e){}
+        }
+    },
+
+
+    toggleCheck : function(value){
+        var cb = this.checkbox;
+        if(cb){
+            cb.checked = (value === undefined ? !cb.checked : value);
+            this.onCheckChange();
+        }
+    },
+
+    
+    blur : function(){
+        try{
+            this.anchor.blur();
+        }catch(e){}
+    },
+
+    
+    animExpand : function(callback){
+        var ct = Ext.get(this.ctNode);
+        ct.stopFx();
+        if(!this.node.isExpandable()){
+            this.updateExpandIcon();
+            this.ctNode.style.display = "";
+            Ext.callback(callback);
+            return;
+        }
+        this.animating = true;
+        this.updateExpandIcon();
+
+        ct.slideIn('t', {
+           callback : function(){
+               this.animating = false;
+               Ext.callback(callback);
+            },
+            scope: this,
+            duration: this.node.ownerTree.duration || .25
+        });
+    },
+
+    
+    highlight : function(){
+        var tree = this.node.getOwnerTree();
+        Ext.fly(this.wrap).highlight(
+            tree.hlColor || "C3DAF9",
+            {endColor: tree.hlBaseColor}
+        );
+    },
+
+    
+    collapse : function(){
+        this.updateExpandIcon();
+        this.ctNode.style.display = "none";
+    },
+
+    
+    animCollapse : function(callback){
+        var ct = Ext.get(this.ctNode);
+        ct.enableDisplayMode('block');
+        ct.stopFx();
+
+        this.animating = true;
+        this.updateExpandIcon();
+
+        ct.slideOut('t', {
+            callback : function(){
+               this.animating = false;
+               Ext.callback(callback);
+            },
+            scope: this,
+            duration: this.node.ownerTree.duration || .25
+        });
+    },
+
+    
+    getContainer : function(){
+        return this.ctNode;
+    },
+
+
+    getEl : function(){
+        return this.wrap;
+    },
+
+    
+    appendDDGhost : function(ghostNode){
+        ghostNode.appendChild(this.elNode.cloneNode(true));
+    },
+
+    
+    getDDRepairXY : function(){
+        return Ext.lib.Dom.getXY(this.iconNode);
+    },
+
+    
+    onRender : function(){
+        this.render();
+    },
+
+    
+    render : function(bulkRender){
+        var n = this.node, a = n.attributes;
+        var targetNode = n.parentNode ?
+              n.parentNode.ui.getContainer() : n.ownerTree.innerCt.dom;
+
+        if(!this.rendered){
+            this.rendered = true;
+
+            this.renderElements(n, a, targetNode, bulkRender);
+
+            if(a.qtip){
+                this.onTipChange(n, a.qtip, a.qtipTitle);
+            }else if(a.qtipCfg){
+                a.qtipCfg.target = Ext.id(this.textNode);
+                Ext.QuickTips.register(a.qtipCfg);
+            }
+            this.initEvents();
+            if(!this.node.expanded){
+                this.updateExpandIcon(true);
+            }
+        }else{
+            if(bulkRender === true) {
+                targetNode.appendChild(this.wrap);
+            }
+        }
+    },
+
+    
+    renderElements : function(n, a, targetNode, bulkRender){
+        
+        this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : '';
+
+        var cb = Ext.isBoolean(a.checked),
+            nel,
+            href = this.getHref(a.href),
+            buf = ['<li class="x-tree-node"><div ext:tree-node-id="',n.id,'" class="x-tree-node-el x-tree-node-leaf x-unselectable ', a.cls,'" unselectable="on">',
+            '<span class="x-tree-node-indent">',this.indentMarkup,"</span>",
+            '<img alt="" src="', this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow" />',
+            '<img alt="" src="', a.icon || this.emptyIcon, '" class="x-tree-node-icon',(a.icon ? " x-tree-node-inline-icon" : ""),(a.iconCls ? " "+a.iconCls : ""),'" unselectable="on" />',
+            cb ? ('<input class="x-tree-node-cb" type="checkbox" ' + (a.checked ? 'checked="checked" />' : '/>')) : '',
+            '<a hidefocus="on" class="x-tree-node-anchor" href="',href,'" tabIndex="1" ',
+             a.hrefTarget ? ' target="'+a.hrefTarget+'"' : "", '><span unselectable="on">',n.text,"</span></a></div>",
+            '<ul class="x-tree-node-ct" style="display:none;"></ul>',
+            "</li>"].join('');
+
+        if(bulkRender !== true && n.nextSibling && (nel = n.nextSibling.ui.getEl())){
+            this.wrap = Ext.DomHelper.insertHtml("beforeBegin", nel, buf);
+        }else{
+            this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf);
+        }
+
+        this.elNode = this.wrap.childNodes[0];
+        this.ctNode = this.wrap.childNodes[1];
+        var cs = this.elNode.childNodes;
+        this.indentNode = cs[0];
+        this.ecNode = cs[1];
+        this.iconNode = cs[2];
+        var index = 3;
+        if(cb){
+            this.checkbox = cs[3];
+            
+            this.checkbox.defaultChecked = this.checkbox.checked;
+            index++;
+        }
+        this.anchor = cs[index];
+        this.textNode = cs[index].firstChild;
+    },
+    
+    
+    getHref : function(href){
+        return Ext.isEmpty(href) ? (Ext.isGecko ? '' : '#') : href;
+    },
+
+
+    getAnchor : function(){
+        return this.anchor;
+    },
+
+
+    getTextEl : function(){
+        return this.textNode;
+    },
+
+
+    getIconEl : function(){
+        return this.iconNode;
+    },
+
+
+    isChecked : function(){
+        return this.checkbox ? this.checkbox.checked : false;
+    },
+
+    
+    updateExpandIcon : function(){
+        if(this.rendered){
+            var n = this.node,
+                c1,
+                c2,
+                cls = n.isLast() ? "x-tree-elbow-end" : "x-tree-elbow",
+                hasChild = n.hasChildNodes();
+            if(hasChild || n.attributes.expandable){
+                if(n.expanded){
+                    cls += "-minus";
+                    c1 = "x-tree-node-collapsed";
+                    c2 = "x-tree-node-expanded";
+                }else{
+                    cls += "-plus";
+                    c1 = "x-tree-node-expanded";
+                    c2 = "x-tree-node-collapsed";
+                }
+                if(this.wasLeaf){
+                    this.removeClass("x-tree-node-leaf");
+                    this.wasLeaf = false;
+                }
+                if(this.c1 != c1 || this.c2 != c2){
+                    Ext.fly(this.elNode).replaceClass(c1, c2);
+                    this.c1 = c1; this.c2 = c2;
+                }
+            }else{
+                if(!this.wasLeaf){
+                    Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-collapsed");
+                    delete this.c1;
+                    delete this.c2;
+                    this.wasLeaf = true;
+                }
+            }
+            var ecc = "x-tree-ec-icon "+cls;
+            if(this.ecc != ecc){
+                this.ecNode.className = ecc;
+                this.ecc = ecc;
+            }
+        }
+    },
+
+    
+    onIdChange: function(id){
+        if(this.rendered){
+            this.elNode.setAttribute('ext:tree-node-id', id);
+        }
+    },
+
+    
+    getChildIndent : function(){
+        if(!this.childIndent){
+            var buf = [],
+                p = this.node;
+            while(p){
+                if(!p.isRoot || (p.isRoot && p.ownerTree.rootVisible)){
+                    if(!p.isLast()) {
+                        buf.unshift('<img alt="" src="'+this.emptyIcon+'" class="x-tree-elbow-line" />');
+                    } else {
+                        buf.unshift('<img alt="" src="'+this.emptyIcon+'" class="x-tree-icon" />');
+                    }
+                }
+                p = p.parentNode;
+            }
+            this.childIndent = buf.join("");
+        }
+        return this.childIndent;
+    },
+
+    
+    renderIndent : function(){
+        if(this.rendered){
+            var indent = "",
+                p = this.node.parentNode;
+            if(p){
+                indent = p.ui.getChildIndent();
+            }
+            if(this.indentMarkup != indent){ 
+                this.indentNode.innerHTML = indent;
+                this.indentMarkup = indent;
+            }
+            this.updateExpandIcon();
+        }
+    },
+
+    destroy : function(){
+        if(this.elNode){
+            Ext.dd.Registry.unregister(this.elNode.id);
+        }
+
+        Ext.each(['textnode', 'anchor', 'checkbox', 'indentNode', 'ecNode', 'iconNode', 'elNode', 'ctNode', 'wrap', 'holder'], function(el){
+            if(this[el]){
+                Ext.fly(this[el]).remove();
+                delete this[el];
+            }
+        }, this);
+        delete this.node;
+    }
+});
+
+
+Ext.tree.RootTreeNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
+    
+    render : function(){
+        if(!this.rendered){
+            var targetNode = this.node.ownerTree.innerCt.dom;
+            this.node.expanded = true;
+            targetNode.innerHTML = '<div class="x-tree-root-node"></div>';
+            this.wrap = this.ctNode = targetNode.firstChild;
+        }
+    },
+    collapse : Ext.emptyFn,
+    expand : Ext.emptyFn
+});
+Ext.tree.TreeLoader = function(config){
+    this.baseParams = {};
+    Ext.apply(this, config);
+
+    this.addEvents(
+        
+        "beforeload",
+        
+        "load",
+        
+        "loadexception"
+    );
+    Ext.tree.TreeLoader.superclass.constructor.call(this);
+    if(Ext.isString(this.paramOrder)){
+        this.paramOrder = this.paramOrder.split(/[\s,|]/);
+    }
+};
+
+Ext.extend(Ext.tree.TreeLoader, Ext.util.Observable, {
+    
+    
+    
+    
+    
+    
+    
+    uiProviders : {},
+
+    
+    clearOnLoad : true,
+
+    
+    paramOrder: undefined,
+
+    
+    paramsAsHash: false,
+
+    
+    nodeParameter: 'node',
+
+    
+    directFn : undefined,
+
+    
+    load : function(node, callback, scope){
+        if(this.clearOnLoad){
+            while(node.firstChild){
+                node.removeChild(node.firstChild);
+            }
+        }
+        if(this.doPreload(node)){ 
+            this.runCallback(callback, scope || node, [node]);
+        }else if(this.directFn || this.dataUrl || this.url){
+            this.requestData(node, callback, scope || node);
+        }
+    },
+
+    doPreload : function(node){
+        if(node.attributes.children){
+            if(node.childNodes.length < 1){ 
+                var cs = node.attributes.children;
+                node.beginUpdate();
+                for(var i = 0, len = cs.length; i < len; i++){
+                    var cn = node.appendChild(this.createNode(cs[i]));
+                    if(this.preloadChildren){
+                        this.doPreload(cn);
+                    }
+                }
+                node.endUpdate();
+            }
+            return true;
+        }
+        return false;
+    },
+
+    getParams: function(node){
+        var bp = Ext.apply({}, this.baseParams),
+            np = this.nodeParameter,
+            po = this.paramOrder;
+
+        np && (bp[ np ] = node.id);
+
+        if(this.directFn){
+            var buf = [node.id];
+            if(po){
+                
+                if(np && po.indexOf(np) > -1){
+                    buf = [];
+                }
+
+                for(var i = 0, len = po.length; i < len; i++){
+                    buf.push(bp[ po[i] ]);
+                }
+            }else if(this.paramsAsHash){
+                buf = [bp];
+            }
+            return buf;
+        }else{
+            return bp;
+        }
+    },
+
+    requestData : function(node, callback, scope){
+        if(this.fireEvent("beforeload", this, node, callback) !== false){
+            if(this.directFn){
+                var args = this.getParams(node);
+                args.push(this.processDirectResponse.createDelegate(this, [{callback: callback, node: node, scope: scope}], true));
+                this.directFn.apply(window, args);
+            }else{
+                this.transId = Ext.Ajax.request({
+                    method:this.requestMethod,
+                    url: this.dataUrl||this.url,
+                    success: this.handleResponse,
+                    failure: this.handleFailure,
+                    scope: this,
+                    argument: {callback: callback, node: node, scope: scope},
+                    params: this.getParams(node)
+                });
+            }
+        }else{
+            
+            
+            this.runCallback(callback, scope || node, []);
+        }
+    },
+
+    processDirectResponse: function(result, response, args){
+        if(response.status){
+            this.handleResponse({
+                responseData: Ext.isArray(result) ? result : null,
+                responseText: result,
+                argument: args
+            });
+        }else{
+            this.handleFailure({
+                argument: args
+            });
+        }
+    },
+
+    
+    runCallback: function(cb, scope, args){
+        if(Ext.isFunction(cb)){
+            cb.apply(scope, args);
+        }
+    },
+
+    isLoading : function(){
+        return !!this.transId;
+    },
+
+    abort : function(){
+        if(this.isLoading()){
+            Ext.Ajax.abort(this.transId);
+        }
+    },
+
+    
+    createNode : function(attr){
+        
+        if(this.baseAttrs){
+            Ext.applyIf(attr, this.baseAttrs);
+        }
+        if(this.applyLoader !== false && !attr.loader){
+            attr.loader = this;
+        }
+        if(Ext.isString(attr.uiProvider)){
+           attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider);
+        }
+        if(attr.nodeType){
+            return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr);
+        }else{
+            return attr.leaf ?
+                        new Ext.tree.TreeNode(attr) :
+                        new Ext.tree.AsyncTreeNode(attr);
+        }
+    },
+
+    processResponse : function(response, node, callback, scope){
+        var json = response.responseText;
+        try {
+            var o = response.responseData || Ext.decode(json);
+            node.beginUpdate();
+            for(var i = 0, len = o.length; i < len; i++){
+                var n = this.createNode(o[i]);
+                if(n){
+                    node.appendChild(n);
+                }
+            }
+            node.endUpdate();
+            this.runCallback(callback, scope || node, [node]);
+        }catch(e){
+            this.handleFailure(response);
+        }
+    },
+
+    handleResponse : function(response){
+        this.transId = false;
+        var a = response.argument;
+        this.processResponse(response, a.node, a.callback, a.scope);
+        this.fireEvent("load", this, a.node, response);
+    },
+
+    handleFailure : function(response){
+        this.transId = false;
+        var a = response.argument;
+        this.fireEvent("loadexception", this, a.node, response);
+        this.runCallback(a.callback, a.scope || a.node, [a.node]);
+    },
+
+    destroy : function(){
+        this.abort();
+        this.purgeListeners();
+    }
+});
+Ext.tree.TreeFilter = function(tree, config){
+    this.tree = tree;
+    this.filtered = {};
+    Ext.apply(this, config);
+};
+
+Ext.tree.TreeFilter.prototype = {
+    clearBlank:false,
+    reverse:false,
+    autoClear:false,
+    remove:false,
+
+     
+    filter : function(value, attr, startNode){
+        attr = attr || "text";
+        var f;
+        if(typeof value == "string"){
+            var vlen = value.length;
+            
+            if(vlen == 0 && this.clearBlank){
+                this.clear();
+                return;
+            }
+            value = value.toLowerCase();
+            f = function(n){
+                return n.attributes[attr].substr(0, vlen).toLowerCase() == value;
+            };
+        }else if(value.exec){ 
+            f = function(n){
+                return value.test(n.attributes[attr]);
+            };
+        }else{
+            throw 'Illegal filter type, must be string or regex';
+        }
+        this.filterBy(f, null, startNode);
+       },
+
+    
+    filterBy : function(fn, scope, startNode){
+        startNode = startNode || this.tree.root;
+        if(this.autoClear){
+            this.clear();
+        }
+        var af = this.filtered, rv = this.reverse;
+        var f = function(n){
+            if(n == startNode){
+                return true;
+            }
+            if(af[n.id]){
+                return false;
+            }
+            var m = fn.call(scope || n, n);
+            if(!m || rv){
+                af[n.id] = n;
+                n.ui.hide();
+                return false;
+            }
+            return true;
+        };
+        startNode.cascade(f);
+        if(this.remove){
+           for(var id in af){
+               if(typeof id != "function"){
+                   var n = af[id];
+                   if(n && n.parentNode){
+                       n.parentNode.removeChild(n);
+                   }
+               }
+           }
+        }
+    },
+
+    
+    clear : function(){
+        var t = this.tree;
+        var af = this.filtered;
+        for(var id in af){
+            if(typeof id != "function"){
+                var n = af[id];
+                if(n){
+                    n.ui.show();
+                }
+            }
+        }
+        this.filtered = {};
+    }
+};
+
+Ext.tree.TreeSorter = Ext.extend(Object, {
+    
+    constructor: function(tree, config){
+        
+    
+    
+    
+    
+    
+
+    Ext.apply(this, config);
+    tree.on({
+        scope: this,
+        beforechildrenrendered: this.doSort,
+        append: this.updateSort,
+        insert: this.updateSort,
+        textchange: this.updateSortParent
+    });
+
+    var desc = this.dir && this.dir.toLowerCase() == 'desc',
+        prop = this.property || 'text';
+        sortType = this.sortType;
+        folderSort = this.folderSort;
+        caseSensitive = this.caseSensitive === true;
+        leafAttr = this.leafAttr || 'leaf';
+
+    if(Ext.isString(sortType)){
+        sortType = Ext.data.SortTypes[sortType];
+    }
+    this.sortFn = function(n1, n2){
+        var attr1 = n1.attributes,
+            attr2 = n2.attributes;
+            
+        if(folderSort){
+            if(attr1[leafAttr] && !attr2[leafAttr]){
+                return 1;
+            }
+            if(!attr1[leafAttr] && attr2[leafAttr]){
+                return -1;
+            }
+        }
+        var prop1 = attr1[prop],
+            prop2 = attr2[prop],
+            v1 = sortType ? sortType(prop1) : (caseSensitive ? prop1 : prop1.toUpperCase());
+            v2 = sortType ? sortType(prop2) : (caseSensitive ? prop2 : prop2.toUpperCase());
+            
+        if(v1 < v2){
+            return desc ? 1 : -1;
+        }else if(v1 > v2){
+            return desc ? -1 : 1;
+        }
+        return 0;
+    };
+    },
+    
+    doSort : function(node){
+        node.sort(this.sortFn);
+    },
+
+    updateSort : function(tree, node){
+        if(node.childrenRendered){
+            this.doSort.defer(1, this, [node]);
+        }
+    },
+
+    updateSortParent : function(node){
+        var p = node.parentNode;
+        if(p && p.childrenRendered){
+            this.doSort.defer(1, this, [p]);
+        }
+    }    
+});
+if(Ext.dd.DropZone){
+    
+Ext.tree.TreeDropZone = function(tree, config){
+    
+    this.allowParentInsert = config.allowParentInsert || false;
+    
+    this.allowContainerDrop = config.allowContainerDrop || false;
+    
+    this.appendOnly = config.appendOnly || false;
+
+    Ext.tree.TreeDropZone.superclass.constructor.call(this, tree.getTreeEl(), config);
+    
+    this.tree = tree;
+    
+    this.dragOverData = {};
+    
+    this.lastInsertClass = "x-tree-no-status";
+};
+
+Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, {
+    
+    ddGroup : "TreeDD",
+
+    
+    expandDelay : 1000,
+
+    
+    expandNode : function(node){
+        if(node.hasChildNodes() && !node.isExpanded()){
+            node.expand(false, null, this.triggerCacheRefresh.createDelegate(this));
+        }
+    },
+
+    
+    queueExpand : function(node){
+        this.expandProcId = this.expandNode.defer(this.expandDelay, this, [node]);
+    },
+
+    
+    cancelExpand : function(){
+        if(this.expandProcId){
+            clearTimeout(this.expandProcId);
+            this.expandProcId = false;
+        }
+    },
+
+    
+    isValidDropPoint : function(n, pt, dd, e, data){
+        if(!n || !data){ return false; }
+        var targetNode = n.node;
+        var dropNode = data.node;
+        
+        if(!(targetNode && targetNode.isTarget && pt)){
+            return false;
+        }
+        if(pt == "append" && targetNode.allowChildren === false){
+            return false;
+        }
+        if((pt == "above" || pt == "below") && (targetNode.parentNode && targetNode.parentNode.allowChildren === false)){
+            return false;
+        }
+        if(dropNode && (targetNode == dropNode || dropNode.contains(targetNode))){
+            return false;
+        }
+        
+        var overEvent = this.dragOverData;
+        overEvent.tree = this.tree;
+        overEvent.target = targetNode;
+        overEvent.data = data;
+        overEvent.point = pt;
+        overEvent.source = dd;
+        overEvent.rawEvent = e;
+        overEvent.dropNode = dropNode;
+        overEvent.cancel = false;  
+        var result = this.tree.fireEvent("nodedragover", overEvent);
+        return overEvent.cancel === false && result !== false;
+    },
+
+    
+    getDropPoint : function(e, n, dd){
+        var tn = n.node;
+        if(tn.isRoot){
+            return tn.allowChildren !== false ? "append" : false; 
+        }
+        var dragEl = n.ddel;
+        var t = Ext.lib.Dom.getY(dragEl), b = t + dragEl.offsetHeight;
+        var y = Ext.lib.Event.getPageY(e);
+        var noAppend = tn.allowChildren === false || tn.isLeaf();
+        if(this.appendOnly || tn.parentNode.allowChildren === false){
+            return noAppend ? false : "append";
+        }
+        var noBelow = false;
+        if(!this.allowParentInsert){
+            noBelow = tn.hasChildNodes() && tn.isExpanded();
+        }
+        var q = (b - t) / (noAppend ? 2 : 3);
+        if(y >= t && y < (t + q)){
+            return "above";
+        }else if(!noBelow && (noAppend || y >= b-q && y <= b)){
+            return "below";
+        }else{
+            return "append";
+        }
+    },
+
+    
+    onNodeEnter : function(n, dd, e, data){
+        this.cancelExpand();
+    },
+    
+    onContainerOver : function(dd, e, data) {
+        if (this.allowContainerDrop && this.isValidDropPoint({ ddel: this.tree.getRootNode().ui.elNode, node: this.tree.getRootNode() }, "append", dd, e, data)) {
+            return this.dropAllowed;
+        }
+        return this.dropNotAllowed;
+    },
+
+    
+    onNodeOver : function(n, dd, e, data){
+        var pt = this.getDropPoint(e, n, dd);
+        var node = n.node;
+        
+        
+        if(!this.expandProcId && pt == "append" && node.hasChildNodes() && !n.node.isExpanded()){
+            this.queueExpand(node);
+        }else if(pt != "append"){
+            this.cancelExpand();
+        }
+        
+        
+        var returnCls = this.dropNotAllowed;
+        if(this.isValidDropPoint(n, pt, dd, e, data)){
+           if(pt){
+               var el = n.ddel;
+               var cls;
+               if(pt == "above"){
+                   returnCls = n.node.isFirst() ? "x-tree-drop-ok-above" : "x-tree-drop-ok-between";
+                   cls = "x-tree-drag-insert-above";
+               }else if(pt == "below"){
+                   returnCls = n.node.isLast() ? "x-tree-drop-ok-below" : "x-tree-drop-ok-between";
+                   cls = "x-tree-drag-insert-below";
+               }else{
+                   returnCls = "x-tree-drop-ok-append";
+                   cls = "x-tree-drag-append";
+               }
+               if(this.lastInsertClass != cls){
+                   Ext.fly(el).replaceClass(this.lastInsertClass, cls);
+                   this.lastInsertClass = cls;
+               }
+           }
+       }
+       return returnCls;
+    },
+
+    
+    onNodeOut : function(n, dd, e, data){
+        this.cancelExpand();
+        this.removeDropIndicators(n);
+    },
+
+    
+    onNodeDrop : function(n, dd, e, data){
+        var point = this.getDropPoint(e, n, dd);
+        var targetNode = n.node;
+        targetNode.ui.startDrop();
+        if(!this.isValidDropPoint(n, point, dd, e, data)){
+            targetNode.ui.endDrop();
+            return false;
+        }
+        
+        var dropNode = data.node || (dd.getTreeNode ? dd.getTreeNode(data, targetNode, point, e) : null);
+        return this.processDrop(targetNode, data, point, dd, e, dropNode);
+    },
+    
+    onContainerDrop : function(dd, e, data){
+        if (this.allowContainerDrop && this.isValidDropPoint({ ddel: this.tree.getRootNode().ui.elNode, node: this.tree.getRootNode() }, "append", dd, e, data)) {
+            var targetNode = this.tree.getRootNode();       
+            targetNode.ui.startDrop();
+            var dropNode = data.node || (dd.getTreeNode ? dd.getTreeNode(data, targetNode, 'append', e) : null);
+            return this.processDrop(targetNode, data, 'append', dd, e, dropNode);
+        }
+        return false;
+    },
+    
+    
+    processDrop: function(target, data, point, dd, e, dropNode){
+        var dropEvent = {
+            tree : this.tree,
+            target: target,
+            data: data,
+            point: point,
+            source: dd,
+            rawEvent: e,
+            dropNode: dropNode,
+            cancel: !dropNode,
+            dropStatus: false
+        };
+        var retval = this.tree.fireEvent("beforenodedrop", dropEvent);
+        if(retval === false || dropEvent.cancel === true || !dropEvent.dropNode){
+            target.ui.endDrop();
+            return dropEvent.dropStatus;
+        }
+    
+        target = dropEvent.target;
+        if(point == 'append' && !target.isExpanded()){
+            target.expand(false, null, function(){
+                this.completeDrop(dropEvent);
+            }.createDelegate(this));
+        }else{
+            this.completeDrop(dropEvent);
+        }
+        return true;
+    },
+
+    
+    completeDrop : function(de){
+        var ns = de.dropNode, p = de.point, t = de.target;
+        if(!Ext.isArray(ns)){
+            ns = [ns];
+        }
+        var n;
+        for(var i = 0, len = ns.length; i < len; i++){
+            n = ns[i];
+            if(p == "above"){
+                t.parentNode.insertBefore(n, t);
+            }else if(p == "below"){
+                t.parentNode.insertBefore(n, t.nextSibling);
+            }else{
+                t.appendChild(n);
+            }
+        }
+        n.ui.focus();
+        if(Ext.enableFx && this.tree.hlDrop){
+            n.ui.highlight();
+        }
+        t.ui.endDrop();
+        this.tree.fireEvent("nodedrop", de);
+    },
+
+    
+    afterNodeMoved : function(dd, data, e, targetNode, dropNode){
+        if(Ext.enableFx && this.tree.hlDrop){
+            dropNode.ui.focus();
+            dropNode.ui.highlight();
+        }
+        this.tree.fireEvent("nodedrop", this.tree, targetNode, data, dd, e);
+    },
+
+    
+    getTree : function(){
+        return this.tree;
+    },
+
+    
+    removeDropIndicators : function(n){
+        if(n && n.ddel){
+            var el = n.ddel;
+            Ext.fly(el).removeClass([
+                    "x-tree-drag-insert-above",
+                    "x-tree-drag-insert-below",
+                    "x-tree-drag-append"]);
+            this.lastInsertClass = "_noclass";
+        }
+    },
+
+    
+    beforeDragDrop : function(target, e, id){
+        this.cancelExpand();
+        return true;
+    },
+
+    
+    afterRepair : function(data){
+        if(data && Ext.enableFx){
+            data.node.ui.highlight();
+        }
+        this.hideProxy();
+    }    
+});
+
+}
+if(Ext.dd.DragZone){
+Ext.tree.TreeDragZone = function(tree, config){
+    Ext.tree.TreeDragZone.superclass.constructor.call(this, tree.innerCt, config);
+    
+    this.tree = tree;
+};
+
+Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone, {
+    
+    ddGroup : "TreeDD",
+
+    
+    onBeforeDrag : function(data, e){
+        var n = data.node;
+        return n && n.draggable && !n.disabled;
+    },
+
+    
+    onInitDrag : function(e){
+        var data = this.dragData;
+        this.tree.getSelectionModel().select(data.node);
+        this.tree.eventModel.disable();
+        this.proxy.update("");
+        data.node.ui.appendDDGhost(this.proxy.ghost.dom);
+        this.tree.fireEvent("startdrag", this.tree, data.node, e);
+    },
+
+    
+    getRepairXY : function(e, data){
+        return data.node.ui.getDDRepairXY();
+    },
+
+    
+    onEndDrag : function(data, e){
+        this.tree.eventModel.enable.defer(100, this.tree.eventModel);
+        this.tree.fireEvent("enddrag", this.tree, data.node, e);
+    },
+
+    
+    onValidDrop : function(dd, e, id){
+        this.tree.fireEvent("dragdrop", this.tree, this.dragData.node, dd, e);
+        this.hideProxy();
+    },
+
+    
+    beforeInvalidDrop : function(e, id){
+        
+        var sm = this.tree.getSelectionModel();
+        sm.clearSelections();
+        sm.select(this.dragData.node);
+    },
+    
+    
+    afterRepair : function(){
+        if (Ext.enableFx && this.tree.hlDrop) {
+            Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9");
+        }
+        this.dragging = false;
+    }
+});
+}
+Ext.tree.TreeEditor = function(tree, fc, config){
+    fc = fc || {};
+    var field = fc.events ? fc : new Ext.form.TextField(fc);
+    
+    Ext.tree.TreeEditor.superclass.constructor.call(this, field, config);
+
+    this.tree = tree;
+
+    if(!tree.rendered){
+        tree.on('render', this.initEditor, this);
+    }else{
+        this.initEditor(tree);
+    }
+};
+
+Ext.extend(Ext.tree.TreeEditor, Ext.Editor, {
+    
+    alignment: "l-l",
+    
+    autoSize: false,
+    
+    hideEl : false,
+    
+    cls: "x-small-editor x-tree-editor",
+    
+    shim:false,
+    
+    shadow:"frame",
+    
+    maxWidth: 250,
+    
+    editDelay : 350,
+
+    initEditor : function(tree){
+        tree.on({
+            scope      : this,
+            beforeclick: this.beforeNodeClick,
+            dblclick   : this.onNodeDblClick
+        });
+        
+        this.on({
+            scope          : this,
+            complete       : this.updateNode,
+            beforestartedit: this.fitToTree,
+            specialkey     : this.onSpecialKey
+        });
+        
+        this.on('startedit', this.bindScroll, this, {delay:10});
+    },
+
+    
+    fitToTree : function(ed, el){
+        var td = this.tree.getTreeEl().dom, nd = el.dom;
+        if(td.scrollLeft >  nd.offsetLeft){ 
+            td.scrollLeft = nd.offsetLeft;
+        }
+        var w = Math.min(
+                this.maxWidth,
+                (td.clientWidth > 20 ? td.clientWidth : td.offsetWidth) - Math.max(0, nd.offsetLeft-td.scrollLeft) - 5);
+        this.setSize(w, '');
+    },
+
+    
+    triggerEdit : function(node, defer){
+        this.completeEdit();
+               if(node.attributes.editable !== false){
+           
+                       this.editNode = node;
+            if(this.tree.autoScroll){
+                Ext.fly(node.ui.getEl()).scrollIntoView(this.tree.body);
+            }
+            var value = node.text || '';
+            if (!Ext.isGecko && Ext.isEmpty(node.text)){
+                node.setText('&#160;');
+            }
+            this.autoEditTimer = this.startEdit.defer(this.editDelay, this, [node.ui.textNode, value]);
+            return false;
+        }
+    },
+
+    
+    bindScroll : function(){
+        this.tree.getTreeEl().on('scroll', this.cancelEdit, this);
+    },
+
+    
+    beforeNodeClick : function(node, e){
+        clearTimeout(this.autoEditTimer);
+        if(this.tree.getSelectionModel().isSelected(node)){
+            e.stopEvent();
+            return this.triggerEdit(node);
+        }
+    },
+
+    onNodeDblClick : function(node, e){
+        clearTimeout(this.autoEditTimer);
+    },
+
+    
+    updateNode : function(ed, value){
+        this.tree.getTreeEl().un('scroll', this.cancelEdit, this);
+        this.editNode.setText(value);
+    },
+
+    
+    onHide : function(){
+        Ext.tree.TreeEditor.superclass.onHide.call(this);
+        if(this.editNode){
+            this.editNode.ui.focus.defer(50, this.editNode.ui);
+        }
+    },
+
+    
+    onSpecialKey : function(field, e){
+        var k = e.getKey();
+        if(k == e.ESC){
+            e.stopEvent();
+            this.cancelEdit();
+        }else if(k == e.ENTER && !e.hasModifier()){
+            e.stopEvent();
+            this.completeEdit();
+        }
+    },
+    
+    onDestroy : function(){
+        clearTimeout(this.autoEditTimer);
+        Ext.tree.TreeEditor.superclass.onDestroy.call(this);
+        var tree = this.tree;
+        tree.un('beforeclick', this.beforeNodeClick, this);
+        tree.un('dblclick', this.onNodeDblClick, this);
+    }
+});
+
+var swfobject = function() {
+    
+    var UNDEF = "undefined",
+        OBJECT = "object",
+        SHOCKWAVE_FLASH = "Shockwave Flash",
+        SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
+        FLASH_MIME_TYPE = "application/x-shockwave-flash",
+        EXPRESS_INSTALL_ID = "SWFObjectExprInst",
+        ON_READY_STATE_CHANGE = "onreadystatechange",
+        
+        win = window,
+        doc = document,
+        nav = navigator,
+        
+        plugin = false,
+        domLoadFnArr = [main],
+        regObjArr = [],
+        objIdArr = [],
+        listenersArr = [],
+        storedAltContent,
+        storedAltContentId,
+        storedCallbackFn,
+        storedCallbackObj,
+        isDomLoaded = false,
+        isExpressInstallActive = false,
+        dynamicStylesheet,
+        dynamicStylesheetMedia,
+        autoHideShow = true,
+    
+      
+    ua = function() {
+        var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
+            u = nav.userAgent.toLowerCase(),
+            p = nav.platform.toLowerCase(),
+            windows = p ? (/win/).test(p) : /win/.test(u),
+            mac = p ? (/mac/).test(p) : /mac/.test(u),
+            webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, 
+            ie = !+"\v1", 
+            playerVersion = [0,0,0],
+            d = null;
+        if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
+            d = nav.plugins[SHOCKWAVE_FLASH].description;
+            if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { 
+                plugin = true;
+                ie = false; 
+                d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
+                playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
+                playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
+                playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
+            }
+        }
+        else if (typeof win.ActiveXObject != UNDEF) {
+            try {
+                var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
+                if (a) { 
+                    d = a.GetVariable("$version");
+                    if (d) {
+                        ie = true; 
+                        d = d.split(" ")[1].split(",");
+                        playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+                    }
+                }
+            }
+            catch(e) {}
+        }
+        return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
+    }(),
+    
+     
+    onDomLoad = function() {
+        if (!ua.w3) { return; }
+        if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) { 
+            callDomLoadFunctions();
+        }
+        if (!isDomLoaded) {
+            if (typeof doc.addEventListener != UNDEF) {
+                doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false);
+            }       
+            if (ua.ie && ua.win) {
+                doc.attachEvent(ON_READY_STATE_CHANGE, function() {
+                    if (doc.readyState == "complete") {
+                        doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee);
+                        callDomLoadFunctions();
+                    }
+                });
+                if (win == top) { 
+                    (function(){
+                        if (isDomLoaded) { return; }
+                        try {
+                            doc.documentElement.doScroll("left");
+                        }
+                        catch(e) {
+                            setTimeout(arguments.callee, 0);
+                            return;
+                        }
+                        callDomLoadFunctions();
+                    })();
+                }
+            }
+            if (ua.wk) {
+                (function(){
+                    if (isDomLoaded) { return; }
+                    if (!(/loaded|complete/).test(doc.readyState)) {
+                        setTimeout(arguments.callee, 0);
+                        return;
+                    }
+                    callDomLoadFunctions();
+                })();
+            }
+            addLoadEvent(callDomLoadFunctions);
+        }
+    }();
+    
+    function callDomLoadFunctions() {
+        if (isDomLoaded) { return; }
+        try { 
+            var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span"));
+            t.parentNode.removeChild(t);
+        }
+        catch (e) { return; }
+        isDomLoaded = true;
+        var dl = domLoadFnArr.length;
+        for (var i = 0; i < dl; i++) {
+            domLoadFnArr[i]();
+        }
+    }
+    
+    function addDomLoadEvent(fn) {
+        if (isDomLoaded) {
+            fn();
+        }
+        else { 
+            domLoadFnArr[domLoadFnArr.length] = fn; 
+        }
+    }
+    
+    
+    function addLoadEvent(fn) {
+        if (typeof win.addEventListener != UNDEF) {
+            win.addEventListener("load", fn, false);
+        }
+        else if (typeof doc.addEventListener != UNDEF) {
+            doc.addEventListener("load", fn, false);
+        }
+        else if (typeof win.attachEvent != UNDEF) {
+            addListener(win, "onload", fn);
+        }
+        else if (typeof win.onload == "function") {
+            var fnOld = win.onload;
+            win.onload = function() {
+                fnOld();
+                fn();
+            };
+        }
+        else {
+            win.onload = fn;
+        }
+    }
+    
+    
+    function main() { 
+        if (plugin) {
+            testPlayerVersion();
+        }
+        else {
+            matchVersions();
+        }
+    }
+    
+    
+    function testPlayerVersion() {
+        var b = doc.getElementsByTagName("body")[0];
+        var o = createElement(OBJECT);
+        o.setAttribute("type", FLASH_MIME_TYPE);
+        var t = b.appendChild(o);
+        if (t) {
+            var counter = 0;
+            (function(){
+                if (typeof t.GetVariable != UNDEF) {
+                    var d = t.GetVariable("$version");
+                    if (d) {
+                        d = d.split(" ")[1].split(",");
+                        ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+                    }
+                }
+                else if (counter < 10) {
+                    counter++;
+                    setTimeout(arguments.callee, 10);
+                    return;
+                }
+                b.removeChild(o);
+                t = null;
+                matchVersions();
+            })();
+        }
+        else {
+            matchVersions();
+        }
+    }
+    
+    
+    function matchVersions() {
+        var rl = regObjArr.length;
+        if (rl > 0) {
+            for (var i = 0; i < rl; i++) { 
+                var id = regObjArr[i].id;
+                var cb = regObjArr[i].callbackFn;
+                var cbObj = {success:false, id:id};
+                if (ua.pv[0] > 0) {
+                    var obj = getElementById(id);
+                    if (obj) {
+                        if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { 
+                            setVisibility(id, true);
+                            if (cb) {
+                                cbObj.success = true;
+                                cbObj.ref = getObjectById(id);
+                                cb(cbObj);
+                            }
+                        }
+                        else if (regObjArr[i].expressInstall && canExpressInstall()) { 
+                            var att = {};
+                            att.data = regObjArr[i].expressInstall;
+                            att.width = obj.getAttribute("width") || "0";
+                            att.height = obj.getAttribute("height") || "0";
+                            if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); }
+                            if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); }
+                            
+                            var par = {};
+                            var p = obj.getElementsByTagName("param");
+                            var pl = p.length;
+                            for (var j = 0; j < pl; j++) {
+                                if (p[j].getAttribute("name").toLowerCase() != "movie") {
+                                    par[p[j].getAttribute("name")] = p[j].getAttribute("value");
+                                }
+                            }
+                            showExpressInstall(att, par, id, cb);
+                        }
+                        else { 
+                            displayAltContent(obj);
+                            if (cb) { cb(cbObj); }
+                        }
+                    }
+                }
+                else {  
+                    setVisibility(id, true);
+                    if (cb) {
+                        var o = getObjectById(id); 
+                        if (o && typeof o.SetVariable != UNDEF) { 
+                            cbObj.success = true;
+                            cbObj.ref = o;
+                        }
+                        cb(cbObj);
+                    }
+                }
+            }
+        }
+    }
+    
+    function getObjectById(objectIdStr) {
+        var r = null;
+        var o = getElementById(objectIdStr);
+        if (o && o.nodeName == "OBJECT") {
+            if (typeof o.SetVariable != UNDEF) {
+                r = o;
+            }
+            else {
+                var n = o.getElementsByTagName(OBJECT)[0];
+                if (n) {
+                    r = n;
+                }
+            }
+        }
+        return r;
+    }
+    
+    
+    function canExpressInstall() {
+        return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312);
+    }
+    
+    
+    function showExpressInstall(att, par, replaceElemIdStr, callbackFn) {
+        isExpressInstallActive = true;
+        storedCallbackFn = callbackFn || null;
+        storedCallbackObj = {success:false, id:replaceElemIdStr};
+        var obj = getElementById(replaceElemIdStr);
+        if (obj) {
+            if (obj.nodeName == "OBJECT") { 
+                storedAltContent = abstractAltContent(obj);
+                storedAltContentId = null;
+            }
+            else { 
+                storedAltContent = obj;
+                storedAltContentId = replaceElemIdStr;
+            }
+            att.id = EXPRESS_INSTALL_ID;
+            if (typeof att.width == UNDEF || (!(/%$/).test(att.width) && parseInt(att.width, 10) < 310)) {
+                att.width = "310";
+            }
+            
+            if (typeof att.height == UNDEF || (!(/%$/).test(att.height) && parseInt(att.height, 10) < 137)) {
+                att.height = "137";
+            }
+            doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
+            var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
+                fv = "MMredirectURL=" + win.location.toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title;
+            if (typeof par.flashvars != UNDEF) {
+                par.flashvars += "&" + fv;
+            }
+            else {
+                par.flashvars = fv;
+            }
+            
+            
+            if (ua.ie && ua.win && obj.readyState != 4) {
+                var newObj = createElement("div");
+                replaceElemIdStr += "SWFObjectNew";
+                newObj.setAttribute("id", replaceElemIdStr);
+                obj.parentNode.insertBefore(newObj, obj); 
+                obj.style.display = "none";
+                (function(){
+                    if (obj.readyState == 4) {
+                        obj.parentNode.removeChild(obj);
+                    }
+                    else {
+                        setTimeout(arguments.callee, 10);
+                    }
+                })();
+            }
+            createSWF(att, par, replaceElemIdStr);
+        }
+    }
+    
+    
+    function displayAltContent(obj) {
+        if (ua.ie && ua.win && obj.readyState != 4) {
+            
+            
+            var el = createElement("div");
+            obj.parentNode.insertBefore(el, obj); 
+            el.parentNode.replaceChild(abstractAltContent(obj), el);
+            obj.style.display = "none";
+            (function(){
+                if (obj.readyState == 4) {
+                    obj.parentNode.removeChild(obj);
+                }
+                else {
+                    setTimeout(arguments.callee, 10);
+                }
+            })();
+        }
+        else {
+            obj.parentNode.replaceChild(abstractAltContent(obj), obj);
+        }
+    } 
+
+    function abstractAltContent(obj) {
+        var ac = createElement("div");
+        if (ua.win && ua.ie) {
+            ac.innerHTML = obj.innerHTML;
+        }
+        else {
+            var nestedObj = obj.getElementsByTagName(OBJECT)[0];
+            if (nestedObj) {
+                var c = nestedObj.childNodes;
+                if (c) {
+                    var cl = c.length;
+                    for (var i = 0; i < cl; i++) {
+                        if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
+                            ac.appendChild(c[i].cloneNode(true));
+                        }
+                    }
+                }
+            }
+        }
+        return ac;
+    }
+    
+    
+    function createSWF(attObj, parObj, id) {
+        var r, el = getElementById(id);
+        if (ua.wk && ua.wk < 312) { return r; }
+        if (el) {
+            if (typeof attObj.id == UNDEF) { 
+                attObj.id = id;
+            }
+            if (ua.ie && ua.win) { 
+                var att = "";
+                for (var i in attObj) {
+                    if (attObj[i] != Object.prototype[i]) { 
+                        if (i.toLowerCase() == "data") {
+                            parObj.movie = attObj[i];
+                        }
+                        else if (i.toLowerCase() == "styleclass") { 
+                            att += ' class="' + attObj[i] + '"';
+                        }
+                        else if (i.toLowerCase() != "classid") {
+                            att += ' ' + i + '="' + attObj[i] + '"';
+                        }
+                    }
+                }
+                var par = "";
+                for (var j in parObj) {
+                    if (parObj[j] != Object.prototype[j]) { 
+                        par += '<param name="' + j + '" value="' + parObj[j] + '" />';
+                    }
+                }
+                el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
+                objIdArr[objIdArr.length] = attObj.id; 
+                r = getElementById(attObj.id);  
+            }
+            else { 
+                var o = createElement(OBJECT);
+                o.setAttribute("type", FLASH_MIME_TYPE);
+                for (var m in attObj) {
+                    if (attObj[m] != Object.prototype[m]) { 
+                        if (m.toLowerCase() == "styleclass") { 
+                            o.setAttribute("class", attObj[m]);
+                        }
+                        else if (m.toLowerCase() != "classid") { 
+                            o.setAttribute(m, attObj[m]);
+                        }
+                    }
+                }
+                for (var n in parObj) {
+                    if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { 
+                        createObjParam(o, n, parObj[n]);
+                    }
+                }
+                el.parentNode.replaceChild(o, el);
+                r = o;
+            }
+        }
+        return r;
+    }
+    
+    function createObjParam(el, pName, pValue) {
+        var p = createElement("param");
+        p.setAttribute("name", pName);  
+        p.setAttribute("value", pValue);
+        el.appendChild(p);
+    }
+    
+    
+    function removeSWF(id) {
+        var obj = getElementById(id);
+        if (obj && obj.nodeName == "OBJECT") {
+            if (ua.ie && ua.win) {
+                obj.style.display = "none";
+                (function(){
+                    if (obj.readyState == 4) {
+                        removeObjectInIE(id);
+                    }
+                    else {
+                        setTimeout(arguments.callee, 10);
+                    }
+                })();
+            }
+            else {
+                obj.parentNode.removeChild(obj);
+            }
+        }
+    }
+    
+    function removeObjectInIE(id) {
+        var obj = getElementById(id);
+        if (obj) {
+            for (var i in obj) {
+                if (typeof obj[i] == "function") {
+                    obj[i] = null;
+                }
+            }
+            obj.parentNode.removeChild(obj);
+        }
+    }
+    
+    
+    function getElementById(id) {
+        var el = null;
+        try {
+            el = doc.getElementById(id);
+        }
+        catch (e) {}
+        return el;
+    }
+    
+    function createElement(el) {
+        return doc.createElement(el);
+    }
+    
+      
+    function addListener(target, eventType, fn) {
+        target.attachEvent(eventType, fn);
+        listenersArr[listenersArr.length] = [target, eventType, fn];
+    }
+    
+    
+    function hasPlayerVersion(rv) {
+        var pv = ua.pv, v = rv.split(".");
+        v[0] = parseInt(v[0], 10);
+        v[1] = parseInt(v[1], 10) || 0; 
+        v[2] = parseInt(v[2], 10) || 0;
+        return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
+    }
+    
+      
+    function createCSS(sel, decl, media, newStyle) {
+        if (ua.ie && ua.mac) { return; }
+        var h = doc.getElementsByTagName("head")[0];
+        if (!h) { return; } 
+        var m = (media && typeof media == "string") ? media : "screen";
+        if (newStyle) {
+            dynamicStylesheet = null;
+            dynamicStylesheetMedia = null;
+        }
+        if (!dynamicStylesheet || dynamicStylesheetMedia != m) { 
+            
+            var s = createElement("style");
+            s.setAttribute("type", "text/css");
+            s.setAttribute("media", m);
+            dynamicStylesheet = h.appendChild(s);
+            if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
+                dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1];
+            }
+            dynamicStylesheetMedia = m;
+        }
+        
+        if (ua.ie && ua.win) {
+            if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) {
+                dynamicStylesheet.addRule(sel, decl);
+            }
+        }
+        else {
+            if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) {
+                dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
+            }
+        }
+    }
+    
+    function setVisibility(id, isVisible) {
+        if (!autoHideShow) { return; }
+        var v = isVisible ? "visible" : "hidden";
+        if (isDomLoaded && getElementById(id)) {
+            getElementById(id).style.visibility = v;
+        }
+        else {
+            createCSS("#" + id, "visibility:" + v);
+        }
+    }
+
+    
+    function urlEncodeIfNecessary(s) {
+        var regex = /[\\\"<>\.;]/;
+        var hasBadChars = regex.exec(s) != null;
+        return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
+    }
+    
+    
+    var cleanup = function() {
+        if (ua.ie && ua.win) {
+            window.attachEvent("onunload", function() {
+                
+                var ll = listenersArr.length;
+                for (var i = 0; i < ll; i++) {
+                    listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
+                }
+                
+                var il = objIdArr.length;
+                for (var j = 0; j < il; j++) {
+                    removeSWF(objIdArr[j]);
+                }
+                
+                for (var k in ua) {
+                    ua[k] = null;
+                }
+                ua = null;
+                for (var l in swfobject) {
+                    swfobject[l] = null;
+                }
+                swfobject = null;
+            });
+        }
+    }();
+    
+    return {
+         
+        registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) {
+            if (ua.w3 && objectIdStr && swfVersionStr) {
+                var regObj = {};
+                regObj.id = objectIdStr;
+                regObj.swfVersion = swfVersionStr;
+                regObj.expressInstall = xiSwfUrlStr;
+                regObj.callbackFn = callbackFn;
+                regObjArr[regObjArr.length] = regObj;
+                setVisibility(objectIdStr, false);
+            }
+            else if (callbackFn) {
+                callbackFn({success:false, id:objectIdStr});
+            }
+        },
+        
+        getObjectById: function(objectIdStr) {
+            if (ua.w3) {
+                return getObjectById(objectIdStr);
+            }
+        },
+        
+        embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
+            var callbackObj = {success:false, id:replaceElemIdStr};
+            if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
+                setVisibility(replaceElemIdStr, false);
+                addDomLoadEvent(function() {
+                    widthStr += ""; 
+                    heightStr += "";
+                    var att = {};
+                    if (attObj && typeof attObj === OBJECT) {
+                        for (var i in attObj) { 
+                            att[i] = attObj[i];
+                        }
+                    }
+                    att.data = swfUrlStr;
+                    att.width = widthStr;
+                    att.height = heightStr;
+                    var par = {}; 
+                    if (parObj && typeof parObj === OBJECT) {
+                        for (var j in parObj) { 
+                            par[j] = parObj[j];
+                        }
+                    }
+                    if (flashvarsObj && typeof flashvarsObj === OBJECT) {
+                        for (var k in flashvarsObj) { 
+                            if (typeof par.flashvars != UNDEF) {
+                                par.flashvars += "&" + k + "=" + flashvarsObj[k];
+                            }
+                            else {
+                                par.flashvars = k + "=" + flashvarsObj[k];
+                            }
+                        }
+                    }
+                    if (hasPlayerVersion(swfVersionStr)) { 
+                        var obj = createSWF(att, par, replaceElemIdStr);
+                        if (att.id == replaceElemIdStr) {
+                            setVisibility(replaceElemIdStr, true);
+                        }
+                        callbackObj.success = true;
+                        callbackObj.ref = obj;
+                    }
+                    else if (xiSwfUrlStr && canExpressInstall()) { 
+                        att.data = xiSwfUrlStr;
+                        showExpressInstall(att, par, replaceElemIdStr, callbackFn);
+                        return;
+                    }
+                    else { 
+                        setVisibility(replaceElemIdStr, true);
+                    }
+                    if (callbackFn) { callbackFn(callbackObj); }
+                });
+            }
+            else if (callbackFn) { callbackFn(callbackObj); }
+        },
+        
+        switchOffAutoHideShow: function() {
+            autoHideShow = false;
+        },
+        
+        ua: ua,
+        
+        getFlashPlayerVersion: function() {
+            return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
+        },
+        
+        hasFlashPlayerVersion: hasPlayerVersion,
+        
+        createSWF: function(attObj, parObj, replaceElemIdStr) {
+            if (ua.w3) {
+                return createSWF(attObj, parObj, replaceElemIdStr);
+            }
+            else {
+                return undefined;
+            }
+        },
+        
+        showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) {
+            if (ua.w3 && canExpressInstall()) {
+                showExpressInstall(att, par, replaceElemIdStr, callbackFn);
+            }
+        },
+        
+        removeSWF: function(objElemIdStr) {
+            if (ua.w3) {
+                removeSWF(objElemIdStr);
+            }
+        },
+        
+        createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) {
+            if (ua.w3) {
+                createCSS(selStr, declStr, mediaStr, newStyleBoolean);
+            }
+        },
+        
+        addDomLoadEvent: addDomLoadEvent,
+        
+        addLoadEvent: addLoadEvent,
+        
+        getQueryParamValue: function(param) {
+            var q = doc.location.search || doc.location.hash;
+            if (q) {
+                if (/\?/.test(q)) { q = q.split("?")[1]; } 
+                if (param == null) {
+                    return urlEncodeIfNecessary(q);
+                }
+                var pairs = q.split("&");
+                for (var i = 0; i < pairs.length; i++) {
+                    if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
+                        return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
+                    }
+                }
+            }
+            return "";
+        },
+        
+        
+        expressInstallCallback: function() {
+            if (isExpressInstallActive) {
+                var obj = getElementById(EXPRESS_INSTALL_ID);
+                if (obj && storedAltContent) {
+                    obj.parentNode.replaceChild(storedAltContent, obj);
+                    if (storedAltContentId) {
+                        setVisibility(storedAltContentId, true);
+                        if (ua.ie && ua.win) { storedAltContent.style.display = "block"; }
+                    }
+                    if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); }
+                }
+                isExpressInstallActive = false;
+            } 
+        }
+    };
+}();
+
+Ext.FlashComponent = Ext.extend(Ext.BoxComponent, {
+    
+    flashVersion : '9.0.115',
+
+    
+    backgroundColor: '#ffffff',
+
+    
+    wmode: 'opaque',
+
+    
+    flashVars: undefined,
+
+    
+    flashParams: undefined,
+
+    
+    url: undefined,
+    swfId : undefined,
+    swfWidth: '100%',
+    swfHeight: '100%',
+
+    
+    expressInstall: false,
+
+    initComponent : function(){
+        Ext.FlashComponent.superclass.initComponent.call(this);
+
+        this.addEvents(
+            
+            'initialize'
+        );
+    },
+
+    onRender : function(){
+        Ext.FlashComponent.superclass.onRender.apply(this, arguments);
+
+        var params = Ext.apply({
+            allowScriptAccess: 'always',
+            bgcolor: this.backgroundColor,
+            wmode: this.wmode
+        }, this.flashParams), vars = Ext.apply({
+            allowedDomain: document.location.hostname,
+            YUISwfId: this.getId(),
+            YUIBridgeCallback: 'Ext.FlashEventProxy.onEvent'
+        }, this.flashVars);
+
+        new swfobject.embedSWF(this.url, this.id, this.swfWidth, this.swfHeight, this.flashVersion,
+            this.expressInstall ? Ext.FlashComponent.EXPRESS_INSTALL_URL : undefined, vars, params);
+
+        this.swf = Ext.getDom(this.id);
+        this.el = Ext.get(this.swf);
+    },
+
+    getSwfId : function(){
+        return this.swfId || (this.swfId = "extswf" + (++Ext.Component.AUTO_ID));
+    },
+
+    getId : function(){
+        return this.id || (this.id = "extflashcmp" + (++Ext.Component.AUTO_ID));
+    },
+
+    onFlashEvent : function(e){
+        switch(e.type){
+            case "swfReady":
+                this.initSwf();
+                return;
+            case "log":
+                return;
+        }
+        e.component = this;
+        this.fireEvent(e.type.toLowerCase().replace(/event$/, ''), e);
+    },
+
+    initSwf : function(){
+        this.onSwfReady(!!this.isInitialized);
+        this.isInitialized = true;
+        this.fireEvent('initialize', this);
+    },
+
+    beforeDestroy: function(){
+        if(this.rendered){
+            swfobject.removeSWF(this.swf.id);
+        }
+        Ext.FlashComponent.superclass.beforeDestroy.call(this);
+    },
+
+    onSwfReady : Ext.emptyFn
+});
+
+
+Ext.FlashComponent.EXPRESS_INSTALL_URL = 'http:/' + '/swfobject.googlecode.com/svn/trunk/swfobject/expressInstall.swf';
+
+Ext.reg('flash', Ext.FlashComponent);
+Ext.FlashEventProxy = {
+    onEvent : function(id, e){
+        var fp = Ext.getCmp(id);
+        if(fp){
+            fp.onFlashEvent(e);
+        }else{
+            arguments.callee.defer(10, this, [id, e]);
+        }
+    }
+};
+
+ Ext.chart.Chart = Ext.extend(Ext.FlashComponent, {
+    refreshBuffer: 100,
+
+    
+
+    
+    chartStyle: {
+        padding: 10,
+        animationEnabled: true,
+        font: {
+            name: 'Tahoma',
+            color: 0x444444,
+            size: 11
+        },
+        dataTip: {
+            padding: 5,
+            border: {
+                color: 0x99bbe8,
+                size:1
+            },
+            background: {
+                color: 0xDAE7F6,
+                alpha: .9
+            },
+            font: {
+                name: 'Tahoma',
+                color: 0x15428B,
+                size: 10,
+                bold: true
+            }
+        }
+    },
+
+    
+
+    
+    extraStyle: null,
+
+    
+    seriesStyles: null,
+
+    
+    disableCaching: Ext.isIE || Ext.isOpera,
+    disableCacheParam: '_dc',
+
+    initComponent : function(){
+        Ext.chart.Chart.superclass.initComponent.call(this);
+        if(!this.url){
+            this.url = Ext.chart.Chart.CHART_URL;
+        }
+        if(this.disableCaching){
+            this.url = Ext.urlAppend(this.url, String.format('{0}={1}', this.disableCacheParam, new Date().getTime()));
+        }
+        this.addEvents(
+            'itemmouseover',
+            'itemmouseout',
+            'itemclick',
+            'itemdoubleclick',
+            'itemdragstart',
+            'itemdrag',
+            'itemdragend',
+            
+            'beforerefresh',
+            
+            'refresh'
+        );
+        this.store = Ext.StoreMgr.lookup(this.store);
+    },
+
+    
+     setStyle: function(name, value){
+         this.swf.setStyle(name, Ext.encode(value));
+     },
+
+    
+    setStyles: function(styles){
+        this.swf.setStyles(Ext.encode(styles));
+    },
+
+    
+    setSeriesStyles: function(styles){
+        this.seriesStyles = styles;
+        var s = [];
+        Ext.each(styles, function(style){
+            s.push(Ext.encode(style));
+        });
+        this.swf.setSeriesStyles(s);
+    },
+
+    setCategoryNames : function(names){
+        this.swf.setCategoryNames(names);
+    },
+
+    setLegendRenderer : function(fn, scope){
+        var chart = this;
+        scope = scope || chart;
+        chart.removeFnProxy(chart.legendFnName);
+        chart.legendFnName = chart.createFnProxy(function(name){
+            return fn.call(scope, name);
+        });
+        chart.swf.setLegendLabelFunction(chart.legendFnName);
+    },
+
+    setTipRenderer : function(fn, scope){
+        var chart = this;
+        scope = scope || chart;
+        chart.removeFnProxy(chart.tipFnName);
+        chart.tipFnName = chart.createFnProxy(function(item, index, series){
+            var record = chart.store.getAt(index);
+            return fn.call(scope, chart, record, index, series);
+        });
+        chart.swf.setDataTipFunction(chart.tipFnName);
+    },
+
+    setSeries : function(series){
+        this.series = series;
+        this.refresh();
+    },
+
+    
+    bindStore : function(store, initial){
+        if(!initial && this.store){
+            if(store !== this.store && this.store.autoDestroy){
+                this.store.destroy();
+            }else{
+                this.store.un("datachanged", this.refresh, this);
+                this.store.un("add", this.delayRefresh, this);
+                this.store.un("remove", this.delayRefresh, this);
+                this.store.un("update", this.delayRefresh, this);
+                this.store.un("clear", this.refresh, this);
+            }
+        }
+        if(store){
+            store = Ext.StoreMgr.lookup(store);
+            store.on({
+                scope: this,
+                datachanged: this.refresh,
+                add: this.delayRefresh,
+                remove: this.delayRefresh,
+                update: this.delayRefresh,
+                clear: this.refresh
+            });
+        }
+        this.store = store;
+        if(store && !initial){
+            this.refresh();
+        }
+    },
+
+    onSwfReady : function(isReset){
+        Ext.chart.Chart.superclass.onSwfReady.call(this, isReset);
+        var ref;
+        this.swf.setType(this.type);
+
+        if(this.chartStyle){
+            this.setStyles(Ext.apply({}, this.extraStyle, this.chartStyle));
+        }
+
+        if(this.categoryNames){
+            this.setCategoryNames(this.categoryNames);
+        }
+
+        if(this.tipRenderer){
+            ref = this.getFunctionRef(this.tipRenderer);
+            this.setTipRenderer(ref.fn, ref.scope);
+        }
+        if(this.legendRenderer){
+            ref = this.getFunctionRef(this.legendRenderer);
+            this.setLegendRenderer(ref.fn, ref.scope);
+        }
+        if(!isReset){
+            this.bindStore(this.store, true);
+        }
+        this.refresh.defer(10, this);
+    },
+
+    delayRefresh : function(){
+        if(!this.refreshTask){
+            this.refreshTask = new Ext.util.DelayedTask(this.refresh, this);
+        }
+        this.refreshTask.delay(this.refreshBuffer);
+    },
+
+    refresh : function(){
+        if(this.fireEvent('beforerefresh', this) !== false){
+            var styleChanged = false;
+            
+            var data = [], rs = this.store.data.items;
+            for(var j = 0, len = rs.length; j < len; j++){
+                data[j] = rs[j].data;
+            }
+            
+            
+            var dataProvider = [];
+            var seriesCount = 0;
+            var currentSeries = null;
+            var i = 0;
+            if(this.series){
+                seriesCount = this.series.length;
+                for(i = 0; i < seriesCount; i++){
+                    currentSeries = this.series[i];
+                    var clonedSeries = {};
+                    for(var prop in currentSeries){
+                        if(prop == "style" && currentSeries.style !== null){
+                            clonedSeries.style = Ext.encode(currentSeries.style);
+                            styleChanged = true;
+                            
+                            
+                            
+                            
+                        } else{
+                            clonedSeries[prop] = currentSeries[prop];
+                        }
+                    }
+                    dataProvider.push(clonedSeries);
+                }
+            }
+
+            if(seriesCount > 0){
+                for(i = 0; i < seriesCount; i++){
+                    currentSeries = dataProvider[i];
+                    if(!currentSeries.type){
+                        currentSeries.type = this.type;
+                    }
+                    currentSeries.dataProvider = data;
+                }
+            } else{
+                dataProvider.push({type: this.type, dataProvider: data});
+            }
+            this.swf.setDataProvider(dataProvider);
+            if(this.seriesStyles){
+                this.setSeriesStyles(this.seriesStyles);
+            }
+            this.fireEvent('refresh', this);
+        }
+    },
+
+    
+    createFnProxy : function(fn){
+        var fnName = 'extFnProxy' + (++Ext.chart.Chart.PROXY_FN_ID);
+        Ext.chart.Chart.proxyFunction[fnName] = fn;
+        return 'Ext.chart.Chart.proxyFunction.' + fnName;
+    },
+
+    
+    removeFnProxy : function(fn){
+        if(!Ext.isEmpty(fn)){
+            fn = fn.replace('Ext.chart.Chart.proxyFunction.', '');
+            delete Ext.chart.Chart.proxyFunction[fn];
+        }
+    },
+
+    
+    getFunctionRef : function(val){
+        if(Ext.isFunction(val)){
+            return {
+                fn: val,
+                scope: this
+            };
+        }else{
+            return {
+                fn: val.fn,
+                scope: val.scope || this
+            };
+        }
+    },
+
+    
+    onDestroy: function(){
+        if (this.refreshTask && this.refreshTask.cancel){
+            this.refreshTask.cancel();
+        }
+        Ext.chart.Chart.superclass.onDestroy.call(this);
+        this.bindStore(null);
+        this.removeFnProxy(this.tipFnName);
+        this.removeFnProxy(this.legendFnName);
+    }
+});
+Ext.reg('chart', Ext.chart.Chart);
+Ext.chart.Chart.PROXY_FN_ID = 0;
+Ext.chart.Chart.proxyFunction = {};
+
+
+Ext.chart.Chart.CHART_URL = 'http:/' + '/yui.yahooapis.com/2.8.2/build/charts/assets/charts.swf';
+
+
+Ext.chart.PieChart = Ext.extend(Ext.chart.Chart, {
+    type: 'pie',
+
+    onSwfReady : function(isReset){
+        Ext.chart.PieChart.superclass.onSwfReady.call(this, isReset);
+
+        this.setDataField(this.dataField);
+        this.setCategoryField(this.categoryField);
+    },
+
+    setDataField : function(field){
+        this.dataField = field;
+        this.swf.setDataField(field);
+    },
+
+    setCategoryField : function(field){
+        this.categoryField = field;
+        this.swf.setCategoryField(field);
+    }
+});
+Ext.reg('piechart', Ext.chart.PieChart);
+
+
+Ext.chart.CartesianChart = Ext.extend(Ext.chart.Chart, {
+    onSwfReady : function(isReset){
+        Ext.chart.CartesianChart.superclass.onSwfReady.call(this, isReset);
+        this.labelFn = [];
+        if(this.xField){
+            this.setXField(this.xField);
+        }
+        if(this.yField){
+            this.setYField(this.yField);
+        }
+        if(this.xAxis){
+            this.setXAxis(this.xAxis);
+        }
+        if(this.xAxes){
+            this.setXAxes(this.xAxes);
+        }
+        if(this.yAxis){
+            this.setYAxis(this.yAxis);
+        }
+        if(this.yAxes){
+            this.setYAxes(this.yAxes);
+        }
+        if(Ext.isDefined(this.constrainViewport)){
+            this.swf.setConstrainViewport(this.constrainViewport);
+        }
+    },
+
+    setXField : function(value){
+        this.xField = value;
+        this.swf.setHorizontalField(value);
+    },
+
+    setYField : function(value){
+        this.yField = value;
+        this.swf.setVerticalField(value);
+    },
+
+    setXAxis : function(value){
+        this.xAxis = this.createAxis('xAxis', value);
+        this.swf.setHorizontalAxis(this.xAxis);
+    },
+
+    setXAxes : function(value){
+        var axis;
+        for(var i = 0; i < value.length; i++) {
+            axis = this.createAxis('xAxis' + i, value[i]);
+            this.swf.setHorizontalAxis(axis);
+        }
+    },
+
+    setYAxis : function(value){
+        this.yAxis = this.createAxis('yAxis', value);
+        this.swf.setVerticalAxis(this.yAxis);
+    },
+
+    setYAxes : function(value){
+        var axis;
+        for(var i = 0; i < value.length; i++) {
+            axis = this.createAxis('yAxis' + i, value[i]);
+            this.swf.setVerticalAxis(axis);
+        }
+    },
+
+    createAxis : function(axis, value){
+        var o = Ext.apply({}, value),
+            ref,
+            old;
+
+        if(this[axis]){
+            old = this[axis].labelFunction;
+            this.removeFnProxy(old);
+            this.labelFn.remove(old);
+        }
+        if(o.labelRenderer){
+            ref = this.getFunctionRef(o.labelRenderer);
+            o.labelFunction = this.createFnProxy(function(v){
+                return ref.fn.call(ref.scope, v);
+            });
+            delete o.labelRenderer;
+            this.labelFn.push(o.labelFunction);
+        }
+        if(axis.indexOf('xAxis') > -1 && o.position == 'left'){
+            o.position = 'bottom';
+        }
+        return o;
+    },
+
+    onDestroy : function(){
+        Ext.chart.CartesianChart.superclass.onDestroy.call(this);
+        Ext.each(this.labelFn, function(fn){
+            this.removeFnProxy(fn);
+        }, this);
+    }
+});
+Ext.reg('cartesianchart', Ext.chart.CartesianChart);
+
+
+Ext.chart.LineChart = Ext.extend(Ext.chart.CartesianChart, {
+    type: 'line'
+});
+Ext.reg('linechart', Ext.chart.LineChart);
+
+
+Ext.chart.ColumnChart = Ext.extend(Ext.chart.CartesianChart, {
+    type: 'column'
+});
+Ext.reg('columnchart', Ext.chart.ColumnChart);
+
+
+Ext.chart.StackedColumnChart = Ext.extend(Ext.chart.CartesianChart, {
+    type: 'stackcolumn'
+});
+Ext.reg('stackedcolumnchart', Ext.chart.StackedColumnChart);
+
+
+Ext.chart.BarChart = Ext.extend(Ext.chart.CartesianChart, {
+    type: 'bar'
+});
+Ext.reg('barchart', Ext.chart.BarChart);
+
+
+Ext.chart.StackedBarChart = Ext.extend(Ext.chart.CartesianChart, {
+    type: 'stackbar'
+});
+Ext.reg('stackedbarchart', Ext.chart.StackedBarChart);
+
+
+
+
+Ext.chart.Axis = function(config){
+    Ext.apply(this, config);
+};
+
+Ext.chart.Axis.prototype =
+{
+    
+    type: null,
+
+    
+    orientation: "horizontal",
+
+    
+    reverse: false,
+
+    
+    labelFunction: null,
+
+    
+    hideOverlappingLabels: true,
+
+    
+    labelSpacing: 2
+};
+
+
+Ext.chart.NumericAxis = Ext.extend(Ext.chart.Axis, {
+    type: "numeric",
+
+    
+    minimum: NaN,
+
+    
+    maximum: NaN,
+
+    
+    majorUnit: NaN,
+
+    
+    minorUnit: NaN,
+
+    
+    snapToUnits: true,
+
+    
+    alwaysShowZero: true,
+
+    
+    scale: "linear",
+
+    
+    roundMajorUnit: true,
+
+    
+    calculateByLabelSize: true,
+
+    
+    position: 'left',
+
+    
+    adjustMaximumByMajorUnit: true,
+
+    
+    adjustMinimumByMajorUnit: true
+
+});
+
+
+Ext.chart.TimeAxis = Ext.extend(Ext.chart.Axis, {
+    type: "time",
+
+    
+    minimum: null,
+
+    
+    maximum: null,
+
+    
+    majorUnit: NaN,
+
+    
+    majorTimeUnit: null,
+
+    
+    minorUnit: NaN,
+
+    
+    minorTimeUnit: null,
+
+    
+    snapToUnits: true,
+
+    
+    stackingEnabled: false,
+
+    
+    calculateByLabelSize: true
+
+});
+
+
+Ext.chart.CategoryAxis = Ext.extend(Ext.chart.Axis, {
+    type: "category",
+
+    
+    categoryNames: null,
+
+    
+    calculateCategoryCount: false
+
+});
+
+
+Ext.chart.Series = function(config) { Ext.apply(this, config); };
+
+Ext.chart.Series.prototype =
+{
+    
+    type: null,
+
+    
+    displayName: null
+};
+
+
+Ext.chart.CartesianSeries = Ext.extend(Ext.chart.Series, {
+    
+    xField: null,
+
+    
+    yField: null,
+
+    
+    showInLegend: true,
+
+    
+    axis: 'primary'
+});
+
+
+Ext.chart.ColumnSeries = Ext.extend(Ext.chart.CartesianSeries, {
+    type: "column"
+});
+
+
+Ext.chart.LineSeries = Ext.extend(Ext.chart.CartesianSeries, {
+    type: "line"
+});
+
+
+Ext.chart.BarSeries = Ext.extend(Ext.chart.CartesianSeries, {
+    type: "bar"
+});
+
+
+
+Ext.chart.PieSeries = Ext.extend(Ext.chart.Series, {
+    type: "pie",
+    dataField: null,
+    categoryField: null
+});
+Ext.menu.Menu = Ext.extend(Ext.Container, {
+    
+    
+    
+    minWidth : 120,
+    
+    shadow : 'sides',
+    
+    subMenuAlign : 'tl-tr?',
+    
+    defaultAlign : 'tl-bl?',
+    
+    allowOtherMenus : false,
+    
+    ignoreParentClicks : false,
+    
+    enableScrolling : true,
+    
+    maxHeight : null,
+    
+    scrollIncrement : 24,
+    
+    showSeparator : true,
+    
+    defaultOffsets : [0, 0],
+
+    
+    plain : false,
+
+    
+    floating : true,
+
+
+    
+    zIndex: 15000,
+
+    
+    hidden : true,
+
+    
+    layout : 'menu',
+    hideMode : 'offsets',    
+    scrollerHeight : 8,
+    autoLayout : true,       
+    defaultType : 'menuitem',
+    bufferResize : false,
+
+    initComponent : function(){
+        if(Ext.isArray(this.initialConfig)){
+            Ext.apply(this, {items:this.initialConfig});
+        }
+        this.addEvents(
+            
+            'click',
+            
+            'mouseover',
+            
+            'mouseout',
+            
+            'itemclick'
+        );
+        Ext.menu.MenuMgr.register(this);
+        if(this.floating){
+            Ext.EventManager.onWindowResize(this.hide, this);
+        }else{
+            if(this.initialConfig.hidden !== false){
+                this.hidden = false;
+            }
+            this.internalDefaults = {hideOnClick: false};
+        }
+        Ext.menu.Menu.superclass.initComponent.call(this);
+        if(this.autoLayout){
+            var fn = this.doLayout.createDelegate(this, []);
+            this.on({
+                add: fn,
+                remove: fn
+            });
+        }
+    },
+
+    
+    getLayoutTarget : function() {
+        return this.ul;
+    },
+
+    
+    onRender : function(ct, position){
+        if(!ct){
+            ct = Ext.getBody();
+        }
+
+        var dh = {
+            id: this.getId(),
+            cls: 'x-menu ' + ((this.floating) ? 'x-menu-floating x-layer ' : '') + (this.cls || '') + (this.plain ? ' x-menu-plain' : '') + (this.showSeparator ? '' : ' x-menu-nosep'),
+            style: this.style,
+            cn: [
+                {tag: 'a', cls: 'x-menu-focus', href: '#', onclick: 'return false;', tabIndex: '-1'},
+                {tag: 'ul', cls: 'x-menu-list'}
+            ]
+        };
+        if(this.floating){
+            this.el = new Ext.Layer({
+                shadow: this.shadow,
+                dh: dh,
+                constrain: false,
+                parentEl: ct,
+                zindex: this.zIndex
+            });
+        }else{
+            this.el = ct.createChild(dh);
+        }
+        Ext.menu.Menu.superclass.onRender.call(this, ct, position);
+
+        if(!this.keyNav){
+            this.keyNav = new Ext.menu.MenuNav(this);
+        }
+        
+        this.focusEl = this.el.child('a.x-menu-focus');
+        this.ul = this.el.child('ul.x-menu-list');
+        this.mon(this.ul, {
+            scope: this,
+            click: this.onClick,
+            mouseover: this.onMouseOver,
+            mouseout: this.onMouseOut
+        });
+        if(this.enableScrolling){
+            this.mon(this.el, {
+                scope: this,
+                delegate: '.x-menu-scroller',
+                click: this.onScroll,
+                mouseover: this.deactivateActive
+            });
+        }
+    },
+
+    
+    findTargetItem : function(e){
+        var t = e.getTarget('.x-menu-list-item', this.ul, true);
+        if(t && t.menuItemId){
+            return this.items.get(t.menuItemId);
+        }
+    },
+
+    
+    onClick : function(e){
+        var t = this.findTargetItem(e);
+        if(t){
+            if(t.isFormField){
+                this.setActiveItem(t);
+            }else if(t instanceof Ext.menu.BaseItem){
+                if(t.menu && this.ignoreParentClicks){
+                    t.expandMenu();
+                    e.preventDefault();
+                }else if(t.onClick){
+                    t.onClick(e);
+                    this.fireEvent('click', this, t, e);
+                }
+            }
+        }
+    },
+
+    
+    setActiveItem : function(item, autoExpand){
+        if(item != this.activeItem){
+            this.deactivateActive();
+            if((this.activeItem = item).isFormField){
+                item.focus();
+            }else{
+                item.activate(autoExpand);
+            }
+        }else if(autoExpand){
+            item.expandMenu();
+        }
+    },
+
+    deactivateActive : function(){
+        var a = this.activeItem;
+        if(a){
+            if(a.isFormField){
+                
+                if(a.collapse){
+                    a.collapse();
+                }
+            }else{
+                a.deactivate();
+            }
+            delete this.activeItem;
+        }
+    },
+
+    
+    tryActivate : function(start, step){
+        var items = this.items;
+        for(var i = start, len = items.length; i >= 0 && i < len; i+= step){
+            var item = items.get(i);
+            if(item.isVisible() && !item.disabled && (item.canActivate || item.isFormField)){
+                this.setActiveItem(item, false);
+                return item;
+            }
+        }
+        return false;
+    },
+
+    
+    onMouseOver : function(e){
+        var t = this.findTargetItem(e);
+        if(t){
+            if(t.canActivate && !t.disabled){
+                this.setActiveItem(t, true);
+            }
+        }
+        this.over = true;
+        this.fireEvent('mouseover', this, e, t);
+    },
+
+    
+    onMouseOut : function(e){
+        var t = this.findTargetItem(e);
+        if(t){
+            if(t == this.activeItem && t.shouldDeactivate && t.shouldDeactivate(e)){
+                this.activeItem.deactivate();
+                delete this.activeItem;
+            }
+        }
+        this.over = false;
+        this.fireEvent('mouseout', this, e, t);
+    },
+
+    
+    onScroll : function(e, t){
+        if(e){
+            e.stopEvent();
+        }
+        var ul = this.ul.dom, top = Ext.fly(t).is('.x-menu-scroller-top');
+        ul.scrollTop += this.scrollIncrement * (top ? -1 : 1);
+        if(top ? ul.scrollTop <= 0 : ul.scrollTop + this.activeMax >= ul.scrollHeight){
+           this.onScrollerOut(null, t);
+        }
+    },
+
+    
+    onScrollerIn : function(e, t){
+        var ul = this.ul.dom, top = Ext.fly(t).is('.x-menu-scroller-top');
+        if(top ? ul.scrollTop > 0 : ul.scrollTop + this.activeMax < ul.scrollHeight){
+            Ext.fly(t).addClass(['x-menu-item-active', 'x-menu-scroller-active']);
+        }
+    },
+
+    
+    onScrollerOut : function(e, t){
+        Ext.fly(t).removeClass(['x-menu-item-active', 'x-menu-scroller-active']);
+    },
+
+    
+    show : function(el, pos, parentMenu){
+        if(this.floating){
+            this.parentMenu = parentMenu;
+            if(!this.el){
+                this.render();
+                this.doLayout(false, true);
+            }
+            this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign, this.defaultOffsets), parentMenu);
+        }else{
+            Ext.menu.Menu.superclass.show.call(this);
+        }
+    },
+
+    
+    showAt : function(xy, parentMenu){
+        if(this.fireEvent('beforeshow', this) !== false){
+            this.parentMenu = parentMenu;
+            if(!this.el){
+                this.render();
+            }
+            if(this.enableScrolling){
+                
+                this.el.setXY(xy);
+                
+                xy[1] = this.constrainScroll(xy[1]);
+                xy = [this.el.adjustForConstraints(xy)[0], xy[1]];
+            }else{
+                
+                xy = this.el.adjustForConstraints(xy);
+            }
+            this.el.setXY(xy);
+            this.el.show();
+            Ext.menu.Menu.superclass.onShow.call(this);
+            if(Ext.isIE){
+                
+                this.fireEvent('autosize', this);
+                if(!Ext.isIE8){
+                    this.el.repaint();
+                }
+            }
+            this.hidden = false;
+            this.focus();
+            this.fireEvent('show', this);
+        }
+    },
+
+    constrainScroll : function(y){
+        var max, full = this.ul.setHeight('auto').getHeight(),
+            returnY = y, normalY, parentEl, scrollTop, viewHeight;
+        if(this.floating){
+            parentEl = Ext.fly(this.el.dom.parentNode);
+            scrollTop = parentEl.getScroll().top;
+            viewHeight = parentEl.getViewSize().height;
+            
+            
+            normalY = y - scrollTop;
+            max = this.maxHeight ? this.maxHeight : viewHeight - normalY;
+            if(full > viewHeight) {
+                max = viewHeight;
+                
+                returnY = y - normalY;
+            } else if(max < full) {
+                returnY = y - (full - max);
+                max = full;
+            }
+        }else{
+            max = this.getHeight();
+        }
+        
+        if (this.maxHeight){
+            max = Math.min(this.maxHeight, max);
+        }
+        if(full > max && max > 0){
+            this.activeMax = max - this.scrollerHeight * 2 - this.el.getFrameWidth('tb') - Ext.num(this.el.shadowOffset, 0);
+            this.ul.setHeight(this.activeMax);
+            this.createScrollers();
+            this.el.select('.x-menu-scroller').setDisplayed('');
+        }else{
+            this.ul.setHeight(full);
+            this.el.select('.x-menu-scroller').setDisplayed('none');
+        }
+        this.ul.dom.scrollTop = 0;
+        return returnY;
+    },
+
+    createScrollers : function(){
+        if(!this.scroller){
+            this.scroller = {
+                pos: 0,
+                top: this.el.insertFirst({
+                    tag: 'div',
+                    cls: 'x-menu-scroller x-menu-scroller-top',
+                    html: '&#160;'
+                }),
+                bottom: this.el.createChild({
+                    tag: 'div',
+                    cls: 'x-menu-scroller x-menu-scroller-bottom',
+                    html: '&#160;'
+                })
+            };
+            this.scroller.top.hover(this.onScrollerIn, this.onScrollerOut, this);
+            this.scroller.topRepeater = new Ext.util.ClickRepeater(this.scroller.top, {
+                listeners: {
+                    click: this.onScroll.createDelegate(this, [null, this.scroller.top], false)
+                }
+            });
+            this.scroller.bottom.hover(this.onScrollerIn, this.onScrollerOut, this);
+            this.scroller.bottomRepeater = new Ext.util.ClickRepeater(this.scroller.bottom, {
+                listeners: {
+                    click: this.onScroll.createDelegate(this, [null, this.scroller.bottom], false)
+                }
+            });
+        }
+    },
+
+    onLayout : function(){
+        if(this.isVisible()){
+            if(this.enableScrolling){
+                this.constrainScroll(this.el.getTop());
+            }
+            if(this.floating){
+                this.el.sync();
+            }
+        }
+    },
+
+    focus : function(){
+        if(!this.hidden){
+            this.doFocus.defer(50, this);
+        }
+    },
+
+    doFocus : function(){
+        if(!this.hidden){
+            this.focusEl.focus();
+        }
+    },
+
+    
+    hide : function(deep){
+        if (!this.isDestroyed) {
+            this.deepHide = deep;
+            Ext.menu.Menu.superclass.hide.call(this);
+            delete this.deepHide;
+        }
+    },
+
+    
+    onHide : function(){
+        Ext.menu.Menu.superclass.onHide.call(this);
+        this.deactivateActive();
+        if(this.el && this.floating){
+            this.el.hide();
+        }
+        var pm = this.parentMenu;
+        if(this.deepHide === true && pm){
+            if(pm.floating){
+                pm.hide(true);
+            }else{
+                pm.deactivateActive();
+            }
+        }
+    },
+
+    
+    lookupComponent : function(c){
+         if(Ext.isString(c)){
+            c = (c == 'separator' || c == '-') ? new Ext.menu.Separator() : new Ext.menu.TextItem(c);
+             this.applyDefaults(c);
+         }else{
+            if(Ext.isObject(c)){
+                c = this.getMenuItem(c);
+            }else if(c.tagName || c.el){ 
+                c = new Ext.BoxComponent({
+                    el: c
+                });
+            }
+         }
+         return c;
+    },
+
+    applyDefaults : function(c) {
+        if (!Ext.isString(c)) {
+            c = Ext.menu.Menu.superclass.applyDefaults.call(this, c);
+            var d = this.internalDefaults;
+            if(d){
+                if(c.events){
+                    Ext.applyIf(c.initialConfig, d);
+                    Ext.apply(c, d);
+                }else{
+                    Ext.applyIf(c, d);
+                }
+            }
+        }
+        return c;
+    },
+
+    
+    getMenuItem : function(config) {
+        if (!config.isXType) {
+            if (!config.xtype && Ext.isBoolean(config.checked)) {
+                return new Ext.menu.CheckItem(config);
+            }
+            return Ext.create(config, this.defaultType);
+        }
+        return config;
+    },
+
+    
+    addSeparator : function() {
+        return this.add(new Ext.menu.Separator());
+    },
+
+    
+    addElement : function(el) {
+        return this.add(new Ext.menu.BaseItem({
+            el: el
+        }));
+    },
+
+    
+    addItem : function(item) {
+        return this.add(item);
+    },
+
+    
+    addMenuItem : function(config) {
+        return this.add(this.getMenuItem(config));
+    },
+
+    
+    addText : function(text){
+        return this.add(new Ext.menu.TextItem(text));
+    },
+
+    
+    onDestroy : function(){
+        Ext.EventManager.removeResizeListener(this.hide, this);
+        var pm = this.parentMenu;
+        if(pm && pm.activeChild == this){
+            delete pm.activeChild;
+        }
+        delete this.parentMenu;
+        Ext.menu.Menu.superclass.onDestroy.call(this);
+        Ext.menu.MenuMgr.unregister(this);
+        if(this.keyNav) {
+            this.keyNav.disable();
+        }
+        var s = this.scroller;
+        if(s){
+            Ext.destroy(s.topRepeater, s.bottomRepeater, s.top, s.bottom);
+        }
+        Ext.destroy(
+            this.el,
+            this.focusEl,
+            this.ul
+        );
+    }
+});
+
+Ext.reg('menu', Ext.menu.Menu);
+
+
+Ext.menu.MenuNav = Ext.extend(Ext.KeyNav, function(){
+    function up(e, m){
+        if(!m.tryActivate(m.items.indexOf(m.activeItem)-1, -1)){
+            m.tryActivate(m.items.length-1, -1);
+        }
+    }
+    function down(e, m){
+        if(!m.tryActivate(m.items.indexOf(m.activeItem)+1, 1)){
+            m.tryActivate(0, 1);
+        }
+    }
+    return {
+        constructor : function(menu){
+            Ext.menu.MenuNav.superclass.constructor.call(this, menu.el);
+            this.scope = this.menu = menu;
+        },
+
+        doRelay : function(e, h){
+            var k = e.getKey();
+
+            if (this.menu.activeItem && this.menu.activeItem.isFormField && k != e.TAB) {
+                return false;
+            }
+            if(!this.menu.activeItem && e.isNavKeyPress() && k != e.SPACE && k != e.RETURN){
+                this.menu.tryActivate(0, 1);
+                return false;
+            }
+            return h.call(this.scope || this, e, this.menu);
+        },
+
+        tab: function(e, m) {
+            e.stopEvent();
+            if (e.shiftKey) {
+                up(e, m);
+            } else {
+                down(e, m);
+            }
+        },
+
+        up : up,
+
+        down : down,
+
+        right : function(e, m){
+            if(m.activeItem){
+                m.activeItem.expandMenu(true);
+            }
+        },
+
+        left : function(e, m){
+            m.hide();
+            if(m.parentMenu && m.parentMenu.activeItem){
+                m.parentMenu.activeItem.activate();
+            }
+        },
+
+        enter : function(e, m){
+            if(m.activeItem){
+                e.stopPropagation();
+                m.activeItem.onClick(e);
+                m.fireEvent('click', this, m.activeItem);
+                return true;
+            }
+        }
+    };
+}());
+
+Ext.menu.MenuMgr = function(){
+   var menus, active, groups = {}, attached = false, lastShow = new Date();
+
+   
+   function init(){
+       menus = {};
+       active = new Ext.util.MixedCollection();
+       Ext.getDoc().addKeyListener(27, function(){
+           if(active.length > 0){
+               hideAll();
+           }
+       });
+   }
+
+   
+   function hideAll(){
+       if(active && active.length > 0){
+           var c = active.clone();
+           c.each(function(m){
+               m.hide();
+           });
+           return true;
+       }
+       return false;
+   }
+
+   
+   function onHide(m){
+       active.remove(m);
+       if(active.length < 1){
+           Ext.getDoc().un("mousedown", onMouseDown);
+           attached = false;
+       }
+   }
+
+   
+   function onShow(m){
+       var last = active.last();
+       lastShow = new Date();
+       active.add(m);
+       if(!attached){
+           Ext.getDoc().on("mousedown", onMouseDown);
+           attached = true;
+       }
+       if(m.parentMenu){
+          m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);
+          m.parentMenu.activeChild = m;
+       }else if(last && !last.isDestroyed && last.isVisible()){
+          m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);
+       }
+   }
+
+   
+   function onBeforeHide(m){
+       if(m.activeChild){
+           m.activeChild.hide();
+       }
+       if(m.autoHideTimer){
+           clearTimeout(m.autoHideTimer);
+           delete m.autoHideTimer;
+       }
+   }
+
+   
+   function onBeforeShow(m){
+       var pm = m.parentMenu;
+       if(!pm && !m.allowOtherMenus){
+           hideAll();
+       }else if(pm && pm.activeChild){
+           pm.activeChild.hide();
+       }
+   }
+
+   
+   function onMouseDown(e){
+       if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){
+           hideAll();
+       }
+   }
+
+   return {
+
+       
+       hideAll : function(){
+            return hideAll();
+       },
+
+       
+       register : function(menu){
+           if(!menus){
+               init();
+           }
+           menus[menu.id] = menu;
+           menu.on({
+               beforehide: onBeforeHide,
+               hide: onHide,
+               beforeshow: onBeforeShow,
+               show: onShow
+           });
+       },
+
+        
+       get : function(menu){
+           if(typeof menu == "string"){ 
+               if(!menus){  
+                   return null;
+               }
+               return menus[menu];
+           }else if(menu.events){  
+               return menu;
+           }else if(typeof menu.length == 'number'){ 
+               return new Ext.menu.Menu({items:menu});
+           }else{ 
+               return Ext.create(menu, 'menu');
+           }
+       },
+
+       
+       unregister : function(menu){
+           delete menus[menu.id];
+           menu.un("beforehide", onBeforeHide);
+           menu.un("hide", onHide);
+           menu.un("beforeshow", onBeforeShow);
+           menu.un("show", onShow);
+       },
+
+       
+       registerCheckable : function(menuItem){
+           var g = menuItem.group;
+           if(g){
+               if(!groups[g]){
+                   groups[g] = [];
+               }
+               groups[g].push(menuItem);
+           }
+       },
+
+       
+       unregisterCheckable : function(menuItem){
+           var g = menuItem.group;
+           if(g){
+               groups[g].remove(menuItem);
+           }
+       },
+       
+       
+       onCheckChange: function(item, state){
+           if(item.group && state){
+               var group = groups[item.group],
+                   i = 0,
+                   len = group.length,
+                   current;
+                   
+               for(; i < len; i++){
+                   current = group[i];
+                   if(current != item){
+                       current.setChecked(false);
+                   }
+               }
+           }
+       },
+
+       getCheckedItem : function(groupId){
+           var g = groups[groupId];
+           if(g){
+               for(var i = 0, l = g.length; i < l; i++){
+                   if(g[i].checked){
+                       return g[i];
+                   }
+               }
+           }
+           return null;
+       },
+
+       setCheckedItem : function(groupId, itemId){
+           var g = groups[groupId];
+           if(g){
+               for(var i = 0, l = g.length; i < l; i++){
+                   if(g[i].id == itemId){
+                       g[i].setChecked(true);
+                   }
+               }
+           }
+           return null;
+       }
+   };
+}();
+
+Ext.menu.BaseItem = Ext.extend(Ext.Component, {
+    
+    
+    
+    
+    canActivate : false,
+    
+    activeClass : "x-menu-item-active",
+    
+    hideOnClick : true,
+    
+    clickHideDelay : 1,
+
+    
+    ctype : "Ext.menu.BaseItem",
+
+    
+    actionMode : "container",
+
+    initComponent : function(){
+        Ext.menu.BaseItem.superclass.initComponent.call(this);
+        this.addEvents(
+            
+            'click',
+            
+            'activate',
+            
+            'deactivate'
+        );
+        if(this.handler){
+            this.on("click", this.handler, this.scope);
+        }
+    },
+
+    
+    onRender : function(container, position){
+        Ext.menu.BaseItem.superclass.onRender.apply(this, arguments);
+        if(this.ownerCt && this.ownerCt instanceof Ext.menu.Menu){
+            this.parentMenu = this.ownerCt;
+        }else{
+            this.container.addClass('x-menu-list-item');
+            this.mon(this.el, {
+                scope: this,
+                click: this.onClick,
+                mouseenter: this.activate,
+                mouseleave: this.deactivate
+            });
+        }
+    },
+
+    
+    setHandler : function(handler, scope){
+        if(this.handler){
+            this.un("click", this.handler, this.scope);
+        }
+        this.on("click", this.handler = handler, this.scope = scope);
+    },
+
+    
+    onClick : function(e){
+        if(!this.disabled && this.fireEvent("click", this, e) !== false
+                && (this.parentMenu && this.parentMenu.fireEvent("itemclick", this, e) !== false)){
+            this.handleClick(e);
+        }else{
+            e.stopEvent();
+        }
+    },
+
+    
+    activate : function(){
+        if(this.disabled){
+            return false;
+        }
+        var li = this.container;
+        li.addClass(this.activeClass);
+        this.region = li.getRegion().adjust(2, 2, -2, -2);
+        this.fireEvent("activate", this);
+        return true;
+    },
+
+    
+    deactivate : function(){
+        this.container.removeClass(this.activeClass);
+        this.fireEvent("deactivate", this);
+    },
+
+    
+    shouldDeactivate : function(e){
+        return !this.region || !this.region.contains(e.getPoint());
+    },
+
+    
+    handleClick : function(e){
+        var pm = this.parentMenu;
+        if(this.hideOnClick){
+            if(pm.floating){
+                pm.hide.defer(this.clickHideDelay, pm, [true]);
+            }else{
+                pm.deactivateActive();
+            }
+        }
+    },
+
+    
+    expandMenu : Ext.emptyFn,
+
+    
+    hideMenu : Ext.emptyFn
+});
+Ext.reg('menubaseitem', Ext.menu.BaseItem);
+Ext.menu.TextItem = Ext.extend(Ext.menu.BaseItem, {
+    
+    
+    hideOnClick : false,
+    
+    itemCls : "x-menu-text",
+    
+    constructor : function(config) {
+        if (typeof config == 'string') {
+            config = {
+                text: config
+            };
+        }
+        Ext.menu.TextItem.superclass.constructor.call(this, config);
+    },
+
+    
+    onRender : function() {
+        var s = document.createElement("span");
+        s.className = this.itemCls;
+        s.innerHTML = this.text;
+        this.el = s;
+        Ext.menu.TextItem.superclass.onRender.apply(this, arguments);
+    }
+});
+Ext.reg('menutextitem', Ext.menu.TextItem);
+Ext.menu.Separator = Ext.extend(Ext.menu.BaseItem, {
+    
+    itemCls : "x-menu-sep",
+    
+    hideOnClick : false,
+    
+    
+    activeClass: '',
+
+    
+    onRender : function(li){
+        var s = document.createElement("span");
+        s.className = this.itemCls;
+        s.innerHTML = "&#160;";
+        this.el = s;
+        li.addClass("x-menu-sep-li");
+        Ext.menu.Separator.superclass.onRender.apply(this, arguments);
+    }
+});
+Ext.reg('menuseparator', Ext.menu.Separator);
+Ext.menu.Item = Ext.extend(Ext.menu.BaseItem, {
+    
+    
+    
+    
+    
+    
+    
+    
+    itemCls : 'x-menu-item',
+    
+    canActivate : true,
+    
+    showDelay: 200,
+    
+    
+    altText: '',
+    
+    
+    hideDelay: 200,
+
+    
+    ctype: 'Ext.menu.Item',
+
+    initComponent : function(){
+        Ext.menu.Item.superclass.initComponent.call(this);
+        if(this.menu){
+            this.menu = Ext.menu.MenuMgr.get(this.menu);
+            this.menu.ownerCt = this;
+        }
+    },
+
+    
+    onRender : function(container, position){
+        if (!this.itemTpl) {
+            this.itemTpl = Ext.menu.Item.prototype.itemTpl = new Ext.XTemplate(
+                '<a id="{id}" class="{cls}" hidefocus="true" unselectable="on" href="{href}"',
+                    '<tpl if="hrefTarget">',
+                        ' target="{hrefTarget}"',
+                    '</tpl>',
+                 '>',
+                     '<img alt="{altText}" src="{icon}" class="x-menu-item-icon {iconCls}"/>',
+                     '<span class="x-menu-item-text">{text}</span>',
+                 '</a>'
+             );
+        }
+        var a = this.getTemplateArgs();
+        this.el = position ? this.itemTpl.insertBefore(position, a, true) : this.itemTpl.append(container, a, true);
+        this.iconEl = this.el.child('img.x-menu-item-icon');
+        this.textEl = this.el.child('.x-menu-item-text');
+        if(!this.href) { 
+            this.mon(this.el, 'click', Ext.emptyFn, null, { preventDefault: true });
+        }
+        Ext.menu.Item.superclass.onRender.call(this, container, position);
+    },
+
+    getTemplateArgs: function() {
+        return {
+            id: this.id,
+            cls: this.itemCls + (this.menu ?  ' x-menu-item-arrow' : '') + (this.cls ?  ' ' + this.cls : ''),
+            href: this.href || '#',
+            hrefTarget: this.hrefTarget,
+            icon: this.icon || Ext.BLANK_IMAGE_URL,
+            iconCls: this.iconCls || '',
+            text: this.itemText||this.text||'&#160;',
+            altText: this.altText || ''
+        };
+    },
+
+    
+    setText : function(text){
+        this.text = text||'&#160;';
+        if(this.rendered){
+            this.textEl.update(this.text);
+            this.parentMenu.layout.doAutoSize();
+        }
+    },
+
+    
+    setIconClass : function(cls){
+        var oldCls = this.iconCls;
+        this.iconCls = cls;
+        if(this.rendered){
+            this.iconEl.replaceClass(oldCls, this.iconCls);
+        }
+    },
+
+    
+    beforeDestroy: function(){
+        if (this.menu){
+            delete this.menu.ownerCt;
+            this.menu.destroy();
+        }
+        Ext.menu.Item.superclass.beforeDestroy.call(this);
+    },
+
+    
+    handleClick : function(e){
+        if(!this.href){ 
+            e.stopEvent();
+        }
+        Ext.menu.Item.superclass.handleClick.apply(this, arguments);
+    },
+
+    
+    activate : function(autoExpand){
+        if(Ext.menu.Item.superclass.activate.apply(this, arguments)){
+            this.focus();
+            if(autoExpand){
+                this.expandMenu();
+            }
+        }
+        return true;
+    },
+
+    
+    shouldDeactivate : function(e){
+        if(Ext.menu.Item.superclass.shouldDeactivate.call(this, e)){
+            if(this.menu && this.menu.isVisible()){
+                return !this.menu.getEl().getRegion().contains(e.getPoint());
+            }
+            return true;
+        }
+        return false;
+    },
+
+    
+    deactivate : function(){
+        Ext.menu.Item.superclass.deactivate.apply(this, arguments);
+        this.hideMenu();
+    },
+
+    
+    expandMenu : function(autoActivate){
+        if(!this.disabled && this.menu){
+            clearTimeout(this.hideTimer);
+            delete this.hideTimer;
+            if(!this.menu.isVisible() && !this.showTimer){
+                this.showTimer = this.deferExpand.defer(this.showDelay, this, [autoActivate]);
+            }else if (this.menu.isVisible() && autoActivate){
+                this.menu.tryActivate(0, 1);
+            }
+        }
+    },
+
+    
+    deferExpand : function(autoActivate){
+        delete this.showTimer;
+        this.menu.show(this.container, this.parentMenu.subMenuAlign || 'tl-tr?', this.parentMenu);
+        if(autoActivate){
+            this.menu.tryActivate(0, 1);
+        }
+    },
+
+    
+    hideMenu : function(){
+        clearTimeout(this.showTimer);
+        delete this.showTimer;
+        if(!this.hideTimer && this.menu && this.menu.isVisible()){
+            this.hideTimer = this.deferHide.defer(this.hideDelay, this);
+        }
+    },
+
+    
+    deferHide : function(){
+        delete this.hideTimer;
+        if(this.menu.over){
+            this.parentMenu.setActiveItem(this, false);
+        }else{
+            this.menu.hide();
+        }
+    }
+});
+Ext.reg('menuitem', Ext.menu.Item);
+Ext.menu.CheckItem = Ext.extend(Ext.menu.Item, {
+    
+    
+    itemCls : "x-menu-item x-menu-check-item",
+    
+    groupClass : "x-menu-group-item",
+
+    
+    checked: false,
+
+    
+    ctype: "Ext.menu.CheckItem",
+    
+    initComponent : function(){
+        Ext.menu.CheckItem.superclass.initComponent.call(this);
+           this.addEvents(
+               
+               "beforecheckchange" ,
+               
+               "checkchange"
+           );
+           
+           if(this.checkHandler){
+               this.on('checkchange', this.checkHandler, this.scope);
+           }
+           Ext.menu.MenuMgr.registerCheckable(this);
+    },
+
+    
+    onRender : function(c){
+        Ext.menu.CheckItem.superclass.onRender.apply(this, arguments);
+        if(this.group){
+            this.el.addClass(this.groupClass);
+        }
+        if(this.checked){
+            this.checked = false;
+            this.setChecked(true, true);
+        }
+    },
+
+    
+    destroy : function(){
+        Ext.menu.MenuMgr.unregisterCheckable(this);
+        Ext.menu.CheckItem.superclass.destroy.apply(this, arguments);
+    },
+
+    
+    setChecked : function(state, suppressEvent){
+        var suppress = suppressEvent === true;
+        if(this.checked != state && (suppress || this.fireEvent("beforecheckchange", this, state) !== false)){
+            Ext.menu.MenuMgr.onCheckChange(this, state);
+            if(this.container){
+                this.container[state ? "addClass" : "removeClass"]("x-menu-item-checked");
+            }
+            this.checked = state;
+            if(!suppress){
+                this.fireEvent("checkchange", this, state);
+            }
+        }
+    },
+
+    
+    handleClick : function(e){
+       if(!this.disabled && !(this.checked && this.group)){
+           this.setChecked(!this.checked);
+       }
+       Ext.menu.CheckItem.superclass.handleClick.apply(this, arguments);
+    }
+});
+Ext.reg('menucheckitem', Ext.menu.CheckItem);
+ Ext.menu.DateMenu = Ext.extend(Ext.menu.Menu, {
+    
+    enableScrolling : false,
+    
+        
+    
+    hideOnClick : true,
+    
+    
+    pickerId : null,
+    
+    
+    
+    
+    cls : 'x-date-menu',
+    
+    
+    
+    
+
+    initComponent : function(){
+        this.on('beforeshow', this.onBeforeShow, this);
+        if(this.strict = (Ext.isIE7 && Ext.isStrict)){
+            this.on('show', this.onShow, this, {single: true, delay: 20});
+        }
+        Ext.apply(this, {
+            plain: true,
+            showSeparator: false,
+            items: this.picker = new Ext.DatePicker(Ext.applyIf({
+                internalRender: this.strict || !Ext.isIE,
+                ctCls: 'x-menu-date-item',
+                id: this.pickerId
+            }, this.initialConfig))
+        });
+        this.picker.purgeListeners();
+        Ext.menu.DateMenu.superclass.initComponent.call(this);
+        
+        this.relayEvents(this.picker, ['select']);
+        this.on('show', this.picker.focus, this.picker);
+        this.on('select', this.menuHide, this);
+        if(this.handler){
+            this.on('select', this.handler, this.scope || this);
+        }
+    },
+
+    menuHide : function() {
+        if(this.hideOnClick){
+            this.hide(true);
+        }
+    },
+
+    onBeforeShow : function(){
+        if(this.picker){
+            this.picker.hideMonthPicker(true);
+        }
+    },
+
+    onShow : function(){
+        var el = this.picker.getEl();
+        el.setWidth(el.getWidth()); 
+    }
+ });
+ Ext.reg('datemenu', Ext.menu.DateMenu);
+ Ext.menu.ColorMenu = Ext.extend(Ext.menu.Menu, {
+    
+    enableScrolling : false,
+    
+        
+    
+    
+    hideOnClick : true,
+    
+    cls : 'x-color-menu',
+    
+    
+    paletteId : null,
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    initComponent : function(){
+        Ext.apply(this, {
+            plain: true,
+            showSeparator: false,
+            items: this.palette = new Ext.ColorPalette(Ext.applyIf({
+                id: this.paletteId
+            }, this.initialConfig))
+        });
+        this.palette.purgeListeners();
+        Ext.menu.ColorMenu.superclass.initComponent.call(this);
+        
+        this.relayEvents(this.palette, ['select']);
+        this.on('select', this.menuHide, this);
+        if(this.handler){
+            this.on('select', this.handler, this.scope || this);
+        }
+    },
+
+    menuHide : function(){
+        if(this.hideOnClick){
+            this.hide(true);
+        }
+    }
+});
+Ext.reg('colormenu', Ext.menu.ColorMenu);
+
+Ext.form.Field = Ext.extend(Ext.BoxComponent,  {
+    
+    
+    
+    
+    
+    
+
+    
+    invalidClass : 'x-form-invalid',
+    
+    invalidText : 'The value in this field is invalid',
+    
+    focusClass : 'x-form-focus',
+    
+    
+    validationEvent : 'keyup',
+    
+    validateOnBlur : true,
+    
+    validationDelay : 250,
+    
+    defaultAutoCreate : {tag: 'input', type: 'text', size: '20', autocomplete: 'off'},
+    
+    fieldClass : 'x-form-field',
+    
+    msgTarget : 'qtip',
+    
+    msgFx : 'normal',
+    
+    readOnly : false,
+    
+    disabled : false,
+    
+    submitValue: true,
+
+    
+    isFormField : true,
+
+    
+    msgDisplay: '',
+
+    
+    hasFocus : false,
+
+    
+    initComponent : function(){
+        Ext.form.Field.superclass.initComponent.call(this);
+        this.addEvents(
+            
+            'focus',
+            
+            'blur',
+            
+            'specialkey',
+            
+            'change',
+            
+            'invalid',
+            
+            'valid'
+        );
+    },
+
+    
+    getName : function(){
+        return this.rendered && this.el.dom.name ? this.el.dom.name : this.name || this.id || '';
+    },
+
+    
+    onRender : function(ct, position){
+        if(!this.el){
+            var cfg = this.getAutoCreate();
+
+            if(!cfg.name){
+                cfg.name = this.name || this.id;
+            }
+            if(this.inputType){
+                cfg.type = this.inputType;
+            }
+            this.autoEl = cfg;
+        }
+        Ext.form.Field.superclass.onRender.call(this, ct, position);
+        if(this.submitValue === false){
+            this.el.dom.removeAttribute('name');
+        }
+        var type = this.el.dom.type;
+        if(type){
+            if(type == 'password'){
+                type = 'text';
+            }
+            this.el.addClass('x-form-'+type);
+        }
+        if(this.readOnly){
+            this.setReadOnly(true);
+        }
+        if(this.tabIndex !== undefined){
+            this.el.dom.setAttribute('tabIndex', this.tabIndex);
+        }
+
+        this.el.addClass([this.fieldClass, this.cls]);
+    },
+
+    
+    getItemCt : function(){
+        return this.itemCt;
+    },
+
+    
+    initValue : function(){
+        if(this.value !== undefined){
+            this.setValue(this.value);
+        }else if(!Ext.isEmpty(this.el.dom.value) && this.el.dom.value != this.emptyText){
+            this.setValue(this.el.dom.value);
+        }
+        
+        this.originalValue = this.getValue();
+    },
+
+    
+    isDirty : function() {
+        if(this.disabled || !this.rendered) {
+            return false;
+        }
+        return String(this.getValue()) !== String(this.originalValue);
+    },
+
+    
+    setReadOnly : function(readOnly){
+        if(this.rendered){
+            this.el.dom.readOnly = readOnly;
+        }
+        this.readOnly = readOnly;
+    },
+
+    
+    afterRender : function(){
+        Ext.form.Field.superclass.afterRender.call(this);
+        this.initEvents();
+        this.initValue();
+    },
+
+    
+    fireKey : function(e){
+        if(e.isSpecialKey()){
+            this.fireEvent('specialkey', this, e);
+        }
+    },
+
+    
+    reset : function(){
+        this.setValue(this.originalValue);
+        this.clearInvalid();
+    },
+
+    
+    initEvents : function(){
+        this.mon(this.el, Ext.EventManager.getKeyEvent(), this.fireKey,  this);
+        this.mon(this.el, 'focus', this.onFocus, this);
+
+        
+        
+        this.mon(this.el, 'blur', this.onBlur, this, this.inEditor ? {buffer:10} : null);
+    },
+
+    
+    preFocus: Ext.emptyFn,
+
+    
+    onFocus : function(){
+        this.preFocus();
+        if(this.focusClass){
+            this.el.addClass(this.focusClass);
+        }
+        if(!this.hasFocus){
+            this.hasFocus = true;
+            
+            this.startValue = this.getValue();
+            this.fireEvent('focus', this);
+        }
+    },
+
+    
+    beforeBlur : Ext.emptyFn,
+
+    
+    onBlur : function(){
+        this.beforeBlur();
+        if(this.focusClass){
+            this.el.removeClass(this.focusClass);
+        }
+        this.hasFocus = false;
+        if(this.validationEvent !== false && (this.validateOnBlur || this.validationEvent == 'blur')){
+            this.validate();
+        }
+        var v = this.getValue();
+        if(String(v) !== String(this.startValue)){
+            this.fireEvent('change', this, v, this.startValue);
+        }
+        this.fireEvent('blur', this);
+        this.postBlur();
+    },
+
+    
+    postBlur : Ext.emptyFn,
+
+    
+    isValid : function(preventMark){
+        if(this.disabled){
+            return true;
+        }
+        var restore = this.preventMark;
+        this.preventMark = preventMark === true;
+        var v = this.validateValue(this.processValue(this.getRawValue()));
+        this.preventMark = restore;
+        return v;
+    },
+
+    
+    validate : function(){
+        if(this.disabled || this.validateValue(this.processValue(this.getRawValue()))){
+            this.clearInvalid();
+            return true;
+        }
+        return false;
+    },
+
+    
+    processValue : function(value){
+        return value;
+    },
+
+    
+     validateValue : function(value) {
+         
+         var error = this.getErrors(value)[0];
+
+         if (error == undefined) {
+             return true;
+         } else {
+             this.markInvalid(error);
+             return false;
+         }
+     },
+    
+    
+    getErrors: function() {
+        return [];
+    },
+
+    
+    getActiveError : function(){
+        return this.activeError || '';
+    },
+
+    
+    markInvalid : function(msg){
+        
+        if (this.rendered && !this.preventMark) {
+            msg = msg || this.invalidText;
+
+            var mt = this.getMessageHandler();
+            if(mt){
+                mt.mark(this, msg);
+            }else if(this.msgTarget){
+                this.el.addClass(this.invalidClass);
+                var t = Ext.getDom(this.msgTarget);
+                if(t){
+                    t.innerHTML = msg;
+                    t.style.display = this.msgDisplay;
+                }
+            }
+        }
+        
+        this.setActiveError(msg);
+    },
+    
+    
+    clearInvalid : function(){
+        
+        if (this.rendered && !this.preventMark) {
+            this.el.removeClass(this.invalidClass);
+            var mt = this.getMessageHandler();
+            if(mt){
+                mt.clear(this);
+            }else if(this.msgTarget){
+                this.el.removeClass(this.invalidClass);
+                var t = Ext.getDom(this.msgTarget);
+                if(t){
+                    t.innerHTML = '';
+                    t.style.display = 'none';
+                }
+            }
+        }
+        
+        this.unsetActiveError();
+    },
+
+    
+    setActiveError: function(msg, suppressEvent) {
+        this.activeError = msg;
+        if (suppressEvent !== true) this.fireEvent('invalid', this, msg);
+    },
+    
+    
+    unsetActiveError: function(suppressEvent) {
+        delete this.activeError;
+        if (suppressEvent !== true) this.fireEvent('valid', this);
+    },
+
+    
+    getMessageHandler : function(){
+        return Ext.form.MessageTargets[this.msgTarget];
+    },
+
+    
+    getErrorCt : function(){
+        return this.el.findParent('.x-form-element', 5, true) || 
+            this.el.findParent('.x-form-field-wrap', 5, true);   
+    },
+
+    
+    alignErrorEl : function(){
+        this.errorEl.setWidth(this.getErrorCt().getWidth(true) - 20);
+    },
+
+    
+    alignErrorIcon : function(){
+        this.errorIcon.alignTo(this.el, 'tl-tr', [2, 0]);
+    },
+
+    
+    getRawValue : function(){
+        var v = this.rendered ? this.el.getValue() : Ext.value(this.value, '');
+        if(v === this.emptyText){
+            v = '';
+        }
+        return v;
+    },
+
+    
+    getValue : function(){
+        if(!this.rendered) {
+            return this.value;
+        }
+        var v = this.el.getValue();
+        if(v === this.emptyText || v === undefined){
+            v = '';
+        }
+        return v;
+    },
+
+    
+    setRawValue : function(v){
+        return this.rendered ? (this.el.dom.value = (Ext.isEmpty(v) ? '' : v)) : '';
+    },
+
+    
+    setValue : function(v){
+        this.value = v;
+        if(this.rendered){
+            this.el.dom.value = (Ext.isEmpty(v) ? '' : v);
+            this.validate();
+        }
+        return this;
+    },
+
+    
+    append : function(v){
+         this.setValue([this.getValue(), v].join(''));
+    }
+
+    
+    
+
+    
+});
+
+
+Ext.form.MessageTargets = {
+    'qtip' : {
+        mark: function(field, msg){
+            field.el.addClass(field.invalidClass);
+            field.el.dom.qtip = msg;
+            field.el.dom.qclass = 'x-form-invalid-tip';
+            if(Ext.QuickTips){ 
+                Ext.QuickTips.enable();
+            }
+        },
+        clear: function(field){
+            field.el.removeClass(field.invalidClass);
+            field.el.dom.qtip = '';
+        }
+    },
+    'title' : {
+        mark: function(field, msg){
+            field.el.addClass(field.invalidClass);
+            field.el.dom.title = msg;
+        },
+        clear: function(field){
+            field.el.dom.title = '';
+        }
+    },
+    'under' : {
+        mark: function(field, msg){
+            field.el.addClass(field.invalidClass);
+            if(!field.errorEl){
+                var elp = field.getErrorCt();
+                if(!elp){ 
+                    field.el.dom.title = msg;
+                    return;
+                }
+                field.errorEl = elp.createChild({cls:'x-form-invalid-msg'});
+                field.on('resize', field.alignErrorEl, field);
+                field.on('destroy', function(){
+                    Ext.destroy(this.errorEl);
+                }, field);
+            }
+            field.alignErrorEl();
+            field.errorEl.update(msg);
+            Ext.form.Field.msgFx[field.msgFx].show(field.errorEl, field);
+        },
+        clear: function(field){
+            field.el.removeClass(field.invalidClass);
+            if(field.errorEl){
+                Ext.form.Field.msgFx[field.msgFx].hide(field.errorEl, field);
+            }else{
+                field.el.dom.title = '';
+            }
+        }
+    },
+    'side' : {
+        mark: function(field, msg){
+            field.el.addClass(field.invalidClass);
+            if(!field.errorIcon){
+                var elp = field.getErrorCt();
+                
+                if(!elp){
+                    field.el.dom.title = msg;
+                    return;
+                }
+                field.errorIcon = elp.createChild({cls:'x-form-invalid-icon'});
+                if (field.ownerCt) {
+                    field.ownerCt.on('afterlayout', field.alignErrorIcon, field);
+                    field.ownerCt.on('expand', field.alignErrorIcon, field);
+                }
+                field.on('resize', field.alignErrorIcon, field);
+                field.on('destroy', function(){
+                    Ext.destroy(this.errorIcon);
+                }, field);
+            }
+            field.alignErrorIcon();
+            field.errorIcon.dom.qtip = msg;
+            field.errorIcon.dom.qclass = 'x-form-invalid-tip';
+            field.errorIcon.show();
+        },
+        clear: function(field){
+            field.el.removeClass(field.invalidClass);
+            if(field.errorIcon){
+                field.errorIcon.dom.qtip = '';
+                field.errorIcon.hide();
+            }else{
+                field.el.dom.title = '';
+            }
+        }
+    }
+};
+
+
+Ext.form.Field.msgFx = {
+    normal : {
+        show: function(msgEl, f){
+            msgEl.setDisplayed('block');
+        },
+
+        hide : function(msgEl, f){
+            msgEl.setDisplayed(false).update('');
+        }
+    },
+
+    slide : {
+        show: function(msgEl, f){
+            msgEl.slideIn('t', {stopFx:true});
+        },
+
+        hide : function(msgEl, f){
+            msgEl.slideOut('t', {stopFx:true,useDisplay:true});
+        }
+    },
+
+    slideRight : {
+        show: function(msgEl, f){
+            msgEl.fixDisplay();
+            msgEl.alignTo(f.el, 'tl-tr');
+            msgEl.slideIn('l', {stopFx:true});
+        },
+
+        hide : function(msgEl, f){
+            msgEl.slideOut('l', {stopFx:true,useDisplay:true});
+        }
+    }
+};
+Ext.reg('field', Ext.form.Field);
+
+Ext.form.TextField = Ext.extend(Ext.form.Field,  {
+    
+    
+    
+    grow : false,
+    
+    growMin : 30,
+    
+    growMax : 800,
+    
+    vtype : null,
+    
+    maskRe : null,
+    
+    disableKeyFilter : false,
+    
+    allowBlank : true,
+    
+    minLength : 0,
+    
+    maxLength : Number.MAX_VALUE,
+    
+    minLengthText : 'The minimum length for this field is {0}',
+    
+    maxLengthText : 'The maximum length for this field is {0}',
+    
+    selectOnFocus : false,
+    
+    blankText : 'This field is required',
+    
+    validator : null,
+    
+    regex : null,
+    
+    regexText : '',
+    
+    emptyText : null,
+    
+    emptyClass : 'x-form-empty-field',
+
+    
+
+    initComponent : function(){
+        Ext.form.TextField.superclass.initComponent.call(this);
+        this.addEvents(
+            
+            'autosize',
+
+            
+            'keydown',
+            
+            'keyup',
+            
+            'keypress'
+        );
+    },
+
+    
+    initEvents : function(){
+        Ext.form.TextField.superclass.initEvents.call(this);
+        if(this.validationEvent == 'keyup'){
+            this.validationTask = new Ext.util.DelayedTask(this.validate, this);
+            this.mon(this.el, 'keyup', this.filterValidation, this);
+        }
+        else if(this.validationEvent !== false && this.validationEvent != 'blur'){
+               this.mon(this.el, this.validationEvent, this.validate, this, {buffer: this.validationDelay});
+        }
+        if(this.selectOnFocus || this.emptyText){            
+            this.mon(this.el, 'mousedown', this.onMouseDown, this);
+            
+            if(this.emptyText){
+                this.applyEmptyText();
+            }
+        }
+        if(this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype+'Mask']))){
+               this.mon(this.el, 'keypress', this.filterKeys, this);
+        }
+        if(this.grow){
+               this.mon(this.el, 'keyup', this.onKeyUpBuffered, this, {buffer: 50});
+                       this.mon(this.el, 'click', this.autoSize, this);
+        }
+        if(this.enableKeyEvents){
+            this.mon(this.el, {
+                scope: this,
+                keyup: this.onKeyUp,
+                keydown: this.onKeyDown,
+                keypress: this.onKeyPress
+            });
+        }
+    },
+    
+    onMouseDown: function(e){
+        if(!this.hasFocus){
+            this.mon(this.el, 'mouseup', Ext.emptyFn, this, { single: true, preventDefault: true });
+        }
+    },
+
+    processValue : function(value){
+        if(this.stripCharsRe){
+            var newValue = value.replace(this.stripCharsRe, '');
+            if(newValue !== value){
+                this.setRawValue(newValue);
+                return newValue;
+            }
+        }
+        return value;
+    },
+
+    filterValidation : function(e){
+        if(!e.isNavKeyPress()){
+            this.validationTask.delay(this.validationDelay);
+        }
+    },
+    
+    
+    onDisable: function(){
+        Ext.form.TextField.superclass.onDisable.call(this);
+        if(Ext.isIE){
+            this.el.dom.unselectable = 'on';
+        }
+    },
+    
+    
+    onEnable: function(){
+        Ext.form.TextField.superclass.onEnable.call(this);
+        if(Ext.isIE){
+            this.el.dom.unselectable = '';
+        }
+    },
+
+    
+    onKeyUpBuffered : function(e){
+        if(this.doAutoSize(e)){
+            this.autoSize();
+        }
+    },
+    
+    
+    doAutoSize : function(e){
+        return !e.isNavKeyPress();
+    },
+
+    
+    onKeyUp : function(e){
+        this.fireEvent('keyup', this, e);
+    },
+
+    
+    onKeyDown : function(e){
+        this.fireEvent('keydown', this, e);
+    },
+
+    
+    onKeyPress : function(e){
+        this.fireEvent('keypress', this, e);
+    },
+
+    
+    reset : function(){
+        Ext.form.TextField.superclass.reset.call(this);
+        this.applyEmptyText();
+    },
+
+    applyEmptyText : function(){
+        if(this.rendered && this.emptyText && this.getRawValue().length < 1 && !this.hasFocus){
+            this.setRawValue(this.emptyText);
+            this.el.addClass(this.emptyClass);
+        }
+    },
+
+    
+    preFocus : function(){
+        var el = this.el,
+            isEmpty;
+        if(this.emptyText){
+            if(el.dom.value == this.emptyText){
+                this.setRawValue('');
+                isEmpty = true;
+            }
+            el.removeClass(this.emptyClass);
+        }
+        if(this.selectOnFocus || isEmpty){
+            el.dom.select();
+        }
+    },
+
+    
+    postBlur : function(){
+        this.applyEmptyText();
+    },
+
+    
+    filterKeys : function(e){
+        if(e.ctrlKey){
+            return;
+        }
+        var k = e.getKey();
+        if(Ext.isGecko && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){
+            return;
+        }
+        var cc = String.fromCharCode(e.getCharCode());
+        if(!Ext.isGecko && e.isSpecialKey() && !cc){
+            return;
+        }
+        if(!this.maskRe.test(cc)){
+            e.stopEvent();
+        }
+    },
+
+    setValue : function(v){
+        if(this.emptyText && this.el && !Ext.isEmpty(v)){
+            this.el.removeClass(this.emptyClass);
+        }
+        Ext.form.TextField.superclass.setValue.apply(this, arguments);
+        this.applyEmptyText();
+        this.autoSize();
+        return this;
+    },
+
+    
+    getErrors: function(value) {
+        var errors = Ext.form.TextField.superclass.getErrors.apply(this, arguments);
+        
+        value = Ext.isDefined(value) ? value : this.processValue(this.getRawValue());        
+        
+        if (Ext.isFunction(this.validator)) {
+            var msg = this.validator(value);
+            if (msg !== true) {
+                errors.push(msg);
+            }
+        }
+        
+        if (value.length < 1 || value === this.emptyText) {
+            if (this.allowBlank) {
+                
+                return errors;
+            } else {
+                errors.push(this.blankText);
+            }
+        }
+        
+        if (!this.allowBlank && (value.length < 1 || value === this.emptyText)) { 
+            errors.push(this.blankText);
+        }
+        
+        if (value.length < this.minLength) {
+            errors.push(String.format(this.minLengthText, this.minLength));
+        }
+        
+        if (value.length > this.maxLength) {
+            errors.push(String.format(this.maxLengthText, this.maxLength));
+        }
+        
+        if (this.vtype) {
+            var vt = Ext.form.VTypes;
+            if(!vt[this.vtype](value, this)){
+                errors.push(this.vtypeText || vt[this.vtype +'Text']);
+            }
+        }
+        
+        if (this.regex && !this.regex.test(value)) {
+            errors.push(this.regexText);
+        }
+        
+        return errors;
+    },
+
+    
+    selectText : function(start, end){
+        var v = this.getRawValue();
+        var doFocus = false;
+        if(v.length > 0){
+            start = start === undefined ? 0 : start;
+            end = end === undefined ? v.length : end;
+            var d = this.el.dom;
+            if(d.setSelectionRange){
+                d.setSelectionRange(start, end);
+            }else if(d.createTextRange){
+                var range = d.createTextRange();
+                range.moveStart('character', start);
+                range.moveEnd('character', end-v.length);
+                range.select();
+            }
+            doFocus = Ext.isGecko || Ext.isOpera;
+        }else{
+            doFocus = true;
+        }
+        if(doFocus){
+            this.focus();
+        }
+    },
+
+    
+    autoSize : function(){
+        if(!this.grow || !this.rendered){
+            return;
+        }
+        if(!this.metrics){
+            this.metrics = Ext.util.TextMetrics.createInstance(this.el);
+        }
+        var el = this.el;
+        var v = el.dom.value;
+        var d = document.createElement('div');
+        d.appendChild(document.createTextNode(v));
+        v = d.innerHTML;
+        Ext.removeNode(d);
+        d = null;
+        v += '&#160;';
+        var w = Math.min(this.growMax, Math.max(this.metrics.getWidth(v) +  10, this.growMin));
+        this.el.setWidth(w);
+        this.fireEvent('autosize', this, w);
+    },
+       
+       onDestroy: function(){
+               if(this.validationTask){
+                       this.validationTask.cancel();
+                       this.validationTask = null;
+               }
+               Ext.form.TextField.superclass.onDestroy.call(this);
+       }
+});
+Ext.reg('textfield', Ext.form.TextField);
+
+Ext.form.TriggerField = Ext.extend(Ext.form.TextField,  {
+    
+    
+    
+    defaultAutoCreate : {tag: "input", type: "text", size: "16", autocomplete: "off"},
+    
+    hideTrigger:false,
+    
+    editable: true,
+    
+    readOnly: false,
+    
+    wrapFocusClass: 'x-trigger-wrap-focus',
+    
+    autoSize: Ext.emptyFn,
+    
+    monitorTab : true,
+    
+    deferHeight : true,
+    
+    mimicing : false,
+
+    actionMode: 'wrap',
+
+    defaultTriggerWidth: 17,
+
+    
+    onResize : function(w, h){
+        Ext.form.TriggerField.superclass.onResize.call(this, w, h);
+        var tw = this.getTriggerWidth();
+        if(Ext.isNumber(w)){
+            this.el.setWidth(w - tw);
+        }
+        this.wrap.setWidth(this.el.getWidth() + tw);
+    },
+
+    getTriggerWidth: function(){
+        var tw = this.trigger.getWidth();
+        if(!this.hideTrigger && !this.readOnly && tw === 0){
+            tw = this.defaultTriggerWidth;
+        }
+        return tw;
+    },
+
+    
+    alignErrorIcon : function(){
+        if(this.wrap){
+            this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]);
+        }
+    },
+
+    
+    onRender : function(ct, position){
+        this.doc = Ext.isIE ? Ext.getBody() : Ext.getDoc();
+        Ext.form.TriggerField.superclass.onRender.call(this, ct, position);
+
+        this.wrap = this.el.wrap({cls: 'x-form-field-wrap x-form-field-trigger-wrap'});
+        this.trigger = this.wrap.createChild(this.triggerConfig ||
+                {tag: "img", src: Ext.BLANK_IMAGE_URL, alt: "", cls: "x-form-trigger " + this.triggerClass});
+        this.initTrigger();
+        if(!this.width){
+            this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth());
+        }
+        this.resizeEl = this.positionEl = this.wrap;
+    },
+
+    getWidth: function() {
+        return(this.el.getWidth() + this.trigger.getWidth());
+    },
+
+    updateEditState: function(){
+        if(this.rendered){
+            if (this.readOnly) {
+                this.el.dom.readOnly = true;
+                this.el.addClass('x-trigger-noedit');
+                this.mun(this.el, 'click', this.onTriggerClick, this);
+                this.trigger.setDisplayed(false);
+            } else {
+                if (!this.editable) {
+                    this.el.dom.readOnly = true;
+                    this.el.addClass('x-trigger-noedit');
+                    this.mon(this.el, 'click', this.onTriggerClick, this);
+                } else {
+                    this.el.dom.readOnly = false;
+                    this.el.removeClass('x-trigger-noedit');
+                    this.mun(this.el, 'click', this.onTriggerClick, this);
+                }
+                this.trigger.setDisplayed(!this.hideTrigger);
+            }
+            this.onResize(this.width || this.wrap.getWidth());
+        }
+    },
+
+    
+    setHideTrigger: function(hideTrigger){
+        if(hideTrigger != this.hideTrigger){
+            this.hideTrigger = hideTrigger;
+            this.updateEditState();
+        }
+    },
+
+    
+    setEditable: function(editable){
+        if(editable != this.editable){
+            this.editable = editable;
+            this.updateEditState();
+        }
+    },
+
+    
+    setReadOnly: function(readOnly){
+        if(readOnly != this.readOnly){
+            this.readOnly = readOnly;
+            this.updateEditState();
+        }
+    },
+
+    afterRender : function(){
+        Ext.form.TriggerField.superclass.afterRender.call(this);
+        this.updateEditState();
+    },
+
+    
+    initTrigger : function(){
+        this.mon(this.trigger, 'click', this.onTriggerClick, this, {preventDefault:true});
+        this.trigger.addClassOnOver('x-form-trigger-over');
+        this.trigger.addClassOnClick('x-form-trigger-click');
+    },
+
+    
+    onDestroy : function(){
+        Ext.destroy(this.trigger, this.wrap);
+        if (this.mimicing){
+            this.doc.un('mousedown', this.mimicBlur, this);
+        }
+        delete this.doc;
+        Ext.form.TriggerField.superclass.onDestroy.call(this);
+    },
+
+    
+    onFocus : function(){
+        Ext.form.TriggerField.superclass.onFocus.call(this);
+        if(!this.mimicing){
+            this.wrap.addClass(this.wrapFocusClass);
+            this.mimicing = true;
+            this.doc.on('mousedown', this.mimicBlur, this, {delay: 10});
+            if(this.monitorTab){
+                this.on('specialkey', this.checkTab, this);
+            }
+        }
+    },
+
+    
+    checkTab : function(me, e){
+        if(e.getKey() == e.TAB){
+            this.triggerBlur();
+        }
+    },
+
+    
+    onBlur : Ext.emptyFn,
+
+    
+    mimicBlur : function(e){
+        if(!this.isDestroyed && !this.wrap.contains(e.target) && this.validateBlur(e)){
+            this.triggerBlur();
+        }
+    },
+
+    
+    triggerBlur : function(){
+        this.mimicing = false;
+        this.doc.un('mousedown', this.mimicBlur, this);
+        if(this.monitorTab && this.el){
+            this.un('specialkey', this.checkTab, this);
+        }
+        Ext.form.TriggerField.superclass.onBlur.call(this);
+        if(this.wrap){
+            this.wrap.removeClass(this.wrapFocusClass);
+        }
+    },
+
+    beforeBlur : Ext.emptyFn,
+
+    
+    
+    validateBlur : function(e){
+        return true;
+    },
+
+    
+    onTriggerClick : Ext.emptyFn
+
+    
+    
+    
+});
+
+
+Ext.form.TwinTriggerField = Ext.extend(Ext.form.TriggerField, {
+    
+    
+    
+
+    initComponent : function(){
+        Ext.form.TwinTriggerField.superclass.initComponent.call(this);
+
+        this.triggerConfig = {
+            tag:'span', cls:'x-form-twin-triggers', cn:[
+            {tag: "img", src: Ext.BLANK_IMAGE_URL, alt: "", cls: "x-form-trigger " + this.trigger1Class},
+            {tag: "img", src: Ext.BLANK_IMAGE_URL, alt: "", cls: "x-form-trigger " + this.trigger2Class}
+        ]};
+    },
+
+    getTrigger : function(index){
+        return this.triggers[index];
+    },
+    
+    afterRender: function(){
+        Ext.form.TwinTriggerField.superclass.afterRender.call(this);
+        var triggers = this.triggers,
+            i = 0,
+            len = triggers.length;
+            
+        for(; i < len; ++i){
+            if(this['hideTrigger' + (i + 1)]){
+                    triggers[i].hide();
+                }
+
+        }    
+    },
+
+    initTrigger : function(){
+        var ts = this.trigger.select('.x-form-trigger', true),
+            triggerField = this;
+            
+        ts.each(function(t, all, index){
+            var triggerIndex = 'Trigger'+(index+1);
+            t.hide = function(){
+                var w = triggerField.wrap.getWidth();
+                this.dom.style.display = 'none';
+                triggerField.el.setWidth(w-triggerField.trigger.getWidth());
+                triggerField['hidden' + triggerIndex] = true;
+            };
+            t.show = function(){
+                var w = triggerField.wrap.getWidth();
+                this.dom.style.display = '';
+                triggerField.el.setWidth(w-triggerField.trigger.getWidth());
+                triggerField['hidden' + triggerIndex] = false;
+            };
+            this.mon(t, 'click', this['on'+triggerIndex+'Click'], this, {preventDefault:true});
+            t.addClassOnOver('x-form-trigger-over');
+            t.addClassOnClick('x-form-trigger-click');
+        }, this);
+        this.triggers = ts.elements;
+    },
+
+    getTriggerWidth: function(){
+        var tw = 0;
+        Ext.each(this.triggers, function(t, index){
+            var triggerIndex = 'Trigger' + (index + 1),
+                w = t.getWidth();
+            if(w === 0 && !this['hidden' + triggerIndex]){
+                tw += this.defaultTriggerWidth;
+            }else{
+                tw += w;
+            }
+        }, this);
+        return tw;
+    },
+
+    
+    onDestroy : function() {
+        Ext.destroy(this.triggers);
+        Ext.form.TwinTriggerField.superclass.onDestroy.call(this);
+    },
+
+    
+    onTrigger1Click : Ext.emptyFn,
+    
+    onTrigger2Click : Ext.emptyFn
+});
+Ext.reg('trigger', Ext.form.TriggerField);
+
+Ext.form.TextArea = Ext.extend(Ext.form.TextField,  {
+    
+    growMin : 60,
+    
+    growMax: 1000,
+    growAppend : '&#160;\n&#160;',
+
+    enterIsSpecial : false,
+
+    
+    preventScrollbars: false,
+    
+
+    
+    onRender : function(ct, position){
+        if(!this.el){
+            this.defaultAutoCreate = {
+                tag: "textarea",
+                style:"width:100px;height:60px;",
+                autocomplete: "off"
+            };
+        }
+        Ext.form.TextArea.superclass.onRender.call(this, ct, position);
+        if(this.grow){
+            this.textSizeEl = Ext.DomHelper.append(document.body, {
+                tag: "pre", cls: "x-form-grow-sizer"
+            });
+            if(this.preventScrollbars){
+                this.el.setStyle("overflow", "hidden");
+            }
+            this.el.setHeight(this.growMin);
+        }
+    },
+
+    onDestroy : function(){
+        Ext.removeNode(this.textSizeEl);
+        Ext.form.TextArea.superclass.onDestroy.call(this);
+    },
+
+    fireKey : function(e){
+        if(e.isSpecialKey() && (this.enterIsSpecial || (e.getKey() != e.ENTER || e.hasModifier()))){
+            this.fireEvent("specialkey", this, e);
+        }
+    },
+    
+    
+    doAutoSize : function(e){
+        return !e.isNavKeyPress() || e.getKey() == e.ENTER;
+    },
+    
+    
+    filterValidation: function(e) {            
+        if(!e.isNavKeyPress() || (!this.enterIsSpecial && e.keyCode == e.ENTER)){
+            this.validationTask.delay(this.validationDelay);
+        }
+    },
+
+    
+    autoSize: function(){
+        if(!this.grow || !this.textSizeEl){
+            return;
+        }
+        var el = this.el,
+            v = Ext.util.Format.htmlEncode(el.dom.value),
+            ts = this.textSizeEl,
+            h;
+            
+        Ext.fly(ts).setWidth(this.el.getWidth());
+        if(v.length < 1){
+            v = "&#160;&#160;";
+        }else{
+            v += this.growAppend;
+            if(Ext.isIE){
+                v = v.replace(/\n/g, '&#160;<br />');
+            }
+        }
+        ts.innerHTML = v;
+        h = Math.min(this.growMax, Math.max(ts.offsetHeight, this.growMin));
+        if(h != this.lastHeight){
+            this.lastHeight = h;
+            this.el.setHeight(h);
+            this.fireEvent("autosize", this, h);
+        }
+    }
+});
+Ext.reg('textarea', Ext.form.TextArea);
+Ext.form.NumberField = Ext.extend(Ext.form.TextField,  {
+    
+    
+    
+    fieldClass: "x-form-field x-form-num-field",
+    
+    
+    allowDecimals : true,
+    
+    
+    decimalSeparator : ".",
+    
+    
+    decimalPrecision : 2,
+    
+    
+    allowNegative : true,
+    
+    
+    minValue : Number.NEGATIVE_INFINITY,
+    
+    
+    maxValue : Number.MAX_VALUE,
+    
+    
+    minText : "The minimum value for this field is {0}",
+    
+    
+    maxText : "The maximum value for this field is {0}",
+    
+    
+    nanText : "{0} is not a valid number",
+    
+    
+    baseChars : "0123456789",
+    
+    
+    autoStripChars: false,
+
+    
+    initEvents : function() {
+        var allowed = this.baseChars + '';
+        if (this.allowDecimals) {
+            allowed += this.decimalSeparator;
+        }
+        if (this.allowNegative) {
+            allowed += '-';
+        }
+        allowed = Ext.escapeRe(allowed);
+        this.maskRe = new RegExp('[' + allowed + ']');
+        if (this.autoStripChars) {
+            this.stripCharsRe = new RegExp('[^' + allowed + ']', 'gi');
+        }
+        
+        Ext.form.NumberField.superclass.initEvents.call(this);
+    },
+    
+    
+    getErrors: function(value) {
+        var errors = Ext.form.NumberField.superclass.getErrors.apply(this, arguments);
+        
+        value = Ext.isDefined(value) ? value : this.processValue(this.getRawValue());
+        
+        if (value.length < 1) { 
+             return errors;
+        }
+        
+        value = String(value).replace(this.decimalSeparator, ".");
+        
+        if(isNaN(value)){
+            errors.push(String.format(this.nanText, value));
+        }
+        
+        var num = this.parseValue(value);
+        
+        if (num < this.minValue) {
+            errors.push(String.format(this.minText, this.minValue));
+        }
+        
+        if (num > this.maxValue) {
+            errors.push(String.format(this.maxText, this.maxValue));
+        }
+        
+        return errors;
+    },
+
+    getValue : function() {
+        return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this)));
+    },
+
+    setValue : function(v) {
+        v = this.fixPrecision(v);
+       v = Ext.isNumber(v) ? v : parseFloat(String(v).replace(this.decimalSeparator, "."));
+        v = isNaN(v) ? '' : String(v).replace(".", this.decimalSeparator);
+        return Ext.form.NumberField.superclass.setValue.call(this, v);
+    },
+    
+    
+    setMinValue : function(value) {
+        this.minValue = Ext.num(value, Number.NEGATIVE_INFINITY);
+    },
+    
+    
+    setMaxValue : function(value) {
+        this.maxValue = Ext.num(value, Number.MAX_VALUE);    
+    },
+
+    
+    parseValue : function(value) {
+        value = parseFloat(String(value).replace(this.decimalSeparator, "."));
+        return isNaN(value) ? '' : value;
+    },
+
+    
+    fixPrecision : function(value) {
+        var nan = isNaN(value);
+        
+        if (!this.allowDecimals || this.decimalPrecision == -1 || nan || !value) {
+            return nan ? '' : value;
+        }
+        
+        return parseFloat(parseFloat(value).toFixed(this.decimalPrecision));
+    },
+
+    beforeBlur : function() {
+        var v = this.parseValue(this.getRawValue());
+        
+        if (!Ext.isEmpty(v)) {
+            this.setValue(v);
+        }
+    }
+});
+
+Ext.reg('numberfield', Ext.form.NumberField);
+
+Ext.form.DateField = Ext.extend(Ext.form.TriggerField,  {
+    
+    format : "m/d/Y",
+    
+    altFormats : "m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d|n-j|n/j",
+    
+    disabledDaysText : "Disabled",
+    
+    disabledDatesText : "Disabled",
+    
+    minText : "The date in this field must be equal to or after {0}",
+    
+    maxText : "The date in this field must be equal to or before {0}",
+    
+    invalidText : "{0} is not a valid date - it must be in the format {1}",
+    
+    triggerClass : 'x-form-date-trigger',
+    
+    showToday : true,
+    
+    
+    startDay : 0,
+    
+    
+    
+    
+    
+    
+
+    
+    defaultAutoCreate : {tag: "input", type: "text", size: "10", autocomplete: "off"},
+
+    
+    
+    initTime: '12', 
+
+    initTimeFormat: 'H',
+
+    
+    safeParse : function(value, format) {
+        if (/[gGhH]/.test(format.replace(/(\\.)/g, ''))) {
+            
+            return Date.parseDate(value, format);
+        } else {
+            
+            var parsedDate = Date.parseDate(value + ' ' + this.initTime, format + ' ' + this.initTimeFormat);
+
+            if (parsedDate) {
+                return parsedDate.clearTime();
+            }
+        }
+    },
+
+    initComponent : function(){
+        Ext.form.DateField.superclass.initComponent.call(this);
+
+        this.addEvents(
+            
+            'select'
+        );
+
+        if(Ext.isString(this.minValue)){
+            this.minValue = this.parseDate(this.minValue);
+        }
+        if(Ext.isString(this.maxValue)){
+            this.maxValue = this.parseDate(this.maxValue);
+        }
+        this.disabledDatesRE = null;
+        this.initDisabledDays();
+    },
+
+    initEvents: function() {
+        Ext.form.DateField.superclass.initEvents.call(this);
+        this.keyNav = new Ext.KeyNav(this.el, {
+            "down": function(e) {
+                this.onTriggerClick();
+            },
+            scope: this,
+            forceKeyDown: true
+        });
+    },
+
+
+    
+    initDisabledDays : function(){
+        if(this.disabledDates){
+            var dd = this.disabledDates,
+                len = dd.length - 1,
+                re = "(?:";
+
+            Ext.each(dd, function(d, i){
+                re += Ext.isDate(d) ? '^' + Ext.escapeRe(d.dateFormat(this.format)) + '$' : dd[i];
+                if(i != len){
+                    re += '|';
+                }
+            }, this);
+            this.disabledDatesRE = new RegExp(re + ')');
+        }
+    },
+
+    
+    setDisabledDates : function(dd){
+        this.disabledDates = dd;
+        this.initDisabledDays();
+        if(this.menu){
+            this.menu.picker.setDisabledDates(this.disabledDatesRE);
+        }
+    },
+
+    
+    setDisabledDays : function(dd){
+        this.disabledDays = dd;
+        if(this.menu){
+            this.menu.picker.setDisabledDays(dd);
+        }
+    },
+
+    
+    setMinValue : function(dt){
+        this.minValue = (Ext.isString(dt) ? this.parseDate(dt) : dt);
+        if(this.menu){
+            this.menu.picker.setMinDate(this.minValue);
+        }
+    },
+
+    
+    setMaxValue : function(dt){
+        this.maxValue = (Ext.isString(dt) ? this.parseDate(dt) : dt);
+        if(this.menu){
+            this.menu.picker.setMaxDate(this.maxValue);
+        }
+    },
+
+    
+    getErrors: function(value) {
+        var errors = Ext.form.DateField.superclass.getErrors.apply(this, arguments);
+
+        value = this.formatDate(value || this.processValue(this.getRawValue()));
+
+        if (value.length < 1) { 
+             return errors;
+        }
+
+        var svalue = value;
+        value = this.parseDate(value);
+        if (!value) {
+            errors.push(String.format(this.invalidText, svalue, this.format));
+            return errors;
+        }
+
+        var time = value.getTime();
+        if (this.minValue && time < this.minValue.clearTime().getTime()) {
+            errors.push(String.format(this.minText, this.formatDate(this.minValue)));
+        }
+
+        if (this.maxValue && time > this.maxValue.clearTime().getTime()) {
+            errors.push(String.format(this.maxText, this.formatDate(this.maxValue)));
+        }
+
+        if (this.disabledDays) {
+            var day = value.getDay();
+
+            for(var i = 0; i < this.disabledDays.length; i++) {
+                if (day === this.disabledDays[i]) {
+                    errors.push(this.disabledDaysText);
+                    break;
+                }
+            }
+        }
+
+        var fvalue = this.formatDate(value);
+        if (this.disabledDatesRE && this.disabledDatesRE.test(fvalue)) {
+            errors.push(String.format(this.disabledDatesText, fvalue));
+        }
+
+        return errors;
+    },
+
+    
+    
+    validateBlur : function(){
+        return !this.menu || !this.menu.isVisible();
+    },
+
+    
+    getValue : function(){
+        return this.parseDate(Ext.form.DateField.superclass.getValue.call(this)) || "";
+    },
+
+    
+    setValue : function(date){
+        return Ext.form.DateField.superclass.setValue.call(this, this.formatDate(this.parseDate(date)));
+    },
+
+    
+    parseDate : function(value) {
+        if(!value || Ext.isDate(value)){
+            return value;
+        }
+
+        var v = this.safeParse(value, this.format),
+            af = this.altFormats,
+            afa = this.altFormatsArray;
+
+        if (!v && af) {
+            afa = afa || af.split("|");
+
+            for (var i = 0, len = afa.length; i < len && !v; i++) {
+                v = this.safeParse(value, afa[i]);
+            }
+        }
+        return v;
+    },
+
+    
+    onDestroy : function(){
+        Ext.destroy(this.menu, this.keyNav);
+        Ext.form.DateField.superclass.onDestroy.call(this);
+    },
+
+    
+    formatDate : function(date){
+        return Ext.isDate(date) ? date.dateFormat(this.format) : date;
+    },
+
+    
+    
+    
+    onTriggerClick : function(){
+        if(this.disabled){
+            return;
+        }
+        if(this.menu == null){
+            this.menu = new Ext.menu.DateMenu({
+                hideOnClick: false,
+                focusOnSelect: false
+            });
+        }
+        this.onFocus();
+        Ext.apply(this.menu.picker,  {
+            minDate : this.minValue,
+            maxDate : this.maxValue,
+            disabledDatesRE : this.disabledDatesRE,
+            disabledDatesText : this.disabledDatesText,
+            disabledDays : this.disabledDays,
+            disabledDaysText : this.disabledDaysText,
+            format : this.format,
+            showToday : this.showToday,
+            startDay: this.startDay,
+            minText : String.format(this.minText, this.formatDate(this.minValue)),
+            maxText : String.format(this.maxText, this.formatDate(this.maxValue))
+        });
+        this.menu.picker.setValue(this.getValue() || new Date());
+        this.menu.show(this.el, "tl-bl?");
+        this.menuEvents('on');
+    },
+
+    
+    menuEvents: function(method){
+        this.menu[method]('select', this.onSelect, this);
+        this.menu[method]('hide', this.onMenuHide, this);
+        this.menu[method]('show', this.onFocus, this);
+    },
+
+    onSelect: function(m, d){
+        this.setValue(d);
+        this.fireEvent('select', this, d);
+        this.menu.hide();
+    },
+
+    onMenuHide: function(){
+        this.focus(false, 60);
+        this.menuEvents('un');
+    },
+
+    
+    beforeBlur : function(){
+        var v = this.parseDate(this.getRawValue());
+        if(v){
+            this.setValue(v);
+        }
+    }
+
+    
+    
+    
+    
+});
+Ext.reg('datefield', Ext.form.DateField);
+
+Ext.form.DisplayField = Ext.extend(Ext.form.Field,  {
+    validationEvent : false,
+    validateOnBlur : false,
+    defaultAutoCreate : {tag: "div"},
+    
+    fieldClass : "x-form-display-field",
+    
+    htmlEncode: false,
+
+    
+    initEvents : Ext.emptyFn,
+
+    isValid : function(){
+        return true;
+    },
+
+    validate : function(){
+        return true;
+    },
+
+    getRawValue : function(){
+        var v = this.rendered ? this.el.dom.innerHTML : Ext.value(this.value, '');
+        if(v === this.emptyText){
+            v = '';
+        }
+        if(this.htmlEncode){
+            v = Ext.util.Format.htmlDecode(v);
+        }
+        return v;
+    },
+
+    getValue : function(){
+        return this.getRawValue();
+    },
+    
+    getName: function() {
+        return this.name;
+    },
+
+    setRawValue : function(v){
+        if(this.htmlEncode){
+            v = Ext.util.Format.htmlEncode(v);
+        }
+        return this.rendered ? (this.el.dom.innerHTML = (Ext.isEmpty(v) ? '' : v)) : (this.value = v);
+    },
+
+    setValue : function(v){
+        this.setRawValue(v);
+        return this;
+    }
+    
+    
+    
+    
+    
+    
+});
+
+Ext.reg('displayfield', Ext.form.DisplayField);
+
+Ext.form.ComboBox = Ext.extend(Ext.form.TriggerField, {
+    
+    
+    
+    
+    
+
+    
+    defaultAutoCreate : {tag: "input", type: "text", size: "24", autocomplete: "off"},
+    
+    
+    
+    
+    
+    
+    
+    listClass : '',
+    
+    selectedClass : 'x-combo-selected',
+    
+    listEmptyText: '',
+    
+    triggerClass : 'x-form-arrow-trigger',
+    
+    shadow : 'sides',
+    
+    listAlign : 'tl-bl?',
+    
+    maxHeight : 300,
+    
+    minHeight : 90,
+    
+    triggerAction : 'query',
+    
+    minChars : 4,
+    
+    autoSelect : true,
+    
+    typeAhead : false,
+    
+    queryDelay : 500,
+    
+    pageSize : 0,
+    
+    selectOnFocus : false,
+    
+    queryParam : 'query',
+    
+    loadingText : 'Loading...',
+    
+    resizable : false,
+    
+    handleHeight : 8,
+    
+    allQuery: '',
+    
+    mode: 'remote',
+    
+    minListWidth : 70,
+    
+    forceSelection : false,
+    
+    typeAheadDelay : 250,
+    
+
+    
+    lazyInit : true,
+
+    
+    clearFilterOnReset : true,
+
+    
+    submitValue: undefined,
+
+    
+
+    
+    initComponent : function(){
+        Ext.form.ComboBox.superclass.initComponent.call(this);
+        this.addEvents(
+            
+            'expand',
+            
+            'collapse',
+
+            
+            'beforeselect',
+            
+            'select',
+            
+            'beforequery'
+        );
+        if(this.transform){
+            var s = Ext.getDom(this.transform);
+            if(!this.hiddenName){
+                this.hiddenName = s.name;
+            }
+            if(!this.store){
+                this.mode = 'local';
+                var d = [], opts = s.options;
+                for(var i = 0, len = opts.length;i < len; i++){
+                    var o = opts[i],
+                        value = (o.hasAttribute ? o.hasAttribute('value') : o.getAttributeNode('value').specified) ? o.value : o.text;
+                    if(o.selected && Ext.isEmpty(this.value, true)) {
+                        this.value = value;
+                    }
+                    d.push([value, o.text]);
+                }
+                this.store = new Ext.data.ArrayStore({
+                    idIndex: 0,
+                    fields: ['value', 'text'],
+                    data : d,
+                    autoDestroy: true
+                });
+                this.valueField = 'value';
+                this.displayField = 'text';
+            }
+            s.name = Ext.id(); 
+            if(!this.lazyRender){
+                this.target = true;
+                this.el = Ext.DomHelper.insertBefore(s, this.autoCreate || this.defaultAutoCreate);
+                this.render(this.el.parentNode, s);
+            }
+            Ext.removeNode(s);
+        }
+        
+        else if(this.store){
+            this.store = Ext.StoreMgr.lookup(this.store);
+            if(this.store.autoCreated){
+                this.displayField = this.valueField = 'field1';
+                if(!this.store.expandData){
+                    this.displayField = 'field2';
+                }
+                this.mode = 'local';
+            }
+        }
+
+        this.selectedIndex = -1;
+        if(this.mode == 'local'){
+            if(!Ext.isDefined(this.initialConfig.queryDelay)){
+                this.queryDelay = 10;
+            }
+            if(!Ext.isDefined(this.initialConfig.minChars)){
+                this.minChars = 0;
+            }
+        }
+    },
+
+    
+    onRender : function(ct, position){
+        if(this.hiddenName && !Ext.isDefined(this.submitValue)){
+            this.submitValue = false;
+        }
+        Ext.form.ComboBox.superclass.onRender.call(this, ct, position);
+        if(this.hiddenName){
+            this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName,
+                    id: (this.hiddenId || Ext.id())}, 'before', true);
+
+        }
+        if(Ext.isGecko){
+            this.el.dom.setAttribute('autocomplete', 'off');
+        }
+
+        if(!this.lazyInit){
+            this.initList();
+        }else{
+            this.on('focus', this.initList, this, {single: true});
+        }
+    },
+
+    
+    initValue : function(){
+        Ext.form.ComboBox.superclass.initValue.call(this);
+        if(this.hiddenField){
+            this.hiddenField.value =
+                Ext.value(Ext.isDefined(this.hiddenValue) ? this.hiddenValue : this.value, '');
+        }
+    },
+
+    getParentZIndex : function(){
+        var zindex;
+        if (this.ownerCt){
+            this.findParentBy(function(ct){
+                zindex = parseInt(ct.getPositionEl().getStyle('z-index'), 10);
+                return !!zindex;
+            });
+        }
+        return zindex;
+    },
+    
+    getZIndex : function(listParent){
+        listParent = listParent || Ext.getDom(this.getListParent() || Ext.getBody());
+        var zindex = parseInt(Ext.fly(listParent).getStyle('z-index'), 10);
+        if(!zindex){
+            zindex = this.getParentZIndex();
+        }
+        return (zindex || 12000) + 5;
+    },
+
+    
+    initList : function(){
+        if(!this.list){
+            var cls = 'x-combo-list',
+                listParent = Ext.getDom(this.getListParent() || Ext.getBody());
+
+            this.list = new Ext.Layer({
+                parentEl: listParent,
+                shadow: this.shadow,
+                cls: [cls, this.listClass].join(' '),
+                constrain:false,
+                zindex: this.getZIndex(listParent)
+            });
+
+            var lw = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth);
+            this.list.setSize(lw, 0);
+            this.list.swallowEvent('mousewheel');
+            this.assetHeight = 0;
+            if(this.syncFont !== false){
+                this.list.setStyle('font-size', this.el.getStyle('font-size'));
+            }
+            if(this.title){
+                this.header = this.list.createChild({cls:cls+'-hd', html: this.title});
+                this.assetHeight += this.header.getHeight();
+            }
+
+            this.innerList = this.list.createChild({cls:cls+'-inner'});
+            this.mon(this.innerList, 'mouseover', this.onViewOver, this);
+            this.mon(this.innerList, 'mousemove', this.onViewMove, this);
+            this.innerList.setWidth(lw - this.list.getFrameWidth('lr'));
+
+            if(this.pageSize){
+                this.footer = this.list.createChild({cls:cls+'-ft'});
+                this.pageTb = new Ext.PagingToolbar({
+                    store: this.store,
+                    pageSize: this.pageSize,
+                    renderTo:this.footer
+                });
+                this.assetHeight += this.footer.getHeight();
+            }
+
+            if(!this.tpl){
+                
+                this.tpl = '<tpl for="."><div class="'+cls+'-item">{' + this.displayField + '}</div></tpl>';
+                
+            }
+
+            
+            this.view = new Ext.DataView({
+                applyTo: this.innerList,
+                tpl: this.tpl,
+                singleSelect: true,
+                selectedClass: this.selectedClass,
+                itemSelector: this.itemSelector || '.' + cls + '-item',
+                emptyText: this.listEmptyText,
+                deferEmptyText: false
+            });
+
+            this.mon(this.view, {
+                containerclick : this.onViewClick,
+                click : this.onViewClick,
+                scope :this
+            });
+
+            this.bindStore(this.store, true);
+
+            if(this.resizable){
+                this.resizer = new Ext.Resizable(this.list,  {
+                   pinned:true, handles:'se'
+                });
+                this.mon(this.resizer, 'resize', function(r, w, h){
+                    this.maxHeight = h-this.handleHeight-this.list.getFrameWidth('tb')-this.assetHeight;
+                    this.listWidth = w;
+                    this.innerList.setWidth(w - this.list.getFrameWidth('lr'));
+                    this.restrictHeight();
+                }, this);
+
+                this[this.pageSize?'footer':'innerList'].setStyle('margin-bottom', this.handleHeight+'px');
+            }
+        }
+    },
+
+    
+    getListParent : function() {
+        return document.body;
+    },
+
+    
+    getStore : function(){
+        return this.store;
+    },
+
+    
+    bindStore : function(store, initial){
+        if(this.store && !initial){
+            if(this.store !== store && this.store.autoDestroy){
+                this.store.destroy();
+            }else{
+                this.store.un('beforeload', this.onBeforeLoad, this);
+                this.store.un('load', this.onLoad, this);
+                this.store.un('exception', this.collapse, this);
+            }
+            if(!store){
+                this.store = null;
+                if(this.view){
+                    this.view.bindStore(null);
+                }
+                if(this.pageTb){
+                    this.pageTb.bindStore(null);
+                }
+            }
+        }
+        if(store){
+            if(!initial) {
+                this.lastQuery = null;
+                if(this.pageTb) {
+                    this.pageTb.bindStore(store);
+                }
+            }
+
+            this.store = Ext.StoreMgr.lookup(store);
+            this.store.on({
+                scope: this,
+                beforeload: this.onBeforeLoad,
+                load: this.onLoad,
+                exception: this.collapse
+            });
+
+            if(this.view){
+                this.view.bindStore(store);
+            }
+        }
+    },
+
+    reset : function(){
+        if(this.clearFilterOnReset && this.mode == 'local'){
+            this.store.clearFilter();
+        }
+        Ext.form.ComboBox.superclass.reset.call(this);
+    },
+
+    
+    initEvents : function(){
+        Ext.form.ComboBox.superclass.initEvents.call(this);
+
+        
+        this.keyNav = new Ext.KeyNav(this.el, {
+            "up" : function(e){
+                this.inKeyMode = true;
+                this.selectPrev();
+            },
+
+            "down" : function(e){
+                if(!this.isExpanded()){
+                    this.onTriggerClick();
+                }else{
+                    this.inKeyMode = true;
+                    this.selectNext();
+                }
+            },
+
+            "enter" : function(e){
+                this.onViewClick();
+            },
+
+            "esc" : function(e){
+                this.collapse();
+            },
+
+            "tab" : function(e){
+                if (this.forceSelection === true) {
+                    this.collapse();
+                } else {
+                    this.onViewClick(false);
+                }
+                return true;
+            },
+
+            scope : this,
+
+            doRelay : function(e, h, hname){
+                if(hname == 'down' || this.scope.isExpanded()){
+                    
+                    var relay = Ext.KeyNav.prototype.doRelay.apply(this, arguments);
+                    if(!Ext.isIE && Ext.EventManager.useKeydown){
+                        
+                        this.scope.fireKey(e);
+                    }
+                    return relay;
+                }
+                return true;
+            },
+
+            forceKeyDown : true,
+            defaultEventAction: 'stopEvent'
+        });
+        this.queryDelay = Math.max(this.queryDelay || 10,
+                this.mode == 'local' ? 10 : 250);
+        this.dqTask = new Ext.util.DelayedTask(this.initQuery, this);
+        if(this.typeAhead){
+            this.taTask = new Ext.util.DelayedTask(this.onTypeAhead, this);
+        }
+        if(!this.enableKeyEvents){
+            this.mon(this.el, 'keyup', this.onKeyUp, this);
+        }
+    },
+
+
+    
+    onDestroy : function(){
+        if (this.dqTask){
+            this.dqTask.cancel();
+            this.dqTask = null;
+        }
+        this.bindStore(null);
+        Ext.destroy(
+            this.resizer,
+            this.view,
+            this.pageTb,
+            this.list
+        );
+        Ext.destroyMembers(this, 'hiddenField');
+        Ext.form.ComboBox.superclass.onDestroy.call(this);
+    },
+
+    
+    fireKey : function(e){
+        if (!this.isExpanded()) {
+            Ext.form.ComboBox.superclass.fireKey.call(this, e);
+        }
+    },
+
+    
+    onResize : function(w, h){
+        Ext.form.ComboBox.superclass.onResize.apply(this, arguments);
+        if(!isNaN(w) && this.isVisible() && this.list){
+            this.doResize(w);
+        }else{
+            this.bufferSize = w;
+        }
+    },
+
+    doResize: function(w){
+        if(!Ext.isDefined(this.listWidth)){
+            var lw = Math.max(w, this.minListWidth);
+            this.list.setWidth(lw);
+            this.innerList.setWidth(lw - this.list.getFrameWidth('lr'));
+        }
+    },
+
+    
+    onEnable : function(){
+        Ext.form.ComboBox.superclass.onEnable.apply(this, arguments);
+        if(this.hiddenField){
+            this.hiddenField.disabled = false;
+        }
+    },
+
+    
+    onDisable : function(){
+        Ext.form.ComboBox.superclass.onDisable.apply(this, arguments);
+        if(this.hiddenField){
+            this.hiddenField.disabled = true;
+        }
+    },
+
+    
+    onBeforeLoad : function(){
+        if(!this.hasFocus){
+            return;
+        }
+        this.innerList.update(this.loadingText ?
+               '<div class="loading-indicator">'+this.loadingText+'</div>' : '');
+        this.restrictHeight();
+        this.selectedIndex = -1;
+    },
+
+    
+    onLoad : function(){
+        if(!this.hasFocus){
+            return;
+        }
+        if(this.store.getCount() > 0 || this.listEmptyText){
+            this.expand();
+            this.restrictHeight();
+            if(this.lastQuery == this.allQuery){
+                if(this.editable){
+                    this.el.dom.select();
+                }
+
+                if(this.autoSelect !== false && !this.selectByValue(this.value, true)){
+                    this.select(0, true);
+                }
+            }else{
+                if(this.autoSelect !== false){
+                    this.selectNext();
+                }
+                if(this.typeAhead && this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE){
+                    this.taTask.delay(this.typeAheadDelay);
+                }
+            }
+        }else{
+            this.collapse();
+        }
+
+    },
+
+    
+    onTypeAhead : function(){
+        if(this.store.getCount() > 0){
+            var r = this.store.getAt(0);
+            var newValue = r.data[this.displayField];
+            var len = newValue.length;
+            var selStart = this.getRawValue().length;
+            if(selStart != len){
+                this.setRawValue(newValue);
+                this.selectText(selStart, newValue.length);
+            }
+        }
+    },
+
+    
+    assertValue : function(){
+        var val = this.getRawValue(),
+            rec;
+
+        if(this.valueField && Ext.isDefined(this.value)){
+            rec = this.findRecord(this.valueField, this.value);
+        }
+        if(!rec || rec.get(this.displayField) != val){
+            rec = this.findRecord(this.displayField, val);
+        }
+        if(!rec && this.forceSelection){
+            if(val.length > 0 && val != this.emptyText){
+                this.el.dom.value = Ext.value(this.lastSelectionText, '');
+                this.applyEmptyText();
+            }else{
+                this.clearValue();
+            }
+        }else{
+            if(rec && this.valueField){
+                
+                
+                
+                if (this.value == val){
+                    return;
+                }
+                val = rec.get(this.valueField || this.displayField);
+            }
+            this.setValue(val);
+        }
+    },
+
+    
+    onSelect : function(record, index){
+        if(this.fireEvent('beforeselect', this, record, index) !== false){
+            this.setValue(record.data[this.valueField || this.displayField]);
+            this.collapse();
+            this.fireEvent('select', this, record, index);
+        }
+    },
+
+    
+    getName: function(){
+        var hf = this.hiddenField;
+        return hf && hf.name ? hf.name : this.hiddenName || Ext.form.ComboBox.superclass.getName.call(this);
+    },
+
+    
+    getValue : function(){
+        if(this.valueField){
+            return Ext.isDefined(this.value) ? this.value : '';
+        }else{
+            return Ext.form.ComboBox.superclass.getValue.call(this);
+        }
+    },
+
+    
+    clearValue : function(){
+        if(this.hiddenField){
+            this.hiddenField.value = '';
+        }
+        this.setRawValue('');
+        this.lastSelectionText = '';
+        this.applyEmptyText();
+        this.value = '';
+    },
+
+    
+    setValue : function(v){
+        var text = v;
+        if(this.valueField){
+            var r = this.findRecord(this.valueField, v);
+            if(r){
+                text = r.data[this.displayField];
+            }else if(Ext.isDefined(this.valueNotFoundText)){
+                text = this.valueNotFoundText;
+            }
+        }
+        this.lastSelectionText = text;
+        if(this.hiddenField){
+            this.hiddenField.value = Ext.value(v, '');
+        }
+        Ext.form.ComboBox.superclass.setValue.call(this, text);
+        this.value = v;
+        return this;
+    },
+
+    
+    findRecord : function(prop, value){
+        var record;
+        if(this.store.getCount() > 0){
+            this.store.each(function(r){
+                if(r.data[prop] == value){
+                    record = r;
+                    return false;
+                }
+            });
+        }
+        return record;
+    },
+
+    
+    onViewMove : function(e, t){
+        this.inKeyMode = false;
+    },
+
+    
+    onViewOver : function(e, t){
+        if(this.inKeyMode){ 
+            return;
+        }
+        var item = this.view.findItemFromChild(t);
+        if(item){
+            var index = this.view.indexOf(item);
+            this.select(index, false);
+        }
+    },
+
+    
+    onViewClick : function(doFocus){
+        var index = this.view.getSelectedIndexes()[0],
+            s = this.store,
+            r = s.getAt(index);
+        if(r){
+            this.onSelect(r, index);
+        }else {
+            this.collapse();
+        }
+        if(doFocus !== false){
+            this.el.focus();
+        }
+    },
+
+
+    
+    restrictHeight : function(){
+        this.innerList.dom.style.height = '';
+        var inner = this.innerList.dom,
+            pad = this.list.getFrameWidth('tb') + (this.resizable ? this.handleHeight : 0) + this.assetHeight,
+            h = Math.max(inner.clientHeight, inner.offsetHeight, inner.scrollHeight),
+            ha = this.getPosition()[1]-Ext.getBody().getScroll().top,
+            hb = Ext.lib.Dom.getViewHeight()-ha-this.getSize().height,
+            space = Math.max(ha, hb, this.minHeight || 0)-this.list.shadowOffset-pad-5;
+
+        h = Math.min(h, space, this.maxHeight);
+
+        this.innerList.setHeight(h);
+        this.list.beginUpdate();
+        this.list.setHeight(h+pad);
+        this.list.alignTo.apply(this.list, [this.el].concat(this.listAlign));
+        this.list.endUpdate();
+    },
+
+    
+    isExpanded : function(){
+        return this.list && this.list.isVisible();
+    },
+
+    
+    selectByValue : function(v, scrollIntoView){
+        if(!Ext.isEmpty(v, true)){
+            var r = this.findRecord(this.valueField || this.displayField, v);
+            if(r){
+                this.select(this.store.indexOf(r), scrollIntoView);
+                return true;
+            }
+        }
+        return false;
+    },
+
+    
+    select : function(index, scrollIntoView){
+        this.selectedIndex = index;
+        this.view.select(index);
+        if(scrollIntoView !== false){
+            var el = this.view.getNode(index);
+            if(el){
+                this.innerList.scrollChildIntoView(el, false);
+            }
+        }
+
+    },
+
+    
+    selectNext : function(){
+        var ct = this.store.getCount();
+        if(ct > 0){
+            if(this.selectedIndex == -1){
+                this.select(0);
+            }else if(this.selectedIndex < ct-1){
+                this.select(this.selectedIndex+1);
+            }
+        }
+    },
+
+    
+    selectPrev : function(){
+        var ct = this.store.getCount();
+        if(ct > 0){
+            if(this.selectedIndex == -1){
+                this.select(0);
+            }else if(this.selectedIndex !== 0){
+                this.select(this.selectedIndex-1);
+            }
+        }
+    },
+
+    
+    onKeyUp : function(e){
+        var k = e.getKey();
+        if(this.editable !== false && this.readOnly !== true && (k == e.BACKSPACE || !e.isSpecialKey())){
+
+            this.lastKey = k;
+            this.dqTask.delay(this.queryDelay);
+        }
+        Ext.form.ComboBox.superclass.onKeyUp.call(this, e);
+    },
+
+    
+    validateBlur : function(){
+        return !this.list || !this.list.isVisible();
+    },
+
+    
+    initQuery : function(){
+        this.doQuery(this.getRawValue());
+    },
+
+    
+    beforeBlur : function(){
+        this.assertValue();
+    },
+
+    
+    postBlur  : function(){
+        Ext.form.ComboBox.superclass.postBlur.call(this);
+        this.collapse();
+        this.inKeyMode = false;
+    },
+
+    
+    doQuery : function(q, forceAll){
+        q = Ext.isEmpty(q) ? '' : q;
+        var qe = {
+            query: q,
+            forceAll: forceAll,
+            combo: this,
+            cancel:false
+        };
+        if(this.fireEvent('beforequery', qe)===false || qe.cancel){
+            return false;
+        }
+        q = qe.query;
+        forceAll = qe.forceAll;
+        if(forceAll === true || (q.length >= this.minChars)){
+            if(this.lastQuery !== q){
+                this.lastQuery = q;
+                if(this.mode == 'local'){
+                    this.selectedIndex = -1;
+                    if(forceAll){
+                        this.store.clearFilter();
+                    }else{
+                        this.store.filter(this.displayField, q);
+                    }
+                    this.onLoad();
+                }else{
+                    this.store.baseParams[this.queryParam] = q;
+                    this.store.load({
+                        params: this.getParams(q)
+                    });
+                    this.expand();
+                }
+            }else{
+                this.selectedIndex = -1;
+                this.onLoad();
+            }
+        }
+    },
+
+    
+    getParams : function(q){
+        var params = {},
+            paramNames = this.store.paramNames;
+        if(this.pageSize){
+            params[paramNames.start] = 0;
+            params[paramNames.limit] = this.pageSize;
+        }
+        return params;
+    },
+
+    
+    collapse : function(){
+        if(!this.isExpanded()){
+            return;
+        }
+        this.list.hide();
+        Ext.getDoc().un('mousewheel', this.collapseIf, this);
+        Ext.getDoc().un('mousedown', this.collapseIf, this);
+        this.fireEvent('collapse', this);
+    },
+
+    
+    collapseIf : function(e){
+        if(!this.isDestroyed && !e.within(this.wrap) && !e.within(this.list)){
+            this.collapse();
+        }
+    },
+
+    
+    expand : function(){
+        if(this.isExpanded() || !this.hasFocus){
+            return;
+        }
+
+        if(this.title || this.pageSize){
+            this.assetHeight = 0;
+            if(this.title){
+                this.assetHeight += this.header.getHeight();
+            }
+            if(this.pageSize){
+                this.assetHeight += this.footer.getHeight();
+            }
+        }
+
+        if(this.bufferSize){
+            this.doResize(this.bufferSize);
+            delete this.bufferSize;
+        }
+        this.list.alignTo.apply(this.list, [this.el].concat(this.listAlign));
+
+        
+        this.list.setZIndex(this.getZIndex());
+        this.list.show();
+        if(Ext.isGecko2){
+            this.innerList.setOverflow('auto'); 
+        }
+        this.mon(Ext.getDoc(), {
+            scope: this,
+            mousewheel: this.collapseIf,
+            mousedown: this.collapseIf
+        });
+        this.fireEvent('expand', this);
+    },
+
+    
+    
+    
+    onTriggerClick : function(){
+        if(this.readOnly || this.disabled){
+            return;
+        }
+        if(this.isExpanded()){
+            this.collapse();
+            this.el.focus();
+        }else {
+            this.onFocus({});
+            if(this.triggerAction == 'all') {
+                this.doQuery(this.allQuery, true);
+            } else {
+                this.doQuery(this.getRawValue());
+            }
+            this.el.focus();
+        }
+    }
+
+    
+    
+    
+    
+
+});
+Ext.reg('combo', Ext.form.ComboBox);
+
+Ext.form.Checkbox = Ext.extend(Ext.form.Field,  {
+    
+    focusClass : undefined,
+    
+    fieldClass : 'x-form-field',
+    
+    checked : false,
+    
+    boxLabel: '&#160;',
+    
+    defaultAutoCreate : { tag: 'input', type: 'checkbox', autocomplete: 'off'},
+    
+    
+    
+
+    
+    actionMode : 'wrap',
+
+       
+    initComponent : function(){
+        Ext.form.Checkbox.superclass.initComponent.call(this);
+        this.addEvents(
+            
+            'check'
+        );
+    },
+
+    
+    onResize : function(){
+        Ext.form.Checkbox.superclass.onResize.apply(this, arguments);
+        if(!this.boxLabel && !this.fieldLabel){
+            this.el.alignTo(this.wrap, 'c-c');
+        }
+    },
+
+    
+    initEvents : function(){
+        Ext.form.Checkbox.superclass.initEvents.call(this);
+        this.mon(this.el, {
+            scope: this,
+            click: this.onClick,
+            change: this.onClick
+        });
+    },
+
+    
+    markInvalid : Ext.emptyFn,
+    
+    clearInvalid : Ext.emptyFn,
+
+    
+    onRender : function(ct, position){
+        Ext.form.Checkbox.superclass.onRender.call(this, ct, position);
+        if(this.inputValue !== undefined){
+            this.el.dom.value = this.inputValue;
+        }
+        this.wrap = this.el.wrap({cls: 'x-form-check-wrap'});
+        if(this.boxLabel){
+            this.wrap.createChild({tag: 'label', htmlFor: this.el.id, cls: 'x-form-cb-label', html: this.boxLabel});
+        }
+        if(this.checked){
+            this.setValue(true);
+        }else{
+            this.checked = this.el.dom.checked;
+        }
+        
+        if (Ext.isIE && !Ext.isStrict) {
+            this.wrap.repaint();
+        }
+        this.resizeEl = this.positionEl = this.wrap;
+    },
+
+    
+    onDestroy : function(){
+        Ext.destroy(this.wrap);
+        Ext.form.Checkbox.superclass.onDestroy.call(this);
+    },
+
+    
+    initValue : function() {
+        this.originalValue = this.getValue();
+    },
+
+    
+    getValue : function(){
+        if(this.rendered){
+            return this.el.dom.checked;
+        }
+        return this.checked;
+    },
+
+       
+    onClick : function(){
+        if(this.el.dom.checked != this.checked){
+            this.setValue(this.el.dom.checked);
+        }
+    },
+
+    
+    setValue : function(v){
+        var checked = this.checked,
+            inputVal = this.inputValue;
+            
+        this.checked = (v === true || v === 'true' || v == '1' || (inputVal ? v == inputVal : String(v).toLowerCase() == 'on'));
+        if(this.rendered){
+            this.el.dom.checked = this.checked;
+            this.el.dom.defaultChecked = this.checked;
+        }
+        if(checked != this.checked){
+            this.fireEvent('check', this, this.checked);
+            if(this.handler){
+                this.handler.call(this.scope || this, this, this.checked);
+            }
+        }
+        return this;
+    }
+});
+Ext.reg('checkbox', Ext.form.Checkbox);
+
+Ext.form.CheckboxGroup = Ext.extend(Ext.form.Field, {
+    
+    
+    columns : 'auto',
+    
+    vertical : false,
+    
+    allowBlank : true,
+    
+    blankText : "You must select at least one item in this group",
+
+    
+    defaultType : 'checkbox',
+
+    
+    groupCls : 'x-form-check-group',
+
+    
+    initComponent: function(){
+        this.addEvents(
+            
+            'change'
+        );
+        this.on('change', this.validate, this);
+        Ext.form.CheckboxGroup.superclass.initComponent.call(this);
+    },
+
+    
+    onRender : function(ct, position){
+        if(!this.el){
+            var panelCfg = {
+                autoEl: {
+                    id: this.id
+                },
+                cls: this.groupCls,
+                layout: 'column',
+                renderTo: ct,
+                bufferResize: false 
+            };
+            var colCfg = {
+                xtype: 'container',
+                defaultType: this.defaultType,
+                layout: 'form',
+                defaults: {
+                    hideLabel: true,
+                    anchor: '100%'
+                }
+            };
+
+            if(this.items[0].items){
+
+                
+
+                Ext.apply(panelCfg, {
+                    layoutConfig: {columns: this.items.length},
+                    defaults: this.defaults,
+                    items: this.items
+                });
+                for(var i=0, len=this.items.length; i<len; i++){
+                    Ext.applyIf(this.items[i], colCfg);
+                }
+
+            }else{
+
+                
+                
+
+                var numCols, cols = [];
+
+                if(typeof this.columns == 'string'){ 
+                    this.columns = this.items.length;
+                }
+                if(!Ext.isArray(this.columns)){
+                    var cs = [];
+                    for(var i=0; i<this.columns; i++){
+                        cs.push((100/this.columns)*.01); 
+                    }
+                    this.columns = cs;
+                }
+
+                numCols = this.columns.length;
+
+                
+                for(var i=0; i<numCols; i++){
+                    var cc = Ext.apply({items:[]}, colCfg);
+                    cc[this.columns[i] <= 1 ? 'columnWidth' : 'width'] = this.columns[i];
+                    if(this.defaults){
+                        cc.defaults = Ext.apply(cc.defaults || {}, this.defaults);
+                    }
+                    cols.push(cc);
+                };
+
+                
+                if(this.vertical){
+                    var rows = Math.ceil(this.items.length / numCols), ri = 0;
+                    for(var i=0, len=this.items.length; i<len; i++){
+                        if(i>0 && i%rows==0){
+                            ri++;
+                        }
+                        if(this.items[i].fieldLabel){
+                            this.items[i].hideLabel = false;
+                        }
+                        cols[ri].items.push(this.items[i]);
+                    };
+                }else{
+                    for(var i=0, len=this.items.length; i<len; i++){
+                        var ci = i % numCols;
+                        if(this.items[i].fieldLabel){
+                            this.items[i].hideLabel = false;
+                        }
+                        cols[ci].items.push(this.items[i]);
+                    };
+                }
+
+                Ext.apply(panelCfg, {
+                    layoutConfig: {columns: numCols},
+                    items: cols
+                });
+            }
+
+            this.panel = new Ext.Container(panelCfg);
+            this.panel.ownerCt = this;
+            this.el = this.panel.getEl();
+
+            if(this.forId && this.itemCls){
+                var l = this.el.up(this.itemCls).child('label', true);
+                if(l){
+                    l.setAttribute('htmlFor', this.forId);
+                }
+            }
+
+            var fields = this.panel.findBy(function(c){
+                return c.isFormField;
+            }, this);
+
+            this.items = new Ext.util.MixedCollection();
+            this.items.addAll(fields);
+        }
+        Ext.form.CheckboxGroup.superclass.onRender.call(this, ct, position);
+    },
+
+    initValue : function(){
+        if(this.value){
+            this.setValue.apply(this, this.buffered ? this.value : [this.value]);
+            delete this.buffered;
+            delete this.value;
+        }
+    },
+
+    afterRender : function(){
+        Ext.form.CheckboxGroup.superclass.afterRender.call(this);
+        this.eachItem(function(item){
+            item.on('check', this.fireChecked, this);
+            item.inGroup = true;
+        });
+    },
+
+    
+    doLayout: function(){
+        
+        if(this.rendered){
+            this.panel.forceLayout = this.ownerCt.forceLayout;
+            this.panel.doLayout();
+        }
+    },
+
+    
+    fireChecked: function(){
+        var arr = [];
+        this.eachItem(function(item){
+            if(item.checked){
+                arr.push(item);
+            }
+        });
+        this.fireEvent('change', this, arr);
+    },
+    
+    
+    getErrors: function() {
+        var errors = Ext.form.CheckboxGroup.superclass.getErrors.apply(this, arguments);
+        
+        if (!this.allowBlank) {
+            var blank = true;
+            
+            this.eachItem(function(f){
+                if (f.checked) {
+                    return (blank = false);
+                }
+            });
+            
+            if (blank) errors.push(this.blankText);
+        }
+        
+        return errors;
+    },
+
+    
+    isDirty: function(){
+        
+        if (this.disabled || !this.rendered) {
+            return false;
+        }
+
+        var dirty = false;
+        
+        this.eachItem(function(item){
+            if(item.isDirty()){
+                dirty = true;
+                return false;
+            }
+        });
+        
+        return dirty;
+    },
+
+    
+    setReadOnly : function(readOnly){
+        if(this.rendered){
+            this.eachItem(function(item){
+                item.setReadOnly(readOnly);
+            });
+        }
+        this.readOnly = readOnly;
+    },
+
+    
+    onDisable : function(){
+        this.eachItem(function(item){
+            item.disable();
+        });
+    },
+
+    
+    onEnable : function(){
+        this.eachItem(function(item){
+            item.enable();
+        });
+    },
+
+    
+    onResize : function(w, h){
+        this.panel.setSize(w, h);
+        this.panel.doLayout();
+    },
+
+    
+    reset : function(){
+        if (this.originalValue) {
+            
+            this.eachItem(function(c){
+                if(c.setValue){
+                    c.setValue(false);
+                    c.originalValue = c.getValue();
+                }
+            });
+            
+            
+            this.resetOriginal = true;
+            this.setValue(this.originalValue);
+            delete this.resetOriginal;
+        } else {
+            this.eachItem(function(c){
+                if(c.reset){
+                    c.reset();
+                }
+            });
+        }
+        
+        
+        (function() {
+            this.clearInvalid();
+        }).defer(50, this);
+    },
+
+    
+    setValue: function(){
+        if(this.rendered){
+            this.onSetValue.apply(this, arguments);
+        }else{
+            this.buffered = true;
+            this.value = arguments;
+        }
+        return this;
+    },
+
+    
+    onSetValue: function(id, value){
+        if(arguments.length == 1){
+            if(Ext.isArray(id)){
+                Ext.each(id, function(val, idx){
+                    if (Ext.isObject(val) && val.setValue){ 
+                        val.setValue(true);
+                        if (this.resetOriginal === true) {
+                            val.originalValue = val.getValue();
+                        }
+                    } else { 
+                        var item = this.items.itemAt(idx);
+                        if(item){
+                            item.setValue(val);
+                        }
+                    }
+                }, this);
+            }else if(Ext.isObject(id)){
+                
+                for(var i in id){
+                    var f = this.getBox(i);
+                    if(f){
+                        f.setValue(id[i]);
+                    }
+                }
+            }else{
+                this.setValueForItem(id);
+            }
+        }else{
+            var f = this.getBox(id);
+            if(f){
+                f.setValue(value);
+            }
+        }
+    },
+
+    
+    beforeDestroy: function(){
+        Ext.destroy(this.panel);
+        if (!this.rendered) {
+            Ext.destroy(this.items);
+        }
+        Ext.form.CheckboxGroup.superclass.beforeDestroy.call(this);
+
+    },
+
+    setValueForItem : function(val){
+        val = String(val).split(',');
+        this.eachItem(function(item){
+            if(val.indexOf(item.inputValue)> -1){
+                item.setValue(true);
+            }
+        });
+    },
+
+    
+    getBox : function(id){
+        var box = null;
+        this.eachItem(function(f){
+            if(id == f || f.dataIndex == id || f.id == id || f.getName() == id){
+                box = f;
+                return false;
+            }
+        });
+        return box;
+    },
+
+    
+    getValue : function(){
+        var out = [];
+        this.eachItem(function(item){
+            if(item.checked){
+                out.push(item);
+            }
+        });
+        return out;
+    },
+
+    
+    eachItem: function(fn, scope) {
+        if(this.items && this.items.each){
+            this.items.each(fn, scope || this);
+        }
+    },
+
+    
+
+    
+    getRawValue : Ext.emptyFn,
+
+    
+    setRawValue : Ext.emptyFn
+
+});
+
+Ext.reg('checkboxgroup', Ext.form.CheckboxGroup);
+
+Ext.form.CompositeField = Ext.extend(Ext.form.Field, {
+
+    
+    defaultMargins: '0 5 0 0',
+
+    
+    skipLastItemMargin: true,
+
+    
+    isComposite: true,
+
+    
+    combineErrors: true,
+    
+    
+    labelConnector: ', ',
+    
+    
+
+    
+    
+    initComponent: function() {
+        var labels = [],
+            items  = this.items,
+            item;
+
+        for (var i=0, j = items.length; i < j; i++) {
+            item = items[i];
+            
+            if (!Ext.isEmpty(item.ref)){
+                item.ref = '../' + item.ref;
+            }
+
+            labels.push(item.fieldLabel);
+
+            
+            Ext.applyIf(item, this.defaults);
+
+            
+            if (!(i == j - 1 && this.skipLastItemMargin)) {
+                Ext.applyIf(item, {margins: this.defaultMargins});
+            }
+        }
+
+        this.fieldLabel = this.fieldLabel || this.buildLabel(labels);
+
+        
+        this.fieldErrors = new Ext.util.MixedCollection(true, function(item) {
+            return item.field;
+        });
+
+        this.fieldErrors.on({
+            scope  : this,
+            add    : this.updateInvalidMark,
+            remove : this.updateInvalidMark,
+            replace: this.updateInvalidMark
+        });
+
+        Ext.form.CompositeField.superclass.initComponent.apply(this, arguments);
+        
+        this.innerCt = new Ext.Container({
+            layout  : 'hbox',
+            items   : this.items,
+            cls     : 'x-form-composite',
+            defaultMargins: '0 3 0 0',
+            ownerCt: this
+        });
+        this.innerCt.ownerCt = undefined;
+        
+        var fields = this.innerCt.findBy(function(c) {
+            return c.isFormField;
+        }, this);
+
+        
+        this.items = new Ext.util.MixedCollection();
+        this.items.addAll(fields);
+        
+    },
+
+    
+    onRender: function(ct, position) {
+        if (!this.el) {
+            
+            var innerCt = this.innerCt;
+            innerCt.render(ct);
+
+            this.el = innerCt.getEl();
+
+            
+            
+            if (this.combineErrors) {
+                this.eachItem(function(field) {
+                    Ext.apply(field, {
+                        markInvalid : this.onFieldMarkInvalid.createDelegate(this, [field], 0),
+                        clearInvalid: this.onFieldClearInvalid.createDelegate(this, [field], 0)
+                    });
+                });
+            }
+
+            
+            var l = this.el.parent().parent().child('label', true);
+            if (l) {
+                l.setAttribute('for', this.items.items[0].id);
+            }
+        }
+
+        Ext.form.CompositeField.superclass.onRender.apply(this, arguments);
+    },
+
+    
+    onFieldMarkInvalid: function(field, message) {
+        var name  = field.getName(),
+            error = {
+                field: name, 
+                errorName: field.fieldLabel || name,
+                error: message
+            };
+
+        this.fieldErrors.replace(name, error);
+
+        field.el.addClass(field.invalidClass);
+    },
+
+    
+    onFieldClearInvalid: function(field) {
+        this.fieldErrors.removeKey(field.getName());
+
+        field.el.removeClass(field.invalidClass);
+    },
+
+    
+    updateInvalidMark: function() {
+        var ieStrict = Ext.isIE6 && Ext.isStrict;
+
+        if (this.fieldErrors.length == 0) {
+            this.clearInvalid();
+
+            
+            if (ieStrict) {
+                this.clearInvalid.defer(50, this);
+            }
+        } else {
+            var message = this.buildCombinedErrorMessage(this.fieldErrors.items);
+
+            this.sortErrors();
+            this.markInvalid(message);
+
+            
+            if (ieStrict) {
+                this.markInvalid(message);
+            }
+        }
+    },
+
+    
+    validateValue: function() {
+        var valid = true;
+
+        this.eachItem(function(field) {
+            if (!field.isValid()) valid = false;
+        });
+
+        return valid;
+    },
+
+    
+    buildCombinedErrorMessage: function(errors) {
+        var combined = [],
+            error;
+
+        for (var i = 0, j = errors.length; i < j; i++) {
+            error = errors[i];
+
+            combined.push(String.format("{0}: {1}", error.errorName, error.error));
+        }
+
+        return combined.join("<br />");
+    },
+
+    
+    sortErrors: function() {
+        var fields = this.items;
+
+        this.fieldErrors.sort("ASC", function(a, b) {
+            var findByName = function(key) {
+                return function(field) {
+                    return field.getName() == key;
+                };
+            };
+
+            var aIndex = fields.findIndexBy(findByName(a.field)),
+                bIndex = fields.findIndexBy(findByName(b.field));
+
+            return aIndex < bIndex ? -1 : 1;
+        });
+    },
+
+    
+    reset: function() {
+        this.eachItem(function(item) {
+            item.reset();
+        });
+
+        
+        
+        (function() {
+            this.clearInvalid();
+        }).defer(50, this);
+    },
+    
+    
+    clearInvalidChildren: function() {
+        this.eachItem(function(item) {
+            item.clearInvalid();
+        });
+    },
+
+    
+    buildLabel: function(segments) {
+        return Ext.clean(segments).join(this.labelConnector);
+    },
+
+    
+    isDirty: function(){
+        
+        if (this.disabled || !this.rendered) {
+            return false;
+        }
+
+        var dirty = false;
+        this.eachItem(function(item){
+            if(item.isDirty()){
+                dirty = true;
+                return false;
+            }
+        });
+        return dirty;
+    },
+
+    
+    eachItem: function(fn, scope) {
+        if(this.items && this.items.each){
+            this.items.each(fn, scope || this);
+        }
+    },
+
+    
+    onResize: function(adjWidth, adjHeight, rawWidth, rawHeight) {
+        var innerCt = this.innerCt;
+
+        if (this.rendered && innerCt.rendered) {
+            innerCt.setSize(adjWidth, adjHeight);
+        }
+
+        Ext.form.CompositeField.superclass.onResize.apply(this, arguments);
+    },
+
+    
+    doLayout: function(shallow, force) {
+        if (this.rendered) {
+            var innerCt = this.innerCt;
+
+            innerCt.forceLayout = this.ownerCt.forceLayout;
+            innerCt.doLayout(shallow, force);
+        }
+    },
+
+    
+    beforeDestroy: function(){
+        Ext.destroy(this.innerCt);
+
+        Ext.form.CompositeField.superclass.beforeDestroy.call(this);
+    },
+
+    
+    setReadOnly : function(readOnly) {
+        if (readOnly == undefined) {
+            readOnly = true;
+        }
+        readOnly = !!readOnly;
+
+        if(this.rendered){
+            this.eachItem(function(item){
+                item.setReadOnly(readOnly);
+            });
+        }
+        this.readOnly = readOnly;
+    },
+
+    onShow : function() {
+        Ext.form.CompositeField.superclass.onShow.call(this);
+        this.doLayout();
+    },
+
+    
+    onDisable : function(){
+        this.eachItem(function(item){
+            item.disable();
+        });
+    },
+
+    
+    onEnable : function(){
+        this.eachItem(function(item){
+            item.enable();
+        });
+    }
+});
+
+Ext.reg('compositefield', Ext.form.CompositeField);
+Ext.form.Radio = Ext.extend(Ext.form.Checkbox, {
+    inputType: 'radio',
+
+    
+    markInvalid : Ext.emptyFn,
+    
+    clearInvalid : Ext.emptyFn,
+
+    
+    getGroupValue : function(){
+       var p = this.el.up('form') || Ext.getBody();
+        var c = p.child('input[name='+this.el.dom.name+']:checked', true);
+        return c ? c.value : null;
+    },
+
+    
+    setValue : function(v){
+       var checkEl,
+            els,
+            radio;
+       if (typeof v == 'boolean') {
+            Ext.form.Radio.superclass.setValue.call(this, v);
+        } else if (this.rendered) {
+            checkEl = this.getCheckEl();
+            radio = checkEl.child('input[name=' + this.el.dom.name + '][value=' + v + ']', true);
+            if(radio){
+                Ext.getCmp(radio.id).setValue(true);
+            }
+        }
+        if(this.rendered && this.checked){
+            checkEl = checkEl || this.getCheckEl();
+            els = this.getCheckEl().select('input[name=' + this.el.dom.name + ']');
+                       els.each(function(el){
+                               if(el.dom.id != this.id){
+                                       Ext.getCmp(el.dom.id).setValue(false);
+                               }
+                       }, this);
+        }
+        return this;
+    },
+
+    
+    getCheckEl: function(){
+        if(this.inGroup){
+            return this.el.up('.x-form-radio-group');
+        }
+        return this.el.up('form') || Ext.getBody();
+    }
+});
+Ext.reg('radio', Ext.form.Radio);
+
+Ext.form.RadioGroup = Ext.extend(Ext.form.CheckboxGroup, {
+    
+    
+    allowBlank : true,
+    
+    blankText : 'You must select one item in this group',
+    
+    
+    defaultType : 'radio',
+    
+    
+    groupCls : 'x-form-radio-group',
+    
+    
+    
+    
+    getValue : function(){
+        var out = null;
+        this.eachItem(function(item){
+            if(item.checked){
+                out = item;
+                return false;
+            }
+        });
+        return out;
+    },
+    
+    
+    onSetValue : function(id, value){
+        if(arguments.length > 1){
+            var f = this.getBox(id);
+            if(f){
+                f.setValue(value);
+                if(f.checked){
+                    this.eachItem(function(item){
+                        if (item !== f){
+                            item.setValue(false);
+                        }
+                    });
+                }
+            }
+        }else{
+            this.setValueForItem(id);
+        }
+    },
+    
+    setValueForItem : function(val){
+        val = String(val).split(',')[0];
+        this.eachItem(function(item){
+            item.setValue(val == item.inputValue);
+        });
+    },
+    
+    
+    fireChecked : function(){
+        if(!this.checkTask){
+            this.checkTask = new Ext.util.DelayedTask(this.bufferChecked, this);
+        }
+        this.checkTask.delay(10);
+    },
+    
+    
+    bufferChecked : function(){
+        var out = null;
+        this.eachItem(function(item){
+            if(item.checked){
+                out = item;
+                return false;
+            }
+        });
+        this.fireEvent('change', this, out);
+    },
+    
+    onDestroy : function(){
+        if(this.checkTask){
+            this.checkTask.cancel();
+            this.checkTask = null;
+        }
+        Ext.form.RadioGroup.superclass.onDestroy.call(this);
+    }
+
+});
+
+Ext.reg('radiogroup', Ext.form.RadioGroup);
+
+Ext.form.Hidden = Ext.extend(Ext.form.Field, {
+    
+    inputType : 'hidden',
+    
+    shouldLayout: false,
+
+    
+    onRender : function(){
+        Ext.form.Hidden.superclass.onRender.apply(this, arguments);
+    },
+
+    
+    initEvents : function(){
+        this.originalValue = this.getValue();
+    },
+
+    
+    setSize : Ext.emptyFn,
+    setWidth : Ext.emptyFn,
+    setHeight : Ext.emptyFn,
+    setPosition : Ext.emptyFn,
+    setPagePosition : Ext.emptyFn,
+    markInvalid : Ext.emptyFn,
+    clearInvalid : Ext.emptyFn
+});
+Ext.reg('hidden', Ext.form.Hidden);
+Ext.form.BasicForm = Ext.extend(Ext.util.Observable, {
+
+    constructor: function(el, config){
+        Ext.apply(this, config);
+        if(Ext.isString(this.paramOrder)){
+            this.paramOrder = this.paramOrder.split(/[\s,|]/);
+        }
+        
+        this.items = new Ext.util.MixedCollection(false, function(o){
+            return o.getItemId();
+        });
+        this.addEvents(
+            
+            'beforeaction',
+            
+            'actionfailed',
+            
+            'actioncomplete'
+        );
+
+        if(el){
+            this.initEl(el);
+        }
+        Ext.form.BasicForm.superclass.constructor.call(this);
+    },
+
+    
+    
+    
+    
+    
+    
+    
+    timeout: 30,
+
+    
+
+    
+    paramOrder: undefined,
+
+    
+    paramsAsHash: false,
+
+    
+    waitTitle: 'Please Wait...',
+
+    
+    activeAction : null,
+
+    
+    trackResetOnLoad : false,
+
+    
+    
+
+    
+    initEl : function(el){
+        this.el = Ext.get(el);
+        this.id = this.el.id || Ext.id();
+        if(!this.standardSubmit){
+            this.el.on('submit', this.onSubmit, this);
+        }
+        this.el.addClass('x-form');
+    },
+
+    
+    getEl: function(){
+        return this.el;
+    },
+
+    
+    onSubmit : function(e){
+        e.stopEvent();
+    },
+
+    
+    destroy: function(bound){
+        if(bound !== true){
+            this.items.each(function(f){
+                Ext.destroy(f);
+            });
+            Ext.destroy(this.el);
+        }
+        this.items.clear();
+        this.purgeListeners();
+    },
+
+    
+    isValid : function(){
+        var valid = true;
+        this.items.each(function(f){
+           if(!f.validate()){
+               valid = false;
+           }
+        });
+        return valid;
+    },
+
+    
+    isDirty : function(){
+        var dirty = false;
+        this.items.each(function(f){
+           if(f.isDirty()){
+               dirty = true;
+               return false;
+           }
+        });
+        return dirty;
+    },
+
+    
+    doAction : function(action, options){
+        if(Ext.isString(action)){
+            action = new Ext.form.Action.ACTION_TYPES[action](this, options);
+        }
+        if(this.fireEvent('beforeaction', this, action) !== false){
+            this.beforeAction(action);
+            action.run.defer(100, action);
+        }
+        return this;
+    },
+
+    
+    submit : function(options){
+        options = options || {};
+        if(this.standardSubmit){
+            var v = options.clientValidation === false || this.isValid();
+            if(v){
+                var el = this.el.dom;
+                if(this.url && Ext.isEmpty(el.action)){
+                    el.action = this.url;
+                }
+                el.submit();
+            }
+            return v;
+        }
+        var submitAction = String.format('{0}submit', this.api ? 'direct' : '');
+        this.doAction(submitAction, options);
+        return this;
+    },
+
+    
+    load : function(options){
+        var loadAction = String.format('{0}load', this.api ? 'direct' : '');
+        this.doAction(loadAction, options);
+        return this;
+    },
+
+    
+    updateRecord : function(record){
+        record.beginEdit();
+        var fs = record.fields,
+            field,
+            value;
+        fs.each(function(f){
+            field = this.findField(f.name);
+            if(field){
+                value = field.getValue();
+                if (typeof value != undefined && value.getGroupValue) {
+                    value = value.getGroupValue();
+                } else if ( field.eachItem ) {
+                    value = [];
+                    field.eachItem(function(item){
+                        value.push(item.getValue());
+                    });
+                }
+                record.set(f.name, value);
+            }
+        }, this);
+        record.endEdit();
+        return this;
+    },
+
+    
+    loadRecord : function(record){
+        this.setValues(record.data);
+        return this;
+    },
+
+    
+    beforeAction : function(action){
+        
+        this.items.each(function(f){
+            if(f.isFormField && f.syncValue){
+                f.syncValue();
+            }
+        });
+        var o = action.options;
+        if(o.waitMsg){
+            if(this.waitMsgTarget === true){
+                this.el.mask(o.waitMsg, 'x-mask-loading');
+            }else if(this.waitMsgTarget){
+                this.waitMsgTarget = Ext.get(this.waitMsgTarget);
+                this.waitMsgTarget.mask(o.waitMsg, 'x-mask-loading');
+            }else{
+                Ext.MessageBox.wait(o.waitMsg, o.waitTitle || this.waitTitle);
+            }
+        }
+    },
+
+    
+    afterAction : function(action, success){
+        this.activeAction = null;
+        var o = action.options;
+        if(o.waitMsg){
+            if(this.waitMsgTarget === true){
+                this.el.unmask();
+            }else if(this.waitMsgTarget){
+                this.waitMsgTarget.unmask();
+            }else{
+                Ext.MessageBox.updateProgress(1);
+                Ext.MessageBox.hide();
+            }
+        }
+        if(success){
+            if(o.reset){
+                this.reset();
+            }
+            Ext.callback(o.success, o.scope, [this, action]);
+            this.fireEvent('actioncomplete', this, action);
+        }else{
+            Ext.callback(o.failure, o.scope, [this, action]);
+            this.fireEvent('actionfailed', this, action);
+        }
+    },
+
+    
+    findField : function(id) {
+        var field = this.items.get(id);
+
+        if (!Ext.isObject(field)) {
+            
+            var findMatchingField = function(f) {
+                if (f.isFormField) {
+                    if (f.dataIndex == id || f.id == id || f.getName() == id) {
+                        field = f;
+                        return false;
+                    } else if (f.isComposite) {
+                        return f.items.each(findMatchingField);
+                    } else if (f instanceof Ext.form.CheckboxGroup && f.rendered) {
+                        return f.eachItem(findMatchingField);
+                    }
+                }
+            };
+
+            this.items.each(findMatchingField);
+        }
+        return field || null;
+    },
+
+
+    
+    markInvalid : function(errors){
+        if (Ext.isArray(errors)) {
+            for(var i = 0, len = errors.length; i < len; i++){
+                var fieldError = errors[i];
+                var f = this.findField(fieldError.id);
+                if(f){
+                    f.markInvalid(fieldError.msg);
+                }
+            }
+        } else {
+            var field, id;
+            for(id in errors){
+                if(!Ext.isFunction(errors[id]) && (field = this.findField(id))){
+                    field.markInvalid(errors[id]);
+                }
+            }
+        }
+
+        return this;
+    },
+
+    
+    setValues : function(values){
+        if(Ext.isArray(values)){ 
+            for(var i = 0, len = values.length; i < len; i++){
+                var v = values[i];
+                var f = this.findField(v.id);
+                if(f){
+                    f.setValue(v.value);
+                    if(this.trackResetOnLoad){
+                        f.originalValue = f.getValue();
+                    }
+                }
+            }
+        }else{ 
+            var field, id;
+            for(id in values){
+                if(!Ext.isFunction(values[id]) && (field = this.findField(id))){
+                    field.setValue(values[id]);
+                    if(this.trackResetOnLoad){
+                        field.originalValue = field.getValue();
+                    }
+                }
+            }
+        }
+        return this;
+    },
+
+    
+    getValues : function(asString){
+        var fs = Ext.lib.Ajax.serializeForm(this.el.dom);
+        if(asString === true){
+            return fs;
+        }
+        return Ext.urlDecode(fs);
+    },
+
+    
+    getFieldValues : function(dirtyOnly){
+        var o = {},
+            n,
+            key,
+            val;
+        this.items.each(function(f) {
+            if (!f.disabled && (dirtyOnly !== true || f.isDirty())) {
+                n = f.getName();
+                key = o[n];
+                val = f.getValue();
+
+                if(Ext.isDefined(key)){
+                    if(Ext.isArray(key)){
+                        o[n].push(val);
+                    }else{
+                        o[n] = [key, val];
+                    }
+                }else{
+                    o[n] = val;
+                }
+            }
+        });
+        return o;
+    },
+
+    
+    clearInvalid : function(){
+        this.items.each(function(f){
+           f.clearInvalid();
+        });
+        return this;
+    },
+
+    
+    reset : function(){
+        this.items.each(function(f){
+            f.reset();
+        });
+        return this;
+    },
+
+    
+    add : function(){
+        this.items.addAll(Array.prototype.slice.call(arguments, 0));
+        return this;
+    },
+
+    
+    remove : function(field){
+        this.items.remove(field);
+        return this;
+    },
+
+    
+    cleanDestroyed : function() {
+        this.items.filterBy(function(o) { return !!o.isDestroyed; }).each(this.remove, this);
+    },
+
+    
+    render : function(){
+        this.items.each(function(f){
+            if(f.isFormField && !f.rendered && document.getElementById(f.id)){ 
+                f.applyToMarkup(f.id);
+            }
+        });
+        return this;
+    },
+
+    
+    applyToFields : function(o){
+        this.items.each(function(f){
+           Ext.apply(f, o);
+        });
+        return this;
+    },
+
+    
+    applyIfToFields : function(o){
+        this.items.each(function(f){
+           Ext.applyIf(f, o);
+        });
+        return this;
+    },
+
+    callFieldMethod : function(fnName, args){
+        args = args || [];
+        this.items.each(function(f){
+            if(Ext.isFunction(f[fnName])){
+                f[fnName].apply(f, args);
+            }
+        });
+        return this;
+    }
+});
+
+
+Ext.BasicForm = Ext.form.BasicForm;
+
+Ext.FormPanel = Ext.extend(Ext.Panel, {
+    
+    
+    
+    
+    
+    
+    
+
+
+    
+    minButtonWidth : 75,
+
+    
+    labelAlign : 'left',
+
+    
+    monitorValid : false,
+
+    
+    monitorPoll : 200,
+
+    
+    layout : 'form',
+
+    
+    initComponent : function(){
+        this.form = this.createForm();
+        Ext.FormPanel.superclass.initComponent.call(this);
+
+        this.bodyCfg = {
+            tag: 'form',
+            cls: this.baseCls + '-body',
+            method : this.method || 'POST',
+            id : this.formId || Ext.id()
+        };
+        if(this.fileUpload) {
+            this.bodyCfg.enctype = 'multipart/form-data';
+        }
+        this.initItems();
+
+        this.addEvents(
+            
+            'clientvalidation'
+        );
+
+        this.relayEvents(this.form, ['beforeaction', 'actionfailed', 'actioncomplete']);
+    },
+
+    
+    createForm : function(){
+        var config = Ext.applyIf({listeners: {}}, this.initialConfig);
+        return new Ext.form.BasicForm(null, config);
+    },
+
+    
+    initFields : function(){
+        var f = this.form;
+        var formPanel = this;
+        var fn = function(c){
+            if(formPanel.isField(c)){
+                f.add(c);
+            }else if(c.findBy && c != formPanel){
+                formPanel.applySettings(c);
+                
+                if(c.items && c.items.each){
+                    c.items.each(fn, this);
+                }
+            }
+        };
+        this.items.each(fn, this);
+    },
+
+    
+    applySettings: function(c){
+        var ct = c.ownerCt;
+        Ext.applyIf(c, {
+            labelAlign: ct.labelAlign,
+            labelWidth: ct.labelWidth,
+            itemCls: ct.itemCls
+        });
+    },
+
+    
+    getLayoutTarget : function(){
+        return this.form.el;
+    },
+
+    
+    getForm : function(){
+        return this.form;
+    },
+
+    
+    onRender : function(ct, position){
+        this.initFields();
+        Ext.FormPanel.superclass.onRender.call(this, ct, position);
+        this.form.initEl(this.body);
+    },
+
+    
+    beforeDestroy : function(){
+        this.stopMonitoring();
+        this.form.destroy(true);
+        Ext.FormPanel.superclass.beforeDestroy.call(this);
+    },
+
+    
+    isField : function(c) {
+        return !!c.setValue && !!c.getValue && !!c.markInvalid && !!c.clearInvalid;
+    },
+
+    
+    initEvents : function(){
+        Ext.FormPanel.superclass.initEvents.call(this);
+        
+        this.on({
+            scope: this,
+            add: this.onAddEvent,
+            remove: this.onRemoveEvent
+        });
+        if(this.monitorValid){ 
+            this.startMonitoring();
+        }
+    },
+
+    
+    onAdd: function(c){
+        Ext.FormPanel.superclass.onAdd.call(this, c);
+        this.processAdd(c);
+    },
+
+    
+    onAddEvent: function(ct, c){
+        if(ct !== this){
+            this.processAdd(c);
+        }
+    },
+
+    
+    processAdd : function(c){
+        
+        if(this.isField(c)){
+            this.form.add(c);
+        
+        }else if(c.findBy){
+            this.applySettings(c);
+            this.form.add.apply(this.form, c.findBy(this.isField));
+        }
+    },
+
+    
+    onRemove: function(c){
+        Ext.FormPanel.superclass.onRemove.call(this, c);
+        this.processRemove(c);
+    },
+
+    onRemoveEvent: function(ct, c){
+        if(ct !== this){
+            this.processRemove(c);
+        }
+    },
+
+    
+    processRemove: function(c){
+        if(!this.destroying){
+            
+            if(this.isField(c)){
+                this.form.remove(c);
+            
+            }else if (c.findBy){
+                Ext.each(c.findBy(this.isField), this.form.remove, this.form);
+                
+                this.form.cleanDestroyed();
+            }
+        }
+    },
+
+    
+    startMonitoring : function(){
+        if(!this.validTask){
+            this.validTask = new Ext.util.TaskRunner();
+            this.validTask.start({
+                run : this.bindHandler,
+                interval : this.monitorPoll || 200,
+                scope: this
+            });
+        }
+    },
+
+    
+    stopMonitoring : function(){
+        if(this.validTask){
+            this.validTask.stopAll();
+            this.validTask = null;
+        }
+    },
+
+    
+    load : function(){
+        this.form.load.apply(this.form, arguments);
+    },
+
+    
+    onDisable : function(){
+        Ext.FormPanel.superclass.onDisable.call(this);
+        if(this.form){
+            this.form.items.each(function(){
+                 this.disable();
+            });
+        }
+    },
+
+    
+    onEnable : function(){
+        Ext.FormPanel.superclass.onEnable.call(this);
+        if(this.form){
+            this.form.items.each(function(){
+                 this.enable();
+            });
+        }
+    },
+
+    
+    bindHandler : function(){
+        var valid = true;
+        this.form.items.each(function(f){
+            if(!f.isValid(true)){
+                valid = false;
+                return false;
+            }
+        });
+        if(this.fbar){
+            var fitems = this.fbar.items.items;
+            for(var i = 0, len = fitems.length; i < len; i++){
+                var btn = fitems[i];
+                if(btn.formBind === true && btn.disabled === valid){
+                    btn.setDisabled(!valid);
+                }
+            }
+        }
+        this.fireEvent('clientvalidation', this, valid);
+    }
+});
+Ext.reg('form', Ext.FormPanel);
+
+Ext.form.FormPanel = Ext.FormPanel;
+
+Ext.form.FieldSet = Ext.extend(Ext.Panel, {
+    
+    
+    
+    
+    
+    
+    baseCls : 'x-fieldset',
+    
+    layout : 'form',
+    
+    animCollapse : false,
+
+    
+    onRender : function(ct, position){
+        if(!this.el){
+            this.el = document.createElement('fieldset');
+            this.el.id = this.id;
+            if (this.title || this.header || this.checkboxToggle) {
+                this.el.appendChild(document.createElement('legend')).className = this.baseCls + '-header';
+            }
+        }
+
+        Ext.form.FieldSet.superclass.onRender.call(this, ct, position);
+
+        if(this.checkboxToggle){
+            var o = typeof this.checkboxToggle == 'object' ?
+                    this.checkboxToggle :
+                    {tag: 'input', type: 'checkbox', name: this.checkboxName || this.id+'-checkbox'};
+            this.checkbox = this.header.insertFirst(o);
+            this.checkbox.dom.checked = !this.collapsed;
+            this.mon(this.checkbox, 'click', this.onCheckClick, this);
+        }
+    },
+
+    
+    onCollapse : function(doAnim, animArg){
+        if(this.checkbox){
+            this.checkbox.dom.checked = false;
+        }
+        Ext.form.FieldSet.superclass.onCollapse.call(this, doAnim, animArg);
+
+    },
+
+    
+    onExpand : function(doAnim, animArg){
+        if(this.checkbox){
+            this.checkbox.dom.checked = true;
+        }
+        Ext.form.FieldSet.superclass.onExpand.call(this, doAnim, animArg);
+    },
+
+    
+    onCheckClick : function(){
+        this[this.checkbox.dom.checked ? 'expand' : 'collapse']();
+    }
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+});
+Ext.reg('fieldset', Ext.form.FieldSet);
+
+Ext.form.HtmlEditor = Ext.extend(Ext.form.Field, {
+    
+    enableFormat : true,
+    
+    enableFontSize : true,
+    
+    enableColors : true,
+    
+    enableAlignments : true,
+    
+    enableLists : true,
+    
+    enableSourceEdit : true,
+    
+    enableLinks : true,
+    
+    enableFont : true,
+    
+    createLinkText : 'Please enter the URL for the link:',
+    
+    defaultLinkValue : 'http:/'+'/',
+    
+    fontFamilies : [
+        'Arial',
+        'Courier New',
+        'Tahoma',
+        'Times New Roman',
+        'Verdana'
+    ],
+    defaultFont: 'tahoma',
+    
+    defaultValue: (Ext.isOpera || Ext.isIE6) ? '&#160;' : '&#8203;',
+
+    
+    actionMode: 'wrap',
+    validationEvent : false,
+    deferHeight: true,
+    initialized : false,
+    activated : false,
+    sourceEditMode : false,
+    onFocus : Ext.emptyFn,
+    iframePad:3,
+    hideMode:'offsets',
+    defaultAutoCreate : {
+        tag: "textarea",
+        style:"width:500px;height:300px;",
+        autocomplete: "off"
+    },
+
+    
+    initComponent : function(){
+        this.addEvents(
+            
+            'initialize',
+            
+            'activate',
+             
+            'beforesync',
+             
+            'beforepush',
+             
+            'sync',
+             
+            'push',
+             
+            'editmodechange'
+        );
+        Ext.form.HtmlEditor.superclass.initComponent.call(this);
+    },
+
+    
+    createFontOptions : function(){
+        var buf = [], fs = this.fontFamilies, ff, lc;
+        for(var i = 0, len = fs.length; i< len; i++){
+            ff = fs[i];
+            lc = ff.toLowerCase();
+            buf.push(
+                '<option value="',lc,'" style="font-family:',ff,';"',
+                    (this.defaultFont == lc ? ' selected="true">' : '>'),
+                    ff,
+                '</option>'
+            );
+        }
+        return buf.join('');
+    },
+
+    
+    createToolbar : function(editor){
+        var items = [];
+        var tipsEnabled = Ext.QuickTips && Ext.QuickTips.isEnabled();
+
+
+        function btn(id, toggle, handler){
+            return {
+                itemId : id,
+                cls : 'x-btn-icon',
+                iconCls: 'x-edit-'+id,
+                enableToggle:toggle !== false,
+                scope: editor,
+                handler:handler||editor.relayBtnCmd,
+                clickEvent:'mousedown',
+                tooltip: tipsEnabled ? editor.buttonTips[id] || undefined : undefined,
+                overflowText: editor.buttonTips[id].title || undefined,
+                tabIndex:-1
+            };
+        }
+
+
+        if(this.enableFont && !Ext.isSafari2){
+            var fontSelectItem = new Ext.Toolbar.Item({
+               autoEl: {
+                    tag:'select',
+                    cls:'x-font-select',
+                    html: this.createFontOptions()
+               }
+            });
+
+            items.push(
+                fontSelectItem,
+                '-'
+            );
+        }
+
+        if(this.enableFormat){
+            items.push(
+                btn('bold'),
+                btn('italic'),
+                btn('underline')
+            );
+        }
+
+        if(this.enableFontSize){
+            items.push(
+                '-',
+                btn('increasefontsize', false, this.adjustFont),
+                btn('decreasefontsize', false, this.adjustFont)
+            );
+        }
+
+        if(this.enableColors){
+            items.push(
+                '-', {
+                    itemId:'forecolor',
+                    cls:'x-btn-icon',
+                    iconCls: 'x-edit-forecolor',
+                    clickEvent:'mousedown',
+                    tooltip: tipsEnabled ? editor.buttonTips.forecolor || undefined : undefined,
+                    tabIndex:-1,
+                    menu : new Ext.menu.ColorMenu({
+                        allowReselect: true,
+                        focus: Ext.emptyFn,
+                        value:'000000',
+                        plain:true,
+                        listeners: {
+                            scope: this,
+                            select: function(cp, color){
+                                this.execCmd('forecolor', Ext.isWebKit || Ext.isIE ? '#'+color : color);
+                                this.deferFocus();
+                            }
+                        },
+                        clickEvent:'mousedown'
+                    })
+                }, {
+                    itemId:'backcolor',
+                    cls:'x-btn-icon',
+                    iconCls: 'x-edit-backcolor',
+                    clickEvent:'mousedown',
+                    tooltip: tipsEnabled ? editor.buttonTips.backcolor || undefined : undefined,
+                    tabIndex:-1,
+                    menu : new Ext.menu.ColorMenu({
+                        focus: Ext.emptyFn,
+                        value:'FFFFFF',
+                        plain:true,
+                        allowReselect: true,
+                        listeners: {
+                            scope: this,
+                            select: function(cp, color){
+                                if(Ext.isGecko){
+                                    this.execCmd('useCSS', false);
+                                    this.execCmd('hilitecolor', color);
+                                    this.execCmd('useCSS', true);
+                                    this.deferFocus();
+                                }else{
+                                    this.execCmd(Ext.isOpera ? 'hilitecolor' : 'backcolor', Ext.isWebKit || Ext.isIE ? '#'+color : color);
+                                    this.deferFocus();
+                                }
+                            }
+                        },
+                        clickEvent:'mousedown'
+                    })
+                }
+            );
+        }
+
+        if(this.enableAlignments){
+            items.push(
+                '-',
+                btn('justifyleft'),
+                btn('justifycenter'),
+                btn('justifyright')
+            );
+        }
+
+        if(!Ext.isSafari2){
+            if(this.enableLinks){
+                items.push(
+                    '-',
+                    btn('createlink', false, this.createLink)
+                );
+            }
+
+            if(this.enableLists){
+                items.push(
+                    '-',
+                    btn('insertorderedlist'),
+                    btn('insertunorderedlist')
+                );
+            }
+            if(this.enableSourceEdit){
+                items.push(
+                    '-',
+                    btn('sourceedit', true, function(btn){
+                        this.toggleSourceEdit(!this.sourceEditMode);
+                    })
+                );
+            }
+        }
+
+        
+        var tb = new Ext.Toolbar({
+            renderTo: this.wrap.dom.firstChild,
+            items: items
+        });
+
+        if (fontSelectItem) {
+            this.fontSelect = fontSelectItem.el;
+
+            this.mon(this.fontSelect, 'change', function(){
+                var font = this.fontSelect.dom.value;
+                this.relayCmd('fontname', font);
+                this.deferFocus();
+            }, this);
+        }
+
+        
+        this.mon(tb.el, 'click', function(e){
+            e.preventDefault();
+        });
+
+        this.tb = tb;
+        this.tb.doLayout();
+    },
+
+    onDisable: function(){
+        this.wrap.mask();
+        Ext.form.HtmlEditor.superclass.onDisable.call(this);
+    },
+
+    onEnable: function(){
+        this.wrap.unmask();
+        Ext.form.HtmlEditor.superclass.onEnable.call(this);
+    },
+
+    setReadOnly: function(readOnly){
+
+        Ext.form.HtmlEditor.superclass.setReadOnly.call(this, readOnly);
+        if(this.initialized){
+            if(Ext.isIE){
+                this.getEditorBody().contentEditable = !readOnly;
+            }else{
+                this.setDesignMode(!readOnly);
+            }
+            var bd = this.getEditorBody();
+            if(bd){
+                bd.style.cursor = this.readOnly ? 'default' : 'text';
+            }
+            this.disableItems(readOnly);
+        }
+    },
+
+    
+    getDocMarkup : function(){
+        var h = Ext.fly(this.iframe).getHeight() - this.iframePad * 2;
+        return String.format('<html><head><style type="text/css">body{border: 0; margin: 0; padding: {0}px; height: {1}px; cursor: text}</style></head><body></body></html>', this.iframePad, h);
+    },
+
+    
+    getEditorBody : function(){
+        var doc = this.getDoc();
+        return doc.body || doc.documentElement;
+    },
+
+    
+    getDoc : function(){
+        return Ext.isIE ? this.getWin().document : (this.iframe.contentDocument || this.getWin().document);
+    },
+
+    
+    getWin : function(){
+        return Ext.isIE ? this.iframe.contentWindow : window.frames[this.iframe.name];
+    },
+
+    
+    onRender : function(ct, position){
+        Ext.form.HtmlEditor.superclass.onRender.call(this, ct, position);
+        this.el.dom.style.border = '0 none';
+        this.el.dom.setAttribute('tabIndex', -1);
+        this.el.addClass('x-hidden');
+        if(Ext.isIE){ 
+            this.el.applyStyles('margin-top:-1px;margin-bottom:-1px;');
+        }
+        this.wrap = this.el.wrap({
+            cls:'x-html-editor-wrap', cn:{cls:'x-html-editor-tb'}
+        });
+
+        this.createToolbar(this);
+
+        this.disableItems(true);
+
+        this.tb.doLayout();
+
+        this.createIFrame();
+
+        if(!this.width){
+            var sz = this.el.getSize();
+            this.setSize(sz.width, this.height || sz.height);
+        }
+        this.resizeEl = this.positionEl = this.wrap;
+    },
+
+    createIFrame: function(){
+        var iframe = document.createElement('iframe');
+        iframe.name = Ext.id();
+        iframe.frameBorder = '0';
+        iframe.style.overflow = 'auto';
+        iframe.src = Ext.SSL_SECURE_URL;
+
+        this.wrap.dom.appendChild(iframe);
+        this.iframe = iframe;
+
+        this.monitorTask = Ext.TaskMgr.start({
+            run: this.checkDesignMode,
+            scope: this,
+            interval:100
+        });
+    },
+
+    initFrame : function(){
+        Ext.TaskMgr.stop(this.monitorTask);
+        var doc = this.getDoc();
+        this.win = this.getWin();
+
+        doc.open();
+        doc.write(this.getDocMarkup());
+        doc.close();
+
+        var task = { 
+            run : function(){
+                var doc = this.getDoc();
+                if(doc.body || doc.readyState == 'complete'){
+                    Ext.TaskMgr.stop(task);
+                    this.setDesignMode(true);
+                    this.initEditor.defer(10, this);
+                }
+            },
+            interval : 10,
+            duration:10000,
+            scope: this
+        };
+        Ext.TaskMgr.start(task);
+    },
+
+
+    checkDesignMode : function(){
+        if(this.wrap && this.wrap.dom.offsetWidth){
+            var doc = this.getDoc();
+            if(!doc){
+                return;
+            }
+            if(!doc.editorInitialized || this.getDesignMode() != 'on'){
+                this.initFrame();
+            }
+        }
+    },
+
+    
+    setDesignMode : function(mode){
+        var doc = this.getDoc();
+        if (doc) {
+            if(this.readOnly){
+                mode = false;
+            }
+            doc.designMode = (/on|true/i).test(String(mode).toLowerCase()) ?'on':'off';
+        }
+
+    },
+
+    
+    getDesignMode : function(){
+        var doc = this.getDoc();
+        if(!doc){ return ''; }
+        return String(doc.designMode).toLowerCase();
+
+    },
+
+    disableItems: function(disabled){
+        if(this.fontSelect){
+            this.fontSelect.dom.disabled = disabled;
+        }
+        this.tb.items.each(function(item){
+            if(item.getItemId() != 'sourceedit'){
+                item.setDisabled(disabled);
+            }
+        });
+    },
+
+    
+    onResize : function(w, h){
+        Ext.form.HtmlEditor.superclass.onResize.apply(this, arguments);
+        if(this.el && this.iframe){
+            if(Ext.isNumber(w)){
+                var aw = w - this.wrap.getFrameWidth('lr');
+                this.el.setWidth(aw);
+                this.tb.setWidth(aw);
+                this.iframe.style.width = Math.max(aw, 0) + 'px';
+            }
+            if(Ext.isNumber(h)){
+                var ah = h - this.wrap.getFrameWidth('tb') - this.tb.el.getHeight();
+                this.el.setHeight(ah);
+                this.iframe.style.height = Math.max(ah, 0) + 'px';
+                var bd = this.getEditorBody();
+                if(bd){
+                    bd.style.height = Math.max((ah - (this.iframePad*2)), 0) + 'px';
+                }
+            }
+        }
+    },
+
+    
+    toggleSourceEdit : function(sourceEditMode){
+        var iframeHeight,
+            elHeight;
+
+        if (sourceEditMode === undefined) {
+            sourceEditMode = !this.sourceEditMode;
+        }
+        this.sourceEditMode = sourceEditMode === true;
+        var btn = this.tb.getComponent('sourceedit');
+
+        if (btn.pressed !== this.sourceEditMode) {
+            btn.toggle(this.sourceEditMode);
+            if (!btn.xtbHidden) {
+                return;
+            }
+        }
+        if (this.sourceEditMode) {
+            
+            this.previousSize = this.getSize();
+
+            iframeHeight = Ext.get(this.iframe).getHeight();
+
+            this.disableItems(true);
+            this.syncValue();
+            this.iframe.className = 'x-hidden';
+            this.el.removeClass('x-hidden');
+            this.el.dom.removeAttribute('tabIndex');
+            this.el.focus();
+            this.el.dom.style.height = iframeHeight + 'px';
+        }
+        else {
+            elHeight = parseInt(this.el.dom.style.height, 10);
+            if (this.initialized) {
+                this.disableItems(this.readOnly);
+            }
+            this.pushValue();
+            this.iframe.className = '';
+            this.el.addClass('x-hidden');
+            this.el.dom.setAttribute('tabIndex', -1);
+            this.deferFocus();
+
+            this.setSize(this.previousSize);
+            delete this.previousSize;
+            this.iframe.style.height = elHeight + 'px';
+        }
+        this.fireEvent('editmodechange', this, this.sourceEditMode);
+    },
+
+    
+    createLink : function() {
+        var url = prompt(this.createLinkText, this.defaultLinkValue);
+        if(url && url != 'http:/'+'/'){
+            this.relayCmd('createlink', url);
+        }
+    },
+
+    
+    initEvents : function(){
+        this.originalValue = this.getValue();
+    },
+
+    
+    markInvalid : Ext.emptyFn,
+
+    
+    clearInvalid : Ext.emptyFn,
+
+    
+    setValue : function(v){
+        Ext.form.HtmlEditor.superclass.setValue.call(this, v);
+        this.pushValue();
+        return this;
+    },
+
+    
+    cleanHtml: function(html) {
+        html = String(html);
+        if(Ext.isWebKit){ 
+            html = html.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi, '');
+        }
+
+        
+        if(html.charCodeAt(0) == this.defaultValue.replace(/\D/g, '')){
+            html = html.substring(1);
+        }
+        return html;
+    },
+
+    
+    syncValue : function(){
+        if(this.initialized){
+            var bd = this.getEditorBody();
+            var html = bd.innerHTML;
+            if(Ext.isWebKit){
+                var bs = bd.getAttribute('style'); 
+                var m = bs.match(/text-align:(.*?);/i);
+                if(m && m[1]){
+                    html = '<div style="'+m[0]+'">' + html + '</div>';
+                }
+            }
+            html = this.cleanHtml(html);
+            if(this.fireEvent('beforesync', this, html) !== false){
+                this.el.dom.value = html;
+                this.fireEvent('sync', this, html);
+            }
+        }
+    },
+
+    
+    getValue : function() {
+        this[this.sourceEditMode ? 'pushValue' : 'syncValue']();
+        return Ext.form.HtmlEditor.superclass.getValue.call(this);
+    },
+
+    
+    pushValue : function(){
+        if(this.initialized){
+            var v = this.el.dom.value;
+            if(!this.activated && v.length < 1){
+                v = this.defaultValue;
+            }
+            if(this.fireEvent('beforepush', this, v) !== false){
+                this.getEditorBody().innerHTML = v;
+                if(Ext.isGecko){
+                    
+                    this.setDesignMode(false);  
+                    this.setDesignMode(true);
+                }
+                this.fireEvent('push', this, v);
+            }
+
+        }
+    },
+
+    
+    deferFocus : function(){
+        this.focus.defer(10, this);
+    },
+
+    
+    focus : function(){
+        if(this.win && !this.sourceEditMode){
+            this.win.focus();
+        }else{
+            this.el.focus();
+        }
+    },
+
+    
+    initEditor : function(){
+        
+        try{
+            var dbody = this.getEditorBody(),
+                ss = this.el.getStyles('font-size', 'font-family', 'background-image', 'background-repeat', 'background-color', 'color'),
+                doc,
+                fn;
+
+            ss['background-attachment'] = 'fixed'; 
+            dbody.bgProperties = 'fixed'; 
+
+            Ext.DomHelper.applyStyles(dbody, ss);
+
+            doc = this.getDoc();
+
+            if(doc){
+                try{
+                    Ext.EventManager.removeAll(doc);
+                }catch(e){}
+            }
+
+            
+            fn = this.onEditorEvent.createDelegate(this);
+            Ext.EventManager.on(doc, {
+                mousedown: fn,
+                dblclick: fn,
+                click: fn,
+                keyup: fn,
+                buffer:100
+            });
+
+            if(Ext.isGecko){
+                Ext.EventManager.on(doc, 'keypress', this.applyCommand, this);
+            }
+            if(Ext.isIE || Ext.isWebKit || Ext.isOpera){
+                Ext.EventManager.on(doc, 'keydown', this.fixKeys, this);
+            }
+            doc.editorInitialized = true;
+            this.initialized = true;
+            this.pushValue();
+            this.setReadOnly(this.readOnly);
+            this.fireEvent('initialize', this);
+        }catch(e){}
+    },
+
+    
+    beforeDestroy : function(){
+        if(this.monitorTask){
+            Ext.TaskMgr.stop(this.monitorTask);
+        }
+        if(this.rendered){
+            Ext.destroy(this.tb);
+            var doc = this.getDoc();
+            if(doc){
+                try{
+                    Ext.EventManager.removeAll(doc);
+                    for (var prop in doc){
+                        delete doc[prop];
+                    }
+                }catch(e){}
+            }
+            if(this.wrap){
+                this.wrap.dom.innerHTML = '';
+                this.wrap.remove();
+            }
+        }
+        Ext.form.HtmlEditor.superclass.beforeDestroy.call(this);
+    },
+
+    
+    onFirstFocus : function(){
+        this.activated = true;
+        this.disableItems(this.readOnly);
+        if(Ext.isGecko){ 
+            this.win.focus();
+            var s = this.win.getSelection();
+            if(!s.focusNode || s.focusNode.nodeType != 3){
+                var r = s.getRangeAt(0);
+                r.selectNodeContents(this.getEditorBody());
+                r.collapse(true);
+                this.deferFocus();
+            }
+            try{
+                this.execCmd('useCSS', true);
+                this.execCmd('styleWithCSS', false);
+            }catch(e){}
+        }
+        this.fireEvent('activate', this);
+    },
+
+    
+    adjustFont: function(btn){
+        var adjust = btn.getItemId() == 'increasefontsize' ? 1 : -1,
+            doc = this.getDoc(),
+            v = parseInt(doc.queryCommandValue('FontSize') || 2, 10);
+        if((Ext.isSafari && !Ext.isSafari2) || Ext.isChrome || Ext.isAir){
+            
+            
+            if(v <= 10){
+                v = 1 + adjust;
+            }else if(v <= 13){
+                v = 2 + adjust;
+            }else if(v <= 16){
+                v = 3 + adjust;
+            }else if(v <= 18){
+                v = 4 + adjust;
+            }else if(v <= 24){
+                v = 5 + adjust;
+            }else {
+                v = 6 + adjust;
+            }
+            v = v.constrain(1, 6);
+        }else{
+            if(Ext.isSafari){ 
+                adjust *= 2;
+            }
+            v = Math.max(1, v+adjust) + (Ext.isSafari ? 'px' : 0);
+        }
+        this.execCmd('FontSize', v);
+    },
+
+    
+    onEditorEvent : function(e){
+        this.updateToolbar();
+    },
+
+
+    
+    updateToolbar: function(){
+
+        if(this.readOnly){
+            return;
+        }
+
+        if(!this.activated){
+            this.onFirstFocus();
+            return;
+        }
+
+        var btns = this.tb.items.map,
+            doc = this.getDoc();
+
+        if(this.enableFont && !Ext.isSafari2){
+            var name = (doc.queryCommandValue('FontName')||this.defaultFont).toLowerCase();
+            if(name != this.fontSelect.dom.value){
+                this.fontSelect.dom.value = name;
+            }
+        }
+        if(this.enableFormat){
+            btns.bold.toggle(doc.queryCommandState('bold'));
+            btns.italic.toggle(doc.queryCommandState('italic'));
+            btns.underline.toggle(doc.queryCommandState('underline'));
+        }
+        if(this.enableAlignments){
+            btns.justifyleft.toggle(doc.queryCommandState('justifyleft'));
+            btns.justifycenter.toggle(doc.queryCommandState('justifycenter'));
+            btns.justifyright.toggle(doc.queryCommandState('justifyright'));
+        }
+        if(!Ext.isSafari2 && this.enableLists){
+            btns.insertorderedlist.toggle(doc.queryCommandState('insertorderedlist'));
+            btns.insertunorderedlist.toggle(doc.queryCommandState('insertunorderedlist'));
+        }
+
+        Ext.menu.MenuMgr.hideAll();
+
+        this.syncValue();
+    },
+
+    
+    relayBtnCmd : function(btn){
+        this.relayCmd(btn.getItemId());
+    },
+
+    
+    relayCmd : function(cmd, value){
+        (function(){
+            this.focus();
+            this.execCmd(cmd, value);
+            this.updateToolbar();
+        }).defer(10, this);
+    },
+
+    
+    execCmd : function(cmd, value){
+        var doc = this.getDoc();
+        doc.execCommand(cmd, false, value === undefined ? null : value);
+        this.syncValue();
+    },
+
+    
+    applyCommand : function(e){
+        if(e.ctrlKey){
+            var c = e.getCharCode(), cmd;
+            if(c > 0){
+                c = String.fromCharCode(c);
+                switch(c){
+                    case 'b':
+                        cmd = 'bold';
+                    break;
+                    case 'i':
+                        cmd = 'italic';
+                    break;
+                    case 'u':
+                        cmd = 'underline';
+                    break;
+                }
+                if(cmd){
+                    this.win.focus();
+                    this.execCmd(cmd);
+                    this.deferFocus();
+                    e.preventDefault();
+                }
+            }
+        }
+    },
+
+    
+    insertAtCursor : function(text){
+        if(!this.activated){
+            return;
+        }
+        if(Ext.isIE){
+            this.win.focus();
+            var doc = this.getDoc(),
+                r = doc.selection.createRange();
+            if(r){
+                r.pasteHTML(text);
+                this.syncValue();
+                this.deferFocus();
+            }
+        }else{
+            this.win.focus();
+            this.execCmd('InsertHTML', text);
+            this.deferFocus();
+        }
+    },
+
+    
+    fixKeys : function(){ 
+        if(Ext.isIE){
+            return function(e){
+                var k = e.getKey(),
+                    doc = this.getDoc(),
+                        r;
+                if(k == e.TAB){
+                    e.stopEvent();
+                    r = doc.selection.createRange();
+                    if(r){
+                        r.collapse(true);
+                        r.pasteHTML('&nbsp;&nbsp;&nbsp;&nbsp;');
+                        this.deferFocus();
+                    }
+                }else if(k == e.ENTER){
+                    r = doc.selection.createRange();
+                    if(r){
+                        var target = r.parentElement();
+                        if(!target || target.tagName.toLowerCase() != 'li'){
+                            e.stopEvent();
+                            r.pasteHTML('<br />');
+                            r.collapse(false);
+                            r.select();
+                        }
+                    }
+                }
+            };
+        }else if(Ext.isOpera){
+            return function(e){
+                var k = e.getKey();
+                if(k == e.TAB){
+                    e.stopEvent();
+                    this.win.focus();
+                    this.execCmd('InsertHTML','&nbsp;&nbsp;&nbsp;&nbsp;');
+                    this.deferFocus();
+                }
+            };
+        }else if(Ext.isWebKit){
+            return function(e){
+                var k = e.getKey();
+                if(k == e.TAB){
+                    e.stopEvent();
+                    this.execCmd('InsertText','\t');
+                    this.deferFocus();
+                }else if(k == e.ENTER){
+                    e.stopEvent();
+                    this.execCmd('InsertHtml','<br /><br />');
+                    this.deferFocus();
+                }
+             };
+        }
+    }(),
+
+    
+    getToolbar : function(){
+        return this.tb;
+    },
+
+    
+    buttonTips : {
+        bold : {
+            title: 'Bold (Ctrl+B)',
+            text: 'Make the selected text bold.',
+            cls: 'x-html-editor-tip'
+        },
+        italic : {
+            title: 'Italic (Ctrl+I)',
+            text: 'Make the selected text italic.',
+            cls: 'x-html-editor-tip'
+        },
+        underline : {
+            title: 'Underline (Ctrl+U)',
+            text: 'Underline the selected text.',
+            cls: 'x-html-editor-tip'
+        },
+        increasefontsize : {
+            title: 'Grow Text',
+            text: 'Increase the font size.',
+            cls: 'x-html-editor-tip'
+        },
+        decreasefontsize : {
+            title: 'Shrink Text',
+            text: 'Decrease the font size.',
+            cls: 'x-html-editor-tip'
+        },
+        backcolor : {
+            title: 'Text Highlight Color',
+            text: 'Change the background color of the selected text.',
+            cls: 'x-html-editor-tip'
+        },
+        forecolor : {
+            title: 'Font Color',
+            text: 'Change the color of the selected text.',
+            cls: 'x-html-editor-tip'
+        },
+        justifyleft : {
+            title: 'Align Text Left',
+            text: 'Align text to the left.',
+            cls: 'x-html-editor-tip'
+        },
+        justifycenter : {
+            title: 'Center Text',
+            text: 'Center text in the editor.',
+            cls: 'x-html-editor-tip'
+        },
+        justifyright : {
+            title: 'Align Text Right',
+            text: 'Align text to the right.',
+            cls: 'x-html-editor-tip'
+        },
+        insertunorderedlist : {
+            title: 'Bullet List',
+            text: 'Start a bulleted list.',
+            cls: 'x-html-editor-tip'
+        },
+        insertorderedlist : {
+            title: 'Numbered List',
+            text: 'Start a numbered list.',
+            cls: 'x-html-editor-tip'
+        },
+        createlink : {
+            title: 'Hyperlink',
+            text: 'Make the selected text a hyperlink.',
+            cls: 'x-html-editor-tip'
+        },
+        sourceedit : {
+            title: 'Source Edit',
+            text: 'Switch to source editing mode.',
+            cls: 'x-html-editor-tip'
+        }
+    }
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+});
+Ext.reg('htmleditor', Ext.form.HtmlEditor);
+
+Ext.form.TimeField = Ext.extend(Ext.form.ComboBox, {
+    
+    minValue : undefined,
+    
+    maxValue : undefined,
+    
+    minText : "The time in this field must be equal to or after {0}",
+    
+    maxText : "The time in this field must be equal to or before {0}",
+    
+    invalidText : "{0} is not a valid time",
+    
+    format : "g:i A",
+    
+    altFormats : "g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H|gi a|hi a|giA|hiA|gi A|hi A",
+    
+    increment: 15,
+
+    
+    mode: 'local',
+    
+    triggerAction: 'all',
+    
+    typeAhead: false,
+
+    
+    
+    
+    initDate: '1/1/2008',
+
+    initDateFormat: 'j/n/Y',
+
+    
+    initComponent : function(){
+        if(Ext.isDefined(this.minValue)){
+            this.setMinValue(this.minValue, true);
+        }
+        if(Ext.isDefined(this.maxValue)){
+            this.setMaxValue(this.maxValue, true);
+        }
+        if(!this.store){
+            this.generateStore(true);
+        }
+        Ext.form.TimeField.superclass.initComponent.call(this);
+    },
+
+    
+    setMinValue: function(value,  initial){
+        this.setLimit(value, true, initial);
+        return this;
+    },
+
+    
+    setMaxValue: function(value,  initial){
+        this.setLimit(value, false, initial);
+        return this;
+    },
+
+    
+    generateStore: function(initial){
+        var min = this.minValue || new Date(this.initDate).clearTime(),
+            max = this.maxValue || new Date(this.initDate).clearTime().add('mi', (24 * 60) - 1),
+            times = [];
+
+        while(min <= max){
+            times.push(min.dateFormat(this.format));
+            min = min.add('mi', this.increment);
+        }
+        this.bindStore(times, initial);
+    },
+
+    
+    setLimit: function(value, isMin, initial){
+        var d;
+        if(Ext.isString(value)){
+            d = this.parseDate(value);
+        }else if(Ext.isDate(value)){
+            d = value;
+        }
+        if(d){
+            var val = new Date(this.initDate).clearTime();
+            val.setHours(d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds());
+            this[isMin ? 'minValue' : 'maxValue'] = val;
+            if(!initial){
+                this.generateStore();
+            }
+        }
+    },
+
+    
+    getValue : function(){
+        var v = Ext.form.TimeField.superclass.getValue.call(this);
+        return this.formatDate(this.parseDate(v)) || '';
+    },
+
+    
+    setValue : function(value){
+        return Ext.form.TimeField.superclass.setValue.call(this, this.formatDate(this.parseDate(value)));
+    },
+
+    
+    validateValue : Ext.form.DateField.prototype.validateValue,
+
+    formatDate : Ext.form.DateField.prototype.formatDate,
+
+    parseDate: function(value) {
+        if (!value || Ext.isDate(value)) {
+            return value;
+        }
+
+        var id = this.initDate + ' ',
+            idf = this.initDateFormat + ' ',
+            v = Date.parseDate(id + value, idf + this.format), 
+            af = this.altFormats;
+
+        if (!v && af) {
+            if (!this.altFormatsArray) {
+                this.altFormatsArray = af.split("|");
+            }
+            for (var i = 0, afa = this.altFormatsArray, len = afa.length; i < len && !v; i++) {
+                v = Date.parseDate(id + value, idf + afa[i]);
+            }
+        }
+
+        return v;
+    }
+});
+Ext.reg('timefield', Ext.form.TimeField);
+Ext.form.SliderField = Ext.extend(Ext.form.Field, {
+    
+    
+    useTips : true,
+    
+    
+    tipText : null,
+    
+    
+    actionMode: 'wrap',
+    
+    
+    initComponent : function() {
+        var cfg = Ext.copyTo({
+            id: this.id + '-slider'
+        }, this.initialConfig, ['vertical', 'minValue', 'maxValue', 'decimalPrecision', 'keyIncrement', 'increment', 'clickToChange', 'animate']);
+        
+        
+        if (this.useTips) {
+            var plug = this.tipText ? {getText: this.tipText} : {};
+            cfg.plugins = [new Ext.slider.Tip(plug)];
+        }
+        this.slider = new Ext.Slider(cfg);
+        Ext.form.SliderField.superclass.initComponent.call(this);
+    },    
+    
+    
+    onRender : function(ct, position){
+        this.autoCreate = {
+            id: this.id,
+            name: this.name,
+            type: 'hidden',
+            tag: 'input'    
+        };
+        Ext.form.SliderField.superclass.onRender.call(this, ct, position);
+        this.wrap = this.el.wrap({cls: 'x-form-field-wrap'});
+        this.resizeEl = this.positionEl = this.wrap;
+        this.slider.render(this.wrap);
+    },
+    
+    
+    onResize : function(w, h, aw, ah){
+        Ext.form.SliderField.superclass.onResize.call(this, w, h, aw, ah);
+        this.slider.setSize(w, h);    
+    },
+    
+    
+    initEvents : function(){
+        Ext.form.SliderField.superclass.initEvents.call(this);
+        this.slider.on('change', this.onChange, this);   
+    },
+    
+    
+    onChange : function(slider, v){
+        this.setValue(v, undefined, true);
+    },
+    
+    
+    onEnable : function(){
+        Ext.form.SliderField.superclass.onEnable.call(this);
+        this.slider.enable();
+    },
+    
+    
+    onDisable : function(){
+        Ext.form.SliderField.superclass.onDisable.call(this);
+        this.slider.disable();    
+    },
+    
+    
+    beforeDestroy : function(){
+        Ext.destroy(this.slider);
+        Ext.form.SliderField.superclass.beforeDestroy.call(this);
+    },
+    
+    
+    alignErrorIcon : function(){
+        this.errorIcon.alignTo(this.slider.el, 'tl-tr', [2, 0]);
+    },
+    
+    
+    setMinValue : function(v){
+        this.slider.setMinValue(v);
+        return this;    
+    },
+    
+    
+    setMaxValue : function(v){
+        this.slider.setMaxValue(v);
+        return this;    
+    },
+    
+    
+    setValue : function(v, animate,  silent){
+        
+        
+        if(!silent){
+            this.slider.setValue(v, animate);
+        }
+        return Ext.form.SliderField.superclass.setValue.call(this, this.slider.getValue());
+    },
+    
+    
+    getValue : function(){
+        return this.slider.getValue();    
+    }
+});
+
+Ext.reg('sliderfield', Ext.form.SliderField);
+Ext.form.Label = Ext.extend(Ext.BoxComponent, {
+    
+    
+    
+
+    
+    onRender : function(ct, position){
+        if(!this.el){
+            this.el = document.createElement('label');
+            this.el.id = this.getId();
+            this.el.innerHTML = this.text ? Ext.util.Format.htmlEncode(this.text) : (this.html || '');
+            if(this.forId){
+                this.el.setAttribute('for', this.forId);
+            }
+        }
+        Ext.form.Label.superclass.onRender.call(this, ct, position);
+    },
+
+    
+    setText : function(t, encode){
+        var e = encode === false;
+        this[!e ? 'text' : 'html'] = t;
+        delete this[e ? 'text' : 'html'];
+        if(this.rendered){
+            this.el.dom.innerHTML = encode !== false ? Ext.util.Format.htmlEncode(t) : t;
+        }
+        return this;
+    }
+});
+
+Ext.reg('label', Ext.form.Label);
+Ext.form.Action = function(form, options){
+    this.form = form;
+    this.options = options || {};
+};
+
+
+Ext.form.Action.CLIENT_INVALID = 'client';
+
+Ext.form.Action.SERVER_INVALID = 'server';
+
+Ext.form.Action.CONNECT_FAILURE = 'connect';
+
+Ext.form.Action.LOAD_FAILURE = 'load';
+
+Ext.form.Action.prototype = {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    type : 'default',
+
+
+    
+    run : function(options){
+
+    },
+
+    
+    success : function(response){
+
+    },
+
+    
+    handleResponse : function(response){
+
+    },
+
+    
+    failure : function(response){
+        this.response = response;
+        this.failureType = Ext.form.Action.CONNECT_FAILURE;
+        this.form.afterAction(this, false);
+    },
+
+    
+    
+    
+    processResponse : function(response){
+        this.response = response;
+        if(!response.responseText && !response.responseXML){
+            return true;
+        }
+        this.result = this.handleResponse(response);
+        return this.result;
+    },
+
+    
+    getUrl : function(appendParams){
+        var url = this.options.url || this.form.url || this.form.el.dom.action;
+        if(appendParams){
+            var p = this.getParams();
+            if(p){
+                url = Ext.urlAppend(url, p);
+            }
+        }
+        return url;
+    },
+
+    
+    getMethod : function(){
+        return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase();
+    },
+
+    
+    getParams : function(){
+        var bp = this.form.baseParams;
+        var p = this.options.params;
+        if(p){
+            if(typeof p == "object"){
+                p = Ext.urlEncode(Ext.applyIf(p, bp));
+            }else if(typeof p == 'string' && bp){
+                p += '&' + Ext.urlEncode(bp);
+            }
+        }else if(bp){
+            p = Ext.urlEncode(bp);
+        }
+        return p;
+    },
+
+    
+    createCallback : function(opts){
+        var opts = opts || {};
+        return {
+            success: this.success,
+            failure: this.failure,
+            scope: this,
+            timeout: (opts.timeout*1000) || (this.form.timeout*1000),
+            upload: this.form.fileUpload ? this.success : undefined
+        };
+    }
+};
+
+
+Ext.form.Action.Submit = function(form, options){
+    Ext.form.Action.Submit.superclass.constructor.call(this, form, options);
+};
+
+Ext.extend(Ext.form.Action.Submit, Ext.form.Action, {
+    
+    
+    type : 'submit',
+
+    
+    run : function(){
+        var o = this.options,
+            method = this.getMethod(),
+            isGet = method == 'GET';
+        if(o.clientValidation === false || this.form.isValid()){
+            if (o.submitEmptyText === false) {
+                var fields = this.form.items,
+                    emptyFields = [],
+                    setupEmptyFields = function(f){
+                        if (f.el.getValue() == f.emptyText) {
+                            emptyFields.push(f);
+                            f.el.dom.value = "";
+                        }
+                        if(f.isComposite && f.rendered){
+                            f.items.each(setupEmptyFields);
+                        }
+                    };
+                    
+                fields.each(setupEmptyFields);
+            }
+            Ext.Ajax.request(Ext.apply(this.createCallback(o), {
+                form:this.form.el.dom,
+                url:this.getUrl(isGet),
+                method: method,
+                headers: o.headers,
+                params:!isGet ? this.getParams() : null,
+                isUpload: this.form.fileUpload
+            }));
+            if (o.submitEmptyText === false) {
+                Ext.each(emptyFields, function(f) {
+                    if (f.applyEmptyText) {
+                        f.applyEmptyText();
+                    }
+                });
+            }
+        }else if (o.clientValidation !== false){ 
+            this.failureType = Ext.form.Action.CLIENT_INVALID;
+            this.form.afterAction(this, false);
+        }
+    },
+
+    
+    success : function(response){
+        var result = this.processResponse(response);
+        if(result === true || result.success){
+            this.form.afterAction(this, true);
+            return;
+        }
+        if(result.errors){
+            this.form.markInvalid(result.errors);
+        }
+        this.failureType = Ext.form.Action.SERVER_INVALID;
+        this.form.afterAction(this, false);
+    },
+
+    
+    handleResponse : function(response){
+        if(this.form.errorReader){
+            var rs = this.form.errorReader.read(response);
+            var errors = [];
+            if(rs.records){
+                for(var i = 0, len = rs.records.length; i < len; i++) {
+                    var r = rs.records[i];
+                    errors[i] = r.data;
+                }
+            }
+            if(errors.length < 1){
+                errors = null;
+            }
+            return {
+                success : rs.success,
+                errors : errors
+            };
+        }
+        return Ext.decode(response.responseText);
+    }
+});
+
+
+
+Ext.form.Action.Load = function(form, options){
+    Ext.form.Action.Load.superclass.constructor.call(this, form, options);
+    this.reader = this.form.reader;
+};
+
+Ext.extend(Ext.form.Action.Load, Ext.form.Action, {
+    
+    type : 'load',
+
+    
+    run : function(){
+        Ext.Ajax.request(Ext.apply(
+                this.createCallback(this.options), {
+                    method:this.getMethod(),
+                    url:this.getUrl(false),
+                    headers: this.options.headers,
+                    params:this.getParams()
+        }));
+    },
+
+    
+    success : function(response){
+        var result = this.processResponse(response);
+        if(result === true || !result.success || !result.data){
+            this.failureType = Ext.form.Action.LOAD_FAILURE;
+            this.form.afterAction(this, false);
+            return;
+        }
+        this.form.clearInvalid();
+        this.form.setValues(result.data);
+        this.form.afterAction(this, true);
+    },
+
+    
+    handleResponse : function(response){
+        if(this.form.reader){
+            var rs = this.form.reader.read(response);
+            var data = rs.records && rs.records[0] ? rs.records[0].data : null;
+            return {
+                success : rs.success,
+                data : data
+            };
+        }
+        return Ext.decode(response.responseText);
+    }
+});
+
+
+
+
+Ext.form.Action.DirectLoad = Ext.extend(Ext.form.Action.Load, {
+    constructor: function(form, opts) {
+        Ext.form.Action.DirectLoad.superclass.constructor.call(this, form, opts);
+    },
+    type : 'directload',
+
+    run : function(){
+        var args = this.getParams();
+        args.push(this.success, this);
+        this.form.api.load.apply(window, args);
+    },
+
+    getParams : function() {
+        var buf = [], o = {};
+        var bp = this.form.baseParams;
+        var p = this.options.params;
+        Ext.apply(o, p, bp);
+        var paramOrder = this.form.paramOrder;
+        if(paramOrder){
+            for(var i = 0, len = paramOrder.length; i < len; i++){
+                buf.push(o[paramOrder[i]]);
+            }
+        }else if(this.form.paramsAsHash){
+            buf.push(o);
+        }
+        return buf;
+    },
+    
+    
+    
+    processResponse : function(result) {
+        this.result = result;
+        return result;
+    },
+
+    success : function(response, trans){
+        if(trans.type == Ext.Direct.exceptions.SERVER){
+            response = {};
+        }
+        Ext.form.Action.DirectLoad.superclass.success.call(this, response);
+    }
+});
+
+
+Ext.form.Action.DirectSubmit = Ext.extend(Ext.form.Action.Submit, {
+    constructor : function(form, opts) {
+        Ext.form.Action.DirectSubmit.superclass.constructor.call(this, form, opts);
+    },
+    type : 'directsubmit',
+    
+    run : function(){
+        var o = this.options;
+        if(o.clientValidation === false || this.form.isValid()){
+            
+            
+            this.success.params = this.getParams();
+            this.form.api.submit(this.form.el.dom, this.success, this);
+        }else if (o.clientValidation !== false){ 
+            this.failureType = Ext.form.Action.CLIENT_INVALID;
+            this.form.afterAction(this, false);
+        }
+    },
+
+    getParams : function() {
+        var o = {};
+        var bp = this.form.baseParams;
+        var p = this.options.params;
+        Ext.apply(o, p, bp);
+        return o;
+    },
+    
+    
+    
+    processResponse : function(result) {
+        this.result = result;
+        return result;
+    },
+
+    success : function(response, trans){
+        if(trans.type == Ext.Direct.exceptions.SERVER){
+            response = {};
+        }
+        Ext.form.Action.DirectSubmit.superclass.success.call(this, response);
+    }
+});
+
+Ext.form.Action.ACTION_TYPES = {
+    'load' : Ext.form.Action.Load,
+    'submit' : Ext.form.Action.Submit,
+    'directload' : Ext.form.Action.DirectLoad,
+    'directsubmit' : Ext.form.Action.DirectSubmit
+};
+
+Ext.form.VTypes = function(){
+    
+    var alpha = /^[a-zA-Z_]+$/,
+        alphanum = /^[a-zA-Z0-9_]+$/,
+        email = /^(\w+)([\-+.][\w]+)*@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/,
+        url = /(((^https?)|(^ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
+
+    
+    return {
+        
+        'email' : function(v){
+            return email.test(v);
+        },
+        
+        'emailText' : 'This field should be an e-mail address in the format "user@example.com"',
+        
+        'emailMask' : /[a-z0-9_\.\-@\+]/i,
+
+        
+        'url' : function(v){
+            return url.test(v);
+        },
+        
+        'urlText' : 'This field should be a URL in the format "http:/'+'/www.example.com"',
+
+        
+        'alpha' : function(v){
+            return alpha.test(v);
+        },
+        
+        'alphaText' : 'This field should only contain letters and _',
+        
+        'alphaMask' : /[a-z_]/i,
+
+        
+        'alphanum' : function(v){
+            return alphanum.test(v);
+        },
+        
+        'alphanumText' : 'This field should only contain letters, numbers and _',
+        
+        'alphanumMask' : /[a-z0-9_]/i
+    };
+}();
+
+Ext.grid.GridPanel = Ext.extend(Ext.Panel, {
+    
+    autoExpandColumn : false,
+    
+    
+    autoExpandMax : 1000,
+    
+    
+    autoExpandMin : 50,
+    
+    
+    columnLines : false,
+    
+    
+    
+    
+    
+    
+    ddText : '{0} selected row{1}',
+    
+    
+    deferRowRender : true,
+    
+    
+    
+    
+    enableColumnHide : true,
+    
+    
+    enableColumnMove : true,
+    
+    
+    enableDragDrop : false,
+    
+    
+    enableHdMenu : true,
+    
+    
+    
+    loadMask : false,
+    
+    
+    
+    minColumnWidth : 25,
+    
+    
+    
+    
+    
+    stripeRows : false,
+    
+    
+    trackMouseOver : true,
+    
+    
+    stateEvents : ['columnmove', 'columnresize', 'sortchange', 'groupchange'],
+    
+    
+    view : null,
+
+    
+    bubbleEvents: [],
+
+    
+
+    
+    rendered : false,
+    
+    
+    viewReady : false,
+
+    
+    initComponent : function() {
+        Ext.grid.GridPanel.superclass.initComponent.call(this);
+
+        if (this.columnLines) {
+            this.cls = (this.cls || '') + ' x-grid-with-col-lines';
+        }
+        
+        
+        this.autoScroll = false;
+        this.autoWidth = false;
+
+        if(Ext.isArray(this.columns)){
+            this.colModel = new Ext.grid.ColumnModel(this.columns);
+            delete this.columns;
+        }
+
+        
+        if(this.ds){
+            this.store = this.ds;
+            delete this.ds;
+        }
+        if(this.cm){
+            this.colModel = this.cm;
+            delete this.cm;
+        }
+        if(this.sm){
+            this.selModel = this.sm;
+            delete this.sm;
+        }
+        this.store = Ext.StoreMgr.lookup(this.store);
+
+        this.addEvents(
+            
+            
+            'click',
+            
+            'dblclick',
+            
+            'contextmenu',
+            
+            'mousedown',
+            
+            'mouseup',
+            
+            'mouseover',
+            
+            'mouseout',
+            
+            'keypress',
+            
+            'keydown',
+
+            
+            
+            'cellmousedown',
+            
+            'rowmousedown',
+            
+            'headermousedown',
+
+            
+            'groupmousedown',
+
+            
+            'rowbodymousedown',
+
+            
+            'containermousedown',
+
+            
+            'cellclick',
+            
+            'celldblclick',
+            
+            'rowclick',
+            
+            'rowdblclick',
+            
+            'headerclick',
+            
+            'headerdblclick',
+            
+            'groupclick',
+            
+            'groupdblclick',
+            
+            'containerclick',
+            
+            'containerdblclick',
+
+            
+            'rowbodyclick',
+            
+            'rowbodydblclick',
+
+            
+            'rowcontextmenu',
+            
+            'cellcontextmenu',
+            
+            'headercontextmenu',
+            
+            'groupcontextmenu',
+            
+            'containercontextmenu',
+            
+            'rowbodycontextmenu',
+            
+            'bodyscroll',
+            
+            'columnresize',
+            
+            'columnmove',
+            
+            'sortchange',
+            
+            'groupchange',
+            
+            'reconfigure',
+            
+            'viewready'
+        );
+    },
+
+    
+    onRender : function(ct, position){
+        Ext.grid.GridPanel.superclass.onRender.apply(this, arguments);
+
+        var c = this.getGridEl();
+
+        this.el.addClass('x-grid-panel');
+
+        this.mon(c, {
+            scope: this,
+            mousedown: this.onMouseDown,
+            click: this.onClick,
+            dblclick: this.onDblClick,
+            contextmenu: this.onContextMenu
+        });
+
+        this.relayEvents(c, ['mousedown','mouseup','mouseover','mouseout','keypress', 'keydown']);
+
+        var view = this.getView();
+        view.init(this);
+        view.render();
+        this.getSelectionModel().init(this);
+    },
+
+    
+    initEvents : function(){
+        Ext.grid.GridPanel.superclass.initEvents.call(this);
+
+        if(this.loadMask){
+            this.loadMask = new Ext.LoadMask(this.bwrap,
+                    Ext.apply({store:this.store}, this.loadMask));
+        }
+    },
+
+    initStateEvents : function(){
+        Ext.grid.GridPanel.superclass.initStateEvents.call(this);
+        this.mon(this.colModel, 'hiddenchange', this.saveState, this, {delay: 100});
+    },
+
+    applyState : function(state){
+        var cm = this.colModel,
+            cs = state.columns,
+            store = this.store,
+            s,
+            c,
+            colIndex;
+
+        if(cs){
+            for(var i = 0, len = cs.length; i < len; i++){
+                s = cs[i];
+                c = cm.getColumnById(s.id);
+                if(c){
+                    colIndex = cm.getIndexById(s.id);
+                    cm.setState(colIndex, {
+                        hidden: s.hidden,
+                        width: s.width,
+                        sortable: s.sortable
+                    });
+                    if(colIndex != i){
+                        cm.moveColumn(colIndex, i);
+                    }
+                }
+            }
+        }
+        if(store){
+            s = state.sort;
+            if(s){
+                store[store.remoteSort ? 'setDefaultSort' : 'sort'](s.field, s.direction);
+            }
+            s = state.group;
+            if(store.groupBy){
+                if(s){
+                    store.groupBy(s);
+                }else{
+                    store.clearGrouping();
+                }
+            }
+
+        }
+        var o = Ext.apply({}, state);
+        delete o.columns;
+        delete o.sort;
+        Ext.grid.GridPanel.superclass.applyState.call(this, o);
+    },
+
+    getState : function(){
+        var o = {columns: []},
+            store = this.store,
+            ss,
+            gs;
+
+        for(var i = 0, c; (c = this.colModel.config[i]); i++){
+            o.columns[i] = {
+                id: c.id,
+                width: c.width
+            };
+            if(c.hidden){
+                o.columns[i].hidden = true;
+            }
+            if(c.sortable){
+                o.columns[i].sortable = true;
+            }
+        }
+        if(store){
+            ss = store.getSortState();
+            if(ss){
+                o.sort = ss;
+            }
+            if(store.getGroupState){
+                gs = store.getGroupState();
+                if(gs){
+                    o.group = gs;
+                }
+            }
+        }
+        return o;
+    },
+
+    
+    afterRender : function(){
+        Ext.grid.GridPanel.superclass.afterRender.call(this);
+        var v = this.view;
+        this.on('bodyresize', v.layout, v);
+        v.layout(true);
+        if(this.deferRowRender){
+            if (!this.deferRowRenderTask){
+                this.deferRowRenderTask = new Ext.util.DelayedTask(v.afterRender, this.view);
+            }
+            this.deferRowRenderTask.delay(10);
+        }else{
+            v.afterRender();
+        }
+        this.viewReady = true;
+    },
+
+    
+    reconfigure : function(store, colModel){
+        var rendered = this.rendered;
+        if(rendered){
+            if(this.loadMask){
+                this.loadMask.destroy();
+                this.loadMask = new Ext.LoadMask(this.bwrap,
+                        Ext.apply({}, {store:store}, this.initialConfig.loadMask));
+            }
+        }
+        if(this.view){
+            this.view.initData(store, colModel);
+        }
+        this.store = store;
+        this.colModel = colModel;
+        if(rendered){
+            this.view.refresh(true);
+        }
+        this.fireEvent('reconfigure', this, store, colModel);
+    },
+
+    
+    onDestroy : function(){
+        if (this.deferRowRenderTask && this.deferRowRenderTask.cancel){
+            this.deferRowRenderTask.cancel();
+        }
+        if(this.rendered){
+            Ext.destroy(this.view, this.loadMask);
+        }else if(this.store && this.store.autoDestroy){
+            this.store.destroy();
+        }
+        Ext.destroy(this.colModel, this.selModel);
+        this.store = this.selModel = this.colModel = this.view = this.loadMask = null;
+        Ext.grid.GridPanel.superclass.onDestroy.call(this);
+    },
+
+    
+    processEvent : function(name, e){
+        this.view.processEvent(name, e);
+    },
+
+    
+    onClick : function(e){
+        this.processEvent('click', e);
+    },
+
+    
+    onMouseDown : function(e){
+        this.processEvent('mousedown', e);
+    },
+
+    
+    onContextMenu : function(e, t){
+        this.processEvent('contextmenu', e);
+    },
+
+    
+    onDblClick : function(e){
+        this.processEvent('dblclick', e);
+    },
+
+    
+    walkCells : function(row, col, step, fn, scope){
+        var cm    = this.colModel,
+            clen  = cm.getColumnCount(),
+            ds    = this.store,
+            rlen  = ds.getCount(),
+            first = true;
+
+        if(step < 0){
+            if(col < 0){
+                row--;
+                first = false;
+            }
+            while(row >= 0){
+                if(!first){
+                    col = clen-1;
+                }
+                first = false;
+                while(col >= 0){
+                    if(fn.call(scope || this, row, col, cm) === true){
+                        return [row, col];
+                    }
+                    col--;
+                }
+                row--;
+            }
+        } else {
+            if(col >= clen){
+                row++;
+                first = false;
+            }
+            while(row < rlen){
+                if(!first){
+                    col = 0;
+                }
+                first = false;
+                while(col < clen){
+                    if(fn.call(scope || this, row, col, cm) === true){
+                        return [row, col];
+                    }
+                    col++;
+                }
+                row++;
+            }
+        }
+        return null;
+    },
+
+    
+    getGridEl : function(){
+        return this.body;
+    },
+
+    
+    stopEditing : Ext.emptyFn,
+
+    
+    getSelectionModel : function(){
+        if(!this.selModel){
+            this.selModel = new Ext.grid.RowSelectionModel(
+                    this.disableSelection ? {selectRow: Ext.emptyFn} : null);
+        }
+        return this.selModel;
+    },
+
+    
+    getStore : function(){
+        return this.store;
+    },
+
+    
+    getColumnModel : function(){
+        return this.colModel;
+    },
+
+    
+    getView : function() {
+        if (!this.view) {
+            this.view = new Ext.grid.GridView(this.viewConfig);
+        }
+        
+        return this.view;
+    },
+    
+    getDragDropText : function(){
+        var count = this.selModel.getCount();
+        return String.format(this.ddText, count, count == 1 ? '' : 's');
+    }
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+
+
+
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+});
+Ext.reg('grid', Ext.grid.GridPanel);
+Ext.grid.PivotGrid = Ext.extend(Ext.grid.GridPanel, {
+    
+    
+    aggregator: 'sum',
+    
+    
+    renderer: undefined,
+    
+    
+    
+    
+    
+    
+    
+    
+    initComponent: function() {
+        Ext.grid.PivotGrid.superclass.initComponent.apply(this, arguments);
+        
+        this.initAxes();
+        
+        
+        this.enableColumnResize = false;
+        
+        this.viewConfig = Ext.apply(this.viewConfig || {}, {
+            forceFit: true
+        });
+        
+        
+        
+        this.colModel = new Ext.grid.ColumnModel({});
+    },
+    
+    
+    getAggregator: function() {
+        if (typeof this.aggregator == 'string') {
+            return Ext.grid.PivotAggregatorMgr.types[this.aggregator];
+        } else {
+            return this.aggregator;
+        }
+    },
+    
+    
+    setAggregator: function(aggregator) {
+        this.aggregator = aggregator;
+    },
+    
+    
+    setMeasure: function(measure) {
+        this.measure = measure;
+    },
+    
+    
+    setLeftAxis: function(axis, refresh) {
+        
+        this.leftAxis = axis;
+        
+        if (refresh) {
+            this.view.refresh();
+        }
+    },
+    
+    
+    setTopAxis: function(axis, refresh) {
+        
+        this.topAxis = axis;
+        
+        if (refresh) {
+            this.view.refresh();
+        }
+    },
+    
+    
+    initAxes: function() {
+        var PivotAxis = Ext.grid.PivotAxis;
+        
+        if (!(this.leftAxis instanceof PivotAxis)) {
+            this.setLeftAxis(new PivotAxis({
+                orientation: 'vertical',
+                dimensions : this.leftAxis || [],
+                store      : this.store
+            }));
+        };
+        
+        if (!(this.topAxis instanceof PivotAxis)) {
+            this.setTopAxis(new PivotAxis({
+                orientation: 'horizontal',
+                dimensions : this.topAxis || [],
+                store      : this.store
+            }));
+        };
+    },
+    
+    
+    extractData: function() {
+        var records  = this.store.data.items,
+            recCount = records.length,
+            cells    = [],
+            record, i, j, k;
+        
+        if (recCount == 0) {
+            return [];
+        }
+        
+        var leftTuples = this.leftAxis.getTuples(),
+            leftCount  = leftTuples.length,
+            topTuples  = this.topAxis.getTuples(),
+            topCount   = topTuples.length,
+            aggregator = this.getAggregator();
+        
+        for (i = 0; i < recCount; i++) {
+            record = records[i];
+            
+            for (j = 0; j < leftCount; j++) {
+                cells[j] = cells[j] || [];
+                
+                if (leftTuples[j].matcher(record) === true) {
+                    for (k = 0; k < topCount; k++) {
+                        cells[j][k] = cells[j][k] || [];
+                        
+                        if (topTuples[k].matcher(record)) {
+                            cells[j][k].push(record);
+                        }
+                    }
+                }
+            }
+        }
+        
+        var rowCount = cells.length,
+            colCount, row;
+        
+        for (i = 0; i < rowCount; i++) {
+            row = cells[i];
+            colCount = row.length;
+            
+            for (j = 0; j < colCount; j++) {
+                cells[i][j] = aggregator(cells[i][j], this.measure);
+            }
+        }
+        
+        return cells;
+    },
+    
+    
+    getView: function() {
+        if (!this.view) {
+            this.view = new Ext.grid.PivotGridView(this.viewConfig);
+        }
+        
+        return this.view;
+    }
+});
+
+Ext.reg('pivotgrid', Ext.grid.PivotGrid);
+
+
+Ext.grid.PivotAggregatorMgr = new Ext.AbstractManager();
+
+Ext.grid.PivotAggregatorMgr.registerType('sum', function(records, measure) {
+    var length = records.length,
+        total  = 0,
+        i;
+    
+    for (i = 0; i < length; i++) {
+        total += records[i].get(measure);
+    }
+    
+    return total;
+});
+
+Ext.grid.PivotAggregatorMgr.registerType('avg', function(records, measure) {
+    var length = records.length,
+        total  = 0,
+        i;
+    
+    for (i = 0; i < length; i++) {
+        total += records[i].get(measure);
+    }
+    
+    return (total / length) || 'n/a';
+});
+
+Ext.grid.PivotAggregatorMgr.registerType('min', function(records, measure) {
+    var data   = [],
+        length = records.length,
+        i;
+    
+    for (i = 0; i < length; i++) {
+        data.push(records[i].get(measure));
+    }
+    
+    return Math.min.apply(this, data) || 'n/a';
+});
+
+Ext.grid.PivotAggregatorMgr.registerType('max', function(records, measure) {
+    var data   = [],
+        length = records.length,
+        i;
+    
+    for (i = 0; i < length; i++) {
+        data.push(records[i].get(measure));
+    }
+    
+    return Math.max.apply(this, data) || 'n/a';
+});
+
+Ext.grid.PivotAggregatorMgr.registerType('count', function(records, measure) {
+    return records.length;
+});
+Ext.grid.GridView = Ext.extend(Ext.util.Observable, {
+    
+
+    
+
+    
+
+    
+
+    
+
+    
+    deferEmptyText : true,
+
+    
+    scrollOffset : undefined,
+
+    
+    autoFill : false,
+
+    
+    forceFit : false,
+
+    
+    sortClasses : ['sort-asc', 'sort-desc'],
+
+    
+    sortAscText : 'Sort Ascending',
+
+    
+    sortDescText : 'Sort Descending',
+
+    
+    columnsText : 'Columns',
+
+    
+    selectedRowClass : 'x-grid3-row-selected',
+
+    
+    borderWidth : 2,
+    tdClass : 'x-grid3-cell',
+    hdCls : 'x-grid3-hd',
+    
+    
+    
+    markDirty : true,
+
+    
+    cellSelectorDepth : 4,
+    
+    
+    rowSelectorDepth : 10,
+
+    
+    rowBodySelectorDepth : 10,
+
+    
+    cellSelector : 'td.x-grid3-cell',
+    
+    
+    rowSelector : 'div.x-grid3-row',
+
+    
+    rowBodySelector : 'div.x-grid3-row-body',
+
+    
+    firstRowCls: 'x-grid3-row-first',
+    lastRowCls: 'x-grid3-row-last',
+    rowClsRe: /(?:^|\s+)x-grid3-row-(first|last|alt)(?:\s+|$)/g,
+    
+    
+    headerMenuOpenCls: 'x-grid3-hd-menu-open',
+    
+    
+    rowOverCls: 'x-grid3-row-over',
+
+    constructor : function(config) {
+        Ext.apply(this, config);
+        
+        
+        this.addEvents(
+            
+            'beforerowremoved',
+            
+            
+            'beforerowsinserted',
+            
+            
+            'beforerefresh',
+            
+            
+            'rowremoved',
+            
+            
+            'rowsinserted',
+            
+            
+            'rowupdated',
+            
+            
+            'refresh'
+        );
+        
+        Ext.grid.GridView.superclass.constructor.call(this);
+    },
+
+    
+    
+    
+    masterTpl: new Ext.Template(
+        '<div class="x-grid3" hidefocus="true">',
+            '<div class="x-grid3-viewport">',
+                '<div class="x-grid3-header">',
+                    '<div class="x-grid3-header-inner">',
+                        '<div class="x-grid3-header-offset" style="{ostyle}">{header}</div>',
+                    '</div>',
+                    '<div class="x-clear"></div>',
+                '</div>',
+                '<div class="x-grid3-scroller">',
+                    '<div class="x-grid3-body" style="{bstyle}">{body}</div>',
+                    '<a href="#" class="x-grid3-focus" tabIndex="-1"></a>',
+                '</div>',
+            '</div>',
+            '<div class="x-grid3-resize-marker">&#160;</div>',
+            '<div class="x-grid3-resize-proxy">&#160;</div>',
+        '</div>'
+    ),
+    
+    
+    headerTpl: new Ext.Template(
+        '<table border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',
+            '<thead>',
+                '<tr class="x-grid3-hd-row">{cells}</tr>',
+            '</thead>',
+        '</table>'
+    ),
+    
+    
+    bodyTpl: new Ext.Template('{rows}'),
+    
+    
+    cellTpl: new Ext.Template(
+        '<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} {css}" style="{style}" tabIndex="0" {cellAttr}>',
+            '<div class="x-grid3-cell-inner x-grid3-col-{id}" unselectable="on" {attr}>{value}</div>',
+        '</td>'
+    ),
+    
+    
+    initTemplates : function() {
+        var templates = this.templates || {},
+            template, name,
+            
+            headerCellTpl = new Ext.Template(
+                '<td class="x-grid3-hd x-grid3-cell x-grid3-td-{id} {css}" style="{style}">',
+                    '<div {tooltip} {attr} class="x-grid3-hd-inner x-grid3-hd-{id}" unselectable="on" style="{istyle}">', 
+                        this.grid.enableHdMenu ? '<a class="x-grid3-hd-btn" href="#"></a>' : '',
+                        '{value}',
+                        '<img alt="" class="x-grid3-sort-icon" src="', Ext.BLANK_IMAGE_URL, '" />',
+                    '</div>',
+                '</td>'
+            ),
+        
+            rowBodyText = [
+                '<tr class="x-grid3-row-body-tr" style="{bodyStyle}">',
+                    '<td colspan="{cols}" class="x-grid3-body-cell" tabIndex="0" hidefocus="on">',
+                        '<div class="x-grid3-row-body">{body}</div>',
+                    '</td>',
+                '</tr>'
+            ].join(""),
+        
+            innerText = [
+                '<table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',
+                     '<tbody>',
+                        '<tr>{cells}</tr>',
+                        this.enableRowBody ? rowBodyText : '',
+                     '</tbody>',
+                '</table>'
+            ].join("");
+        
+        Ext.applyIf(templates, {
+            hcell   : headerCellTpl,
+            cell    : this.cellTpl,
+            body    : this.bodyTpl,
+            header  : this.headerTpl,
+            master  : this.masterTpl,
+            row     : new Ext.Template('<div class="x-grid3-row {alt}" style="{tstyle}">' + innerText + '</div>'),
+            rowInner: new Ext.Template(innerText)
+        });
+
+        for (name in templates) {
+            template = templates[name];
+            
+            if (template && Ext.isFunction(template.compile) && !template.compiled) {
+                template.disableFormats = true;
+                template.compile();
+            }
+        }
+
+        this.templates = templates;
+        this.colRe = new RegExp('x-grid3-td-([^\\s]+)', '');
+    },
+
+    
+    fly : function(el) {
+        if (!this._flyweight) {
+            this._flyweight = new Ext.Element.Flyweight(document.body);
+        }
+        this._flyweight.dom = el;
+        return this._flyweight;
+    },
+
+    
+    getEditorParent : function() {
+        return this.scroller.dom;
+    },
+
+    
+    initElements : function() {
+        var Element  = Ext.Element,
+            el       = Ext.get(this.grid.getGridEl().dom.firstChild),
+            mainWrap = new Element(el.child('div.x-grid3-viewport')),
+            mainHd   = new Element(mainWrap.child('div.x-grid3-header')),
+            scroller = new Element(mainWrap.child('div.x-grid3-scroller'));
+        
+        if (this.grid.hideHeaders) {
+            mainHd.setDisplayed(false);
+        }
+        
+        if (this.forceFit) {
+            scroller.setStyle('overflow-x', 'hidden');
+        }
+        
+        
+        
+        Ext.apply(this, {
+            el      : el,
+            mainWrap: mainWrap,
+            scroller: scroller,
+            mainHd  : mainHd,
+            innerHd : mainHd.child('div.x-grid3-header-inner').dom,
+            mainBody: new Element(Element.fly(scroller).child('div.x-grid3-body')),
+            focusEl : new Element(Element.fly(scroller).child('a')),
+            
+            resizeMarker: new Element(el.child('div.x-grid3-resize-marker')),
+            resizeProxy : new Element(el.child('div.x-grid3-resize-proxy'))
+        });
+        
+        this.focusEl.swallowEvent('click', true);
+    },
+
+    
+    getRows : function() {
+        return this.hasRows() ? this.mainBody.dom.childNodes : [];
+    },
+
+    
+
+    
+    findCell : function(el) {
+        if (!el) {
+            return false;
+        }
+        return this.fly(el).findParent(this.cellSelector, this.cellSelectorDepth);
+    },
+
+    
+    findCellIndex : function(el, requiredCls) {
+        var cell = this.findCell(el),
+            hasCls;
+        
+        if (cell) {
+            hasCls = this.fly(cell).hasClass(requiredCls);
+            if (!requiredCls || hasCls) {
+                return this.getCellIndex(cell);
+            }
+        }
+        return false;
+    },
+
+    
+    getCellIndex : function(el) {
+        if (el) {
+            var match = el.className.match(this.colRe);
+            
+            if (match && match[1]) {
+                return this.cm.getIndexById(match[1]);
+            }
+        }
+        return false;
+    },
+
+    
+    findHeaderCell : function(el) {
+        var cell = this.findCell(el);
+        return cell && this.fly(cell).hasClass(this.hdCls) ? cell : null;
+    },
+
+    
+    findHeaderIndex : function(el){
+        return this.findCellIndex(el, this.hdCls);
+    },
+
+    
+    findRow : function(el) {
+        if (!el) {
+            return false;
+        }
+        return this.fly(el).findParent(this.rowSelector, this.rowSelectorDepth);
+    },
+
+    
+    findRowIndex : function(el) {
+        var row = this.findRow(el);
+        return row ? row.rowIndex : false;
+    },
+
+    
+    findRowBody : function(el) {
+        if (!el) {
+            return false;
+        }
+        
+        return this.fly(el).findParent(this.rowBodySelector, this.rowBodySelectorDepth);
+    },
+
+    
+
+    
+    getRow : function(row) {
+        return this.getRows()[row];
+    },
+
+    
+    getCell : function(row, col) {
+        return Ext.fly(this.getRow(row)).query(this.cellSelector)[col]; 
+    },
+
+    
+    getHeaderCell : function(index) {
+        return this.mainHd.dom.getElementsByTagName('td')[index];
+    },
+
+    
+
+    
+    addRowClass : function(rowId, cls) {
+        var row = this.getRow(rowId);
+        if (row) {
+            this.fly(row).addClass(cls);
+        }
+    },
+
+    
+    removeRowClass : function(row, cls) {
+        var r = this.getRow(row);
+        if(r){
+            this.fly(r).removeClass(cls);
+        }
+    },
+
+    
+    removeRow : function(row) {
+        Ext.removeNode(this.getRow(row));
+        this.syncFocusEl(row);
+    },
+
+    
+    removeRows : function(firstRow, lastRow) {
+        var bd = this.mainBody.dom,
+            rowIndex;
+            
+        for (rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){
+            Ext.removeNode(bd.childNodes[firstRow]);
+        }
+        
+        this.syncFocusEl(firstRow);
+    },
+
+    
+    
+    
+    getScrollState : function() {
+        var sb = this.scroller.dom;
+        
+        return {
+            left: sb.scrollLeft, 
+            top : sb.scrollTop
+        };
+    },
+
+    
+    restoreScroll : function(state) {
+        var sb = this.scroller.dom;
+        sb.scrollLeft = state.left;
+        sb.scrollTop  = state.top;
+    },
+
+    
+    scrollToTop : function() {
+        var dom = this.scroller.dom;
+        
+        dom.scrollTop  = 0;
+        dom.scrollLeft = 0;
+    },
+
+    
+    syncScroll : function() {
+        this.syncHeaderScroll();
+        var mb = this.scroller.dom;
+        this.grid.fireEvent('bodyscroll', mb.scrollLeft, mb.scrollTop);
+    },
+
+    
+    syncHeaderScroll : function() {
+        var innerHd    = this.innerHd,
+            scrollLeft = this.scroller.dom.scrollLeft;
+        
+        innerHd.scrollLeft = scrollLeft;
+        innerHd.scrollLeft = scrollLeft; 
+    },
+    
+    
+    updateSortIcon : function(col, dir) {
+        var sortClasses = this.sortClasses,
+            sortClass   = sortClasses[dir == "DESC" ? 1 : 0],
+            headers     = this.mainHd.select('td').removeClass(sortClasses);
+        
+        headers.item(col).addClass(sortClass);
+    },
+
+    
+    updateAllColumnWidths : function() {
+        var totalWidth = this.getTotalWidth(),
+            colCount   = this.cm.getColumnCount(),
+            rows       = this.getRows(),
+            rowCount   = rows.length,
+            widths     = [],
+            row, rowFirstChild, trow, i, j;
+        
+        for (i = 0; i < colCount; i++) {
+            widths[i] = this.getColumnWidth(i);
+            this.getHeaderCell(i).style.width = widths[i];
+        }
+        
+        this.updateHeaderWidth();
+        
+        for (i = 0; i < rowCount; i++) {
+            row = rows[i];
+            row.style.width = totalWidth;
+            rowFirstChild = row.firstChild;
+            
+            if (rowFirstChild) {
+                rowFirstChild.style.width = totalWidth;
+                trow = rowFirstChild.rows[0];
+                
+                for (j = 0; j < colCount; j++) {
+                    trow.childNodes[j].style.width = widths[j];
+                }
+            }
+        }
+        
+        this.onAllColumnWidthsUpdated(widths, totalWidth);
+    },
+
+    
+    updateColumnWidth : function(column, width) {
+        var columnWidth = this.getColumnWidth(column),
+            totalWidth  = this.getTotalWidth(),
+            headerCell  = this.getHeaderCell(column),
+            nodes       = this.getRows(),
+            nodeCount   = nodes.length,
+            row, i, firstChild;
+        
+        this.updateHeaderWidth();
+        headerCell.style.width = columnWidth;
+        
+        for (i = 0; i < nodeCount; i++) {
+            row = nodes[i];
+            firstChild = row.firstChild;
+            
+            row.style.width = totalWidth;
+            if (firstChild) {
+                firstChild.style.width = totalWidth;
+                firstChild.rows[0].childNodes[column].style.width = columnWidth;
+            }
+        }
+        
+        this.onColumnWidthUpdated(column, columnWidth, totalWidth);
+    },
+    
+    
+    updateColumnHidden : function(col, hidden) {
+        var totalWidth = this.getTotalWidth(),
+            display    = hidden ? 'none' : '',
+            headerCell = this.getHeaderCell(col),
+            nodes      = this.getRows(),
+            nodeCount  = nodes.length,
+            row, rowFirstChild, i;
+        
+        this.updateHeaderWidth();
+        headerCell.style.display = display;
+        
+        for (i = 0; i < nodeCount; i++) {
+            row = nodes[i];
+            row.style.width = totalWidth;
+            rowFirstChild = row.firstChild;
+            
+            if (rowFirstChild) {
+                rowFirstChild.style.width = totalWidth;
+                rowFirstChild.rows[0].childNodes[col].style.display = display;
+            }
+        }
+        
+        this.onColumnHiddenUpdated(col, hidden, totalWidth);
+        delete this.lastViewWidth; 
+        this.layout();
+    },
+
+    
+    doRender : function(columns, records, store, startRow, colCount, stripe) {
+        var templates = this.templates,
+            cellTemplate = templates.cell,
+            rowTemplate = templates.row,
+            last = colCount - 1,
+            tstyle = 'width:' + this.getTotalWidth() + ';',
+            
+            rowBuffer = [],
+            colBuffer = [],
+            rowParams = {tstyle: tstyle},
+            meta = {},
+            len  = records.length,
+            alt,
+            column,
+            record, i, j, rowIndex;
+
+        
+        for (j = 0; j < len; j++) {
+            record    = records[j];
+            colBuffer = [];
+
+            rowIndex = j + startRow;
+
+            
+            for (i = 0; i < colCount; i++) {
+                column = columns[i];
+                
+                meta.id    = column.id;
+                meta.css   = i === 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');
+                meta.attr  = meta.cellAttr = '';
+                meta.style = column.style;
+                meta.value = column.renderer.call(column.scope, record.data[column.name], meta, record, rowIndex, i, store);
+
+                if (Ext.isEmpty(meta.value)) {
+                    meta.value = '&#160;';
+                }
+
+                if (this.markDirty && record.dirty && typeof record.modified[column.name] != 'undefined') {
+                    meta.css += ' x-grid3-dirty-cell';
+                }
+
+                colBuffer[colBuffer.length] = cellTemplate.apply(meta);
+            }
+
+            alt = [];
+            
+            if (stripe && ((rowIndex + 1) % 2 === 0)) {
+                alt[0] = 'x-grid3-row-alt';
+            }
+
+            if (record.dirty) {
+                alt[1] = ' x-grid3-dirty-row';
+            }
+
+            rowParams.cols = colCount;
+
+            if (this.getRowClass) {
+                alt[2] = this.getRowClass(record, rowIndex, rowParams, store);
+            }
+
+            rowParams.alt   = alt.join(' ');
+            rowParams.cells = colBuffer.join('');
+
+            rowBuffer[rowBuffer.length] = rowTemplate.apply(rowParams);
+        }
+
+        return rowBuffer.join('');
+    },
+
+    
+    processRows : function(startRow, skipStripe) {
+        if (!this.ds || this.ds.getCount() < 1) {
+            return;
+        }
+
+        var rows   = this.getRows(),
+            length = rows.length,
+            row, i;
+
+        skipStripe = skipStripe || !this.grid.stripeRows;
+        startRow   = startRow   || 0;
+
+        for (i = 0; i < length; i++) {
+            row = rows[i];
+            if (row) {
+                row.rowIndex = i;
+                if (!skipStripe) {
+                    row.className = row.className.replace(this.rowClsRe, ' ');
+                    if ((i + 1) % 2 === 0){
+                        row.className += ' x-grid3-row-alt';
+                    }
+                }
+            }
+        }
+
+        
+        if (startRow === 0) {
+            Ext.fly(rows[0]).addClass(this.firstRowCls);
+        }
+
+        Ext.fly(rows[length - 1]).addClass(this.lastRowCls);
+    },
+    
+    
+    afterRender : function() {
+        if (!this.ds || !this.cm) {
+            return;
+        }
+        
+        this.mainBody.dom.innerHTML = this.renderBody() || '&#160;';
+        this.processRows(0, true);
+
+        if (this.deferEmptyText !== true) {
+            this.applyEmptyText();
+        }
+        
+        this.grid.fireEvent('viewready', this.grid);
+    },
+    
+    
+    afterRenderUI: function() {
+        var grid = this.grid;
+        
+        this.initElements();
+
+        
+        Ext.fly(this.innerHd).on('click', this.handleHdDown, this);
+
+        this.mainHd.on({
+            scope    : this,
+            mouseover: this.handleHdOver,
+            mouseout : this.handleHdOut,
+            mousemove: this.handleHdMove
+        });
+
+        this.scroller.on('scroll', this.syncScroll,  this);
+        
+        if (grid.enableColumnResize !== false) {
+            this.splitZone = new Ext.grid.GridView.SplitDragZone(grid, this.mainHd.dom);
+        }
+
+        if (grid.enableColumnMove) {
+            this.columnDrag = new Ext.grid.GridView.ColumnDragZone(grid, this.innerHd);
+            this.columnDrop = new Ext.grid.HeaderDropZone(grid, this.mainHd.dom);
+        }
+
+        if (grid.enableHdMenu !== false) {
+            this.hmenu = new Ext.menu.Menu({id: grid.id + '-hctx'});
+            this.hmenu.add(
+                {itemId:'asc',  text: this.sortAscText,  cls: 'xg-hmenu-sort-asc'},
+                {itemId:'desc', text: this.sortDescText, cls: 'xg-hmenu-sort-desc'}
+            );
+
+            if (grid.enableColumnHide !== false) {
+                this.colMenu = new Ext.menu.Menu({id:grid.id + '-hcols-menu'});
+                this.colMenu.on({
+                    scope     : this,
+                    beforeshow: this.beforeColMenuShow,
+                    itemclick : this.handleHdMenuClick
+                });
+                this.hmenu.add('-', {
+                    itemId:'columns',
+                    hideOnClick: false,
+                    text: this.columnsText,
+                    menu: this.colMenu,
+                    iconCls: 'x-cols-icon'
+                });
+            }
+
+            this.hmenu.on('itemclick', this.handleHdMenuClick, this);
+        }
+
+        if (grid.trackMouseOver) {
+            this.mainBody.on({
+                scope    : this,
+                mouseover: this.onRowOver,
+                mouseout : this.onRowOut
+            });
+        }
+
+        if (grid.enableDragDrop || grid.enableDrag) {
+            this.dragZone = new Ext.grid.GridDragZone(grid, {
+                ddGroup : grid.ddGroup || 'GridDD'
+            });
+        }
+
+        this.updateHeaderSortState();
+    },
+
+    
+    renderUI : function() {
+        var templates = this.templates;
+
+        return templates.master.apply({
+            body  : templates.body.apply({rows:'&#160;'}),
+            header: this.renderHeaders(),
+            ostyle: 'width:' + this.getOffsetWidth() + ';',
+            bstyle: 'width:' + this.getTotalWidth()  + ';'
+        });
+    },
+
+    
+    processEvent : function(name, e) {
+        var target = e.getTarget(),
+            grid   = this.grid,
+            header = this.findHeaderIndex(target),
+            row, cell, col, body;
+
+        grid.fireEvent(name, e);
+
+        if (header !== false) {
+            grid.fireEvent('header' + name, grid, header, e);
+        } else {
+            row = this.findRowIndex(target);
+
+
+
+
+            if (row !== false) {
+                cell = this.findCellIndex(target);
+                if (cell !== false) {
+                    col = grid.colModel.getColumnAt(cell);
+                    if (grid.fireEvent('cell' + name, grid, row, cell, e) !== false) {
+                        if (!col || (col.processEvent && (col.processEvent(name, e, grid, row, cell) !== false))) {
+                            grid.fireEvent('row' + name, grid, row, e);
+                        }
+                    }
+                } else {
+                    if (grid.fireEvent('row' + name, grid, row, e) !== false) {
+                        (body = this.findRowBody(target)) && grid.fireEvent('rowbody' + name, grid, row, e);
+                    }
+                }
+            } else {
+                grid.fireEvent('container' + name, grid, e);
+            }
+        }
+    },
+
+    
+    layout : function(initial) {
+        if (!this.mainBody) {
+            return; 
+        }
+
+        var grid       = this.grid,
+            gridEl     = grid.getGridEl(),
+            gridSize   = gridEl.getSize(true),
+            gridWidth  = gridSize.width,
+            gridHeight = gridSize.height,
+            scroller   = this.scroller,
+            scrollStyle, headerHeight, scrollHeight;
+        
+        if (gridWidth < 20 || gridHeight < 20) {
+            return;
+        }
+        
+        if (grid.autoHeight) {
+            scrollStyle = scroller.dom.style;
+            scrollStyle.overflow = 'visible';
+            
+            if (Ext.isWebKit) {
+                scrollStyle.position = 'static';
+            }
+        } else {
+            this.el.setSize(gridWidth, gridHeight);
+            
+            headerHeight = this.mainHd.getHeight();
+            scrollHeight = gridHeight - headerHeight;
+            
+            scroller.setSize(gridWidth, scrollHeight);
+            
+            if (this.innerHd) {
+                this.innerHd.style.width = (gridWidth) + "px";
+            }
+        }
+        
+        if (this.forceFit || (initial === true && this.autoFill)) {
+            if (this.lastViewWidth != gridWidth) {
+                this.fitColumns(false, false);
+                this.lastViewWidth = gridWidth;
+            }
+        } else {
+            this.autoExpand();
+            this.syncHeaderScroll();
+        }
+        
+        this.onLayout(gridWidth, scrollHeight);
+    },
+
+    
+    
+    onLayout : function(vw, vh) {
+        
+    },
+
+    onColumnWidthUpdated : function(col, w, tw) {
+        
+    },
+
+    onAllColumnWidthsUpdated : function(ws, tw) {
+        
+    },
+
+    onColumnHiddenUpdated : function(col, hidden, tw) {
+        
+    },
+
+    updateColumnText : function(col, text) {
+        
+    },
+
+    afterMove : function(colIndex) {
+        
+    },
+
+    
+    
+    init : function(grid) {
+        this.grid = grid;
+
+        this.initTemplates();
+        this.initData(grid.store, grid.colModel);
+        this.initUI(grid);
+    },
+
+    
+    getColumnId : function(index){
+        return this.cm.getColumnId(index);
+    },
+
+    
+    getOffsetWidth : function() {
+        return (this.cm.getTotalWidth() + this.getScrollOffset()) + 'px';
+    },
+
+    
+    getScrollOffset: function() {
+        return Ext.num(this.scrollOffset, Ext.getScrollBarWidth());
+    },
+
+    
+    renderHeaders : function() {
+        var colModel   = this.cm,
+            templates  = this.templates,
+            headerTpl  = templates.hcell,
+            properties = {},
+            colCount   = colModel.getColumnCount(),
+            last       = colCount - 1,
+            cells      = [],
+            i, cssCls;
+        
+        for (i = 0; i < colCount; i++) {
+            if (i == 0) {
+                cssCls = 'x-grid3-cell-first ';
+            } else {
+                cssCls = i == last ? 'x-grid3-cell-last ' : '';
+            }
+            
+            properties = {
+                id     : colModel.getColumnId(i),
+                value  : colModel.getColumnHeader(i) || '',
+                style  : this.getColumnStyle(i, true),
+                css    : cssCls,
+                tooltip: this.getColumnTooltip(i)
+            };
+            
+            if (colModel.config[i].align == 'right') {
+                properties.istyle = 'padding-right: 16px;';
+            } else {
+                delete properties.istyle;
+            }
+            
+            cells[i] = headerTpl.apply(properties);
+        }
+        
+        return templates.header.apply({
+            cells : cells.join(""),
+            tstyle: String.format("width: {0};", this.getTotalWidth())
+        });
+    },
+
+    
+    getColumnTooltip : function(i) {
+        var tooltip = this.cm.getColumnTooltip(i);
+        if (tooltip) {
+            if (Ext.QuickTips.isEnabled()) {
+                return 'ext:qtip="' + tooltip + '"';
+            } else {
+                return 'title="' + tooltip + '"';
+            }
+        }
+        
+        return '';
+    },
+
+    
+    beforeUpdate : function() {
+        this.grid.stopEditing(true);
+    },
+
+    
+    updateHeaders : function() {
+        this.innerHd.firstChild.innerHTML = this.renderHeaders();
+        
+        this.updateHeaderWidth(false);
+    },
+    
+    
+    updateHeaderWidth: function(updateMain) {
+        var innerHdChild = this.innerHd.firstChild,
+            totalWidth   = this.getTotalWidth();
+        
+        innerHdChild.style.width = this.getOffsetWidth();
+        innerHdChild.firstChild.style.width = totalWidth;
+        
+        if (updateMain !== false) {
+            this.mainBody.dom.style.width = totalWidth;
+        }
+    },
+
+    
+    focusRow : function(row) {
+        this.focusCell(row, 0, false);
+    },
+
+    
+    focusCell : function(row, col, hscroll) {
+        this.syncFocusEl(this.ensureVisible(row, col, hscroll));
+        
+        var focusEl = this.focusEl;
+        
+        if (Ext.isGecko) {
+            focusEl.focus();
+        } else {
+            focusEl.focus.defer(1, focusEl);
+        }
+    },
+
+    
+    resolveCell : function(row, col, hscroll) {
+        if (!Ext.isNumber(row)) {
+            row = row.rowIndex;
+        }
+        
+        if (!this.ds) {
+            return null;
+        }
+        
+        if (row < 0 || row >= this.ds.getCount()) {
+            return null;
+        }
+        col = (col !== undefined ? col : 0);
+
+        var rowEl    = this.getRow(row),
+            colModel = this.cm,
+            colCount = colModel.getColumnCount(),
+            cellEl;
+            
+        if (!(hscroll === false && col === 0)) {
+            while (col < colCount && colModel.isHidden(col)) {
+                col++;
+            }
+            
+            cellEl = this.getCell(row, col);
+        }
+
+        return {row: rowEl, cell: cellEl};
+    },
+
+    
+    getResolvedXY : function(resolved) {
+        if (!resolved) {
+            return null;
+        }
+        
+        var cell = resolved.cell,
+            row  = resolved.row;
+        
+        if (cell) {
+            return Ext.fly(cell).getXY();
+        } else {
+            return [this.el.getX(), Ext.fly(row).getY()];
+        }
+    },
+
+    
+    syncFocusEl : function(row, col, hscroll) {
+        var xy = row;
+        
+        if (!Ext.isArray(xy)) {
+            row = Math.min(row, Math.max(0, this.getRows().length-1));
+            
+            if (isNaN(row)) {
+                return;
+            }
+            
+            xy = this.getResolvedXY(this.resolveCell(row, col, hscroll));
+        }
+        
+        this.focusEl.setXY(xy || this.scroller.getXY());
+    },
+
+    
+    ensureVisible : function(row, col, hscroll) {
+        var resolved = this.resolveCell(row, col, hscroll);
+        
+        if (!resolved || !resolved.row) {
+            return null;
+        }
+
+        var rowEl  = resolved.row,
+            cellEl = resolved.cell,
+            c = this.scroller.dom,
+            p = rowEl,
+            ctop = 0,
+            stop = this.el.dom;
+
+        while (p && p != stop) {
+            ctop += p.offsetTop;
+            p = p.offsetParent;
+        }
+
+        ctop -= this.mainHd.dom.offsetHeight;
+        stop = parseInt(c.scrollTop, 10);
+
+        var cbot = ctop + rowEl.offsetHeight,
+            ch = c.clientHeight,
+            sbot = stop + ch;
+
+
+        if (ctop < stop) {
+          c.scrollTop = ctop;
+        } else if(cbot > sbot) {
+            c.scrollTop = cbot-ch;
+        }
+
+        if (hscroll !== false) {
+            var cleft  = parseInt(cellEl.offsetLeft, 10),
+                cright = cleft + cellEl.offsetWidth,
+                sleft  = parseInt(c.scrollLeft, 10),
+                sright = sleft + c.clientWidth;
+                
+            if (cleft < sleft) {
+                c.scrollLeft = cleft;
+            } else if(cright > sright) {
+                c.scrollLeft = cright-c.clientWidth;
+            }
+        }
+        
+        return this.getResolvedXY(resolved);
+    },
+
+    
+    insertRows : function(dm, firstRow, lastRow, isUpdate) {
+        var last = dm.getCount() - 1;
+        if( !isUpdate && firstRow === 0 && lastRow >= last) {
+            this.fireEvent('beforerowsinserted', this, firstRow, lastRow);
+                this.refresh();
+            this.fireEvent('rowsinserted', this, firstRow, lastRow);
+        } else {
+            if (!isUpdate) {
+                this.fireEvent('beforerowsinserted', this, firstRow, lastRow);
+            }
+            var html = this.renderRows(firstRow, lastRow),
+                before = this.getRow(firstRow);
+            if (before) {
+                if(firstRow === 0){
+                    Ext.fly(this.getRow(0)).removeClass(this.firstRowCls);
+                }
+                Ext.DomHelper.insertHtml('beforeBegin', before, html);
+            } else {
+                var r = this.getRow(last - 1);
+                if(r){
+                    Ext.fly(r).removeClass(this.lastRowCls);
+                }
+                Ext.DomHelper.insertHtml('beforeEnd', this.mainBody.dom, html);
+            }
+            if (!isUpdate) {
+                this.processRows(firstRow);
+                this.fireEvent('rowsinserted', this, firstRow, lastRow);
+            } else if (firstRow === 0 || firstRow >= last) {
+                
+                Ext.fly(this.getRow(firstRow)).addClass(firstRow === 0 ? this.firstRowCls : this.lastRowCls);
+            }
+        }
+        this.syncFocusEl(firstRow);
+    },
+
+    
+    deleteRows : function(dm, firstRow, lastRow) {
+        if (dm.getRowCount() < 1) {
+            this.refresh();
+        } else {
+            this.fireEvent('beforerowsdeleted', this, firstRow, lastRow);
+
+            this.removeRows(firstRow, lastRow);
+
+            this.processRows(firstRow);
+            this.fireEvent('rowsdeleted', this, firstRow, lastRow);
+        }
+    },
+
+    
+    getColumnStyle : function(colIndex, isHeader) {
+        var colModel  = this.cm,
+            colConfig = colModel.config,
+            style     = isHeader ? '' : colConfig[colIndex].css || '',
+            align     = colConfig[colIndex].align;
+        
+        style += String.format("width: {0};", this.getColumnWidth(colIndex));
+        
+        if (colModel.isHidden(colIndex)) {
+            style += 'display: none; ';
+        }
+        
+        if (align) {
+            style += String.format("text-align: {0};", align);
+        }
+        
+        return style;
+    },
+
+    
+    getColumnWidth : function(column) {
+        var columnWidth = this.cm.getColumnWidth(column),
+            borderWidth = this.borderWidth;
+        
+        if (Ext.isNumber(columnWidth)) {
+            if (Ext.isBorderBox || (Ext.isWebKit && !Ext.isSafari2)) {
+                return columnWidth + "px";
+            } else {
+                return Math.max(columnWidth - borderWidth, 0) + "px";
+            }
+        } else {
+            return columnWidth;
+        }
+    },
+
+    
+    getTotalWidth : function() {
+        return this.cm.getTotalWidth() + 'px';
+    },
+
+    
+    fitColumns : function(preventRefresh, onlyExpand, omitColumn) {
+        var grid          = this.grid,
+            colModel      = this.cm,
+            totalColWidth = colModel.getTotalWidth(false),
+            gridWidth     = this.getGridInnerWidth(),
+            extraWidth    = gridWidth - totalColWidth,
+            columns       = [],
+            extraCol      = 0,
+            width         = 0,
+            colWidth, fraction, i;
+        
+        
+        if (gridWidth < 20 || extraWidth === 0) {
+            return false;
+        }
+        
+        var visibleColCount = colModel.getColumnCount(true),
+            totalColCount   = colModel.getColumnCount(false),
+            adjCount        = visibleColCount - (Ext.isNumber(omitColumn) ? 1 : 0);
+        
+        if (adjCount === 0) {
+            adjCount = 1;
+            omitColumn = undefined;
+        }
+        
+        
+        for (i = 0; i < totalColCount; i++) {
+            if (!colModel.isFixed(i) && i !== omitColumn) {
+                colWidth = colModel.getColumnWidth(i);
+                columns.push(i, colWidth);
+                
+                if (!colModel.isHidden(i)) {
+                    extraCol = i;
+                    width += colWidth;
+                }
+            }
+        }
+        
+        fraction = (gridWidth - colModel.getTotalWidth()) / width;
+        
+        while (columns.length) {
+            colWidth = columns.pop();
+            i        = columns.pop();
+            
+            colModel.setColumnWidth(i, Math.max(grid.minColumnWidth, Math.floor(colWidth + colWidth * fraction)), true);
+        }
+        
+        
+        totalColWidth = colModel.getTotalWidth(false);
+        
+        if (totalColWidth > gridWidth) {
+            var adjustCol = (adjCount == visibleColCount) ? extraCol : omitColumn,
+                newWidth  = Math.max(1, colModel.getColumnWidth(adjustCol) - (totalColWidth - gridWidth));
+            
+            colModel.setColumnWidth(adjustCol, newWidth, true);
+        }
+        
+        if (preventRefresh !== true) {
+            this.updateAllColumnWidths();
+        }
+        
+        return true;
+    },
+
+    
+    autoExpand : function(preventUpdate) {
+        var grid             = this.grid,
+            colModel         = this.cm,
+            gridWidth        = this.getGridInnerWidth(),
+            totalColumnWidth = colModel.getTotalWidth(false),
+            autoExpandColumn = grid.autoExpandColumn;
+        
+        if (!this.userResized && autoExpandColumn) {
+            if (gridWidth != totalColumnWidth) {
+                
+                var colIndex     = colModel.getIndexById(autoExpandColumn),
+                    currentWidth = colModel.getColumnWidth(colIndex),
+                    desiredWidth = gridWidth - totalColumnWidth + currentWidth,
+                    newWidth     = Math.min(Math.max(desiredWidth, grid.autoExpandMin), grid.autoExpandMax);
+                
+                if (currentWidth != newWidth) {
+                    colModel.setColumnWidth(colIndex, newWidth, true);
+                    
+                    if (preventUpdate !== true) {
+                        this.updateColumnWidth(colIndex, newWidth);
+                    }
+                }
+            }
+        }
+    },
+    
+    
+    getGridInnerWidth: function() {
+        return this.grid.getGridEl().getWidth(true) - this.getScrollOffset();
+    },
+
+    
+    getColumnData : function() {
+        var columns  = [],
+            colModel = this.cm,
+            colCount = colModel.getColumnCount(),
+            fields   = this.ds.fields,
+            i, name;
+        
+        for (i = 0; i < colCount; i++) {
+            name = colModel.getDataIndex(i);
+            
+            columns[i] = {
+                name    : Ext.isDefined(name) ? name : (fields.get(i) ? fields.get(i).name : undefined),
+                renderer: colModel.getRenderer(i),
+                scope   : colModel.getRendererScope(i),
+                id      : colModel.getColumnId(i),
+                style   : this.getColumnStyle(i)
+            };
+        }
+        
+        return columns;
+    },
+
+    
+    renderRows : function(startRow, endRow) {
+        var grid     = this.grid,
+            store    = grid.store,
+            stripe   = grid.stripeRows,
+            colModel = grid.colModel,
+            colCount = colModel.getColumnCount(),
+            rowCount = store.getCount(),
+            records;
+        
+        if (rowCount < 1) {
+            return '';
+        }
+        
+        startRow = startRow || 0;
+        endRow   = Ext.isDefined(endRow) ? endRow : rowCount - 1;
+        records  = store.getRange(startRow, endRow);
+        
+        return this.doRender(this.getColumnData(), records, store, startRow, colCount, stripe);
+    },
+
+    
+    renderBody : function(){
+        var markup = this.renderRows() || '&#160;';
+        return this.templates.body.apply({rows: markup});
+    },
+
+    
+    refreshRow: function(record) {
+        var store     = this.ds,
+            colCount  = this.cm.getColumnCount(),
+            columns   = this.getColumnData(),
+            last      = colCount - 1,
+            cls       = ['x-grid3-row'],
+            rowParams = {
+                tstyle: String.format("width: {0};", this.getTotalWidth())
+            },
+            colBuffer = [],
+            cellTpl   = this.templates.cell,
+            rowIndex, row, column, meta, css, i;
+        
+        if (Ext.isNumber(record)) {
+            rowIndex = record;
+            record   = store.getAt(rowIndex);
+        } else {
+            rowIndex = store.indexOf(record);
+        }
+        
+        
+        if (!record || rowIndex < 0) {
+            return;
+        }
+        
+        
+        for (i = 0; i < colCount; i++) {
+            column = columns[i];
+            
+            if (i == 0) {
+                css = 'x-grid3-cell-first';
+            } else {
+                css = (i == last) ? 'x-grid3-cell-last ' : '';
+            }
+            
+            meta = {
+                id      : column.id,
+                style   : column.style,
+                css     : css,
+                attr    : "",
+                cellAttr: ""
+            };
+            
+            meta.value = column.renderer.call(column.scope, record.data[column.name], meta, record, rowIndex, i, store);
+            
+            if (Ext.isEmpty(meta.value)) {
+                meta.value = '&#160;';
+            }
+            
+            if (this.markDirty && record.dirty && typeof record.modified[column.name] != 'undefined') {
+                meta.css += ' x-grid3-dirty-cell';
+            }
+            
+            colBuffer[i] = cellTpl.apply(meta);
+        }
+        
+        row = this.getRow(rowIndex);
+        row.className = '';
+        
+        if (this.grid.stripeRows && ((rowIndex + 1) % 2 === 0)) {
+            cls.push('x-grid3-row-alt');
+        }
+        
+        if (this.getRowClass) {
+            rowParams.cols = colCount;
+            cls.push(this.getRowClass(record, rowIndex, rowParams, store));
+        }
+        
+        this.fly(row).addClass(cls).setStyle(rowParams.tstyle);
+        rowParams.cells = colBuffer.join("");
+        row.innerHTML = this.templates.rowInner.apply(rowParams);
+        
+        this.fireEvent('rowupdated', this, rowIndex, record);
+    },
+
+    
+    refresh : function(headersToo) {
+        this.fireEvent('beforerefresh', this);
+        this.grid.stopEditing(true);
+
+        var result = this.renderBody();
+        this.mainBody.update(result).setWidth(this.getTotalWidth());
+        if (headersToo === true) {
+            this.updateHeaders();
+            this.updateHeaderSortState();
+        }
+        this.processRows(0, true);
+        this.layout();
+        this.applyEmptyText();
+        this.fireEvent('refresh', this);
+    },
+
+    
+    applyEmptyText : function() {
+        if (this.emptyText && !this.hasRows()) {
+            this.mainBody.update('<div class="x-grid-empty">' + this.emptyText + '</div>');
+        }
+    },
+
+    
+    updateHeaderSortState : function() {
+        var state = this.ds.getSortState();
+        if (!state) {
+            return;
+        }
+
+        if (!this.sortState || (this.sortState.field != state.field || this.sortState.direction != state.direction)) {
+            this.grid.fireEvent('sortchange', this.grid, state);
+        }
+
+        this.sortState = state;
+
+        var sortColumn = this.cm.findColumnIndex(state.field);
+        if (sortColumn != -1) {
+            var sortDir = state.direction;
+            this.updateSortIcon(sortColumn, sortDir);
+        }
+    },
+
+    
+    clearHeaderSortState : function() {
+        if (!this.sortState) {
+            return;
+        }
+        this.grid.fireEvent('sortchange', this.grid, null);
+        this.mainHd.select('td').removeClass(this.sortClasses);
+        delete this.sortState;
+    },
+
+    
+    destroy : function() {
+        var me              = this,
+            grid            = me.grid,
+            gridEl          = grid.getGridEl(),
+            dragZone        = me.dragZone,
+            splitZone       = me.splitZone,
+            columnDrag      = me.columnDrag,
+            columnDrop      = me.columnDrop,
+            scrollToTopTask = me.scrollToTopTask,
+            columnDragData,
+            columnDragProxy;
+        
+        if (scrollToTopTask && scrollToTopTask.cancel) {
+            scrollToTopTask.cancel();
+        }
+        
+        Ext.destroyMembers(me, 'colMenu', 'hmenu');
+
+        me.initData(null, null);
+        me.purgeListeners();
+        
+        Ext.fly(me.innerHd).un("click", me.handleHdDown, me);
+
+        if (grid.enableColumnMove) {
+            columnDragData = columnDrag.dragData;
+            columnDragProxy = columnDrag.proxy;
+            Ext.destroy(
+                columnDrag.el,
+                columnDragProxy.ghost,
+                columnDragProxy.el,
+                columnDrop.el,
+                columnDrop.proxyTop,
+                columnDrop.proxyBottom,
+                columnDragData.ddel,
+                columnDragData.header
+            );
+            
+            if (columnDragProxy.anim) {
+                Ext.destroy(columnDragProxy.anim);
+            }
+            
+            delete columnDragProxy.ghost;
+            delete columnDragData.ddel;
+            delete columnDragData.header;
+            columnDrag.destroy();
+            
+            delete Ext.dd.DDM.locationCache[columnDrag.id];
+            delete columnDrag._domRef;
+
+            delete columnDrop.proxyTop;
+            delete columnDrop.proxyBottom;
+            columnDrop.destroy();
+            delete Ext.dd.DDM.locationCache["gridHeader" + gridEl.id];
+            delete columnDrop._domRef;
+            delete Ext.dd.DDM.ids[columnDrop.ddGroup];
+        }
+
+        if (splitZone) { 
+            splitZone.destroy();
+            delete splitZone._domRef;
+            delete Ext.dd.DDM.ids["gridSplitters" + gridEl.id];
+        }
+
+        Ext.fly(me.innerHd).removeAllListeners();
+        Ext.removeNode(me.innerHd);
+        delete me.innerHd;
+
+        Ext.destroy(
+            me.el,
+            me.mainWrap,
+            me.mainHd,
+            me.scroller,
+            me.mainBody,
+            me.focusEl,
+            me.resizeMarker,
+            me.resizeProxy,
+            me.activeHdBtn,
+            me._flyweight,
+            dragZone,
+            splitZone
+        );
+
+        delete grid.container;
+
+        if (dragZone) {
+            dragZone.destroy();
+        }
+
+        Ext.dd.DDM.currentTarget = null;
+        delete Ext.dd.DDM.locationCache[gridEl.id];
+
+        Ext.EventManager.removeResizeListener(me.onWindowResize, me);
+    },
+
+    
+    onDenyColumnHide : function() {
+
+    },
+
+    
+    render : function() {
+        if (this.autoFill) {
+            var ct = this.grid.ownerCt;
+            
+            if (ct && ct.getLayout()) {
+                ct.on('afterlayout', function() {
+                    this.fitColumns(true, true);
+                    this.updateHeaders();
+                    this.updateHeaderSortState();
+                }, this, {single: true});
+            }
+        } else if (this.forceFit) {
+            this.fitColumns(true, false);
+        } else if (this.grid.autoExpandColumn) {
+            this.autoExpand(true);
+        }
+        
+        this.grid.getGridEl().dom.innerHTML = this.renderUI();
+        
+        this.afterRenderUI();
+    },
+
+    
+    
+    
+    initData : function(newStore, newColModel) {
+        var me = this;
+        
+        if (me.ds) {
+            var oldStore = me.ds;
+            
+            oldStore.un('add', me.onAdd, me);
+            oldStore.un('load', me.onLoad, me);
+            oldStore.un('clear', me.onClear, me);
+            oldStore.un('remove', me.onRemove, me);
+            oldStore.un('update', me.onUpdate, me);
+            oldStore.un('datachanged', me.onDataChange, me);
+            
+            if (oldStore !== newStore && oldStore.autoDestroy) {
+                oldStore.destroy();
+            }
+        }
+        
+        if (newStore) {
+            newStore.on({
+                scope      : me,
+                load       : me.onLoad,
+                add        : me.onAdd,
+                remove     : me.onRemove,
+                update     : me.onUpdate,
+                clear      : me.onClear,
+                datachanged: me.onDataChange
+            });
+        }
+        
+        if (me.cm) {
+            var oldColModel = me.cm;
+            
+            oldColModel.un('configchange', me.onColConfigChange, me);
+            oldColModel.un('widthchange',  me.onColWidthChange, me);
+            oldColModel.un('headerchange', me.onHeaderChange, me);
+            oldColModel.un('hiddenchange', me.onHiddenChange, me);
+            oldColModel.un('columnmoved',  me.onColumnMove, me);
+        }
+        
+        if (newColModel) {
+            delete me.lastViewWidth;
+            
+            newColModel.on({
+                scope       : me,
+                configchange: me.onColConfigChange,
+                widthchange : me.onColWidthChange,
+                headerchange: me.onHeaderChange,
+                hiddenchange: me.onHiddenChange,
+                columnmoved : me.onColumnMove
+            });
+        }
+        
+        me.ds = newStore;
+        me.cm = newColModel;
+    },
+
+    
+    onDataChange : function(){
+        this.refresh(true);
+        this.updateHeaderSortState();
+        this.syncFocusEl(0);
+    },
+
+    
+    onClear : function() {
+        this.refresh();
+        this.syncFocusEl(0);
+    },
+
+    
+    onUpdate : function(store, record) {
+        this.refreshRow(record);
+    },
+
+    
+    onAdd : function(store, records, index) {
+        this.insertRows(store, index, index + (records.length-1));
+    },
+
+    
+    onRemove : function(store, record, index, isUpdate) {
+        if (isUpdate !== true) {
+            this.fireEvent('beforerowremoved', this, index, record);
+        }
+        
+        this.removeRow(index);
+        
+        if (isUpdate !== true) {
+            this.processRows(index);
+            this.applyEmptyText();
+            this.fireEvent('rowremoved', this, index, record);
+        }
+    },
+
+    
+    onLoad : function() {
+        if (Ext.isGecko) {
+            if (!this.scrollToTopTask) {
+                this.scrollToTopTask = new Ext.util.DelayedTask(this.scrollToTop, this);
+            }
+            this.scrollToTopTask.delay(1);
+        } else {
+            this.scrollToTop();
+        }
+    },
+
+    
+    onColWidthChange : function(cm, col, width) {
+        this.updateColumnWidth(col, width);
+    },
+
+    
+    onHeaderChange : function(cm, col, text) {
+        this.updateHeaders();
+    },
+
+    
+    onHiddenChange : function(cm, col, hidden) {
+        this.updateColumnHidden(col, hidden);
+    },
+
+    
+    onColumnMove : function(cm, oldIndex, newIndex) {
+        this.indexMap = null;
+        this.refresh(true);
+        this.restoreScroll(this.getScrollState());
+        
+        this.afterMove(newIndex);
+        this.grid.fireEvent('columnmove', oldIndex, newIndex);
+    },
+
+    
+    onColConfigChange : function() {
+        delete this.lastViewWidth;
+        this.indexMap = null;
+        this.refresh(true);
+    },
+
+    
+    
+    initUI : function(grid) {
+        grid.on('headerclick', this.onHeaderClick, this);
+    },
+
+    
+    initEvents : Ext.emptyFn,
+
+    
+    onHeaderClick : function(g, index) {
+        if (this.headersDisabled || !this.cm.isSortable(index)) {
+            return;
+        }
+        g.stopEditing(true);
+        g.store.sort(this.cm.getDataIndex(index));
+    },
+
+    
+    onRowOver : function(e, target) {
+        var row = this.findRowIndex(target);
+        
+        if (row !== false) {
+            this.addRowClass(row, this.rowOverCls);
+        }
+    },
+
+    
+    onRowOut : function(e, target) {
+        var row = this.findRowIndex(target);
+        
+        if (row !== false && !e.within(this.getRow(row), true)) {
+            this.removeRowClass(row, this.rowOverCls);
+        }
+    },
+
+    
+    onRowSelect : function(row) {
+        this.addRowClass(row, this.selectedRowClass);
+    },
+
+    
+    onRowDeselect : function(row) {
+        this.removeRowClass(row, this.selectedRowClass);
+    },
+
+    
+    onCellSelect : function(row, col) {
+        var cell = this.getCell(row, col);
+        if (cell) {
+            this.fly(cell).addClass('x-grid3-cell-selected');
+        }
+    },
+
+    
+    onCellDeselect : function(row, col) {
+        var cell = this.getCell(row, col);
+        if (cell) {
+            this.fly(cell).removeClass('x-grid3-cell-selected');
+        }
+    },
+
+    
+    handleWheel : function(e) {
+        e.stopPropagation();
+    },
+
+    
+    onColumnSplitterMoved : function(cellIndex, width) {
+        this.userResized = true;
+        this.grid.colModel.setColumnWidth(cellIndex, width, true);
+
+        if (this.forceFit) {
+            this.fitColumns(true, false, cellIndex);
+            this.updateAllColumnWidths();
+        } else {
+            this.updateColumnWidth(cellIndex, width);
+            this.syncHeaderScroll();
+        }
+
+        this.grid.fireEvent('columnresize', cellIndex, width);
+    },
+
+    
+    beforeColMenuShow : function() {
+        var colModel = this.cm,
+            colCount = colModel.getColumnCount(),
+            colMenu  = this.colMenu,
+            i;
+
+        colMenu.removeAll();
+
+        for (i = 0; i < colCount; i++) {
+            if (colModel.config[i].hideable !== false) {
+                colMenu.add(new Ext.menu.CheckItem({
+                    text       : colModel.getColumnHeader(i),
+                    itemId     : 'col-' + colModel.getColumnId(i),
+                    checked    : !colModel.isHidden(i),
+                    disabled   : colModel.config[i].hideable === false,
+                    hideOnClick: false
+                }));
+            }
+        }
+    },
+    
+    
+    handleHdMenuClick : function(item) {
+        var store     = this.ds,
+            dataIndex = this.cm.getDataIndex(this.hdCtxIndex);
+
+        switch (item.getItemId()) {
+            case 'asc':
+                store.sort(dataIndex, 'ASC');
+                break;
+            case 'desc':
+                store.sort(dataIndex, 'DESC');
+                break;
+            default:
+                this.handleHdMenuClickDefault(item);
+        }
+        return true;
+    },
+    
+    
+    handleHdMenuClickDefault: function(item) {
+        var colModel = this.cm,
+            itemId   = item.getItemId(),
+            index    = colModel.getIndexById(itemId.substr(4));
+
+        if (index != -1) {
+            if (item.checked && colModel.getColumnsBy(this.isHideableColumn, this).length <= 1) {
+                this.onDenyColumnHide();
+                return;
+            }
+            colModel.setHidden(index, item.checked);
+        }
+    },
+
+    
+    handleHdDown : function(e, target) {
+        if (Ext.fly(target).hasClass('x-grid3-hd-btn')) {
+            e.stopEvent();
+            
+            var colModel  = this.cm,
+                header    = this.findHeaderCell(target),
+                index     = this.getCellIndex(header),
+                sortable  = colModel.isSortable(index),
+                menu      = this.hmenu,
+                menuItems = menu.items,
+                menuCls   = this.headerMenuOpenCls;
+            
+            this.hdCtxIndex = index;
+            
+            Ext.fly(header).addClass(menuCls);
+            menuItems.get('asc').setDisabled(!sortable);
+            menuItems.get('desc').setDisabled(!sortable);
+            
+            menu.on('hide', function() {
+                Ext.fly(header).removeClass(menuCls);
+            }, this, {single:true});
+            
+            menu.show(target, 'tl-bl?');
+        }
+    },
+
+    
+    handleHdMove : function(e) {
+        var header = this.findHeaderCell(this.activeHdRef);
+        
+        if (header && !this.headersDisabled) {
+            var handleWidth  = this.splitHandleWidth || 5,
+                activeRegion = this.activeHdRegion,
+                headerStyle  = header.style,
+                colModel     = this.cm,
+                cursor       = '',
+                pageX        = e.getPageX();
+                
+            if (this.grid.enableColumnResize !== false) {
+                var activeHeaderIndex = this.activeHdIndex,
+                    previousVisible   = this.getPreviousVisible(activeHeaderIndex),
+                    currentResizable  = colModel.isResizable(activeHeaderIndex),
+                    previousResizable = previousVisible && colModel.isResizable(previousVisible),
+                    inLeftResizer     = pageX - activeRegion.left <= handleWidth,
+                    inRightResizer    = activeRegion.right - pageX <= (!this.activeHdBtn ? handleWidth : 2);
+                
+                if (inLeftResizer && previousResizable) {
+                    cursor = Ext.isAir ? 'move' : Ext.isWebKit ? 'e-resize' : 'col-resize'; 
+                } else if (inRightResizer && currentResizable) {
+                    cursor = Ext.isAir ? 'move' : Ext.isWebKit ? 'w-resize' : 'col-resize';
+                }
+            }
+            
+            headerStyle.cursor = cursor;
+        }
+    },
+    
+    
+    getPreviousVisible: function(index) {
+        while (index > 0) {
+            if (!this.cm.isHidden(index - 1)) {
+                return index;
+            }
+            index--;
+        }
+        return undefined;
+    },
+
+    
+    handleHdOver : function(e, target) {
+        var header = this.findHeaderCell(target);
+        
+        if (header && !this.headersDisabled) {
+            var fly = this.fly(header);
+            
+            this.activeHdRef = target;
+            this.activeHdIndex = this.getCellIndex(header);
+            this.activeHdRegion = fly.getRegion();
+            
+            if (!this.isMenuDisabled(this.activeHdIndex, fly)) {
+                fly.addClass('x-grid3-hd-over');
+                this.activeHdBtn = fly.child('.x-grid3-hd-btn');
+                
+                if (this.activeHdBtn) {
+                    this.activeHdBtn.dom.style.height = (header.firstChild.offsetHeight - 1) + 'px';
+                }
+            }
+        }
+    },
+
+    
+    handleHdOut : function(e, target) {
+        var header = this.findHeaderCell(target);
+        
+        if (header && (!Ext.isIE || !e.within(header, true))) {
+            this.activeHdRef = null;
+            this.fly(header).removeClass('x-grid3-hd-over');
+            header.style.cursor = '';
+        }
+    },
+    
+    
+    isMenuDisabled: function(cellIndex, el) {
+        return this.cm.isMenuDisabled(cellIndex);
+    },
+
+    
+    hasRows : function() {
+        var fc = this.mainBody.dom.firstChild;
+        return fc && fc.nodeType == 1 && fc.className != 'x-grid-empty';
+    },
+    
+    
+    isHideableColumn : function(c) {
+        return !c.hidden;
+    },
+
+    
+    bind : function(d, c) {
+        this.initData(d, c);
+    }
+});
+
+
+
+
+Ext.grid.GridView.SplitDragZone = Ext.extend(Ext.dd.DDProxy, {
+
+    constructor: function(grid, hd){
+        this.grid = grid;
+        this.view = grid.getView();
+        this.marker = this.view.resizeMarker;
+        this.proxy = this.view.resizeProxy;
+        Ext.grid.GridView.SplitDragZone.superclass.constructor.call(this, hd,
+            'gridSplitters' + this.grid.getGridEl().id, {
+            dragElId : Ext.id(this.proxy.dom), resizeFrame:false
+        });
+        this.scroll = false;
+        this.hw = this.view.splitHandleWidth || 5;
+    },
+
+    b4StartDrag : function(x, y){
+        this.dragHeadersDisabled = this.view.headersDisabled;
+        this.view.headersDisabled = true;
+        var h = this.view.mainWrap.getHeight();
+        this.marker.setHeight(h);
+        this.marker.show();
+        this.marker.alignTo(this.view.getHeaderCell(this.cellIndex), 'tl-tl', [-2, 0]);
+        this.proxy.setHeight(h);
+        var w = this.cm.getColumnWidth(this.cellIndex),
+            minw = Math.max(w-this.grid.minColumnWidth, 0);
+        this.resetConstraints();
+        this.setXConstraint(minw, 1000);
+        this.setYConstraint(0, 0);
+        this.minX = x - minw;
+        this.maxX = x + 1000;
+        this.startPos = x;
+        Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y);
+    },
+
+    allowHeaderDrag : function(e){
+        return true;
+    },
+
+    handleMouseDown : function(e){
+        var t = this.view.findHeaderCell(e.getTarget());
+        if(t && this.allowHeaderDrag(e)){
+            var xy = this.view.fly(t).getXY(), 
+                x = xy[0],
+                exy = e.getXY(), 
+                ex = exy[0],
+                w = t.offsetWidth, 
+                adjust = false;
+                
+            if((ex - x) <= this.hw){
+                adjust = -1;
+            }else if((x+w) - ex <= this.hw){
+                adjust = 0;
+            }
+            if(adjust !== false){
+                this.cm = this.grid.colModel;
+                var ci = this.view.getCellIndex(t);
+                if(adjust == -1){
+                  if (ci + adjust < 0) {
+                    return;
+                  }
+                    while(this.cm.isHidden(ci+adjust)){
+                        --adjust;
+                        if(ci+adjust < 0){
+                            return;
+                        }
+                    }
+                }
+                this.cellIndex = ci+adjust;
+                this.split = t.dom;
+                if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){
+                    Ext.grid.GridView.SplitDragZone.superclass.handleMouseDown.apply(this, arguments);
+                }
+            }else if(this.view.columnDrag){
+                this.view.columnDrag.callHandleMouseDown(e);
+            }
+        }
+    },
+
+    endDrag : function(e){
+        this.marker.hide();
+        var v = this.view,
+            endX = Math.max(this.minX, e.getPageX()),
+            diff = endX - this.startPos,
+            disabled = this.dragHeadersDisabled;
+            
+        v.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff);
+        setTimeout(function(){
+            v.headersDisabled = disabled;
+        }, 50);
+    },
+
+    autoOffset : function(){
+        this.setDelta(0,0);
+    }
+});
+
+Ext.grid.PivotGridView = Ext.extend(Ext.grid.GridView, {
+    
+    
+    colHeaderCellCls: 'grid-hd-group-cell',
+    
+    
+    title: '',
+    
+    
+    
+    
+    getColumnHeaders: function() {
+        return this.grid.topAxis.buildHeaders();;
+    },
+    
+    
+    getRowHeaders: function() {
+        return this.grid.leftAxis.buildHeaders();
+    },
+    
+    
+    renderRows : function(startRow, endRow) {
+        var grid          = this.grid,
+            rows          = grid.extractData(),
+            rowCount      = rows.length,
+            templates     = this.templates,
+            renderer      = grid.renderer,
+            hasRenderer   = typeof renderer == 'function',
+            getCellCls    = this.getCellCls,
+            hasGetCellCls = typeof getCellCls == 'function',
+            cellTemplate  = templates.cell,
+            rowTemplate   = templates.row,
+            rowBuffer     = [],
+            meta          = {},
+            tstyle        = 'width:' + this.getGridInnerWidth() + 'px;',
+            colBuffer, column, i;
+        
+        startRow = startRow || 0;
+        endRow   = Ext.isDefined(endRow) ? endRow : rowCount - 1;
+        
+        for (i = 0; i < rowCount; i++) {
+            row = rows[i];
+            colCount  = row.length;
+            colBuffer = [];
+            
+            rowIndex = startRow + i;
+
+            
+            for (j = 0; j < colCount; j++) {
+                cell = row[j];
+
+                meta.css   = j === 0 ? 'x-grid3-cell-first ' : (j == (colCount - 1) ? 'x-grid3-cell-last ' : '');
+                meta.attr  = meta.cellAttr = '';
+                meta.value = cell;
+
+                if (Ext.isEmpty(meta.value)) {
+                    meta.value = '&#160;';
+                }
+                
+                if (hasRenderer) {
+                    meta.value = renderer(meta.value);
+                }
+                
+                if (hasGetCellCls) {
+                    meta.css += getCellCls(meta.value) + ' ';
+                }
+
+                colBuffer[colBuffer.length] = cellTemplate.apply(meta);
+            }
+            
+            rowBuffer[rowBuffer.length] = rowTemplate.apply({
+                tstyle: tstyle,
+                cols  : colCount,
+                cells : colBuffer.join(""),
+                alt   : ''
+            });
+        }
+        
+        return rowBuffer.join("");
+    },
+    
+    
+    masterTpl: new Ext.Template(
+        '<div class="x-grid3 x-pivotgrid" hidefocus="true">',
+            '<div class="x-grid3-viewport">',
+                '<div class="x-grid3-header">',
+                    '<div class="x-grid3-header-title"><span>{title}</span></div>',
+                    '<div class="x-grid3-header-inner">',
+                        '<div class="x-grid3-header-offset" style="{ostyle}"></div>',
+                    '</div>',
+                    '<div class="x-clear"></div>',
+                '</div>',
+                '<div class="x-grid3-scroller">',
+                    '<div class="x-grid3-row-headers"></div>',
+                    '<div class="x-grid3-body" style="{bstyle}">{body}</div>',
+                    '<a href="#" class="x-grid3-focus" tabIndex="-1"></a>',
+                '</div>',
+            '</div>',
+            '<div class="x-grid3-resize-marker">&#160;</div>',
+            '<div class="x-grid3-resize-proxy">&#160;</div>',
+        '</div>'
+    ),
+    
+    
+    initTemplates: function() {
+        Ext.grid.PivotGridView.superclass.initTemplates.apply(this, arguments);
+        
+        var templates = this.templates || {};
+        if (!templates.gcell) {
+            templates.gcell = new Ext.XTemplate(
+                '<td class="x-grid3-hd x-grid3-gcell x-grid3-td-{id} ux-grid-hd-group-row-{row} ' + this.colHeaderCellCls + '" style="{style}">',
+                    '<div {tooltip} class="x-grid3-hd-inner x-grid3-hd-{id}" unselectable="on" style="{istyle}">', 
+                        this.grid.enableHdMenu ? '<a class="x-grid3-hd-btn" href="#"></a>' : '', '{value}',
+                    '</div>',
+                '</td>'
+            );
+        }
+        
+        this.templates = templates;
+        this.hrowRe = new RegExp("ux-grid-hd-group-row-(\\d+)", "");
+    },
+    
+    
+    initElements: function() {
+        Ext.grid.PivotGridView.superclass.initElements.apply(this, arguments);
+        
+        
+        this.rowHeadersEl = new Ext.Element(this.scroller.child('div.x-grid3-row-headers'));
+        
+        
+        this.headerTitleEl = new Ext.Element(this.mainHd.child('div.x-grid3-header-title'));
+    },
+    
+    
+    getGridInnerWidth: function() {
+        var previousWidth = Ext.grid.PivotGridView.superclass.getGridInnerWidth.apply(this, arguments);
+        
+        return previousWidth - this.getTotalRowHeaderWidth();
+    },
+    
+    
+    getTotalRowHeaderWidth: function() {
+        var headers = this.getRowHeaders(),
+            length  = headers.length,
+            total   = 0,
+            i;
+        
+        for (i = 0; i< length; i++) {
+            total += headers[i].width;
+        }
+        
+        return total;
+    },
+    
+    
+    getTotalColumnHeaderHeight: function() {
+        return this.getColumnHeaders().length * 21;
+    },
+    
+    
+    renderUI : function() {
+        var templates  = this.templates,
+            innerWidth = this.getGridInnerWidth();
+            
+        return templates.master.apply({
+            body  : templates.body.apply({rows:'&#160;'}),
+            ostyle: 'width:' + innerWidth + 'px',
+            bstyle: 'width:' + innerWidth + 'px'
+        });
+    },
+    
+    
+    onLayout: function(width, height) {
+        Ext.grid.PivotGridView.superclass.onLayout.apply(this, arguments);
+        
+        var width = this.getGridInnerWidth();
+        
+        this.resizeColumnHeaders(width);
+        this.resizeAllRows(width);
+    },
+    
+    
+    refresh : function(headersToo) {
+        this.fireEvent('beforerefresh', this);
+        this.grid.stopEditing(true);
+        
+        var result = this.renderBody();
+        this.mainBody.update(result).setWidth(this.getGridInnerWidth());
+        if (headersToo === true) {
+            this.updateHeaders();
+            this.updateHeaderSortState();
+        }
+        this.processRows(0, true);
+        this.layout();
+        this.applyEmptyText();
+        this.fireEvent('refresh', this);
+    },
+    
+    
+    renderHeaders: Ext.emptyFn,
+    
+    
+    fitColumns: Ext.emptyFn,
+    
+    
+    resizeColumnHeaders: function(width) {
+        var topAxis = this.grid.topAxis;
+        
+        if (topAxis.rendered) {
+            topAxis.el.setWidth(width);
+        }
+    },
+    
+    
+    resizeRowHeaders: function() {
+        var rowHeaderWidth = this.getTotalRowHeaderWidth(),
+            marginStyle    = String.format("margin-left: {0}px;", rowHeaderWidth);
+        
+        this.rowHeadersEl.setWidth(rowHeaderWidth);
+        this.mainBody.applyStyles(marginStyle);
+        Ext.fly(this.innerHd).applyStyles(marginStyle);
+        
+        this.headerTitleEl.setWidth(rowHeaderWidth);
+        this.headerTitleEl.setHeight(this.getTotalColumnHeaderHeight());
+    },
+    
+    
+    resizeAllRows: function(width) {
+        var rows   = this.getRows(),
+            length = rows.length,
+            i;
+        
+        for (i = 0; i < length; i++) {
+            Ext.fly(rows[i]).setWidth(width);
+            Ext.fly(rows[i]).child('table').setWidth(width);
+        }
+    },
+    
+    
+    updateHeaders: function() {
+        this.renderGroupRowHeaders();
+        this.renderGroupColumnHeaders();
+    },
+    
+    
+    renderGroupRowHeaders: function() {
+        var leftAxis = this.grid.leftAxis;
+        
+        this.resizeRowHeaders();
+        leftAxis.rendered = false;
+        leftAxis.render(this.rowHeadersEl);
+        
+        this.setTitle(this.title);
+    },
+    
+    
+    setTitle: function(title) {
+        this.headerTitleEl.child('span').dom.innerHTML = title;
+    },
+    
+    
+    renderGroupColumnHeaders: function() {
+        var topAxis = this.grid.topAxis;
+        
+        topAxis.rendered = false;
+        topAxis.render(this.innerHd.firstChild);
+    },
+    
+    
+    isMenuDisabled: function(cellIndex, el) {
+        return true;
+    }
+});
+Ext.grid.PivotAxis = Ext.extend(Ext.Component, {
+    
+    orientation: 'horizontal',
+    
+    
+    defaultHeaderWidth: 80,
+    
+    
+    paddingWidth: 7,
+    
+    
+    setDimensions: function(dimensions) {
+        this.dimensions = dimensions;
+    },
+    
+    
+    onRender: function(ct, position) {
+        var rows = this.orientation == 'horizontal'
+                 ? this.renderHorizontalRows()
+                 : this.renderVerticalRows();
+        
+        this.el = Ext.DomHelper.overwrite(ct.dom, {tag: 'table', cn: rows}, true);
+    },
+    
+    
+    renderHorizontalRows: function() {
+        var headers  = this.buildHeaders(),
+            rowCount = headers.length,
+            rows     = [],
+            cells, cols, colCount, i, j;
+        
+        for (i = 0; i < rowCount; i++) {
+            cells = [];
+            cols  = headers[i].items;
+            colCount = cols.length;
+
+            for (j = 0; j < colCount; j++) {
+                cells.push({
+                    tag: 'td',
+                    html: cols[j].header,
+                    colspan: cols[j].span
+                });
+            }
+
+            rows[i] = {
+                tag: 'tr',
+                cn: cells
+            };
+        }
+        
+        return rows;
+    },
+    
+    
+    renderVerticalRows: function() {
+        var headers  = this.buildHeaders(),
+            colCount = headers.length,
+            rowCells = [],
+            rows     = [],
+            rowCount, col, row, colWidth, i, j;
+        
+        for (i = 0; i < colCount; i++) {
+            col = headers[i];
+            colWidth = col.width || 80;
+            rowCount = col.items.length;
+            
+            for (j = 0; j < rowCount; j++) {
+                row = col.items[j];
+                
+                rowCells[row.start] = rowCells[row.start] || [];
+                rowCells[row.start].push({
+                    tag    : 'td',
+                    html   : row.header,
+                    rowspan: row.span,
+                    width  : Ext.isBorderBox ? colWidth : colWidth - this.paddingWidth
+                });
+            }
+        }
+        
+        rowCount = rowCells.length;
+        for (i = 0; i < rowCount; i++) {
+            rows[i] = {
+                tag: 'tr',
+                cn : rowCells[i]
+            };
+        }
+        
+        return rows;
+    },
+    
+    
+    getTuples: function() {
+        var newStore = new Ext.data.Store({});
+        
+        newStore.data = this.store.data.clone();
+        newStore.fields = this.store.fields;
+        
+        var sorters    = [],
+            dimensions = this.dimensions,
+            length     = dimensions.length,
+            i;
+        
+        for (i = 0; i < length; i++) {
+            sorters.push({
+                field    : dimensions[i].dataIndex,
+                direction: dimensions[i].direction || 'ASC'
+            });
+        }
+        
+        newStore.sort(sorters);
+        
+        var records = newStore.data.items,
+            hashes  = [],
+            tuples  = [],
+            recData, hash, info, data, key;
+        
+        length = records.length;
+        
+        for (i = 0; i < length; i++) {
+            info = this.getRecordInfo(records[i]);
+            data = info.data;
+            hash = "";
+            
+            for (key in data) {
+                hash += data[key] + '---';
+            }
+            
+            if (hashes.indexOf(hash) == -1) {
+                hashes.push(hash);
+                tuples.push(info);
+            }
+        }
+        
+        newStore.destroy();
+        
+        return tuples;
+    },
+    
+    
+    getRecordInfo: function(record) {
+        var dimensions = this.dimensions,
+            length  = dimensions.length,
+            data    = {},
+            dimension, dataIndex, i;
+        
+        
+        for (i = 0; i < length; i++) {
+            dimension = dimensions[i];
+            dataIndex = dimension.dataIndex;
+            
+            data[dataIndex] = record.get(dataIndex);
+        }
+        
+        
+        
+        var createMatcherFunction = function(data) {
+            return function(record) {
+                for (var dataIndex in data) {
+                    if (record.get(dataIndex) != data[dataIndex]) {
+                        return false;
+                    }
+                }
+                
+                return true;
+            };
+        };
+        
+        return {
+            data: data,
+            matcher: createMatcherFunction(data)
+        };
+    },
+    
+    
+    buildHeaders: function() {
+        var tuples     = this.getTuples(),
+            rowCount   = tuples.length,
+            dimensions = this.dimensions,
+            colCount   = dimensions.length,
+            headers    = [],
+            tuple, rows, currentHeader, previousHeader, span, start, isLast, changed, i, j;
+        
+        for (i = 0; i < colCount; i++) {
+            dimension = dimensions[i];
+            rows  = [];
+            span  = 0;
+            start = 0;
+            
+            for (j = 0; j < rowCount; j++) {
+                tuple  = tuples[j];
+                isLast = j == (rowCount - 1);
+                currentHeader = tuple.data[dimension.dataIndex];
+                
+                
+                changed = previousHeader != undefined && previousHeader != currentHeader;
+                if (i > 0 && j > 0) {
+                    changed = changed || tuple.data[dimensions[i-1].dataIndex] != tuples[j-1].data[dimensions[i-1].dataIndex];
+                }
+                
+                if (changed) {                    
+                    rows.push({
+                        header: previousHeader,
+                        span  : span,
+                        start : start
+                    });
+                    
+                    start += span;
+                    span = 0;
+                }
+                
+                if (isLast) {
+                    rows.push({
+                        header: currentHeader,
+                        span  : span + 1,
+                        start : start
+                    });
+                    
+                    start += span;
+                    span = 0;
+                }
+                
+                previousHeader = currentHeader;
+                span++;
+            }
+            
+            headers.push({
+                items: rows,
+                width: dimension.width || this.defaultHeaderWidth
+            });
+            
+            previousHeader = undefined;
+        }
+        
+        return headers;
+    }
+});
+
+
+Ext.grid.HeaderDragZone = Ext.extend(Ext.dd.DragZone, {
+    maxDragWidth: 120,
+    
+    constructor : function(grid, hd, hd2){
+        this.grid = grid;
+        this.view = grid.getView();
+        this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
+        Ext.grid.HeaderDragZone.superclass.constructor.call(this, hd);
+        if(hd2){
+            this.setHandleElId(Ext.id(hd));
+            this.setOuterHandleElId(Ext.id(hd2));
+        }
+        this.scroll = false;
+    },
+    
+    getDragData : function(e){
+        var t = Ext.lib.Event.getTarget(e),
+            h = this.view.findHeaderCell(t);
+        if(h){
+            return {ddel: h.firstChild, header:h};
+        }
+        return false;
+    },
+
+    onInitDrag : function(e){
+        
+        this.dragHeadersDisabled = this.view.headersDisabled;
+        this.view.headersDisabled = true;
+        var clone = this.dragData.ddel.cloneNode(true);
+        clone.id = Ext.id();
+        clone.style.width = Math.min(this.dragData.header.offsetWidth,this.maxDragWidth) + "px";
+        this.proxy.update(clone);
+        return true;
+    },
+
+    afterValidDrop : function(){
+        this.completeDrop();
+    },
+
+    afterInvalidDrop : function(){
+        this.completeDrop();
+    },
+    
+    completeDrop: function(){
+        var v = this.view,
+            disabled = this.dragHeadersDisabled;
+        setTimeout(function(){
+            v.headersDisabled = disabled;
+        }, 50);
+    }
+});
+
+
+
+Ext.grid.HeaderDropZone = Ext.extend(Ext.dd.DropZone, {
+    proxyOffsets : [-4, -9],
+    fly: Ext.Element.fly,
+    
+    constructor : function(grid, hd, hd2){
+        this.grid = grid;
+        this.view = grid.getView();
+        
+        this.proxyTop = Ext.DomHelper.append(document.body, {
+            cls:"col-move-top", html:"&#160;"
+        }, true);
+        this.proxyBottom = Ext.DomHelper.append(document.body, {
+            cls:"col-move-bottom", html:"&#160;"
+        }, true);
+        this.proxyTop.hide = this.proxyBottom.hide = function(){
+            this.setLeftTop(-100,-100);
+            this.setStyle("visibility", "hidden");
+        };
+        this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
+        
+        
+        Ext.grid.HeaderDropZone.superclass.constructor.call(this, grid.getGridEl().dom);
+    },
+
+    getTargetFromEvent : function(e){
+        var t = Ext.lib.Event.getTarget(e),
+            cindex = this.view.findCellIndex(t);
+        if(cindex !== false){
+            return this.view.getHeaderCell(cindex);
+        }
+    },
+
+    nextVisible : function(h){
+        var v = this.view, cm = this.grid.colModel;
+        h = h.nextSibling;
+        while(h){
+            if(!cm.isHidden(v.getCellIndex(h))){
+                return h;
+            }
+            h = h.nextSibling;
+        }
+        return null;
+    },
+
+    prevVisible : function(h){
+        var v = this.view, cm = this.grid.colModel;
+        h = h.prevSibling;
+        while(h){
+            if(!cm.isHidden(v.getCellIndex(h))){
+                return h;
+            }
+            h = h.prevSibling;
+        }
+        return null;
+    },
+
+    positionIndicator : function(h, n, e){
+        var x = Ext.lib.Event.getPageX(e),
+            r = Ext.lib.Dom.getRegion(n.firstChild),
+            px, 
+            pt, 
+            py = r.top + this.proxyOffsets[1];
+        if((r.right - x) <= (r.right-r.left)/2){
+            px = r.right+this.view.borderWidth;
+            pt = "after";
+        }else{
+            px = r.left;
+            pt = "before";
+        }
+
+        if(this.grid.colModel.isFixed(this.view.getCellIndex(n))){
+            return false;
+        }
+
+        px +=  this.proxyOffsets[0];
+        this.proxyTop.setLeftTop(px, py);
+        this.proxyTop.show();
+        if(!this.bottomOffset){
+            this.bottomOffset = this.view.mainHd.getHeight();
+        }
+        this.proxyBottom.setLeftTop(px, py+this.proxyTop.dom.offsetHeight+this.bottomOffset);
+        this.proxyBottom.show();
+        return pt;
+    },
+
+    onNodeEnter : function(n, dd, e, data){
+        if(data.header != n){
+            this.positionIndicator(data.header, n, e);
+        }
+    },
+
+    onNodeOver : function(n, dd, e, data){
+        var result = false;
+        if(data.header != n){
+            result = this.positionIndicator(data.header, n, e);
+        }
+        if(!result){
+            this.proxyTop.hide();
+            this.proxyBottom.hide();
+        }
+        return result ? this.dropAllowed : this.dropNotAllowed;
+    },
+
+    onNodeOut : function(n, dd, e, data){
+        this.proxyTop.hide();
+        this.proxyBottom.hide();
+    },
+
+    onNodeDrop : function(n, dd, e, data){
+        var h = data.header;
+        if(h != n){
+            var cm = this.grid.colModel,
+                x = Ext.lib.Event.getPageX(e),
+                r = Ext.lib.Dom.getRegion(n.firstChild),
+                pt = (r.right - x) <= ((r.right-r.left)/2) ? "after" : "before",
+                oldIndex = this.view.getCellIndex(h),
+                newIndex = this.view.getCellIndex(n);
+            if(pt == "after"){
+                newIndex++;
+            }
+            if(oldIndex < newIndex){
+                newIndex--;
+            }
+            cm.moveColumn(oldIndex, newIndex);
+            return true;
+        }
+        return false;
+    }
+});
+
+Ext.grid.GridView.ColumnDragZone = Ext.extend(Ext.grid.HeaderDragZone, {
+    
+    constructor : function(grid, hd){
+        Ext.grid.GridView.ColumnDragZone.superclass.constructor.call(this, grid, hd, null);
+        this.proxy.el.addClass('x-grid3-col-dd');
+    },
+    
+    handleMouseDown : function(e){
+    },
+
+    callHandleMouseDown : function(e){
+        Ext.grid.GridView.ColumnDragZone.superclass.handleMouseDown.call(this, e);
+    }
+});
+
+Ext.grid.SplitDragZone = Ext.extend(Ext.dd.DDProxy, {
+    fly: Ext.Element.fly,
+    
+    constructor : function(grid, hd, hd2){
+        this.grid = grid;
+        this.view = grid.getView();
+        this.proxy = this.view.resizeProxy;
+        Ext.grid.SplitDragZone.superclass.constructor.call(this, hd,
+            "gridSplitters" + this.grid.getGridEl().id, {
+            dragElId : Ext.id(this.proxy.dom), resizeFrame:false
+        });
+        this.setHandleElId(Ext.id(hd));
+        this.setOuterHandleElId(Ext.id(hd2));
+        this.scroll = false;
+    },
+
+    b4StartDrag : function(x, y){
+        this.view.headersDisabled = true;
+        this.proxy.setHeight(this.view.mainWrap.getHeight());
+        var w = this.cm.getColumnWidth(this.cellIndex);
+        var minw = Math.max(w-this.grid.minColumnWidth, 0);
+        this.resetConstraints();
+        this.setXConstraint(minw, 1000);
+        this.setYConstraint(0, 0);
+        this.minX = x - minw;
+        this.maxX = x + 1000;
+        this.startPos = x;
+        Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y);
+    },
+
+
+    handleMouseDown : function(e){
+        var ev = Ext.EventObject.setEvent(e);
+        var t = this.fly(ev.getTarget());
+        if(t.hasClass("x-grid-split")){
+            this.cellIndex = this.view.getCellIndex(t.dom);
+            this.split = t.dom;
+            this.cm = this.grid.colModel;
+            if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){
+                Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this, arguments);
+            }
+        }
+    },
+
+    endDrag : function(e){
+        this.view.headersDisabled = false;
+        var endX = Math.max(this.minX, Ext.lib.Event.getPageX(e));
+        var diff = endX - this.startPos;
+        this.view.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff);
+    },
+
+    autoOffset : function(){
+        this.setDelta(0,0);
+    }
+});
+Ext.grid.GridDragZone = function(grid, config){
+    this.view = grid.getView();
+    Ext.grid.GridDragZone.superclass.constructor.call(this, this.view.mainBody.dom, config);
+    this.scroll = false;
+    this.grid = grid;
+    this.ddel = document.createElement('div');
+    this.ddel.className = 'x-grid-dd-wrap';
+};
+
+Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, {
+    ddGroup : "GridDD",
+
+    
+    getDragData : function(e){
+        var t = Ext.lib.Event.getTarget(e);
+        var rowIndex = this.view.findRowIndex(t);
+        if(rowIndex !== false){
+            var sm = this.grid.selModel;
+            if(!sm.isSelected(rowIndex) || e.hasModifier()){
+                sm.handleMouseDown(this.grid, rowIndex, e);
+            }
+            return {grid: this.grid, ddel: this.ddel, rowIndex: rowIndex, selections:sm.getSelections()};
+        }
+        return false;
+    },
+
+    
+    onInitDrag : function(e){
+        var data = this.dragData;
+        this.ddel.innerHTML = this.grid.getDragDropText();
+        this.proxy.update(this.ddel);
+        
+    },
+
+    
+    afterRepair : function(){
+        this.dragging = false;
+    },
+
+    
+    getRepairXY : function(e, data){
+        return false;
+    },
+
+    onEndDrag : function(data, e){
+        
+    },
+
+    onValidDrop : function(dd, e, id){
+        
+        this.hideProxy();
+    },
+
+    beforeInvalidDrop : function(e, id){
+
+    }
+});
+
+Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, {
+    
+    defaultWidth: 100,
+
+    
+    defaultSortable: false,
+
+    
+
+    
+
+    constructor : function(config) {
+        
+           if (config.columns) {
+               Ext.apply(this, config);
+               this.setConfig(config.columns, true);
+           } else {
+               this.setConfig(config, true);
+           }
+           
+           this.addEvents(
+               
+               "widthchange",
+               
+               
+               "headerchange",
+               
+               
+               "hiddenchange",
+               
+               
+               "columnmoved",
+               
+               
+               "configchange"
+           );
+           
+           Ext.grid.ColumnModel.superclass.constructor.call(this);
+    },
+
+    
+    getColumnId : function(index) {
+        return this.config[index].id;
+    },
+
+    getColumnAt : function(index) {
+        return this.config[index];
+    },
+
+    
+    setConfig : function(config, initial) {
+        var i, c, len;
+        
+        if (!initial) { 
+            delete this.totalWidth;
+            
+            for (i = 0, len = this.config.length; i < len; i++) {
+                c = this.config[i];
+                
+                if (c.setEditor) {
+                    
+                    c.setEditor(null);
+                }
+            }
+        }
+
+        
+        this.defaults = Ext.apply({
+            width: this.defaultWidth,
+            sortable: this.defaultSortable
+        }, this.defaults);
+
+        this.config = config;
+        this.lookup = {};
+
+        for (i = 0, len = config.length; i < len; i++) {
+            c = Ext.applyIf(config[i], this.defaults);
+            
+            
+            if (Ext.isEmpty(c.id)) {
+                c.id = i;
+            }
+            
+            if (!c.isColumn) {
+                var Cls = Ext.grid.Column.types[c.xtype || 'gridcolumn'];
+                c = new Cls(c);
+                config[i] = c;
+            }
+            
+            this.lookup[c.id] = c;
+        }
+        
+        if (!initial) {
+            this.fireEvent('configchange', this);
+        }
+    },
+
+    
+    getColumnById : function(id) {
+        return this.lookup[id];
+    },
+
+    
+    getIndexById : function(id) {
+        for (var i = 0, len = this.config.length; i < len; i++) {
+            if (this.config[i].id == id) {
+                return i;
+            }
+        }
+        return -1;
+    },
+
+    
+    moveColumn : function(oldIndex, newIndex) {
+        var config = this.config,
+            c      = config[oldIndex];
+            
+        config.splice(oldIndex, 1);
+        config.splice(newIndex, 0, c);
+        this.dataMap = null;
+        this.fireEvent("columnmoved", this, oldIndex, newIndex);
+    },
+
+    
+    getColumnCount : function(visibleOnly) {
+        var length = this.config.length,
+            c = 0,
+            i;
+        
+        if (visibleOnly === true) {
+            for (i = 0; i < length; i++) {
+                if (!this.isHidden(i)) {
+                    c++;
+                }
+            }
+            
+            return c;
+        }
+        
+        return length;
+    },
+
+    
+    getColumnsBy : function(fn, scope) {
+        var config = this.config,
+            length = config.length,
+            result = [],
+            i, c;
+            
+        for (i = 0; i < length; i++){
+            c = config[i];
+            
+            if (fn.call(scope || this, c, i) === true) {
+                result[result.length] = c;
+            }
+        }
+        
+        return result;
+    },
+
+    
+    isSortable : function(col) {
+        return !!this.config[col].sortable;
+    },
+
+    
+    isMenuDisabled : function(col) {
+        return !!this.config[col].menuDisabled;
+    },
+
+    
+    getRenderer : function(col) {
+        return this.config[col].renderer || Ext.grid.ColumnModel.defaultRenderer;
+    },
+
+    getRendererScope : function(col) {
+        return this.config[col].scope;
+    },
+
+    
+    setRenderer : function(col, fn) {
+        this.config[col].renderer = fn;
+    },
+
+    
+    getColumnWidth : function(col) {
+        var width = this.config[col].width;
+        if(typeof width != 'number'){
+            width = this.defaultWidth;
+        }
+        return width;
+    },
+
+    
+    setColumnWidth : function(col, width, suppressEvent) {
+        this.config[col].width = width;
+        this.totalWidth = null;
+        
+        if (!suppressEvent) {
+             this.fireEvent("widthchange", this, col, width);
+        }
+    },
+
+    
+    getTotalWidth : function(includeHidden) {
+        if (!this.totalWidth) {
+            this.totalWidth = 0;
+            for (var i = 0, len = this.config.length; i < len; i++) {
+                if (includeHidden || !this.isHidden(i)) {
+                    this.totalWidth += this.getColumnWidth(i);
+                }
+            }
+        }
+        return this.totalWidth;
+    },
+
+    
+    getColumnHeader : function(col) {
+        return this.config[col].header;
+    },
+
+    
+    setColumnHeader : function(col, header) {
+        this.config[col].header = header;
+        this.fireEvent("headerchange", this, col, header);
+    },
+
+    
+    getColumnTooltip : function(col) {
+            return this.config[col].tooltip;
+    },
+    
+    setColumnTooltip : function(col, tooltip) {
+            this.config[col].tooltip = tooltip;
+    },
+
+    
+    getDataIndex : function(col) {
+        return this.config[col].dataIndex;
+    },
+
+    
+    setDataIndex : function(col, dataIndex) {
+        this.config[col].dataIndex = dataIndex;
+    },
+
+    
+    findColumnIndex : function(dataIndex) {
+        var c = this.config;
+        for(var i = 0, len = c.length; i < len; i++){
+            if(c[i].dataIndex == dataIndex){
+                return i;
+            }
+        }
+        return -1;
+    },
+
+    
+    isCellEditable : function(colIndex, rowIndex) {
+        var c = this.config[colIndex],
+            ed = c.editable;
+
+        
+        return !!(ed || (!Ext.isDefined(ed) && c.editor));
+    },
+
+    
+    getCellEditor : function(colIndex, rowIndex) {
+        return this.config[colIndex].getCellEditor(rowIndex);
+    },
+
+    
+    setEditable : function(col, editable) {
+        this.config[col].editable = editable;
+    },
+
+    
+    isHidden : function(colIndex) {
+        return !!this.config[colIndex].hidden; 
+    },
+
+    
+    isFixed : function(colIndex) {
+        return !!this.config[colIndex].fixed;
+    },
+
+    
+    isResizable : function(colIndex) {
+        return colIndex >= 0 && this.config[colIndex].resizable !== false && this.config[colIndex].fixed !== true;
+    },
+    
+    
+    setHidden : function(colIndex, hidden) {
+        var c = this.config[colIndex];
+        if(c.hidden !== hidden){
+            c.hidden = hidden;
+            this.totalWidth = null;
+            this.fireEvent("hiddenchange", this, colIndex, hidden);
+        }
+    },
+
+    
+    setEditor : function(col, editor) {
+        this.config[col].setEditor(editor);
+    },
+
+    
+    destroy : function() {
+        var length = this.config.length,
+            i = 0;
+
+        for (; i < length; i++){
+            this.config[i].destroy(); 
+        }
+        delete this.config;
+        delete this.lookup;
+        this.purgeListeners();
+    },
+
+    
+    setState : function(col, state) {
+        state = Ext.applyIf(state, this.defaults);
+        Ext.apply(this.config[col], state);
+    }
+});
+
+
+Ext.grid.ColumnModel.defaultRenderer = function(value) {
+    if (typeof value == "string" && value.length < 1) {
+        return "&#160;";
+    }
+    return value;
+};
+Ext.grid.AbstractSelectionModel = Ext.extend(Ext.util.Observable,  {
+    
+
+    constructor : function(){
+        this.locked = false;
+        Ext.grid.AbstractSelectionModel.superclass.constructor.call(this);
+    },
+
+    
+    init : function(grid){
+        this.grid = grid;
+        if(this.lockOnInit){
+            delete this.lockOnInit;
+            this.locked = false;
+            this.lock();
+        }
+        this.initEvents();
+    },
+
+    
+    lock : function(){
+        if(!this.locked){
+            this.locked = true;
+            
+            var g = this.grid;
+            if(g){
+                g.getView().on({
+                    scope: this,
+                    beforerefresh: this.sortUnLock,
+                    refresh: this.sortLock
+                });
+            }else{
+                this.lockOnInit = true;
+            }
+        }
+    },
+
+    
+    sortLock : function() {
+        this.locked = true;
+    },
+
+    
+    sortUnLock : function() {
+        this.locked = false;
+    },
+
+    
+    unlock : function(){
+        if(this.locked){
+            this.locked = false;
+            var g = this.grid,
+                gv;
+                
+            
+            if(g){
+                gv = g.getView();
+                gv.un('beforerefresh', this.sortUnLock, this);
+                gv.un('refresh', this.sortLock, this);    
+            }else{
+                delete this.lockOnInit;
+            }
+        }
+    },
+
+    
+    isLocked : function(){
+        return this.locked;
+    },
+
+    destroy: function(){
+        this.unlock();
+        this.purgeListeners();
+    }
+});
+Ext.grid.RowSelectionModel = Ext.extend(Ext.grid.AbstractSelectionModel,  {
+    
+    singleSelect : false,
+    
+    constructor : function(config){
+        Ext.apply(this, config);
+        this.selections = new Ext.util.MixedCollection(false, function(o){
+            return o.id;
+        });
+
+        this.last = false;
+        this.lastActive = false;
+
+        this.addEvents(
+               
+               'selectionchange',
+               
+               'beforerowselect',
+               
+               'rowselect',
+               
+               'rowdeselect'
+        );
+        Ext.grid.RowSelectionModel.superclass.constructor.call(this);
+    },
+
+    
+    
+    initEvents : function(){
+
+        if(!this.grid.enableDragDrop && !this.grid.enableDrag){
+            this.grid.on('rowmousedown', this.handleMouseDown, this);
+        }
+
+        this.rowNav = new Ext.KeyNav(this.grid.getGridEl(), {
+            up: this.onKeyPress, 
+            down: this.onKeyPress,
+            scope: this
+        });
+
+        this.grid.getView().on({
+            scope: this,
+            refresh: this.onRefresh,
+            rowupdated: this.onRowUpdated,
+            rowremoved: this.onRemove
+        });
+    },
+    
+    onKeyPress : function(e, name){
+        var up = name == 'up',
+            method = up ? 'selectPrevious' : 'selectNext',
+            add = up ? -1 : 1,
+            last;
+        if(!e.shiftKey || this.singleSelect){
+            this[method](false);
+        }else if(this.last !== false && this.lastActive !== false){
+            last = this.last;
+            this.selectRange(this.last,  this.lastActive + add);
+            this.grid.getView().focusRow(this.lastActive);
+            if(last !== false){
+                this.last = last;
+            }
+        }else{
+           this.selectFirstRow();
+        }
+    },
+
+    
+    onRefresh : function(){
+        var ds = this.grid.store,
+            s = this.getSelections(),
+            i = 0,
+            len = s.length, 
+            index, r;
+            
+        this.silent = true;
+        this.clearSelections(true);
+        for(; i < len; i++){
+            r = s[i];
+            if((index = ds.indexOfId(r.id)) != -1){
+                this.selectRow(index, true);
+            }
+        }
+        if(s.length != this.selections.getCount()){
+            this.fireEvent('selectionchange', this);
+        }
+        this.silent = false;
+    },
+
+    
+    onRemove : function(v, index, r){
+        if(this.selections.remove(r) !== false){
+            this.fireEvent('selectionchange', this);
+        }
+    },
+
+    
+    onRowUpdated : function(v, index, r){
+        if(this.isSelected(r)){
+            v.onRowSelect(index);
+        }
+    },
+
+    
+    selectRecords : function(records, keepExisting){
+        if(!keepExisting){
+            this.clearSelections();
+        }
+        var ds = this.grid.store,
+            i = 0,
+            len = records.length;
+        for(; i < len; i++){
+            this.selectRow(ds.indexOf(records[i]), true);
+        }
+    },
+
+    
+    getCount : function(){
+        return this.selections.length;
+    },
+
+    
+    selectFirstRow : function(){
+        this.selectRow(0);
+    },
+
+    
+    selectLastRow : function(keepExisting){
+        this.selectRow(this.grid.store.getCount() - 1, keepExisting);
+    },
+
+    
+    selectNext : function(keepExisting){
+        if(this.hasNext()){
+            this.selectRow(this.last+1, keepExisting);
+            this.grid.getView().focusRow(this.last);
+            return true;
+        }
+        return false;
+    },
+
+    
+    selectPrevious : function(keepExisting){
+        if(this.hasPrevious()){
+            this.selectRow(this.last-1, keepExisting);
+            this.grid.getView().focusRow(this.last);
+            return true;
+        }
+        return false;
+    },
+
+    
+    hasNext : function(){
+        return this.last !== false && (this.last+1) < this.grid.store.getCount();
+    },
+
+    
+    hasPrevious : function(){
+        return !!this.last;
+    },
+
+
+    
+    getSelections : function(){
+        return [].concat(this.selections.items);
+    },
+
+    
+    getSelected : function(){
+        return this.selections.itemAt(0);
+    },
+
+    
+    each : function(fn, scope){
+        var s = this.getSelections(),
+            i = 0,
+            len = s.length;
+            
+        for(; i < len; i++){
+            if(fn.call(scope || this, s[i], i) === false){
+                return false;
+            }
+        }
+        return true;
+    },
+
+    
+    clearSelections : function(fast){
+        if(this.isLocked()){
+            return;
+        }
+        if(fast !== true){
+            var ds = this.grid.store,
+                s = this.selections;
+            s.each(function(r){
+                this.deselectRow(ds.indexOfId(r.id));
+            }, this);
+            s.clear();
+        }else{
+            this.selections.clear();
+        }
+        this.last = false;
+    },
+
+
+    
+    selectAll : function(){
+        if(this.isLocked()){
+            return;
+        }
+        this.selections.clear();
+        for(var i = 0, len = this.grid.store.getCount(); i < len; i++){
+            this.selectRow(i, true);
+        }
+    },
+
+    
+    hasSelection : function(){
+        return this.selections.length > 0;
+    },
+
+    
+    isSelected : function(index){
+        var r = Ext.isNumber(index) ? this.grid.store.getAt(index) : index;
+        return (r && this.selections.key(r.id) ? true : false);
+    },
+
+    
+    isIdSelected : function(id){
+        return (this.selections.key(id) ? true : false);
+    },
+
+    
+    handleMouseDown : function(g, rowIndex, e){
+        if(e.button !== 0 || this.isLocked()){
+            return;
+        }
+        var view = this.grid.getView();
+        if(e.shiftKey && !this.singleSelect && this.last !== false){
+            var last = this.last;
+            this.selectRange(last, rowIndex, e.ctrlKey);
+            this.last = last; 
+            view.focusRow(rowIndex);
+        }else{
+            var isSelected = this.isSelected(rowIndex);
+            if(e.ctrlKey && isSelected){
+                this.deselectRow(rowIndex);
+            }else if(!isSelected || this.getCount() > 1){
+                this.selectRow(rowIndex, e.ctrlKey || e.shiftKey);
+                view.focusRow(rowIndex);
+            }
+        }
+    },
+
+    
+    selectRows : function(rows, keepExisting){
+        if(!keepExisting){
+            this.clearSelections();
+        }
+        for(var i = 0, len = rows.length; i < len; i++){
+            this.selectRow(rows[i], true);
+        }
+    },
+
+    
+    selectRange : function(startRow, endRow, keepExisting){
+        var i;
+        if(this.isLocked()){
+            return;
+        }
+        if(!keepExisting){
+            this.clearSelections();
+        }
+        if(startRow <= endRow){
+            for(i = startRow; i <= endRow; i++){
+                this.selectRow(i, true);
+            }
+        }else{
+            for(i = startRow; i >= endRow; i--){
+                this.selectRow(i, true);
+            }
+        }
+    },
+
+    
+    deselectRange : function(startRow, endRow, preventViewNotify){
+        if(this.isLocked()){
+            return;
+        }
+        for(var i = startRow; i <= endRow; i++){
+            this.deselectRow(i, preventViewNotify);
+        }
+    },
+
+    
+    selectRow : function(index, keepExisting, preventViewNotify){
+        if(this.isLocked() || (index < 0 || index >= this.grid.store.getCount()) || (keepExisting && this.isSelected(index))){
+            return;
+        }
+        var r = this.grid.store.getAt(index);
+        if(r && this.fireEvent('beforerowselect', this, index, keepExisting, r) !== false){
+            if(!keepExisting || this.singleSelect){
+                this.clearSelections();
+            }
+            this.selections.add(r);
+            this.last = this.lastActive = index;
+            if(!preventViewNotify){
+                this.grid.getView().onRowSelect(index);
+            }
+            if(!this.silent){
+                this.fireEvent('rowselect', this, index, r);
+                this.fireEvent('selectionchange', this);
+            }
+        }
+    },
+
+    
+    deselectRow : function(index, preventViewNotify){
+        if(this.isLocked()){
+            return;
+        }
+        if(this.last == index){
+            this.last = false;
+        }
+        if(this.lastActive == index){
+            this.lastActive = false;
+        }
+        var r = this.grid.store.getAt(index);
+        if(r){
+            this.selections.remove(r);
+            if(!preventViewNotify){
+                this.grid.getView().onRowDeselect(index);
+            }
+            this.fireEvent('rowdeselect', this, index, r);
+            this.fireEvent('selectionchange', this);
+        }
+    },
+
+    
+    acceptsNav : function(row, col, cm){
+        return !cm.isHidden(col) && cm.isCellEditable(col, row);
+    },
+
+    
+    onEditorKey : function(field, e){
+        var k = e.getKey(), 
+            newCell, 
+            g = this.grid, 
+            last = g.lastEdit,
+            ed = g.activeEditor,
+            shift = e.shiftKey,
+            ae, last, r, c;
+            
+        if(k == e.TAB){
+            e.stopEvent();
+            ed.completeEdit();
+            if(shift){
+                newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this);
+            }else{
+                newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this);
+            }
+        }else if(k == e.ENTER){
+            if(this.moveEditorOnEnter !== false){
+                if(shift){
+                    newCell = g.walkCells(last.row - 1, last.col, -1, this.acceptsNav, this);
+                }else{
+                    newCell = g.walkCells(last.row + 1, last.col, 1, this.acceptsNav, this);
+                }
+            }
+        }
+        if(newCell){
+            r = newCell[0];
+            c = newCell[1];
+
+            this.onEditorSelect(r, last.row);
+
+            if(g.isEditor && g.editing){ 
+                ae = g.activeEditor;
+                if(ae && ae.field.triggerBlur){
+                    
+                    ae.field.triggerBlur();
+                }
+            }
+            g.startEditing(r, c);
+        }
+    },
+    
+    onEditorSelect: function(row, lastRow){
+        if(lastRow != row){
+            this.selectRow(row); 
+        }
+    },
+    
+    destroy : function(){
+        Ext.destroy(this.rowNav);
+        this.rowNav = null;
+        Ext.grid.RowSelectionModel.superclass.destroy.call(this);
+    }
+});
+
+Ext.grid.Column = Ext.extend(Ext.util.Observable, {
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+
+    
+    isColumn : true,
+
+    constructor : function(config){
+        Ext.apply(this, config);
+
+        if(Ext.isString(this.renderer)){
+            this.renderer = Ext.util.Format[this.renderer];
+        }else if(Ext.isObject(this.renderer)){
+            this.scope = this.renderer.scope;
+            this.renderer = this.renderer.fn;
+        }
+        if(!this.scope){
+            this.scope = this;
+        }
+
+        var ed = this.editor;
+        delete this.editor;
+        this.setEditor(ed);
+        this.addEvents(
+            
+            'click',
+            
+            'contextmenu',
+            
+            'dblclick',
+            
+            'mousedown'
+        );
+        Ext.grid.Column.superclass.constructor.call(this);
+    },
+
+    
+    processEvent : function(name, e, grid, rowIndex, colIndex){
+        return this.fireEvent(name, this, grid, rowIndex, e);
+    },
+
+    
+    destroy: function() {
+        if(this.setEditor){
+            this.setEditor(null);
+        }
+        this.purgeListeners();
+    },
+
+    
+    renderer : function(value){
+        return value;
+    },
+
+    
+    getEditor: function(rowIndex){
+        return this.editable !== false ? this.editor : null;
+    },
+
+    
+    setEditor : function(editor){
+        var ed = this.editor;
+        if(ed){
+            if(ed.gridEditor){
+                ed.gridEditor.destroy();
+                delete ed.gridEditor;
+            }else{
+                ed.destroy();
+            }
+        }
+        this.editor = null;
+        if(editor){
+            
+            if(!editor.isXType){
+                editor = Ext.create(editor, 'textfield');
+            }
+            this.editor = editor;
+        }
+    },
+
+    
+    getCellEditor: function(rowIndex){
+        var ed = this.getEditor(rowIndex);
+        if(ed){
+            if(!ed.startEdit){
+                if(!ed.gridEditor){
+                    ed.gridEditor = new Ext.grid.GridEditor(ed);
+                }
+                ed = ed.gridEditor;
+            }
+        }
+        return ed;
+    }
+});
+
+
+Ext.grid.BooleanColumn = Ext.extend(Ext.grid.Column, {
+    
+    trueText: 'true',
+    
+    falseText: 'false',
+    
+    undefinedText: '&#160;',
+
+    constructor: function(cfg){
+        Ext.grid.BooleanColumn.superclass.constructor.call(this, cfg);
+        var t = this.trueText, f = this.falseText, u = this.undefinedText;
+        this.renderer = function(v){
+            if(v === undefined){
+                return u;
+            }
+            if(!v || v === 'false'){
+                return f;
+            }
+            return t;
+        };
+    }
+});
+
+
+Ext.grid.NumberColumn = Ext.extend(Ext.grid.Column, {
+    
+    format : '0,000.00',
+    constructor: function(cfg){
+        Ext.grid.NumberColumn.superclass.constructor.call(this, cfg);
+        this.renderer = Ext.util.Format.numberRenderer(this.format);
+    }
+});
+
+
+Ext.grid.DateColumn = Ext.extend(Ext.grid.Column, {
+    
+    format : 'm/d/Y',
+    constructor: function(cfg){
+        Ext.grid.DateColumn.superclass.constructor.call(this, cfg);
+        this.renderer = Ext.util.Format.dateRenderer(this.format);
+    }
+});
+
+
+Ext.grid.TemplateColumn = Ext.extend(Ext.grid.Column, {
+    
+    constructor: function(cfg){
+        Ext.grid.TemplateColumn.superclass.constructor.call(this, cfg);
+        var tpl = (!Ext.isPrimitive(this.tpl) && this.tpl.compile) ? this.tpl : new Ext.XTemplate(this.tpl);
+        this.renderer = function(value, p, r){
+            return tpl.apply(r.data);
+        };
+        this.tpl = tpl;
+    }
+});
+
+
+Ext.grid.ActionColumn = Ext.extend(Ext.grid.Column, {
+    
+    
+    
+    
+    
+    
+    
+    
+    header: '&#160;',
+
+    actionIdRe: /x-action-col-(\d+)/,
+    
+    
+    altText: '',
+
+    constructor: function(cfg) {
+        var me = this,
+            items = cfg.items || (me.items = [me]),
+            l = items.length,
+            i,
+            item;
+
+        Ext.grid.ActionColumn.superclass.constructor.call(me, cfg);
+
+
+
+        me.renderer = function(v, meta) {
+
+            v = Ext.isFunction(cfg.renderer) ? cfg.renderer.apply(this, arguments)||'' : '';
+
+            meta.css += ' x-action-col-cell';
+            for (i = 0; i < l; i++) {
+                item = items[i];
+                v += '<img alt="' + me.altText + '" src="' + (item.icon || Ext.BLANK_IMAGE_URL) +
+                    '" class="x-action-col-icon x-action-col-' + String(i) + ' ' + (item.iconCls || '') +
+                    ' ' + (Ext.isFunction(item.getClass) ? item.getClass.apply(item.scope||this.scope||this, arguments) : '') + '"' +
+                    ((item.tooltip) ? ' ext:qtip="' + item.tooltip + '"' : '') + ' />';
+            }
+            return v;
+        };
+    },
+
+    destroy: function() {
+        delete this.items;
+        delete this.renderer;
+        return Ext.grid.ActionColumn.superclass.destroy.apply(this, arguments);
+    },
+
+    
+    processEvent : function(name, e, grid, rowIndex, colIndex){
+        var m = e.getTarget().className.match(this.actionIdRe),
+            item, fn;
+        if (m && (item = this.items[parseInt(m[1], 10)])) {
+            if (name == 'click') {
+                (fn = item.handler || this.handler) && fn.call(item.scope||this.scope||this, grid, rowIndex, colIndex, item, e);
+            } else if ((name == 'mousedown') && (item.stopSelection !== false)) {
+                return false;
+            }
+        }
+        return Ext.grid.ActionColumn.superclass.processEvent.apply(this, arguments);
+    }
+});
+
+
+Ext.grid.Column.types = {
+    gridcolumn : Ext.grid.Column,
+    booleancolumn: Ext.grid.BooleanColumn,
+    numbercolumn: Ext.grid.NumberColumn,
+    datecolumn: Ext.grid.DateColumn,
+    templatecolumn: Ext.grid.TemplateColumn,
+    actioncolumn: Ext.grid.ActionColumn
+};
+Ext.grid.RowNumberer = Ext.extend(Object, {
+    
+    header: "",
+    
+    width: 23,
+    
+    sortable: false,
+    
+    constructor : function(config){
+        Ext.apply(this, config);
+        if(this.rowspan){
+            this.renderer = this.renderer.createDelegate(this);
+        }
+    },
+
+    
+    fixed:true,
+    hideable: false,
+    menuDisabled:true,
+    dataIndex: '',
+    id: 'numberer',
+    rowspan: undefined,
+
+    
+    renderer : function(v, p, record, rowIndex){
+        if(this.rowspan){
+            p.cellAttr = 'rowspan="'+this.rowspan+'"';
+        }
+        return rowIndex+1;
+    }
+});
+Ext.grid.CheckboxSelectionModel = Ext.extend(Ext.grid.RowSelectionModel, {
+
+    
+    
+    header : '<div class="x-grid3-hd-checker">&#160;</div>',
+    
+    width : 20,
+    
+    sortable : false,
+
+    
+    menuDisabled : true,
+    fixed : true,
+    hideable: false,
+    dataIndex : '',
+    id : 'checker',
+    isColumn: true, 
+
+    constructor : function(){
+        Ext.grid.CheckboxSelectionModel.superclass.constructor.apply(this, arguments);
+        if(this.checkOnly){
+            this.handleMouseDown = Ext.emptyFn;
+        }
+    },
+
+    
+    initEvents : function(){
+        Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this);
+        this.grid.on('render', function(){
+            Ext.fly(this.grid.getView().innerHd).on('mousedown', this.onHdMouseDown, this);
+        }, this);
+    },
+
+    
+    processEvent : function(name, e, grid, rowIndex, colIndex){
+        if (name == 'mousedown') {
+            this.onMouseDown(e, e.getTarget());
+            return false;
+        } else {
+            return Ext.grid.Column.prototype.processEvent.apply(this, arguments);
+        }
+    },
+
+    
+    onMouseDown : function(e, t){
+        if(e.button === 0 && t.className == 'x-grid3-row-checker'){ 
+            e.stopEvent();
+            var row = e.getTarget('.x-grid3-row');
+            if(row){
+                var index = row.rowIndex;
+                if(this.isSelected(index)){
+                    this.deselectRow(index);
+                }else{
+                    this.selectRow(index, true);
+                    this.grid.getView().focusRow(index);
+                }
+            }
+        }
+    },
+
+    
+    onHdMouseDown : function(e, t) {
+        if(t.className == 'x-grid3-hd-checker'){
+            e.stopEvent();
+            var hd = Ext.fly(t.parentNode);
+            var isChecked = hd.hasClass('x-grid3-hd-checker-on');
+            if(isChecked){
+                hd.removeClass('x-grid3-hd-checker-on');
+                this.clearSelections();
+            }else{
+                hd.addClass('x-grid3-hd-checker-on');
+                this.selectAll();
+            }
+        }
+    },
+
+    
+    renderer : function(v, p, record){
+        return '<div class="x-grid3-row-checker">&#160;</div>';
+    },
+    
+    onEditorSelect: function(row, lastRow){
+        if(lastRow != row && !this.checkOnly){
+            this.selectRow(row); 
+        }
+    }
+});
+Ext.grid.CellSelectionModel = Ext.extend(Ext.grid.AbstractSelectionModel,  {
+    
+    constructor : function(config){
+        Ext.apply(this, config);
+
+           this.selection = null;
+       
+           this.addEvents(
+               
+               "beforecellselect",
+               
+               "cellselect",
+               
+               "selectionchange"
+           );
+       
+           Ext.grid.CellSelectionModel.superclass.constructor.call(this);
+    },
+
+    
+    initEvents : function(){
+        this.grid.on('cellmousedown', this.handleMouseDown, this);
+        this.grid.on(Ext.EventManager.getKeyEvent(), this.handleKeyDown, this);
+        this.grid.getView().on({
+            scope: this,
+            refresh: this.onViewChange,
+            rowupdated: this.onRowUpdated,
+            beforerowremoved: this.clearSelections,
+            beforerowsinserted: this.clearSelections
+        });
+        if(this.grid.isEditor){
+            this.grid.on('beforeedit', this.beforeEdit,  this);
+        }
+    },
+
+       
+    beforeEdit : function(e){
+        this.select(e.row, e.column, false, true, e.record);
+    },
+
+       
+    onRowUpdated : function(v, index, r){
+        if(this.selection && this.selection.record == r){
+            v.onCellSelect(index, this.selection.cell[1]);
+        }
+    },
+
+       
+    onViewChange : function(){
+        this.clearSelections(true);
+    },
+
+       
+    getSelectedCell : function(){
+        return this.selection ? this.selection.cell : null;
+    },
+
+    
+    clearSelections : function(preventNotify){
+        var s = this.selection;
+        if(s){
+            if(preventNotify !== true){
+                this.grid.view.onCellDeselect(s.cell[0], s.cell[1]);
+            }
+            this.selection = null;
+            this.fireEvent("selectionchange", this, null);
+        }
+    },
+
+    
+    hasSelection : function(){
+        return this.selection ? true : false;
+    },
+
+    
+    handleMouseDown : function(g, row, cell, e){
+        if(e.button !== 0 || this.isLocked()){
+            return;
+        }
+        this.select(row, cell);
+    },
+
+    
+    select : function(rowIndex, colIndex, preventViewNotify, preventFocus,  r){
+        if(this.fireEvent("beforecellselect", this, rowIndex, colIndex) !== false){
+            this.clearSelections();
+            r = r || this.grid.store.getAt(rowIndex);
+            this.selection = {
+                record : r,
+                cell : [rowIndex, colIndex]
+            };
+            if(!preventViewNotify){
+                var v = this.grid.getView();
+                v.onCellSelect(rowIndex, colIndex);
+                if(preventFocus !== true){
+                    v.focusCell(rowIndex, colIndex);
+                }
+            }
+            this.fireEvent("cellselect", this, rowIndex, colIndex);
+            this.fireEvent("selectionchange", this, this.selection);
+        }
+    },
+
+       
+    isSelectable : function(rowIndex, colIndex, cm){
+        return !cm.isHidden(colIndex);
+    },
+    
+    
+    onEditorKey: function(field, e){
+        if(e.getKey() == e.TAB){
+            this.handleKeyDown(e);
+        }
+    },
+
+    
+    handleKeyDown : function(e){
+        if(!e.isNavKeyPress()){
+            return;
+        }
+        
+        var k = e.getKey(),
+            g = this.grid,
+            s = this.selection,
+            sm = this,
+            walk = function(row, col, step){
+                return g.walkCells(
+                    row,
+                    col,
+                    step,
+                    g.isEditor && g.editing ? sm.acceptsNav : sm.isSelectable, 
+                    sm
+                );
+            },
+            cell, newCell, r, c, ae;
+
+        switch(k){
+            case e.ESC:
+            case e.PAGE_UP:
+            case e.PAGE_DOWN:
+                
+                break;
+            default:
+                
+                e.stopEvent();
+                break;
+        }
+
+        if(!s){
+            cell = walk(0, 0, 1); 
+            if(cell){
+                this.select(cell[0], cell[1]);
+            }
+            return;
+        }
+
+        cell = s.cell;  
+        r = cell[0];    
+        c = cell[1];    
+        
+        switch(k){
+            case e.TAB:
+                if(e.shiftKey){
+                    newCell = walk(r, c - 1, -1);
+                }else{
+                    newCell = walk(r, c + 1, 1);
+                }
+                break;
+            case e.DOWN:
+                newCell = walk(r + 1, c, 1);
+                break;
+            case e.UP:
+                newCell = walk(r - 1, c, -1);
+                break;
+            case e.RIGHT:
+                newCell = walk(r, c + 1, 1);
+                break;
+            case e.LEFT:
+                newCell = walk(r, c - 1, -1);
+                break;
+            case e.ENTER:
+                if (g.isEditor && !g.editing) {
+                    g.startEditing(r, c);
+                    return;
+                }
+                break;
+        }
+
+        if(newCell){
+            
+            r = newCell[0];
+            c = newCell[1];
+
+            this.select(r, c); 
+
+            if(g.isEditor && g.editing){ 
+                ae = g.activeEditor;
+                if(ae && ae.field.triggerBlur){
+                    
+                    ae.field.triggerBlur();
+                }
+                g.startEditing(r, c);
+            }
+        }
+    },
+
+    acceptsNav : function(row, col, cm){
+        return !cm.isHidden(col) && cm.isCellEditable(col, row);
+    }
+});
+Ext.grid.EditorGridPanel = Ext.extend(Ext.grid.GridPanel, {
+    
+    clicksToEdit: 2,
+
+    
+    forceValidation: false,
+
+    
+    isEditor : true,
+    
+    detectEdit: false,
+
+    
+    autoEncode : false,
+
+    
+    
+    trackMouseOver: false, 
+
+    
+    initComponent : function(){
+        Ext.grid.EditorGridPanel.superclass.initComponent.call(this);
+
+        if(!this.selModel){
+            
+            this.selModel = new Ext.grid.CellSelectionModel();
+        }
+
+        this.activeEditor = null;
+
+        this.addEvents(
+            
+            "beforeedit",
+            
+            "afteredit",
+            
+            "validateedit"
+        );
+    },
+
+    
+    initEvents : function(){
+        Ext.grid.EditorGridPanel.superclass.initEvents.call(this);
+
+        this.getGridEl().on('mousewheel', this.stopEditing.createDelegate(this, [true]), this);
+        this.on('columnresize', this.stopEditing, this, [true]);
+
+        if(this.clicksToEdit == 1){
+            this.on("cellclick", this.onCellDblClick, this);
+        }else {
+            var view = this.getView();
+            if(this.clicksToEdit == 'auto' && view.mainBody){
+                view.mainBody.on('mousedown', this.onAutoEditClick, this);
+            }
+            this.on('celldblclick', this.onCellDblClick, this);
+        }
+    },
+
+    onResize : function(){
+        Ext.grid.EditorGridPanel.superclass.onResize.apply(this, arguments);
+        var ae = this.activeEditor;
+        if(this.editing && ae){
+            ae.realign(true);
+        }
+    },
+
+    
+    onCellDblClick : function(g, row, col){
+        this.startEditing(row, col);
+    },
+
+    
+    onAutoEditClick : function(e, t){
+        if(e.button !== 0){
+            return;
+        }
+        var row = this.view.findRowIndex(t),
+            col = this.view.findCellIndex(t);
+        if(row !== false && col !== false){
+            this.stopEditing();
+            if(this.selModel.getSelectedCell){ 
+                var sc = this.selModel.getSelectedCell();
+                if(sc && sc[0] === row && sc[1] === col){
+                    this.startEditing(row, col);
+                }
+            }else{
+                if(this.selModel.isSelected(row)){
+                    this.startEditing(row, col);
+                }
+            }
+        }
+    },
+
+    
+    onEditComplete : function(ed, value, startValue){
+        this.editing = false;
+        this.lastActiveEditor = this.activeEditor;
+        this.activeEditor = null;
+
+        var r = ed.record,
+            field = this.colModel.getDataIndex(ed.col);
+        value = this.postEditValue(value, startValue, r, field);
+        if(this.forceValidation === true || String(value) !== String(startValue)){
+            var e = {
+                grid: this,
+                record: r,
+                field: field,
+                originalValue: startValue,
+                value: value,
+                row: ed.row,
+                column: ed.col,
+                cancel:false
+            };
+            if(this.fireEvent("validateedit", e) !== false && !e.cancel && String(value) !== String(startValue)){
+                r.set(field, e.value);
+                delete e.cancel;
+                this.fireEvent("afteredit", e);
+            }
+        }
+        this.view.focusCell(ed.row, ed.col);
+    },
+
+    
+    startEditing : function(row, col){
+        this.stopEditing();
+        if(this.colModel.isCellEditable(col, row)){
+            this.view.ensureVisible(row, col, true);
+            var r = this.store.getAt(row),
+                field = this.colModel.getDataIndex(col),
+                e = {
+                    grid: this,
+                    record: r,
+                    field: field,
+                    value: r.data[field],
+                    row: row,
+                    column: col,
+                    cancel:false
+                };
+            if(this.fireEvent("beforeedit", e) !== false && !e.cancel){
+                this.editing = true;
+                var ed = this.colModel.getCellEditor(col, row);
+                if(!ed){
+                    return;
+                }
+                if(!ed.rendered){
+                    ed.parentEl = this.view.getEditorParent(ed);
+                    ed.on({
+                        scope: this,
+                        render: {
+                            fn: function(c){
+                                c.field.focus(false, true);
+                            },
+                            single: true,
+                            scope: this
+                        },
+                        specialkey: function(field, e){
+                            this.getSelectionModel().onEditorKey(field, e);
+                        },
+                        complete: this.onEditComplete,
+                        canceledit: this.stopEditing.createDelegate(this, [true])
+                    });
+                }
+                Ext.apply(ed, {
+                    row     : row,
+                    col     : col,
+                    record  : r
+                });
+                this.lastEdit = {
+                    row: row,
+                    col: col
+                };
+                this.activeEditor = ed;
+                
+                
+                ed.selectSameEditor = (this.activeEditor == this.lastActiveEditor);
+                var v = this.preEditValue(r, field);
+                ed.startEdit(this.view.getCell(row, col).firstChild, Ext.isDefined(v) ? v : '');
+
+                
+                (function(){
+                    delete ed.selectSameEditor;
+                }).defer(50);
+            }
+        }
+    },
+
+    
+    preEditValue : function(r, field){
+        var value = r.data[field];
+        return this.autoEncode && Ext.isString(value) ? Ext.util.Format.htmlDecode(value) : value;
+    },
+
+    
+    postEditValue : function(value, originalValue, r, field){
+        return this.autoEncode && Ext.isString(value) ? Ext.util.Format.htmlEncode(value) : value;
+    },
+
+    
+    stopEditing : function(cancel){
+        if(this.editing){
+            
+            var ae = this.lastActiveEditor = this.activeEditor;
+            if(ae){
+                ae[cancel === true ? 'cancelEdit' : 'completeEdit']();
+                this.view.focusCell(ae.row, ae.col);
+            }
+            this.activeEditor = null;
+        }
+        this.editing = false;
+    }
+});
+Ext.reg('editorgrid', Ext.grid.EditorGridPanel);
+
+Ext.grid.GridEditor = function(field, config){
+    Ext.grid.GridEditor.superclass.constructor.call(this, field, config);
+    field.monitorTab = false;
+};
+
+Ext.extend(Ext.grid.GridEditor, Ext.Editor, {
+    alignment: "tl-tl",
+    autoSize: "width",
+    hideEl : false,
+    cls: "x-small-editor x-grid-editor",
+    shim:false,
+    shadow:false
+});
+Ext.grid.PropertyRecord = Ext.data.Record.create([
+    {name:'name',type:'string'}, 'value'
+]);
+
+
+Ext.grid.PropertyStore = Ext.extend(Ext.util.Observable, {
+    
+    constructor : function(grid, source){
+        this.grid = grid;
+        this.store = new Ext.data.Store({
+            recordType : Ext.grid.PropertyRecord
+        });
+        this.store.on('update', this.onUpdate,  this);
+        if(source){
+            this.setSource(source);
+        }
+        Ext.grid.PropertyStore.superclass.constructor.call(this);    
+    },
+    
+    
+    setSource : function(o){
+        this.source = o;
+        this.store.removeAll();
+        var data = [];
+        for(var k in o){
+            if(this.isEditableValue(o[k])){
+                data.push(new Ext.grid.PropertyRecord({name: k, value: o[k]}, k));
+            }
+        }
+        this.store.loadRecords({records: data}, {}, true);
+    },
+
+    
+    onUpdate : function(ds, record, type){
+        if(type == Ext.data.Record.EDIT){
+            var v = record.data.value;
+            var oldValue = record.modified.value;
+            if(this.grid.fireEvent('beforepropertychange', this.source, record.id, v, oldValue) !== false){
+                this.source[record.id] = v;
+                record.commit();
+                this.grid.fireEvent('propertychange', this.source, record.id, v, oldValue);
+            }else{
+                record.reject();
+            }
+        }
+    },
+
+    
+    getProperty : function(row){
+       return this.store.getAt(row);
+    },
+
+    
+    isEditableValue: function(val){
+        return Ext.isPrimitive(val) || Ext.isDate(val);
+    },
+
+    
+    setValue : function(prop, value, create){
+        var r = this.getRec(prop);
+        if(r){
+            r.set('value', value);
+            this.source[prop] = value;
+        }else if(create){
+            
+            this.source[prop] = value;
+            r = new Ext.grid.PropertyRecord({name: prop, value: value}, prop);
+            this.store.add(r);
+
+        }
+    },
+    
+    
+    remove : function(prop){
+        var r = this.getRec(prop);
+        if(r){
+            this.store.remove(r);
+            delete this.source[prop];
+        }
+    },
+    
+    
+    getRec : function(prop){
+        return this.store.getById(prop);
+    },
+
+    
+    getSource : function(){
+        return this.source;
+    }
+});
+
+
+Ext.grid.PropertyColumnModel = Ext.extend(Ext.grid.ColumnModel, {
+    
+    nameText : 'Name',
+    valueText : 'Value',
+    dateFormat : 'm/j/Y',
+    trueText: 'true',
+    falseText: 'false',
+    
+    constructor : function(grid, store){
+        var g = Ext.grid,
+               f = Ext.form;
+               
+           this.grid = grid;
+           g.PropertyColumnModel.superclass.constructor.call(this, [
+               {header: this.nameText, width:50, sortable: true, dataIndex:'name', id: 'name', menuDisabled:true},
+               {header: this.valueText, width:50, resizable:false, dataIndex: 'value', id: 'value', menuDisabled:true}
+           ]);
+           this.store = store;
+       
+           var bfield = new f.Field({
+               autoCreate: {tag: 'select', children: [
+                   {tag: 'option', value: 'true', html: this.trueText},
+                   {tag: 'option', value: 'false', html: this.falseText}
+               ]},
+               getValue : function(){
+                   return this.el.dom.value == 'true';
+               }
+           });
+           this.editors = {
+               'date' : new g.GridEditor(new f.DateField({selectOnFocus:true})),
+               'string' : new g.GridEditor(new f.TextField({selectOnFocus:true})),
+               'number' : new g.GridEditor(new f.NumberField({selectOnFocus:true, style:'text-align:left;'})),
+               'boolean' : new g.GridEditor(bfield, {
+                   autoSize: 'both'
+               })
+           };
+           this.renderCellDelegate = this.renderCell.createDelegate(this);
+           this.renderPropDelegate = this.renderProp.createDelegate(this);
+    },
+
+    
+    renderDate : function(dateVal){
+        return dateVal.dateFormat(this.dateFormat);
+    },
+
+    
+    renderBool : function(bVal){
+        return this[bVal ? 'trueText' : 'falseText'];
+    },
+
+    
+    isCellEditable : function(colIndex, rowIndex){
+        return colIndex == 1;
+    },
+
+    
+    getRenderer : function(col){
+        return col == 1 ?
+            this.renderCellDelegate : this.renderPropDelegate;
+    },
+
+    
+    renderProp : function(v){
+        return this.getPropertyName(v);
+    },
+
+    
+    renderCell : function(val, meta, rec){
+        var renderer = this.grid.customRenderers[rec.get('name')];
+        if(renderer){
+            return renderer.apply(this, arguments);
+        }
+        var rv = val;
+        if(Ext.isDate(val)){
+            rv = this.renderDate(val);
+        }else if(typeof val == 'boolean'){
+            rv = this.renderBool(val);
+        }
+        return Ext.util.Format.htmlEncode(rv);
+    },
+
+    
+    getPropertyName : function(name){
+        var pn = this.grid.propertyNames;
+        return pn && pn[name] ? pn[name] : name;
+    },
+
+    
+    getCellEditor : function(colIndex, rowIndex){
+        var p = this.store.getProperty(rowIndex),
+            n = p.data.name, 
+            val = p.data.value;
+        if(this.grid.customEditors[n]){
+            return this.grid.customEditors[n];
+        }
+        if(Ext.isDate(val)){
+            return this.editors.date;
+        }else if(typeof val == 'number'){
+            return this.editors.number;
+        }else if(typeof val == 'boolean'){
+            return this.editors['boolean'];
+        }else{
+            return this.editors.string;
+        }
+    },
+
+    
+    destroy : function(){
+        Ext.grid.PropertyColumnModel.superclass.destroy.call(this);
+        this.destroyEditors(this.editors);
+        this.destroyEditors(this.grid.customEditors);
+    },
+    
+    destroyEditors: function(editors){
+        for(var ed in editors){
+            Ext.destroy(editors[ed]);
+        }
+    }
+});
+
+
+Ext.grid.PropertyGrid = Ext.extend(Ext.grid.EditorGridPanel, {
+    
+    
+    
+    
+    
+
+    
+    enableColumnMove:false,
+    stripeRows:false,
+    trackMouseOver: false,
+    clicksToEdit:1,
+    enableHdMenu : false,
+    viewConfig : {
+        forceFit:true
+    },
+
+    
+    initComponent : function(){
+        this.customRenderers = this.customRenderers || {};
+        this.customEditors = this.customEditors || {};
+        this.lastEditRow = null;
+        var store = new Ext.grid.PropertyStore(this);
+        this.propStore = store;
+        var cm = new Ext.grid.PropertyColumnModel(this, store);
+        store.store.sort('name', 'ASC');
+        this.addEvents(
+            
+            'beforepropertychange',
+            
+            'propertychange'
+        );
+        this.cm = cm;
+        this.ds = store.store;
+        Ext.grid.PropertyGrid.superclass.initComponent.call(this);
+
+               this.mon(this.selModel, 'beforecellselect', function(sm, rowIndex, colIndex){
+            if(colIndex === 0){
+                this.startEditing.defer(200, this, [rowIndex, 1]);
+                return false;
+            }
+        }, this);
+    },
+
+    
+    onRender : function(){
+        Ext.grid.PropertyGrid.superclass.onRender.apply(this, arguments);
+
+        this.getGridEl().addClass('x-props-grid');
+    },
+
+    
+    afterRender: function(){
+        Ext.grid.PropertyGrid.superclass.afterRender.apply(this, arguments);
+        if(this.source){
+            this.setSource(this.source);
+        }
+    },
+
+    
+    setSource : function(source){
+        this.propStore.setSource(source);
+    },
+
+    
+    getSource : function(){
+        return this.propStore.getSource();
+    },
+    
+    
+    setProperty : function(prop, value, create){
+        this.propStore.setValue(prop, value, create);    
+    },
+    
+    
+    removeProperty : function(prop){
+        this.propStore.remove(prop);
+    }
+
+    
+    
+    
+    
+});
+Ext.reg("propertygrid", Ext.grid.PropertyGrid);
+
+Ext.grid.GroupingView = Ext.extend(Ext.grid.GridView, {
+
+    
+    groupByText : 'Group By This Field',
+    
+    showGroupsText : 'Show in Groups',
+    
+    hideGroupedColumn : false,
+    
+    showGroupName : true,
+    
+    startCollapsed : false,
+    
+    enableGrouping : true,
+    
+    enableGroupingMenu : true,
+    
+    enableNoGroups : true,
+    
+    emptyGroupText : '(None)',
+    
+    ignoreAdd : false,
+    
+    groupTextTpl : '{text}',
+
+    
+    groupMode: 'value',
+
+    
+    
+    
+    cancelEditOnToggle: true,
+
+    
+    initTemplates : function(){
+        Ext.grid.GroupingView.superclass.initTemplates.call(this);
+        this.state = {};
+
+        var sm = this.grid.getSelectionModel();
+        sm.on(sm.selectRow ? 'beforerowselect' : 'beforecellselect',
+                this.onBeforeRowSelect, this);
+
+        if(!this.startGroup){
+            this.startGroup = new Ext.XTemplate(
+                '<div id="{groupId}" class="x-grid-group {cls}">',
+                    '<div id="{groupId}-hd" class="x-grid-group-hd" style="{style}"><div class="x-grid-group-title">', this.groupTextTpl ,'</div></div>',
+                    '<div id="{groupId}-bd" class="x-grid-group-body">'
+            );
+        }
+        this.startGroup.compile();
+
+        if (!this.endGroup) {
+            this.endGroup = '</div></div>';
+        }
+    },
+
+    
+    findGroup : function(el){
+        return Ext.fly(el).up('.x-grid-group', this.mainBody.dom);
+    },
+
+    
+    getGroups : function(){
+        return this.hasRows() ? this.mainBody.dom.childNodes : [];
+    },
+
+    
+    onAdd : function(ds, records, index) {
+        if (this.canGroup() && !this.ignoreAdd) {
+            var ss = this.getScrollState();
+            this.fireEvent('beforerowsinserted', ds, index, index + (records.length-1));
+            this.refresh();
+            this.restoreScroll(ss);
+            this.fireEvent('rowsinserted', ds, index, index + (records.length-1));
+        } else if (!this.canGroup()) {
+            Ext.grid.GroupingView.superclass.onAdd.apply(this, arguments);
+        }
+    },
+
+    
+    onRemove : function(ds, record, index, isUpdate){
+        Ext.grid.GroupingView.superclass.onRemove.apply(this, arguments);
+        var g = document.getElementById(record._groupId);
+        if(g && g.childNodes[1].childNodes.length < 1){
+            Ext.removeNode(g);
+        }
+        this.applyEmptyText();
+    },
+
+    
+    refreshRow : function(record){
+        if(this.ds.getCount()==1){
+            this.refresh();
+        }else{
+            this.isUpdating = true;
+            Ext.grid.GroupingView.superclass.refreshRow.apply(this, arguments);
+            this.isUpdating = false;
+        }
+    },
+
+    
+    beforeMenuShow : function(){
+        var item, items = this.hmenu.items, disabled = this.cm.config[this.hdCtxIndex].groupable === false;
+        if((item = items.get('groupBy'))){
+            item.setDisabled(disabled);
+        }
+        if((item = items.get('showGroups'))){
+            item.setDisabled(disabled);
+            item.setChecked(this.canGroup(), true);
+        }
+    },
+
+    
+    renderUI : function(){
+        var markup = Ext.grid.GroupingView.superclass.renderUI.call(this);
+
+        if(this.enableGroupingMenu && this.hmenu){
+            this.hmenu.add('-',{
+                itemId:'groupBy',
+                text: this.groupByText,
+                handler: this.onGroupByClick,
+                scope: this,
+                iconCls:'x-group-by-icon'
+            });
+            if(this.enableNoGroups){
+                this.hmenu.add({
+                    itemId:'showGroups',
+                    text: this.showGroupsText,
+                    checked: true,
+                    checkHandler: this.onShowGroupsClick,
+                    scope: this
+                });
+            }
+            this.hmenu.on('beforeshow', this.beforeMenuShow, this);
+        }
+        return markup;
+    },
+
+    processEvent: function(name, e){
+        Ext.grid.GroupingView.superclass.processEvent.call(this, name, e);
+        var hd = e.getTarget('.x-grid-group-hd', this.mainBody);
+        if(hd){
+            
+            var field = this.getGroupField(),
+                prefix = this.getPrefix(field),
+                groupValue = hd.id.substring(prefix.length),
+                emptyRe = new RegExp('gp-' + Ext.escapeRe(field) + '--hd');
+
+            
+            groupValue = groupValue.substr(0, groupValue.length - 3);
+            
+            
+            if(groupValue || emptyRe.test(hd.id)){
+                this.grid.fireEvent('group' + name, this.grid, field, groupValue, e);
+            }
+            if(name == 'mousedown' && e.button == 0){
+                this.toggleGroup(hd.parentNode);
+            }
+        }
+
+    },
+
+    
+    onGroupByClick : function(){
+        var grid = this.grid;
+        this.enableGrouping = true;
+        grid.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex));
+        grid.fireEvent('groupchange', grid, grid.store.getGroupState());
+        this.beforeMenuShow(); 
+        this.refresh();
+    },
+
+    
+    onShowGroupsClick : function(mi, checked){
+        this.enableGrouping = checked;
+        if(checked){
+            this.onGroupByClick();
+        }else{
+            this.grid.store.clearGrouping();
+            this.grid.fireEvent('groupchange', this, null);
+        }
+    },
+
+    
+    toggleRowIndex : function(rowIndex, expanded){
+        if(!this.canGroup()){
+            return;
+        }
+        var row = this.getRow(rowIndex);
+        if(row){
+            this.toggleGroup(this.findGroup(row), expanded);
+        }
+    },
+
+    
+    toggleGroup : function(group, expanded){
+        var gel = Ext.get(group);
+        expanded = Ext.isDefined(expanded) ? expanded : gel.hasClass('x-grid-group-collapsed');
+        if(this.state[gel.id] !== expanded){
+            if (this.cancelEditOnToggle !== false) {
+                this.grid.stopEditing(true);
+            }
+            this.state[gel.id] = expanded;
+            gel[expanded ? 'removeClass' : 'addClass']('x-grid-group-collapsed');
+        }
+    },
+
+    
+    toggleAllGroups : function(expanded){
+        var groups = this.getGroups();
+        for(var i = 0, len = groups.length; i < len; i++){
+            this.toggleGroup(groups[i], expanded);
+        }
+    },
+
+    
+    expandAllGroups : function(){
+        this.toggleAllGroups(true);
+    },
+
+    
+    collapseAllGroups : function(){
+        this.toggleAllGroups(false);
+    },
+
+    
+    getGroup : function(v, r, groupRenderer, rowIndex, colIndex, ds){
+        var column = this.cm.config[colIndex],
+            g = groupRenderer ? groupRenderer.call(column.scope, v, {}, r, rowIndex, colIndex, ds) : String(v);
+        if(g === '' || g === '&#160;'){
+            g = column.emptyGroupText || this.emptyGroupText;
+        }
+        return g;
+    },
+
+    
+    getGroupField : function(){
+        return this.grid.store.getGroupState();
+    },
+
+    
+    afterRender : function(){
+        if(!this.ds || !this.cm){
+            return;
+        }
+        Ext.grid.GroupingView.superclass.afterRender.call(this);
+        if(this.grid.deferRowRender){
+            this.updateGroupWidths();
+        }
+    },
+    
+    afterRenderUI: function () {
+        Ext.grid.GroupingView.superclass.afterRenderUI.call(this);
+
+        if (this.enableGroupingMenu && this.hmenu) {
+            this.hmenu.add('-',{
+                itemId:'groupBy',
+                text: this.groupByText,
+                handler: this.onGroupByClick,
+                scope: this,
+                iconCls:'x-group-by-icon'
+            });
+            
+            if (this.enableNoGroups) {
+                this.hmenu.add({
+                    itemId:'showGroups',
+                    text: this.showGroupsText,
+                    checked: true,
+                    checkHandler: this.onShowGroupsClick,
+                    scope: this
+                });
+            }
+            
+            this.hmenu.on('beforeshow', this.beforeMenuShow, this);
+        }
+    },
+
+    
+    renderRows : function(){
+        var groupField = this.getGroupField();
+        var eg = !!groupField;
+        
+        if(this.hideGroupedColumn) {
+            var colIndex = this.cm.findColumnIndex(groupField),
+                hasLastGroupField = Ext.isDefined(this.lastGroupField);
+            if(!eg && hasLastGroupField){
+                this.mainBody.update('');
+                this.cm.setHidden(this.cm.findColumnIndex(this.lastGroupField), false);
+                delete this.lastGroupField;
+            }else if (eg && !hasLastGroupField){
+                this.lastGroupField = groupField;
+                this.cm.setHidden(colIndex, true);
+            }else if (eg && hasLastGroupField && groupField !== this.lastGroupField) {
+                this.mainBody.update('');
+                var oldIndex = this.cm.findColumnIndex(this.lastGroupField);
+                this.cm.setHidden(oldIndex, false);
+                this.lastGroupField = groupField;
+                this.cm.setHidden(colIndex, true);
+            }
+        }
+        return Ext.grid.GroupingView.superclass.renderRows.apply(
+                    this, arguments);
+    },
+
+    
+    doRender : function(cs, rs, ds, startRow, colCount, stripe){
+        if(rs.length < 1){
+            return '';
+        }
+
+        if(!this.canGroup() || this.isUpdating){
+            return Ext.grid.GroupingView.superclass.doRender.apply(this, arguments);
+        }
+
+        var groupField = this.getGroupField(),
+            colIndex = this.cm.findColumnIndex(groupField),
+            g,
+            gstyle = 'width:' + this.getTotalWidth() + ';',
+            cfg = this.cm.config[colIndex],
+            groupRenderer = cfg.groupRenderer || cfg.renderer,
+            prefix = this.showGroupName ? (cfg.groupName || cfg.header)+': ' : '',
+            groups = [],
+            curGroup, i, len, gid;
+
+        for(i = 0, len = rs.length; i < len; i++){
+            var rowIndex = startRow + i,
+                r = rs[i],
+                gvalue = r.data[groupField];
+
+                g = this.getGroup(gvalue, r, groupRenderer, rowIndex, colIndex, ds);
+            if(!curGroup || curGroup.group != g){
+                gid = this.constructId(gvalue, groupField, colIndex);
+                
+                
+                this.state[gid] = !(Ext.isDefined(this.state[gid]) ? !this.state[gid] : this.startCollapsed);
+                curGroup = {
+                    group: g,
+                    gvalue: gvalue,
+                    text: prefix + g,
+                    groupId: gid,
+                    startRow: rowIndex,
+                    rs: [r],
+                    cls: this.state[gid] ? '' : 'x-grid-group-collapsed',
+                    style: gstyle
+                };
+                groups.push(curGroup);
+            }else{
+                curGroup.rs.push(r);
+            }
+            r._groupId = gid;
+        }
+
+        var buf = [];
+        for(i = 0, len = groups.length; i < len; i++){
+            g = groups[i];
+            this.doGroupStart(buf, g, cs, ds, colCount);
+            buf[buf.length] = Ext.grid.GroupingView.superclass.doRender.call(
+                    this, cs, g.rs, ds, g.startRow, colCount, stripe);
+
+            this.doGroupEnd(buf, g, cs, ds, colCount);
+        }
+        return buf.join('');
+    },
+
+    
+    getGroupId : function(value){
+        var field = this.getGroupField();
+        return this.constructId(value, field, this.cm.findColumnIndex(field));
+    },
+
+    
+    constructId : function(value, field, idx){
+        var cfg = this.cm.config[idx],
+            groupRenderer = cfg.groupRenderer || cfg.renderer,
+            val = (this.groupMode == 'value') ? value : this.getGroup(value, {data:{}}, groupRenderer, 0, idx, this.ds);
+
+        return this.getPrefix(field) + Ext.util.Format.htmlEncode(val);
+    },
+
+    
+    canGroup  : function(){
+        return this.enableGrouping && !!this.getGroupField();
+    },
+
+    
+    getPrefix: function(field){
+        return this.grid.getGridEl().id + '-gp-' + field + '-';
+    },
+
+    
+    doGroupStart : function(buf, g, cs, ds, colCount){
+        buf[buf.length] = this.startGroup.apply(g);
+    },
+
+    
+    doGroupEnd : function(buf, g, cs, ds, colCount){
+        buf[buf.length] = this.endGroup;
+    },
+
+    
+    getRows : function(){
+        if(!this.canGroup()){
+            return Ext.grid.GroupingView.superclass.getRows.call(this);
+        }
+        var r = [],
+            gs = this.getGroups(),
+            g,
+            i = 0,
+            len = gs.length,
+            j,
+            jlen;
+        for(; i < len; ++i){
+            g = gs[i].childNodes[1];
+            if(g){
+                g = g.childNodes;
+                for(j = 0, jlen = g.length; j < jlen; ++j){
+                    r[r.length] = g[j];
+                }
+            }
+        }
+        return r;
+    },
+
+    
+    updateGroupWidths : function(){
+        if(!this.canGroup() || !this.hasRows()){
+            return;
+        }
+        var tw = Math.max(this.cm.getTotalWidth(), this.el.dom.offsetWidth-this.getScrollOffset()) +'px';
+        var gs = this.getGroups();
+        for(var i = 0, len = gs.length; i < len; i++){
+            gs[i].firstChild.style.width = tw;
+        }
+    },
+
+    
+    onColumnWidthUpdated : function(col, w, tw){
+        Ext.grid.GroupingView.superclass.onColumnWidthUpdated.call(this, col, w, tw);
+        this.updateGroupWidths();
+    },
+
+    
+    onAllColumnWidthsUpdated : function(ws, tw){
+        Ext.grid.GroupingView.superclass.onAllColumnWidthsUpdated.call(this, ws, tw);
+        this.updateGroupWidths();
+    },
+
+    
+    onColumnHiddenUpdated : function(col, hidden, tw){
+        Ext.grid.GroupingView.superclass.onColumnHiddenUpdated.call(this, col, hidden, tw);
+        this.updateGroupWidths();
+    },
+
+    
+    onLayout : function(){
+        this.updateGroupWidths();
+    },
+
+    
+    onBeforeRowSelect : function(sm, rowIndex){
+        this.toggleRowIndex(rowIndex, true);
+    }
+});
+
+Ext.grid.GroupingView.GROUP_ID = 1000;