/*
 * Ext JS Library 3.3.1
 * Copyright(c) 2006-2010 Sencha Inc.
 * licensing@sencha.com
 * http://www.sencha.com/license
 */
( function() {
	var h = Ext.util, k = Ext.each, g = true, i = false;
	h.Observable = function() {
		var l = this, m = l.events;
		if (l.listeners) {
			l.on(l.listeners);
			delete l.listeners
		}
		l.events = m || {}
	};
	h.Observable.prototype = {
		filterOptRe :/^(?:scope|delay|buffer|single)$/,
		fireEvent : function() {
			var l = Array.prototype.slice.call(arguments, 0), n = l[0]
					.toLowerCase(), o = this, m = g, r = o.events[n], t, p, s;
			if (o.eventsSuspended === g) {
				if (p = o.eventQueue) {
					p.push(l)
				}
			} else {
				if (typeof r == "object") {
					if (r.bubble) {
						if (r.fire.apply(r, l.slice(1)) === i) {
							return i
						}
						s = o.getBubbleTarget && o.getBubbleTarget();
						if (s && s.enableBubble) {
							t = s.events[n];
							if (!t || typeof t != "object" || !t.bubble) {
								s.enableBubble(n)
							}
							return s.fireEvent.apply(s, l)
						}
					} else {
						l.shift();
						m = r.fire.apply(r, l)
					}
				}
			}
			return m
		},
		addListener : function(l, n, m, s) {
			var p = this, r, t, q;
			if (typeof l == "object") {
				s = l;
				for (r in s) {
					t = s[r];
					if (!p.filterOptRe.test(r)) {
						p.addListener(r, t.fn || t, t.scope || s.scope,
								t.fn ? t : s)
					}
				}
			} else {
				l = l.toLowerCase();
				q = p.events[l] || g;
				if (typeof q == "boolean") {
					p.events[l] = q = new h.Event(p, l)
				}
				q.addListener(n, m, typeof s == "object" ? s : {})
			}
		},
		removeListener : function(l, n, m) {
			var o = this.events[l.toLowerCase()];
			if (typeof o == "object") {
				o.removeListener(n, m)
			}
		},
		purgeListeners : function() {
			var n = this.events, l, m;
			for (m in n) {
				l = n[m];
				if (typeof l == "object") {
					l.clearListeners()
				}
			}
		},
		addEvents : function(p) {
			var n = this;
			n.events = n.events || {};
			if (typeof p == "string") {
				var l = arguments, m = l.length;
				while (m--) {
					n.events[l[m]] = n.events[l[m]] || g
				}
			} else {
				Ext.applyIf(n.events, p)
			}
		},
		hasListener : function(l) {
			var m = this.events[l.toLowerCase()];
			return typeof m == "object" && m.listeners.length > 0
		},
		suspendEvents : function(l) {
			this.eventsSuspended = g;
			if (l && !this.eventQueue) {
				this.eventQueue = []
			}
		},
		resumeEvents : function() {
			var l = this, m = l.eventQueue || [];
			l.eventsSuspended = i;
			delete l.eventQueue;
			k(m, function(n) {
				l.fireEvent.apply(l, n)
			})
		}
	};
	var d = h.Observable.prototype;
	d.on = d.addListener;
	d.un = d.removeListener;
	h.Observable.releaseCapture = function(l) {
		l.fireEvent = d.fireEvent
	};
	function e(m, n, l) {
		return function() {
			if (n.target == arguments[0]) {
				m.apply(l, Array.prototype.slice.call(arguments, 0))
			}
		}
	}
	function b(p, q, m, n) {
		m.task = new h.DelayedTask();
		return function() {
			m.task.delay(q.buffer, p, n, Array.prototype.slice.call(arguments,
					0))
		}
	}
	function c(n, o, m, l) {
		return function() {
			o.removeListener(m, l);
			return n.apply(l, arguments)
		}
	}
	function a(p, q, m, n) {
		return function() {
			var l = new h.DelayedTask(), o = Array.prototype.slice.call(
					arguments, 0);
			if (!m.tasks) {
				m.tasks = []
			}
			m.tasks.push(l);
			l.delay(q.delay || 10, function() {
				m.tasks.remove(l);
				p.apply(n, o)
			}, n)
		}
	}
	h.Event = function(m, l) {
		this.name = l;
		this.obj = m;
		this.listeners = []
	};
	h.Event.prototype = {
		addListener : function(p, o, n) {
			var q = this, m;
			o = o || q.obj;
			if (!q.isListening(p, o)) {
				m = q.createListener(p, o, n);
				if (q.firing) {
					q.listeners = q.listeners.slice(0)
				}
				q.listeners.push(m)
			}
		},
		createListener : function(q, p, r) {
			r = r || {};
			p = p || this.obj;
			var m = {
				fn :q,
				scope :p,
				options :r
			}, n = q;
			if (r.target) {
				n = e(n, r, p)
			}
			if (r.delay) {
				n = a(n, r, m, p)
			}
			if (r.single) {
				n = c(n, this, q, p)
			}
			if (r.buffer) {
				n = b(n, r, m, p)
			}
			m.fireFn = n;
			return m
		},
		findListener : function(p, o) {
			var q = this.listeners, n = q.length, m;
			o = o || this.obj;
			while (n--) {
				m = q[n];
				if (m) {
					if (m.fn == p && m.scope == o) {
						return n
					}
				}
			}
			return -1
		},
		isListening : function(m, l) {
			return this.findListener(m, l) != -1
		},
		removeListener : function(r, q) {
			var p, m, n, s = this, o = i;
			if ((p = s.findListener(r, q)) != -1) {
				if (s.firing) {
					s.listeners = s.listeners.slice(0)
				}
				m = s.listeners[p];
				if (m.task) {
					m.task.cancel();
					delete m.task
				}
				n = m.tasks && m.tasks.length;
				if (n) {
					while (n--) {
						m.tasks[n].cancel()
					}
					delete m.tasks
				}
				s.listeners.splice(p, 1);
				o = g
			}
			return o
		},
		clearListeners : function() {
			var o = this, m = o.listeners, n = m.length;
			while (n--) {
				o.removeListener(m[n].fn, m[n].scope)
			}
		},
		fire : function() {
			var r = this, q = r.listeners, m = q.length, p = 0, n;
			if (m > 0) {
				r.firing = g;
				var o = Array.prototype.slice.call(arguments, 0);
				for (; p < m; p++) {
					n = q[p];
					if (n
							&& n.fireFn.apply(n.scope || r.obj || window, o) === i) {
						return (r.firing = i)
					}
				}
			}
			r.firing = i;
			return g
		}
	}
})();

Ext.DomHelper = function() {
	var x = null, l = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i, n = /^table|tbody|tr|td$/i, d = /tag|children|cn|html$/i, t = /td|tr|tbody/i, p = /([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi, v = /end/i, s, o = "afterbegin", q = "afterend", c = "beforebegin", r = "beforeend", a = "<table>", i = "</table>", b = a
			+ "<tbody>", k = "</tbody>" + i, m = b + "<tr>", w = "</tr>" + k;
	function h(B, D, C, E, A, y) {
		var z = s.insertHtml(E, Ext.getDom(B), u(D));
		return C ? Ext.get(z, true) : z
	}
	function u(D) {
		var z = "", y, C, B, E;
		if (typeof D == "string") {
			z = D
		} else {
			if (Ext.isArray(D)) {
				for ( var A = 0; A < D.length; A++) {
					if (D[A]) {
						z += u(D[A])
					}
				}
			} else {
				z += "<" + (D.tag = D.tag || "div");
				for (y in D) {
					C = D[y];
					if (!d.test(y)) {
						if (typeof C == "object") {
							z += " " + y + '="';
							for (B in C) {
								z += B + ":" + C[B] + ";"
							}
							z += '"'
						} else {
							z += " " + ( {
								cls :"class",
								htmlFor :"for"
							}[y] || y) + '="' + C + '"'
						}
					}
				}
				if (l.test(D.tag)) {
					z += "/>"
				} else {
					z += ">";
					if ((E = D.children || D.cn)) {
						z += u(E)
					} else {
						if (D.html) {
							z += D.html
						}
					}
					z += "</" + D.tag + ">"
				}
			}
		}
		return z
	}
	function g(F, C, B, D) {
		x.innerHTML = [ C, B, D ].join("");
		var y = -1, A = x, z;
		while (++y < F) {
			A = A.firstChild
		}
		if (z = A.nextSibling) {
			var E = document.createDocumentFragment();
			while (A) {
				z = A.nextSibling;
				E.appendChild(A);
				A = z
			}
			A = E
		}
		return A
	}
	function e(y, z, B, A) {
		var C, D;
		x = x || document.createElement("div");
		if (y == "td" && (z == o || z == r) || !t.test(y) && (z == c || z == q)) {
			return
		}
		D = z == c ? B : z == q ? B.nextSibling : z == o ? B.firstChild : null;
		if (z == c || z == q) {
			B = B.parentNode
		}
		if (y == "td" || (y == "tr" && (z == r || z == o))) {
			C = g(4, m, A, w)
		} else {
			if ((y == "tbody" && (z == r || z == o))
					|| (y == "tr" && (z == c || z == q))) {
				C = g(3, b, A, k)
			} else {
				C = g(2, a, A, i)
			}
		}
		B.insertBefore(C, D);
		return C
	}
	s = {
		markup : function(y) {
			return u(y)
		},
		applyStyles : function(y, z) {
			if (z) {
				var A;
				y = Ext.fly(y);
				if (typeof z == "function") {
					z = z.call()
				}
				if (typeof z == "string") {
					p.lastIndex = 0;
					while ((A = p.exec(z))) {
						y.setStyle(A[1], A[2])
					}
				} else {
					if (typeof z == "object") {
						y.setStyle(z)
					}
				}
			}
		},
		insertHtml : function(D, y, E) {
			var C = {}, A, G, F, H, B, z;
			D = D.toLowerCase();
			C[c] = [ "BeforeBegin", "previousSibling" ];
			C[q] = [ "AfterEnd", "nextSibling" ];
			if (y.insertAdjacentHTML) {
				if (n.test(y.tagName)
						&& (z = e(y.tagName.toLowerCase(), D, y, E))) {
					return z
				}
				C[o] = [ "AfterBegin", "firstChild" ];
				C[r] = [ "BeforeEnd", "lastChild" ];
				if ((A = C[D])) {
					y.insertAdjacentHTML(A[0], E);
					return y[A[1]]
				}
			} else {
				F = y.ownerDocument.createRange();
				G = "setStart" + (v.test(D) ? "After" : "Before");
				if (C[D]) {
					F[G](y);
					H = F.createContextualFragment(E);
					y.parentNode.insertBefore(H, D == c ? y : y.nextSibling);
					return y[(D == c ? "previous" : "next") + "Sibling"]
				} else {
					B = (D == o ? "first" : "last") + "Child";
					if (y.firstChild) {
						F[G](y[B]);
						H = F.createContextualFragment(E);
						if (D == o) {
							y.insertBefore(H, y.firstChild)
						} else {
							y.appendChild(H)
						}
					} else {
						y.innerHTML = E
					}
					return y[B]
				}
			}
			throw 'Illegal insertion point -> "' + D + '"'
		},
		insertBefore : function(y, A, z) {
			return h(y, A, z, c)
		},
		insertAfter : function(y, A, z) {
			return h(y, A, z, q, "nextSibling")
		},
		insertFirst : function(y, A, z) {
			return h(y, A, z, o, "firstChild")
		},
		append : function(y, A, z) {
			return h(y, A, z, r, "", true)
		},
		overwrite : function(y, A, z) {
			y = Ext.getDom(y);
			y.innerHTML = u(A);
			return z ? Ext.get(y.firstChild) : y.firstChild
		},
		createHtml :u
	};
	return s
}();
Ext.Template = function(h) {
	var k = this, c = arguments, e = [], d;
	if (Ext.isArray(h)) {
		h = h.join("")
	} else {
		if (c.length > 1) {
			for ( var g = 0, b = c.length; g < b; g++) {
				d = c[g];
				if (typeof d == "object") {
					Ext.apply(k, d)
				} else {
					e.push(d)
				}
			}
			h = e.join("")
		}
	}
	k.html = h;
	if (k.compiled) {
		k.compile()
	}
};
Ext.Template.prototype = {
	re :/\{([\w-]+)\}/g,
	applyTemplate : function(a) {
		var b = this;
		return b.compiled ? b.compiled(a) : b.html.replace(b.re,
				function(c, d) {
					return a[d] !== undefined ? a[d] : ""
				})
	},
	set : function(a, c) {
		var b = this;
		b.html = a;
		b.compiled = null;
		return c ? b.compile() : b
	},
	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(b, a, c) {
		return this.doInsert("afterBegin", b, a, c)
	},
	insertBefore : function(b, a, c) {
		return this.doInsert("beforeBegin", b, a, c)
	},
	insertAfter : function(b, a, c) {
		return this.doInsert("afterEnd", b, a, c)
	},
	append : function(b, a, c) {
		return this.doInsert("beforeEnd", b, a, c)
	},
	doInsert : function(c, e, b, a) {
		e = Ext.getDom(e);
		var d = Ext.DomHelper.insertHtml(c, e, this.applyTemplate(b));
		return a ? Ext.get(d, true) : d
	},
	overwrite : function(b, a, c) {
		b = Ext.getDom(b);
		b.innerHTML = this.applyTemplate(a);
		return c ? Ext.get(b.firstChild, true) : b.firstChild
	}
};
Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
Ext.Template.from = function(b, a) {
	b = Ext.getDom(b);
	return new Ext.Template(b.value || b.innerHTML, a || "")
};
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(d, c, a) {
	var e = this, g, b = function() {
		clearInterval(g);
		g = null;
		d.apply(c, a || [])
	};
	e.delay = function(i, l, k, h) {
		e.cancel();
		d = l || d;
		c = k || c;
		a = h || a;
		g = setInterval(b, i)
	};
	e.cancel = function() {
		if (g) {
			clearInterval(g);
			g = null
		}
	}
};
( function() {
	var h = document;
	Ext.Element = function(m, n) {
		var o = typeof m == "string" ? h.getElementById(m) : m, p;
		if (!o) {
			return null
		}
		p = o.id;
		if (!n && p && Ext.elCache[p]) {
			return Ext.elCache[p].el
		}
		this.dom = o;
		this.id = p || Ext.id(o)
	};
	var d = Ext.DomHelper, e = Ext.Element, a = Ext.elCache;
	e.prototype = {
		set : function(r, n) {
			var p = this.dom, m, q, n = (n !== false) && !!p.setAttribute;
			for (m in r) {
				if (r.hasOwnProperty(m)) {
					q = r[m];
					if (m == "style") {
						d.applyStyles(p, q)
					} else {
						if (m == "cls") {
							p.className = q
						} else {
							if (n) {
								p.setAttribute(m, q)
							} else {
								p[m] = q
							}
						}
					}
				}
			}
			return this
		},
		defaultUnit :"px",
		is : function(m) {
			return Ext.DomQuery.is(this.dom, m)
		},
		focus : function(p, o) {
			var m = this, o = o || m.dom;
			try {
				if (Number(p)) {
					m.focus.defer(p, null, [ null, o ])
				} else {
					o.focus()
				}
			} catch (n) {
			}
			return m
		},
		blur : function() {
			try {
				this.dom.blur()
			} catch (m) {
			}
			return this
		},
		getValue : function(m) {
			var n = this.dom.value;
			return m ? parseInt(n, 10) : n
		},
		addListener : function(m, p, o, n) {
			Ext.EventManager.on(this.dom, m, p, o || this, n);
			return this
		},
		removeListener : function(m, o, n) {
			Ext.EventManager.removeListener(this.dom, m, o, n || this);
			return this
		},
		removeAllListeners : function() {
			Ext.EventManager.removeAll(this.dom);
			return this
		},
		purgeAllListeners : function() {
			Ext.EventManager.purgeElement(this, true);
			return this
		},
		addUnits : function(m) {
			if (m === "" || m == "auto" || m === undefined) {
				m = m || ""
			} else {
				if (!isNaN(m) || !i.test(m)) {
					m = m + (this.defaultUnit || "px")
				}
			}
			return m
		},
		load : function(n, o, m) {
			Ext.Ajax.request(Ext.apply( {
				params :o,
				url :n.url || n,
				callback :m,
				el :this.dom,
				indicatorText :n.indicatorText || ""
			}, Ext.isObject(n) ? n : {}));
			return this
		},
		isBorderBox : function() {
			return Ext.isBorderBox || Ext.isForcedBorderBox
					|| g[(this.dom.tagName || "").toLowerCase()]
		},
		remove : function() {
			var m = this, n = m.dom;
			if (n) {
				delete m.dom;
				Ext.removeNode(n)
			}
		},
		hover : function(n, m, p, o) {
			var q = this;
			q.on("mouseenter", n, p || q.dom, o);
			q.on("mouseleave", m, p || q.dom, o);
			return q
		},
		contains : function(m) {
			return !m ? false : Ext.lib.Dom.isAncestor(this.dom, m.dom ? m.dom
					: m)
		},
		getAttributeNS : function(n, m) {
			return this.getAttribute(m, n)
		},
		getAttribute :Ext.isIE ? function(m, o) {
			var p = this.dom, n = typeof p[o + ":" + m];
			if ( [ "undefined", "unknown" ].indexOf(n) == -1) {
				return p[o + ":" + m]
			}
			return p[m]
		} : function(m, n) {
			var o = this.dom;
			return o.getAttributeNS(n, m) || o.getAttribute(n + ":" + m)
					|| o.getAttribute(m) || o[m]
		},
		update : function(m) {
			if (this.dom) {
				this.dom.innerHTML = m
			}
			return this
		}
	};
	var l = e.prototype;
	e.addMethods = function(m) {
		Ext.apply(l, m)
	};
	l.on = l.addListener;
	l.un = l.removeListener;
	l.autoBoxAdjust = true;
	var i = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i, c;
	e.get = function(n) {
		var m, q, p;
		if (!n) {
			return null
		}
		if (typeof n == "string") {
			if (!(q = h.getElementById(n))) {
				return null
			}
			if (a[n] && a[n].el) {
				m = a[n].el;
				m.dom = q
			} else {
				m = e.addToCache(new e(q))
			}
			return m
		} else {
			if (n.tagName) {
				if (!(p = n.id)) {
					p = Ext.id(n)
				}
				if (a[p] && a[p].el) {
					m = a[p].el;
					m.dom = n
				} else {
					m = e.addToCache(new e(n))
				}
				return m
			} else {
				if (n instanceof e) {
					if (n != c) {
						if (Ext.isIE && (n.id == undefined || n.id == "")) {
							n.dom = n.dom
						} else {
							n.dom = h.getElementById(n.id) || n.dom
						}
					}
					return n
				} else {
					if (n.isComposite) {
						return n
					} else {
						if (Ext.isArray(n)) {
							return e.select(n)
						} else {
							if (n == h) {
								if (!c) {
									var o = function() {
									};
									o.prototype = e.prototype;
									c = new o();
									c.dom = h
								}
								return c
							}
						}
					}
				}
			}
		}
		return null
	};
	e.addToCache = function(m, n) {
		n = n || m.id;
		a[n] = {
			el :m,
			data : {},
			events : {}
		};
		return m
	};
	e.data = function(n, m, o) {
		n = e.get(n);
		if (!n) {
			return null
		}
		var p = a[n.id].data;
		if (arguments.length == 2) {
			return p[m]
		} else {
			return (p[m] = o)
		}
	};
	function k() {
		if (!Ext.enableGarbageCollector) {
			clearInterval(e.collectorThreadId)
		} else {
			var m, p, r, q;
			for (m in a) {
				q = a[m];
				if (q.skipGC) {
					continue
				}
				p = q.el;
				r = p.dom;
				if (!r || !r.parentNode
						|| (!r.offsetParent && !h.getElementById(m))) {
					if (Ext.enableListenerCollection) {
						Ext.EventManager.removeAll(r)
					}
					delete a[m]
				}
			}
			if (Ext.isIE) {
				var n = {};
				for (m in a) {
					n[m] = a[m]
				}
				a = Ext.elCache = n
			}
		}
	}
	e.collectorThreadId = setInterval(k, 30000);
	var b = function() {
	};
	b.prototype = e.prototype;
	e.Flyweight = function(m) {
		this.dom = m
	};
	e.Flyweight.prototype = new b();
	e.Flyweight.prototype.isFlyweight = true;
	e._flyweights = {};
	e.fly = function(o, m) {
		var n = null;
		m = m || "_global";
		if (o = Ext.getDom(o)) {
			(e._flyweights[m] = e._flyweights[m] || new e.Flyweight()).dom = o;
			n = e._flyweights[m]
		}
		return n
	};
	Ext.get = e.get;
	Ext.fly = e.fly;
	var g = Ext.isStrict ? {
		select :1
	} : {
		input :1,
		select :1,
		textarea :1
	};
	if (Ext.isIE || Ext.isGecko) {
		g.button = 1
	}
})();
Ext.Element
		.addMethods( function() {
			var d = "parentNode", b = "nextSibling", c = "previousSibling", e = Ext.DomQuery, a = Ext.get;
			return {
				findParent : function(n, m, h) {
					var k = this.dom, g = document.body, l = 0, i;
					if (Ext.isGecko
							&& Object.prototype.toString.call(k) == "[object XULElement]") {
						return null
					}
					m = m || 50;
					if (isNaN(m)) {
						i = Ext.getDom(m);
						m = Number.MAX_VALUE
					}
					while (k && k.nodeType == 1 && l < m && k != g && k != i) {
						if (e.is(k, n)) {
							return h ? a(k) : k
						}
						l++;
						k = k.parentNode
					}
					return null
				},
				findParentNode : function(k, i, g) {
					var h = Ext.fly(this.dom.parentNode, "_internal");
					return h ? h.findParent(k, i, g) : null
				},
				up : function(h, g) {
					return this.findParentNode(h, g, true)
				},
				select : function(g) {
					return Ext.Element.select(g, this.dom)
				},
				query : function(g) {
					return e.select(g, this.dom)
				},
				child : function(g, h) {
					var i = e.selectNode(g, this.dom);
					return h ? i : a(i)
				},
				down : function(g, h) {
					var i = e.selectNode(" > " + g, this.dom);
					return h ? i : a(i)
				},
				parent : function(g, h) {
					return this.matchNode(d, d, g, h)
				},
				next : function(g, h) {
					return this.matchNode(b, b, g, h)
				},
				prev : function(g, h) {
					return this.matchNode(c, c, g, h)
				},
				first : function(g, h) {
					return this.matchNode(b, "firstChild", g, h)
				},
				last : function(g, h) {
					return this.matchNode(c, "lastChild", g, h)
				},
				matchNode : function(h, l, g, i) {
					var k = this.dom[l];
					while (k) {
						if (k.nodeType == 1 && (!g || e.is(k, g))) {
							return !i ? a(k) : k
						}
						k = k[h]
					}
					return null
				}
			}
		}());
Ext.Element.addMethods( function() {
	var c = Ext.getDom, a = Ext.get, b = Ext.DomHelper;
	return {
		appendChild : function(d) {
			return a(d).appendTo(this)
		},
		appendTo : function(d) {
			c(d).appendChild(this.dom);
			return this
		},
		insertBefore : function(d) {
			(d = c(d)).parentNode.insertBefore(this.dom, d);
			return this
		},
		insertAfter : function(d) {
			(d = c(d)).parentNode.insertBefore(this.dom, d.nextSibling);
			return this
		},
		insertFirst : function(e, d) {
			e = e || {};
			if (e.nodeType || e.dom || typeof e == "string") {
				e = c(e);
				this.dom.insertBefore(e, this.dom.firstChild);
				return !d ? a(e) : e
			} else {
				return this.createChild(e, this.dom.firstChild, d)
			}
		},
		replace : function(d) {
			d = a(d);
			this.insertBefore(d);
			d.remove();
			return this
		},
		replaceWith : function(d) {
			var e = this;
			if (d.nodeType || d.dom || typeof d == "string") {
				d = c(d);
				e.dom.parentNode.insertBefore(d, e.dom)
			} else {
				d = b.insertBefore(e.dom, d)
			}
			delete Ext.elCache[e.id];
			Ext.removeNode(e.dom);
			e.id = Ext.id(e.dom = d);
			Ext.Element.addToCache(e.isFlyweight ? new Ext.Element(e.dom) : e);
			return e
		},
		createChild : function(e, d, g) {
			e = e || {
				tag :"div"
			};
			return d ? b.insertBefore(d, e, g !== true)
					: b[!this.dom.firstChild ? "overwrite" : "append"](
							this.dom, e, g !== true)
		},
		wrap : function(d, e) {
			var g = b.insertBefore(this.dom, d || {
				tag :"div"
			}, !e);
			g.dom ? g.dom.appendChild(this.dom) : g.appendChild(this.dom);
			return g
		},
		insertHtml : function(e, g, d) {
			var h = b.insertHtml(e, this.dom, g);
			return d ? Ext.get(h) : h
		}
	}
}());
Ext.Element
		.addMethods( function() {
			var B = Ext.supports, h = {}, y = /(-[a-z])/gi, t = document.defaultView, E = /alpha\(opacity=(.*)\)/i, m = /^\s+|\s+$/g, C = Ext.Element, v = /\s+/, b = /\w/g, d = "padding", c = "margin", z = "border", u = "-left", r = "-right", x = "-top", p = "-bottom", k = "-width", s = Math, A = "hidden", e = "isClipped", l = "overflow", o = "overflow-x", n = "overflow-y", D = "originalClip", i = {
				l :z + u + k,
				r :z + r + k,
				t :z + x + k,
				b :z + p + k
			}, g = {
				l :d + u,
				r :d + r,
				t :d + x,
				b :d + p
			}, a = {
				l :c + u,
				r :c + r,
				t :c + x,
				b :c + p
			}, F = Ext.Element.data;
			function q(G, H) {
				return H.charAt(1).toUpperCase()
			}
			function w(G) {
				return h[G]
						|| (h[G] = G == "float" ? (B.cssFloat ? "cssFloat"
								: "styleFloat") : G.replace(y, q))
			}
			return {
				adjustWidth : function(G) {
					var H = this;
					var I = (typeof G == "number");
					if (I && H.autoBoxAdjust && !H.isBorderBox()) {
						G -= (H.getBorderWidth("lr") + H.getPadding("lr"))
					}
					return (I && G < 0) ? 0 : G
				},
				adjustHeight : function(G) {
					var H = this;
					var I = (typeof G == "number");
					if (I && H.autoBoxAdjust && !H.isBorderBox()) {
						G -= (H.getBorderWidth("tb") + H.getPadding("tb"))
					}
					return (I && G < 0) ? 0 : G
				},
				addClass : function(K) {
					var L = this, J, G, I, H = [];
					if (!Ext.isArray(K)) {
						if (typeof K == "string" && !this.hasClass(K)) {
							L.dom.className += " " + K
						}
					} else {
						for (J = 0, G = K.length; J < G; J++) {
							I = K[J];
							if (typeof I == "string"
									&& (" " + L.dom.className + " ")
											.indexOf(" " + I + " ") == -1) {
								H.push(I)
							}
						}
						if (H.length) {
							L.dom.className += " " + H.join(" ")
						}
					}
					return L
				},
				removeClass : function(L) {
					var M = this, K, H, G, J, I;
					if (!Ext.isArray(L)) {
						L = [ L ]
					}
					if (M.dom && M.dom.className) {
						I = M.dom.className.replace(m, "").split(v);
						for (K = 0, G = L.length; K < G; K++) {
							J = L[K];
							if (typeof J == "string") {
								J = J.replace(m, "");
								H = I.indexOf(J);
								if (H != -1) {
									I.splice(H, 1)
								}
							}
						}
						M.dom.className = I.join(" ")
					}
					return M
				},
				radioClass : function(J) {
					var K = this.dom.parentNode.childNodes, H, I, G;
					J = Ext.isArray(J) ? J : [ J ];
					for (I = 0, G = K.length; I < G; I++) {
						H = K[I];
						if (H && H.nodeType == 1) {
							Ext.fly(H, "_internal").removeClass(J)
						}
					}
					return this.addClass(J)
				},
				toggleClass : function(G) {
					return this.hasClass(G) ? this.removeClass(G) : this
							.addClass(G)
				},
				hasClass : function(G) {
					return G
							&& (" " + this.dom.className + " ").indexOf(" " + G
									+ " ") != -1
				},
				replaceClass : function(H, G) {
					return this.removeClass(H).addClass(G)
				},
				isStyle : function(G, H) {
					return this.getStyle(G) == H
				},
				getStyle : function() {
					return t && t.getComputedStyle ? function(L) {
						var J = this.dom, G, I, H, K;
						if (J == document) {
							return null
						}
						L = w(L);
						H = (G = J.style[L]) ? G : (I = t.getComputedStyle(J,
								"")) ? I[L] : null;
						if (L == "marginRight" && H != "0px"
								&& !B.correctRightMargin) {
							K = J.style.display;
							J.style.display = "inline-block";
							H = t.getComputedStyle(J, "").marginRight;
							J.style.display = K
						}
						if (L == "backgroundColor" && H == "rgba(0, 0, 0, 0)"
								&& !B.correctTransparentColor) {
							H = "transparent"
						}
						return H
					} : function(K) {
						var I = this.dom, G, H;
						if (I == document) {
							return null
						}
						if (K == "opacity") {
							if (I.style.filter.match) {
								if (G = I.style.filter.match(E)) {
									var J = parseFloat(G[1]);
									if (!isNaN(J)) {
										return J ? J / 100 : 0
									}
								}
							}
							return 1
						}
						K = w(K);
						return I.style[K]
								|| ((H = I.currentStyle) ? H[K] : null)
					}
				}(),
				getColor : function(G, H, L) {
					var J = this.getStyle(G), I = (typeof L != "undefined") ? L
							: "#", K;
					if (!J || (/transparent|inherit/.test(J))) {
						return H
					}
					if (/^r/.test(J)) {
						Ext.each(J.slice(4, J.length - 1).split(","), function(
								M) {
							K = parseInt(M, 10);
							I += (K < 16 ? "0" : "") + K.toString(16)
						})
					} else {
						J = J.replace("#", "");
						I += J.length == 3 ? J.replace(/^(\w)(\w)(\w)$/,
								"$1$1$2$2$3$3") : J
					}
					return (I.length > 5 ? I.toLowerCase() : H)
				},
				setStyle : function(J, I) {
					var G, H;
					if (typeof J != "object") {
						G = {};
						G[J] = I;
						J = G
					}
					for (H in J) {
						I = J[H];
						H == "opacity" ? this.setOpacity(I)
								: this.dom.style[w(H)] = I
					}
					return this
				},
				setOpacity : function(H, G) {
					var K = this, I = K.dom.style;
					if (!G || !K.anim) {
						if (Ext.isIE) {
							var J = H < 1 ? "alpha(opacity=" + H * 100 + ")"
									: "", L = I.filter.replace(E, "").replace(
									m, "");
							I.zoom = 1;
							I.filter = L + (L.length > 0 ? " " : "") + J
						} else {
							I.opacity = H
						}
					} else {
						K.anim( {
							opacity : {
								to :H
							}
						}, K.preanim(arguments, 1), null, 0.35, "easeIn")
					}
					return K
				},
				clearOpacity : function() {
					var G = this.dom.style;
					if (Ext.isIE) {
						if (!Ext.isEmpty(G.filter)) {
							G.filter = G.filter.replace(E, "").replace(m, "")
						}
					} else {
						G.opacity = G["-moz-opacity"] = G["-khtml-opacity"] = ""
					}
					return this
				},
				getHeight : function(I) {
					var H = this, K = H.dom, J = Ext.isIE
							&& H.isStyle("display", "none"), G = s.max(
							K.offsetHeight, J ? 0 : K.clientHeight) || 0;
					G = !I ? G : G - H.getBorderWidth("tb")
							- H.getPadding("tb");
					return G < 0 ? 0 : G
				},
				getWidth : function(H) {
					var I = this, K = I.dom, J = Ext.isIE
							&& I.isStyle("display", "none"), G = s.max(
							K.offsetWidth, J ? 0 : K.clientWidth) || 0;
					G = !H ? G : G - I.getBorderWidth("lr")
							- I.getPadding("lr");
					return G < 0 ? 0 : G
				},
				setWidth : function(H, G) {
					var I = this;
					H = I.adjustWidth(H);
					!G || !I.anim ? I.dom.style.width = I.addUnits(H) : I.anim(
							{
								width : {
									to :H
								}
							}, I.preanim(arguments, 1));
					return I
				},
				setHeight : function(G, H) {
					var I = this;
					G = I.adjustHeight(G);
					!H || !I.anim ? I.dom.style.height = I.addUnits(G) : I
							.anim( {
								height : {
									to :G
								}
							}, I.preanim(arguments, 1));
					return I
				},
				getBorderWidth : function(G) {
					return this.addStyles(G, i)
				},
				getPadding : function(G) {
					return this.addStyles(G, g)
				},
				clip : function() {
					var G = this, H = G.dom;
					if (!F(H, e)) {
						F(H, e, true);
						F(H, D, {
							o :G.getStyle(l),
							x :G.getStyle(o),
							y :G.getStyle(n)
						});
						G.setStyle(l, A);
						G.setStyle(o, A);
						G.setStyle(n, A)
					}
					return G
				},
				unclip : function() {
					var G = this, I = G.dom;
					if (F(I, e)) {
						F(I, e, false);
						var H = F(I, D);
						if (H.o) {
							G.setStyle(l, H.o)
						}
						if (H.x) {
							G.setStyle(o, H.x)
						}
						if (H.y) {
							G.setStyle(n, H.y)
						}
					}
					return G
				},
				addStyles : function(N, M) {
					var K = 0, L = N.match(b), J, I, H, G = L.length;
					for (H = 0; H < G; H++) {
						J = L[H];
						I = J && parseInt(this.getStyle(M[J]), 10);
						if (I) {
							K += s.abs(I)
						}
					}
					return K
				},
				margins :a
			}
		}());
( function() {
	var a = Ext.lib.Dom, b = "left", g = "right", d = "top", i = "bottom", h = "position", c = "static", e = "relative", k = "auto", l = "z-index";
	Ext.Element.addMethods( {
		getX : function() {
			return a.getX(this.dom)
		},
		getY : function() {
			return a.getY(this.dom)
		},
		getXY : function() {
			return a.getXY(this.dom)
		},
		getOffsetsTo : function(m) {
			var p = this.getXY(), n = Ext.fly(m, "_internal").getXY();
			return [ p[0] - n[0], p[1] - n[1] ]
		},
		setX : function(m, n) {
			return this.setXY( [ m, this.getY() ], this.animTest(arguments, n,
					1))
		},
		setY : function(n, m) {
			return this.setXY( [ this.getX(), n ], this.animTest(arguments, m,
					1))
		},
		setLeft : function(m) {
			this.setStyle(b, this.addUnits(m));
			return this
		},
		setTop : function(m) {
			this.setStyle(d, this.addUnits(m));
			return this
		},
		setRight : function(m) {
			this.setStyle(g, this.addUnits(m));
			return this
		},
		setBottom : function(m) {
			this.setStyle(i, this.addUnits(m));
			return this
		},
		setXY : function(o, m) {
			var n = this;
			if (!m || !n.anim) {
				a.setXY(n.dom, o)
			} else {
				n.anim( {
					points : {
						to :o
					}
				}, n.preanim(arguments, 1), "motion")
			}
			return n
		},
		setLocation : function(m, o, n) {
			return this.setXY( [ m, o ], this.animTest(arguments, n, 2))
		},
		moveTo : function(m, o, n) {
			return this.setXY( [ m, o ], this.animTest(arguments, n, 2))
		},
		getLeft : function(m) {
			return !m ? this.getX() : parseInt(this.getStyle(b), 10) || 0
		},
		getRight : function(m) {
			var n = this;
			return !m ? n.getX() + n.getWidth() : (n.getLeft(true) + n
					.getWidth()) || 0
		},
		getTop : function(m) {
			return !m ? this.getY() : parseInt(this.getStyle(d), 10) || 0
		},
		getBottom : function(m) {
			var n = this;
			return !m ? n.getY() + n.getHeight() : (n.getTop(true) + n
					.getHeight()) || 0
		},
		position : function(q, p, m, o) {
			var n = this;
			if (!q && n.isStyle(h, c)) {
				n.setStyle(h, e)
			} else {
				if (q) {
					n.setStyle(h, q)
				}
			}
			if (p) {
				n.setStyle(l, p)
			}
			if (m || o) {
				n.setXY( [ m || false, o || false ])
			}
		},
		clearPositioning : function(m) {
			m = m || "";
			this.setStyle( {
				left :m,
				right :m,
				top :m,
				bottom :m,
				"z-index" :"",
				position :c
			});
			return this
		},
		getPositioning : function() {
			var m = this.getStyle(b);
			var n = this.getStyle(d);
			return {
				position :this.getStyle(h),
				left :m,
				right :m ? "" : this.getStyle(g),
				top :n,
				bottom :n ? "" : this.getStyle(i),
				"z-index" :this.getStyle(l)
			}
		},
		setPositioning : function(m) {
			var o = this, n = o.dom.style;
			o.setStyle(m);
			if (m.right == k) {
				n.right = ""
			}
			if (m.bottom == k) {
				n.bottom = ""
			}
			return o
		},
		translatePoints : function(m, u) {
			u = isNaN(m[1]) ? u : m[1];
			m = isNaN(m[0]) ? m : m[0];
			var q = this, r = q.isStyle(h, e), s = q.getXY(), n = parseInt(q
					.getStyle(b), 10), p = parseInt(q.getStyle(d), 10);
			n = !isNaN(n) ? n : (r ? 0 : q.dom.offsetLeft);
			p = !isNaN(p) ? p : (r ? 0 : q.dom.offsetTop);
			return {
				left :(m - s[0] + n),
				top :(u - s[1] + p)
			}
		},
		animTest : function(n, m, o) {
			return !!m && this.preanim ? this.preanim(n, o) : false
		}
	})
})();
Ext.Element
		.addMethods( {
			isScrollable : function() {
				var a = this.dom;
				return a.scrollHeight > a.clientHeight
						|| a.scrollWidth > a.clientWidth
			},
			scrollTo : function(a, b) {
				this.dom["scroll" + (/top/i.test(a) ? "Top" : "Left")] = b;
				return this
			},
			getScroll : function() {
				var i = this.dom, h = document, a = h.body, c = h.documentElement, b, g, e;
				if (i == h || i == a) {
					if (Ext.isIE && Ext.isStrict) {
						b = c.scrollLeft;
						g = c.scrollTop
					} else {
						b = window.pageXOffset;
						g = window.pageYOffset
					}
					e = {
						left :b || (a ? a.scrollLeft : 0),
						top :g || (a ? a.scrollTop : 0)
					}
				} else {
					e = {
						left :i.scrollLeft,
						top :i.scrollTop
					}
				}
				return e
			}
		});
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 e = Ext.Element, q = "opacity", k = "visibility", g = "display", d = "hidden", o = "offsets", l = "asclass", n = "none", a = "nosize", b = "originalDisplay", c = "visibilityMode", h = "isVisible", i = e.data, m = function(
					s) {
				var r = i(s, b);
				if (r === undefined) {
					i(s, b, r = "")
				}
				return r
			}, p = function(s) {
				var r = i(s, c);
				if (r === undefined) {
					i(s, c, r = 1)
				}
				return r
			};
			return {
				originalDisplay :"",
				visibilityMode :1,
				setVisibilityMode : function(r) {
					i(this.dom, c, r);
					return this
				},
				animate : function(s, u, t, v, r) {
					this.anim(s, {
						duration :u,
						callback :t,
						easing :v
					}, r);
					return this
				},
				anim : function(u, v, s, x, t, r) {
					s = s || "run";
					v = v || {};
					var w = this, y = Ext.lib.Anim[s](w.dom, u,
							(v.duration || x) || 0.35, (v.easing || t)
									|| "easeOut", function() {
								if (r) {
									r.call(w)
								}
								if (v.callback) {
									v.callback.call(v.scope || w, w, v)
								}
							}, w);
					v.anim = y;
					return y
				},
				preanim : function(r, s) {
					return !r[s] ? false : (typeof r[s] == "object" ? r[s] : {
						duration :r[s + 1],
						callback :r[s + 2],
						easing :r[s + 3]
					})
				},
				isVisible : function() {
					var r = this, t = r.dom, s = i(t, h);
					if (typeof s == "boolean") {
						return s
					}
					s = !r.isStyle(k, d)
							&& !r.isStyle(g, n)
							&& !((p(t) == e.ASCLASS) && r
									.hasClass(r.visibilityCls
											|| e.visibilityCls));
					i(t, h, s);
					return s
				},
				setVisible : function(u, r) {
					var x = this, s, z, y, w, v = x.dom, t = p(v);
					if (typeof r == "string") {
						switch (r) {
						case g:
							t = e.DISPLAY;
							break;
						case k:
							t = e.VISIBILITY;
							break;
						case o:
							t = e.OFFSETS;
							break;
						case a:
						case l:
							t = e.ASCLASS;
							break
						}
						x.setVisibilityMode(t);
						r = false
					}
					if (!r || !x.anim) {
						if (t == e.ASCLASS) {
							x[u ? "removeClass" : "addClass"](x.visibilityCls
									|| e.visibilityCls)
						} else {
							if (t == e.DISPLAY) {
								return x.setDisplayed(u)
							} else {
								if (t == e.OFFSETS) {
									if (!u) {
										x.hideModeStyles = {
											position :x.getStyle("position"),
											top :x.getStyle("top"),
											left :x.getStyle("left")
										};
										x.applyStyles( {
											position :"absolute",
											top :"-10000px",
											left :"-10000px"
										})
									} else {
										x.applyStyles(x.hideModeStyles || {
											position :"",
											top :"",
											left :""
										});
										delete x.hideModeStyles
									}
								} else {
									x.fixDisplay();
									v.style.visibility = u ? "visible" : d
								}
							}
						}
					} else {
						if (u) {
							x.setOpacity(0.01);
							x.setVisible(true)
						}
						x.anim( {
							opacity : {
								to :(u ? 1 : 0)
							}
						}, x.preanim(arguments, 1), null, 0.35, "easeIn",
								function() {
									u || x.setVisible(false).setOpacity(1)
								})
					}
					i(v, h, u);
					return x
				},
				hasMetrics : function() {
					var r = this.dom;
					return this.isVisible() || (p(r) == e.VISIBILITY)
				},
				toggle : function(r) {
					var s = this;
					s.setVisible(!s.isVisible(), s.preanim(arguments, 0));
					return s
				},
				setDisplayed : function(r) {
					if (typeof r == "boolean") {
						r = r ? m(this.dom) : n
					}
					this.setStyle(g, r);
					return this
				},
				fixDisplay : function() {
					var r = this;
					if (r.isStyle(g, n)) {
						r.setStyle(k, d);
						r.setStyle(g, m(this.dom));
						if (r.isStyle(g, n)) {
							r.setStyle(g, "block")
						}
					}
				},
				hide : function(r) {
					if (typeof r == "string") {
						this.setVisible(false, r);
						return this
					}
					this.setVisible(false, this.preanim(arguments, 0));
					return this
				},
				show : function(r) {
					if (typeof r == "string") {
						this.setVisible(true, r);
						return this
					}
					this.setVisible(true, this.preanim(arguments, 0));
					return this
				}
			}
		}());
( function() {
	var z = null, B = undefined, l = true, u = false, k = "setX", h = "setY", a = "setXY", o = "left", m = "bottom", t = "top", n = "right", r = "height", g = "width", i = "points", x = "hidden", A = "absolute", v = "visible", e = "motion", p = "position", s = "easeOut", d = new Ext.Element.Flyweight(), w = {}, y = function(
			C) {
		return C || {}
	}, q = function(C) {
		d.dom = C;
		d.id = Ext.id(C);
		return d
	}, c = function(C) {
		if (!w[C]) {
			w[C] = []
		}
		return w[C]
	}, b = function(D, C) {
		w[D] = C
	};
	Ext.enableFx = l;
	Ext.Fx = {
		switchStatements : function(D, E, C) {
			return E.apply(this, C[D])
		},
		slideIn : function(I, F) {
			F = y(F);
			var K = this, H = K.dom, N = H.style, P, C, M, E, D, N, J, O, L, G;
			I = I || "t";
			K.queueFx(F,
					function() {
						P = q(H).getXY();
						q(H).fixDisplay();
						C = q(H).getFxRestore();
						M = {
							x :P[0],
							y :P[1],
							0 :P[0],
							1 :P[1],
							width :H.offsetWidth,
							height :H.offsetHeight
						};
						M.right = M.x + M.width;
						M.bottom = M.y + M.height;
						q(H).setWidth(M.width).setHeight(M.height);
						E = q(H).fxWrap(C.pos, F, x);
						N.visibility = v;
						N.position = A;
						function Q() {
							q(H).fxUnwrap(E, C.pos, F);
							N.width = C.width;
							N.height = C.height;
							q(H).afterFx(F)
						}
						O = {
							to : [ M.x, M.y ]
						};
						L = {
							to :M.width
						};
						G = {
							to :M.height
						};
						function R(V, S, W, T, Y, aa, ad, ac, ab, X, U) {
							var Z = {};
							q(V).setWidth(W).setHeight(T);
							if (q(V)[Y]) {
								q(V)[Y](aa)
							}
							S[ad] = S[ac] = "0";
							if (ab) {
								Z.width = ab
							}
							if (X) {
								Z.height = X
							}
							if (U) {
								Z.points = U
							}
							return Z
						}
						J = q(H)
								.switchStatements(
										I.toLowerCase(),
										R,
										{
											t : [ E, N, M.width, 0, z, z, o, m,
													z, G, z ],
											l : [ E, N, 0, M.height, z, z, n,
													t, L, z, z ],
											r : [ E, N, M.width, M.height, k,
													M.right, o, t, z, z, O ],
											b : [ E, N, M.width, M.height, h,
													M.bottom, o, t, z, G, O ],
											tl : [ E, N, 0, 0, z, z, n, m, L,
													G, O ],
											bl : [ E, N, 0, 0, h,
													M.y + M.height, n, t, L, G,
													O ],
											br : [ E, N, 0, 0, a,
													[ M.right, M.bottom ], o,
													t, L, G, O ],
											tr : [ E, N, 0, 0, k,
													M.x + M.width, o, m, L, G,
													O ]
										});
						N.visibility = v;
						q(E).show();
						arguments.callee.anim = q(E).fxanim(J, F, e, 0.5, s, Q)
					});
			return K
		},
		slideOut : function(G, E) {
			E = y(E);
			var I = this, F = I.dom, L = F.style, M = I.getXY(), D, C, J, K, H = {
				to :0
			};
			G = G || "t";
			I.queueFx(E, function() {
				C = q(F).getFxRestore();
				J = {
					x :M[0],
					y :M[1],
					0 :M[0],
					1 :M[1],
					width :F.offsetWidth,
					height :F.offsetHeight
				};
				J.right = J.x + J.width;
				J.bottom = J.y + J.height;
				q(F).setWidth(J.width).setHeight(J.height);
				D = q(F).fxWrap(C.pos, E, v);
				L.visibility = v;
				L.position = A;
				q(D).setWidth(J.width).setHeight(J.height);
				function N() {
					E.useDisplay ? q(F).setDisplayed(u) : q(F).hide();
					q(F).fxUnwrap(D, C.pos, E);
					L.width = C.width;
					L.height = C.height;
					q(F).afterFx(E)
				}
				function O(P, X, V, Y, T, W, S, U, R) {
					var Q = {};
					P[X] = P[V] = "0";
					Q[Y] = T;
					if (W) {
						Q[W] = S
					}
					if (U) {
						Q[U] = R
					}
					return Q
				}
				K = q(F).switchStatements(G.toLowerCase(), O, {
					t : [ L, o, m, r, H ],
					l : [ L, n, t, g, H ],
					r : [ L, o, t, g, H, i, {
						to : [ J.right, J.y ]
					} ],
					b : [ L, o, t, r, H, i, {
						to : [ J.x, J.bottom ]
					} ],
					tl : [ L, n, m, g, H, r, H ],
					bl : [ L, n, t, g, H, r, H, i, {
						to : [ J.x, J.bottom ]
					} ],
					br : [ L, o, t, g, H, r, H, i, {
						to : [ J.x + J.width, J.bottom ]
					} ],
					tr : [ L, o, m, g, H, r, H, i, {
						to : [ J.right, J.y ]
					} ]
				});
				arguments.callee.anim = q(D).fxanim(K, E, e, 0.5, s, N)
			});
			return I
		},
		puff : function(I) {
			I = y(I);
			var G = this, H = G.dom, D = H.style, E, C, F;
			G.queueFx(I, function() {
				E = q(H).getWidth();
				C = q(H).getHeight();
				q(H).clearOpacity();
				q(H).show();
				F = q(H).getFxRestore();
				function J() {
					I.useDisplay ? q(H).setDisplayed(u) : q(H).hide();
					q(H).clearOpacity();
					q(H).setPositioning(F.pos);
					D.width = F.width;
					D.height = F.height;
					D.fontSize = "";
					q(H).afterFx(I)
				}
				arguments.callee.anim = q(H).fxanim( {
					width : {
						to :q(H).adjustWidth(E * 2)
					},
					height : {
						to :q(H).adjustHeight(C * 2)
					},
					points : {
						by : [ -E * 0.5, -C * 0.5 ]
					},
					opacity : {
						to :0
					},
					fontSize : {
						to :200,
						unit :"%"
					}
				}, I, e, 0.5, s, J)
			});
			return G
		},
		switchOff : function(G) {
			G = y(G);
			var E = this, F = E.dom, C = F.style, D;
			E.queueFx(G, function() {
				q(F).clearOpacity();
				q(F).clip();
				D = q(F).getFxRestore();
				function H() {
					G.useDisplay ? q(F).setDisplayed(u) : q(F).hide();
					q(F).clearOpacity();
					q(F).setPositioning(D.pos);
					C.width = D.width;
					C.height = D.height;
					q(F).afterFx(G)
				}
				q(F).fxanim( {
					opacity : {
						to :0.3
					}
				}, z, z, 0.1, z, function() {
					q(F).clearOpacity();
					( function() {
						q(F).fxanim( {
							height : {
								to :1
							},
							points : {
								by : [ 0, q(F).getHeight() * 0.5 ]
							}
						}, G, e, 0.3, "easeIn", H)
					}).defer(100)
				})
			});
			return E
		},
		highlight : function(E, I) {
			I = y(I);
			var G = this, H = G.dom, C = I.attr || "backgroundColor", D = {}, F;
			G.queueFx(I, function() {
				q(H).clearOpacity();
				q(H).show();
				function J() {
					H.style[C] = F;
					q(H).afterFx(I)
				}
				F = H.style[C];
				D[C] = {
					from :E || "ffff9c",
					to :I.endColor || q(H).getColor(C) || "ffffff"
				};
				arguments.callee.anim = q(H).fxanim(D, I, "color", 1, "easeIn",
						J)
			});
			return G
		},
		frame : function(C, F, I) {
			I = y(I);
			var E = this, H = E.dom, D, G;
			E.queueFx(I, function() {
				C = C || "#C3DAF9";
				if (C.length == 6) {
					C = "#" + C
				}
				F = F || 1;
				q(H).show();
				var M = q(H).getXY(), K = {
					x :M[0],
					y :M[1],
					0 :M[0],
					1 :M[1],
					width :H.offsetWidth,
					height :H.offsetHeight
				}, J = function() {
					D = q(document.body || document.documentElement)
							.createChild( {
								style : {
									position :A,
									"z-index" :35000,
									border :"0px solid " + C
								}
							});
					return D.queueFx( {}, L)
				};
				arguments.callee.anim = {
					isAnimated :true,
					stop : function() {
						F = 0;
						D.stopFx()
					}
				};
				function L() {
					var N = Ext.isBorderBox ? 2 : 1;
					G = D.anim( {
						top : {
							from :K.y,
							to :K.y - 20
						},
						left : {
							from :K.x,
							to :K.x - 20
						},
						borderWidth : {
							from :0,
							to :10
						},
						opacity : {
							from :1,
							to :0
						},
						height : {
							from :K.height,
							to :K.height + 20 * N
						},
						width : {
							from :K.width,
							to :K.width + 20 * N
						}
					}, {
						duration :I.duration || 1,
						callback : function() {
							D.remove();
							--F > 0 ? J() : q(H).afterFx(I)
						}
					});
					arguments.callee.anim = {
						isAnimated :true,
						stop : function() {
							G.stop()
						}
					}
				}
				J()
			});
			return E
		},
		pause : function(E) {
			var D = this.dom, C;
			this.queueFx( {}, function() {
				C = setTimeout( function() {
					q(D).afterFx( {})
				}, E * 1000);
				arguments.callee.anim = {
					isAnimated :true,
					stop : function() {
						clearTimeout(C);
						q(D).afterFx( {})
					}
				}
			});
			return this
		},
		fadeIn : function(E) {
			E = y(E);
			var C = this, D = C.dom, F = E.endOpacity || 1;
			C.queueFx(E, function() {
				q(D).setOpacity(0);
				q(D).fixDisplay();
				D.style.visibility = v;
				arguments.callee.anim = q(D).fxanim( {
					opacity : {
						to :F
					}
				}, E, z, 0.5, s, function() {
					if (F == 1) {
						q(D).clearOpacity()
					}
					q(D).afterFx(E)
				})
			});
			return C
		},
		fadeOut : function(F) {
			F = y(F);
			var D = this, E = D.dom, C = E.style, G = F.endOpacity || 0;
			D
					.queueFx(
							F,
							function() {
								arguments.callee.anim = q(E)
										.fxanim(
												{
													opacity : {
														to :G
													}
												},
												F,
												z,
												0.5,
												s,
												function() {
													if (G == 0) {
														Ext.Element
																.data(E,
																		"visibilityMode") == Ext.Element.DISPLAY
																|| F.useDisplay ? C.display = "none"
																: C.visibility = x;
														q(E).clearOpacity()
													}
													q(E).afterFx(F)
												})
							});
			return D
		},
		scale : function(C, D, E) {
			this.shift(Ext.apply( {}, E, {
				width :C,
				height :D
			}));
			return this
		},
		shift : function(E) {
			E = y(E);
			var D = this.dom, C = {};
			this.queueFx(E, function() {
				for ( var F in E) {
					if (E[F] != B) {
						C[F] = {
							to :E[F]
						}
					}
				}
				C.width ? C.width.to = q(D).adjustWidth(E.width) : C;
				C.height ? C.height.to = q(D).adjustWidth(E.height) : C;
				if (C.x || C.y || C.xy) {
					C.points = C.xy
							|| {
								to : [ C.x ? C.x.to : q(D).getX(),
										C.y ? C.y.to : q(D).getY() ]
							}
				}
				arguments.callee.anim = q(D).fxanim(C, E, e, 0.35, s,
						function() {
							q(D).afterFx(E)
						})
			});
			return this
		},
		ghost : function(F, D) {
			D = y(D);
			var H = this, E = H.dom, K = E.style, I = {
				opacity : {
					to :0
				},
				points : {}
			}, L = I.points, C, J, G;
			F = F || "b";
			H.queueFx(D, function() {
				C = q(E).getFxRestore();
				J = q(E).getWidth();
				G = q(E).getHeight();
				function M() {
					D.useDisplay ? q(E).setDisplayed(u) : q(E).hide();
					q(E).clearOpacity();
					q(E).setPositioning(C.pos);
					K.width = C.width;
					K.height = C.height;
					q(E).afterFx(D)
				}
				L.by = q(E).switchStatements(F.toLowerCase(), function(O, N) {
					return [ O, N ]
				}, {
					t : [ 0, -G ],
					l : [ -J, 0 ],
					r : [ J, 0 ],
					b : [ 0, G ],
					tl : [ -J, -G ],
					bl : [ -J, G ],
					br : [ J, G ],
					tr : [ J, -G ]
				});
				arguments.callee.anim = q(E).fxanim(I, D, e, 0.5, s, M)
			});
			return H
		},
		syncFx : function() {
			var C = this;
			C.fxDefaults = Ext.apply(C.fxDefaults || {}, {
				block :u,
				concurrent :l,
				stopFx :u
			});
			return C
		},
		sequenceFx : function() {
			var C = this;
			C.fxDefaults = Ext.apply(C.fxDefaults || {}, {
				block :u,
				concurrent :u,
				stopFx :u
			});
			return C
		},
		nextFx : function() {
			var C = c(this.dom.id)[0];
			if (C) {
				C.call(this)
			}
		},
		hasActiveFx : function() {
			return c(this.dom.id)[0]
		},
		stopFx : function(C) {
			var D = this, F = D.dom.id;
			if (D.hasActiveFx()) {
				var E = c(F)[0];
				if (E && E.anim) {
					if (E.anim.isAnimated) {
						b(F, [ E ]);
						E.anim.stop(C !== undefined ? C : l)
					} else {
						b(F, [])
					}
				}
			}
			return D
		},
		beforeFx : function(C) {
			if (this.hasActiveFx() && !C.concurrent) {
				if (C.stopFx) {
					this.stopFx();
					return l
				}
				return u
			}
			return l
		},
		hasFxBlock : function() {
			var C = c(this.dom.id);
			return C && C[0] && C[0].block
		},
		queueFx : function(F, C) {
			var D = q(this.dom);
			if (!D.hasFxBlock()) {
				Ext.applyIf(F, D.fxDefaults);
				if (!F.concurrent) {
					var E = D.beforeFx(F);
					C.block = F.block;
					c(D.dom.id).push(C);
					if (E) {
						D.nextFx()
					}
				} else {
					C.call(D)
				}
			}
			return D
		},
		fxWrap : function(I, G, E) {
			var F = this.dom, D, C;
			if (!G.wrap || !(D = Ext.getDom(G.wrap))) {
				if (G.fixPosition) {
					C = q(F).getXY()
				}
				var H = document.createElement("div");
				H.style.visibility = E;
				D = F.parentNode.insertBefore(H, F);
				q(D).setPositioning(I);
				if (q(D).isStyle(p, "static")) {
					q(D).position("relative")
				}
				q(F).clearPositioning("auto");
				q(D).clip();
				D.appendChild(F);
				if (C) {
					q(D).setXY(C)
				}
			}
			return D
		},
		fxUnwrap : function(D, G, F) {
			var E = this.dom;
			q(E).clearPositioning();
			q(E).setPositioning(G);
			if (!F.wrap) {
				var C = q(D).dom.parentNode;
				C.insertBefore(E, D);
				q(D).remove()
			}
		},
		getFxRestore : function() {
			var C = this.dom.style;
			return {
				pos :this.getPositioning(),
				width :C.width,
				height :C.height
			}
		},
		afterFx : function(D) {
			var C = this.dom, E = C.id;
			if (D.afterStyle) {
				q(C).setStyle(D.afterStyle)
			}
			if (D.afterCls) {
				q(C).addClass(D.afterCls)
			}
			if (D.remove == l) {
				q(C).remove()
			}
			if (D.callback) {
				D.callback.call(D.scope, q(C))
			}
			if (!D.concurrent) {
				c(E).shift();
				q(C).nextFx()
			}
		},
		fxanim : function(F, G, D, H, E, C) {
			D = D || "run";
			G = G || {};
			var I = Ext.lib.Anim[D](this.dom, F, (G.duration || H) || 0.35,
					(G.easing || E) || s, C, this);
			G.anim = I;
			return I
		}
	};
	Ext.Fx.resize = Ext.Fx.scale;
	Ext.Element.addMethods(Ext.Fx)
})();
Ext.CompositeElementLite = function(b, a) {
	this.elements = [];
	this.add(b, a);
	this.el = new Ext.Element.Flyweight()
};
Ext.CompositeElementLite.prototype = {
	isComposite :true,
	getElement : function(a) {
		var b = this.el;
		b.dom = a;
		b.id = a.id;
		return b
	},
	transformElement : function(a) {
		return Ext.getDom(a)
	},
	getCount : function() {
		return this.elements.length
	},
	add : function(d, b) {
		var e = this, g = e.elements;
		if (!d) {
			return this
		}
		if (typeof d == "string") {
			d = Ext.Element.selectorFunction(d, b)
		} else {
			if (d.isComposite) {
				d = d.elements
			} else {
				if (!Ext.isIterable(d)) {
					d = [ d ]
				}
			}
		}
		for ( var c = 0, a = d.length; c < a; ++c) {
			g.push(e.transformElement(d[c]))
		}
		return e
	},
	invoke : function(g, b) {
		var h = this, d = h.elements, a = d.length, k, c;
		for (c = 0; c < a; c++) {
			k = d[c];
			if (k) {
				Ext.Element.prototype[g].apply(h.getElement(k), b)
			}
		}
		return h
	},
	item : function(b) {
		var d = this, c = d.elements[b], a = null;
		if (c) {
			a = d.getElement(c)
		}
		return a
	},
	addListener : function(b, k, h, g) {
		var d = this.elements, a = d.length, c, l;
		for (c = 0; c < a; c++) {
			l = d[c];
			if (l) {
				Ext.EventManager.on(l, b, k, h || l, g)
			}
		}
		return this
	},
	each : function(g, d) {
		var h = this, c = h.elements, a = c.length, b, k;
		for (b = 0; b < a; b++) {
			k = c[b];
			if (k) {
				k = this.getElement(k);
				if (g.call(d || k, k, h, b) === false) {
					break
				}
			}
		}
		return h
	},
	fill : function(a) {
		var b = this;
		b.elements = [];
		b.add(a);
		return b
	},
	filter : function(a) {
		var b = [], d = this, c = Ext.isFunction(a) ? a : function(e) {
			return e.is(a)
		};
		d.each( function(h, e, g) {
			if (c(h, g) !== false) {
				b[b.length] = d.transformElement(h)
			}
		});
		d.elements = b;
		return d
	},
	indexOf : function(a) {
		return this.elements.indexOf(this.transformElement(a))
	},
	replaceElement : function(e, c, a) {
		var b = !isNaN(e) ? e : this.indexOf(e), g;
		if (b > -1) {
			c = Ext.getDom(c);
			if (a) {
				g = this.elements[b];
				g.parentNode.insertBefore(c, g);
				Ext.removeNode(g)
			}
			this.elements.splice(b, 1, c)
		}
		return this
	},
	clear : function() {
		this.elements = []
	}
};
Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener;
Ext.CompositeElementLite.importElementMethods = function() {
	var c, b = Ext.Element.prototype, a = Ext.CompositeElementLite.prototype;
	for (c in b) {
		if (typeof b[c] == "function") {
			( function(d) {
				a[d] = a[d] || function() {
					return this.invoke(d, arguments)
				}
			}).call(a, c)
		}
	}
};
Ext.CompositeElementLite.importElementMethods();
if (Ext.DomQuery) {
	Ext.Element.selectorFunction = Ext.DomQuery.select
}
Ext.Element.select = function(a, b) {
	var c;
	if (typeof a == "string") {
		c = Ext.Element.selectorFunction(a, b)
	} else {
		if (a.length !== undefined) {
			c = a
		} else {
			throw "Invalid selector"
		}
	}
	return new Ext.CompositeElementLite(c)
};
Ext.select = Ext.Element.select;
( function() {
	var b = "beforerequest", e = "requestcomplete", d = "requestexception", h = undefined, c = "load", i = "POST", a = "GET", g = window;
	Ext.data.Connection = function(k) {
		Ext.apply(this, k);
		this.addEvents(b, e, d);
		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(q) {
							var t = this;
							if (t.fireEvent(b, t, q)) {
								if (q.el) {
									if (!Ext.isEmpty(q.indicatorText)) {
										t.indicatorText = '<div class="loading-indicator">'
												+ q.indicatorText + "</div>"
									}
									if (t.indicatorText) {
										Ext.getDom(q.el).innerHTML = t.indicatorText
									}
									q.success = (Ext.isFunction(q.success) ? q.success
											: function() {
											})
											.createInterceptor( function(o) {
												Ext.getDom(q.el).innerHTML = o.responseText
											})
								}
								var m = q.params, l = q.url || t.url, k, r = {
									success :t.handleResponse,
									failure :t.handleFailure,
									scope :t,
									argument : {
										options :q
									},
									timeout :Ext.num(q.timeout, t.timeout)
								}, n, u;
								if (Ext.isFunction(m)) {
									m = m.call(q.scope || g, q)
								}
								m = Ext.urlEncode(t.extraParams, Ext
										.isObject(m) ? Ext.urlEncode(m) : m);
								if (Ext.isFunction(l)) {
									l = l.call(q.scope || g, q)
								}
								if ((n = Ext.getDom(q.form))) {
									l = l || n.action;
									if (q.isUpload
											|| (/multipart\/form-data/i.test(n
													.getAttribute("enctype")))) {
										return t.doFormUpload.call(t, q, m, l)
									}
									u = Ext.lib.Ajax.serializeForm(n);
									m = m ? (m + "&" + u) : u
								}
								k = q.method
										|| t.method
										|| ((m || q.xmlData || q.jsonData) ? i
												: a);
								if (k === a
										&& (t.disableCaching && q.disableCaching !== false)
										|| q.disableCaching === true) {
									var s = q.disableCachingParam
											|| t.disableCachingParam;
									l = Ext.urlAppend(l, s + "="
											+ (new Date().getTime()))
								}
								q.headers = Ext.apply(q.headers || {},
										t.defaultHeaders || {});
								if (q.autoAbort === true || t.autoAbort) {
									t.abort()
								}
								if ((k == a || q.xmlData || q.jsonData) && m) {
									l = Ext.urlAppend(l, m);
									m = ""
								}
								return (t.transId = Ext.lib.Ajax.request(k, l,
										r, m, q))
							} else {
								return q.callback ? q.callback.apply(q.scope, [
										q, h, h ]) : null
							}
						},
						isLoading : function(k) {
							return k ? Ext.lib.Ajax.isCallInProgress(k)
									: !!this.transId
						},
						abort : function(k) {
							if (k || this.isLoading()) {
								Ext.lib.Ajax.abort(k || this.transId)
							}
						},
						handleResponse : function(k) {
							this.transId = false;
							var l = k.argument.options;
							k.argument = l ? l.argument : null;
							this.fireEvent(e, this, k, l);
							if (l.success) {
								l.success.call(l.scope, k, l)
							}
							if (l.callback) {
								l.callback.call(l.scope, l, true, k)
							}
						},
						handleFailure : function(k, m) {
							this.transId = false;
							var l = k.argument.options;
							k.argument = l ? l.argument : null;
							this.fireEvent(d, this, k, l, m);
							if (l.failure) {
								l.failure.call(l.scope, k, l)
							}
							if (l.callback) {
								l.callback.call(l.scope, l, false, k)
							}
						},
						doFormUpload : function(r, k, l) {
							var m = Ext.id(), w = document, s = w
									.createElement("iframe"), n = Ext
									.getDom(r.form), v = [], u, q = "multipart/form-data", p = {
								target :n.target,
								method :n.method,
								encoding :n.encoding,
								enctype :n.enctype,
								action :n.action
							};
							Ext.fly(s).set( {
								id :m,
								name :m,
								cls :"x-hidden",
								src :Ext.SSL_SECURE_URL
							});
							w.body.appendChild(s);
							if (Ext.isIE) {
								document.frames[m].name = m
							}
							Ext.fly(n).set( {
								target :m,
								method :i,
								enctype :q,
								encoding :q,
								action :l || p.action
							});
							Ext.iterate(Ext.urlDecode(k, false),
									function(x, o) {
										u = w.createElement("input");
										Ext.fly(u).set( {
											type :"hidden",
											value :o,
											name :x
										});
										n.appendChild(u);
										v.push(u)
									});
							function t() {
								var y = this, x = {
									responseText :"",
									responseXML :null,
									argument :r.argument
								}, B, A;
								try {
									B = s.contentWindow.document
											|| s.contentDocument
											|| g.frames[m].document;
									if (B) {
										if (B.body) {
											if (/textarea/i
													.test((A = B.body.firstChild
															|| {}).tagName)) {
												x.responseText = A.value
											} else {
												x.responseText = B.body.innerHTML
											}
										}
										x.responseXML = B.XMLDocument || B
									}
								} catch (z) {
								}
								Ext.EventManager.removeListener(s, c, t, y);
								y.fireEvent(e, y, x, r);
								function o(E, D, C) {
									if (Ext.isFunction(E)) {
										E.apply(D, C)
									}
								}
								o(r.success, r.scope, [ x, r ]);
								o(r.callback, r.scope, [ r, true, x ]);
								if (!y.debugUploads) {
									setTimeout( function() {
										Ext.removeNode(s)
									}, 100)
								}
							}
							Ext.EventManager.on(s, c, t, this);
							n.submit();
							Ext.fly(n).set(p);
							Ext.each(v, function(o) {
								Ext.removeNode(o)
							})
						}
					})
})();
Ext.Ajax = new Ext.data.Connection( {
	autoAbort :false,
	serializeForm : function(a) {
		return Ext.lib.Ajax.serializeForm(a)
	}
});
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) {
		if(json.indexOf("<pre>") != -1){
			json = json.replace("<pre>", "");	
		}
		if(json.lastIndexOf("</pre>") != -1){
			json = json.replace("</pre>", "");	
		}
		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 A, q, k = false, m = Ext.isGecko || Ext.isWebKit || Ext.isSafari, p = Ext.lib.Event, r = Ext.lib.Dom, c = document, B = window, s = "DOMContentLoaded", u = "complete", g = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/, v = [];
	function o(F) {
		var I = false, E = 0, D = v.length, G = false, H;
		if (F) {
			if (F.getElementById || F.navigator) {
				for (; E < D; ++E) {
					H = v[E];
					if (H.el === F) {
						I = H.id;
						break
					}
				}
				if (!I) {
					I = Ext.id(F);
					v.push( {
						id :I,
						el :F
					});
					G = true
				}
			} else {
				I = Ext.id(F)
			}
			if (!Ext.elCache[I]) {
				Ext.Element.addToCache(new Ext.Element(F), I);
				if (G) {
					Ext.elCache[I].skipGC = true
				}
			}
		}
		return I
	}
	function n(F, H, K, G, E, M) {
		F = Ext.getDom(F);
		var D = o(F), L = Ext.elCache[D].events, I;
		I = p.on(F, H, E);
		L[H] = L[H] || [];
		L[H].push( [ K, E, M, I, G ]);
		if (F.addEventListener && H == "mousewheel") {
			var J = [ "DOMMouseScroll", E, false ];
			F.addEventListener.apply(F, J);
			Ext.EventManager.addListener(B, "unload", function() {
				F.removeEventListener.apply(F, J)
			})
		}
		if (F == c && H == "mousedown") {
			Ext.EventManager.stoppedMouseDownEvent.addListener(E)
		}
	}
	function d() {
		if (window != top) {
			return false
		}
		try {
			c.documentElement.doScroll("left")
		} catch (D) {
			return false
		}
		b();
		return true
	}
	function C(D) {
		if (Ext.isIE && d()) {
			return true
		}
		if (c.readyState == u) {
			b();
			return true
		}
		k || (q = setTimeout(arguments.callee, 2));
		return false
	}
	var l;
	function i(D) {
		l || (l = Ext.query("style, link[rel=stylesheet]"));
		if (l.length == c.styleSheets.length) {
			b();
			return true
		}
		k || (q = setTimeout(arguments.callee, 2));
		return false
	}
	function z(D) {
		c.removeEventListener(s, arguments.callee, false);
		i()
	}
	function b(D) {
		if (!k) {
			k = true;
			if (q) {
				clearTimeout(q)
			}
			if (m) {
				c.removeEventListener(s, b, false)
			}
			if (Ext.isIE && C.bindIE) {
				c.detachEvent("onreadystatechange", C)
			}
			p.un(B, "load", arguments.callee)
		}
		if (A && !Ext.isReady) {
			Ext.isReady = true;
			A.fire();
			A.listeners = []
		}
	}
	function a() {
		A || (A = new Ext.util.Event());
		if (m) {
			c.addEventListener(s, b, false)
		}
		if (Ext.isIE) {
			if (!C()) {
				C.bindIE = true;
				c.attachEvent("onreadystatechange", C)
			}
		} else {
			if (Ext.isOpera) {
				(c.readyState == u && i()) || c.addEventListener(s, z, false)
			} else {
				if (Ext.isWebKit) {
					C()
				}
			}
		}
		p.on(B, "load", b)
	}
	function y(D, E) {
		return function() {
			var F = Ext.toArray(arguments);
			if (E.target == Ext.EventObject.setEvent(F[0]).target) {
				D.apply(this, F)
			}
		}
	}
	function x(E, F, D) {
		return function(G) {
			D.delay(F.buffer, E, null, [ new Ext.EventObjectImpl(G) ])
		}
	}
	function t(H, G, D, F, E) {
		return function(I) {
			Ext.EventManager.removeListener(G, D, F, E);
			H(I)
		}
	}
	function e(E, F, D) {
		return function(H) {
			var G = new Ext.util.DelayedTask(E);
			if (!D.tasks) {
				D.tasks = []
			}
			D.tasks.push(G);
			G.delay(F.delay || 10, E, null, [ new Ext.EventObjectImpl(H) ])
		}
	}
	function h(I, H, D, K, L) {
		var E = (!D || typeof D == "boolean") ? {} : D, F = Ext.getDom(I), G;
		K = K || E.fn;
		L = L || E.scope;
		if (!F) {
			throw 'Error listening for "' + H + '". Element "' + I
					+ "\" doesn't exist."
		}
		function J(N) {
			if (!Ext) {
				return
			}
			N = Ext.EventObject.setEvent(N);
			var M;
			if (E.delegate) {
				if (!(M = N.getTarget(E.delegate, F))) {
					return
				}
			} else {
				M = N.target
			}
			if (E.stopEvent) {
				N.stopEvent()
			}
			if (E.preventDefault) {
				N.preventDefault()
			}
			if (E.stopPropagation) {
				N.stopPropagation()
			}
			if (E.normalized === false) {
				N = N.browserEvent
			}
			K.call(L || F, N, M, E)
		}
		if (E.target) {
			J = y(J, E)
		}
		if (E.delay) {
			J = e(J, E, K)
		}
		if (E.single) {
			J = t(J, F, H, K, L)
		}
		if (E.buffer) {
			G = new Ext.util.DelayedTask(J);
			J = x(J, E, G)
		}
		n(F, H, K, G, J, L);
		return J
	}
	var w = {
		addListener : function(F, D, H, G, E) {
			if (typeof D == "object") {
				var K = D, I, J;
				for (I in K) {
					J = K[I];
					if (!g.test(I)) {
						if (Ext.isFunction(J)) {
							h(F, I, K, J, K.scope)
						} else {
							h(F, I, J)
						}
					}
				}
			} else {
				h(F, D, E, H, G)
			}
		},
		removeListener : function(F, J, N, O) {
			F = Ext.getDom(F);
			var D = o(F), L = F && (Ext.elCache[D].events)[J] || [], E, I, G, H, K, M;
			for (I = 0, K = L.length; I < K; I++) {
				if (Ext.isArray(M = L[I]) && M[0] == N && (!O || M[2] == O)) {
					if (M[4]) {
						M[4].cancel()
					}
					H = N.tasks && N.tasks.length;
					if (H) {
						while (H--) {
							N.tasks[H].cancel()
						}
						delete N.tasks
					}
					E = M[1];
					p.un(F, J, p.extAdapter ? M[3] : E);
					if (E && F.addEventListener && J == "mousewheel") {
						F.removeEventListener("DOMMouseScroll", E, false)
					}
					if (E && F == c && J == "mousedown") {
						Ext.EventManager.stoppedMouseDownEvent
								.removeListener(E)
					}
					L.splice(I, 1);
					if (L.length === 0) {
						delete Ext.elCache[D].events[J]
					}
					for (H in Ext.elCache[D].events) {
						return false
					}
					Ext.elCache[D].events = {};
					return false
				}
			}
		},
		removeAll : function(F) {
			F = Ext.getDom(F);
			var E = o(F), K = Ext.elCache[E] || {}, N = K.events || {}, J, I, L, G, M, H, D;
			for (G in N) {
				if (N.hasOwnProperty(G)) {
					J = N[G];
					for (I = 0, L = J.length; I < L; I++) {
						M = J[I];
						if (M[4]) {
							M[4].cancel()
						}
						if (M[0].tasks && (H = M[0].tasks.length)) {
							while (H--) {
								M[0].tasks[H].cancel()
							}
							delete M.tasks
						}
						D = M[1];
						p.un(F, G, p.extAdapter ? M[3] : D);
						if (F.addEventListener && D && G == "mousewheel") {
							F.removeEventListener("DOMMouseScroll", D, false)
						}
						if (D && F == c && G == "mousedown") {
							Ext.EventManager.stoppedMouseDownEvent
									.removeListener(D)
						}
					}
				}
			}
			if (Ext.elCache[E]) {
				Ext.elCache[E].events = {}
			}
		},
		getListeners : function(G, D) {
			G = Ext.getDom(G);
			var I = o(G), E = Ext.elCache[I] || {}, H = E.events || {}, F = [];
			if (H && H[D]) {
				return H[D]
			} else {
				return null
			}
		},
		purgeElement : function(F, D, H) {
			F = Ext.getDom(F);
			var E = o(F), K = Ext.elCache[E] || {}, L = K.events || {}, G, J, I;
			if (H) {
				if (L && L.hasOwnProperty(H)) {
					J = L[H];
					for (G = 0, I = J.length; G < I; G++) {
						Ext.EventManager.removeListener(F, H, J[G][0])
					}
				}
			} else {
				Ext.EventManager.removeAll(F)
			}
			if (D && F && F.childNodes) {
				for (G = 0, I = F.childNodes.length; G < I; G++) {
					Ext.EventManager.purgeElement(F.childNodes[G], D, H)
				}
			}
		},
		_unload : function() {
			var D;
			for (D in Ext.elCache) {
				Ext.EventManager.removeAll(D)
			}
			delete Ext.elCache;
			delete Ext.Element._flyweights;
			var H, E, G, F = Ext.lib.Ajax;
			(typeof F.conn == "object") ? E = F.conn : E = {};
			for (G in E) {
				H = E[G];
				if (H) {
					F.abort( {
						conn :H,
						tId :G
					})
				}
			}
		},
		onDocumentReady : function(F, E, D) {
			if (Ext.isReady) {
				A || (A = new Ext.util.Event());
				A.addListener(F, E, D);
				A.fire();
				A.listeners = []
			} else {
				if (!A) {
					a()
				}
				D = D || {};
				D.delay = D.delay || 1;
				A.addListener(F, E, D)
			}
		},
		fireDocReady :b
	};
	w.on = w.addListener;
	w.un = w.removeListener;
	w.stoppedMouseDownEvent = new Ext.util.Event();
	return w
}();
Ext.onReady = Ext.EventManager.onDocumentReady;
( function() {
	var a = function() {
		var c = document.body || document.getElementsByTagName("body")[0];
		if (!c) {
			return false
		}
		var b = [
				" ",
				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) {
			b.push("ext-safari "
					+ (Ext.isSafari2 ? "ext-safari2"
							: (Ext.isSafari3 ? "ext-safari3" : "ext-safari4")))
		} else {
			if (Ext.isChrome) {
				b.push("ext-chrome")
			}
		}
		if (Ext.isMac) {
			b.push("ext-mac")
		}
		if (Ext.isLinux) {
			b.push("ext-linux")
		}
		if (Ext.isStrict || Ext.isBorderBox) {
			var d = c.parentNode;
			if (d) {
				Ext
						.fly(d, "_internal")
						.addClass(
								((Ext.isStrict && Ext.isIE) || (!Ext.enableForcedBoxModel && !Ext.isIE)) ? " ext-strict"
										: " ext-border-box")
			}
		}
		if (Ext.enableForcedBoxModel && !Ext.isIE) {
			Ext.isForcedBorderBox = true;
			b.push("ext-forced-border-box")
		}
		Ext.fly(c, "_internal").addClass(b);
		return true
	};
	if (!a()) {
		Ext.onReady(a)
	}
})();
( function() {
	var b = Ext.apply(Ext.supports, {
		correctRightMargin :true,
		correctTransparentColor :true,
		cssFloat :true
	});
	var a = function() {
		var g = document.createElement("div"), e = document, c, d;
		g.innerHTML = '<div style="height:30px;width:50px;"><div style="height:20px;width:20px;"></div></div><div style="float:left;background-color:transparent;">';
		e.body.appendChild(g);
		d = g.lastChild;
		if ((c = e.defaultView)) {
			if (c.getComputedStyle(g.firstChild.firstChild, null).marginRight != "0px") {
				b.correctRightMargin = false
			}
			if (c.getComputedStyle(d, null).backgroundColor != "transparent") {
				b.correctTransparentColor = false
			}
		}
		b.cssFloat = !!d.style.cssFloat;
		e.body.removeChild(g)
	};
	if (Ext.isReady) {
		a()
	} else {
		Ext.onReady(a)
	}
})();
Ext.EventObject = function() {
	var b = Ext.lib.Event, c = /(dbl)?click/, a = {
		3 :13,
		63234 :37,
		63235 :39,
		63232 :38,
		63233 :40,
		63276 :33,
		63277 :34,
		63272 :46,
		63273 :36,
		63275 :35
	}, d = Ext.isIE ? {
		1 :0,
		4 :1,
		2 :2
	} : {
		0 :0,
		1 :1,
		2 :2
	};
	Ext.EventObjectImpl = function(g) {
		if (g) {
			this.setEvent(g.browserEvent || g)
		}
	};
	Ext.EventObjectImpl.prototype = {
		setEvent : function(h) {
			var g = this;
			if (h == g || (h && h.browserEvent)) {
				return h
			}
			g.browserEvent = h;
			if (h) {
				g.button = h.button ? d[h.button]
						: (h.which ? h.which - 1 : -1);
				if (c.test(h.type) && g.button == -1) {
					g.button = 0
				}
				g.type = h.type;
				g.shiftKey = h.shiftKey;
				g.ctrlKey = h.ctrlKey || h.metaKey || false;
				g.altKey = h.altKey;
				g.keyCode = h.keyCode;
				g.charCode = h.charCode;
				g.target = b.getTarget(h);
				g.xy = b.getXY(h)
			} else {
				g.button = -1;
				g.shiftKey = false;
				g.ctrlKey = false;
				g.altKey = false;
				g.keyCode = 0;
				g.charCode = 0;
				g.target = null;
				g.xy = [ 0, 0 ]
			}
			return g
		},
		stopEvent : function() {
			var e = this;
			if (e.browserEvent) {
				if (e.browserEvent.type == "mousedown") {
					Ext.EventManager.stoppedMouseDownEvent.fire(e)
				}
				b.stopEvent(e.browserEvent)
			}
		},
		preventDefault : function() {
			if (this.browserEvent) {
				b.preventDefault(this.browserEvent)
			}
		},
		stopPropagation : function() {
			var e = this;
			if (e.browserEvent) {
				if (e.browserEvent.type == "mousedown") {
					Ext.EventManager.stoppedMouseDownEvent.fire(e)
				}
				b.stopPropagation(e.browserEvent)
			}
		},
		getCharCode : function() {
			return this.charCode || this.keyCode
		},
		getKey : function() {
			return this.normalizeKey(this.keyCode || this.charCode)
		},
		normalizeKey : function(e) {
			return Ext.isSafari ? (a[e] || e) : e
		},
		getPageX : function() {
			return this.xy[0]
		},
		getPageY : function() {
			return this.xy[1]
		},
		getXY : function() {
			return this.xy
		},
		getTarget : function(g, h, e) {
			return g ? Ext.fly(this.target).findParent(g, h, e) : (e ? Ext
					.get(this.target) : this.target)
		},
		getRelatedTarget : function() {
			return this.browserEvent ? b.getRelatedTarget(this.browserEvent)
					: null
		},
		getWheelDelta : function() {
			var g = this.browserEvent;
			var h = 0;
			if (g.wheelDelta) {
				h = g.wheelDelta / 120
			} else {
				if (g.detail) {
					h = -g.detail / 3
				}
			}
			return h
		},
		within : function(h, i, e) {
			if (h) {
				var g = this[i ? "getRelatedTarget" : "getTarget"]();
				return g
						&& ((e ? (g == Ext.getDom(h)) : false) || Ext.fly(h)
								.contains(g))
			}
			return false
		}
	};
	return new Ext.EventObjectImpl()
}();
Ext.Loader = Ext
		.apply(
				{},
				{
					load : function(k, i, l, c) {
						var l = l || this, g = document
								.getElementsByTagName("head")[0], b = document
								.createDocumentFragment(), a = k.length, h = 0, e = this;
						var m = function(n) {
							g.appendChild(e.buildScriptTag(k[n], d))
						};
						var d = function() {
							h++;
							if (a == h && typeof i == "function") {
								i.call(l)
							} else {
								if (c === true) {
									m(h)
								}
							}
						};
						if (c === true) {
							m.call(this, 0)
						} else {
							Ext.each(k, function(o, n) {
								b.appendChild(this.buildScriptTag(o, d))
							}, this);
							g.appendChild(b)
						}
					},
					buildScriptTag : function(b, c) {
						var a = document.createElement("script");
						a.type = "text/javascript";
						a.src = b;
						if (a.readyState) {
							a.onreadystatechange = function() {
								if (a.readyState == "loaded"
										|| a.readyState == "complete") {
									a.onreadystatechange = null;
									c()
								}
							}
						} else {
							a.onload = c
						}
						return a
					}
				});
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 c = Ext, a = 0, b = 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(d, e) {
							return Ext.extend(d, e(d.prototype))
						},
						getDoc : function() {
							return Ext.get(document)
						},
						num : function(e, d) {
							e = Number(Ext.isEmpty(e)
									|| Ext.isArray(e)
									|| typeof e == "boolean"
									|| (typeof e == "string" && e.trim().length == 0) ? NaN
									: e);
							return isNaN(e) ? d : e
						},
						value : function(g, d, e) {
							return Ext.isEmpty(g, e) ? d : g
						},
						escapeRe : function(d) {
							return d
									.replace(/([-.*+?^${}()|[\]\/\\])/g, "\\$1")
						},
						sequence : function(h, d, g, e) {
							h[d] = h[d].createSequence(g, e)
						},
						addBehaviors : function(i) {
							if (!Ext.isReady) {
								Ext.onReady( function() {
									Ext.addBehaviors(i)
								})
							} else {
								var e = {}, h, d, g;
								for (d in i) {
									if ((h = d.split("@"))[1]) {
										g = h[0];
										if (!e[g]) {
											e[g] = Ext.select(g)
										}
										e[g].on(h[1], i[d])
									}
								}
								e = null
							}
						},
						getScrollBarWidth : function(g) {
							if (!Ext.isReady) {
								return 0
							}
							if (g === true || b === null) {
								var i = Ext
										.getBody()
										.createChild(
												'<div class="x-hide-offsets" style="width:100px;height:50px;overflow:hidden;"><div style="height:200px;"></div></div>'), h = i
										.child("div", true);
								var e = h.offsetWidth;
								i.setStyle("overflow",
										(Ext.isWebKit || Ext.isGecko) ? "auto"
												: "scroll");
								var d = h.offsetWidth;
								i.remove();
								b = e - d + 2
							}
							return b
						},
						combine : function() {
							var g = arguments, e = g.length, k = [];
							for ( var h = 0; h < e; h++) {
								var d = g[h];
								if (Ext.isArray(d)) {
									k = k.concat(d)
								} else {
									if (d.length !== undefined && !d.substr) {
										k = k.concat(Array.prototype.slice
												.call(d, 0))
									} else {
										k.push(d)
									}
								}
							}
							return k
						},
						copyTo : function(d, e, g) {
							if (typeof g == "string") {
								g = g.split(/[,;\s]/)
							}
							Ext.each(g, function(h) {
								if (e.hasOwnProperty(h)) {
									d[h] = e[h]
								}
							}, this);
							return d
						},
						destroy : function() {
							Ext.each(arguments, function(d) {
								if (d) {
									if (Ext.isArray(d)) {
										this.destroy.apply(this, d)
									} else {
										if (typeof d.destroy == "function") {
											d.destroy()
										} else {
											if (d.dom) {
												d.remove()
											}
										}
									}
								}
							}, this)
						},
						destroyMembers : function(m, k, g, h) {
							for ( var l = 1, e = arguments, d = e.length; l < d; l++) {
								Ext.destroy(m[e[l]]);
								delete m[e[l]]
							}
						},
						clean : function(d) {
							var e = [];
							Ext.each(d, function(g) {
								if (!!g) {
									e.push(g)
								}
							});
							return e
						},
						unique : function(d) {
							var e = [], g = {};
							Ext.each(d, function(h) {
								if (!g[h]) {
									e.push(h)
								}
								g[h] = true
							});
							return e
						},
						flatten : function(d) {
							var g = [];
							function e(h) {
								Ext.each(h, function(i) {
									if (Ext.isArray(i)) {
										e(i)
									} else {
										g.push(i)
									}
								});
								return g
							}
							return e(d)
						},
						min : function(d, e) {
							var g = d[0];
							e = e || function(i, h) {
								return i < h ? -1 : 1
							};
							Ext.each(d, function(h) {
								g = e(g, h) == -1 ? g : h
							});
							return g
						},
						max : function(d, e) {
							var g = d[0];
							e = e || function(i, h) {
								return i > h ? 1 : -1
							};
							Ext.each(d, function(h) {
								g = e(g, h) == 1 ? g : h
							});
							return g
						},
						mean : function(d) {
							return d.length > 0 ? Ext.sum(d) / d.length
									: undefined
						},
						sum : function(d) {
							var e = 0;
							Ext.each(d, function(g) {
								e += g
							});
							return e
						},
						partition : function(d, e) {
							var g = [ [], [] ];
							Ext.each(d, function(k, l, h) {
								g[(e && e(k, l, h)) || (!e && k) ? 0 : 1]
										.push(k)
							});
							return g
						},
						invoke : function(d, e) {
							var h = [], g = Array.prototype.slice.call(
									arguments, 2);
							Ext.each(d, function(k, l) {
								if (k && typeof k[e] == "function") {
									h.push(k[e].apply(k, g))
								} else {
									h.push(undefined)
								}
							});
							return h
						},
						pluck : function(d, g) {
							var e = [];
							Ext.each(d, function(h) {
								e.push(h[g])
							});
							return e
						},
						zip : function() {
							var n = Ext.partition(arguments, function(i) {
								return typeof i != "function"
							}), k = n[0], m = n[1][0], d = Ext.max(Ext.pluck(k,
									"length")), h = [];
							for ( var l = 0; l < d; l++) {
								h[l] = [];
								if (m) {
									h[l] = m.apply(m, Ext.pluck(k, l))
								} else {
									for ( var g = 0, e = k.length; g < e; g++) {
										h[l].push(k[g][l])
									}
								}
							}
							return h
						},
						getCmp : function(d) {
							return Ext.ComponentMgr.get(d)
						},
						useShims :c.isIE6 || (c.isMac && c.isGecko2),
						type : function(e) {
							if (e === undefined || e === null) {
								return false
							}
							if (e.htmlElement) {
								return "element"
							}
							var d = typeof e;
							if (d == "object" && e.nodeName) {
								switch (e.nodeType) {
								case 1:
									return "element";
								case 3:
									return (/\S/).test(e.nodeValue) ? "textnode"
											: "whitespace"
								}
							}
							if (d == "object" || d == "function") {
								switch (e.constructor) {
								case Array:
									return "array";
								case RegExp:
									return "regexp";
								case Date:
									return "date"
								}
								if (typeof e.length == "number"
										&& typeof e.item == "function") {
									return "nodelist"
								}
							}
							return d
						},
						intercept : function(h, d, g, e) {
							h[d] = h[d].createInterceptor(g, e)
						},
						callback : function(d, h, g, e) {
							if (typeof d == "function") {
								if (e) {
									d.defer(e, h, g || [])
								} else {
									d.apply(h, g || [])
								}
							}
						}
					}
				}());
Ext.apply(Function.prototype, {
	createSequence : function(b, a) {
		var c = this;
		return (typeof b != "function") ? this : function() {
			var d = c.apply(this || window, arguments);
			b.apply(a || this || window, arguments);
			return d
		}
	}
});
Ext.applyIf(String, {
	escape : function(a) {
		return a.replace(/('|\\)/g, "\\$1")
	},
	leftPad : function(d, b, c) {
		var a = String(d);
		if (!c) {
			c = " "
		}
		while (a.length < b) {
			a = c + a
		}
		return a
	}
});
String.prototype.toggle = function(b, a) {
	return this == b ? a : b
};
String.prototype.trim = function() {
	var a = /^\s+|\s+$/g;
	return function() {
		return this.replace(a, "")
	}
}();
Date.prototype.getElapsed = function(a) {
	return Math.abs((a || new Date()).getTime() - this.getTime())
};
Ext.applyIf(Number.prototype, {
	constrain : function(b, a) {
		return Math.min(Math.max(this, b), a)
	}
});
Ext.lib.Dom.getRegion = function(a) {
	return Ext.lib.Region.getRegion(a)
};
Ext.lib.Region = function(d, g, a, c) {
	var e = this;
	e.top = d;
	e[1] = d;
	e.right = g;
	e.bottom = a;
	e.left = c;
	e[0] = c
};
Ext.lib.Region.prototype = {
	contains : function(b) {
		var a = this;
		return (b.left >= a.left && b.right <= a.right && b.top >= a.top && b.bottom <= a.bottom)
	},
	getArea : function() {
		var a = this;
		return ((a.bottom - a.top) * (a.right - a.left))
	},
	intersect : function(h) {
		var g = this, d = Math.max(g.top, h.top), e = Math
				.min(g.right, h.right), a = Math.min(g.bottom, h.bottom), c = Math
				.max(g.left, h.left);
		if (a >= d && e >= c) {
			return new Ext.lib.Region(d, e, a, c)
		}
	},
	union : function(h) {
		var g = this, d = Math.min(g.top, h.top), e = Math
				.max(g.right, h.right), a = Math.max(g.bottom, h.bottom), c = Math
				.min(g.left, h.left);
		return new Ext.lib.Region(d, e, a, c)
	},
	constrainTo : function(b) {
		var a = this;
		a.top = a.top.constrain(b.top, b.bottom);
		a.bottom = a.bottom.constrain(b.top, b.bottom);
		a.left = a.left.constrain(b.left, b.right);
		a.right = a.right.constrain(b.left, b.right);
		return a
	},
	adjust : function(d, c, a, g) {
		var e = this;
		e.top += d;
		e.left += c;
		e.right += g;
		e.bottom += a;
		return e
	}
};
Ext.lib.Region.getRegion = function(e) {
	var h = Ext.lib.Dom.getXY(e), d = h[1], g = h[0] + e.offsetWidth, a = h[1]
			+ e.offsetHeight, c = h[0];
	return new Ext.lib.Region(d, g, a, c)
};
Ext.lib.Point = function(a, c) {
	if (Ext.isArray(a)) {
		c = a[1];
		a = a[0]
	}
	var b = this;
	b.x = b.right = b.left = b[0] = a;
	b.y = b.top = b.bottom = b[1] = c
};
Ext.lib.Point.prototype = new Ext.lib.Region();
Ext
		.apply(
				Ext.DomHelper,
				function() {
					var e, a = "afterbegin", h = "afterend", i = "beforebegin", d = "beforeend", b = /tag|children|cn|html$/i;
					function g(n, q, p, r, m, k) {
						n = Ext.getDom(n);
						var l;
						if (e.useDom) {
							l = c(q, null);
							if (k) {
								n.appendChild(l)
							} else {
								(m == "firstChild" ? n : n.parentNode)
										.insertBefore(l, n[m] || n)
							}
						} else {
							l = Ext.DomHelper.insertHtml(r, n, Ext.DomHelper
									.createHtml(q))
						}
						return p ? Ext.get(l, true) : l
					}
					function c(k, s) {
						var m, v = document, q, t, n, u;
						if (Ext.isArray(k)) {
							m = v.createDocumentFragment();
							for ( var r = 0, p = k.length; r < p; r++) {
								c(k[r], m)
							}
						} else {
							if (typeof k == "string") {
								m = v.createTextNode(k)
							} else {
								m = v.createElement(k.tag || "div");
								q = !!m.setAttribute;
								for ( var t in k) {
									if (!b.test(t)) {
										n = k[t];
										if (t == "cls") {
											m.className = n
										} else {
											if (q) {
												m.setAttribute(t, n)
											} else {
												m[t] = n
											}
										}
									}
								}
								Ext.DomHelper.applyStyles(m, k.style);
								if ((u = k.children || k.cn)) {
									c(u, m)
								} else {
									if (k.html) {
										m.innerHTML = k.html
									}
								}
							}
						}
						if (s) {
							s.appendChild(m)
						}
						return m
					}
					e = {
						createTemplate : function(l) {
							var k = Ext.DomHelper.createHtml(l);
							return new Ext.Template(k)
						},
						useDom :false,
						insertBefore : function(k, m, l) {
							return g(k, m, l, i)
						},
						insertAfter : function(k, m, l) {
							return g(k, m, l, h, "nextSibling")
						},
						insertFirst : function(k, m, l) {
							return g(k, m, l, a, "firstChild")
						},
						append : function(k, m, l) {
							return g(k, m, l, d, "", true)
						},
						createDom :c
					};
					return e
				}());
Ext
		.apply(
				Ext.Template.prototype,
				{
					disableFormats :false,
					re :/\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,
					argsRe :/^\s*['"](.*)["']\s*$/,
					compileARe :/\\/g,
					compileBRe :/(\r\n|\n)/g,
					compileCRe :/'/g,
					applyTemplate : function(b) {
						var g = this, a = g.disableFormats !== true, e = Ext.util.Format, c = g;
						if (g.compiled) {
							return g.compiled(b)
						}
						function d(k, n, q, l) {
							if (q && a) {
								if (q.substr(0, 5) == "this.") {
									return c.call(q.substr(5), b[n], b)
								} else {
									if (l) {
										var p = g.argsRe;
										l = l.split(",");
										for ( var o = 0, h = l.length; o < h; o++) {
											l[o] = l[o].replace(p, "$1")
										}
										l = [ b[n] ].concat(l)
									} else {
										l = [ b[n] ]
									}
									return e[q].apply(e, l)
								}
							} else {
								return b[n] !== undefined ? b[n] : ""
							}
						}
						return g.html.replace(g.re, d)
					},
					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 + "'"
						}
						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
					},
					call : function(c, b, a) {
						return this[c](b, a)
					}
				});
Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
Ext.util.Functions = {
	createInterceptor : function(c, b, a) {
		var d = c;
		if (!Ext.isFunction(b)) {
			return c
		} else {
			return function() {
				var g = this, e = arguments;
				b.target = g;
				b.method = c;
				return (b.apply(a || g || window, e) !== false) ? c.apply(g
						|| window, e) : null
			}
		}
	},
	createDelegate : function(c, d, b, a) {
		if (!Ext.isFunction(c)) {
			return c
		}
		return function() {
			var g = b || arguments;
			if (a === true) {
				g = Array.prototype.slice.call(arguments, 0);
				g = g.concat(b)
			} else {
				if (Ext.isNumber(a)) {
					g = Array.prototype.slice.call(arguments, 0);
					var e = [ a, 0 ].concat(b);
					Array.prototype.splice.apply(g, e)
				}
			}
			return c.apply(d || window, g)
		}
	},
	defer : function(d, c, e, b, a) {
		d = Ext.util.Functions.createDelegate(d, e, b, a);
		if (c > 0) {
			return setTimeout(d, c)
		}
		d();
		return 0
	},
	createSequence : function(c, b, a) {
		if (!Ext.isFunction(b)) {
			return c
		} else {
			return function() {
				var d = c.apply(this || window, arguments);
				b.apply(a || this || window, arguments);
				return d
			}
		}
	}
};
Ext.defer = Ext.util.Functions.defer;
Ext.createInterceptor = Ext.util.Functions.createInterceptor;
Ext.createSequence = Ext.util.Functions.createSequence;
Ext.createDelegate = Ext.util.Functions.createDelegate;
Ext
		.apply(
				Ext.util.Observable.prototype,
				function() {
					function a(k) {
						var i = (this.methodEvents = this.methodEvents || {})[k], d, c, g, h = this;
						if (!i) {
							this.methodEvents[k] = i = {};
							i.originalFn = this[k];
							i.methodName = k;
							i.before = [];
							i.after = [];
							var b = function(m, l, e) {
								if ((c = m.apply(l || h, e)) !== undefined) {
									if (typeof c == "object") {
										if (c.returnValue !== undefined) {
											d = c.returnValue
										} else {
											d = c
										}
										g = !!c.cancel
									} else {
										if (c === false) {
											g = true
										} else {
											d = c
										}
									}
								}
							};
							this[k] = function() {
								var m = Array.prototype.slice
										.call(arguments, 0), l;
								d = c = undefined;
								g = false;
								for ( var n = 0, e = i.before.length; n < e; n++) {
									l = i.before[n];
									b(l.fn, l.scope, m);
									if (g) {
										return d
									}
								}
								if ((c = i.originalFn.apply(h, m)) !== undefined) {
									d = c
								}
								for ( var n = 0, e = i.after.length; n < e; n++) {
									l = i.after[n];
									b(l.fn, l.scope, m);
									if (g) {
										return d
									}
								}
								return d
							}
						}
						return i
					}
					return {
						beforeMethod : function(d, c, b) {
							a.call(this, d).before.push( {
								fn :c,
								scope :b
							})
						},
						afterMethod : function(d, c, b) {
							a.call(this, d).after.push( {
								fn :c,
								scope :b
							})
						},
						removeMethodListener : function(k, g, d) {
							var h = this.getMethodEvent(k);
							for ( var c = 0, b = h.before.length; c < b; c++) {
								if (h.before[c].fn == g
										&& h.before[c].scope == d) {
									h.before.splice(c, 1);
									return
								}
							}
							for ( var c = 0, b = h.after.length; c < b; c++) {
								if (h.after[c].fn == g && h.after[c].scope == d) {
									h.after.splice(c, 1);
									return
								}
							}
						},
						relayEvents : function(k, e) {
							var h = this;
							function g(i) {
								return function() {
									return h.fireEvent.apply(h, [ i ]
											.concat(Array.prototype.slice.call(
													arguments, 0)))
								}
							}
							for ( var d = 0, b = e.length; d < b; d++) {
								var c = e[d];
								h.events[c] = h.events[c] || true;
								k.on(c, g(c), h)
							}
						},
						enableBubble : function(e) {
							var g = this;
							if (!Ext.isEmpty(e)) {
								e = Ext.isArray(e) ? e : Array.prototype.slice
										.call(arguments, 0);
								for ( var d = 0, b = e.length; d < b; d++) {
									var c = e[d];
									c = c.toLowerCase();
									var h = g.events[c] || true;
									if (typeof h == "boolean") {
										h = new Ext.util.Event(g, c);
										g.events[c] = h
									}
									h.bubble = true
								}
							}
						}
					}
				}());
Ext.util.Observable.capture = function(c, b, a) {
	c.fireEvent = c.fireEvent.createInterceptor(b, a)
};
Ext.util.Observable.observeClass = function(b, a) {
	if (b) {
		if (!b.fireEvent) {
			Ext.apply(b, new Ext.util.Observable());
			Ext.util.Observable.capture(b.prototype, b.fireEvent, b)
		}
		if (typeof a == "object") {
			b.on(a)
		}
		return b
	}
};
Ext
		.apply(
				Ext.EventManager,
				function() {
					var c, k, e, b, a = Ext.lib.Dom, i = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/, h = 0, g = 0, d = Ext.isWebKit ? Ext
							.num(navigator.userAgent
									.match(/AppleWebKit\/(\d+)/)[1]) >= 525
							: !((Ext.isGecko && !Ext.isWindows) || Ext.isOpera);
					return {
						doResizeEvent : function() {
							var m = a.getViewHeight(), l = a.getViewWidth();
							if (g != m || h != l) {
								c.fire(h = l, g = m)
							}
						},
						onWindowResize : function(n, m, l) {
							if (!c) {
								c = new Ext.util.Event();
								k = new Ext.util.DelayedTask(this.doResizeEvent);
								Ext.EventManager.on(window, "resize",
										this.fireWindowResize, this)
							}
							c.addListener(n, m, l)
						},
						fireWindowResize : function() {
							if (c) {
								k.delay(100)
							}
						},
						onTextResize : function(o, n, l) {
							if (!e) {
								e = new Ext.util.Event();
								var m = new Ext.Element(document
										.createElement("div"));
								m.dom.className = "x-text-resize";
								m.dom.innerHTML = "X";
								m.appendTo(document.body);
								b = m.dom.offsetHeight;
								setInterval( function() {
									if (m.dom.offsetHeight != b) {
										e.fire(b, b = m.dom.offsetHeight)
									}
								}, this.textResizeInterval)
							}
							e.addListener(o, n, l)
						},
						removeResizeListener : function(m, l) {
							if (c) {
								c.removeListener(m, l)
							}
						},
						fireResize : function() {
							if (c) {
								c.fire(a.getViewWidth(), a.getViewHeight())
							}
						},
						textResizeInterval :50,
						ieDeferSrc :false,
						getKeyEvent : function() {
							return d ? "keydown" : "keypress"
						},
						useKeydown :d
					}
				}());
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 b = this, a = this.normalizeKey(b.keyCode);
		return (a >= 33 && a <= 40) || a == b.RETURN || a == b.TAB
				|| a == b.ESC
	},
	isSpecialKey : function() {
		var a = this.normalizeKey(this.keyCode);
		return (this.type == "keypress" && this.ctrlKey)
				|| this.isNavKeyPress() || (a == this.BACKSPACE)
				|| (a >= 16 && a <= 20) || (a >= 44 && a <= 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(a, b) {
				var d = this;
				function c(g) {
					g.stopPropagation();
					if (b) {
						g.preventDefault()
					}
				}
				if (Ext.isArray(a)) {
					Ext.each(a, function(g) {
						d.on(g, c)
					});
					return d
				}
				d.on(a, c);
				return d
			},
			relayEvent : function(a, b) {
				this.on(a, function(c) {
					b.fireEvent(a, c)
				})
			},
			clean : function(b) {
				var d = this, e = d.dom, g = e.firstChild, c = -1;
				if (Ext.Element.data(e, "isCleaned") && b !== true) {
					return d
				}
				while (g) {
					var a = g.nextSibling;
					if (g.nodeType == 3 && !(/\S/.test(g.nodeValue))) {
						e.removeChild(g)
					} else {
						g.nodeIndex = ++c
					}
					g = a
				}
				Ext.Element.data(e, "isCleaned", true);
				return d
			},
			load : function() {
				var a = this.getUpdater();
				a.update.apply(a, 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(a, e, d) {
				a = (typeof a == "object") ? a : {
					tag :"div",
					cls :a
				};
				var c = this, b = e ? Ext.DomHelper.append(e, a, true)
						: Ext.DomHelper.insertBefore(c.dom, a, true);
				if (d && c.setBox && c.getBox) {
					b.setBox(c.getBox())
				}
				return b
			}
		});
Ext.Element.prototype.getUpdateManager = Ext.Element.prototype.getUpdater;
Ext.Element
		.addMethods( {
			getAnchorXY : function(e, m, t) {
				e = (e || "tl").toLowerCase();
				t = t || {};
				var l = this, b = l.dom == document.body || l.dom == document, p = t.width
						|| b ? Ext.lib.Dom.getViewWidth() : l.getWidth(), i = t.height
						|| b ? Ext.lib.Dom.getViewHeight() : l.getHeight(), q, a = Math.round, c = l
						.getXY(), n = l.getScroll(), k = b ? n.left : !m ? c[0]
						: 0, g = b ? n.top : !m ? c[1] : 0, d = {
					c : [ a(p * 0.5), a(i * 0.5) ],
					t : [ a(p * 0.5), 0 ],
					l : [ 0, a(i * 0.5) ],
					r : [ p, a(i * 0.5) ],
					b : [ a(p * 0.5), i ],
					tl : [ 0, 0 ],
					bl : [ 0, i ],
					br : [ p, i ],
					tr : [ p, 0 ]
				};
				q = d[e];
				return [ q[0] + k, q[1] + g ]
			},
			anchorTo : function(b, h, c, a, l, m) {
				var i = this, e = i.dom, k = !Ext.isEmpty(l), d = function() {
					Ext.fly(e).alignTo(b, h, c, a);
					Ext.callback(m, Ext.fly(e))
				}, g = this.getAnchor();
				this.removeAnchor();
				Ext.apply(g, {
					fn :d,
					scroll :k
				});
				Ext.EventManager.onWindowResize(d, null);
				if (k) {
					Ext.EventManager.on(window, "scroll", d, null, {
						buffer :!isNaN(l) ? l : 50
					})
				}
				d.call(i);
				return i
			},
			removeAnchor : function() {
				var b = this, a = this.getAnchor();
				if (a && a.fn) {
					Ext.EventManager.removeResizeListener(a.fn);
					if (a.scroll) {
						Ext.EventManager.un(window, "scroll", a.fn)
					}
					delete a.fn
				}
				return b
			},
			getAnchor : function() {
				var b = Ext.Element.data, c = this.dom;
				if (!c) {
					return
				}
				var a = b(c, "_anchor");
				if (!a) {
					a = b(c, "_anchor", {})
				}
				return a
			},
			getAlignToXY : function(g, B, C) {
				g = Ext.get(g);
				if (!g || !g.dom) {
					throw "Element.alignToXY with an element that doesn't exist"
				}
				C = C || [ 0, 0 ];
				B = (!B || B == "?" ? "tl-bl?"
						: (!(/-/).test(B) && B !== "" ? "tl-" + B : B
								|| "tl-bl")).toLowerCase();
				var L = this, I = L.dom, N, M, q, n, t, G, z, u = Ext.lib.Dom
						.getViewWidth() - 10, H = Ext.lib.Dom.getViewHeight() - 10, b, i, k, l, v, A, O = document, K = O.documentElement, s = O.body, F = (K.scrollLeft
						|| s.scrollLeft || 0) + 5, E = (K.scrollTop
						|| s.scrollTop || 0) + 5, J = false, e = "", a = "", D = B
						.match(/^([a-z]+)-([a-z]+)(\?)?$/);
				if (!D) {
					throw "Element.alignTo with an invalid alignment " + B
				}
				e = D[1];
				a = D[2];
				J = !!D[3];
				N = L.getAnchorXY(e, true);
				M = g.getAnchorXY(a, false);
				q = M[0] - N[0] + C[0];
				n = M[1] - N[1] + C[1];
				if (J) {
					t = L.getWidth();
					G = L.getHeight();
					z = g.getRegion();
					b = e.charAt(0);
					i = e.charAt(e.length - 1);
					k = a.charAt(0);
					l = a.charAt(a.length - 1);
					v = ((b == "t" && k == "b") || (b == "b" && k == "t"));
					A = ((i == "r" && l == "l") || (i == "l" && l == "r"));
					if (q + t > u + F) {
						q = A ? z.left - t : u + F - t
					}
					if (q < F) {
						q = A ? z.right : F
					}
					if (n + G > H + E) {
						n = v ? z.top - G : H + E - G
					}
					if (n < E) {
						n = v ? z.bottom : E
					}
				}
				return [ q, n ]
			},
			alignTo : function(c, a, e, b) {
				var d = this;
				return d.setXY(d.getAlignToXY(c, a, e), d.preanim && !!b ? d
						.preanim(arguments, 3) : false)
			},
			adjustForConstraints : function(c, a, b) {
				return this.getConstrainToXY(a || document, false, b, c) || c
			},
			getConstrainToXY : function(b, a, c, e) {
				var d = {
					top :0,
					left :0,
					bottom :0,
					right :0
				};
				return function(i, B, m, o) {
					i = Ext.get(i);
					m = m ? Ext.applyIf(m, d) : d;
					var A, E, z = 0, v = 0;
					if (i.dom == document.body || i.dom == document) {
						A = Ext.lib.Dom.getViewWidth();
						E = Ext.lib.Dom.getViewHeight()
					} else {
						A = i.dom.clientWidth;
						E = i.dom.clientHeight;
						if (!B) {
							var u = i.getXY();
							z = u[0];
							v = u[1]
						}
					}
					var t = i.getScroll();
					z += m.left + t.left;
					v += m.top + t.top;
					A -= m.right;
					E -= m.bottom;
					var C = z + A, g = v + E, k = o
							|| (!B ? this.getXY() : [ this.getLeft(true),
									this.getTop(true) ]), q = k[0], p = k[1], l = this
							.getConstrainOffset(), r = this.dom.offsetWidth + l, D = this.dom.offsetHeight
							+ l;
					var n = false;
					if ((q + r) > C) {
						q = C - r;
						n = true
					}
					if ((p + D) > g) {
						p = g - D;
						n = true
					}
					if (q < z) {
						q = z;
						n = true
					}
					if (p < v) {
						p = v;
						n = true
					}
					return n ? [ q, p ] : false
				}
			}(),
			getConstrainOffset : function() {
				return 0
			},
			getCenterXY : function() {
				return this.getAlignToXY(document, "c-c")
			},
			center : function(a) {
				return this.alignTo(a || document, "c-c")
			}
		});
Ext.Element.addMethods( {
	select : function(a, b) {
		return Ext.Element.select(a, b, this.dom)
	}
});
Ext.apply(Ext.Element.prototype, function() {
	var c = Ext.getDom, a = Ext.get, b = Ext.DomHelper;
	return {
		insertSibling : function(i, g, h) {
			var k = this, e, d = (g || "before").toLowerCase() == "after", l;
			if (Ext.isArray(i)) {
				l = k;
				Ext.each(i, function(m) {
					e = Ext.fly(l, "_internal").insertSibling(m, g, h);
					if (d) {
						l = e
					}
				});
				return e
			}
			i = i || {};
			if (i.nodeType || i.dom) {
				e = k.dom.parentNode.insertBefore(c(i), d ? k.dom.nextSibling
						: k.dom);
				if (!h) {
					e = a(e)
				}
			} else {
				if (d && !k.dom.nextSibling) {
					e = b.append(k.dom.parentNode, i, !h)
				} else {
					e = b[d ? "insertAfter" : "insertBefore"](k.dom, i, !h)
				}
			}
			return e
		}
	}
}());
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 a = "_internal", b = /(\d+\.?\d+)px/;
			return {
				applyStyles : function(c) {
					Ext.DomHelper.applyStyles(this.dom, c);
					return this
				},
				getStyles : function() {
					var c = {};
					Ext.each(arguments, function(d) {
						c[d] = this.getStyle(d)
					}, this);
					return c
				},
				setOverflow : function(c) {
					var d = this.dom;
					if (c == "auto" && Ext.isMac && Ext.isGecko2) {
						d.style.overflow = "hidden";
						( function() {
							d.style.overflow = "auto"
						}).defer(1)
					} else {
						d.style.overflow = c
					}
				},
				boxWrap : function(c) {
					c = c || "x-box";
					var d = Ext.get(this.insertHtml("beforeBegin",
							"<div class='" + c + "'>"
									+ String.format(Ext.Element.boxMarkup, c)
									+ "</div>"));
					Ext.DomQuery.selectNode("." + c + "-mc", d.dom)
							.appendChild(this.dom);
					return d
				},
				setSize : function(e, c, d) {
					var g = this;
					if (typeof e == "object") {
						c = e.height;
						e = e.width
					}
					e = g.adjustWidth(e);
					c = g.adjustHeight(c);
					if (!d || !g.anim) {
						g.dom.style.width = g.addUnits(e);
						g.dom.style.height = g.addUnits(c)
					} else {
						g.anim( {
							width : {
								to :e
							},
							height : {
								to :c
							}
						}, g.preanim(arguments, 2))
					}
					return g
				},
				getComputedHeight : function() {
					var d = this, c = Math.max(d.dom.offsetHeight,
							d.dom.clientHeight);
					if (!c) {
						c = parseFloat(d.getStyle("height")) || 0;
						if (!d.isBorderBox()) {
							c += d.getFrameWidth("tb")
						}
					}
					return c
				},
				getComputedWidth : function() {
					var c = Math
							.max(this.dom.offsetWidth, this.dom.clientWidth);
					if (!c) {
						c = parseFloat(this.getStyle("width")) || 0;
						if (!this.isBorderBox()) {
							c += this.getFrameWidth("lr")
						}
					}
					return c
				},
				getFrameWidth : function(d, c) {
					return c && this.isBorderBox() ? 0
							: (this.getPadding(d) + this.getBorderWidth(d))
				},
				addClassOnOver : function(c) {
					this.hover( function() {
						Ext.fly(this, a).addClass(c)
					}, function() {
						Ext.fly(this, a).removeClass(c)
					});
					return this
				},
				addClassOnFocus : function(c) {
					this.on("focus", function() {
						Ext.fly(this, a).addClass(c)
					}, this.dom);
					this.on("blur", function() {
						Ext.fly(this, a).removeClass(c)
					}, this.dom);
					return this
				},
				addClassOnClick : function(c) {
					var d = this.dom;
					this.on("mousedown", function() {
						Ext.fly(d, a).addClass(c);
						var g = Ext.getDoc(), e = function() {
							Ext.fly(d, a).removeClass(c);
							g.removeListener("mouseup", e)
						};
						g.on("mouseup", e)
					});
					return this
				},
				getViewSize : function() {
					var g = document, h = this.dom, c = (h == g || h == g.body);
					if (c) {
						var e = Ext.lib.Dom;
						return {
							width :e.getViewWidth(),
							height :e.getViewHeight()
						}
					} else {
						return {
							width :h.clientWidth,
							height :h.clientHeight
						}
					}
				},
				getStyleSize : function() {
					var k = this, c, i, m = document, n = this.dom, e = (n == m || n == m.body), g = n.style;
					if (e) {
						var l = Ext.lib.Dom;
						return {
							width :l.getViewWidth(),
							height :l.getViewHeight()
						}
					}
					if (g.width && g.width != "auto") {
						c = parseFloat(g.width);
						if (k.isBorderBox()) {
							c -= k.getFrameWidth("lr")
						}
					}
					if (g.height && g.height != "auto") {
						i = parseFloat(g.height);
						if (k.isBorderBox()) {
							i -= k.getFrameWidth("tb")
						}
					}
					return {
						width :c || k.getWidth(true),
						height :i || k.getHeight(true)
					}
				},
				getSize : function(c) {
					return {
						width :this.getWidth(c),
						height :this.getHeight(c)
					}
				},
				repaint : function() {
					var c = this.dom;
					this.addClass("x-repaint");
					setTimeout( function() {
						Ext.fly(c).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(d) {
					var e = this, c, g = {
						t :"top",
						l :"left",
						r :"right",
						b :"bottom"
					}, h = {};
					if (!d) {
						for (c in e.margins) {
							h[g[c]] = parseFloat(e.getStyle(e.margins[c])) || 0
						}
						return h
					} else {
						return e.addStyles.call(e, d, e.margins)
					}
				}
			}
		}());
Ext.Element
		.addMethods( {
			setBox : function(e, g, b) {
				var d = this, a = e.width, c = e.height;
				if ((g && !d.autoBoxAdjust) && !d.isBorderBox()) {
					a -= (d.getBorderWidth("lr") + d.getPadding("lr"));
					c -= (d.getBorderWidth("tb") + d.getPadding("tb"))
				}
				d
						.setBounds(e.x, e.y, a, c, d.animTest.call(d,
								arguments, b, 2));
				return d
			},
			getBox : function(k, q) {
				var n = this, x, e, p, d = n.getBorderWidth, s = n.getPadding, g, a, v, o;
				if (!q) {
					x = n.getXY()
				} else {
					e = parseInt(n.getStyle("left"), 10) || 0;
					p = parseInt(n.getStyle("top"), 10) || 0;
					x = [ e, p ]
				}
				var c = n.dom, u = c.offsetWidth, i = c.offsetHeight, m;
				if (!k) {
					m = {
						x :x[0],
						y :x[1],
						0 :x[0],
						1 :x[1],
						width :u,
						height :i
					}
				} else {
					g = d.call(n, "l") + s.call(n, "l");
					a = d.call(n, "r") + s.call(n, "r");
					v = d.call(n, "t") + s.call(n, "t");
					o = d.call(n, "b") + s.call(n, "b");
					m = {
						x :x[0] + g,
						y :x[1] + v,
						0 :x[0] + g,
						1 :x[1] + v,
						width :u - (g + a),
						height :i - (v + o)
					}
				}
				m.right = m.x + m.width;
				m.bottom = m.y + m.height;
				return m
			},
			move : function(k, b, c) {
				var g = this, n = g.getXY(), l = n[0], i = n[1], d = [ l - b, i ], m = [
						l + b, i ], h = [ l, i - b ], a = [ l, i + b ], e = {
					l :d,
					left :d,
					r :m,
					right :m,
					t :h,
					top :h,
					up :h,
					b :a,
					bottom :a,
					down :a
				};
				k = k.toLowerCase();
				g.moveTo(e[k][0], e[k][1], g.animTest.call(g, arguments, c, 2))
			},
			setLeftTop : function(d, c) {
				var b = this, a = b.dom.style;
				a.left = b.addUnits(d);
				a.top = b.addUnits(c);
				return b
			},
			getRegion : function() {
				return Ext.lib.Dom.getRegion(this.dom)
			},
			setBounds : function(b, g, d, a, c) {
				var e = this;
				if (!c || !e.anim) {
					e.setSize(d, a);
					e.setLocation(b, g)
				} else {
					e.anim( {
						points : {
							to : [ b, g ]
						},
						width : {
							to :e.adjustWidth(d)
						},
						height : {
							to :e.adjustHeight(a)
						}
					}, e.preanim(arguments, 4), "motion")
				}
				return e
			},
			setRegion : function(b, a) {
				return this.setBounds(b.left, b.top, b.right - b.left, b.bottom
						- b.top, this.animTest.call(this, arguments, a, 1))
			}
		});
Ext.Element
		.addMethods( {
			scrollTo : function(b, d, a) {
				var e = /top/i.test(b), c = this, g = c.dom, h;
				if (!a || !c.anim) {
					h = "scroll" + (e ? "Top" : "Left");
					g[h] = d
				} else {
					h = "scroll" + (e ? "Left" : "Top");
					c.anim( {
						scroll : {
							to :e ? [ g[h], d ] : [ d, g[h] ]
						}
					}, c.preanim(arguments, 2), "scroll")
				}
				return c
			},
			scrollIntoView : function(e, i) {
				var q = Ext.getDom(e) || Ext.getBody().dom, h = this.dom, g = this
						.getOffsetsTo(q), m = g[0] + q.scrollLeft, v = g[1]
						+ q.scrollTop, s = v + h.offsetHeight, d = m
						+ h.offsetWidth, a = q.clientHeight, n = parseInt(
						q.scrollTop, 10), u = parseInt(q.scrollLeft, 10), k = n
						+ a, p = u + q.clientWidth;
				if (h.offsetHeight > a || v < n) {
					q.scrollTop = v
				} else {
					if (s > k) {
						q.scrollTop = s - a
					}
				}
				q.scrollTop = q.scrollTop;
				if (i !== false) {
					if (h.offsetWidth > q.clientWidth || m < u) {
						q.scrollLeft = m
					} else {
						if (d > p) {
							q.scrollLeft = d - q.clientWidth
						}
					}
					q.scrollLeft = q.scrollLeft
				}
				return this
			},
			scrollChildIntoView : function(b, a) {
				Ext.fly(b, "_scrollChildIntoView").scrollIntoView(this, a)
			},
			scroll : function(n, b, d) {
				if (!this.isScrollable()) {
					return false
				}
				var e = this.dom, g = e.scrollLeft, q = e.scrollTop, o = e.scrollWidth, m = e.scrollHeight, i = e.clientWidth, a = e.clientHeight, c = false, p, k = {
					l :Math.min(g + b, o - i),
					r :p = Math.max(g - b, 0),
					t :Math.max(q - b, 0),
					b :Math.min(q + b, m - a)
				};
				k.d = k.b;
				k.u = k.t;
				n = n.substr(0, 1);
				if ((p = k[n]) > -1) {
					c = true;
					this.scrollTo(n == "l" || n == "r" ? "left" : "top", p,
							this.preanim(arguments, 2))
				}
				return c
			}
		});
Ext.Element
		.addMethods( function() {
			var d = "visibility", b = "display", a = "hidden", h = "none", c = "x-masked", g = "x-masked-relative", e = Ext.Element.data;
			return {
				isVisible : function(i) {
					var k = !this.isStyle(d, a) && !this.isStyle(b, h), l = this.dom.parentNode;
					if (i !== true || !k) {
						return k
					}
					while (l && !(/^body/i.test(l.tagName))) {
						if (!Ext.fly(l, "_isVisible").isVisible()) {
							return false
						}
						l = l.parentNode
					}
					return true
				},
				isDisplayed : function() {
					return !this.isStyle(b, h)
				},
				enableDisplayMode : function(i) {
					this.setVisibilityMode(Ext.Element.DISPLAY);
					if (!Ext.isEmpty(i)) {
						e(this.dom, "originalDisplay", i)
					}
					return this
				},
				mask : function(k, o) {
					var q = this, m = q.dom, p = Ext.DomHelper, n = "ext-el-mask-msg", i, r;
					if (!(/^body/i.test(m.tagName) && q.getStyle("position") == "static")) {
						q.addClass(g)
					}
					if (i = e(m, "maskMsg")) {
						i.remove()
					}
					if (i = e(m, "mask")) {
						i.remove()
					}
					r = p.append(m, {
						cls :"ext-el-mask"
					}, true);
					e(m, "mask", r);
					q.addClass(c);
					r.setDisplayed(true);
					if (typeof k == "string") {
						var l = p.append(m, {
							cls :n,
							cn : {
								tag :"div"
							}
						}, true);
						e(m, "maskMsg", l);
						l.dom.className = o ? n + " " + o : n;
						l.dom.firstChild.innerHTML = k;
						l.setDisplayed(true);
						l.center(q)
					}
					if (Ext.isIE && !(Ext.isIE7 && Ext.isStrict)
							&& q.getStyle("height") == "auto") {
						r.setSize(undefined, q.getHeight())
					}
					return r
				},
				unmask : function() {
					var l = this, m = l.dom, i = e(m, "mask"), k = e(m,
							"maskMsg");
					if (i) {
						if (k) {
							k.remove();
							e(m, "maskMsg", undefined)
						}
						i.remove();
						e(m, "mask", undefined);
						l.removeClass( [ c, g ])
					}
				},
				isMasked : function() {
					var i = e(this.dom, "mask");
					return i && i.isVisible()
				},
				createShim : function() {
					var i = document.createElement("iframe"), k;
					i.frameBorder = "0";
					i.className = "ext-shim";
					i.src = Ext.SSL_SECURE_URL;
					k = Ext.get(this.dom.parentNode.insertBefore(i, this.dom));
					k.autoBoxAdjust = false;
					return k
				}
			}
		}());
Ext.Element.addMethods( {
	addKeyListener : function(b, d, c) {
		var a;
		if (typeof b != "object" || Ext.isArray(b)) {
			a = {
				key :b,
				fn :d,
				scope :c
			}
		} else {
			a = {
				key :b.key,
				shift :b.shift,
				ctrl :b.ctrl,
				alt :b.alt,
				fn :d,
				scope :c
			}
		}
		return new Ext.KeyMap(this, a)
	},
	addKeyMap : function(a) {
		return new Ext.KeyMap(this, a)
	}
});
Ext.CompositeElementLite.importElementMethods();
Ext.apply(Ext.CompositeElementLite.prototype, {
	addElements : function(c, a) {
		if (!c) {
			return this
		}
		if (typeof c == "string") {
			c = Ext.Element.selectorFunction(c, a)
		}
		var b = this.elements;
		Ext.each(c, function(d) {
			b.push(Ext.get(d))
		});
		return this
	},
	first : function() {
		return this.item(0)
	},
	last : function() {
		return this.item(this.getCount() - 1)
	},
	contains : function(a) {
		return this.indexOf(a) != -1
	},
	removeElement : function(d, e) {
		var c = this, a = this.elements, b;
		Ext.each(d, function(g) {
			if ((b = (a[g] || a[g = c.indexOf(g)]))) {
				if (e) {
					if (b.dom) {
						b.remove()
					} else {
						Ext.removeNode(b)
					}
				}
				a.splice(g, 1)
			}
		});
		return this
	}
});
Ext.CompositeElement = Ext.extend(Ext.CompositeElementLite, {
	constructor : function(b, a) {
		this.elements = [];
		this.add(b, a)
	},
	getElement : function(a) {
		return a
	},
	transformElement : function(a) {
		return Ext.get(a)
	}
});
Ext.Element.select = function(a, d, b) {
	var c;
	if (typeof a == "string") {
		c = Ext.Element.selectorFunction(a, b)
	} else {
		if (a.length !== undefined) {
			c = a
		} else {
			throw "Invalid selector"
		}
	}
	return (d === true) ? new Ext.CompositeElement(c)
			: new Ext.CompositeElementLite(c)
};
Ext.select = Ext.Element.select;
Ext.UpdateManager = Ext.Updater = Ext.extend(Ext.util.Observable, function() {
	var b = "beforeupdate", d = "update", c = "failure";
	function a(h) {
		var i = this;
		i.transaction = null;
		if (h.argument.form && h.argument.reset) {
			try {
				h.argument.form.reset()
			} catch (k) {
			}
		}
		if (i.loadScripts) {
			i.renderer.render(i.el, h, i, g.createDelegate(i, [ h ]))
		} else {
			i.renderer.render(i.el, h, i);
			g.call(i, h)
		}
	}
	function g(h, i, k) {
		this.fireEvent(i || d, this.el, h);
		if (Ext.isFunction(h.argument.callback)) {
			h.argument.callback.call(h.argument.scope, this.el,
					Ext.isEmpty(k) ? true : false, h, h.argument.options)
		}
	}
	function e(h) {
		g.call(this, h, c, !!(this.transaction = null))
	}
	return {
		constructor : function(i, h) {
			var k = this;
			i = Ext.get(i);
			if (!h && i.updateManager) {
				return i.updateManager
			}
			k.el = i;
			k.defaultUrl = null;
			k.addEvents(b, d, c);
			Ext.apply(k, Ext.Updater.defaults);
			k.transaction = null;
			k.refreshDelegate = k.refresh.createDelegate(k);
			k.updateDelegate = k.update.createDelegate(k);
			k.formUpdateDelegate = (k.formUpdate || function() {
			}).createDelegate(k);
			k.renderer = k.renderer || k.getDefaultRenderer();
			Ext.Updater.superclass.constructor.call(k)
		},
		setRenderer : function(h) {
			this.renderer = h
		},
		getRenderer : function() {
			return this.renderer
		},
		getDefaultRenderer : function() {
			return new Ext.Updater.BasicRenderer()
		},
		setDefaultUrl : function(h) {
			this.defaultUrl = h
		},
		getEl : function() {
			return this.el
		},
		update : function(i, p, q, m) {
			var l = this, h, k;
			if (l.fireEvent(b, l.el, i, p) !== false) {
				if (Ext.isObject(i)) {
					h = i;
					i = h.url;
					p = p || h.params;
					q = q || h.callback;
					m = m || h.discardUrl;
					k = h.scope;
					if (!Ext.isEmpty(h.nocache)) {
						l.disableCaching = h.nocache
					}
					if (!Ext.isEmpty(h.text)) {
						l.indicatorText = '<div class="loading-indicator">'
								+ h.text + "</div>"
					}
					if (!Ext.isEmpty(h.scripts)) {
						l.loadScripts = h.scripts
					}
					if (!Ext.isEmpty(h.timeout)) {
						l.timeout = h.timeout
					}
				}
				l.showLoading();
				if (!m) {
					l.defaultUrl = i
				}
				if (Ext.isFunction(i)) {
					i = i.call(l)
				}
				var n = Ext.apply( {}, {
					url :i,
					params :(Ext.isFunction(p) && k) ? p.createDelegate(k) : p,
					success :a,
					failure :e,
					scope :l,
					callback :undefined,
					timeout :(l.timeout * 1000),
					disableCaching :l.disableCaching,
					argument : {
						options :h,
						url :i,
						form :null,
						callback :q,
						scope :k || window,
						params :p
					}
				}, h);
				l.transaction = Ext.Ajax.request(n)
			}
		},
		formUpdate : function(l, h, k, m) {
			var i = this;
			if (i.fireEvent(b, i.el, l, h) !== false) {
				if (Ext.isFunction(h)) {
					h = h.call(i)
				}
				l = Ext.getDom(l);
				i.transaction = Ext.Ajax.request( {
					form :l,
					url :h,
					success :a,
					failure :e,
					scope :i,
					timeout :(i.timeout * 1000),
					argument : {
						url :h,
						form :l,
						callback :m,
						reset :k
					}
				});
				i.showLoading.defer(1, i)
			}
		},
		startAutoRefresh : function(i, k, m, n, h) {
			var l = this;
			if (h) {
				l.update(k || l.defaultUrl, m, n, true)
			}
			if (l.autoRefreshProcId) {
				clearInterval(l.autoRefreshProcId)
			}
			l.autoRefreshProcId = setInterval(l.update.createDelegate(l, [
					k || l.defaultUrl, m, n, true ]), i * 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(h) {
			if (this.defaultUrl) {
				this.update(this.defaultUrl, null, h, 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(d, c, e, b) {
	var a = Ext.get(d).getUpdater();
	Ext.apply(a, b);
	a.update(c, e, b ? b.callback : null)
};
Ext.Updater.BasicRenderer = function() {
};
Ext.Updater.BasicRenderer.prototype = {
	render : function(c, a, b, d) {
		c.update(a.responseText, b.loadScripts, d)
	}
};
( function() {
	Date.useStrict = false;
	function b(d) {
		var c = Array.prototype.slice.call(arguments, 1);
		return d.replace(/\{(\d+)\}/g, function(e, g) {
			return c[g]
		})
	}
	Date.formatCodeToRegex = function(d, c) {
		var e = Date.parseCodes[d];
		if (e) {
			e = typeof e == "function" ? e() : e;
			Date.parseCodes[d] = e
		}
		return e ? Ext.applyIf( {
			c :e.c ? b(e.c, c || "{0}") : e.c
		}, e) : {
			g :0,
			c :null,
			s :Ext.escapeRe(d)
		}
	};
	var a = Date.formatCodeToRegex;
	Ext
			.apply(
					Date,
					{
						parseFunctions : {
							"M$" : function(d, c) {
								var e = new RegExp(
										"\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/");
								var g = (d || "").match(e);
								return g ? new Date(((g[1] || "") + g[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(c) {
							return Date.monthNames[c].substring(0, 3)
						},
						getShortDayName : function(c) {
							return Date.dayNames[c].substring(0, 3)
						},
						getMonthNumber : function(c) {
							return Date.monthNumbers[c.substring(0, 1)
									.toUpperCase()
									+ c.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 m = "Y-m-dTH:i:sP", h = [], g = 0, d = m.length; g < d; ++g) {
									var k = m.charAt(g);
									h.push(k == "T" ? "'T'" : Date
											.getFormatCode(k))
								}
								return h.join(" + ")
							},
							U :"Math.round(this.getTime() / 1000)"
						},
						isValid : function(p, c, o, l, g, k, e) {
							l = l || 0;
							g = g || 0;
							k = k || 0;
							e = e || 0;
							var n = new Date(p < 100 ? 100 : p, c - 1, o, l, g,
									k, e).add(Date.YEAR, p < 100 ? p - 100 : 0);
							return p == n.getFullYear()
									&& c == n.getMonth() + 1
									&& o == n.getDate() && l == n.getHours()
									&& g == n.getMinutes()
									&& k == n.getSeconds()
									&& e == n.getMilliseconds()
						},
						parseDate : function(d, g, c) {
							var e = Date.parseFunctions;
							if (e[g] == null) {
								Date.createParser(g)
							}
							return e[g](d, Ext.isDefined(c) ? c
									: Date.useStrict)
						},
						getFormatCode : function(d) {
							var c = Date.formatCodes[d];
							if (c) {
								c = typeof c == "function" ? c() : c;
								Date.formatCodes[d] = c
							}
							return c || ("'" + String.escape(d) + "'")
						},
						createFormat : function(h) {
							var g = [], c = false, e = "";
							for ( var d = 0; d < h.length; ++d) {
								e = h.charAt(d);
								if (!c && e == "\\") {
									c = true
								} else {
									if (c) {
										c = false;
										g.push("'" + String.escape(e) + "'")
									} else {
										g.push(Date.getFormatCode(e))
									}
								}
							}
							Date.formatFunctions[h] = new Function("return "
									+ g.join("+"))
						},
						createParser : function() {
							var c = [
									"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(n) {
								var e = Date.parseRegexes.length, p = 1, g = [], m = [], l = false, d = "", k = 0, h, o;
								for (; k < n.length; ++k) {
									d = n.charAt(k);
									if (!l && d == "\\") {
										l = true
									} else {
										if (l) {
											l = false;
											m.push(String.escape(d))
										} else {
											h = a(d, p);
											p += h.g;
											m.push(h.s);
											if (h.g && h.c) {
												if (h.calcLast) {
													o = h.c
												} else {
													g.push(h.c)
												}
											}
										}
									}
								}
								if (o) {
									g.push(o)
								}
								Date.parseRegexes[e] = new RegExp("^"
										+ m.join("") + "$", "i");
								Date.parseFunctions[n] = new Function("input",
										"strict", b(c, e, g.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 c = [], d = 0; d < 7; c.push(Date
										.getShortDayName(d)), ++d) {
								}
								return {
									g :0,
									c :null,
									s :"(?:" + c.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 c = [], d = 0; d < 12; c.push(Date
										.getShortMonthName(d)), ++d) {
								}
								return Ext.applyIf( {
									s :"(" + c.join("|") + ")"
								}, a("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 a("Y")
							},
							Y : {
								g :1,
								c :"y = parseInt(results[{0}], 10);\n",
								s :"(\\d{4})"
							},
							y : {
								g :1,
								c :"var ty = parseInt(results[{0}], 10);\ny = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
								s :"(\\d{1,2})"
							},
							a : function() {
								return a("A")
							},
							A : {
								calcLast :true,
								g :1,
								c :"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",
								s :"(AM|PM|am|pm)"
							},
							g : function() {
								return a("G")
							},
							G : {
								g :1,
								c :"h = parseInt(results[{0}], 10);\n",
								s :"(\\d{1,2})"
							},
							h : function() {
								return a("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;\nzz = (-43200 <= zz && zz <= 50400)? zz : null;\n",
								s :"([+-]?\\d{1,5})"
							},
							c : function() {
								var e = [], c = [
										a("Y", 1),
										a("m", 2),
										a("d", 3),
										a("h", 4),
										a("i", 5),
										a("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){",
													a("P", 8).c, "}else{",
													a("O", 8).c, "}", "}" ]
													.join("\n")
										} ];
								for ( var g = 0, d = c.length; g < d; ++g) {
									e.push(c[g].c)
								}
								return {
									g :1,
									c :e.join(""),
									s : [ c[0].s, "(?:", "-", c[1].s, "(?:",
											"-", c[2].s, "(?:", "(?:T| )?",
											c[3].s, ":", c[4].s, "(?::",
											c[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(a) {
						if (Date.formatFunctions[a] == null) {
							Date.createFormat(a)
						}
						return Date.formatFunctions[a].call(this)
					},
					getTimezone : function() {
						return this
								.toString()
								.replace(
										/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/,
										"$1$2").replace(/[^A-Z]/g, "")
					},
					getGMTOffset : function(a) {
						return (this.getTimezoneOffset() > 0 ? "-" : "+")
								+ String.leftPad(Math.floor(Math.abs(this
										.getTimezoneOffset()) / 60), 2, "0")
								+ (a ? ":" : "")
								+ String.leftPad(Math.abs(this
										.getTimezoneOffset() % 60), 2, "0")
					},
					getDayOfYear : function() {
						var b = 0, e = this.clone(), a = this.getMonth(), c;
						for (c = 0, e.setDate(1), e.setMonth(0); c < a; e
								.setMonth(++c)) {
							b += e.getDaysInMonth()
						}
						return b + this.getDate() - 1
					},
					getWeekOfYear : function() {
						var a = 86400000, b = 7 * a;
						return function() {
							var d = Date.UTC(this.getFullYear(), this
									.getMonth(), this.getDate() + 3)
									/ a, c = Math.floor(d / 7), e = new Date(c
									* b).getUTCFullYear();
							return c - Math.floor(Date.UTC(e, 0, 7) / b) + 1
						}
					}(),
					isLeapYear : function() {
						var a = this.getFullYear();
						return !!((a & 3) == 0 && (a % 100 || (a % 400 == 0 && a)))
					},
					getFirstDayOfMonth : function() {
						var a = (this.getDay() - (this.getDate() - 1)) % 7;
						return (a < 0) ? (a + 7) : a
					},
					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 a = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30,
								31 ];
						return function() {
							var b = this.getMonth();
							return b == 1 && this.isLeapYear() ? 29 : a[b]
						}
					}(),
					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(g) {
						if (g) {
							return this.clone().clearTime()
						}
						var b = this.getDate();
						this.setHours(0);
						this.setMinutes(0);
						this.setSeconds(0);
						this.setMilliseconds(0);
						if (this.getDate() != b) {
							for ( var a = 1, e = this.add(Date.HOUR, a); e
									.getDate() != b; a++, e = this.add(
									Date.HOUR, a)) {
							}
							this.setDate(b);
							this.setHours(e.getHours())
						}
						return this
					},
					add : function(b, c) {
						var e = this.clone();
						if (!b || c === 0) {
							return e
						}
						switch (b.toLowerCase()) {
						case Date.MILLI:
							e.setMilliseconds(this.getMilliseconds() + c);
							break;
						case Date.SECOND:
							e.setSeconds(this.getSeconds() + c);
							break;
						case Date.MINUTE:
							e.setMinutes(this.getMinutes() + c);
							break;
						case Date.HOUR:
							e.setHours(this.getHours() + c);
							break;
						case Date.DAY:
							e.setDate(this.getDate() + c);
							break;
						case Date.MONTH:
							var a = this.getDate();
							if (a > 28) {
								a = Math
										.min(a, this.getFirstDateOfMonth().add(
												"mo", c).getLastDateOfMonth()
												.getDate())
							}
							e.setDate(a);
							e.setMonth(this.getMonth() + c);
							break;
						case Date.YEAR:
							e.setFullYear(this.getFullYear() + c);
							break
						}
						return e
					},
					between : function(c, a) {
						var b = this.getTime();
						return c.getTime() <= b && b <= a.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(a) {
							if (a <= -1) {
								var d = Math.ceil(-a), c = Math.ceil(d / 12), b = (d % 12) ? 12 - d % 12
										: 0;
								this.setFullYear(this.getFullYear() - c);
								return this._xMonth(b)
							} else {
								return this._xMonth(a)
							}
						},
						setDate : function(a) {
							return this.setTime(this.getTime()
									- (this.getDate() - a) * 86400000)
						}
					})
}
Ext.util.MixedCollection = function(b, a) {
	this.items = [];
	this.map = {};
	this.keys = [];
	this.length = 0;
	this.addEvents("clear", "add", "replace", "remove", "sort");
	this.allowFunctions = b === true;
	if (a) {
		this.getKey = a
	}
	Ext.util.MixedCollection.superclass.constructor.call(this)
};
Ext
		.extend(
				Ext.util.MixedCollection,
				Ext.util.Observable,
				{
					allowFunctions :false,
					add : function(b, c) {
						if (arguments.length == 1) {
							c = arguments[0];
							b = this.getKey(c)
						}
						if (typeof b != "undefined" && b !== null) {
							var a = this.map[b];
							if (typeof a != "undefined") {
								return this.replace(b, c)
							}
							this.map[b] = c
						}
						this.length++;
						this.items.push(c);
						this.keys.push(b);
						this.fireEvent("add", this.length - 1, c, b);
						return c
					},
					getKey : function(a) {
						return a.id
					},
					replace : function(c, d) {
						if (arguments.length == 1) {
							d = arguments[0];
							c = this.getKey(d)
						}
						var a = this.map[c];
						if (typeof c == "undefined" || c === null
								|| typeof a == "undefined") {
							return this.add(c, d)
						}
						var b = this.indexOfKey(c);
						this.items[b] = d;
						this.map[c] = d;
						this.fireEvent("replace", c, a, d);
						return d
					},
					addAll : function(e) {
						if (arguments.length > 1 || Ext.isArray(e)) {
							var b = arguments.length > 1 ? arguments : e;
							for ( var d = 0, a = b.length; d < a; d++) {
								this.add(b[d])
							}
						} else {
							for ( var c in e) {
								if (this.allowFunctions
										|| typeof e[c] != "function") {
									this.add(c, e[c])
								}
							}
						}
					},
					each : function(e, d) {
						var b = [].concat(this.items);
						for ( var c = 0, a = b.length; c < a; c++) {
							if (e.call(d || b[c], b[c], c, a) === false) {
								break
							}
						}
					},
					eachKey : function(d, c) {
						for ( var b = 0, a = this.keys.length; b < a; b++) {
							d.call(c || window, this.keys[b], this.items[b], b,
									a)
						}
					},
					find : function(d, c) {
						for ( var b = 0, a = this.items.length; b < a; b++) {
							if (d
									.call(c || window, this.items[b],
											this.keys[b])) {
								return this.items[b]
							}
						}
						return null
					},
					insert : function(a, b, c) {
						if (arguments.length == 2) {
							c = arguments[1];
							b = this.getKey(c)
						}
						if (this.containsKey(b)) {
							this.suspendEvents();
							this.removeKey(b);
							this.resumeEvents()
						}
						if (a >= this.length) {
							return this.add(b, c)
						}
						this.length++;
						this.items.splice(a, 0, c);
						if (typeof b != "undefined" && b !== null) {
							this.map[b] = c
						}
						this.keys.splice(a, 0, b);
						this.fireEvent("add", a, c, b);
						return c
					},
					remove : function(a) {
						return this.removeAt(this.indexOf(a))
					},
					removeAt : function(a) {
						if (a < this.length && a >= 0) {
							this.length--;
							var c = this.items[a];
							this.items.splice(a, 1);
							var b = this.keys[a];
							if (typeof b != "undefined") {
								delete this.map[b]
							}
							this.keys.splice(a, 1);
							this.fireEvent("remove", c, b);
							return c
						}
						return false
					},
					removeKey : function(a) {
						return this.removeAt(this.indexOfKey(a))
					},
					getCount : function() {
						return this.length
					},
					indexOf : function(a) {
						return this.items.indexOf(a)
					},
					indexOfKey : function(a) {
						return this.keys.indexOf(a)
					},
					item : function(b) {
						var a = this.map[b], c = a !== undefined ? a
								: (typeof b == "number") ? this.items[b]
										: undefined;
						return typeof c != "function" || this.allowFunctions ? c
								: null
					},
					itemAt : function(a) {
						return this.items[a]
					},
					key : function(a) {
						return this.map[a]
					},
					contains : function(a) {
						return this.indexOf(a) != -1
					},
					containsKey : function(a) {
						return typeof this.map[a] != "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(l, a, k) {
						var d, e, b = String(a).toUpperCase() == "DESC" ? -1
								: 1, h = [], m = this.keys, g = this.items;
						k = k || function(i, c) {
							return i - c
						};
						for (d = 0, e = g.length; d < e; d++) {
							h[h.length] = {
								key :m[d],
								value :g[d],
								index :d
							}
						}
						h.sort( function(i, c) {
							var n = k(i[l], c[l]) * b;
							if (n === 0) {
								n = (i.index < c.index ? -1 : 1)
							}
							return n
						});
						for (d = 0, e = h.length; d < e; d++) {
							g[d] = h[d].value;
							m[d] = h[d].key
						}
						this.fireEvent("sort", this)
					},
					sort : function(a, b) {
						this._sort("value", a, b)
					},
					reorder : function(d) {
						this.suspendEvents();
						var b = this.items, c = 0, g = b.length, a = [], e = [], h;
						for (h in d) {
							a[d[h]] = b[h]
						}
						for (c = 0; c < g; c++) {
							if (d[c] == undefined) {
								e.push(b[c])
							}
						}
						for (c = 0; c < g; c++) {
							if (a[c] == undefined) {
								a[c] = e.shift()
							}
						}
						this.clear();
						this.addAll(a);
						this.resumeEvents();
						this.fireEvent("sort", this)
					},
					keySort : function(a, b) {
						this
								._sort(
										"key",
										a,
										b
												|| function(d, c) {
													var g = String(d)
															.toUpperCase(), e = String(
															c).toUpperCase();
													return g > e ? 1
															: (g < e ? -1 : 0)
												})
					},
					getRange : function(e, a) {
						var b = this.items;
						if (b.length < 1) {
							return []
						}
						e = e || 0;
						a = Math.min(typeof a == "undefined" ? this.length - 1
								: a, this.length - 1);
						var c, d = [];
						if (e <= a) {
							for (c = e; c <= a; c++) {
								d[d.length] = b[c]
							}
						} else {
							for (c = e; c >= a; c--) {
								d[d.length] = b[c]
							}
						}
						return d
					},
					filter : function(c, b, d, a) {
						if (Ext.isEmpty(b, false)) {
							return this.clone()
						}
						b = this.createValueMatcher(b, d, a);
						return this.filterBy( function(e) {
							return e && b.test(e[c])
						})
					},
					filterBy : function(g, e) {
						var h = new Ext.util.MixedCollection();
						h.getKey = this.getKey;
						var b = this.keys, d = this.items;
						for ( var c = 0, a = d.length; c < a; c++) {
							if (g.call(e || this, d[c], b[c])) {
								h.add(b[c], d[c])
							}
						}
						return h
					},
					findIndex : function(c, b, e, d, a) {
						if (Ext.isEmpty(b, false)) {
							return -1
						}
						b = this.createValueMatcher(b, d, a);
						return this.findIndexBy( function(g) {
							return g && b.test(g[c])
						}, null, e)
					},
					findIndexBy : function(g, e, h) {
						var b = this.keys, d = this.items;
						for ( var c = (h || 0), a = d.length; c < a; c++) {
							if (g.call(e || this, d[c], b[c])) {
								return c
							}
						}
						return -1
					},
					createValueMatcher : function(c, e, a, b) {
						if (!c.exec) {
							var d = Ext.escapeRe;
							c = String(c);
							if (e === true) {
								c = d(c)
							} else {
								c = "^" + d(c);
								if (b === true) {
									c += "$"
								}
							}
							c = new RegExp(c, a ? "" : "i")
						}
						return c
					},
					clone : function() {
						var e = new Ext.util.MixedCollection();
						var b = this.keys, d = this.items;
						for ( var c = 0, a = d.length; c < a; c++) {
							e.add(b[c], d[c])
						}
						e.getKey = this.getKey;
						return e
					}
				});
Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item;
Ext.AbstractManager = Ext.extend(Object, {
	typeName :"type",
	constructor : function(a) {
		Ext.apply(this, a || {});
		this.all = new Ext.util.MixedCollection();
		this.types = {}
	},
	get : function(a) {
		return this.all.get(a)
	},
	register : function(a) {
		this.all.add(a)
	},
	unregister : function(a) {
		this.all.remove(a)
	},
	registerType : function(b, a) {
		this.types[b] = a;
		a[this.typeName] = b
	},
	isRegistered : function(a) {
		return this.types[a] !== undefined
	},
	create : function(a, d) {
		var b = a[this.typeName] || a.type || d, c = this.types[b];
		if (c == undefined) {
			throw new Error(String.format(
					"The '{0}' type has not been registered with this manager",
					b))
		}
		return new c(a)
	},
	onAvailable : function(d, c, b) {
		var a = this.all;
		a.on("add", function(e, g) {
			if (g.id == d) {
				c.call(b || g, g);
				a.un("add", c, b)
			}
		})
	}
});
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 z = this, k = z.html, r = /<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/, d = /^<tpl\b[^>]*?for="(.*?)"/, w = /^<tpl\b[^>]*?if="(.*?)"/, y = /^<tpl\b[^>]*?exec="(.*?)"/, t, q = 0, l = [], p = "values", x = "parent", n = "xindex", o = "xcount", e = "return ", c = "with(values){ ";
	k = [ "<tpl>", k, "</tpl>" ].join("");
	while ((t = k.match(r))) {
		var b = t[0].match(d), a = t[0].match(w), B = t[0].match(y), g = null, h = null, u = null, A = b
				&& b[1] ? b[1] : "";
		if (a) {
			g = a && a[1] ? a[1] : null;
			if (g) {
				h = new Function(p, x, n, o, c + e
						+ (Ext.util.Format.htmlDecode(g)) + "; }")
			}
		}
		if (B) {
			g = B && B[1] ? B[1] : null;
			if (g) {
				u = new Function(p, x, n, o, c
						+ (Ext.util.Format.htmlDecode(g)) + "; }")
			}
		}
		if (A) {
			switch (A) {
			case ".":
				A = new Function(p, x, c + e + p + "; }");
				break;
			case "..":
				A = new Function(p, x, c + e + x + "; }");
				break;
			default:
				A = new Function(p, x, c + e + A + "; }")
			}
		}
		l.push( {
			id :q,
			target :A,
			exec :u,
			test :h,
			body :t[1] || ""
		});
		k = k.replace(t[0], "{xtpl" + q + "}");
		++q
	}
	for ( var v = l.length - 1; v >= 0; --v) {
		z.compileTpl(l[v])
	}
	z.master = l[l.length - 1];
	z.tpls = l
};
Ext
		.extend(
				Ext.XTemplate,
				Ext.Template,
				{
					re :/\{([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,
					codeRe :/\{\[((?:\\\]|.|\n)*?)\]\}/g,
					applySubTemplate : function(a, l, k, d, c) {
						var h = this, g, n = h.tpls[a], m, b = [];
						if ((n.test && !n.test.call(h, l, k, d, c))
								|| (n.exec && n.exec.call(h, l, k, d, c))) {
							return ""
						}
						m = n.target ? n.target.call(h, l, k) : l;
						g = m.length;
						k = n.target ? l : k;
						if (n.target && Ext.isArray(m)) {
							for ( var e = 0, g = m.length; e < g; e++) {
								b[b.length] = n.compiled.call(h, m[e], k,
										e + 1, g)
							}
							return b.join("")
						}
						return n.compiled.call(h, m, k, d, c)
					},
					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(a) {
						return this.master.compiled.call(this, a, {}, 1, 1)
					},
					compile : function() {
						return this
					}
				});
Ext.XTemplate.prototype.apply = Ext.XTemplate.prototype.applyTemplate;
Ext.XTemplate.from = function(a) {
	a = Ext.getDom(a);
	return new Ext.XTemplate(a.value || a.innerHTML)
};
Ext.util.CSS = function() {
	var d = null;
	var c = document;
	var b = /(-[a-z])/gi;
	var a = function(e, g) {
		return g.charAt(1).toUpperCase()
	};
	return {
		createStyleSheet : function(i, m) {
			var h;
			var g = c.getElementsByTagName("head")[0];
			var l = c.createElement("style");
			l.setAttribute("type", "text/css");
			if (m) {
				l.setAttribute("id", m)
			}
			if (Ext.isIE) {
				g.appendChild(l);
				h = l.styleSheet;
				h.cssText = i
			} else {
				try {
					l.appendChild(c.createTextNode(i))
				} catch (k) {
					l.cssText = i
				}
				g.appendChild(l);
				h = l.styleSheet ? l.styleSheet
						: (l.sheet || c.styleSheets[c.styleSheets.length - 1])
			}
			this.cacheStyleSheet(h);
			return h
		},
		removeStyleSheet : function(g) {
			var e = c.getElementById(g);
			if (e) {
				e.parentNode.removeChild(e)
			}
		},
		swapStyleSheet : function(h, e) {
			this.removeStyleSheet(h);
			var g = c.createElement("link");
			g.setAttribute("rel", "stylesheet");
			g.setAttribute("type", "text/css");
			g.setAttribute("id", h);
			g.setAttribute("href", e);
			c.getElementsByTagName("head")[0].appendChild(g)
		},
		refreshCache : function() {
			return this.getRules(true)
		},
		cacheStyleSheet : function(h) {
			if (!d) {
				d = {}
			}
			try {
				var k = h.cssRules || h.rules;
				for ( var g = k.length - 1; g >= 0; --g) {
					d[k[g].selectorText.toLowerCase()] = k[g]
				}
			} catch (i) {
			}
		},
		getRules : function(h) {
			if (d === null || h) {
				d = {};
				var l = c.styleSheets;
				for ( var k = 0, g = l.length; k < g; k++) {
					try {
						this.cacheStyleSheet(l[k])
					} catch (m) {
					}
				}
			}
			return d
		},
		getRule : function(e, h) {
			var g = this.getRules(h);
			if (!Ext.isArray(e)) {
				return g[e.toLowerCase()]
			}
			for ( var k = 0; k < e.length; k++) {
				if (g[e[k]]) {
					return g[e[k].toLowerCase()]
				}
			}
			return null
		},
		updateRule : function(e, k, h) {
			if (!Ext.isArray(e)) {
				var l = this.getRule(e);
				if (l) {
					l.style[k.replace(b, a)] = h;
					return true
				}
			} else {
				for ( var g = 0; g < e.length; g++) {
					if (this.updateRule(e[g], k, h)) {
						return true
					}
				}
			}
			return false
		}
	}
}();
Ext.util.ClickRepeater = Ext.extend(Ext.util.Observable, {
	constructor : function(b, a) {
		this.el = Ext.get(b);
		this.el.unselectable();
		Ext.apply(this, a);
		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(a) {
		if (a || !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(a) {
		this[a ? "disable" : "enable"]()
	},
	eventOptions : function(a) {
		if (this.preventDefault) {
			a.preventDefault()
		}
		if (this.stopDefault) {
			a.stopEvent()
		}
	},
	destroy : function() {
		this.disable(true);
		Ext.destroy(this.el);
		this.purgeListeners()
	},
	handleDblClick : function(a) {
		clearTimeout(this.timer);
		this.el.blur();
		this.fireEvent("mousedown", this, a);
		this.fireEvent("click", this, a)
	},
	handleMouseDown : function(a) {
		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, a);
		this.fireEvent("click", this, a);
		if (this.accelerate) {
			this.delay = 400
		}
		this.timer = this.click.defer(this.delay || this.interval, this, [ a ])
	},
	click : function(a) {
		this.fireEvent("click", this, a);
		this.timer = this.click.defer(this.accelerate ? this.easeOutExpo(
				this.mousedownTime.getElapsed(), 400, -390, 12000)
				: this.interval, this, [ a ])
	},
	easeOutExpo : function(e, a, h, g) {
		return (e == g) ? a + h : h * (-Math.pow(2, -10 * e / g) + 1) + a
	},
	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(a) {
		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, a)
	}
});
Ext.KeyNav = function(b, a) {
	this.el = Ext.get(b);
	Ext.apply(this, a);
	if (!this.disabled) {
		this.disabled = true;
		this.enable()
	}
};
Ext.KeyNav.prototype = {
	disabled :false,
	defaultEventAction :"stopEvent",
	forceKeyDown :false,
	relay : function(c) {
		var a = c.getKey(), b = this.keyToHandler[a];
		if (b && this[b]) {
			if (this.doRelay(c, this[b], b) !== true) {
				c[this.defaultEventAction]()
			}
		}
	},
	doRelay : function(c, b, a) {
		return b.call(this.scope || this, c, a)
	},
	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(b) {
		var a = b.getKey();
		if (a >= 37 && a <= 40) {
			b.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(a) {
		this[a ? "disable" : "enable"]()
	},
	isKeydown : function() {
		return this.forceKeyDown || Ext.EventManager.useKeydown
	}
};
Ext.KeyMap = function(c, b, a) {
	this.el = Ext.get(c);
	this.eventName = a || "keydown";
	this.bindings = [];
	if (b) {
		this.addBinding(b)
	}
	this.enable()
};
Ext.KeyMap.prototype = {
	stopEvent :false,
	addBinding : function(b) {
		if (Ext.isArray(b)) {
			Ext.each(b, function(m) {
				this.addBinding(m)
			}, this);
			return
		}
		var k = b.key, g = b.fn || b.handler, l = b.scope;
		if (b.stopEvent) {
			this.stopEvent = b.stopEvent
		}
		if (typeof k == "string") {
			var h = [];
			var e = k.toUpperCase();
			for ( var c = 0, d = e.length; c < d; c++) {
				h.push(e.charCodeAt(c))
			}
			k = h
		}
		var a = Ext.isArray(k);
		var i = function(p) {
			if (this.checkModifiers(b, p)) {
				var n = p.getKey();
				if (a) {
					for ( var o = 0, m = k.length; o < m; o++) {
						if (k[o] == n) {
							if (this.stopEvent) {
								p.stopEvent()
							}
							g.call(l || window, n, p);
							return
						}
					}
				} else {
					if (n == k) {
						if (this.stopEvent) {
							p.stopEvent()
						}
						g.call(l || window, n, p)
					}
				}
			}
		};
		this.bindings.push(i)
	},
	checkModifiers : function(b, h) {
		var k, d, g = [ "shift", "ctrl", "alt" ];
		for ( var c = 0, a = g.length; c < a; ++c) {
			d = g[c];
			k = b[d];
			if (!(k === undefined || (k === h[d + "Key"]))) {
				return false
			}
		}
		return true
	},
	on : function(b, d, c) {
		var h, a, e, g;
		if (typeof b == "object" && !Ext.isArray(b)) {
			h = b.key;
			a = b.shift;
			e = b.ctrl;
			g = b.alt
		} else {
			h = b
		}
		this.addBinding( {
			key :h,
			shift :a,
			ctrl :e,
			alt :g,
			fn :d,
			scope :c
		})
	},
	handleKeyDown : function(g) {
		if (this.enabled) {
			var c = this.bindings;
			for ( var d = 0, a = c.length; d < a; d++) {
				c[d].call(this, g)
			}
		}
	},
	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(a) {
		this[a ? "disable" : "enable"]()
	}
};
Ext.util.TextMetrics = function() {
	var a;
	return {
		measure : function(b, c, d) {
			if (!a) {
				a = Ext.util.TextMetrics.Instance(b, d)
			}
			a.bind(b);
			a.setFixedWidth(d || "auto");
			return a.getSize(c)
		},
		createInstance : function(b, c) {
			return Ext.util.TextMetrics.Instance(b, c)
		}
	}
}();
Ext.util.TextMetrics.Instance = function(b, d) {
	var c = new Ext.Element(document.createElement("div"));
	document.body.appendChild(c.dom);
	c.position("absolute");
	c.setLeftTop(-1000, -1000);
	c.hide();
	if (d) {
		c.setWidth(d)
	}
	var a = {
		getSize : function(g) {
			c.update(g);
			var e = c.getSize();
			c.update("");
			return e
		},
		bind : function(e) {
			c.setStyle(Ext.fly(e).getStyles("font-size", "font-style",
					"font-weight", "font-family", "line-height",
					"text-transform", "letter-spacing"))
		},
		setFixedWidth : function(e) {
			c.setWidth(e)
		},
		getWidth : function(e) {
			c.dom.style.width = "auto";
			return this.getSize(e).width
		},
		getHeight : function(e) {
			return this.getSize(e).height
		}
	};
	a.bind(b);
	return a
};
Ext.Element.addMethods( {
	getTextWidth : function(c, b, a) {
		return (Ext.util.TextMetrics.measure(this.dom, Ext.value(c,
				this.dom.innerHTML, true)).width).constrain(b || 0,
				a || 1000000)
	}
});
Ext.util.Cookies = {
	set : function(c, e) {
		var a = arguments;
		var i = arguments.length;
		var b = (i > 2) ? a[2] : null;
		var h = (i > 3) ? a[3] : "/";
		var d = (i > 4) ? a[4] : null;
		var g = (i > 5) ? a[5] : false;
		document.cookie = c + "=" + escape(e)
				+ ((b === null) ? "" : ("; expires=" + b.toGMTString()))
				+ ((h === null) ? "" : ("; path=" + h))
				+ ((d === null) ? "" : ("; domain=" + d))
				+ ((g === true) ? "; secure" : "")
	},
	get : function(d) {
		var b = d + "=";
		var g = b.length;
		var a = document.cookie.length;
		var e = 0;
		var c = 0;
		while (e < a) {
			c = e + g;
			if (document.cookie.substring(e, c) == b) {
				return Ext.util.Cookies.getCookieVal(c)
			}
			e = document.cookie.indexOf(" ", e) + 1;
			if (e === 0) {
				break
			}
		}
		return null
	},
	clear : function(a) {
		if (Ext.util.Cookies.get(a)) {
			document.cookie = a + "=; expires=Thu, 01-Jan-70 00:00:01 GMT"
		}
	},
	getCookieVal : function(b) {
		var a = document.cookie.indexOf(";", b);
		if (a == -1) {
			a = document.cookie.length
		}
		return unescape(document.cookie.substring(b, a))
	}
};
Ext.handleError = function(a) {
	throw a
};
Ext.Error = function(a) {
	this.message = (this.lang[a]) ? this.lang[a] : a
};
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 c = new Ext.util.MixedCollection();
	var b = {};
	var a = {};
	return {
		register : function(d) {
			c.add(d)
		},
		unregister : function(d) {
			c.remove(d)
		},
		get : function(d) {
			return c.get(d)
		},
		onAvailable : function(g, e, d) {
			c.on("add", function(h, i) {
				if (i.id == g) {
					e.call(d || i, i);
					c.un("add", e, d)
				}
			})
		},
		all :c,
		types :b,
		ptypes :a,
		isRegistered : function(d) {
			return b[d] !== undefined
		},
		isPluginRegistered : function(d) {
			return a[d] !== undefined
		},
		registerType : function(e, d) {
			b[e] = d;
			d.xtype = e
		},
		create : function(d, e) {
			return d.render ? d : new b[d.xtype || e](d)
		},
		registerPlugin : function(e, d) {
			a[e] = d;
			d.ptype = e
		},
		createPlugin : function(e, g) {
			var d = a[e.ptype || g];
			if (d.init) {
				return d
			} else {
				return new d(e)
			}
		}
	}
}();
Ext.reg = Ext.ComponentMgr.registerType;
Ext.preg = Ext.ComponentMgr.registerPlugin;
Ext.create = Ext.ComponentMgr.create;
Ext.Component = function(b) {
	b = b || {};
	if (b.initialConfig) {
		if (b.isAction) {
			this.baseAction = b
		}
		b = b.initialConfig
	} else {
		if (b.tagName || b.dom || Ext.isString(b)) {
			b = {
				applyTo :b,
				id :b.id || b
			}
		}
	}
	this.initialConfig = b;
	Ext.apply(this, b);
	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 c = 0, a = this.plugins.length; c < a; c++) {
				this.plugins[c] = this.initPlugin(this.plugins[c])
			}
		} 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(a) {
						if (a.ptype && !Ext.isFunction(a.init)) {
							a = Ext.ComponentMgr.createPlugin(a)
						} else {
							if (Ext.isString(a)) {
								a = Ext.ComponentMgr.createPlugin( {
									ptype :a
								})
							}
						}
						a.init(this);
						return a
					},
					initComponent : function() {
						if (this.listeners) {
							this.on(this.listeners);
							delete this.listeners
						}
						this.enableBubble(this.bubbleEvents)
					},
					render : function(b, a) {
						if (!this.rendered
								&& this.fireEvent("beforerender", this) !== false) {
							if (!b && this.el) {
								this.el = Ext.get(this.el);
								b = this.el.dom.parentNode;
								this.allowDomMove = false
							}
							this.container = Ext.get(b);
							if (this.ctCls) {
								this.container.addClass(this.ctCls)
							}
							this.rendered = true;
							if (a !== undefined) {
								if (Ext.isNumber(a)) {
									a = this.container.dom.childNodes[a]
								} else {
									a = Ext.getDom(a)
								}
							}
							this.onRender(this.container, a || 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 c = this.getContentTarget();
							if (this.html) {
								c.update(Ext.DomHelper.markup(this.html));
								delete this.html
							}
							if (this.contentEl) {
								var d = Ext.getDom(this.contentEl);
								Ext.fly(d).removeClass(
										[ "x-hidden", "x-hide-display" ]);
								c.appendChild(d)
							}
							if (this.tpl) {
								if (!this.tpl.compile) {
									this.tpl = new Ext.XTemplate(this.tpl)
								}
								if (this.data) {
									this.tpl[this.tplWriteMode](c, 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(b, d, a) {
						var c = this.getContentTarget();
						if (this.tpl && typeof b !== "string") {
							this.tpl[this.tplWriteMode](c, b || {})
						} else {
							var e = Ext.isObject(b) ? Ext.DomHelper.markup(b)
									: b;
							c.update(e, d, a)
						}
					},
					onAdded : function(a, b) {
						this.ownerCt = a;
						this.initRef();
						this.fireEvent("added", this, a, b)
					},
					onRemoved : function() {
						this.removeRef();
						this.fireEvent("removed", this, this.ownerCt);
						delete this.ownerCt
					},
					initRef : function() {
						if (this.ref && !this.refOwner) {
							var d = this.ref.split("/"), c = d.length, b = 0, a = this;
							while (a && b < c) {
								a = a.ownerCt;
								++b
							}
							if (a) {
								a[this.refName = d[--b]] = this;
								this.refOwner = a
							}
						}
					},
					removeRef : function() {
						if (this.refOwner && this.refName) {
							delete this.refOwner[this.refName];
							delete this.refOwner
						}
					},
					initState : function() {
						if (Ext.state.Manager) {
							var b = this.getStateId();
							if (b) {
								var a = Ext.state.Manager.get(b);
								if (a) {
									if (this.fireEvent("beforestaterestore",
											this, a) !== false) {
										this.applyState(Ext.apply( {}, a));
										this.fireEvent("staterestore", this, a)
									}
								}
							}
						}
					},
					getStateId : function() {
						return this.stateId
								|| ((/^(ext-comp-|ext-gen)/)
										.test(String(this.id)) ? null : this.id)
					},
					initStateEvents : function() {
						if (this.stateEvents) {
							for ( var a = 0, b; b = this.stateEvents[a]; a++) {
								this.on(b, this.saveState, this, {
									delay :100
								})
							}
						}
					},
					applyState : function(a) {
						if (a) {
							Ext.apply(this, a)
						}
					},
					getState : function() {
						return null
					},
					saveState : function() {
						if (Ext.state.Manager && this.stateful !== false) {
							var b = this.getStateId();
							if (b) {
								var a = this.getState();
								if (this.fireEvent("beforestatesave", this, a) !== false) {
									Ext.state.Manager.set(b, a);
									this.fireEvent("statesave", this, a)
								}
							}
						}
					},
					applyToMarkup : function(a) {
						this.allowDomMove = false;
						this.el = Ext.get(a);
						this.render(this.el.dom.parentNode)
					},
					addClass : function(a) {
						if (this.el) {
							this.el.addClass(a)
						} else {
							this.cls = this.cls ? this.cls + " " + a : a
						}
						return this
					},
					removeClass : function(a) {
						if (this.el) {
							this.el.removeClass(a)
						} else {
							if (this.cls) {
								this.cls = this.cls.split(" ").remove(a).join(
										" ")
							}
						}
						return this
					},
					onRender : function(b, a) {
						if (!this.el && this.autoEl) {
							if (Ext.isString(this.autoEl)) {
								this.el = document.createElement(this.autoEl)
							} else {
								var c = document.createElement("div");
								Ext.DomHelper.overwrite(c, this.autoEl);
								this.el = c.firstChild
							}
							if (!this.el.id) {
								this.el.id = this.getId()
							}
						}
						if (this.el) {
							this.el = Ext.get(this.el);
							if (this.allowDomMove !== false) {
								b.dom.insertBefore(this.el.dom, a);
								if (c) {
									Ext.removeNode(c);
									c = null
								}
							}
						}
					},
					getAutoCreate : function() {
						var a = Ext.isObject(this.autoCreate) ? this.autoCreate
								: Ext.apply( {}, this.defaultAutoCreate);
						if (this.id && !a.id) {
							a.id = this.id
						}
						return a
					},
					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 b = arguments;
						for ( var c = 0, a = b.length; c < a; ++c) {
							delete this[b[c]]
						}
					},
					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(b, a) {
						if (a) {
							this.focusTask = new Ext.util.DelayedTask(
									this.focus, this, [ b, false ]);
							this.focusTask.delay(Ext.isNumber(a) ? a : 10);
							return this
						}
						if (this.rendered && !this.isDestroyed) {
							this.el.focus();
							if (b === true) {
								this.el.dom.select()
							}
						}
						return this
					},
					blur : function() {
						if (this.rendered) {
							this.el.blur()
						}
						return this
					},
					disable : function(a) {
						if (this.rendered) {
							this.onDisable()
						}
						this.disabled = true;
						if (a !== 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(a) {
						return this[a ? "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(a) {
						return this[a ? "show" : "hide"]()
					},
					isVisible : function() {
						return this.rendered
								&& this.getVisibilityEl().isVisible()
					},
					cloneConfig : function(b) {
						b = b || {};
						var c = b.id || Ext.id();
						var a = Ext.applyIf(b, this.initialConfig);
						a.id = c;
						return new this.constructor(a)
					},
					getXType : function() {
						return this.constructor.xtype
					},
					isXType : function(b, a) {
						if (Ext.isFunction(b)) {
							b = b.xtype
						} else {
							if (Ext.isObject(b)) {
								b = b.constructor.xtype
							}
						}
						return !a ? ("/" + this.getXTypes() + "/").indexOf("/"
								+ b + "/") != -1 : this.constructor.xtype == b
					},
					getXTypes : function() {
						var a = this.constructor;
						if (!a.xtypes) {
							var d = [], b = this;
							while (b && b.constructor.xtype) {
								d.unshift(b.constructor.xtype);
								b = b.constructor.superclass
							}
							a.xtypeChain = d;
							a.xtypes = d.join("/")
						}
						return a.xtypes
					},
					findParentBy : function(a) {
						for ( var b = this.ownerCt; (b != null) && !a(b, this); b = b.ownerCt) {
						}
						return b || null
					},
					findParentByType : function(b, a) {
						return this.findParentBy( function(d) {
							return d.isXType(b, a)
						})
					},
					bubble : function(c, b, a) {
						var d = this;
						while (d) {
							if (c.apply(b || d, a || [ d ]) === false) {
								break
							}
							d = d.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(a) {
							a.item.un(a.ename, a.fn, a.scope)
						}, this);
						this.mons = []
					},
					createMons : function() {
						if (!this.mons) {
							this.mons = [];
							this.on("beforedestroy", this.clearMons, this, {
								single :true
							})
						}
					},
					mon : function(g, b, d, c, a) {
						this.createMons();
						if (Ext.isObject(b)) {
							var k = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;
							var i = b;
							for ( var h in i) {
								if (k.test(h)) {
									continue
								}
								if (Ext.isFunction(i[h])) {
									this.mons.push( {
										item :g,
										ename :h,
										fn :i[h],
										scope :i.scope
									});
									g.on(h, i[h], i.scope, i)
								} else {
									this.mons.push( {
										item :g,
										ename :h,
										fn :i[h],
										scope :i.scope
									});
									g.on(h, i[h])
								}
							}
							return
						}
						this.mons.push( {
							item :g,
							ename :b,
							fn :d,
							scope :c
						});
						g.on(b, d, c, a)
					},
					mun : function(h, c, g, e) {
						var k, d;
						this.createMons();
						for ( var b = 0, a = this.mons.length; b < a; ++b) {
							d = this.mons[b];
							if (h === d.item && c == d.ename && g === d.fn
									&& e === d.scope) {
								this.mons.splice(b, 1);
								h.un(c, g, e);
								k = true;
								break
							}
						}
						return k
					},
					nextSibling : function() {
						if (this.ownerCt) {
							var a = this.ownerCt.items.indexOf(this);
							if (a != -1
									&& a + 1 < this.ownerCt.items.getCount()) {
								return this.ownerCt.items.itemAt(a + 1)
							}
						}
						return null
					},
					previousSibling : function() {
						if (this.ownerCt) {
							var a = this.ownerCt.items.indexOf(this);
							if (a > 0) {
								return this.ownerCt.items.itemAt(a - 1)
							}
						}
						return null
					},
					getBubbleTarget : function() {
						return this.ownerCt
					}
				});
Ext.reg("component", Ext.Component);
Ext.Action = Ext.extend(Object, {
	constructor : function(a) {
		this.initialConfig = a;
		this.itemId = a.itemId = (a.itemId || a.id || Ext.id());
		this.items = []
	},
	isAction :true,
	setText : function(a) {
		this.initialConfig.text = a;
		this.callEach("setText", [ a ])
	},
	getText : function() {
		return this.initialConfig.text
	},
	setIconClass : function(a) {
		this.initialConfig.iconCls = a;
		this.callEach("setIconClass", [ a ])
	},
	getIconClass : function() {
		return this.initialConfig.iconCls
	},
	setDisabled : function(a) {
		this.initialConfig.disabled = a;
		this.callEach("setDisabled", [ a ])
	},
	enable : function() {
		this.setDisabled(false)
	},
	disable : function() {
		this.setDisabled(true)
	},
	isDisabled : function() {
		return this.initialConfig.disabled
	},
	setHidden : function(a) {
		this.initialConfig.hidden = a;
		this.callEach("setVisible", [ !a ])
	},
	show : function() {
		this.setHidden(false)
	},
	hide : function() {
		this.setHidden(true)
	},
	isHidden : function() {
		return this.initialConfig.hidden
	},
	setHandler : function(b, a) {
		this.initialConfig.handler = b;
		this.initialConfig.scope = a;
		this.callEach("setHandler", [ b, a ])
	},
	each : function(b, a) {
		Ext.each(this.items, b, a)
	},
	callEach : function(e, b) {
		var d = this.items;
		for ( var c = 0, a = d.length; c < a; c++) {
			d[c][e].apply(d[c], b)
		}
	},
	addComponent : function(a) {
		this.items.push(a);
		a.on("destroy", this.removeComponent, this)
	},
	removeComponent : function(a) {
		this.items.remove(a)
	},
	execute : function() {
		this.initialConfig.handler.apply(this.initialConfig.scope || window,
				arguments)
	}
});
( function() {
	Ext.Layer = function(d, c) {
		d = d || {};
		var e = Ext.DomHelper, h = d.parentEl, g = h ? Ext.getDom(h)
				: document.body;
		if (c) {
			this.dom = Ext.getDom(c)
		}
		if (!this.dom) {
			var i = d.dh || {
				tag :"div",
				cls :"x-layer"
			};
			this.dom = e.append(g, i)
		}
		if (d.cls) {
			this.addClass(d.cls)
		}
		this.constrain = d.constrain !== false;
		this.setVisibilityMode(Ext.Element.VISIBILITY);
		if (d.id) {
			this.id = this.dom.id = d.id
		} else {
			this.id = Ext.id(this.dom)
		}
		this.zindex = d.zindex || this.getZIndex();
		this.position("absolute", this.zindex);
		if (d.shadow) {
			this.shadowOffset = d.shadowOffset || 4;
			this.shadow = new Ext.Shadow( {
				offset :this.shadowOffset,
				mode :d.shadow
			})
		} else {
			this.shadowOffset = 0
		}
		this.useShim = d.shim !== false && Ext.useShims;
		this.useDisplay = d.useDisplay;
		this.hide()
	};
	var a = Ext.Element.prototype;
	var b = [];
	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 d = b.shift();
							if (!d) {
								d = this.createShim();
								d.enableDisplayMode("block");
								d.dom.style.display = "none";
								d.dom.style.visibility = "visible"
							}
							var c = this.dom.parentNode;
							if (d.dom.parentNode != c) {
								c.insertBefore(d.dom, this.dom)
							}
							d.setStyle("z-index", this.getZIndex() - 2);
							this.shim = d;
							return d
						},
						hideShim : function() {
							if (this.shim) {
								this.shim.setDisplayed(false);
								b.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(c) {
							if (this.shadow) {
								this.shadowDisabled = false;
								this.shadowOffset = this.lastShadowOffset;
								delete this.lastShadowOffset;
								if (c) {
									this.sync(true)
								}
							}
						},
						sync : function(d) {
							
							var o = this.shadow;
							if (!this.updating && this.isVisible()
									&& (o || this.useShim)) {
								var i = this.getShim(), n = this.getWidth(), k = this
										.getHeight(), e = this.getLeft(true), p = this
										.getTop(true);
								if (o && !this.shadowDisabled) {
									if (d && !o.isVisible()) {
										o.show(this)
									} else {
										o.realign(e, p, n, k)
									}
									if (i) {
										if (d) {
											i.show()
										}
										var m = o.el.getXY(), g = i.dom.style, c = o.el
												.getSize();
										g.left = (m[0]) + "px";
										g.top = (m[1]) + "px";
										g.width = (c.width) + "px";
										g.height = (c.height) + "px"
									}
								} else {
									if (i) {
										if (d) {
											i.show()
										}
										i.setSize(n, k);
										i.setLeftTop(e, p)
									}
								}
							}
						},
						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(c) {
							if (this.shadow) {
								this.shadow.hide()
							}
							this.hideShim()
						},
						constrainXY : function() {
							if (this.constrain) {
								var k = Ext.lib.Dom.getViewWidth(), d = Ext.lib.Dom
										.getViewHeight();
								var p = Ext.getDoc().getScroll();
								var o = this.getXY();
								var l = o[0], i = o[1];
								var c = this.shadowOffset;
								var m = this.dom.offsetWidth + c, e = this.dom.offsetHeight
										+ c;
								var g = false;
								if ((l + m) > k + p.left) {
									l = k - m - c;
									g = true
								}
								if ((i + e) > d + p.top) {
									i = d - e - c;
									g = true
								}
								if (l < p.left) {
									l = p.left;
									g = true
								}
								if (i < p.top) {
									i = p.top;
									g = true
								}
								if (g) {
									if (this.avoidY) {
										var n = this.avoidY;
										if (i <= n && (i + e) >= n) {
											i = n - e - 5
										}
									}
									o = [ l, i ];
									this.storeXY(o);
									a.setXY.call(this, o);
									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) {
									a.setXY.call(this, this.lastXY)
								} else {
									if (this.lastLT) {
										a.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(i, h, l, m, k) {
							if (i) {
								this.showAction()
							}
							if (h && i) {
								var g = function() {
									this.sync(true);
									if (m) {
										m()
									}
								}.createDelegate(this);
								a.setVisible.call(this, true, true, l, g, k)
							} else {
								if (!i) {
									this.hideUnders(true)
								}
								var g = m;
								if (h) {
									g = function() {
										this.hideAction();
										if (m) {
											m()
										}
									}.createDelegate(this)
								}
								a.setVisible.call(this, i, h, l, g, k);
								if (i) {
									this.sync(true)
								} else {
									if (!h) {
										this.hideAction()
									}
								}
							}
							return this
						},
						storeXY : function(c) {
							delete this.lastLT;
							this.lastXY = c
						},
						storeLeftTop : function(d, c) {
							delete this.lastXY;
							this.lastLT = [ d, c ]
						},
						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(c) {
							this.storeLeftTop(c, this.getTop(true));
							a.setLeft.apply(this, arguments);
							this.sync();
							return this
						},
						setTop : function(c) {
							this.storeLeftTop(this.getLeft(true), c);
							a.setTop.apply(this, arguments);
							this.sync();
							return this
						},
						setLeftTop : function(d, c) {
							this.storeLeftTop(d, c);
							a.setLeftTop.apply(this, arguments);
							this.sync();
							return this
						},
						setXY : function(k, h, l, m, i) {
							this.fixDisplay();
							this.beforeAction();
							this.storeXY(k);
							var g = this.createCB(m);
							a.setXY.call(this, k, h, l, g, i);
							if (!h) {
								g()
							}
							return this
						},
						createCB : function(e) {
							var d = this;
							return function() {
								d.constrainXY();
								d.sync(true);
								if (e) {
									e()
								}
							}
						},
						setX : function(g, h, k, l, i) {
							this.setXY( [ g, this.getY() ], h, k, l, i);
							return this
						},
						setY : function(l, g, i, k, h) {
							this.setXY( [ this.getX(), l ], g, i, k, h);
							return this
						},
						setSize : function(k, l, i, n, o, m) {
							this.beforeAction();
							var g = this.createCB(o);
							a.setSize.call(this, k, l, i, n, g, m);
							if (!i) {
								g()
							}
							return this
						},
						setWidth : function(i, h, l, m, k) {
							this.beforeAction();
							var g = this.createCB(m);
							a.setWidth.call(this, i, h, l, g, k);
							if (!h) {
								g()
							}
							return this
						},
						setHeight : function(k, i, m, n, l) {
							this.beforeAction();
							var g = this.createCB(n);
							a.setHeight.call(this, k, i, m, g, l);
							if (!i) {
								g()
							}
							return this
						},
						setBounds : function(p, n, q, i, o, l, m, k) {
							this.beforeAction();
							var g = this.createCB(m);
							if (!o) {
								this.storeXY( [ p, n ]);
								a.setXY.call(this, [ p, n ]);
								a.setSize.call(this, q, i, o, l, g, k);
								g()
							} else {
								a.setBounds.call(this, p, n, q, i, o, l, g, k)
							}
							return this
						},
						setZIndex : function(c) {
							this.zindex = c;
							this.setStyle("z-index", c + 2);
							if (this.shadow) {
								this.shadow.setZIndex(c + 1)
							}
							if (this.shim) {
								this.shim.setStyle("z-index", c)
							}
							return this
						}
					})
})();
Ext.Shadow = function(d) {
	Ext.apply(this, d);
	if (typeof this.mode != "string") {
		this.mode = this.defaultMode
	}
	var e = this.offset, c = {
		h :0
	}, b = Math.floor(this.offset / 2);
	switch (this.mode.toLowerCase()) {
	case "drop":
		c.w = 0;
		c.l = c.t = e;
		c.t -= 1;
		if (Ext.isIE) {
			c.l -= this.offset + b;
			c.t -= this.offset + b;
			c.w -= b;
			c.h -= b;
			c.t += 1
		}
		break;
	case "sides":
		c.w = (e * 2);
		c.l = -e;
		c.t = e - 1;
		if (Ext.isIE) {
			c.l -= (this.offset - b);
			c.t -= this.offset + b;
			c.l += 1;
			c.w -= (this.offset - b) * 2;
			c.w -= b + 1;
			c.h -= 1
		}
		break;
	case "frame":
		c.w = c.h = (e * 2);
		c.l = c.t = -e;
		c.t += 1;
		c.h -= 2;
		if (Ext.isIE) {
			c.l -= (this.offset - b);
			c.t -= (this.offset - b);
			c.l += 1;
			c.w -= (this.offset + b + 1);
			c.h -= (this.offset + b);
			c.h += 1
		}
		break
	}
	this.adjusts = c
};
Ext.Shadow.prototype = {
	offset :4,
	defaultMode :"drop",
	show : function(a) {
		a = Ext.get(a);
		if (!this.el) {
			this.el = Ext.Shadow.Pool.pull();
			if (this.el.dom.nextSibling != a.dom) {
				this.el.insertBefore(a)
			}
		}
		this.el.setStyle("z-index", this.zIndex
				|| parseInt(a.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(a.getLeft(true), a.getTop(true), a.getWidth(), a
				.getHeight());
		this.el.dom.style.display = "block"
	},
	isVisible : function() {
		return this.el ? true : false
	},
	realign : function(b, u, r, g) {
		if (!this.el) {
			return
		}
		var o = this.adjusts, m = this.el.dom, v = m.style, i = 0, q = (r + o.w), e = (g + o.h), k = q
				+ "px", p = e + "px", n, c;
		v.left = (b + o.l) + "px";
		v.top = (u + o.t) + "px";
		if (v.width != k || v.height != p) {
			v.width = k;
			v.height = p;
			if (!Ext.isIE) {
				n = m.childNodes;
				c = Math.max(0, (q - 12)) + "px";
				n[0].childNodes[1].style.width = c;
				n[1].childNodes[1].style.width = c;
				n[2].childNodes[1].style.width = c;
				n[1].style.height = Math.max(0, (e - 12)) + "px"
			}
		}
	},
	hide : function() {
		if (this.el) {
			this.el.dom.style.display = "none";
			Ext.Shadow.Pool.push(this.el);
			delete this.el
		}
	},
	setZIndex : function(a) {
		this.zIndex = a;
		if (this.el) {
			this.el.setStyle("z-index", a)
		}
	}
};
Ext.Shadow.Pool = function() {
	var b = [], a = 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 c = b.shift();
			if (!c) {
				c = Ext.get(Ext.DomHelper.insertHtml("beforeBegin",
						document.body.firstChild, a));
				c.autoBoxAdjust = false
			}
			return c
		},
		push : function(c) {
			b.push(c)
		}
	}
}();
Ext.BoxComponent = Ext.extend(Ext.Component, {
	initComponent : function() {
		Ext.BoxComponent.superclass.initComponent.call(this);
		this.addEvents("resize", "move")
	},
	boxReady :false,
	deferHeight :false,
	setSize : function(b, d) {
		if (typeof b == "object") {
			d = b.height;
			b = b.width
		}
		if (Ext.isDefined(b) && Ext.isDefined(this.boxMinWidth)
				&& (b < this.boxMinWidth)) {
			b = this.boxMinWidth
		}
		if (Ext.isDefined(d) && Ext.isDefined(this.boxMinHeight)
				&& (d < this.boxMinHeight)) {
			d = this.boxMinHeight
		}
		if (Ext.isDefined(b) && Ext.isDefined(this.boxMaxWidth)
				&& (b > this.boxMaxWidth)) {
			b = this.boxMaxWidth
		}
		if (Ext.isDefined(d) && Ext.isDefined(this.boxMaxHeight)
				&& (d > this.boxMaxHeight)) {
			d = this.boxMaxHeight
		}
		if (!this.boxReady) {
			this.width = b;
			this.height = d;
			return this
		}
		if (this.cacheSizes !== false && this.lastSize
				&& this.lastSize.width == b && this.lastSize.height == d) {
			return this
		}
		this.lastSize = {
			width :b,
			height :d
		};
		var c = this.adjustSize(b, d), g = c.width, a = c.height, e;
		if (g !== undefined || a !== undefined) {
			e = this.getResizeEl();
			if (!this.deferHeight && g !== undefined && a !== undefined) {
				e.setSize(g, a)
			} else {
				if (!this.deferHeight && a !== undefined) {
					e.setHeight(a)
				} else {
					if (g !== undefined) {
						e.setWidth(g)
					}
				}
			}
			this.onResize(g, a, b, d);
			this.fireEvent("resize", this, g, a, b, d)
		}
		return this
	},
	setWidth : function(a) {
		return this.setSize(a)
	},
	setHeight : function(a) {
		return this.setSize(undefined, a)
	},
	getSize : function() {
		return this.getResizeEl().getSize()
	},
	getWidth : function() {
		return this.getResizeEl().getWidth()
	},
	getHeight : function() {
		return this.getResizeEl().getHeight()
	},
	getOuterSize : function() {
		var a = this.getResizeEl();
		return {
			width :a.getWidth() + a.getMargins("lr"),
			height :a.getHeight() + a.getMargins("tb")
		}
	},
	getPosition : function(a) {
		var b = this.getPositionEl();
		if (a === true) {
			return [ b.getLeft(true), b.getTop(true) ]
		}
		return this.xy || b.getXY()
	},
	getBox : function(a) {
		var c = this.getPosition(a);
		var b = this.getSize();
		b.x = c[0];
		b.y = c[1];
		return b
	},
	updateBox : function(a) {
		this.setSize(a.width, a.height);
		this.setPagePosition(a.x, a.y);
		return this
	},
	getResizeEl : function() {
		return this.resizeEl || this.el
	},
	setAutoScroll : function(a) {
		if (this.rendered) {
			this.getContentTarget().setOverflow(a ? "auto" : "")
		}
		this.autoScroll = a;
		return this
	},
	setPosition : function(a, g) {
		if (a && typeof a[1] == "number") {
			g = a[1];
			a = a[0]
		}
		this.x = a;
		this.y = g;
		if (!this.boxReady) {
			return this
		}
		var b = this.adjustPosition(a, g);
		var e = b.x, d = b.y;
		var c = this.getPositionEl();
		if (e !== undefined || d !== undefined) {
			if (e !== undefined && d !== undefined) {
				c.setLeftTop(e, d)
			} else {
				if (e !== undefined) {
					c.setLeft(e)
				} else {
					if (d !== undefined) {
						c.setTop(d)
					}
				}
			}
			this.onPosition(e, d);
			this.fireEvent("move", this, e, d)
		}
		return this
	},
	setPagePosition : function(a, c) {
		if (a && typeof a[1] == "number") {
			c = a[1];
			a = a[0]
		}
		this.pageX = a;
		this.pageY = c;
		if (!this.boxReady) {
			return
		}
		if (a === undefined || c === undefined) {
			return
		}
		var b = this.getPositionEl().translatePoints(a, c);
		this.setPosition(b.left, b.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(d, b, a, c) {
	},
	onPosition : function(a, b) {
	},
	adjustSize : function(a, b) {
		if (this.autoWidth) {
			a = "auto"
		}
		if (this.autoHeight) {
			b = "auto"
		}
		return {
			width :a,
			height :b
		}
	},
	adjustPosition : function(a, b) {
		return {
			x :a,
			y :b
		}
	}
});
Ext.reg("box", Ext.BoxComponent);
Ext.Spacer = Ext.extend(Ext.BoxComponent, {
	autoEl :"div"
});
Ext.reg("spacer", Ext.Spacer);
Ext.SplitBar = function(c, e, b, d, a) {
	this.el = Ext.get(c, true);
	this.el.dom.unselectable = "on";
	this.resizingEl = Ext.get(e, true);
	this.orientation = b || Ext.SplitBar.HORIZONTAL;
	this.minSize = 0;
	this.maxSize = 2000;
	this.animate = false;
	this.useShim = false;
	this.shim = null;
	if (!a) {
		this.proxy = Ext.SplitBar.createProxy(this.orientation)
	} else {
		this.proxy = Ext.get(a).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 = d
				|| (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT
						: Ext.SplitBar.RIGHT);
		this.el.addClass("x-splitbar-h")
	} else {
		this.placement = d
				|| (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(a, e) {
				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 c = this.adapter.getElementSize(this);
				this.activeMinSize = this.getMinimumSize();
				this.activeMaxSize = this.getMaximumSize();
				var d = c - this.activeMinSize;
				var b = Math.max(this.activeMaxSize - c, 0);
				if (this.orientation == Ext.SplitBar.HORIZONTAL) {
					this.dd.resetConstraints();
					this.dd.setXConstraint(
							this.placement == Ext.SplitBar.LEFT ? d : b,
							this.placement == Ext.SplitBar.LEFT ? b : d,
							this.tickSize);
					this.dd.setYConstraint(0, 0)
				} else {
					this.dd.resetConstraints();
					this.dd.setXConstraint(0, 0);
					this.dd.setYConstraint(
							this.placement == Ext.SplitBar.TOP ? d : b,
							this.placement == Ext.SplitBar.TOP ? b : d,
							this.tickSize)
				}
				this.dragSpecs.startSize = c;
				this.dragSpecs.startPoint = [ a, e ];
				Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, a, e)
			},
			onEndProxyDrag : function(c) {
				Ext.get(this.proxy).setDisplayed(false);
				var b = Ext.lib.Event.getXY(c);
				if (this.overlay) {
					Ext.destroy(this.overlay);
					delete this.overlay
				}
				var a;
				if (this.orientation == Ext.SplitBar.HORIZONTAL) {
					a = this.dragSpecs.startSize
							+ (this.placement == Ext.SplitBar.LEFT ? b[0]
									- this.dragSpecs.startPoint[0]
									: this.dragSpecs.startPoint[0] - b[0])
				} else {
					a = this.dragSpecs.startSize
							+ (this.placement == Ext.SplitBar.TOP ? b[1]
									- this.dragSpecs.startPoint[1]
									: this.dragSpecs.startPoint[1] - b[1])
				}
				a = Math.min(Math.max(a, this.activeMinSize),
						this.activeMaxSize);
				if (a != this.dragSpecs.startSize) {
					if (this.fireEvent("beforeapply", this, a) !== false) {
						this.adapter.setElementSize(this, a);
						this.fireEvent("moved", this, a);
						this.fireEvent("resize", this, a)
					}
				}
			},
			getAdapter : function() {
				return this.adapter
			},
			setAdapter : function(a) {
				this.adapter = a;
				this.adapter.init(this)
			},
			getMinimumSize : function() {
				return this.minSize
			},
			setMinimumSize : function(a) {
				this.minSize = a
			},
			getMaximumSize : function() {
				return this.maxSize
			},
			setMaximumSize : function(a) {
				this.maxSize = a
			},
			setCurrentSize : function(b) {
				var a = this.animate;
				this.animate = false;
				this.adapter.setElementSize(this, b);
				this.animate = a
			},
			destroy : function(a) {
				Ext.destroy(this.shim, Ext.get(this.proxy));
				this.dd.unreg();
				if (a) {
					this.el.remove()
				}
				this.purgeListeners()
			}
		});
Ext.SplitBar.createProxy = function(b) {
	var c = new Ext.Element(document.createElement("div"));
	document.body.appendChild(c.dom);
	c.unselectable();
	var a = "x-splitbar-proxy";
	c.addClass(a + " " + (b == Ext.SplitBar.HORIZONTAL ? a + "-h" : a + "-v"));
	return c.dom
};
Ext.SplitBar.BasicLayoutAdapter = function() {
};
Ext.SplitBar.BasicLayoutAdapter.prototype = {
	init : function(a) {
	},
	getElementSize : function(a) {
		if (a.orientation == Ext.SplitBar.HORIZONTAL) {
			return a.resizingEl.getWidth()
		} else {
			return a.resizingEl.getHeight()
		}
	},
	setElementSize : function(b, a, c) {
		if (b.orientation == Ext.SplitBar.HORIZONTAL) {
			if (!b.animate) {
				b.resizingEl.setWidth(a);
				if (c) {
					c(b, a)
				}
			} else {
				b.resizingEl.setWidth(a, true, 0.1, c, "easeOut")
			}
		} else {
			if (!b.animate) {
				b.resizingEl.setHeight(a);
				if (c) {
					c(b, a)
				}
			} else {
				b.resizingEl.setHeight(a, true, 0.1, c, "easeOut")
			}
		}
	}
};
Ext.SplitBar.AbsoluteLayoutAdapter = function(a) {
	this.basic = new Ext.SplitBar.BasicLayoutAdapter();
	this.container = Ext.get(a)
};
Ext.SplitBar.AbsoluteLayoutAdapter.prototype = {
	init : function(a) {
		this.basic.init(a)
	},
	getElementSize : function(a) {
		return this.basic.getElementSize(a)
	},
	setElementSize : function(b, a, c) {
		this.basic.setElementSize(b, a, this.moveSplitter.createDelegate(this,
				[ b ]))
	},
	moveSplitter : function(a) {
		var b = Ext.SplitBar;
		switch (a.placement) {
		case b.LEFT:
			a.el.setX(a.resizingEl.getRight());
			break;
		case b.RIGHT:
			a.el.setStyle("right", (this.container.getWidth() - a.resizingEl
					.getLeft())
					+ "px");
			break;
		case b.TOP:
			a.el.setY(a.resizingEl.getBottom());
			break;
		case b.BOTTOM:
			a.el.setY(a.resizingEl.getTop() - a.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 a = this.items;
		if (a) {
			delete this.items;
			this.add(a)
		}
	},
	initItems : function() {
		if (!this.items) {
			this.items = new Ext.util.MixedCollection(false,
					this.getComponentId);
			this.getLayout()
		}
	},
	setLayout : function(a) {
		if (this.layout && this.layout != a) {
			this.layout.setContainer(null)
		}
		this.layout = a;
		this.initItems();
		a.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 a = this.activeItem;
			delete this.activeItem;
			this.layout.setActiveItem(a)
		}
		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(a) {
		return a.getItemId()
	},
	add : function(b) {
		this.initItems();
		var e = arguments.length > 1;
		if (e || Ext.isArray(b)) {
			var a = [];
			Ext.each(e ? arguments : b, function(h) {
				a.push(this.add(h))
			}, this);
			return a
		}
		var g = this.lookupComponent(this.applyDefaults(b));
		var d = this.items.length;
		if (this.fireEvent("beforeadd", this, g, d) !== false
				&& this.onBeforeAdd(g) !== false) {
			this.items.add(g);
			g.onAdded(this, d);
			this.onAdd(g);
			this.fireEvent("add", this, g, d)
		}
		return g
	},
	onAdd : function(a) {
	},
	onAdded : function(a, b) {
		this.ownerCt = a;
		this.initRef();
		this.cascade( function(d) {
			d.initRef()
		});
		this.fireEvent("added", this, a, b)
	},
	insert : function(e, b) {
		var d = arguments, h = d.length, a = [], g, k;
		this.initItems();
		if (h > 2) {
			for (g = h - 1; g >= 1; --g) {
				a.push(this.insert(e, d[g]))
			}
			return a
		}
		k = this.lookupComponent(this.applyDefaults(b));
		e = Math.min(e, this.items.length);
		if (this.fireEvent("beforeadd", this, k, e) !== false
				&& this.onBeforeAdd(k) !== false) {
			if (k.ownerCt == this) {
				this.items.remove(k)
			}
			this.items.insert(e, k);
			k.onAdded(this, e);
			this.onAdd(k);
			this.fireEvent("add", this, k, e)
		}
		return k
	},
	applyDefaults : function(b) {
		var a = this.defaults;
		if (a) {
			if (Ext.isFunction(a)) {
				a = a.call(this, b)
			}
			if (Ext.isString(b)) {
				b = Ext.ComponentMgr.get(b);
				Ext.apply(b, a)
			} else {
				if (!b.events) {
					Ext.applyIf(b.isAction ? b.initialConfig : b, a)
				} else {
					Ext.apply(b, a)
				}
			}
		}
		return b
	},
	onBeforeAdd : function(a) {
		if (a.ownerCt) {
			a.ownerCt.remove(a, false)
		}
		if (this.hideBorders === true) {
			a.border = (a.border === true)
		}
	},
	remove : function(a, b) {
		this.initItems();
		var d = this.getComponent(a);
		if (d && this.fireEvent("beforeremove", this, d) !== false) {
			this.doRemove(d, b);
			this.fireEvent("remove", this, d)
		}
		return d
	},
	onRemove : function(a) {
	},
	doRemove : function(e, d) {
		var b = this.layout, a = b && this.rendered;
		if (a) {
			b.onRemove(e)
		}
		this.items.remove(e);
		e.onRemoved();
		this.onRemove(e);
		if (d === true || (d !== false && this.autoDestroy)) {
			e.destroy()
		}
		if (a) {
			b.afterRemove(e)
		}
	},
	removeAll : function(c) {
		this.initItems();
		var e, g = [], b = [];
		this.items.each( function(h) {
			g.push(h)
		});
		for ( var d = 0, a = g.length; d < a; ++d) {
			e = g[d];
			this.remove(e, c);
			if (e.ownerCt !== this) {
				b.push(e)
			}
		}
		return b
	},
	getComponent : function(a) {
		if (Ext.isObject(a)) {
			a = a.getItemId()
		}
		return this.items.get(a)
	},
	lookupComponent : function(a) {
		if (Ext.isString(a)) {
			return Ext.ComponentMgr.get(a)
		} else {
			if (!a.events) {
				return this.createComponent(a)
			}
		}
		return a
	},
	createComponent : function(a, d) {
		if (a.render) {
			return a
		}
		var b = Ext.create(Ext.apply( {
			ownerCt :this
		}, a), d || this.defaultType);
		delete b.initialConfig.ownerCt;
		delete b.ownerCt;
		return b
	},
	canLayout : function() {
		var a = this.getVisibilityEl();
		return a && a.dom && !a.isStyle("display", "none")
	},
	doLayout : function(g, e) {
		var l = this.rendered, k = e || this.forceLayout;
		if (this.collapsed || !this.canLayout()) {
			this.deferLayout = this.deferLayout || !g;
			if (!k) {
				return
			}
			g = g && !this.deferLayout
		} else {
			delete this.deferLayout
		}
		if (l && this.layout) {
			this.layout.layout()
		}
		if (g !== true && this.items) {
			var d = this.items.items;
			for ( var b = 0, a = d.length; b < a; b++) {
				var h = d[b];
				if (h.doLayout) {
					h.doLayout(false, k)
				}
			}
		}
		if (l) {
			this.onLayout(g, k)
		}
		this.hasLayout = true;
		delete this.forceLayout
	},
	onLayout :Ext.emptyFn,
	shouldBufferLayout : function() {
		var a = this.hasLayout;
		if (this.ownerCt) {
			return a ? !this.hasLayoutPending() : false
		}
		return a
	},
	hasLayoutPending : function() {
		var a = false;
		this.ownerCt.bubble( function(b) {
			if (b.layoutPending) {
				a = true;
				return false
			}
		});
		return a
	},
	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 a = new Ext.layout.AutoLayout(this.layoutConfig);
			this.setLayout(a)
		}
		return this.layout
	},
	beforeDestroy : function() {
		var a;
		if (this.items) {
			while (a = this.items.first()) {
				this.doRemove(a, true)
			}
		}
		if (this.monitorResize) {
			Ext.EventManager.removeResizeListener(this.doLayout, this)
		}
		Ext.destroy(this.layout);
		Ext.Container.superclass.beforeDestroy.call(this)
	},
	cascade : function(g, e, b) {
		if (g.apply(e || this, b || [ this ]) !== false) {
			if (this.items) {
				var d = this.items.items;
				for ( var c = 0, a = d.length; c < a; c++) {
					if (d[c].cascade) {
						d[c].cascade(g, e, b)
					} else {
						g.apply(e || d[c], b || [ d[c] ])
					}
				}
			}
		}
		return this
	},
	findById : function(c) {
		var a = null, b = this;
		this.cascade( function(d) {
			if (b != d && d.id === c) {
				a = d;
				return false
			}
		});
		return a
	},
	findByType : function(b, a) {
		return this.findBy( function(d) {
			return d.isXType(b, a)
		})
	},
	find : function(b, a) {
		return this.findBy( function(d) {
			return d[b] === a
		})
	},
	findBy : function(d, c) {
		var a = [], b = this;
		this.cascade( function(e) {
			if (b != e && d.call(c || e, e, b) === true) {
				a.push(e)
			}
		});
		return a
	},
	get : function(a) {
		return this.getComponent(a)
	}
});
Ext.Container.LAYOUTS = {};
Ext.reg("container", Ext.Container);
Ext.layout.ContainerLayout = Ext
		.extend(
				Object,
				{
					monitorResize :false,
					activeItem :null,
					constructor : function(a) {
						this.id = Ext.id(null, "ext-layout-");
						Ext.apply(this, a)
					},
					type :"container",
					IEMeasureHack : function(l, g) {
						var a = l.dom.childNodes, b = a.length, o, n = [], m, h, k;
						for (h = 0; h < b; h++) {
							o = a[h];
							m = Ext.get(o);
							if (m) {
								n[h] = m.getStyle("display");
								m.setStyle( {
									display :"none"
								})
							}
						}
						k = l ? l.getViewSize(g) : {};
						for (h = 0; h < b; h++) {
							o = a[h];
							m = Ext.get(o);
							if (m) {
								m.setStyle( {
									display :n[h]
								})
							}
						}
						return k
					},
					getLayoutTargetSize :Ext.EmptyFn,
					layout : function() {
						var a = this.container, b = a.getLayoutTarget();
						if (!(this.hasLayout || Ext.isEmpty(this.targetCls))) {
							b.addClass(this.targetCls)
						}
						this.onLayout(a, b);
						a.fireEvent("afterlayout", a, this)
					},
					onLayout : function(a, b) {
						this.renderAll(a, b)
					},
					isValidParent : function(b, a) {
						return a
								&& b.getPositionEl().dom.parentNode == (a.dom || a)
					},
					renderAll : function(e, g) {
						var b = e.items.items, d, h, a = b.length;
						for (d = 0; d < a; d++) {
							h = b[d];
							if (h && (!h.rendered || !this.isValidParent(h, g))) {
								this.renderItem(h, d, g)
							}
						}
					},
					renderItem : function(d, a, b) {
						if (d) {
							if (!d.rendered) {
								d.render(b, a);
								this.configureItem(d)
							} else {
								if (!this.isValidParent(d, b)) {
									if (Ext.isNumber(a)) {
										a = b.dom.childNodes[a]
									}
									b.dom.insertBefore(d.getPositionEl().dom, a
											|| null);
									d.container = b;
									this.configureItem(d)
								}
							}
						}
					},
					getRenderedItems : function(g) {
						var e = g.getLayoutTarget(), h = g.items.items, a = h.length, d, k, b = [];
						for (d = 0; d < a; d++) {
							if ((k = h[d]).rendered && this.isValidParent(k, e)
									&& k.shouldLayout !== false) {
								b.push(k)
							}
						}
						return b
					},
					configureItem : function(b) {
						if (this.extraCls) {
							var a = b.getPositionEl ? b.getPositionEl() : b;
							a.addClass(this.extraCls)
						}
						if (b.doLayout && this.forceLayout) {
							b.doLayout()
						}
						if (this.renderHidden && b != this.activeItem) {
							b.hide()
						}
					},
					onRemove : function(b) {
						if (this.activeItem == b) {
							delete this.activeItem
						}
						if (b.rendered && this.extraCls) {
							var a = b.getPositionEl ? b.getPositionEl() : b;
							a.removeClass(this.extraCls)
						}
					},
					afterRemove : function(a) {
						if (a.removeRestore) {
							a.removeMode = "container";
							delete a.removeRestore
						}
					},
					onResize : function() {
						var c = this.container, a;
						if (c.collapsed) {
							return
						}
						if (a = c.bufferResize && c.shouldBufferLayout()) {
							if (!this.resizeTask) {
								this.resizeTask = new Ext.util.DelayedTask(
										this.runLayout, this);
								this.resizeBuffer = Ext.isNumber(a) ? a : 50
							}
							c.layoutPending = true;
							this.resizeTask.delay(this.resizeBuffer)
						} else {
							this.runLayout()
						}
					},
					runLayout : function() {
						var a = this.container;
						this.layout();
						a.onLayout();
						delete a.layoutPending
					},
					setContainer : function(b) {
						if (this.monitorResize && b != this.container) {
							var a = this.container;
							if (a) {
								a.un(a.resizeEvent, this.onResize, this)
							}
							if (b) {
								b.on(b.resizeEvent, this.onResize, this)
							}
						}
						this.container = b
					},
					parseMargins : function(b) {
						if (Ext.isNumber(b)) {
							b = b.toString()
						}
						var c = b.split(" "), a = c.length;
						if (a == 1) {
							c[1] = c[2] = c[3] = c[0]
						} else {
							if (a == 2) {
								c[2] = c[0];
								c[3] = c[1]
							} else {
								if (a == 3) {
									c[3] = c[1]
								}
							}
						}
						return {
							top :parseInt(c[0], 10) || 0,
							right :parseInt(c[1], 10) || 0,
							bottom :parseInt(c[2], 10) || 0,
							left :parseInt(c[3], 10) || 0
						}
					},
					fieldTpl :( function() {
						var a = 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>");
						a.disableFormats = true;
						return a.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 a = this.container.getLayoutTarget();
							if (a) {
								a.removeClass(this.targetCls)
							}
						}
					}
				});
Ext.layout.AutoLayout = Ext.extend(Ext.layout.ContainerLayout, {
	type :"auto",
	monitorResize :true,
	onLayout : function(d, g) {
		Ext.layout.AutoLayout.superclass.onLayout.call(this, d, g);
		var e = this.getRenderedItems(d), a = e.length, b, h;
		for (b = 0; b < a; b++) {
			h = e[b];
			if (h.doLayout) {
				h.doLayout(true)
			}
		}
	}
});
Ext.Container.LAYOUTS.auto = Ext.layout.AutoLayout;
Ext.layout.FitLayout = Ext.extend(Ext.layout.ContainerLayout, {
	monitorResize :true,
	type :"fit",
	getLayoutTargetSize : function() {
		var a = this.container.getLayoutTarget();
		if (!a) {
			return {}
		}
		return a.getStyleSize()
	},
	onLayout : function(a, b) {
		Ext.layout.FitLayout.superclass.onLayout.call(this, a, b);
		if (!a.collapsed) {
			this.setItemSize(this.activeItem || a.items.itemAt(0), this
					.getLayoutTargetSize())
		}
	},
	setItemSize : function(b, a) {
		if (b && a.height > 0) {
			b.setSize(a)
		}
	}
});
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(d) {
		var a = this.activeItem, b = this.container;
		d = b.getComponent(d);
		if (d && a != d) {
			if (a) {
				a.hide();
				if (a.hidden !== true) {
					return false
				}
				a.fireEvent("deactivate", a)
			}
			var c = d.doLayout && (this.layoutOnCardChange || !d.rendered);
			this.activeItem = d;
			delete d.deferLayout;
			d.show();
			this.layout();
			if (c) {
				d.doLayout()
			}
			d.fireEvent("activate", d)
		}
	},
	renderAll : function(a, b) {
		if (this.deferredRender) {
			this.renderItem(this.activeItem, undefined, b)
		} else {
			Ext.layout.CardLayout.superclass.renderAll.call(this, a, b)
		}
	}
});
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 b = this.container.getLayoutTarget(), a = {};
						if (b) {
							a = b.getViewSize();
							if (Ext.isIE && Ext.isStrict && a.width == 0) {
								a = b.getStyleSize()
							}
							a.width -= b.getPadding("lr");
							a.height -= b.getPadding("tb")
						}
						return a
					},
					onLayout : function(n, x) {
						Ext.layout.AnchorLayout.superclass.onLayout.call(this,
								n, x);
						var q = this.getLayoutTargetSize(), l = q.width, p = q.height, r = x
								.getStyle("overflow"), o = this
								.getRenderedItems(n), u = o.length, g = [], k, a, w, m, h, c, e, d, v = 0, t, b;
						if (l < 20 && p < 20) {
							return
						}
						if (n.anchorSize) {
							if (typeof n.anchorSize == "number") {
								a = n.anchorSize
							} else {
								a = n.anchorSize.width;
								w = n.anchorSize.height
							}
						} else {
							a = n.initialConfig.width;
							w = n.initialConfig.height
						}
						for (t = 0; t < u; t++) {
							m = o[t];
							b = m.getPositionEl();
							if (!m.anchor && m.items && !Ext.isNumber(m.width)
									&& !(Ext.isIE6 && Ext.isStrict)) {
								m.anchor = this.defaultAnchor
							}
							if (m.anchor) {
								h = m.anchorSpec;
								if (!h) {
									d = m.anchor.split(" ");
									m.anchorSpec = h = {
										right :this.parseAnchor(d[0],
												m.initialConfig.width, a),
										bottom :this.parseAnchor(d[1],
												m.initialConfig.height, w)
									}
								}
								c = h.right ? this.adjustWidthAnchor(h.right(l)
										- b.getMargins("lr"), m) : undefined;
								e = h.bottom ? this.adjustHeightAnchor(h
										.bottom(p)
										- b.getMargins("tb"), m) : undefined;
								if (c || e) {
									g.push( {
										component :m,
										width :c || undefined,
										height :e || undefined
									})
								}
							}
						}
						for (t = 0, u = g.length; t < u; t++) {
							k = g[t];
							k.component.setSize(k.width, k.height)
						}
						if (r && r != "hidden" && !this.adjustmentPass) {
							var s = this.getLayoutTargetSize();
							if (s.width != q.width || s.height != q.height) {
								this.adjustmentPass = true;
								this.onLayout(n, x)
							}
						}
						delete this.adjustmentPass
					},
					parseAnchor : function(c, h, b) {
						if (c && c != "none") {
							var e;
							if (this.parseAnchorRE.test(c)) {
								var g = b - h;
								return function(a) {
									if (a !== e) {
										e = a;
										return a - g
									}
								}
							} else {
								if (c.indexOf("%") != -1) {
									var d = parseFloat(c.replace("%", "")) * 0.01;
									return function(a) {
										if (a !== e) {
											e = a;
											return Math.floor(a * d)
										}
									}
								} else {
									c = parseInt(c, 10);
									if (!isNaN(c)) {
										return function(a) {
											if (a !== e) {
												e = a;
												return a + c
											}
										}
									}
								}
							}
						}
						return false
					},
					adjustWidthAnchor : function(b, a) {
						return b
					},
					adjustHeightAnchor : function(b, a) {
						return b
					}
				});
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(b, a) {
		return this.innerCt
				&& b.getPositionEl().dom.parentNode == this.innerCt.dom
	},
	getLayoutTargetSize : function() {
		var b = this.container.getLayoutTarget(), a;
		if (b) {
			a = b.getViewSize();
			if (Ext.isIE && Ext.isStrict && a.width == 0) {
				a = b.getStyleSize()
			}
			a.width -= b.getPadding("lr");
			a.height -= b.getPadding("tb")
		}
		return a
	},
	renderAll : function(a, b) {
		if (!this.innerCt) {
			this.innerCt = b.createChild( {
				cls :"x-column-inner"
			});
			this.innerCt.createChild( {
				cls :"x-clear"
			})
		}
		Ext.layout.ColumnLayout.superclass.renderAll
				.call(this, a, this.innerCt)
	},
	onLayout : function(e, l) {
		var g = e.items.items, k = g.length, o, b, a, p = [];
		this.renderAll(e, l);
		var s = this.getLayoutTargetSize();
		if (s.width < 1 && s.height < 1) {
			return
		}
		var q = s.width - this.scrollOffset, d = s.height, r = q;
		this.innerCt.setWidth(q);
		for (b = 0; b < k; b++) {
			o = g[b];
			a = o.getPositionEl().getMargins("lr");
			p[b] = a;
			if (!o.columnWidth) {
				r -= (o.getWidth() + a)
			}
		}
		r = r < 0 ? 0 : r;
		for (b = 0; b < k; b++) {
			o = g[b];
			a = p[b];
			if (o.columnWidth) {
				o.setSize(Math.floor(o.columnWidth * r) - a)
			}
		}
		if (Ext.isIE) {
			if (b = l.getStyle("overflow") && b != "hidden"
					&& !this.adjustmentPass) {
				var n = this.getLayoutTargetSize();
				if (n.width != s.width) {
					this.adjustmentPass = true;
					this.onLayout(e, l)
				}
			}
		}
		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 a = this.container.getLayoutTarget();
						return a ? a.getViewSize() : {}
					},
					onLayout : function(g, J) {
						var k, C, G, p, y = g.items.items, D = y.length;
						if (!this.rendered) {
							k = [];
							for (C = 0; C < D; C++) {
								G = y[C];
								p = G.region;
								if (G.collapsed) {
									k.push(G)
								}
								G.collapsed = false;
								if (!G.rendered) {
									G.render(J, C);
									G.getPositionEl()
											.addClass("x-border-panel")
								}
								this[p] = p != "center" && G.split ? new Ext.layout.BorderLayout.SplitRegion(
										this, G.initialConfig, p)
										: new Ext.layout.BorderLayout.Region(
												this, G.initialConfig, p);
								this[p].render(J, G)
							}
							this.rendered = true
						}
						var x = this.getLayoutTargetSize();
						if (x.width < 20 || x.height < 20) {
							if (k) {
								this.restoreCollapsed = k
							}
							return
						} else {
							if (this.restoreCollapsed) {
								k = this.restoreCollapsed;
								delete this.restoreCollapsed
							}
						}
						var u = x.width, E = x.height, t = u, B = E, q = 0, r = 0, z = this.north, v = this.south, o = this.west, F = this.east, G = this.center, I, A, d, H;
						if (!G && Ext.layout.BorderLayout.WARN !== false) {
							throw "No center region defined in BorderLayout "
									+ g.id
						}
						if (z && z.isVisible()) {
							I = z.getSize();
							A = z.getMargins();
							I.width = u - (A.left + A.right);
							I.x = A.left;
							I.y = A.top;
							q = I.height + I.y + A.bottom;
							B -= q;
							z.applyLayout(I)
						}
						if (v && v.isVisible()) {
							I = v.getSize();
							A = v.getMargins();
							I.width = u - (A.left + A.right);
							I.x = A.left;
							H = (I.height + A.top + A.bottom);
							I.y = E - H + A.top;
							B -= H;
							v.applyLayout(I)
						}
						if (o && o.isVisible()) {
							I = o.getSize();
							A = o.getMargins();
							I.height = B - (A.top + A.bottom);
							I.x = A.left;
							I.y = q + A.top;
							d = (I.width + A.left + A.right);
							r += d;
							t -= d;
							o.applyLayout(I)
						}
						if (F && F.isVisible()) {
							I = F.getSize();
							A = F.getMargins();
							I.height = B - (A.top + A.bottom);
							d = (I.width + A.left + A.right);
							I.x = u - d + A.left;
							I.y = q + A.top;
							t -= d;
							F.applyLayout(I)
						}
						if (G) {
							A = G.getMargins();
							var l = {
								x :r + A.left,
								y :q + A.top,
								width :t - (A.left + A.right),
								height :B - (A.top + A.bottom)
							};
							G.applyLayout(l)
						}
						if (k) {
							for (C = 0, D = k.length; C < D; C++) {
								k[C].collapse(false)
							}
						}
						if (Ext.isIE && Ext.isStrict) {
							J.repaint()
						}
						if (C = J.getStyle("overflow") && C != "hidden"
								&& !this.adjustmentPass) {
							var a = this.getLayoutTargetSize();
							if (a.width != x.width || a.height != x.height) {
								this.adjustmentPass = true;
								this.onLayout(g, J)
							}
						}
						delete this.adjustmentPass
					},
					destroy : function() {
						var b = [ "north", "south", "east", "west" ], a, c;
						for (a = 0; a < b.length; a++) {
							c = this[b[a]];
							if (c) {
								if (c.destroy) {
									c.destroy()
								} else {
									if (c.split) {
										c.split.destroy(true)
									}
								}
							}
						}
						Ext.layout.BorderLayout.superclass.destroy.call(this)
					}
				});
Ext.layout.BorderLayout.Region = function(b, a, c) {
	Ext.apply(this, a);
	this.layout = b;
	this.position = c;
	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 || {}, c == "north"
					|| c == "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(b, c) {
		this.panel = c;
		c.el.enableDisplayMode();
		this.targetEl = b;
		this.el = c.el;
		var a = c.getState, d = this.position;
		c.getState = function() {
			return Ext.apply(a.call(c) || {}, this.state)
		}.createDelegate(this);
		if (d != "center") {
			c.allowQueuedExpand = false;
			c.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) {
				c.collapseEl = "el";
				c.slideAnchor = this.getSlideAnchor()
			}
			if (c.tools && c.tools.toggle) {
				c.tools.toggle.addClass("x-tool-collapse-" + d);
				c.tools.toggle.addClassOnOver("x-tool-collapse-" + d + "-over")
			}
		}
	},
	getCollapsedEl : function() {
		if (!this.collapsedEl) {
			if (!this.toolTemplate) {
				var b = new Ext.Template(
						'<div class="x-tool x-tool-{id}">&#160;</div>');
				b.disableFormats = true;
				b.compile();
				Ext.layout.BorderLayout.Region.prototype.toolTemplate = b
			}
			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 a = this.expandToolEl = this.toolTemplate.append(
							this.collapsedEl.dom, {
								id :"expand-" + this.position
							}, true);
					a
							.addClassOnOver("x-tool-expand-" + this.position
									+ "-over");
					a.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(a) {
		if (this.isSlid) {
			this.panel.expand(false)
		} else {
			this.panel.expand()
		}
	},
	onCollapseClick : function(a) {
		this.panel.collapse()
	},
	beforeCollapse : function(c, a) {
		this.lastAnim = a;
		if (this.splitEl) {
			this.splitEl.hide()
		}
		this.getCollapsedEl().show();
		var b = this.panel.getEl();
		this.originalZIndex = b.getStyle("z-index");
		b.setStyle("z-index", 100);
		this.isCollapsed = true;
		this.layout.layout()
	},
	onCollapse : function(a) {
		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 :0.2
			})
		}
		this.state.collapsed = true;
		this.panel.saveState()
	},
	beforeExpand : function(a) {
		if (this.isSlid) {
			this.afterSlideIn()
		}
		var b = this.getCollapsedEl();
		this.el.show();
		if (this.position == "east" || this.position == "west") {
			this.panel.setSize(undefined, b.getHeight())
		} else {
			this.panel.setSize(b.getWidth(), undefined)
		}
		b.hide();
		b.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(a) {
		if (this.isSlid) {
			a.stopPropagation();
			this.slideIn()
		} else {
			a.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(a) {
		this.panel = a
	},
	getMinWidth : function() {
		return this.minWidth
	},
	getMinHeight : function() {
		return this.minHeight
	},
	applyLayoutCollapsed : function(a) {
		var b = this.getCollapsedEl();
		b.setLeftTop(a.x, a.y);
		b.setSize(a.width, a.height)
	},
	applyLayout : function(a) {
		if (this.isCollapsed) {
			this.applyLayoutCollapsed(a)
		} else {
			this.panel.setPosition(a.x, a.y);
			this.panel.setSize(a.width, a.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(a) {
						if (!a.within(this.el, true)) {
							this.autoHideSlideTask.delay(500)
						}
					},
					mouseover : function(a) {
						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 b = this.panel.tools, c, a;
		if (b && b.toggle) {
			b.toggle.hide()
		}
		this.el.show();
		a = this.panel.collapsed;
		this.panel.collapsed = false;
		if (this.position == "east" || this.position == "west") {
			c = this.panel.deferHeight;
			this.panel.deferHeight = false;
			this.panel.setSize(undefined, this.collapsedEl.getHeight());
			this.panel.deferHeight = c
		} else {
			this.panel.setSize(this.collapsedEl.getWidth(), undefined)
		}
		this.panel.collapsed = a;
		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 a = this.panel.tools;
		if (a && a.toggle) {
			a.toggle.show()
		}
	},
	slideIn : function(a) {
		if (!this.isSlid || this.el.hasActiveFx()) {
			Ext.callback(a);
			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(a)
				},
				scope :this,
				block :true
			})
		} else {
			this.el.hide();
			this.afterSlideIn()
		}
	},
	slideInIf : function(a) {
		if (!a.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 a = 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 b = this.collapsedEl, a = this.cmargins;
		switch (this.position) {
		case "west":
			return [ -(a.right + b.getWidth() + a.left), 0 ];
			break;
		case "east":
			return [ a.right + b.getWidth() + a.left, 0 ];
			break;
		case "north":
			return [ 0, -(a.top + a.bottom + b.getHeight()) ];
			break;
		case "south":
			return [ 0, a.top + a.bottom + b.getHeight() ];
			break
		}
	},
	destroy : function() {
		if (this.autoHideSlideTask && this.autoHideSlideTask.cancel) {
			this.autoHideSlideTask.cancel()
		}
		Ext.destroyMembers(this, "miniCollapsedEl", "collapsedEl",
				"expandToolEl")
	}
};
Ext.layout.BorderLayout.SplitRegion = function(b, a, c) {
	Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, b, a,
			c);
	this.applyLayout = this.applyFns[c]
};
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(c) {
							if (this.isCollapsed) {
								return this.applyLayoutCollapsed(c)
							}
							var d = this.splitEl.dom, b = d.style;
							this.panel.setPosition(c.x, c.y);
							var a = d.offsetWidth;
							b.left = (c.x + c.width - a) + "px";
							b.top = (c.y) + "px";
							b.height = Math.max(0, c.height) + "px";
							this.panel.setSize(c.width - a, c.height)
						},
						east : function(c) {
							if (this.isCollapsed) {
								return this.applyLayoutCollapsed(c)
							}
							var d = this.splitEl.dom, b = d.style;
							var a = d.offsetWidth;
							this.panel.setPosition(c.x + a, c.y);
							b.left = (c.x) + "px";
							b.top = (c.y) + "px";
							b.height = Math.max(0, c.height) + "px";
							this.panel.setSize(c.width - a, c.height)
						},
						north : function(c) {
							if (this.isCollapsed) {
								return this.applyLayoutCollapsed(c)
							}
							var d = this.splitEl.dom, b = d.style;
							var a = d.offsetHeight;
							this.panel.setPosition(c.x, c.y);
							b.left = (c.x) + "px";
							b.top = (c.y + c.height - a) + "px";
							b.width = Math.max(0, c.width) + "px";
							this.panel.setSize(c.width, c.height - a)
						},
						south : function(c) {
							if (this.isCollapsed) {
								return this.applyLayoutCollapsed(c)
							}
							var d = this.splitEl.dom, b = d.style;
							var a = d.offsetHeight;
							this.panel.setPosition(c.x, c.y + a);
							b.left = (c.x) + "px";
							b.top = (c.y) + "px";
							b.width = Math.max(0, c.width) + "px";
							this.panel.setSize(c.width, c.height - a)
						}
					},
					render : function(a, c) {
						Ext.layout.BorderLayout.SplitRegion.superclass.render
								.call(this, a, c);
						var d = this.position;
						this.splitEl = a.createChild( {
							cls :"x-layout-split x-layout-split-" + d,
							html :"&#160;",
							id :this.panel.id + "-xsplit"
						});
						if (this.collapseMode == "mini") {
							this.miniSplitEl = this.splitEl.createChild( {
								cls :"x-layout-mini x-layout-mini-" + d,
								html :"&#160;"
							});
							this.miniSplitEl
									.addClassOnOver("x-layout-mini-over");
							this.miniSplitEl.on("click", this.onCollapseClick,
									this, {
										stopEvent :true
									})
						}
						var b = this.splitSettings[d];
						this.split = new Ext.SplitBar(this.splitEl.dom, c.el,
								b.orientation);
						this.split.tickSize = this.tickSize;
						this.split.placement = b.placement;
						this.split.getMaximumSize = this[b.maxFn]
								.createDelegate(this);
						this.split.minSize = this.minSize || this[b.minProp];
						this.split.on("beforeapply", this.onSplitMove, this);
						this.split.useShim = this.useShim === true;
						this.maxSize = this.maxSize || this[b.maxProp];
						if (c.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 a = this.panel.getSize();
						if (this.position == "north"
								|| this.position == "south") {
							a.height += this.splitEl.dom.offsetHeight
						} else {
							a.width += this.splitEl.dom.offsetWidth
						}
						return a
					},
					getHMaxSize : function() {
						var b = this.maxSize || 10000;
						var a = this.layout.center;
						return Math.min(b, (this.el.getWidth() + a.el
								.getWidth())
								- a.getMinWidth())
					},
					getVMaxSize : function() {
						var b = this.maxSize || 10000;
						var a = this.layout.center;
						return Math.min(b, (this.el.getHeight() + a.el
								.getHeight())
								- a.getMinHeight())
					},
					onSplitMove : function(b, a) {
						var c = this.panel.getSize();
						this.lastSplitSize = a;
						if (this.position == "north"
								|| this.position == "south") {
							this.panel.setSize(c.width, a);
							this.state.height = a
						} else {
							this.panel.setSize(a, c.height);
							this.state.width = a
						}
						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(d) {
						Ext.layout.FormLayout.superclass.onRemove.call(this, d);
						if (this.trackLabels) {
							d.un("show", this.onFieldShow, this);
							d.un("hide", this.onFieldHide, this)
						}
						var b = d.getPositionEl(), a = d.getItemCt
								&& d.getItemCt();
						if (d.rendered && a) {
							if (b && b.dom) {
								b.insertAfter(a)
							}
							Ext.destroy(a);
							Ext.destroyMembers(d, "label", "itemCt");
							if (d.customItemCt) {
								Ext.destroyMembers(d, "getItemCt",
										"customItemCt")
							}
						}
					},
					setContainer : function(a) {
						Ext.layout.FormLayout.superclass.setContainer.call(
								this, a);
						if (a.labelAlign) {
							a.addClass("x-form-label-" + a.labelAlign)
						}
						if (a.hideLabels) {
							Ext.apply(this, {
								labelStyle :"display:none",
								elementStyle :"padding-left:0;",
								labelAdjust :0
							})
						} else {
							this.labelSeparator = Ext
									.isDefined(a.labelSeparator) ? a.labelSeparator
									: this.labelSeparator;
							a.labelWidth = a.labelWidth || 100;
							if (Ext.isNumber(a.labelWidth)) {
								var b = Ext.isNumber(a.labelPad) ? a.labelPad
										: 5;
								Ext.apply(this,
										{
											labelAdjust :a.labelWidth + b,
											labelStyle :"width:" + a.labelWidth
													+ "px;",
											elementStyle :"padding-left:"
													+ (a.labelWidth + b) + "px"
										})
							}
							if (a.labelAlign == "top") {
								Ext.apply(this, {
									labelStyle :"width:auto;",
									labelAdjust :0,
									elementStyle :"padding-left:0;"
								})
							}
						}
					},
					isHide : function(a) {
						return a.hideLabel || this.container.hideLabels
					},
					onFieldShow : function(a) {
						a.getItemCt().removeClass("x-hide-" + a.hideMode);
						if (a.isComposite) {
							a.doLayout()
						}
					},
					onFieldHide : function(a) {
						a.getItemCt().addClass("x-hide-" + a.hideMode)
					},
					getLabelStyle : function(e) {
						var b = "", c = [ this.labelStyle, e ];
						for ( var d = 0, a = c.length; d < a; ++d) {
							if (c[d]) {
								b += c[d];
								if (b.substr(-1, 1) != ";") {
									b += ";"
								}
							}
						}
						return b
					},
					renderItem : function(e, a, d) {
						if (e && (e.isFormField || e.fieldLabel)
								&& e.inputType != "hidden") {
							var b = this.getTemplateArgs(e);
							if (Ext.isNumber(a)) {
								a = d.dom.childNodes[a] || null
							}
							if (a) {
								e.itemCt = this.fieldTpl.insertBefore(a, b,
										true)
							} else {
								e.itemCt = this.fieldTpl.append(d, b, true)
							}
							if (!e.getItemCt) {
								Ext.apply(e, {
									getItemCt : function() {
										return e.itemCt
									},
									customItemCt :true
								})
							}
							e.label = e.getItemCt().child(
									"label.x-form-item-label");
							if (!e.rendered) {
								e.render("x-form-el-" + e.id)
							} else {
								if (!this.isValidParent(e, d)) {
									Ext.fly("x-form-el-" + e.id).appendChild(
											e.getPositionEl())
								}
							}
							if (this.trackLabels) {
								if (e.hidden) {
									this.onFieldHide(e)
								}
								e.on( {
									scope :this,
									show :this.onFieldShow,
									hide :this.onFieldHide
								})
							}
							this.configureItem(e)
						} else {
							Ext.layout.FormLayout.superclass.renderItem.apply(
									this, arguments)
						}
					},
					getTemplateArgs : function(b) {
						var a = !b.fieldLabel || b.hideLabel;
						return {
							id :b.id,
							label :b.fieldLabel,
							itemCls :(b.itemCls || this.container.itemCls || "")
									+ (b.hideLabel ? " x-hide-label" : ""),
							clearCls :b.clearCls || "x-form-clear-left",
							labelStyle :this.getLabelStyle(b.labelStyle),
							elementStyle :this.elementStyle || "",
							labelSeparator :a ? ""
									: (Ext.isDefined(b.labelSeparator) ? b.labelSeparator
											: this.labelSeparator)
						}
					},
					adjustWidthAnchor : function(a, d) {
						if (d.label && !this.isHide(d)
								&& (this.container.labelAlign != "top")) {
							var b = Ext.isIE6 || (Ext.isIE && !Ext.isStrict);
							return a - this.labelAdjust + (b ? -3 : 0)
						}
						return a
					},
					adjustHeightAnchor : function(a, b) {
						if (b.label && !this.isHide(b)
								&& (this.container.labelAlign == "top")) {
							return a - b.label.getHeight()
						}
						return a
					},
					isValidParent : function(b, a) {
						return a
								&& this.container.getEl().contains(
										b.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(a) {
						if (this.animate === false) {
							a.animCollapse = false
						}
						a.collapsible = true;
						if (this.autoWidth) {
							a.autoWidth = true
						}
						if (this.titleCollapse) {
							a.titleCollapse = true
						}
						if (this.hideCollapseTool) {
							a.hideCollapseTool = true
						}
						if (this.collapseFirst !== undefined) {
							a.collapseFirst = this.collapseFirst
						}
						if (!this.activeItem && !a.collapsed) {
							this.setActiveItem(a, true)
						} else {
							if (this.activeItem && this.activeItem != a) {
								a.collapsed = true
							}
						}
						Ext.layout.AccordionLayout.superclass.renderItem.apply(
								this, arguments);
						a.header.addClass("x-accordion-hd");
						a.on("beforeexpand", this.beforeExpand, this)
					},
					onRemove : function(a) {
						Ext.layout.AccordionLayout.superclass.onRemove.call(
								this, a);
						if (a.rendered) {
							a.header.removeClass("x-accordion-hd")
						}
						a.un("beforeexpand", this.beforeExpand, this)
					},
					beforeExpand : function(c, b) {
						var a = this.activeItem;
						if (a) {
							if (this.sequence) {
								delete this.activeItem;
								if (!a.collapsed) {
									a.collapse( {
										callback : function() {
											c.expand(b || true)
										},
										scope :this
									});
									return false
								}
							} else {
								a.collapse(this.animate)
							}
						}
						this.setActive(c);
						if (this.activeOnTop) {
							c.el.dom.parentNode.insertBefore(c.el.dom,
									c.el.dom.parentNode.firstChild)
						}
						this.layout()
					},
					setItemSize : function(g, e) {
						if (this.fill && g) {
							var d = 0, c, b = this
									.getRenderedItems(this.container), a = b.length, h;
							for (c = 0; c < a; c++) {
								if ((h = b[c]) != g && !h.hidden) {
									d += h.header.getHeight()
								}
							}
							e.height -= d;
							g.setSize(e)
						}
					},
					setActiveItem : function(a) {
						this.setActive(a, true)
					},
					setActive : function(c, b) {
						var a = this.activeItem;
						c = this.container.getComponent(c);
						if (a != c) {
							if (c.rendered && c.collapsed && b) {
								c.expand()
							} else {
								if (a) {
									a.fireEvent("deactivate", a)
								}
								this.activeItem = c;
								c.fireEvent("activate", c)
							}
						}
					}
				});
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(a) {
		Ext.layout.TableLayout.superclass.setContainer.call(this, a);
		this.currentRow = 0;
		this.currentColumn = 0;
		this.cells = []
	},
	onLayout : function(d, g) {
		var e = d.items.items, a = e.length, h, b;
		if (!this.table) {
			g.addClass("x-table-layout-ct");
			this.table = g.createChild(Ext.apply( {
				tag :"table",
				cls :"x-table-layout",
				cellspacing :0,
				cn : {
					tag :"tbody"
				}
			}, this.tableAttrs), null, true)
		}
		this.renderAll(d, g)
	},
	getRow : function(a) {
		var b = this.table.tBodies[0].childNodes[a];
		if (!b) {
			b = document.createElement("tr");
			this.table.tBodies[0].appendChild(b)
		}
		return b
	},
	getNextCell : function(k) {
		var a = this.getNextNonSpan(this.currentColumn, this.currentRow);
		var g = this.currentColumn = a[0], e = this.currentRow = a[1];
		for ( var i = e; i < e + (k.rowspan || 1); i++) {
			if (!this.cells[i]) {
				this.cells[i] = []
			}
			for ( var d = g; d < g + (k.colspan || 1); d++) {
				this.cells[i][d] = true
			}
		}
		var h = document.createElement("td");
		if (k.cellId) {
			h.id = k.cellId
		}
		var b = "x-table-layout-cell";
		if (k.cellCls) {
			b += " " + k.cellCls
		}
		h.className = b;
		if (k.colspan) {
			h.colSpan = k.colspan
		}
		if (k.rowspan) {
			h.rowSpan = k.rowspan
		}
		this.getRow(e).appendChild(h);
		return h
	},
	getNextNonSpan : function(a, c) {
		var b = this.columns;
		while ((b && a >= b) || (this.cells[c] && this.cells[c][a])) {
			if (b && a >= b) {
				c++;
				a = 0
			} else {
				a++
			}
		}
		return [ a, c ]
	},
	renderItem : function(e, a, d) {
		if (!this.table) {
			this.table = d.createChild(Ext.apply( {
				tag :"table",
				cls :"x-table-layout",
				cellspacing :0,
				cn : {
					tag :"tbody"
				}
			}, this.tableAttrs), null, true)
		}
		if (e && !e.rendered) {
			e.render(this.getNextCell(e));
			this.configureItem(e)
		} else {
			if (e && !this.isValidParent(e, d)) {
				var b = this.getNextCell(e);
				b.insertBefore(e.getPositionEl().dom, null);
				e.container = Ext.get(b);
				this.configureItem(e)
			}
		}
	},
	isValidParent : function(b, a) {
		return b.getPositionEl().up("table", 5).dom.parentNode === (a.dom || a)
	},
	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(a, b) {
		b.position();
		this.paddingLeft = b.getPadding("l");
		this.paddingTop = b.getPadding("t");
		Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, a, b)
	},
	adjustWidthAnchor : function(b, a) {
		return b ? b - a.getPosition(true)[0] + this.paddingLeft : b
	},
	adjustHeightAnchor : function(b, a) {
		return b ? b - a.getPosition(true)[1] + this.paddingTop : b
	}
});
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(a) {
						Ext.layout.BoxLayout.superclass.constructor.call(this,
								a);
						if (Ext.isString(this.defaultMargins)) {
							this.defaultMargins = this
									.parseMargins(this.defaultMargins)
						}
						var d = this.overflowHandler;
						if (typeof d == "string") {
							d = {
								type :d
							}
						}
						var c = "none";
						if (d && d.type != undefined) {
							c = d.type
						}
						var b = Ext.layout.boxOverflow[c];
						if (b[this.type]) {
							b = b[this.type]
						}
						this.overflowHandler = new b(this, d)
					},
					onLayout : function(b, h) {
						Ext.layout.BoxLayout.superclass.onLayout.call(this, b,
								h);
						var d = this.getLayoutTargetSize(), i = this
								.getVisibleItems(b), c = this
								.calculateChildBoxes(i, d), g = c.boxes, k = c.meta;
						if (d.width > 0) {
							var l = this.overflowHandler, a = k.tooNarrow ? "handleOverflow"
									: "clearOverflow";
							var e = l[a](c, d);
							if (e) {
								if (e.targetSize) {
									d = e.targetSize
								}
								if (e.recalculate) {
									i = this.getVisibleItems(b);
									c = this.calculateChildBoxes(i, d);
									g = c.boxes
								}
							}
						}
						this.layoutTargetLastSize = d;
						this.childBoxCache = c;
						this.updateInnerCtSize(d, c);
						this.updateChildBoxes(g);
						this.handleTargetOverflow(d, b, h)
					},
					updateChildBoxes : function(c) {
						for ( var b = 0, e = c.length; b < e; b++) {
							var d = c[b], a = d.component;
							if (d.dirtySize) {
								a.setSize(d.width, d.height)
							}
							if (isNaN(d.left) || isNaN(d.top)) {
								continue
							}
							a.setPosition(d.left, d.top)
						}
					},
					updateInnerCtSize : function(c, h) {
						var i = this.align, g = this.padding, e = c.width, a = c.height;
						if (this.type == "hbox") {
							var b = e, d = h.meta.maxHeight + g.top + g.bottom;
							if (i == "stretch") {
								d = a
							} else {
								if (i == "middle") {
									d = Math.max(a, d)
								}
							}
						} else {
							var d = a, b = h.meta.maxWidth + g.left + g.right;
							if (i == "stretch") {
								b = e
							} else {
								if (i == "center") {
									b = Math.max(e, b)
								}
							}
						}
						this.innerCt.setSize(b || undefined, d || undefined)
					},
					handleTargetOverflow : function(d, a, c) {
						var e = c.getStyle("overflow");
						if (e && e != "hidden" && !this.adjustmentPass) {
							var b = this.getLayoutTargetSize();
							if (b.width != d.width || b.height != d.height) {
								this.adjustmentPass = true;
								this.onLayout(a, c)
							}
						}
						delete this.adjustmentPass
					},
					isValidParent : function(b, a) {
						return this.innerCt
								&& b.getPositionEl().dom.parentNode == this.innerCt.dom
					},
					getVisibleItems : function(g) {
						var g = g || this.container, e = g.getLayoutTarget(), h = g.items.items, a = h.length, d, k, b = [];
						for (d = 0; d < a; d++) {
							if ((k = h[d]).rendered && this.isValidParent(k, e)
									&& k.hidden !== true
									&& k.collapsed !== true
									&& k.shouldLayout !== false) {
								b.push(k)
							}
						}
						return b
					},
					renderAll : function(a, b) {
						if (!this.innerCt) {
							this.innerCt = b.createChild( {
								cls :this.innerCls
							});
							this.padding = this.parseMargins(this.padding)
						}
						Ext.layout.BoxLayout.superclass.renderAll.call(this, a,
								this.innerCt)
					},
					getLayoutTargetSize : function() {
						var b = this.container.getLayoutTarget(), a;
						if (b) {
							a = b.getViewSize();
							if (Ext.isIE && Ext.isStrict && a.width == 0) {
								a = b.getStyleSize()
							}
							a.width -= b.getPadding("lr");
							a.height -= b.getPadding("tb")
						}
						return a
					},
					renderItem : function(a) {
						if (Ext.isString(a.margins)) {
							a.margins = this.parseMargins(a.margins)
						} else {
							if (!a.margins) {
								a.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(b, a) {
		this.layout = b;
		Ext.apply(this, a || {})
	},
	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(a) {
						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(a, g) {
						var e = g.width
								+ (this.afterCt ? this.afterCt.getWidth() : 0), b = this.menuItems;
						this.hideTrigger();
						for ( var c = 0, d = b.length; c < d; c++) {
							b.pop().component.show()
						}
						return {
							targetSize : {
								height :g.height,
								width :e
							}
						}
					},
					showTrigger : function() {
						this.createMenu();
						this.menuTrigger.show()
					},
					hideTrigger : function() {
						if (this.menuTrigger != undefined) {
							this.menuTrigger.hide()
						}
					},
					beforeMenuShow : function(h) {
						var b = this.menuItems, a = b.length, g, e;
						var c = function(k, i) {
							return k.isXType("buttongroup")
									&& !(i instanceof Ext.Toolbar.Separator)
						};
						this.clearMenu();
						h.removeAll();
						for ( var d = 0; d < a; d++) {
							g = b[d].component;
							if (e && (c(g, e) || c(e, g))) {
								h.add("-")
							}
							this.addComponentToMenu(h, g);
							e = g
						}
						if (h.items.length < 1) {
							h.add(this.noItemsMenuText)
						}
					},
					createMenuConfig : function(c, a) {
						var b = Ext.apply( {}, c.initialConfig), d = c.toggleGroup;
						Ext.copyTo(b, c, [ "iconCls", "icon", "itemId",
								"disabled", "handler", "scope", "menu" ]);
						Ext.apply(b, {
							text :c.overflowText || c.text,
							hideOnClick :a
						});
						if (d || c.enableToggle) {
							Ext.apply(b, {
								group :d,
								checked :c.pressed,
								listeners : {
									checkchange : function(g, e) {
										c.toggle(e)
									}
								}
							})
						}
						delete b.ownerCt;
						delete b.xtype;
						delete b.id;
						return b
					},
					addComponentToMenu : function(b, a) {
						if (a instanceof Ext.Toolbar.Separator) {
							b.add("-")
						} else {
							if (Ext.isFunction(a.isXType)) {
								if (a.isXType("splitbutton")) {
									b.add(this.createMenuConfig(a, true))
								} else {
									if (a.isXType("button")) {
										b
												.add(this.createMenuConfig(a,
														!a.menu))
									} else {
										if (a.isXType("buttongroup")) {
											a.items.each( function(c) {
												this.addComponentToMenu(b, c)
											}, this)
										}
									}
								}
							}
						}
					},
					clearMenu : function() {
						var a = this.moreMenu;
						if (a && a.items) {
							a.items.each( function(b) {
								delete b.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 c = this, b = c.layout, a = b.calculateChildBoxes;
						b.calculateChildBoxes = function(d, i) {
							var m = a.apply(b, arguments), l = m.meta, e = c.menuItems;
							var k = 0;
							for ( var g = 0, h = e.length; g < h; g++) {
								k += e[g].width
							}
							l.minimumWidth += k;
							l.tooNarrow = l.minimumWidth > i.width;
							return m
						}
					},
					handleOverflow : function(d, h) {
						this.showTrigger();
						var l = h.width - this.afterCt.getWidth(), m = d.boxes, e = 0, s = false;
						for ( var p = 0, c = m.length; p < c; p++) {
							e += m[p].width
						}
						var a = l - e, g = 0;
						for ( var p = 0, c = this.menuItems.length; p < c; p++) {
							var o = this.menuItems[p], n = o.component, b = o.width;
							if (b < a) {
								n.show();
								a -= b;
								g++;
								s = true
							} else {
								break
							}
						}
						if (s) {
							this.menuItems = this.menuItems.slice(g)
						} else {
							for ( var k = m.length - 1; k >= 0; k--) {
								var r = m[k].component, q = m[k].left
										+ m[k].width;
								if (q >= l) {
									this.menuItems.unshift( {
										component :r,
										width :m[k].width
									});
									r.hide()
								} else {
									break
								}
							}
						}
						if (this.menuItems.length == 0) {
							this.hideTrigger()
						}
						return {
							targetSize : {
								height :h.height,
								width :l
							},
							recalculate :s
						}
					}
				});
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(a) {
								a.stopEvent();
								this.scrollBy(a.getWheelDelta()
										* this.wheelIncrement * -1, false)
							}
						})
					},
					handleOverflow : function(a, b) {
						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 a = this.beforeCt.createChild( {
								cls :String.format("{0} {1} ",
										this.scrollerCls,
										this.beforeScrollerCls)
							});
							var b = this.afterCt.createChild( {
								cls :String.format("{0} {1}", this.scrollerCls,
										this.afterScrollerCls)
							});
							a.addClassOnOver(this.beforeScrollerCls + "-hover");
							b.addClassOnOver(this.afterScrollerCls + "-hover");
							a.setVisibilityMode(Ext.Element.DISPLAY);
							b.setVisibilityMode(Ext.Element.DISPLAY);
							this.beforeRepeater = new Ext.util.ClickRepeater(a,
									{
										interval :this.scrollRepeatInterval,
										handler :this.scrollLeft,
										scope :this
									});
							this.afterRepeater = new Ext.util.ClickRepeater(b,
									{
										interval :this.scrollRepeatInterval,
										handler :this.scrollRight,
										scope :this
									});
							this.beforeScroller = a;
							this.afterScroller = b
						}
					},
					destroy : function() {
						Ext.destroy(this.beforeScroller, this.afterScroller,
								this.beforeRepeater, this.afterRepeater,
								this.beforeCt, this.afterCt)
					},
					scrollBy : function(b, a) {
						this.scrollTo(this.getScrollPosition() + b, a)
					},
					getItem : function(a) {
						if (Ext.isString(a)) {
							a = Ext.getCmp(a)
						} else {
							if (Ext.isNumber(a)) {
								a = this.items[a]
							}
						}
						return a
					},
					getScrollAnim : function() {
						return {
							duration :this.scrollDuration,
							callback :this.updateScrollButtons,
							scope :this
						}
					},
					updateScrollButtons : function() {
						if (this.beforeScroller == undefined
								|| this.afterScroller == undefined) {
							return
						}
						var d = this.atExtremeBefore() ? "addClass"
								: "removeClass", c = this.atExtremeAfter() ? "addClass"
								: "removeClass", a = this.beforeScrollerCls
								+ "-disabled", b = this.afterScrollerCls
								+ "-disabled";
						this.beforeScroller[d](a);
						this.afterScroller[c](b);
						this.scrolling = false
					},
					atExtremeBefore : function() {
						return this.getScrollPosition() === 0
					},
					scrollLeft : function(a) {
						this.scrollBy(-this.scrollIncrement, a)
					},
					scrollRight : function(a) {
						this.scrollBy(this.scrollIncrement, a)
					},
					scrollToItem : function(d, b) {
						d = this.getItem(d);
						if (d != undefined) {
							var a = this.getItemVisibility(d);
							if (!a.fullyVisible) {
								var c = d.getBox(true, true), e = c.x;
								if (a.hiddenRight) {
									e -= (this.layout.innerCt.getWidth() - c.width)
								}
								this.scrollTo(e, b)
							}
						}
					},
					getItemVisibility : function(e) {
						var d = this.getItem(e).getBox(true, true), a = d.x, c = d.x
								+ d.width, g = this.getScrollPosition(), b = this.layout.innerCt
								.getWidth()
								+ g;
						return {
							hiddenLeft :a < g,
							hiddenRight :c > b,
							fullyVisible :a > g && c < b
						}
					}
				});
Ext.layout.boxOverflow.scroller = Ext.layout.boxOverflow.Scroller;
Ext.layout.boxOverflow.VerticalScroller = Ext
		.extend(
				Ext.layout.boxOverflow.Scroller,
				{
					scrollIncrement :75,
					wheelIncrement :2,
					handleOverflow : function(a, b) {
						Ext.layout.boxOverflow.VerticalScroller.superclass.handleOverflow
								.apply(this, arguments);
						return {
							targetSize : {
								height :b.height
										- (this.beforeCt.getHeight() + this.afterCt
												.getHeight()),
								width :b.width
							}
						}
					},
					createInnerElements : function() {
						var a = this.layout.innerCt;
						if (!this.beforeCt) {
							this.beforeCt = a.insertSibling( {
								cls :this.beforeCls
							}, "before");
							this.afterCt = a.insertSibling( {
								cls :this.afterCls
							}, "after");
							this.createWheelListener()
						}
					},
					scrollTo : function(a, b) {
						var d = this.getScrollPosition(), c = a.constrain(0,
								this.getMaxScrollBottom());
						if (c != d && !this.scrolling) {
							if (b == undefined) {
								b = this.animateScroll
							}
							this.layout.innerCt.scrollTo("top", c, b ? this
									.getScrollAnim() : false);
							if (b) {
								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(a, b) {
						Ext.layout.boxOverflow.HorizontalScroller.superclass.handleOverflow
								.apply(this, arguments);
						return {
							targetSize : {
								height :b.height,
								width :b.width
										- (this.beforeCt.getWidth() + this.afterCt
												.getWidth())
							}
						}
					},
					createInnerElements : function() {
						var a = this.layout.innerCt;
						if (!this.beforeCt) {
							this.afterCt = a.insertSibling( {
								cls :this.afterCls
							}, "before");
							this.beforeCt = a.insertSibling( {
								cls :this.beforeCls
							}, "before");
							this.createWheelListener()
						}
					},
					scrollTo : function(a, b) {
						var d = this.getScrollPosition(), c = a.constrain(0,
								this.getMaxScrollRight());
						if (c != d && !this.scrolling) {
							if (b == undefined) {
								b = this.animateScroll
							}
							this.layout.innerCt.scrollTo("left", c, b ? this
									.getScrollAnim() : false);
							if (b) {
								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(s, b) {
						var G = s.length, S = this.padding, E = S.top, V = S.left, z = E
								+ S.bottom, P = V + S.right, a = b.width
								- this.scrollOffset, e = b.height, p = Math
								.max(0, e - z), Q = this.pack == "start", X = this.pack == "center", B = this.pack == "end", M = 0, R = 0, U = 0, m = 0, Y = 0, I = [], l, K, N, W, x, k, T, J, c, y, r, O;
						for (T = 0; T < G; T++) {
							l = s[T];
							N = l.height;
							K = l.width;
							k = !l.hasLayout && typeof l.doLayout == "function";
							if (typeof K != "number") {
								if (l.flex && !K) {
									U += l.flex
								} else {
									if (!K && k) {
										l.doLayout()
									}
									W = l.getSize();
									K = W.width;
									N = W.height
								}
							}
							x = l.margins;
							y = x.left + x.right;
							M += y + (K || 0);
							m += y + (l.flex ? l.minWidth || 0 : K);
							Y += y + (l.minWidth || K || 0);
							if (typeof N != "number") {
								if (k) {
									l.doLayout()
								}
								N = l.getHeight()
							}
							R = Math.max(R, N + x.top + x.bottom);
							I.push( {
								component :l,
								height :N || undefined,
								width :K || undefined
							})
						}
						var L = m - a, q = Y > a;
						var o = Math.max(0, a - M - P);
						if (q) {
							for (T = 0; T < G; T++) {
								I[T].width = s[T].minWidth || s[T].width
										|| I[T].width
							}
						} else {
							if (L > 0) {
								var D = [];
								for ( var F = 0, w = G; F < w; F++) {
									var C = s[F], u = C.minWidth || 0;
									if (C.flex) {
										I[F].width = u
									} else {
										D.push( {
											minWidth :u,
											available :I[F].width - u,
											index :F
										})
									}
								}
								D.sort( function(Z, i) {
									return Z.available > i.available ? 1 : -1
								});
								for ( var T = 0, w = D.length; T < w; T++) {
									var H = D[T].index;
									if (H == undefined) {
										continue
									}
									var C = s[H], n = I[H], v = n.width, u = C.minWidth, d = Math
											.max(u, v - Math.ceil(L / (w - T))), g = v
											- d;
									I[H].width = d;
									L -= g
								}
							} else {
								var h = o, t = U;
								for (T = 0; T < G; T++) {
									l = s[T];
									J = I[T];
									x = l.margins;
									r = x.top + x.bottom;
									if (Q && l.flex && !l.width) {
										c = Math.ceil((l.flex / t) * h);
										h -= c;
										t -= l.flex;
										J.width = c;
										J.dirtySize = true
									}
								}
							}
						}
						if (X) {
							V += o / 2
						} else {
							if (B) {
								V += o
							}
						}
						for (T = 0; T < G; T++) {
							l = s[T];
							J = I[T];
							x = l.margins;
							V += x.left;
							r = x.top + x.bottom;
							J.left = V;
							J.top = E + x.top;
							switch (this.align) {
							case "stretch":
								O = p - r;
								J.height = O.constrain(l.minHeight || 0,
										l.maxHeight || 1000000);
								J.dirtySize = true;
								break;
							case "stretchmax":
								O = R - r;
								J.height = O.constrain(l.minHeight || 0,
										l.maxHeight || 1000000);
								J.dirtySize = true;
								break;
							case "middle":
								var A = p - J.height - r;
								if (A > 0) {
									J.top = E + r + (A / 2)
								}
							}
							V += J.width + x.right
						}
						return {
							boxes :I,
							meta : {
								maxHeight :R,
								nonFlexWidth :M,
								desiredWidth :m,
								minimumWidth :Y,
								shortfall :m - a,
								tooNarrow :q
							}
						}
					}
				});
Ext.Container.LAYOUTS.hbox = Ext.layout.HBoxLayout;
Ext.layout.VBoxLayout = Ext
		.extend(
				Ext.layout.BoxLayout,
				{
					align :"left",
					type :"vbox",
					calculateChildBoxes : function(q, b) {
						var G = q.length, T = this.padding, E = T.top, W = T.left, z = E
								+ T.bottom, Q = W + T.right, a = b.width
								- this.scrollOffset, d = b.height, M = Math
								.max(0, a - Q), R = this.pack == "start", Y = this.pack == "center", B = this.pack == "end", m = 0, w = 0, V = 0, N = 0, o = 0, I = [], k, K, P, X, v, h, U, J, c, y, p, e;
						for (U = 0; U < G; U++) {
							k = q[U];
							P = k.height;
							K = k.width;
							h = !k.hasLayout && typeof k.doLayout == "function";
							if (typeof P != "number") {
								if (k.flex && !P) {
									V += k.flex
								} else {
									if (!P && h) {
										k.doLayout()
									}
									X = k.getSize();
									K = X.width;
									P = X.height
								}
							}
							v = k.margins;
							p = v.top + v.bottom;
							m += p + (P || 0);
							N += p + (k.flex ? k.minHeight || 0 : P);
							o += p + (k.minHeight || P || 0);
							if (typeof K != "number") {
								if (h) {
									k.doLayout()
								}
								K = k.getWidth()
							}
							w = Math.max(w, K + v.left + v.right);
							I.push( {
								component :k,
								height :P || undefined,
								width :K || undefined
							})
						}
						var O = N - d, n = o > d;
						var s = Math.max(0, (d - m - z));
						if (n) {
							for (U = 0, t = G; U < t; U++) {
								I[U].height = q[U].minHeight || q[U].height
										|| I[U].height
							}
						} else {
							if (O > 0) {
								var L = [];
								for ( var F = 0, t = G; F < t; F++) {
									var C = q[F], u = C.minHeight || 0;
									if (C.flex) {
										I[F].height = u
									} else {
										L.push( {
											minHeight :u,
											available :I[F].height - u,
											index :F
										})
									}
								}
								L.sort( function(Z, i) {
									return Z.available > i.available ? 1 : -1
								});
								for ( var U = 0, t = L.length; U < t; U++) {
									var H = L[U].index;
									if (H == undefined) {
										continue
									}
									var C = q[H], l = I[H], x = l.height, u = C.minHeight, D = Math
											.max(u, x - Math.ceil(O / (t - U))), g = x
											- D;
									I[H].height = D;
									O -= g
								}
							} else {
								var S = s, r = V;
								for (U = 0; U < G; U++) {
									k = q[U];
									J = I[U];
									v = k.margins;
									y = v.left + v.right;
									if (R && k.flex && !k.height) {
										flexedHeight = Math.ceil((k.flex / r)
												* S);
										S -= flexedHeight;
										r -= k.flex;
										J.height = flexedHeight;
										J.dirtySize = true
									}
								}
							}
						}
						if (Y) {
							E += s / 2
						} else {
							if (B) {
								E += s
							}
						}
						for (U = 0; U < G; U++) {
							k = q[U];
							J = I[U];
							v = k.margins;
							E += v.top;
							y = v.left + v.right;
							J.left = W + v.left;
							J.top = E;
							switch (this.align) {
							case "stretch":
								e = M - y;
								J.width = e.constrain(k.minWidth || 0,
										k.maxWidth || 1000000);
								J.dirtySize = true;
								break;
							case "stretchmax":
								e = w - y;
								J.width = e.constrain(k.minWidth || 0,
										k.maxWidth || 1000000);
								J.dirtySize = true;
								break;
							case "center":
								var A = M - J.width - y;
								if (A > 0) {
									J.left = W + y + (A / 2)
								}
							}
							E += J.height + v.bottom
						}
						return {
							boxes :I,
							meta : {
								maxWidth :w,
								nonFlexHeight :m,
								desiredHeight :N,
								minimumHeight :o,
								shortfall :N - d,
								tooNarrow :n
							}
						}
					}
				});
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(e, k) {
						if (!this.leftTr) {
							var h = e.buttonAlign == "center" ? "center"
									: "left";
							k.addClass("x-toolbar-layout-ct");
							k.insertHtml("beforeEnd", String.format(
									this.tableHTML, h));
							this.leftTr = k
									.child("tr.x-toolbar-left-row", true);
							this.rightTr = k.child("tr.x-toolbar-right-row",
									true);
							this.extrasTr = k.child("tr.x-toolbar-extras-row",
									true);
							if (this.hiddenItem == undefined) {
								this.hiddenItems = []
							}
						}
						var l = e.buttonAlign == "right" ? this.rightTr
								: this.leftTr, m = e.items.items, d = 0;
						for ( var b = 0, g = m.length, n; b < g; b++, d++) {
							n = m[b];
							if (n.isFill) {
								l = this.rightTr;
								d = -1
							} else {
								if (!n.rendered) {
									n.render(this.insertCell(n, l, d));
									this.configureItem(n)
								} else {
									if (!n.xtbHidden
											&& !this.isValidParent(n,
													l.childNodes[d])) {
										var a = this.insertCell(n, l, d);
										a.appendChild(n.getPositionEl().dom);
										n.container = Ext.get(a)
									}
								}
							}
						}
						this.cleanup(this.leftTr);
						this.cleanup(this.rightTr);
						this.cleanup(this.extrasTr);
						this.fitToSize(k)
					},
					cleanup : function(b) {
						var e = b.childNodes, a, d;
						for (a = e.length - 1; a >= 0 && (d = e[a]); a--) {
							if (!d.firstChild) {
								b.removeChild(d)
							}
						}
					},
					insertCell : function(e, b, a) {
						var d = document.createElement("td");
						d.className = "x-toolbar-cell";
						b.insertBefore(d, b.childNodes[a] || null);
						return d
					},
					hideItem : function(a) {
						this.hiddenItems.push(a);
						a.xtbHidden = true;
						a.xtbWidth = a.getPositionEl().dom.parentNode.offsetWidth;
						a.hide()
					},
					unhideItem : function(a) {
						a.show();
						a.xtbHidden = false;
						this.hiddenItems.remove(a)
					},
					getItemWidth : function(a) {
						return a.hidden ? (a.xtbWidth || 0)
								: a.getPositionEl().dom.parentNode.offsetWidth
					},
					fitToSize : function(l) {
						if (this.container.enableOverflow === false) {
							return
						}
						var b = l.dom.clientWidth, k = l.dom.firstChild.offsetWidth, n = b
								- this.triggerWidth, a = this.lastWidth || 0, c = this.hiddenItems, e = c.length != 0, o = b >= a;
						this.lastWidth = b;
						if (k > b || (e && o)) {
							var m = this.container.items.items, h = m.length, d = 0, p;
							for ( var g = 0; g < h; g++) {
								p = m[g];
								if (!p.isFill) {
									d += this.getItemWidth(p);
									if (d > n) {
										if (!(p.hidden || p.xtbHidden)) {
											this.hideItem(p)
										}
									} else {
										if (p.xtbHidden) {
											this.unhideItem(p)
										}
									}
								}
							}
						}
						e = c.length != 0;
						if (e) {
							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(c, a) {
						var b = Ext.apply( {}, c.initialConfig), d = c.toggleGroup;
						Ext.copyTo(b, c, [ "iconCls", "icon", "itemId",
								"disabled", "handler", "scope", "menu" ]);
						Ext.apply(b, {
							text :c.overflowText || c.text,
							hideOnClick :a
						});
						if (d || c.enableToggle) {
							Ext.apply(b, {
								group :d,
								checked :c.pressed,
								listeners : {
									checkchange : function(g, e) {
										c.toggle(e)
									}
								}
							})
						}
						delete b.ownerCt;
						delete b.xtype;
						delete b.id;
						return b
					},
					addComponentToMenu : function(b, a) {
						if (a instanceof Ext.Toolbar.Separator) {
							b.add("-")
						} else {
							if (Ext.isFunction(a.isXType)) {
								if (a.isXType("splitbutton")) {
									b.add(this.createMenuConfig(a, true))
								} else {
									if (a.isXType("button")) {
										b
												.add(this.createMenuConfig(a,
														!a.menu))
									} else {
										if (a.isXType("buttongroup")) {
											a.items.each( function(c) {
												this.addComponentToMenu(b, c)
											}, this)
										}
									}
								}
							}
						}
					},
					clearMenu : function() {
						var a = this.moreMenu;
						if (a && a.items) {
							a.items.each( function(b) {
								delete b.menu
							})
						}
					},
					beforeMoreShow : function(h) {
						var b = this.container.items.items, a = b.length, g, e;
						var c = function(k, i) {
							return k.isXType("buttongroup")
									&& !(i instanceof Ext.Toolbar.Separator)
						};
						this.clearMenu();
						h.removeAll();
						for ( var d = 0; d < a; d++) {
							g = b[d];
							if (g.xtbHidden) {
								if (e && (c(g, e) || c(e, g))) {
									h.add("-")
								}
								this.addComponentToMenu(h, g);
								e = g
							}
						}
						if (h.items.length < 1) {
							h.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 a = this.insertCell(this.more, this.extrasTr,
									100);
							this.more.render(a)
						}
					},
					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(a) {
						this.monitorResize = !a.floating;
						a.on("autosize", this.doAutoSize, this);
						Ext.layout.MenuLayout.superclass.setContainer.call(
								this, a)
					},
					renderItem : function(g, b, e) {
						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 (g && !g.rendered) {
							if (Ext.isNumber(b)) {
								b = e.dom.childNodes[b]
							}
							var d = this.getItemArgs(g);
							g.render(g.positionEl = b ? this.itemTpl
									.insertBefore(b, d, true) : this.itemTpl
									.append(e, d, true));
							g.positionEl.menuItemId = g.getItemId();
							if (!d.isMenuItem && d.needsIcon) {
								g.positionEl
										.addClass("x-menu-list-item-indent")
							}
							this.configureItem(g)
						} else {
							if (g && !this.isValidParent(g, e)) {
								if (Ext.isNumber(b)) {
									b = e.dom.childNodes[b]
								}
								e.dom.insertBefore(g.getActionEl().dom, b
										|| null)
							}
						}
					},
					getItemArgs : function(d) {
						var a = d instanceof Ext.menu.Item, b = !(a || d instanceof Ext.menu.Separator);
						return {
							isMenuItem :a,
							needsIcon :b && (d.icon || d.iconCls),
							icon :d.icon || Ext.BLANK_IMAGE_URL,
							iconCls :"x-menu-item-icon " + (d.iconCls || ""),
							itemId :"x-menu-el-" + d.id,
							itemCls :"x-menu-list-item ",
							altText :d.altText || ""
						}
					},
					isValidParent : function(b, a) {
						return b.el.up("li.x-menu-list-item", 5).dom.parentNode === (a.dom || a)
					},
					onLayout : function(a, b) {
						Ext.layout.MenuLayout.superclass.onLayout.call(this, a,
								b);
						this.doAutoSize()
					},
					doAutoSize : function() {
						var c = this.container, a = c.width;
						if (c.floating) {
							if (a) {
								c.setWidth(a)
							} else {
								if (Ext.isIE) {
									c
											.setWidth(Ext.isStrict
													&& (Ext.isIE7 || Ext.isIE8) ? "auto"
													: c.minWidth);
									var d = c.getEl(), b = d.dom.offsetWidth;
									c.setWidth(c.getLayoutTarget().getWidth()
											+ d.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(a, b) {
		this.fireEvent("resize", this, a, b, a, b)
	}
});
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(b) {
		var a = this.minButtonWidth;
		this.elements += ",footer";
		this.fbar = this.createToolbar(b, {
			buttonAlign :this.buttonAlign,
			toolbarCls :"x-panel-fbar",
			enableOverflow :false,
			defaults : function(d) {
				return {
					minWidth :d.minWidth || a
				}
			}
		});
		this.fbar.items.each( function(d) {
			d.minWidth = d.minWidth || this.minButtonWidth
		}, this);
		this.buttons = this.fbar.items.items
	},
	createToolbar : function(b, c) {
		var a;
		if (Ext.isArray(b)) {
			b = {
				items :b
			}
		}
		a = b.events ? Ext.apply(b, c) : this.createComponent(Ext.apply( {}, b,
				c), "toolbar");
		this.toolbars.push(a);
		return a
	},
	createElement : function(a, c) {
		if (this[a]) {
			c.appendChild(this[a].dom);
			return
		}
		if (a === "bwrap" || this.elements.indexOf(a) != -1) {
			if (this[a + "Cfg"]) {
				this[a] = Ext.fly(c).createChild(this[a + "Cfg"])
			} else {
				var b = document.createElement("div");
				b.className = this[a + "Cls"];
				this[a] = Ext.get(c.appendChild(b))
			}
			if (this[a + "CssClass"]) {
				this[a].addClass(this[a + "CssClass"])
			}
			if (this[a + "Style"]) {
				this[a].applyStyles(this[a + "Style"])
			}
		}
	},
	onRender : function(g, e) {
		Ext.Panel.superclass.onRender.call(this, g, e);
		this.createClasses();
		var a = this.el, h = a.dom, l, i;
		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) {
			i = this.tools;
			this.elements += (this.header !== false) ? ",header" : ""
		}
		this.tools = {};
		a.addClass(this.baseCls);
		if (h.firstChild) {
			this.header = a.down("." + this.headerCls);
			this.bwrap = a.down("." + this.bwrapCls);
			var k = this.bwrap ? this.bwrap : a;
			this.tbar = k.down("." + this.tbarCls);
			this.body = k.down("." + this.bodyCls);
			this.bbar = k.down("." + this.bbarCls);
			this.footer = k.down("." + this.footerCls);
			this.fromMarkup = true
		}
		if (this.preventBodyReset === true) {
			a.addClass("x-panel-reset")
		}
		if (this.cls) {
			a.addClass(this.cls)
		}
		if (this.buttons) {
			this.elements += ",footer"
		}
		if (this.frame) {
			a.insertHtml("afterBegin", String.format(Ext.Element.boxMarkup,
					this.baseCls));
			this.createElement("header", h.firstChild.firstChild.firstChild);
			this.createElement("bwrap", h);
			l = this.bwrap.dom;
			var c = h.childNodes[1], b = h.childNodes[2];
			l.appendChild(c);
			l.appendChild(b);
			var m = l.firstChild.firstChild.firstChild;
			this.createElement("tbar", m);
			this.createElement("body", m);
			this.createElement("bbar", m);
			this.createElement("footer", l.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(m)
		} else {
			this.createElement("header", h);
			this.createElement("bwrap", h);
			l = this.bwrap.dom;
			this.createElement("tbar", l);
			this.createElement("body", l);
			this.createElement("bbar", l);
			this.createElement("footer", l);
			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 (i) {
			this.addTool.apply(this, i)
		}
		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(b) {
		var a = this.iconCls;
		this.iconCls = b;
		if (this.rendered && this.header) {
			if (this.frame) {
				this.header.addClass("x-panel-icon");
				this.header.replaceClass(a, this.iconCls)
			} else {
				var e = this.header, c = e.child("img.x-panel-inline-icon");
				if (c) {
					Ext.fly(c).replaceClass(a, this.iconCls)
				} else {
					var d = e.child("span." + this.headerTextCls);
					if (d) {
						Ext.DomHelper.insertBefore(d.dom, {
							tag :"img",
							alt :"",
							src :Ext.BLANK_IMAGE_URL,
							cls :"x-panel-inline-icon " + this.iconCls
						})
					}
				}
			}
		}
		this.fireEvent("iconchange", this, b, a)
	},
	makeFloating : function(a) {
		this.floating = true;
		this.el = new Ext.Layer(Ext.apply( {}, a, {
			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(a, c, b) {
		if (!this.fbar) {
			this.createFbar( [])
		}
		if (c) {
			if (Ext.isString(a)) {
				a = {
					text :a
				}
			}
			a = Ext.apply( {
				handler :c,
				scope :b
			}, a)
		}
		return this.fbar.add(a)
	},
	addTool : function() {
		if (!this.rendered) {
			if (!this.tools) {
				this.tools = []
			}
			Ext.each(arguments, function(a) {
				this.tools.push(a)
			}, this);
			return
		}
		if (!this[this.toolTarget]) {
			return
		}
		if (!this.toolTemplate) {
			var h = new Ext.Template(
					'<div class="x-tool x-tool-{id}">&#160;</div>');
			h.disableFormats = true;
			h.compile();
			Ext.Panel.prototype.toolTemplate = h
		}
		for ( var g = 0, d = arguments, c = d.length; g < c; g++) {
			var b = d[g];
			if (!this.tools[b.id]) {
				var k = "x-tool-" + b.id + "-over";
				var e = this.toolTemplate.insertFirst(this[this.toolTarget], b,
						true);
				this.tools[b.id] = e;
				e.enableDisplayMode("block");
				this.mon(e, "click", this.createToolHandler(e, b, k, this));
				if (b.on) {
					this.mon(e, b.on)
				}
				if (b.hidden) {
					e.hide()
				}
				if (b.qtip) {
					if (Ext.isObject(b.qtip)) {
						Ext.QuickTips.register(Ext.apply( {
							target :e.id
						}, b.qtip))
					} else {
						e.dom.qtip = b.qtip
					}
				}
				e.addClassOnOver(k)
			}
		}
	},
	onLayout : function(b, a) {
		Ext.Panel.superclass.onLayout.apply(this, arguments);
		if (this.hasLayout && this.toolbars.length > 0) {
			Ext.each(this.toolbars, function(c) {
				c.doLayout(undefined, a)
			});
			this.syncHeight()
		}
	},
	syncHeight : function() {
		var b = this.toolbarHeight, c = this.body, a = this.lastSize.height, d;
		if (this.autoHeight || !Ext.isDefined(a) || a == "auto") {
			return
		}
		if (b != this.getToolbarHeight()) {
			b = Math.max(0, a - this.getFrameHeight());
			c.setHeight(b);
			d = c.getSize();
			this.toolbarHeight = this.getToolbarHeight();
			this.onBodyResize(d.width, d.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(c, a, d, b) {
		return function(g) {
			c.removeClass(d);
			if (a.stopEvent !== false) {
				g.stopEvent()
			}
			if (a.handler) {
				a.handler.call(a.scope || c, g, c, b, a)
			}
		}
	},
	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(a) {
				a.doLayout();
				a.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(a) {
		if (this.floating) {
			this.el.beforeAction()
		}
		if (a !== false) {
			this.el.addClass("x-panel-animated")
		}
	},
	afterEffect : function(a) {
		this.syncShadow();
		this.el.removeClass("x-panel-animated")
	},
	createEffect : function(c, b, d) {
		var e = {
			scope :d,
			block :true
		};
		if (c === true) {
			e.callback = b;
			return e
		} else {
			if (!c.callback) {
				e.callback = b
			} else {
				e.callback = function() {
					b.call(d);
					Ext.callback(c.callback, c.scope)
				}
			}
		}
		return Ext.applyIf(e, c)
	},
	collapse : function(b) {
		if (this.collapsed || this.el.hasFxBlock()
				|| this.fireEvent("beforecollapse", this, b) === false) {
			return
		}
		var a = b === true || (b !== false && this.animCollapse);
		this.beforeEffect(a);
		this.onCollapse(a, b);
		return this
	},
	onCollapse : function(a, b) {
		if (a) {
			this[this.collapseEl].slideOut(this.slideAnchor, Ext.apply(this
					.createEffect(b || true, this.afterCollapse, this),
					this.collapseDefaults))
		} else {
			this[this.collapseEl].hide(this.hideMode);
			this.afterCollapse(false)
		}
	},
	afterCollapse : function(a) {
		this.collapsed = true;
		this.el.addClass(this.collapsedCls);
		if (a !== false) {
			this[this.collapseEl].hide(this.hideMode)
		}
		this.afterEffect(a);
		this.cascade( function(b) {
			if (b.lastSize) {
				b.lastSize = {
					width :undefined,
					height :undefined
				}
			}
		});
		this.fireEvent("collapse", this)
	},
	expand : function(b) {
		if (!this.collapsed || this.el.hasFxBlock()
				|| this.fireEvent("beforeexpand", this, b) === false) {
			return
		}
		var a = b === true || (b !== false && this.animCollapse);
		this.el.removeClass(this.collapsedCls);
		this.beforeEffect(a);
		this.onExpand(a, b);
		return this
	},
	onExpand : function(a, b) {
		if (a) {
			this[this.collapseEl].slideIn(this.slideAnchor, Ext.apply(this
					.createEffect(b || true, this.afterExpand, this),
					this.expandDefaults))
		} else {
			this[this.collapseEl].show(this.hideMode);
			this.afterExpand(false)
		}
	},
	afterExpand : function(a) {
		this.collapsed = false;
		if (a !== false) {
			this[this.collapseEl].show(this.hideMode)
		}
		this.afterEffect(a);
		if (this.deferLayout) {
			delete this.deferLayout;
			this.doLayout(true)
		}
		this.fireEvent("expand", this)
	},
	toggleCollapse : function(a) {
		this[this.collapsed ? "expand" : "collapse"](a);
		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(g, d, c, e) {
		var a = g, b = d;
		if (Ext.isDefined(a) || Ext.isDefined(b)) {
			if (!this.collapsed) {
				if (Ext.isNumber(a)) {
					this.body.setWidth(a = this.adjustBodyWidth(a
							- this.getFrameWidth()))
				} else {
					if (a == "auto") {
						a = this.body.setWidth("auto").dom.offsetWidth
					} else {
						a = this.body.dom.offsetWidth
					}
				}
				if (this.tbar) {
					this.tbar.setWidth(a);
					if (this.topToolbar) {
						this.topToolbar.setSize(a)
					}
				}
				if (this.bbar) {
					this.bbar.setWidth(a);
					if (this.bottomToolbar) {
						this.bottomToolbar.setSize(a);
						if (Ext.isIE) {
							this.bbar.setStyle("position", "static");
							this.bbar.setStyle("position", "")
						}
					}
				}
				if (this.footer) {
					this.footer.setWidth(a);
					if (this.fbar) {
						this.fbar.setSize(Ext.isIE ? (a - this.footer
								.getFrameWidth("lr")) : "auto")
					}
				}
				if (Ext.isNumber(b)) {
					b = Math.max(0, b - this.getFrameHeight());
					this.body.setHeight(b)
				} else {
					if (b == "auto") {
						this.body.setHeight(b)
					}
				}
				if (this.disabled && this.el._mask) {
					this.el._mask.setSize(this.el.dom.clientWidth, this.el
							.getHeight())
				}
			} else {
				this.queuedBodySize = {
					width :a,
					height :b
				};
				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(a, b)
		}
		this.syncShadow();
		Ext.Panel.superclass.onResize.call(this, g, d, c, e)
	},
	onBodyResize : function(a, b) {
		this.fireEvent("bodyresize", this, a, b)
	},
	getToolbarHeight : function() {
		var a = 0;
		if (this.rendered) {
			Ext.each(this.toolbars, function(b) {
				a += b.getHeight()
			}, this)
		}
		return a
	},
	adjustBodyHeight : function(a) {
		return a
	},
	adjustBodyWidth : function(a) {
		return a
	},
	onPosition : function() {
		this.syncShadow()
	},
	getFrameWidth : function() {
		var b = this.el.getFrameWidth("lr") + this.bwrap.getFrameWidth("lr");
		if (this.frame) {
			var a = this.bwrap.dom.firstChild;
			b += (Ext.fly(a).getFrameWidth("l") + Ext.fly(a.firstChild)
					.getFrameWidth("r"));
			b += this.mc.getFrameWidth("lr")
		}
		return b
	},
	getFrameHeight : function() {
		var a = this.el.getFrameWidth("tb") + this.bwrap.getFrameWidth("tb");
		a += (this.tbar ? this.tbar.getHeight() : 0)
				+ (this.bbar ? this.bbar.getHeight() : 0);
		if (this.frame) {
			a += this.el.dom.firstChild.offsetHeight + this.ft.dom.offsetHeight
					+ this.mc.getFrameWidth("tb")
		} else {
			a += (this.header ? this.header.getHeight() : 0)
					+ (this.footer ? this.footer.getHeight() : 0)
		}
		return a
	},
	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(b, a) {
		this.title = b;
		if (this.header && this.headerAsText) {
			this.header.child("span").update(b)
		}
		if (a) {
			this.setIconClass(a)
		}
		this.fireEvent("titlechange", this, b);
		return this
	},
	getUpdater : function() {
		return this.body.getUpdater()
	},
	load : function() {
		var a = this.body.getUpdater();
		a.update.apply(a, arguments);
		return this
	},
	beforeDestroy : function() {
		Ext.Panel.superclass.beforeDestroy.call(this);
		if (this.header) {
			this.header.removeAllListeners()
		}
		if (this.tools) {
			for ( var a in this.tools) {
				Ext.destroy(this.tools[a])
			}
		}
		if (this.toolbars.length > 0) {
			Ext.each(this.toolbars, function(b) {
				b.un("afterlayout", this.syncHeight, this);
				b.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(a, e, b) {
		var d = document.createElement("div");
		d.className = "x-panel-ghost " + (a ? a : "");
		if (this.header) {
			d.appendChild(this.el.dom.firstChild.cloneNode(true))
		}
		Ext.fly(d.appendChild(document.createElement("ul"))).setHeight(
				this.bwrap.getHeight());
		d.style.width = this.el.dom.offsetWidth + "px";
		if (!b) {
			this.container.dom.appendChild(d)
		} else {
			Ext.getDom(b).appendChild(d)
		}
		if (e !== false && this.el.useShim !== false) {
			var c = new Ext.Layer( {
				shadow :false,
				useDisplay :true,
				constrain :false
			}, d);
			c.show();
			return c
		} else {
			return new Ext.Element(d)
		}
	},
	doAutoLoad : function() {
		var a = this.body.getUpdater();
		if (this.renderer) {
			a.setRenderer(this.renderer)
		}
		a.update(Ext.isObject(this.autoLoad) ? this.autoLoad : {
			url :this.autoLoad
		})
	},
	getTool : function(a) {
		return this.tools[a]
	}
});
Ext.reg("panel", Ext.Panel);
Ext.Editor = function(b, a) {
	if (b.field) {
		this.field = Ext.create(b.field, "textfield");
		a = Ext.apply( {}, b);
		delete a.field
	} else {
		this.field = b
	}
	Ext.Editor.superclass.constructor.call(this, a)
};
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(b, a) {
						this.el = new Ext.Layer( {
							shadow :this.shadow,
							cls :"x-editor",
							parentEl :b,
							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(g, d) {
						var b = d.getKey(), a = this.completeOnEnter
								&& b == d.ENTER, c = this.cancelOnEsc
								&& b == d.ESC;
						if (a || c) {
							d.stopEvent();
							if (a) {
								this.completeEdit()
							} else {
								this.cancelEdit()
							}
							if (g.triggerBlur) {
								g.triggerBlur()
							}
						}
						this.fireEvent("specialkey", g, d)
					},
					startEdit : function(b, c) {
						if (this.editing) {
							this.completeEdit()
						}
						this.boundEl = Ext.get(b);
						var a = c !== undefined ? c
								: this.boundEl.dom.innerHTML;
						if (!this.rendered) {
							this.render(this.parentEl || document.body)
						}
						if (this.fireEvent("beforestartedit", this,
								this.boundEl, a) !== false) {
							this.startValue = a;
							this.field.reset();
							this.field.setValue(a);
							this.realign(true);
							this.editing = true;
							this.show()
						}
					},
					doAutoSize : function() {
						if (this.autoSize) {
							var b = this.boundEl.getSize(), a = this.field
									.getSize();
							switch (this.autoSize) {
							case "width":
								this.setSize(b.width, a.height);
								break;
							case "height":
								this.setSize(a.width, b.height);
								break;
							case "none":
								this.setSize(a.width, a.height);
								break;
							default:
								this.setSize(b.width, b.height)
							}
						}
					},
					setSize : function(a, b) {
						delete this.field.lastSize;
						this.field.setSize(a, b);
						if (this.el) {
							if (Ext.isGecko2 || Ext.isOpera
									|| (Ext.isIE7 && Ext.isStrict)) {
								this.el.setSize(a, b)
							}
							this.el.sync()
						}
					},
					realign : function(a) {
						if (a === true) {
							this.doAutoSize()
						}
						this.el.alignTo(this.boundEl, this.alignment,
								this.offsets)
					},
					completeEdit : function(a) {
						if (!this.editing) {
							return
						}
						if (this.field.assertValue) {
							this.field.assertValue()
						}
						var b = this.getValue();
						if (!this.field.isValid()) {
							if (this.revertInvalid !== false) {
								this.cancelEdit(a)
							}
							return
						}
						if (String(b) === String(this.startValue)
								&& this.ignoreNoChange) {
							this.hideEdit(a);
							return
						}
						if (this.fireEvent("beforecomplete", this, b,
								this.startValue) !== false) {
							b = this.getValue();
							if (this.updateEl && this.boundEl) {
								this.boundEl.update(b)
							}
							this.hideEdit(a);
							this
									.fireEvent("complete", this, b,
											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(a) {
						if (this.editing) {
							var b = this.getValue();
							this.setValue(this.startValue);
							this.hideEdit(a);
							this.fireEvent("canceledit", this, b,
									this.startValue)
						}
					},
					hideEdit : function(a) {
						if (a !== 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(a) {
						this.field.setValue(a)
					},
					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(b, a) {
						this.autoEl = {
							tag :"div",
							cls :this.itemCls
						};
						Ext.ColorPalette.superclass.onRender.call(this, b, a);
						var c = this.tpl
								|| new Ext.XTemplate(
										'<tpl for="."><a href="#" class="color-{.}" hidefocus="on"><em><span style="background:#{.}" unselectable="on">&#160;</span></em></a></tpl>');
						c.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 a = this.value;
							this.value = null;
							this.select(a, true)
						}
					},
					handleClick : function(b, a) {
						b.preventDefault();
						if (!this.disabled) {
							var d = a.className
									.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];
							this.select(d.toUpperCase())
						}
					},
					select : function(b, a) {
						b = b.replace("#", "");
						if (b != this.value || this.allowReselect) {
							var c = this.el;
							if (this.value) {
								c.child("a.color-" + this.value).removeClass(
										"x-color-palette-sel")
							}
							c.child("a.color-" + b).addClass(
									"x-color-palette-sel");
							this.value = b;
							if (a !== true) {
								this.fireEvent("select", this, b)
							}
						}
					}
				});
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 b = this.disabledDates, a = b.length - 1, c = "(?:";
							Ext.each(b, function(g, e) {
								c += Ext.isDate(g) ? "^"
										+ Ext.escapeRe(g
												.dateFormat(this.format)) + "$"
										: b[e];
								if (e != a) {
									c += "|"
								}
							}, this);
							this.disabledDatesRE = new RegExp(c + ")")
						}
					},
					setDisabledDates : function(a) {
						if (Ext.isArray(a)) {
							this.disabledDates = a;
							this.disabledDatesRE = null
						} else {
							this.disabledDatesRE = a
						}
						this.initDisabledDays();
						this.update(this.value, true)
					},
					setDisabledDays : function(a) {
						this.disabledDays = a;
						this.update(this.value, true)
					},
					setMinDate : function(a) {
						this.minDate = a;
						this.update(this.value, true)
					},
					setMaxDate : function(a) {
						this.maxDate = a;
						this.update(this.value, true)
					},
					setValue : function(a) {
						this.value = a.clearTime(true);
						this.update(this.value)
					},
					getValue : function() {
						return this.value
					},
					focus : function() {
						this.update(this.activeDate)
					},
					onEnable : function(a) {
						Ext.DatePicker.superclass.onEnable.call(this);
						this.doDisabled(false);
						this.update(a ? 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(a) {
								Ext.fly(a).repaint()
							})
						}
					},
					doDisabled : function(a) {
						this.keyNav.setDisabled(a);
						this.prevRepeater.setDisabled(a);
						this.nextRepeater.setDisabled(a);
						if (this.showToday) {
							this.todayKeyListener.setDisabled(a);
							this.todayBtn.setDisabled(a)
						}
					},
					onRender : function(e, b) {
						var a = [
								'<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>' ], c = this.dayNames, h;
						for (h = 0; h < 7; h++) {
							var l = this.startDay + h;
							if (l > 6) {
								l = l - 7
							}
							a.push("<th><span>", c[l].substr(0, 1),
									"</span></th>")
						}
						a[a.length] = "</tr></thead><tbody><tr>";
						for (h = 0; h < 42; h++) {
							if (h % 7 === 0 && h !== 0) {
								a[a.length] = "</tr><tr>"
							}
							a[a.length] = '<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>'
						}
						a
								.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 k = document.createElement("div");
						k.className = "x-date-picker";
						k.innerHTML = a.join("");
						e.dom.insertBefore(k, b);
						this.el = Ext.get(k);
						this.eventEl = Ext.get(k.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(d) {
								if (d.ctrlKey) {
									this.showPrevMonth()
								} else {
									this.update(this.activeDate.add("d", -1))
								}
							},
							right : function(d) {
								if (d.ctrlKey) {
									this.showNextMonth()
								} else {
									this.update(this.activeDate.add("d", 1))
								}
							},
							up : function(d) {
								if (d.ctrlKey) {
									this.showNextYear()
								} else {
									this.update(this.activeDate.add("d", -7))
								}
							},
							down : function(d) {
								if (d.ctrlKey) {
									this.showPrevYear()
								} else {
									this.update(this.activeDate.add("d", 7))
								}
							},
							pageUp : function(d) {
								this.showNextMonth()
							},
							pageDown : function(d) {
								this.showPrevMonth()
							},
							enter : function(d) {
								d.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 g = (new Date()).dateFormat(this.format);
							this.todayBtn = new Ext.Button( {
								renderTo :this.el.child("td.x-date-bottom",
										true),
								text :String.format(this.todayText, g),
								tooltip :String.format(this.todayTip, g),
								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 a = [ '<table border="0" cellspacing="0">' ];
							for ( var b = 0; b < 6; b++) {
								a
										.push(
												'<tr><td class="x-date-mp-month"><a href="#">',
												Date.getShortMonthName(b),
												"</a></td>",
												'<td class="x-date-mp-month x-date-mp-sep"><a href="#">',
												Date.getShortMonthName(b + 6),
												"</a></td>",
												b === 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>')
							}
							a
									.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(a.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(c, d, e) {
								e += 1;
								if ((e % 2) === 0) {
									c.dom.xmonth = 5 + Math.round(e * 0.5)
								} else {
									c.dom.xmonth = Math.round((e - 1) * 0.5)
								}
							})
						}
					},
					showMonthPicker : function() {
						if (!this.disabled) {
							this.createMonthPicker();
							var a = this.el.getSize();
							this.monthPicker.setSize(a);
							this.monthPicker.child("table").setSize(a);
							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(e) {
						this.mpyear = e;
						var c = this.mpYears.elements;
						for ( var b = 1; b <= 10; b++) {
							var d = c[b - 1], a;
							if ((b % 2) === 0) {
								a = e + Math.round(b * 0.5);
								d.firstChild.innerHTML = a;
								d.xyear = a
							} else {
								a = e - (5 - Math.round(b * 0.5));
								d.firstChild.innerHTML = a;
								d.xyear = a
							}
							this.mpYears.item(b - 1)[a == this.mpSelYear ? "addClass"
									: "removeClass"]("x-date-mp-sel")
						}
					},
					updateMPMonth : function(a) {
						this.mpMonths.each( function(b, c, d) {
							b[b.dom.xmonth == a ? "addClass" : "removeClass"]
									("x-date-mp-sel")
						})
					},
					selectMPMonth : function(a) {
					},
					onMonthClick : function(g, b) {
						g.stopEvent();
						var c = new Ext.Element(b), a;
						if (c.is("button.x-date-mp-cancel")) {
							this.hideMonthPicker()
						} else {
							if (c.is("button.x-date-mp-ok")) {
								var h = new Date(this.mpSelYear,
										this.mpSelMonth,
										(this.activeDate || this.value)
												.getDate());
								if (h.getMonth() != this.mpSelMonth) {
									h = new Date(this.mpSelYear,
											this.mpSelMonth, 1)
											.getLastDateOfMonth()
								}
								this.update(h);
								this.hideMonthPicker()
							} else {
								if ((a = c.up("td.x-date-mp-month", 2))) {
									this.mpMonths.removeClass("x-date-mp-sel");
									a.addClass("x-date-mp-sel");
									this.mpSelMonth = a.dom.xmonth
								} else {
									if ((a = c.up("td.x-date-mp-year", 2))) {
										this.mpYears
												.removeClass("x-date-mp-sel");
										a.addClass("x-date-mp-sel");
										this.mpSelYear = a.dom.xyear
									} else {
										if (c.is("a.x-date-mp-prev")) {
											this.updateMPYear(this.mpyear - 10)
										} else {
											if (c.is("a.x-date-mp-next")) {
												this
														.updateMPYear(this.mpyear + 10)
											}
										}
									}
								}
							}
						}
					},
					onMonthDblClick : function(d, b) {
						d.stopEvent();
						var c = new Ext.Element(b), a;
						if ((a = c.up("td.x-date-mp-month", 2))) {
							this.update(new Date(this.mpSelYear, a.dom.xmonth,
									(this.activeDate || this.value).getDate()));
							this.hideMonthPicker()
						} else {
							if ((a = c.up("td.x-date-mp-year", 2))) {
								this.update(new Date(a.dom.xyear,
										this.mpSelMonth,
										(this.activeDate || this.value)
												.getDate()));
								this.hideMonthPicker()
							}
						}
					},
					hideMonthPicker : function(a) {
						if (this.monthPicker) {
							if (a === true) {
								this.monthPicker.hide()
							} else {
								this.monthPicker.slideOut("t", {
									duration :0.2
								})
							}
						}
					},
					showPrevMonth : function(a) {
						this.update(this.activeDate.add("mo", -1))
					},
					showNextMonth : function(a) {
						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(a) {
						a.stopEvent();
						if (!this.disabled) {
							var b = a.getWheelDelta();
							if (b > 0) {
								this.showPrevMonth()
							} else {
								if (b < 0) {
									this.showNextMonth()
								}
							}
						}
					},
					handleDateClick : function(b, a) {
						b.stopEvent();
						if (!this.disabled
								&& a.dateValue
								&& !Ext.fly(a.parentNode).hasClass(
										"x-date-disabled")) {
							this.cancelFocus = this.focusOnSelect === false;
							this.setValue(new Date(a.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(H, B) {
						if (this.rendered) {
							var a = this.activeDate, q = this.isVisible();
							this.activeDate = H;
							if (!B && a && this.el) {
								var p = H.getTime();
								if (a.getMonth() == H.getMonth()
										&& a.getFullYear() == H.getFullYear()) {
									this.cells.removeClass("x-date-selected");
									this.cells.each( function(d) {
										if (d.dom.firstChild.dateValue == p) {
											d.addClass("x-date-selected");
											if (q && !this.cancelFocus) {
												Ext.fly(d.dom.firstChild)
														.focus(50)
											}
											return false
										}
									}, this);
									return
								}
							}
							var l = H.getDaysInMonth(), r = H
									.getFirstDateOfMonth(), g = r.getDay()
									- this.startDay;
							if (g < 0) {
								g += 7
							}
							l += g;
							var C = H.add("mo", -1), h = C.getDaysInMonth() - g, e = this.cells.elements, s = this.textNodes, E = (new Date(
									C.getFullYear(), C.getMonth(), h,
									this.initHour)), D = new Date().clearTime()
									.getTime(), x = H.clearTime(true).getTime(), v = this.minDate ? this.minDate
									.clearTime(true)
									: Number.NEGATIVE_INFINITY, z = this.maxDate ? this.maxDate
									.clearTime(true)
									: Number.POSITIVE_INFINITY, G = this.disabledDatesRE, u = this.disabledDatesText, J = this.disabledDays ? this.disabledDays
									.join("")
									: false, F = this.disabledDaysText, A = this.format;
							if (this.showToday) {
								var n = new Date().clearTime(), c = (n < v
										|| n > z
										|| (G && A && G.test(n.dateFormat(A))) || (J && J
										.indexOf(n.getDay()) != -1));
								if (!this.disabled) {
									this.todayBtn.setDisabled(c);
									this.todayKeyListener[c ? "disable"
											: "enable"]()
								}
							}
							var m = function(K, d) {
								d.title = "";
								var i = E.clearTime(true).getTime();
								d.firstChild.dateValue = i;
								if (i == D) {
									d.className += " x-date-today";
									d.title = K.todayText
								}
								if (i == x) {
									d.className += " x-date-selected";
									if (q) {
										Ext.fly(d.firstChild).focus(50)
									}
								}
								if (i < v) {
									d.className = " x-date-disabled";
									d.title = K.minText;
									return
								}
								if (i > z) {
									d.className = " x-date-disabled";
									d.title = K.maxText;
									return
								}
								if (J) {
									if (J.indexOf(E.getDay()) != -1) {
										d.title = F;
										d.className = " x-date-disabled"
									}
								}
								if (G && A) {
									var w = E.dateFormat(A);
									if (G.test(w)) {
										d.title = u.replace("%0", w);
										d.className = " x-date-disabled"
									}
								}
							};
							var y = 0;
							for (; y < g; y++) {
								s[y].innerHTML = (++h);
								E.setDate(E.getDate() + 1);
								e[y].className = "x-date-prevday";
								m(this, e[y])
							}
							for (; y < l; y++) {
								var b = y - g + 1;
								s[y].innerHTML = (b);
								E.setDate(E.getDate() + 1);
								e[y].className = "x-date-active";
								m(this, e[y])
							}
							var I = 0;
							for (; y < 42; y++) {
								s[y].innerHTML = (++I);
								E.setDate(E.getDate() + 1);
								e[y].className = "x-date-nextday";
								m(this, e[y])
							}
							this.mbtn.setText(this.monthNames[H.getMonth()]
									+ " " + H.getFullYear());
							if (!this.internalRender) {
								var k = this.el.dom.firstChild, o = k.offsetWidth;
								this.el.setWidth(o
										+ this.el.getBorderWidth("lr"));
								Ext.fly(k).setWidth(o);
								this.internalRender = true;
								if (Ext.isOpera && !this.secondPass) {
									k.rows[0].cells[1].style.width = (o - (k.rows[0].cells[0].offsetWidth + k.rows[0].cells[2].offsetWidth))
											+ "px";
									this.secondPass = true;
									this.update.defer(10, this, [ H ])
								}
							}
						}
					},
					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(c, b) {
	this.el = Ext.get(c);
	Ext.apply(this, b);
	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 a = this.el.getUpdater();
		a.showLoadIndicator = false;
		a.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 a = this.el.getUpdater();
			a.un("beforeupdate", this.onBeforeLoad, this);
			a.un("update", this.onLoad, this);
			a.un("failure", this.onLoad, this)
		}
	}
};
Ext.ns("Ext.slider");
Ext.slider.Thumb = Ext.extend(Object, {
	dragging :false,
	constructor : function(a) {
		Ext.apply(this, a || {}, {
			cls :"x-slider-thumb",
			constrain :false
		});
		Ext.slider.Thumb.superclass.constructor.call(this, a);
		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 a = this.el;
		a.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(a)
	},
	onBeforeDragStart : function(a) {
		if (this.disabled) {
			return false
		} else {
			this.slider.promoteThumb(this);
			return true
		}
	},
	onDragStart : function(a) {
		this.el.addClass("x-slider-thumb-drag");
		this.dragging = true;
		this.dragStartValue = this.value;
		this.slider.fireEvent("dragstart", this.slider, a, this)
	},
	onDrag : function(g) {
		var c = this.slider, b = this.index, d = this.getNewValue();
		if (this.constrain) {
			var a = c.thumbs[b + 1], h = c.thumbs[b - 1];
			if (h != undefined && d <= h.value) {
				d = h.value
			}
			if (a != undefined && d >= a.value) {
				d = a.value
			}
		}
		c.setValue(b, d, false);
		c.fireEvent("drag", c, g, this)
	},
	getNewValue : function() {
		var a = this.slider, b = a.innerEl
				.translatePoints(this.tracker.getXY());
		return Ext.util.Format
				.round(a.reverseValue(b.left), a.decimalPrecision)
	},
	onDragEnd : function(c) {
		var a = this.slider, b = this.value;
		this.el.removeClass("x-slider-thumb-drag");
		this.dragging = false;
		a.fireEvent("dragend", a, c);
		if (this.dragStartValue != b) {
			a.fireEvent("changecomplete", a, b, 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 a = this.values;
						for ( var b = 0; b < a.length; b++) {
							this.addThumb(a[b])
						}
						if (this.vertical) {
							Ext.apply(this, Ext.slider.Vertical)
						}
					},
					addThumb : function(b) {
						var a = new Ext.slider.Thumb( {
							value :b,
							slider :this,
							index :this.thumbs.length,
							constrain :this.constrainThumbs
						});
						this.thumbs.push(a);
						if (this.rendered) {
							a.render()
						}
					},
					promoteThumb : function(d) {
						var a = this.thumbs, g, b;
						for ( var e = 0, c = a.length; e < c; e++) {
							b = a[e];
							if (b == d) {
								g = this.topThumbZIndex
							} else {
								g = ""
							}
							b.el.setStyle("zIndex", g)
						}
					},
					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 b = 0; b < this.thumbs.length; b++) {
							this.thumbs[b].render()
						}
						var a = this.innerEl.child(".x-slider-thumb");
						this.halfThumb = (this.vertical ? a.getHeight() : a
								.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(d) {
						if (this.disabled) {
							return
						}
						var c = false;
						for ( var b = 0; b < this.thumbs.length; b++) {
							c = c || d.target == this.thumbs[b].el.dom
						}
						if (this.clickToChange && !c) {
							var a = this.innerEl.translatePoints(d.getXY());
							this.onClickChange(a)
						}
						this.focus()
					},
					onClickChange : function(c) {
						if (c.top > this.clickRange[0]
								&& c.top < this.clickRange[1]) {
							var a = this.getNearest(c, "left"), b = a.index;
							this.setValue(b, Ext.util.Format.round(this
									.reverseValue(c.left),
									this.decimalPrecision), undefined, true)
						}
					},
					getNearest : function(l, b) {
						var n = b == "top" ? this.innerEl.getHeight() - l[b]
								: l[b], g = this.reverseValue(n), k = (this.maxValue - this.minValue) + 5, e = 0, c = null;
						for ( var d = 0; d < this.thumbs.length; d++) {
							var a = this.thumbs[d], m = a.value, h = Math.abs(m
									- g);
							if (Math.abs(h <= k)) {
								c = a;
								e = d;
								k = h
							}
						}
						return c
					},
					onKeyDown : function(b) {
						if (this.disabled || this.thumbs.length !== 1) {
							b.preventDefault();
							return
						}
						var a = b.getKey(), c;
						switch (a) {
						case b.UP:
						case b.RIGHT:
							b.stopEvent();
							c = b.ctrlKey ? this.maxValue : this.getValue(0)
									+ this.keyIncrement;
							this.setValue(0, c, undefined, true);
							break;
						case b.DOWN:
						case b.LEFT:
							b.stopEvent();
							c = b.ctrlKey ? this.minValue : this.getValue(0)
									- this.keyIncrement;
							this.setValue(0, c, undefined, true);
							break;
						default:
							b.preventDefault()
						}
					},
					doSnap : function(b) {
						if (!(this.increment && b)) {
							return b
						}
						var d = b, c = this.increment, a = b % c;
						if (a != 0) {
							d -= a;
							if (a * 2 >= c) {
								d += c
							} else {
								if (a * 2 < -c) {
									d -= c
								}
							}
						}
						return d.constrain(this.minValue, this.maxValue)
					},
					afterRender : function() {
						Ext.slider.MultiSlider.superclass.afterRender.apply(
								this, arguments);
						for ( var c = 0; c < this.thumbs.length; c++) {
							var b = this.thumbs[c];
							if (b.value !== undefined) {
								var a = this.normalizeValue(b.value);
								if (a !== b.value) {
									this.setValue(c, a, false)
								} else {
									this.moveThumb(c, this.translateValue(a),
											false)
								}
							}
						}
					},
					getRatio : function() {
						var a = this.innerEl.getWidth(), b = this.maxValue
								- this.minValue;
						return b == 0 ? a : (a / b)
					},
					normalizeValue : function(a) {
						a = this.doSnap(a);
						a = Ext.util.Format.round(a, this.decimalPrecision);
						a = a.constrain(this.minValue, this.maxValue);
						return a
					},
					setMinValue : function(e) {
						this.minValue = e;
						var d = 0, b = this.thumbs, a = b.length, c;
						for (; d < a; ++d) {
							c = b[d];
							c.value = c.value < e ? e : c.value
						}
						this.syncThumb()
					},
					setMaxValue : function(e) {
						this.maxValue = e;
						var d = 0, b = this.thumbs, a = b.length, c;
						for (; d < a; ++d) {
							c = b[d];
							c.value = c.value > e ? e : c.value
						}
						this.syncThumb()
					},
					setValue : function(d, c, b, g) {
						var a = this.thumbs[d], e = a.el;
						c = this.normalizeValue(c);
						if (c !== a.value
								&& this.fireEvent("beforechange", this, c,
										a.value, a) !== false) {
							a.value = c;
							if (this.rendered) {
								this.moveThumb(d, this.translateValue(c),
										b !== false);
								this.fireEvent("change", this, c, a);
								if (g) {
									this
											.fireEvent("changecomplete", this,
													c, a)
								}
							}
						}
					},
					translateValue : function(a) {
						var b = this.getRatio();
						return (a * b) - (this.minValue * b) - this.halfThumb
					},
					reverseValue : function(b) {
						var a = this.getRatio();
						return (b + (this.minValue * a)) / a
					},
					moveThumb : function(d, c, b) {
						var a = this.thumbs[d].el;
						if (!b || this.animate === false) {
							a.setLeft(c)
						} else {
							a.shift( {
								left :c,
								stopFx :true,
								duration :0.35
							})
						}
					},
					focus : function() {
						this.focusEl.focus(10)
					},
					onResize : function(c, e) {
						var b = this.thumbs, a = b.length, d = 0;
						for (; d < a; ++d) {
							b[d].el.stopFx()
						}
						if (Ext.isNumber(c)) {
							this.innerEl.setWidth(c
									- (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 b = 0; b < this.thumbs.length; b++) {
							var a = this.thumbs[b], c = a.el;
							a.disable();
							if (Ext.isIE) {
								var d = c.getXY();
								c.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(d)
							}
						}
					},
					onEnable : function() {
						Ext.slider.MultiSlider.superclass.onEnable.call(this);
						for ( var b = 0; b < this.thumbs.length; b++) {
							var a = this.thumbs[b], c = a.el;
							a.enable();
							if (Ext.isIE) {
								this.innerEl.removeClass(this.disabledClass).dom.disabled = false;
								if (this.thumbHolder) {
									this.thumbHolder.hide()
								}
								c.show();
								this.syncThumb()
							}
						}
					},
					syncThumb : function() {
						if (this.rendered) {
							for ( var a = 0; a < this.thumbs.length; a++) {
								this.moveThumb(a, this
										.translateValue(this.thumbs[a].value))
							}
						}
					},
					getValue : function(a) {
						return this.thumbs[a].value
					},
					getValues : function() {
						var a = [];
						for ( var b = 0; b < this.thumbs.length; b++) {
							a.push(this.thumbs[b].value)
						}
						return a
					},
					beforeDestroy : function() {
						var b = this.thumbs;
						for ( var c = 0, a = b.length; c < a; ++c) {
							b[c].destroy();
							b[c] = 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(a) {
		a = a || {};
		Ext.applyIf(a, {
			values : [ a.value || 0 ]
		});
		Ext.slider.SingleSlider.superclass.constructor.call(this, a)
	},
	getValue : function() {
		return Ext.slider.SingleSlider.superclass.getValue.call(this, 0)
	},
	setValue : function(d, b) {
		var c = Ext.toArray(arguments), a = c.length;
		if (a == 1 || (a <= 3 && typeof arguments[1] != "number")) {
			c.unshift(0)
		}
		return Ext.slider.SingleSlider.superclass.setValue.apply(this, c)
	},
	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(a, b) {
		this.innerEl.setHeight(b
				- (this.el.getPadding("t") + this.endEl.getPadding("b")));
		this.syncThumb()
	},
	getRatio : function() {
		var b = this.innerEl.getHeight(), a = this.maxValue - this.minValue;
		return b / a
	},
	moveThumb : function(d, c, b) {
		var a = this.thumbs[d], e = a.el;
		if (!b || this.animate === false) {
			e.setBottom(c)
		} else {
			e.shift( {
				bottom :c,
				stopFx :true,
				duration :0.35
			})
		}
	},
	onClickChange : function(c) {
		if (c.left > this.clickRange[0] && c.left < this.clickRange[1]) {
			var a = this.getNearest(c, "top"), b = a.index, d = this.minValue
					+ this.reverseValue(this.innerEl.getHeight() - c.top);
			this.setValue(b, Ext.util.Format.round(d, this.decimalPrecision),
					undefined, true)
		}
	}
};
Ext.slider.Thumb.Vertical = {
	getNewValue : function() {
		var b = this.slider, c = b.innerEl, d = c.translatePoints(this.tracker
				.getXY()), a = c.getHeight() - d.top;
		return b.minValue
				+ Ext.util.Format.round(a / b.getRatio(), b.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(d, a) {
		var c = 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 = a ? c.insertBefore(a, {
			cls :this.baseCls
		}, true) : c.append(d, {
			cls :this.baseCls
		}, true);
		if (this.id) {
			this.el.dom.id = this.id
		}
		var b = this.el.dom.firstChild;
		this.progressBar = Ext.get(b.firstChild);
		if (this.textEl) {
			this.textEl = Ext.get(this.textEl);
			delete this.textTopEl
		} else {
			this.textTopEl = Ext.get(this.progressBar.dom.firstChild);
			var e = Ext.get(b.childNodes[1]);
			this.textTopEl.setStyle("z-index", 99).addClass("x-hidden");
			this.textEl = new Ext.CompositeElement( [
					this.textTopEl.dom.firstChild, e.dom.firstChild ]);
			this.textEl.setWidth(b.offsetWidth)
		}
		this.progressBar.setHeight(b.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(c, d, b) {
		this.value = c || 0;
		if (d) {
			this.updateText(d)
		}
		if (this.rendered && !this.isDestroyed) {
			var a = Math.floor(c * this.el.dom.firstChild.offsetWidth);
			this.progressBar.setWidth(a, b === true
					|| (b !== false && this.animate));
			if (this.textTopEl) {
				this.textTopEl.removeClass("x-hidden").setWidth(a)
			}
		}
		this.fireEvent("update", this, c, d);
		return this
	},
	wait : function(b) {
		if (!this.waitTimer) {
			var a = this;
			b = b || {};
			this.updateText(b.text);
			this.waitTimer = Ext.TaskMgr.start( {
				run : function(c) {
					var d = b.increment || 10;
					c -= 1;
					this.updateProgress(
							((((c + d) % d) + 1) * (100 / d)) * 0.01, null,
							b.animate)
				},
				interval :b.interval || 1000,
				duration :b.duration,
				onStop : function() {
					if (b.fn) {
						b.fn.apply(b.scope || this)
					}
					this.reset()
				},
				scope :a
			})
		}
		return this
	},
	isWaiting : function() {
		return this.waitTimer !== null
	},
	updateText : function(a) {
		this.text = a || "&#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(a, c) {
		Ext.ProgressBar.superclass.setSize.call(this, a, c);
		if (this.textTopEl) {
			var b = this.el.dom.firstChild;
			this.textEl.setSize(b.offsetWidth, b.offsetHeight)
		}
		this.syncProgressBar();
		return this
	},
	reset : function(a) {
		this.updateProgress(0);
		if (this.textTopEl) {
			this.textTopEl.addClass("x-hidden")
		}
		this.clearTimer();
		if (a === 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 a = Ext.EventManager;
	var b = Ext.lib.Dom;
	Ext.dd.DragDrop = function(e, c, d) {
		if (e) {
			this.init(e, c, d)
		}
	};
	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(c, d) {
		},
		startDrag : function(c, d) {
		},
		b4Drag : function(c) {
		},
		onDrag : function(c) {
		},
		onDragEnter : function(c, d) {
		},
		b4DragOver : function(c) {
		},
		onDragOver : function(c, d) {
		},
		b4DragOut : function(c) {
		},
		onDragOut : function(c, d) {
		},
		b4DragDrop : function(c) {
		},
		onDragDrop : function(c, d) {
		},
		onInvalidDrop : function(c) {
		},
		b4EndDrag : function(c) {
		},
		endDrag : function(c) {
		},
		b4MouseDown : function(c) {
		},
		onMouseDown : function(c) {
		},
		onMouseUp : function(c) {
		},
		onAvailable : function() {
		},
		defaultPadding : {
			left :0,
			right :0,
			top :0,
			bottom :0
		},
		constrainTo : function(k, h, p) {
			if (Ext.isNumber(h)) {
				h = {
					left :h,
					right :h,
					top :h,
					bottom :h
				}
			}
			h = h || this.defaultPadding;
			var m = Ext.get(this.getEl()).getBox(), d = Ext.get(k), o = d
					.getScroll(), l, e = d.dom;
			if (e == document.body) {
				l = {
					x :o.left,
					y :o.top,
					width :Ext.lib.Dom.getViewWidth(),
					height :Ext.lib.Dom.getViewHeight()
				}
			} else {
				var n = d.getXY();
				l = {
					x :n[0],
					y :n[1],
					width :e.clientWidth,
					height :e.clientHeight
				}
			}
			var i = m.y - l.y, g = m.x - l.x;
			this.resetConstraints();
			this.setXConstraint(g - (h.left || 0), l.width - g - m.width
					- (h.right || 0), this.xTickSize);
			this.setYConstraint(i - (h.top || 0), l.height - i - m.height
					- (h.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(e, c, d) {
			this.initTarget(e, c, d);
			a.on(this.id, "mousedown", this.handleMouseDown, this)
		},
		initTarget : function(e, c, d) {
			this.config = d || {};
			this.DDM = Ext.dd.DDM;
			this.groups = {};
			if (typeof e !== "string") {
				e = Ext.id(e)
			}
			this.id = e;
			this.addToGroup((c) ? c : "default");
			this.handleElId = e;
			this.setDragElId(e);
			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(e, c, g, d) {
			if (!c && 0 !== c) {
				this.padding = [ e, e, e, e ]
			} else {
				if (!g && 0 !== g) {
					this.padding = [ e, c, e, c ]
				} else {
					this.padding = [ e, c, g, d ]
				}
			}
		},
		setInitPosition : function(g, e) {
			var h = this.getEl();
			if (!this.DDM.verifyEl(h)) {
				return
			}
			var d = g || 0;
			var c = e || 0;
			var i = b.getXY(h);
			this.initPageX = i[0] - d;
			this.initPageY = i[1] - c;
			this.lastPageX = i[0];
			this.lastPageY = i[1];
			this.setStartPosition(i)
		},
		setStartPosition : function(d) {
			var c = d || b.getXY(this.getEl());
			this.deltaSetXY = null;
			this.startPageX = c[0];
			this.startPageY = c[1]
		},
		addToGroup : function(c) {
			this.groups[c] = true;
			this.DDM.regDragDrop(this, c)
		},
		removeFromGroup : function(c) {
			if (this.groups[c]) {
				delete this.groups[c]
			}
			this.DDM.removeDDFromGroup(this, c)
		},
		setDragElId : function(c) {
			this.dragElId = c
		},
		setHandleElId : function(c) {
			if (typeof c !== "string") {
				c = Ext.id(c)
			}
			this.handleElId = c;
			this.DDM.regHandle(this.id, c)
		},
		setOuterHandleElId : function(c) {
			if (typeof c !== "string") {
				c = Ext.id(c)
			}
			a.on(c, "mousedown", this.handleMouseDown, this);
			this.setHandleElId(c);
			this.hasOuterHandles = true
		},
		unreg : function() {
			a.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(g, d) {
			if (this.primaryButtonOnly && g.button != 0) {
				return
			}
			if (this.isLocked()) {
				return
			}
			this.DDM.refreshCache(this.groups);
			var c = new Ext.lib.Point(Ext.lib.Event.getPageX(g), Ext.lib.Event
					.getPageY(g));
			if (!this.hasOuterHandles && !this.DDM.isOverTarget(c, this)) {
			} else {
				if (this.clickValidator(g)) {
					this.setStartPosition();
					this.b4MouseDown(g);
					this.onMouseDown(g);
					this.DDM.handleMouseDown(g, this);
					this.DDM.stopEvent(g)
				} else {
				}
			}
		},
		clickValidator : function(d) {
			var c = d.getTarget();
			return (this.isValidHandleChild(c) && (this.id == this.handleElId || this.DDM
					.handleWasClicked(c, this.id)))
		},
		addInvalidHandleType : function(c) {
			var d = c.toUpperCase();
			this.invalidHandleTypes[d] = d
		},
		addInvalidHandleId : function(c) {
			if (typeof c !== "string") {
				c = Ext.id(c)
			}
			this.invalidHandleIds[c] = c
		},
		addInvalidHandleClass : function(c) {
			this.invalidHandleClasses.push(c)
		},
		removeInvalidHandleType : function(c) {
			var d = c.toUpperCase();
			delete this.invalidHandleTypes[d]
		},
		removeInvalidHandleId : function(c) {
			if (typeof c !== "string") {
				c = Ext.id(c)
			}
			delete this.invalidHandleIds[c]
		},
		removeInvalidHandleClass : function(d) {
			for ( var e = 0, c = this.invalidHandleClasses.length; e < c; ++e) {
				if (this.invalidHandleClasses[e] == d) {
					delete this.invalidHandleClasses[e]
				}
			}
		},
		isValidHandleChild : function(h) {
			var g = true;
			var l;
			try {
				l = h.nodeName.toUpperCase()
			} catch (k) {
				l = h.nodeName
			}
			g = g && !this.invalidHandleTypes[l];
			g = g && !this.invalidHandleIds[h.id];
			for ( var d = 0, c = this.invalidHandleClasses.length; g && d < c; ++d) {
				g = !Ext.fly(h).hasClass(this.invalidHandleClasses[d])
			}
			return g
		},
		setXTicks : function(g, c) {
			this.xTicks = [];
			this.xTickSize = c;
			var e = {};
			for ( var d = this.initPageX; d >= this.minX; d = d - c) {
				if (!e[d]) {
					this.xTicks[this.xTicks.length] = d;
					e[d] = true
				}
			}
			for (d = this.initPageX; d <= this.maxX; d = d + c) {
				if (!e[d]) {
					this.xTicks[this.xTicks.length] = d;
					e[d] = true
				}
			}
			this.xTicks.sort(this.DDM.numericSort)
		},
		setYTicks : function(g, c) {
			this.yTicks = [];
			this.yTickSize = c;
			var e = {};
			for ( var d = this.initPageY; d >= this.minY; d = d - c) {
				if (!e[d]) {
					this.yTicks[this.yTicks.length] = d;
					e[d] = true
				}
			}
			for (d = this.initPageY; d <= this.maxY; d = d + c) {
				if (!e[d]) {
					this.yTicks[this.yTicks.length] = d;
					e[d] = true
				}
			}
			this.yTicks.sort(this.DDM.numericSort)
		},
		setXConstraint : function(e, d, c) {
			this.leftConstraint = e;
			this.rightConstraint = d;
			this.minX = this.initPageX - e;
			this.maxX = this.initPageX + d;
			if (c) {
				this.setXTicks(this.initPageX, c)
			}
			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(c, e, d) {
			this.topConstraint = c;
			this.bottomConstraint = e;
			this.minY = this.initPageY - c;
			this.maxY = this.initPageY + e;
			if (d) {
				this.setYTicks(this.initPageY, d)
			}
			this.constrainY = true
		},
		resetConstraints : function() {
			if (this.initPageX || this.initPageX === 0) {
				var d = (this.maintainOffset) ? this.lastPageX - this.initPageX
						: 0;
				var c = (this.maintainOffset) ? this.lastPageY - this.initPageY
						: 0;
				this.setInitPosition(d, c)
			} 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(l, g) {
			if (!g) {
				return l
			} else {
				if (g[0] >= l) {
					return g[0]
				} else {
					for ( var d = 0, c = g.length; d < c; ++d) {
						var e = d + 1;
						if (g[e] && g[e] >= l) {
							var k = l - g[d];
							var h = g[e] - l;
							return (h > k) ? g[d] : g[e]
						}
					}
					return g[g.length - 1]
				}
			}
		},
		toString : function() {
			return ("DragDrop " + this.id)
		}
	}
})();
if (!Ext.dd.DragDropMgr) {
	Ext.dd.DragDropMgr = function() {
		var a = 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(d, c) {
				for ( var e in this.ids) {
					for ( var b in this.ids[e]) {
						var g = this.ids[e][b];
						if (!this.isTypeOfDD(g)) {
							continue
						}
						g[d].apply(g, c)
					}
				}
			},
			_onLoad : function() {
				this.init();
				a.on(document, "mouseup", this.handleMouseUp, this, true);
				a.on(document, "mousemove", this.handleMouseMove, this, true);
				a.on(window, "unload", this._onUnload, this, true);
				a.on(window, "resize", this._onResize, this, true)
			},
			_onResize : function(b) {
				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(c, b) {
				if (!this.initialized) {
					this.init()
				}
				if (!this.ids[b]) {
					this.ids[b] = {}
				}
				this.ids[b][c.id] = c
			},
			removeDDFromGroup : function(d, b) {
				if (!this.ids[b]) {
					this.ids[b] = {}
				}
				var c = this.ids[b];
				if (c && c[d.id]) {
					delete c[d.id]
				}
			},
			_remove : function(c) {
				for ( var b in c.groups) {
					if (b && this.ids[b] && this.ids[b][c.id]) {
						delete this.ids[b][c.id]
					}
				}
				delete this.handleIds[c.id]
			},
			regHandle : function(c, b) {
				if (!this.handleIds[c]) {
					this.handleIds[c] = {}
				}
				this.handleIds[c][b] = b
			},
			isDragDrop : function(b) {
				return (this.getDDById(b)) ? true : false
			},
			getRelated : function(h, c) {
				var g = [];
				for ( var e in h.groups) {
					for ( var d in this.ids[e]) {
						var b = this.ids[e][d];
						if (!this.isTypeOfDD(b)) {
							continue
						}
						if (!c || b.isTarget) {
							g[g.length] = b
						}
					}
				}
				return g
			},
			isLegalTarget : function(g, e) {
				var c = this.getRelated(g, true);
				for ( var d = 0, b = c.length; d < b; ++d) {
					if (c[d].id == e.id) {
						return true
					}
				}
				return false
			},
			isTypeOfDD : function(b) {
				return (b && b.__ygDragDrop)
			},
			isHandle : function(c, b) {
				return (this.handleIds[c] && this.handleIds[c][b])
			},
			getDDById : function(c) {
				for ( var b in this.ids) {
					if (this.ids[b][c]) {
						return this.ids[b][c]
					}
				}
				return null
			},
			handleMouseDown : function(d, c) {
				if (Ext.QuickTips) {
					Ext.QuickTips.ddDisable()
				}
				if (this.dragCurrent) {
					this.handleMouseUp(d)
				}
				this.currentTarget = d.getTarget();
				this.dragCurrent = c;
				var b = c.getEl();
				this.startX = d.getPageX();
				this.startY = d.getPageY();
				this.deltaX = this.startX - b.offsetLeft;
				this.deltaY = this.startY - b.offsetTop;
				this.dragThreshMet = false;
				this.clickTimeout = setTimeout( function() {
					var e = Ext.dd.DDM;
					e.startDrag(e.startX, e.startY)
				}, this.clickTimeThresh)
			},
			startDrag : function(b, c) {
				clearTimeout(this.clickTimeout);
				if (this.dragCurrent) {
					this.dragCurrent.b4StartDrag(b, c);
					this.dragCurrent.startDrag(b, c)
				}
				this.dragThreshMet = true
			},
			handleMouseUp : function(b) {
				if (Ext.QuickTips) {
					Ext.QuickTips.ddEnable()
				}
				if (!this.dragCurrent) {
					return
				}
				clearTimeout(this.clickTimeout);
				if (this.dragThreshMet) {
					this.fireEvents(b, true)
				} else {
				}
				this.stopDrag(b);
				this.stopEvent(b)
			},
			stopEvent : function(b) {
				if (this.stopPropagation) {
					b.stopPropagation()
				}
				if (this.preventDefault) {
					b.preventDefault()
				}
			},
			stopDrag : function(b) {
				if (this.dragCurrent) {
					if (this.dragThreshMet) {
						this.dragCurrent.b4EndDrag(b);
						this.dragCurrent.endDrag(b)
					}
					this.dragCurrent.onMouseUp(b)
				}
				this.dragCurrent = null;
				this.dragOvers = {}
			},
			handleMouseMove : function(d) {
				if (!this.dragCurrent) {
					return true
				}
				if (Ext.isIE
						&& (d.button !== 0 && d.button !== 1 && d.button !== 2)) {
					this.stopEvent(d);
					return this.handleMouseUp(d)
				}
				if (!this.dragThreshMet) {
					var c = Math.abs(this.startX - d.getPageX());
					var b = Math.abs(this.startY - d.getPageY());
					if (c > this.clickPixelThresh || b > this.clickPixelThresh) {
						this.startDrag(this.startX, this.startY)
					}
				}
				if (this.dragThreshMet) {
					this.dragCurrent.b4Drag(d);
					this.dragCurrent.onDrag(d);
					if (!this.dragCurrent.moveOnly) {
						this.fireEvents(d, false)
					}
				}
				this.stopEvent(d);
				return true
			},
			fireEvents : function(o, p) {
				var r = this.dragCurrent;
				if (!r || r.isLocked()) {
					return
				}
				var s = o.getPoint();
				var b = [];
				var g = [];
				var m = [];
				var k = [];
				var d = [];
				for ( var h in this.dragOvers) {
					var c = this.dragOvers[h];
					if (!this.isTypeOfDD(c)) {
						continue
					}
					if (!this.isOverTarget(s, c, this.mode)) {
						g.push(c)
					}
					b[h] = true;
					delete this.dragOvers[h]
				}
				for ( var q in r.groups) {
					if ("string" != typeof q) {
						continue
					}
					for (h in this.ids[q]) {
						var l = this.ids[q][h];
						if (!this.isTypeOfDD(l)) {
							continue
						}
						if (l.isTarget && !l.isLocked()
								&& ((l != r) || (r.ignoreSelf === false))) {
							if (this.isOverTarget(s, l, this.mode)) {
								if (p) {
									k.push(l)
								} else {
									if (!b[l.id]) {
										d.push(l)
									} else {
										m.push(l)
									}
									this.dragOvers[l.id] = l
								}
							}
						}
					}
				}
				if (this.mode) {
					if (g.length) {
						r.b4DragOut(o, g);
						r.onDragOut(o, g)
					}
					if (d.length) {
						r.onDragEnter(o, d)
					}
					if (m.length) {
						r.b4DragOver(o, m);
						r.onDragOver(o, m)
					}
					if (k.length) {
						r.b4DragDrop(o, k);
						r.onDragDrop(o, k)
					}
				} else {
					var n = 0;
					for (h = 0, n = g.length; h < n; ++h) {
						r.b4DragOut(o, g[h].id);
						r.onDragOut(o, g[h].id)
					}
					for (h = 0, n = d.length; h < n; ++h) {
						r.onDragEnter(o, d[h].id)
					}
					for (h = 0, n = m.length; h < n; ++h) {
						r.b4DragOver(o, m[h].id);
						r.onDragOver(o, m[h].id)
					}
					for (h = 0, n = k.length; h < n; ++h) {
						r.b4DragDrop(o, k[h].id);
						r.onDragDrop(o, k[h].id)
					}
				}
				if (p && !k.length) {
					r.onInvalidDrop(o)
				}
			},
			getBestMatch : function(d) {
				var g = null;
				var c = d.length;
				if (c == 1) {
					g = d[0]
				} else {
					for ( var e = 0; e < c; ++e) {
						var b = d[e];
						if (b.cursorIsOver) {
							g = b;
							break
						} else {
							if (!g || g.overlap.getArea() < b.overlap.getArea()) {
								g = b
							}
						}
					}
				}
				return g
			},
			refreshCache : function(c) {
				for ( var b in c) {
					if ("string" != typeof b) {
						continue
					}
					for ( var d in this.ids[b]) {
						var e = this.ids[b][d];
						if (this.isTypeOfDD(e)) {
							var g = this.getLocation(e);
							if (g) {
								this.locationCache[e.id] = g
							} else {
								delete this.locationCache[e.id]
							}
						}
					}
				}
			},
			verifyEl : function(c) {
				if (c) {
					var b;
					if (Ext.isIE) {
						try {
							b = c.offsetParent
						} catch (d) {
						}
					} else {
						b = c.offsetParent
					}
					if (b) {
						return true
					}
				}
				return false
			},
			getLocation : function(k) {
				if (!this.isTypeOfDD(k)) {
					return null
				}
				var h = k.getEl(), o, g, d, q, p, s, c, n, i;
				try {
					o = Ext.lib.Dom.getXY(h)
				} catch (m) {
				}
				if (!o) {
					return null
				}
				g = o[0];
				d = g + h.offsetWidth;
				q = o[1];
				p = q + h.offsetHeight;
				s = q - k.padding[0];
				c = d + k.padding[1];
				n = p + k.padding[2];
				i = g - k.padding[3];
				return new Ext.lib.Region(s, c, n, i)
			},
			isOverTarget : function(l, b, d) {
				var g = this.locationCache[b.id];
				if (!g || !this.useCache) {
					g = this.getLocation(b);
					this.locationCache[b.id] = g
				}
				if (!g) {
					return false
				}
				b.cursorIsOver = g.contains(l);
				var k = this.dragCurrent;
				if (!k || !k.getTargetCoord
						|| (!d && !k.constrainX && !k.constrainY)) {
					return b.cursorIsOver
				}
				b.overlap = null;
				var h = k.getTargetCoord(l.x, l.y);
				var c = k.getDragEl();
				var e = new Ext.lib.Region(h.y, h.x + c.offsetWidth, h.y
						+ c.offsetHeight, h.x);
				var i = e.intersect(g);
				if (i) {
					b.overlap = i;
					return (d) ? true : b.cursorIsOver
				} else {
					return false
				}
			},
			_onUnload : function(c, b) {
				Ext.dd.DragDropMgr.unregAll()
			},
			unregAll : function() {
				if (this.dragCurrent) {
					this.stopDrag();
					this.dragCurrent = null
				}
				this._execOnAll("unreg", []);
				for ( var b in this.elementCache) {
					delete this.elementCache[b]
				}
				this.elementCache = {};
				this.ids = {}
			},
			elementCache : {},
			getElWrapper : function(c) {
				var b = this.elementCache[c];
				if (!b || !b.el) {
					b = this.elementCache[c] = new this.ElementWrapper(Ext
							.getDom(c))
				}
				return b
			},
			getElement : function(b) {
				return Ext.getDom(b)
			},
			getCss : function(c) {
				var b = Ext.getDom(c);
				return (b) ? b.style : null
			},
			ElementWrapper : function(b) {
				this.el = b || null;
				this.id = this.el && b.id;
				this.css = this.el && b.style
			},
			getPosX : function(b) {
				return Ext.lib.Dom.getX(b)
			},
			getPosY : function(b) {
				return Ext.lib.Dom.getY(b)
			},
			swapNode : function(d, b) {
				if (d.swapNode) {
					d.swapNode(b)
				} else {
					var e = b.parentNode;
					var c = b.nextSibling;
					if (c == d) {
						e.insertBefore(d, b)
					} else {
						if (b == d.nextSibling) {
							e.insertBefore(b, d)
						} else {
							d.parentNode.replaceChild(b, d);
							e.insertBefore(d, c)
						}
					}
				}
			},
			getScroll : function() {
				var d, b, e = document.documentElement, c = document.body;
				if (e && (e.scrollTop || e.scrollLeft)) {
					d = e.scrollTop;
					b = e.scrollLeft
				} else {
					if (c) {
						d = c.scrollTop;
						b = c.scrollLeft
					} else {
					}
				}
				return {
					top :d,
					left :b
				}
			},
			getStyle : function(c, b) {
				return Ext.fly(c).getStyle(b)
			},
			getScrollTop : function() {
				return this.getScroll().top
			},
			getScrollLeft : function() {
				return this.getScroll().left
			},
			moveToEl : function(b, d) {
				var c = Ext.lib.Dom.getXY(d);
				Ext.lib.Dom.setXY(b, c)
			},
			numericSort : function(d, c) {
				return (d - c)
			},
			_timeoutCount :0,
			_addListeners : function() {
				var b = Ext.dd.DDM;
				if (Ext.lib.Event && document) {
					b._onLoad()
				} else {
					if (b._timeoutCount > 2000) {
					} else {
						setTimeout(b._addListeners, 10);
						if (document && document.body) {
							b._timeoutCount += 1
						}
					}
				}
			},
			handleWasClicked : function(b, d) {
				if (this.isHandle(d, b.id)) {
					return true
				} else {
					var c = b.parentNode;
					while (c) {
						if (this.isHandle(d, c.id)) {
							return true
						} else {
							c = c.parentNode
						}
					}
				}
				return false
			}
		}
	}();
	Ext.dd.DDM = Ext.dd.DragDropMgr;
	Ext.dd.DDM._addListeners()
}
Ext.dd.DD = function(c, a, b) {
	if (c) {
		this.init(c, a, b)
	}
};
Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, {
	scroll :true,
	autoOffset : function(c, b) {
		var a = c - this.startPageX;
		var d = b - this.startPageY;
		this.setDelta(a, d)
	},
	setDelta : function(b, a) {
		this.deltaX = b;
		this.deltaY = a
	},
	setDragElPos : function(c, b) {
		var a = this.getDragEl();
		this.alignElWithMouse(a, c, b)
	},
	alignElWithMouse : function(c, h, g) {
		var e = this.getTargetCoord(h, g);
		var b = c.dom ? c : Ext.fly(c, "_dd");
		if (!this.deltaSetXY) {
			var i = [ e.x, e.y ];
			b.setXY(i);
			var d = b.getLeft(true);
			var a = b.getTop(true);
			this.deltaSetXY = [ d - e.x, a - e.y ]
		} else {
			b.setLeftTop(e.x + this.deltaSetXY[0], e.y + this.deltaSetXY[1])
		}
		this.cachePosition(e.x, e.y);
		this.autoScroll(e.x, e.y, c.offsetHeight, c.offsetWidth);
		return e
	},
	cachePosition : function(b, a) {
		if (b) {
			this.lastPageX = b;
			this.lastPageY = a
		} else {
			var c = Ext.lib.Dom.getXY(this.getEl());
			this.lastPageX = c[0];
			this.lastPageY = c[1]
		}
	},
	autoScroll : function(m, l, e, n) {
		if (this.scroll) {
			var o = Ext.lib.Dom.getViewHeight();
			var b = Ext.lib.Dom.getViewWidth();
			var q = this.DDM.getScrollTop();
			var d = this.DDM.getScrollLeft();
			var k = e + l;
			var p = n + m;
			var i = (o + q - l - this.deltaY);
			var g = (b + d - m - this.deltaX);
			var c = 40;
			var a = (document.all) ? 80 : 30;
			if (k > o && i < c) {
				window.scrollTo(d, q + a)
			}
			if (l < q && q > 0 && l - q < c) {
				window.scrollTo(d, q - a)
			}
			if (p > b && g < c) {
				window.scrollTo(d + a, q)
			}
			if (m < d && d > 0 && m - d < c) {
				window.scrollTo(d - a, q)
			}
		}
	},
	getTargetCoord : function(c, b) {
		var a = c - this.deltaX;
		var d = b - this.deltaY;
		if (this.constrainX) {
			if (a < this.minX) {
				a = this.minX
			}
			if (a > this.maxX) {
				a = this.maxX
			}
		}
		if (this.constrainY) {
			if (d < this.minY) {
				d = this.minY
			}
			if (d > this.maxY) {
				d = this.maxY
			}
		}
		a = this.getTick(a, this.xTicks);
		d = this.getTick(d, this.yTicks);
		return {
			x :a,
			y :d
		}
	},
	applyConfig : function() {
		Ext.dd.DD.superclass.applyConfig.call(this);
		this.scroll = (this.config.scroll !== false)
	},
	b4MouseDown : function(a) {
		this.autoOffset(a.getPageX(), a.getPageY())
	},
	b4Drag : function(a) {
		this.setDragElPos(a.getPageX(), a.getPageY())
	},
	toString : function() {
		return ("DD " + this.id)
	}
});
Ext.dd.DDProxy = function(c, a, b) {
	if (c) {
		this.init(c, a, b);
		this.initFrame()
	}
};
Ext.dd.DDProxy.dragElId = "ygddfdiv";
Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, {
	resizeFrame :true,
	centerFrame :false,
	createFrame : function() {
		var b = this;
		var a = document.body;
		if (!a || !a.firstChild) {
			setTimeout( function() {
				b.createFrame()
			}, 50);
			return
		}
		var d = this.getDragEl();
		if (!d) {
			d = document.createElement("div");
			d.id = this.dragElId;
			var c = d.style;
			c.position = "absolute";
			c.visibility = "hidden";
			c.cursor = "move";
			c.border = "2px solid #aaa";
			c.zIndex = 999;
			a.insertBefore(d, a.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(e, d) {
		var c = this.getEl();
		var a = this.getDragEl();
		var b = a.style;
		this._resizeProxy();
		if (this.centerFrame) {
			this.setDelta(Math.round(parseInt(b.width, 10) / 2), Math
					.round(parseInt(b.height, 10) / 2))
		}
		this.setDragElPos(e, d);
		Ext.fly(a).show()
	},
	_resizeProxy : function() {
		if (this.resizeFrame) {
			var a = this.getEl();
			Ext.fly(this.getDragEl()).setSize(a.offsetWidth, a.offsetHeight)
		}
	},
	b4MouseDown : function(b) {
		var a = b.getPageX();
		var c = b.getPageY();
		this.autoOffset(a, c);
		this.setDragElPos(a, c)
	},
	b4StartDrag : function(a, b) {
		this.showFrame(a, b)
	},
	b4EndDrag : function(a) {
		Ext.fly(this.getDragEl()).hide()
	},
	endDrag : function(c) {
		var b = this.getEl();
		var a = this.getDragEl();
		a.style.visibility = "";
		this.beforeMove();
		b.style.visibility = "hidden";
		Ext.dd.DDM.moveToEl(b, a);
		a.style.visibility = "hidden";
		b.style.visibility = "";
		this.afterDrag()
	},
	beforeMove : function() {
	},
	afterDrag : function() {
	},
	toString : function() {
		return ("DDProxy " + this.id)
	}
});
Ext.dd.DDTarget = function(c, a, b) {
	if (c) {
		this.initTarget(c, a, b)
	}
};
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(a) {
		Ext.apply(this, a);
		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, a)
	},
	initEl : function(a) {
		this.el = Ext.get(a);
		a.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(b, a) {
		if (this.fireEvent("mousedown", this, b) !== false
				&& this.onBeforeStart(b) !== false) {
			this.startXY = this.lastXY = b.getXY();
			this.dragTarget = this.delegate ? a : this.el.dom;
			if (this.preventDefault !== false) {
				b.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,
						[ b ])
			}
		}
	},
	onMouseMove : function(d, c) {
		if (this.active && Ext.isIE && !d.browserEvent.button) {
			d.preventDefault();
			this.onMouseUp(d);
			return
		}
		d.preventDefault();
		var b = d.getXY(), a = this.startXY;
		this.lastXY = b;
		if (!this.active) {
			if (Math.abs(a[0] - b[0]) > this.tolerance
					|| Math.abs(a[1] - b[1]) > this.tolerance) {
				this.triggerStart(d)
			} else {
				return
			}
		}
		this.fireEvent("mousemove", this, d);
		this.onDrag(d);
		this.fireEvent("drag", this, d)
	},
	onMouseUp : function(c) {
		var b = Ext.getDoc(), a = this.active;
		b.un("mousemove", this.onMouseMove, this);
		b.un("mouseup", this.onMouseUp, this);
		b.un("selectstart", this.stopSelect, this);
		c.preventDefault();
		this.clearStart();
		this.active = false;
		delete this.elRegion;
		this.fireEvent("mouseup", this, c);
		if (a) {
			this.onEnd(c);
			this.fireEvent("dragend", this, c)
		}
	},
	triggerStart : function(a) {
		this.clearStart();
		this.active = true;
		this.onStart(a);
		this.fireEvent("dragstart", this, a)
	},
	clearStart : function() {
		if (this.timer) {
			clearTimeout(this.timer);
			delete this.timer
		}
	},
	stopSelect : function(a) {
		a.stopEvent();
		return false
	},
	onBeforeStart : function(a) {
	},
	onStart : function(a) {
	},
	onDrag : function(a) {
	},
	onEnd : function(a) {
	},
	getDragTarget : function() {
		return this.dragTarget
	},
	getDragCt : function() {
		return this.el
	},
	getXY : function(a) {
		return a ? this.constrainModes[a].call(this, this.lastXY) : this.lastXY
	},
	getOffset : function(c) {
		var b = this.getXY(c), a = this.startXY;
		return [ a[0] - b[0], a[1] - b[1] ]
	},
	constrainModes : {
		point : function(b) {
			if (!this.elRegion) {
				this.elRegion = this.getDragCt().getRegion()
			}
			var a = this.dragRegion;
			a.left = b[0];
			a.top = b[1];
			a.right = b[0];
			a.bottom = b[1];
			a.constrainTo(this.elRegion);
			return [ a.left, a.top ]
		}
	}
});
Ext.dd.ScrollManager = function() {
	var c = Ext.dd.DragDropMgr;
	var e = {};
	var b = null;
	var i = {};
	var h = function(m) {
		b = null;
		a()
	};
	var k = function() {
		if (c.dragCurrent) {
			c.refreshCache(c.dragCurrent.groups)
		}
	};
	var d = function() {
		if (c.dragCurrent) {
			var m = Ext.dd.ScrollManager;
			var n = i.el.ddScrollConfig ? i.el.ddScrollConfig.increment
					: m.increment;
			if (!m.animate) {
				if (i.el.scroll(i.dir, n)) {
					k()
				}
			} else {
				i.el.scroll(i.dir, n, true, m.animDuration, k)
			}
		}
	};
	var a = function() {
		if (i.id) {
			clearInterval(i.id)
		}
		i.id = 0;
		i.el = null;
		i.dir = ""
	};
	var g = function(n, m) {
		a();
		i.el = n;
		i.dir = m;
		var p = n.ddScrollConfig ? n.ddScrollConfig.ddGroup : undefined, o = (n.ddScrollConfig && n.ddScrollConfig.frequency) ? n.ddScrollConfig.frequency
				: Ext.dd.ScrollManager.frequency;
		if (p === undefined || c.dragCurrent.ddGroup == p) {
			i.id = setInterval(d, o)
		}
	};
	var l = function(p, s) {
		if (s || !c.dragCurrent) {
			return
		}
		var t = Ext.dd.ScrollManager;
		if (!b || b != c.dragCurrent) {
			b = c.dragCurrent;
			t.refreshCache()
		}
		var u = Ext.lib.Event.getXY(p);
		var v = new Ext.lib.Point(u[0], u[1]);
		for ( var n in e) {
			var o = e[n], m = o._region;
			var q = o.ddScrollConfig ? o.ddScrollConfig : t;
			if (m && m.contains(v) && o.isScrollable()) {
				if (m.bottom - v.y <= q.vthresh) {
					if (i.el != o) {
						g(o, "down")
					}
					return
				} else {
					if (m.right - v.x <= q.hthresh) {
						if (i.el != o) {
							g(o, "left")
						}
						return
					} else {
						if (v.y - m.top <= q.vthresh) {
							if (i.el != o) {
								g(o, "up")
							}
							return
						} else {
							if (v.x - m.left <= q.hthresh) {
								if (i.el != o) {
									g(o, "right")
								}
								return
							}
						}
					}
				}
			}
		}
		a()
	};
	c.fireEvents = c.fireEvents.createSequence(l, c);
	c.stopDrag = c.stopDrag.createSequence(h, c);
	return {
		register : function(o) {
			if (Ext.isArray(o)) {
				for ( var n = 0, m = o.length; n < m; n++) {
					this.register(o[n])
				}
			} else {
				o = Ext.get(o);
				e[o.id] = o
			}
		},
		unregister : function(o) {
			if (Ext.isArray(o)) {
				for ( var n = 0, m = o.length; n < m; n++) {
					this.unregister(o[n])
				}
			} else {
				o = Ext.get(o);
				delete e[o.id]
			}
		},
		vthresh :25,
		hthresh :25,
		increment :100,
		frequency :500,
		animate :true,
		animDuration :0.4,
		ddGroup :undefined,
		refreshCache : function() {
			for ( var m in e) {
				if (typeof e[m] == "object") {
					e[m]._region = e[m].getRegion()
				}
			}
		}
	}
}();
Ext.dd.Registry = function() {
	var d = {};
	var b = {};
	var a = 0;
	var c = function(g, e) {
		if (typeof g == "string") {
			return g
		}
		var h = g.id;
		if (!h && e !== false) {
			h = "extdd-" + (++a);
			g.id = h
		}
		return h
	};
	return {
		register : function(k, l) {
			l = l || {};
			if (typeof k == "string") {
				k = document.getElementById(k)
			}
			l.ddel = k;
			d[c(k)] = l;
			if (l.isHandle !== false) {
				b[l.ddel.id] = l
			}
			if (l.handles) {
				var h = l.handles;
				for ( var g = 0, e = h.length; g < e; g++) {
					b[c(h[g])] = l
				}
			}
		},
		unregister : function(k) {
			var m = c(k, false);
			var l = d[m];
			if (l) {
				delete d[m];
				if (l.handles) {
					var h = l.handles;
					for ( var g = 0, e = h.length; g < e; g++) {
						delete b[c(h[g], false)]
					}
				}
			}
		},
		getHandle : function(e) {
			if (typeof e != "string") {
				e = e.id
			}
			return b[e]
		},
		getHandleFromEvent : function(h) {
			var g = Ext.lib.Event.getTarget(h);
			return g ? b[g.id] : null
		},
		getTarget : function(e) {
			if (typeof e != "string") {
				e = e.id
			}
			return d[e]
		},
		getTargetFromEvent : function(h) {
			var g = Ext.lib.Event.getTarget(h);
			return g ? d[g.id] || b[g.id] : null
		}
	}
}();
Ext.dd.StatusProxy = function(a) {
	Ext.apply(this, a);
	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 :!a || a.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(a) {
		a = a || this.dropNotAllowed;
		if (this.dropStatus != a) {
			this.el.replaceClass(this.dropStatus, a);
			this.dropStatus = a
		}
	},
	reset : function(a) {
		this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed;
		this.dropStatus = this.dropNotAllowed;
		if (a) {
			this.ghost.update("")
		}
	},
	update : function(a) {
		if (typeof a == "string") {
			this.ghost.update(a)
		} else {
			this.ghost.update("");
			a.style.margin = "0";
			this.ghost.dom.appendChild(a)
		}
		var b = this.ghost.dom.firstChild;
		if (b) {
			Ext.fly(b).setStyle("float", "none")
		}
	},
	getEl : function() {
		return this.el
	},
	getGhost : function() {
		return this.ghost
	},
	hide : function(a) {
		this.el.hide();
		if (a) {
			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(b, c, a) {
		this.callback = c;
		this.scope = a;
		if (b && this.animRepair !== false) {
			this.el.addClass("x-dd-drag-repair");
			this.el.hideUnders(true);
			this.anim = this.el.shift( {
				duration :this.repairDuration || 0.5,
				easing :"easeOut",
				xy :b,
				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(b, a) {
	this.el = Ext.get(b);
	if (!this.dragData) {
		this.dragData = {}
	}
	Ext.apply(this, a);
	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(a) {
		return this.dragData
	},
	onDragEnter : function(c, d) {
		var b = Ext.dd.DragDropMgr.getDDById(d);
		this.cachedTarget = b;
		if (this.beforeDragEnter(b, c, d) !== false) {
			if (b.isNotifyTarget) {
				var a = b.notifyEnter(this, c, this.dragData);
				this.proxy.setStatus(a)
			} else {
				this.proxy.setStatus(this.dropAllowed)
			}
			if (this.afterDragEnter) {
				this.afterDragEnter(b, c, d)
			}
		}
	},
	beforeDragEnter : function(b, a, c) {
		return true
	},
	alignElWithMouse : function() {
		Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments);
		this.proxy.sync()
	},
	onDragOver : function(c, d) {
		var b = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(d);
		if (this.beforeDragOver(b, c, d) !== false) {
			if (b.isNotifyTarget) {
				var a = b.notifyOver(this, c, this.dragData);
				this.proxy.setStatus(a)
			}
			if (this.afterDragOver) {
				this.afterDragOver(b, c, d)
			}
		}
	},
	beforeDragOver : function(b, a, c) {
		return true
	},
	onDragOut : function(b, c) {
		var a = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(c);
		if (this.beforeDragOut(a, b, c) !== false) {
			if (a.isNotifyTarget) {
				a.notifyOut(this, b, this.dragData)
			}
			this.proxy.reset();
			if (this.afterDragOut) {
				this.afterDragOut(a, b, c)
			}
		}
		this.cachedTarget = null
	},
	beforeDragOut : function(b, a, c) {
		return true
	},
	onDragDrop : function(b, c) {
		var a = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(c);
		if (this.beforeDragDrop(a, b, c) !== false) {
			if (a.isNotifyTarget) {
				if (a.notifyDrop(this, b, this.dragData)) {
					this.onValidDrop(a, b, c)
				} else {
					this.onInvalidDrop(a, b, c)
				}
			} else {
				this.onValidDrop(a, b, c)
			}
			if (this.afterDragDrop) {
				this.afterDragDrop(a, b, c)
			}
		}
		delete this.cachedTarget
	},
	beforeDragDrop : function(b, a, c) {
		return true
	},
	onValidDrop : function(b, a, c) {
		this.hideProxy();
		if (this.afterValidDrop) {
			this.afterValidDrop(b, a, c)
		}
	},
	getRepairXY : function(b, a) {
		return this.el.getXY()
	},
	onInvalidDrop : function(b, a, c) {
		this.beforeInvalidDrop(b, a, c);
		if (this.cachedTarget) {
			if (this.cachedTarget.isNotifyTarget) {
				this.cachedTarget.notifyOut(this, a, this.dragData)
			}
			this.cacheTarget = null
		}
		this.proxy.repair(this.getRepairXY(a, this.dragData), this.afterRepair,
				this);
		if (this.afterInvalidDrop) {
			this.afterInvalidDrop(a, c)
		}
	},
	afterRepair : function() {
		if (Ext.enableFx) {
			this.el.highlight(this.hlColor || "c3daf9")
		}
		this.dragging = false
	},
	beforeInvalidDrop : function(b, a, c) {
		return true
	},
	handleMouseDown : function(b) {
		if (this.dragging) {
			return
		}
		var a = this.getDragData(b);
		if (a && this.onBeforeDrag(a, b) !== false) {
			this.dragData = a;
			this.proxy.stop();
			Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments)
		}
	},
	onBeforeDrag : function(a, b) {
		return true
	},
	onStartDrag :Ext.emptyFn,
	startDrag : function(a, b) {
		this.proxy.reset();
		this.dragging = true;
		this.proxy.update("");
		this.onInitDrag(a, b);
		this.proxy.show()
	},
	onInitDrag : function(a, c) {
		var b = this.el.dom.cloneNode(true);
		b.id = Ext.id();
		this.proxy.update(b);
		this.onStartDrag(a, c);
		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(a) {
	},
	endDrag : function(a) {
		this.onEndDrag(this.dragData, a)
	},
	onEndDrag : function(a, b) {
	},
	autoOffset : function(a, b) {
		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(b, a) {
		this.el = Ext.get(b);
		Ext.apply(this, a);
		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(a, c, b) {
		if (this.overClass) {
			this.el.addClass(this.overClass)
		}
		return this.dropAllowed
	},
	notifyOver : function(a, c, b) {
		return this.dropAllowed
	},
	notifyOut : function(a, c, b) {
		if (this.overClass) {
			this.el.removeClass(this.overClass)
		}
	},
	notifyDrop : function(a, c, b) {
		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(b, a) {
		Ext.dd.DragZone.superclass.constructor.call(this, b, a);
		if (this.containerScroll) {
			Ext.dd.ScrollManager.register(this.el)
		}
	},
	getDragData : function(a) {
		return Ext.dd.Registry.getHandleFromEvent(a)
	},
	onInitDrag : function(a, b) {
		this.proxy.update(this.dragData.ddel.cloneNode(true));
		this.onStartDrag(a, b);
		return true
	},
	afterRepair : function() {
		if (Ext.enableFx) {
			Ext.Element.fly(this.dragData.ddel).highlight(
					this.hlColor || "c3daf9")
		}
		this.dragging = false
	},
	getRepairXY : function(a) {
		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(b, a) {
	Ext.dd.DropZone.superclass.constructor.call(this, b, a)
};
Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, {
	getTargetFromEvent : function(a) {
		return Ext.dd.Registry.getTargetFromEvent(a)
	},
	onNodeEnter : function(d, a, c, b) {
	},
	onNodeOver : function(d, a, c, b) {
		return this.dropAllowed
	},
	onNodeOut : function(d, a, c, b) {
	},
	onNodeDrop : function(d, a, c, b) {
		return false
	},
	onContainerOver : function(a, c, b) {
		return this.dropNotAllowed
	},
	onContainerDrop : function(a, c, b) {
		return false
	},
	notifyEnter : function(a, c, b) {
		return this.dropNotAllowed
	},
	notifyOver : function(a, c, b) {
		var d = this.getTargetFromEvent(c);
		if (!d) {
			if (this.lastOverNode) {
				this.onNodeOut(this.lastOverNode, a, c, b);
				this.lastOverNode = null
			}
			return this.onContainerOver(a, c, b)
		}
		if (this.lastOverNode != d) {
			if (this.lastOverNode) {
				this.onNodeOut(this.lastOverNode, a, c, b)
			}
			this.onNodeEnter(d, a, c, b);
			this.lastOverNode = d
		}
		return this.onNodeOver(d, a, c, b)
	},
	notifyOut : function(a, c, b) {
		if (this.lastOverNode) {
			this.onNodeOut(this.lastOverNode, a, c, b);
			this.lastOverNode = null
		}
	},
	notifyDrop : function(a, c, b) {
		if (this.lastOverNode) {
			this.onNodeOut(this.lastOverNode, a, c, b);
			this.lastOverNode = null
		}
		var d = this.getTargetFromEvent(c);
		return d ? this.onNodeDrop(d, a, c, b) : this.onContainerDrop(a, c, b)
	},
	triggerCacheRefresh : function() {
		Ext.dd.DDM.refreshCache(this.groups)
	}
});
Ext.Element.addMethods( {
	initDD : function(c, b, d) {
		var a = new Ext.dd.DD(Ext.id(this.dom), c, b);
		return Ext.apply(a, d)
	},
	initDDProxy : function(c, b, d) {
		var a = new Ext.dd.DDProxy(Ext.id(this.dom), c, b);
		return Ext.apply(a, d)
	},
	initDDTarget : function(c, b, d) {
		var a = new Ext.dd.DDTarget(Ext.id(this.dom), c, b);
		return Ext.apply(a, d)
	}
});
Ext.data.Api = ( function() {
	var a = {};
	return {
		actions : {
			create :"create",
			read :"read",
			update :"update",
			destroy :"destroy"
		},
		restActions : {
			create :"POST",
			read :"GET",
			update :"PUT",
			destroy :"DELETE"
		},
		isAction : function(b) {
			return (Ext.data.Api.actions[b]) ? true : false
		},
		getVerb : function(b) {
			if (a[b]) {
				return a[b]
			}
			for ( var c in this.actions) {
				if (this.actions[c] === b) {
					a[b] = c;
					break
				}
			}
			return (a[b] !== undefined) ? a[b] : null
		},
		isValid : function(b) {
			var e = [];
			var d = this.actions;
			for ( var c in b) {
				if (!(c in d)) {
					e.push(c)
				}
			}
			return (!e.length) ? true : e
		},
		hasUniqueUrl : function(c, g) {
			var b = (c.api[g]) ? c.api[g].url : null;
			var e = true;
			for ( var d in c.api) {
				if ((e = (d === g) ? true : (c.api[d].url != b) ? true : false) === false) {
					break
				}
			}
			return e
		},
		prepare : function(b) {
			if (!b.api) {
				b.api = {}
			}
			for ( var d in this.actions) {
				var c = this.actions[d];
				b.api[c] = b.api[c] || b.url || b.directFn;
				if (typeof (b.api[c]) == "string") {
					b.api[c] = {
						url :b.api[c],
						method :(b.restful === true) ? Ext.data.Api.restActions[c]
								: undefined
					}
				}
			}
		},
		restify : function(b) {
			b.restful = true;
			for ( var c in this.restActions) {
				b.api[this.actions[c]].method
						|| (b.api[this.actions[c]].method = this.restActions[c])
			}
			b.onWrite = b.onWrite.createInterceptor( function(i, k, g, e) {
				var d = k.reader;
				var h = new Ext.data.Response( {
					action :i,
					raw :g
				});
				switch (g.status) {
				case 200:
					return true;
					break;
				case 201:
					if (Ext.isEmpty(h.raw.responseText)) {
						h.success = true
					} else {
						return true
					}
					break;
				case 204:
					h.success = true;
					h.data = null;
					break;
				default:
					return true;
					break
				}
				if (h.success === true) {
					this.fireEvent("write", this, i, h.data, h, e,
							k.request.arg)
				} else {
					this.fireEvent("exception", this, "remote", i, k, h, e)
				}
				k.request.callback.call(k.request.scope, h.data, h, h.success);
				return false
			}, b)
		}
	}
})();
Ext.data.Response = function(b, a) {
	Ext.apply(this, b, {
		raw :a
	})
};
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(b, a) {
		this.arg = a;
		Ext.Error.call(this, b)
	},
	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(a) {
		return a
	},
	stripTagsRE :/<\/?[^>]+>/gi,
	asText : function(a) {
		return String(a).replace(this.stripTagsRE, "")
	},
	asUCText : function(a) {
		return String(a).toUpperCase().replace(this.stripTagsRE, "")
	},
	asUCString : function(a) {
		return String(a).toUpperCase()
	},
	asDate : function(a) {
		if (!a) {
			return 0
		}
		if (Ext.isDate(a)) {
			return a.getTime()
		}
		return Date.parse(String(a))
	},
	asFloat : function(a) {
		var b = parseFloat(String(a).replace(/,/g, ""));
		return isNaN(b) ? 0 : b
	},
	asInt : function(a) {
		var b = parseInt(String(a).replace(/,/g, ""), 10);
		return isNaN(b) ? 0 : b
	}
};
Ext.data.Record = function(a, b) {
	this.id = (b || b === 0) ? b : Ext.data.Record.id(this);
	this.data = a || {}
};
Ext.data.Record.create = function(e) {
	var c = Ext.extend(Ext.data.Record, {});
	var d = c.prototype;
	d.fields = new Ext.util.MixedCollection(false, function(g) {
		return g.name
	});
	for ( var b = 0, a = e.length; b < a; b++) {
		d.fields.add(new Ext.data.Field(e[b]))
	}
	c.getField = function(g) {
		return d.fields.get(g)
	};
	return c
};
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(a) {
	a.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(a) {
		this.store = a
	},
	set : function(a, c) {
		var b = Ext.isPrimitive(c) ? String : Ext.encode;
		if (b(this.data[a]) == b(c)) {
			return
		}
		this.dirty = true;
		if (!this.modified) {
			this.modified = {}
		}
		if (this.modified[a] === undefined) {
			this.modified[a] = this.data[a]
		}
		this.data[a] = c;
		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(a) {
		return this.data[a]
	},
	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(b) {
		var a = this.modified;
		for ( var c in a) {
			if (typeof a[c] != "function") {
				this.data[c] = a[c]
			}
		}
		this.dirty = false;
		delete this.modified;
		this.editing = false;
		if (b !== true) {
			this.afterReject()
		}
	},
	commit : function(a) {
		this.dirty = false;
		delete this.modified;
		this.editing = false;
		if (a !== true) {
			this.afterCommit()
		}
	},
	getChanges : function() {
		var a = this.modified, b = {};
		for ( var c in a) {
			if (a.hasOwnProperty(c)) {
				b[c] = this.data[c]
			}
		}
		return b
	},
	hasError : function() {
		return this.error !== null
	},
	clearError : function() {
		this.error = null
	},
	copy : function(a) {
		return new this.constructor(Ext.apply( {}, this.data), a || this.id)
	},
	isModified : function(a) {
		return !!(this.modified && this.modified.hasOwnProperty(a))
	},
	isValid : function() {
		return this.fields.find(
				function(a) {
					return (a.allowBlank === false && Ext
							.isEmpty(this.data[a.name])) ? true : false
				}, this) ? false : true
	},
	markDirty : function() {
		this.dirty = true;
		if (!this.modified) {
			this.modified = {}
		}
		this.fields.each( function(a) {
			this.modified[a.name] = this.data[a.name]
		}, this)
	}
};
Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), {
	register : function() {
		for ( var a = 0, b; (b = arguments[a]); a++) {
			this.add(b)
		}
	},
	unregister : function() {
		for ( var a = 0, b; (b = arguments[a]); a++) {
			this.remove(this.lookup(b))
		}
	},
	lookup : function(e) {
		if (Ext.isArray(e)) {
			var b = [ "field1" ], d = !Ext.isArray(e[0]);
			if (!d) {
				for ( var c = 2, a = e[0].length; c <= a; ++c) {
					b.push("field" + c)
				}
			}
			return new Ext.data.ArrayStore( {
				fields :b,
				data :e,
				expandData :d,
				autoDestroy :true,
				autoCreated :true
			})
		}
		return Ext.isObject(e) ? (e.events ? e : Ext.create(e, "store")) : this
				.get(e)
	},
	getKey : function(a) {
		return a.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(a) {
						this.data = new Ext.util.MixedCollection(false);
						this.data.getKey = function(b) {
							return b.id
						};
						this.removed = [];
						if (a && a.data) {
							this.inlineData = a.data;
							delete a.data
						}
						Ext.apply(this, a);
						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(b) {
						var a = undefined, c = (b.format || "json")
								.toLowerCase();
						switch (c) {
						case "json":
							a = Ext.data.JsonWriter;
							break;
						case "xml":
							a = Ext.data.XmlWriter;
							break;
						default:
							a = Ext.data.JsonWriter
						}
						return new a(b)
					},
					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(c) {
						var e, a, b, d;
						c = [].concat(c);
						if (c.length < 1) {
							return
						}
						for (e = 0, a = c.length; e < a; e++) {
							b = c[e];
							b.join(this);
							if (b.dirty || b.phantom) {
								this.modified.push(b)
							}
						}
						d = this.data.length;
						this.data.addAll(c);
						if (this.snapshot) {
							this.snapshot.addAll(c)
						}
						this.fireEvent("add", this, c, d)
					},
					addSorted : function(a) {
						var b = this.findInsertIndex(a);
						this.insert(b, a)
					},
					doUpdate : function(a) {
						this.data.replace(a.id, a);
						if (this.snapshot) {
							this.snapshot.replace(a.id, a)
						}
						this.fireEvent("update", this, a,
								Ext.data.Record.COMMIT)
					},
					remove : function(a) {
						if (Ext.isArray(a)) {
							Ext.each(a, function(c) {
								this.remove(c)
							}, this);
							return
						}
						var b = this.data.indexOf(a);
						if (b > -1) {
							a.join(null);
							this.data.removeAt(b)
						}
						if (this.pruneModifiedRecords) {
							this.modified.remove(a)
						}
						if (this.snapshot) {
							this.snapshot.remove(a)
						}
						if (b > -1) {
							this.fireEvent("remove", this, a, b)
						}
					},
					removeAt : function(a) {
						this.remove(this.getAt(a))
					},
					removeAll : function(b) {
						var a = [];
						this.each( function(c) {
							a.push(c)
						});
						this.clearData();
						if (this.snapshot) {
							this.snapshot.clear()
						}
						if (this.pruneModifiedRecords) {
							this.modified = []
						}
						if (b !== true) {
							this.fireEvent("clear", this, a)
						}
					},
					onClear : function(b, a) {
						Ext.each(a, function(d, c) {
							this.destroyRecord(this, d, c)
						}, this)
					},
					insert : function(d, c) {
						var e, a, b;
						c = [].concat(c);
						for (e = 0, a = c.length; e < a; e++) {
							b = c[e];
							this.data.insert(d + e, b);
							b.join(this);
							if (b.dirty || b.phantom) {
								this.modified.push(b)
							}
						}
						if (this.snapshot) {
							this.snapshot.addAll(c)
						}
						this.fireEvent("add", this, c, d)
					},
					indexOf : function(a) {
						return this.data.indexOf(a)
					},
					indexOfId : function(a) {
						return this.data.indexOfKey(a)
					},
					getById : function(a) {
						return (this.snapshot || this.data).key(a)
					},
					getAt : function(a) {
						return this.data.itemAt(a)
					},
					getRange : function(b, a) {
						return this.data.getRange(b, a)
					},
					storeOptions : function(a) {
						a = Ext.apply( {}, a);
						delete a.callback;
						delete a.scope;
						this.lastOptions = a
					},
					clearData : function() {
						this.data.each( function(a) {
							a.join(null)
						});
						this.data.clear()
					},
					load : function(b) {
						b = Ext.apply( {}, b);
						this.storeOptions(b);
						if (this.sortInfo && this.remoteSort) {
							var a = this.paramNames;
							b.params = Ext.apply( {}, b.params);
							b.params[a.sort] = this.sortInfo.field;
							b.params[a.dir] = this.sortInfo.direction
						}
						try {
							return this.execute("read", null, b)
						} catch (c) {
							this.handleException(c);
							return false
						}
					},
					updateRecord : function(b, a, c) {
						if (c == Ext.data.Record.EDIT && this.autoSave === true
								&& (!a.phantom || (a.phantom && a.isValid()))) {
							this.save()
						}
					},
					createRecords : function(c, b, e) {
						var d = this.modified, h = b.length, a, g;
						for (g = 0; g < h; g++) {
							a = b[g];
							if (a.phantom && a.isValid()) {
								a.markDirty();
								if (d.indexOf(a) == -1) {
									d.push(a)
								}
							}
						}
						if (this.autoSave === true) {
							this.save()
						}
					},
					destroyRecord : function(b, a, c) {
						if (this.modified.indexOf(a) != -1) {
							this.modified.remove(a)
						}
						if (!a.phantom) {
							this.removed.push(a);
							a.lastIndex = c;
							if (this.autoSave === true) {
								this.save()
							}
						}
					},
					execute : function(e, a, c, b) {
						if (!Ext.data.Api.isAction(e)) {
							throw new Ext.data.Api.Error("execute", e)
						}
						c = Ext.applyIf(c || {}, {
							params : {}
						});
						if (b !== undefined) {
							this.addToBatch(b)
						}
						var d = true;
						if (e === "read") {
							d = this.fireEvent("beforeload", this, c);
							Ext.applyIf(c.params, this.baseParams)
						} else {
							if (this.writer.listful === true
									&& this.restful !== true) {
								a = (Ext.isArray(a)) ? a : [ a ]
							} else {
								if (Ext.isArray(a) && a.length == 1) {
									a = a.shift()
								}
							}
							if ((d = this.fireEvent("beforewrite", this, e, a,
									c)) !== false) {
								this.writer.apply(c.params, this.baseParams, e,
										a)
							}
						}
						if (d !== false) {
							if (this.writer
									&& this.proxy.url
									&& !this.proxy.restful
									&& !Ext.data.Api
											.hasUniqueUrl(this.proxy, e)) {
								c.params.xaction = e
							}
							this.proxy.request(Ext.data.Api.actions[e], a,
									c.params, this.reader, this.createCallback(
											e, a, b), this, c)
						}
						return d
					},
					save : function() {
						if (!this.writer) {
							throw new Ext.data.Store.Error("writer-undefined")
						}
						var h = [], k, l, e, c = {}, d;
						if (this.removed.length) {
							h.push( [ "destroy", this.removed ])
						}
						var b = [].concat(this.getModifiedRecords());
						if (b.length) {
							var g = [];
							for (d = b.length - 1; d >= 0; d--) {
								if (b[d].phantom === true) {
									var a = b.splice(d, 1).shift();
									if (a.isValid()) {
										g.push(a)
									}
								} else {
									if (!b[d].isValid()) {
										b.splice(d, 1)
									}
								}
							}
							if (g.length) {
								h.push( [ "create", g ])
							}
							if (b.length) {
								h.push( [ "update", b ])
							}
						}
						k = h.length;
						if (k) {
							e = ++this.batchCounter;
							for (d = 0; d < k; ++d) {
								l = h[d];
								c[l[0]] = l[1]
							}
							if (this.fireEvent("beforesave", this, c) !== false) {
								for (d = 0; d < k; ++d) {
									l = h[d];
									this.doTransaction(l[0], l[1], e)
								}
								return e
							}
						}
						return -1
					},
					doTransaction : function(e, b, c) {
						function g(h) {
							try {
								this.execute(e, h, undefined, c)
							} catch (i) {
								this.handleException(i)
							}
						}
						if (this.batch === false) {
							for ( var d = 0, a = b.length; d < a; d++) {
								g.call(this, b[d])
							}
						} else {
							g.call(this, b)
						}
					},
					addToBatch : function(c) {
						var a = this.batches, d = this.batchKey + c, e = a[d];
						if (!e) {
							a[d] = e = {
								id :c,
								count :0,
								data : {}
							}
						}
						++e.count
					},
					removeFromBatch : function(d, h, g) {
						var c = this.batches, e = this.batchKey + d, i = c[e], a;
						if (i) {
							a = i.data[h] || [];
							i.data[h] = a.concat(g);
							if (i.count === 1) {
								g = i.data;
								delete c[e];
								this.fireEvent("save", this, d, g)
							} else {
								--i.count
							}
						}
					},
					createCallback : function(c, a, b) {
						var d = Ext.data.Api.actions;
						return (c == "read") ? this.loadRecords : function(g,
								e, h) {
							this["on" + Ext.util.Format.capitalize(c)
									+ "Records"](h, a, [].concat(g));
							if (h === true) {
								this.fireEvent("write", this, c, g, e, a)
							}
							this.removeFromBatch(b, c, g)
						}
					},
					clearModified : function(a) {
						if (Ext.isArray(a)) {
							for ( var b = a.length - 1; b >= 0; b--) {
								this.modified.splice(this.modified
										.indexOf(a[b]), 1)
							}
						} else {
							this.modified.splice(this.modified.indexOf(a), 1)
						}
					},
					reMap : function(b) {
						if (Ext.isArray(b)) {
							for ( var d = 0, a = b.length; d < a; d++) {
								this.reMap(b[d])
							}
						} else {
							delete this.data.map[b._phid];
							this.data.map[b.id] = b;
							var c = this.data.keys.indexOf(b._phid);
							this.data.keys.splice(c, 1, b.id);
							delete b._phid
						}
					},
					onCreateRecords : function(d, a, b) {
						if (d === true) {
							try {
								this.reader.realize(a, b);
								this.reMap(a)
							} catch (c) {
								this.handleException(c);
								if (Ext.isArray(a)) {
									this.onCreateRecords(d, a, b)
								}
							}
						}
					},
					onUpdateRecords : function(d, a, b) {
						if (d === true) {
							try {
								this.reader.update(a, b)
							} catch (c) {
								this.handleException(c);
								if (Ext.isArray(a)) {
									this.onUpdateRecords(d, a, b)
								}
							}
						}
					},
					onDestroyRecords : function(e, b, d) {
						b = (b instanceof Ext.data.Record) ? [ b ] : []
								.concat(b);
						for ( var c = 0, a = b.length; c < a; c++) {
							this.removed.splice(this.removed.indexOf(b[c]), 1)
						}
						if (e === false) {
							for (c = b.length - 1; c >= 0; c--) {
								this.insert(b[c].lastIndex, b[c])
							}
						}
					},
					handleException : function(a) {
						Ext.handleError(a)
					},
					reload : function(a) {
						this.load(Ext.applyIf(a || {}, this.lastOptions))
					},
					loadRecords : function(b, m, h) {
						var e, g;
						if (this.isDestroyed === true) {
							return
						}
						if (!b || h === false) {
							if (h !== false) {
								this.fireEvent("load", this, [], m)
							}
							if (m.callback) {
								m.callback.call(m.scope || this, [], m, false,
										b)
							}
							return
						}
						var a = b.records, k = b.totalRecords || a.length;
						if (!m || m.add !== true) {
							if (this.pruneModifiedRecords) {
								this.modified = []
							}
							for (e = 0, g = a.length; e < g; e++) {
								a[e].join(this)
							}
							if (this.snapshot) {
								this.data = this.snapshot;
								delete this.snapshot
							}
							this.clearData();
							this.data.addAll(a);
							this.totalLength = k;
							this.applySort();
							this.fireEvent("datachanged", this)
						} else {
							var l = [], d, c = 0;
							for (e = 0, g = a.length; e < g; ++e) {
								d = a[e];
								if (this.indexOfId(d.id) > -1) {
									this.doUpdate(d)
								} else {
									l.push(d);
									++c
								}
							}
							this.totalLength = Math
									.max(k, this.data.length + c);
							this.add(l)
						}
						this.fireEvent("load", this, a, m);
						if (m.callback) {
							m.callback.call(m.scope || this, a, m, true)
						}
					},
					loadData : function(c, a) {
						var b = this.reader.readRecords(c);
						this.loadRecords(b, {
							add :a
						}, 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 a = this.hasMultiSort ? this.multiSortInfo
								: this.sortInfo, k = a.direction || "ASC", h = a.sorters, c = [];
						if (!this.hasMultiSort) {
							h = [ {
								direction :k,
								field :a.field
							} ]
						}
						for ( var d = 0, b = h.length; d < b; d++) {
							c.push(this.createSortFunction(h[d].field,
									h[d].direction))
						}
						if (c.length == 0) {
							return
						}
						var g = k.toUpperCase() == "DESC" ? -1 : 1;
						var e = function(n, m) {
							var l = c[0].call(this, n, m);
							if (c.length > 1) {
								for ( var p = 1, o = c.length; p < o; p++) {
									l = l || c[p].call(this, n, m)
								}
							}
							return g * l
						};
						this.data.sort(k, e);
						if (this.snapshot && this.snapshot != this.data) {
							this.snapshot.sort(k, e)
						}
					},
					createSortFunction : function(c, b) {
						b = b || "ASC";
						var a = b.toUpperCase() == "DESC" ? -1 : 1;
						var d = this.fields.get(c).sortType;
						return function(g, e) {
							var i = d(g.data[c]), h = d(e.data[c]);
							return a * (i > h ? 1 : (i < h ? -1 : 0))
						}
					},
					setDefaultSort : function(b, a) {
						a = a ? a.toUpperCase() : "ASC";
						this.sortInfo = {
							field :b,
							direction :a
						};
						this.sortToggle[b] = a
					},
					sort : function(b, a) {
						if (Ext.isArray(arguments[0])) {
							return this.multiSort.call(this, b, a)
						} else {
							return this.singleSort(b, a)
						}
					},
					singleSort : function(g, c) {
						var e = this.fields.get(g);
						if (!e) {
							return false
						}
						var b = e.name, a = this.sortInfo || null, d = this.sortToggle ? this.sortToggle[b]
								: null;
						if (!c) {
							if (a && a.field == b) {
								c = (this.sortToggle[b] || "ASC").toggle("ASC",
										"DESC")
							} else {
								c = e.sortDir
							}
						}
						this.sortToggle[b] = c;
						this.sortInfo = {
							field :b,
							direction :c
						};
						this.hasMultiSort = false;
						if (this.remoteSort) {
							if (!this.load(this.lastOptions)) {
								if (d) {
									this.sortToggle[b] = d
								}
								if (a) {
									this.sortInfo = a
								}
							}
						} else {
							this.applySort();
							this.fireEvent("datachanged", this)
						}
						return true
					},
					multiSort : function(b, a) {
						this.hasMultiSort = true;
						a = a || "ASC";
						if (this.multiSortInfo
								&& a == this.multiSortInfo.direction) {
							a = a.toggle("ASC", "DESC")
						}
						this.multiSortInfo = {
							sorters :b,
							direction :a
						};
						if (this.remoteSort) {
							this.singleSort(b[0].field, b[0].direction)
						} else {
							this.applySort();
							this.fireEvent("datachanged", this)
						}
					},
					each : function(b, a) {
						this.data.each(b, a)
					},
					getModifiedRecords : function() {
						return this.modified
					},
					sum : function(e, g, a) {
						var c = this.data.items, b = 0;
						g = g || 0;
						a = (a || a === 0) ? a : c.length - 1;
						for ( var d = g; d <= a; d++) {
							b += (c[d].data[e] || 0)
						}
						return b
					},
					createFilterFn : function(d, c, e, a, b) {
						if (Ext.isEmpty(c, false)) {
							return false
						}
						c = this.data.createValueMatcher(c, e, a, b);
						return function(g) {
							return c.test(g.data[d])
						}
					},
					createMultipleFilterFn : function(a) {
						return function(b) {
							var k = true;
							for ( var d = 0, c = a.length; d < c; d++) {
								var h = a[d], g = h.fn, e = h.scope;
								k = k && g.call(e, b)
							}
							return k
						}
					},
					filter : function(n, m, h, k, e) {
						var l;
						if (Ext.isObject(n)) {
							n = [ n ]
						}
						if (Ext.isArray(n)) {
							var b = [];
							for ( var g = 0, d = n.length; g < d; g++) {
								var a = n[g], c = a.fn, o = a.scope || this;
								if (!Ext.isFunction(c)) {
									c = this.createFilterFn(a.property,
											a.value, a.anyMatch,
											a.caseSensitive, a.exactMatch)
								}
								b.push( {
									fn :c,
									scope :o
								})
							}
							l = this.createMultipleFilterFn(b)
						} else {
							l = this.createFilterFn(n, m, h, k, e)
						}
						return l ? this.filterBy(l) : this.clearFilter()
					},
					filterBy : function(b, a) {
						this.snapshot = this.snapshot || this.data;
						this.data = this.queryBy(b, a || this);
						this.fireEvent("datachanged", this)
					},
					clearFilter : function(a) {
						if (this.isFiltered()) {
							this.data = this.snapshot;
							delete this.snapshot;
							if (a !== true) {
								this.fireEvent("datachanged", this)
							}
						}
					},
					isFiltered : function() {
						return !!this.snapshot && this.snapshot != this.data
					},
					query : function(d, c, e, a) {
						var b = this.createFilterFn(d, c, e, a);
						return b ? this.queryBy(b) : this.data.clone()
					},
					queryBy : function(b, a) {
						var c = this.snapshot || this.data;
						return c.filterBy(b, a || this)
					},
					find : function(d, c, g, e, a) {
						var b = this.createFilterFn(d, c, e, a);
						return b ? this.data.findIndexBy(b, null, g) : -1
					},
					findExact : function(b, a, c) {
						return this.data.findIndexBy( function(d) {
							return d.get(b) === a
						}, this, c)
					},
					findBy : function(b, a, c) {
						return this.data.findIndexBy(b, a, c)
					},
					collect : function(k, m, b) {
						var h = (b === true && this.snapshot) ? this.snapshot.items
								: this.data.items;
						var n, o, a = [], c = {};
						for ( var e = 0, g = h.length; e < g; e++) {
							n = h[e].data[k];
							o = String(n);
							if ((m || !Ext.isEmpty(n)) && !c[o]) {
								c[o] = true;
								a[a.length] = n
							}
						}
						return a
					},
					afterEdit : function(a) {
						if (this.modified.indexOf(a) == -1) {
							this.modified.push(a)
						}
						this.fireEvent("update", this, a, Ext.data.Record.EDIT)
					},
					afterReject : function(a) {
						this.modified.remove(a);
						this.fireEvent("update", this, a,
								Ext.data.Record.REJECT)
					},
					afterCommit : function(a) {
						this.modified.remove(a);
						this.fireEvent("update", this, a,
								Ext.data.Record.COMMIT)
					},
					commitChanges : function() {
						var a = this.modified.slice(0), c = a.length, b;
						for (b = 0; b < c; b++) {
							a[b].commit()
						}
						this.modified = [];
						this.removed = []
					},
					rejectChanges : function() {
						var a = this.modified.slice(0), e = this.removed.slice(
								0).reverse(), c = a.length, d = e.length, b;
						for (b = 0; b < c; b++) {
							a[b].reject()
						}
						for (b = 0; b < d; b++) {
							this.insert(e[b].lastIndex || 0, e[b]);
							e[b].reject()
						}
						this.modified = [];
						this.removed = []
					},
					onMetaChange : function(a) {
						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(a) {
						this.suspendEvents();
						var c = this.data.clone();
						this.data.add(a);
						this.applySort();
						var b = this.data.indexOf(a);
						this.data = c;
						this.resumeEvents();
						return b
					},
					setBaseParam : function(a, b) {
						this.baseParams = this.baseParams || {};
						this.baseParams[a] = b
					}
				});
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(b) {
		if (Ext.isString(b)) {
			b = {
				name :b
			}
		}
		Ext.apply(this, b);
		var d = Ext.data.Types, a = this.sortType, c;
		if (this.type) {
			if (Ext.isString(this.type)) {
				this.type = Ext.data.Types[this.type.toUpperCase()] || d.AUTO
			}
		} else {
			this.type = d.AUTO
		}
		if (Ext.isString(a)) {
			this.sortType = Ext.data.SortTypes[a]
		} else {
			if (Ext.isEmpty(a)) {
				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(a, b) {
	this.meta = a;
	this.recordType = Ext.isArray(b) ? Ext.data.Record.create(b) : b;
	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(a, c) {
		if (Ext.isArray(a)) {
			for ( var b = a.length - 1; b >= 0; b--) {
				if (Ext.isArray(c)) {
					this
							.realize(a.splice(b, 1).shift(), c.splice(b, 1)
									.shift())
				} else {
					this.realize(a.splice(b, 1).shift(), c)
				}
			}
		} else {
			if (Ext.isArray(c) && c.length == 1) {
				c = c.shift()
			}
			if (!this.isData(c)) {
				throw new Ext.data.DataReader.Error("realize", a)
			}
			a.phantom = false;
			a._phid = a.id;
			a.id = this.getId(c);
			a.data = c;
			a.commit()
		}
	},
	update : function(a, c) {
		if (Ext.isArray(a)) {
			for ( var b = a.length - 1; b >= 0; b--) {
				if (Ext.isArray(c)) {
					this.update(a.splice(b, 1).shift(), c.splice(b, 1).shift())
				} else {
					this.update(a.splice(b, 1).shift(), c)
				}
			}
		} else {
			if (Ext.isArray(c) && c.length == 1) {
				c = c.shift()
			}
			if (this.isData(c)) {
				a.data = Ext.apply(a.data, c)
			}
			a.commit()
		}
	},
	extractData : function(l, a) {
		var k = (this instanceof Ext.data.JsonReader) ? "json" : "node";
		var c = [];
		if (this.isData(l) && !(this instanceof Ext.data.XmlReader)) {
			l = [ l ]
		}
		var h = this.recordType.prototype.fields, p = h.items, o = h.length, c = [];
		if (a === true) {
			var m = this.recordType;
			for ( var e = 0; e < l.length; e++) {
				var b = l[e];
				var g = new m(this.extractValues(b, p, o), this.getId(b));
				g[k] = b;
				c.push(g)
			}
		} else {
			for ( var e = 0; e < l.length; e++) {
				var d = this.extractValues(l[e], p, o);
				d[this.meta.idProperty] = this.getId(l[e]);
				c.push(d)
			}
		}
		return c
	},
	isData : function(a) {
		return (a && Ext.isObject(a) && !Ext.isEmpty(this.getId(a))) ? true
				: false
	},
	onMetaChange : function(a) {
		delete this.ef;
		this.meta = a;
		this.recordType = Ext.data.Record.create(a.fields);
		this.buildExtractors()
	}
};
Ext.data.DataReader.Error = Ext.extend(Ext.Error, {
	constructor : function(b, a) {
		this.arg = a;
		Ext.Error.call(this, b)
	},
	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(a) {
	Ext.apply(this, a)
};
Ext.data.DataWriter.prototype = {
	writeAllFields :false,
	listful :false,
	apply : function(e, g, d, a) {
		var c = [], b = d + "Record";
		if (Ext.isArray(a)) {
			Ext.each(a, function(h) {
				c.push(this[b](h))
			}, this)
		} else {
			if (a instanceof Ext.data.Record) {
				c = this[b](a)
			}
		}
		this.render(e, g, c)
	},
	render :Ext.emptyFn,
	updateRecord :Ext.emptyFn,
	createRecord :Ext.emptyFn,
	destroyRecord :Ext.emptyFn,
	toHash : function(g, c) {
		var e = g.fields.map, d = {}, b = (this.writeAllFields === false && g.phantom === false) ? g
				.getChanges()
				: g.data, a;
		Ext.iterate(b, function(i, h) {
			if ((a = e[i])) {
				d[a.mapping ? a.mapping : a.name] = h
			}
		});
		if (g.phantom) {
			if (g.fields.containsKey(this.meta.idProperty)
					&& Ext.isEmpty(g.data[this.meta.idProperty])) {
				delete d[this.meta.idProperty]
			}
		} else {
			d[this.meta.idProperty] = g.id
		}
		return d
	},
	toArray : function(b) {
		var a = [];
		Ext.iterate(b, function(d, c) {
			a.push( {
				name :d,
				value :c
			})
		}, this);
		return a
	}
};
Ext.data.DataProxy = function(a) {
	a = a || {};
	this.api = a.api;
	this.url = a.url;
	this.restful = a.restful;
	this.listeners = a.listeners;
	this.prettyUrls = a.prettyUrls;
	this.addEvents("exception", "beforeload", "load", "loadexception",
			"beforewrite", "write");
	Ext.data.DataProxy.superclass.constructor.call(this);
	try {
		Ext.data.Api.prepare(this)
	} catch (b) {
		if (b instanceof Ext.data.Api.Error) {
			b.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 a = Ext.data.Api.isValid(arguments[0]);
			if (a === true) {
				this.api = arguments[0]
			} else {
				throw new Ext.data.Api.Error("invalid", a)
			}
		} 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(a) {
		return (this.api[a]) ? true : false
	},
	request : function(e, b, g, a, h, d, c) {
		if (!this.api[e] && !this.load) {
			throw new Ext.data.DataProxy.Error("action-undefined", e)
		}
		g = g || {};
		if ((e === Ext.data.Api.actions.read) ? this.fireEvent("beforeload",
				this, g)
				: this.fireEvent("beforewrite", this, e, b, g) !== false) {
			this.doRequest.apply(this, arguments)
		} else {
			h.call(d || this, null, c, false)
		}
	},
	load :null,
	doRequest : function(e, b, g, a, h, d, c) {
		this.load(g, a, h, d, c)
	},
	onRead :Ext.emptyFn,
	onWrite :Ext.emptyFn,
	buildUrl : function(d, b) {
		b = b || null;
		var c = (this.conn && this.conn.url) ? this.conn.url
				: (this.api[d]) ? this.api[d].url : this.url;
		if (!c) {
			throw new Ext.data.Api.Error("invalid-url", d)
		}
		var e = null;
		var a = c.match(/(.*)(\.json|\.xml|\.html)$/);
		if (a) {
			e = a[2];
			c = a[1]
		}
		if ((this.restful === true || this.prettyUrls === true)
				&& b instanceof Ext.data.Record && !b.phantom) {
			c += "/" + b.id
		}
		return (e === null) ? c : c + e
	},
	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(b, a) {
		this.arg = a;
		Ext.Error.call(this, b)
	},
	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(a) {
	Ext.apply(this, a)
};
Ext.data.Request.prototype = {
	action :undefined,
	rs :undefined,
	params :undefined,
	callback :Ext.emptyFn,
	scope :undefined,
	reader :undefined
};
Ext.data.Response = function(a) {
	Ext.apply(this, a)
};
Ext.data.Response.prototype = {
	action :undefined,
	success :undefined,
	message :undefined,
	data :undefined,
	raw :undefined,
	records :undefined
};
Ext.data.ScriptTagProxy = function(a) {
	Ext.apply(this, a);
	Ext.data.ScriptTagProxy.superclass.constructor.call(this, a);
	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(e, g, d, h, k, l, m) {
		var c = Ext.urlEncode(Ext.apply(d, this.extraParams));
		var b = this.buildUrl(e, g);
		if (!b) {
			throw new Ext.data.Api.Error("invalid-url", b)
		}
		b = Ext.urlAppend(b, c);
		if (this.nocache) {
			b = Ext.urlAppend(b, "_dc=" + (new Date().getTime()))
		}
		var a = ++Ext.data.ScriptTagProxy.TRANS_ID;
		var n = {
			id :a,
			action :e,
			cb :"stcCallback" + a,
			scriptId :"stcScript" + a,
			params :d,
			arg :m,
			url :b,
			callback :k,
			scope :l,
			reader :h
		};
		window[n.cb] = this.createCallback(e, g, n);
		b += String.format("&{0}={1}", this.callbackParam, n.cb);
		if (this.autoAbort !== false) {
			this.abort()
		}
		n.timeoutId = this.handleFailure.defer(this.timeout, this, [ n ]);
		var i = document.createElement("script");
		i.setAttribute("src", b);
		i.setAttribute("type", "text/javascript");
		i.setAttribute("id", n.scriptId);
		this.head.appendChild(i);
		this.trans = n
	},
	createCallback : function(d, b, c) {
		var a = this;
		return function(e) {
			a.trans = false;
			a.destroyTrans(c, true);
			if (d === Ext.data.Api.actions.read) {
				a.onRead.call(a, d, c, e)
			} else {
				a.onWrite.call(a, d, c, e, b)
			}
		}
	},
	onRead : function(d, c, b) {
		var a;
		try {
			a = c.reader.readRecords(b)
		} catch (g) {
			this.fireEvent("loadexception", this, c, b, g);
			this.fireEvent("exception", this, "response", d, c, b, g);
			c.callback.call(c.scope || window, null, c.arg, false);
			return
		}
		if (a.success === false) {
			this.fireEvent("loadexception", this, c, b);
			this.fireEvent("exception", this, "remote", d, c, b, null)
		} else {
			this.fireEvent("load", this, b, c.arg)
		}
		c.callback.call(c.scope || window, a, c.arg, a.success)
	},
	onWrite : function(h, g, c, b) {
		var a = g.reader;
		try {
			var d = a.readResponse(h, c)
		} catch (i) {
			this.fireEvent("exception", this, "response", h, g, d, i);
			g.callback.call(g.scope || window, null, d, false);
			return
		}
		if (!d.success === true) {
			this.fireEvent("exception", this, "remote", h, g, d, b);
			g.callback.call(g.scope || window, null, d, false);
			return
		}
		this.fireEvent("write", this, h, d.data, d, b, g.arg);
		g.callback.call(g.scope || window, d.data, d, true)
	},
	isLoading : function() {
		return this.trans ? true : false
	},
	abort : function() {
		if (this.isLoading()) {
			this.destroyTrans(this.trans)
		}
	},
	destroyTrans : function(b, a) {
		this.head.removeChild(document.getElementById(b.scriptId));
		clearTimeout(b.timeoutId);
		if (a) {
			window[b.cb] = undefined;
			try {
				delete window[b.cb]
			} catch (c) {
			}
		} else {
			window[b.cb] = function() {
				window[b.cb] = undefined;
				try {
					delete window[b.cb]
				} catch (d) {
				}
			}
		}
	},
	handleFailure : function(a) {
		this.trans = false;
		this.destroyTrans(a, false);
		if (a.action === Ext.data.Api.actions.read) {
			this.fireEvent("loadexception", this, null, a.arg)
		}
		this.fireEvent("exception", this, "response", a.action, {
			response :null,
			options :a.arg
		});
		a.callback.call(a.scope || window, null, a.arg, false)
	},
	destroy : function() {
		this.abort();
		Ext.data.ScriptTagProxy.superclass.destroy.call(this)
	}
});
Ext.data.HttpProxy = function(a) {
	Ext.data.HttpProxy.superclass.constructor.call(this, a);
	this.conn = a;
	this.conn.url = null;
	this.useAjax = !a || !a.events;
	var c = Ext.data.Api.actions;
	this.activeRequest = {};
	for ( var b in c) {
		this.activeRequest[c[b]] = undefined
	}
};
Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, {
	getConnection : function() {
		return this.useAjax ? Ext.Ajax : this.conn
	},
	setUrl : function(a, b) {
		this.conn.url = a;
		if (b === true) {
			this.url = a;
			this.api = null;
			Ext.data.Api.prepare(this)
		}
	},
	doRequest : function(g, d, i, c, b, e, a) {
		var h = {
			method :(this.api[g]) ? this.api[g]["method"] : undefined,
			request : {
				callback :b,
				scope :e,
				arg :a
			},
			reader :c,
			callback :this.createCallback(g, d),
			scope :this
		};
		if (i.jsonData) {
			h.jsonData = i.jsonData
		} else {
			if (i.xmlData) {
				h.xmlData = i.xmlData
			} else {
				h.params = i || {}
			}
		}
		this.conn.url = this.buildUrl(g, d);
		if (this.useAjax) {
			Ext.applyIf(h, this.conn);
			if (this.activeRequest[g]) {
			}
			this.activeRequest[g] = Ext.Ajax.request(h)
		} else {
			this.conn.request(h)
		}
		this.conn.url = null
	},
	createCallback : function(b, a) {
		return function(e, d, c) {
			this.activeRequest[b] = undefined;
			if (!d) {
				if (b === Ext.data.Api.actions.read) {
					this.fireEvent("loadexception", this, e, c)
				}
				this.fireEvent("exception", this, "response", b, e, c);
				e.request.callback.call(e.request.scope, null, e.request.arg,
						false);
				return
			}
			if (b === Ext.data.Api.actions.read) {
				this.onRead(b, e, c)
			} else {
				this.onWrite(b, e, c, a)
			}
		}
	},
	onRead : function(d, h, b) {
		var a;
		try {
			a = h.reader.read(b)
		} catch (g) {
			this.fireEvent("loadexception", this, h, b, g);
			this.fireEvent("exception", this, "response", d, h, b, g);
			h.request.callback
					.call(h.request.scope, null, h.request.arg, false);
			return
		}
		if (a.success === false) {
			this.fireEvent("loadexception", this, h, b);
			var c = h.reader.readResponse(d, b);
			this.fireEvent("exception", this, "remote", d, h, c, null)
		} else {
			this.fireEvent("load", this, h, h.request.arg)
		}
		h.request.callback.call(h.request.scope, a, h.request.arg, a.success)
	},
	onWrite : function(g, i, c, b) {
		var a = i.reader;
		var d;
		try {
			d = a.readResponse(g, c)
		} catch (h) {
			this.fireEvent("exception", this, "response", g, i, c, h);
			i.request.callback
					.call(i.request.scope, null, i.request.arg, false);
			return
		}
		if (d.success === true) {
			this.fireEvent("write", this, g, d.data, d, b, i.request.arg)
		} else {
			this.fireEvent("exception", this, "remote", g, i, d, b)
		}
		i.request.callback.call(i.request.scope, d.data, d, d.success)
	},
	destroy : function() {
		if (!this.useAjax) {
			this.conn.abort()
		} else {
			if (this.activeRequest) {
				var b = Ext.data.Api.actions;
				for ( var a in b) {
					if (this.activeRequest[b[a]]) {
						Ext.Ajax.abort(this.activeRequest[b[a]])
					}
				}
			}
		}
		Ext.data.HttpProxy.superclass.destroy.call(this)
	}
});
Ext.data.MemoryProxy = function(b) {
	var a = {};
	a[Ext.data.Api.actions.read] = true;
	Ext.data.MemoryProxy.superclass.constructor.call(this, {
		api :a
	});
	this.data = b
};
Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, {
	doRequest : function(b, c, a, d, h, i, k) {
		a = a || {};
		var l;
		try {
			l = d.readRecords(this.data)
		} catch (g) {
			this.fireEvent("loadexception", this, null, k, g);
			this.fireEvent("exception", this, "response", b, k, null, g);
			h.call(i, null, k, false);
			return
		}
		h.call(i, l, k, true)
	}
});
Ext.data.Types = new function() {
	var a = Ext.data.SortTypes;
	Ext.apply(this, {
		stripRe :/[\$,%]/g,
		AUTO : {
			convert : function(b) {
				return b
			},
			sortType :a.none,
			type :"auto"
		},
		STRING : {
			convert : function(b) {
				return (b === undefined || b === null) ? "" : String(b)
			},
			sortType :a.asUCString,
			type :"string"
		},
		INT : {
			convert : function(b) {
				return b !== undefined && b !== null && b !== "" ? parseInt(
						String(b).replace(Ext.data.Types.stripRe, ""), 10)
						: (this.useNull ? null : 0)
			},
			sortType :a.none,
			type :"int"
		},
		FLOAT : {
			convert : function(b) {
				return b !== undefined && b !== null && b !== "" ? parseFloat(
						String(b).replace(Ext.data.Types.stripRe, ""), 10)
						: (this.useNull ? null : 0)
			},
			sortType :a.none,
			type :"float"
		},
		BOOL : {
			convert : function(b) {
				return b === true || b === "true" || b == 1
			},
			sortType :a.none,
			type :"bool"
		},
		DATE : {
			convert : function(c) {
				var d = this.dateFormat;
				if (!c) {
					return null
				}
				if (Ext.isDate(c)) {
					return c
				}
				if (d) {
					if (d == "timestamp") {
						return new Date(c * 1000)
					}
					if (d == "time") {
						return new Date(parseInt(c, 10))
					}
					return Date.parseDate(c, d)
				}
				var b = Date.parse(c);
				return b ? new Date(b) : null
			},
			sortType :a.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(a) {
		Ext.data.JsonWriter.superclass.constructor.call(this, a)
	},
	render : function(c, d, b) {
		if (this.encode === true) {
			Ext.apply(c, d);
			c[this.meta.root] = Ext.encode(b)
		} else {
			var a = Ext.apply( {}, d);
			a[this.meta.root] = b;
			c.jsonData = a
		}
	},
	createRecord : function(a) {
		return this.toHash(a)
	},
	updateRecord : function(a) {
		return this.toHash(a)
	},
	destroyRecord : function(b) {
		if (this.encodeDelete) {
			var a = {};
			a[this.meta.idProperty] = b.id;
			return a
		} else {
			return b.id
		}
	}
});
Ext.data.JsonReader = function(a, b) {
	a = a || {};
	Ext.applyIf(a, {
		idProperty :"id",
		successProperty :"success",
		totalProperty :"total"
	});
	Ext.data.JsonReader.superclass.constructor.call(this, a, b || a.fields)
};
Ext
		.extend(
				Ext.data.JsonReader,
				Ext.data.DataReader,
				{
					read : function(a) {
						var b = a.responseText;
						var c = Ext.decode(b);
						if (!c) {
							throw {
								message :"JsonReader.read: Json object not found"
							}
						}
						return this.readRecords(c)
					},
					readResponse : function(e, b) {
						var g = (b.responseText !== undefined) ? Ext
								.decode(b.responseText) : b;
						if (!g) {
							throw new Ext.data.JsonReader.Error("response")
						}
						var a = this.getRoot(g);
						if (e === Ext.data.Api.actions.create) {
							var d = Ext.isDefined(a);
							if (d && Ext.isEmpty(a)) {
								throw new Ext.data.JsonReader.Error(
										"root-empty", this.meta.root)
							} else {
								if (!d) {
									throw new Ext.data.JsonReader.Error(
											"root-undefined-response",
											this.meta.root)
								}
							}
						}
						var c = new Ext.data.Response( {
							action :e,
							success :this.getSuccess(g),
							data :(a) ? this.extractData(a, false) : [],
							message :this.getMessage(g),
							raw :g
						});
						if (Ext.isEmpty(c.success)) {
							throw new Ext.data.JsonReader.Error(
									"successProperty-response",
									this.meta.successProperty)
						}
						return c
					},
					readRecords : function(a) {
						this.jsonData = a;
						if (a.metaData) {
							this.onMetaChange(a.metaData)
						}
						var n = this.meta, h = this.recordType, b = h.prototype.fields, m = b.items, i = b.length, k;
						var g = this.getRoot(a), e = g.length, d = e, l = true;
						if (n.totalProperty) {
							k = parseInt(this.getTotal(a), 10);
							if (!isNaN(k)) {
								d = k
							}
						}
						if (n.successProperty) {
							k = this.getSuccess(a);
							if (k === false || k === "false") {
								l = false
							}
						}
						return {
							success :l,
							records :this.extractData(g, true),
							totalRecords :d
						}
					},
					buildExtractors : function() {
						if (this.ef) {
							return
						}
						var m = this.meta, h = this.recordType, e = h.prototype.fields, l = e.items, k = e.length;
						if (m.totalProperty) {
							this.getTotal = this
									.createAccessor(m.totalProperty)
						}
						if (m.successProperty) {
							this.getSuccess = this
									.createAccessor(m.successProperty)
						}
						if (m.messageProperty) {
							this.getMessage = this
									.createAccessor(m.messageProperty)
						}
						this.getRoot = m.root ? this.createAccessor(m.root)
								: function(g) {
									return g
								};
						if (m.id || m.idProperty) {
							var d = this.createAccessor(m.id || m.idProperty);
							this.getId = function(i) {
								var g = d(i);
								return (g === undefined || g === "") ? null : g
							}
						} else {
							this.getId = function() {
								return null
							}
						}
						var c = [];
						for ( var b = 0; b < k; b++) {
							e = l[b];
							var a = (e.mapping !== undefined && e.mapping !== null) ? e.mapping
									: e.name;
							c.push(this.createAccessor(a))
						}
						this.ef = c
					},
					simpleAccess : function(b, a) {
						return b[a]
					},
					createAccessor : function() {
						var a = /[\[\.]/;
						return function(c) {
							if (Ext.isEmpty(c)) {
								return Ext.emptyFn
							}
							if (Ext.isFunction(c)) {
								return c
							}
							var b = String(c).search(a);
							if (b >= 0) {
								return new Function("obj", "return obj"
										+ (b > 0 ? "." : "") + c)
							}
							return function(d) {
								return d[c]
							}
						}
					}(),
					extractValues : function(h, d, a) {
						var g, c = {};
						for ( var e = 0; e < a; e++) {
							g = d[e];
							var b = this.ef[e](h);
							c[g.name] = g.convert((b !== undefined) ? b
									: g.defaultValue, h)
						}
						return c
					}
				});
Ext.data.JsonReader.Error = Ext.extend(Ext.Error, {
	constructor : function(b, a) {
		this.arg = a;
		Ext.Error.call(this, b)
	},
	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(r) {
						this.arrayData = r;
						var l = this.meta, d = l ? Ext.num(l.idIndex, l.id)
								: null, b = this.recordType, q = b.prototype.fields, z = [], e = true, g;
						var u = this.getRoot(r);
						for ( var y = 0, A = u.length; y < A; y++) {
							var t = u[y], a = {}, p = ((d || d === 0)
									&& t[d] !== undefined && t[d] !== "" ? t[d]
									: null);
							for ( var x = 0, m = q.length; x < m; x++) {
								var B = q.items[x], w = B.mapping !== undefined
										&& B.mapping !== null ? B.mapping : x;
								g = t[w] !== undefined ? t[w] : B.defaultValue;
								g = B.convert(g, t);
								a[B.name] = g
							}
							var c = new b(a, p);
							c.json = t;
							z[z.length] = c
						}
						var h = z.length;
						if (l.totalProperty) {
							g = parseInt(this.getTotal(r), 10);
							if (!isNaN(g)) {
								h = g
							}
						}
						if (l.successProperty) {
							g = this.getSuccess(r);
							if (g === false || g === "false") {
								e = false
							}
						}
						return {
							success :e,
							records :z,
							totalRecords :h
						}
					}
				});
Ext.data.ArrayStore = Ext.extend(Ext.data.Store, {
	constructor : function(a) {
		Ext.data.ArrayStore.superclass.constructor.call(this, Ext.apply(a, {
			reader :new Ext.data.ArrayReader(a)
		}))
	},
	loadData : function(e, b) {
		if (this.expandData === true) {
			var d = [];
			for ( var c = 0, a = e.length; c < a; c++) {
				d[d.length] = [ e[c] ]
			}
			e = d
		}
		Ext.data.ArrayStore.superclass.loadData.call(this, e, b)
	}
});
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(a) {
		Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(a, {
			reader :new Ext.data.JsonReader(a)
		}))
	}
});
Ext.reg("jsonstore", Ext.data.JsonStore);
Ext.data.XmlWriter = function(a) {
	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(b, c, a) {
						c = this.toArray(c);
						b.xmlData = this.tpl
								.applyTemplate( {
									version :this.xmlVersion,
									encoding :this.xmlEncoding,
									documentRoot :(c.length > 0 || this.forceDocumentRoot === true) ? this.documentRoot
											: false,
									record :this.meta.record,
									root :this.root,
									baseParams :c,
									records :(Ext.isArray(a[0])) ? a : [ a ]
								})
					},
					createRecord : function(a) {
						return this.toArray(this.toHash(a))
					},
					updateRecord : function(a) {
						return this.toArray(this.toHash(a))
					},
					destroyRecord : function(b) {
						var a = {};
						a[this.meta.idProperty] = b.id;
						return this.toArray(a)
					}
				});
Ext.data.XmlReader = function(a, b) {
	a = a || {};
	Ext.applyIf(a, {
		idProperty :a.idProperty || a.idPath || a.id,
		successProperty :a.successProperty || a.success
	});
	Ext.data.XmlReader.superclass.constructor.call(this, a, b || a.fields)
};
Ext
		.extend(
				Ext.data.XmlReader,
				Ext.data.DataReader,
				{
					read : function(a) {
						var b = a.responseXML;
						if (!b) {
							throw {
								message :"XmlReader.read: XML Document not available"
							}
						}
						return this.readRecords(b)
					},
					readRecords : function(d) {
						this.xmlData = d;
						var a = d.documentElement || d, c = Ext.DomQuery, g = 0, e = true;
						if (this.meta.totalProperty) {
							g = this.getTotal(a, 0)
						}
						if (this.meta.successProperty) {
							e = this.getSuccess(a)
						}
						var b = this.extractData(c.select(this.meta.record, a),
								true);
						return {
							success :e,
							records :b,
							totalRecords :g || b.length
						}
					},
					readResponse : function(g, b) {
						var e = Ext.DomQuery, h = b.responseXML, a = h.documentElement
								|| h;
						var c = new Ext.data.Response( {
							action :g,
							success :this.getSuccess(a),
							message :this.getMessage(a),
							data :this.extractData(e
									.select(this.meta.record, a)
									|| e.select(this.meta.root, a), false),
							raw :h
						});
						if (Ext.isEmpty(c.success)) {
							throw new Ext.data.DataReader.Error(
									"successProperty-response",
									this.meta.successProperty)
						}
						if (g === Ext.data.Api.actions.create) {
							var d = Ext.isDefined(c.data);
							if (d && Ext.isEmpty(c.data)) {
								throw new Ext.data.JsonReader.Error(
										"root-empty", this.meta.root)
							} else {
								if (!d) {
									throw new Ext.data.JsonReader.Error(
											"root-undefined-response",
											this.meta.root)
								}
							}
						}
						return c
					},
					getSuccess : function() {
						return true
					},
					buildExtractors : function() {
						if (this.ef) {
							return
						}
						var m = this.meta, h = this.recordType, e = h.prototype.fields, l = e.items, k = e.length;
						if (m.totalProperty) {
							this.getTotal = this
									.createAccessor(m.totalProperty)
						}
						if (m.successProperty) {
							this.getSuccess = this
									.createAccessor(m.successProperty)
						}
						if (m.messageProperty) {
							this.getMessage = this
									.createAccessor(m.messageProperty)
						}
						this.getRoot = function(g) {
							return (!Ext.isEmpty(g[this.meta.record])) ? g[this.meta.record]
									: g[this.meta.root]
						};
						if (m.idPath || m.idProperty) {
							var d = this.createAccessor(m.idPath
									|| m.idProperty);
							this.getId = function(g) {
								var i = d(g) || g.id;
								return (i === undefined || i === "") ? null : i
							}
						} else {
							this.getId = function() {
								return null
							}
						}
						var c = [];
						for ( var b = 0; b < k; b++) {
							e = l[b];
							var a = (e.mapping !== undefined && e.mapping !== null) ? e.mapping
									: e.name;
							c.push(this.createAccessor(a))
						}
						this.ef = c
					},
					createAccessor : function() {
						var a = Ext.DomQuery;
						return function(b) {
							if (Ext.isFunction(b)) {
								return b
							}
							switch (b) {
							case this.meta.totalProperty:
								return function(c, d) {
									return a.selectNumber(b, c, d)
								};
								break;
							case this.meta.successProperty:
								return function(d, e) {
									var c = a.selectValue(b, d, true);
									var g = c !== false && c !== "false";
									return g
								};
								break;
							default:
								return function(c, d) {
									return a.selectValue(b, c, d)
								};
								break
							}
						}
					}(),
					extractValues : function(h, d, a) {
						var g, c = {};
						for ( var e = 0; e < a; e++) {
							g = d[e];
							var b = this.ef[e](h);
							c[g.name] = g.convert((b !== undefined) ? b
									: g.defaultValue, h)
						}
						return c
					}
				});
Ext.data.XmlStore = Ext.extend(Ext.data.Store, {
	constructor : function(a) {
		Ext.data.XmlStore.superclass.constructor.call(this, Ext.apply(a, {
			reader :new Ext.data.XmlReader(a)
		}))
	}
});
Ext.reg("xmlstore", Ext.data.XmlStore);
Ext.data.GroupingStore = Ext
		.extend(
				Ext.data.Store,
				{
					constructor : function(d) {
						d = d || {};
						this.hasMultiSort = true;
						this.multiSortInfo = this.multiSortInfo || {
							sorters : []
						};
						var e = this.multiSortInfo.sorters, c = d.groupField
								|| this.groupField, b = d.sortInfo
								|| this.sortInfo, a = d.groupDir
								|| this.groupDir;
						if (c) {
							e.push( {
								field :c,
								direction :a
							})
						}
						if (b) {
							e.push(b)
						}
						Ext.data.GroupingStore.superclass.constructor.call(
								this, d);
						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 a = this.lastOptions;
							if (a && a.params) {
								delete a.params.groupBy;
								delete a.params.groupDir
							}
							this.reload()
						} else {
							this.sort();
							this.fireEvent("datachanged", this)
						}
					},
					groupBy : function(e, a, d) {
						d = d ? (String(d).toUpperCase() == "DESC" ? "DESC"
								: "ASC") : this.groupDir;
						if (this.groupField == e && this.groupDir == d && !a) {
							return
						}
						var c = this.multiSortInfo.sorters;
						if (c.length > 0 && c[0].field == this.groupField) {
							c.shift()
						}
						this.groupField = e;
						this.groupDir = d;
						this.applyGroupField();
						var b = function() {
							this.fireEvent("groupchange", this, this
									.getGroupState())
						};
						if (this.groupOnSort) {
							this.sort(e, d);
							b.call(this);
							return
						}
						if (this.remoteGroup) {
							this.on("load", b, this, {
								single :true
							});
							this.reload()
						} else {
							this.sort(c);
							b.call(this)
						}
					},
					sort : function(h, c) {
						if (this.remoteSort) {
							return Ext.data.GroupingStore.superclass.sort.call(
									this, h, c)
						}
						var g = [];
						if (Ext.isArray(arguments[0])) {
							g = arguments[0]
						} else {
							if (h == undefined) {
								g = this.sortInfo ? [ this.sortInfo ] : []
							} else {
								var e = this.fields.get(h);
								if (!e) {
									return false
								}
								var b = e.name, a = this.sortInfo || null, d = this.sortToggle ? this.sortToggle[b]
										: null;
								if (!c) {
									if (a && a.field == b) {
										c = (this.sortToggle[b] || "ASC")
												.toggle("ASC", "DESC")
									} else {
										c = e.sortDir
									}
								}
								this.sortToggle[b] = c;
								this.sortInfo = {
									field :b,
									direction :c
								};
								g = [ this.sortInfo ]
							}
						}
						if (this.groupField) {
							g.unshift( {
								direction :this.groupDir,
								field :this.groupField
							})
						}
						return this.multiSort.call(this, g, c)
					},
					applyGroupField : function() {
						if (this.remoteGroup) {
							if (!this.baseParams) {
								this.baseParams = {}
							}
							Ext.apply(this.baseParams, {
								groupBy :this.groupField,
								groupDir :this.groupDir
							});
							var a = this.lastOptions;
							if (a && a.params) {
								a.params.groupDir = this.groupDir;
								delete a.params.groupBy
							}
						}
					},
					applyGrouping : function(a) {
						if (this.groupField !== false) {
							this.groupBy(this.groupField, true, this.groupDir);
							return true
						} else {
							if (a === 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(a) {
	Ext.apply(this, a);
	if (typeof this.paramOrder == "string") {
		this.paramOrder = this.paramOrder.split(/[\s,|]/)
	}
	Ext.data.DirectProxy.superclass.constructor.call(this, a)
};
Ext.extend(Ext.data.DirectProxy, Ext.data.DataProxy, {
	paramOrder :undefined,
	paramsAsHash :true,
	directFn :undefined,
	doRequest : function(b, c, a, e, l, m, o) {
		var k = [], h = this.api[b] || this.directFn;
		switch (b) {
		case Ext.data.Api.actions.create:
			k.push(a.jsonData);
			break;
		case Ext.data.Api.actions.read:
			if (h.directCfg.method.len > 0) {
				if (this.paramOrder) {
					for ( var d = 0, g = this.paramOrder.length; d < g; d++) {
						k.push(a[this.paramOrder[d]])
					}
				} else {
					if (this.paramsAsHash) {
						k.push(a)
					}
				}
			}
			break;
		case Ext.data.Api.actions.update:
			k.push(a.jsonData);
			break;
		case Ext.data.Api.actions.destroy:
			k.push(a.jsonData);
			break
		}
		var n = {
			params :a || {},
			request : {
				callback :l,
				scope :m,
				arg :o
			},
			reader :e
		};
		k.push(this.createCallback(b, c, n), this);
		h.apply(window, k)
	},
	createCallback : function(d, a, b) {
		var c = this;
		return function(e, g) {
			if (!g.status) {
				if (d === Ext.data.Api.actions.read) {
					c.fireEvent("loadexception", c, b, g, null)
				}
				c.fireEvent("exception", c, "remote", d, b, g, null);
				b.request.callback.call(b.request.scope, null, b.request.arg,
						false);
				return
			}
			if (d === Ext.data.Api.actions.read) {
				c.onRead(d, b, e, g)
			} else {
				c.onWrite(d, b, e, g, a)
			}
		}
	},
	onRead : function(g, e, a, d) {
		var b;
		try {
			b = e.reader.readRecords(a)
		} catch (c) {
			this.fireEvent("loadexception", this, e, d, c);
			this.fireEvent("exception", this, "response", g, e, d, c);
			e.request.callback
					.call(e.request.scope, null, e.request.arg, false);
			return
		}
		this.fireEvent("load", this, d, e.request.arg);
		e.request.callback.call(e.request.scope, b, e.request.arg, true)
	},
	onWrite : function(g, d, a, c, b) {
		var e = d.reader.extractData(d.reader.getRoot(a), false);
		var h = d.reader.getSuccess(a);
		h = (h !== false);
		if (h) {
			this.fireEvent("write", this, g, e, c, b, d.request.arg)
		} else {
			this.fireEvent("exception", this, "remote", g, d, a, b)
		}
		d.request.callback.call(d.request.scope, e, c, h)
	}
});
Ext.data.DirectStore = Ext
		.extend(
				Ext.data.Store,
				{
					constructor : function(a) {
						var b = Ext.apply( {}, {
							batchTransactions :false
						}, a);
						Ext.data.DirectStore.superclass.constructor
								.call(
										this,
										Ext
												.apply(
														b,
														{
															proxy :Ext
																	.isDefined(b.proxy) ? b.proxy
																	: new Ext.data.DirectProxy(
																			Ext
																					.copyTo(
																							{},
																							b,
																							"paramOrder,paramsAsHash,directFn,api")),
															reader :(!Ext
																	.isDefined(b.reader) && b.fields) ? new Ext.data.JsonReader(
																	Ext
																			.copyTo(
																					{},
																					b,
																					"totalProperty,root,idProperty"),
																	b.fields)
																	: b.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(e) {
		var c = arguments;
		if (c.length > 1) {
			for ( var d = 0, b = c.length; d < b; d++) {
				this.addProvider(c[d])
			}
			return
		}
		if (!e.events) {
			e = new Ext.Direct.PROVIDERS[e.type](e)
		}
		e.id = e.id || Ext.id();
		this.providers[e.id] = e;
		e.on("data", this.onProviderData, this);
		e.on("exception", this.onProviderException, this);
		if (!e.isConnected()) {
			e.connect()
		}
		return e
	},
	getProvider : function(a) {
		return this.providers[a]
	},
	removeProvider : function(b) {
		var a = b.id ? b : this.providers[b];
		a.un("data", this.onProviderData, this);
		a.un("exception", this.onProviderException, this);
		delete this.providers[a.id];
		return a
	},
	addTransaction : function(a) {
		this.transactions[a.tid] = a;
		return a
	},
	removeTransaction : function(a) {
		delete this.transactions[a.tid || a];
		return a
	},
	getTransaction : function(a) {
		return this.transactions[a.tid || a]
	},
	onProviderData : function(d, c) {
		if (Ext.isArray(c)) {
			for ( var b = 0, a = c.length; b < a; b++) {
				this.onProviderData(d, c[b])
			}
			return
		}
		if (c.name && c.name != "event" && c.name != "exception") {
			this.fireEvent(c.name, c)
		} else {
			if (c.type == "exception") {
				this.fireEvent("exception", c)
			}
		}
		this.fireEvent("event", c, d)
	},
	createEvent : function(a, b) {
		return new Ext.Direct.eventTypes[a.type](Ext.apply(a, b))
	}
});
Ext.Direct = new Ext.Direct();
Ext.Direct.TID = 1;
Ext.Direct.PROVIDERS = {};
Ext.Direct.Transaction = function(a) {
	Ext.apply(this, a);
	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(a) {
	Ext.apply(this, a)
};
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(a) {
		Ext.apply(this, a);
		this.addEvents("connect", "disconnect", "data", "exception");
		Ext.direct.Provider.superclass.constructor.call(this, a)
	},
	isConnected : function() {
		return false
	},
	connect :Ext.emptyFn,
	disconnect :Ext.emptyFn
});
Ext.direct.JsonProvider = Ext.extend(Ext.direct.Provider, {
	parseResponse : function(a) {
		if (!Ext.isEmpty(a.responseText)) {
			if (typeof a.responseText == "object") {
				return a.responseText
			}
			return Ext.decode(a.responseText)
		}
		return null
	},
	getEvents : function(k) {
		var g = null;
		try {
			g = this.parseResponse(k)
		} catch (h) {
			var d = new Ext.Direct.ExceptionEvent( {
				data :h,
				xhr :k,
				code :Ext.Direct.exceptions.PARSE,
				message :"Error parsing json response: \n\n " + g
			});
			return [ d ]
		}
		var c = [];
		if (Ext.isArray(g)) {
			for ( var b = 0, a = g.length; b < a; b++) {
				c.push(Ext.Direct.createEvent(g[b]))
			}
		} else {
			c.push(Ext.Direct.createEvent(g))
		}
		return c
	}
});
Ext.direct.PollingProvider = Ext.extend(Ext.direct.JsonProvider, {
	priority :3,
	interval :3000,
	constructor : function(a) {
		Ext.direct.PollingProvider.superclass.constructor.call(this, a);
		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(d, k, h) {
		if (k) {
			var c = this.getEvents(h);
			for ( var b = 0, a = c.length; b < a; b++) {
				var g = c[b];
				this.fireEvent("data", this, g)
			}
		} else {
			var g = new Ext.Direct.ExceptionEvent( {
				data :g,
				code :Ext.Direct.exceptions.TRANSPORT,
				message :"Unable to connect to the server.",
				xhr :h
			});
			this.fireEvent("data", this, g)
		}
	}
});
Ext.Direct.PROVIDERS.polling = Ext.direct.PollingProvider;
Ext.direct.RemotingProvider = Ext
		.extend(
				Ext.direct.JsonProvider,
				{
					enableBuffer :10,
					maxRetries :1,
					timeout :undefined,
					constructor : function(a) {
						Ext.direct.RemotingProvider.superclass.constructor
								.call(this, a);
						this.addEvents("beforecall", "call");
						this.namespace = (Ext.isString(this.namespace)) ? Ext
								.ns(this.namespace) : this.namespace || window;
						this.transactions = {};
						this.callBuffer = []
					},
					initAPI : function() {
						var h = this.actions;
						for ( var k in h) {
							var d = this.namespace[k]
									|| (this.namespace[k] = {}), e = h[k];
							for ( var g = 0, b = e.length; g < b; g++) {
								var a = e[g];
								d[a.name] = this.createMethod(k, a)
							}
						}
					},
					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(a, h, k) {
						if (h) {
							var l = this.getEvents(k);
							for ( var b = 0, c = l.length; b < c; b++) {
								var d = l[b], m = this.getTransaction(d);
								this.fireEvent("data", this, d);
								if (m) {
									this.doCallback(m, d, true);
									Ext.Direct.removeTransaction(m)
								}
							}
						} else {
							var g = [].concat(a.ts);
							for ( var b = 0, c = g.length; b < c; b++) {
								var m = this.getTransaction(g[b]);
								if (m && m.retryCount < this.maxRetries) {
									m.retry()
								} else {
									var d = new Ext.Direct.ExceptionEvent(
											{
												data :d,
												transaction :m,
												code :Ext.Direct.exceptions.TRANSPORT,
												message :"Unable to connect to the server.",
												xhr :k
											});
									this.fireEvent("data", this, d);
									if (m) {
										this.doCallback(m, d, false);
										Ext.Direct.removeTransaction(m)
									}
								}
							}
						}
					},
					getCallData : function(a) {
						return {
							action :a.action,
							method :a.method,
							data :a.data,
							type :"rpc",
							tid :a.tid
						}
					},
					doSend : function(d) {
						var g = {
							url :this.url,
							callback :this.onData,
							scope :this,
							ts :d,
							timeout :this.timeout
						}, b;
						if (Ext.isArray(d)) {
							b = [];
							for ( var c = 0, a = d.length; c < a; c++) {
								b.push(this.getCallData(d[c]))
							}
						} else {
							b = this.getCallData(d)
						}
						if (this.enableUrlEncode) {
							var e = {};
							e[Ext.isString(this.enableUrlEncode) ? this.enableUrlEncode
									: "data"] = Ext.encode(b);
							g.params = e
						} else {
							g.jsonData = b
						}
						Ext.Ajax.request(g)
					},
					combineAndSend : function() {
						var a = this.callBuffer.length;
						if (a > 0) {
							this.doSend(a == 1 ? this.callBuffer[0]
									: this.callBuffer);
							this.callBuffer = []
						}
					},
					queueTransaction : function(a) {
						if (a.form) {
							this.processForm(a);
							return
						}
						this.callBuffer.push(a);
						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(i, a, b) {
						var h = null, e = b[a.len], g = b[a.len + 1];
						if (a.len !== 0) {
							h = b.slice(0, a.len)
						}
						var d = new Ext.Direct.Transaction( {
							provider :this,
							args :b,
							action :i,
							method :a.name,
							data :h,
							cb :g && Ext.isFunction(e) ? e.createDelegate(g)
									: e
						});
						if (this.fireEvent("beforecall", this, d, a) !== false) {
							Ext.Direct.addTransaction(d);
							this.queueTransaction(d);
							this.fireEvent("call", this, d, a)
						}
					},
					doForm : function(k, b, g, i, e) {
						var d = new Ext.Direct.Transaction( {
							provider :this,
							action :k,
							method :b.name,
							args : [ g, i, e ],
							cb :e && Ext.isFunction(i) ? i.createDelegate(e)
									: i,
							isForm :true
						});
						if (this.fireEvent("beforecall", this, d, b) !== false) {
							Ext.Direct.addTransaction(d);
							var a = String(g.getAttribute("enctype"))
									.toLowerCase() == "multipart/form-data", h = {
								extTID :d.tid,
								extAction :k,
								extMethod :b.name,
								extType :"rpc",
								extUpload :String(a)
							};
							Ext.apply(d, {
								form :Ext.getDom(g),
								isUpload :a,
								params :i && Ext.isObject(i.params) ? Ext
										.apply(h, i.params) : h
							});
							this.fireEvent("call", this, d, b);
							this.processForm(d)
						}
					},
					processForm : function(a) {
						Ext.Ajax.request( {
							url :this.url,
							params :a.params,
							callback :this.onData,
							scope :this,
							form :a.form,
							isUpload :a.isUpload,
							ts :a
						})
					},
					createMethod : function(d, a) {
						var b;
						if (!a.formHandler) {
							b = function() {
								this.doCall(d, a, Array.prototype.slice.call(
										arguments, 0))
							}.createDelegate(this)
						} else {
							b = function(e, g, c) {
								this.doForm(d, a, e, g, c)
							}.createDelegate(this)
						}
						b.directCfg = {
							action :d,
							method :a
						};
						return b
					},
					getTransaction : function(a) {
						return a && a.tid ? Ext.Direct.getTransaction(a.tid)
								: null
					},
					doCallback : function(c, g) {
						var d = g.status ? "success" : "failure";
						if (c && c.cb) {
							var b = c.cb, a = Ext.isDefined(g.result) ? g.result
									: g.data;
							if (Ext.isFunction(b)) {
								b(a, g)
							} else {
								Ext.callback(b[d], b.scope, [ a, g ]);
								Ext.callback(b.callback, b.scope, [ a, g ])
							}
						}
					}
				});
Ext.Direct.PROVIDERS.remoting = Ext.direct.RemotingProvider;
Ext.Resizable = Ext
		.extend(
				Ext.util.Observable,
				{
					constructor : function(d, e) {
						this.el = Ext.get(d);
						if (e && e.wrap) {
							e.resizeChild = this.el;
							this.el = this.el
									.wrap(typeof e.wrap == "object" ? e.wrap
											: {
												cls :"xresizable-wrap"
											});
							this.el.id = this.el.dom.id = e.resizeChild.id
									+ "-rzwrap";
							this.el.setStyle("overflow", "hidden");
							this.el.setPositioning(e.resizeChild
									.getPositioning());
							e.resizeChild.clearPositioning();
							if (!e.width || !e.height) {
								var g = e.resizeChild.getSize();
								this.el.setSize(g.width, g.height)
							}
							if (e.pinned && !e.adjustments) {
								e.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, e);
						if (this.pinned) {
							this.disableTrackOver = true;
							this.el.addClass("x-resizable-pinned")
						}
						var l = this.el.getStyle("position");
						if (l != "absolute" && l != "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 p = this.handles.split(/\s*?[,;]\s*?| /);
						var c = Ext.Resizable.positions;
						for ( var k = 0, m = p.length; k < m; k++) {
							if (p[k] && c[p[k]]) {
								var o = c[p[k]];
								this[o] = new Ext.Resizable.Handle(this, o,
										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 b = this.resizeChild;
							var n = this.west, h = this.east, a = this.north, p = this.south;
							if (b && (n || a)) {
								b.position("relative");
								b.setLeft(n ? n.el.getWidth() : 0);
								b.setTop(a ? a.el.getHeight() : 0)
							}
							this.adjustments = [
									(h ? -h.el.getWidth() : 0)
											+ (n ? -n.el.getWidth() : 0),
									(a ? -a.el.getHeight() : 0)
											+ (p ? -p.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(b, a) {
						this.el.setSize(b, a);
						this.updateChildSize();
						this.fireEvent("resize", this, b, a, null)
					},
					startSizing : function(c, b) {
						this.fireEvent("beforeresize", this, c);
						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", b.el
									.getStyle("cursor"));
							this.resizing = true;
							this.startBox = this.el.getBox();
							this.startPoint = c.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 a = Ext.get(this.constrainTo);
								this.resizeRegion = a.getRegion().adjust(
										a.getFrameWidth("t"),
										a.getFrameWidth("l"),
										-a.getFrameWidth("b"),
										-a.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(a, b) {
						if (this.enabled) {
							b.stopEvent();
							this.activeHandle = a;
							this.startSizing(b, a)
						}
					},
					onMouseUp : function(b) {
						this.activeHandle = null;
						var a = this.resizeElement();
						this.resizing = false;
						this.handleOut();
						this.overlay.hide();
						this.proxy.hide();
						this.fireEvent("resize", this, a.width, a.height, b)
					},
					updateChildSize : function() {
						if (this.resizeChild) {
							var d = this.el;
							var e = this.resizeChild;
							var c = this.adjustments;
							if (d.dom.offsetWidth) {
								var a = d.getSize(true);
								e.setSize(a.width + c[0], a.height + c[1])
							}
							if (Ext.isIE) {
								setTimeout( function() {
									if (d.dom.offsetWidth) {
										var g = d.getSize(true);
										e.setSize(g.width + c[0], g.height
												+ c[1])
									}
								}, 10)
							}
						}
					},
					snap : function(c, e, b) {
						if (!e || !c) {
							return c
						}
						var d = c;
						var a = c % e;
						if (a > 0) {
							if (a > (e / 2)) {
								d = c + (e - a)
							} else {
								d = c - a
							}
						}
						return Math.max(b, d)
					},
					resizeElement : function() {
						var a = this.proxy.getBox();
						if (this.updateBox) {
							this.el.setBox(a, false, this.animate,
									this.duration, null, this.easing)
						} else {
							this.el.setSize(a.width, a.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 a
					},
					constrain : function(b, c, a, d) {
						if (b - c < a) {
							c = b - a
						} else {
							if (b - c > d) {
								c = b - d
							}
						}
						return c
					},
					onMouseMove : function(A) {
						if (this.enabled && this.activeHandle) {
							try {
								if (this.resizeRegion
										&& !this.resizeRegion.contains(A
												.getPoint())) {
									return
								}
								var u = this.curSize || this.startBox, m = this.startBox.x, l = this.startBox.y, c = m, b = l, n = u.width, v = u.height, d = n, p = v, o = this.minWidth, B = this.minHeight, t = this.maxWidth, E = this.maxHeight, i = this.widthIncrement, a = this.heightIncrement, C = A
										.getXY(), s = -(this.startPoint[0] - Math
										.max(this.minX, C[0])), q = -(this.startPoint[1] - Math
										.max(this.minY, C[1])), k = this.activeHandle.position, F, g;
								switch (k) {
								case "east":
									n += s;
									n = Math.min(Math.max(o, n), t);
									break;
								case "south":
									v += q;
									v = Math.min(Math.max(B, v), E);
									break;
								case "southeast":
									n += s;
									v += q;
									n = Math.min(Math.max(o, n), t);
									v = Math.min(Math.max(B, v), E);
									break;
								case "north":
									q = this.constrain(v, q, B, E);
									l += q;
									v -= q;
									break;
								case "west":
									s = this.constrain(n, s, o, t);
									m += s;
									n -= s;
									break;
								case "northeast":
									n += s;
									n = Math.min(Math.max(o, n), t);
									q = this.constrain(v, q, B, E);
									l += q;
									v -= q;
									break;
								case "northwest":
									s = this.constrain(n, s, o, t);
									q = this.constrain(v, q, B, E);
									l += q;
									v -= q;
									m += s;
									n -= s;
									break;
								case "southwest":
									s = this.constrain(n, s, o, t);
									v += q;
									v = Math.min(Math.max(B, v), E);
									m += s;
									n -= s;
									break
								}
								var r = this.snap(n, i, o);
								var D = this.snap(v, a, B);
								if (r != n || D != v) {
									switch (k) {
									case "northeast":
										l -= D - v;
										break;
									case "north":
										l -= D - v;
										break;
									case "southwest":
										m -= r - n;
										break;
									case "west":
										m -= r - n;
										break;
									case "northwest":
										m -= r - n;
										l -= D - v;
										break
									}
									n = r;
									v = D
								}
								if (this.preserveRatio) {
									switch (k) {
									case "southeast":
									case "east":
										v = p * (n / d);
										v = Math.min(Math.max(B, v), E);
										n = d * (v / p);
										break;
									case "south":
										n = d * (v / p);
										n = Math.min(Math.max(o, n), t);
										v = p * (n / d);
										break;
									case "northeast":
										n = d * (v / p);
										n = Math.min(Math.max(o, n), t);
										v = p * (n / d);
										break;
									case "north":
										F = n;
										n = d * (v / p);
										n = Math.min(Math.max(o, n), t);
										v = p * (n / d);
										m += (F - n) / 2;
										break;
									case "southwest":
										v = p * (n / d);
										v = Math.min(Math.max(B, v), E);
										F = n;
										n = d * (v / p);
										m += F - n;
										break;
									case "west":
										g = v;
										v = p * (n / d);
										v = Math.min(Math.max(B, v), E);
										l += (g - v) / 2;
										F = n;
										n = d * (v / p);
										m += F - n;
										break;
									case "northwest":
										F = n;
										g = v;
										v = p * (n / d);
										v = Math.min(Math.max(B, v), E);
										n = d * (v / p);
										l += g - v;
										m += F - n;
										break
									}
								}
								this.proxy.setBounds(m, l, n, v);
								if (this.dynamic) {
									this.resizeElement()
								}
							} catch (z) {
							}
						}
					},
					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(b) {
						Ext.destroy(this.dd, this.overlay, this.proxy);
						this.overlay = null;
						this.proxy = null;
						var c = Ext.Resizable.positions;
						for ( var a in c) {
							if (typeof c[a] != "function" && this[c[a]]) {
								this[c[a]].destroy()
							}
						}
						if (b) {
							this.el.update("");
							Ext.destroy(this.el);
							this.el = null
						}
						this.purgeListeners()
					},
					syncHandleHeight : function() {
						var a = this.el.getHeight(true);
						if (this.west) {
							this.west.el.setHeight(a)
						}
						if (this.east) {
							this.east.el.setHeight(a)
						}
					}
				});
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(d, g, c, e, a) {
		if (!this.tpl) {
			var b = Ext.DomHelper.createTemplate( {
				tag :"div",
				cls :"x-resizable-handle x-resizable-handle-{0}"
			});
			b.compile();
			Ext.Resizable.Handle.prototype.tpl = b
		}
		this.position = g;
		this.rz = d;
		this.el = this.tpl.append(d.el.dom, [ this.position ], true);
		this.el.unselectable();
		if (e) {
			this.el.setOpacity(0)
		}
		if (!Ext.isEmpty(a)) {
			this.el.addClass(a)
		}
		this.el.on("mousedown", this.onMouseDown, this);
		if (!c) {
			this.el.on( {
				scope :this,
				mouseover :this.onMouseOver,
				mouseout :this.onMouseOut
			})
		}
	},
	afterResize : function(a) {
	},
	onMouseDown : function(a) {
		this.rz.onMouseDown(this, a)
	},
	onMouseOver : function(a) {
		this.rz.handleOver(this, a)
	},
	onMouseOut : function(a) {
		this.rz.handleOut(this, a)
	},
	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(b, a) {
		Ext.Window.superclass.onRender.call(this, b, a);
		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 a = this.getKeyMap();
			a.on(27, this.onEsc, this);
			a.disable()
		}
	},
	initDraggable : function() {
		this.dd = new Ext.Window.DD(this)
	},
	onEsc : function(a, b) {
		b.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 a = this.proxy.getBox();
		this.proxy.hide();
		this.window.handleResize(a);
		return a
	},
	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(b) {
		var a = this.resizeBox;
		if (a.x != b.x || a.y != b.y) {
			this.updateBox(b)
		} else {
			this.setSize(b);
			if (Ext.isIE6 && Ext.isStrict) {
				this.doLayout()
			}
		}
		this.focus();
		this.updateHandles();
		this.saveState()
	},
	focus : function() {
		var e = this.focusEl, a = this.defaultButton, c = typeof a, d, b;
		if (Ext.isDefined(a)) {
			if (Ext.isNumber(a) && this.fbar) {
				e = this.fbar.items.get(a)
			} else {
				if (Ext.isString(a)) {
					e = Ext.getCmp(a)
				} else {
					e = a
				}
			}
			d = e.getEl();
			b = Ext.getDom(this.container);
			if (d && b) {
				if (b != document.body
						&& !Ext.lib.Region.getRegion(b).contains(
								Ext.lib.Region.getRegion(d.dom))) {
					return
				}
			}
		}
		e = e || this.focusEl;
		e.focus.defer(10, e)
	},
	setAnimateTarget : function(a) {
		a = Ext.get(a);
		this.animateTarget = a
	},
	beforeShow : function() {
		delete this.el.lastXY;
		delete this.el.lastLT;
		if (this.x === undefined || this.y === undefined) {
			var a = this.el.getAlignToXY(this.container, "c-c");
			var b = this.el.translatePoints(a[0], a[1]);
			this.x = this.x === undefined ? b.left : this.x;
			this.y = this.y === undefined ? b.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(c, a, b) {
		if (!this.rendered) {
			this.render(Ext.getBody())
		}
		if (this.hidden === false) {
			this.toFront();
			return this
		}
		if (this.fireEvent("beforeshow", this) === false) {
			return this
		}
		if (a) {
			this.on("show", a, b, {
				single :true
			})
		}
		this.hidden = false;
		if (Ext.isDefined(c)) {
			this.setAnimateTarget(c)
		}
		this.beforeShow();
		if (this.animateTarget) {
			this.animShow()
		} else {
			this.afterShow()
		}
		return this
	},
	afterShow : function(b) {
		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 (b && (Ext.isIE || Ext.isWebKit)) {
			var a = this.getSize();
			this.onResize(a.width, a.height)
		}
		this.onShow();
		this.fireEvent("show", this)
	},
	animShow : function() {
		this.proxy.show();
		this.proxy.setBox(this.animateTarget.getBox());
		this.proxy.setOpacity(0);
		var a = this.getBox();
		this.el.setStyle("display", "none");
		this.proxy.shift(Ext.apply(a, {
			callback :this.afterShow.createDelegate(this, [ true ], false),
			scope :this,
			easing :"easeNone",
			duration :this.showAnimDuration,
			opacity :0.5
		}))
	},
	hide : function(c, a, b) {
		if (this.hidden || this.fireEvent("beforehide", this) === false) {
			return this
		}
		if (a) {
			this.on("hide", a, b, {
				single :true
			})
		}
		this.hidden = true;
		if (c !== undefined) {
			this.setAnimateTarget(c)
		}
		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 a = this.getBox(false);
		this.proxy.setBox(a);
		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 a = 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 b;
			if (this.constrain) {
				b = {
					right :this.el.shadowOffset,
					left :this.el.shadowOffset,
					bottom :this.el.shadowOffset
				}
			} else {
				var a = this.getSize();
				b = {
					right :-(a.width - 100),
					bottom :-(a.height - 25)
				}
			}
			var c = this.el.getConstrainToXY(this.container, true, b);
			if (c) {
				this.setPosition(c[0], c[1])
			}
		}
	},
	ghost : function(a) {
		var c = this.createGhost(a);
		var b = this.getBox(true);
		c.setLeftTop(b.x, b.y);
		c.setWidth(b.width);
		this.el.hide();
		this.activeGhost = c;
		return c
	},
	unghost : function(b, a) {
		if (!this.activeGhost) {
			return
		}
		if (b !== false) {
			this.el.show();
			this.focus.defer(10, this);
			if (Ext.isMac && Ext.isGecko2) {
				this.cascade(this.setAutoScroll)
			}
		}
		if (a !== 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 a = this.tools;
			this.el.removeClass("x-window-maximized");
			if (a.restore) {
				a.restore.hide()
			}
			if (a.maximize) {
				a.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 && a.toggle) {
				a.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 a = this.container.getViewSize(false);
		this.setSize(a.width, a.height)
	},
	setZIndex : function(a) {
		if (this.modal) {
			this.mask.setStyle("z-index", a)
		}
		this.el.setZIndex(++a);
		a += 5;
		if (this.resizer) {
			this.resizer.proxy.setStyle("z-index", ++a)
		}
		this.lastZIndex = a
	},
	alignTo : function(b, a, c) {
		var d = this.el.getAlignToXY(b, a, c);
		this.setPagePosition(d[0], d[1]);
		return this
	},
	anchorTo : function(c, e, d, b) {
		this.clearAnchor();
		this.anchorTarget = {
			el :c,
			alignment :e,
			offsets :d
		};
		Ext.EventManager.onWindowResize(this.doAnchor, this);
		var a = typeof b;
		if (a != "undefined") {
			Ext.EventManager.on(window, "scroll", this.doAnchor, this, {
				buffer :a == "number" ? b : 50
			})
		}
		return this.doAnchor()
	},
	doAnchor : function() {
		var a = this.anchorTarget;
		this.alignTo(a.el, a.alignment, a.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(a) {
		if (this.manager.bringToFront(this)) {
			if (!a || !a.getTarget().focus) {
				this.focus()
			}
		}
		return this
	},
	setActive : function(a) {
		if (a) {
			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 a = this.el.getAlignToXY(this.container, "c-c");
		this.setPagePosition(a[0], a[1]);
		return this
	}
});
Ext.reg("window", Ext.Window);
Ext.Window.DD = Ext.extend(Ext.dd.DD, {
	constructor : function(a) {
		this.win = a;
		Ext.Window.DD.superclass.constructor.call(this, a.el.id, "WindowDD-"
				+ a.id);
		this.setHandleElId(a.header.id);
		this.scroll = false
	},
	moveOnly :true,
	headerOffsets : [ 100, 25 ],
	startDrag : function() {
		var a = this.win;
		this.proxy = a.ghost(a.initialConfig.cls);
		if (a.constrain !== false) {
			var c = a.el.shadowOffset;
			this.constrainTo(a.container, {
				right :c,
				left :c,
				bottom :c
			})
		} else {
			if (a.constrainHeader !== false) {
				var b = this.proxy.getSize();
				this.constrainTo(a.container, {
					right :-(b.width - this.headerOffsets[0]),
					bottom :-(b.height - this.headerOffsets[1])
				})
			}
		}
	},
	b4Drag :Ext.emptyFn,
	onDrag : function(a) {
		this.alignElWithMouse(this.proxy, a.getPageX(), a.getPageY())
	},
	endDrag : function(a) {
		this.win.unghost();
		this.win.saveState()
	}
});
Ext.WindowGroup = function() {
	var g = {};
	var d = [];
	var e = null;
	var c = function(k, i) {
		return (!k._lastAccess || k._lastAccess < i._lastAccess) ? -1 : 1
	};
	var h = function() {
		var m = d, k = m.length;
		if (k > 0) {
			m.sort(c);
			var l = m[0].manager.zseed;
			for ( var n = 0; n < k; n++) {
				var o = m[n];
				if (o && !o.hidden) {
					o.setZIndex(l + (n * 10))
				}
			}
		}
		a()
	};
	var b = function(i) {
		if (i != e) {
			if (e) {
				e.setActive(false)
			}
			e = i;
			if (i) {
				i.setActive(true)
			}
		}
	};
	var a = function() {
		for ( var k = d.length - 1; k >= 0; --k) {
			if (!d[k].hidden) {
				b(d[k]);
				return
			}
		}
		b(null)
	};
	return {
		zseed :9000,
		register : function(i) {
			if (i.manager) {
				i.manager.unregister(i)
			}
			i.manager = this;
			g[i.id] = i;
			d.push(i);
			i.on("hide", a)
		},
		unregister : function(i) {
			delete i.manager;
			delete g[i.id];
			i.un("hide", a);
			d.remove(i)
		},
		get : function(i) {
			return typeof i == "object" ? i : g[i]
		},
		bringToFront : function(i) {
			i = this.get(i);
			if (i != e) {
				i._lastAccess = new Date().getTime();
				h();
				return true
			}
			return false
		},
		sendToBack : function(i) {
			i = this.get(i);
			i._lastAccess = -(new Date().getTime());
			h();
			return i
		},
		hideAll : function() {
			for ( var i in g) {
				if (g[i] && typeof g[i] != "function" && g[i].isVisible()) {
					g[i].hide()
				}
			}
		},
		getActive : function() {
			return e
		},
		getBy : function(m, l) {
			var n = [];
			for ( var k = d.length - 1; k >= 0; --k) {
				var o = d[k];
				if (m.call(l || o, o) !== false) {
					n.push(o)
				}
			}
			return n
		},
		each : function(k, i) {
			for ( var l in g) {
				if (g[l] && typeof g[l] != "function") {
					if (k.call(i || g[l], g[l]) === false) {
						return
					}
				}
			}
		}
	}
};
Ext.WindowMgr = new Ext.WindowGroup();
Ext.MessageBox = function() {
	var v, b, r, u, h, m, t, a, o, q, k, g, s, w, p, i = "", d = "", n = [
			"ok", "yes", "no", "cancel" ];
	var c = function(y) {
		s[y].blur();
		if (v.isVisible()) {
			v.hide();
			x();
			Ext.callback(b.fn, b.scope || window, [ y, w.dom.value, b ], 1)
		}
	};
	var x = function() {
		if (b && b.cls) {
			v.el.removeClass(b.cls)
		}
		o.reset()
	};
	var e = function(A, y, z) {
		if (b && b.closable !== false) {
			v.hide();
			x()
		}
		if (z) {
			z.stopEvent()
		}
	};
	var l = function(y) {
		var A = 0, z;
		if (!y) {
			Ext.each(n, function(B) {
				s[B].hide()
			});
			return A
		}
		v.footer.dom.style.display = "";
		Ext.iterate(s, function(B, C) {
			z = y[B];
			if (z) {
				C.show();
				C.setText(Ext.isString(z) ? z : Ext.MessageBox.buttonText[B]);
				A += C.getEl().getWidth() + 15
			} else {
				C.hide()
			}
		});
		return A
	};
	return {
		getDialog : function(y) {
			if (!v) {
				var A = [];
				s = {};
				Ext.each(n, function(B) {
					A.push(s[B] = new Ext.Button( {
						text :this.buttonText[B],
						handler :c.createCallback(B),
						hideMode :"offsets"
					}))
				}, this);
				v = new Ext.Window(
						{
							autoCreate :true,
							title :y,
							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 (b && b.buttons && b.buttons.no
										&& !b.buttons.cancel) {
									c("no")
								} else {
									c("cancel")
								}
							},
							fbar :new Ext.Toolbar( {
								items :A,
								enableOverflow :false
							})
						});
				v.render(document.body);
				v.getEl().addClass("x-window-dlg");
				r = v.mask;
				h = v.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>'
						});
				k = Ext.get(h.dom.firstChild);
				var z = h.dom.childNodes[1];
				m = Ext.get(z.firstChild);
				t = Ext.get(z.childNodes[2].firstChild);
				t.enableDisplayMode();
				t.addKeyListener( [ 10, 13 ], function() {
					if (v.isVisible() && b && b.buttons) {
						if (b.buttons.ok) {
							c("ok")
						} else {
							if (b.buttons.yes) {
								c("yes")
							}
						}
					}
				});
				a = Ext.get(z.childNodes[2].childNodes[1]);
				a.enableDisplayMode();
				o = new Ext.ProgressBar( {
					renderTo :h
				});
				h.createChild( {
					cls :"x-clear"
				})
			}
			return v
		},
		updateText : function(B) {
			if (!v.isVisible() && !b.width) {
				v.setSize(this.maxWidth, 100)
			}
			m.update(B ? B + " " : "&#160;");
			var z = d != "" ? (k.getWidth() + k.getMargins("lr")) : 0, D = m
					.getWidth()
					+ m.getMargins("lr"), A = v.getFrameWidth("lr"), C = v.body
					.getFrameWidth("lr"), y;
			y = Math.max(Math.min(b.width || z + D + A + C, b.maxWidth
					|| this.maxWidth), Math.max(b.minWidth || this.minWidth,
					p || 0));
			if (b.prompt === true) {
				w.setWidth(y - z - A - C)
			}
			if (b.progress === true || b.wait === true) {
				o.setSize(y - z - A - C)
			}
			if (Ext.isIE && y == p) {
				y += 4
			}
			m.update(B || "&#160;");
			v.setSize(y, "auto").center();
			return this
		},
		updateProgress : function(z, y, A) {
			o.updateProgress(z, y);
			if (A) {
				this.updateText(A)
			}
			return this
		},
		isVisible : function() {
			return v && v.isVisible()
		},
		hide : function() {
			var y = v ? v.activeGhost : null;
			if (this.isVisible() || y) {
				v.hide();
				x();
				if (y) {
					v.unghost(false, false)
				}
			}
			return this
		},
		show : function(B) {
			if (this.isVisible()) {
				this.hide()
			}
			b = B;
			var C = this.getDialog(b.title || "&#160;");
			C.setTitle(b.title || "&#160;");
			var y = (b.closable !== false && b.progress !== true && b.wait !== true);
			C.tools.close.setDisplayed(y);
			w = t;
			b.prompt = b.prompt || (b.multiline ? true : false);
			if (b.prompt) {
				if (b.multiline) {
					t.hide();
					a.show();
					a.setHeight(Ext.isNumber(b.multiline) ? b.multiline
							: this.defaultTextHeight);
					w = a
				} else {
					t.show();
					a.hide()
				}
			} else {
				t.hide();
				a.hide()
			}
			w.dom.value = b.value || "";
			if (b.prompt) {
				C.focusEl = w
			} else {
				var A = b.buttons;
				var z = null;
				if (A && A.ok) {
					z = s.ok
				} else {
					if (A && A.yes) {
						z = s.yes
					}
				}
				if (z) {
					C.focusEl = z
				}
			}
			if (Ext.isDefined(b.iconCls)) {
				C.setIconClass(b.iconCls)
			}
			this.setIcon(Ext.isDefined(b.icon) ? b.icon : i);
			p = l(b.buttons);
			o.setVisible(b.progress === true || b.wait === true);
			this.updateProgress(0, b.progressText);
			this.updateText(b.msg);
			if (b.cls) {
				C.el.addClass(b.cls)
			}
			C.proxyDrag = b.proxyDrag === true;
			C.modal = b.modal !== false;
			C.mask = b.modal !== false ? r : false;
			if (!C.isVisible()) {
				document.body.appendChild(v.el.dom);
				C.setAnimateTarget(b.animEl);
				C.on("show", function() {
					if (y === true) {
						C.keyMap.enable()
					} else {
						C.keyMap.disable()
					}
				}, this, {
					single :true
				});
				C.show(b.animEl)
			}
			if (b.wait === true) {
				o.wait(b.waitConfig)
			}
			return this
		},
		setIcon : function(y) {
			if (!v) {
				i = y;
				return
			}
			i = undefined;
			if (y && y != "") {
				k.removeClass("x-hidden");
				k.replaceClass(d, y);
				h.addClass("x-dlg-icon");
				d = y
			} else {
				k.replaceClass(d, "x-hidden");
				h.removeClass("x-dlg-icon");
				d = ""
			}
			return this
		},
		progress : function(A, z, y) {
			this.show( {
				title :A,
				msg :z,
				buttons :false,
				progress :true,
				closable :false,
				minWidth :this.minProgressWidth,
				progressText :y
			});
			return this
		},
		wait : function(A, z, y) {
			this.show( {
				title :z,
				msg :A,
				buttons :false,
				closable :false,
				wait :true,
				modal :true,
				minWidth :this.minProgressWidth,
				waitConfig :y
			});
			return this
		},
		alert : function(B, A, z, y) {
			this.show( {
				title :B,
				msg :A,
				buttons :this.OK,
				fn :z,
				scope :y,
				minWidth :this.minWidth
			});
			return this
		},
		confirm : function(B, A, z, y) {
			this.show( {
				title :B,
				msg :A,
				buttons :this.YESNO,
				fn :z,
				scope :y,
				icon :this.QUESTION,
				minWidth :this.minWidth
			});
			return this
		},
		prompt : function(D, C, A, z, y, B) {
			this.show( {
				title :D,
				msg :C,
				buttons :this.OKCANCEL,
				fn :A,
				minWidth :this.minPromptWidth,
				scope :z,
				prompt :true,
				multiline :y,
				value :B
			});
			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(a, b) {
		this.panel = a;
		this.id = this.panel.id + "-ddproxy";
		Ext.apply(this, b)
	},
	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(b, c, a) {
		this.hide();
		if (typeof c == "function") {
			c.call(a || this)
		}
	},
	moveProxy : function(a, b) {
		if (this.proxy) {
			a.insertBefore(this.proxy.dom, b)
		}
	}
});
Ext.Panel.DD = Ext.extend(Ext.dd.DragSource, {
	constructor : function(b, a) {
		this.panel = b;
		this.dragData = {
			panel :b
		};
		this.proxy = new Ext.dd.PanelProxy(b, a);
		Ext.Panel.DD.superclass.constructor.call(this, b.el, a);
		var d = b.header, c = b.body;
		if (d) {
			this.setHandleElId(d.id);
			c = b.header
		}
		c.setStyle("cursor", "move");
		this.scroll = false
	},
	showFrame :Ext.emptyFn,
	startDrag :Ext.emptyFn,
	b4StartDrag : function(a, b) {
		this.proxy.show()
	},
	b4MouseDown : function(b) {
		var a = b.getPageX(), c = b.getPageY();
		this.autoOffset(a, c)
	},
	onInitDrag : function(a, b) {
		this.onStartDrag(a, b);
		return true
	},
	createFrame :Ext.emptyFn,
	getDragEl : function(a) {
		return this.proxy.ghost.dom
	},
	endDrag : function(a) {
		this.proxy.hide();
		this.panel.saveState()
	},
	autoOffset : function(a, b) {
		a -= this.startPageX;
		b -= this.startPageY;
		this.setDelta(a, b)
	}
});
Ext.state.Provider = Ext.extend(Ext.util.Observable, {
	constructor : function() {
		this.addEvents("statechange");
		this.state = {};
		Ext.state.Provider.superclass.constructor.call(this)
	},
	get : function(b, a) {
		return typeof this.state[b] == "undefined" ? a : this.state[b]
	},
	clear : function(a) {
		delete this.state[a];
		this.fireEvent("statechange", this, a, null)
	},
	set : function(a, b) {
		this.state[a] = b;
		this.fireEvent("statechange", this, a, b)
	},
	decodeValue : function(b) {
		var e = /^(a|n|d|b|s|o|e)\:(.*)$/, h = e.exec(unescape(b)), d, c, a, g;
		if (!h || !h[1]) {
			return
		}
		c = h[1];
		a = h[2];
		switch (c) {
		case "e":
			return null;
		case "n":
			return parseFloat(a);
		case "d":
			return new Date(Date.parse(a));
		case "b":
			return (a == "1");
		case "a":
			d = [];
			if (a != "") {
				Ext.each(a.split("^"), function(i) {
					d.push(this.decodeValue(i))
				}, this)
			}
			return d;
		case "o":
			d = {};
			if (a != "") {
				Ext.each(a.split("^"), function(i) {
					g = i.split("=");
					d[g[0]] = this.decodeValue(g[1])
				}, this)
			}
			return d;
		default:
			return a
		}
	},
	encodeValue : function(c) {
		var b, g = "", e = 0, a, d;
		if (c == null) {
			return "e:1"
		} else {
			if (typeof c == "number") {
				b = "n:" + c
			} else {
				if (typeof c == "boolean") {
					b = "b:" + (c ? "1" : "0")
				} else {
					if (Ext.isDate(c)) {
						b = "d:" + c.toGMTString()
					} else {
						if (Ext.isArray(c)) {
							for (a = c.length; e < a; e++) {
								g += this.encodeValue(c[e]);
								if (e != a - 1) {
									g += "^"
								}
							}
							b = "a:" + g
						} else {
							if (typeof c == "object") {
								for (d in c) {
									if (typeof c[d] != "function"
											&& c[d] !== undefined) {
										g += d + "=" + this.encodeValue(c[d])
												+ "^"
									}
								}
								b = "o:" + g.substring(0, g.length - 1)
							} else {
								b = "s:" + c
							}
						}
					}
				}
			}
		}
		return escape(b)
	}
});
Ext.state.Manager = function() {
	var a = new Ext.state.Provider();
	return {
		setProvider : function(b) {
			a = b
		},
		get : function(c, b) {
			return a.get(c, b)
		},
		set : function(b, c) {
			a.set(b, c)
		},
		clear : function(b) {
			a.clear(b)
		},
		getProvider : function() {
			return a
		}
	}
}();
Ext.state.CookieProvider = Ext.extend(Ext.state.Provider, {
	constructor : function(a) {
		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, a);
		this.state = this.readCookies()
	},
	set : function(a, b) {
		if (typeof b == "undefined" || b === null) {
			this.clear(a);
			return
		}
		this.setCookie(a, b);
		Ext.state.CookieProvider.superclass.set.call(this, a, b)
	},
	clear : function(a) {
		this.clearCookie(a);
		Ext.state.CookieProvider.superclass.clear.call(this, a)
	},
	readCookies : function() {
		var d = {}, h = document.cookie + ";", b = /\s?(.*?)=(.*?);/g, g, a, e;
		while ((g = b.exec(h)) != null) {
			a = g[1];
			e = g[2];
			if (a && a.substring(0, 3) == "ys-") {
				d[a.substr(3)] = this.decodeValue(e)
			}
		}
		return d
	},
	setCookie : function(a, b) {
		document.cookie = "ys-"
				+ a
				+ "="
				+ this.encodeValue(b)
				+ ((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(a) {
		document.cookie = "ys-" + a
				+ "=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 b = this.getTemplateTarget(), a = this.store.getRange();
		b.update("");
		if (a.length < 1) {
			if (!this.deferEmptyText || this.hasSkippedEmptyText) {
				b.update(this.emptyText)
			}
			this.all.clear()
		} else {
			this.tpl.overwrite(b, this.collectData(a, 0));
			this.all.fill(Ext.query(this.itemSelector, b.dom));
			this.updateIndexes(0)
		}
		this.hasSkippedEmptyText = true
	},
	getTemplateTarget : function() {
		return this.el
	},
	prepareData : function(a) {
		return a
	},
	collectData : function(b, e) {
		var d = [], c = 0, a = b.length;
		for (; c < a; c++) {
			d[d.length] = this.prepareData(b[c].data, e + c, b[c])
		}
		return d
	},
	bufferRender : function(a, b) {
		var c = document.createElement("div");
		this.tpl.overwrite(c, this.collectData(a, b));
		return Ext.query(this.itemSelector, c)
	},
	onUpdate : function(g, a) {
		var b = this.store.indexOf(a);
		if (b > -1) {
			var e = this.isSelected(b), c = this.all.elements[b], d = this
					.bufferRender( [ a ], b)[0];
			this.all.replaceElement(b, d, true);
			if (e) {
				this.selected.replaceElement(c, d);
				this.all.item(b).addClass(this.selectedClass)
			}
			this.updateIndexes(b, b)
		}
	},
	onAdd : function(g, d, e) {
		if (this.all.getCount() === 0) {
			this.refresh();
			return
		}
		var c = this.bufferRender(d, e), h, b = this.all.elements;
		if (e < this.all.getCount()) {
			h = this.all.item(e).insertSibling(c, "before", true);
			b.splice.apply(b, [ e, 0 ].concat(c))
		} else {
			h = this.all.last().insertSibling(c, "after", true);
			b.push.apply(b, c)
		}
		this.updateIndexes(e)
	},
	onRemove : function(c, a, b) {
		this.deselect(b);
		this.all.removeElement(b, true);
		this.updateIndexes(b);
		if (this.store.getCount() === 0) {
			this.refresh()
		}
	},
	refreshNode : function(a) {
		this.onUpdate(this.store, this.store.getAt(a))
	},
	updateIndexes : function(d, c) {
		var b = this.all.elements;
		d = d || 0;
		c = c || ((c === 0) ? 0 : (b.length - 1));
		for ( var a = d; a <= c; a++) {
			b[a].viewIndex = a
		}
	},
	getStore : function() {
		return this.store
	},
	bindStore : function(a, b) {
		if (!b && this.store) {
			if (a !== 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 (!a) {
				this.store = null
			}
		}
		if (a) {
			a = Ext.StoreMgr.lookup(a);
			a.on( {
				scope :this,
				beforeload :this.onBeforeLoad,
				datachanged :this.onDataChanged,
				add :this.onAdd,
				remove :this.onRemove,
				update :this.onUpdate,
				clear :this.refresh
			})
		}
		this.store = a;
		if (a) {
			this.refresh()
		}
	},
	onDataChanged : function() {
		if (this.blockRefresh !== true) {
			this.refresh.apply(this, arguments)
		}
	},
	findItemFromChild : function(a) {
		return Ext.fly(a).findParent(this.itemSelector,
				this.getTemplateTarget())
	},
	onClick : function(c) {
		var b = c.getTarget(this.itemSelector, this.getTemplateTarget()), a;
		if (b) {
			a = this.indexOf(b);
			if (this.onItemClick(b, a, c) !== false) {
				this.fireEvent("click", this, a, b, c)
			}
		} else {
			if (this.fireEvent("containerclick", this, c) !== false) {
				this.onContainerClick(c)
			}
		}
	},
	onContainerClick : function(a) {
		this.clearSelections()
	},
	onContextMenu : function(b) {
		var a = b.getTarget(this.itemSelector, this.getTemplateTarget());
		if (a) {
			this.fireEvent("contextmenu", this, this.indexOf(a), a, b)
		} else {
			this.fireEvent("containercontextmenu", this, b)
		}
	},
	onDblClick : function(b) {
		var a = b.getTarget(this.itemSelector, this.getTemplateTarget());
		if (a) {
			this.fireEvent("dblclick", this, this.indexOf(a), a, b)
		}
	},
	onMouseOver : function(b) {
		var a = b.getTarget(this.itemSelector, this.getTemplateTarget());
		if (a && a !== this.lastItem) {
			this.lastItem = a;
			Ext.fly(a).addClass(this.overClass);
			this.fireEvent("mouseenter", this, this.indexOf(a), a, b)
		}
	},
	onMouseOut : function(a) {
		if (this.lastItem) {
			if (!a.within(this.lastItem, true, true)) {
				Ext.fly(this.lastItem).removeClass(this.overClass);
				this.fireEvent("mouseleave", this, this.indexOf(this.lastItem),
						this.lastItem, a);
				delete this.lastItem
			}
		}
	},
	onItemClick : function(b, a, c) {
		if (this.fireEvent("beforeclick", this, a, b, c) === false) {
			return false
		}
		if (this.multiSelect) {
			this.doMultiSelection(b, a, c);
			c.preventDefault()
		} else {
			if (this.singleSelect) {
				this.doSingleSelection(b, a, c);
				c.preventDefault()
			}
		}
		return true
	},
	doSingleSelection : function(b, a, c) {
		if (c.ctrlKey && this.isSelected(a)) {
			this.deselect(a)
		} else {
			this.select(a, false)
		}
	},
	doMultiSelection : function(c, a, d) {
		if (d.shiftKey && this.last !== false) {
			var b = this.last;
			this.selectRange(b, a, d.ctrlKey);
			this.last = b
		} else {
			if ((d.ctrlKey || this.simpleSelect) && this.isSelected(a)) {
				this.deselect(a)
			} else {
				this.select(a, d.ctrlKey || d.shiftKey || this.simpleSelect)
			}
		}
	},
	getSelectionCount : function() {
		return this.selected.getCount()
	},
	getSelectedNodes : function() {
		return this.selected.elements
	},
	getSelectedIndexes : function() {
		var b = [], d = this.selected.elements, c = 0, a = d.length;
		for (; c < a; c++) {
			b.push(d[c].viewIndex)
		}
		return b
	},
	getSelectedRecords : function() {
		return this.getRecords(this.selected.elements)
	},
	getRecords : function(c) {
		var b = [], d = 0, a = c.length;
		for (; d < a; d++) {
			b[b.length] = this.store.getAt(c[d].viewIndex)
		}
		return b
	},
	getRecord : function(a) {
		return this.store.getAt(a.viewIndex)
	},
	clearSelections : function(a, b) {
		if ((this.multiSelect || this.singleSelect)
				&& this.selected.getCount() > 0) {
			if (!b) {
				this.selected.removeClass(this.selectedClass)
			}
			this.selected.clear();
			this.last = false;
			if (!a) {
				this.fireEvent("selectionchange", this, this.selected.elements)
			}
		}
	},
	isSelected : function(a) {
		return this.selected.contains(this.getNode(a))
	},
	deselect : function(a) {
		if (this.isSelected(a)) {
			a = this.getNode(a);
			this.selected.removeElement(a);
			if (this.last == a.viewIndex) {
				this.last = false
			}
			Ext.fly(a).removeClass(this.selectedClass);
			this.fireEvent("selectionchange", this, this.selected.elements)
		}
	},
	select : function(d, g, b) {
		if (Ext.isArray(d)) {
			if (!g) {
				this.clearSelections(true)
			}
			for ( var c = 0, a = d.length; c < a; c++) {
				this.select(d[c], true, true)
			}
			if (!b) {
				this.fireEvent("selectionchange", this, this.selected.elements)
			}
		} else {
			var e = this.getNode(d);
			if (!g) {
				this.clearSelections(true)
			}
			if (e && !this.isSelected(e)) {
				if (this.fireEvent("beforeselect", this, e,
						this.selected.elements) !== false) {
					Ext.fly(e).addClass(this.selectedClass);
					this.selected.add(e);
					this.last = e.viewIndex;
					if (!b) {
						this.fireEvent("selectionchange", this,
								this.selected.elements)
					}
				}
			}
		}
	},
	selectRange : function(c, a, b) {
		if (!b) {
			this.clearSelections(true)
		}
		this.select(this.getNodes(c, a), true)
	},
	getNode : function(b) {
		if (Ext.isString(b)) {
			return document.getElementById(b)
		} else {
			if (Ext.isNumber(b)) {
				return this.all.elements[b]
			} else {
				if (b instanceof Ext.data.Record) {
					var a = this.store.indexOf(b);
					return this.all.elements[a]
				}
			}
		}
		return b
	},
	getNodes : function(e, a) {
		var d = this.all.elements, b = [], c;
		e = e || 0;
		a = !Ext.isDefined(a) ? Math.max(d.length - 1, 0) : a;
		if (e <= a) {
			for (c = e; c <= a && d[c]; c++) {
				b.push(d[c])
			}
		} else {
			for (c = e; c >= a && d[c]; c--) {
				b.push(d[c])
			}
		}
		return b
	},
	indexOf : function(a) {
		a = this.getNode(a);
		if (Ext.isNumber(a.viewIndex)) {
			return a.viewIndex
		}
		return this.all.indexOf(a)
	},
	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 l = this.columns, h = 0, k = 0, m = l.length, b = [];
						for ( var g = 0; g < m; g++) {
							var n = l[g];
							if (!n.isColumn) {
								n.xtype = n.xtype ? (/^lv/.test(n.xtype) ? n.xtype
										: "lv" + n.xtype)
										: "lvcolumn";
								n = Ext.create(n)
							}
							if (n.width) {
								h += n.width * 100;
								if (h > this.maxColumnWidth) {
									n.width -= (h - this.maxColumnWidth) / 100
								}
								k++
							}
							b.push(n)
						}
						l = this.columns = b;
						if (k < m) {
							var d = m - k;
							if (h < this.maxColumnWidth) {
								var a = ((this.maxColumnWidth - h) / d) / 100;
								for ( var e = 0; e < m; e++) {
									var n = l[e];
									if (!n.width) {
										n.width = a
									}
								}
							}
						}
						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 a = Ext.list.ListView.superclass.collectData.apply(
								this, arguments);
						return {
							columns :this.columns,
							rows :a
						}
					},
					verifyInternalSize : function() {
						if (this.lastSize) {
							this.onResize(this.lastSize.width,
									this.lastSize.height)
						}
					},
					onResize : function(c, e) {
						var b = this.innerBody.dom, g = this.innerHd.dom, d = c
								- Ext.num(this.scrollOffset, Ext
										.getScrollBarWidth()) + "px", a;
						if (!b) {
							return
						}
						a = b.parentNode;
						if (Ext.isNumber(c)) {
							if (this.reserveScrollOffset
									|| ((a.offsetWidth - a.clientWidth) > 10)) {
								b.style.width = d;
								g.style.width = d
							} else {
								b.style.width = c + "px";
								g.style.width = c + "px";
								setTimeout( function() {
									if ((a.offsetWidth - a.clientWidth) > 10) {
										b.style.width = d;
										g.style.width = d
									}
								}, 10)
							}
						}
						if (Ext.isNumber(e)) {
							a.style.height = Math.max(0, e
									- g.parentNode.offsetHeight)
									+ "px"
						}
					},
					updateIndexes : function() {
						Ext.list.ListView.superclass.updateIndexes.apply(this,
								arguments);
						this.verifyInternalSize()
					},
					findHeaderIndex : function(g) {
						g = g.dom || g;
						var a = g.parentNode, d = a.parentNode.childNodes, b = 0, e;
						for (; e = d[b]; b++) {
							if (e == a) {
								return b
							}
						}
						return -1
					},
					setHdWidths : function() {
						var d = this.innerHd.dom.getElementsByTagName("div"), c = 0, b = this.columns, a = b.length;
						for (; c < a; c++) {
							d[c].style.width = (b[c].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(a) {
		if (!a.tpl) {
			a.tpl = new Ext.XTemplate("{" + a.dataIndex + "}")
		} else {
			if (Ext.isString(a.tpl)) {
				a.tpl = new Ext.XTemplate(a.tpl)
			}
		}
		Ext.apply(this, a)
	}
});
Ext.reg("lvcolumn", Ext.list.Column);
Ext.list.NumberColumn = Ext.extend(Ext.list.Column, {
	format :"0,000.00",
	constructor : function(a) {
		a.tpl = a.tpl
				|| new Ext.XTemplate("{" + a.dataIndex + ':number("'
						+ (a.format || this.format) + '")}');
		Ext.list.NumberColumn.superclass.constructor.call(this, a)
	}
});
Ext.reg("lvnumbercolumn", Ext.list.NumberColumn);
Ext.list.DateColumn = Ext.extend(Ext.list.Column, {
	format :"m/d/Y",
	constructor : function(a) {
		a.tpl = a.tpl
				|| new Ext.XTemplate("{" + a.dataIndex + ':date("'
						+ (a.format || this.format) + '")}');
		Ext.list.DateColumn.superclass.constructor.call(this, a)
	}
});
Ext.reg("lvdatecolumn", Ext.list.DateColumn);
Ext.list.BooleanColumn = Ext
		.extend(
				Ext.list.Column,
				{
					trueText :"true",
					falseText :"false",
					undefinedText :"&#160;",
					constructor : function(e) {
						e.tpl = e.tpl
								|| new Ext.XTemplate("{" + e.dataIndex
										+ ":this.format}");
						var b = this.trueText, d = this.falseText, a = this.undefinedText;
						e.tpl.format = function(c) {
							if (c === undefined) {
								return a
							}
							if (!c || c === "false") {
								return d
							}
							return b
						};
						Ext.list.DateColumn.superclass.constructor
								.call(this, e)
					}
				});
Ext.reg("lvbooleancolumn", Ext.list.BooleanColumn);
Ext.list.ColumnResizer = Ext
		.extend(
				Ext.util.Observable,
				{
					minPct :0.05,
					constructor : function(a) {
						Ext.apply(this, a);
						Ext.list.ColumnResizer.superclass.constructor
								.call(this)
					},
					init : function(a) {
						this.view = a;
						a.on("render", this.initEvents, this)
					},
					initEvents : function(a) {
						a.mon(a.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(a.innerHd);
						a.on("beforedestroy", this.tracker.destroy,
								this.tracker)
					},
					handleHdMove : function(i, d) {
						var c = 5, b = i.getPageX(), k = i.getTarget("em", 3,
								true);
						if (k) {
							var h = k.getRegion(), g = k.dom.style, a = k.dom.parentNode;
							if (b - h.left <= c && a != a.parentNode.firstChild) {
								this.activeHd = Ext
										.get(a.previousSibling.firstChild);
								g.cursor = Ext.isWebKit ? "e-resize"
										: "col-resize"
							} else {
								if (h.right - b <= c
										&& a != a.parentNode.lastChild.previousSibling) {
									this.activeHd = k;
									g.cursor = Ext.isWebKit ? "w-resize"
											: "col-resize"
								} else {
									delete this.activeHd;
									g.cursor = ""
								}
							}
						}
					},
					onBeforeStart : function(a) {
						this.dragHd = this.activeHd;
						return !!this.dragHd
					},
					onStart : function(g) {
						var d = this, b = d.view, c = d.dragHd, a = d.tracker
								.getXY()[0];
						d.proxy = b.el.createChild( {
							cls :"x-list-resizer"
						});
						d.dragX = c.getX();
						d.headerIndex = b.findHeaderIndex(c);
						d.headersDisabled = b.disableHeaders;
						b.disableHeaders = true;
						d.proxy.setHeight(b.el.getHeight());
						d.proxy.setX(d.dragX);
						d.proxy.setWidth(a - d.dragX);
						this.setBoundaries()
					},
					setBoundaries : function(k) {
						var l = this.view, h = this.headerIndex, c = l.innerHd
								.getWidth(), k = l.innerHd.getX(), b = Math
								.ceil(c * this.minPct), m = c - b, e = l.columns.length, d = l.innerHd
								.select("em", true), g = b + k, a = m + k, i;
						if (e == 2) {
							this.minX = g;
							this.maxX = a
						} else {
							i = d.item(h + 2);
							this.minX = d.item(h).getX() + b;
							this.maxX = i ? i.getX() - b : a;
							if (h == 0) {
								this.minX = g
							} else {
								if (h == e - 2) {
									this.maxX = a
								}
							}
						}
					},
					onDrag : function(c) {
						var b = this, a = b.tracker.getXY()[0].constrain(
								b.minX, b.maxX);
						b.proxy.setWidth(a - this.dragX)
					},
					onEnd : function(i) {
						var g = this.proxy.getWidth(), h = this.headerIndex, m = this.view, c = m.columns, b = m.innerHd
								.getWidth(), l = Math.ceil(g * m.maxColumnWidth
								/ b) / 100, d = this.headersDisabled, n = c[h], k = c[h + 1], a = n.width
								+ k.width;
						this.proxy.remove();
						n.width = l;
						k.width = a - l;
						delete this.dragHd;
						m.setHdWidths();
						m.refresh();
						setTimeout( function() {
							m.disableHeaders = d
						}, 100)
					}
				});
Ext.ListView.ColumnResizer = Ext.list.ColumnResizer;
Ext.list.Sorter = Ext.extend(Ext.util.Observable, {
	sortClasses : [ "sort-asc", "sort-desc" ],
	constructor : function(a) {
		Ext.apply(this, a);
		Ext.list.Sorter.superclass.constructor.call(this)
	},
	init : function(a) {
		this.view = a;
		a.on("render", this.initEvents, this)
	},
	initEvents : function(a) {
		a.mon(a.innerHd, "click", this.onHdClick, this);
		a.innerHd.setStyle("cursor", "pointer");
		a.mon(a.store, "datachanged", this.updateSortState, this);
		this.updateSortState.defer(10, this, [ a.store ])
	},
	updateSortState : function(c) {
		var g = c.getSortState();
		if (!g) {
			return
		}
		this.sortState = g;
		var e = this.view.columns, h = -1;
		for ( var d = 0, a = e.length; d < a; d++) {
			if (e[d].dataIndex == g.field) {
				h = d;
				break
			}
		}
		if (h != -1) {
			var b = g.direction;
			this.updateSortIcon(h, b)
		}
	},
	updateSortIcon : function(b, a) {
		var d = this.sortClasses;
		var c = this.view.innerHd.select("em").removeClass(d);
		c.item(b).addClass(d[a == "DESC" ? 1 : 0])
	},
	onHdClick : function(c) {
		var b = c.getTarget("em", 3);
		if (b && !this.view.disableHeaders) {
			var a = this.view.findHeaderIndex(b);
			this.view.store.sort(this.view.columns[a].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(c, a) {
						Ext.TabPanel.superclass.onRender.call(this, c, a);
						if (this.plain) {
							var g = this.tabPosition == "top" ? "header"
									: "footer";
							this[g].addClass("x-tab-panel-" + g + "-plain")
						}
						var b = this[this.stripTarget];
						this.stripWrap = b.createChild( {
							cls :"x-tab-strip-wrap",
							cn : {
								tag :"ul",
								cls :"x-tab-strip x-tab-strip-"
										+ this.tabPosition
							}
						});
						var e = (this.tabPosition == "bottom" ? this.stripWrap
								: null);
						b.createChild( {
							cls :"x-tab-strip-spacer"
						}, e);
						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 d = 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>");
							d.disableFormats = true;
							d.compile();
							Ext.TabPanel.prototype.itemTpl = d
						}
						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 a = Ext.isObject(this.activeTab) ? this.activeTab
									: this.items.get(this.activeTab);
							delete this.activeTab;
							this.setActiveTab(a)
						}
					},
					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(c) {
						var b = null, a = c.getTarget("li:not(.x-tab-edge)",
								this.strip);
						if (a) {
							b = this
									.getComponent(a.id.split(this.idDelimiter)[1]);
							if (b.disabled) {
								return {
									close :null,
									item :null,
									el :null
								}
							}
						}
						return {
							close :c
									.getTarget(".x-tab-strip-close", this.strip),
							item :b,
							el :a
						}
					},
					onStripMouseDown : function(b) {
						if (b.button !== 0) {
							return
						}
						b.preventDefault();
						var a = this.findTargets(b);
						if (a.close) {
							if (a.item.fireEvent("beforeclose", a.item) !== false) {
								a.item.fireEvent("close", a.item);
								this.remove(a.item)
							}
							return
						}
						if (a.item && a.item != this.activeTab) {
							this.setActiveTab(a.item)
						}
					},
					onStripContextMenu : function(b) {
						b.preventDefault();
						var a = this.findTargets(b);
						if (a.item) {
							this.fireEvent("contextmenu", this, a.item, b)
						}
					},
					readTabs : function(d) {
						if (d === true) {
							this.items.each( function(h) {
								this.remove(h)
							}, this)
						}
						var c = this.el.query(this.autoTabSelector);
						for ( var b = 0, a = c.length; b < a; b++) {
							var e = c[b], g = e.getAttribute("title");
							e.removeAttribute("title");
							this.add( {
								title :g,
								contentEl :e
							})
						}
					},
					initTab : function(d, b) {
						var e = this.strip.dom.childNodes[b], g = this
								.getTemplateArgs(d), c = e ? this.itemTpl
								.insertBefore(e, g) : this.itemTpl.append(
								this.strip, g), a = "x-tab-strip-over", h = Ext
								.get(c);
						h.hover( function() {
							if (!d.disabled) {
								h.addClass(a)
							}
						}, function() {
							h.removeClass(a)
						});
						if (d.tabTip) {
							h.child("span.x-tab-strip-text", true).qtip = d.tabTip
						}
						d.tabEl = c;
						h.select("a").on("click", function(i) {
							if (!i.getPageX()) {
								this.onStripMouseDown(i)
							}
						}, this, {
							preventDefault :true
						});
						d.on( {
							scope :this,
							disable :this.onItemDisabled,
							enable :this.onItemEnabled,
							titlechange :this.onItemTitleChanged,
							iconchange :this.onItemIconChanged,
							beforeshow :this.onBeforeShowItem
						})
					},
					getTemplateArgs : function(b) {
						var a = b.closable ? "x-tab-strip-closable" : "";
						if (b.disabled) {
							a += " x-item-disabled"
						}
						if (b.iconCls) {
							a += " x-tab-with-icon"
						}
						if (b.tabCls) {
							a += " " + b.tabCls
						}
						return {
							id :this.id + this.idDelimiter + b.getItemId(),
							text :b.title,
							cls :a,
							iconCls :b.iconCls || ""
						}
					},
					onAdd : function(b) {
						Ext.TabPanel.superclass.onAdd.call(this, b);
						if (this.rendered) {
							var a = this.items;
							this.initTab(b, a.indexOf(b));
							this.delegateUpdates()
						}
					},
					onBeforeAdd : function(b) {
						var a = b.events ? (this.items.containsKey(b
								.getItemId()) ? b : null) : this.items.get(b);
						if (a) {
							this.setActiveTab(b);
							return false
						}
						Ext.TabPanel.superclass.onBeforeAdd.apply(this,
								arguments);
						var c = b.elements;
						b.elements = c ? c.replace(",header", "") : c;
						b.border = (b.border === true)
					},
					onRemove : function(d) {
						var b = Ext.get(d.tabEl);
						if (b) {
							b.select("a").removeAllListeners();
							Ext.destroy(b)
						}
						Ext.TabPanel.superclass.onRemove.call(this, d);
						this.stack.remove(d);
						delete d.tabEl;
						d.un("disable", this.onItemDisabled, this);
						d.un("enable", this.onItemEnabled, this);
						d.un("titlechange", this.onItemTitleChanged, this);
						d.un("iconchange", this.onItemIconChanged, this);
						d.un("beforeshow", this.onBeforeShowItem, this);
						if (d == this.activeTab) {
							var a = this.stack.next();
							if (a) {
								this.setActiveTab(a)
							} else {
								if (this.items.getCount() > 0) {
									this.setActiveTab(0)
								} else {
									this.setActiveTab(null)
								}
							}
						}
						if (!this.destroying) {
							this.delegateUpdates()
						}
					},
					onBeforeShowItem : function(a) {
						if (a != this.activeTab) {
							this.setActiveTab(a);
							return false
						}
					},
					onItemDisabled : function(b) {
						var a = this.getTabEl(b);
						if (a) {
							Ext.fly(a).addClass("x-item-disabled")
						}
						this.stack.remove(b)
					},
					onItemEnabled : function(b) {
						var a = this.getTabEl(b);
						if (a) {
							Ext.fly(a).removeClass("x-item-disabled")
						}
					},
					onItemTitleChanged : function(b) {
						var a = this.getTabEl(b);
						if (a) {
							Ext.fly(a).child("span.x-tab-strip-text", true).innerHTML = b.title
						}
					},
					onItemIconChanged : function(d, a, c) {
						var b = this.getTabEl(d);
						if (b) {
							b = Ext.get(b);
							b.child("span.x-tab-strip-text").replaceClass(c, a);
							b[Ext.isEmpty(a) ? "removeClass" : "addClass"]
									("x-tab-with-icon")
						}
					},
					getTabEl : function(a) {
						var b = this.getComponent(a);
						return b ? b.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(b) {
						b = this.getComponent(b);
						var a = this.getTabEl(b);
						if (a) {
							a.style.display = "none";
							this.delegateUpdates()
						}
						this.stack.remove(b)
					},
					unhideTabStripItem : function(b) {
						b = this.getComponent(b);
						var a = this.getTabEl(b);
						if (a) {
							a.style.display = "";
							this.delegateUpdates()
						}
					},
					delegateUpdates : function() {
						var a = this.rendered;
						if (this.suspendUpdates) {
							return
						}
						if (this.resizeTabs && a) {
							this.autoSizeTabs()
						}
						if (this.enableTabScroll && a) {
							this.autoScrollTabs()
						}
					},
					autoSizeTabs : function() {
						var h = this.items.length, b = this.tabPosition != "bottom" ? "header"
								: "footer", c = this[b].dom.offsetWidth, a = this[b].dom.clientWidth;
						if (!this.resizeTabs || h < 1 || !a) {
							return
						}
						var l = Math.max(Math.min(Math.floor((a - 4) / h)
								- this.tabMargin, this.tabWidth),
								this.minTabWidth);
						this.lastTabWidth = l;
						var n = this.strip.query("li:not(.x-tab-edge)");
						for ( var e = 0, k = n.length; e < k; e++) {
							var m = n[e], o = Ext.fly(m).child(
									".x-tab-strip-inner", true), g = m.offsetWidth, d = o.offsetWidth;
							o.style.width = (l - (g - d)) + "px"
						}
					},
					adjustBodyWidth : function(a) {
						if (this.header) {
							this.header.setWidth(a)
						}
						if (this.footer) {
							this.footer.setWidth(a)
						}
						return a
					},
					setActiveTab : function(c) {
						c = this.getComponent(c);
						if (this.fireEvent("beforetabchange", this, c,
								this.activeTab) === false) {
							return
						}
						if (!this.rendered) {
							this.activeTab = c;
							return
						}
						if (this.activeTab != c) {
							if (this.activeTab) {
								var a = this.getTabEl(this.activeTab);
								if (a) {
									Ext.fly(a)
											.removeClass("x-tab-strip-active")
								}
							}
							this.activeTab = c;
							if (c) {
								var b = this.getTabEl(c);
								Ext.fly(b).addClass("x-tab-strip-active");
								this.stack.add(c);
								this.layout.setActiveItem(c);
								this.delegateUpdates();
								if (this.scrolling) {
									this.scrollToTab(c, this.animScroll)
								}
							}
							this.fireEvent("tabchange", this, c)
						}
					},
					getActiveTab : function() {
						return this.activeTab || null
					},
					getItem : function(a) {
						return this.getComponent(a)
					},
					autoScrollTabs : function() {
						this.pos = this.tabPosition == "bottom" ? this.footer
								: this.header;
						var h = this.items.length, d = this.pos.dom.offsetWidth, c = this.pos.dom.clientWidth, g = this.stripWrap, e = g.dom, b = e.offsetWidth, i = this
								.getScrollPos(), a = this.edge
								.getOffsetsTo(this.stripWrap)[0]
								+ i;
						if (!this.enableTabScroll || b < 20) {
							return
						}
						if (h == 0 || a <= c) {
							e.scrollLeft = 0;
							g.setWidth(c);
							if (this.scrolling) {
								this.scrolling = false;
								this.pos.removeClass("x-tab-scrolling");
								this.scrollLeft.hide();
								this.scrollRight.hide();
								if (Ext.isAir || Ext.isWebKit) {
									e.style.marginLeft = "";
									e.style.marginRight = ""
								}
							}
						} else {
							if (!this.scrolling) {
								this.pos.addClass("x-tab-scrolling");
								if (Ext.isAir || Ext.isWebKit) {
									e.style.marginLeft = "18px";
									e.style.marginRight = "18px"
								}
							}
							c -= g.getMargins("lr");
							g.setWidth(c > 20 ? c : 20);
							if (!this.scrolling) {
								if (!this.scrollLeft) {
									this.createScrollers()
								} else {
									this.scrollLeft.show();
									this.scrollRight.show()
								}
							}
							this.scrolling = true;
							if (i > (a - c)) {
								e.scrollLeft = a - c
							} else {
								this.scrollToTab(this.activeTab, false)
							}
							this.updateScrollButtons()
						}
					},
					createScrollers : function() {
						this.pos
								.addClass("x-tab-scrolling-" + this.tabPosition);
						var c = this.stripWrap.dom.offsetHeight;
						var a = this.pos.insertFirst( {
							cls :"x-tab-scroller-left"
						});
						a.setHeight(c);
						a.addClassOnOver("x-tab-scroller-left-over");
						this.leftRepeater = new Ext.util.ClickRepeater(a, {
							interval :this.scrollRepeatInterval,
							handler :this.onScrollLeft,
							scope :this
						});
						this.scrollLeft = a;
						var b = this.pos.insertFirst( {
							cls :"x-tab-scroller-right"
						});
						b.setHeight(c);
						b.addClassOnOver("x-tab-scroller-right-over");
						this.rightRepeater = new Ext.util.ClickRepeater(b, {
							interval :this.scrollRepeatInterval,
							handler :this.onScrollRight,
							scope :this
						});
						this.scrollRight = b
					},
					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(e, a) {
						if (!e) {
							return
						}
						var c = this.getTabEl(e), h = this.getScrollPos(), d = this
								.getScrollArea(), g = Ext.fly(c).getOffsetsTo(
								this.stripWrap)[0]
								+ h, b = g + c.offsetWidth;
						if (g < h) {
							this.scrollTo(g, a)
						} else {
							if (b > (h + d)) {
								this.scrollTo(b - d, a)
							}
						}
					},
					scrollTo : function(b, a) {
						this.stripWrap.scrollTo("left", b, a ? this
								.getScrollAnim() : false);
						if (!a) {
							this.updateScrollButtons()
						}
					},
					onWheel : function(g) {
						var h = g.getWheelDelta() * this.wheelIncrement * -1;
						g.stopEvent();
						var i = this.getScrollPos(), c = i + h, a = this
								.getScrollWidth()
								- this.getScrollArea();
						var b = Math.max(0, Math.min(a, c));
						if (b != i) {
							this.scrollTo(b, false)
						}
					},
					onScrollRight : function() {
						var a = this.getScrollWidth() - this.getScrollArea(), c = this
								.getScrollPos(), b = Math.min(a, c
								+ this.getScrollIncrement());
						if (b != c) {
							this.scrollTo(b, this.animScroll)
						}
					},
					onScrollLeft : function() {
						var b = this.getScrollPos(), a = Math.max(0, b
								- this.getScrollIncrement());
						if (a != b) {
							this.scrollTo(a, this.animScroll)
						}
					},
					updateScrollButtons : function() {
						var a = this.getScrollPos();
						this.scrollLeft[a === 0 ? "addClass" : "removeClass"]
								("x-tab-scroller-left-disabled");
						this.scrollRight[a >= (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 a = [];
	return {
		add : function(b) {
			a.push(b);
			if (a.length > 10) {
				a.shift()
			}
		},
		remove : function(e) {
			var d = [];
			for ( var c = 0, b = a.length; c < b; c++) {
				if (a[c] != e) {
					d.push(a[c])
				}
			}
			a = d
		},
		next : function() {
			return a.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(c, a) {
						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 b, d = this.getTemplateArgs();
						if (a) {
							b = this.template.insertBefore(a, d, true)
						} else {
							b = this.template.append(c, d, true)
						}
						this.btnEl = b.child(this.buttonSelector);
						this.mon(this.btnEl, {
							scope :this,
							focus :this.onFocus,
							blur :this.onBlur
						});
						this.initButtonEl(b, this.btnEl);
						Ext.ButtonToggleMgr.register(this)
					},
					initButtonEl : function(b, c) {
						this.el = b;
						this.setIcon(this.icon);
						this.setText(this.text);
						this.setIconClass(this.iconCls);
						if (Ext.isDefined(this.tabIndex)) {
							c.dom.tabIndex = this.tabIndex
						}
						if (this.tooltip) {
							this.setTooltip(this.tooltip, true)
						}
						if (this.handleMouseEvents) {
							this.mon(b, {
								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 a = new Ext.util.ClickRepeater(b, Ext
									.isObject(this.repeat) ? this.repeat : {});
							this.mon(a, "click", this.onRepeatClick, this)
						} else {
							this.mon(b, 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(a) {
						this.iconCls = a;
						if (this.el) {
							this.btnEl.dom.className = "";
							this.btnEl.addClass( [ "x-btn-text", a || "" ]);
							this.setButtonClass()
						}
						return this
					},
					setTooltip : function(b, a) {
						if (this.rendered) {
							if (!a) {
								this.clearTip()
							}
							if (Ext.isObject(b)) {
								Ext.QuickTips.register(Ext.apply( {
									target :this.btnEl.id
								}, b));
								this.tooltip = b
							} else {
								this.btnEl.dom[this.tooltipType] = b
							}
						} else {
							this.tooltip = b
						}
						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 a = this.btnEl;
								if (a && a.getWidth() > 20) {
									a.clip();
									a.setWidth(Ext.util.TextMetrics.measure(a,
											this.text).width
											+ a.getFrameWidth("lr"))
								}
							}
							if (this.minWidth) {
								if (this.el.getWidth() < this.minWidth) {
									this.el.setWidth(this.minWidth)
								}
							}
						}
					},
					setHandler : function(b, a) {
						this.handler = b;
						this.scope = a;
						return this
					},
					setText : function(a) {
						this.text = a;
						if (this.el) {
							this.btnEl.update(a || "&#160;");
							this.setButtonClass()
						}
						this.doAutoWidth();
						return this
					},
					setIcon : function(a) {
						this.icon = a;
						if (this.el) {
							this.btnEl.setStyle("background-image", a ? "url("
									+ a + ")" : "");
							this.setButtonClass()
						}
						return this
					},
					getText : function() {
						return this.text
					},
					toggle : function(b, a) {
						b = b === undefined ? !this.pressed : !!b;
						if (b != this.pressed) {
							if (this.rendered) {
								this.el[b ? "addClass" : "removeClass"]
										("x-btn-pressed")
							}
							this.pressed = b;
							if (!a) {
								this.fireEvent("toggle", this, b);
								if (this.toggleHandler) {
									this.toggleHandler.call(this.scope || this,
											this, b)
								}
							}
						}
						return this
					},
					onDisable : function() {
						this.onDisableChange(true)
					},
					onEnable : function() {
						this.onDisableChange(false)
					},
					onDisableChange : function(a) {
						if (this.el) {
							if (!Ext.isIE6 || !this.text) {
								this.el[a ? "addClass" : "removeClass"]
										(this.disabledClass)
							}
							this.el.dom.disabled = a
						}
						this.disabled = a
					},
					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(a, b) {
						this.onClick(b)
					},
					onClick : function(a) {
						if (a) {
							a.preventDefault()
						}
						if (a.button !== 0) {
							return
						}
						if (!this.disabled) {
							this.doToggle();
							if (this.menu && !this.hasVisibleMenu()
									&& !this.ignoreNextClick) {
								this.showMenu()
							}
							this.fireEvent("click", this, a);
							if (this.handler) {
								this.handler.call(this.scope || this, this, a)
							}
						}
					},
					doToggle : function() {
						if (this.enableToggle
								&& (this.allowDepress !== false || !this.pressed)) {
							this.toggle()
						}
					},
					isMenuTriggerOver : function(b, a) {
						return this.menu && !a
					},
					isMenuTriggerOut : function(b, a) {
						return this.menu && !a
					},
					onMouseOver : function(b) {
						if (!this.disabled) {
							var a = b.within(this.el, true);
							if (!a) {
								this.el.addClass("x-btn-over");
								if (!this.monitoringMouseOver) {
									this.doc.on("mouseover",
											this.monitorMouseOver, this);
									this.monitoringMouseOver = true
								}
								this.fireEvent("mouseover", this, b)
							}
							if (this.isMenuTriggerOver(b, a)) {
								this.fireEvent("menutriggerover", this,
										this.menu, b)
							}
						}
					},
					monitorMouseOver : function(a) {
						if (a.target != this.el.dom && !a.within(this.el)) {
							if (this.monitoringMouseOver) {
								this.doc.un("mouseover", this.monitorMouseOver,
										this);
								this.monitoringMouseOver = false
							}
							this.onMouseOut(a)
						}
					},
					onMouseOut : function(b) {
						var a = b.within(this.el) && b.target != this.el.dom;
						this.el.removeClass("x-btn-over");
						this.fireEvent("mouseout", this, b);
						if (this.isMenuTriggerOut(b, a)) {
							this
									.fireEvent("menutriggerout", this,
											this.menu, b)
						}
					},
					focus : function() {
						this.btnEl.focus()
					},
					blur : function() {
						this.btnEl.blur()
					},
					onFocus : function(a) {
						if (!this.disabled) {
							this.el.addClass("x-btn-focus")
						}
					},
					onBlur : function(a) {
						this.el.removeClass("x-btn-focus")
					},
					getClickEl : function(b, a) {
						return this.el
					},
					onMouseDown : function(a) {
						if (!this.disabled && a.button === 0) {
							this.getClickEl(a).addClass("x-btn-click");
							this.doc.on("mouseup", this.onMouseUp, this)
						}
					},
					onMouseUp : function(a) {
						if (a.button === 0) {
							this.getClickEl(a, true).removeClass("x-btn-click");
							this.doc.un("mouseup", this.onMouseUp, this)
						}
					},
					onMenuShow : function(a) {
						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(a) {
						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 a = {};
	function b(e, k) {
		if (k) {
			var h = a[e.toggleGroup];
			for ( var d = 0, c = h.length; d < c; d++) {
				if (h[d] != e) {
					h[d].toggle(false)
				}
			}
		}
	}
	return {
		register : function(c) {
			if (!c.toggleGroup) {
				return
			}
			var d = a[c.toggleGroup];
			if (!d) {
				d = a[c.toggleGroup] = []
			}
			d.push(c);
			c.on("toggle", b)
		},
		unregister : function(c) {
			if (!c.toggleGroup) {
				return
			}
			var d = a[c.toggleGroup];
			if (d) {
				d.remove(c);
				c.un("toggle", b)
			}
		},
		getPressed : function(h) {
			var e = a[h];
			if (e) {
				for ( var d = 0, c = e.length; d < c; d++) {
					if (e[d].pressed === true) {
						return e[d]
					}
				}
			}
			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(b, a) {
						this.arrowHandler = b;
						this.scope = a
					},
					getMenuClass : function() {
						return "x-btn-split"
								+ (this.arrowAlign == "bottom" ? "-bottom" : "")
					},
					isClickOnArrow : function(c) {
						if (this.arrowAlign != "bottom") {
							var b = this.el.child("em.x-btn-split");
							var a = b.getRegion().right - b.getPadding("r");
							return c.getPageX() > a
						} else {
							return c.getPageY() > this.btnEl.getRegion().bottom
						}
					},
					onClick : function(b, a) {
						b.preventDefault();
						if (!this.disabled) {
							if (this.isClickOnArrow(b)) {
								if (this.menu && !this.menu.isVisible()
										&& !this.ignoreNextClick) {
									this.showMenu()
								}
								this.fireEvent("arrowclick", this, b);
								if (this.arrowHandler) {
									this.arrowHandler.call(this.scope || this,
											this, b)
								}
							} else {
								this.doToggle();
								this.fireEvent("click", this, b);
								if (this.handler) {
									this.handler.call(this.scope || this, this,
											b)
								}
							}
						}
					},
					isMenuTriggerOver : function(a) {
						return this.menu
								&& a.target.tagName == this.arrowSelector
					},
					isMenuTriggerOut : function(b, a) {
						return this.menu
								&& b.target.tagName != this.arrowSelector
					}
				});
Ext.reg("splitbutton", Ext.SplitButton);
Ext.CycleButton = Ext.extend(Ext.SplitButton, {
	getItemText : function(a) {
		if (a && this.showText === true) {
			var b = "";
			if (this.prependText) {
				b += this.prependText
			}
			b += a.text;
			return b
		}
		return undefined
	},
	setActiveItem : function(c, a) {
		if (!Ext.isObject(c)) {
			c = this.menu.getComponent(c)
		}
		if (c) {
			if (!this.rendered) {
				this.text = this.getItemText(c);
				this.iconCls = c.iconCls
			} else {
				var b = this.getItemText(c);
				if (b) {
					this.setText(b)
				}
				this.setIconClass(c.iconCls)
			}
			this.activeItem = c;
			if (!c.checked) {
				c.setChecked(true, false)
			}
			if (this.forceIcon) {
				this.setIconClass(this.forceIcon)
			}
			if (!a) {
				this.fireEvent("change", this, c)
			}
		}
	},
	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 a = 0;
		Ext.each(this.items, function(c, b) {
			Ext.apply(c, {
				group :c.group || this.id,
				itemIndex :b,
				checkHandler :this.checkHandler,
				scope :this,
				checked :c.checked || false
			});
			this.menu.items.push(c);
			if (c.checked) {
				a = b
			}
		}, this);
		Ext.CycleButton.superclass.initComponent.call(this);
		this.on("click", this.toggleSelected, this);
		this.setActiveItem(a, true)
	},
	checkHandler : function(a, b) {
		if (b) {
			this.setActiveItem(a)
		}
	},
	toggleSelected : function() {
		var a = this.menu;
		a.render();
		if (!a.hasLayout) {
			a.doLayout()
		}
		var d, b;
		for ( var c = 1; c < this.itemCount; c++) {
			d = (this.activeItem.itemIndex + c) % this.itemCount;
			b = a.items.itemAt(d);
			if (!b.disabled) {
				b.setChecked(true);
				break
			}
		}
	}
});
Ext.reg("cycle", Ext.CycleButton);
Ext.Toolbar = function(a) {
	if (Ext.isArray(a)) {
		a = {
			items :a,
			layout :"toolbar"
		}
	} else {
		a = Ext.apply( {
			layout :"toolbar"
		}, a);
		if (a.buttons) {
			a.items = a.buttons
		}
	}
	Ext.Toolbar.superclass.constructor.call(this, a)
};
( function() {
	var a = Ext.Toolbar;
	Ext.extend(a, Ext.Container, {
		defaultType :"button",
		enableOverflow :false,
		trackMenus :true,
		internalDefaults : {
			removeMode :"container",
			hideParent :true
		},
		toolbarCls :"x-toolbar",
		initComponent : function() {
			a.superclass.initComponent.call(this);
			this.addEvents("overflowchange")
		},
		onRender : function(c, b) {
			if (!this.el) {
				if (!this.autoCreate) {
					this.autoCreate = {
						cls :this.toolbarCls + " x-small-editor"
					}
				}
				this.el = c.createChild(Ext.apply( {
					id :this.id
				}, this.autoCreate), b);
				Ext.Toolbar.superclass.onRender.apply(this, arguments)
			}
		},
		lookupComponent : function(b) {
			if (Ext.isString(b)) {
				if (b == "-") {
					b = new a.Separator()
				} else {
					if (b == " ") {
						b = new a.Spacer()
					} else {
						if (b == "->") {
							b = new a.Fill()
						} else {
							b = new a.TextItem(b)
						}
					}
				}
				this.applyDefaults(b)
			} else {
				if (b.isFormField || b.render) {
					b = this.createComponent(b)
				} else {
					if (b.tag) {
						b = new a.Item( {
							autoEl :b
						})
					} else {
						if (b.tagName) {
							b = new a.Item( {
								el :b
							})
						} else {
							if (Ext.isObject(b)) {
								b = b.xtype ? this.createComponent(b) : this
										.constructButton(b)
							}
						}
					}
				}
			}
			return b
		},
		applyDefaults : function(e) {
			if (!Ext.isString(e)) {
				e = Ext.Toolbar.superclass.applyDefaults.call(this, e);
				var b = this.internalDefaults;
				if (e.events) {
					Ext.applyIf(e.initialConfig, b);
					Ext.apply(e, b)
				} else {
					Ext.applyIf(e, b)
				}
			}
			return e
		},
		addSeparator : function() {
			return this.add(new a.Separator())
		},
		addSpacer : function() {
			return this.add(new a.Spacer())
		},
		addFill : function() {
			this.add(new a.Fill())
		},
		addElement : function(b) {
			return this.addItem(new a.Item( {
				el :b
			}))
		},
		addItem : function(b) {
			return this.add.apply(this, arguments)
		},
		addButton : function(c) {
			if (Ext.isArray(c)) {
				var e = [];
				for ( var d = 0, b = c.length; d < b; d++) {
					e.push(this.addButton(c[d]))
				}
				return e
			}
			return this.add(this.constructButton(c))
		},
		addText : function(b) {
			return this.addItem(new a.TextItem(b))
		},
		addDom : function(b) {
			return this.add(new a.Item( {
				autoEl :b
			}))
		},
		addField : function(b) {
			return this.add(b)
		},
		insertButton : function(c, g) {
			if (Ext.isArray(g)) {
				var e = [];
				for ( var d = 0, b = g.length; d < b; d++) {
					e.push(this.insertButton(c + d, g[d]))
				}
				return e
			}
			return Ext.Toolbar.superclass.insert.call(this, c, g)
		},
		trackMenu : function(c, b) {
			if (this.trackMenus && c.menu) {
				var d = b ? "mun" : "mon";
				this[d](c, "menutriggerover", this.onButtonTriggerOver, this);
				this[d](c, "menushow", this.onButtonMenuShow, this);
				this[d](c, "menuhide", this.onButtonMenuHide, this)
			}
		},
		constructButton : function(d) {
			var c = d.events ? d : this.createComponent(d,
					d.split ? "splitbutton" : this.defaultType);
			return c
		},
		onAdd : function(b) {
			Ext.Toolbar.superclass.onAdd.call(this);
			this.trackMenu(b);
			if (this.disabled) {
				b.disable()
			}
		},
		onRemove : function(b) {
			Ext.Toolbar.superclass.onRemove.call(this);
			if (b == this.activeMenuBtn) {
				delete this.activeMenuBtn
			}
			this.trackMenu(b, true)
		},
		onDisable : function() {
			this.items.each( function(b) {
				if (b.disable) {
					b.disable()
				}
			})
		},
		onEnable : function() {
			this.items.each( function(b) {
				if (b.enable) {
					b.enable()
				}
			})
		},
		onButtonTriggerOver : function(b) {
			if (this.activeMenuBtn && this.activeMenuBtn != b) {
				this.activeMenuBtn.hideMenu();
				b.showMenu();
				this.activeMenuBtn = b
			}
		},
		onButtonMenuShow : function(b) {
			this.activeMenuBtn = b
		},
		onButtonMenuHide : function(b) {
			delete this.activeMenuBtn
		}
	});
	Ext.reg("toolbar", Ext.Toolbar);
	a.Item = Ext.extend(Ext.BoxComponent, {
		hideParent :true,
		enable :Ext.emptyFn,
		disable :Ext.emptyFn,
		focus :Ext.emptyFn
	});
	Ext.reg("tbitem", a.Item);
	a.Separator = Ext.extend(a.Item, {
		onRender : function(c, b) {
			this.el = c.createChild( {
				tag :"span",
				cls :"xtb-sep"
			}, b)
		}
	});
	Ext.reg("tbseparator", a.Separator);
	a.Spacer = Ext.extend(a.Item, {
		onRender : function(c, b) {
			this.el = c.createChild( {
				tag :"div",
				cls :"xtb-spacer",
				style :this.width ? "width:" + this.width + "px" : ""
			}, b)
		}
	});
	Ext.reg("tbspacer", a.Spacer);
	a.Fill = Ext.extend(a.Item, {
		render :Ext.emptyFn,
		isFill :true
	});
	Ext.reg("tbfill", a.Fill);
	a.TextItem = Ext.extend(a.Item, {
		constructor : function(b) {
			a.TextItem.superclass.constructor.call(this, Ext.isString(b) ? {
				text :b
			} : b)
		},
		onRender : function(c, b) {
			this.autoEl = {
				cls :"xtb-text",
				html :this.text || ""
			};
			a.TextItem.superclass.onRender.call(this, c, b)
		},
		setText : function(b) {
			if (this.rendered) {
				this.el.update(b)
			} else {
				this.text = b
			}
		}
	});
	Ext.reg("tbtext", a.TextItem);
	a.Button = Ext.extend(Ext.Button, {});
	a.SplitButton = Ext.extend(Ext.SplitButton, {});
	Ext.reg("tbbutton", a.Button);
	Ext.reg("tbsplit", a.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(b) {
		b = Ext.ButtonGroup.superclass.applyDefaults.call(this, b);
		var a = this.internalDefaults;
		if (b.events) {
			Ext.applyIf(b.initialConfig, a);
			Ext.apply(b, a)
		} else {
			Ext.applyIf(b, a)
		}
		return b
	},
	onAfterLayout : function() {
		var a = this.body.getFrameWidth("lr")
				+ this.body.dom.firstChild.offsetWidth;
		this.body.setWidth(a);
		this.el.setWidth(a + this.getFrameWidth())
	}
});
Ext.reg("buttongroup", Ext.ButtonGroup);
( function() {
	var a = 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 c = [ this.first = new a.Button( {
				tooltip :this.firstText,
				overflowText :this.firstText,
				iconCls :"x-tbar-page-first",
				disabled :true,
				handler :this.moveFirst,
				scope :this
			}), this.prev = new a.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 a.TextItem( {
						text :String.format(this.afterPageText, 1)
					}), "-", this.next = new a.Button( {
						tooltip :this.nextText,
						overflowText :this.nextText,
						iconCls :"x-tbar-page-next",
						disabled :true,
						handler :this.moveNext,
						scope :this
					}), this.last = new a.Button( {
						tooltip :this.lastText,
						overflowText :this.lastText,
						iconCls :"x-tbar-page-last",
						disabled :true,
						handler :this.moveLast,
						scope :this
					}), "-", this.refresh = new a.Button( {
						tooltip :this.refreshText,
						overflowText :this.refreshText,
						iconCls :"x-tbar-loading",
						handler :this.doRefresh,
						scope :this
					}) ];
			var b = this.items || this.buttons || [];
			if (this.prependButtons) {
				this.items = b.concat(c)
			} else {
				this.items = c.concat(b)
			}
			delete this.buttons;
			if (this.displayInfo) {
				this.items.push("->");
				this.items.push(this.displayItem = new a.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 b = this.store.getCount();
				var c = b == 0 ? this.emptyMsg : String.format(this.displayMsg,
						this.cursor + 1, this.cursor + b, this.store
								.getTotalCount());
				this.displayItem.setText(c)
			}
		},
		onLoad : function(b, e, k) {
			if (!this.rendered) {
				this.dsLoaded = [ b, e, k ];
				return
			}
			var g = this.getParams();
			this.cursor = (k.params && k.params[g.start]) ? k.params[g.start]
					: 0;
			var i = this.getPageData(), c = i.activePage, h = i.pages;
			this.afterTextItem.setText(String.format(this.afterPageText,
					i.pages));
			this.inputItem.setValue(c);
			this.first.setDisabled(c == 1);
			this.prev.setDisabled(c == 1);
			this.next.setDisabled(c == h);
			this.last.setDisabled(c == h);
			this.refresh.enable();
			this.updateInfo();
			this.fireEvent("change", this, i)
		},
		getPageData : function() {
			var b = this.store.getTotalCount();
			return {
				total :b,
				activePage :Math.ceil((this.cursor + this.pageSize)
						/ this.pageSize),
				pages :b < this.pageSize ? 1 : Math.ceil(b / this.pageSize)
			}
		},
		changePage : function(b) {
			this.doLoad(((b - 1) * this.pageSize).constrain(0, this.store
					.getTotalCount()))
		},
		onLoadError : function() {
			if (!this.rendered) {
				return
			}
			this.refresh.enable()
		},
		readPage : function(e) {
			var b = this.inputItem.getValue(), c;
			if (!b || isNaN(c = parseInt(b, 10))) {
				this.inputItem.setValue(e.activePage);
				return false
			}
			return c
		},
		onPagingFocus : function() {
			this.inputItem.select()
		},
		onPagingBlur : function(b) {
			this.inputItem.setValue(this.getPageData().activePage)
		},
		onPagingKeyDown : function(i, h) {
			var c = h.getKey(), l = this.getPageData(), g;
			if (c == h.RETURN) {
				h.stopEvent();
				g = this.readPage(l);
				if (g !== false) {
					g = Math.min(Math.max(1, g), l.pages) - 1;
					this.doLoad(g * this.pageSize)
				}
			} else {
				if (c == h.HOME || c == h.END) {
					h.stopEvent();
					g = c == h.HOME ? 1 : l.pages;
					i.setValue(g)
				} else {
					if (c == h.UP || c == h.PAGEUP || c == h.DOWN
							|| c == h.PAGEDOWN) {
						h.stopEvent();
						if ((g = this.readPage(l))) {
							var b = h.shiftKey ? 10 : 1;
							if (c == h.DOWN || c == h.PAGEDOWN) {
								b *= -1
							}
							g += b;
							if (g >= 1 & g <= l.pages) {
								i.setValue(g)
							}
						}
					}
				}
			}
		},
		getParams : function() {
			return this.paramNames || this.store.paramNames
		},
		beforeLoad : function() {
			if (this.rendered && this.refresh) {
				this.refresh.disable()
			}
		},
		doLoad : function(d) {
			var c = {}, b = this.getParams();
			c[b.start] = d;
			c[b.limit] = this.pageSize;
			if (this.fireEvent("beforechange", this, c) !== false) {
				this.store.load( {
					params :c
				})
			}
		},
		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 c = this.store.getTotalCount(), b = c % this.pageSize;
			this.doLoad(b ? (c - b) : c - this.pageSize)
		},
		doRefresh : function() {
			this.doLoad(this.cursor)
		},
		bindStore : function(c, d) {
			var b;
			if (!d && this.store) {
				if (c !== 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 (!c) {
					this.store = null
				}
			}
			if (c) {
				c = Ext.StoreMgr.lookup(c);
				c.on( {
					scope :this,
					beforeload :this.beforeLoad,
					load :this.onLoad,
					exception :this.onLoadError
				});
				b = true
			}
			this.store = c;
			if (b) {
				this.onLoad(c, null, {})
			}
		},
		unbind : function(b) {
			this.bindStore(null)
		},
		bind : function(b) {
			this.bindStore(b)
		},
		onDestroy : function() {
			this.bindStore(null);
			Ext.PagingToolbar.superclass.onDestroy.call(this)
		}
	})
})();
Ext.reg("paging", Ext.PagingToolbar);
Ext.History = ( function() {
	var e, c;
	var l = false;
	var d;
	function g() {
		var m = location.href, n = m.indexOf("#");
		return n >= 0 ? m.substr(n + 1) : null
	}
	function a() {
		c.value = d
	}
	function h(m) {
		d = m;
		Ext.History.fireEvent("change", m)
	}
	function i(n) {
		var m = [ '<html><body><div id="state">',
				Ext.util.Format.htmlEncode(n), "</div></body></html>" ]
				.join("");
		try {
			var p = e.contentWindow.document;
			p.open();
			p.write(m);
			p.close();
			return true
		} catch (o) {
			return false
		}
	}
	function b() {
		if (!e.contentWindow || !e.contentWindow.document) {
			setTimeout(b, 10);
			return
		}
		var p = e.contentWindow.document;
		var n = p.getElementById("state");
		var m = n ? n.innerText : null;
		var o = g();
		setInterval( function() {
			p = e.contentWindow.document;
			n = p.getElementById("state");
			var r = n ? n.innerText : null;
			var q = g();
			if (r !== m) {
				m = r;
				h(m);
				top.location.hash = m;
				o = m;
				a()
			} else {
				if (q !== o) {
					o = q;
					i(q)
				}
			}
		}, 50);
		l = true;
		Ext.History.fireEvent("ready", Ext.History)
	}
	function k() {
		d = c.value ? c.value : g();
		if (Ext.isIE) {
			b()
		} else {
			var m = g();
			setInterval( function() {
				var n = g();
				if (n !== m) {
					m = n;
					h(m);
					a()
				}
			}, 50);
			l = true;
			Ext.History.fireEvent("ready", Ext.History)
		}
	}
	return {
		fieldId :"x-history-field",
		iframeId :"x-history-frame",
		events : {},
		init : function(n, m) {
			if (l) {
				Ext.callback(n, m, [ this ]);
				return
			}
			if (!Ext.isReady) {
				Ext.onReady( function() {
					Ext.History.init(n, m)
				});
				return
			}
			c = Ext.getDom(Ext.History.fieldId);
			if (Ext.isIE) {
				e = Ext.getDom(Ext.History.iframeId)
			}
			this.addEvents("ready", "change");
			if (n) {
				this.on("ready", n, m, {
					single :true
				})
			}
			k()
		},
		add : function(m, n) {
			if (n !== false) {
				if (this.getToken() == m) {
					return true
				}
			}
			if (Ext.isIE) {
				return i(m)
			} else {
				top.location.hash = m;
				return true
			}
		},
		back : function() {
			history.go(-1)
		},
		forward : function() {
			history.go(1)
		},
		getToken : function() {
			return l ? d : g()
		}
	}
})();
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(a) {
						Ext.Tip.superclass.show.call(this);
						if (this.measureWidth !== false
								&& (!this.initialConfig || typeof this.initialConfig.width != "number")) {
							this.doAutoWidth()
						}
						if (this.constrainPosition) {
							a = this.el.adjustForConstraints(a)
						}
						this.setPagePosition(a[0], a[1])
					},
					doAutoWidth : function(a) {
						a = a || 0;
						var b = this.body.getTextWidth();
						if (this.title) {
							b = Math.max(b, this.header.child("span")
									.getTextWidth(this.title))
						}
						b += this.getFrameWidth() + (this.closable ? 20 : 0)
								+ this.body.getPadding("lr") + a;
						this
								.setWidth(b.constrain(this.minWidth,
										this.maxWidth));
						if (Ext.isIE7 && !this.repainted) {
							this.el.repaint();
							this.repainted = true
						}
					},
					showBy : function(a, b) {
						if (!this.rendered) {
							this.render(Ext.getBody())
						}
						this.showAt(this.el.getAlignToXY(a, b
								|| 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(b, a) {
	Ext.apply(this, a);
	this.tip = b;
	Ext.Tip.DD.superclass.constructor.call(this, b.el.id, "WindowDD-" + b.id);
	this.setHandleElId(b.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(a) {
		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(b, a) {
						Ext.ToolTip.superclass.onRender.call(this, b, a);
						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(c) {
						var a;
						if ((a = Ext.get(c))) {
							if (this.target) {
								var b = Ext.get(this.target);
								this.mun(b, "mouseover", this.onTargetOver,
										this);
								this.mun(b, "mouseout", this.onTargetOut, this);
								this
										.mun(b, "mousemove", this.onMouseMove,
												this)
							}
							this.mon(a, {
								mouseover :this.onTargetOver,
								mouseout :this.onTargetOut,
								mousemove :this.onMouseMove,
								scope :this
							});
							this.target = a
						}
						if (this.anchor) {
							this.anchorTarget = this.target
						}
					},
					onMouseMove : function(b) {
						var a = this.delegate ? b.getTarget(this.delegate)
								: this.triggerElement = true;
						if (a) {
							this.targetXY = b.getXY();
							if (a === this.triggerElement) {
								if (!this.hidden && this.trackMouse) {
									this.setPagePosition(this.getTargetXY())
								}
							} else {
								this.hide();
								this.lastActive = new Date(0);
								this.onTargetOver(b)
							}
						} else {
							if (!this.closable && this.isVisible()) {
								this.hide()
							}
						}
					},
					getTargetXY : function() {
						if (this.delegate) {
							this.anchorTarget = this.triggerElement
						}
						if (this.anchor) {
							this.targetCounter++;
							var c = this.getOffsets(), m = (this.anchorToTarget && !this.trackMouse) ? this.el
									.getAlignToXY(this.anchorTarget, this
											.getAnchorAlign())
									: this.targetXY, a = Ext.lib.Dom
									.getViewWidth() - 5, h = Ext.lib.Dom
									.getViewHeight() - 5, i = document.documentElement, e = document.body, l = (i.scrollLeft
									|| e.scrollLeft || 0) + 5, k = (i.scrollTop
									|| e.scrollTop || 0) + 5, b = [
									m[0] + c[0], m[1] + c[1] ], g = this
									.getSize();
							this.anchorEl.removeClass(this.anchorCls);
							if (this.targetCounter < 2) {
								if (b[0] < l) {
									if (this.anchorToTarget) {
										this.defaultAlign = "l-r";
										if (this.mouseOffset) {
											this.mouseOffset[0] *= -1
										}
									}
									this.anchor = "left";
									return this.getTargetXY()
								}
								if (b[0] + g.width > a) {
									if (this.anchorToTarget) {
										this.defaultAlign = "r-l";
										if (this.mouseOffset) {
											this.mouseOffset[0] *= -1
										}
									}
									this.anchor = "right";
									return this.getTargetXY()
								}
								if (b[1] < k) {
									if (this.anchorToTarget) {
										this.defaultAlign = "t-b";
										if (this.mouseOffset) {
											this.mouseOffset[1] *= -1
										}
									}
									this.anchor = "top";
									return this.getTargetXY()
								}
								if (b[1] + g.height > h) {
									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 b
						} else {
							var d = this.getMouseOffset();
							return [ this.targetXY[0] + d[0],
									this.targetXY[1] + d[1] ]
						}
					},
					getMouseOffset : function() {
						var a = this.anchor ? [ 0, 0 ] : [ 15, 18 ];
						if (this.mouseOffset) {
							a[0] += this.mouseOffset[0];
							a[1] += this.mouseOffset[1]
						}
						return a
					},
					getAnchorPosition : function() {
						if (this.anchor) {
							this.tipAnchor = this.anchor.charAt(0)
						} else {
							var a = this.defaultAlign
									.match(/^([a-z]+)-([a-z]+)(\?)?$/);
							if (!a) {
								throw "AnchorTip.defaultAlign is invalid"
							}
							this.tipAnchor = a[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 b, a = this.getAnchorPosition().charAt(0);
						if (this.anchorToTarget && !this.trackMouse) {
							switch (a) {
							case "t":
								b = [ 0, 9 ];
								break;
							case "b":
								b = [ 0, -13 ];
								break;
							case "r":
								b = [ -13, 0 ];
								break;
							default:
								b = [ 9, 0 ];
								break
							}
						} else {
							switch (a) {
							case "t":
								b = [ -15 - this.anchorOffset, 30 ];
								break;
							case "b":
								b = [ -19 - this.anchorOffset,
										-13 - this.el.dom.offsetHeight ];
								break;
							case "r":
								b = [ -15 - this.el.dom.offsetWidth,
										-13 - this.anchorOffset ];
								break;
							default:
								b = [ 25, -13 - this.anchorOffset ];
								break
							}
						}
						var c = this.getMouseOffset();
						b[0] += c[0];
						b[1] += c[1];
						return b
					},
					onTargetOver : function(b) {
						if (this.disabled || b.within(this.target.dom, true)) {
							return
						}
						var a = b.getTarget(this.delegate);
						if (a) {
							this.triggerElement = a;
							this.clearTimer("hide");
							this.targetXY = b.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(a) {
						if (this.disabled || a.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(a) {
						this.lastActive = new Date();
						this.clearTimers();
						Ext.ToolTip.superclass.showAt.call(this, a);
						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 a, b, c;
						switch (this.tipAnchor.charAt(0)) {
						case "t":
							a = "b";
							b = "tl";
							c = [ 20 + this.anchorOffset, 2 ];
							break;
						case "r":
							a = "l";
							b = "tr";
							c = [ -2, 11 + this.anchorOffset ];
							break;
						case "b":
							a = "t";
							b = "bl";
							c = [ 20 + this.anchorOffset, -2 ];
							break;
						default:
							a = "r";
							b = "tl";
							c = [ 2, 11 + this.anchorOffset ];
							break
						}
						this.anchorEl.alignTo(this.el, a + "-" + b, c)
					},
					setPagePosition : function(a, b) {
						Ext.ToolTip.superclass.setPagePosition.call(this, a, b);
						if (this.anchor) {
							this.syncAnchor()
						}
					},
					clearTimer : function(a) {
						a = a + "Timer";
						clearTimeout(this[a]);
						delete this[a]
					},
					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(a) {
						if (this.autoHide !== true && !this.closable
								&& !a.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(a, d) {
						if (this.contstrainPosition) {
							var c = this.targetXY[1], b = this.getSize().height;
							if (d <= c && (d + b) >= c) {
								d = c - b - 5
							}
						}
						return {
							x :a,
							y :d
						}
					},
					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(e) {
		var h = Ext.isArray(e) ? e : arguments;
		for ( var g = 0, a = h.length; g < a; g++) {
			var l = h[g];
			var k = l.target;
			if (k) {
				if (Ext.isArray(k)) {
					for ( var d = 0, b = k.length; d < b; d++) {
						this.targets[Ext.id(k[d])] = l
					}
				} else {
					this.targets[Ext.id(k)] = l
				}
			}
		}
	},
	unregister : function(a) {
		delete this.targets[Ext.id(a)]
	},
	cancelShow : function(b) {
		var a = this.activeTarget;
		b = Ext.get(b).dom;
		if (this.isVisible()) {
			if (a && a.el == b) {
				this.hide()
			}
		} else {
			if (a && a.el == b) {
				this.clearTimer("show")
			}
		}
	},
	getTipCfg : function(d) {
		var b = d.getTarget(), c, a;
		if (this.interceptTitles && b.title && Ext.isString(b.title)) {
			c = b.title;
			b.qtip = c;
			b.removeAttribute("title");
			d.preventDefault()
		} else {
			a = this.tagConfig;
			c = b.qtip || Ext.fly(b).getAttribute(a.attribute, a.namespace)
		}
		return c
	},
	onTargetOver : function(i) {
		if (this.disabled) {
			return
		}
		this.targetXY = i.getXY();
		var c = i.getTarget();
		if (!c || c.nodeType !== 1 || c == document || c == document.body) {
			return
		}
		if (this.activeTarget
				&& ((c == this.activeTarget.el) || Ext
						.fly(this.activeTarget.el).contains(c))) {
			this.clearTimer("hide");
			this.show();
			return
		}
		if (c && this.targets[c.id]) {
			this.activeTarget = this.targets[c.id];
			this.activeTarget.el = c;
			this.anchor = this.activeTarget.anchor;
			if (this.anchor) {
				this.anchorTarget = c
			}
			this.delayShow();
			return
		}
		var g, h = Ext.fly(c), b = this.tagConfig, d = b.namespace;
		if (g = this.getTipCfg(i)) {
			var a = h.getAttribute(b.hide, d);
			this.activeTarget = {
				el :c,
				text :g,
				width :h.getAttribute(b.width, d),
				autoHide :a != "user" && a !== "false",
				title :h.getAttribute(b.title, d),
				cls :h.getAttribute(b.cls, d),
				align :h.getAttribute(b.align, d)
			};
			this.anchor = h.getAttribute(b.anchor, d);
			if (this.anchor) {
				this.anchorTarget = c
			}
			this.delayShow()
		}
	},
	onTargetOut : function(a) {
		if (this.activeTarget && a.within(this.activeTarget.el)
				&& !this.getTipCfg(a)) {
			return
		}
		this.clearTimer("show");
		if (this.autoHide !== false) {
			this.delayHide()
		}
	},
	showAt : function(b) {
		var a = this.activeTarget;
		if (a) {
			if (!this.rendered) {
				this.render(Ext.getBody());
				this.activeTarget = a
			}
			if (a.width) {
				this.setWidth(a.width);
				this.body.setWidth(this.adjustBodyWidth(a.width
						- this.getFrameWidth()));
				this.measureWidth = false
			} else {
				this.measureWidth = true
			}
			this.setTitle(a.title || "");
			this.body.update(a.text);
			this.autoHide = a.autoHide;
			this.dismissDelay = a.dismissDelay || this.dismissDelay;
			if (this.lastCls) {
				this.el.removeClass(this.lastCls);
				delete this.lastCls
			}
			if (a.cls) {
				this.el.addClass(a.cls);
				this.lastCls = a.cls
			}
			if (this.anchor) {
				this.constrainPosition = false
			} else {
				if (a.align) {
					b = this.el.getAlignToXY(a.el, a.align);
					this.constrainPosition = false
				} else {
					this.constrainPosition = true
				}
			}
		}
		Ext.QuickTip.superclass.showAt.call(this, b)
	},
	hide : function() {
		delete this.activeTarget;
		Ext.QuickTip.superclass.hide.call(this)
	}
});
Ext.reg("quicktip", Ext.QuickTip);
Ext.QuickTips = function() {
	var b, a = false;
	return {
		init : function(c) {
			if (!b) {
				if (!Ext.isReady) {
					Ext.onReady( function() {
						Ext.QuickTips.init(c)
					});
					return
				}
				b = new Ext.QuickTip( {
					elements :"header,body",
					disabled :a
				});
				if (c !== false) {
					b.render(Ext.getBody())
				}
			}
		},
		ddDisable : function() {
			if (b && !a) {
				b.disable()
			}
		},
		ddEnable : function() {
			if (b && !a) {
				b.enable()
			}
		},
		enable : function() {
			if (b) {
				b.enable()
			}
			a = false
		},
		disable : function() {
			if (b) {
				b.disable()
			}
			a = true
		},
		isEnabled : function() {
			return b !== undefined && !b.disabled
		},
		getQuickTip : function() {
			return b
		},
		register : function() {
			b.register.apply(b, arguments)
		},
		unregister : function() {
			b.unregister.apply(b, arguments)
		},
		tips : function() {
			b.register.apply(b, arguments)
		}
	}
}();
Ext.slider.Tip = Ext.extend(Ext.Tip, {
	minWidth :10,
	offsets : [ 0, -10 ],
	init : function(a) {
		a.on( {
			scope :this,
			dragstart :this.onSlide,
			drag :this.onSlide,
			dragend :this.hide,
			destroy :this.destroy
		})
	},
	onSlide : function(b, c, a) {
		this.show();
		this.body.update(this.getText(a));
		this.doAutoWidth();
		this.el.alignTo(a.el, "b-t?", this.offsets)
	},
	getText : function(a) {
		return String(a.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 a = this.loader;
		if (!a) {
			a = new Ext.tree.TreeLoader( {
				dataUrl :this.dataUrl,
				requestMethod :this.requestMethod
			})
		} else {
			if (Ext.isObject(a) && !a.load) {
				a = new Ext.tree.TreeLoader(a)
			}
		}
		this.loader = a;
		this.nodeHash = {};
		if (this.root) {
			var b = this.root;
			delete this.root;
			this.setRootNode(b)
		}
		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(c, b, a, h, g, e, d) {
		if (c == "collapse" || c == "expand" || c == "beforecollapse"
				|| c == "beforeexpand" || c == "move" || c == "beforemove") {
			c = c + "node"
		}
		return this.fireEvent(c, b, a, h, g, e, d)
	},
	getRootNode : function() {
		return this.root
	},
	setRootNode : function(b) {
		this.destroyRoot();
		if (!b.render) {
			b = this.loader.createNode(b)
		}
		this.root = b;
		b.ownerTree = this;
		b.isRoot = true;
		this.registerNode(b);
		if (!this.rootVisible) {
			var a = b.attributes.uiProvider;
			b.ui = a ? new a(b) : new Ext.tree.RootTreeNodeUI(b)
		}
		if (this.innerCt) {
			this.clearInnerCt();
			this.renderRoot()
		}
		return b
	},
	clearInnerCt : function() {
		this.innerCt.update("")
	},
	renderRoot : function() {
		this.root.render();
		if (!this.rootVisible) {
			this.root.renderChildren()
		}
	},
	getNodeById : function(a) {
		return this.nodeHash[a]
	},
	registerNode : function(a) {
		this.nodeHash[a.id] = a
	},
	unregisterNode : function(a) {
		delete this.nodeHash[a.id]
	},
	toString : function() {
		return "[Tree" + (this.id ? " " + this.id : "") + "]"
	},
	restrictExpand : function(a) {
		var b = a.parentNode;
		if (b) {
			if (b.expandedChild && b.expandedChild.parentNode == b) {
				b.expandedChild.collapse()
			}
			b.expandedChild = a
		}
	},
	getChecked : function(b, c) {
		c = c || this.root;
		var d = [];
		var e = function() {
			if (this.attributes.checked) {
				d.push(!b ? this : (b == "id" ? this.id : this.attributes[b]))
			}
		};
		c.cascade(e);
		return d
	},
	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(g, a, h) {
		if (Ext.isEmpty(g)) {
			if (h) {
				h(false, undefined)
			}
			return
		}
		a = a || "id";
		var d = g.split(this.pathSeparator);
		var c = this.root;
		if (c.attributes[a] != d[1]) {
			if (h) {
				h(false, null)
			}
			return
		}
		var b = 1;
		var e = function() {
			if (++b == d.length) {
				if (h) {
					h(true, c)
				}
				return
			}
			var i = c.findChild(a, d[b]);
			if (!i) {
				if (h) {
					h(false, c)
				}
				return
			}
			c = i;
			i.expand(false, false, e)
		};
		c.expand(false, false, e)
	},
	selectPath : function(e, a, g) {
		if (Ext.isEmpty(e)) {
			if (g) {
				g(false, undefined)
			}
			return
		}
		a = a || "id";
		var c = e.split(this.pathSeparator), b = c.pop();
		if (c.length > 1) {
			var d = function(i, h) {
				if (i && h) {
					var k = h.findChild(a, b);
					if (k) {
						k.select();
						if (g) {
							g(true, k)
						}
					} else {
						if (g) {
							g(false, k)
						}
					}
				} else {
					if (g) {
						g(false, k)
					}
				}
			};
			this.expandPath(c.join(this.pathSeparator), a, d)
		} else {
			this.root.select();
			if (g) {
				g(true, this.root)
			}
		}
	},
	getTreeEl : function() {
		return this.body
	},
	onRender : function(b, a) {
		Ext.tree.TreePanel.superclass.onRender.call(this, b, a);
		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(a) {
	this.tree = a;
	this.tree.on("render", this.initEvents, this)
};
Ext.tree.TreeEventModel.prototype = {
	initEvents : function() {
		var a = this.tree;
		if (a.trackMouseOver !== false) {
			a.mon(a.innerCt, {
				scope :this,
				mouseover :this.delegateOver,
				mouseout :this.delegateOut
			})
		}
		a.mon(a.getTreeEl(), {
			scope :this,
			click :this.delegateClick,
			dblclick :this.delegateDblClick,
			contextmenu :this.delegateContextMenu
		})
	},
	getNode : function(b) {
		var a;
		if (a = b.getTarget(".x-tree-node-el", 10)) {
			var c = Ext.fly(a, "_treeEvents").getAttribute("tree-node-id",
					"ext");
			if (c) {
				return this.tree.getNodeById(c)
			}
		}
		return null
	},
	getNodeTarget : function(b) {
		var a = b.getTarget(".x-tree-node-icon", 1);
		if (!a) {
			a = b.getTarget(".x-tree-node-el", 6)
		}
		return a
	},
	delegateOut : function(b, a) {
		if (!this.beforeEvent(b)) {
			return
		}
		if (b.getTarget(".x-tree-ec-icon", 1)) {
			var c = this.getNode(b);
			this.onIconOut(b, c);
			if (c == this.lastEcOver) {
				delete this.lastEcOver
			}
		}
		if ((a = this.getNodeTarget(b)) && !b.within(a, true)) {
			this.onNodeOut(b, this.getNode(b))
		}
	},
	delegateOver : function(b, a) {
		if (!this.beforeEvent(b)) {
			return
		}
		if (Ext.isGecko && !this.trackingDoc) {
			Ext.getBody().on("mouseover", this.trackExit, this);
			this.trackingDoc = true
		}
		if (this.lastEcOver) {
			this.onIconOut(b, this.lastEcOver);
			delete this.lastEcOver
		}
		if (b.getTarget(".x-tree-ec-icon", 1)) {
			this.lastEcOver = this.getNode(b);
			this.onIconOver(b, this.lastEcOver)
		}
		if (a = this.getNodeTarget(b)) {
			this.onNodeOver(b, this.getNode(b))
		}
	},
	trackExit : function(a) {
		if (this.lastOverNode) {
			if (this.lastOverNode.ui && !a.within(this.lastOverNode.ui.getEl())) {
				this.onNodeOut(a, this.lastOverNode)
			}
			delete this.lastOverNode;
			Ext.getBody().un("mouseover", this.trackExit, this);
			this.trackingDoc = false
		}
	},
	delegateClick : function(b, a) {
		if (this.beforeEvent(b)) {
			if (b.getTarget("input[type=checkbox]", 1)) {
				this.onCheckboxClick(b, this.getNode(b))
			} else {
				if (b.getTarget(".x-tree-ec-icon", 1)) {
					this.onIconClick(b, this.getNode(b))
				} else {
					if (this.getNodeTarget(b)) {
						this.onNodeClick(b, this.getNode(b))
					}
				}
			}
		} else {
			this.checkContainerEvent(b, "click")
		}
	},
	delegateDblClick : function(b, a) {
		if (this.beforeEvent(b)) {
			if (this.getNodeTarget(b)) {
				this.onNodeDblClick(b, this.getNode(b))
			}
		} else {
			this.checkContainerEvent(b, "dblclick")
		}
	},
	delegateContextMenu : function(b, a) {
		if (this.beforeEvent(b)) {
			if (this.getNodeTarget(b)) {
				this.onNodeContextMenu(b, this.getNode(b))
			}
		} else {
			this.checkContainerEvent(b, "contextmenu")
		}
	},
	checkContainerEvent : function(b, a) {
		if (this.disabled) {
			b.stopEvent();
			return false
		}
		this.onContainerEvent(b, a)
	},
	onContainerEvent : function(b, a) {
		this.tree.fireEvent("container" + a, this.tree, b)
	},
	onNodeClick : function(b, a) {
		a.ui.onClick(b)
	},
	onNodeOver : function(b, a) {
		this.lastOverNode = a;
		a.ui.onOver(b)
	},
	onNodeOut : function(b, a) {
		a.ui.onOut(b)
	},
	onIconOver : function(b, a) {
		a.ui.addClass("x-tree-ec-over")
	},
	onIconOut : function(b, a) {
		a.ui.removeClass("x-tree-ec-over")
	},
	onIconClick : function(b, a) {
		a.ui.ecClick(b)
	},
	onCheckboxClick : function(b, a) {
		a.ui.onCheckChange(b)
	},
	onNodeDblClick : function(b, a) {
		a.ui.onDblClick(b)
	},
	onNodeContextMenu : function(b, a) {
		a.ui.onContextMenu(b)
	},
	beforeEvent : function(b) {
		var a = this.getNode(b);
		if (this.disabled || !a || !a.ui) {
			b.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(a) {
						this.selNode = null;
						this.addEvents("selectionchange", "beforeselect");
						Ext.apply(this, a);
						Ext.tree.DefaultSelectionModel.superclass.constructor
								.call(this)
					},
					init : function(a) {
						this.tree = a;
						a.mon(a.getTreeEl(), "keydown", this.onKeyDown, this);
						a.on("click", this.onNodeClick, this)
					},
					onNodeClick : function(a, b) {
						this.select(a)
					},
					select : function(c, a) {
						if (!Ext.fly(c.ui.wrap).isVisible() && a) {
							return a.call(this, c)
						}
						var b = this.selNode;
						if (c == b) {
							c.ui.onSelectedChange(true)
						} else {
							if (this.fireEvent("beforeselect", this, c, b) !== false) {
								if (b && b.ui) {
									b.ui.onSelectedChange(false)
								}
								this.selNode = c;
								c.ui.onSelectedChange(true);
								this.fireEvent("selectionchange", this, c, b)
							}
						}
						return c
					},
					unselect : function(b, a) {
						if (this.selNode == b) {
							this.clearSelections(a)
						}
					},
					clearSelections : function(a) {
						var b = this.selNode;
						if (b) {
							b.ui.onSelectedChange(false);
							this.selNode = null;
							if (a !== true) {
								this.fireEvent("selectionchange", this, null)
							}
						}
						return b
					},
					getSelectedNode : function() {
						return this.selNode
					},
					isSelected : function(a) {
						return this.selNode == a
					},
					selectPrevious : function(a) {
						if (!(a = a || this.selNode || this.lastSelNode)) {
							return null
						}
						var c = a.previousSibling;
						if (c) {
							if (!c.isExpanded() || c.childNodes.length < 1) {
								return this.select(c, this.selectPrevious)
							} else {
								var b = c.lastChild;
								while (b && b.isExpanded()
										&& Ext.fly(b.ui.wrap).isVisible()
										&& b.childNodes.length > 0) {
									b = b.lastChild
								}
								return this.select(b, this.selectPrevious)
							}
						} else {
							if (a.parentNode
									&& (this.tree.rootVisible || !a.parentNode.isRoot)) {
								return this.select(a.parentNode,
										this.selectPrevious)
							}
						}
						return null
					},
					selectNext : function(b) {
						if (!(b = b || this.selNode || this.lastSelNode)) {
							return null
						}
						if (b.firstChild && b.isExpanded()
								&& Ext.fly(b.ui.wrap).isVisible()) {
							return this.select(b.firstChild, this.selectNext)
						} else {
							if (b.nextSibling) {
								return this.select(b.nextSibling,
										this.selectNext)
							} else {
								if (b.parentNode) {
									var a = null;
									b.parentNode.bubble( function() {
										if (this.nextSibling) {
											a = this.getOwnerTree().selModel
													.select(this.nextSibling,
															this.selectNext);
											return false
										}
									});
									return a
								}
							}
						}
						return null
					},
					onKeyDown : function(c) {
						var b = this.selNode || this.lastSelNode;
						var d = this;
						if (!b) {
							return
						}
						var a = c.getKey();
						switch (a) {
						case c.DOWN:
							c.stopEvent();
							this.selectNext();
							break;
						case c.UP:
							c.stopEvent();
							this.selectPrevious();
							break;
						case c.RIGHT:
							c.preventDefault();
							if (b.hasChildNodes()) {
								if (!b.isExpanded()) {
									b.expand()
								} else {
									if (b.firstChild) {
										this.select(b.firstChild, c)
									}
								}
							}
							break;
						case c.LEFT:
							c.preventDefault();
							if (b.hasChildNodes() && b.isExpanded()) {
								b.collapse()
							} else {
								if (b.parentNode
										&& (this.tree.rootVisible || b.parentNode != this.tree
												.getRootNode())) {
									this.select(b.parentNode, c)
								}
							}
							break
						}
					}
				});
Ext.tree.MultiSelectionModel = Ext.extend(Ext.util.Observable, {
	constructor : function(a) {
		this.selNodes = [];
		this.selMap = {};
		this.addEvents("selectionchange");
		Ext.apply(this, a);
		Ext.tree.MultiSelectionModel.superclass.constructor.call(this)
	},
	init : function(a) {
		this.tree = a;
		a.mon(a.getTreeEl(), "keydown", this.onKeyDown, this);
		a.on("click", this.onNodeClick, this)
	},
	onNodeClick : function(a, b) {
		if (b.ctrlKey && this.isSelected(a)) {
			this.unselect(a)
		} else {
			this.select(a, b, b.ctrlKey)
		}
	},
	select : function(a, c, b) {
		if (b !== true) {
			this.clearSelections(true)
		}
		if (this.isSelected(a)) {
			this.lastSelNode = a;
			return a
		}
		this.selNodes.push(a);
		this.selMap[a.id] = a;
		this.lastSelNode = a;
		a.ui.onSelectedChange(true);
		this.fireEvent("selectionchange", this, this.selNodes);
		return a
	},
	unselect : function(b) {
		if (this.selMap[b.id]) {
			b.ui.onSelectedChange(false);
			var c = this.selNodes;
			var a = c.indexOf(b);
			if (a != -1) {
				this.selNodes.splice(a, 1)
			}
			delete this.selMap[b.id];
			this.fireEvent("selectionchange", this, this.selNodes)
		}
	},
	clearSelections : function(b) {
		var d = this.selNodes;
		if (d.length > 0) {
			for ( var c = 0, a = d.length; c < a; c++) {
				d[c].ui.onSelectedChange(false)
			}
			this.selNodes = [];
			this.selMap = {};
			if (b !== true) {
				this.fireEvent("selectionchange", this, this.selNodes)
			}
		}
	},
	isSelected : function(a) {
		return this.selMap[a.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(a) {
		this.nodeHash = {};
		this.root = null;
		if (a) {
			this.setRootNode(a)
		}
		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(a) {
		this.root = a;
		a.ownerTree = this;
		a.isRoot = true;
		this.registerNode(a);
		return a
	},
	getNodeById : function(a) {
		return this.nodeHash[a]
	},
	registerNode : function(a) {
		this.nodeHash[a.id] = a
	},
	unregisterNode : function(a) {
		delete this.nodeHash[a.id]
	},
	toString : function() {
		return "[Tree" + (this.id ? " " + this.id : "") + "]"
	}
});
Ext.data.Node = Ext
		.extend(
				Ext.util.Observable,
				{
					constructor : function(a) {
						this.attributes = a || {};
						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(b) {
						if (Ext.data.Node.superclass.fireEvent.apply(this,
								arguments) === false) {
							return false
						}
						var a = this.getOwnerTree();
						if (a) {
							if (a.proxyNodeEvent.apply(a, arguments) === false) {
								return false
							}
						}
						return true
					},
					isLeaf : function() {
						return this.leaf === true
					},
					setFirstChild : function(a) {
						this.firstChild = a
					},
					setLastChild : function(a) {
						this.lastChild = a
					},
					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(e) {
						var g = false;
						if (Ext.isArray(e)) {
							g = e
						} else {
							if (arguments.length > 1) {
								g = arguments
							}
						}
						if (g) {
							for ( var d = 0, a = g.length; d < a; d++) {
								this.appendChild(g[d])
							}
						} else {
							if (this.fireEvent("beforeappend", this.ownerTree,
									this, e) === false) {
								return false
							}
							var b = this.childNodes.length;
							var c = e.parentNode;
							if (c) {
								if (e.fireEvent("beforemove", e.getOwnerTree(),
										e, c, this, b) === false) {
									return false
								}
								c.removeChild(e)
							}
							b = this.childNodes.length;
							if (b === 0) {
								this.setFirstChild(e)
							}
							this.childNodes.push(e);
							e.parentNode = this;
							var h = this.childNodes[b - 1];
							if (h) {
								e.previousSibling = h;
								h.nextSibling = e
							} else {
								e.previousSibling = null
							}
							e.nextSibling = null;
							this.setLastChild(e);
							e.setOwnerTree(this.getOwnerTree());
							this
									.fireEvent("append", this.ownerTree, this,
											e, b);
							if (c) {
								e.fireEvent("move", this.ownerTree, e, c, this,
										b)
							}
							return e
						}
					},
					removeChild : function(c, b) {
						var a = this.childNodes.indexOf(c);
						if (a == -1) {
							return false
						}
						if (this.fireEvent("beforeremove", this.ownerTree,
								this, c) === false) {
							return false
						}
						this.childNodes.splice(a, 1);
						if (c.previousSibling) {
							c.previousSibling.nextSibling = c.nextSibling
						}
						if (c.nextSibling) {
							c.nextSibling.previousSibling = c.previousSibling
						}
						if (this.firstChild == c) {
							this.setFirstChild(c.nextSibling)
						}
						if (this.lastChild == c) {
							this.setLastChild(c.previousSibling)
						}
						this.fireEvent("remove", this.ownerTree, this, c);
						if (b) {
							c.destroy(true)
						} else {
							c.clear()
						}
						return c
					},
					clear : function(a) {
						this.setOwnerTree(null, a);
						this.parentNode = this.previousSibling = this.nextSibling = null;
						if (a) {
							this.firstChild = this.lastChild = null
						}
					},
					destroy : function(a) {
						if (a === true) {
							this.purgeListeners();
							this.clear(true);
							Ext.each(this.childNodes, function(b) {
								b.destroy(true)
							});
							this.childNodes = null
						} else {
							this.remove(true)
						}
					},
					insertBefore : function(d, a) {
						if (!a) {
							return this.appendChild(d)
						}
						if (d == a) {
							return false
						}
						if (this.fireEvent("beforeinsert", this.ownerTree,
								this, d, a) === false) {
							return false
						}
						var b = this.childNodes.indexOf(a);
						var c = d.parentNode;
						var e = b;
						if (c == this && this.childNodes.indexOf(d) < b) {
							e--
						}
						if (c) {
							if (d.fireEvent("beforemove", d.getOwnerTree(), d,
									c, this, b, a) === false) {
								return false
							}
							c.removeChild(d)
						}
						if (e === 0) {
							this.setFirstChild(d)
						}
						this.childNodes.splice(e, 0, d);
						d.parentNode = this;
						var g = this.childNodes[e - 1];
						if (g) {
							d.previousSibling = g;
							g.nextSibling = d
						} else {
							d.previousSibling = null
						}
						d.nextSibling = a;
						a.previousSibling = d;
						d.setOwnerTree(this.getOwnerTree());
						this.fireEvent("insert", this.ownerTree, this, d, a);
						if (c) {
							d.fireEvent("move", this.ownerTree, d, c, this, e,
									a)
						}
						return d
					},
					remove : function(a) {
						if (this.parentNode) {
							this.parentNode.removeChild(this, a)
						}
						return this
					},
					removeAll : function(a) {
						var c = this.childNodes, b;
						while ((b = c[0])) {
							this.removeChild(b, a)
						}
						return this
					},
					item : function(a) {
						return this.childNodes[a]
					},
					replaceChild : function(a, c) {
						var b = c ? c.nextSibling : null;
						this.removeChild(c);
						this.insertBefore(a, b);
						return c
					},
					indexOf : function(a) {
						return this.childNodes.indexOf(a)
					},
					getOwnerTree : function() {
						if (!this.ownerTree) {
							var a = this;
							while (a) {
								if (a.ownerTree) {
									this.ownerTree = a.ownerTree;
									break
								}
								a = a.parentNode
							}
						}
						return this.ownerTree
					},
					getDepth : function() {
						var b = 0;
						var a = this;
						while (a.parentNode) {
							++b;
							a = a.parentNode
						}
						return b
					},
					setOwnerTree : function(a, b) {
						if (a != this.ownerTree) {
							if (this.ownerTree) {
								this.ownerTree.unregisterNode(this)
							}
							this.ownerTree = a;
							if (b !== true) {
								Ext.each(this.childNodes, function(c) {
									c.setOwnerTree(a)
								})
							}
							if (a) {
								a.registerNode(this)
							}
						}
					},
					setId : function(b) {
						if (b !== this.id) {
							var a = this.ownerTree;
							if (a) {
								a.unregisterNode(this)
							}
							this.id = this.attributes.id = b;
							if (a) {
								a.registerNode(this)
							}
							this.onIdChange(b)
						}
					},
					onIdChange :Ext.emptyFn,
					getPath : function(c) {
						c = c || "id";
						var e = this.parentNode;
						var a = [ this.attributes[c] ];
						while (e) {
							a.unshift(e.attributes[c]);
							e = e.parentNode
						}
						var d = this.getOwnerTree().pathSeparator;
						return d + a.join(d)
					},
					bubble : function(c, b, a) {
						var d = this;
						while (d) {
							if (c.apply(b || d, a || [ d ]) === false) {
								break
							}
							d = d.parentNode
						}
					},
					cascade : function(g, e, b) {
						if (g.apply(e || this, b || [ this ]) !== false) {
							var d = this.childNodes;
							for ( var c = 0, a = d.length; c < a; c++) {
								d[c].cascade(g, e, b)
							}
						}
					},
					eachChild : function(g, e, b) {
						var d = this.childNodes;
						for ( var c = 0, a = d.length; c < a; c++) {
							if (g.apply(e || d[c], b || [ d[c] ]) === false) {
								break
							}
						}
					},
					findChild : function(b, c, a) {
						return this.findChildBy( function() {
							return this.attributes[b] == c
						}, null, a)
					},
					findChildBy : function(h, g, b) {
						var e = this.childNodes, a = e.length, d = 0, k, c;
						for (; d < a; d++) {
							k = e[d];
							if (h.call(g || k, k) === true) {
								return k
							} else {
								if (b) {
									c = k.findChildBy(h, g, b);
									if (c != null) {
										return c
									}
								}
							}
						}
						return null
					},
					sort : function(e, d) {
						var c = this.childNodes;
						var a = c.length;
						if (a > 0) {
							var g = d ? function() {
								e.apply(d, arguments)
							} : e;
							c.sort(g);
							for ( var b = 0; b < a; b++) {
								var h = c[b];
								h.previousSibling = c[b - 1];
								h.nextSibling = c[b + 1];
								if (b === 0) {
									this.setFirstChild(h)
								}
								if (b == a - 1) {
									this.setLastChild(h)
								}
							}
						}
					},
					contains : function(a) {
						return a.isAncestor(this)
					},
					isAncestor : function(a) {
						var b = this.parentNode;
						while (b) {
							if (b == a) {
								return true
							}
							b = b.parentNode
						}
						return false
					},
					toString : function() {
						return "[Node" + (this.id ? " " + this.id : "") + "]"
					}
				});
Ext.tree.TreeNode = Ext
		.extend(
				Ext.data.Node,
				{
					constructor : function(a) {
						a = a || {};
						if (Ext.isString(a)) {
							a = {
								text :a
							}
						}
						this.childrenRendered = false;
						this.rendered = false;
						Ext.tree.TreeNode.superclass.constructor.call(this, a);
						this.expanded = a.expanded === true;
						this.isTarget = a.isTarget !== false;
						this.draggable = a.draggable !== false
								&& a.allowDrag !== false;
						this.allowChildren = a.allowChildren !== false
								&& a.allowDrop !== false;
						this.text = a.text;
						this.disabled = a.disabled === true;
						this.hidden = a.hidden === true;
						this.addEvents("textchange", "beforeexpand",
								"beforecollapse", "expand", "disabledchange",
								"collapse", "beforeclick", "click",
								"checkchange", "beforedblclick", "dblclick",
								"contextmenu", "beforechildrenrendered");
						var b = this.attributes.uiProvider || this.defaultUI
								|| Ext.tree.TreeNodeUI;
						this.ui = new b(this)
					},
					preventHScroll :true,
					isExpanded : function() {
						return this.expanded
					},
					getUI : function() {
						return this.ui
					},
					getLoader : function() {
						var a;
						return this.loader
								|| ((a = this.getOwnerTree()) && a.loader ? a.loader
										: (this.loader = new Ext.tree.TreeLoader()))
					},
					setFirstChild : function(a) {
						var b = this.firstChild;
						Ext.tree.TreeNode.superclass.setFirstChild
								.call(this, a);
						if (this.childrenRendered && b && a != b) {
							b.renderIndent(true, true)
						}
						if (this.rendered) {
							this.renderIndent(true, true)
						}
					},
					setLastChild : function(b) {
						var a = this.lastChild;
						Ext.tree.TreeNode.superclass.setLastChild.call(this, b);
						if (this.childrenRendered && a && b != a) {
							a.renderIndent(true, true)
						}
						if (this.rendered) {
							this.renderIndent(true, true)
						}
					},
					appendChild : function(b) {
						if (!b.render && !Ext.isArray(b)) {
							b = this.getLoader().createNode(b)
						}
						var a = Ext.tree.TreeNode.superclass.appendChild.call(
								this, b);
						if (a && this.childrenRendered) {
							a.render()
						}
						this.ui.updateExpandIcon();
						return a
					},
					removeChild : function(b, a) {
						this.ownerTree.getSelectionModel().unselect(b);
						Ext.tree.TreeNode.superclass.removeChild.apply(this,
								arguments);
						if (!a) {
							var c = b.ui.rendered;
							if (c) {
								b.ui.remove()
							}
							if (c && this.childNodes.length < 1) {
								this.collapse(false, false)
							} else {
								this.ui.updateExpandIcon()
							}
							if (!this.firstChild && !this.isHiddenRoot()) {
								this.childrenRendered = false
							}
						}
						return b
					},
					insertBefore : function(c, a) {
						if (!c.render) {
							c = this.getLoader().createNode(c)
						}
						var b = Ext.tree.TreeNode.superclass.insertBefore.call(
								this, c, a);
						if (b && a && this.childrenRendered) {
							c.render()
						}
						this.ui.updateExpandIcon();
						return b
					},
					setText : function(b) {
						var a = this.text;
						this.text = this.attributes.text = b;
						if (this.rendered) {
							this.ui.onTextChange(this, b, a)
						}
						this.fireEvent("textchange", this, b, a)
					},
					setIconCls : function(b) {
						var a = this.attributes.iconCls;
						this.attributes.iconCls = b;
						if (this.rendered) {
							this.ui.onIconClsChange(this, b, a)
						}
					},
					setTooltip : function(a, b) {
						this.attributes.qtip = a;
						this.attributes.qtipTitle = b;
						if (this.rendered) {
							this.ui.onTipChange(this, a, b)
						}
					},
					setIcon : function(a) {
						this.attributes.icon = a;
						if (this.rendered) {
							this.ui.onIconChange(this, a)
						}
					},
					setHref : function(a, b) {
						this.attributes.href = a;
						this.attributes.hrefTarget = b;
						if (this.rendered) {
							this.ui.onHrefChange(this, a, b)
						}
					},
					setCls : function(b) {
						var a = this.attributes.cls;
						this.attributes.cls = b;
						if (this.rendered) {
							this.ui.onClsChange(this, b, a)
						}
					},
					select : function() {
						var a = this.getOwnerTree();
						if (a) {
							a.getSelectionModel().select(this)
						}
					},
					unselect : function(a) {
						var b = this.getOwnerTree();
						if (b) {
							b.getSelectionModel().unselect(this, a)
						}
					},
					isSelected : function() {
						var a = this.getOwnerTree();
						return a ? a.getSelectionModel().isSelected(this)
								: false
					},
					expand : function(a, c, d, b) {
						if (!this.expanded) {
							if (this.fireEvent("beforeexpand", this, a, c) === false) {
								return
							}
							if (!this.childrenRendered) {
								this.renderChildren()
							}
							this.expanded = true;
							if (!this.isHiddenRoot()
									&& (this.getOwnerTree().animate && c !== false)
									|| c) {
								this.ui.animExpand( function() {
									this.fireEvent("expand", this);
									this.runCallback(d, b || this, [ this ]);
									if (a === true) {
										this.expandChildNodes(true, true)
									}
								}.createDelegate(this));
								return
							} else {
								this.ui.expand();
								this.fireEvent("expand", this);
								this.runCallback(d, b || this, [ this ])
							}
						} else {
							this.runCallback(d, b || this, [ this ])
						}
						if (a === true) {
							this.expandChildNodes(true)
						}
					},
					runCallback : function(a, c, b) {
						if (Ext.isFunction(a)) {
							a.apply(c, b)
						}
					},
					isHiddenRoot : function() {
						return this.isRoot && !this.getOwnerTree().rootVisible
					},
					collapse : function(b, g, h, e) {
						if (this.expanded && !this.isHiddenRoot()) {
							if (this.fireEvent("beforecollapse", this, b, g) === false) {
								return
							}
							this.expanded = false;
							if ((this.getOwnerTree().animate && g !== false)
									|| g) {
								this.ui.animCollapse( function() {
									this.fireEvent("collapse", this);
									this.runCallback(h, e || this, [ this ]);
									if (b === true) {
										this.collapseChildNodes(true)
									}
								}.createDelegate(this));
								return
							} else {
								this.ui.collapse();
								this.fireEvent("collapse", this);
								this.runCallback(h, e || this, [ this ])
							}
						} else {
							if (!this.expanded) {
								this.runCallback(h, e || this, [ this ])
							}
						}
						if (b === true) {
							var d = this.childNodes;
							for ( var c = 0, a = d.length; c < a; c++) {
								d[c].collapse(true, false)
							}
						}
					},
					delayedExpand : function(a) {
						if (!this.expandProcId) {
							this.expandProcId = this.expand.defer(a, this)
						}
					},
					cancelExpand : function() {
						if (this.expandProcId) {
							clearTimeout(this.expandProcId)
						}
						this.expandProcId = false
					},
					toggle : function() {
						if (this.expanded) {
							this.collapse()
						} else {
							this.expand()
						}
					},
					ensureVisible : function(c, b) {
						var a = this.getOwnerTree();
						a.expandPath(this.parentNode ? this.parentNode
								.getPath() : this.getPath(), false, function() {
							var d = a.getNodeById(this.id);
							a.getTreeEl().scrollChildIntoView(d.ui.anchor);
							this.runCallback(c, b || this, [ this ])
						}.createDelegate(this))
					},
					expandChildNodes : function(b, e) {
						var d = this.childNodes, c, a = d.length;
						for (c = 0; c < a; c++) {
							d[c].expand(b, e)
						}
					},
					collapseChildNodes : function(b) {
						var d = this.childNodes;
						for ( var c = 0, a = d.length; c < a; c++) {
							d[c].collapse(b)
						}
					},
					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(b) {
						if (b !== false) {
							this.fireEvent("beforechildrenrendered", this)
						}
						var d = this.childNodes;
						for ( var c = 0, a = d.length; c < a; c++) {
							d[c].render(true)
						}
						this.childrenRendered = true
					},
					sort : function(e, d) {
						Ext.tree.TreeNode.superclass.sort
								.apply(this, arguments);
						if (this.childrenRendered) {
							var c = this.childNodes;
							for ( var b = 0, a = c.length; b < a; b++) {
								c[b].render(true)
							}
						}
					},
					render : function(a) {
						this.ui.render(a);
						if (!this.rendered) {
							this.getOwnerTree().registerNode(this);
							this.rendered = true;
							if (this.expanded) {
								this.expanded = false;
								this.expand(false, false)
							}
						}
					},
					renderIndent : function(b, e) {
						if (e) {
							this.ui.childIndent = null
						}
						this.ui.renderIndent();
						if (b === true && this.childrenRendered) {
							var d = this.childNodes;
							for ( var c = 0, a = d.length; c < a; c++) {
								d[c].renderIndent(true, e)
							}
						}
					},
					beginUpdate : function() {
						this.childrenRendered = false
					},
					endUpdate : function() {
						if (this.expanded && this.rendered) {
							this.renderChildren()
						}
					},
					destroy : function(a) {
						if (a === true) {
							this.unselect(true)
						}
						Ext.tree.TreeNode.superclass.destroy.call(this, a);
						Ext.destroy(this.ui, this.loader);
						this.ui = this.loader = null
					},
					onIdChange : function(a) {
						this.ui.onIdChange(a)
					}
				});
Ext.tree.TreePanel.nodeTypes.node = Ext.tree.TreeNode;
Ext.tree.AsyncTreeNode = function(a) {
	this.loaded = a && a.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(b, e, h, c) {
		if (this.loading) {
			var g;
			var d = function() {
				if (!this.loading) {
					clearInterval(g);
					this.expand(b, e, h, c)
				}
			}.createDelegate(this);
			g = setInterval(d, 200);
			return
		}
		if (!this.loaded) {
			if (this.fireEvent("beforeload", this) === false) {
				return
			}
			this.loading = true;
			this.ui.beforeLoad(this);
			var a = this.loader || this.attributes.loader
					|| this.getOwnerTree().getLoader();
			if (a) {
				a.load(this, this.loadComplete.createDelegate(this, [ b, e, h,
						c ]), this);
				return
			}
		}
		Ext.tree.AsyncTreeNode.superclass.expand.call(this, b, e, h, c)
	},
	isLoading : function() {
		return this.loading
	},
	loadComplete : function(a, c, d, b) {
		this.loading = false;
		this.loaded = true;
		this.ui.afterLoad(this);
		this.fireEvent("load", this);
		this.expand(a, c, d, b)
	},
	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(b, a) {
		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, b, a)
	}
});
Ext.tree.TreePanel.nodeTypes.async = Ext.tree.AsyncTreeNode;
Ext.tree.TreeNodeUI = Ext
		.extend(
				Object,
				{
					constructor : function(a) {
						Ext.apply(this, {
							node :a,
							rendered :false,
							animating :false,
							wasLeaf :true,
							ecc :"x-tree-ec-icon x-tree-elbow",
							emptyIcon :Ext.BLANK_IMAGE_URL
						})
					},
					removeChild : function(a) {
						if (this.rendered) {
							this.ctNode.removeChild(a.ui.getEl())
						}
					},
					beforeLoad : function() {
						this.addClass("x-tree-node-loading")
					},
					afterLoad : function() {
						this.removeClass("x-tree-node-loading")
					},
					onTextChange : function(b, c, a) {
						if (this.rendered) {
							this.textNode.innerHTML = c
						}
					},
					onIconClsChange : function(c, a, b) {
						if (this.rendered) {
							Ext.fly(this.iconNode).replaceClass(b, a)
						}
					},
					onIconChange : function(b, a) {
						if (this.rendered) {
							var c = Ext.isEmpty(a);
							this.iconNode.src = c ? this.emptyIcon : a;
							Ext.fly(this.iconNode)[c ? "removeClass"
									: "addClass"]("x-tree-node-inline-icon")
						}
					},
					onTipChange : function(b, c, d) {
						if (this.rendered) {
							var a = Ext.isDefined(d);
							if (this.textNode.setAttributeNS) {
								this.textNode.setAttributeNS("ext", "qtip", c);
								if (a) {
									this.textNode.setAttributeNS("ext",
											"qtitle", d)
								}
							} else {
								this.textNode.setAttribute("ext:qtip", c);
								if (a) {
									this.textNode.setAttribute("ext:qtitle", d)
								}
							}
						}
					},
					onHrefChange : function(b, a, c) {
						if (this.rendered) {
							this.anchor.href = this.getHref(a);
							if (Ext.isDefined(c)) {
								this.anchor.target = c
							}
						}
					},
					onClsChange : function(c, a, b) {
						if (this.rendered) {
							Ext.fly(this.elNode).replaceClass(b, a)
						}
					},
					onDisableChange : function(a, b) {
						this.disabled = b;
						if (this.checkbox) {
							this.checkbox.disabled = b
						}
						this[b ? "addClass" : "removeClass"]
								("x-tree-node-disabled")
					},
					onSelectedChange : function(a) {
						if (a) {
							this.focus();
							this.addClass("x-tree-selected")
						} else {
							this.removeClass("x-tree-selected")
						}
					},
					onMove : function(a, h, e, g, d, b) {
						this.childIndent = null;
						if (this.rendered) {
							var i = g.ui.getContainer();
							if (!i) {
								this.holder = document.createElement("div");
								this.holder.appendChild(this.wrap);
								return
							}
							var c = b ? b.ui.getEl() : null;
							if (c) {
								i.insertBefore(this.wrap, c)
							} else {
								i.appendChild(this.wrap)
							}
							this.node.renderIndent(true, e != g)
						}
					},
					addClass : function(a) {
						if (this.elNode) {
							Ext.fly(this.elNode).addClass(a)
						}
					},
					removeClass : function(a) {
						if (this.elNode) {
							Ext.fly(this.elNode).removeClass(a)
						}
					},
					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 b = this.node.getOwnerTree();
						var a = b.enableDD || b.enableDrag || b.enableDrop;
						if (a && (!this.node.isRoot || b.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(a) {
						if (this.node.hasListener("contextmenu")
								|| this.node.getOwnerTree().hasListener(
										"contextmenu")) {
							a.preventDefault();
							this.focus();
							this.fireEvent("contextmenu", this.node, a)
						}
					},
					onClick : function(c) {
						if (this.dropping) {
							c.stopEvent();
							return
						}
						if (this.fireEvent("beforeclick", this.node, c) !== false) {
							var b = c.getTarget("a");
							if (!this.disabled && this.node.attributes.href
									&& b) {
								this.fireEvent("click", this.node, c);
								return
							} else {
								if (b && c.ctrlKey) {
									c.stopEvent()
								}
							}
							c.preventDefault();
							if (this.disabled) {
								return
							}
							if (this.node.attributes.singleClickExpand
									&& !this.animating
									&& this.node.isExpandable()) {
								this.node.toggle()
							}
							this.fireEvent("click", this.node, c)
						} else {
							c.stopEvent()
						}
					},
					onDblClick : function(a) {
						a.preventDefault();
						if (this.disabled) {
							return
						}
						if (this.fireEvent("beforedblclick", this.node, a) !== false) {
							if (this.checkbox) {
								this.toggleCheck()
							}
							if (!this.animating && this.node.isExpandable()) {
								this.node.toggle()
							}
							this.fireEvent("dblclick", this.node, a)
						}
					},
					onOver : function(a) {
						this.addClass("x-tree-node-over")
					},
					onOut : function(a) {
						this.removeClass("x-tree-node-over")
					},
					onCheckChange : function() {
						var a = this.checkbox.checked;
						this.checkbox.defaultChecked = a;
						this.node.attributes.checked = a;
						this.fireEvent("checkchange", this.node, a)
					},
					ecClick : function(a) {
						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 (c) {
							}
						} else {
							try {
								var b = this.node.getOwnerTree().getTreeEl().dom;
								var a = b.scrollLeft;
								this.anchor.focus();
								b.scrollLeft = a
							} catch (c) {
							}
						}
					},
					toggleCheck : function(b) {
						var a = this.checkbox;
						if (a) {
							a.checked = (b === undefined ? !a.checked : b);
							this.onCheckChange()
						}
					},
					blur : function() {
						try {
							this.anchor.blur()
						} catch (a) {
						}
					},
					animExpand : function(b) {
						var a = Ext.get(this.ctNode);
						a.stopFx();
						if (!this.node.isExpandable()) {
							this.updateExpandIcon();
							this.ctNode.style.display = "";
							Ext.callback(b);
							return
						}
						this.animating = true;
						this.updateExpandIcon();
						a.slideIn("t", {
							callback : function() {
								this.animating = false;
								Ext.callback(b)
							},
							scope :this,
							duration :this.node.ownerTree.duration || 0.25
						})
					},
					highlight : function() {
						var a = this.node.getOwnerTree();
						Ext.fly(this.wrap).highlight(a.hlColor || "C3DAF9", {
							endColor :a.hlBaseColor
						})
					},
					collapse : function() {
						this.updateExpandIcon();
						this.ctNode.style.display = "none"
					},
					animCollapse : function(b) {
						var a = Ext.get(this.ctNode);
						a.enableDisplayMode("block");
						a.stopFx();
						this.animating = true;
						this.updateExpandIcon();
						a.slideOut("t", {
							callback : function() {
								this.animating = false;
								Ext.callback(b)
							},
							scope :this,
							duration :this.node.ownerTree.duration || 0.25
						})
					},
					getContainer : function() {
						return this.ctNode
					},
					getEl : function() {
						return this.wrap
					},
					appendDDGhost : function(a) {
						a.appendChild(this.elNode.cloneNode(true))
					},
					getDDRepairXY : function() {
						return Ext.lib.Dom.getXY(this.iconNode)
					},
					onRender : function() {
						this.render()
					},
					render : function(c) {
						var e = this.node, b = e.attributes;
						var d = e.parentNode ? e.parentNode.ui.getContainer()
								: e.ownerTree.innerCt.dom;
						if (!this.rendered) {
							this.rendered = true;
							this.renderElements(e, b, d, c);
							if (b.qtip) {
								this.onTipChange(e, b.qtip, b.qtipTitle)
							} else {
								if (b.qtipCfg) {
									b.qtipCfg.target = Ext.id(this.textNode);
									Ext.QuickTips.register(b.qtipCfg)
								}
							}
							this.initEvents();
							if (!this.node.expanded) {
								this.updateExpandIcon(true)
							}
						} else {
							if (c === true) {
								d.appendChild(this.wrap)
							}
						}
					},
					renderElements : function(e, l, k, m) {
						this.indentMarkup = e.parentNode ? e.parentNode.ui
								.getChildIndent() : "";
						var g = Ext.isBoolean(l.checked), b, c = this
								.getHref(l.href), d = [
								'<li class="x-tree-node"><div ext:tree-node-id="',
								e.id,
								'" class="x-tree-node-el x-tree-node-leaf x-unselectable ',
								l.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="',
								l.icon || this.emptyIcon,
								'" class="x-tree-node-icon',
								(l.icon ? " x-tree-node-inline-icon" : ""),
								(l.iconCls ? " " + l.iconCls : ""),
								'" unselectable="on" />',
								g ? ('<input class="x-tree-node-cb" type="checkbox" ' + (l.checked ? 'checked="checked" />'
										: "/>"))
										: "",
								'<a hidefocus="on" class="x-tree-node-anchor" href="',
								c,
								'" tabIndex="1" ',
								l.hrefTarget ? ' target="' + l.hrefTarget + '"'
										: "",
								'><span unselectable="on">',
								e.text,
								"</span></a></div>",
								'<ul class="x-tree-node-ct" style="display:none;"></ul>',
								"</li>" ].join("");
						if (m !== true && e.nextSibling
								&& (b = e.nextSibling.ui.getEl())) {
							this.wrap = Ext.DomHelper.insertHtml("beforeBegin",
									b, d)
						} else {
							this.wrap = Ext.DomHelper.insertHtml("beforeEnd",
									k, d)
						}
						this.elNode = this.wrap.childNodes[0];
						this.ctNode = this.wrap.childNodes[1];
						var i = this.elNode.childNodes;
						this.indentNode = i[0];
						this.ecNode = i[1];
						this.iconNode = i[2];
						var h = 3;
						if (g) {
							this.checkbox = i[3];
							this.checkbox.defaultChecked = this.checkbox.checked;
							h++
						}
						this.anchor = i[h];
						this.textNode = i[h].firstChild
					},
					getHref : function(a) {
						return Ext.isEmpty(a) ? (Ext.isGecko ? "" : "#") : a
					},
					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 g = this.node, d, c, a = g.isLast() ? "x-tree-elbow-end"
									: "x-tree-elbow", e = g.hasChildNodes();
							if (e || g.attributes.expandable) {
								if (g.expanded) {
									a += "-minus";
									d = "x-tree-node-collapsed";
									c = "x-tree-node-expanded"
								} else {
									a += "-plus";
									d = "x-tree-node-expanded";
									c = "x-tree-node-collapsed"
								}
								if (this.wasLeaf) {
									this.removeClass("x-tree-node-leaf");
									this.wasLeaf = false
								}
								if (this.c1 != d || this.c2 != c) {
									Ext.fly(this.elNode).replaceClass(d, c);
									this.c1 = d;
									this.c2 = c
								}
							} 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 b = "x-tree-ec-icon " + a;
							if (this.ecc != b) {
								this.ecNode.className = b;
								this.ecc = b
							}
						}
					},
					onIdChange : function(a) {
						if (this.rendered) {
							this.elNode.setAttribute("ext:tree-node-id", a)
						}
					},
					getChildIndent : function() {
						if (!this.childIndent) {
							var a = [], b = this.node;
							while (b) {
								if (!b.isRoot
										|| (b.isRoot && b.ownerTree.rootVisible)) {
									if (!b.isLast()) {
										a
												.unshift('<img alt="" src="' + this.emptyIcon + '" class="x-tree-elbow-line" />')
									} else {
										a
												.unshift('<img alt="" src="' + this.emptyIcon + '" class="x-tree-icon" />')
									}
								}
								b = b.parentNode
							}
							this.childIndent = a.join("")
						}
						return this.childIndent
					},
					renderIndent : function() {
						if (this.rendered) {
							var a = "", b = this.node.parentNode;
							if (b) {
								a = b.ui.getChildIndent()
							}
							if (this.indentMarkup != a) {
								this.indentNode.innerHTML = a;
								this.indentMarkup = a
							}
							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(a) {
							if (this[a]) {
								Ext.fly(this[a]).remove();
								delete this[a]
							}
						}, this);
						delete this.node
					}
				});
Ext.tree.RootTreeNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
	render : function() {
		if (!this.rendered) {
			var a = this.node.ownerTree.innerCt.dom;
			this.node.expanded = true;
			a.innerHTML = '<div class="x-tree-root-node"></div>';
			this.wrap = this.ctNode = a.firstChild
		}
	},
	collapse :Ext.emptyFn,
	expand :Ext.emptyFn
});
Ext.tree.TreeLoader = function(a) {
	this.baseParams = {};
	Ext.apply(this, a);
	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(b, c, a) {
						if (this.clearOnLoad) {
							while (b.firstChild) {
								b.removeChild(b.firstChild)
							}
						}
						if (this.doPreload(b)) {
							this.runCallback(c, a || b, [ b ])
						} else {
							if (this.directFn || this.dataUrl || this.url) {
								this.requestData(b, c, a || b)
							}
						}
					},
					doPreload : function(d) {
						if (d.attributes.children) {
							if (d.childNodes.length < 1) {
								var c = d.attributes.children;
								d.beginUpdate();
								for ( var b = 0, a = c.length; b < a; b++) {
									var e = d
											.appendChild(this.createNode(c[b]));
									if (this.preloadChildren) {
										this.doPreload(e)
									}
								}
								d.endUpdate()
							}
							return true
						}
						return false
					},
					getParams : function(g) {
						var e = Ext.apply( {}, this.baseParams), h = this.nodeParameter, b = this.paramOrder;
						h && (e[h] = g.id);
						if (this.directFn) {
							var c = [ g.id ];
							if (b) {
								if (h && b.indexOf(h) > -1) {
									c = []
								}
								for ( var d = 0, a = b.length; d < a; d++) {
									c.push(e[b[d]])
								}
							} else {
								if (this.paramsAsHash) {
									c = [ e ]
								}
							}
							return c
						} else {
							return e
						}
					},
					requestData : function(c, d, b) {
						if (this.fireEvent("beforeload", this, c, d) !== false) {
							if (this.directFn) {
								var a = this.getParams(c);
								a.push(this.processDirectResponse
										.createDelegate(this, [ {
											callback :d,
											node :c,
											scope :b
										} ], true));
								this.directFn.apply(window, a)
							} else {
								this.transId = Ext.Ajax.request( {
									method :this.requestMethod,
									url :this.dataUrl || this.url,
									success :this.handleResponse,
									failure :this.handleFailure,
									scope :this,
									argument : {
										callback :d,
										node :c,
										scope :b
									},
									params :this.getParams(c)
								})
							}
						} else {
							this.runCallback(d, b || c, [])
						}
					},
					processDirectResponse : function(a, b, c) {
						if (b.status) {
							this.handleResponse( {
								responseData :Ext.isArray(a) ? a : null,
								responseText :a,
								argument :c
							})
						} else {
							this.handleFailure( {
								argument :c
							})
						}
					},
					runCallback : function(a, c, b) {
						if (Ext.isFunction(a)) {
							a.apply(c, b)
						}
					},
					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(d, c, l, m) {
						var p = d.responseText;
						try {
							var a = d.responseData || Ext.decode(p);
							c.beginUpdate();
							for ( var g = 0, h = a.length; g < h; g++) {
								var b = this.createNode(a[g]);
								if (b) {
									c.appendChild(b)
								}
							}
							c.endUpdate();
							this.runCallback(l, m || c, [ c ])
						} catch (k) {
							this.handleFailure(d)
						}
					},
					handleResponse : function(c) {
						this.transId = false;
						var b = c.argument;
						this.processResponse(c, b.node, b.callback, b.scope);
						this.fireEvent("load", this, b.node, c)
					},
					handleFailure : function(c) {
						this.transId = false;
						var b = c.argument;
						this.fireEvent("loadexception", this, b.node, c);
						this.runCallback(b.callback, b.scope || b.node,
								[ b.node ])
					},
					destroy : function() {
						this.abort();
						this.purgeListeners()
					}
				});
Ext.tree.TreeFilter = function(a, b) {
	this.tree = a;
	this.filtered = {};
	Ext.apply(this, b)
};
Ext.tree.TreeFilter.prototype = {
	clearBlank :false,
	reverse :false,
	autoClear :false,
	remove :false,
	filter : function(d, a, b) {
		a = a || "text";
		var c;
		if (typeof d == "string") {
			var e = d.length;
			if (e == 0 && this.clearBlank) {
				this.clear();
				return
			}
			d = d.toLowerCase();
			c = function(g) {
				return g.attributes[a].substr(0, e).toLowerCase() == d
			}
		} else {
			if (d.exec) {
				c = function(g) {
					return d.test(g.attributes[a])
				}
			} else {
				throw "Illegal filter type, must be string or regex"
			}
		}
		this.filterBy(c, null, b)
	},
	filterBy : function(d, c, b) {
		b = b || this.tree.root;
		if (this.autoClear) {
			this.clear()
		}
		var a = this.filtered, i = this.reverse;
		var e = function(l) {
			if (l == b) {
				return true
			}
			if (a[l.id]) {
				return false
			}
			var k = d.call(c || l, l);
			if (!k || i) {
				a[l.id] = l;
				l.ui.hide();
				return false
			}
			return true
		};
		b.cascade(e);
		if (this.remove) {
			for ( var h in a) {
				if (typeof h != "function") {
					var g = a[h];
					if (g && g.parentNode) {
						g.parentNode.removeChild(g)
					}
				}
			}
		}
	},
	clear : function() {
		var b = this.tree;
		var a = this.filtered;
		for ( var d in a) {
			if (typeof d != "function") {
				var c = a[d];
				if (c) {
					c.ui.show()
				}
			}
		}
		this.filtered = {}
	}
};
Ext.tree.TreeSorter = Ext
		.extend(
				Object,
				{
					constructor : function(a, b) {
						Ext.apply(this, b);
						a.on( {
							scope :this,
							beforechildrenrendered :this.doSort,
							append :this.updateSort,
							insert :this.updateSort,
							textchange :this.updateSortParent
						});
						var c = this.dir && this.dir.toLowerCase() == "desc", d = 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(l, i) {
							var g = l.attributes, e = i.attributes;
							if (folderSort) {
								if (g[leafAttr] && !e[leafAttr]) {
									return 1
								}
								if (!g[leafAttr] && e[leafAttr]) {
									return -1
								}
							}
							var k = g[d], h = e[d], m = sortType ? sortType(k)
									: (caseSensitive ? k : k.toUpperCase());
							v2 = sortType ? sortType(h) : (caseSensitive ? h
									: h.toUpperCase());
							if (m < v2) {
								return c ? 1 : -1
							} else {
								if (m > v2) {
									return c ? -1 : 1
								}
							}
							return 0
						}
					},
					doSort : function(a) {
						a.sort(this.sortFn)
					},
					updateSort : function(a, b) {
						if (b.childrenRendered) {
							this.doSort.defer(1, this, [ b ])
						}
					},
					updateSortParent : function(a) {
						var b = a.parentNode;
						if (b && b.childrenRendered) {
							this.doSort.defer(1, this, [ b ])
						}
					}
				});
if (Ext.dd.DropZone) {
	Ext.tree.TreeDropZone = function(a, b) {
		this.allowParentInsert = b.allowParentInsert || false;
		this.allowContainerDrop = b.allowContainerDrop || false;
		this.appendOnly = b.appendOnly || false;
		Ext.tree.TreeDropZone.superclass.constructor.call(this, a.getTreeEl(),
				b);
		this.tree = a;
		this.dragOverData = {};
		this.lastInsertClass = "x-tree-no-status"
	};
	Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, {
		ddGroup :"TreeDD",
		expandDelay :1000,
		expandNode : function(a) {
			if (a.hasChildNodes() && !a.isExpanded()) {
				a.expand(false, null, this.triggerCacheRefresh
						.createDelegate(this))
			}
		},
		queueExpand : function(a) {
			this.expandProcId = this.expandNode.defer(this.expandDelay, this,
					[ a ])
		},
		cancelExpand : function() {
			if (this.expandProcId) {
				clearTimeout(this.expandProcId);
				this.expandProcId = false
			}
		},
		isValidDropPoint : function(a, l, i, d, c) {
			if (!a || !c) {
				return false
			}
			var g = a.node;
			var h = c.node;
			if (!(g && g.isTarget && l)) {
				return false
			}
			if (l == "append" && g.allowChildren === false) {
				return false
			}
			if ((l == "above" || l == "below")
					&& (g.parentNode && g.parentNode.allowChildren === false)) {
				return false
			}
			if (h && (g == h || h.contains(g))) {
				return false
			}
			var b = this.dragOverData;
			b.tree = this.tree;
			b.target = g;
			b.data = c;
			b.point = l;
			b.source = i;
			b.rawEvent = d;
			b.dropNode = h;
			b.cancel = false;
			var k = this.tree.fireEvent("nodedragover", b);
			return b.cancel === false && k !== false
		},
		getDropPoint : function(h, g, m) {
			var o = g.node;
			if (o.isRoot) {
				return o.allowChildren !== false ? "append" : false
			}
			var c = g.ddel;
			var p = Ext.lib.Dom.getY(c), k = p + c.offsetHeight;
			var i = Ext.lib.Event.getPageY(h);
			var l = o.allowChildren === false || o.isLeaf();
			if (this.appendOnly || o.parentNode.allowChildren === false) {
				return l ? false : "append"
			}
			var d = false;
			if (!this.allowParentInsert) {
				d = o.hasChildNodes() && o.isExpanded()
			}
			var a = (k - p) / (l ? 2 : 3);
			if (i >= p && i < (p + a)) {
				return "above"
			} else {
				if (!d && (l || i >= k - a && i <= k)) {
					return "below"
				} else {
					return "append"
				}
			}
		},
		onNodeEnter : function(d, a, c, b) {
			this.cancelExpand()
		},
		onContainerOver : function(a, c, b) {
			if (this.allowContainerDrop && this.isValidDropPoint( {
				ddel :this.tree.getRootNode().ui.elNode,
				node :this.tree.getRootNode()
			}, "append", a, c, b)) {
				return this.dropAllowed
			}
			return this.dropNotAllowed
		},
		onNodeOver : function(b, i, h, g) {
			var l = this.getDropPoint(h, b, i);
			var c = b.node;
			if (!this.expandProcId && l == "append" && c.hasChildNodes()
					&& !b.node.isExpanded()) {
				this.queueExpand(c)
			} else {
				if (l != "append") {
					this.cancelExpand()
				}
			}
			var d = this.dropNotAllowed;
			if (this.isValidDropPoint(b, l, i, h, g)) {
				if (l) {
					var a = b.ddel;
					var k;
					if (l == "above") {
						d = b.node.isFirst() ? "x-tree-drop-ok-above"
								: "x-tree-drop-ok-between";
						k = "x-tree-drag-insert-above"
					} else {
						if (l == "below") {
							d = b.node.isLast() ? "x-tree-drop-ok-below"
									: "x-tree-drop-ok-between";
							k = "x-tree-drag-insert-below"
						} else {
							d = "x-tree-drop-ok-append";
							k = "x-tree-drag-append"
						}
					}
					if (this.lastInsertClass != k) {
						Ext.fly(a).replaceClass(this.lastInsertClass, k);
						this.lastInsertClass = k
					}
				}
			}
			return d
		},
		onNodeOut : function(d, a, c, b) {
			this.cancelExpand();
			this.removeDropIndicators(d)
		},
		onNodeDrop : function(i, b, h, d) {
			var a = this.getDropPoint(h, i, b);
			var g = i.node;
			g.ui.startDrop();
			if (!this.isValidDropPoint(i, a, b, h, d)) {
				g.ui.endDrop();
				return false
			}
			var c = d.node
					|| (b.getTreeNode ? b.getTreeNode(d, g, a, h) : null);
			return this.processDrop(g, d, a, b, h, c)
		},
		onContainerDrop : function(a, g, c) {
			if (this.allowContainerDrop && this.isValidDropPoint( {
				ddel :this.tree.getRootNode().ui.elNode,
				node :this.tree.getRootNode()
			}, "append", a, g, c)) {
				var d = this.tree.getRootNode();
				d.ui.startDrop();
				var b = c.node
						|| (a.getTreeNode ? a.getTreeNode(c, d, "append", g)
								: null);
				return this.processDrop(d, c, "append", a, g, b)
			}
			return false
		},
		processDrop : function(k, h, b, a, i, d) {
			var g = {
				tree :this.tree,
				target :k,
				data :h,
				point :b,
				source :a,
				rawEvent :i,
				dropNode :d,
				cancel :!d,
				dropStatus :false
			};
			var c = this.tree.fireEvent("beforenodedrop", g);
			if (c === false || g.cancel === true || !g.dropNode) {
				k.ui.endDrop();
				return g.dropStatus
			}
			k = g.target;
			if (b == "append" && !k.isExpanded()) {
				k.expand(false, null, function() {
					this.completeDrop(g)
				}.createDelegate(this))
			} else {
				this.completeDrop(g)
			}
			return true
		},
		completeDrop : function(h) {
			var d = h.dropNode, e = h.point, c = h.target;
			if (!Ext.isArray(d)) {
				d = [ d ]
			}
			var g;
			for ( var b = 0, a = d.length; b < a; b++) {
				g = d[b];
				if (e == "above") {
					c.parentNode.insertBefore(g, c)
				} else {
					if (e == "below") {
						c.parentNode.insertBefore(g, c.nextSibling)
					} else {
						c.appendChild(g)
					}
				}
			}
			g.ui.focus();
			if (Ext.enableFx && this.tree.hlDrop) {
				g.ui.highlight()
			}
			c.ui.endDrop();
			this.tree.fireEvent("nodedrop", h)
		},
		afterNodeMoved : function(a, c, g, d, b) {
			if (Ext.enableFx && this.tree.hlDrop) {
				b.ui.focus();
				b.ui.highlight()
			}
			this.tree.fireEvent("nodedrop", this.tree, d, c, a, g)
		},
		getTree : function() {
			return this.tree
		},
		removeDropIndicators : function(b) {
			if (b && b.ddel) {
				var a = b.ddel;
				Ext.fly(a).removeClass(
						[ "x-tree-drag-insert-above",
								"x-tree-drag-insert-below",
								"x-tree-drag-append" ]);
				this.lastInsertClass = "_noclass"
			}
		},
		beforeDragDrop : function(b, a, c) {
			this.cancelExpand();
			return true
		},
		afterRepair : function(a) {
			if (a && Ext.enableFx) {
				a.node.ui.highlight()
			}
			this.hideProxy()
		}
	})
}
if (Ext.dd.DragZone) {
	Ext.tree.TreeDragZone = function(a, b) {
		Ext.tree.TreeDragZone.superclass.constructor.call(this, a.innerCt, b);
		this.tree = a
	};
	Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone,
			{
				ddGroup :"TreeDD",
				onBeforeDrag : function(a, b) {
					var c = a.node;
					return c && c.draggable && !c.disabled
				},
				onInitDrag : function(b) {
					var a = this.dragData;
					this.tree.getSelectionModel().select(a.node);
					this.tree.eventModel.disable();
					this.proxy.update("");
					a.node.ui.appendDDGhost(this.proxy.ghost.dom);
					this.tree.fireEvent("startdrag", this.tree, a.node, b)
				},
				getRepairXY : function(b, a) {
					return a.node.ui.getDDRepairXY()
				},
				onEndDrag : function(a, b) {
					this.tree.eventModel.enable
							.defer(100, this.tree.eventModel);
					this.tree.fireEvent("enddrag", this.tree, a.node, b)
				},
				onValidDrop : function(a, b, c) {
					this.tree.fireEvent("dragdrop", this.tree,
							this.dragData.node, a, b);
					this.hideProxy()
				},
				beforeInvalidDrop : function(a, c) {
					var b = this.tree.getSelectionModel();
					b.clearSelections();
					b.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(a, c, b) {
	c = c || {};
	var d = c.events ? c : new Ext.form.TextField(c);
	Ext.tree.TreeEditor.superclass.constructor.call(this, d, b);
	this.tree = a;
	if (!a.rendered) {
		a.on("render", this.initEditor, this)
	} else {
		this.initEditor(a)
	}
};
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(a) {
		a.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(b, c) {
		var e = this.tree.getTreeEl().dom, d = c.dom;
		if (e.scrollLeft > d.offsetLeft) {
			e.scrollLeft = d.offsetLeft
		}
		var a = Math.min(this.maxWidth, (e.clientWidth > 20 ? e.clientWidth
				: e.offsetWidth)
				- Math.max(0, d.offsetLeft - e.scrollLeft) - 5);
		this.setSize(a, "")
	},
	triggerEdit : function(a, c) {
		this.completeEdit();
		if (a.attributes.editable !== false) {
			this.editNode = a;
			if (this.tree.autoScroll) {
				Ext.fly(a.ui.getEl()).scrollIntoView(this.tree.body)
			}
			var b = a.text || "";
			if (!Ext.isGecko && Ext.isEmpty(a.text)) {
				a.setText("&#160;")
			}
			this.autoEditTimer = this.startEdit.defer(this.editDelay, this, [
					a.ui.textNode, b ]);
			return false
		}
	},
	bindScroll : function() {
		this.tree.getTreeEl().on("scroll", this.cancelEdit, this)
	},
	beforeNodeClick : function(a, b) {
		clearTimeout(this.autoEditTimer);
		if (this.tree.getSelectionModel().isSelected(a)) {
			b.stopEvent();
			return this.triggerEdit(a)
		}
	},
	onNodeDblClick : function(a, b) {
		clearTimeout(this.autoEditTimer)
	},
	updateNode : function(a, b) {
		this.tree.getTreeEl().un("scroll", this.cancelEdit, this);
		this.editNode.setText(b)
	},
	onHide : function() {
		Ext.tree.TreeEditor.superclass.onHide.call(this);
		if (this.editNode) {
			this.editNode.ui.focus.defer(50, this.editNode.ui)
		}
	},
	onSpecialKey : function(c, b) {
		var a = b.getKey();
		if (a == b.ESC) {
			b.stopEvent();
			this.cancelEdit()
		} else {
			if (a == b.ENTER && !b.hasModifier()) {
				b.stopEvent();
				this.completeEdit()
			}
		}
	},
	onDestroy : function() {
		clearTimeout(this.autoEditTimer);
		Ext.tree.TreeEditor.superclass.onDestroy.call(this);
		var a = this.tree;
		a.un("beforeclick", this.beforeNodeClick, this);
		a.un("dblclick", this.onNodeDblClick, this)
	}
});
/*
 * SWFObject v2.2 <http://code.google.com/p/swfobject/> is released under the
 * MIT License <http://www.opensource.org/licenses/mit-license.php>
 */
var swfobject = function() {
	var F = "undefined", t = "object", U = "Shockwave Flash", Y = "ShockwaveFlash.ShockwaveFlash", s = "application/x-shockwave-flash", T = "SWFObjectExprInst", z = "onreadystatechange", Q = window, l = document, v = navigator, V = false, W = [ i ], q = [], P = [], K = [], n, S, G, D, L = false, a = false, p, I, o = true, O = function() {
		var ac = typeof l.getElementById != F
				&& typeof l.getElementsByTagName != F
				&& typeof l.createElement != F, aj = v.userAgent.toLowerCase(), aa = v.platform
				.toLowerCase(), ag = aa ? (/win/).test(aa) : /win/.test(aj), ae = aa ? (/mac/)
				.test(aa)
				: /mac/.test(aj), ah = /webkit/.test(aj) ? parseFloat(aj
				.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, Z = !+"\v1", ai = [
				0, 0, 0 ], ad = null;
		if (typeof v.plugins != F && typeof v.plugins[U] == t) {
			ad = v.plugins[U].description;
			if (ad
					&& !(typeof v.mimeTypes != F && v.mimeTypes[s] && !v.mimeTypes[s].enabledPlugin)) {
				V = true;
				Z = false;
				ad = ad.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
				ai[0] = parseInt(ad.replace(/^(.*)\..*$/, "$1"), 10);
				ai[1] = parseInt(ad.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
				ai[2] = /[a-zA-Z]/.test(ad) ? parseInt(ad.replace(
						/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0
			}
		} else {
			if (typeof Q.ActiveXObject != F) {
				try {
					var af = new ActiveXObject(Y);
					if (af) {
						ad = af.GetVariable("$version");
						if (ad) {
							Z = true;
							ad = ad.split(" ")[1].split(",");
							ai = [ parseInt(ad[0], 10), parseInt(ad[1], 10),
									parseInt(ad[2], 10) ]
						}
					}
				} catch (ab) {
				}
			}
		}
		return {
			w3 :ac,
			pv :ai,
			wk :ah,
			ie :Z,
			win :ag,
			mac :ae
		}
	}(), m = function() {
		if (!O.w3) {
			return
		}
		if ((typeof l.readyState != F && l.readyState == "complete")
				|| (typeof l.readyState == F && (l.getElementsByTagName("body")[0] || l.body))) {
			g()
		}
		if (!L) {
			if (typeof l.addEventListener != F) {
				l.addEventListener("DOMContentLoaded", g, false)
			}
			if (O.ie && O.win) {
				l.attachEvent(z, function() {
					if (l.readyState == "complete") {
						l.detachEvent(z, arguments.callee);
						g()
					}
				});
				if (Q == top) {
					( function() {
						if (L) {
							return
						}
						try {
							l.documentElement.doScroll("left")
						} catch (Z) {
							setTimeout(arguments.callee, 0);
							return
						}
						g()
					})()
				}
			}
			if (O.wk) {
				( function() {
					if (L) {
						return
					}
					if (!(/loaded|complete/).test(l.readyState)) {
						setTimeout(arguments.callee, 0);
						return
					}
					g()
				})()
			}
			u(g)
		}
	}();
	function g() {
		if (L) {
			return
		}
		try {
			var ab = l.getElementsByTagName("body")[0].appendChild(E("span"));
			ab.parentNode.removeChild(ab)
		} catch (ac) {
			return
		}
		L = true;
		var Z = W.length;
		for ( var aa = 0; aa < Z; aa++) {
			W[aa]()
		}
	}
	function M(Z) {
		if (L) {
			Z()
		} else {
			W[W.length] = Z
		}
	}
	function u(aa) {
		if (typeof Q.addEventListener != F) {
			Q.addEventListener("load", aa, false)
		} else {
			if (typeof l.addEventListener != F) {
				l.addEventListener("load", aa, false)
			} else {
				if (typeof Q.attachEvent != F) {
					k(Q, "onload", aa)
				} else {
					if (typeof Q.onload == "function") {
						var Z = Q.onload;
						Q.onload = function() {
							Z();
							aa()
						}
					} else {
						Q.onload = aa
					}
				}
			}
		}
	}
	function i() {
		if (V) {
			X()
		} else {
			J()
		}
	}
	function X() {
		var Z = l.getElementsByTagName("body")[0];
		var ac = E(t);
		ac.setAttribute("type", s);
		var ab = Z.appendChild(ac);
		if (ab) {
			var aa = 0;
			( function() {
				if (typeof ab.GetVariable != F) {
					var ad = ab.GetVariable("$version");
					if (ad) {
						ad = ad.split(" ")[1].split(",");
						O.pv = [ parseInt(ad[0], 10), parseInt(ad[1], 10),
								parseInt(ad[2], 10) ]
					}
				} else {
					if (aa < 10) {
						aa++;
						setTimeout(arguments.callee, 10);
						return
					}
				}
				Z.removeChild(ac);
				ab = null;
				J()
			})()
		} else {
			J()
		}
	}
	function J() {
		var ai = q.length;
		if (ai > 0) {
			for ( var ah = 0; ah < ai; ah++) {
				var aa = q[ah].id;
				var ad = q[ah].callbackFn;
				var ac = {
					success :false,
					id :aa
				};
				if (O.pv[0] > 0) {
					var ag = c(aa);
					if (ag) {
						if (H(q[ah].swfVersion) && !(O.wk && O.wk < 312)) {
							y(aa, true);
							if (ad) {
								ac.success = true;
								ac.ref = B(aa);
								ad(ac)
							}
						} else {
							if (q[ah].expressInstall && C()) {
								var ak = {};
								ak.data = q[ah].expressInstall;
								ak.width = ag.getAttribute("width") || "0";
								ak.height = ag.getAttribute("height") || "0";
								if (ag.getAttribute("class")) {
									ak.styleclass = ag.getAttribute("class")
								}
								if (ag.getAttribute("align")) {
									ak.align = ag.getAttribute("align")
								}
								var aj = {};
								var Z = ag.getElementsByTagName("param");
								var ae = Z.length;
								for ( var af = 0; af < ae; af++) {
									if (Z[af].getAttribute("name")
											.toLowerCase() != "movie") {
										aj[Z[af].getAttribute("name")] = Z[af]
												.getAttribute("value")
									}
								}
								R(ak, aj, aa, ad)
							} else {
								r(ag);
								if (ad) {
									ad(ac)
								}
							}
						}
					}
				} else {
					y(aa, true);
					if (ad) {
						var ab = B(aa);
						if (ab && typeof ab.SetVariable != F) {
							ac.success = true;
							ac.ref = ab
						}
						ad(ac)
					}
				}
			}
		}
	}
	function B(ac) {
		var Z = null;
		var aa = c(ac);
		if (aa && aa.nodeName == "OBJECT") {
			if (typeof aa.SetVariable != F) {
				Z = aa
			} else {
				var ab = aa.getElementsByTagName(t)[0];
				if (ab) {
					Z = ab
				}
			}
		}
		return Z
	}
	function C() {
		return !a && H("6.0.65") && (O.win || O.mac) && !(O.wk && O.wk < 312)
	}
	function R(ac, ad, Z, ab) {
		a = true;
		G = ab || null;
		D = {
			success :false,
			id :Z
		};
		var ag = c(Z);
		if (ag) {
			if (ag.nodeName == "OBJECT") {
				n = h(ag);
				S = null
			} else {
				n = ag;
				S = Z
			}
			ac.id = T;
			if (typeof ac.width == F
					|| (!(/%$/).test(ac.width) && parseInt(ac.width, 10) < 310)) {
				ac.width = "310"
			}
			if (typeof ac.height == F
					|| (!(/%$/).test(ac.height) && parseInt(ac.height, 10) < 137)) {
				ac.height = "137"
			}
			l.title = l.title.slice(0, 47) + " - Flash Player Installation";
			var af = O.ie && O.win ? "ActiveX" : "PlugIn", ae = "MMredirectURL="
					+ Q.location.toString().replace(/&/g, "%26")
					+ "&MMplayerType=" + af + "&MMdoctitle=" + l.title;
			if (typeof ad.flashvars != F) {
				ad.flashvars += "&" + ae
			} else {
				ad.flashvars = ae
			}
			if (O.ie && O.win && ag.readyState != 4) {
				var aa = E("div");
				Z += "SWFObjectNew";
				aa.setAttribute("id", Z);
				ag.parentNode.insertBefore(aa, ag);
				ag.style.display = "none";
				( function() {
					if (ag.readyState == 4) {
						ag.parentNode.removeChild(ag)
					} else {
						setTimeout(arguments.callee, 10)
					}
				})()
			}
			w(ac, ad, Z)
		}
	}
	function r(aa) {
		if (O.ie && O.win && aa.readyState != 4) {
			var Z = E("div");
			aa.parentNode.insertBefore(Z, aa);
			Z.parentNode.replaceChild(h(aa), Z);
			aa.style.display = "none";
			( function() {
				if (aa.readyState == 4) {
					aa.parentNode.removeChild(aa)
				} else {
					setTimeout(arguments.callee, 10)
				}
			})()
		} else {
			aa.parentNode.replaceChild(h(aa), aa)
		}
	}
	function h(ae) {
		var ad = E("div");
		if (O.win && O.ie) {
			ad.innerHTML = ae.innerHTML
		} else {
			var aa = ae.getElementsByTagName(t)[0];
			if (aa) {
				var af = aa.childNodes;
				if (af) {
					var Z = af.length;
					for ( var ab = 0; ab < Z; ab++) {
						if (!(af[ab].nodeType == 1 && af[ab].nodeName == "PARAM")
								&& !(af[ab].nodeType == 8)) {
							ad.appendChild(af[ab].cloneNode(true))
						}
					}
				}
			}
		}
		return ad
	}
	function w(ak, ai, aa) {
		var Z, ac = c(aa);
		if (O.wk && O.wk < 312) {
			return Z
		}
		if (ac) {
			if (typeof ak.id == F) {
				ak.id = aa
			}
			if (O.ie && O.win) {
				var aj = "";
				for ( var ag in ak) {
					if (ak[ag] != Object.prototype[ag]) {
						if (ag.toLowerCase() == "data") {
							ai.movie = ak[ag]
						} else {
							if (ag.toLowerCase() == "styleclass") {
								aj += ' class="' + ak[ag] + '"'
							} else {
								if (ag.toLowerCase() != "classid") {
									aj += " " + ag + '="' + ak[ag] + '"'
								}
							}
						}
					}
				}
				var ah = "";
				for ( var af in ai) {
					if (ai[af] != Object.prototype[af]) {
						ah += '<param name="' + af + '" value="' + ai[af]
								+ '" />'
					}
				}
				ac.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'
						+ aj + ">" + ah + "</object>";
				P[P.length] = ak.id;
				Z = c(ak.id)
			} else {
				var ab = E(t);
				ab.setAttribute("type", s);
				for ( var ae in ak) {
					if (ak[ae] != Object.prototype[ae]) {
						if (ae.toLowerCase() == "styleclass") {
							ab.setAttribute("class", ak[ae])
						} else {
							if (ae.toLowerCase() != "classid") {
								ab.setAttribute(ae, ak[ae])
							}
						}
					}
				}
				for ( var ad in ai) {
					if (ai[ad] != Object.prototype[ad]
							&& ad.toLowerCase() != "movie") {
						e(ab, ad, ai[ad])
					}
				}
				ac.parentNode.replaceChild(ab, ac);
				Z = ab
			}
		}
		return Z
	}
	function e(ab, Z, aa) {
		var ac = E("param");
		ac.setAttribute("name", Z);
		ac.setAttribute("value", aa);
		ab.appendChild(ac)
	}
	function A(aa) {
		var Z = c(aa);
		if (Z && Z.nodeName == "OBJECT") {
			if (O.ie && O.win) {
				Z.style.display = "none";
				( function() {
					if (Z.readyState == 4) {
						b(aa)
					} else {
						setTimeout(arguments.callee, 10)
					}
				})()
			} else {
				Z.parentNode.removeChild(Z)
			}
		}
	}
	function b(ab) {
		var aa = c(ab);
		if (aa) {
			for ( var Z in aa) {
				if (typeof aa[Z] == "function") {
					aa[Z] = null
				}
			}
			aa.parentNode.removeChild(aa)
		}
	}
	function c(ab) {
		var Z = null;
		try {
			Z = l.getElementById(ab)
		} catch (aa) {
		}
		return Z
	}
	function E(Z) {
		return l.createElement(Z)
	}
	function k(ab, Z, aa) {
		ab.attachEvent(Z, aa);
		K[K.length] = [ ab, Z, aa ]
	}
	function H(ab) {
		var aa = O.pv, Z = ab.split(".");
		Z[0] = parseInt(Z[0], 10);
		Z[1] = parseInt(Z[1], 10) || 0;
		Z[2] = parseInt(Z[2], 10) || 0;
		return (aa[0] > Z[0] || (aa[0] == Z[0] && aa[1] > Z[1]) || (aa[0] == Z[0]
				&& aa[1] == Z[1] && aa[2] >= Z[2])) ? true : false
	}
	function x(ae, aa, af, ad) {
		if (O.ie && O.mac) {
			return
		}
		var ac = l.getElementsByTagName("head")[0];
		if (!ac) {
			return
		}
		var Z = (af && typeof af == "string") ? af : "screen";
		if (ad) {
			p = null;
			I = null
		}
		if (!p || I != Z) {
			var ab = E("style");
			ab.setAttribute("type", "text/css");
			ab.setAttribute("media", Z);
			p = ac.appendChild(ab);
			if (O.ie && O.win && typeof l.styleSheets != F
					&& l.styleSheets.length > 0) {
				p = l.styleSheets[l.styleSheets.length - 1]
			}
			I = Z
		}
		if (O.ie && O.win) {
			if (p && typeof p.addRule == t) {
				p.addRule(ae, aa)
			}
		} else {
			if (p && typeof l.createTextNode != F) {
				p.appendChild(l.createTextNode(ae + " {" + aa + "}"))
			}
		}
	}
	function y(ab, Z) {
		if (!o) {
			return
		}
		var aa = Z ? "visible" : "hidden";
		if (L && c(ab)) {
			c(ab).style.visibility = aa
		} else {
			x("#" + ab, "visibility:" + aa)
		}
	}
	function N(aa) {
		var ab = /[\\\"<>\.;]/;
		var Z = ab.exec(aa) != null;
		return Z && typeof encodeURIComponent != F ? encodeURIComponent(aa)
				: aa
	}
	var d = function() {
		if (O.ie && O.win) {
			window.attachEvent("onunload", function() {
				var ae = K.length;
				for ( var ad = 0; ad < ae; ad++) {
					K[ad][0].detachEvent(K[ad][1], K[ad][2])
				}
				var ab = P.length;
				for ( var ac = 0; ac < ab; ac++) {
					A(P[ac])
				}
				for ( var aa in O) {
					O[aa] = null
				}
				O = null;
				for ( var Z in swfobject) {
					swfobject[Z] = null
				}
				swfobject = null
			})
		}
	}();
	return {
		registerObject : function(ad, Z, ac, ab) {
			if (O.w3 && ad && Z) {
				var aa = {};
				aa.id = ad;
				aa.swfVersion = Z;
				aa.expressInstall = ac;
				aa.callbackFn = ab;
				q[q.length] = aa;
				y(ad, false)
			} else {
				if (ab) {
					ab( {
						success :false,
						id :ad
					})
				}
			}
		},
		getObjectById : function(Z) {
			if (O.w3) {
				return B(Z)
			}
		},
		embedSWF : function(ad, aj, ag, ai, aa, ac, ab, af, ah, ae) {
			var Z = {
				success :false,
				id :aj
			};
			if (O.w3 && !(O.wk && O.wk < 312) && ad && aj && ag && ai && aa) {
				y(aj, false);
				M( function() {
					ag += "";
					ai += "";
					var al = {};
					if (ah && typeof ah === t) {
						for ( var an in ah) {
							al[an] = ah[an]
						}
					}
					al.data = ad;
					al.width = ag;
					al.height = ai;
					var ao = {};
					if (af && typeof af === t) {
						for ( var am in af) {
							ao[am] = af[am]
						}
					}
					if (ab && typeof ab === t) {
						for ( var ak in ab) {
							if (typeof ao.flashvars != F) {
								ao.flashvars += "&" + ak + "=" + ab[ak]
							} else {
								ao.flashvars = ak + "=" + ab[ak]
							}
						}
					}
					if (H(aa)) {
						var ap = w(al, ao, aj);
						if (al.id == aj) {
							y(aj, true)
						}
						Z.success = true;
						Z.ref = ap
					} else {
						if (ac && C()) {
							al.data = ac;
							R(al, ao, aj, ae);
							return
						} else {
							y(aj, true)
						}
					}
					if (ae) {
						ae(Z)
					}
				})
			} else {
				if (ae) {
					ae(Z)
				}
			}
		},
		switchOffAutoHideShow : function() {
			o = false
		},
		ua :O,
		getFlashPlayerVersion : function() {
			return {
				major :O.pv[0],
				minor :O.pv[1],
				release :O.pv[2]
			}
		},
		hasFlashPlayerVersion :H,
		createSWF : function(ab, aa, Z) {
			if (O.w3) {
				return w(ab, aa, Z)
			} else {
				return undefined
			}
		},
		showExpressInstall : function(ab, ac, Z, aa) {
			if (O.w3 && C()) {
				R(ab, ac, Z, aa)
			}
		},
		removeSWF : function(Z) {
			if (O.w3) {
				A(Z)
			}
		},
		createCSS : function(ac, ab, aa, Z) {
			if (O.w3) {
				x(ac, ab, aa, Z)
			}
		},
		addDomLoadEvent :M,
		addLoadEvent :u,
		getQueryParamValue : function(ac) {
			var ab = l.location.search || l.location.hash;
			if (ab) {
				if (/\?/.test(ab)) {
					ab = ab.split("?")[1]
				}
				if (ac == null) {
					return N(ab)
				}
				var aa = ab.split("&");
				for ( var Z = 0; Z < aa.length; Z++) {
					if (aa[Z].substring(0, aa[Z].indexOf("=")) == ac) {
						return N(aa[Z].substring((aa[Z].indexOf("=") + 1)))
					}
				}
			}
			return ""
		},
		expressInstallCallback : function() {
			if (a) {
				var Z = c(T);
				if (Z && n) {
					Z.parentNode.replaceChild(n, Z);
					if (S) {
						y(S, true);
						if (O.ie && O.win) {
							n.style.display = "block"
						}
					}
					if (G) {
						G(D)
					}
				}
				a = 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 b = Ext.apply( {
			allowScriptAccess :"always",
			bgcolor :this.backgroundColor,
			wmode :this.wmode
		}, this.flashParams), a = 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, a, b);
		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(a) {
		switch (a.type) {
		case "swfReady":
			this.initSwf();
			return;
		case "log":
			return
		}
		a.component = this;
		this.fireEvent(a.type.toLowerCase().replace(/event$/, ""), a)
	},
	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(c, b) {
		var a = Ext.getCmp(c);
		if (a) {
			a.onFlashEvent(b)
		} else {
			arguments.callee.defer(10, this, [ c, b ])
		}
	}
};
Ext.chart.Chart = Ext.extend(Ext.FlashComponent, {
	refreshBuffer :100,
	chartStyle : {
		padding :10,
		animationEnabled :true,
		font : {
			name :"Tahoma",
			color :4473924,
			size :11
		},
		dataTip : {
			padding :5,
			border : {
				color :10075112,
				size :1
			},
			background : {
				color :14346230,
				alpha :0.9
			},
			font : {
				name :"Tahoma",
				color :1393291,
				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(a, b) {
		this.swf.setStyle(a, Ext.encode(b))
	},
	setStyles : function(a) {
		this.swf.setStyles(Ext.encode(a))
	},
	setSeriesStyles : function(b) {
		this.seriesStyles = b;
		var a = [];
		Ext.each(b, function(c) {
			a.push(Ext.encode(c))
		});
		this.swf.setSeriesStyles(a)
	},
	setCategoryNames : function(a) {
		this.swf.setCategoryNames(a)
	},
	setLegendRenderer : function(c, b) {
		var a = this;
		b = b || a;
		a.removeFnProxy(a.legendFnName);
		a.legendFnName = a.createFnProxy( function(d) {
			return c.call(b, d)
		});
		a.swf.setLegendLabelFunction(a.legendFnName)
	},
	setTipRenderer : function(c, b) {
		var a = this;
		b = b || a;
		a.removeFnProxy(a.tipFnName);
		a.tipFnName = a.createFnProxy( function(h, e, g) {
			var d = a.store.getAt(e);
			return c.call(b, a, d, e, g)
		});
		a.swf.setDataTipFunction(a.tipFnName)
	},
	setSeries : function(a) {
		this.series = a;
		this.refresh()
	},
	bindStore : function(a, b) {
		if (!b && this.store) {
			if (a !== 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 (a) {
			a = Ext.StoreMgr.lookup(a);
			a.on( {
				scope :this,
				datachanged :this.refresh,
				add :this.delayRefresh,
				remove :this.delayRefresh,
				update :this.delayRefresh,
				clear :this.refresh
			})
		}
		this.store = a;
		if (a && !b) {
			this.refresh()
		}
	},
	onSwfReady : function(b) {
		Ext.chart.Chart.superclass.onSwfReady.call(this, b);
		var a;
		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) {
			a = this.getFunctionRef(this.tipRenderer);
			this.setTipRenderer(a.fn, a.scope)
		}
		if (this.legendRenderer) {
			a = this.getFunctionRef(this.legendRenderer);
			this.setLegendRenderer(a.fn, a.scope)
		}
		if (!b) {
			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 m = false;
			var k = [], c = this.store.data.items;
			for ( var g = 0, l = c.length; g < l; g++) {
				k[g] = c[g].data
			}
			var e = [];
			var d = 0;
			var n = null;
			var h = 0;
			if (this.series) {
				d = this.series.length;
				for (h = 0; h < d; h++) {
					n = this.series[h];
					var b = {};
					for ( var a in n) {
						if (a == "style" && n.style !== null) {
							b.style = Ext.encode(n.style);
							m = true
						} else {
							b[a] = n[a]
						}
					}
					e.push(b)
				}
			}
			if (d > 0) {
				for (h = 0; h < d; h++) {
					n = e[h];
					if (!n.type) {
						n.type = this.type
					}
					n.dataProvider = k
				}
			} else {
				e.push( {
					type :this.type,
					dataProvider :k
				})
			}
			this.swf.setDataProvider(e);
			if (this.seriesStyles) {
				this.setSeriesStyles(this.seriesStyles)
			}
			this.fireEvent("refresh", this)
		}
	},
	createFnProxy : function(a) {
		var b = "extFnProxy" + (++Ext.chart.Chart.PROXY_FN_ID);
		Ext.chart.Chart.proxyFunction[b] = a;
		return "Ext.chart.Chart.proxyFunction." + b
	},
	removeFnProxy : function(a) {
		if (!Ext.isEmpty(a)) {
			a = a.replace("Ext.chart.Chart.proxyFunction.", "");
			delete Ext.chart.Chart.proxyFunction[a]
		}
	},
	getFunctionRef : function(a) {
		if (Ext.isFunction(a)) {
			return {
				fn :a,
				scope :this
			}
		} else {
			return {
				fn :a.fn,
				scope :a.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(a) {
		Ext.chart.PieChart.superclass.onSwfReady.call(this, a);
		this.setDataField(this.dataField);
		this.setCategoryField(this.categoryField)
	},
	setDataField : function(a) {
		this.dataField = a;
		this.swf.setDataField(a)
	},
	setCategoryField : function(a) {
		this.categoryField = a;
		this.swf.setCategoryField(a)
	}
});
Ext.reg("piechart", Ext.chart.PieChart);
Ext.chart.CartesianChart = Ext.extend(Ext.chart.Chart, {
	onSwfReady : function(a) {
		Ext.chart.CartesianChart.superclass.onSwfReady.call(this, a);
		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(a) {
		this.xField = a;
		this.swf.setHorizontalField(a)
	},
	setYField : function(a) {
		this.yField = a;
		this.swf.setVerticalField(a)
	},
	setXAxis : function(a) {
		this.xAxis = this.createAxis("xAxis", a);
		this.swf.setHorizontalAxis(this.xAxis)
	},
	setXAxes : function(c) {
		var b;
		for ( var a = 0; a < c.length; a++) {
			b = this.createAxis("xAxis" + a, c[a]);
			this.swf.setHorizontalAxis(b)
		}
	},
	setYAxis : function(a) {
		this.yAxis = this.createAxis("yAxis", a);
		this.swf.setVerticalAxis(this.yAxis)
	},
	setYAxes : function(c) {
		var b;
		for ( var a = 0; a < c.length; a++) {
			b = this.createAxis("yAxis" + a, c[a]);
			this.swf.setVerticalAxis(b)
		}
	},
	createAxis : function(b, d) {
		var e = Ext.apply( {}, d), c, a;
		if (this[b]) {
			a = this[b].labelFunction;
			this.removeFnProxy(a);
			this.labelFn.remove(a)
		}
		if (e.labelRenderer) {
			c = this.getFunctionRef(e.labelRenderer);
			e.labelFunction = this.createFnProxy( function(g) {
				return c.fn.call(c.scope, g)
			});
			delete e.labelRenderer;
			this.labelFn.push(e.labelFunction)
		}
		if (b.indexOf("xAxis") > -1 && e.position == "left") {
			e.position = "bottom"
		}
		return e
	},
	onDestroy : function() {
		Ext.chart.CartesianChart.superclass.onDestroy.call(this);
		Ext.each(this.labelFn, function(a) {
			this.removeFnProxy(a)
		}, 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(a) {
	Ext.apply(this, a)
};
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(a) {
	Ext.apply(this, a)
};
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 a = this.doLayout.createDelegate(this, []);
							this.on( {
								add :a,
								remove :a
							})
						}
					},
					getLayoutTarget : function() {
						return this.ul
					},
					onRender : function(b, a) {
						if (!b) {
							b = Ext.getBody()
						}
						var c = {
							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 :c,
								constrain :false,
								parentEl :b,
								zindex :this.zIndex
							})
						} else {
							this.el = b.createChild(c)
						}
						Ext.menu.Menu.superclass.onRender.call(this, b, a);
						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(b) {
						var a = b.getTarget(".x-menu-list-item", this.ul, true);
						if (a && a.menuItemId) {
							return this.items.get(a.menuItemId)
						}
					},
					onClick : function(b) {
						var a = this.findTargetItem(b);
						if (a) {
							if (a.isFormField) {
								this.setActiveItem(a)
							} else {
								if (a instanceof Ext.menu.BaseItem) {
									if (a.menu && this.ignoreParentClicks) {
										a.expandMenu();
										b.preventDefault()
									} else {
										if (a.onClick) {
											a.onClick(b);
											this.fireEvent("click", this, a, b)
										}
									}
								}
							}
						}
					},
					setActiveItem : function(a, b) {
						if (a != this.activeItem) {
							this.deactivateActive();
							if ((this.activeItem = a).isFormField) {
								a.focus()
							} else {
								a.activate(b)
							}
						} else {
							if (b) {
								a.expandMenu()
							}
						}
					},
					deactivateActive : function() {
						var b = this.activeItem;
						if (b) {
							if (b.isFormField) {
								if (b.collapse) {
									b.collapse()
								}
							} else {
								b.deactivate()
							}
							delete this.activeItem
						}
					},
					tryActivate : function(g, e) {
						var b = this.items;
						for ( var c = g, a = b.length; c >= 0 && c < a; c += e) {
							var d = b.get(c);
							if (d.isVisible() && !d.disabled
									&& (d.canActivate || d.isFormField)) {
								this.setActiveItem(d, false);
								return d
							}
						}
						return false
					},
					onMouseOver : function(b) {
						var a = this.findTargetItem(b);
						if (a) {
							if (a.canActivate && !a.disabled) {
								this.setActiveItem(a, true)
							}
						}
						this.over = true;
						this.fireEvent("mouseover", this, b, a)
					},
					onMouseOut : function(b) {
						var a = this.findTargetItem(b);
						if (a) {
							if (a == this.activeItem && a.shouldDeactivate
									&& a.shouldDeactivate(b)) {
								this.activeItem.deactivate();
								delete this.activeItem
							}
						}
						this.over = false;
						this.fireEvent("mouseout", this, b, a)
					},
					onScroll : function(d, b) {
						if (d) {
							d.stopEvent()
						}
						var a = this.ul.dom, c = Ext.fly(b).is(
								".x-menu-scroller-top");
						a.scrollTop += this.scrollIncrement * (c ? -1 : 1);
						if (c ? a.scrollTop <= 0
								: a.scrollTop + this.activeMax >= a.scrollHeight) {
							this.onScrollerOut(null, b)
						}
					},
					onScrollerIn : function(d, b) {
						var a = this.ul.dom, c = Ext.fly(b).is(
								".x-menu-scroller-top");
						if (c ? a.scrollTop > 0
								: a.scrollTop + this.activeMax < a.scrollHeight) {
							Ext.fly(b).addClass(
									[ "x-menu-item-active",
											"x-menu-scroller-active" ])
						}
					},
					onScrollerOut : function(b, a) {
						Ext.fly(a).removeClass(
								[ "x-menu-item-active",
										"x-menu-scroller-active" ])
					},
					show : function(b, c, a) {
						if (this.floating) {
							this.parentMenu = a;
							if (!this.el) {
								this.render();
								this.doLayout(false, true)
							}
							this.showAt(this.el.getAlignToXY(b, c
									|| this.defaultAlign, this.defaultOffsets),
									a)
						} else {
							Ext.menu.Menu.superclass.show.call(this)
						}
					},
					showAt : function(b, a) {
						if (this.fireEvent("beforeshow", this) !== false) {
							this.parentMenu = a;
							if (!this.el) {
								this.render()
							}
							if (this.enableScrolling) {
								this.el.setXY(b);
								b[1] = this.constrainScroll(b[1]);
								b = [ this.el.adjustForConstraints(b)[0], b[1] ]
							} else {
								b = this.el.adjustForConstraints(b)
							}
							this.el.setXY(b);
							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(i) {
						var b, d = this.ul.setHeight("auto").getHeight(), a = i, h, e, g, c;
						if (this.floating) {
							e = Ext.fly(this.el.dom.parentNode);
							g = e.getScroll().top;
							c = e.getViewSize().height;
							h = i - g;
							b = this.maxHeight ? this.maxHeight : c - h;
							if (d > c) {
								b = c;
								a = i - h
							} else {
								if (b < d) {
									a = i - (d - b);
									b = d
								}
							}
						} else {
							b = this.getHeight()
						}
						if (this.maxHeight) {
							b = Math.min(this.maxHeight, b)
						}
						if (d > b && b > 0) {
							this.activeMax = b - 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(d);
							this.el.select(".x-menu-scroller").setDisplayed(
									"none")
						}
						this.ul.dom.scrollTop = 0;
						return a
					},
					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(a) {
						if (!this.isDestroyed) {
							this.deepHide = a;
							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 a = this.parentMenu;
						if (this.deepHide === true && a) {
							if (a.floating) {
								a.hide(true)
							} else {
								a.deactivateActive()
							}
						}
					},
					lookupComponent : function(a) {
						if (Ext.isString(a)) {
							a = (a == "separator" || a == "-") ? new Ext.menu.Separator()
									: new Ext.menu.TextItem(a);
							this.applyDefaults(a)
						} else {
							if (Ext.isObject(a)) {
								a = this.getMenuItem(a)
							} else {
								if (a.tagName || a.el) {
									a = new Ext.BoxComponent( {
										el :a
									})
								}
							}
						}
						return a
					},
					applyDefaults : function(b) {
						if (!Ext.isString(b)) {
							b = Ext.menu.Menu.superclass.applyDefaults.call(
									this, b);
							var a = this.internalDefaults;
							if (a) {
								if (b.events) {
									Ext.applyIf(b.initialConfig, a);
									Ext.apply(b, a)
								} else {
									Ext.applyIf(b, a)
								}
							}
						}
						return b
					},
					getMenuItem : function(a) {
						if (!a.isXType) {
							if (!a.xtype && Ext.isBoolean(a.checked)) {
								return new Ext.menu.CheckItem(a)
							}
							return Ext.create(a, this.defaultType)
						}
						return a
					},
					addSeparator : function() {
						return this.add(new Ext.menu.Separator())
					},
					addElement : function(a) {
						return this.add(new Ext.menu.BaseItem( {
							el :a
						}))
					},
					addItem : function(a) {
						return this.add(a)
					},
					addMenuItem : function(a) {
						return this.add(this.getMenuItem(a))
					},
					addText : function(a) {
						return this.add(new Ext.menu.TextItem(a))
					},
					onDestroy : function() {
						Ext.EventManager.removeResizeListener(this.hide, this);
						var a = this.parentMenu;
						if (a && a.activeChild == this) {
							delete a.activeChild
						}
						delete this.parentMenu;
						Ext.menu.Menu.superclass.onDestroy.call(this);
						Ext.menu.MenuMgr.unregister(this);
						if (this.keyNav) {
							this.keyNav.disable()
						}
						var b = this.scroller;
						if (b) {
							Ext.destroy(b.topRepeater, b.bottomRepeater, b.top,
									b.bottom)
						}
						Ext.destroy(this.el, this.focusEl, this.ul)
					}
				});
Ext.reg("menu", Ext.menu.Menu);
Ext.menu.MenuNav = Ext.extend(Ext.KeyNav, function() {
	function a(d, c) {
		if (!c.tryActivate(c.items.indexOf(c.activeItem) - 1, -1)) {
			c.tryActivate(c.items.length - 1, -1)
		}
	}
	function b(d, c) {
		if (!c.tryActivate(c.items.indexOf(c.activeItem) + 1, 1)) {
			c.tryActivate(0, 1)
		}
	}
	return {
		constructor : function(c) {
			Ext.menu.MenuNav.superclass.constructor.call(this, c.el);
			this.scope = this.menu = c
		},
		doRelay : function(g, d) {
			var c = g.getKey();
			if (this.menu.activeItem && this.menu.activeItem.isFormField
					&& c != g.TAB) {
				return false
			}
			if (!this.menu.activeItem && g.isNavKeyPress() && c != g.SPACE
					&& c != g.RETURN) {
				this.menu.tryActivate(0, 1);
				return false
			}
			return d.call(this.scope || this, g, this.menu)
		},
		tab : function(d, c) {
			d.stopEvent();
			if (d.shiftKey) {
				a(d, c)
			} else {
				b(d, c)
			}
		},
		up :a,
		down :b,
		right : function(d, c) {
			if (c.activeItem) {
				c.activeItem.expandMenu(true)
			}
		},
		left : function(d, c) {
			c.hide();
			if (c.parentMenu && c.parentMenu.activeItem) {
				c.parentMenu.activeItem.activate()
			}
		},
		enter : function(d, c) {
			if (c.activeItem) {
				d.stopPropagation();
				c.activeItem.onClick(d);
				c.fireEvent("click", this, c.activeItem);
				return true
			}
		}
	}
}());
Ext.menu.MenuMgr = function() {
	var g, d, c = {}, a = false, l = new Date();
	function n() {
		g = {};
		d = new Ext.util.MixedCollection();
		Ext.getDoc().addKeyListener(27, function() {
			if (d.length > 0) {
				i()
			}
		})
	}
	function i() {
		if (d && d.length > 0) {
			var o = d.clone();
			o.each( function(p) {
				p.hide()
			});
			return true
		}
		return false
	}
	function e(o) {
		d.remove(o);
		if (d.length < 1) {
			Ext.getDoc().un("mousedown", m);
			a = false
		}
	}
	function k(o) {
		var p = d.last();
		l = new Date();
		d.add(o);
		if (!a) {
			Ext.getDoc().on("mousedown", m);
			a = true
		}
		if (o.parentMenu) {
			o.getEl().setZIndex(
					parseInt(o.parentMenu.getEl().getStyle("z-index"), 10) + 3);
			o.parentMenu.activeChild = o
		} else {
			if (p && !p.isDestroyed && p.isVisible()) {
				o.getEl().setZIndex(
						parseInt(p.getEl().getStyle("z-index"), 10) + 3)
			}
		}
	}
	function b(o) {
		if (o.activeChild) {
			o.activeChild.hide()
		}
		if (o.autoHideTimer) {
			clearTimeout(o.autoHideTimer);
			delete o.autoHideTimer
		}
	}
	function h(o) {
		var p = o.parentMenu;
		if (!p && !o.allowOtherMenus) {
			i()
		} else {
			if (p && p.activeChild) {
				p.activeChild.hide()
			}
		}
	}
	function m(o) {
		if (l.getElapsed() > 50 && d.length > 0 && !o.getTarget(".x-menu")) {
			i()
		}
	}
	return {
		hideAll : function() {
			return i()
		},
		register : function(o) {
			if (!g) {
				n()
			}
			g[o.id] = o;
			o.on( {
				beforehide :b,
				hide :e,
				beforeshow :h,
				show :k
			})
		},
		get : function(o) {
			if (typeof o == "string") {
				if (!g) {
					return null
				}
				return g[o]
			} else {
				if (o.events) {
					return o
				} else {
					if (typeof o.length == "number") {
						return new Ext.menu.Menu( {
							items :o
						})
					} else {
						return Ext.create(o, "menu")
					}
				}
			}
		},
		unregister : function(o) {
			delete g[o.id];
			o.un("beforehide", b);
			o.un("hide", e);
			o.un("beforeshow", h);
			o.un("show", k)
		},
		registerCheckable : function(o) {
			var p = o.group;
			if (p) {
				if (!c[p]) {
					c[p] = []
				}
				c[p].push(o)
			}
		},
		unregisterCheckable : function(o) {
			var p = o.group;
			if (p) {
				c[p].remove(o)
			}
		},
		onCheckChange : function(q, r) {
			if (q.group && r) {
				var t = c[q.group], p = 0, o = t.length, s;
				for (; p < o; p++) {
					s = t[p];
					if (s != q) {
						s.setChecked(false)
					}
				}
			}
		},
		getCheckedItem : function(q) {
			var r = c[q];
			if (r) {
				for ( var p = 0, o = r.length; p < o; p++) {
					if (r[p].checked) {
						return r[p]
					}
				}
			}
			return null
		},
		setCheckedItem : function(q, s) {
			var r = c[q];
			if (r) {
				for ( var p = 0, o = r.length; p < o; p++) {
					if (r[p].id == s) {
						r[p].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(b, a) {
		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(b, a) {
		if (this.handler) {
			this.un("click", this.handler, this.scope)
		}
		this.on("click", this.handler = b, this.scope = a)
	},
	onClick : function(a) {
		if (!this.disabled
				&& this.fireEvent("click", this, a) !== false
				&& (this.parentMenu && this.parentMenu.fireEvent("itemclick",
						this, a) !== false)) {
			this.handleClick(a)
		} else {
			a.stopEvent()
		}
	},
	activate : function() {
		if (this.disabled) {
			return false
		}
		var a = this.container;
		a.addClass(this.activeClass);
		this.region = a.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(a) {
		return !this.region || !this.region.contains(a.getPoint())
	},
	handleClick : function(b) {
		var a = this.parentMenu;
		if (this.hideOnClick) {
			if (a.floating) {
				a.hide.defer(this.clickHideDelay, a, [ true ])
			} else {
				a.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(a) {
		if (typeof a == "string") {
			a = {
				text :a
			}
		}
		Ext.menu.TextItem.superclass.constructor.call(this, a)
	},
	onRender : function() {
		var a = document.createElement("span");
		a.className = this.itemCls;
		a.innerHTML = this.text;
		this.el = a;
		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(a) {
		var b = document.createElement("span");
		b.className = this.itemCls;
		b.innerHTML = "&#160;";
		this.el = b;
		a.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(d, b) {
						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 c = this.getTemplateArgs();
						this.el = b ? this.itemTpl.insertBefore(b, c, true)
								: this.itemTpl.append(d, c, 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, d, b)
					},
					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(a) {
						this.text = a || "&#160;";
						if (this.rendered) {
							this.textEl.update(this.text);
							this.parentMenu.layout.doAutoSize()
						}
					},
					setIconClass : function(a) {
						var b = this.iconCls;
						this.iconCls = a;
						if (this.rendered) {
							this.iconEl.replaceClass(b, this.iconCls)
						}
					},
					beforeDestroy : function() {
						if (this.menu) {
							delete this.menu.ownerCt;
							this.menu.destroy()
						}
						Ext.menu.Item.superclass.beforeDestroy.call(this)
					},
					handleClick : function(a) {
						if (!this.href) {
							a.stopEvent()
						}
						Ext.menu.Item.superclass.handleClick.apply(this,
								arguments)
					},
					activate : function(a) {
						if (Ext.menu.Item.superclass.activate.apply(this,
								arguments)) {
							this.focus();
							if (a) {
								this.expandMenu()
							}
						}
						return true
					},
					shouldDeactivate : function(a) {
						if (Ext.menu.Item.superclass.shouldDeactivate.call(
								this, a)) {
							if (this.menu && this.menu.isVisible()) {
								return !this.menu.getEl().getRegion().contains(
										a.getPoint())
							}
							return true
						}
						return false
					},
					deactivate : function() {
						Ext.menu.Item.superclass.deactivate.apply(this,
								arguments);
						this.hideMenu()
					},
					expandMenu : function(a) {
						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, [ a ])
							} else {
								if (this.menu.isVisible() && a) {
									this.menu.tryActivate(0, 1)
								}
							}
						}
					},
					deferExpand : function(a) {
						delete this.showTimer;
						this.menu.show(this.container,
								this.parentMenu.subMenuAlign || "tl-tr?",
								this.parentMenu);
						if (a) {
							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(a) {
						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(b, a) {
						var c = a === true;
						if (this.checked != b
								&& (c || this.fireEvent("beforecheckchange",
										this, b) !== false)) {
							Ext.menu.MenuMgr.onCheckChange(this, b);
							if (this.container) {
								this.container[b ? "addClass" : "removeClass"]
										("x-menu-item-checked")
							}
							this.checked = b;
							if (!c) {
								this.fireEvent("checkchange", this, b)
							}
						}
					},
					handleClick : function(a) {
						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 a = this.picker.getEl();
		a.setWidth(a.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(c, a) {
		if (!this.el) {
			var b = this.getAutoCreate();
			if (!b.name) {
				b.name = this.name || this.id
			}
			if (this.inputType) {
				b.type = this.inputType
			}
			this.autoEl = b
		}
		Ext.form.Field.superclass.onRender.call(this, c, a);
		if (this.submitValue === false) {
			this.el.dom.removeAttribute("name")
		}
		var d = this.el.dom.type;
		if (d) {
			if (d == "password") {
				d = "text"
			}
			this.el.addClass("x-form-" + d)
		}
		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(a) {
		if (this.rendered) {
			this.el.dom.readOnly = a
		}
		this.readOnly = a
	},
	afterRender : function() {
		Ext.form.Field.superclass.afterRender.call(this);
		this.initEvents();
		this.initValue()
	},
	fireKey : function(a) {
		if (a.isSpecialKey()) {
			this.fireEvent("specialkey", this, a)
		}
	},
	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 a = this.getValue();
		if (String(a) !== String(this.startValue)) {
			this.fireEvent("change", this, a, this.startValue)
		}
		this.fireEvent("blur", this);
		this.postBlur()
	},
	postBlur :Ext.emptyFn,
	isValid : function(a) {
		if (this.disabled) {
			return true
		}
		var c = this.preventMark;
		this.preventMark = a === true;
		var b = this.validateValue(this.processValue(this.getRawValue()));
		this.preventMark = c;
		return b
	},
	validate : function() {
		if (this.disabled
				|| this.validateValue(this.processValue(this.getRawValue()))) {
			this.clearInvalid();
			return true
		}
		return false
	},
	processValue : function(a) {
		return a
	},
	validateValue : function(b) {
		var a = this.getErrors(b)[0];
		if (a == undefined) {
			return true
		} else {
			this.markInvalid(a);
			return false
		}
	},
	getErrors : function() {
		return []
	},
	getActiveError : function() {
		return this.activeError || ""
	},
	markInvalid : function(c) {
		if (this.rendered && !this.preventMark) {
			c = c || this.invalidText;
			var a = this.getMessageHandler();
			if (a) {
				a.mark(this, c)
			} else {
				if (this.msgTarget) {
					this.el.addClass(this.invalidClass);
					var b = Ext.getDom(this.msgTarget);
					if (b) {
						b.innerHTML = c;
						b.style.display = this.msgDisplay
					}
				}
			}
		}
		this.setActiveError(c)
	},
	clearInvalid : function() {
		if (this.rendered && !this.preventMark) {
			this.el.removeClass(this.invalidClass);
			var a = this.getMessageHandler();
			if (a) {
				a.clear(this)
			} else {
				if (this.msgTarget) {
					this.el.removeClass(this.invalidClass);
					var b = Ext.getDom(this.msgTarget);
					if (b) {
						b.innerHTML = "";
						b.style.display = "none"
					}
				}
			}
		}
		this.unsetActiveError()
	},
	setActiveError : function(b, a) {
		this.activeError = b;
		if (a !== true) {
			this.fireEvent("invalid", this, b)
		}
	},
	unsetActiveError : function(a) {
		delete this.activeError;
		if (a !== 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 a = this.rendered ? this.el.getValue() : Ext.value(this.value, "");
		if (a === this.emptyText) {
			a = ""
		}
		return a
	},
	getValue : function() {
		if (!this.rendered) {
			return this.value
		}
		var a = this.el.getValue();
		if (a === this.emptyText || a === undefined) {
			a = ""
		}
		return a
	},
	setRawValue : function(a) {
		return this.rendered ? (this.el.dom.value = (Ext.isEmpty(a) ? "" : a))
				: ""
	},
	setValue : function(a) {
		this.value = a;
		if (this.rendered) {
			this.el.dom.value = (Ext.isEmpty(a) ? "" : a);
			this.validate()
		}
		return this
	},
	append : function(a) {
		this.setValue( [ this.getValue(), a ].join(""))
	}
});
Ext.form.MessageTargets = {
	qtip : {
		mark : function(a, b) {
			a.el.addClass(a.invalidClass);
			a.el.dom.qtip = b;
			a.el.dom.qclass = "x-form-invalid-tip";
			if (Ext.QuickTips) {
				Ext.QuickTips.enable()
			}
		},
		clear : function(a) {
			a.el.removeClass(a.invalidClass);
			a.el.dom.qtip = ""
		}
	},
	title : {
		mark : function(a, b) {
			a.el.addClass(a.invalidClass);
			a.el.dom.title = b
		},
		clear : function(a) {
			a.el.dom.title = ""
		}
	},
	under : {
		mark : function(b, c) {
			b.el.addClass(b.invalidClass);
			if (!b.errorEl) {
				var a = b.getErrorCt();
				if (!a) {
					b.el.dom.title = c;
					return
				}
				b.errorEl = a.createChild( {
					cls :"x-form-invalid-msg"
				});
				b.on("resize", b.alignErrorEl, b);
				b.on("destroy", function() {
					Ext.destroy(this.errorEl)
				}, b)
			}
			b.alignErrorEl();
			b.errorEl.update(c);
			Ext.form.Field.msgFx[b.msgFx].show(b.errorEl, b)
		},
		clear : function(a) {
			a.el.removeClass(a.invalidClass);
			if (a.errorEl) {
				Ext.form.Field.msgFx[a.msgFx].hide(a.errorEl, a)
			} else {
				a.el.dom.title = ""
			}
		}
	},
	side : {
		mark : function(b, c) {
			b.el.addClass(b.invalidClass);
			if (!b.errorIcon) {
				var a = b.getErrorCt();
				if (!a) {
					b.el.dom.title = c;
					return
				}
				b.errorIcon = a.createChild( {
					cls :"x-form-invalid-icon"
				});
				if (b.ownerCt) {
					b.ownerCt.on("afterlayout", b.alignErrorIcon, b);
					b.ownerCt.on("expand", b.alignErrorIcon, b)
				}
				b.on("resize", b.alignErrorIcon, b);
				b.on("destroy", function() {
					Ext.destroy(this.errorIcon)
				}, b)
			}
			b.alignErrorIcon();
			b.errorIcon.dom.qtip = c;
			b.errorIcon.dom.qclass = "x-form-invalid-tip";
			b.errorIcon.show()
		},
		clear : function(a) {
			a.el.removeClass(a.invalidClass);
			if (a.errorIcon) {
				a.errorIcon.dom.qtip = "";
				a.errorIcon.hide()
			} else {
				a.el.dom.title = ""
			}
		}
	}
};
Ext.form.Field.msgFx = {
	normal : {
		show : function(a, b) {
			a.setDisplayed("block")
		},
		hide : function(a, b) {
			a.setDisplayed(false).update("")
		}
	},
	slide : {
		show : function(a, b) {
			a.slideIn("t", {
				stopFx :true
			})
		},
		hide : function(a, b) {
			a.slideOut("t", {
				stopFx :true,
				useDisplay :true
			})
		}
	},
	slideRight : {
		show : function(a, b) {
			a.fixDisplay();
			a.alignTo(b.el, "tl-tr");
			a.slideIn("l", {
				stopFx :true
			})
		},
		hide : function(a, b) {
			a.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(a) {
						if (!this.hasFocus) {
							this.mon(this.el, "mouseup", Ext.emptyFn, this, {
								single :true,
								preventDefault :true
							})
						}
					},
					processValue : function(a) {
						if (this.stripCharsRe) {
							var b = a.replace(this.stripCharsRe, "");
							if (b !== a) {
								this.setRawValue(b);
								return b
							}
						}
						return a
					},
					filterValidation : function(a) {
						if (!a.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(a) {
						if (this.doAutoSize(a)) {
							this.autoSize()
						}
					},
					doAutoSize : function(a) {
						return !a.isNavKeyPress()
					},
					onKeyUp : function(a) {
						this.fireEvent("keyup", this, a)
					},
					onKeyDown : function(a) {
						this.fireEvent("keydown", this, a)
					},
					onKeyPress : function(a) {
						this.fireEvent("keypress", this, a)
					},
					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 a = this.el, b;
						if (this.emptyText) {
							if (a.dom.value == this.emptyText) {
								this.setRawValue("");
								b = true
							}
							a.removeClass(this.emptyClass)
						}
						if (this.selectOnFocus || b) {
							a.dom.select()
						}
					},
					postBlur : function() {
						this.applyEmptyText()
					},
					filterKeys : function(b) {
						if (b.ctrlKey) {
							return
						}
						var a = b.getKey();
						if (Ext.isGecko
								&& (b.isNavKeyPress() || a == b.BACKSPACE || (a == b.DELETE && b.button == -1))) {
							return
						}
						var c = String.fromCharCode(b.getCharCode());
						if (!Ext.isGecko && b.isSpecialKey() && !c) {
							return
						}
						if (!this.maskRe.test(c)) {
							b.stopEvent()
						}
					},
					setValue : function(a) {
						if (this.emptyText && this.el && !Ext.isEmpty(a)) {
							this.el.removeClass(this.emptyClass)
						}
						Ext.form.TextField.superclass.setValue.apply(this,
								arguments);
						this.applyEmptyText();
						this.autoSize();
						return this
					},
					getErrors : function(a) {
						var d = Ext.form.TextField.superclass.getErrors.apply(
								this, arguments);
						a = Ext.isDefined(a) ? a : this.processValue(this
								.getRawValue());
						if (Ext.isFunction(this.validator)) {
							var c = this.validator(a);
							if (c !== true) {
								d.push(c)
							}
						}
						if (a.length < 1 || a === this.emptyText) {
							if (this.allowBlank) {
								return d
							} else {
								d.push(this.blankText)
							}
						}
						if (!this.allowBlank
								&& (a.length < 1 || a === this.emptyText)) {
							d.push(this.blankText)
						}
						if (a.length < this.minLength) {
							d.push(String.format(this.minLengthText,
									this.minLength))
						}
						if (a.length > this.maxLength) {
							d.push(String.format(this.maxLengthText,
									this.maxLength))
						}
						if (this.vtype) {
							var b = Ext.form.VTypes;
							if (!b[this.vtype](a, this)) {
								d
										.push(this.vtypeText
												|| b[this.vtype + "Text"])
							}
						}
						if (this.regex && !this.regex.test(a)) {
							d.push(this.regexText)
						}
						return d
					},
					selectText : function(h, a) {
						var c = this.getRawValue();
						var e = false;
						if (c.length > 0) {
							h = h === undefined ? 0 : h;
							a = a === undefined ? c.length : a;
							var g = this.el.dom;
							if (g.setSelectionRange) {
								g.setSelectionRange(h, a)
							} else {
								if (g.createTextRange) {
									var b = g.createTextRange();
									b.moveStart("character", h);
									b.moveEnd("character", a - c.length);
									b.select()
								}
							}
							e = Ext.isGecko || Ext.isOpera
						} else {
							e = true
						}
						if (e) {
							this.focus()
						}
					},
					autoSize : function() {
						if (!this.grow || !this.rendered) {
							return
						}
						if (!this.metrics) {
							this.metrics = Ext.util.TextMetrics
									.createInstance(this.el)
						}
						var c = this.el;
						var b = c.dom.value;
						var e = document.createElement("div");
						e.appendChild(document.createTextNode(b));
						b = e.innerHTML;
						Ext.removeNode(e);
						e = null;
						b += "&#160;";
						var a = Math.min(this.growMax, Math.max(this.metrics
								.getWidth(b) + 10, this.growMin));
						this.el.setWidth(a);
						this.fireEvent("autosize", this, a)
					},
					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(a, c) {
		Ext.form.TriggerField.superclass.onResize.call(this, a, c);
		var b = this.getTriggerWidth();
		if (Ext.isNumber(a)) {
			this.el.setWidth(a - b)
		}
		this.wrap.setWidth(this.el.getWidth() + b)
	},
	getTriggerWidth : function() {
		var a = this.trigger.getWidth();
		if (!this.hideTrigger && !this.readOnly && a === 0) {
			a = this.defaultTriggerWidth
		}
		return a
	},
	alignErrorIcon : function() {
		if (this.wrap) {
			this.errorIcon.alignTo(this.wrap, "tl-tr", [ 2, 0 ])
		}
	},
	onRender : function(b, a) {
		this.doc = Ext.isIE ? Ext.getBody() : Ext.getDoc();
		Ext.form.TriggerField.superclass.onRender.call(this, b, a);
		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(a) {
		if (a != this.hideTrigger) {
			this.hideTrigger = a;
			this.updateEditState()
		}
	},
	setEditable : function(a) {
		if (a != this.editable) {
			this.editable = a;
			this.updateEditState()
		}
	},
	setReadOnly : function(a) {
		if (a != this.readOnly) {
			this.readOnly = a;
			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(a, b) {
		if (b.getKey() == b.TAB) {
			this.triggerBlur()
		}
	},
	onBlur :Ext.emptyFn,
	mimicBlur : function(a) {
		if (!this.isDestroyed && !this.wrap.contains(a.target)
				&& this.validateBlur(a)) {
			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(a) {
		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(a) {
		return this.triggers[a]
	},
	afterRender : function() {
		Ext.form.TwinTriggerField.superclass.afterRender.call(this);
		var c = this.triggers, b = 0, a = c.length;
		for (; b < a; ++b) {
			if (this["hideTrigger" + (b + 1)]) {
				c[b].hide()
			}
		}
	},
	initTrigger : function() {
		var a = this.trigger.select(".x-form-trigger", true), b = this;
		a.each( function(d, g, c) {
			var e = "Trigger" + (c + 1);
			d.hide = function() {
				var h = b.wrap.getWidth();
				this.dom.style.display = "none";
				b.el.setWidth(h - b.trigger.getWidth());
				b["hidden" + e] = true
			};
			d.show = function() {
				var h = b.wrap.getWidth();
				this.dom.style.display = "";
				b.el.setWidth(h - b.trigger.getWidth());
				b["hidden" + e] = false
			};
			this.mon(d, "click", this["on" + e + "Click"], this, {
				preventDefault :true
			});
			d.addClassOnOver("x-form-trigger-over");
			d.addClassOnClick("x-form-trigger-click")
		}, this);
		this.triggers = a.elements
	},
	getTriggerWidth : function() {
		var a = 0;
		Ext.each(this.triggers, function(d, c) {
			var e = "Trigger" + (c + 1), b = d.getWidth();
			if (b === 0 && !this["hidden" + e]) {
				a += this.defaultTriggerWidth
			} else {
				a += b
			}
		}, this);
		return a
	},
	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(b, a) {
						if (!this.el) {
							this.defaultAutoCreate = {
								tag :"textarea",
								style :"width:100px;height:60px;",
								autocomplete :"off"
							}
						}
						Ext.form.TextArea.superclass.onRender.call(this, b, a);
						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(a) {
						if (a.isSpecialKey()
								&& (this.enterIsSpecial || (a.getKey() != a.ENTER || a
										.hasModifier()))) {
							this.fireEvent("specialkey", this, a)
						}
					},
					doAutoSize : function(a) {
						return !a.isNavKeyPress() || a.getKey() == a.ENTER
					},
					filterValidation : function(a) {
						if (!a.isNavKeyPress()
								|| (!this.enterIsSpecial && a.keyCode == a.ENTER)) {
							this.validationTask.delay(this.validationDelay)
						}
					},
					autoSize : function() {
						if (!this.grow || !this.textSizeEl) {
							return
						}
						var c = this.el, a = Ext.util.Format
								.htmlEncode(c.dom.value), d = this.textSizeEl, b;
						Ext.fly(d).setWidth(this.el.getWidth());
						if (a.length < 1) {
							a = "&#160;&#160;"
						} else {
							a += this.growAppend;
							if (Ext.isIE) {
								a = a.replace(/\n/g, "&#160;<br />")
							}
						}
						d.innerHTML = a;
						b = Math.min(this.growMax, Math.max(d.offsetHeight,
								this.growMin));
						if (b != this.lastHeight) {
							this.lastHeight = b;
							this.el.setHeight(b);
							this.fireEvent("autosize", this, b)
						}
					}
				});
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 a = this.baseChars + "";
		if (this.allowDecimals) {
			a += this.decimalSeparator
		}
		if (this.allowNegative) {
			a += "-"
		}
		a = Ext.escapeRe(a);
		this.maskRe = new RegExp("[" + a + "]");
		if (this.autoStripChars) {
			this.stripCharsRe = new RegExp("[^" + a + "]", "gi")
		}
		Ext.form.NumberField.superclass.initEvents.call(this)
	},
	getErrors : function(b) {
		var c = Ext.form.NumberField.superclass.getErrors
				.apply(this, arguments);
		b = Ext.isDefined(b) ? b : this.processValue(this.getRawValue());
		if (b.length < 1) {
			return c
		}
		b = String(b).replace(this.decimalSeparator, ".");
		if (isNaN(b)) {
			c.push(String.format(this.nanText, b))
		}
		var a = this.parseValue(b);
		if (a < this.minValue) {
			c.push(String.format(this.minText, this.minValue))
		}
		if (a > this.maxValue) {
			c.push(String.format(this.maxText, this.maxValue))
		}
		return c
	},
	getValue : function() {
		return this
				.fixPrecision(this
						.parseValue(Ext.form.NumberField.superclass.getValue
								.call(this)))
	},
	setValue : function(a) {
		a = this.fixPrecision(a);
		a = Ext.isNumber(a) ? a : parseFloat(String(a).replace(
				this.decimalSeparator, "."));
		a = isNaN(a) ? "" : String(a).replace(".", this.decimalSeparator);
		return Ext.form.NumberField.superclass.setValue.call(this, a)
	},
	setMinValue : function(a) {
		this.minValue = Ext.num(a, Number.NEGATIVE_INFINITY)
	},
	setMaxValue : function(a) {
		this.maxValue = Ext.num(a, Number.MAX_VALUE)
	},
	parseValue : function(a) {
		a = parseFloat(String(a).replace(this.decimalSeparator, "."));
		return isNaN(a) ? "" : a
	},
	fixPrecision : function(b) {
		var a = isNaN(b);
		if (!this.allowDecimals || this.decimalPrecision == -1 || a || !b) {
			return a ? "" : b
		}
		return parseFloat(parseFloat(b).toFixed(this.decimalPrecision))
	},
	beforeBlur : function() {
		var a = this.parseValue(this.getRawValue());
		if (!Ext.isEmpty(a)) {
			this.setValue(a)
		}
	}
});
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(b, c) {
						if (/[gGhH]/.test(c.replace(/(\\.)/g, ""))) {
							return Date.parseDate(b, c)
						} else {
							var a = Date.parseDate(b + " " + this.initTime, c
									+ " " + this.initTimeFormat);
							if (a) {
								return a.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(a) {
								this.onTriggerClick()
							},
							scope :this,
							forceKeyDown :true
						})
					},
					initDisabledDays : function() {
						if (this.disabledDates) {
							var b = this.disabledDates, a = b.length - 1, c = "(?:";
							Ext.each(b, function(g, e) {
								c += Ext.isDate(g) ? "^"
										+ Ext.escapeRe(g
												.dateFormat(this.format)) + "$"
										: b[e];
								if (e != a) {
									c += "|"
								}
							}, this);
							this.disabledDatesRE = new RegExp(c + ")")
						}
					},
					setDisabledDates : function(a) {
						this.disabledDates = a;
						this.initDisabledDays();
						if (this.menu) {
							this.menu.picker
									.setDisabledDates(this.disabledDatesRE)
						}
					},
					setDisabledDays : function(a) {
						this.disabledDays = a;
						if (this.menu) {
							this.menu.picker.setDisabledDays(a)
						}
					},
					setMinValue : function(a) {
						this.minValue = (Ext.isString(a) ? this.parseDate(a)
								: a);
						if (this.menu) {
							this.menu.picker.setMinDate(this.minValue)
						}
					},
					setMaxValue : function(a) {
						this.maxValue = (Ext.isString(a) ? this.parseDate(a)
								: a);
						if (this.menu) {
							this.menu.picker.setMaxDate(this.maxValue)
						}
					},
					getErrors : function(e) {
						var h = Ext.form.DateField.superclass.getErrors.apply(
								this, arguments);
						e = this.formatDate(e
								|| this.processValue(this.getRawValue()));
						if (e.length < 1) {
							return h
						}
						var c = e;
						e = this.parseDate(e);
						if (!e) {
							h.push(String.format(this.invalidText, c,
									this.format));
							return h
						}
						var g = e.getTime();
						if (this.minValue
								&& g < this.minValue.clearTime().getTime()) {
							h.push(String.format(this.minText, this
									.formatDate(this.minValue)))
						}
						if (this.maxValue
								&& g > this.maxValue.clearTime().getTime()) {
							h.push(String.format(this.maxText, this
									.formatDate(this.maxValue)))
						}
						if (this.disabledDays) {
							var a = e.getDay();
							for ( var b = 0; b < this.disabledDays.length; b++) {
								if (a === this.disabledDays[b]) {
									h.push(this.disabledDaysText);
									break
								}
							}
						}
						var d = this.formatDate(e);
						if (this.disabledDatesRE
								&& this.disabledDatesRE.test(d)) {
							h.push(String.format(this.disabledDatesText, d))
						}
						return h
					},
					validateBlur : function() {
						return !this.menu || !this.menu.isVisible()
					},
					getValue : function() {
						return this
								.parseDate(Ext.form.DateField.superclass.getValue
										.call(this))
								|| ""
					},
					setValue : function(a) {
						return Ext.form.DateField.superclass.setValue.call(
								this, this.formatDate(this.parseDate(a)))
					},
					parseDate : function(g) {
						if (!g || Ext.isDate(g)) {
							return g
						}
						var b = this.safeParse(g, this.format), c = this.altFormats, e = this.altFormatsArray;
						if (!b && c) {
							e = e || c.split("|");
							for ( var d = 0, a = e.length; d < a && !b; d++) {
								b = this.safeParse(g, e[d])
							}
						}
						return b
					},
					onDestroy : function() {
						Ext.destroy(this.menu, this.keyNav);
						Ext.form.DateField.superclass.onDestroy.call(this)
					},
					formatDate : function(a) {
						return Ext.isDate(a) ? a.dateFormat(this.format) : a
					},
					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(a) {
						this.menu[a]("select", this.onSelect, this);
						this.menu[a]("hide", this.onMenuHide, this);
						this.menu[a]("show", this.onFocus, this)
					},
					onSelect : function(a, b) {
						this.setValue(b);
						this.fireEvent("select", this, b);
						this.menu.hide()
					},
					onMenuHide : function() {
						this.focus(false, 60);
						this.menuEvents("un")
					},
					beforeBlur : function() {
						var a = this.parseDate(this.getRawValue());
						if (a) {
							this.setValue(a)
						}
					}
				});
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 a = this.rendered ? this.el.dom.innerHTML : Ext.value(this.value,
				"");
		if (a === this.emptyText) {
			a = ""
		}
		if (this.htmlEncode) {
			a = Ext.util.Format.htmlDecode(a)
		}
		return a
	},
	getValue : function() {
		return this.getRawValue()
	},
	getName : function() {
		return this.name
	},
	setRawValue : function(a) {
		if (this.htmlEncode) {
			a = Ext.util.Format.htmlEncode(a)
		}
		return this.rendered ? (this.el.dom.innerHTML = (Ext.isEmpty(a) ? ""
				: a)) : (this.value = a)
	},
	setValue : function(a) {
		this.setRawValue(a);
		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 c = Ext.getDom(this.transform);
							if (!this.hiddenName) {
								this.hiddenName = c.name
							}
							if (!this.store) {
								this.mode = "local";
								var k = [], e = c.options;
								for ( var b = 0, a = e.length; b < a; b++) {
									var h = e[b], g = (h.hasAttribute ? h
											.hasAttribute("value")
											: h.getAttributeNode("value").specified) ? h.value
											: h.text;
									if (h.selected
											&& Ext.isEmpty(this.value, true)) {
										this.value = g
									}
									k.push( [ g, h.text ])
								}
								this.store = new Ext.data.ArrayStore( {
									idIndex :0,
									fields : [ "value", "text" ],
									data :k,
									autoDestroy :true
								});
								this.valueField = "value";
								this.displayField = "text"
							}
							c.name = Ext.id();
							if (!this.lazyRender) {
								this.target = true;
								this.el = Ext.DomHelper.insertBefore(c,
										this.autoCreate
												|| this.defaultAutoCreate);
								this.render(this.el.parentNode, c)
							}
							Ext.removeNode(c)
						} 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(b, a) {
						if (this.hiddenName && !Ext.isDefined(this.submitValue)) {
							this.submitValue = false
						}
						Ext.form.ComboBox.superclass.onRender.call(this, b, a);
						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 a;
						if (this.ownerCt) {
							this.findParentBy( function(b) {
								a = parseInt(b.getPositionEl().getStyle(
										"z-index"), 10);
								return !!a
							})
						}
						return a
					},
					getZIndex : function(b) {
						b = b
								|| Ext.getDom(this.getListParent()
										|| Ext.getBody());
						var a = parseInt(Ext.fly(b).getStyle("z-index"), 10);
						if (!a) {
							a = this.getParentZIndex()
						}
						return (a || 12000) + 5
					},
					initList : function() {
						if (!this.list) {
							var a = "x-combo-list", c = Ext.getDom(this
									.getListParent()
									|| Ext.getBody());
							this.list = new Ext.Layer( {
								parentEl :c,
								shadow :this.shadow,
								cls : [ a, this.listClass ].join(" "),
								constrain :false,
								zindex :this.getZIndex(c)
							});
							var b = this.listWidth
									|| Math.max(this.wrap.getWidth(),
											this.minListWidth);
							this.list.setSize(b, 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 :a + "-hd",
									html :this.title
								});
								this.assetHeight += this.header.getHeight()
							}
							this.innerList = this.list.createChild( {
								cls :a + "-inner"
							});
							this.mon(this.innerList, "mouseover",
									this.onViewOver, this);
							this.mon(this.innerList, "mousemove",
									this.onViewMove, this);
							this.innerList.setWidth(b
									- this.list.getFrameWidth("lr"));
							if (this.pageSize) {
								this.footer = this.list.createChild( {
									cls :a + "-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="' + a
										+ '-item">{' + this.displayField
										+ "}</div></tpl>"
							}
							this.view = new Ext.DataView( {
								applyTo :this.innerList,
								tpl :this.tpl,
								singleSelect :true,
								selectedClass :this.selectedClass,
								itemSelector :this.itemSelector || "." + a
										+ "-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(g, d,
										e) {
									this.maxHeight = e - this.handleHeight
											- this.list.getFrameWidth("tb")
											- this.assetHeight;
									this.listWidth = d;
									this.innerList.setWidth(d
											- 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(a, b) {
						if (this.store && !b) {
							if (this.store !== a && 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 (!a) {
								this.store = null;
								if (this.view) {
									this.view.bindStore(null)
								}
								if (this.pageTb) {
									this.pageTb.bindStore(null)
								}
							}
						}
						if (a) {
							if (!b) {
								this.lastQuery = null;
								if (this.pageTb) {
									this.pageTb.bindStore(a)
								}
							}
							this.store = Ext.StoreMgr.lookup(a);
							this.store.on( {
								scope :this,
								beforeload :this.onBeforeLoad,
								load :this.onLoad,
								exception :this.collapse
							});
							if (this.view) {
								this.view.bindStore(a)
							}
						}
					},
					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(a) {
								this.inKeyMode = true;
								this.selectPrev()
							},
							down : function(a) {
								if (!this.isExpanded()) {
									this.onTriggerClick()
								} else {
									this.inKeyMode = true;
									this.selectNext()
								}
							},
							enter : function(a) {
								this.onViewClick()
							},
							esc : function(a) {
								this.collapse()
							},
							tab : function(a) {
								if (this.forceSelection === true) {
									this.collapse()
								} else {
									this.onViewClick(false)
								}
								return true
							},
							scope :this,
							doRelay : function(c, b, a) {
								if (a == "down" || this.scope.isExpanded()) {
									var d = Ext.KeyNav.prototype.doRelay.apply(
											this, arguments);
									if (!Ext.isIE
											&& Ext.EventManager.useKeydown) {
										this.scope.fireKey(c)
									}
									return d
								}
								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(a) {
						if (!this.isExpanded()) {
							Ext.form.ComboBox.superclass.fireKey.call(this, a)
						}
					},
					onResize : function(a, b) {
						Ext.form.ComboBox.superclass.onResize.apply(this,
								arguments);
						if (!isNaN(a) && this.isVisible() && this.list) {
							this.doResize(a)
						} else {
							this.bufferSize = a
						}
					},
					doResize : function(a) {
						if (!Ext.isDefined(this.listWidth)) {
							var b = Math.max(a, this.minListWidth);
							this.list.setWidth(b);
							this.innerList.setWidth(b
									- 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 b = this.store.getAt(0);
							var c = b.data[this.displayField];
							var a = c.length;
							var d = this.getRawValue().length;
							if (d != a) {
								this.setRawValue(c);
								this.selectText(d, c.length)
							}
						}
					},
					assertValue : function() {
						var b = this.getRawValue(), a;
						if (this.valueField && Ext.isDefined(this.value)) {
							a = this.findRecord(this.valueField, this.value)
						}
						if (!a || a.get(this.displayField) != b) {
							a = this.findRecord(this.displayField, b)
						}
						if (!a && this.forceSelection) {
							if (b.length > 0 && b != this.emptyText) {
								this.el.dom.value = Ext.value(
										this.lastSelectionText, "");
								this.applyEmptyText()
							} else {
								this.clearValue()
							}
						} else {
							if (a && this.valueField) {
								if (this.value == b) {
									return
								}
								b = a.get(this.valueField || this.displayField)
							}
							this.setValue(b)
						}
					},
					onSelect : function(a, b) {
						if (this.fireEvent("beforeselect", this, a, b) !== false) {
							this.setValue(a.data[this.valueField
									|| this.displayField]);
							this.collapse();
							this.fireEvent("select", this, a, b)
						}
					},
					getName : function() {
						var a = this.hiddenField;
						return a && a.name ? a.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(a) {
						var c = a;
						if (this.valueField) {
							var b = this.findRecord(this.valueField, a);
							if (b) {
								c = b.data[this.displayField]
							} else {
								if (Ext.isDefined(this.valueNotFoundText)) {
									c = this.valueNotFoundText
								}
							}
						}
						this.lastSelectionText = c;
						if (this.hiddenField) {
							this.hiddenField.value = Ext.value(a, "")
						}
						Ext.form.ComboBox.superclass.setValue.call(this, c);
						this.value = a;
						return this
					},
					findRecord : function(c, b) {
						var a;
						if (this.store.getCount() > 0) {
							this.store.each( function(d) {
								if (d.data[c] == b) {
									a = d;
									return false
								}
							})
						}
						return a
					},
					onViewMove : function(b, a) {
						this.inKeyMode = false
					},
					onViewOver : function(d, b) {
						if (this.inKeyMode) {
							return
						}
						var c = this.view.findItemFromChild(b);
						if (c) {
							var a = this.view.indexOf(c);
							this.select(a, false)
						}
					},
					onViewClick : function(b) {
						var a = this.view.getSelectedIndexes()[0], c = this.store, d = c
								.getAt(a);
						if (d) {
							this.onSelect(d, a)
						} else {
							this.collapse()
						}
						if (b !== false) {
							this.el.focus()
						}
					},
					restrictHeight : function() {
						this.innerList.dom.style.height = "";
						var b = this.innerList.dom, e = this.list
								.getFrameWidth("tb")
								+ (this.resizable ? this.handleHeight : 0)
								+ this.assetHeight, c = Math.max(
								b.clientHeight, b.offsetHeight, b.scrollHeight), a = this
								.getPosition()[1]
								- Ext.getBody().getScroll().top, g = Ext.lib.Dom
								.getViewHeight()
								- a - this.getSize().height, d = Math.max(a, g,
								this.minHeight || 0)
								- this.list.shadowOffset - e - 5;
						c = Math.min(c, d, this.maxHeight);
						this.innerList.setHeight(c);
						this.list.beginUpdate();
						this.list.setHeight(c + e);
						this.list.alignTo.apply(this.list, [ this.el ]
								.concat(this.listAlign));
						this.list.endUpdate()
					},
					isExpanded : function() {
						return this.list && this.list.isVisible()
					},
					selectByValue : function(a, c) {
						if (!Ext.isEmpty(a, true)) {
							var b = this.findRecord(this.valueField
									|| this.displayField, a);
							if (b) {
								this.select(this.store.indexOf(b), c);
								return true
							}
						}
						return false
					},
					select : function(a, c) {
						this.selectedIndex = a;
						this.view.select(a);
						if (c !== false) {
							var b = this.view.getNode(a);
							if (b) {
								this.innerList.scrollChildIntoView(b, false)
							}
						}
					},
					selectNext : function() {
						var a = this.store.getCount();
						if (a > 0) {
							if (this.selectedIndex == -1) {
								this.select(0)
							} else {
								if (this.selectedIndex < a - 1) {
									this.select(this.selectedIndex + 1)
								}
							}
						}
					},
					selectPrev : function() {
						var a = this.store.getCount();
						if (a > 0) {
							if (this.selectedIndex == -1) {
								this.select(0)
							} else {
								if (this.selectedIndex !== 0) {
									this.select(this.selectedIndex - 1)
								}
							}
						}
					},
					onKeyUp : function(b) {
						var a = b.getKey();
						if (this.editable !== false && this.readOnly !== true
								&& (a == b.BACKSPACE || !b.isSpecialKey())) {
							this.lastKey = a;
							this.dqTask.delay(this.queryDelay)
						}
						Ext.form.ComboBox.superclass.onKeyUp.call(this, b)
					},
					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(c, b) {
						c = Ext.isEmpty(c) ? "" : c;
						var a = {
							query :c,
							forceAll :b,
							combo :this,
							cancel :false
						};
						if (this.fireEvent("beforequery", a) === false
								|| a.cancel) {
							return false
						}
						c = a.query;
						b = a.forceAll;
						if (b === true || (c.length >= this.minChars)) {
							if (this.lastQuery !== c) {
								this.lastQuery = c;
								if (this.mode == "local") {
									this.selectedIndex = -1;
									if (b) {
										this.store.clearFilter()
									} else {
										this.store.filter(this.displayField, c)
									}
									this.onLoad()
								} else {
									this.store.baseParams[this.queryParam] = c;
									this.store.load( {
										params :this.getParams(c)
									});
									this.expand()
								}
							} else {
								this.selectedIndex = -1;
								this.onLoad()
							}
						}
					},
					getParams : function(a) {
						var b = {}, c = this.store.paramNames;
						if (this.pageSize) {
							b[c.start] = 0;
							b[c.limit] = this.pageSize
						}
						return b
					},
					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(a) {
						if (!this.isDestroyed && !a.within(this.wrap)
								&& !a.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(b, a) {
		Ext.form.Checkbox.superclass.onRender.call(this, b, a);
		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(a) {
		var c = this.checked, b = this.inputValue;
		this.checked = (a === true || a === "true" || a == "1" || (b ? a == b
				: String(a).toLowerCase() == "on"));
		if (this.rendered) {
			this.el.dom.checked = this.checked;
			this.el.dom.defaultChecked = this.checked
		}
		if (c != 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(k, g) {
						if (!this.el) {
							var q = {
								autoEl : {
									id :this.id
								},
								cls :this.groupCls,
								layout :"column",
								renderTo :k,
								bufferResize :false
							};
							var a = {
								xtype :"container",
								defaultType :this.defaultType,
								layout :"form",
								defaults : {
									hideLabel :true,
									anchor :"100%"
								}
							};
							if (this.items[0].items) {
								Ext.apply(q, {
									layoutConfig : {
										columns :this.items.length
									},
									defaults :this.defaults,
									items :this.items
								});
								for ( var e = 0, n = this.items.length; e < n; e++) {
									Ext.applyIf(this.items[e], a)
								}
							} else {
								var d, o = [];
								if (typeof this.columns == "string") {
									this.columns = this.items.length
								}
								if (!Ext.isArray(this.columns)) {
									var m = [];
									for ( var e = 0; e < this.columns; e++) {
										m.push((100 / this.columns) * 0.01)
									}
									this.columns = m
								}
								d = this.columns.length;
								for ( var e = 0; e < d; e++) {
									var b = Ext.apply( {
										items : []
									}, a);
									b[this.columns[e] <= 1 ? "columnWidth"
											: "width"] = this.columns[e];
									if (this.defaults) {
										b.defaults = Ext
												.apply(b.defaults || {},
														this.defaults)
									}
									o.push(b)
								}
								if (this.vertical) {
									var s = Math.ceil(this.items.length / d), p = 0;
									for ( var e = 0, n = this.items.length; e < n; e++) {
										if (e > 0 && e % s == 0) {
											p++
										}
										if (this.items[e].fieldLabel) {
											this.items[e].hideLabel = false
										}
										o[p].items.push(this.items[e])
									}
								} else {
									for ( var e = 0, n = this.items.length; e < n; e++) {
										var r = e % d;
										if (this.items[e].fieldLabel) {
											this.items[e].hideLabel = false
										}
										o[r].items.push(this.items[e])
									}
								}
								Ext.apply(q, {
									layoutConfig : {
										columns :d
									},
									items :o
								})
							}
							this.panel = new Ext.Container(q);
							this.panel.ownerCt = this;
							this.el = this.panel.getEl();
							if (this.forId && this.itemCls) {
								var c = this.el.up(this.itemCls).child("label",
										true);
								if (c) {
									c.setAttribute("htmlFor", this.forId)
								}
							}
							var h = this.panel.findBy( function(i) {
								return i.isFormField
							}, this);
							this.items = new Ext.util.MixedCollection();
							this.items.addAll(h)
						}
						Ext.form.CheckboxGroup.superclass.onRender.call(this,
								k, g)
					},
					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(a) {
							a.on("check", this.fireChecked, this);
							a.inGroup = true
						})
					},
					doLayout : function() {
						if (this.rendered) {
							this.panel.forceLayout = this.ownerCt.forceLayout;
							this.panel.doLayout()
						}
					},
					fireChecked : function() {
						var a = [];
						this.eachItem( function(b) {
							if (b.checked) {
								a.push(b)
							}
						});
						this.fireEvent("change", this, a)
					},
					getErrors : function() {
						var b = Ext.form.CheckboxGroup.superclass.getErrors
								.apply(this, arguments);
						if (!this.allowBlank) {
							var a = true;
							this.eachItem( function(c) {
								if (c.checked) {
									return (a = false)
								}
							});
							if (a) {
								b.push(this.blankText)
							}
						}
						return b
					},
					isDirty : function() {
						if (this.disabled || !this.rendered) {
							return false
						}
						var a = false;
						this.eachItem( function(b) {
							if (b.isDirty()) {
								a = true;
								return false
							}
						});
						return a
					},
					setReadOnly : function(a) {
						if (this.rendered) {
							this.eachItem( function(b) {
								b.setReadOnly(a)
							})
						}
						this.readOnly = a
					},
					onDisable : function() {
						this.eachItem( function(a) {
							a.disable()
						})
					},
					onEnable : function() {
						this.eachItem( function(a) {
							a.enable()
						})
					},
					onResize : function(a, b) {
						this.panel.setSize(a, b);
						this.panel.doLayout()
					},
					reset : function() {
						if (this.originalValue) {
							this.eachItem( function(a) {
								if (a.setValue) {
									a.setValue(false);
									a.originalValue = a.getValue()
								}
							});
							this.resetOriginal = true;
							this.setValue(this.originalValue);
							delete this.resetOriginal
						} else {
							this.eachItem( function(a) {
								if (a.reset) {
									a.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(d, c) {
						if (arguments.length == 1) {
							if (Ext.isArray(d)) {
								Ext.each(d, function(h, e) {
									if (Ext.isObject(h) && h.setValue) {
										h.setValue(true);
										if (this.resetOriginal === true) {
											h.originalValue = h.getValue()
										}
									} else {
										var g = this.items.itemAt(e);
										if (g) {
											g.setValue(h)
										}
									}
								}, this)
							} else {
								if (Ext.isObject(d)) {
									for ( var a in d) {
										var b = this.getBox(a);
										if (b) {
											b.setValue(d[a])
										}
									}
								} else {
									this.setValueForItem(d)
								}
							}
						} else {
							var b = this.getBox(d);
							if (b) {
								b.setValue(c)
							}
						}
					},
					beforeDestroy : function() {
						Ext.destroy(this.panel);
						if (!this.rendered) {
							Ext.destroy(this.items)
						}
						Ext.form.CheckboxGroup.superclass.beforeDestroy
								.call(this)
					},
					setValueForItem : function(a) {
						a = String(a).split(",");
						this.eachItem( function(b) {
							if (a.indexOf(b.inputValue) > -1) {
								b.setValue(true)
							}
						})
					},
					getBox : function(b) {
						var a = null;
						this.eachItem( function(c) {
							if (b == c || c.dataIndex == b || c.id == b
									|| c.getName() == b) {
								a = c;
								return false
							}
						});
						return a
					},
					getValue : function() {
						var a = [];
						this.eachItem( function(b) {
							if (b.checked) {
								a.push(b)
							}
						});
						return a
					},
					eachItem : function(b, a) {
						if (this.items && this.items.each) {
							this.items.each(b, a || 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 g = [], b = this.items, e;
				for ( var d = 0, c = b.length; d < c; d++) {
					e = b[d];
					if (!Ext.isEmpty(e.ref)) {
						e.ref = "../" + e.ref
					}
					g.push(e.fieldLabel);
					Ext.applyIf(e, this.defaults);
					if (!(d == c - 1 && this.skipLastItemMargin)) {
						Ext.applyIf(e, {
							margins :this.defaultMargins
						})
					}
				}
				this.fieldLabel = this.fieldLabel || this.buildLabel(g);
				this.fieldErrors = new Ext.util.MixedCollection(true, function(
						h) {
					return h.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 a = this.innerCt.findBy( function(h) {
					return h.isFormField
				}, this);
				this.items = new Ext.util.MixedCollection();
				this.items.addAll(a)
			},
			onRender : function(c, a) {
				if (!this.el) {
					var d = this.innerCt;
					d.render(c);
					this.el = d.getEl();
					if (this.combineErrors) {
						this.eachItem( function(e) {
							Ext.apply(e, {
								markInvalid :this.onFieldMarkInvalid
										.createDelegate(this, [ e ], 0),
								clearInvalid :this.onFieldClearInvalid
										.createDelegate(this, [ e ], 0)
							})
						})
					}
					var b = this.el.parent().parent().child("label", true);
					if (b) {
						b.setAttribute("for", this.items.items[0].id)
					}
				}
				Ext.form.CompositeField.superclass.onRender.apply(this,
						arguments)
			},
			onFieldMarkInvalid : function(d, c) {
				var b = d.getName(), a = {
					field :b,
					errorName :d.fieldLabel || b,
					error :c
				};
				this.fieldErrors.replace(b, a);
				d.el.addClass(d.invalidClass)
			},
			onFieldClearInvalid : function(a) {
				this.fieldErrors.removeKey(a.getName());
				a.el.removeClass(a.invalidClass)
			},
			updateInvalidMark : function() {
				var a = Ext.isIE6 && Ext.isStrict;
				if (this.fieldErrors.length == 0) {
					this.clearInvalid();
					if (a) {
						this.clearInvalid.defer(50, this)
					}
				} else {
					var b = this
							.buildCombinedErrorMessage(this.fieldErrors.items);
					this.sortErrors();
					this.markInvalid(b);
					if (a) {
						this.markInvalid(b)
					}
				}
			},
			validateValue : function() {
				var a = true;
				this.eachItem( function(b) {
					if (!b.isValid()) {
						a = false
					}
				});
				return a
			},
			buildCombinedErrorMessage : function(e) {
				var d = [], b;
				for ( var c = 0, a = e.length; c < a; c++) {
					b = e[c];
					d.push(String.format("{0}: {1}", b.errorName, b.error))
				}
				return d.join("<br />")
			},
			sortErrors : function() {
				var a = this.items;
				this.fieldErrors.sort("ASC", function(g, d) {
					var c = function(b) {
						return function(i) {
							return i.getName() == b
						}
					};
					var h = a.findIndexBy(c(g.field)), e = a
							.findIndexBy(c(d.field));
					return h < e ? -1 : 1
				})
			},
			reset : function() {
				this.eachItem( function(a) {
					a.reset()
				});
				( function() {
					this.clearInvalid()
				}).defer(50, this)
			},
			clearInvalidChildren : function() {
				this.eachItem( function(a) {
					a.clearInvalid()
				})
			},
			buildLabel : function(a) {
				return Ext.clean(a).join(this.labelConnector)
			},
			isDirty : function() {
				if (this.disabled || !this.rendered) {
					return false
				}
				var a = false;
				this.eachItem( function(b) {
					if (b.isDirty()) {
						a = true;
						return false
					}
				});
				return a
			},
			eachItem : function(b, a) {
				if (this.items && this.items.each) {
					this.items.each(b, a || this)
				}
			},
			onResize : function(e, c, a, d) {
				var b = this.innerCt;
				if (this.rendered && b.rendered) {
					b.setSize(e, c)
				}
				Ext.form.CompositeField.superclass.onResize.apply(this,
						arguments)
			},
			doLayout : function(c, b) {
				if (this.rendered) {
					var a = this.innerCt;
					a.forceLayout = this.ownerCt.forceLayout;
					a.doLayout(c, b)
				}
			},
			beforeDestroy : function() {
				Ext.destroy(this.innerCt);
				Ext.form.CompositeField.superclass.beforeDestroy.call(this)
			},
			setReadOnly : function(a) {
				if (a == undefined) {
					a = true
				}
				a = !!a;
				if (this.rendered) {
					this.eachItem( function(b) {
						b.setReadOnly(a)
					})
				}
				this.readOnly = a
			},
			onShow : function() {
				Ext.form.CompositeField.superclass.onShow.call(this);
				this.doLayout()
			},
			onDisable : function() {
				this.eachItem( function(a) {
					a.disable()
				})
			},
			onEnable : function() {
				this.eachItem( function(a) {
					a.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 a = this.el.up("form") || Ext.getBody();
		var b = a.child("input[name=" + this.el.dom.name + "]:checked", true);
		return b ? b.value : null
	},
	setValue : function(b) {
		var a, d, c;
		if (typeof b == "boolean") {
			Ext.form.Radio.superclass.setValue.call(this, b)
		} else {
			if (this.rendered) {
				a = this.getCheckEl();
				c = a.child("input[name=" + this.el.dom.name + "][value=" + b
						+ "]", true);
				if (c) {
					Ext.getCmp(c.id).setValue(true)
				}
			}
		}
		if (this.rendered && this.checked) {
			a = a || this.getCheckEl();
			d = this.getCheckEl()
					.select("input[name=" + this.el.dom.name + "]");
			d.each( function(e) {
				if (e.dom.id != this.id) {
					Ext.getCmp(e.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 a = null;
		this.eachItem( function(b) {
			if (b.checked) {
				a = b;
				return false
			}
		});
		return a
	},
	onSetValue : function(c, b) {
		if (arguments.length > 1) {
			var a = this.getBox(c);
			if (a) {
				a.setValue(b);
				if (a.checked) {
					this.eachItem( function(d) {
						if (d !== a) {
							d.setValue(false)
						}
					})
				}
			}
		} else {
			this.setValueForItem(c)
		}
	},
	setValueForItem : function(a) {
		a = String(a).split(",")[0];
		this.eachItem( function(b) {
			b.setValue(a == b.inputValue)
		})
	},
	fireChecked : function() {
		if (!this.checkTask) {
			this.checkTask = new Ext.util.DelayedTask(this.bufferChecked, this)
		}
		this.checkTask.delay(10)
	},
	bufferChecked : function() {
		var a = null;
		this.eachItem( function(b) {
			if (b.checked) {
				a = b;
				return false
			}
		});
		this.fireEvent("change", this, a)
	},
	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(b, a) {
		Ext.apply(this, a);
		if (Ext.isString(this.paramOrder)) {
			this.paramOrder = this.paramOrder.split(/[\s,|]/)
		}
		this.items = new Ext.util.MixedCollection(false, function(c) {
			return c.getItemId()
		});
		this.addEvents("beforeaction", "actionfailed", "actioncomplete");
		if (b) {
			this.initEl(b)
		}
		Ext.form.BasicForm.superclass.constructor.call(this)
	},
	timeout :30,
	paramOrder :undefined,
	paramsAsHash :false,
	waitTitle :"Please Wait...",
	activeAction :null,
	trackResetOnLoad :false,
	initEl : function(a) {
		this.el = Ext.get(a);
		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(a) {
		a.stopEvent()
	},
	destroy : function(a) {
		if (a !== true) {
			this.items.each( function(b) {
				Ext.destroy(b)
			});
			Ext.destroy(this.el)
		}
		this.items.clear();
		this.purgeListeners()
	},
	isValid : function() {
		var a = true;
		this.items.each( function(b) {
			if (!b.validate()) {
				a = false
			}
		});
		return a
	},
	isDirty : function() {
		var a = false;
		this.items.each( function(b) {
			if (b.isDirty()) {
				a = true;
				return false
			}
		});
		return a
	},
	doAction : function(b, a) {
		if (Ext.isString(b)) {
			b = new Ext.form.Action.ACTION_TYPES[b](this, a)
		}
		if (this.fireEvent("beforeaction", this, b) !== false) {
			this.beforeAction(b);
			b.run.defer(100, b)
		}
		return this
	},
	submit : function(b) {
		b = b || {};
		if (this.standardSubmit) {
			var a = b.clientValidation === false || this.isValid();
			if (a) {
				var c = this.el.dom;
				if (this.url && Ext.isEmpty(c.action)) {
					c.action = this.url
				}
				c.submit()
			}
			return a
		}
		var d = String.format("{0}submit", this.api ? "direct" : "");
		this.doAction(d, b);
		return this
	},
	load : function(a) {
		var b = String.format("{0}load", this.api ? "direct" : "");
		this.doAction(b, a);
		return this
	},
	updateRecord : function(b) {
		b.beginEdit();
		var a = b.fields, d, c;
		a.each( function(e) {
			d = this.findField(e.name);
			if (d) {
				c = d.getValue();
				if (typeof c != undefined && c.getGroupValue) {
					c = c.getGroupValue()
				} else {
					if (d.eachItem) {
						c = [];
						d.eachItem( function(g) {
							c.push(g.getValue())
						})
					}
				}
				b.set(e.name, c)
			}
		}, this);
		b.endEdit();
		return this
	},
	loadRecord : function(a) {
		this.setValues(a.data);
		return this
	},
	beforeAction : function(a) {
		this.items.each( function(c) {
			if (c.isFormField && c.syncValue) {
				c.syncValue()
			}
		});
		var b = a.options;
		if (b.waitMsg) {
			if (this.waitMsgTarget === true) {
				this.el.mask(b.waitMsg, "x-mask-loading")
			} else {
				if (this.waitMsgTarget) {
					this.waitMsgTarget = Ext.get(this.waitMsgTarget);
					this.waitMsgTarget.mask(b.waitMsg, "x-mask-loading")
				} else {
					Ext.MessageBox.wait(b.waitMsg, b.waitTitle
							|| this.waitTitle)
				}
			}
		}
	},
	afterAction : function(a, c) {
		this.activeAction = null;
		var b = a.options;
		if (b.waitMsg) {
			if (this.waitMsgTarget === true) {
				this.el.unmask()
			} else {
				if (this.waitMsgTarget) {
					this.waitMsgTarget.unmask()
				} else {
					Ext.MessageBox.updateProgress(1);
					Ext.MessageBox.hide()
				}
			}
		}
		if (c) {
			if (b.reset) {
				this.reset()
			}
			Ext.callback(b.success, b.scope, [ this, a ]);
			this.fireEvent("actioncomplete", this, a)
		} else {
			Ext.callback(b.failure, b.scope, [ this, a ]);
			this.fireEvent("actionfailed", this, a)
		}
	},
	findField : function(c) {
		var b = this.items.get(c);
		if (!Ext.isObject(b)) {
			var a = function(d) {
				if (d.isFormField) {
					if (d.dataIndex == c || d.id == c || d.getName() == c) {
						b = d;
						return false
					} else {
						if (d.isComposite) {
							return d.items.each(a)
						} else {
							if (d instanceof Ext.form.CheckboxGroup
									&& d.rendered) {
								return d.eachItem(a)
							}
						}
					}
				}
			};
			this.items.each(a)
		}
		return b || null
	},
	markInvalid : function(h) {
		if (Ext.isArray(h)) {
			for ( var c = 0, a = h.length; c < a; c++) {
				var b = h[c];
				var d = this.findField(b.id);
				if (d) {
					d.markInvalid(b.msg)
				}
			}
		} else {
			var e, g;
			for (g in h) {
				if (!Ext.isFunction(h[g]) && (e = this.findField(g))) {
					e.markInvalid(h[g])
				}
			}
		}
		return this
	},
	setValues : function(c) {
		if (Ext.isArray(c)) {
			for ( var d = 0, a = c.length; d < a; d++) {
				var b = c[d];
				var e = this.findField(b.id);
				if (e) {
					e.setValue(b.value);
					if (this.trackResetOnLoad) {
						e.originalValue = e.getValue()
					}
				}
			}
		} else {
			var g, h;
			for (h in c) {
				if (!Ext.isFunction(c[h]) && (g = this.findField(h))) {
					g.setValue(c[h]);
					if (this.trackResetOnLoad) {
						g.originalValue = g.getValue()
					}
				}
			}
		}
		return this
	},
	getValues : function(b) {
		var a = Ext.lib.Ajax.serializeForm(this.el.dom);
		if (b === true) {
			return a
		}
		return Ext.urlDecode(a)
	},
	getFieldValues : function(a) {
		var d = {}, e, b, c;
		this.items.each( function(g) {
			if (!g.disabled && (a !== true || g.isDirty())) {
				e = g.getName();
				b = d[e];
				c = g.getValue();
				if (Ext.isDefined(b)) {
					if (Ext.isArray(b)) {
						d[e].push(c)
					} else {
						d[e] = [ b, c ]
					}
				} else {
					d[e] = c
				}
			}
		});
		return d
	},
	clearInvalid : function() {
		this.items.each( function(a) {
			a.clearInvalid()
		});
		return this
	},
	reset : function() {
		this.items.each( function(a) {
			a.reset()
		});
		return this
	},
	add : function() {
		this.items.addAll(Array.prototype.slice.call(arguments, 0));
		return this
	},
	remove : function(a) {
		this.items.remove(a);
		return this
	},
	cleanDestroyed : function() {
		this.items.filterBy( function(a) {
			return !!a.isDestroyed
		}).each(this.remove, this)
	},
	render : function() {
		this.items.each( function(a) {
			if (a.isFormField && !a.rendered && document.getElementById(a.id)) {
				a.applyToMarkup(a.id)
			}
		});
		return this
	},
	applyToFields : function(a) {
		this.items.each( function(b) {
			Ext.apply(b, a)
		});
		return this
	},
	applyIfToFields : function(a) {
		this.items.each( function(b) {
			Ext.applyIf(b, a)
		});
		return this
	},
	callFieldMethod : function(b, a) {
		a = a || [];
		this.items.each( function(c) {
			if (Ext.isFunction(c[b])) {
				c[b].apply(c, a)
			}
		});
		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 a = Ext.applyIf( {
			listeners : {}
		}, this.initialConfig);
		return new Ext.form.BasicForm(null, a)
	},
	initFields : function() {
		var c = this.form;
		var a = this;
		var b = function(d) {
			if (a.isField(d)) {
				c.add(d)
			} else {
				if (d.findBy && d != a) {
					a.applySettings(d);
					if (d.items && d.items.each) {
						d.items.each(b, this)
					}
				}
			}
		};
		this.items.each(b, this)
	},
	applySettings : function(b) {
		var a = b.ownerCt;
		Ext.applyIf(b, {
			labelAlign :a.labelAlign,
			labelWidth :a.labelWidth,
			itemCls :a.itemCls
		})
	},
	getLayoutTarget : function() {
		return this.form.el
	},
	getForm : function() {
		return this.form
	},
	onRender : function(b, a) {
		this.initFields();
		Ext.FormPanel.superclass.onRender.call(this, b, a);
		this.form.initEl(this.body)
	},
	beforeDestroy : function() {
		this.stopMonitoring();
		this.form.destroy(true);
		Ext.FormPanel.superclass.beforeDestroy.call(this)
	},
	isField : function(a) {
		return !!a.setValue && !!a.getValue && !!a.markInvalid
				&& !!a.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(a) {
		Ext.FormPanel.superclass.onAdd.call(this, a);
		this.processAdd(a)
	},
	onAddEvent : function(a, b) {
		if (a !== this) {
			this.processAdd(b)
		}
	},
	processAdd : function(a) {
		if (this.isField(a)) {
			this.form.add(a)
		} else {
			if (a.findBy) {
				this.applySettings(a);
				this.form.add.apply(this.form, a.findBy(this.isField))
			}
		}
	},
	onRemove : function(a) {
		Ext.FormPanel.superclass.onRemove.call(this, a);
		this.processRemove(a)
	},
	onRemoveEvent : function(a, b) {
		if (a !== this) {
			this.processRemove(b)
		}
	},
	processRemove : function(a) {
		if (!this.destroying) {
			if (this.isField(a)) {
				this.form.remove(a)
			} else {
				if (a.findBy) {
					Ext.each(a.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 e = true;
		this.form.items.each( function(g) {
			if (!g.isValid(true)) {
				e = false;
				return false
			}
		});
		if (this.fbar) {
			var b = this.fbar.items.items;
			for ( var d = 0, a = b.length; d < a; d++) {
				var c = b[d];
				if (c.formBind === true && c.disabled === e) {
					c.setDisabled(!e)
				}
			}
		}
		this.fireEvent("clientvalidation", this, e)
	}
});
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(b, a) {
						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, b, a);
						if (this.checkboxToggle) {
							var c = typeof this.checkboxToggle == "object" ? this.checkboxToggle
									: {
										tag :"input",
										type :"checkbox",
										name :this.checkboxName || this.id
												+ "-checkbox"
									};
							this.checkbox = this.header.insertFirst(c);
							this.checkbox.dom.checked = !this.collapsed;
							this.mon(this.checkbox, "click", this.onCheckClick,
									this)
						}
					},
					onCollapse : function(a, b) {
						if (this.checkbox) {
							this.checkbox.dom.checked = false
						}
						Ext.form.FieldSet.superclass.onCollapse
								.call(this, a, b)
					},
					onExpand : function(a, b) {
						if (this.checkbox) {
							this.checkbox.dom.checked = true
						}
						Ext.form.FieldSet.superclass.onExpand.call(this, a, b)
					},
					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;",
					defaultValue :(Ext.isOpera || Ext.isIE6) ? "": "",
					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 d = [], b = this.fontFamilies, c, g;
						for ( var e = 0, a = b.length; e < a; e++) {
							c = b[e];
							g = c.toLowerCase();
							d
									.push(
											'<option value="',
											g,
											'" style="font-family:',
											c,
											';"',
											(this.defaultFont == g ? ' selected="true">'
													: ">"), c, "</option>")
						}
						return d.join("")
					},
					createToolbar : function(e) {
						var c = [];
						var a = Ext.QuickTips && Ext.QuickTips.isEnabled();
						function d(k, h, i) {
							return {
								itemId :k,
								cls :"x-btn-icon",
								iconCls :"x-edit-" + k,
								enableToggle :h !== false,
								scope :e,
								handler :i || e.relayBtnCmd,
								clickEvent :"mousedown",
								tooltip :a ? e.buttonTips[k] || undefined
										: undefined,
								overflowText :e.buttonTips[k].title || undefined,
								tabIndex :-1
							}
						}
						if (this.enableFont && !Ext.isSafari2) {
							var g = new Ext.Toolbar.Item( {
								autoEl : {
									tag :"select",
									cls :"x-font-select",
									html :this.createFontOptions()
								}
							});
							c.push(g, "-")
						}
						if (this.enableFormat) {
							c.push(d("bold"), d("italic"), d("underline"))
						}
						if (this.enableFontSize) {
							c.push("-", d("increasefontsize", false,
									this.adjustFont), d("decreasefontsize",
									false, this.adjustFont))
						}
						if (this.enableColors) {
							c
									.push(
											"-",
											{
												itemId :"forecolor",
												cls :"x-btn-icon",
												iconCls :"x-edit-forecolor",
												clickEvent :"mousedown",
												tooltip :a ? e.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(
																		i, h) {
																	this
																			.execCmd(
																					"forecolor",
																					Ext.isWebKit
																							|| Ext.isIE ? "#"
																							+ h
																							: h);
																	this
																			.deferFocus()
																}
															},
															clickEvent :"mousedown"
														})
											},
											{
												itemId :"backcolor",
												cls :"x-btn-icon",
												iconCls :"x-edit-backcolor",
												clickEvent :"mousedown",
												tooltip :a ? e.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(
																		i, h) {
																	if (Ext.isGecko) {
																		this
																				.execCmd(
																						"useCSS",
																						false);
																		this
																				.execCmd(
																						"hilitecolor",
																						h);
																		this
																				.execCmd(
																						"useCSS",
																						true);
																		this
																				.deferFocus()
																	} else {
																		this
																				.execCmd(
																						Ext.isOpera ? "hilitecolor"
																								: "backcolor",
																						Ext.isWebKit
																								|| Ext.isIE ? "#"
																								+ h
																								: h);
																		this
																				.deferFocus()
																	}
																}
															},
															clickEvent :"mousedown"
														})
											})
						}
						if (this.enableAlignments) {
							c.push("-", d("justifyleft"), d("justifycenter"),
									d("justifyright"))
						}
						if (!Ext.isSafari2) {
							if (this.enableLinks) {
								c.push("-", d("createlink", false,
										this.createLink))
							}
							if (this.enableLists) {
								
								c.push("-", d("insertorderedlist"),
										d("insertunorderedlist"))
							}
							if (this.enableSourceEdit) {
								c.push("-", d("sourceedit", true, function(h) {
									this.toggleSourceEdit(!this.sourceEditMode)
								}))
							}
						}
						var b = new Ext.Toolbar( {
							renderTo :this.wrap.dom.firstChild,
							items :c
						});
						if (g) {
							this.fontSelect = g.el;
							this.mon(this.fontSelect, "change", function() {
								var h = this.fontSelect.dom.value;
								this.relayCmd("fontname", h);
								this.deferFocus()
							}, this)
						}
						this.mon(b.el, "click", function(h) {
							h.preventDefault()
						});
						this.tb = b;
						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(b) {
						Ext.form.HtmlEditor.superclass.setReadOnly
								.call(this, b);
						if (this.initialized) {
							if (Ext.isIE) {
								this.getEditorBody().contentEditable = !b
							} else {
								this.setDesignMode(!b)
							}
							var a = this.getEditorBody();
							if (a) {
								a.style.cursor = this.readOnly ? "default"
										: "text"
							}
							this.disableItems(b)
						}
					},
					getDocMarkup : function() {
						var a = 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, a)
					},
					getEditorBody : function() {
						var a = this.getDoc();
						return a.body || a.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(b, a) {
						Ext.form.HtmlEditor.superclass.onRender
								.call(this, b, a);
						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 c = this.el.getSize();
							this.setSize(c.width, this.height || c.height)
						}
						this.resizeEl = this.positionEl = this.wrap
					},
					createIFrame : function() {
						var a = document.createElement("iframe");
						a.name = Ext.id();
						a.frameBorder = "0";
						a.style.overflow = "auto";
						a.src = Ext.SSL_SECURE_URL;
						this.wrap.dom.appendChild(a);
						this.iframe = a;
						this.monitorTask = Ext.TaskMgr.start( {
							run :this.checkDesignMode,
							scope :this,
							interval :100
						})
					},
					initFrame : function() {
						Ext.TaskMgr.stop(this.monitorTask);
						var b = this.getDoc();
						this.win = this.getWin();
						b.open();
						b.write(this.getDocMarkup());
						b.close();
						var a = {
							run : function() {
								var c = this.getDoc();
								if (c.body || c.readyState == "complete") {
									Ext.TaskMgr.stop(a);
									this.setDesignMode(true);
									this.initEditor.defer(10, this)
								}
							},
							interval :10,
							duration :10000,
							scope :this
						};
						Ext.TaskMgr.start(a)
					},
					checkDesignMode : function() {
						if (this.wrap && this.wrap.dom.offsetWidth) {
							var a = this.getDoc();
							if (!a) {
								return
							}
							if (!a.editorInitialized
									|| this.getDesignMode() != "on") {
								this.initFrame()
							}
						}
					},
					setDesignMode : function(b) {
						var a = this.getDoc();
						if (a) {
							if (this.readOnly) {
								b = false
							}
							a.designMode = (/on|true/i).test(String(b)
									.toLowerCase()) ? "on" : "off"
						}
					},
					getDesignMode : function() {
						var a = this.getDoc();
						if (!a) {
							return ""
						}
						return String(a.designMode).toLowerCase()
					},
					disableItems : function(a) {
						if (this.fontSelect) {
							this.fontSelect.dom.disabled = a
						}
						this.tb.items.each( function(b) {
							if (b.getItemId() != "sourceedit") {
								b.setDisabled(a)
							}
						})
					},
					onResize : function(b, c) {
						Ext.form.HtmlEditor.superclass.onResize.apply(this,
								arguments);
						if (this.el && this.iframe) {
							if (Ext.isNumber(b)) {
								var e = b - this.wrap.getFrameWidth("lr");
								this.el.setWidth(e);
								this.tb.setWidth(e);
								this.iframe.style.width = Math.max(e, 0) + "px"
							}
							if (Ext.isNumber(c)) {
								var a = c - this.wrap.getFrameWidth("tb")
										- this.tb.el.getHeight();
								this.el.setHeight(a);
								this.iframe.style.height = Math.max(a, 0)
										+ "px";
								var d = this.getEditorBody();
								if (d) {
									d.style.height = Math.max(
											(a - (this.iframePad * 2)), 0)
											+ "px"
								}
							}
						}
					},
					toggleSourceEdit : function(b) {
						var d, a;
						if (b === undefined) {
							b = !this.sourceEditMode
						}
						this.sourceEditMode = b === true;
						var c = this.tb.getComponent("sourceedit");
						if (c.pressed !== this.sourceEditMode) {
							c.toggle(this.sourceEditMode);
							if (!c.xtbHidden) {
								return
							}
						}
						if (this.sourceEditMode) {
							this.previousSize = this.getSize();
							d = 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 = d + "px"
						} else {
							a = 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 = a + "px"
						}
						this.fireEvent("editmodechange", this,
								this.sourceEditMode)
					},
					createLink : function() {
						var a = prompt(this.createLinkText,
								this.defaultLinkValue);
						if (a && a != "http://") {
							this.relayCmd("createlink", a)
						}
					},
					initEvents : function() {
						this.originalValue = this.getValue()
					},
					markInvalid :Ext.emptyFn,
					clearInvalid :Ext.emptyFn,
					setValue : function(a) {
						Ext.form.HtmlEditor.superclass.setValue.call(this, a);
						this.pushValue();
						return this
					},
					cleanHtml : function(a) {
						a = String(a);
						if (Ext.isWebKit) {
							a = a
									.replace(
											/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi,
											"")
						}
						if (a.charCodeAt(0) == this.defaultValue.replace(/\D/g,
								"")) {
							a = a.substring(1)
						}
						return a
					},
					syncValue : function() {
						if (this.initialized) {
							var d = this.getEditorBody();
							var c = d.innerHTML;
							if (Ext.isWebKit) {
								var b = d.getAttribute("style");
								var a = b.match(/text-align:(.*?);/i);
								if (a && a[1]) {
									c = '<div style="' + a[0] + '">' + c
											+ "</div>"
								}
							}
							c = this.cleanHtml(c);
							if (this.fireEvent("beforesync", this, c) !== false) {
								this.el.dom.value = c;
								this.fireEvent("sync", this, c)
							}
						}
					},
					getValue : function() {
						this[this.sourceEditMode ? "pushValue" : "syncValue"]();
						return Ext.form.HtmlEditor.superclass.getValue
								.call(this)
					},
					pushValue : function() {
						if (this.initialized) {
							var a = this.el.dom.value;
							if (!this.activated && a.length < 1) {
								a = this.defaultValue
							}
							if (this.fireEvent("beforepush", this, a) !== false) {
								this.getEditorBody().innerHTML = a;
								if (Ext.isGecko) {
									this.setDesignMode(false);
									this.setDesignMode(true)
								}
								this.fireEvent("push", this, a)
							}
						}
					},
					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 c = this.getEditorBody(), a = this.el
									.getStyles("font-size", "font-family",
											"background-image",
											"background-repeat",
											"background-color", "color"), g, b;
							a["background-attachment"] = "fixed";
							c.bgProperties = "fixed";
							Ext.DomHelper.applyStyles(c, a);
							g = this.getDoc();
							if (g) {
								try {
									Ext.EventManager.removeAll(g)
								} catch (d) {
								}
							}
							b = this.onEditorEvent.createDelegate(this);
							Ext.EventManager.on(g, {
								mousedown :b,
								dblclick :b,
								click :b,
								keyup :b,
								buffer :100
							});
							if (Ext.isGecko) {
								Ext.EventManager.on(g, "keypress",
										this.applyCommand, this)
							}
							if (Ext.isIE || Ext.isWebKit || Ext.isOpera) {
								Ext.EventManager.on(g, "keydown", this.fixKeys,
										this)
							}
							g.editorInitialized = true;
							this.initialized = true;
							this.pushValue();
							this.setReadOnly(this.readOnly);
							this.fireEvent("initialize", this)
						} catch (d) {
						}
					},
					beforeDestroy : function() {
						if (this.monitorTask) {
							Ext.TaskMgr.stop(this.monitorTask)
						}
						if (this.rendered) {
							Ext.destroy(this.tb);
							var b = this.getDoc();
							if (b) {
								try {
									Ext.EventManager.removeAll(b);
									for ( var c in b) {
										delete b[c]
									}
								} catch (a) {
								}
							}
							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 a = this.win.getSelection();
							if (!a.focusNode || a.focusNode.nodeType != 3) {
								var b = a.getRangeAt(0);
								b.selectNodeContents(this.getEditorBody());
								b.collapse(true);
								this.deferFocus()
							}
							try {
								this.execCmd("useCSS", true);
								this.execCmd("styleWithCSS", false)
							} catch (c) {
							}
						}
						this.fireEvent("activate", this)
					},
					adjustFont : function(b) {
						var d = b.getItemId() == "increasefontsize" ? 1 : -1, c = this
								.getDoc(), a = parseInt(c
								.queryCommandValue("FontSize") || 2, 10);
						if ((Ext.isSafari && !Ext.isSafari2) || Ext.isChrome
								|| Ext.isAir) {
							if (a <= 10) {
								a = 1 + d
							} else {
								if (a <= 13) {
									a = 2 + d
								} else {
									if (a <= 16) {
										a = 3 + d
									} else {
										if (a <= 18) {
											a = 4 + d
										} else {
											if (a <= 24) {
												a = 5 + d
											} else {
												a = 6 + d
											}
										}
									}
								}
							}
							a = a.constrain(1, 6)
						} else {
							if (Ext.isSafari) {
								d *= 2
							}
							a = Math.max(1, a + d) + (Ext.isSafari ? "px" : 0)
						}
						this.execCmd("FontSize", a)
					},
					onEditorEvent : function(a) {
						this.updateToolbar()
					},
					updateToolbar : function() {
						if (this.readOnly) {
							return
						}
						if (!this.activated) {
							this.onFirstFocus();
							return
						}
						var b = this.tb.items.map, c = this.getDoc();
						if (this.enableFont && !Ext.isSafari2) {
							var a = (c.queryCommandValue("FontName") || this.defaultFont)
									.toLowerCase();
							if (a != this.fontSelect.dom.value) {
								this.fontSelect.dom.value = a
							}
						}
						if (this.enableFormat) {
							b.bold.toggle(c.queryCommandState("bold"));
							b.italic.toggle(c.queryCommandState("italic"));
							b.underline
									.toggle(c.queryCommandState("underline"))
						}
						if (this.enableAlignments) {
							b.justifyleft.toggle(c
									.queryCommandState("justifyleft"));
							b.justifycenter.toggle(c
									.queryCommandState("justifycenter"));
							b.justifyright.toggle(c
									.queryCommandState("justifyright"))
						}
						if (!Ext.isSafari2 && this.enableLists) {
							b.insertorderedlist.toggle(c
									.queryCommandState("insertorderedlist"));
							b.insertunorderedlist.toggle(c
									.queryCommandState("insertunorderedlist"))
						}
						Ext.menu.MenuMgr.hideAll();
						this.syncValue()
					},
					relayBtnCmd : function(a) {
						this.relayCmd(a.getItemId())
					},
					relayCmd : function(b, a) {
						( function() {
							this.focus();
							this.execCmd(b, a);
							this.updateToolbar()
						}).defer(10, this)
					},
					execCmd : function(b, a) {
						var c = this.getDoc();
						c.execCommand(b, false, a === undefined ? null : a);
						this.syncValue()
					},
					applyCommand : function(b) {
						if (b.ctrlKey) {
							var d = b.getCharCode(), a;
							if (d > 0) {
								d = String.fromCharCode(d);
								switch (d) {
								case "b":
									a = "bold";
									break;
								case "i":
									a = "italic";
									break;
								case "u":
									a = "underline";
									break
								}
								if (a) {
									this.win.focus();
									this.execCmd(a);
									this.deferFocus();
									b.preventDefault()
								}
							}
						}
					},
					insertAtCursor : function(c) {
						if (!this.activated) {
							return
						}
						if (Ext.isIE) {
							this.win.focus();
							var b = this.getDoc(), a = b.selection
									.createRange();
							if (a) {
								a.pasteHTML(c);
								this.syncValue();
								this.deferFocus()
							}
						} else {
							this.win.focus();
							this.execCmd("InsertHTML", c);
							this.deferFocus()
						}
					},
					fixKeys : function() {
						if (Ext.isIE) {
							return function(g) {
								var a = g.getKey(), d = this.getDoc(), b;
								if (a == g.TAB) {
									g.stopEvent();
									b = d.selection.createRange();
									if (b) {
										b.collapse(true);
										b.pasteHTML("&nbsp;&nbsp;&nbsp;&nbsp;");
										this.deferFocus()
									}
								} else {
									if (a == g.ENTER) {
										b = d.selection.createRange();
										if (b) {
											var c = b.parentElement();
											if (!c
													|| c.tagName.toLowerCase() != "li") {
												g.stopEvent();
												b.pasteHTML("<br />");
												b.collapse(false);
												b.select()
											}
										}
									}
								}
							}
						} else {
							if (Ext.isOpera) {
								return function(b) {
									var a = b.getKey();
									if (a == b.TAB) {
										b.stopEvent();
										this.win.focus();
										this.execCmd("InsertHTML",
												"&nbsp;&nbsp;&nbsp;&nbsp;");
										this.deferFocus()
									}
								}
							} else {
								if (Ext.isWebKit) {
									return function(b) {
										var a = b.getKey();
										if (a == b.TAB) {
											b.stopEvent();
											this.execCmd("InsertText", "\t");
											this.deferFocus()
										} else {
											if (a == b.ENTER) {
												b.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(b, a) {
						this.setLimit(b, true, a);
						return this
					},
					setMaxValue : function(b, a) {
						this.setLimit(b, false, a);
						return this
					},
					generateStore : function(b) {
						var c = this.minValue
								|| new Date(this.initDate).clearTime(), a = this.maxValue
								|| new Date(this.initDate).clearTime().add(
										"mi", (24 * 60) - 1), d = [];
						while (c <= a) {
							d.push(c.dateFormat(this.format));
							c = c.add("mi", this.increment)
						}
						this.bindStore(d, b)
					},
					setLimit : function(b, g, a) {
						var e;
						if (Ext.isString(b)) {
							e = this.parseDate(b)
						} else {
							if (Ext.isDate(b)) {
								e = b
							}
						}
						if (e) {
							var c = new Date(this.initDate).clearTime();
							c.setHours(e.getHours(), e.getMinutes(), e
									.getSeconds(), e.getMilliseconds());
							this[g ? "minValue" : "maxValue"] = c;
							if (!a) {
								this.generateStore()
							}
						}
					},
					getValue : function() {
						var a = Ext.form.TimeField.superclass.getValue
								.call(this);
						return this.formatDate(this.parseDate(a)) || ""
					},
					setValue : function(a) {
						return Ext.form.TimeField.superclass.setValue.call(
								this, this.formatDate(this.parseDate(a)))
					},
					validateValue :Ext.form.DateField.prototype.validateValue,
					formatDate :Ext.form.DateField.prototype.formatDate,
					parseDate : function(h) {
						if (!h || Ext.isDate(h)) {
							return h
						}
						var k = this.initDate + " ", g = this.initDateFormat
								+ " ", b = Date.parseDate(k + h, g
								+ this.format), c = this.altFormats;
						if (!b && c) {
							if (!this.altFormatsArray) {
								this.altFormatsArray = c.split("|")
							}
							for ( var e = 0, d = this.altFormatsArray, a = d.length; e < a
									&& !b; e++) {
								b = Date.parseDate(k + h, g + d[e])
							}
						}
						return b
					}
				});
Ext.reg("timefield", Ext.form.TimeField);
Ext.form.SliderField = Ext.extend(Ext.form.Field, {
	useTips :true,
	tipText :null,
	actionMode :"wrap",
	initComponent : function() {
		var b = Ext.copyTo( {
			id :this.id + "-slider"
		}, this.initialConfig, [ "vertical", "minValue", "maxValue",
				"decimalPrecision", "keyIncrement", "increment",
				"clickToChange", "animate" ]);
		if (this.useTips) {
			var a = this.tipText ? {
				getText :this.tipText
			} : {};
			b.plugins = [ new Ext.slider.Tip(a) ]
		}
		this.slider = new Ext.Slider(b);
		Ext.form.SliderField.superclass.initComponent.call(this)
	},
	onRender : function(b, a) {
		this.autoCreate = {
			id :this.id,
			name :this.name,
			type :"hidden",
			tag :"input"
		};
		Ext.form.SliderField.superclass.onRender.call(this, b, a);
		this.wrap = this.el.wrap( {
			cls :"x-form-field-wrap"
		});
		this.resizeEl = this.positionEl = this.wrap;
		this.slider.render(this.wrap)
	},
	onResize : function(b, c, d, a) {
		Ext.form.SliderField.superclass.onResize.call(this, b, c, d, a);
		this.slider.setSize(b, c)
	},
	initEvents : function() {
		Ext.form.SliderField.superclass.initEvents.call(this);
		this.slider.on("change", this.onChange, this)
	},
	onChange : function(b, a) {
		this.setValue(a, 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(a) {
		this.slider.setMinValue(a);
		return this
	},
	setMaxValue : function(a) {
		this.slider.setMaxValue(a);
		return this
	},
	setValue : function(c, b, a) {
		if (!a) {
			this.slider.setValue(c, b)
		}
		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(b, a) {
		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, b, a)
	},
	setText : function(a, b) {
		var c = b === false;
		this[!c ? "text" : "html"] = a;
		delete this[c ? "text" : "html"];
		if (this.rendered) {
			this.el.dom.innerHTML = b !== false ? Ext.util.Format.htmlEncode(a)
					: a
		}
		return this
	}
});
Ext.reg("label", Ext.form.Label);
Ext.form.Action = function(b, a) {
	this.form = b;
	this.options = a || {}
};
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(a) {
	},
	success : function(a) {
	},
	handleResponse : function(a) {
	},
	failure : function(a) {
		this.response = a;
		this.failureType = Ext.form.Action.CONNECT_FAILURE;
		this.form.afterAction(this, false)
	},
	processResponse : function(a) {
		this.response = a;
		if (!a.responseText && !a.responseXML) {
			return true
		}
		this.result = this.handleResponse(a);
		return this.result
	},
	getUrl : function(c) {
		var a = this.options.url || this.form.url || this.form.el.dom.action;
		if (c) {
			var b = this.getParams();
			if (b) {
				a = Ext.urlAppend(a, b)
			}
		}
		return a
	},
	getMethod : function() {
		return (this.options.method || this.form.method
				|| this.form.el.dom.method || "POST").toUpperCase()
	},
	getParams : function() {
		var a = this.form.baseParams;
		var b = this.options.params;
		if (b) {
			if (typeof b == "object") {
				b = Ext.urlEncode(Ext.applyIf(b, a))
			} else {
				if (typeof b == "string" && a) {
					b += "&" + Ext.urlEncode(a)
				}
			}
		} else {
			if (a) {
				b = Ext.urlEncode(a)
			}
		}
		return b
	},
	createCallback : function(a) {
		var a = a || {};
		return {
			success :this.success,
			failure :this.failure,
			scope :this,
			timeout :(a.timeout * 1000) || (this.form.timeout * 1000),
			upload :this.form.fileUpload ? this.success : undefined
		}
	}
};
Ext.form.Action.Submit = function(b, a) {
	Ext.form.Action.Submit.superclass.constructor.call(this, b, a)
};
Ext.extend(Ext.form.Action.Submit, Ext.form.Action, {
	type :"submit",
	run : function() {
		var e = this.options, g = this.getMethod(), d = g == "GET";
		if (e.clientValidation === false || this.form.isValid()) {
			if (e.submitEmptyText === false) {
				var a = this.form.items, c = [], b = function(h) {
					if (h.el.getValue() == h.emptyText) {
						c.push(h);
						h.el.dom.value = ""
					}
					if (h.isComposite && h.rendered) {
						h.items.each(b)
					}
				};
				a.each(b)
			}
			Ext.Ajax.request(Ext.apply(this.createCallback(e), {
				form :this.form.el.dom,
				url :this.getUrl(d),
				method :g,
				headers :e.headers,
				params :!d ? this.getParams() : null,
				isUpload :this.form.fileUpload
			}));
			if (e.submitEmptyText === false) {
				Ext.each(c, function(h) {
					if (h.applyEmptyText) {
						h.applyEmptyText()
					}
				})
			}
		} else {
			if (e.clientValidation !== false) {
				this.failureType = Ext.form.Action.CLIENT_INVALID;
				this.form.afterAction(this, false)
			}
		}
	},
	success : function(b) {
		var a = this.processResponse(b);
		if (a === true || a.success) {
			this.form.afterAction(this, true);
			return
		}
		if (a.errors) {
			this.form.markInvalid(a.errors)
		}
		this.failureType = Ext.form.Action.SERVER_INVALID;
		this.form.afterAction(this, false)
	},
	handleResponse : function(c) {
		if (this.form.errorReader) {
			var b = this.form.errorReader.read(c);
			var g = [];
			if (b.records) {
				for ( var d = 0, a = b.records.length; d < a; d++) {
					var e = b.records[d];
					g[d] = e.data
				}
			}
			if (g.length < 1) {
				g = null
			}
			return {
				success :b.success,
				errors :g
			}
		}
		return Ext.decode(c.responseText)
	}
});
Ext.form.Action.Load = function(b, a) {
	Ext.form.Action.Load.superclass.constructor.call(this, b, a);
	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(b) {
		var a = this.processResponse(b);
		if (a === true || !a.success || !a.data) {
			this.failureType = Ext.form.Action.LOAD_FAILURE;
			this.form.afterAction(this, false);
			return
		}
		this.form.clearInvalid();
		this.form.setValues(a.data);
		this.form.afterAction(this, true)
	},
	handleResponse : function(b) {
		if (this.form.reader) {
			var a = this.form.reader.read(b);
			var c = a.records && a.records[0] ? a.records[0].data : null;
			return {
				success :a.success,
				data :c
			}
		}
		return Ext.decode(b.responseText)
	}
});
Ext.form.Action.DirectLoad = Ext.extend(Ext.form.Action.Load, {
	constructor : function(b, a) {
		Ext.form.Action.DirectLoad.superclass.constructor.call(this, b, a)
	},
	type :"directload",
	run : function() {
		var a = this.getParams();
		a.push(this.success, this);
		this.form.api.load.apply(window, a)
	},
	getParams : function() {
		var c = [], h = {};
		var e = this.form.baseParams;
		var g = this.options.params;
		Ext.apply(h, g, e);
		var b = this.form.paramOrder;
		if (b) {
			for ( var d = 0, a = b.length; d < a; d++) {
				c.push(h[b[d]])
			}
		} else {
			if (this.form.paramsAsHash) {
				c.push(h)
			}
		}
		return c
	},
	processResponse : function(a) {
		this.result = a;
		return a
	},
	success : function(a, b) {
		if (b.type == Ext.Direct.exceptions.SERVER) {
			a = {}
		}
		Ext.form.Action.DirectLoad.superclass.success.call(this, a)
	}
});
Ext.form.Action.DirectSubmit = Ext.extend(Ext.form.Action.Submit, {
	constructor : function(b, a) {
		Ext.form.Action.DirectSubmit.superclass.constructor.call(this, b, a)
	},
	type :"directsubmit",
	run : function() {
		var a = this.options;
		if (a.clientValidation === false || this.form.isValid()) {
			this.success.params = this.getParams();
			this.form.api.submit(this.form.el.dom, this.success, this)
		} else {
			if (a.clientValidation !== false) {
				this.failureType = Ext.form.Action.CLIENT_INVALID;
				this.form.afterAction(this, false)
			}
		}
	},
	getParams : function() {
		var c = {};
		var a = this.form.baseParams;
		var b = this.options.params;
		Ext.apply(c, b, a);
		return c
	},
	processResponse : function(a) {
		this.result = a;
		return a
	},
	success : function(a, b) {
		if (b.type == Ext.Direct.exceptions.SERVER) {
			a = {}
		}
		Ext.form.Action.DirectSubmit.superclass.success.call(this, a)
	}
});
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 c = /^[a-zA-Z_]+$/, d = /^[a-zA-Z0-9_]+$/, b = /^(\w+)([\-+.][\w]+)*@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/, a = /(((^https?)|(^ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
	return {
		email : function(e) {
			return b.test(e)
		},
		emailText :'This field should be an e-mail address in the format "user@example.com"',
		emailMask :/[a-z0-9_\.\-@\+]/i,
		url : function(e) {
			return a.test(e)
		},
		urlText :'This field should be a URL in the format "http://www.example.com"',
		alpha : function(e) {
			return c.test(e)
		},
		alphaText :"This field should only contain letters and _",
		alphaMask :/[a-z_]/i,
		alphanum : function(e) {
			return d.test(e)
		},
		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(d, a) {
						Ext.grid.GridPanel.superclass.onRender.apply(this,
								arguments);
						var e = this.getGridEl();
						this.el.addClass("x-grid-panel");
						this.mon(e, {
							scope :this,
							mousedown :this.onMouseDown,
							click :this.onClick,
							dblclick :this.onDblClick,
							contextmenu :this.onContextMenu
						});
						this.relayEvents(e,
								[ "mousedown", "mouseup", "mouseover",
										"mouseout", "keypress", "keydown" ]);
						var b = this.getView();
						b.init(this);
						b.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(a) {
						var l = this.colModel, g = a.columns, k = this.store, n, h, m;
						if (g) {
							for ( var d = 0, e = g.length; d < e; d++) {
								n = g[d];
								h = l.getColumnById(n.id);
								if (h) {
									m = l.getIndexById(n.id);
									l.setState(m, {
										hidden :n.hidden,
										width :n.width,
										sortable :n.sortable
									});
									if (m != d) {
										l.moveColumn(m, d)
									}
								}
							}
						}
						if (k) {
							n = a.sort;
							if (n) {
								k[k.remoteSort ? "setDefaultSort" : "sort"](
										n.field, n.direction)
							}
							n = a.group;
							if (k.groupBy) {
								if (n) {
									k.groupBy(n)
								} else {
									k.clearGrouping()
								}
							}
						}
						var b = Ext.apply( {}, a);
						delete b.columns;
						delete b.sort;
						Ext.grid.GridPanel.superclass.applyState.call(this, b)
					},
					getState : function() {
						var g = {
							columns : []
						}, b = this.store, e, a;
						for ( var d = 0, h; (h = this.colModel.config[d]); d++) {
							g.columns[d] = {
								id :h.id,
								width :h.width
							};
							if (h.hidden) {
								g.columns[d].hidden = true
							}
							if (h.sortable) {
								g.columns[d].sortable = true
							}
						}
						if (b) {
							e = b.getSortState();
							if (e) {
								g.sort = e
							}
							if (b.getGroupState) {
								a = b.getGroupState();
								if (a) {
									g.group = a
								}
							}
						}
						return g
					},
					afterRender : function() {
						Ext.grid.GridPanel.superclass.afterRender.call(this);
						var a = this.view;
						this.on("bodyresize", a.layout, a);
						a.layout(true);
						if (this.deferRowRender) {
							if (!this.deferRowRenderTask) {
								this.deferRowRenderTask = new Ext.util.DelayedTask(
										a.afterRender, this.view)
							}
							this.deferRowRenderTask.delay(10)
						} else {
							a.afterRender()
						}
						this.viewReady = true
					},
					reconfigure : function(a, b) {
						var c = this.rendered;
						if (c) {
							if (this.loadMask) {
								this.loadMask.destroy();
								this.loadMask = new Ext.LoadMask(this.bwrap,
										Ext.apply( {}, {
											store :a
										}, this.initialConfig.loadMask))
							}
						}
						if (this.view) {
							this.view.initData(a, b)
						}
						this.store = a;
						this.colModel = b;
						if (c) {
							this.view.refresh(true)
						}
						this.fireEvent("reconfigure", this, a, b)
					},
					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(a, b) {
						this.view.processEvent(a, b)
					},
					onClick : function(a) {
						this.processEvent("click", a)
					},
					onMouseDown : function(a) {
						this.processEvent("mousedown", a)
					},
					onContextMenu : function(b, a) {
						this.processEvent("contextmenu", b)
					},
					onDblClick : function(a) {
						this.processEvent("dblclick", a)
					},
					walkCells : function(l, c, b, e, k) {
						var i = this.colModel, g = i.getColumnCount(), a = this.store, h = a
								.getCount(), d = true;
						if (b < 0) {
							if (c < 0) {
								l--;
								d = false
							}
							while (l >= 0) {
								if (!d) {
									c = g - 1
								}
								d = false;
								while (c >= 0) {
									if (e.call(k || this, l, c, i) === true) {
										return [ l, c ]
									}
									c--
								}
								l--
							}
						} else {
							if (c >= g) {
								l++;
								d = false
							}
							while (l < h) {
								if (!d) {
									c = 0
								}
								d = false;
								while (c < g) {
									if (e.call(k || this, l, c, i) === true) {
										return [ l, c ]
									}
									c++
								}
								l++
							}
						}
						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 a = this.selModel.getCount();
						return String.format(this.ddText, a, a == 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(a) {
		this.aggregator = a
	},
	setMeasure : function(a) {
		this.measure = a
	},
	setLeftAxis : function(b, a) {
		this.leftAxis = b;
		if (a) {
			this.view.refresh()
		}
	},
	setTopAxis : function(b, a) {
		this.topAxis = b;
		if (a) {
			this.view.refresh()
		}
	},
	initAxes : function() {
		var a = Ext.grid.PivotAxis;
		if (!(this.leftAxis instanceof a)) {
			this.setLeftAxis(new a( {
				orientation :"vertical",
				dimensions :this.leftAxis || [],
				store :this.store
			}))
		}
		if (!(this.topAxis instanceof a)) {
			this.setTopAxis(new a( {
				orientation :"horizontal",
				dimensions :this.topAxis || [],
				store :this.store
			}))
		}
	},
	extractData : function() {
		var c = this.store.data.items, s = c.length, q = [], h, g, e, d;
		if (s == 0) {
			return []
		}
		var l = this.leftAxis.getTuples(), o = l.length, m = this.topAxis
				.getTuples(), a = m.length, b = this.getAggregator();
		for (g = 0; g < s; g++) {
			h = c[g];
			for (e = 0; e < o; e++) {
				q[e] = q[e] || [];
				if (l[e].matcher(h) === true) {
					for (d = 0; d < a; d++) {
						q[e][d] = q[e][d] || [];
						if (m[d].matcher(h)) {
							q[e][d].push(h)
						}
					}
				}
			}
		}
		var n = q.length, p, r;
		for (g = 0; g < n; g++) {
			r = q[g];
			p = r.length;
			for (e = 0; e < p; e++) {
				q[g][e] = b(q[g][e], this.measure)
			}
		}
		return q
	},
	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(a, c) {
	var e = a.length, d = 0, b;
	for (b = 0; b < e; b++) {
		d += a[b].get(c)
	}
	return d
});
Ext.grid.PivotAggregatorMgr.registerType("avg", function(a, c) {
	var e = a.length, d = 0, b;
	for (b = 0; b < e; b++) {
		d += a[b].get(c)
	}
	return (d / e) || "n/a"
});
Ext.grid.PivotAggregatorMgr.registerType("min", function(a, c) {
	var e = [], d = a.length, b;
	for (b = 0; b < d; b++) {
		e.push(a[b].get(c))
	}
	return Math.min.apply(this, e) || "n/a"
});
Ext.grid.PivotAggregatorMgr.registerType("max", function(a, c) {
	var e = [], d = a.length, b;
	for (b = 0; b < d; b++) {
		e.push(a[b].get(c))
	}
	return Math.max.apply(this, e) || "n/a"
});
Ext.grid.PivotAggregatorMgr.registerType("count", function(a, b) {
	return a.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(a) {
						Ext.apply(this, a);
						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 c = this.templates || {}, d, b, g = 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>"), a = [
								'<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(""), e = [
								'<table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',
								"<tbody>", "<tr>{cells}</tr>",
								this.enableRowBody ? a : "", "</tbody>",
								"</table>" ].join("");
						Ext.applyIf(c, {
							hcell :g,
							cell :this.cellTpl,
							body :this.bodyTpl,
							header :this.headerTpl,
							master :this.masterTpl,
							row :new Ext.Template(
									'<div class="x-grid3-row {alt}" style="{tstyle}">'
											+ e + "</div>"),
							rowInner :new Ext.Template(e)
						});
						for (b in c) {
							d = c[b];
							if (d && Ext.isFunction(d.compile) && !d.compiled) {
								d.disableFormats = true;
								d.compile()
							}
						}
						this.templates = c;
						this.colRe = new RegExp("x-grid3-td-([^\\s]+)", "")
					},
					fly : function(a) {
						if (!this._flyweight) {
							this._flyweight = new Ext.Element.Flyweight(
									document.body)
						}
						this._flyweight.dom = a;
						return this._flyweight
					},
					getEditorParent : function() {
						return this.scroller.dom
					},
					initElements : function() {
						var b = Ext.Element, d = Ext
								.get(this.grid.getGridEl().dom.firstChild), e = new b(
								d.child("div.x-grid3-viewport")), c = new b(e
								.child("div.x-grid3-header")), a = new b(e
								.child("div.x-grid3-scroller"));
						if (this.grid.hideHeaders) {
							c.setDisplayed(false)
						}
						if (this.forceFit) {
							a.setStyle("overflow-x", "hidden")
						}
						Ext
								.apply(
										this,
										{
											el :d,
											mainWrap :e,
											scroller :a,
											mainHd :c,
											innerHd :c
													.child("div.x-grid3-header-inner").dom,
											mainBody :new b(b.fly(a).child(
													"div.x-grid3-body")),
											focusEl :new b(b.fly(a).child("a")),
											resizeMarker :new b(
													d
															.child("div.x-grid3-resize-marker")),
											resizeProxy :new b(
													d
															.child("div.x-grid3-resize-proxy"))
										});
						this.focusEl.swallowEvent("click", true)
					},
					getRows : function() {
						return this.hasRows() ? this.mainBody.dom.childNodes
								: []
					},
					findCell : function(a) {
						if (!a) {
							return false
						}
						return this.fly(a).findParent(this.cellSelector,
								this.cellSelectorDepth)
					},
					findCellIndex : function(d, c) {
						var b = this.findCell(d), a;
						if (b) {
							a = this.fly(b).hasClass(c);
							if (!c || a) {
								return this.getCellIndex(b)
							}
						}
						return false
					},
					getCellIndex : function(b) {
						if (b) {
							var a = b.className.match(this.colRe);
							if (a && a[1]) {
								return this.cm.getIndexById(a[1])
							}
						}
						return false
					},
					findHeaderCell : function(b) {
						var a = this.findCell(b);
						return a && this.fly(a).hasClass(this.hdCls) ? a : null
					},
					findHeaderIndex : function(a) {
						return this.findCellIndex(a, this.hdCls)
					},
					findRow : function(a) {
						if (!a) {
							return false
						}
						return this.fly(a).findParent(this.rowSelector,
								this.rowSelectorDepth)
					},
					findRowIndex : function(a) {
						var b = this.findRow(a);
						return b ? b.rowIndex : false
					},
					findRowBody : function(a) {
						if (!a) {
							return false
						}
						return this.fly(a).findParent(this.rowBodySelector,
								this.rowBodySelectorDepth)
					},
					getRow : function(a) {
						return this.getRows()[a]
					},
					getCell : function(b, a) {
						return Ext.fly(this.getRow(b)).query(this.cellSelector)[a]
					},
					getHeaderCell : function(a) {
						return this.mainHd.dom.getElementsByTagName("td")[a]
					},
					addRowClass : function(b, a) {
						var c = this.getRow(b);
						if (c) {
							this.fly(c).addClass(a)
						}
					},
					removeRowClass : function(c, a) {
						var b = this.getRow(c);
						if (b) {
							this.fly(b).removeClass(a)
						}
					},
					removeRow : function(a) {
						Ext.removeNode(this.getRow(a));
						this.syncFocusEl(a)
					},
					removeRows : function(c, a) {
						var b = this.mainBody.dom, d;
						for (d = c; d <= a; d++) {
							Ext.removeNode(b.childNodes[c])
						}
						this.syncFocusEl(c)
					},
					getScrollState : function() {
						var a = this.scroller.dom;
						return {
							left :a.scrollLeft,
							top :a.scrollTop
						}
					},
					restoreScroll : function(a) {
						var b = this.scroller.dom;
						b.scrollLeft = a.left;
						b.scrollTop = a.top
					},
					scrollToTop : function() {
						var a = this.scroller.dom;
						a.scrollTop = 0;
						a.scrollLeft = 0
					},
					syncScroll : function() {
						this.syncHeaderScroll();
						var a = this.scroller.dom;
						this.grid.fireEvent("bodyscroll", a.scrollLeft,
								a.scrollTop)
					},
					syncHeaderScroll : function() {
						var a = this.innerHd, b = this.scroller.dom.scrollLeft;
						a.scrollLeft = b;
						a.scrollLeft = b
					},
					updateSortIcon : function(d, c) {
						var a = this.sortClasses, b = a[c == "DESC" ? 1 : 0], e = this.mainHd
								.select("td").removeClass(a);
						e.item(d).addClass(b)
					},
					updateAllColumnWidths : function() {
						var e = this.getTotalWidth(), k = this.cm
								.getColumnCount(), m = this.getRows(), g = m.length, b = [], l, a, h, d, c;
						for (d = 0; d < k; d++) {
							b[d] = this.getColumnWidth(d);
							this.getHeaderCell(d).style.width = b[d]
						}
						this.updateHeaderWidth();
						for (d = 0; d < g; d++) {
							l = m[d];
							l.style.width = e;
							a = l.firstChild;
							if (a) {
								a.style.width = e;
								h = a.rows[0];
								for (c = 0; c < k; c++) {
									h.childNodes[c].style.width = b[c]
								}
							}
						}
						this.onAllColumnWidthsUpdated(b, e)
					},
					updateColumnWidth : function(d, b) {
						var c = this.getColumnWidth(d), k = this
								.getTotalWidth(), h = this.getHeaderCell(d), a = this
								.getRows(), e = a.length, m, g, l;
						this.updateHeaderWidth();
						h.style.width = c;
						for (g = 0; g < e; g++) {
							m = a[g];
							l = m.firstChild;
							m.style.width = k;
							if (l) {
								l.style.width = k;
								l.rows[0].childNodes[d].style.width = c
							}
						}
						this.onColumnWidthUpdated(d, c, k)
					},
					updateColumnHidden : function(b, k) {
						var h = this.getTotalWidth(), l = k ? "none" : "", g = this
								.getHeaderCell(b), a = this.getRows(), d = a.length, m, c, e;
						this.updateHeaderWidth();
						g.style.display = l;
						for (e = 0; e < d; e++) {
							m = a[e];
							m.style.width = h;
							c = m.firstChild;
							if (c) {
								c.style.width = h;
								c.rows[0].childNodes[b].style.display = l
							}
						}
						this.onColumnHiddenUpdated(b, k, h);
						delete this.lastViewWidth;
						this.layout()
					},
					doRender : function(d, v, m, a, r, t) {
						var h = this.templates, c = h.cell, y = h.row, o = r - 1, b = "width:"
								+ this.getTotalWidth() + ";", k = [], l = [], n = {
							tstyle :b
						}, q = {}, w = v.length, x, g, e, u, s, p;
						for (s = 0; s < w; s++) {
							e = v[s];
							l = [];
							p = s + a;
							for (u = 0; u < r; u++) {
								g = d[u];
								q.id = g.id;
								q.css = u === 0 ? "x-grid3-cell-first "
										: (u == o ? "x-grid3-cell-last " : "");
								q.attr = q.cellAttr = "";
								q.style = g.style;
								q.value = g.renderer.call(g.scope,
										e.data[g.name], q, e, p, u, m);
								if (Ext.isEmpty(q.value)) {
									q.value = "&#160;"
								}
								if (this.markDirty
										&& e.dirty
										&& typeof e.modified[g.name] != "undefined") {
									q.css += " x-grid3-dirty-cell"
								}
								l[l.length] = c.apply(q)
							}
							x = [];
							if (t && ((p + 1) % 2 === 0)) {
								x[0] = "x-grid3-row-alt"
							}
							if (e.dirty) {
								x[1] = " x-grid3-dirty-row"
							}
							n.cols = r;
							if (this.getRowClass) {
								x[2] = this.getRowClass(e, p, n, m)
							}
							n.alt = x.join(" ");
							n.cells = l.join("");
							k[k.length] = y.apply(n)
						}
						return k.join("")
					},
					processRows : function(a, g) {
						if (!this.ds || this.ds.getCount() < 1) {
							return
						}
						var d = this.getRows(), c = d.length, e, b;
						g = g || !this.grid.stripeRows;
						a = a || 0;
						for (b = 0; b < c; b++) {
							e = d[b];
							if (e) {
								e.rowIndex = b;
								if (!g) {
									e.className = e.className.replace(
											this.rowClsRe, " ");
									if ((b + 1) % 2 === 0) {
										e.className += " x-grid3-row-alt"
									}
								}
							}
						}
						if (a === 0) {
							Ext.fly(d[0]).addClass(this.firstRowCls)
						}
						Ext.fly(d[c - 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 a = 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 (a.enableColumnResize !== false) {
							this.splitZone = new Ext.grid.GridView.SplitDragZone(
									a, this.mainHd.dom)
						}
						if (a.enableColumnMove) {
							this.columnDrag = new Ext.grid.GridView.ColumnDragZone(
									a, this.innerHd);
							this.columnDrop = new Ext.grid.HeaderDropZone(a,
									this.mainHd.dom)
						}
						if (a.enableHdMenu !== false) {
							this.hmenu = new Ext.menu.Menu( {
								id :a.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 (a.enableColumnHide !== false) {
								this.colMenu = new Ext.menu.Menu( {
									id :a.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 (a.trackMouseOver) {
							this.mainBody.on( {
								scope :this,
								mouseover :this.onRowOver,
								mouseout :this.onRowOut
							})
						}
						if (a.enableDragDrop || a.enableDrag) {
							this.dragZone = new Ext.grid.GridDragZone(a, {
								ddGroup :a.ddGroup || "GridDD"
							})
						}
						this.updateHeaderSortState()
					},
					renderUI : function() {
						var a = this.templates;
						return a.master.apply( {
							body :a.body.apply( {
								rows :"&#160;"
							}),
							header :this.renderHeaders(),
							ostyle :"width:" + this.getOffsetWidth() + ";",
							bstyle :"width:" + this.getTotalWidth() + ";"
						})
					},
					processEvent : function(b, h) {
						var i = h.getTarget(), a = this.grid, d = this
								.findHeaderIndex(i), l, k, c, g;
						a.fireEvent(b, h);
						if (d !== false) {
							a.fireEvent("header" + b, a, d, h)
						} else {
							l = this.findRowIndex(i);
							if (l !== false) {
								k = this.findCellIndex(i);
								if (k !== false) {
									c = a.colModel.getColumnAt(k);
									if (a.fireEvent("cell" + b, a, l, k, h) !== false) {
										if (!c
												|| (c.processEvent && (c
														.processEvent(b, h, a,
																l, k) !== false))) {
											a.fireEvent("row" + b, a, l, h)
										}
									}
								} else {
									if (a.fireEvent("row" + b, a, l, h) !== false) {
										(g = this.findRowBody(i))
												&& a.fireEvent("rowbody" + b,
														a, l, h)
									}
								}
							} else {
								a.fireEvent("container" + b, a, h)
							}
						}
					},
					layout : function(k) {
						if (!this.mainBody) {
							return
						}
						var a = this.grid, d = a.getGridEl(), c = d
								.getSize(true), i = c.width, b = c.height, h = this.scroller, g, e, l;
						if (i < 20 || b < 20) {
							return
						}
						if (a.autoHeight) {
							g = h.dom.style;
							g.overflow = "visible";
							if (Ext.isWebKit) {
								g.position = "static"
							}
						} else {
							this.el.setSize(i, b);
							e = this.mainHd.getHeight();
							l = b - e;
							h.setSize(i, l);
							if (this.innerHd) {
								this.innerHd.style.width = (i) + "px"
							}
						}
						if (this.forceFit || (k === true && this.autoFill)) {
							if (this.lastViewWidth != i) {
								this.fitColumns(false, false);
								this.lastViewWidth = i
							}
						} else {
							this.autoExpand();
							this.syncHeaderScroll()
						}
						this.onLayout(i, l)
					},
					onLayout : function(a, b) {
					},
					onColumnWidthUpdated : function(c, a, b) {
					},
					onAllColumnWidthsUpdated : function(a, b) {
					},
					onColumnHiddenUpdated : function(b, c, a) {
					},
					updateColumnText : function(a, b) {
					},
					afterMove : function(a) {
					},
					init : function(a) {
						this.grid = a;
						this.initTemplates();
						this.initData(a.store, a.colModel);
						this.initUI(a)
					},
					getColumnId : function(a) {
						return this.cm.getColumnId(a)
					},
					getOffsetWidth : function() {
						return (this.cm.getTotalWidth() + this
								.getScrollOffset())
								+ "px"
					},
					getScrollOffset : function() {
						return Ext.num(this.scrollOffset, Ext
								.getScrollBarWidth())
					},
					renderHeaders : function() {
						var e = this.cm, g = this.templates, a = g.hcell, d = {}, h = e
								.getColumnCount(), k = h - 1, l = [], c, b;
						for (c = 0; c < h; c++) {
							if (c == 0) {
								b = "x-grid3-cell-first "
							} else {
								b = c == k ? "x-grid3-cell-last " : ""
							}
							d = {
								id :e.getColumnId(c),
								value :e.getColumnHeader(c) || "",
								style :this.getColumnStyle(c, true),
								css :b,
								tooltip :this.getColumnTooltip(c)
							};
							if (e.config[c].align == "right") {
								d.istyle = "padding-right: 16px;"
							} else {
								delete d.istyle
							}
							l[c] = a.apply(d)
						}
						return g.header.apply( {
							cells :l.join(""),
							tstyle :String.format("width: {0};", this
									.getTotalWidth())
						})
					},
					getColumnTooltip : function(a) {
						var b = this.cm.getColumnTooltip(a);
						if (b) {
							if (Ext.QuickTips.isEnabled()) {
								return 'ext:qtip="' + b + '"'
							} else {
								return 'title="' + b + '"'
							}
						}
						return ""
					},
					beforeUpdate : function() {
						this.grid.stopEditing(true)
					},
					updateHeaders : function() {
						this.innerHd.firstChild.innerHTML = this
								.renderHeaders();
						this.updateHeaderWidth(false)
					},
					updateHeaderWidth : function(c) {
						var b = this.innerHd.firstChild, a = this
								.getTotalWidth();
						b.style.width = this.getOffsetWidth();
						b.firstChild.style.width = a;
						if (c !== false) {
							this.mainBody.dom.style.width = a
						}
					},
					focusRow : function(a) {
						this.focusCell(a, 0, false)
					},
					focusCell : function(d, b, c) {
						this.syncFocusEl(this.ensureVisible(d, b, c));
						var a = this.focusEl;
						if (Ext.isGecko) {
							a.focus()
						} else {
							a.focus.defer(1, a)
						}
					},
					resolveCell : function(h, d, g) {
						if (!Ext.isNumber(h)) {
							h = h.rowIndex
						}
						if (!this.ds) {
							return null
						}
						if (h < 0 || h >= this.ds.getCount()) {
							return null
						}
						d = (d !== undefined ? d : 0);
						var c = this.getRow(h), b = this.cm, e = b
								.getColumnCount(), a;
						if (!(g === false && d === 0)) {
							while (d < e && b.isHidden(d)) {
								d++
							}
							a = this.getCell(h, d)
						}
						return {
							row :c,
							cell :a
						}
					},
					getResolvedXY : function(b) {
						if (!b) {
							return null
						}
						var a = b.cell, c = b.row;
						if (a) {
							return Ext.fly(a).getXY()
						} else {
							return [ this.el.getX(), Ext.fly(c).getY() ]
						}
					},
					syncFocusEl : function(d, a, c) {
						var b = d;
						if (!Ext.isArray(b)) {
							d = Math.min(d, Math.max(0,
									this.getRows().length - 1));
							if (isNaN(d)) {
								return
							}
							b = this.getResolvedXY(this.resolveCell(d, a, c))
						}
						this.focusEl.setXY(b || this.scroller.getXY())
					},
					ensureVisible : function(u, g, e) {
						var s = this.resolveCell(u, g, e);
						if (!s || !s.row) {
							return null
						}
						var l = s.row, h = s.cell, o = this.scroller.dom, d = l, t = 0, q = this.el.dom;
						while (d && d != q) {
							t += d.offsetTop;
							d = d.offsetParent
						}
						t -= this.mainHd.dom.offsetHeight;
						q = parseInt(o.scrollTop, 10);
						var r = t + l.offsetHeight, a = o.clientHeight, n = q
								+ a;
						if (t < q) {
							o.scrollTop = t
						} else {
							if (r > n) {
								o.scrollTop = r - a
							}
						}
						if (e !== false) {
							var m = parseInt(h.offsetLeft, 10), k = m
									+ h.offsetWidth, i = parseInt(o.scrollLeft,
									10), b = i + o.clientWidth;
							if (m < i) {
								o.scrollLeft = m
							} else {
								if (k > b) {
									o.scrollLeft = k - o.clientWidth
								}
							}
						}
						return this.getResolvedXY(s)
					},
					insertRows : function(a, i, e, h) {
						var d = a.getCount() - 1;
						if (!h && i === 0 && e >= d) {
							this.fireEvent("beforerowsinserted", this, i, e);
							this.refresh();
							this.fireEvent("rowsinserted", this, i, e)
						} else {
							if (!h) {
								this
										.fireEvent("beforerowsinserted", this,
												i, e)
							}
							var b = this.renderRows(i, e), g = this.getRow(i);
							if (g) {
								if (i === 0) {
									Ext.fly(this.getRow(0)).removeClass(
											this.firstRowCls)
								}
								Ext.DomHelper.insertHtml("beforeBegin", g, b)
							} else {
								var c = this.getRow(d - 1);
								if (c) {
									Ext.fly(c).removeClass(this.lastRowCls)
								}
								Ext.DomHelper.insertHtml("beforeEnd",
										this.mainBody.dom, b)
							}
							if (!h) {
								this.processRows(i);
								this.fireEvent("rowsinserted", this, i, e)
							} else {
								if (i === 0 || i >= d) {
									Ext.fly(this.getRow(i)).addClass(
											i === 0 ? this.firstRowCls
													: this.lastRowCls)
								}
							}
						}
						this.syncFocusEl(i)
					},
					deleteRows : function(a, c, b) {
						if (a.getRowCount() < 1) {
							this.refresh()
						} else {
							this.fireEvent("beforerowsdeleted", this, c, b);
							this.removeRows(c, b);
							this.processRows(c);
							this.fireEvent("rowsdeleted", this, c, b)
						}
					},
					getColumnStyle : function(b, d) {
						var a = this.cm, g = a.config, c = d ? "" : g[b].css
								|| "", e = g[b].align;
						c += String.format("width: {0};", this
								.getColumnWidth(b));
						if (a.isHidden(b)) {
							c += "display: none; "
						}
						if (e) {
							c += String.format("text-align: {0};", e)
						}
						return c
					},
					getColumnWidth : function(b) {
						var c = this.cm.getColumnWidth(b), a = this.borderWidth;
						if (Ext.isNumber(c)) {
							if (Ext.isBorderBox
									|| (Ext.isWebKit && !Ext.isSafari2)) {
								return c + "px"
							} else {
								return Math.max(c - a, 0) + "px"
							}
						} else {
							return c
						}
					},
					getTotalWidth : function() {
						return this.cm.getTotalWidth() + "px"
					},
					fitColumns : function(g, k, h) {
						var a = this.grid, m = this.cm, t = m
								.getTotalWidth(false), r = this
								.getGridInnerWidth(), s = r - t, c = [], p = 0, o = 0, v, d, q;
						if (r < 20 || s === 0) {
							return false
						}
						var e = m.getColumnCount(true), n = m
								.getColumnCount(false), b = e
								- (Ext.isNumber(h) ? 1 : 0);
						if (b === 0) {
							b = 1;
							h = undefined
						}
						for (q = 0; q < n; q++) {
							if (!m.isFixed(q) && q !== h) {
								v = m.getColumnWidth(q);
								c.push(q, v);
								if (!m.isHidden(q)) {
									p = q;
									o += v
								}
							}
						}
						d = (r - m.getTotalWidth()) / o;
						while (c.length) {
							v = c.pop();
							q = c.pop();
							m.setColumnWidth(q, Math.max(a.minColumnWidth, Math
									.floor(v + v * d)), true)
						}
						t = m.getTotalWidth(false);
						if (t > r) {
							var u = (b == e) ? p : h, l = Math.max(1, m
									.getColumnWidth(u)
									- (t - r));
							m.setColumnWidth(u, l, true)
						}
						if (g !== true) {
							this.updateAllColumnWidths()
						}
						return true
					},
					autoExpand : function(l) {
						var a = this.grid, i = this.cm, e = this
								.getGridInnerWidth(), c = i
								.getTotalWidth(false), g = a.autoExpandColumn;
						if (!this.userResized && g) {
							if (e != c) {
								var k = i.getIndexById(g), b = i
										.getColumnWidth(k), h = e - c + b, d = Math
										.min(Math.max(h, a.autoExpandMin),
												a.autoExpandMax);
								if (b != d) {
									i.setColumnWidth(k, d, true);
									if (l !== true) {
										this.updateColumnWidth(k, d)
									}
								}
							}
						}
					},
					getGridInnerWidth : function() {
						return this.grid.getGridEl().getWidth(true)
								- this.getScrollOffset()
					},
					getColumnData : function() {
						var e = [], c = this.cm, g = c.getColumnCount(), a = this.ds.fields, d, b;
						for (d = 0; d < g; d++) {
							b = c.getDataIndex(d);
							e[d] = {
								name :Ext.isDefined(b) ? b : (a.get(d) ? a
										.get(d).name : undefined),
								renderer :c.getRenderer(d),
								scope :c.getRendererScope(d),
								id :c.getColumnId(d),
								style :this.getColumnStyle(d)
							}
						}
						return e
					},
					renderRows : function(i, c) {
						var a = this.grid, g = a.store, k = a.stripeRows, e = a.colModel, h = e
								.getColumnCount(), d = g.getCount(), b;
						if (d < 1) {
							return ""
						}
						i = i || 0;
						c = Ext.isDefined(c) ? c : d - 1;
						b = g.getRange(i, c);
						return this.doRender(this.getColumnData(), b, g, i, h,
								k)
					},
					renderBody : function() {
						var a = this.renderRows() || "&#160;";
						return this.templates.body.apply( {
							rows :a
						})
					},
					refreshRow : function(g) {
						var m = this.ds, n = this.cm.getColumnCount(), c = this
								.getColumnData(), o = n - 1, q = [ "x-grid3-row" ], e = {
							tstyle :String.format("width: {0};", this
									.getTotalWidth())
						}, a = [], l = this.templates.cell, k, r, b, p, h, d;
						if (Ext.isNumber(g)) {
							k = g;
							g = m.getAt(k)
						} else {
							k = m.indexOf(g)
						}
						if (!g || k < 0) {
							return
						}
						for (d = 0; d < n; d++) {
							b = c[d];
							if (d == 0) {
								h = "x-grid3-cell-first"
							} else {
								h = (d == o) ? "x-grid3-cell-last " : ""
							}
							p = {
								id :b.id,
								style :b.style,
								css :h,
								attr :"",
								cellAttr :""
							};
							p.value = b.renderer.call(b.scope, g.data[b.name],
									p, g, k, d, m);
							if (Ext.isEmpty(p.value)) {
								p.value = "&#160;"
							}
							if (this.markDirty && g.dirty
									&& typeof g.modified[b.name] != "undefined") {
								p.css += " x-grid3-dirty-cell"
							}
							a[d] = l.apply(p)
						}
						r = this.getRow(k);
						r.className = "";
						if (this.grid.stripeRows && ((k + 1) % 2 === 0)) {
							q.push("x-grid3-row-alt")
						}
						if (this.getRowClass) {
							e.cols = n;
							q.push(this.getRowClass(g, k, e, m))
						}
						this.fly(r).addClass(q).setStyle(e.tstyle);
						e.cells = a.join("");
						r.innerHTML = this.templates.rowInner.apply(e);
						this.fireEvent("rowupdated", this, k, g)
					},
					refresh : function(b) {
						this.fireEvent("beforerefresh", this);
						this.grid.stopEditing(true);
						var a = this.renderBody();
						this.mainBody.update(a).setWidth(this.getTotalWidth());
						if (b === 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 b = this.ds.getSortState();
						if (!b) {
							return
						}
						if (!this.sortState
								|| (this.sortState.field != b.field || this.sortState.direction != b.direction)) {
							this.grid.fireEvent("sortchange", this.grid, b)
						}
						this.sortState = b;
						var c = this.cm.findColumnIndex(b.field);
						if (c != -1) {
							var a = b.direction;
							this.updateSortIcon(c, a)
						}
					},
					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 k = this, a = k.grid, d = a.getGridEl(), i = k.dragZone, g = k.splitZone, h = k.columnDrag, e = k.columnDrop, l = k.scrollToTopTask, c, b;
						if (l && l.cancel) {
							l.cancel()
						}
						Ext.destroyMembers(k, "colMenu", "hmenu");
						k.initData(null, null);
						k.purgeListeners();
						Ext.fly(k.innerHd).un("click", k.handleHdDown, k);
						if (a.enableColumnMove) {
							c = h.dragData;
							b = h.proxy;
							Ext.destroy(h.el, b.ghost, b.el, e.el, e.proxyTop,
									e.proxyBottom, c.ddel, c.header);
							if (b.anim) {
								Ext.destroy(b.anim)
							}
							delete b.ghost;
							delete c.ddel;
							delete c.header;
							h.destroy();
							delete Ext.dd.DDM.locationCache[h.id];
							delete h._domRef;
							delete e.proxyTop;
							delete e.proxyBottom;
							e.destroy();
							delete Ext.dd.DDM.locationCache["gridHeader" + d.id];
							delete e._domRef;
							delete Ext.dd.DDM.ids[e.ddGroup]
						}
						if (g) {
							g.destroy();
							delete g._domRef;
							delete Ext.dd.DDM.ids["gridSplitters" + d.id]
						}
						Ext.fly(k.innerHd).removeAllListeners();
						Ext.removeNode(k.innerHd);
						delete k.innerHd;
						Ext.destroy(k.el, k.mainWrap, k.mainHd, k.scroller,
								k.mainBody, k.focusEl, k.resizeMarker,
								k.resizeProxy, k.activeHdBtn, k._flyweight, i,
								g);
						delete a.container;
						if (i) {
							i.destroy()
						}
						Ext.dd.DDM.currentTarget = null;
						delete Ext.dd.DDM.locationCache[d.id];
						Ext.EventManager.removeResizeListener(k.onWindowResize,
								k)
					},
					onDenyColumnHide : function() {
					},
					render : function() {
						if (this.autoFill) {
							var a = this.grid.ownerCt;
							if (a && a.getLayout()) {
								a.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(a, e) {
						var b = this;
						if (b.ds) {
							var d = b.ds;
							d.un("add", b.onAdd, b);
							d.un("load", b.onLoad, b);
							d.un("clear", b.onClear, b);
							d.un("remove", b.onRemove, b);
							d.un("update", b.onUpdate, b);
							d.un("datachanged", b.onDataChange, b);
							if (d !== a && d.autoDestroy) {
								d.destroy()
							}
						}
						if (a) {
							a.on( {
								scope :b,
								load :b.onLoad,
								add :b.onAdd,
								remove :b.onRemove,
								update :b.onUpdate,
								clear :b.onClear,
								datachanged :b.onDataChange
							})
						}
						if (b.cm) {
							var c = b.cm;
							c.un("configchange", b.onColConfigChange, b);
							c.un("widthchange", b.onColWidthChange, b);
							c.un("headerchange", b.onHeaderChange, b);
							c.un("hiddenchange", b.onHiddenChange, b);
							c.un("columnmoved", b.onColumnMove, b)
						}
						if (e) {
							delete b.lastViewWidth;
							e.on( {
								scope :b,
								configchange :b.onColConfigChange,
								widthchange :b.onColWidthChange,
								headerchange :b.onHeaderChange,
								hiddenchange :b.onHiddenChange,
								columnmoved :b.onColumnMove
							})
						}
						b.ds = a;
						b.cm = e
					},
					onDataChange : function() {
						this.refresh(true);
						this.updateHeaderSortState();
						this.syncFocusEl(0)
					},
					onClear : function() {
						this.refresh();
						this.syncFocusEl(0)
					},
					onUpdate : function(b, a) {
						this.refreshRow(a)
					},
					onAdd : function(b, a, c) {
						this.insertRows(b, c, c + (a.length - 1))
					},
					onRemove : function(b, a, c, d) {
						if (d !== true) {
							this.fireEvent("beforerowremoved", this, c, a)
						}
						this.removeRow(c);
						if (d !== true) {
							this.processRows(c);
							this.applyEmptyText();
							this.fireEvent("rowremoved", this, c, a)
						}
					},
					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(a, b, c) {
						this.updateColumnWidth(b, c)
					},
					onHeaderChange : function(a, b, c) {
						this.updateHeaders()
					},
					onHiddenChange : function(a, b, c) {
						this.updateColumnHidden(b, c)
					},
					onColumnMove : function(a, c, b) {
						this.indexMap = null;
						this.refresh(true);
						this.restoreScroll(this.getScrollState());
						this.afterMove(b);
						this.grid.fireEvent("columnmove", c, b)
					},
					onColConfigChange : function() {
						delete this.lastViewWidth;
						this.indexMap = null;
						this.refresh(true)
					},
					initUI : function(a) {
						a.on("headerclick", this.onHeaderClick, this)
					},
					initEvents :Ext.emptyFn,
					onHeaderClick : function(b, a) {
						if (this.headersDisabled || !this.cm.isSortable(a)) {
							return
						}
						b.stopEditing(true);
						b.store.sort(this.cm.getDataIndex(a))
					},
					onRowOver : function(b, a) {
						var c = this.findRowIndex(a);
						if (c !== false) {
							this.addRowClass(c, this.rowOverCls)
						}
					},
					onRowOut : function(b, a) {
						var c = this.findRowIndex(a);
						if (c !== false && !b.within(this.getRow(c), true)) {
							this.removeRowClass(c, this.rowOverCls)
						}
					},
					onRowSelect : function(a) {
						this.addRowClass(a, this.selectedRowClass)
					},
					onRowDeselect : function(a) {
						this.removeRowClass(a, this.selectedRowClass)
					},
					onCellSelect : function(c, b) {
						var a = this.getCell(c, b);
						if (a) {
							this.fly(a).addClass("x-grid3-cell-selected")
						}
					},
					onCellDeselect : function(c, b) {
						var a = this.getCell(c, b);
						if (a) {
							this.fly(a).removeClass("x-grid3-cell-selected")
						}
					},
					handleWheel : function(a) {
						a.stopPropagation()
					},
					onColumnSplitterMoved : function(a, b) {
						this.userResized = true;
						this.grid.colModel.setColumnWidth(a, b, true);
						if (this.forceFit) {
							this.fitColumns(true, false, a);
							this.updateAllColumnWidths()
						} else {
							this.updateColumnWidth(a, b);
							this.syncHeaderScroll()
						}
						this.grid.fireEvent("columnresize", a, b)
					},
					beforeColMenuShow : function() {
						var b = this.cm, d = b.getColumnCount(), a = this.colMenu, c;
						a.removeAll();
						for (c = 0; c < d; c++) {
							if (b.config[c].hideable !== false) {
								a.add(new Ext.menu.CheckItem( {
									text :b.getColumnHeader(c),
									itemId :"col-" + b.getColumnId(c),
									checked :!b.isHidden(c),
									disabled :b.config[c].hideable === false,
									hideOnClick :false
								}))
							}
						}
					},
					handleHdMenuClick : function(c) {
						var a = this.ds, b = this.cm
								.getDataIndex(this.hdCtxIndex);
						switch (c.getItemId()) {
						case "asc":
							a.sort(b, "ASC");
							break;
						case "desc":
							a.sort(b, "DESC");
							break;
						default:
							this.handleHdMenuClickDefault(c)
						}
						return true
					},
					handleHdMenuClickDefault : function(c) {
						var b = this.cm, d = c.getItemId(), a = b
								.getIndexById(d.substr(4));
						if (a != -1) {
							if (c.checked
									&& b.getColumnsBy(this.isHideableColumn,
											this).length <= 1) {
								this.onDenyColumnHide();
								return
							}
							b.setHidden(a, c.checked)
						}
					},
					handleHdDown : function(i, k) {
						if (Ext.fly(k).hasClass("x-grid3-hd-btn")) {
							i.stopEvent();
							var l = this.cm, g = this.findHeaderCell(k), h = this
									.getCellIndex(g), d = l.isSortable(h), c = this.hmenu, b = c.items, a = this.headerMenuOpenCls;
							this.hdCtxIndex = h;
							Ext.fly(g).addClass(a);
							b.get("asc").setDisabled(!d);
							b.get("desc").setDisabled(!d);
							c.on("hide", function() {
								Ext.fly(g).removeClass(a)
							}, this, {
								single :true
							});
							c.show(k, "tl-bl?")
						}
					},
					handleHdMove : function(l) {
						var i = this.findHeaderCell(this.activeHdRef);
						if (i && !this.headersDisabled) {
							var m = this.splitHandleWidth || 5, k = this.activeHdRegion, q = i.style, n = this.cm, p = "", g = l
									.getPageX();
							if (this.grid.enableColumnResize !== false) {
								var a = this.activeHdIndex, b = this
										.getPreviousVisible(a), o = n
										.isResizable(a), c = b
										&& n.isResizable(b), d = g - k.left <= m, h = k.right
										- g <= (!this.activeHdBtn ? m : 2);
								if (d && c) {
									p = Ext.isAir ? "move"
											: Ext.isWebKit ? "e-resize"
													: "col-resize"
								} else {
									if (h && o) {
										p = Ext.isAir ? "move"
												: Ext.isWebKit ? "w-resize"
														: "col-resize"
									}
								}
							}
							q.cursor = p
						}
					},
					getPreviousVisible : function(a) {
						while (a > 0) {
							if (!this.cm.isHidden(a - 1)) {
								return a
							}
							a--
						}
						return undefined
					},
					handleHdOver : function(c, b) {
						var d = this.findHeaderCell(b);
						if (d && !this.headersDisabled) {
							var a = this.fly(d);
							this.activeHdRef = b;
							this.activeHdIndex = this.getCellIndex(d);
							this.activeHdRegion = a.getRegion();
							if (!this.isMenuDisabled(this.activeHdIndex, a)) {
								a.addClass("x-grid3-hd-over");
								this.activeHdBtn = a.child(".x-grid3-hd-btn");
								if (this.activeHdBtn) {
									this.activeHdBtn.dom.style.height = (d.firstChild.offsetHeight - 1)
											+ "px"
								}
							}
						}
					},
					handleHdOut : function(b, a) {
						var c = this.findHeaderCell(a);
						if (c && (!Ext.isIE || !b.within(c, true))) {
							this.activeHdRef = null;
							this.fly(c).removeClass("x-grid3-hd-over");
							c.style.cursor = ""
						}
					},
					isMenuDisabled : function(a, b) {
						return this.cm.isMenuDisabled(a)
					},
					hasRows : function() {
						var a = this.mainBody.dom.firstChild;
						return a && a.nodeType == 1
								&& a.className != "x-grid-empty"
					},
					isHideableColumn : function(a) {
						return !a.hidden
					},
					bind : function(a, b) {
						this.initData(a, b)
					}
				});
Ext.grid.GridView.SplitDragZone = Ext
		.extend(
				Ext.dd.DDProxy,
				{
					constructor : function(a, b) {
						this.grid = a;
						this.view = a.getView();
						this.marker = this.view.resizeMarker;
						this.proxy = this.view.resizeProxy;
						Ext.grid.GridView.SplitDragZone.superclass.constructor
								.call(this, b, "gridSplitters"
										+ this.grid.getGridEl().id, {
									dragElId :Ext.id(this.proxy.dom),
									resizeFrame :false
								});
						this.scroll = false;
						this.hw = this.view.splitHandleWidth || 5
					},
					b4StartDrag : function(a, e) {
						this.dragHeadersDisabled = this.view.headersDisabled;
						this.view.headersDisabled = true;
						var d = this.view.mainWrap.getHeight();
						this.marker.setHeight(d);
						this.marker.show();
						this.marker.alignTo(this.view
								.getHeaderCell(this.cellIndex), "tl-tl", [ -2,
								0 ]);
						this.proxy.setHeight(d);
						var b = this.cm.getColumnWidth(this.cellIndex), c = Math
								.max(b - this.grid.minColumnWidth, 0);
						this.resetConstraints();
						this.setXConstraint(c, 1000);
						this.setYConstraint(0, 0);
						this.minX = a - c;
						this.maxX = a + 1000;
						this.startPos = a;
						Ext.dd.DDProxy.prototype.b4StartDrag.call(this, a, e)
					},
					allowHeaderDrag : function(a) {
						return true
					},
					handleMouseDown : function(a) {
						var h = this.view.findHeaderCell(a.getTarget());
						if (h && this.allowHeaderDrag(a)) {
							var l = this.view.fly(h).getXY(), c = l[0], i = a
									.getXY(), b = i[0], g = h.offsetWidth, d = false;
							if ((b - c) <= this.hw) {
								d = -1
							} else {
								if ((c + g) - b <= this.hw) {
									d = 0
								}
							}
							if (d !== false) {
								this.cm = this.grid.colModel;
								var k = this.view.getCellIndex(h);
								if (d == -1) {
									if (k + d < 0) {
										return
									}
									while (this.cm.isHidden(k + d)) {
										--d;
										if (k + d < 0) {
											return
										}
									}
								}
								this.cellIndex = k + d;
								this.split = h.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(a)
								}
							}
						}
					},
					endDrag : function(g) {
						this.marker.hide();
						var a = this.view, c = Math
								.max(this.minX, g.getPageX()), d = c
								- this.startPos, b = this.dragHeadersDisabled;
						a.onColumnSplitterMoved(this.cellIndex, this.cm
								.getColumnWidth(this.cellIndex)
								+ d);
						setTimeout( function() {
							a.headersDisabled = b
						}, 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(a, r) {
						var b = this.grid, n = b.extractData(), o = n.length, e = this.templates, q = b.renderer, h = typeof q == "function", t = this.getCellCls, m = typeof t == "function", d = e.cell, u = e.row, k = [], p = {}, c = "width:"
								+ this.getGridInnerWidth() + "px;", l, g, s;
						a = a || 0;
						r = Ext.isDefined(r) ? r : o - 1;
						for (s = 0; s < o; s++) {
							row = n[s];
							colCount = row.length;
							l = [];
							rowIndex = a + s;
							for (j = 0; j < colCount; j++) {
								cell = row[j];
								p.css = j === 0 ? "x-grid3-cell-first "
										: (j == (colCount - 1) ? "x-grid3-cell-last "
												: "");
								p.attr = p.cellAttr = "";
								p.value = cell;
								if (Ext.isEmpty(p.value)) {
									p.value = "&#160;"
								}
								if (h) {
									p.value = q(p.value)
								}
								if (m) {
									p.css += t(p.value) + " "
								}
								l[l.length] = d.apply(p)
							}
							k[k.length] = u.apply( {
								tstyle :c,
								cols :colCount,
								cells :l.join(""),
								alt :""
							})
						}
						return k.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 a = this.templates || {};
						if (!a.gcell) {
							a.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 = a;
						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 a = Ext.grid.PivotGridView.superclass.getGridInnerWidth
								.apply(this, arguments);
						return a - this.getTotalRowHeaderWidth()
					},
					getTotalRowHeaderWidth : function() {
						var d = this.getRowHeaders(), c = d.length, b = 0, a;
						for (a = 0; a < c; a++) {
							b += d[a].width
						}
						return b
					},
					getTotalColumnHeaderHeight : function() {
						return this.getColumnHeaders().length * 21
					},
					renderUI : function() {
						var b = this.templates, a = this.getGridInnerWidth();
						return b.master.apply( {
							body :b.body.apply( {
								rows :"&#160;"
							}),
							ostyle :"width:" + a + "px",
							bstyle :"width:" + a + "px"
						})
					},
					onLayout : function(b, a) {
						Ext.grid.PivotGridView.superclass.onLayout.apply(this,
								arguments);
						var b = this.getGridInnerWidth();
						this.resizeColumnHeaders(b);
						this.resizeAllRows(b)
					},
					refresh : function(b) {
						this.fireEvent("beforerefresh", this);
						this.grid.stopEditing(true);
						var a = this.renderBody();
						this.mainBody.update(a).setWidth(
								this.getGridInnerWidth());
						if (b === 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(b) {
						var a = this.grid.topAxis;
						if (a.rendered) {
							a.el.setWidth(b)
						}
					},
					resizeRowHeaders : function() {
						var a = this.getTotalRowHeaderWidth(), b = String
								.format("margin-left: {0}px;", a);
						this.rowHeadersEl.setWidth(a);
						this.mainBody.applyStyles(b);
						Ext.fly(this.innerHd).applyStyles(b);
						this.headerTitleEl.setWidth(a);
						this.headerTitleEl.setHeight(this
								.getTotalColumnHeaderHeight())
					},
					resizeAllRows : function(b) {
						var d = this.getRows(), c = d.length, a;
						for (a = 0; a < c; a++) {
							Ext.fly(d[a]).setWidth(b);
							Ext.fly(d[a]).child("table").setWidth(b)
						}
					},
					updateHeaders : function() {
						this.renderGroupRowHeaders();
						this.renderGroupColumnHeaders()
					},
					renderGroupRowHeaders : function() {
						var a = this.grid.leftAxis;
						this.resizeRowHeaders();
						a.rendered = false;
						a.render(this.rowHeadersEl);
						this.setTitle(this.title)
					},
					setTitle : function(a) {
						this.headerTitleEl.child("span").dom.innerHTML = a
					},
					renderGroupColumnHeaders : function() {
						var a = this.grid.topAxis;
						a.rendered = false;
						a.render(this.innerHd.firstChild)
					},
					isMenuDisabled : function(a, b) {
						return true
					}
				});
Ext.grid.PivotAxis = Ext
		.extend(
				Ext.Component,
				{
					orientation :"horizontal",
					defaultHeaderWidth :80,
					paddingWidth :7,
					setDimensions : function(a) {
						this.dimensions = a
					},
					onRender : function(b, a) {
						var c = this.orientation == "horizontal" ? this
								.renderHorizontalRows() : this
								.renderVerticalRows();
						this.el = Ext.DomHelper.overwrite(b.dom, {
							tag :"table",
							cn :c
						}, true)
					},
					renderHorizontalRows : function() {
						var k = this.buildHeaders(), a = k.length, g = [], c, h, e, d, b;
						for (d = 0; d < a; d++) {
							c = [];
							h = k[d].items;
							e = h.length;
							for (b = 0; b < e; b++) {
								c.push( {
									tag :"td",
									html :h[b].header,
									colspan :h[b].span
								})
							}
							g[d] = {
								tag :"tr",
								cn :c
							}
						}
						return g
					},
					renderVerticalRows : function() {
						var b = this.buildHeaders(), k = b.length, a = [], m = [], h, c, l, g, e, d;
						for (e = 0; e < k; e++) {
							c = b[e];
							g = c.width || 80;
							h = c.items.length;
							for (d = 0; d < h; d++) {
								l = c.items[d];
								a[l.start] = a[l.start] || [];
								a[l.start].push( {
									tag :"td",
									html :l.header,
									rowspan :l.span,
									width :Ext.isBorderBox ? g : g
											- this.paddingWidth
								})
							}
						}
						h = a.length;
						for (e = 0; e < h; e++) {
							m[e] = {
								tag :"tr",
								cn :a[e]
							}
						}
						return m
					},
					getTuples : function() {
						var b = new Ext.data.Store( {});
						b.data = this.store.data.clone();
						b.fields = this.store.fields;
						var m = [], a = this.dimensions, c = a.length, k;
						for (k = 0; k < c; k++) {
							m.push( {
								field :a[k].dataIndex,
								direction :a[k].direction || "ASC"
							})
						}
						b.sort(m);
						var e = b.data.items, o = [], l = [], p, h, d, g, n;
						c = e.length;
						for (k = 0; k < c; k++) {
							d = this.getRecordInfo(e[k]);
							g = d.data;
							h = "";
							for (n in g) {
								h += g[n] + "---"
							}
							if (o.indexOf(h) == -1) {
								o.push(h);
								l.push(d)
							}
						}
						b.destroy();
						return l
					},
					getRecordInfo : function(a) {
						var e = this.dimensions, d = e.length, h = {}, k, c, b;
						for (b = 0; b < d; b++) {
							k = e[b];
							c = k.dataIndex;
							h[c] = a.get(c)
						}
						var g = function(i) {
							return function(l) {
								for ( var m in i) {
									if (l.get(m) != i[m]) {
										return false
									}
								}
								return true
							}
						};
						return {
							data :h,
							matcher :g(h)
						}
					},
					buildHeaders : function() {
						var k = this.getTuples(), l = k.length, a = this.dimensions, q = a.length, c = [], n, r, m, p, o, b, h, g, e, d;
						for (e = 0; e < q; e++) {
							dimension = a[e];
							r = [];
							o = 0;
							b = 0;
							for (d = 0; d < l; d++) {
								n = k[d];
								h = d == (l - 1);
								m = n.data[dimension.dataIndex];
								g = p != undefined && p != m;
								if (e > 0 && d > 0) {
									g = g
											|| n.data[a[e - 1].dataIndex] != k[d - 1].data[a[e - 1].dataIndex]
								}
								if (g) {
									r.push( {
										header :p,
										span :o,
										start :b
									});
									b += o;
									o = 0
								}
								if (h) {
									r.push( {
										header :m,
										span :o + 1,
										start :b
									});
									b += o;
									o = 0
								}
								p = m;
								o++
							}
							c.push( {
								items :r,
								width :dimension.width
										|| this.defaultHeaderWidth
							});
							p = undefined
						}
						return c
					}
				});
Ext.grid.HeaderDragZone = Ext.extend(Ext.dd.DragZone, {
	maxDragWidth :120,
	constructor : function(a, c, b) {
		this.grid = a;
		this.view = a.getView();
		this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
		Ext.grid.HeaderDragZone.superclass.constructor.call(this, c);
		if (b) {
			this.setHandleElId(Ext.id(c));
			this.setOuterHandleElId(Ext.id(b))
		}
		this.scroll = false
	},
	getDragData : function(c) {
		var a = Ext.lib.Event.getTarget(c), b = this.view.findHeaderCell(a);
		if (b) {
			return {
				ddel :b.firstChild,
				header :b
			}
		}
		return false
	},
	onInitDrag : function(a) {
		this.dragHeadersDisabled = this.view.headersDisabled;
		this.view.headersDisabled = true;
		var b = this.dragData.ddel.cloneNode(true);
		b.id = Ext.id();
		b.style.width = Math.min(this.dragData.header.offsetWidth,
				this.maxDragWidth)
				+ "px";
		this.proxy.update(b);
		return true
	},
	afterValidDrop : function() {
		this.completeDrop()
	},
	afterInvalidDrop : function() {
		this.completeDrop()
	},
	completeDrop : function() {
		var a = this.view, b = this.dragHeadersDisabled;
		setTimeout( function() {
			a.headersDisabled = b
		}, 50)
	}
});
Ext.grid.HeaderDropZone = Ext
		.extend(
				Ext.dd.DropZone,
				{
					proxyOffsets : [ -4, -9 ],
					fly :Ext.Element.fly,
					constructor : function(a, c, b) {
						this.grid = a;
						this.view = a.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, a.getGridEl().dom)
					},
					getTargetFromEvent : function(c) {
						var a = Ext.lib.Event.getTarget(c), b = this.view
								.findCellIndex(a);
						if (b !== false) {
							return this.view.getHeaderCell(b)
						}
					},
					nextVisible : function(c) {
						var b = this.view, a = this.grid.colModel;
						c = c.nextSibling;
						while (c) {
							if (!a.isHidden(b.getCellIndex(c))) {
								return c
							}
							c = c.nextSibling
						}
						return null
					},
					prevVisible : function(c) {
						var b = this.view, a = this.grid.colModel;
						c = c.prevSibling;
						while (c) {
							if (!a.isHidden(b.getCellIndex(c))) {
								return c
							}
							c = c.prevSibling
						}
						return null
					},
					positionIndicator : function(d, l, k) {
						var a = Ext.lib.Event.getPageX(k), g = Ext.lib.Dom
								.getRegion(l.firstChild), c, i, b = g.top
								+ this.proxyOffsets[1];
						if ((g.right - a) <= (g.right - g.left) / 2) {
							c = g.right + this.view.borderWidth;
							i = "after"
						} else {
							c = g.left;
							i = "before"
						}
						if (this.grid.colModel.isFixed(this.view
								.getCellIndex(l))) {
							return false
						}
						c += this.proxyOffsets[0];
						this.proxyTop.setLeftTop(c, b);
						this.proxyTop.show();
						if (!this.bottomOffset) {
							this.bottomOffset = this.view.mainHd.getHeight()
						}
						this.proxyBottom.setLeftTop(c, b
								+ this.proxyTop.dom.offsetHeight
								+ this.bottomOffset);
						this.proxyBottom.show();
						return i
					},
					onNodeEnter : function(d, a, c, b) {
						if (b.header != d) {
							this.positionIndicator(b.header, d, c)
						}
					},
					onNodeOver : function(g, b, d, c) {
						var a = false;
						if (c.header != g) {
							a = this.positionIndicator(c.header, g, d)
						}
						if (!a) {
							this.proxyTop.hide();
							this.proxyBottom.hide()
						}
						return a ? this.dropAllowed : this.dropNotAllowed
					},
					onNodeOut : function(d, a, c, b) {
						this.proxyTop.hide();
						this.proxyBottom.hide()
					},
					onNodeDrop : function(b, o, g, c) {
						var d = c.header;
						if (d != b) {
							var l = this.grid.colModel, k = Ext.lib.Event
									.getPageX(g), a = Ext.lib.Dom
									.getRegion(b.firstChild), p = (a.right - k) <= ((a.right - a.left) / 2) ? "after"
									: "before", i = this.view.getCellIndex(d), m = this.view
									.getCellIndex(b);
							if (p == "after") {
								m++
							}
							if (i < m) {
								m--
							}
							l.moveColumn(i, m);
							return true
						}
						return false
					}
				});
Ext.grid.GridView.ColumnDragZone = Ext.extend(Ext.grid.HeaderDragZone, {
	constructor : function(a, b) {
		Ext.grid.GridView.ColumnDragZone.superclass.constructor.call(this, a,
				b, null);
		this.proxy.el.addClass("x-grid3-col-dd")
	},
	handleMouseDown : function(a) {
	},
	callHandleMouseDown : function(a) {
		Ext.grid.GridView.ColumnDragZone.superclass.handleMouseDown.call(this,
				a)
	}
});
Ext.grid.SplitDragZone = Ext.extend(Ext.dd.DDProxy, {
	fly :Ext.Element.fly,
	constructor : function(a, c, b) {
		this.grid = a;
		this.view = a.getView();
		this.proxy = this.view.resizeProxy;
		Ext.grid.SplitDragZone.superclass.constructor.call(this, c,
				"gridSplitters" + this.grid.getGridEl().id, {
					dragElId :Ext.id(this.proxy.dom),
					resizeFrame :false
				});
		this.setHandleElId(Ext.id(c));
		this.setOuterHandleElId(Ext.id(b));
		this.scroll = false
	},
	b4StartDrag : function(a, d) {
		this.view.headersDisabled = true;
		this.proxy.setHeight(this.view.mainWrap.getHeight());
		var b = this.cm.getColumnWidth(this.cellIndex);
		var c = Math.max(b - this.grid.minColumnWidth, 0);
		this.resetConstraints();
		this.setXConstraint(c, 1000);
		this.setYConstraint(0, 0);
		this.minX = a - c;
		this.maxX = a + 1000;
		this.startPos = a;
		Ext.dd.DDProxy.prototype.b4StartDrag.call(this, a, d)
	},
	handleMouseDown : function(c) {
		var b = Ext.EventObject.setEvent(c);
		var a = this.fly(b.getTarget());
		if (a.hasClass("x-grid-split")) {
			this.cellIndex = this.view.getCellIndex(a.dom);
			this.split = a.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(c) {
		this.view.headersDisabled = false;
		var a = Math.max(this.minX, Ext.lib.Event.getPageX(c));
		var b = a - this.startPos;
		this.view.onColumnSplitterMoved(this.cellIndex, this.cm
				.getColumnWidth(this.cellIndex)
				+ b)
	},
	autoOffset : function() {
		this.setDelta(0, 0)
	}
});
Ext.grid.GridDragZone = function(b, a) {
	this.view = b.getView();
	Ext.grid.GridDragZone.superclass.constructor.call(this,
			this.view.mainBody.dom, a);
	this.scroll = false;
	this.grid = b;
	this.ddel = document.createElement("div");
	this.ddel.className = "x-grid-dd-wrap"
};
Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, {
	ddGroup :"GridDD",
	getDragData : function(b) {
		var a = Ext.lib.Event.getTarget(b);
		var d = this.view.findRowIndex(a);
		if (d !== false) {
			var c = this.grid.selModel;
			if (!c.isSelected(d) || b.hasModifier()) {
				c.handleMouseDown(this.grid, d, b)
			}
			return {
				grid :this.grid,
				ddel :this.ddel,
				rowIndex :d,
				selections :c.getSelections()
			}
		}
		return false
	},
	onInitDrag : function(b) {
		var a = this.dragData;
		this.ddel.innerHTML = this.grid.getDragDropText();
		this.proxy.update(this.ddel)
	},
	afterRepair : function() {
		this.dragging = false
	},
	getRepairXY : function(b, a) {
		return false
	},
	onEndDrag : function(a, b) {
	},
	onValidDrop : function(a, b, c) {
		this.hideProxy()
	},
	beforeInvalidDrop : function(a, b) {
	}
});
Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, {
	defaultWidth :100,
	defaultSortable :false,
	constructor : function(a) {
		if (a.columns) {
			Ext.apply(this, a);
			this.setConfig(a.columns, true)
		} else {
			this.setConfig(a, true)
		}
		this.addEvents("widthchange", "headerchange", "hiddenchange",
				"columnmoved", "configchange");
		Ext.grid.ColumnModel.superclass.constructor.call(this)
	},
	getColumnId : function(a) {
		return this.config[a].id
	},
	getColumnAt : function(a) {
		return this.config[a]
	},
	setConfig : function(d, b) {
		var e, h, a;
		if (!b) {
			delete this.totalWidth;
			for (e = 0, a = this.config.length; e < a; e++) {
				h = this.config[e];
				if (h.setEditor) {
					h.setEditor(null)
				}
			}
		}
		this.defaults = Ext.apply( {
			width :this.defaultWidth,
			sortable :this.defaultSortable
		}, this.defaults);
		this.config = d;
		this.lookup = {};
		for (e = 0, a = d.length; e < a; e++) {
			h = Ext.applyIf(d[e], this.defaults);
			if (Ext.isEmpty(h.id)) {
				h.id = e
			}
			if (!h.isColumn) {
				var g = Ext.grid.Column.types[h.xtype || "gridcolumn"];
				h = new g(h);
				d[e] = h
			}
			this.lookup[h.id] = h
		}
		if (!b) {
			this.fireEvent("configchange", this)
		}
	},
	getColumnById : function(a) {
		return this.lookup[a]
	},
	getIndexById : function(c) {
		for ( var b = 0, a = this.config.length; b < a; b++) {
			if (this.config[b].id == c) {
				return b
			}
		}
		return -1
	},
	moveColumn : function(e, b) {
		var a = this.config, d = a[e];
		a.splice(e, 1);
		a.splice(b, 0, d);
		this.dataMap = null;
		this.fireEvent("columnmoved", this, e, b)
	},
	getColumnCount : function(b) {
		var d = this.config.length, e = 0, a;
		if (b === true) {
			for (a = 0; a < d; a++) {
				if (!this.isHidden(a)) {
					e++
				}
			}
			return e
		}
		return d
	},
	getColumnsBy : function(g, e) {
		var b = this.config, h = b.length, a = [], d, k;
		for (d = 0; d < h; d++) {
			k = b[d];
			if (g.call(e || this, k, d) === true) {
				a[a.length] = k
			}
		}
		return a
	},
	isSortable : function(a) {
		return !!this.config[a].sortable
	},
	isMenuDisabled : function(a) {
		return !!this.config[a].menuDisabled
	},
	getRenderer : function(a) {
		return this.config[a].renderer || Ext.grid.ColumnModel.defaultRenderer
	},
	getRendererScope : function(a) {
		return this.config[a].scope
	},
	setRenderer : function(a, b) {
		this.config[a].renderer = b
	},
	getColumnWidth : function(a) {
		var b = this.config[a].width;
		if (typeof b != "number") {
			b = this.defaultWidth
		}
		return b
	},
	setColumnWidth : function(b, c, a) {
		this.config[b].width = c;
		this.totalWidth = null;
		if (!a) {
			this.fireEvent("widthchange", this, b, c)
		}
	},
	getTotalWidth : function(b) {
		if (!this.totalWidth) {
			this.totalWidth = 0;
			for ( var c = 0, a = this.config.length; c < a; c++) {
				if (b || !this.isHidden(c)) {
					this.totalWidth += this.getColumnWidth(c)
				}
			}
		}
		return this.totalWidth
	},
	getColumnHeader : function(a) {
		return this.config[a].header
	},
	setColumnHeader : function(a, b) {
		this.config[a].header = b;
		this.fireEvent("headerchange", this, a, b)
	},
	getColumnTooltip : function(a) {
		return this.config[a].tooltip
	},
	setColumnTooltip : function(a, b) {
		this.config[a].tooltip = b
	},
	getDataIndex : function(a) {
		return this.config[a].dataIndex
	},
	setDataIndex : function(a, b) {
		this.config[a].dataIndex = b
	},
	findColumnIndex : function(d) {
		var e = this.config;
		for ( var b = 0, a = e.length; b < a; b++) {
			if (e[b].dataIndex == d) {
				return b
			}
		}
		return -1
	},
	isCellEditable : function(b, e) {
		var d = this.config[b], a = d.editable;
		return !!(a || (!Ext.isDefined(a) && d.editor))
	},
	getCellEditor : function(a, b) {
		return this.config[a].getCellEditor(b)
	},
	setEditable : function(a, b) {
		this.config[a].editable = b
	},
	isHidden : function(a) {
		return !!this.config[a].hidden
	},
	isFixed : function(a) {
		return !!this.config[a].fixed
	},
	isResizable : function(a) {
		return a >= 0 && this.config[a].resizable !== false
				&& this.config[a].fixed !== true
	},
	setHidden : function(a, b) {
		var d = this.config[a];
		if (d.hidden !== b) {
			d.hidden = b;
			this.totalWidth = null;
			this.fireEvent("hiddenchange", this, a, b)
		}
	},
	setEditor : function(a, b) {
		this.config[a].setEditor(b)
	},
	destroy : function() {
		var b = this.config.length, a = 0;
		for (; a < b; a++) {
			this.config[a].destroy()
		}
		delete this.config;
		delete this.lookup;
		this.purgeListeners()
	},
	setState : function(a, b) {
		b = Ext.applyIf(b, this.defaults);
		Ext.apply(this.config[a], b)
	}
});
Ext.grid.ColumnModel.defaultRenderer = function(a) {
	if (typeof a == "string" && a.length < 1) {
		return "&#160;"
	}
	return a
};
Ext.grid.AbstractSelectionModel = Ext.extend(Ext.util.Observable, {
	constructor : function() {
		this.locked = false;
		Ext.grid.AbstractSelectionModel.superclass.constructor.call(this)
	},
	init : function(a) {
		this.grid = a;
		if (this.lockOnInit) {
			delete this.lockOnInit;
			this.locked = false;
			this.lock()
		}
		this.initEvents()
	},
	lock : function() {
		if (!this.locked) {
			this.locked = true;
			var a = this.grid;
			if (a) {
				a.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 a = this.grid, b;
			if (a) {
				b = a.getView();
				b.un("beforerefresh", this.sortUnLock, this);
				b.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(a) {
						Ext.apply(this, a);
						this.selections = new Ext.util.MixedCollection(false,
								function(b) {
									return b.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(g, b) {
						var a = b == "up", h = a ? "selectPrevious"
								: "selectNext", d = a ? -1 : 1, c;
						if (!g.shiftKey || this.singleSelect) {
							this[h](false)
						} else {
							if (this.last !== false
									&& this.lastActive !== false) {
								c = this.last;
								this
										.selectRange(this.last, this.lastActive
												+ d);
								this.grid.getView().focusRow(this.lastActive);
								if (c !== false) {
									this.last = c
								}
							} else {
								this.selectFirstRow()
							}
						}
					},
					onRefresh : function() {
						var g = this.grid.store, d = this.getSelections(), c = 0, a = d.length, b, e;
						this.silent = true;
						this.clearSelections(true);
						for (; c < a; c++) {
							e = d[c];
							if ((b = g.indexOfId(e.id)) != -1) {
								this.selectRow(b, true)
							}
						}
						if (d.length != this.selections.getCount()) {
							this.fireEvent("selectionchange", this)
						}
						this.silent = false
					},
					onRemove : function(a, b, c) {
						if (this.selections.remove(c) !== false) {
							this.fireEvent("selectionchange", this)
						}
					},
					onRowUpdated : function(a, b, c) {
						if (this.isSelected(c)) {
							a.onRowSelect(b)
						}
					},
					selectRecords : function(b, e) {
						if (!e) {
							this.clearSelections()
						}
						var d = this.grid.store, c = 0, a = b.length;
						for (; c < a; c++) {
							this.selectRow(d.indexOf(b[c]), true)
						}
					},
					getCount : function() {
						return this.selections.length
					},
					selectFirstRow : function() {
						this.selectRow(0)
					},
					selectLastRow : function(a) {
						this.selectRow(this.grid.store.getCount() - 1, a)
					},
					selectNext : function(a) {
						if (this.hasNext()) {
							this.selectRow(this.last + 1, a);
							this.grid.getView().focusRow(this.last);
							return true
						}
						return false
					},
					selectPrevious : function(a) {
						if (this.hasPrevious()) {
							this.selectRow(this.last - 1, a);
							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(e, d) {
						var c = this.getSelections(), b = 0, a = c.length;
						for (; b < a; b++) {
							if (e.call(d || this, c[b], b) === false) {
								return false
							}
						}
						return true
					},
					clearSelections : function(a) {
						if (this.isLocked()) {
							return
						}
						if (a !== true) {
							var c = this.grid.store, b = this.selections;
							b.each( function(d) {
								this.deselectRow(c.indexOfId(d.id))
							}, this);
							b.clear()
						} else {
							this.selections.clear()
						}
						this.last = false
					},
					selectAll : function() {
						if (this.isLocked()) {
							return
						}
						this.selections.clear();
						for ( var b = 0, a = this.grid.store.getCount(); b < a; b++) {
							this.selectRow(b, true)
						}
					},
					hasSelection : function() {
						return this.selections.length > 0
					},
					isSelected : function(a) {
						var b = Ext.isNumber(a) ? this.grid.store.getAt(a) : a;
						return (b && this.selections.key(b.id) ? true : false)
					},
					isIdSelected : function(a) {
						return (this.selections.key(a) ? true : false)
					},
					handleMouseDown : function(d, i, h) {
						if (h.button !== 0 || this.isLocked()) {
							return
						}
						var a = this.grid.getView();
						if (h.shiftKey && !this.singleSelect
								&& this.last !== false) {
							var c = this.last;
							this.selectRange(c, i, h.ctrlKey);
							this.last = c;
							a.focusRow(i)
						} else {
							var b = this.isSelected(i);
							if (h.ctrlKey && b) {
								this.deselectRow(i)
							} else {
								if (!b || this.getCount() > 1) {
									this.selectRow(i, h.ctrlKey || h.shiftKey);
									a.focusRow(i)
								}
							}
						}
					},
					selectRows : function(c, d) {
						if (!d) {
							this.clearSelections()
						}
						for ( var b = 0, a = c.length; b < a; b++) {
							this.selectRow(c[b], true)
						}
					},
					selectRange : function(b, a, d) {
						var c;
						if (this.isLocked()) {
							return
						}
						if (!d) {
							this.clearSelections()
						}
						if (b <= a) {
							for (c = b; c <= a; c++) {
								this.selectRow(c, true)
							}
						} else {
							for (c = b; c >= a; c--) {
								this.selectRow(c, true)
							}
						}
					},
					deselectRange : function(c, b, a) {
						if (this.isLocked()) {
							return
						}
						for ( var d = c; d <= b; d++) {
							this.deselectRow(d, a)
						}
					},
					selectRow : function(b, d, a) {
						if (this.isLocked()
								|| (b < 0 || b >= this.grid.store.getCount())
								|| (d && this.isSelected(b))) {
							return
						}
						var c = this.grid.store.getAt(b);
						if (c
								&& this.fireEvent("beforerowselect", this, b,
										d, c) !== false) {
							if (!d || this.singleSelect) {
								this.clearSelections()
							}
							this.selections.add(c);
							this.last = this.lastActive = b;
							if (!a) {
								this.grid.getView().onRowSelect(b)
							}
							if (!this.silent) {
								this.fireEvent("rowselect", this, b, c);
								this.fireEvent("selectionchange", this)
							}
						}
					},
					deselectRow : function(b, a) {
						if (this.isLocked()) {
							return
						}
						if (this.last == b) {
							this.last = false
						}
						if (this.lastActive == b) {
							this.lastActive = false
						}
						var c = this.grid.store.getAt(b);
						if (c) {
							this.selections.remove(c);
							if (!a) {
								this.grid.getView().onRowDeselect(b)
							}
							this.fireEvent("rowdeselect", this, b, c);
							this.fireEvent("selectionchange", this)
						}
					},
					acceptsNav : function(c, b, a) {
						return !a.isHidden(b) && a.isCellEditable(b, c)
					},
					onEditorKey : function(o, m) {
						var d = m.getKey(), h, i = this.grid, q = i.lastEdit, l = i.activeEditor, b = m.shiftKey, p, q, a, n;
						if (d == m.TAB) {
							m.stopEvent();
							l.completeEdit();
							if (b) {
								h = i.walkCells(l.row, l.col - 1, -1,
										this.acceptsNav, this)
							} else {
								h = i.walkCells(l.row, l.col + 1, 1,
										this.acceptsNav, this)
							}
						} else {
							if (d == m.ENTER) {
								if (this.moveEditorOnEnter !== false) {
									if (b) {
										h = i.walkCells(q.row - 1, q.col, -1,
												this.acceptsNav, this)
									} else {
										h = i.walkCells(q.row + 1, q.col, 1,
												this.acceptsNav, this)
									}
								}
							}
						}
						if (h) {
							a = h[0];
							n = h[1];
							this.onEditorSelect(a, q.row);
							if (i.isEditor && i.editing) {
								p = i.activeEditor;
								if (p && p.field.triggerBlur) {
									p.field.triggerBlur()
								}
							}
							i.startEditing(a, n)
						}
					},
					onEditorSelect : function(b, a) {
						if (a != b) {
							this.selectRow(b)
						}
					},
					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(b) {
		Ext.apply(this, b);
		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 a = this.editor;
		delete this.editor;
		this.setEditor(a);
		this.addEvents("click", "contextmenu", "dblclick", "mousedown");
		Ext.grid.Column.superclass.constructor.call(this)
	},
	processEvent : function(b, d, c, g, a) {
		return this.fireEvent(b, this, c, g, d)
	},
	destroy : function() {
		if (this.setEditor) {
			this.setEditor(null)
		}
		this.purgeListeners()
	},
	renderer : function(a) {
		return a
	},
	getEditor : function(a) {
		return this.editable !== false ? this.editor : null
	},
	setEditor : function(b) {
		var a = this.editor;
		if (a) {
			if (a.gridEditor) {
				a.gridEditor.destroy();
				delete a.gridEditor
			} else {
				a.destroy()
			}
		}
		this.editor = null;
		if (b) {
			if (!b.isXType) {
				b = Ext.create(b, "textfield")
			}
			this.editor = b
		}
	},
	getCellEditor : function(b) {
		var a = this.getEditor(b);
		if (a) {
			if (!a.startEdit) {
				if (!a.gridEditor) {
					a.gridEditor = new Ext.grid.GridEditor(a)
				}
				a = a.gridEditor
			}
		}
		return a
	}
});
Ext.grid.BooleanColumn = Ext.extend(Ext.grid.Column, {
	trueText :"true",
	falseText :"false",
	undefinedText :"&#160;",
	constructor : function(a) {
		Ext.grid.BooleanColumn.superclass.constructor.call(this, a);
		var c = this.trueText, d = this.falseText, b = this.undefinedText;
		this.renderer = function(e) {
			if (e === undefined) {
				return b
			}
			if (!e || e === "false") {
				return d
			}
			return c
		}
	}
});
Ext.grid.NumberColumn = Ext.extend(Ext.grid.Column, {
	format :"0,000.00",
	constructor : function(a) {
		Ext.grid.NumberColumn.superclass.constructor.call(this, a);
		this.renderer = Ext.util.Format.numberRenderer(this.format)
	}
});
Ext.grid.DateColumn = Ext.extend(Ext.grid.Column, {
	format :"m/d/Y",
	constructor : function(a) {
		Ext.grid.DateColumn.superclass.constructor.call(this, a);
		this.renderer = Ext.util.Format.dateRenderer(this.format)
	}
});
Ext.grid.TemplateColumn = Ext.extend(Ext.grid.Column, {
	constructor : function(a) {
		Ext.grid.TemplateColumn.superclass.constructor.call(this, a);
		var b = (!Ext.isPrimitive(this.tpl) && this.tpl.compile) ? this.tpl
				: new Ext.XTemplate(this.tpl);
		this.renderer = function(d, e, c) {
			return b.apply(c.data)
		};
		this.tpl = b
	}
});
Ext.grid.ActionColumn = Ext.extend(Ext.grid.Column, {
	header :"&#160;",
	actionIdRe :/x-action-col-(\d+)/,
	altText :"",
	constructor : function(b) {
		var g = this, c = b.items || (g.items = [ g ]), a = c.length, d, e;
		Ext.grid.ActionColumn.superclass.constructor.call(g, b);
		g.renderer = function(h, i) {
			h = Ext.isFunction(b.renderer) ? b.renderer.apply(this, arguments)
					|| "" : "";
			i.css += " x-action-col-cell";
			for (d = 0; d < a; d++) {
				e = c[d];
				h += '<img alt="'
						+ g.altText
						+ '" src="'
						+ (e.icon || Ext.BLANK_IMAGE_URL)
						+ '" class="x-action-col-icon x-action-col-'
						+ String(d)
						+ " "
						+ (e.iconCls || "")
						+ " "
						+ (Ext.isFunction(e.getClass) ? e.getClass.apply(
								e.scope || this.scope || this, arguments) : "")
						+ '"'
						+ ((e.tooltip) ? ' ext:qtip="' + e.tooltip + '"' : "")
						+ " />"
			}
			return h
		}
	},
	destroy : function() {
		delete this.items;
		delete this.renderer;
		return Ext.grid.ActionColumn.superclass.destroy.apply(this, arguments)
	},
	processEvent : function(c, i, d, k, b) {
		var a = i.getTarget().className.match(this.actionIdRe), h, g;
		if (a && (h = this.items[parseInt(a[1], 10)])) {
			if (c == "click") {
				(g = h.handler || this.handler)
						&& g.call(h.scope || this.scope || this, d, k, b, h, i)
			} else {
				if ((c == "mousedown") && (h.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(a) {
		Ext.apply(this, a);
		if (this.rowspan) {
			this.renderer = this.renderer.createDelegate(this)
		}
	},
	fixed :true,
	hideable :false,
	menuDisabled :true,
	dataIndex :"",
	id :"numberer",
	rowspan :undefined,
	renderer : function(b, c, a, d) {
		if (this.rowspan) {
			c.cellAttr = 'rowspan="' + this.rowspan + '"'
		}
		return d + 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(b, d, c, g, a) {
		if (b == "mousedown") {
			this.onMouseDown(d, d.getTarget());
			return false
		} else {
			return Ext.grid.Column.prototype.processEvent
					.apply(this, arguments)
		}
	},
	onMouseDown : function(c, b) {
		if (c.button === 0 && b.className == "x-grid3-row-checker") {
			c.stopEvent();
			var d = c.getTarget(".x-grid3-row");
			if (d) {
				var a = d.rowIndex;
				if (this.isSelected(a)) {
					this.deselectRow(a)
				} else {
					this.selectRow(a, true);
					this.grid.getView().focusRow(a)
				}
			}
		}
	},
	onHdMouseDown : function(c, a) {
		if (a.className == "x-grid3-hd-checker") {
			c.stopEvent();
			var b = Ext.fly(a.parentNode);
			var d = b.hasClass("x-grid3-hd-checker-on");
			if (d) {
				b.removeClass("x-grid3-hd-checker-on");
				this.clearSelections()
			} else {
				b.addClass("x-grid3-hd-checker-on");
				this.selectAll()
			}
		}
	},
	renderer : function(b, c, a) {
		return '<div class="x-grid3-row-checker">&#160;</div>'
	},
	onEditorSelect : function(b, a) {
		if (a != b && !this.checkOnly) {
			this.selectRow(b)
		}
	}
});
Ext.grid.CellSelectionModel = Ext
		.extend(
				Ext.grid.AbstractSelectionModel,
				{
					constructor : function(a) {
						Ext.apply(this, a);
						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(a) {
						this.select(a.row, a.column, false, true, a.record)
					},
					onRowUpdated : function(a, b, c) {
						if (this.selection && this.selection.record == c) {
							a.onCellSelect(b, this.selection.cell[1])
						}
					},
					onViewChange : function() {
						this.clearSelections(true)
					},
					getSelectedCell : function() {
						return this.selection ? this.selection.cell : null
					},
					clearSelections : function(b) {
						var a = this.selection;
						if (a) {
							if (b !== true) {
								this.grid.view.onCellDeselect(a.cell[0],
										a.cell[1])
							}
							this.selection = null;
							this.fireEvent("selectionchange", this, null)
						}
					},
					hasSelection : function() {
						return this.selection ? true : false
					},
					handleMouseDown : function(b, d, a, c) {
						if (c.button !== 0 || this.isLocked()) {
							return
						}
						this.select(d, a)
					},
					select : function(g, c, b, e, d) {
						if (this.fireEvent("beforecellselect", this, g, c) !== false) {
							this.clearSelections();
							d = d || this.grid.store.getAt(g);
							this.selection = {
								record :d,
								cell : [ g, c ]
							};
							if (!b) {
								var a = this.grid.getView();
								a.onCellSelect(g, c);
								if (e !== true) {
									a.focusCell(g, c)
								}
							}
							this.fireEvent("cellselect", this, g, c);
							this.fireEvent("selectionchange", this,
									this.selection)
						}
					},
					isSelectable : function(c, b, a) {
						return !a.isHidden(b)
					},
					onEditorKey : function(b, a) {
						if (a.getKey() == a.TAB) {
							this.handleKeyDown(a)
						}
					},
					handleKeyDown : function(l) {
						if (!l.isNavKeyPress()) {
							return
						}
						var d = l.getKey(), i = this.grid, q = this.selection, b = this, n = function(
								g, c, e) {
							return i.walkCells(g, c, e,
									i.isEditor && i.editing ? b.acceptsNav
											: b.isSelectable, b)
						}, p, h, a, m, o;
						switch (d) {
						case l.ESC:
						case l.PAGE_UP:
						case l.PAGE_DOWN:
							break;
						default:
							l.stopEvent();
							break
						}
						if (!q) {
							p = n(0, 0, 1);
							if (p) {
								this.select(p[0], p[1])
							}
							return
						}
						p = q.cell;
						a = p[0];
						m = p[1];
						switch (d) {
						case l.TAB:
							if (l.shiftKey) {
								h = n(a, m - 1, -1)
							} else {
								h = n(a, m + 1, 1)
							}
							break;
						case l.DOWN:
							h = n(a + 1, m, 1);
							break;
						case l.UP:
							h = n(a - 1, m, -1);
							break;
						case l.RIGHT:
							h = n(a, m + 1, 1);
							break;
						case l.LEFT:
							h = n(a, m - 1, -1);
							break;
						case l.ENTER:
							if (i.isEditor && !i.editing) {
								i.startEditing(a, m);
								return
							}
							break
						}
						if (h) {
							a = h[0];
							m = h[1];
							this.select(a, m);
							if (i.isEditor && i.editing) {
								o = i.activeEditor;
								if (o && o.field.triggerBlur) {
									o.field.triggerBlur()
								}
								i.startEditing(a, m)
							}
						}
					},
					acceptsNav : function(c, b, a) {
						return !a.isHidden(b) && a.isCellEditable(b, c)
					}
				});
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 a = this.getView();
							if (this.clicksToEdit == "auto" && a.mainBody) {
								a.mainBody.on("mousedown",
										this.onAutoEditClick, this)
							}
							this.on("celldblclick", this.onCellDblClick, this)
						}
					},
					onResize : function() {
						Ext.grid.EditorGridPanel.superclass.onResize.apply(
								this, arguments);
						var a = this.activeEditor;
						if (this.editing && a) {
							a.realign(true)
						}
					},
					onCellDblClick : function(b, c, a) {
						this.startEditing(c, a)
					},
					onAutoEditClick : function(c, b) {
						if (c.button !== 0) {
							return
						}
						var g = this.view.findRowIndex(b), a = this.view
								.findCellIndex(b);
						if (g !== false && a !== false) {
							this.stopEditing();
							if (this.selModel.getSelectedCell) {
								var d = this.selModel.getSelectedCell();
								if (d && d[0] === g && d[1] === a) {
									this.startEditing(g, a)
								}
							} else {
								if (this.selModel.isSelected(g)) {
									this.startEditing(g, a)
								}
							}
						}
					},
					onEditComplete : function(b, d, a) {
						this.editing = false;
						this.lastActiveEditor = this.activeEditor;
						this.activeEditor = null;
						var c = b.record, h = this.colModel.getDataIndex(b.col);
						d = this.postEditValue(d, a, c, h);
						if (this.forceValidation === true
								|| String(d) !== String(a)) {
							var g = {
								grid :this,
								record :c,
								field :h,
								originalValue :a,
								value :d,
								row :b.row,
								column :b.col,
								cancel :false
							};
							if (this.fireEvent("validateedit", g) !== false
									&& !g.cancel && String(d) !== String(a)) {
								c.set(h, g.value);
								delete g.cancel;
								this.fireEvent("afteredit", g)
							}
						}
						this.view.focusCell(b.row, b.col)
					},
					startEditing : function(i, c) {
						this.stopEditing();
						if (this.colModel.isCellEditable(c, i)) {
							this.view.ensureVisible(i, c, true);
							var d = this.store.getAt(i), h = this.colModel
									.getDataIndex(c), g = {
								grid :this,
								record :d,
								field :h,
								value :d.data[h],
								row :i,
								column :c,
								cancel :false
							};
							if (this.fireEvent("beforeedit", g) !== false
									&& !g.cancel) {
								this.editing = true;
								var b = this.colModel.getCellEditor(c, i);
								if (!b) {
									return
								}
								if (!b.rendered) {
									b.parentEl = this.view.getEditorParent(b);
									b.on( {
										scope :this,
										render : {
											fn : function(e) {
												e.field.focus(false, true)
											},
											single :true,
											scope :this
										},
										specialkey : function(l, k) {
											this.getSelectionModel()
													.onEditorKey(l, k)
										},
										complete :this.onEditComplete,
										canceledit :this.stopEditing
												.createDelegate(this, [ true ])
									})
								}
								Ext.apply(b, {
									row :i,
									col :c,
									record :d
								});
								this.lastEdit = {
									row :i,
									col :c
								};
								this.activeEditor = b;
								b.selectSameEditor = (this.activeEditor == this.lastActiveEditor);
								var a = this.preEditValue(d, h);
								b.startEdit(this.view.getCell(i, c).firstChild,
										Ext.isDefined(a) ? a : "");
								( function() {
									delete b.selectSameEditor
								}).defer(50)
							}
						}
					},
					preEditValue : function(a, c) {
						var b = a.data[c];
						return this.autoEncode && Ext.isString(b) ? Ext.util.Format
								.htmlDecode(b)
								: b
					},
					postEditValue : function(c, a, b, d) {
						return this.autoEncode && Ext.isString(c) ? Ext.util.Format
								.htmlEncode(c)
								: c
					},
					stopEditing : function(b) {
						if (this.editing) {
							var a = this.lastActiveEditor = this.activeEditor;
							if (a) {
								a[b === true ? "cancelEdit" : "completeEdit"]();
								this.view.focusCell(a.row, a.col)
							}
							this.activeEditor = null
						}
						this.editing = false
					}
				});
Ext.reg("editorgrid", Ext.grid.EditorGridPanel);
Ext.grid.GridEditor = function(b, a) {
	Ext.grid.GridEditor.superclass.constructor.call(this, b, a);
	b.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(a, b) {
		this.grid = a;
		this.store = new Ext.data.Store( {
			recordType :Ext.grid.PropertyRecord
		});
		this.store.on("update", this.onUpdate, this);
		if (b) {
			this.setSource(b)
		}
		Ext.grid.PropertyStore.superclass.constructor.call(this)
	},
	setSource : function(c) {
		this.source = c;
		this.store.removeAll();
		var b = [];
		for ( var a in c) {
			if (this.isEditableValue(c[a])) {
				b.push(new Ext.grid.PropertyRecord( {
					name :a,
					value :c[a]
				}, a))
			}
		}
		this.store.loadRecords( {
			records :b
		}, {}, true)
	},
	onUpdate : function(e, a, d) {
		if (d == Ext.data.Record.EDIT) {
			var b = a.data.value;
			var c = a.modified.value;
			if (this.grid.fireEvent("beforepropertychange", this.source, a.id,
					b, c) !== false) {
				this.source[a.id] = b;
				a.commit();
				this.grid.fireEvent("propertychange", this.source, a.id, b, c)
			} else {
				a.reject()
			}
		}
	},
	getProperty : function(a) {
		return this.store.getAt(a)
	},
	isEditableValue : function(a) {
		return Ext.isPrimitive(a) || Ext.isDate(a)
	},
	setValue : function(d, c, a) {
		var b = this.getRec(d);
		if (b) {
			b.set("value", c);
			this.source[d] = c
		} else {
			if (a) {
				this.source[d] = c;
				b = new Ext.grid.PropertyRecord( {
					name :d,
					value :c
				}, d);
				this.store.add(b)
			}
		}
	},
	remove : function(b) {
		var a = this.getRec(b);
		if (a) {
			this.store.remove(a);
			delete this.source[b]
		}
	},
	getRec : function(a) {
		return this.store.getById(a)
	},
	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(c, b) {
		var d = Ext.grid, e = Ext.form;
		this.grid = c;
		d.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 = b;
		var a = new e.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 d.GridEditor(new e.DateField( {
				selectOnFocus :true
			})),
			string :new d.GridEditor(new e.TextField( {
				selectOnFocus :true
			})),
			number :new d.GridEditor(new e.NumberField( {
				selectOnFocus :true,
				style :"text-align:left;"
			})),
			"boolean" :new d.GridEditor(a, {
				autoSize :"both"
			})
		};
		this.renderCellDelegate = this.renderCell.createDelegate(this);
		this.renderPropDelegate = this.renderProp.createDelegate(this)
	},
	renderDate : function(a) {
		return a.dateFormat(this.dateFormat)
	},
	renderBool : function(a) {
		return this[a ? "trueText" : "falseText"]
	},
	isCellEditable : function(a, b) {
		return a == 1
	},
	getRenderer : function(a) {
		return a == 1 ? this.renderCellDelegate : this.renderPropDelegate
	},
	renderProp : function(a) {
		return this.getPropertyName(a)
	},
	renderCell : function(d, b, c) {
		var a = this.grid.customRenderers[c.get("name")];
		if (a) {
			return a.apply(this, arguments)
		}
		var e = d;
		if (Ext.isDate(d)) {
			e = this.renderDate(d)
		} else {
			if (typeof d == "boolean") {
				e = this.renderBool(d)
			}
		}
		return Ext.util.Format.htmlEncode(e)
	},
	getPropertyName : function(b) {
		var a = this.grid.propertyNames;
		return a && a[b] ? a[b] : b
	},
	getCellEditor : function(a, e) {
		var b = this.store.getProperty(e), d = b.data.name, c = b.data.value;
		if (this.grid.customEditors[d]) {
			return this.grid.customEditors[d]
		}
		if (Ext.isDate(c)) {
			return this.editors.date
		} else {
			if (typeof c == "number") {
				return this.editors.number
			} else {
				if (typeof c == "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(b) {
		for ( var a in b) {
			Ext.destroy(b[a])
		}
	}
});
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 b = new Ext.grid.PropertyStore(this);
		this.propStore = b;
		var a = new Ext.grid.PropertyColumnModel(this, b);
		b.store.sort("name", "ASC");
		this.addEvents("beforepropertychange", "propertychange");
		this.cm = a;
		this.ds = b.store;
		Ext.grid.PropertyGrid.superclass.initComponent.call(this);
		this.mon(this.selModel, "beforecellselect", function(e, d, c) {
			if (c === 0) {
				this.startEditing.defer(200, this, [ d, 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(a) {
		this.propStore.setSource(a)
	},
	getSource : function() {
		return this.propStore.getSource()
	},
	setProperty : function(c, b, a) {
		this.propStore.setValue(c, b, a)
	},
	removeProperty : function(a) {
		this.propStore.remove(a)
	}
});
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 a = this.grid.getSelectionModel();
						a.on(a.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(a) {
						return Ext.fly(a)
								.up(".x-grid-group", this.mainBody.dom)
					},
					getGroups : function() {
						return this.hasRows() ? this.mainBody.dom.childNodes
								: []
					},
					onAdd : function(d, a, b) {
						if (this.canGroup() && !this.ignoreAdd) {
							var c = this.getScrollState();
							this.fireEvent("beforerowsinserted", d, b, b
									+ (a.length - 1));
							this.refresh();
							this.restoreScroll(c);
							this.fireEvent("rowsinserted", d, b, b
									+ (a.length - 1))
						} else {
							if (!this.canGroup()) {
								Ext.grid.GroupingView.superclass.onAdd.apply(
										this, arguments)
							}
						}
					},
					onRemove : function(e, a, b, d) {
						Ext.grid.GroupingView.superclass.onRemove.apply(this,
								arguments);
						var c = document.getElementById(a._groupId);
						if (c && c.childNodes[1].childNodes.length < 1) {
							Ext.removeNode(c)
						}
						this.applyEmptyText()
					},
					refreshRow : function(a) {
						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 c, a = this.hmenu.items, b = this.cm.config[this.hdCtxIndex].groupable === false;
						if ((c = a.get("groupBy"))) {
							c.setDisabled(b)
						}
						if ((c = a.get("showGroups"))) {
							c.setDisabled(b);
							c.setChecked(this.canGroup(), true)
						}
					},
					renderUI : function() {
						var a = 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 a
					},
					processEvent : function(b, i) {
						Ext.grid.GroupingView.superclass.processEvent.call(
								this, b, i);
						var h = i.getTarget(".x-grid-group-hd", this.mainBody);
						if (h) {
							var g = this.getGroupField(), d = this.getPrefix(g), a = h.id
									.substring(d.length), c = new RegExp("gp-"
									+ Ext.escapeRe(g) + "--hd");
							a = a.substr(0, a.length - 3);
							if (a || c.test(h.id)) {
								this.grid.fireEvent("group" + b, this.grid, g,
										a, i)
							}
							if (b == "mousedown" && i.button == 0) {
								this.toggleGroup(h.parentNode)
							}
						}
					},
					onGroupByClick : function() {
						var a = this.grid;
						this.enableGrouping = true;
						a.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex));
						a.fireEvent("groupchange", a, a.store.getGroupState());
						this.beforeMenuShow();
						this.refresh()
					},
					onShowGroupsClick : function(a, b) {
						this.enableGrouping = b;
						if (b) {
							this.onGroupByClick()
						} else {
							this.grid.store.clearGrouping();
							this.grid.fireEvent("groupchange", this, null)
						}
					},
					toggleRowIndex : function(c, a) {
						if (!this.canGroup()) {
							return
						}
						var b = this.getRow(c);
						if (b) {
							this.toggleGroup(this.findGroup(b), a)
						}
					},
					toggleGroup : function(c, b) {
						var a = Ext.get(c);
						b = Ext.isDefined(b) ? b : a
								.hasClass("x-grid-group-collapsed");
						if (this.state[a.id] !== b) {
							if (this.cancelEditOnToggle !== false) {
								this.grid.stopEditing(true)
							}
							this.state[a.id] = b;
							a[b ? "removeClass" : "addClass"]
									("x-grid-group-collapsed")
						}
					},
					toggleAllGroups : function(c) {
						var b = this.getGroups();
						for ( var d = 0, a = b.length; d < a; d++) {
							this.toggleGroup(b[d], c)
						}
					},
					expandAllGroups : function() {
						this.toggleAllGroups(true)
					},
					collapseAllGroups : function() {
						this.toggleAllGroups(false)
					},
					getGroup : function(a, e, i, k, b, h) {
						var c = this.cm.config[b], d = i ? i.call(c.scope, a,
								{}, e, k, b, h) : String(a);
						if (d === "" || d === "&#160;") {
							d = c.emptyGroupText || this.emptyGroupText
						}
						return d
					},
					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 a = this.getGroupField();
						var e = !!a;
						if (this.hideGroupedColumn) {
							var b = this.cm.findColumnIndex(a), d = Ext
									.isDefined(this.lastGroupField);
							if (!e && d) {
								this.mainBody.update("");
								this.cm.setHidden(this.cm
										.findColumnIndex(this.lastGroupField),
										false);
								delete this.lastGroupField
							} else {
								if (e && !d) {
									this.lastGroupField = a;
									this.cm.setHidden(b, true)
								} else {
									if (e && d && a !== this.lastGroupField) {
										this.mainBody.update("");
										var c = this.cm
												.findColumnIndex(this.lastGroupField);
										this.cm.setHidden(c, false);
										this.lastGroupField = a;
										this.cm.setHidden(b, true)
									}
								}
							}
						}
						return Ext.grid.GroupingView.superclass.renderRows
								.apply(this, arguments)
					},
					doRender : function(c, h, s, a, q, t) {
						if (h.length < 1) {
							return ""
						}
						if (!this.canGroup() || this.isUpdating) {
							return Ext.grid.GroupingView.superclass.doRender
									.apply(this, arguments)
						}
						var A = this.getGroupField(), p = this.cm
								.findColumnIndex(A), x, k = "width:"
								+ this.getTotalWidth() + ";", e = this.cm.config[p], b = e.groupRenderer
								|| e.renderer, u = this.showGroupName ? (e.groupName || e.header)
								+ ": "
								: "", z = [], m, v, w, o;
						for (v = 0, w = h.length; v < w; v++) {
							var l = a + v, n = h[v], d = n.data[A];
							x = this.getGroup(d, n, b, l, p, s);
							if (!m || m.group != x) {
								o = this.constructId(d, A, p);
								this.state[o] = !(Ext.isDefined(this.state[o]) ? !this.state[o]
										: this.startCollapsed);
								m = {
									group :x,
									gvalue :d,
									text :u + x,
									groupId :o,
									startRow :l,
									rs : [ n ],
									cls :this.state[o] ? ""
											: "x-grid-group-collapsed",
									style :k
								};
								z.push(m)
							} else {
								m.rs.push(n)
							}
							n._groupId = o
						}
						var y = [];
						for (v = 0, w = z.length; v < w; v++) {
							x = z[v];
							this.doGroupStart(y, x, c, s, q);
							y[y.length] = Ext.grid.GroupingView.superclass.doRender
									.call(this, c, x.rs, s, x.startRow, q, t);
							this.doGroupEnd(y, x, c, s, q)
						}
						return y.join("")
					},
					getGroupId : function(a) {
						var b = this.getGroupField();
						return this.constructId(a, b, this.cm
								.findColumnIndex(b))
					},
					constructId : function(c, e, a) {
						var b = this.cm.config[a], d = b.groupRenderer
								|| b.renderer, g = (this.groupMode == "value") ? c
								: this.getGroup(c, {
									data : {}
								}, d, 0, a, this.ds);
						return this.getPrefix(e)
								+ Ext.util.Format.htmlEncode(g)
					},
					canGroup : function() {
						return this.enableGrouping && !!this.getGroupField()
					},
					getPrefix : function(a) {
						return this.grid.getGridEl().id + "-gp-" + a + "-"
					},
					doGroupStart : function(a, d, b, e, c) {
						a[a.length] = this.startGroup.apply(d)
					},
					doGroupEnd : function(a, d, b, e, c) {
						a[a.length] = this.endGroup
					},
					getRows : function() {
						if (!this.canGroup()) {
							return Ext.grid.GroupingView.superclass.getRows
									.call(this)
						}
						var k = [], c = this.getGroups(), h, e = 0, a = c.length, d, b;
						for (; e < a; ++e) {
							h = c[e].childNodes[1];
							if (h) {
								h = h.childNodes;
								for (d = 0, b = h.length; d < b; ++d) {
									k[k.length] = h[d]
								}
							}
						}
						return k
					},
					updateGroupWidths : function() {
						if (!this.canGroup() || !this.hasRows()) {
							return
						}
						var c = Math.max(this.cm.getTotalWidth(),
								this.el.dom.offsetWidth
										- this.getScrollOffset())
								+ "px";
						var b = this.getGroups();
						for ( var d = 0, a = b.length; d < a; d++) {
							b[d].firstChild.style.width = c
						}
					},
					onColumnWidthUpdated : function(c, a, b) {
						Ext.grid.GroupingView.superclass.onColumnWidthUpdated
								.call(this, c, a, b);
						this.updateGroupWidths()
					},
					onAllColumnWidthsUpdated : function(a, b) {
						Ext.grid.GroupingView.superclass.onAllColumnWidthsUpdated
								.call(this, a, b);
						this.updateGroupWidths()
					},
					onColumnHiddenUpdated : function(b, c, a) {
						Ext.grid.GroupingView.superclass.onColumnHiddenUpdated
								.call(this, b, c, a);
						this.updateGroupWidths()
					},
					onLayout : function() {
						this.updateGroupWidths()
					},
					onBeforeRowSelect : function(b, a) {
						this.toggleRowIndex(a, true)
					}
				});
Ext.grid.GroupingView.GROUP_ID = 1000;
