From 9ea55f2a53fbe7a5e0ed7d2af446d4e3abb667c3 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sat, 21 Nov 2009 02:26:29 +0000 Subject: [PATCH] MINOR Moved sapphire/thirdparty/jsmin from an external into source tree git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@92489 467b73ca-7a2a-4603-9d3b-597d59a354a9 --- thirdparty/jsmin/.piston.yml | 8 + thirdparty/jsmin/jsmin.php | 291 + thirdparty/jsmin/test/ext-all-debug.js | 30217 +++++++++++++++++++++++ thirdparty/jsmin/test/prototype.js | 3271 +++ thirdparty/jsmin/test/test.php | 10 + 5 files changed, 33797 insertions(+) create mode 100644 thirdparty/jsmin/.piston.yml create mode 100644 thirdparty/jsmin/jsmin.php create mode 100755 thirdparty/jsmin/test/ext-all-debug.js create mode 100644 thirdparty/jsmin/test/prototype.js create mode 100644 thirdparty/jsmin/test/test.php diff --git a/thirdparty/jsmin/.piston.yml b/thirdparty/jsmin/.piston.yml new file mode 100644 index 000000000..5aa8f6701 --- /dev/null +++ b/thirdparty/jsmin/.piston.yml @@ -0,0 +1,8 @@ +--- +format: 1 +handler: + piston:remote-revision: 7 + piston:uuid: d4d03eb5-ab2f-0410-8b36-bd473e2d5c71 +lock: false +repository_url: http://jsmin-php.googlecode.com/svn/trunk/ +repository_class: Piston::Svn::Repository diff --git a/thirdparty/jsmin/jsmin.php b/thirdparty/jsmin/jsmin.php new file mode 100644 index 000000000..2f3bcc75b --- /dev/null +++ b/thirdparty/jsmin/jsmin.php @@ -0,0 +1,291 @@ + + * @copyright 2002 Douglas Crockford (jsmin.c) + * @copyright 2008 Ryan Grove (PHP port) + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 1.1.1 (2008-03-02) + * @link http://code.google.com/p/jsmin-php/ + */ + +class JSMin { + const ORD_LF = 10; + const ORD_SPACE = 32; + + protected $a = ''; + protected $b = ''; + protected $input = ''; + protected $inputIndex = 0; + protected $inputLength = 0; + protected $lookAhead = null; + protected $output = ''; + + // -- Public Static Methods -------------------------------------------------- + + public static function minify($js) { + $jsmin = new JSMin($js); + return $jsmin->min(); + } + + // -- Public Instance Methods ------------------------------------------------ + + public function __construct($input) { + $this->input = str_replace("\r\n", "\n", $input); + $this->inputLength = strlen($this->input); + } + + // -- Protected Instance Methods --------------------------------------------- + + protected function action($d) { + switch($d) { + case 1: + $this->output .= $this->a; + + case 2: + $this->a = $this->b; + + if ($this->a === "'" || $this->a === '"') { + for (;;) { + $this->output .= $this->a; + $this->a = $this->get(); + + if ($this->a === $this->b) { + break; + } + + if (ord($this->a) <= self::ORD_LF) { + throw new JSMinException('Unterminated string literal.'); + } + + if ($this->a === '\\') { + $this->output .= $this->a; + $this->a = $this->get(); + } + } + } + + case 3: + $this->b = $this->next(); + + if ($this->b === '/' && ( + $this->a === '(' || $this->a === ',' || $this->a === '=' || + $this->a === ':' || $this->a === '[' || $this->a === '!' || + $this->a === '&' || $this->a === '|' || $this->a === '?')) { + + $this->output .= $this->a . $this->b; + + for (;;) { + $this->a = $this->get(); + + if ($this->a === '/') { + break; + } elseif ($this->a === '\\') { + $this->output .= $this->a; + $this->a = $this->get(); + } elseif (ord($this->a) <= self::ORD_LF) { + throw new JSMinException('Unterminated regular expression '. + 'literal.'); + } + + $this->output .= $this->a; + } + + $this->b = $this->next(); + } + } + } + + protected function get() { + $c = $this->lookAhead; + $this->lookAhead = null; + + if ($c === null) { + if ($this->inputIndex < $this->inputLength) { + $c = $this->input[$this->inputIndex]; + $this->inputIndex += 1; + } else { + $c = null; + } + } + + if ($c === "\r") { + return "\n"; + } + + if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) { + return $c; + } + + return ' '; + } + + protected function isAlphaNum($c) { + return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c) === 1; + } + + protected function min() { + $this->a = "\n"; + $this->action(3); + + while ($this->a !== null) { + switch ($this->a) { + case ' ': + if ($this->isAlphaNum($this->b)) { + $this->action(1); + } else { + $this->action(2); + } + break; + + case "\n": + switch ($this->b) { + case '{': + case '[': + case '(': + case '+': + case '-': + $this->action(1); + break; + + case ' ': + $this->action(3); + break; + + default: + if ($this->isAlphaNum($this->b)) { + $this->action(1); + } + else { + $this->action(2); + } + } + break; + + default: + switch ($this->b) { + case ' ': + if ($this->isAlphaNum($this->a)) { + $this->action(1); + break; + } + + $this->action(3); + break; + + case "\n": + switch ($this->a) { + case '}': + case ']': + case ')': + case '+': + case '-': + case '"': + case "'": + $this->action(1); + break; + + default: + if ($this->isAlphaNum($this->a)) { + $this->action(1); + } + else { + $this->action(3); + } + } + break; + + default: + $this->action(1); + break; + } + } + } + + return $this->output; + } + + protected function next() { + $c = $this->get(); + + if ($c === '/') { + switch($this->peek()) { + case '/': + for (;;) { + $c = $this->get(); + + if (ord($c) <= self::ORD_LF) { + return $c; + } + } + + case '*': + $this->get(); + + for (;;) { + switch($this->get()) { + case '*': + if ($this->peek() === '/') { + $this->get(); + return ' '; + } + break; + + case null: + throw new JSMinException('Unterminated comment.'); + } + } + + default: + return $c; + } + } + + return $c; + } + + protected function peek() { + $this->lookAhead = $this->get(); + return $this->lookAhead; + } +} + +// -- Exceptions --------------------------------------------------------------- +class JSMinException extends Exception {} +?> \ No newline at end of file diff --git a/thirdparty/jsmin/test/ext-all-debug.js b/thirdparty/jsmin/test/ext-all-debug.js new file mode 100755 index 000000000..28c30e212 --- /dev/null +++ b/thirdparty/jsmin/test/ext-all-debug.js @@ -0,0 +1,30217 @@ +/* + * Ext JS Library 1.1.1 + * Copyright(c) 2006-2007, Ext JS, LLC. + * licensing@extjs.com + * + * http://www.extjs.com/license + */ + + +Ext.DomHelper = function(){ + var tempTableEl = null; + var emptyTags = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i; + var tableRe = /^table|tbody|tr|td$/i; + + + + var createHtml = function(o){ + if(typeof o == 'string'){ + return o; + } + var b = ""; + if(!o.tag){ + o.tag = "div"; + } + b += "<" + o.tag; + for(var attr in o){ + if(attr == "tag" || attr == "children" || attr == "cn" || attr == "html" || typeof o[attr] == "function") continue; + if(attr == "style"){ + var s = o["style"]; + if(typeof s == "function"){ + s = s.call(); + } + if(typeof s == "string"){ + b += ' style="' + s + '"'; + }else if(typeof s == "object"){ + b += ' style="'; + for(var key in s){ + if(typeof s[key] != "function"){ + b += key + ":" + s[key] + ";"; + } + } + b += '"'; + } + }else{ + if(attr == "cls"){ + b += ' class="' + o["cls"] + '"'; + }else if(attr == "htmlFor"){ + b += ' for="' + o["htmlFor"] + '"'; + }else{ + b += " " + attr + '="' + o[attr] + '"'; + } + } + } + if(emptyTags.test(o.tag)){ + b += "/>"; + }else{ + b += ">"; + var cn = o.children || o.cn; + if(cn){ + if(cn instanceof Array){ + for(var i = 0, len = cn.length; i < len; i++) { + b += createHtml(cn[i], b); + } + }else{ + b += createHtml(cn, b); + } + } + if(o.html){ + b += o.html; + } + b += ""; + } + return b; + }; + + + + var createDom = function(o, parentNode){ + var el = document.createElement(o.tag||'div'); + var useSet = el.setAttribute ? true : false; + for(var attr in o){ + if(attr == "tag" || attr == "children" || attr == "cn" || attr == "html" || attr == "style" || typeof o[attr] == "function") continue; + if(attr=="cls"){ + el.className = o["cls"]; + }else{ + if(useSet) el.setAttribute(attr, o[attr]); + else el[attr] = o[attr]; + } + } + Ext.DomHelper.applyStyles(el, o.style); + var cn = o.children || o.cn; + if(cn){ + if(cn instanceof Array){ + for(var i = 0, len = cn.length; i < len; i++) { + createDom(cn[i], el); + } + }else{ + createDom(cn, el); + } + } + if(o.html){ + el.innerHTML = o.html; + } + if(parentNode){ + parentNode.appendChild(el); + } + return el; + }; + + var ieTable = function(depth, s, h, e){ + tempTableEl.innerHTML = [s, h, e].join(''); + var i = -1, el = tempTableEl; + while(++i < depth){ + el = el.firstChild; + } + return el; + }; + + + var ts = '', + te = '
', + tbs = ts+'', + tbe = ''+te, + trs = tbs + '', + tre = ''+tbe; + + + var insertIntoTable = function(tag, where, el, html){ + if(!tempTableEl){ + tempTableEl = document.createElement('div'); + } + var node; + var before = null; + if(tag == 'td'){ + if(where == 'afterbegin' || where == 'beforeend'){ + return; + } + if(where == 'beforebegin'){ + before = el; + el = el.parentNode; + } else{ + before = el.nextSibling; + el = el.parentNode; + } + node = ieTable(4, trs, html, tre); + } + else if(tag == 'tr'){ + if(where == 'beforebegin'){ + before = el; + el = el.parentNode; + node = ieTable(3, tbs, html, tbe); + } else if(where == 'afterend'){ + before = el.nextSibling; + el = el.parentNode; + node = ieTable(3, tbs, html, tbe); + } else{ + if(where == 'afterbegin'){ + before = el.firstChild; + } + node = ieTable(4, trs, html, tre); + } + } else if(tag == 'tbody'){ + if(where == 'beforebegin'){ + before = el; + el = el.parentNode; + node = ieTable(2, ts, html, te); + } else if(where == 'afterend'){ + before = el.nextSibling; + el = el.parentNode; + node = ieTable(2, ts, html, te); + } else{ + if(where == 'afterbegin'){ + before = el.firstChild; + } + node = ieTable(3, tbs, html, tbe); + } + } else{ + if(where == 'beforebegin' || where == 'afterend'){ + return; + } + if(where == 'afterbegin'){ + before = el.firstChild; + } + node = ieTable(2, ts, html, te); + } + el.insertBefore(node, before); + return node; + }; + + return { + + useDom : false, + + + markup : function(o){ + return createHtml(o); + }, + + + applyStyles : function(el, styles){ + if(styles){ + el = Ext.fly(el); + if(typeof styles == "string"){ + var re = /\s?([a-z\-]*)\:\s?([^;]*);?/gi; + var matches; + while ((matches = re.exec(styles)) != null){ + el.setStyle(matches[1], matches[2]); + } + }else if (typeof styles == "object"){ + for (var style in styles){ + el.setStyle(style, styles[style]); + } + }else if (typeof styles == "function"){ + Ext.DomHelper.applyStyles(el, styles.call()); + } + } + }, + + + insertHtml : function(where, el, html){ + where = where.toLowerCase(); + if(el.insertAdjacentHTML){ + if(tableRe.test(el.tagName)){ + var rs; + if(rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html)){ + return rs; + } + } + switch(where){ + case "beforebegin": + el.insertAdjacentHTML('BeforeBegin', html); + return el.previousSibling; + case "afterbegin": + el.insertAdjacentHTML('AfterBegin', html); + return el.firstChild; + case "beforeend": + el.insertAdjacentHTML('BeforeEnd', html); + return el.lastChild; + case "afterend": + el.insertAdjacentHTML('AfterEnd', html); + return el.nextSibling; + } + throw 'Illegal insertion point -> "' + where + '"'; + } + var range = el.ownerDocument.createRange(); + var frag; + switch(where){ + case "beforebegin": + range.setStartBefore(el); + frag = range.createContextualFragment(html); + el.parentNode.insertBefore(frag, el); + return el.previousSibling; + case "afterbegin": + if(el.firstChild){ + range.setStartBefore(el.firstChild); + frag = range.createContextualFragment(html); + el.insertBefore(frag, el.firstChild); + return el.firstChild; + }else{ + el.innerHTML = html; + return el.firstChild; + } + case "beforeend": + if(el.lastChild){ + range.setStartAfter(el.lastChild); + frag = range.createContextualFragment(html); + el.appendChild(frag); + return el.lastChild; + }else{ + el.innerHTML = html; + return el.lastChild; + } + case "afterend": + range.setStartAfter(el); + frag = range.createContextualFragment(html); + el.parentNode.insertBefore(frag, el.nextSibling); + return el.nextSibling; + } + throw 'Illegal insertion point -> "' + where + '"'; + }, + + + insertBefore : function(el, o, returnElement){ + return this.doInsert(el, o, returnElement, "beforeBegin"); + }, + + + insertAfter : function(el, o, returnElement){ + return this.doInsert(el, o, returnElement, "afterEnd", "nextSibling"); + }, + + + insertFirst : function(el, o, returnElement){ + return this.doInsert(el, o, returnElement, "afterBegin"); + }, + + + doInsert : function(el, o, returnElement, pos, sibling){ + el = Ext.getDom(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.parentNode.insertBefore(newNode, sibling ? el[sibling] : el); + }else{ + var html = createHtml(o); + newNode = this.insertHtml(pos, el, html); + } + return returnElement ? Ext.get(newNode, true) : newNode; + }, + + + append : function(el, o, returnElement){ + el = Ext.getDom(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.appendChild(newNode); + }else{ + var html = createHtml(o); + newNode = this.insertHtml("beforeEnd", el, html); + } + return returnElement ? Ext.get(newNode, true) : newNode; + }, + + + overwrite : function(el, o, returnElement){ + el = Ext.getDom(el); + el.innerHTML = createHtml(o); + return returnElement ? Ext.get(el.firstChild, true) : el.firstChild; + }, + + + createTemplate : function(o){ + var html = createHtml(o); + return new Ext.Template(html); + } + }; +}(); + + +Ext.Template = function(html){ + if(html instanceof Array){ + html = html.join(""); + }else if(arguments.length > 1){ + html = Array.prototype.join.call(arguments, ""); + } + + this.html = html; + +}; +Ext.Template.prototype = { + + applyTemplate : function(values){ + if(this.compiled){ + return this.compiled(values); + } + var useF = this.disableFormats !== true; + var fm = Ext.util.Format, tpl = this; + var fn = function(m, name, format, args){ + if(format && useF){ + if(format.substr(0, 5) == "this."){ + return tpl.call(format.substr(5), values[name], values); + }else{ + if(args){ + + + + var re = /^\s*['"](.*)["']\s*$/; + args = args.split(','); + for(var i = 0, len = args.length; i < len; i++){ + args[i] = args[i].replace(re, "$1"); + } + args = [values[name]].concat(args); + }else{ + args = [values[name]]; + } + return fm[format].apply(fm, args); + } + }else{ + return values[name] !== undefined ? values[name] : ""; + } + }; + return this.html.replace(this.re, fn); + }, + + + set : function(html, compile){ + this.html = html; + this.compiled = null; + if(compile){ + this.compile(); + } + return this; + }, + + + disableFormats : false, + + + re : /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g, + + + compile : function(){ + var fm = Ext.util.Format; + var useF = this.disableFormats !== true; + var sep = Ext.isGecko ? "+" : ","; + var fn = function(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+"'"; + }; + var body; + + if(Ext.isGecko){ + body = "this.compiled = function(values){ return '" + + this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn) + + "';};"; + }else{ + body = ["this.compiled = function(values){ return ['"]; + body.push(this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn)); + body.push("'].join('');};"); + body = body.join(''); + } + eval(body); + return this; + }, + + + call : function(fnName, value, allValues){ + return this[fnName](value, allValues); + }, + + + insertFirst: function(el, values, returnElement){ + return this.doInsert('afterBegin', el, values, returnElement); + }, + + + insertBefore: function(el, values, returnElement){ + return this.doInsert('beforeBegin', el, values, returnElement); + }, + + + insertAfter : function(el, values, returnElement){ + return this.doInsert('afterEnd', el, values, returnElement); + }, + + + append : function(el, values, returnElement){ + return this.doInsert('beforeEnd', el, values, returnElement); + }, + + doInsert : function(where, el, values, returnEl){ + el = Ext.getDom(el); + var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values)); + return returnEl ? Ext.get(newNode, true) : newNode; + }, + + + overwrite : function(el, values, returnElement){ + el = Ext.getDom(el); + el.innerHTML = this.applyTemplate(values); + return returnElement ? Ext.get(el.firstChild, true) : el.firstChild; + } +}; + +Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate; + + +Ext.DomHelper.Template = Ext.Template; + + +Ext.Template.from = function(el){ + el = Ext.getDom(el); + return new Ext.Template(el.value || el.innerHTML); +}; + + +Ext.DomQuery = function(){ + var cache = {}, simpleCache = {}, valueCache = {}; + var nonSpace = /\S/; + var trimRe = /^\s+|\s+$/g; + var tplRe = /\{(\d+)\}/g; + var modeRe = /^(\s?[\/>+~]\s?|\s|$)/; + var tagTokenRe = /^(#)?([\w-\*]+)/; + var nthRe = /(\d*)n\+?(\d*)/, nthRe2 = /\D/; + + function child(p, index){ + var i = 0; + var n = p.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(d){ + var n = d.firstChild, ni = -1; + while(n){ + var nx = n.nextSibling; + if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){ + d.removeChild(n); + }else{ + n.nodeIndex = ++ni; + } + n = nx; + } + return this; + }; + + function byClassName(c, a, v){ + if(!v){ + return c; + } + var r = [], ri = -1, cn; + for(var i = 0, ci; ci = c[i]; i++){ + if((' '+ci.className+' ').indexOf(v) != -1){ + r[++ri] = ci; + } + } + return r; + }; + + function attrValue(n, 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.children || 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 == "~"){ + for(var i = 0, n; n = ns[i]; i++){ + while((n = n.nextSibling) && (n.nodeType != 1 || (tagName == '*' || n.tagName.toLowerCase()!=tagName))); + if(n){ + 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 r = [], ri = -1; + tagName = tagName.toLowerCase(); + for(var i = 0, ci; ci = cs[i]; i++){ + if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){ + r[++ri] = ci; + } + } + return r; + }; + + function byId(cs, attr, id){ + if(cs.tagName || cs == document){ + cs = [cs]; + } + if(!id){ + return cs; + } + var r = [], ri = -1; + for(var i = 0,ci; ci = cs[i]; i++){ + if(ci && ci.id == id){ + r[++ri] = ci; + return r; + } + } + return r; + }; + + function byAttribute(cs, attr, value, op, custom){ + var r = [], ri = -1, st = custom=="{"; + var f = Ext.DomQuery.operators[op]; + for(var i = 0, ci; ci = cs[i]; i++){ + var a; + if(st){ + 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); + } + if((f && f(a, value)) || (!f && a)){ + r[++ri] = ci; + } + } + return r; + }; + + function byPseudo(cs, name, value){ + return Ext.DomQuery.pseudos[name](cs, value); + }; + + + + + var isIE = window.ActiveXObject ? true : false; + + + + eval("var batch = 30803;"); + + var key = 30803; + + function nodupIEXml(cs){ + var d = ++key; + cs[0].setAttribute("_nodup", d); + var r = [cs[0]]; + for(var i = 1, len = cs.length; i < len; i++){ + var c = cs[i]; + if(!c.getAttribute("_nodup") != d){ + c.setAttribute("_nodup", d); + r[r.length] = c; + } + } + for(var i = 0, len = cs.length; i < len; i++){ + cs[i].removeAttribute("_nodup"); + } + return r; + } + + function nodup(cs){ + if(!cs){ + return []; + } + var 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; + for(var i = 0, len = c1.length; i < len; i++){ + c1[i].setAttribute("_qdiff", d); + } + var r = []; + for(var i = 0, len = c2.length; i < len; i++){ + if(c2[i].getAttribute("_qdiff") != d){ + r[r.length] = c2[i]; + } + } + for(var i = 0, len = c1.length; i < len; i++){ + c1[i].removeAttribute("_qdiff"); + } + return r; + } + + function quickDiff(c1, c2){ + var len1 = c1.length; + if(!len1){ + return c2; + } + if(isIE && c1[0].selectSingleNode){ + return quickDiffIEXml(c1, c2); + } + var d = ++key; + for(var i = 0; i < len1; i++){ + c1[i]._qdiff = d; + } + var r = []; + for(var i = 0, len = c2.length; i < len; i++){ + if(c2[i]._qdiff != d){ + r[r.length] = c2[i]; + } + } + return r; + } + + function quickId(ns, mode, root, id){ + if(ns == root){ + var d = root.ownerDocument || root; + return d.getElementById(id); + } + ns = getNodes(ns, mode, "*"); + return byId(ns, null, 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"]; + var q = path, mode, lq; + var tk = Ext.DomQuery.matchers; + var tklen = tk.length; + var mm; + + + var lmode = q.match(modeRe); + if(lmode && lmode[1]){ + fn[fn.length] = 'mode="'+lmode[1].replace(trimRe, "")+'";'; + q = q.replace(lmode[1], ""); + } + + while(path.substr(0, 1)=="/"){ + path = path.substr(1); + } + + while(q && lq != q){ + lq = q; + var tm = q.match(tagTokenRe); + if(type == "select"){ + if(tm){ + if(tm[1] == "#"){ + fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");'; + }else{ + fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");'; + } + q = q.replace(tm[0], ""); + }else if(q.substr(0, 1) != '@'){ + fn[fn.length] = 'n = getNodes(n, mode, "*");'; + } + }else{ + if(tm){ + if(tm[1] == "#"){ + fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");'; + }else{ + fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");'; + } + q = q.replace(tm[0], ""); + } + } + while(!(mm = q.match(modeRe))){ + var matched = false; + for(var j = 0; j < tklen; j++){ + var t = tk[j]; + var m = q.match(t.re); + if(m){ + fn[fn.length] = t.select.replace(tplRe, function(x, i){ + return m[i]; + }); + q = q.replace(m[0], ""); + matched = true; + break; + } + } + + if(!matched){ + throw 'Error parsing selector, parsing failed at "' + q + '"'; + } + } + if(mm[1]){ + fn[fn.length] = 'mode="'+mm[1].replace(trimRe, "")+'";'; + q = q.replace(mm[1], ""); + } + } + fn[fn.length] = "return nodup(n);\n}"; + eval(fn.join("")); + return f; + }, + + + select : function(path, root, type){ + if(!root || root == document){ + root = document; + } + if(typeof root == "string"){ + root = document.getElementById(root); + } + var paths = path.split(","); + var results = []; + for(var i = 0, len = paths.length; i < len; i++){ + var p = paths[i].replace(trimRe, ""); + if(!cache[p]){ + cache[p] = Ext.DomQuery.compile(p); + if(!cache[p]){ + throw p + " is not a valid selector"; + } + } + var result = cache[p](root); + if(result && result != document){ + results = results.concat(result); + } + } + if(paths.length > 1){ + return nodup(results); + } + return results; + }, + + + 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); + n = n[0] ? n[0] : n; + var 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 = (el instanceof Array); + var 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, null, " {1} ");' + }, { + re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/, + select: 'n = byPseudo(n, "{1}", "{2}");' + },{ + re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/, + select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");' + }, { + re: /^#([\w-]+)/, + select: 'n = byId(n, null, "{1}");' + },{ + re: /^@([\w-]+)/, + select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};' + } + ], + + + operators : { + "=" : function(a, v){ + return a == v; + }, + "!=" : function(a, v){ + return a != v; + }, + "^=" : function(a, v){ + return a && a.substr(0, v.length) == v; + }, + "$=" : function(a, v){ + return a && a.substr(a.length-v.length) == v; + }, + "*=" : function(a, v){ + return a && a.indexOf(v) !== -1; + }, + "%=" : function(a, v){ + return (a % v) == 0; + }, + "|=" : function(a, v){ + return a && (a == v || a.substr(0, v.length+1) == v+'-'); + }, + "~=" : function(a, v){ + return a && (' '+a+' ').indexOf(' '+v+' ') != -1; + } + }, + + + pseudos : { + "first-child" : function(c){ + var r = [], ri = -1, n; + for(var i = 0, ci; ci = n = c[i]; i++){ + while((n = n.previousSibling) && n.nodeType != 1); + if(!n){ + r[++ri] = ci; + } + } + return r; + }, + + "last-child" : function(c){ + var r = [], ri = -1, n; + for(var i = 0, ci; ci = n = c[i]; i++){ + while((n = n.nextSibling) && n.nodeType != 1); + if(!n){ + r[++ri] = ci; + } + } + return r; + }, + + "nth-child" : function(c, a) { + var r = [], ri = -1; + var m = nthRe.exec(a == "even" && "2n" || a == "odd" && "2n+1" || !nthRe2.test(a) && "n+" + a || a); + var f = (m[1] || 1) - 0, l = m[2] - 0; + for(var i = 0, n; n = c[i]; i++){ + var pn = n.parentNode; + if (batch != pn._batch) { + var j = 0; + for(var cn = pn.firstChild; cn; cn = cn.nextSibling){ + if(cn.nodeType == 1){ + cn.nodeIndex = ++j; + } + } + pn._batch = batch; + } + if (f == 1) { + if (l == 0 || n.nodeIndex == l){ + r[++ri] = n; + } + } else if ((n.nodeIndex + l) % f == 0){ + r[++ri] = n; + } + } + + return r; + }, + + "only-child" : function(c){ + var r = [], ri = -1;; + for(var i = 0, ci; ci = c[i]; i++){ + if(!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); + }, + + "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; + var r = [], ri = -1; + for(var i = 0, ci; ci = c[i]; i++){ + if(s(ss, ci).length > 0){ + r[++ri] = ci; + } + } + return r; + }, + + "next" : function(c, ss){ + var is = Ext.DomQuery.is; + var 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; + var 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.Observable = function(){ + if(this.listeners){ + this.on(this.listeners); + delete this.listeners; + } +}; +Ext.util.Observable.prototype = { + + fireEvent : function(){ + var ce = this.events[arguments[0].toLowerCase()]; + if(typeof ce == "object"){ + return ce.fire.apply(ce, Array.prototype.slice.call(arguments, 1)); + }else{ + return true; + } + }, + + filterOptRe : /^(?:scope|delay|buffer|single)$/, + + + addListener : function(eventName, fn, scope, o){ + if(typeof eventName == "object"){ + o = eventName; + for(var e in o){ + if(this.filterOptRe.test(e)){ + continue; + } + if(typeof o[e] == "function"){ + this.addListener(e, o[e], o.scope, o); + }else{ + this.addListener(e, o[e].fn, o[e].scope, o[e]); + } + } + return; + } + o = (!o || typeof o == "boolean") ? {} : o; + eventName = eventName.toLowerCase(); + var ce = this.events[eventName] || true; + if(typeof ce == "boolean"){ + ce = new Ext.util.Event(this, eventName); + this.events[eventName] = ce; + } + ce.addListener(fn, scope, o); + }, + + + removeListener : function(eventName, fn, scope){ + var ce = this.events[eventName.toLowerCase()]; + if(typeof ce == "object"){ + ce.removeListener(fn, scope); + } + }, + + + purgeListeners : function(){ + for(var evt in this.events){ + if(typeof this.events[evt] == "object"){ + this.events[evt].clearListeners(); + } + } + }, + + relayEvents : function(o, events){ + var createHandler = function(ename){ + return function(){ + return this.fireEvent.apply(this, Ext.combine(ename, Array.prototype.slice.call(arguments, 0))); + }; + }; + for(var i = 0, len = events.length; i < len; i++){ + var ename = events[i]; + if(!this.events[ename]){ this.events[ename] = true; }; + o.on(ename, createHandler(ename), this); + } + }, + + + addEvents : function(o){ + if(!this.events){ + this.events = {}; + } + Ext.applyIf(this.events, o); + }, + + + hasListener : function(eventName){ + var e = this.events[eventName]; + return typeof e == "object" && e.listeners.length > 0; + } +}; + +Ext.util.Observable.prototype.on = Ext.util.Observable.prototype.addListener; + +Ext.util.Observable.prototype.un = Ext.util.Observable.prototype.removeListener; + + +Ext.util.Observable.capture = function(o, fn, scope){ + o.fireEvent = o.fireEvent.createInterceptor(fn, scope); +}; + + +Ext.util.Observable.releaseCapture = function(o){ + o.fireEvent = Ext.util.Observable.prototype.fireEvent; +}; + +(function(){ + + var createBuffered = function(h, o, scope){ + var task = new Ext.util.DelayedTask(); + return function(){ + task.delay(o.buffer, h, scope, Array.prototype.slice.call(arguments, 0)); + }; + }; + + var createSingle = function(h, e, fn, scope){ + return function(){ + e.removeListener(fn, scope); + return h.apply(scope, arguments); + }; + }; + + var createDelayed = function(h, o, scope){ + return function(){ + var args = Array.prototype.slice.call(arguments, 0); + setTimeout(function(){ + h.apply(scope, args); + }, o.delay || 10); + }; + }; + + Ext.util.Event = function(obj, name){ + this.name = name; + this.obj = obj; + this.listeners = []; + }; + + Ext.util.Event.prototype = { + addListener : function(fn, scope, options){ + var o = options || {}; + scope = scope || this.obj; + if(!this.isListening(fn, scope)){ + var l = {fn: fn, scope: scope, options: o}; + var h = fn; + if(o.delay){ + h = createDelayed(h, o, scope); + } + if(o.single){ + h = createSingle(h, this, fn, scope); + } + if(o.buffer){ + h = createBuffered(h, o, scope); + } + l.fireFn = h; + if(!this.firing){ this.listeners.push(l); + }else{ + this.listeners = this.listeners.slice(0); + this.listeners.push(l); + } + } + }, + + findListener : function(fn, scope){ + scope = scope || this.obj; + var ls = this.listeners; + for(var i = 0, len = ls.length; i < len; i++){ + var l = ls[i]; + if(l.fn == fn && l.scope == scope){ + return i; + } + } + return -1; + }, + + isListening : function(fn, scope){ + return this.findListener(fn, scope) != -1; + }, + + removeListener : function(fn, scope){ + var index; + if((index = this.findListener(fn, scope)) != -1){ + if(!this.firing){ + this.listeners.splice(index, 1); + }else{ + this.listeners = this.listeners.slice(0); + this.listeners.splice(index, 1); + } + return true; + } + return false; + }, + + clearListeners : function(){ + this.listeners = []; + }, + + fire : function(){ + var ls = this.listeners, scope, len = ls.length; + if(len > 0){ + this.firing = true; + var args = Array.prototype.slice.call(arguments, 0); + for(var i = 0; i < len; i++){ + var l = ls[i]; + if(l.fireFn.apply(l.scope||this.obj||window, arguments) === false){ + this.firing = false; + return false; + } + } + this.firing = false; + } + return true; + } + }; +})(); + +Ext.EventManager = function(){ + var docReadyEvent, docReadyProcId, docReadyState = false; + var resizeEvent, resizeTask, textEvent, textSize; + var E = Ext.lib.Event; + var D = Ext.lib.Dom; + + + var fireDocReady = function(){ + if(!docReadyState){ + docReadyState = true; + Ext.isReady = true; + if(docReadyProcId){ + clearInterval(docReadyProcId); + } + if(Ext.isGecko || Ext.isOpera) { + document.removeEventListener("DOMContentLoaded", fireDocReady, false); + } + if(Ext.isIE){ + var defer = document.getElementById("ie-deferred-loader"); + if(defer){ + defer.onreadystatechange = null; + defer.parentNode.removeChild(defer); + } + } + if(docReadyEvent){ + docReadyEvent.fire(); + docReadyEvent.clearListeners(); + } + } + }; + + var initDocReady = function(){ + docReadyEvent = new Ext.util.Event(); + if(Ext.isGecko || Ext.isOpera) { + document.addEventListener("DOMContentLoaded", fireDocReady, false); + }else if(Ext.isIE){ + document.write(""); + var defer = document.getElementById("ie-deferred-loader"); + defer.onreadystatechange = function(){ + if(this.readyState == "complete"){ + fireDocReady(); + } + }; + }else if(Ext.isSafari){ + docReadyProcId = setInterval(function(){ + var rs = document.readyState; + if(rs == "complete") { + fireDocReady(); + } + }, 10); + } + + E.on(window, "load", fireDocReady); + }; + + var createBuffered = function(h, o){ + var task = new Ext.util.DelayedTask(h); + return function(e){ + + e = new Ext.EventObjectImpl(e); + task.delay(o.buffer, h, null, [e]); + }; + }; + + var createSingle = function(h, el, ename, fn){ + return function(e){ + Ext.EventManager.removeListener(el, ename, fn); + h(e); + }; + }; + + var createDelayed = function(h, o){ + return function(e){ + + e = new Ext.EventObjectImpl(e); + setTimeout(function(){ + h(e); + }, o.delay || 10); + }; + }; + + var listen = function(element, ename, opt, fn, scope){ + var o = (!opt || typeof opt == "boolean") ? {} : opt; + fn = fn || o.fn; scope = scope || o.scope; + var el = Ext.getDom(element); + if(!el){ + throw "Error listening for \"" + ename + '\". Element "' + element + '" doesn\'t exist.'; + } + var h = function(e){ + e = Ext.EventObject.setEvent(e); + var t; + if(o.delegate){ + t = e.getTarget(o.delegate, el); + if(!t){ + return; + } + }else{ + t = e.target; + } + if(o.stopEvent === true){ + e.stopEvent(); + } + if(o.preventDefault === true){ + e.preventDefault(); + } + if(o.stopPropagation === true){ + e.stopPropagation(); + } + + if(o.normalized === false){ + e = e.browserEvent; + } + + fn.call(scope || el, e, t, o); + }; + if(o.delay){ + h = createDelayed(h, o); + } + if(o.single){ + h = createSingle(h, el, ename, fn); + } + if(o.buffer){ + h = createBuffered(h, o); + } + fn._handlers = fn._handlers || []; + fn._handlers.push([Ext.id(el), ename, h]); + + E.on(el, ename, h); + if(ename == "mousewheel" && el.addEventListener){ + el.addEventListener("DOMMouseScroll", h, false); + E.on(window, 'unload', function(){ + el.removeEventListener("DOMMouseScroll", h, false); + }); + } + if(ename == "mousedown" && el == document){ + Ext.EventManager.stoppedMouseDownEvent.addListener(h); + } + return h; + }; + + var stopListening = function(el, ename, fn){ + var id = Ext.id(el), hds = fn._handlers, hd = fn; + if(hds){ + for(var i = 0, len = hds.length; i < len; i++){ + var h = hds[i]; + if(h[0] == id && h[1] == ename){ + hd = h[2]; + hds.splice(i, 1); + break; + } + } + } + E.un(el, ename, hd); + el = Ext.getDom(el); + if(ename == "mousewheel" && el.addEventListener){ + el.removeEventListener("DOMMouseScroll", hd, false); + } + if(ename == "mousedown" && el == document){ + Ext.EventManager.stoppedMouseDownEvent.removeListener(hd); + } + }; + + var propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/; + var pub = { + + + wrap : function(fn, scope, override){ + return function(e){ + Ext.EventObject.setEvent(e); + fn.call(override ? scope || window : window, Ext.EventObject, scope); + }; + }, + + + addListener : function(element, eventName, fn, scope, options){ + if(typeof eventName == "object"){ + var o = eventName; + for(var e in o){ + if(propRe.test(e)){ + continue; + } + if(typeof o[e] == "function"){ + + listen(element, e, o, o[e], o.scope); + }else{ + + listen(element, e, o[e]); + } + } + return; + } + return listen(element, eventName, options, fn, scope); + }, + + + removeListener : function(element, eventName, fn){ + return stopListening(element, eventName, fn); + }, + + + onDocumentReady : function(fn, scope, options){ + if(docReadyState){ + docReadyEvent.addListener(fn, scope, options); + docReadyEvent.fire(); + docReadyEvent.clearListeners(); + return; + } + if(!docReadyEvent){ + initDocReady(); + } + docReadyEvent.addListener(fn, scope, options); + }, + + + onWindowResize : function(fn, scope, options){ + if(!resizeEvent){ + resizeEvent = new Ext.util.Event(); + resizeTask = new Ext.util.DelayedTask(function(){ + resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); + }); + E.on(window, "resize", function(){ + if(Ext.isIE){ + resizeTask.delay(50); + }else{ + resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); + } + }); + } + resizeEvent.addListener(fn, scope, options); + }, + + + onTextResize : function(fn, scope, options){ + if(!textEvent){ + textEvent = new Ext.util.Event(); + var textEl = new Ext.Element(document.createElement('div')); + textEl.dom.className = 'x-text-resize'; + textEl.dom.innerHTML = 'X'; + textEl.appendTo(document.body); + textSize = textEl.dom.offsetHeight; + setInterval(function(){ + if(textEl.dom.offsetHeight != textSize){ + textEvent.fire(textSize, textSize = textEl.dom.offsetHeight); + } + }, this.textResizeInterval); + } + textEvent.addListener(fn, scope, options); + }, + + + removeResizeListener : function(fn, scope){ + if(resizeEvent){ + resizeEvent.removeListener(fn, scope); + } + }, + + + fireResize : function(){ + if(resizeEvent){ + resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); + } + }, + + ieDeferSrc : false, + + textResizeInterval : 50 + }; + + pub.on = pub.addListener; + pub.un = pub.removeListener; + + pub.stoppedMouseDownEvent = new Ext.util.Event(); + return pub; +}(); + +Ext.onReady = Ext.EventManager.onDocumentReady; + +Ext.onReady(function(){ + var bd = Ext.get(document.body); + if(!bd){ return; } + + var cls = [ + Ext.isIE ? "ext-ie" + : Ext.isGecko ? "ext-gecko" + : Ext.isOpera ? "ext-opera" + : Ext.isSafari ? "ext-safari" : ""]; + + if(Ext.isMac){ + cls.push("ext-mac"); + } + if(Ext.isLinux){ + cls.push("ext-linux"); + } + if(Ext.isBorderBox){ + cls.push('ext-border-box'); + } + if(Ext.isStrict){ + var p = bd.dom.parentNode; + if(p){ + p.className += ' ext-strict'; + } + } + bd.addClass(cls.join(' ')); +}); + + +Ext.EventObject = function(){ + + var E = Ext.lib.Event; + + + var safariKeys = { + 63234 : 37, + 63235 : 39, + 63232 : 38, + 63233 : 40, + 63276 : 33, + 63277 : 34, + 63272 : 46, + 63273 : 36, + 63275 : 35 + }; + + + var btnMap = Ext.isIE ? {1:0,4:1,2:2} : + (Ext.isSafari ? {1:0,2:1,3:2} : {0:0,1:1,2:2}); + + Ext.EventObjectImpl = function(e){ + if(e){ + this.setEvent(e.browserEvent || e); + } + }; + Ext.EventObjectImpl.prototype = { + + browserEvent : null, + + button : -1, + + shiftKey : false, + + ctrlKey : false, + + altKey : false, + + + BACKSPACE : 8, + + TAB : 9, + + RETURN : 13, + + ENTER : 13, + + SHIFT : 16, + + CONTROL : 17, + + ESC : 27, + + SPACE : 32, + + PAGEUP : 33, + + PAGEDOWN : 34, + + END : 35, + + HOME : 36, + + LEFT : 37, + + UP : 38, + + RIGHT : 39, + + DOWN : 40, + + DELETE : 46, + + F5 : 116, + + + setEvent : function(e){ + if(e == this || (e && e.browserEvent)){ + return e; + } + this.browserEvent = e; + if(e){ + + this.button = e.button ? btnMap[e.button] : (e.which ? e.which-1 : -1); + if(e.type == 'click' && this.button == -1){ + this.button = 0; + } + this.type = e.type; + this.shiftKey = e.shiftKey; + + this.ctrlKey = e.ctrlKey || e.metaKey; + this.altKey = e.altKey; + + this.keyCode = e.keyCode; + this.charCode = e.charCode; + + this.target = E.getTarget(e); + + this.xy = E.getXY(e); + }else{ + this.button = -1; + this.shiftKey = false; + this.ctrlKey = false; + this.altKey = false; + this.keyCode = 0; + this.charCode =0; + this.target = null; + this.xy = [0, 0]; + } + return this; + }, + + + stopEvent : function(){ + if(this.browserEvent){ + if(this.browserEvent.type == 'mousedown'){ + Ext.EventManager.stoppedMouseDownEvent.fire(this); + } + E.stopEvent(this.browserEvent); + } + }, + + + preventDefault : function(){ + if(this.browserEvent){ + E.preventDefault(this.browserEvent); + } + }, + + + isNavKeyPress : function(){ + var k = this.keyCode; + k = Ext.isSafari ? (safariKeys[k] || k) : k; + return (k >= 33 && k <= 40) || k == this.RETURN || k == this.TAB || k == this.ESC; + }, + + isSpecialKey : function(){ + var k = this.keyCode; + return (this.type == 'keypress' && this.ctrlKey) || k == 9 || k == 13 || k == 40 || k == 27 || + (k == 16) || (k == 17) || + (k >= 18 && k <= 20) || + (k >= 33 && k <= 35) || + (k >= 36 && k <= 39) || + (k >= 44 && k <= 45); + }, + + stopPropagation : function(){ + if(this.browserEvent){ + if(this.type == 'mousedown'){ + Ext.EventManager.stoppedMouseDownEvent.fire(this); + } + E.stopPropagation(this.browserEvent); + } + }, + + + getCharCode : function(){ + return this.charCode || this.keyCode; + }, + + + getKey : function(){ + var k = this.keyCode || this.charCode; + return Ext.isSafari ? (safariKeys[k] || k) : k; + }, + + + getPageX : function(){ + return this.xy[0]; + }, + + + getPageY : function(){ + return this.xy[1]; + }, + + + getTime : function(){ + if(this.browserEvent){ + return E.getTime(this.browserEvent); + } + return null; + }, + + + getXY : function(){ + return this.xy; + }, + + + getTarget : function(selector, maxDepth, returnEl){ + return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : this.target; + }, + + getRelatedTarget : function(){ + if(this.browserEvent){ + return E.getRelatedTarget(this.browserEvent); + } + return null; + }, + + + getWheelDelta : function(){ + var e = this.browserEvent; + var delta = 0; + if(e.wheelDelta){ + delta = e.wheelDelta/120; + }else if(e.detail){ + delta = -e.detail/3; + } + return delta; + }, + + + hasModifier : function(){ + return !!((this.ctrlKey || this.altKey) || this.shiftKey); + }, + + + within : function(el, related){ + var t = this[related ? "getRelatedTarget" : "getTarget"](); + return t && Ext.fly(el).contains(t); + }, + + getPoint : function(){ + return new Ext.lib.Point(this.xy[0], this.xy[1]); + } + }; + + return new Ext.EventObjectImpl(); +}(); + + + +(function(){ +var D = Ext.lib.Dom; +var E = Ext.lib.Event; +var A = Ext.lib.Anim; + + +var propCache = {}; +var camelRe = /(-[a-z])/gi; +var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); }; +var view = document.defaultView; + +Ext.Element = function(element, forceNew){ + var dom = typeof element == "string" ? + document.getElementById(element) : element; + if(!dom){ + return null; + } + var id = dom.id; + if(forceNew !== true && id && Ext.Element.cache[id]){ + return Ext.Element.cache[id]; + } + + + this.dom = dom; + + + this.id = id || Ext.id(dom); +}; + +var El = Ext.Element; + +El.prototype = { + + originalDisplay : "", + + visibilityMode : 1, + + defaultUnit : "px", + + setVisibilityMode : function(visMode){ + this.visibilityMode = visMode; + return this; + }, + + enableDisplayMode : function(display){ + this.setVisibilityMode(El.DISPLAY); + if(typeof display != "undefined") this.originalDisplay = display; + return this; + }, + + + findParent : function(simpleSelector, maxDepth, returnEl){ + var p = this.dom, b = document.body, depth = 0, dq = Ext.DomQuery, stopEl; + maxDepth = maxDepth || 50; + if(typeof maxDepth != "number"){ + stopEl = Ext.getDom(maxDepth); + maxDepth = 10; + } + while(p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl){ + if(dq.is(p, simpleSelector)){ + return returnEl ? Ext.get(p) : p; + } + depth++; + p = p.parentNode; + } + return null; + }, + + + + findParentNode : function(simpleSelector, maxDepth, returnEl){ + var p = Ext.fly(this.dom.parentNode, '_internal'); + return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null; + }, + + + up : function(simpleSelector, maxDepth){ + return this.findParentNode(simpleSelector, maxDepth, true); + }, + + + + + is : function(simpleSelector){ + return Ext.DomQuery.is(this.dom, simpleSelector); + }, + + + animate : function(args, duration, onComplete, easing, animType){ + this.anim(args, {duration: duration, callback: onComplete, easing: easing}, animType); + return this; + }, + + + anim : function(args, opt, animType, defaultDur, defaultEase, cb){ + animType = animType || 'run'; + opt = opt || {}; + var anim = Ext.lib.Anim[animType]( + this.dom, args, + (opt.duration || defaultDur) || .35, + (opt.easing || defaultEase) || 'easeOut', + function(){ + Ext.callback(cb, this); + Ext.callback(opt.callback, opt.scope || this, [this, opt]); + }, + this + ); + opt.anim = anim; + return anim; + }, + + + preanim : function(a, i){ + return !a[i] ? false : (typeof a[i] == "object" ? a[i]: {duration: a[i+1], callback: a[i+2], easing: a[i+3]}); + }, + + + clean : function(forceReclean){ + if(this.isCleaned && forceReclean !== true){ + return this; + } + var ns = /\S/; + var d = this.dom, n = d.firstChild, ni = -1; + while(n){ + var nx = n.nextSibling; + if(n.nodeType == 3 && !ns.test(n.nodeValue)){ + d.removeChild(n); + }else{ + n.nodeIndex = ++ni; + } + n = nx; + } + this.isCleaned = true; + return this; + }, + + + calcOffsetsTo : function(el){ + el = Ext.get(el); + var d = el.dom; + var restorePos = false; + if(el.getStyle('position') == 'static'){ + el.position('relative'); + restorePos = true; + } + var x = 0, y =0; + var op = this.dom; + while(op && op != d && op.tagName != 'HTML'){ + x+= op.offsetLeft; + y+= op.offsetTop; + op = op.offsetParent; + } + if(restorePos){ + el.position('static'); + } + return [x, y]; + }, + + + scrollIntoView : function(container, hscroll){ + var c = Ext.getDom(container) || document.body; + var el = this.dom; + + var o = this.calcOffsetsTo(c), + l = o[0], + t = o[1], + b = t+el.offsetHeight, + r = l+el.offsetWidth; + + var ch = c.clientHeight; + var ct = parseInt(c.scrollTop, 10); + var cl = parseInt(c.scrollLeft, 10); + var cb = ct + ch; + var cr = cl + c.clientWidth; + + if(t < ct){ + c.scrollTop = t; + }else if(b > cb){ + c.scrollTop = b-ch; + } + + if(hscroll !== false){ + if(l < cl){ + c.scrollLeft = l; + }else if(r > cr){ + c.scrollLeft = r-c.clientWidth; + } + } + return this; + }, + + + scrollChildIntoView : function(child, hscroll){ + Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll); + }, + + + autoHeight : function(animate, duration, onComplete, easing){ + var oldHeight = this.getHeight(); + this.clip(); + this.setHeight(1); + setTimeout(function(){ + var height = parseInt(this.dom.scrollHeight, 10); + if(!animate){ + this.setHeight(height); + this.unclip(); + if(typeof onComplete == "function"){ + onComplete(); + } + }else{ + this.setHeight(oldHeight); + this.setHeight(height, animate, duration, function(){ + this.unclip(); + if(typeof onComplete == "function") onComplete(); + }.createDelegate(this), easing); + } + }.createDelegate(this), 0); + return this; + }, + + + contains : function(el){ + if(!el){return false;} + return D.isAncestor(this.dom, el.dom ? el.dom : el); + }, + + + isVisible : function(deep) { + var vis = !(this.getStyle("visibility") == "hidden" || this.getStyle("display") == "none"); + if(deep !== true || !vis){ + return vis; + } + var p = this.dom.parentNode; + while(p && p.tagName.toLowerCase() != "body"){ + if(!Ext.fly(p, '_isVisible').isVisible()){ + return false; + } + p = p.parentNode; + } + return true; + }, + + + select : function(selector, unique){ + return El.select(selector, unique, this.dom); + }, + + + query : function(selector, unique){ + return Ext.DomQuery.select(selector, this.dom); + }, + + + child : function(selector, returnDom){ + var n = Ext.DomQuery.selectNode(selector, this.dom); + return returnDom ? n : Ext.get(n); + }, + + + down : function(selector, returnDom){ + var n = Ext.DomQuery.selectNode(" > " + selector, this.dom); + return returnDom ? n : Ext.get(n); + }, + + + initDD : function(group, config, overrides){ + var dd = new Ext.dd.DD(Ext.id(this.dom), group, config); + return Ext.apply(dd, overrides); + }, + + + initDDProxy : function(group, config, overrides){ + var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config); + return Ext.apply(dd, overrides); + }, + + + initDDTarget : function(group, config, overrides){ + var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config); + return Ext.apply(dd, overrides); + }, + + + setVisible : function(visible, animate){ + if(!animate || !A){ + if(this.visibilityMode == El.DISPLAY){ + this.setDisplayed(visible); + }else{ + this.fixDisplay(); + this.dom.style.visibility = visible ? "visible" : "hidden"; + } + }else{ + + var dom = this.dom; + var visMode = this.visibilityMode; + if(visible){ + this.setOpacity(.01); + this.setVisible(true); + } + this.anim({opacity: { to: (visible?1:0) }}, + this.preanim(arguments, 1), + null, .35, 'easeIn', function(){ + if(!visible){ + if(visMode == El.DISPLAY){ + dom.style.display = "none"; + }else{ + dom.style.visibility = "hidden"; + } + Ext.get(dom).setOpacity(1); + } + }); + } + return this; + }, + + + isDisplayed : function() { + return this.getStyle("display") != "none"; + }, + + + toggle : function(animate){ + this.setVisible(!this.isVisible(), this.preanim(arguments, 0)); + return this; + }, + + + setDisplayed : function(value) { + if(typeof value == "boolean"){ + value = value ? this.originalDisplay : "none"; + } + this.setStyle("display", value); + return this; + }, + + + focus : function() { + try{ + this.dom.focus(); + }catch(e){} + return this; + }, + + + blur : function() { + try{ + this.dom.blur(); + }catch(e){} + return this; + }, + + + addClass : function(className){ + if(className instanceof Array){ + for(var i = 0, len = className.length; i < len; i++) { + this.addClass(className[i]); + } + }else{ + if(className && !this.hasClass(className)){ + this.dom.className = this.dom.className + " " + className; + } + } + return this; + }, + + + radioClass : function(className){ + var siblings = this.dom.parentNode.childNodes; + for(var i = 0; i < siblings.length; i++) { + var s = siblings[i]; + if(s.nodeType == 1){ + Ext.get(s).removeClass(className); + } + } + this.addClass(className); + return this; + }, + + + removeClass : function(className){ + if(!className || !this.dom.className){ + return this; + } + if(className instanceof Array){ + for(var i = 0, len = className.length; i < len; i++) { + this.removeClass(className[i]); + } + }else{ + if(this.hasClass(className)){ + var re = this.classReCache[className]; + if (!re) { + re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', "g"); + this.classReCache[className] = re; + } + this.dom.className = + this.dom.className.replace(re, " "); + } + } + return this; + }, + + + classReCache: {}, + + + toggleClass : function(className){ + if(this.hasClass(className)){ + this.removeClass(className); + }else{ + this.addClass(className); + } + return this; + }, + + + hasClass : function(className){ + return className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1; + }, + + + replaceClass : function(oldClassName, newClassName){ + this.removeClass(oldClassName); + this.addClass(newClassName); + return this; + }, + + + getStyles : function(){ + var a = arguments, len = a.length, r = {}; + for(var i = 0; i < len; i++){ + r[a[i]] = this.getStyle(a[i]); + } + return r; + }, + + + getStyle : function(){ + return view && view.getComputedStyle ? + function(prop){ + var el = this.dom, v, cs, camel; + if(prop == 'float'){ + prop = "cssFloat"; + } + if(v = el.style[prop]){ + return v; + } + if(cs = view.getComputedStyle(el, "")){ + if(!(camel = propCache[prop])){ + camel = propCache[prop] = prop.replace(camelRe, camelFn); + } + return cs[camel]; + } + return null; + } : + function(prop){ + var el = this.dom, v, cs, camel; + if(prop == 'opacity'){ + if(typeof el.style.filter == 'string'){ + var m = el.style.filter.match(/alpha\(opacity=(.*)\)/i); + if(m){ + var fv = parseFloat(m[1]); + if(!isNaN(fv)){ + return fv ? fv / 100 : 0; + } + } + } + return 1; + }else if(prop == 'float'){ + prop = "styleFloat"; + } + if(!(camel = propCache[prop])){ + camel = propCache[prop] = prop.replace(camelRe, camelFn); + } + if(v = el.style[camel]){ + return v; + } + if(cs = el.currentStyle){ + return cs[camel]; + } + return null; + }; + }(), + + + setStyle : function(prop, value){ + if(typeof prop == "string"){ + var camel; + if(!(camel = propCache[prop])){ + camel = propCache[prop] = prop.replace(camelRe, camelFn); + } + if(camel == 'opacity') { + this.setOpacity(value); + }else{ + this.dom.style[camel] = value; + } + }else{ + for(var style in prop){ + if(typeof prop[style] != "function"){ + this.setStyle(style, prop[style]); + } + } + } + return this; + }, + + + applyStyles : function(style){ + Ext.DomHelper.applyStyles(this.dom, style); + return this; + }, + + + getX : function(){ + return D.getX(this.dom); + }, + + + getY : function(){ + return D.getY(this.dom); + }, + + + getXY : function(){ + return D.getXY(this.dom); + }, + + + setX : function(x, animate){ + if(!animate || !A){ + D.setX(this.dom, x); + }else{ + this.setXY([x, this.getY()], this.preanim(arguments, 1)); + } + return this; + }, + + + setY : function(y, animate){ + if(!animate || !A){ + D.setY(this.dom, y); + }else{ + this.setXY([this.getX(), y], this.preanim(arguments, 1)); + } + return this; + }, + + + setLeft : function(left){ + this.setStyle("left", this.addUnits(left)); + return this; + }, + + + setTop : function(top){ + this.setStyle("top", this.addUnits(top)); + return this; + }, + + + setRight : function(right){ + this.setStyle("right", this.addUnits(right)); + return this; + }, + + + setBottom : function(bottom){ + this.setStyle("bottom", this.addUnits(bottom)); + return this; + }, + + + setXY : function(pos, animate){ + if(!animate || !A){ + D.setXY(this.dom, pos); + }else{ + this.anim({points: {to: pos}}, this.preanim(arguments, 1), 'motion'); + } + return this; + }, + + + setLocation : function(x, y, animate){ + this.setXY([x, y], this.preanim(arguments, 2)); + return this; + }, + + + moveTo : function(x, y, animate){ + this.setXY([x, y], this.preanim(arguments, 2)); + return this; + }, + + + getRegion : function(){ + return D.getRegion(this.dom); + }, + + + getHeight : function(contentHeight){ + var h = this.dom.offsetHeight || 0; + return contentHeight !== true ? h : h-this.getBorderWidth("tb")-this.getPadding("tb"); + }, + + + getWidth : function(contentWidth){ + var w = this.dom.offsetWidth || 0; + return contentWidth !== true ? w : w-this.getBorderWidth("lr")-this.getPadding("lr"); + }, + + + getComputedHeight : function(){ + var h = Math.max(this.dom.offsetHeight, this.dom.clientHeight); + if(!h){ + h = parseInt(this.getStyle('height'), 10) || 0; + if(!this.isBorderBox()){ + h += this.getFrameWidth('tb'); + } + } + return h; + }, + + + getComputedWidth : function(){ + var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth); + if(!w){ + w = parseInt(this.getStyle('width'), 10) || 0; + if(!this.isBorderBox()){ + w += this.getFrameWidth('lr'); + } + } + return w; + }, + + + getSize : function(contentSize){ + return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)}; + }, + + + getViewSize : function(){ + var d = this.dom, doc = document, aw = 0, ah = 0; + if(d == doc || d == doc.body){ + return {width : D.getViewWidth(), height: D.getViewHeight()}; + }else{ + return { + width : d.clientWidth, + height: d.clientHeight + }; + } + }, + + + getValue : function(asNumber){ + return asNumber ? parseInt(this.dom.value, 10) : this.dom.value; + }, + + + adjustWidth : function(width){ + if(typeof width == "number"){ + if(this.autoBoxAdjust && !this.isBorderBox()){ + width -= (this.getBorderWidth("lr") + this.getPadding("lr")); + } + if(width < 0){ + width = 0; + } + } + return width; + }, + + + adjustHeight : function(height){ + if(typeof height == "number"){ + if(this.autoBoxAdjust && !this.isBorderBox()){ + height -= (this.getBorderWidth("tb") + this.getPadding("tb")); + } + if(height < 0){ + height = 0; + } + } + return height; + }, + + + setWidth : function(width, animate){ + width = this.adjustWidth(width); + if(!animate || !A){ + this.dom.style.width = this.addUnits(width); + }else{ + this.anim({width: {to: width}}, this.preanim(arguments, 1)); + } + return this; + }, + + + setHeight : function(height, animate){ + height = this.adjustHeight(height); + if(!animate || !A){ + this.dom.style.height = this.addUnits(height); + }else{ + this.anim({height: {to: height}}, this.preanim(arguments, 1)); + } + return this; + }, + + + setSize : function(width, height, animate){ + if(typeof width == "object"){ + height = width.height; width = width.width; + } + width = this.adjustWidth(width); height = this.adjustHeight(height); + if(!animate || !A){ + this.dom.style.width = this.addUnits(width); + this.dom.style.height = this.addUnits(height); + }else{ + this.anim({width: {to: width}, height: {to: height}}, this.preanim(arguments, 2)); + } + return this; + }, + + + setBounds : function(x, y, width, height, animate){ + if(!animate || !A){ + this.setSize(width, height); + this.setLocation(x, y); + }else{ + width = this.adjustWidth(width); height = this.adjustHeight(height); + this.anim({points: {to: [x, y]}, width: {to: width}, height: {to: height}}, + this.preanim(arguments, 4), 'motion'); + } + return this; + }, + + + setRegion : function(region, animate){ + this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, this.preanim(arguments, 1)); + return this; + }, + + + addListener : function(eventName, fn, scope, options){ + Ext.EventManager.on(this.dom, eventName, fn, scope || this, options); + }, + + + removeListener : function(eventName, fn){ + Ext.EventManager.removeListener(this.dom, eventName, fn); + return this; + }, + + + removeAllListeners : function(){ + E.purgeElement(this.dom); + return this; + }, + + relayEvent : function(eventName, observable){ + this.on(eventName, function(e){ + observable.fireEvent(eventName, e); + }); + }, + + + setOpacity : function(opacity, animate){ + if(!animate || !A){ + var s = this.dom.style; + if(Ext.isIE){ + s.zoom = 1; + s.filter = (s.filter || '').replace(/alpha\([^\)]*\)/gi,"") + + (opacity == 1 ? "" : "alpha(opacity=" + opacity * 100 + ")"); + }else{ + s.opacity = opacity; + } + }else{ + this.anim({opacity: {to: opacity}}, this.preanim(arguments, 1), null, .35, 'easeIn'); + } + return this; + }, + + + getLeft : function(local){ + if(!local){ + return this.getX(); + }else{ + return parseInt(this.getStyle("left"), 10) || 0; + } + }, + + + getRight : function(local){ + if(!local){ + return this.getX() + this.getWidth(); + }else{ + return (this.getLeft(true) + this.getWidth()) || 0; + } + }, + + + getTop : function(local) { + if(!local){ + return this.getY(); + }else{ + return parseInt(this.getStyle("top"), 10) || 0; + } + }, + + + getBottom : function(local){ + if(!local){ + return this.getY() + this.getHeight(); + }else{ + return (this.getTop(true) + this.getHeight()) || 0; + } + }, + + + position : function(pos, zIndex, x, y){ + if(!pos){ + if(this.getStyle('position') == 'static'){ + this.setStyle('position', 'relative'); + } + }else{ + this.setStyle("position", pos); + } + if(zIndex){ + this.setStyle("z-index", zIndex); + } + if(x !== undefined && y !== undefined){ + this.setXY([x, y]); + }else if(x !== undefined){ + this.setX(x); + }else if(y !== undefined){ + this.setY(y); + } + }, + + + clearPositioning : function(value){ + value = value ||''; + this.setStyle({ + "left": value, + "right": value, + "top": value, + "bottom": value, + "z-index": "", + "position" : "static" + }); + return this; + }, + + + getPositioning : function(){ + var l = this.getStyle("left"); + var t = this.getStyle("top"); + return { + "position" : this.getStyle("position"), + "left" : l, + "right" : l ? "" : this.getStyle("right"), + "top" : t, + "bottom" : t ? "" : this.getStyle("bottom"), + "z-index" : this.getStyle("z-index") + }; + }, + + + getBorderWidth : function(side){ + return this.addStyles(side, El.borders); + }, + + + getPadding : function(side){ + return this.addStyles(side, El.paddings); + }, + + + setPositioning : function(pc){ + this.applyStyles(pc); + if(pc.right == "auto"){ + this.dom.style.right = ""; + } + if(pc.bottom == "auto"){ + this.dom.style.bottom = ""; + } + return this; + }, + + + fixDisplay : function(){ + if(this.getStyle("display") == "none"){ + this.setStyle("visibility", "hidden"); + this.setStyle("display", this.originalDisplay); + if(this.getStyle("display") == "none"){ + this.setStyle("display", "block"); + } + } + }, + + + setLeftTop : function(left, top){ + this.dom.style.left = this.addUnits(left); + this.dom.style.top = this.addUnits(top); + return this; + }, + + + move : function(direction, distance, animate){ + var xy = this.getXY(); + direction = direction.toLowerCase(); + switch(direction){ + case "l": + case "left": + this.moveTo(xy[0]-distance, xy[1], this.preanim(arguments, 2)); + break; + case "r": + case "right": + this.moveTo(xy[0]+distance, xy[1], this.preanim(arguments, 2)); + break; + case "t": + case "top": + case "up": + this.moveTo(xy[0], xy[1]-distance, this.preanim(arguments, 2)); + break; + case "b": + case "bottom": + case "down": + this.moveTo(xy[0], xy[1]+distance, this.preanim(arguments, 2)); + break; + } + return this; + }, + + + clip : function(){ + if(!this.isClipped){ + this.isClipped = true; + this.originalClip = { + "o": this.getStyle("overflow"), + "x": this.getStyle("overflow-x"), + "y": this.getStyle("overflow-y") + }; + this.setStyle("overflow", "hidden"); + this.setStyle("overflow-x", "hidden"); + this.setStyle("overflow-y", "hidden"); + } + return this; + }, + + + unclip : function(){ + if(this.isClipped){ + this.isClipped = false; + var o = this.originalClip; + if(o.o){this.setStyle("overflow", o.o);} + if(o.x){this.setStyle("overflow-x", o.x);} + if(o.y){this.setStyle("overflow-y", o.y);} + } + return this; + }, + + + + getAnchorXY : function(anchor, local, s){ + + + + var w, h, vp = false; + if(!s){ + var d = this.dom; + if(d == document.body || d == document){ + vp = true; + w = D.getViewWidth(); h = D.getViewHeight(); + }else{ + w = this.getWidth(); h = this.getHeight(); + } + }else{ + w = s.width; h = s.height; + } + var x = 0, y = 0, r = Math.round; + switch((anchor || "tl").toLowerCase()){ + case "c": + x = r(w*.5); + y = r(h*.5); + break; + case "t": + x = r(w*.5); + y = 0; + break; + case "l": + x = 0; + y = r(h*.5); + break; + case "r": + x = w; + y = r(h*.5); + break; + case "b": + x = r(w*.5); + y = h; + break; + case "tl": + x = 0; + y = 0; + break; + case "bl": + x = 0; + y = h; + break; + case "br": + x = w; + y = h; + break; + case "tr": + x = w; + y = 0; + break; + } + if(local === true){ + return [x, y]; + } + if(vp){ + var sc = this.getScroll(); + return [x + sc.left, y + sc.top]; + } + + var o = this.getXY(); + return [x+o[0], y+o[1]]; + }, + + + getAlignToXY : function(el, p, o){ + el = Ext.get(el); + var d = this.dom; + if(!el.dom){ + throw "Element.alignTo with an element that doesn't exist"; + } + var c = false; + var p1 = "", p2 = ""; + o = o || [0,0]; + + if(!p){ + p = "tl-bl"; + }else if(p == "?"){ + p = "tl-bl?"; + }else if(p.indexOf("-") == -1){ + p = "tl-" + p; + } + p = p.toLowerCase(); + var m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/); + if(!m){ + throw "Element.alignTo with an invalid alignment " + p; + } + p1 = m[1]; p2 = m[2]; c = !!m[3]; + + + + var a1 = this.getAnchorXY(p1, true); + var a2 = el.getAnchorXY(p2, false); + var x = a2[0] - a1[0] + o[0]; + var y = a2[1] - a1[1] + o[1]; + if(c){ + + var w = this.getWidth(), h = this.getHeight(), r = el.getRegion(); + + var dw = D.getViewWidth()-5, dh = D.getViewHeight()-5; + + + + + var p1y = p1.charAt(0), p1x = p1.charAt(p1.length-1); + var p2y = p2.charAt(0), p2x = p2.charAt(p2.length-1); + var swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t")); + var swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r")); + + var doc = document; + var scrollX = (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0)+5; + var scrollY = (doc.documentElement.scrollTop || doc.body.scrollTop || 0)+5; + + if((x+w) > dw + scrollX){ + x = swapX ? r.left-w : dw+scrollX-w; + } + if(x < scrollX){ + x = swapX ? r.right : scrollX; + } + if((y+h) > dh + scrollY){ + y = swapY ? r.top-h : dh+scrollY-h; + } + if (y < scrollY){ + y = swapY ? r.bottom : scrollY; + } + } + return [x,y]; + }, + + + getConstrainToXY : function(){ + var os = {top:0, left:0, bottom:0, right: 0}; + + return function(el, local, offsets, proposedXY){ + el = Ext.get(el); + offsets = offsets ? Ext.applyIf(offsets, os) : os; + + var vw, vh, vx = 0, vy = 0; + if(el.dom == document.body || el.dom == document){ + vw = Ext.lib.Dom.getViewWidth(); + vh = Ext.lib.Dom.getViewHeight(); + }else{ + vw = el.dom.clientWidth; + vh = el.dom.clientHeight; + if(!local){ + var vxy = el.getXY(); + vx = vxy[0]; + vy = vxy[1]; + } + } + + var s = el.getScroll(); + + vx += offsets.left + s.left; + vy += offsets.top + s.top; + + vw -= offsets.right; + vh -= offsets.bottom; + + var vr = vx+vw; + var vb = vy+vh; + + var xy = proposedXY || (!local ? this.getXY() : [this.getLeft(true), this.getTop(true)]); + var x = xy[0], y = xy[1]; + var w = this.dom.offsetWidth, h = this.dom.offsetHeight; + + + var moved = false; + + + if((x + w) > vr){ + x = vr - w; + moved = true; + } + if((y + h) > vb){ + y = vb - h; + moved = true; + } + + if(x < vx){ + x = vx; + moved = true; + } + if(y < vy){ + y = vy; + moved = true; + } + return moved ? [x, y] : false; + }; + }(), + + + adjustForConstraints : function(xy, parent, offsets){ + return this.getConstrainToXY(parent || document, false, offsets, xy) || xy; + }, + + + alignTo : function(element, position, offsets, animate){ + var xy = this.getAlignToXY(element, position, offsets); + this.setXY(xy, this.preanim(arguments, 3)); + return this; + }, + + + anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){ + var action = function(){ + this.alignTo(el, alignment, offsets, animate); + Ext.callback(callback, this); + }; + Ext.EventManager.onWindowResize(action, this); + var tm = typeof monitorScroll; + if(tm != 'undefined'){ + Ext.EventManager.on(window, 'scroll', action, this, + {buffer: tm == 'number' ? monitorScroll : 50}); + } + action.call(this); + return this; + }, + + clearOpacity : function(){ + if (window.ActiveXObject) { + if(typeof this.dom.style.filter == 'string' && (/alpha/i).test(this.dom.style.filter)){ + this.dom.style.filter = ""; + } + } else { + this.dom.style.opacity = ""; + this.dom.style["-moz-opacity"] = ""; + this.dom.style["-khtml-opacity"] = ""; + } + return this; + }, + + + hide : function(animate){ + this.setVisible(false, this.preanim(arguments, 0)); + return this; + }, + + + show : function(animate){ + this.setVisible(true, this.preanim(arguments, 0)); + return this; + }, + + + addUnits : function(size){ + return Ext.Element.addUnits(size, this.defaultUnit); + }, + + + beginMeasure : function(){ + var el = this.dom; + if(el.offsetWidth || el.offsetHeight){ + return this; + } + var changed = []; + var p = this.dom, b = document.body; + while((!el.offsetWidth && !el.offsetHeight) && p && p.tagName && p != b){ + var pe = Ext.get(p); + if(pe.getStyle('display') == 'none'){ + changed.push({el: p, visibility: pe.getStyle("visibility")}); + p.style.visibility = "hidden"; + p.style.display = "block"; + } + p = p.parentNode; + } + this._measureChanged = changed; + return this; + + }, + + + endMeasure : function(){ + var changed = this._measureChanged; + if(changed){ + for(var i = 0, len = changed.length; i < len; i++) { + var r = changed[i]; + r.el.style.visibility = r.visibility; + r.el.style.display = "none"; + } + this._measureChanged = null; + } + return this; + }, + + + update : function(html, loadScripts, callback){ + if(typeof html == "undefined"){ + html = ""; + } + if(loadScripts !== true){ + this.dom.innerHTML = html; + if(typeof callback == "function"){ + callback(); + } + return this; + } + var id = Ext.id(); + var dom = this.dom; + + html += ''; + + E.onAvailable(id, function(){ + var hd = document.getElementsByTagName("head")[0]; + var re = /(?:]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig; + var srcRe = /\ssrc=([\'\"])(.*?)\1/i; + var typeRe = /\stype=([\'\"])(.*?)\1/i; + + var match; + while(match = re.exec(html)){ + var attrs = match[1]; + var srcMatch = attrs ? attrs.match(srcRe) : false; + if(srcMatch && srcMatch[2]){ + var s = document.createElement("script"); + s.src = srcMatch[2]; + var 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]); + } + } + } + var el = document.getElementById(id); + if(el){el.parentNode.removeChild(el);} + if(typeof callback == "function"){ + callback(); + } + }); + dom.innerHTML = html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/ig, ""); + return this; + }, + + + load : function(){ + var um = this.getUpdateManager(); + um.update.apply(um, arguments); + return this; + }, + + + getUpdateManager : function(){ + if(!this.updateManager){ + this.updateManager = new Ext.UpdateManager(this); + } + return this.updateManager; + }, + + + unselectable : function(){ + this.dom.unselectable = "on"; + this.swallowEvent("selectstart", true); + this.applyStyles("-moz-user-select:none;-khtml-user-select:none;"); + this.addClass("x-unselectable"); + return this; + }, + + + getCenterXY : function(){ + return this.getAlignToXY(document, 'c-c'); + }, + + + center : function(centerIn){ + this.alignTo(centerIn || document, 'c-c'); + return this; + }, + + + isBorderBox : function(){ + return noBoxAdjust[this.dom.tagName.toLowerCase()] || Ext.isBorderBox; + }, + + + getBox : function(contentBox, local){ + var xy; + if(!local){ + xy = this.getXY(); + }else{ + var left = parseInt(this.getStyle("left"), 10) || 0; + var top = parseInt(this.getStyle("top"), 10) || 0; + xy = [left, top]; + } + var el = this.dom, w = el.offsetWidth, h = el.offsetHeight, bx; + if(!contentBox){ + bx = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: w, height: h}; + }else{ + var l = this.getBorderWidth("l")+this.getPadding("l"); + var r = this.getBorderWidth("r")+this.getPadding("r"); + var t = this.getBorderWidth("t")+this.getPadding("t"); + var b = this.getBorderWidth("b")+this.getPadding("b"); + bx = {x: xy[0]+l, y: xy[1]+t, 0: xy[0]+l, 1: xy[1]+t, width: w-(l+r), height: h-(t+b)}; + } + bx.right = bx.x + bx.width; + bx.bottom = bx.y + bx.height; + return bx; + }, + + + getFrameWidth : function(sides, onlyContentBox){ + return onlyContentBox && Ext.isBorderBox ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides)); + }, + + + setBox : function(box, adjust, animate){ + var w = box.width, h = box.height; + if((adjust && !this.autoBoxAdjust) && !this.isBorderBox()){ + w -= (this.getBorderWidth("lr") + this.getPadding("lr")); + h -= (this.getBorderWidth("tb") + this.getPadding("tb")); + } + this.setBounds(box.x, box.y, w, h, this.preanim(arguments, 2)); + return this; + }, + + + repaint : function(){ + var dom = this.dom; + this.addClass("x-repaint"); + setTimeout(function(){ + Ext.get(dom).removeClass("x-repaint"); + }, 1); + return this; + }, + + + getMargins : function(side){ + if(!side){ + return { + top: parseInt(this.getStyle("margin-top"), 10) || 0, + left: parseInt(this.getStyle("margin-left"), 10) || 0, + bottom: parseInt(this.getStyle("margin-bottom"), 10) || 0, + right: parseInt(this.getStyle("margin-right"), 10) || 0 + }; + }else{ + return this.addStyles(side, El.margins); + } + }, + + + addStyles : function(sides, styles){ + var val = 0, v, w; + for(var i = 0, len = sides.length; i < len; i++){ + v = this.getStyle(styles[sides.charAt(i)]); + if(v){ + w = parseInt(v, 10); + if(w){ val += w; } + } + } + return val; + }, + + + createProxy : function(config, renderTo, matchBox){ + if(renderTo){ + renderTo = Ext.getDom(renderTo); + }else{ + renderTo = document.body; + } + config = typeof config == "object" ? + config : {tag : "div", cls: config}; + var proxy = Ext.DomHelper.append(renderTo, config, true); + if(matchBox){ + proxy.setBox(this.getBox()); + } + return proxy; + }, + + + mask : function(msg, msgCls){ + if(this.getStyle("position") == "static"){ + this.setStyle("position", "relative"); + } + if(!this._mask){ + this._mask = Ext.DomHelper.append(this.dom, {cls:"ext-el-mask"}, true); + } + this.addClass("x-masked"); + this._mask.setDisplayed(true); + if(typeof msg == 'string'){ + if(!this._maskMsg){ + this._maskMsg = Ext.DomHelper.append(this.dom, {cls:"ext-el-mask-msg", cn:{tag:'div'}}, true); + } + var mm = this._maskMsg; + mm.dom.className = msgCls ? "ext-el-mask-msg " + msgCls : "ext-el-mask-msg"; + mm.dom.firstChild.innerHTML = msg; + mm.setDisplayed(true); + mm.center(this); + } + if(Ext.isIE && !(Ext.isIE7 && Ext.isStrict) && this.getStyle('height') == 'auto'){ + this._mask.setHeight(this.getHeight()); + } + return this._mask; + }, + + + unmask : function(removeEl){ + if(this._mask){ + if(removeEl === true){ + this._mask.remove(); + delete this._mask; + if(this._maskMsg){ + this._maskMsg.remove(); + delete this._maskMsg; + } + }else{ + this._mask.setDisplayed(false); + if(this._maskMsg){ + this._maskMsg.setDisplayed(false); + } + } + } + this.removeClass("x-masked"); + }, + + + isMasked : function(){ + return this._mask && this._mask.isVisible(); + }, + + + createShim : function(){ + var el = document.createElement('iframe'); + el.frameBorder = 'no'; + el.className = 'ext-shim'; + if(Ext.isIE && Ext.isSecure){ + el.src = Ext.SSL_SECURE_URL; + } + var shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom)); + shim.autoBoxAdjust = false; + return shim; + }, + + + remove : function(){ + if(this.dom.parentNode){ + this.dom.parentNode.removeChild(this.dom); + } + delete El.cache[this.dom.id]; + }, + + + addClassOnOver : function(className, preventFlicker){ + this.on("mouseover", function(){ + Ext.fly(this, '_internal').addClass(className); + }, this.dom); + var removeFn = function(e){ + if(preventFlicker !== true || !e.within(this, true)){ + Ext.fly(this, '_internal').removeClass(className); + } + }; + this.on("mouseout", removeFn, this.dom); + return this; + }, + + + addClassOnFocus : function(className){ + this.on("focus", function(){ + Ext.fly(this, '_internal').addClass(className); + }, this.dom); + this.on("blur", function(){ + Ext.fly(this, '_internal').removeClass(className); + }, this.dom); + return this; + }, + + addClassOnClick : function(className){ + var dom = this.dom; + this.on("mousedown", function(){ + Ext.fly(dom, '_internal').addClass(className); + var d = Ext.get(document); + var fn = function(){ + Ext.fly(dom, '_internal').removeClass(className); + d.removeListener("mouseup", fn); + }; + d.on("mouseup", fn); + }); + return this; + }, + + + swallowEvent : function(eventName, preventDefault){ + var fn = function(e){ + e.stopPropagation(); + if(preventDefault){ + e.preventDefault(); + } + }; + if(eventName instanceof Array){ + for(var i = 0, len = eventName.length; i < len; i++){ + this.on(eventName[i], fn); + } + return this; + } + this.on(eventName, fn); + return this; + }, + + + fitToParentDelegate : Ext.emptyFn, + + + fitToParent : function(monitorResize, targetParent) { + Ext.EventManager.removeResizeListener(this.fitToParentDelegate); + this.fitToParentDelegate = Ext.emptyFn; + if (monitorResize === true && !this.dom.parentNode) { + return; + } + var p = Ext.get(targetParent || this.dom.parentNode); + this.setSize(p.getComputedWidth() - p.getFrameWidth('lr'), p.getComputedHeight() - p.getFrameWidth('tb')); + if (monitorResize === true) { + this.fitToParentDelegate = this.fitToParent.createDelegate(this, [true, targetParent]); + Ext.EventManager.onWindowResize(this.fitToParentDelegate); + } + return this; + }, + + + getNextSibling : function(){ + var n = this.dom.nextSibling; + while(n && n.nodeType != 1){ + n = n.nextSibling; + } + return n; + }, + + + getPrevSibling : function(){ + var n = this.dom.previousSibling; + while(n && n.nodeType != 1){ + n = n.previousSibling; + } + return n; + }, + + + + appendChild: function(el){ + el = Ext.get(el); + el.appendTo(this); + return this; + }, + + + createChild: function(config, insertBefore, returnDom){ + config = config || {tag:'div'}; + if(insertBefore){ + return Ext.DomHelper.insertBefore(insertBefore, config, returnDom !== true); + } + return Ext.DomHelper[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, config, returnDom !== true); + }, + + + appendTo: function(el){ + el = Ext.getDom(el); + el.appendChild(this.dom); + return this; + }, + + + insertBefore: function(el){ + el = Ext.getDom(el); + el.parentNode.insertBefore(this.dom, el); + return this; + }, + + + insertAfter: function(el){ + el = Ext.getDom(el); + el.parentNode.insertBefore(this.dom, el.nextSibling); + return this; + }, + + + insertFirst: function(el, returnDom){ + el = el || {}; + if(typeof el == 'object' && !el.nodeType){ + return this.createChild(el, this.dom.firstChild, returnDom); + }else{ + el = Ext.getDom(el); + this.dom.insertBefore(el, this.dom.firstChild); + return !returnDom ? Ext.get(el) : el; + } + }, + + + insertSibling: function(el, where, returnDom){ + where = where ? where.toLowerCase() : 'before'; + el = el || {}; + var rt, refNode = where == 'before' ? this.dom : this.dom.nextSibling; + + if(typeof el == 'object' && !el.nodeType){ + if(where == 'after' && !this.dom.nextSibling){ + rt = Ext.DomHelper.append(this.dom.parentNode, el, !returnDom); + }else{ + rt = Ext.DomHelper[where == 'after' ? 'insertAfter' : 'insertBefore'](this.dom, el, !returnDom); + } + + }else{ + rt = this.dom.parentNode.insertBefore(Ext.getDom(el), + where == 'before' ? this.dom : this.dom.nextSibling); + if(!returnDom){ + rt = Ext.get(rt); + } + } + return rt; + }, + + + wrap: function(config, returnDom){ + if(!config){ + config = {tag: "div"}; + } + var newEl = Ext.DomHelper.insertBefore(this.dom, config, !returnDom); + newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom); + return newEl; + }, + + + replace: function(el){ + el = Ext.get(el); + this.insertBefore(el); + el.remove(); + return this; + }, + + + insertHtml : function(where, html, returnEl){ + var el = Ext.DomHelper.insertHtml(where, this.dom, html); + return returnEl ? Ext.get(el) : el; + }, + + + set : function(o, useSet){ + var el = this.dom; + useSet = typeof useSet == 'undefined' ? (el.setAttribute ? true : false) : useSet; + for(var attr in o){ + if(attr == "style" || typeof o[attr] == "function") continue; + if(attr=="cls"){ + el.className = o["cls"]; + }else{ + if(useSet) el.setAttribute(attr, o[attr]); + else el[attr] = o[attr]; + } + } + if(o.style){ + Ext.DomHelper.applyStyles(el, o.style); + } + return this; + }, + + + addKeyListener : function(key, fn, scope){ + var config; + if(typeof key != "object" || key instanceof Array){ + config = { + key: key, + fn: fn, + scope: scope + }; + }else{ + config = { + key : key.key, + shift : key.shift, + ctrl : key.ctrl, + alt : key.alt, + fn: fn, + scope: scope + }; + } + return new Ext.KeyMap(this, config); + }, + + + addKeyMap : function(config){ + return new Ext.KeyMap(this, config); + }, + + + isScrollable : function(){ + var dom = this.dom; + return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth; + }, + + + + scrollTo : function(side, value, animate){ + var prop = side.toLowerCase() == "left" ? "scrollLeft" : "scrollTop"; + if(!animate || !A){ + this.dom[prop] = value; + }else{ + var to = prop == "scrollLeft" ? [value, this.dom.scrollTop] : [this.dom.scrollLeft, value]; + this.anim({scroll: {"to": to}}, this.preanim(arguments, 2), 'scroll'); + } + return this; + }, + + + scroll : function(direction, distance, animate){ + if(!this.isScrollable()){ + return; + } + var el = this.dom; + var l = el.scrollLeft, t = el.scrollTop; + var w = el.scrollWidth, h = el.scrollHeight; + var cw = el.clientWidth, ch = el.clientHeight; + direction = direction.toLowerCase(); + var scrolled = false; + var a = this.preanim(arguments, 2); + switch(direction){ + case "l": + case "left": + if(w - l > cw){ + var v = Math.min(l + distance, w-cw); + this.scrollTo("left", v, a); + scrolled = true; + } + break; + case "r": + case "right": + if(l > 0){ + var v = Math.max(l - distance, 0); + this.scrollTo("left", v, a); + scrolled = true; + } + break; + case "t": + case "top": + case "up": + if(t > 0){ + var v = Math.max(t - distance, 0); + this.scrollTo("top", v, a); + scrolled = true; + } + break; + case "b": + case "bottom": + case "down": + if(h - t > ch){ + var v = Math.min(t + distance, h-ch); + this.scrollTo("top", v, a); + scrolled = true; + } + break; + } + return scrolled; + }, + + + translatePoints : function(x, y){ + if(typeof x == 'object' || x instanceof Array){ + y = x[1]; x = x[0]; + } + var p = this.getStyle('position'); + var o = this.getXY(); + + var l = parseInt(this.getStyle('left'), 10); + var t = parseInt(this.getStyle('top'), 10); + + if(isNaN(l)){ + l = (p == "relative") ? 0 : this.dom.offsetLeft; + } + if(isNaN(t)){ + t = (p == "relative") ? 0 : this.dom.offsetTop; + } + + return {left: (x - o[0] + l), top: (y - o[1] + t)}; + }, + + + getScroll : function(){ + var d = this.dom, doc = document; + if(d == doc || d == doc.body){ + var l = window.pageXOffset || doc.documentElement.scrollLeft || doc.body.scrollLeft || 0; + var t = window.pageYOffset || doc.documentElement.scrollTop || doc.body.scrollTop || 0; + return {left: l, top: t}; + }else{ + return {left: d.scrollLeft, top: d.scrollTop}; + } + }, + + + getColor : function(attr, defaultValue, prefix){ + var v = this.getStyle(attr); + if(!v || v == "transparent" || v == "inherit") { + return defaultValue; + } + var color = typeof prefix == "undefined" ? "#" : prefix; + if(v.substr(0, 4) == "rgb("){ + var rvs = v.slice(4, v.length -1).split(","); + for(var i = 0; i < 3; i++){ + var h = parseInt(rvs[i]).toString(16); + if(h < 16){ + h = "0" + h; + } + color += h; + } + } else { + if(v.substr(0, 1) == "#"){ + if(v.length == 4) { + for(var i = 1; i < 4; i++){ + var c = v.charAt(i); + color += c + c; + } + }else if(v.length == 7){ + color += v.substr(1); + } + } + } + return(color.length > 5 ? color.toLowerCase() : defaultValue); + }, + + + boxWrap : function(cls){ + cls = cls || 'x-box'; + var el = Ext.get(this.insertHtml('beforeBegin', String.format('
'+El.boxMarkup+'
', cls))); + el.child('.'+cls+'-mc').dom.appendChild(this.dom); + return el; + }, + + + getAttributeNS : Ext.isIE ? function(ns, name){ + var d = this.dom; + var type = typeof d[ns+":"+name]; + if(type != 'undefined' && type != 'unknown'){ + return d[ns+":"+name]; + } + return d[name]; + } : function(ns, name){ + var d = this.dom; + return d.getAttributeNS(ns, name) || d.getAttribute(ns+":"+name) || d.getAttribute(name) || d[name]; + } +}; + +var ep = El.prototype; + + +ep.on = ep.addListener; + +ep.mon = ep.addListener; + + +ep.un = ep.removeListener; + + +ep.autoBoxAdjust = true; + + +El.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i; + + +El.addUnits = function(v, defaultUnit){ + if(v === "" || v == "auto"){ + return v; + } + if(v === undefined){ + return ''; + } + if(typeof v == "number" || !El.unitPattern.test(v)){ + return v + (defaultUnit || 'px'); + } + return v; +}; + + +El.boxMarkup = '
'; + +El.VISIBILITY = 1; + +El.DISPLAY = 2; + +El.borders = {l: "border-left-width", r: "border-right-width", t: "border-top-width", b: "border-bottom-width"}; +El.paddings = {l: "padding-left", r: "padding-right", t: "padding-top", b: "padding-bottom"}; +El.margins = {l: "margin-left", r: "margin-right", t: "margin-top", b: "margin-bottom"}; + + + + +El.cache = {}; + +var docEl; + + +El.get = function(el){ + var ex, elm, id; + if(!el){ return null; } + if(typeof el == "string"){ + if(!(elm = document.getElementById(el))){ + return null; + } + if(ex = El.cache[el]){ + ex.dom = elm; + }else{ + ex = El.cache[el] = new El(elm); + } + return ex; + }else if(el.tagName){ + if(!(id = el.id)){ + id = Ext.id(el); + } + if(ex = El.cache[id]){ + ex.dom = el; + }else{ + ex = El.cache[id] = new El(el); + } + return ex; + }else if(el instanceof El){ + if(el != docEl){ + el.dom = document.getElementById(el.id) || el.dom; + + El.cache[el.id] = el; + } + return el; + }else if(el.isComposite){ + return el; + }else if(el instanceof Array){ + return El.select(el); + }else if(el == document){ + + if(!docEl){ + var f = function(){}; + f.prototype = El.prototype; + docEl = new f(); + docEl.dom = document; + } + return docEl; + } + return null; +}; + + +El.uncache = function(el){ + for(var i = 0, a = arguments, len = a.length; i < len; i++) { + if(a[i]){ + delete El.cache[a[i].id || a[i]]; + } + } +}; + + + + +El.garbageCollect = function(){ + if(!Ext.enableGarbageCollector){ + clearInterval(El.collectorThread); + return; + } + for(var eid in El.cache){ + var el = El.cache[eid], d = el.dom; + + + + + + + + + + + + + + + + + + if(!d || !d.parentNode || (!d.offsetParent && !document.getElementById(eid))){ + delete El.cache[eid]; + if(d && Ext.enableListenerCollection){ + E.purgeElement(d); + } + } + } +} +El.collectorThreadId = setInterval(El.garbageCollect, 30000); + + + +El.Flyweight = function(dom){ + this.dom = dom; +}; +El.Flyweight.prototype = El.prototype; + +El._flyweights = {}; + +El.fly = function(el, named){ + named = named || '_global'; + el = Ext.getDom(el); + if(!el){ + return null; + } + if(!El._flyweights[named]){ + El._flyweights[named] = new El.Flyweight(); + } + El._flyweights[named].dom = el; + return El._flyweights[named]; +}; + + +Ext.get = El.get; + +Ext.fly = El.fly; + + +var noBoxAdjust = Ext.isStrict ? { + select:1 +} : { + input:1, select:1, textarea:1 +}; +if(Ext.isIE || Ext.isGecko){ + noBoxAdjust['button'] = 1; +} + + +Ext.EventManager.on(window, 'unload', function(){ + delete El.cache; + delete El._flyweights; +}); +})(); + +Ext.enableFx = true; + + +Ext.Fx = { + + slideIn : function(anchor, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + + anchor = anchor || "t"; + + this.fixDisplay(); + + var r = this.getFxRestore(); + var b = this.getBox(); + this.setSize(b); + + var wrap = this.fxWrap(r.pos, o, "hidden"); + + var st = this.dom.style; + st.visibility = "visible"; + st.position = "absolute"; + + var after = function(){ + el.fxUnwrap(wrap, r.pos, o); + st.width = r.width; + st.height = r.height; + el.afterFx(o); + }; + var a, pt = {to: [b.x, b.y]}, bw = {to: b.width}, bh = {to: b.height}; + + switch(anchor.toLowerCase()){ + case "t": + wrap.setSize(b.width, 0); + st.left = st.bottom = "0"; + a = {height: bh}; + break; + case "l": + wrap.setSize(0, b.height); + st.right = st.top = "0"; + a = {width: bw}; + break; + case "r": + wrap.setSize(0, b.height); + wrap.setX(b.right); + st.left = st.top = "0"; + a = {width: bw, points: pt}; + break; + case "b": + wrap.setSize(b.width, 0); + wrap.setY(b.bottom); + st.left = st.top = "0"; + a = {height: bh, points: pt}; + break; + case "tl": + wrap.setSize(0, 0); + st.right = st.bottom = "0"; + a = {width: bw, height: bh}; + break; + case "bl": + wrap.setSize(0, 0); + wrap.setY(b.y+b.height); + st.right = st.top = "0"; + a = {width: bw, height: bh, points: pt}; + break; + case "br": + wrap.setSize(0, 0); + wrap.setXY([b.right, b.bottom]); + st.left = st.top = "0"; + a = {width: bw, height: bh, points: pt}; + break; + case "tr": + wrap.setSize(0, 0); + wrap.setX(b.x+b.width); + st.left = st.bottom = "0"; + a = {width: bw, height: bh, points: pt}; + break; + } + this.dom.style.visibility = "visible"; + wrap.show(); + + arguments.callee.anim = wrap.fxanim(a, + o, + 'motion', + .5, + 'easeOut', after); + }); + return this; + }, + + + slideOut : function(anchor, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + + anchor = anchor || "t"; + + var r = this.getFxRestore(); + + var b = this.getBox(); + this.setSize(b); + + var wrap = this.fxWrap(r.pos, o, "visible"); + + var st = this.dom.style; + st.visibility = "visible"; + st.position = "absolute"; + + wrap.setSize(b); + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.fxUnwrap(wrap, r.pos, o); + + st.width = r.width; + st.height = r.height; + + el.afterFx(o); + }; + + var a, zero = {to: 0}; + switch(anchor.toLowerCase()){ + case "t": + st.left = st.bottom = "0"; + a = {height: zero}; + break; + case "l": + st.right = st.top = "0"; + a = {width: zero}; + break; + case "r": + st.left = st.top = "0"; + a = {width: zero, points: {to:[b.right, b.y]}}; + break; + case "b": + st.left = st.top = "0"; + a = {height: zero, points: {to:[b.x, b.bottom]}}; + break; + case "tl": + st.right = st.bottom = "0"; + a = {width: zero, height: zero}; + break; + case "bl": + st.right = st.top = "0"; + a = {width: zero, height: zero, points: {to:[b.x, b.bottom]}}; + break; + case "br": + st.left = st.top = "0"; + a = {width: zero, height: zero, points: {to:[b.x+b.width, b.bottom]}}; + break; + case "tr": + st.left = st.bottom = "0"; + a = {width: zero, height: zero, points: {to:[b.right, b.y]}}; + break; + } + + arguments.callee.anim = wrap.fxanim(a, + o, + 'motion', + .5, + "easeOut", after); + }); + return this; + }, + + + puff : function(o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + this.clearOpacity(); + this.show(); + + var r = this.getFxRestore(); + var st = this.dom.style; + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.clearOpacity(); + + el.setPositioning(r.pos); + st.width = r.width; + st.height = r.height; + st.fontSize = ''; + el.afterFx(o); + }; + + var width = this.getWidth(); + var height = this.getHeight(); + + arguments.callee.anim = this.fxanim({ + width : {to: this.adjustWidth(width * 2)}, + height : {to: this.adjustHeight(height * 2)}, + points : {by: [-(width * .5), -(height * .5)]}, + opacity : {to: 0}, + fontSize: {to:200, unit: "%"} + }, + o, + 'motion', + .5, + "easeOut", after); + }); + return this; + }, + + + switchOff : function(o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + this.clearOpacity(); + this.clip(); + + var r = this.getFxRestore(); + var st = this.dom.style; + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.clearOpacity(); + el.setPositioning(r.pos); + st.width = r.width; + st.height = r.height; + + el.afterFx(o); + }; + + this.fxanim({opacity:{to:0.3}}, null, null, .1, null, function(){ + this.clearOpacity(); + (function(){ + this.fxanim({ + height:{to:1}, + points:{by:[0, this.getHeight() * .5]} + }, o, 'motion', 0.3, 'easeIn', after); + }).defer(100, this); + }); + }); + return this; + }, + + + highlight : function(color, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + color = color || "ffff9c"; + attr = o.attr || "backgroundColor"; + + this.clearOpacity(); + this.show(); + + var origColor = this.getColor(attr); + var restoreColor = this.dom.style[attr]; + endColor = (o.endColor || origColor) || "ffffff"; + + var after = function(){ + el.dom.style[attr] = restoreColor; + el.afterFx(o); + }; + + var a = {}; + a[attr] = {from: color, to: endColor}; + arguments.callee.anim = this.fxanim(a, + o, + 'color', + 1, + 'easeIn', after); + }); + return this; + }, + + + frame : function(color, count, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + color = color || "#C3DAF9"; + if(color.length == 6){ + color = "#" + color; + } + count = count || 1; + duration = o.duration || 1; + this.show(); + + var b = this.getBox(); + var animFn = function(){ + var proxy = this.createProxy({ + + style:{ + visbility:"hidden", + position:"absolute", + "z-index":"35000", border:"0px solid " + color + } + }); + var scale = Ext.isBorderBox ? 2 : 1; + proxy.animate({ + top:{from:b.y, to:b.y - 20}, + left:{from:b.x, to:b.x - 20}, + borderWidth:{from:0, to:10}, + opacity:{from:1, to:0}, + height:{from:b.height, to:(b.height + (20*scale))}, + width:{from:b.width, to:(b.width + (20*scale))} + }, duration, function(){ + proxy.remove(); + }); + if(--count > 0){ + animFn.defer((duration/2)*1000, this); + }else{ + el.afterFx(o); + } + }; + animFn.call(this); + }); + return this; + }, + + + pause : function(seconds){ + var el = this.getFxEl(); + var o = {}; + + el.queueFx(o, function(){ + setTimeout(function(){ + el.afterFx(o); + }, seconds * 1000); + }); + return this; + }, + + + fadeIn : function(o){ + var el = this.getFxEl(); + o = o || {}; + el.queueFx(o, function(){ + this.setOpacity(0); + this.fixDisplay(); + this.dom.style.visibility = 'visible'; + var to = o.endOpacity || 1; + arguments.callee.anim = this.fxanim({opacity:{to:to}}, + o, null, .5, "easeOut", function(){ + if(to == 1){ + this.clearOpacity(); + } + el.afterFx(o); + }); + }); + return this; + }, + + + fadeOut : function(o){ + var el = this.getFxEl(); + o = o || {}; + el.queueFx(o, function(){ + arguments.callee.anim = this.fxanim({opacity:{to:o.endOpacity || 0}}, + o, null, .5, "easeOut", function(){ + if(this.visibilityMode == Ext.Element.DISPLAY || o.useDisplay){ + this.dom.style.display = "none"; + }else{ + this.dom.style.visibility = "hidden"; + } + this.clearOpacity(); + el.afterFx(o); + }); + }); + return this; + }, + + + scale : function(w, h, o){ + this.shift(Ext.apply({}, o, { + width: w, + height: h + })); + return this; + }, + + + shift : function(o){ + var el = this.getFxEl(); + o = o || {}; + el.queueFx(o, function(){ + var a = {}, w = o.width, h = o.height, x = o.x, y = o.y, op = o.opacity; + if(w !== undefined){ + a.width = {to: this.adjustWidth(w)}; + } + if(h !== undefined){ + a.height = {to: this.adjustHeight(h)}; + } + if(x !== undefined || y !== undefined){ + a.points = {to: [ + x !== undefined ? x : this.getX(), + y !== undefined ? y : this.getY() + ]}; + } + if(op !== undefined){ + a.opacity = {to: op}; + } + if(o.xy !== undefined){ + a.points = {to: o.xy}; + } + arguments.callee.anim = this.fxanim(a, + o, 'motion', .35, "easeOut", function(){ + el.afterFx(o); + }); + }); + return this; + }, + + + ghost : function(anchor, o){ + var el = this.getFxEl(); + o = o || {}; + + el.queueFx(o, function(){ + anchor = anchor || "b"; + + var r = this.getFxRestore(); + var w = this.getWidth(), + h = this.getHeight(); + + var st = this.dom.style; + + var after = function(){ + if(o.useDisplay){ + el.setDisplayed(false); + }else{ + el.hide(); + } + + el.clearOpacity(); + el.setPositioning(r.pos); + st.width = r.width; + st.height = r.height; + + el.afterFx(o); + }; + + var a = {opacity: {to: 0}, points: {}}, pt = a.points; + switch(anchor.toLowerCase()){ + case "t": + pt.by = [0, -h]; + break; + case "l": + pt.by = [-w, 0]; + break; + case "r": + pt.by = [w, 0]; + break; + case "b": + pt.by = [0, h]; + break; + case "tl": + pt.by = [-w, -h]; + break; + case "bl": + pt.by = [-w, h]; + break; + case "br": + pt.by = [w, h]; + break; + case "tr": + pt.by = [w, -h]; + break; + } + + arguments.callee.anim = this.fxanim(a, + o, + 'motion', + .5, + "easeOut", after); + }); + return this; + }, + + + syncFx : function(){ + this.fxDefaults = Ext.apply(this.fxDefaults || {}, { + block : false, + concurrent : true, + stopFx : false + }); + return this; + }, + + + sequenceFx : function(){ + this.fxDefaults = Ext.apply(this.fxDefaults || {}, { + block : false, + concurrent : false, + stopFx : false + }); + return this; + }, + + + nextFx : function(){ + var ef = this.fxQueue[0]; + if(ef){ + ef.call(this); + } + }, + + + hasActiveFx : function(){ + return this.fxQueue && this.fxQueue[0]; + }, + + + stopFx : function(){ + if(this.hasActiveFx()){ + var cur = this.fxQueue[0]; + if(cur && cur.anim && cur.anim.isAnimated()){ + this.fxQueue = [cur]; cur.anim.stop(true); + } + } + return this; + }, + + + beforeFx : function(o){ + if(this.hasActiveFx() && !o.concurrent){ + if(o.stopFx){ + this.stopFx(); + return true; + } + return false; + } + return true; + }, + + + hasFxBlock : function(){ + var q = this.fxQueue; + return q && q[0] && q[0].block; + }, + + + queueFx : function(o, fn){ + if(!this.fxQueue){ + this.fxQueue = []; + } + if(!this.hasFxBlock()){ + Ext.applyIf(o, this.fxDefaults); + if(!o.concurrent){ + var run = this.beforeFx(o); + fn.block = o.block; + this.fxQueue.push(fn); + if(run){ + this.nextFx(); + } + }else{ + fn.call(this); + } + } + return this; + }, + + + fxWrap : function(pos, o, vis){ + var wrap; + if(!o.wrap || !(wrap = Ext.get(o.wrap))){ + var wrapXY; + if(o.fixPosition){ + wrapXY = this.getXY(); + } + var div = document.createElement("div"); + div.style.visibility = vis; + wrap = Ext.get(this.dom.parentNode.insertBefore(div, this.dom)); + wrap.setPositioning(pos); + if(wrap.getStyle("position") == "static"){ + wrap.position("relative"); + } + this.clearPositioning('auto'); + wrap.clip(); + wrap.dom.appendChild(this.dom); + if(wrapXY){ + wrap.setXY(wrapXY); + } + } + return wrap; + }, + + + fxUnwrap : function(wrap, pos, o){ + this.clearPositioning(); + this.setPositioning(pos); + if(!o.wrap){ + wrap.dom.parentNode.insertBefore(this.dom, wrap.dom); + wrap.remove(); + } + }, + + + getFxRestore : function(){ + var st = this.dom.style; + return {pos: this.getPositioning(), width: st.width, height : st.height}; + }, + + + afterFx : function(o){ + if(o.afterStyle){ + this.applyStyles(o.afterStyle); + } + if(o.afterCls){ + this.addClass(o.afterCls); + } + if(o.remove === true){ + this.remove(); + } + Ext.callback(o.callback, o.scope, [this]); + if(!o.concurrent){ + this.fxQueue.shift(); + this.nextFx(); + } + }, + + + getFxEl : function(){ return Ext.get(this.dom); + }, + + + fxanim : function(args, opt, animType, defaultDur, defaultEase, cb){ + animType = animType || 'run'; + opt = opt || {}; + var anim = Ext.lib.Anim[animType]( + this.dom, args, + (opt.duration || defaultDur) || .35, + (opt.easing || defaultEase) || 'easeOut', + function(){ + Ext.callback(cb, this); + }, + this + ); + opt.anim = anim; + return anim; + } +}; + +Ext.Fx.resize = Ext.Fx.scale; + +Ext.apply(Ext.Element.prototype, Ext.Fx); + + +Ext.CompositeElement = function(els){ + this.elements = []; + this.addElements(els); +}; +Ext.CompositeElement.prototype = { + isComposite: true, + addElements : function(els){ + if(!els) return this; + if(typeof els == "string"){ + els = Ext.Element.selectorFunction(els); + } + var yels = this.elements; + var index = yels.length-1; + for(var i = 0, len = els.length; i < len; i++) { + yels[++index] = Ext.get(els[i]); + } + return this; + }, + + + fill : function(els){ + this.elements = []; + this.add(els); + return this; + }, + + + filter : function(selector){ + var els = []; + this.each(function(el){ + if(el.is(selector)){ + els[els.length] = el.dom; + } + }); + this.fill(els); + return this; + }, + + invoke : function(fn, args){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++) { + Ext.Element.prototype[fn].apply(els[i], args); + } + return this; + }, + + add : function(els){ + if(typeof els == "string"){ + this.addElements(Ext.Element.selectorFunction(els)); + }else if(els.length !== undefined){ + this.addElements(els); + }else{ + this.addElements([els]); + } + return this; + }, + + each : function(fn, scope){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++){ + if(fn.call(scope || els[i], els[i], this, i) === false) { + break; + } + } + return this; + }, + + + item : function(index){ + return this.elements[index] || null; + }, + + + first : function(){ + return this.item(0); + }, + + + last : function(){ + return this.item(this.elements.length-1); + }, + + + getCount : function(){ + return this.elements.length; + }, + + + contains : function(el){ + return this.indexOf(el) !== -1; + }, + + + indexOf : function(el){ + return this.elements.indexOf(Ext.get(el)); + }, + + + + removeElement : function(el, removeDom){ + if(el instanceof Array){ + for(var i = 0, len = el.length; i < len; i++){ + this.removeElement(el[i]); + } + return this; + } + var index = typeof el == 'number' ? el : this.indexOf(el); + if(index !== -1){ + if(removeDom){ + var d = this.elements[index]; + if(d.dom){ + d.remove(); + }else{ + d.parentNode.removeChild(d); + } + } + this.elements.splice(index, 1); + } + return this; + }, + + + replaceElement : function(el, replacement, domReplace){ + var index = typeof el == 'number' ? el : this.indexOf(el); + if(index !== -1){ + if(domReplace){ + this.elements[index].replaceWith(replacement); + }else{ + this.elements.splice(index, 1, Ext.get(replacement)) + } + } + return this; + }, + + + clear : function(){ + this.elements = []; + } +}; +(function(){ +Ext.CompositeElement.createCall = function(proto, fnName){ + if(!proto[fnName]){ + proto[fnName] = function(){ + return this.invoke(fnName, arguments); + }; + } +}; +for(var fnName in Ext.Element.prototype){ + if(typeof Ext.Element.prototype[fnName] == "function"){ + Ext.CompositeElement.createCall(Ext.CompositeElement.prototype, fnName); + } +}; +})(); + + +Ext.CompositeElementLite = function(els){ + Ext.CompositeElementLite.superclass.constructor.call(this, els); + this.el = new Ext.Element.Flyweight(); +}; +Ext.extend(Ext.CompositeElementLite, Ext.CompositeElement, { + addElements : function(els){ + if(els){ + if(els instanceof Array){ + this.elements = this.elements.concat(els); + }else{ + var yels = this.elements; + var index = yels.length-1; + for(var i = 0, len = els.length; i < len; i++) { + yels[++index] = els[i]; + } + } + } + return this; + }, + invoke : function(fn, args){ + var els = this.elements; + var el = this.el; + for(var i = 0, len = els.length; i < len; i++) { + el.dom = els[i]; + Ext.Element.prototype[fn].apply(el, args); + } + return this; + }, + + item : function(index){ + if(!this.elements[index]){ + return null; + } + this.el.dom = this.elements[index]; + return this.el; + }, + + + addListener : function(eventName, handler, scope, opt){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++) { + Ext.EventManager.on(els[i], eventName, handler, scope || els[i], opt); + } + return this; + }, + + + each : function(fn, scope){ + var els = this.elements; + var el = this.el; + for(var i = 0, len = els.length; i < len; i++){ + el.dom = els[i]; + if(fn.call(scope || el, el, this, i) === false){ + break; + } + } + return this; + }, + + indexOf : function(el){ + return this.elements.indexOf(Ext.getDom(el)); + }, + + replaceElement : function(el, replacement, domReplace){ + var index = typeof el == 'number' ? el : this.indexOf(el); + if(index !== -1){ + replacement = Ext.getDom(replacement); + if(domReplace){ + var d = this.elements[index]; + d.parentNode.insertBefore(replacement, d); + d.parentNode.removeChild(d); + } + this.elements.splice(index, 1, replacement); + } + return this; + } +}); +Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener; +if(Ext.DomQuery){ + Ext.Element.selectorFunction = Ext.DomQuery.select; +} + +Ext.Element.select = function(selector, unique, root){ + var els; + if(typeof selector == "string"){ + els = Ext.Element.selectorFunction(selector, root); + }else if(selector.length !== undefined){ + els = selector; + }else{ + throw "Invalid selector"; + } + if(unique === true){ + return new Ext.CompositeElement(els); + }else{ + return new Ext.CompositeElementLite(els); + } +}; + +Ext.select = Ext.Element.select; + +Ext.data.Connection = function(config){ + Ext.apply(this, config); + this.addEvents({ + + "beforerequest" : true, + + "requestcomplete" : true, + + "requestexception" : true + }); + Ext.data.Connection.superclass.constructor.call(this); +}; + +Ext.extend(Ext.data.Connection, Ext.util.Observable, { + + + + + + timeout : 30000, + + autoAbort:false, + + + disableCaching: true, + + + request : function(o){ + if(this.fireEvent("beforerequest", this, o) !== false){ + var p = o.params; + + if(typeof p == "function"){ + p = p.call(o.scope||window, o); + } + if(typeof p == "object"){ + p = Ext.urlEncode(o.params); + } + if(this.extraParams){ + var extras = Ext.urlEncode(this.extraParams); + p = p ? (p + '&' + extras) : extras; + } + + var url = o.url || this.url; + if(typeof url == 'function'){ + url = url.call(o.scope||window, o); + } + + if(o.form){ + var form = Ext.getDom(o.form); + url = url || form.action; + + var enctype = form.getAttribute("enctype"); + if(o.isUpload || (enctype && enctype.toLowerCase() == 'multipart/form-data')){ + return this.doFormUpload(o, p, url); + } + var f = Ext.lib.Ajax.serializeForm(form); + p = p ? (p + '&' + f) : f; + } + + var hs = o.headers; + if(this.defaultHeaders){ + hs = Ext.apply(hs || {}, this.defaultHeaders); + if(!o.headers){ + o.headers = hs; + } + } + + var cb = { + success: this.handleResponse, + failure: this.handleFailure, + scope: this, + argument: {options: o}, + timeout : this.timeout + }; + + var method = o.method||this.method||(p ? "POST" : "GET"); + + if(method == 'GET' && (this.disableCaching && o.disableCaching !== false) || o.disableCaching === true){ + url += (url.indexOf('?') != -1 ? '&' : '?') + '_dc=' + (new Date().getTime()); + } + + if(typeof o.autoAbort == 'boolean'){ + if(o.autoAbort){ + this.abort(); + } + }else if(this.autoAbort !== false){ + this.abort(); + } + + if((method == 'GET' && p) || o.xmlData){ + url += (url.indexOf('?') != -1 ? '&' : '?') + p; + p = ''; + } + this.transId = Ext.lib.Ajax.request(method, url, cb, p, o); + return this.transId; + }else{ + Ext.callback(o.callback, o.scope, [o, null, null]); + return null; + } + }, + + + isLoading : function(transId){ + if(transId){ + return Ext.lib.Ajax.isCallInProgress(transId); + }else{ + return this.transId ? true : false; + } + }, + + + abort : function(transId){ + if(transId || this.isLoading()){ + Ext.lib.Ajax.abort(transId || this.transId); + } + }, + + + handleResponse : function(response){ + this.transId = false; + var options = response.argument.options; + response.argument = options ? options.argument : null; + this.fireEvent("requestcomplete", this, response, options); + Ext.callback(options.success, options.scope, [response, options]); + Ext.callback(options.callback, options.scope, [options, true, response]); + }, + + + handleFailure : function(response, e){ + this.transId = false; + var options = response.argument.options; + response.argument = options ? options.argument : null; + this.fireEvent("requestexception", this, response, options, e); + Ext.callback(options.failure, options.scope, [response, options]); + Ext.callback(options.callback, options.scope, [options, false, response]); + }, + + + doFormUpload : function(o, ps, url){ + var id = Ext.id(); + var frame = document.createElement('iframe'); + frame.id = id; + frame.name = id; + frame.className = 'x-hidden'; + if(Ext.isIE){ + frame.src = Ext.SSL_SECURE_URL; + } + document.body.appendChild(frame); + + if(Ext.isIE){ + document.frames[id].name = id; + } + + var form = Ext.getDom(o.form); + form.target = id; + form.method = 'POST'; + form.enctype = form.encoding = 'multipart/form-data'; + if(url){ + form.action = url; + } + + var hiddens, hd; + if(ps){ + hiddens = []; + ps = Ext.urlDecode(ps, false); + for(var k in ps){ + if(ps.hasOwnProperty(k)){ + hd = document.createElement('input'); + hd.type = 'hidden'; + hd.name = k; + hd.value = ps[k]; + form.appendChild(hd); + hiddens.push(hd); + } + } + } + + function cb(){ + var r = { + responseText : '', + responseXML : null + }; + + r.argument = o ? o.argument : null; + + try { + var doc; + if(Ext.isIE){ + doc = frame.contentWindow.document; + }else { + doc = (frame.contentDocument || window.frames[id].document); + } + if(doc && doc.body){ + r.responseText = doc.body.innerHTML; + } + if(doc && doc.XMLDocument){ + r.responseXML = doc.XMLDocument; + }else { + r.responseXML = doc; + } + } + catch(e) { + + } + + Ext.EventManager.removeListener(frame, 'load', cb, this); + + this.fireEvent("requestcomplete", this, r, o); + Ext.callback(o.success, o.scope, [r, o]); + Ext.callback(o.callback, o.scope, [o, true, r]); + + setTimeout(function(){document.body.removeChild(frame);}, 100); + } + + Ext.EventManager.on(frame, 'load', cb, this); + form.submit(); + + if(hiddens){ + for(var i = 0, len = hiddens.length; i < len; i++){ + form.removeChild(hiddens[i]); + } + } + } +}); + + +Ext.Ajax = new Ext.data.Connection({ + + + + + + + + + + + + + + + + + + + autoAbort : false, + + + serializeForm : function(form){ + return Ext.lib.Ajax.serializeForm(form); + } +}); + +Ext.UpdateManager = function(el, forceNew){ + el = Ext.get(el); + if(!forceNew && el.updateManager){ + return el.updateManager; + } + + this.el = el; + + this.defaultUrl = null; + + this.addEvents({ + + "beforeupdate": true, + + "update": true, + + "failure": true + }); + var d = Ext.UpdateManager.defaults; + + this.sslBlankUrl = d.sslBlankUrl; + + this.disableCaching = d.disableCaching; + + this.indicatorText = d.indicatorText; + + this.showLoadIndicator = d.showLoadIndicator; + + this.timeout = d.timeout; + + + this.loadScripts = d.loadScripts; + + + this.transaction = null; + + + this.autoRefreshProcId = null; + + this.refreshDelegate = this.refresh.createDelegate(this); + + this.updateDelegate = this.update.createDelegate(this); + + this.formUpdateDelegate = this.formUpdate.createDelegate(this); + + this.successDelegate = this.processSuccess.createDelegate(this); + + this.failureDelegate = this.processFailure.createDelegate(this); + + if(!this.renderer){ + + this.renderer = new Ext.UpdateManager.BasicRenderer(); + } + + Ext.UpdateManager.superclass.constructor.call(this); +}; + +Ext.extend(Ext.UpdateManager, Ext.util.Observable, { + + getEl : function(){ + return this.el; + }, + + update : function(url, params, callback, discardUrl){ + if(this.fireEvent("beforeupdate", this.el, url, params) !== false){ + var method = this.method, cfg; + if(typeof url == "object"){ + cfg = url; + url = cfg.url; + params = params || cfg.params; + callback = callback || cfg.callback; + discardUrl = discardUrl || cfg.discardUrl; + if(callback && cfg.scope){ + callback = callback.createDelegate(cfg.scope); + } + if(typeof cfg.method != "undefined"){method = cfg.method;}; + if(typeof cfg.nocache != "undefined"){this.disableCaching = cfg.nocache;}; + if(typeof cfg.text != "undefined"){this.indicatorText = '
'+cfg.text+"
";}; + if(typeof cfg.scripts != "undefined"){this.loadScripts = cfg.scripts;}; + if(typeof cfg.timeout != "undefined"){this.timeout = cfg.timeout;}; + } + this.showLoading(); + if(!discardUrl){ + this.defaultUrl = url; + } + if(typeof url == "function"){ + url = url.call(this); + } + + method = method || (params ? "POST" : "GET"); + if(method == "GET"){ + url = this.prepareUrl(url); + } + + var o = Ext.apply(cfg ||{}, { + url : url, + params: params, + success: this.successDelegate, + failure: this.failureDelegate, + callback: undefined, + timeout: (this.timeout*1000), + argument: {"url": url, "form": null, "callback": callback, "params": params} + }); + + this.transaction = Ext.Ajax.request(o); + } + }, + + + formUpdate : function(form, url, reset, callback){ + if(this.fireEvent("beforeupdate", this.el, form, url) !== false){ + if(typeof url == "function"){ + url = url.call(this); + } + form = Ext.getDom(form) + this.transaction = Ext.Ajax.request({ + form: form, + url:url, + success: this.successDelegate, + failure: this.failureDelegate, + timeout: (this.timeout*1000), + argument: {"url": url, "form": form, "callback": callback, "reset": reset} + }); + this.showLoading.defer(1, this); + } + }, + + + refresh : function(callback){ + if(this.defaultUrl == null){ + return; + } + this.update(this.defaultUrl, null, callback, true); + }, + + + startAutoRefresh : function(interval, url, params, callback, refreshNow){ + if(refreshNow){ + this.update(url || this.defaultUrl, params, callback, true); + } + if(this.autoRefreshProcId){ + clearInterval(this.autoRefreshProcId); + } + this.autoRefreshProcId = setInterval(this.update.createDelegate(this, [url || this.defaultUrl, params, callback, true]), interval*1000); + }, + + + stopAutoRefresh : function(){ + if(this.autoRefreshProcId){ + clearInterval(this.autoRefreshProcId); + delete this.autoRefreshProcId; + } + }, + + isAutoRefreshing : function(){ + return this.autoRefreshProcId ? true : false; + }, + + showLoading : function(){ + if(this.showLoadIndicator){ + this.el.update(this.indicatorText); + } + }, + + + prepareUrl : function(url){ + if(this.disableCaching){ + var append = "_dc=" + (new Date().getTime()); + if(url.indexOf("?") !== -1){ + url += "&" + append; + }else{ + url += "?" + append; + } + } + return url; + }, + + + processSuccess : function(response){ + this.transaction = null; + if(response.argument.form && response.argument.reset){ + try{ + response.argument.form.reset(); + }catch(e){} + } + if(this.loadScripts){ + this.renderer.render(this.el, response, this, + this.updateComplete.createDelegate(this, [response])); + }else{ + this.renderer.render(this.el, response, this); + this.updateComplete(response); + } + }, + + updateComplete : function(response){ + this.fireEvent("update", this.el, response); + if(typeof response.argument.callback == "function"){ + response.argument.callback(this.el, true, response); + } + }, + + + processFailure : function(response){ + this.transaction = null; + this.fireEvent("failure", this.el, response); + if(typeof response.argument.callback == "function"){ + response.argument.callback(this.el, false, response); + } + }, + + + setRenderer : function(renderer){ + this.renderer = renderer; + }, + + getRenderer : function(){ + return this.renderer; + }, + + + setDefaultUrl : function(defaultUrl){ + this.defaultUrl = defaultUrl; + }, + + + abort : function(){ + if(this.transaction){ + Ext.Ajax.abort(this.transaction); + } + }, + + + isUpdating : function(){ + if(this.transaction){ + return Ext.Ajax.isLoading(this.transaction); + } + return false; + } +}); + + + Ext.UpdateManager.defaults = { + + timeout : 30, + + + loadScripts : false, + + + sslBlankUrl : (Ext.SSL_SECURE_URL || "javascript:false"), + + disableCaching : false, + + showLoadIndicator : true, + + indicatorText : '
Loading...
' + }; + + +Ext.UpdateManager.updateElement = function(el, url, params, options){ + var um = Ext.get(el, true).getUpdateManager(); + Ext.apply(um, options); + um.update(url, params, options ? options.callback : null); +}; + +Ext.UpdateManager.update = Ext.UpdateManager.updateElement; + +Ext.UpdateManager.BasicRenderer = function(){}; + +Ext.UpdateManager.BasicRenderer.prototype = { + + render : function(el, response, updateManager, callback){ + el.update(response.responseText, updateManager.loadScripts, callback); + } +}; + + + + + + +Date.parseFunctions = {count:0}; + +Date.parseRegexes = []; + +Date.formatFunctions = {count:0}; + + +Date.prototype.dateFormat = function(format) { + if (Date.formatFunctions[format] == null) { + Date.createNewFormat(format); + } + var func = Date.formatFunctions[format]; + return this[func](); +}; + + + +Date.prototype.format = Date.prototype.dateFormat; + + +Date.createNewFormat = function(format) { + var funcName = "format" + Date.formatFunctions.count++; + Date.formatFunctions[format] = funcName; + var code = "Date.prototype." + funcName + " = function(){return "; + var special = false; + var ch = ''; + for (var i = 0; i < format.length; ++i) { + ch = format.charAt(i); + if (!special && ch == "\\") { + special = true; + } + else if (special) { + special = false; + code += "'" + String.escape(ch) + "' + "; + } + else { + code += Date.getFormatCode(ch); + } + } + eval(code.substring(0, code.length - 3) + ";}"); +}; + + +Date.getFormatCode = function(character) { + switch (character) { + case "d": + return "String.leftPad(this.getDate(), 2, '0') + "; + case "D": + return "Date.dayNames[this.getDay()].substring(0, 3) + "; + case "j": + return "this.getDate() + "; + case "l": + return "Date.dayNames[this.getDay()] + "; + case "S": + return "this.getSuffix() + "; + case "w": + return "this.getDay() + "; + case "z": + return "this.getDayOfYear() + "; + case "W": + return "this.getWeekOfYear() + "; + case "F": + return "Date.monthNames[this.getMonth()] + "; + case "m": + return "String.leftPad(this.getMonth() + 1, 2, '0') + "; + case "M": + return "Date.monthNames[this.getMonth()].substring(0, 3) + "; + case "n": + return "(this.getMonth() + 1) + "; + case "t": + return "this.getDaysInMonth() + "; + case "L": + return "(this.isLeapYear() ? 1 : 0) + "; + case "Y": + return "this.getFullYear() + "; + case "y": + return "('' + this.getFullYear()).substring(2, 4) + "; + case "a": + return "(this.getHours() < 12 ? 'am' : 'pm') + "; + case "A": + return "(this.getHours() < 12 ? 'AM' : 'PM') + "; + case "g": + return "((this.getHours() % 12) ? this.getHours() % 12 : 12) + "; + case "G": + return "this.getHours() + "; + case "h": + return "String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0') + "; + case "H": + return "String.leftPad(this.getHours(), 2, '0') + "; + case "i": + return "String.leftPad(this.getMinutes(), 2, '0') + "; + case "s": + return "String.leftPad(this.getSeconds(), 2, '0') + "; + case "O": + return "this.getGMTOffset() + "; + case "T": + return "this.getTimezone() + "; + case "Z": + return "(this.getTimezoneOffset() * -60) + "; + default: + return "'" + String.escape(character) + "' + "; + } +}; + + +Date.parseDate = function(input, format) { + if (Date.parseFunctions[format] == null) { + Date.createParser(format); + } + var func = Date.parseFunctions[format]; + return Date[func](input); +}; + + +Date.createParser = function(format) { + var funcName = "parse" + Date.parseFunctions.count++; + var regexNum = Date.parseRegexes.length; + var currentGroup = 1; + Date.parseFunctions[format] = funcName; + + var code = "Date." + funcName + " = function(input){\n" + + "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1, o, z, v;\n" + + "var d = new Date();\n" + + "y = d.getFullYear();\n" + + "m = d.getMonth();\n" + + "d = d.getDate();\n" + + "var results = input.match(Date.parseRegexes[" + regexNum + "]);\n" + + "if (results && results.length > 0) {"; + var regex = ""; + + var special = false; + var ch = ''; + for (var i = 0; i < format.length; ++i) { + ch = format.charAt(i); + if (!special && ch == "\\") { + special = true; + } + else if (special) { + special = false; + regex += String.escape(ch); + } + else { + var obj = Date.formatCodeToRegex(ch, currentGroup); + currentGroup += obj.g; + regex += obj.s; + if (obj.g && obj.c) { + code += obj.c; + } + } + } + + code += "if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n" + + "{v = new Date(y, m, d, h, i, s);}\n" + + "else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n" + + "{v = new Date(y, m, d, h, i);}\n" + + "else if (y >= 0 && m >= 0 && d > 0 && h >= 0)\n" + + "{v = new Date(y, m, d, h);}\n" + + "else if (y >= 0 && m >= 0 && d > 0)\n" + + "{v = new Date(y, m, d);}\n" + + "else if (y >= 0 && m >= 0)\n" + + "{v = new Date(y, m);}\n" + + "else if (y >= 0)\n" + + "{v = new Date(y);}\n" + + "}return (v && (z || o))?\n" + + " ((z)? v.add(Date.SECOND, (v.getTimezoneOffset() * 60) + (z*1)) :\n" + + " v.add(Date.HOUR, (v.getGMTOffset() / 100) + (o / -100))) : v\n" + + ";}"; + + Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$"); + eval(code); +}; + + +Date.formatCodeToRegex = function(character, currentGroup) { + switch (character) { + case "D": + return {g:0, + c:null, + s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"}; + case "j": + return {g:1, + c:"d = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{1,2})"}; + case "d": + return {g:1, + c:"d = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{2})"}; + case "l": + return {g:0, + c:null, + s:"(?:" + Date.dayNames.join("|") + ")"}; + case "S": + return {g:0, + c:null, + s:"(?:st|nd|rd|th)"}; + case "w": + return {g:0, + c:null, + s:"\\d"}; + case "z": + return {g:0, + c:null, + s:"(?:\\d{1,3})"}; + case "W": + return {g:0, + c:null, + s:"(?:\\d{2})"}; + case "F": + return {g:1, + c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "].substring(0, 3)], 10);\n", + s:"(" + Date.monthNames.join("|") + ")"}; + case "M": + return {g:1, + c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "]], 10);\n", + s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"}; + case "n": + return {g:1, + c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n", + s:"(\\d{1,2})"}; + case "m": + return {g:1, + c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n", + s:"(\\d{2})"}; + case "t": + return {g:0, + c:null, + s:"\\d{1,2}"}; + case "L": + return {g:0, + c:null, + s:"(?:1|0)"}; + case "Y": + return {g:1, + c:"y = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{4})"}; + case "y": + return {g:1, + c:"var ty = parseInt(results[" + currentGroup + "], 10);\n" + + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n", + s:"(\\d{1,2})"}; + case "a": + return {g:1, + c:"if (results[" + currentGroup + "] == 'am') {\n" + + "if (h == 12) { h = 0; }\n" + + "} else { if (h < 12) { h += 12; }}", + s:"(am|pm)"}; + case "A": + return {g:1, + c:"if (results[" + currentGroup + "] == 'AM') {\n" + + "if (h == 12) { h = 0; }\n" + + "} else { if (h < 12) { h += 12; }}", + s:"(AM|PM)"}; + case "g": + case "G": + return {g:1, + c:"h = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{1,2})"}; + case "h": + case "H": + return {g:1, + c:"h = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{2})"}; + case "i": + return {g:1, + c:"i = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{2})"}; + case "s": + return {g:1, + c:"s = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{2})"}; + case "O": + return {g:1, + c:[ + "o = results[", currentGroup, "];\n", + "var sn = o.substring(0,1);\n", + "var hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60);\n", + "var mn = o.substring(3,5) % 60;\n", + "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))?\n", + " (sn + String.leftPad(hr, 2, 0) + String.leftPad(mn, 2, 0)) : null;\n" + ].join(""), + s:"([+\-]\\d{4})"}; + case "T": + return {g:0, + c:null, + s:"[A-Z]{1,4}"}; + case "Z": + return {g:1, + c:"z = results[" + currentGroup + "];\n" + + "z = (-43200 <= z*1 && z*1 <= 50400)? z : null;\n", + s:"([+\-]?\\d{1,5})"}; + default: + return {g:0, + c:null, + s:String.escape(character)}; + } +}; + + +Date.prototype.getTimezone = function() { + return this.toString().replace(/^.*? ([A-Z]{1,4})[\-+][0-9]{4} .*$/, "$1"); +}; + + +Date.prototype.getGMTOffset = function() { + return (this.getTimezoneOffset() > 0 ? "-" : "+") + + String.leftPad(Math.abs(Math.floor(this.getTimezoneOffset() / 60)), 2, "0") + + String.leftPad(this.getTimezoneOffset() % 60, 2, "0"); +}; + + +Date.prototype.getDayOfYear = function() { + var num = 0; + Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28; + for (var i = 0; i < this.getMonth(); ++i) { + num += Date.daysInMonth[i]; + } + return num + this.getDate() - 1; +}; + + +Date.prototype.getWeekOfYear = function() { + + var now = this.getDayOfYear() + (4 - this.getDay()); + + var jan1 = new Date(this.getFullYear(), 0, 1); + var then = (7 - jan1.getDay() + 4); + return String.leftPad(((now - then) / 7) + 1, 2, "0"); +}; + + +Date.prototype.isLeapYear = function() { + var year = this.getFullYear(); + return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year))); +}; + + +Date.prototype.getFirstDayOfMonth = function() { + var day = (this.getDay() - (this.getDate() - 1)) % 7; + return (day < 0) ? (day + 7) : day; +}; + + +Date.prototype.getLastDayOfMonth = function() { + var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7; + return (day < 0) ? (day + 7) : day; +}; + + + +Date.prototype.getFirstDateOfMonth = function() { + return new Date(this.getFullYear(), this.getMonth(), 1); +}; + + +Date.prototype.getLastDateOfMonth = function() { + return new Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth()); +}; + +Date.prototype.getDaysInMonth = function() { + Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28; + return Date.daysInMonth[this.getMonth()]; +}; + + +Date.prototype.getSuffix = function() { + switch (this.getDate()) { + case 1: + case 21: + case 31: + return "st"; + case 2: + case 22: + return "nd"; + case 3: + case 23: + return "rd"; + default: + return "th"; + } +}; + + +Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]; + + +Date.monthNames = + ["January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December"]; + + +Date.dayNames = + ["Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday"]; + + +Date.y2kYear = 50; + +Date.monthNumbers = { + Jan:0, + Feb:1, + Mar:2, + Apr:3, + May:4, + Jun:5, + Jul:6, + Aug:7, + Sep:8, + Oct:9, + Nov:10, + Dec:11}; + + +Date.prototype.clone = function() { + return new Date(this.getTime()); +}; + + +Date.prototype.clearTime = function(clone){ + if(clone){ + return this.clone().clearTime(); + } + this.setHours(0); + this.setMinutes(0); + this.setSeconds(0); + this.setMilliseconds(0); + return this; +}; + + + +if(Ext.isSafari){ + Date.brokenSetMonth = Date.prototype.setMonth; + Date.prototype.setMonth = function(num){ + if(num <= -1){ + var n = Math.ceil(-num); + var back_year = Math.ceil(n/12); + var month = (n % 12) ? 12 - n % 12 : 0 ; + this.setFullYear(this.getFullYear() - back_year); + return Date.brokenSetMonth.call(this, month); + } else { + return Date.brokenSetMonth.apply(this, arguments); + } + }; +} + + +Date.MILLI = "ms"; + +Date.SECOND = "s"; + +Date.MINUTE = "mi"; + +Date.HOUR = "h"; + +Date.DAY = "d"; + +Date.MONTH = "mo"; + +Date.YEAR = "y"; + + +Date.prototype.add = function(interval, value){ + var d = this.clone(); + if (!interval || value === 0) return d; + switch(interval.toLowerCase()){ + case Date.MILLI: + d.setMilliseconds(this.getMilliseconds() + value); + break; + case Date.SECOND: + d.setSeconds(this.getSeconds() + value); + break; + case Date.MINUTE: + d.setMinutes(this.getMinutes() + value); + break; + case Date.HOUR: + d.setHours(this.getHours() + value); + break; + case Date.DAY: + d.setDate(this.getDate() + value); + break; + case Date.MONTH: + var day = this.getDate(); + if(day > 28){ + day = Math.min(day, this.getFirstDateOfMonth().add('mo', value).getLastDateOfMonth().getDate()); + } + d.setDate(day); + d.setMonth(this.getMonth() + value); + break; + case Date.YEAR: + d.setFullYear(this.getFullYear() + value); + break; + } + return d; +}; + +Ext.util.DelayedTask = function(fn, scope, args){ + var id = null, d, t; + + var call = function(){ + var now = new Date().getTime(); + if(now - t >= d){ + clearInterval(id); + id = null; + fn.apply(scope, args || []); + } + }; + + this.delay = function(delay, newFn, newScope, newArgs){ + if(id && delay != d){ + this.cancel(); + } + d = delay; + t = new Date().getTime(); + fn = newFn || fn; + scope = newScope || scope; + args = newArgs || args; + if(!id){ + id = setInterval(call, d); + } + }; + + + this.cancel = function(){ + if(id){ + clearInterval(id); + id = null; + } + }; +}; +Ext.util.TaskRunner = function(interval){ + interval = interval || 10; + var tasks = [], removeQueue = []; + var id = 0; + var running = false; + + var stopThread = function(){ + running = false; + clearInterval(id); + id = 0; + }; + + var startThread = function(){ + if(!running){ + running = true; + id = setInterval(runTasks, interval); + } + }; + + var removeTask = function(task){ + removeQueue.push(task); + if(task.onStop){ + task.onStop(); + } + }; + + var runTasks = function(){ + if(removeQueue.length > 0){ + for(var i = 0, len = removeQueue.length; i < len; i++){ + tasks.remove(removeQueue[i]); + } + removeQueue = []; + if(tasks.length < 1){ + stopThread(); + return; + } + } + var now = new Date().getTime(); + for(var i = 0, len = tasks.length; i < len; ++i){ + var t = tasks[i]; + var itime = now - t.taskRunTime; + if(t.interval <= itime){ + var rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]); + t.taskRunTime = now; + if(rt === false || t.taskRunCount === t.repeat){ + removeTask(t); + return; + } + } + if(t.duration && t.duration <= (now - t.taskStartTime)){ + removeTask(t); + } + } + }; + + + this.start = function(task){ + tasks.push(task); + task.taskStartTime = new Date().getTime(); + task.taskRunTime = 0; + task.taskRunCount = 0; + startThread(); + return task; + }; + + this.stop = function(task){ + removeTask(task); + return task; + }; + + this.stopAll = function(){ + stopThread(); + for(var i = 0, len = tasks.length; i < len; i++){ + if(tasks[i].onStop){ + tasks[i].onStop(); + } + } + tasks = []; + removeQueue = []; + }; +}; + +Ext.TaskMgr = new Ext.util.TaskRunner(); + +Ext.util.MixedCollection = function(allowFunctions, keyFn){ + this.items = []; + this.map = {}; + this.keys = []; + this.length = 0; + this.addEvents({ + + "clear" : true, + + "add" : true, + + "replace" : true, + + "remove" : true, + "sort" : true + }); + this.allowFunctions = allowFunctions === true; + if(keyFn){ + this.getKey = keyFn; + } + Ext.util.MixedCollection.superclass.constructor.call(this); +}; + +Ext.extend(Ext.util.MixedCollection, Ext.util.Observable, { + allowFunctions : false, + + + add : function(key, o){ + if(arguments.length == 1){ + o = arguments[0]; + key = this.getKey(o); + } + if(typeof key == "undefined" || key === null){ + this.length++; + this.items.push(o); + this.keys.push(null); + }else{ + var old = this.map[key]; + if(old){ + return this.replace(key, o); + } + this.length++; + this.items.push(o); + this.map[key] = o; + this.keys.push(key); + } + this.fireEvent("add", this.length-1, o, key); + return o; + }, + + + getKey : function(o){ + return o.id; + }, + + + replace : function(key, o){ + if(arguments.length == 1){ + o = arguments[0]; + key = this.getKey(o); + } + var old = this.item(key); + if(typeof key == "undefined" || key === null || typeof old == "undefined"){ + return this.add(key, o); + } + var index = this.indexOfKey(key); + this.items[index] = o; + this.map[key] = o; + this.fireEvent("replace", key, old, o); + return o; + }, + + + addAll : function(objs){ + if(arguments.length > 1 || objs instanceof Array){ + var args = arguments.length > 1 ? arguments : objs; + for(var i = 0, len = args.length; i < len; i++){ + this.add(args[i]); + } + }else{ + for(var key in objs){ + if(this.allowFunctions || typeof objs[key] != "function"){ + this.add(key, objs[key]); + } + } + } + }, + + + each : function(fn, scope){ + var items = [].concat(this.items); + for(var i = 0, len = items.length; i < len; i++){ + if(fn.call(scope || items[i], items[i], i, len) === false){ + break; + } + } + }, + + + eachKey : function(fn, scope){ + for(var i = 0, len = this.keys.length; i < len; i++){ + fn.call(scope || window, this.keys[i], this.items[i], i, len); + } + }, + + + find : function(fn, scope){ + for(var i = 0, len = this.items.length; i < len; i++){ + if(fn.call(scope || window, this.items[i], this.keys[i])){ + return this.items[i]; + } + } + return null; + }, + + + insert : function(index, key, o){ + if(arguments.length == 2){ + o = arguments[1]; + key = this.getKey(o); + } + if(index >= this.length){ + return this.add(key, o); + } + this.length++; + this.items.splice(index, 0, o); + if(typeof key != "undefined" && key != null){ + this.map[key] = o; + } + this.keys.splice(index, 0, key); + this.fireEvent("add", index, o, key); + return o; + }, + + + remove : function(o){ + return this.removeAt(this.indexOf(o)); + }, + + + removeAt : function(index){ + if(index < this.length && index >= 0){ + this.length--; + var o = this.items[index]; + this.items.splice(index, 1); + var key = this.keys[index]; + if(typeof key != "undefined"){ + delete this.map[key]; + } + this.keys.splice(index, 1); + this.fireEvent("remove", o, key); + } + }, + + + removeKey : function(key){ + return this.removeAt(this.indexOfKey(key)); + }, + + + getCount : function(){ + return this.length; + }, + + + indexOf : function(o){ + if(!this.items.indexOf){ + for(var i = 0, len = this.items.length; i < len; i++){ + if(this.items[i] == o) return i; + } + return -1; + }else{ + return this.items.indexOf(o); + } + }, + + + indexOfKey : function(key){ + if(!this.keys.indexOf){ + for(var i = 0, len = this.keys.length; i < len; i++){ + if(this.keys[i] == key) return i; + } + return -1; + }else{ + return this.keys.indexOf(key); + } + }, + + + item : function(key){ + var item = typeof this.map[key] != "undefined" ? this.map[key] : this.items[key]; + return typeof item != 'function' || this.allowFunctions ? item : null; + }, + + + itemAt : function(index){ + return this.items[index]; + }, + + + key : function(key){ + return this.map[key]; + }, + + + contains : function(o){ + return this.indexOf(o) != -1; + }, + + + containsKey : function(key){ + return typeof this.map[key] != "undefined"; + }, + + + clear : function(){ + this.length = 0; + this.items = []; + this.keys = []; + this.map = {}; + this.fireEvent("clear"); + }, + + + first : function(){ + return this.items[0]; + }, + + + last : function(){ + return this.items[this.length-1]; + }, + + _sort : function(property, dir, fn){ + var dsc = String(dir).toUpperCase() == "DESC" ? -1 : 1; + fn = fn || function(a, b){ + return a-b; + }; + var c = [], k = this.keys, items = this.items; + for(var i = 0, len = items.length; i < len; i++){ + c[c.length] = {key: k[i], value: items[i], index: i}; + } + c.sort(function(a, b){ + var v = fn(a[property], b[property]) * dsc; + if(v == 0){ + v = (a.index < b.index ? -1 : 1); + } + return v; + }); + for(var i = 0, len = c.length; i < len; i++){ + items[i] = c[i].value; + k[i] = c[i].key; + } + this.fireEvent("sort", this); + }, + + + sort : function(dir, fn){ + this._sort("value", dir, fn); + }, + + + keySort : function(dir, fn){ + this._sort("key", dir, fn || function(a, b){ + return String(a).toUpperCase()-String(b).toUpperCase(); + }); + }, + + + getRange : function(start, end){ + var items = this.items; + if(items.length < 1){ + return []; + } + start = start || 0; + end = Math.min(typeof end == "undefined" ? this.length-1 : end, this.length-1); + var r = []; + if(start <= end){ + for(var i = start; i <= end; i++) { + r[r.length] = items[i]; + } + }else{ + for(var i = start; i >= end; i--) { + r[r.length] = items[i]; + } + } + return r; + }, + + + filter : function(property, value){ + if(!value.exec){ + value = String(value); + if(value.length == 0){ + return this.clone(); + } + value = new RegExp("^" + Ext.escapeRe(value), "i"); + } + return this.filterBy(function(o){ + return o && value.test(o[property]); + }); + }, + + + filterBy : function(fn, scope){ + var r = new Ext.util.MixedCollection(); + r.getKey = this.getKey; + var k = this.keys, it = this.items; + for(var i = 0, len = it.length; i < len; i++){ + if(fn.call(scope||this, it[i], k[i])){ + r.add(k[i], it[i]); + } + } + return r; + }, + + + clone : function(){ + var r = new Ext.util.MixedCollection(); + var k = this.keys, it = this.items; + for(var i = 0, len = it.length; i < len; i++){ + r.add(k[i], it[i]); + } + r.getKey = this.getKey; + return r; + } +}); + +Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item; + +Ext.util.JSON = new (function(){ + var useHasOwn = {}.hasOwnProperty ? true : false; + + + + + var pad = function(n) { + return n < 10 ? "0" + n : n; + }; + + var m = { + "\b": '\\b', + "\t": '\\t', + "\n": '\\n', + "\f": '\\f', + "\r": '\\r', + '"' : '\\"', + "\\": '\\\\' + }; + + var encodeString = function(s){ + if (/["\\\x00-\x1f]/.test(s)) { + return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) { + var c = m[b]; + if(c){ + return c; + } + c = b.charCodeAt(); + return "\\u00" + + Math.floor(c / 16).toString(16) + + (c % 16).toString(16); + }) + '"'; + } + return '"' + s + '"'; + }; + + var encodeArray = function(o){ + var a = ["["], b, i, l = o.length, v; + for (i = 0; i < l; i += 1) { + v = o[i]; + switch (typeof v) { + case "undefined": + case "function": + case "unknown": + break; + default: + if (b) { + a.push(','); + } + a.push(v === null ? "null" : Ext.util.JSON.encode(v)); + b = true; + } + } + a.push("]"); + return a.join(""); + }; + + var encodeDate = function(o){ + return '"' + o.getFullYear() + "-" + + pad(o.getMonth() + 1) + "-" + + pad(o.getDate()) + "T" + + pad(o.getHours()) + ":" + + pad(o.getMinutes()) + ":" + + pad(o.getSeconds()) + '"'; + }; + + + this.encode = function(o){ + if(typeof o == "undefined" || o === null){ + return "null"; + }else if(o instanceof Array){ + return encodeArray(o); + }else if(o instanceof Date){ + return encodeDate(o); + }else if(typeof o == "string"){ + return encodeString(o); + }else if(typeof o == "number"){ + return isFinite(o) ? String(o) : "null"; + }else if(typeof o == "boolean"){ + return String(o); + }else { + var a = ["{"], b, i, v; + for (i in o) { + if(!useHasOwn || o.hasOwnProperty(i)) { + v = o[i]; + switch (typeof v) { + case "undefined": + case "function": + case "unknown": + break; + default: + if(b){ + a.push(','); + } + a.push(this.encode(i), ":", + v === null ? "null" : this.encode(v)); + b = true; + } + } + } + a.push("}"); + return a.join(""); + } + }; + + + this.decode = function(json){ + return eval("(" + json + ')'); + }; +})(); + +Ext.encode = Ext.util.JSON.encode; + +Ext.decode = Ext.util.JSON.decode; + + +Ext.util.Format = function(){ + var trimRe = /^\s+|\s+$/g; + return { + + ellipsis : function(value, len){ + if(value && value.length > len){ + return value.substr(0, len-3)+"..."; + } + return value; + }, + + + undef : function(value){ + return typeof value != "undefined" ? value : ""; + }, + + + htmlEncode : function(value){ + return !value ? value : String(value).replace(/&/g, "&").replace(/>/g, ">").replace(/").replace(/</g, "<").replace(/"/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('.'); + var whole = ps[0]; + var sub = ps[1] ? '.'+ ps[1] : '.00'; + var r = /(\d+)(\d{3})/; + while (r.test(whole)) { + whole = whole.replace(r, '$1' + ',' + '$2'); + } + return "$" + whole + sub ; + }, + + + date : function(v, format){ + if(!v){ + return ""; + } + if(!(v instanceof Date)){ + 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); + }; + }, + + + stripTagsRE : /<\/?[^>]+>/gi, + + + stripTags : function(v){ + return !v ? v : String(v).replace(this.stripTagsRE, ""); + } + }; +}(); + +Ext.MasterTemplate = function(){ + Ext.MasterTemplate.superclass.constructor.apply(this, arguments); + this.originalHtml = this.html; + var st = {}; + var m, re = this.subTemplateRe; + re.lastIndex = 0; + var subIndex = 0; + while(m = re.exec(this.html)){ + var name = m[1], content = m[2]; + st[subIndex] = { + name: name, + index: subIndex, + buffer: [], + tpl : new Ext.Template(content) + }; + if(name){ + st[name] = st[subIndex]; + } + st[subIndex].tpl.compile(); + st[subIndex].tpl.call = this.call.createDelegate(this); + subIndex++; + } + this.subCount = subIndex; + this.subs = st; +}; +Ext.extend(Ext.MasterTemplate, Ext.Template, { + + subTemplateRe : /((?:.|\n)*?)<\/tpl>/gi, + + + add : function(name, values){ + if(arguments.length == 1){ + values = arguments[0]; + name = 0; + } + var s = this.subs[name]; + s.buffer[s.buffer.length] = s.tpl.apply(values); + return this; + }, + + + fill : function(name, values, reset){ + var a = arguments; + if(a.length == 1 || (a.length == 2 && typeof a[1] == "boolean")){ + values = a[0]; + name = 0; + reset = a[1]; + } + if(reset){ + this.reset(); + } + for(var i = 0, len = values.length; i < len; i++){ + this.add(name, values[i]); + } + return this; + }, + + + reset : function(){ + var s = this.subs; + for(var i = 0; i < this.subCount; i++){ + s[i].buffer = []; + } + return this; + }, + + applyTemplate : function(values){ + var s = this.subs; + var replaceIndex = -1; + this.html = this.originalHtml.replace(this.subTemplateRe, function(m, name){ + return s[++replaceIndex].buffer.join(""); + }); + return Ext.MasterTemplate.superclass.applyTemplate.call(this, values); + }, + + apply : function(){ + return this.applyTemplate.apply(this, arguments); + }, + + compile : function(){return this;} +}); + + +Ext.MasterTemplate.prototype.addAll = Ext.MasterTemplate.prototype.fill; + +Ext.MasterTemplate.from = function(el, config){ + el = Ext.getDom(el); + return new Ext.MasterTemplate(el.value || el.innerHTML, config || ''); +}; +Ext.XTemplate = function(){ + Ext.XTemplate.superclass.constructor.apply(this, arguments); + var s = this.html; + + s = ['', s, ''].join(''); + + var re = /]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/; + + var nameRe = /^]*?for="(.*?)"/; + var ifRe = /^]*?if="(.*?)"/; + var execRe = /^]*?exec="(.*?)"/; + var m, id = 0; + var tpls = []; + + while(m = s.match(re)){ + var m2 = m[0].match(nameRe); + var m3 = m[0].match(ifRe); + var m4 = m[0].match(execRe); + var exp = null, fn = null, exec = null; + var name = m2 && m2[1] ? m2[1] : ''; + if(m3){ + exp = m3 && m3[1] ? m3[1] : null; + if(exp){ + fn = new Function('values', 'parent', 'with(values){ return '+(Ext.util.Format.htmlDecode(exp))+'; }'); + } + } + if(m4){ + exp = m4 && m4[1] ? m4[1] : null; + if(exp){ + exec = new Function('values', 'parent', 'with(values){ '+(Ext.util.Format.htmlDecode(exp))+'; }'); + } + } + if(name){ + switch(name){ + case '.': name = new Function('values', 'parent', 'with(values){ return values; }'); break; + case '..': name = new Function('values', 'parent', 'with(values){ return parent; }'); break; + default: name = new Function('values', 'parent', 'with(values){ return '+name+'; }'); + } + } + tpls.push({ + id: id, + target: name, + exec: exec, + test: fn, + body: m[1]||'' + }); + s = s.replace(m[0], '{xtpl'+ id + '}'); + ++id; + } + for(var i = tpls.length-1; i >= 0; --i){ + this.compileTpl(tpls[i]); + } + this.master = tpls[tpls.length-1]; + this.tpls = tpls; +}; +Ext.extend(Ext.XTemplate, Ext.Template, { + + re : /\{([\w-\.]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g, + + applySubTemplate : function(id, values, parent){ + var t = this.tpls[id]; + if(t.test && !t.test.call(this, values, parent)){ + return ''; + } + if(t.exec && t.exec.call(this, values, parent)){ + return ''; + } + var vs = t.target ? t.target.call(this, values, parent) : values; + parent = t.target ? values : parent; + if(t.target && vs instanceof Array){ + var buf = []; + for(var i = 0, len = vs.length; i < len; i++){ + buf[buf.length] = t.compiled.call(this, vs[i], parent); + } + return buf.join(''); + } + return t.compiled.call(this, vs, parent); + }, + + compileTpl : function(tpl){ + var fm = Ext.util.Format; + var useF = this.disableFormats !== true; + var sep = Ext.isGecko ? "+" : ","; + var fn = function(m, name, format, args){ + if(name.substr(0, 4) == 'xtpl'){ + return "'"+ sep +'this.applySubTemplate('+name.substr(4)+', values, parent)'+sep+"'"; + } + var v; + if(name.indexOf('.') != -1){ + v = name; + }else{ + v = "values['" + name + "']"; + } + 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+"'"; + }; + var body; + + if(Ext.isGecko){ + body = "tpl.compiled = function(values, parent){ return '" + + tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn) + + "';};"; + }else{ + body = ["tpl.compiled = function(values, parent){ return ['"]; + body.push(tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn)); + body.push("'].join('');};"); + body = body.join(''); + } + eval(body); + return this; + }, + + applyTemplate : function(values){ + return this.master.compiled.call(this, values, {}); + var s = this.subs; + }, + + apply : function(){ + return this.applyTemplate.apply(this, arguments); + }, + + compile : function(){return this;} +}); + +Ext.XTemplate.from = function(el){ + el = Ext.getDom(el); + return new Ext.XTemplate(el.value || el.innerHTML); +}; + +Ext.util.CSS = function(){ + var rules = null; + var doc = document; + + var camelRe = /(-[a-z])/gi; + var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); }; + + return { + + createStyleSheet : function(cssText, id){ + var ss; + var head = doc.getElementsByTagName("head")[0]; + var rules = doc.createElement("style"); + rules.setAttribute("type", "text/css"); + if(id){ + rules.setAttribute("id", id); + } + if(Ext.isIE){ + head.appendChild(rules); + ss = rules.styleSheet; + ss.cssText = cssText; + }else{ + try{ + rules.appendChild(doc.createTextNode(cssText)); + }catch(e){ + rules.cssText = cssText; + } + head.appendChild(rules); + ss = rules.styleSheet ? rules.styleSheet : (rules.sheet || doc.styleSheets[doc.styleSheets.length-1]); + } + this.cacheStyleSheet(ss); + return ss; + }, + + + removeStyleSheet : function(id){ + var existing = doc.getElementById(id); + if(existing){ + existing.parentNode.removeChild(existing); + } + }, + + + swapStyleSheet : function(id, url){ + this.removeStyleSheet(id); + var ss = doc.createElement("link"); + ss.setAttribute("rel", "stylesheet"); + ss.setAttribute("type", "text/css"); + ss.setAttribute("id", id); + ss.setAttribute("href", url); + doc.getElementsByTagName("head")[0].appendChild(ss); + }, + + + refreshCache : function(){ + return this.getRules(true); + }, + + + cacheStyleSheet : function(ss){ + if(!rules){ + rules = {}; + } + try{ + var ssRules = ss.cssRules || ss.rules; + for(var j = ssRules.length-1; j >= 0; --j){ + rules[ssRules[j].selectorText] = ssRules[j]; + } + }catch(e){} + }, + + + getRules : function(refreshCache){ + if(rules == null || refreshCache){ + rules = {}; + var ds = doc.styleSheets; + for(var i =0, len = ds.length; i < len; i++){ + try{ + this.cacheStyleSheet(ds[i]); + }catch(e){} + } + } + return rules; + }, + + + getRule : function(selector, refreshCache){ + var rs = this.getRules(refreshCache); + if(!(selector instanceof Array)){ + return rs[selector]; + } + for(var i = 0; i < selector.length; i++){ + if(rs[selector[i]]){ + return rs[selector[i]]; + } + } + return null; + }, + + + + updateRule : function(selector, property, value){ + if(!(selector instanceof Array)){ + var rule = this.getRule(selector); + if(rule){ + rule.style[property.replace(camelRe, camelFn)] = value; + return true; + } + }else{ + for(var i = 0; i < selector.length; i++){ + if(this.updateRule(selector[i], property, value)){ + return true; + } + } + } + return false; + } + }; +}(); + +Ext.util.ClickRepeater = function(el, config) +{ + this.el = Ext.get(el); + this.el.unselectable(); + + Ext.apply(this, config); + + this.addEvents({ + + "mousedown" : true, + + "click" : true, + + "mouseup" : true + }); + + this.el.on("mousedown", this.handleMouseDown, this); + if(this.preventDefault || this.stopDefault){ + this.el.on("click", function(e){ + if(this.preventDefault){ + e.preventDefault(); + } + if(this.stopDefault){ + e.stopEvent(); + } + }, this); + } + + if(this.handler){ + this.on("click", this.handler, this.scope || this); + } + + Ext.util.ClickRepeater.superclass.constructor.call(this); +}; + +Ext.extend(Ext.util.ClickRepeater, Ext.util.Observable, { + interval : 20, + delay: 250, + preventDefault : true, + stopDefault : false, + timer : 0, + + handleMouseDown : function(){ + clearTimeout(this.timer); + this.el.blur(); + if(this.pressClass){ + this.el.addClass(this.pressClass); + } + this.mousedownTime = new Date(); + + Ext.get(document).on("mouseup", this.handleMouseUp, this); + this.el.on("mouseout", this.handleMouseOut, this); + + this.fireEvent("mousedown", this); + this.fireEvent("click", this); + + this.timer = this.click.defer(this.delay || this.interval, this); + }, + + click : function(){ + this.fireEvent("click", this); + this.timer = this.click.defer(this.getInterval(), this); + }, + + getInterval: function(){ + if(!this.accelerate){ + return this.interval; + } + var pressTime = this.mousedownTime.getElapsed(); + if(pressTime < 500){ + return 400; + }else if(pressTime < 1700){ + return 320; + }else if(pressTime < 2600){ + return 250; + }else if(pressTime < 3500){ + return 180; + }else if(pressTime < 4400){ + return 140; + }else if(pressTime < 5300){ + return 80; + }else if(pressTime < 6200){ + return 50; + }else{ + return 10; + } + }, + + handleMouseOut : function(){ + clearTimeout(this.timer); + if(this.pressClass){ + this.el.removeClass(this.pressClass); + } + this.el.on("mouseover", this.handleMouseReturn, this); + }, + + handleMouseReturn : function(){ + this.el.un("mouseover", this.handleMouseReturn); + if(this.pressClass){ + this.el.addClass(this.pressClass); + } + this.click(); + }, + + handleMouseUp : function(){ + clearTimeout(this.timer); + this.el.un("mouseover", this.handleMouseReturn); + this.el.un("mouseout", this.handleMouseOut); + Ext.get(document).un("mouseup", this.handleMouseUp); + this.el.removeClass(this.pressClass); + this.fireEvent("mouseup", this); + } +}); + +Ext.KeyNav = function(el, config){ + this.el = Ext.get(el); + Ext.apply(this, config); + if(!this.disabled){ + this.disabled = true; + this.enable(); + } +}; + +Ext.KeyNav.prototype = { + + disabled : false, + + defaultEventAction: "stopEvent", + + forceKeyDown : false, + + prepareEvent : function(e){ + var k = e.getKey(); + var h = this.keyToHandler[k]; + if(Ext.isSafari && h && k >= 37 && k <= 40){ + e.stopEvent(); + } + }, + + relay : function(e){ + var k = e.getKey(); + var h = this.keyToHandler[k]; + if(h && this[h]){ + if(this.doRelay(e, this[h], h) !== true){ + e[this.defaultEventAction](); + } + } + }, + + doRelay : function(e, h, hname){ + return h.call(this.scope || this, e); + }, + + enter : false, + left : false, + right : false, + up : false, + down : false, + tab : false, + esc : false, + pageUp : false, + pageDown : false, + del : false, + home : false, + end : false, + + keyToHandler : { + 37 : "left", + 39 : "right", + 38 : "up", + 40 : "down", + 33 : "pageUp", + 34 : "pageDown", + 46 : "del", + 36 : "home", + 35 : "end", + 13 : "enter", + 27 : "esc", + 9 : "tab" + }, + + + enable: function(){ + if(this.disabled){ + if(this.forceKeyDown || Ext.isIE || Ext.isAir){ + this.el.on("keydown", this.relay, this); + }else{ + this.el.on("keydown", this.prepareEvent, this); + this.el.on("keypress", this.relay, this); + } + this.disabled = false; + } + }, + + + disable: function(){ + if(!this.disabled){ + if(this.forceKeyDown || Ext.isIE || Ext.isAir){ + this.el.un("keydown", this.relay); + }else{ + this.el.un("keydown", this.prepareEvent); + this.el.un("keypress", this.relay); + } + this.disabled = true; + } + } +}; + +Ext.KeyMap = function(el, config, eventName){ + this.el = Ext.get(el); + this.eventName = eventName || "keydown"; + this.bindings = []; + if(config){ + this.addBinding(config); + } + this.enable(); +}; + +Ext.KeyMap.prototype = { + + stopEvent : false, + + + addBinding : function(config){ + if(config instanceof Array){ + for(var i = 0, len = config.length; i < len; i++){ + this.addBinding(config[i]); + } + return; + } + var keyCode = config.key, + shift = config.shift, + ctrl = config.ctrl, + alt = config.alt, + fn = config.fn, + scope = config.scope; + if(typeof keyCode == "string"){ + var ks = []; + var keyString = keyCode.toUpperCase(); + for(var j = 0, len = keyString.length; j < len; j++){ + ks.push(keyString.charCodeAt(j)); + } + keyCode = ks; + } + var keyArray = keyCode instanceof Array; + var handler = function(e){ + if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) && (!alt || e.altKey)){ + var k = e.getKey(); + if(keyArray){ + for(var i = 0, len = keyCode.length; i < len; i++){ + if(keyCode[i] == k){ + if(this.stopEvent){ + e.stopEvent(); + } + fn.call(scope || window, k, e); + return; + } + } + }else{ + if(k == keyCode){ + if(this.stopEvent){ + e.stopEvent(); + } + fn.call(scope || window, k, e); + } + } + } + }; + this.bindings.push(handler); + }, + + + on : function(key, fn, scope){ + var keyCode, shift, ctrl, alt; + if(typeof key == "object" && !(key instanceof Array)){ + keyCode = key.key; + shift = key.shift; + ctrl = key.ctrl; + alt = key.alt; + }else{ + keyCode = key; + } + this.addBinding({ + key: keyCode, + shift: shift, + ctrl: ctrl, + alt: alt, + fn: fn, + scope: scope + }) + }, + + + handleKeyDown : function(e){ + if(this.enabled){ + var b = this.bindings; + for(var i = 0, len = b.length; i < len; i++){ + b[i].call(this, e); + } + } + }, + + + isEnabled : function(){ + return this.enabled; + }, + + + enable: function(){ + if(!this.enabled){ + this.el.on(this.eventName, this.handleKeyDown, this); + this.enabled = true; + } + }, + + + disable: function(){ + if(this.enabled){ + this.el.removeListener(this.eventName, this.handleKeyDown, this); + this.enabled = false; + } + } +}; + +Ext.util.TextMetrics = function(){ + var shared; + return { + + measure : function(el, text, fixedWidth){ + if(!shared){ + shared = Ext.util.TextMetrics.Instance(el, fixedWidth); + } + shared.bind(el); + shared.setFixedWidth(fixedWidth || 'auto'); + return shared.getSize(text); + }, + + + createInstance : function(el, fixedWidth){ + return Ext.util.TextMetrics.Instance(el, fixedWidth); + } + }; +}(); + +Ext.util.TextMetrics.Instance = function(bindTo, fixedWidth){ + var ml = new Ext.Element(document.createElement('div')); + document.body.appendChild(ml.dom); + ml.position('absolute'); + ml.setLeftTop(-1000, -1000); + ml.hide(); + + if(fixedWidth){ + ml.setWidth(fixedWidth); + } + + var instance = { + + getSize : function(text){ + ml.update(text); + var s = ml.getSize(); + ml.update(''); + return s; + }, + + + bind : function(el){ + ml.setStyle( + Ext.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height') + ); + }, + + + setFixedWidth : function(width){ + ml.setWidth(width); + }, + + + getWidth : function(text){ + ml.dom.style.width = 'auto'; + return this.getSize(text).width; + }, + + + getHeight : function(text){ + return this.getSize(text).height; + } + }; + + instance.bind(bindTo); + + return instance; +}; + +Ext.Element.measureText = Ext.util.TextMetrics.measure; + +Ext.state.Provider = function(){ + + this.addEvents({ + "statechange": true + }); + this.state = {}; + Ext.state.Provider.superclass.constructor.call(this); +}; +Ext.extend(Ext.state.Provider, Ext.util.Observable, { + + get : function(name, defaultValue){ + return typeof this.state[name] == "undefined" ? + defaultValue : this.state[name]; + }, + + + clear : function(name){ + delete this.state[name]; + this.fireEvent("statechange", this, name, null); + }, + + + set : function(name, value){ + this.state[name] = value; + this.fireEvent("statechange", this, name, value); + }, + + + decodeValue : function(cookie){ + var re = /^(a|n|d|b|s|o)\:(.*)$/; + var matches = re.exec(unescape(cookie)); + if(!matches || !matches[1]) return; + var type = matches[1]; + var v = matches[2]; + switch(type){ + case "n": + return parseFloat(v); + case "d": + return new Date(Date.parse(v)); + case "b": + return (v == "1"); + case "a": + var all = []; + var values = v.split("^"); + for(var i = 0, len = values.length; i < len; i++){ + all.push(this.decodeValue(values[i])); + } + return all; + case "o": + var all = {}; + var values = v.split("^"); + for(var i = 0, len = values.length; i < len; i++){ + var kv = values[i].split("="); + all[kv[0]] = this.decodeValue(kv[1]); + } + return all; + default: + return v; + } + }, + + + encodeValue : function(v){ + var enc; + if(typeof v == "number"){ + enc = "n:" + v; + }else if(typeof v == "boolean"){ + enc = "b:" + (v ? "1" : "0"); + }else if(v instanceof Date){ + enc = "d:" + v.toGMTString(); + }else if(v instanceof Array){ + var flat = ""; + for(var i = 0, len = v.length; i < len; i++){ + flat += this.encodeValue(v[i]); + if(i != len-1) flat += "^"; + } + enc = "a:" + flat; + }else if(typeof v == "object"){ + var flat = ""; + for(var key in v){ + if(typeof v[key] != "function"){ + flat += key + "=" + this.encodeValue(v[key]) + "^"; + } + } + enc = "o:" + flat.substring(0, flat.length-1); + }else{ + enc = "s:" + v; + } + return escape(enc); + } +}); + + +Ext.state.Manager = function(){ + var provider = new Ext.state.Provider(); + + return { + + setProvider : function(stateProvider){ + provider = stateProvider; + }, + + + get : function(key, defaultValue){ + return provider.get(key, defaultValue); + }, + + + set : function(key, value){ + provider.set(key, value); + }, + + + clear : function(key){ + provider.clear(key); + }, + + + getProvider : function(){ + return provider; + } + }; +}(); + + +Ext.state.CookieProvider = function(config){ + Ext.state.CookieProvider.superclass.constructor.call(this); + this.path = "/"; + this.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); + this.domain = null; + this.secure = false; + Ext.apply(this, config); + this.state = this.readCookies(); +}; + +Ext.extend(Ext.state.CookieProvider, Ext.state.Provider, { + + set : function(name, value){ + if(typeof value == "undefined" || value === null){ + this.clear(name); + return; + } + this.setCookie(name, value); + Ext.state.CookieProvider.superclass.set.call(this, name, value); + }, + + + clear : function(name){ + this.clearCookie(name); + Ext.state.CookieProvider.superclass.clear.call(this, name); + }, + + + readCookies : function(){ + var cookies = {}; + var c = document.cookie + ";"; + var re = /\s?(.*?)=(.*?);/g; + var matches; + while((matches = re.exec(c)) != null){ + var name = matches[1]; + var value = matches[2]; + if(name && name.substring(0,3) == "ys-"){ + cookies[name.substr(3)] = this.decodeValue(value); + } + } + return cookies; + }, + + + setCookie : function(name, value){ + document.cookie = "ys-"+ name + "=" + this.encodeValue(value) + + ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) + + ((this.path == null) ? "" : ("; path=" + this.path)) + + ((this.domain == null) ? "" : ("; domain=" + this.domain)) + + ((this.secure == true) ? "; secure" : ""); + }, + + + clearCookie : function(name){ + document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" + + ((this.path == null) ? "" : ("; path=" + this.path)) + + ((this.domain == null) ? "" : ("; domain=" + this.domain)) + + ((this.secure == true) ? "; secure" : ""); + } +}); + + + +(function() { + +var Event=Ext.EventManager; +var Dom=Ext.lib.Dom; + + +Ext.dd.DragDrop = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + } +}; + +Ext.dd.DragDrop.prototype = { + + + id: null, + + + config: null, + + + dragElId: null, + + + handleElId: null, + + + invalidHandleTypes: null, + + + invalidHandleIds: null, + + + invalidHandleClasses: null, + + + startPageX: 0, + + + startPageY: 0, + + + groups: null, + + + locked: false, + + + lock: function() { this.locked = true; }, + + + unlock: function() { this.locked = false; }, + + + isTarget: true, + + + padding: null, + + + _domRef: null, + + + __ygDragDrop: true, + + + constrainX: false, + + + constrainY: false, + + + minX: 0, + + + maxX: 0, + + + minY: 0, + + + maxY: 0, + + + maintainOffset: false, + + + xTicks: null, + + + yTicks: null, + + + primaryButtonOnly: true, + + + available: false, + + + hasOuterHandles: false, + + + b4StartDrag: function(x, y) { }, + + + startDrag: function(x, y) { }, + + + b4Drag: function(e) { }, + + + onDrag: function(e) { }, + + + onDragEnter: function(e, id) { }, + + + b4DragOver: function(e) { }, + + + onDragOver: function(e, id) { }, + + + b4DragOut: function(e) { }, + + + onDragOut: function(e, id) { }, + + + b4DragDrop: function(e) { }, + + + onDragDrop: function(e, id) { }, + + + onInvalidDrop: function(e) { }, + + + b4EndDrag: function(e) { }, + + + endDrag: function(e) { }, + + + b4MouseDown: function(e) { }, + + + onMouseDown: function(e) { }, + + + onMouseUp: function(e) { }, + + + onAvailable: function () { + }, + + + defaultPadding : {left:0, right:0, top:0, bottom:0}, + + + constrainTo : function(constrainTo, pad, inContent){ + if(typeof pad == "number"){ + pad = {left: pad, right:pad, top:pad, bottom:pad}; + } + pad = pad || this.defaultPadding; + var b = Ext.get(this.getEl()).getBox(); + var ce = Ext.get(constrainTo); + var s = ce.getScroll(); + var c, cd = ce.dom; + if(cd == document.body){ + c = { x: s.left, y: s.top, width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()}; + }else{ + xy = ce.getXY(); + c = {x : xy[0]+s.left, y: xy[1]+s.top, width: cd.clientWidth, height: cd.clientHeight}; + } + + + var topSpace = b.y - c.y; + var leftSpace = b.x - c.x; + + this.resetConstraints(); + this.setXConstraint(leftSpace - (pad.left||0), + c.width - leftSpace - b.width - (pad.right||0) + ); + this.setYConstraint(topSpace - (pad.top||0), + c.height - topSpace - b.height - (pad.bottom||0) + ); + }, + + + getEl: function() { + if (!this._domRef) { + this._domRef = Ext.getDom(this.id); + } + + return this._domRef; + }, + + + getDragEl: function() { + return Ext.getDom(this.dragElId); + }, + + + init: function(id, sGroup, config) { + this.initTarget(id, sGroup, config); + Event.on(this.id, "mousedown", this.handleMouseDown, this); + + }, + + + initTarget: function(id, sGroup, config) { + + + this.config = config || {}; + + + this.DDM = Ext.dd.DDM; + + this.groups = {}; + + + + if (typeof id !== "string") { + id = Ext.id(id); + } + + + this.id = id; + + + this.addToGroup((sGroup) ? sGroup : "default"); + + + + this.handleElId = id; + + + this.setDragElId(id); + + + this.invalidHandleTypes = { A: "A" }; + this.invalidHandleIds = {}; + this.invalidHandleClasses = []; + + this.applyConfig(); + + this.handleOnAvailable(); + }, + + + applyConfig: function() { + + + + this.padding = this.config.padding || [0, 0, 0, 0]; + this.isTarget = (this.config.isTarget !== false); + this.maintainOffset = (this.config.maintainOffset); + this.primaryButtonOnly = (this.config.primaryButtonOnly !== false); + + }, + + + handleOnAvailable: function() { + this.available = true; + this.resetConstraints(); + this.onAvailable(); + }, + + + setPadding: function(iTop, iRight, iBot, iLeft) { + + if (!iRight && 0 !== iRight) { + this.padding = [iTop, iTop, iTop, iTop]; + } else if (!iBot && 0 !== iBot) { + this.padding = [iTop, iRight, iTop, iRight]; + } else { + this.padding = [iTop, iRight, iBot, iLeft]; + } + }, + + + setInitPosition: function(diffX, diffY) { + var el = this.getEl(); + + if (!this.DDM.verifyEl(el)) { + return; + } + + var dx = diffX || 0; + var dy = diffY || 0; + + var p = Dom.getXY( el ); + + this.initPageX = p[0] - dx; + this.initPageY = p[1] - dy; + + this.lastPageX = p[0]; + this.lastPageY = p[1]; + + + this.setStartPosition(p); + }, + + + setStartPosition: function(pos) { + var p = pos || Dom.getXY( this.getEl() ); + this.deltaSetXY = null; + + this.startPageX = p[0]; + this.startPageY = p[1]; + }, + + + addToGroup: function(sGroup) { + this.groups[sGroup] = true; + this.DDM.regDragDrop(this, sGroup); + }, + + + removeFromGroup: function(sGroup) { + if (this.groups[sGroup]) { + delete this.groups[sGroup]; + } + + this.DDM.removeDDFromGroup(this, sGroup); + }, + + + setDragElId: function(id) { + this.dragElId = id; + }, + + + setHandleElId: function(id) { + if (typeof id !== "string") { + id = Ext.id(id); + } + this.handleElId = id; + this.DDM.regHandle(this.id, id); + }, + + + setOuterHandleElId: function(id) { + if (typeof id !== "string") { + id = Ext.id(id); + } + Event.on(id, "mousedown", + this.handleMouseDown, this); + this.setHandleElId(id); + + this.hasOuterHandles = true; + }, + + + unreg: function() { + Event.un(this.id, "mousedown", + this.handleMouseDown); + this._domRef = null; + this.DDM._remove(this); + }, + + destroy : function(){ + this.unreg(); + }, + + + isLocked: function() { + return (this.DDM.isLocked() || this.locked); + }, + + + handleMouseDown: function(e, oDD){ + if (this.primaryButtonOnly && e.button != 0) { + return; + } + + if (this.isLocked()) { + return; + } + + this.DDM.refreshCache(this.groups); + + var pt = new Ext.lib.Point(Ext.lib.Event.getPageX(e), Ext.lib.Event.getPageY(e)); + if (!this.hasOuterHandles && !this.DDM.isOverTarget(pt, this) ) { + } else { + if (this.clickValidator(e)) { + + + this.setStartPosition(); + + + this.b4MouseDown(e); + this.onMouseDown(e); + + this.DDM.handleMouseDown(e, this); + + this.DDM.stopEvent(e); + } else { + + + } + } + }, + + clickValidator: function(e) { + var target = e.getTarget(); + return ( this.isValidHandleChild(target) && + (this.id == this.handleElId || + this.DDM.handleWasClicked(target, this.id)) ); + }, + + + addInvalidHandleType: function(tagName) { + var type = tagName.toUpperCase(); + this.invalidHandleTypes[type] = type; + }, + + + addInvalidHandleId: function(id) { + if (typeof id !== "string") { + id = Ext.id(id); + } + this.invalidHandleIds[id] = id; + }, + + + addInvalidHandleClass: function(cssClass) { + this.invalidHandleClasses.push(cssClass); + }, + + + removeInvalidHandleType: function(tagName) { + var type = tagName.toUpperCase(); + + delete this.invalidHandleTypes[type]; + }, + + + removeInvalidHandleId: function(id) { + if (typeof id !== "string") { + id = Ext.id(id); + } + delete this.invalidHandleIds[id]; + }, + + + removeInvalidHandleClass: function(cssClass) { + for (var i=0, len=this.invalidHandleClasses.length; i= this.minX; i = i - iTickSize) { + if (!tickMap[i]) { + this.xTicks[this.xTicks.length] = i; + tickMap[i] = true; + } + } + + for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) { + if (!tickMap[i]) { + this.xTicks[this.xTicks.length] = i; + tickMap[i] = true; + } + } + + this.xTicks.sort(this.DDM.numericSort) ; + }, + + + setYTicks: function(iStartY, iTickSize) { + this.yTicks = []; + this.yTickSize = iTickSize; + + var tickMap = {}; + + for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) { + if (!tickMap[i]) { + this.yTicks[this.yTicks.length] = i; + tickMap[i] = true; + } + } + + for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) { + if (!tickMap[i]) { + this.yTicks[this.yTicks.length] = i; + tickMap[i] = true; + } + } + + this.yTicks.sort(this.DDM.numericSort) ; + }, + + + setXConstraint: function(iLeft, iRight, iTickSize) { + this.leftConstraint = iLeft; + this.rightConstraint = iRight; + + this.minX = this.initPageX - iLeft; + this.maxX = this.initPageX + iRight; + if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); } + + this.constrainX = true; + }, + + + clearConstraints: function() { + this.constrainX = false; + this.constrainY = false; + this.clearTicks(); + }, + + + clearTicks: function() { + this.xTicks = null; + this.yTicks = null; + this.xTickSize = 0; + this.yTickSize = 0; + }, + + + setYConstraint: function(iUp, iDown, iTickSize) { + this.topConstraint = iUp; + this.bottomConstraint = iDown; + + this.minY = this.initPageY - iUp; + this.maxY = this.initPageY + iDown; + if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); } + + this.constrainY = true; + + }, + + + resetConstraints: function() { + + + + if (this.initPageX || this.initPageX === 0) { + + var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0; + var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0; + + this.setInitPosition(dx, dy); + + + } else { + this.setInitPosition(); + } + + if (this.constrainX) { + this.setXConstraint( this.leftConstraint, + this.rightConstraint, + this.xTickSize ); + } + + if (this.constrainY) { + this.setYConstraint( this.topConstraint, + this.bottomConstraint, + this.yTickSize ); + } + }, + + + getTick: function(val, tickArray) { + + if (!tickArray) { + + + return val; + } else if (tickArray[0] >= val) { + + + return tickArray[0]; + } else { + for (var i=0, len=tickArray.length; i= val) { + var diff1 = val - tickArray[i]; + var diff2 = tickArray[next] - val; + return (diff2 > diff1) ? tickArray[i] : tickArray[next]; + } + } + + + + return tickArray[tickArray.length - 1]; + } + }, + + + toString: function() { + return ("DragDrop " + this.id); + } + +}; + +})(); + + + + +if (!Ext.dd.DragDropMgr) { + + +Ext.dd.DragDropMgr = function() { + + var Event = Ext.EventManager; + + return { + + + ids: {}, + + + handleIds: {}, + + + dragCurrent: null, + + + dragOvers: {}, + + + deltaX: 0, + + + deltaY: 0, + + + preventDefault: true, + + + stopPropagation: true, + + + initalized: false, + + + locked: false, + + + init: function() { + this.initialized = true; + }, + + + POINT: 0, + + + INTERSECT: 1, + + + mode: 0, + + + _execOnAll: function(sMethod, args) { + for (var i in this.ids) { + for (var j in this.ids[i]) { + var oDD = this.ids[i][j]; + if (! this.isTypeOfDD(oDD)) { + continue; + } + oDD[sMethod].apply(oDD, args); + } + } + }, + + + _onLoad: function() { + + this.init(); + + + Event.on(document, "mouseup", this.handleMouseUp, this, true); + Event.on(document, "mousemove", this.handleMouseMove, this, true); + Event.on(window, "unload", this._onUnload, this, true); + Event.on(window, "resize", this._onResize, this, true); + + + }, + + + _onResize: function(e) { + this._execOnAll("resetConstraints", []); + }, + + + lock: function() { this.locked = true; }, + + + unlock: function() { this.locked = false; }, + + + isLocked: function() { return this.locked; }, + + + locationCache: {}, + + + useCache: true, + + + clickPixelThresh: 3, + + + clickTimeThresh: 350, + + + dragThreshMet: false, + + + clickTimeout: null, + + + startX: 0, + + + startY: 0, + + + regDragDrop: function(oDD, sGroup) { + if (!this.initialized) { this.init(); } + + if (!this.ids[sGroup]) { + this.ids[sGroup] = {}; + } + this.ids[sGroup][oDD.id] = oDD; + }, + + + removeDDFromGroup: function(oDD, sGroup) { + if (!this.ids[sGroup]) { + this.ids[sGroup] = {}; + } + + var obj = this.ids[sGroup]; + if (obj && obj[oDD.id]) { + delete obj[oDD.id]; + } + }, + + + _remove: function(oDD) { + for (var g in oDD.groups) { + if (g && this.ids[g][oDD.id]) { + delete this.ids[g][oDD.id]; + } + } + delete this.handleIds[oDD.id]; + }, + + + regHandle: function(sDDId, sHandleId) { + if (!this.handleIds[sDDId]) { + this.handleIds[sDDId] = {}; + } + this.handleIds[sDDId][sHandleId] = sHandleId; + }, + + + isDragDrop: function(id) { + return ( this.getDDById(id) ) ? true : false; + }, + + + getRelated: function(p_oDD, bTargetsOnly) { + var oDDs = []; + for (var i in p_oDD.groups) { + for (j in this.ids[i]) { + var dd = this.ids[i][j]; + if (! this.isTypeOfDD(dd)) { + continue; + } + if (!bTargetsOnly || dd.isTarget) { + oDDs[oDDs.length] = dd; + } + } + } + + return oDDs; + }, + + + isLegalTarget: function (oDD, oTargetDD) { + var targets = this.getRelated(oDD, true); + for (var i=0, len=targets.length;i this.clickPixelThresh || + diffY > this.clickPixelThresh) { + this.startDrag(this.startX, this.startY); + } + } + + if (this.dragThreshMet) { + this.dragCurrent.b4Drag(e); + this.dragCurrent.onDrag(e); + if(!this.dragCurrent.moveOnly){ + this.fireEvents(e, false); + } + } + + this.stopEvent(e); + + return true; + }, + + + fireEvents: function(e, isDrop) { + var dc = this.dragCurrent; + + + + if (!dc || dc.isLocked()) { + return; + } + + var pt = e.getPoint(); + + + var oldOvers = []; + + var outEvts = []; + var overEvts = []; + var dropEvts = []; + var enterEvts = []; + + + + for (var i in this.dragOvers) { + + var ddo = this.dragOvers[i]; + + if (! this.isTypeOfDD(ddo)) { + continue; + } + + if (! this.isOverTarget(pt, ddo, this.mode)) { + outEvts.push( ddo ); + } + + oldOvers[i] = true; + delete this.dragOvers[i]; + } + + for (var sGroup in dc.groups) { + + if ("string" != typeof sGroup) { + continue; + } + + for (i in this.ids[sGroup]) { + var oDD = this.ids[sGroup][i]; + if (! this.isTypeOfDD(oDD)) { + continue; + } + + if (oDD.isTarget && !oDD.isLocked() && oDD != dc) { + if (this.isOverTarget(pt, oDD, this.mode)) { + + if (isDrop) { + dropEvts.push( oDD ); + + } else { + + + if (!oldOvers[oDD.id]) { + enterEvts.push( oDD ); + + } else { + overEvts.push( oDD ); + } + + this.dragOvers[oDD.id] = oDD; + } + } + } + } + } + + if (this.mode) { + if (outEvts.length) { + dc.b4DragOut(e, outEvts); + dc.onDragOut(e, outEvts); + } + + if (enterEvts.length) { + dc.onDragEnter(e, enterEvts); + } + + if (overEvts.length) { + dc.b4DragOver(e, overEvts); + dc.onDragOver(e, overEvts); + } + + if (dropEvts.length) { + dc.b4DragDrop(e, dropEvts); + dc.onDragDrop(e, dropEvts); + } + + } else { + + var len = 0; + for (i=0, len=outEvts.length; i 2000) { + } else { + setTimeout(DDM._addListeners, 10); + if (document && document.body) { + DDM._timeoutCount += 1; + } + } + } + }, + + + handleWasClicked: function(node, id) { + if (this.isHandle(id, node.id)) { + return true; + } else { + + var p = node.parentNode; + + while (p) { + if (this.isHandle(id, p.id)) { + return true; + } else { + p = p.parentNode; + } + } + } + + return false; + } + + }; + +}(); + + +Ext.dd.DDM = Ext.dd.DragDropMgr; +Ext.dd.DDM._addListeners(); + +} + + +Ext.dd.DD = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + } +}; + +Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, { + + + scroll: true, + + + autoOffset: function(iPageX, iPageY) { + var x = iPageX - this.startPageX; + var y = iPageY - this.startPageY; + this.setDelta(x, y); + }, + + + setDelta: function(iDeltaX, iDeltaY) { + this.deltaX = iDeltaX; + this.deltaY = iDeltaY; + }, + + + setDragElPos: function(iPageX, iPageY) { + + + + var el = this.getDragEl(); + this.alignElWithMouse(el, iPageX, iPageY); + }, + + + alignElWithMouse: function(el, iPageX, iPageY) { + var oCoord = this.getTargetCoord(iPageX, iPageY); + var fly = el.dom ? el : Ext.fly(el); + if (!this.deltaSetXY) { + var aCoord = [oCoord.x, oCoord.y]; + fly.setXY(aCoord); + var newLeft = fly.getLeft(true); + var newTop = fly.getTop(true); + this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ]; + } else { + fly.setLeftTop(oCoord.x + this.deltaSetXY[0], oCoord.y + this.deltaSetXY[1]); + } + + this.cachePosition(oCoord.x, oCoord.y); + this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth); + return oCoord; + }, + + + cachePosition: function(iPageX, iPageY) { + if (iPageX) { + this.lastPageX = iPageX; + this.lastPageY = iPageY; + } else { + var aCoord = Ext.lib.Dom.getXY(this.getEl()); + this.lastPageX = aCoord[0]; + this.lastPageY = aCoord[1]; + } + }, + + + autoScroll: function(x, y, h, w) { + + if (this.scroll) { + + var clientH = Ext.lib.Dom.getViewWidth(); + + + var clientW = Ext.lib.Dom.getViewHeight(); + + + var st = this.DDM.getScrollTop(); + + + var sl = this.DDM.getScrollLeft(); + + + var bot = h + y; + + + var right = w + x; + + + + + var toBot = (clientH + st - y - this.deltaY); + + + var toRight = (clientW + sl - x - this.deltaX); + + + + + var thresh = 40; + + + + + var scrAmt = (document.all) ? 80 : 30; + + + + if ( bot > clientH && toBot < thresh ) { + window.scrollTo(sl, st + scrAmt); + } + + + + if ( y < st && st > 0 && y - st < thresh ) { + window.scrollTo(sl, st - scrAmt); + } + + + + if ( right > clientW && toRight < thresh ) { + window.scrollTo(sl + scrAmt, st); + } + + + + if ( x < sl && sl > 0 && x - sl < thresh ) { + window.scrollTo(sl - scrAmt, st); + } + } + }, + + + getTargetCoord: function(iPageX, iPageY) { + + + var x = iPageX - this.deltaX; + var y = iPageY - this.deltaY; + + if (this.constrainX) { + if (x < this.minX) { x = this.minX; } + if (x > this.maxX) { x = this.maxX; } + } + + if (this.constrainY) { + if (y < this.minY) { y = this.minY; } + if (y > this.maxY) { y = this.maxY; } + } + + x = this.getTick(x, this.xTicks); + y = this.getTick(y, this.yTicks); + + + return {x:x, y:y}; + }, + + + applyConfig: function() { + Ext.dd.DD.superclass.applyConfig.call(this); + this.scroll = (this.config.scroll !== false); + }, + + + b4MouseDown: function(e) { + + this.autoOffset(e.getPageX(), + e.getPageY()); + }, + + + b4Drag: function(e) { + this.setDragElPos(e.getPageX(), + e.getPageY()); + }, + + toString: function() { + return ("DD " + this.id); + } + + + + + + +}); + +Ext.dd.DDProxy = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + this.initFrame(); + } +}; + + +Ext.dd.DDProxy.dragElId = "ygddfdiv"; + +Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, { + + + resizeFrame: true, + + + centerFrame: false, + + + createFrame: function() { + var self = this; + var body = document.body; + + if (!body || !body.firstChild) { + setTimeout( function() { self.createFrame(); }, 50 ); + return; + } + + var div = this.getDragEl(); + + if (!div) { + div = document.createElement("div"); + div.id = this.dragElId; + var s = div.style; + + s.position = "absolute"; + s.visibility = "hidden"; + s.cursor = "move"; + s.border = "2px solid #aaa"; + s.zIndex = 999; + + + + + body.insertBefore(div, body.firstChild); + } + }, + + + initFrame: function() { + this.createFrame(); + }, + + applyConfig: function() { + Ext.dd.DDProxy.superclass.applyConfig.call(this); + + this.resizeFrame = (this.config.resizeFrame !== false); + this.centerFrame = (this.config.centerFrame); + this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId); + }, + + + showFrame: function(iPageX, iPageY) { + var el = this.getEl(); + var dragEl = this.getDragEl(); + var s = dragEl.style; + + this._resizeProxy(); + + if (this.centerFrame) { + this.setDelta( Math.round(parseInt(s.width, 10)/2), + Math.round(parseInt(s.height, 10)/2) ); + } + + this.setDragElPos(iPageX, iPageY); + + Ext.fly(dragEl).show(); + }, + + + _resizeProxy: function() { + if (this.resizeFrame) { + var el = this.getEl(); + Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight); + } + }, + + + b4MouseDown: function(e) { + var x = e.getPageX(); + var y = e.getPageY(); + this.autoOffset(x, y); + this.setDragElPos(x, y); + }, + + + b4StartDrag: function(x, y) { + + this.showFrame(x, y); + }, + + + b4EndDrag: function(e) { + Ext.fly(this.getDragEl()).hide(); + }, + + + + + endDrag: function(e) { + + var lel = this.getEl(); + var del = this.getDragEl(); + + + del.style.visibility = ""; + + this.beforeMove(); + + + lel.style.visibility = "hidden"; + Ext.dd.DDM.moveToEl(lel, del); + del.style.visibility = "hidden"; + lel.style.visibility = ""; + + this.afterDrag(); + }, + + beforeMove : function(){ + + }, + + afterDrag : function(){ + + }, + + toString: function() { + return ("DDProxy " + this.id); + } + +}); + +Ext.dd.DDTarget = function(id, sGroup, config) { + if (id) { + this.initTarget(id, sGroup, config); + } +}; + + +Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, { + toString: function() { + return ("DDTarget " + this.id); + } +}); + + +Ext.dd.ScrollManager = function(){ + var ddm = Ext.dd.DragDropMgr; + var els = {}; + var dragEl = null; + var proc = {}; + + var onStop = function(e){ + dragEl = null; + clearProc(); + }; + + var triggerRefresh = function(){ + if(ddm.dragCurrent){ + ddm.refreshCache(ddm.dragCurrent.groups); + } + }; + + var doScroll = function(){ + if(ddm.dragCurrent){ + var dds = Ext.dd.ScrollManager; + if(!dds.animate){ + if(proc.el.scroll(proc.dir, dds.increment)){ + triggerRefresh(); + } + }else{ + proc.el.scroll(proc.dir, dds.increment, true, dds.animDuration, triggerRefresh); + } + } + }; + + var clearProc = function(){ + if(proc.id){ + clearInterval(proc.id); + } + proc.id = 0; + proc.el = null; + proc.dir = ""; + }; + + var startProc = function(el, dir){ + clearProc(); + proc.el = el; + proc.dir = dir; + proc.id = setInterval(doScroll, Ext.dd.ScrollManager.frequency); + }; + + var onFire = function(e, isDrop){ + if(isDrop || !ddm.dragCurrent){ return; } + var dds = Ext.dd.ScrollManager; + if(!dragEl || dragEl != ddm.dragCurrent){ + dragEl = ddm.dragCurrent; + + dds.refreshCache(); + } + + var xy = Ext.lib.Event.getXY(e); + var pt = new Ext.lib.Point(xy[0], xy[1]); + for(var id in els){ + var el = els[id], r = el._region; + if(r && r.contains(pt) && el.isScrollable()){ + if(r.bottom - pt.y <= dds.thresh){ + if(proc.el != el){ + startProc(el, "down"); + } + return; + }else if(r.right - pt.x <= dds.thresh){ + if(proc.el != el){ + startProc(el, "left"); + } + return; + }else if(pt.y - r.top <= dds.thresh){ + if(proc.el != el){ + startProc(el, "up"); + } + return; + }else if(pt.x - r.left <= dds.thresh){ + if(proc.el != el){ + startProc(el, "right"); + } + return; + } + } + } + clearProc(); + }; + + ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm); + ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm); + + return { + + register : function(el){ + if(el instanceof Array){ + for(var i = 0, len = el.length; i < len; i++) { + this.register(el[i]); + } + }else{ + el = Ext.get(el); + els[el.id] = el; + } + }, + + + unregister : function(el){ + if(el instanceof Array){ + for(var i = 0, len = el.length; i < len; i++) { + this.unregister(el[i]); + } + }else{ + el = Ext.get(el); + delete els[el.id]; + } + }, + + + thresh : 25, + + + increment : 100, + + + frequency : 500, + + + animate: true, + + + animDuration: .4, + + + refreshCache : function(){ + for(var id in els){ + if(typeof els[id] == 'object'){ + els[id]._region = els[id].getRegion(); + } + } + } + }; +}(); + +Ext.dd.Registry = function(){ + var elements = {}; + var handles = {}; + var autoIdSeed = 0; + + var getId = function(el, autogen){ + if(typeof el == "string"){ + return el; + } + var id = el.id; + if(!id && autogen !== false){ + id = "extdd-" + (++autoIdSeed); + el.id = id; + } + return id; + }; + + return { + + register : function(el, data){ + data = data || {}; + if(typeof el == "string"){ + el = document.getElementById(el); + } + data.ddel = el; + elements[getId(el)] = data; + if(data.isHandle !== false){ + handles[data.ddel.id] = data; + } + if(data.handles){ + var hs = data.handles; + for(var i = 0, len = hs.length; i < len; i++){ + handles[getId(hs[i])] = data; + } + } + }, + + + unregister : function(el){ + var id = getId(el, false); + var data = elements[id]; + if(data){ + delete elements[id]; + if(data.handles){ + var hs = data.handles; + for(var i = 0, len = hs.length; i < len; i++){ + delete handles[getId(hs[i], false)]; + } + } + } + }, + + + getHandle : function(id){ + if(typeof id != "string"){ + id = id.id; + } + return handles[id]; + }, + + + getHandleFromEvent : function(e){ + var t = Ext.lib.Event.getTarget(e); + return t ? handles[t.id] : null; + }, + + + getTarget : function(id){ + if(typeof id != "string"){ + id = id.id; + } + return elements[id]; + }, + + + getTargetFromEvent : function(e){ + var t = Ext.lib.Event.getTarget(e); + return t ? elements[t.id] || handles[t.id] : null; + } + }; +}(); + +Ext.dd.StatusProxy = function(config){ + Ext.apply(this, config); + this.id = this.id || Ext.id(); + this.el = new Ext.Layer({ + dh: { + id: this.id, tag: "div", cls: "x-dd-drag-proxy "+this.dropNotAllowed, children: [ + {tag: "div", cls: "x-dd-drop-icon"}, + {tag: "div", cls: "x-dd-drag-ghost"} + ] + }, + shadow: !config || config.shadow !== false + }); + this.ghost = Ext.get(this.el.dom.childNodes[1]); + this.dropStatus = this.dropNotAllowed; +}; + +Ext.dd.StatusProxy.prototype = { + + dropAllowed : "x-dd-drop-ok", + + dropNotAllowed : "x-dd-drop-nodrop", + + + setStatus : function(cssClass){ + cssClass = cssClass || this.dropNotAllowed; + if(this.dropStatus != cssClass){ + this.el.replaceClass(this.dropStatus, cssClass); + this.dropStatus = cssClass; + } + }, + + + reset : function(clearGhost){ + this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed; + this.dropStatus = this.dropNotAllowed; + if(clearGhost){ + this.ghost.update(""); + } + }, + + + update : function(html){ + if(typeof html == "string"){ + this.ghost.update(html); + }else{ + this.ghost.update(""); + html.style.margin = "0"; + this.ghost.dom.appendChild(html); + } + }, + + + getEl : function(){ + return this.el; + }, + + + getGhost : function(){ + return this.ghost; + }, + + + hide : function(clear){ + this.el.hide(); + if(clear){ + this.reset(true); + } + }, + + + stop : function(){ + if(this.anim && this.anim.isAnimated && this.anim.isAnimated()){ + this.anim.stop(); + } + }, + + + show : function(){ + this.el.show(); + }, + + + sync : function(){ + this.el.sync(); + }, + + + repair : function(xy, callback, scope){ + this.callback = callback; + this.scope = scope; + if(xy && this.animRepair !== false){ + this.el.addClass("x-dd-drag-repair"); + this.el.hideUnders(true); + this.anim = this.el.shift({ + duration: this.repairDuration || .5, + easing: 'easeOut', + xy: xy, + stopFx: true, + callback: this.afterRepair, + scope: this + }); + }else{ + this.afterRepair(); + } + }, + + + afterRepair : function(){ + this.hide(true); + if(typeof this.callback == "function"){ + this.callback.call(this.scope || this); + } + this.callback = null; + this.scope = null; + } +}; + +Ext.dd.DragSource = function(el, config){ + this.el = Ext.get(el); + this.dragData = {}; + + Ext.apply(this, config); + + if(!this.proxy){ + this.proxy = new Ext.dd.StatusProxy(); + } + + Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, + {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true}); + + this.dragging = false; +}; + +Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, { + + dropAllowed : "x-dd-drop-ok", + + dropNotAllowed : "x-dd-drop-nodrop", + + + getDragData : function(e){ + return this.dragData; + }, + + + onDragEnter : function(e, id){ + var target = Ext.dd.DragDropMgr.getDDById(id); + this.cachedTarget = target; + if(this.beforeDragEnter(target, e, id) !== false){ + if(target.isNotifyTarget){ + var status = target.notifyEnter(this, e, this.dragData); + this.proxy.setStatus(status); + }else{ + this.proxy.setStatus(this.dropAllowed); + } + + if(this.afterDragEnter){ + + this.afterDragEnter(target, e, id); + } + } + }, + + + beforeDragEnter : function(target, e, id){ + return true; + }, + + + alignElWithMouse: function() { + Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments); + this.proxy.sync(); + }, + + + onDragOver : function(e, id){ + var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); + if(this.beforeDragOver(target, e, id) !== false){ + if(target.isNotifyTarget){ + var status = target.notifyOver(this, e, this.dragData); + this.proxy.setStatus(status); + } + + if(this.afterDragOver){ + + this.afterDragOver(target, e, id); + } + } + }, + + + beforeDragOver : function(target, e, id){ + return true; + }, + + + onDragOut : function(e, id){ + var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); + if(this.beforeDragOut(target, e, id) !== false){ + if(target.isNotifyTarget){ + target.notifyOut(this, e, this.dragData); + } + this.proxy.reset(); + if(this.afterDragOut){ + + this.afterDragOut(target, e, id); + } + } + this.cachedTarget = null; + }, + + + beforeDragOut : function(target, e, id){ + return true; + }, + + + onDragDrop : function(e, id){ + var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); + if(this.beforeDragDrop(target, e, id) !== false){ + if(target.isNotifyTarget){ + if(target.notifyDrop(this, e, this.dragData)){ + this.onValidDrop(target, e, id); + }else{ + this.onInvalidDrop(target, e, id); + } + }else{ + this.onValidDrop(target, e, id); + } + + if(this.afterDragDrop){ + + this.afterDragDrop(target, e, id); + } + } + delete this.cachedTarget; + }, + + + beforeDragDrop : function(target, e, id){ + return true; + }, + + + onValidDrop : function(target, e, id){ + this.hideProxy(); + if(this.afterValidDrop){ + + this.afterValidDrop(target, e, id); + } + }, + + + getRepairXY : function(e, data){ + return this.el.getXY(); + }, + + + onInvalidDrop : function(target, e, id){ + this.beforeInvalidDrop(target, e, id); + if(this.cachedTarget){ + if(this.cachedTarget.isNotifyTarget){ + this.cachedTarget.notifyOut(this, e, this.dragData); + } + this.cacheTarget = null; + } + this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this); + + if(this.afterInvalidDrop){ + + this.afterInvalidDrop(e, id); + } + }, + + + afterRepair : function(){ + if(Ext.enableFx){ + this.el.highlight(this.hlColor || "c3daf9"); + } + this.dragging = false; + }, + + + beforeInvalidDrop : function(target, e, id){ + return true; + }, + + + handleMouseDown : function(e){ + if(this.dragging) { + return; + } + var data = this.getDragData(e); + if(data && this.onBeforeDrag(data, e) !== false){ + this.dragData = data; + this.proxy.stop(); + Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments); + } + }, + + + onBeforeDrag : function(data, e){ + return true; + }, + + + onStartDrag : Ext.emptyFn, + + + startDrag : function(x, y){ + this.proxy.reset(); + this.dragging = true; + this.proxy.update(""); + this.onInitDrag(x, y); + this.proxy.show(); + }, + + + onInitDrag : function(x, y){ + var clone = this.el.dom.cloneNode(true); + clone.id = Ext.id(); + this.proxy.update(clone); + this.onStartDrag(x, y); + return true; + }, + + + getProxy : function(){ + return this.proxy; + }, + + + hideProxy : function(){ + this.proxy.hide(); + this.proxy.reset(true); + this.dragging = false; + }, + + + triggerCacheRefresh : function(){ + Ext.dd.DDM.refreshCache(this.groups); + }, + + + b4EndDrag: function(e) { + }, + + + endDrag : function(e){ + this.onEndDrag(this.dragData, e); + }, + + + onEndDrag : function(data, e){ + }, + + + autoOffset : function(x, y) { + this.setDelta(-12, -20); + } +}); + +Ext.dd.DropTarget = function(el, config){ + this.el = Ext.get(el); + + Ext.apply(this, config); + + if(this.containerScroll){ + Ext.dd.ScrollManager.register(this.el); + } + + Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, + {isTarget: true}); + +}; + +Ext.extend(Ext.dd.DropTarget, Ext.dd.DDTarget, { + + + dropAllowed : "x-dd-drop-ok", + + dropNotAllowed : "x-dd-drop-nodrop", + + + isTarget : true, + + + isNotifyTarget : true, + + + notifyEnter : function(dd, e, data){ + if(this.overClass){ + this.el.addClass(this.overClass); + } + return this.dropAllowed; + }, + + + notifyOver : function(dd, e, data){ + return this.dropAllowed; + }, + + + notifyOut : function(dd, e, data){ + if(this.overClass){ + this.el.removeClass(this.overClass); + } + }, + + + notifyDrop : function(dd, e, data){ + return false; + } +}); + +Ext.dd.DragZone = function(el, config){ + Ext.dd.DragZone.superclass.constructor.call(this, el, config); + if(this.containerScroll){ + Ext.dd.ScrollManager.register(this.el); + } +}; + +Ext.extend(Ext.dd.DragZone, Ext.dd.DragSource, { + + + + + getDragData : function(e){ + return Ext.dd.Registry.getHandleFromEvent(e); + }, + + + onInitDrag : function(x, y){ + this.proxy.update(this.dragData.ddel.cloneNode(true)); + this.onStartDrag(x, y); + return true; + }, + + + afterRepair : function(){ + if(Ext.enableFx){ + Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9"); + } + this.dragging = false; + }, + + + getRepairXY : function(e){ + return Ext.Element.fly(this.dragData.ddel).getXY(); + } +}); + +Ext.dd.DropZone = function(el, config){ + Ext.dd.DropZone.superclass.constructor.call(this, el, config); +}; + +Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, { + + getTargetFromEvent : function(e){ + return Ext.dd.Registry.getTargetFromEvent(e); + }, + + + onNodeEnter : function(n, dd, e, data){ + + }, + + + onNodeOver : function(n, dd, e, data){ + return this.dropAllowed; + }, + + + onNodeOut : function(n, dd, e, data){ + + }, + + + onNodeDrop : function(n, dd, e, data){ + return false; + }, + + + onContainerOver : function(dd, e, data){ + return this.dropNotAllowed; + }, + + + onContainerDrop : function(dd, e, data){ + return false; + }, + + + notifyEnter : function(dd, e, data){ + return this.dropNotAllowed; + }, + + + notifyOver : function(dd, e, data){ + var n = this.getTargetFromEvent(e); + if(!n){ + if(this.lastOverNode){ + this.onNodeOut(this.lastOverNode, dd, e, data); + this.lastOverNode = null; + } + return this.onContainerOver(dd, e, data); + } + if(this.lastOverNode != n){ + if(this.lastOverNode){ + this.onNodeOut(this.lastOverNode, dd, e, data); + } + this.onNodeEnter(n, dd, e, data); + this.lastOverNode = n; + } + return this.onNodeOver(n, dd, e, data); + }, + + + notifyOut : function(dd, e, data){ + if(this.lastOverNode){ + this.onNodeOut(this.lastOverNode, dd, e, data); + this.lastOverNode = null; + } + }, + + + notifyDrop : function(dd, e, data){ + if(this.lastOverNode){ + this.onNodeOut(this.lastOverNode, dd, e, data); + this.lastOverNode = null; + } + var n = this.getTargetFromEvent(e); + return n ? + this.onNodeDrop(n, dd, e, data) : + this.onContainerDrop(dd, e, data); + }, + + + triggerCacheRefresh : function(){ + Ext.dd.DDM.refreshCache(this.groups); + } +}); + + +Ext.data.SortTypes = { + + none : function(s){ + return s; + }, + + + stripTagsRE : /<\/?[^>]+>/gi, + + + asText : function(s){ + return String(s).replace(this.stripTagsRE, ""); + }, + + + asUCText : function(s){ + return String(s).toUpperCase().replace(this.stripTagsRE, ""); + }, + + + asUCString : function(s) { + return String(s).toUpperCase(); + }, + + + asDate : function(s) { + if(!s){ + return 0; + } + if(s instanceof Date){ + return s.getTime(); + } + return Date.parse(String(s)); + }, + + + asFloat : function(s) { + var val = parseFloat(String(s).replace(/,/g, "")); + if(isNaN(val)) val = 0; + return val; + }, + + + asInt : function(s) { + var val = parseInt(String(s).replace(/,/g, "")); + if(isNaN(val)) val = 0; + return val; + } +}; + +Ext.data.Record = function(data, id){ + this.id = (id || id === 0) ? id : ++Ext.data.Record.AUTO_ID; + this.data = data; +}; + + +Ext.data.Record.create = function(o){ + var f = function(){ + f.superclass.constructor.apply(this, arguments); + }; + Ext.extend(f, Ext.data.Record); + var p = f.prototype; + p.fields = new Ext.util.MixedCollection(false, function(field){ + return field.name; + }); + for(var i = 0, len = o.length; i < len; i++){ + p.fields.add(new Ext.data.Field(o[i])); + } + f.getField = function(name){ + return p.fields.get(name); + }; + return f; +}; + +Ext.data.Record.AUTO_ID = 1000; +Ext.data.Record.EDIT = 'edit'; +Ext.data.Record.REJECT = 'reject'; +Ext.data.Record.COMMIT = 'commit'; + +Ext.data.Record.prototype = { + + dirty : false, + editing : false, + error: null, + modified: null, + + + join : function(store){ + this.store = store; + }, + + + set : function(name, value){ + if(this.data[name] == value){ + return; + } + this.dirty = true; + if(!this.modified){ + this.modified = {}; + } + if(typeof this.modified[name] == 'undefined'){ + this.modified[name] = this.data[name]; + } + this.data[name] = value; + if(!this.editing){ + this.store.afterEdit(this); + } + }, + + + get : function(name){ + return this.data[name]; + }, + + + beginEdit : function(){ + this.editing = true; + this.modified = {}; + }, + + + cancelEdit : function(){ + this.editing = false; + delete this.modified; + }, + + + endEdit : function(){ + this.editing = false; + if(this.dirty && this.store){ + this.store.afterEdit(this); + } + }, + + + reject : function(){ + var m = this.modified; + for(var n in m){ + if(typeof m[n] != "function"){ + this.data[n] = m[n]; + } + } + this.dirty = false; + delete this.modified; + this.editing = false; + if(this.store){ + this.store.afterReject(this); + } + }, + + + commit : function(){ + this.dirty = false; + delete this.modified; + this.editing = false; + if(this.store){ + this.store.afterCommit(this); + } + }, + + + hasError : function(){ + return this.error != null; + }, + + + clearError : function(){ + this.error = null; + }, + + + copy : function(newId) { + return new this.constructor(Ext.apply({}, this.data), newId || this.id); + } +}; + +Ext.data.Store = function(config){ + this.data = new Ext.util.MixedCollection(false); + this.data.getKey = function(o){ + return o.id; + }; + this.baseParams = {}; + + this.paramNames = { + "start" : "start", + "limit" : "limit", + "sort" : "sort", + "dir" : "dir" + }; + + if(config && config.data){ + this.inlineData = config.data; + delete config.data; + } + + Ext.apply(this, config); + + if(this.reader){ + if(!this.recordType){ + this.recordType = this.reader.recordType; + } + if(this.reader.onMetaChange){ + this.reader.onMetaChange = this.onMetaChange.createDelegate(this); + } + } + + if(this.recordType){ + this.fields = this.recordType.prototype.fields; + } + this.modified = []; + + this.addEvents({ + + datachanged : true, + + metachange : true, + + add : true, + + remove : true, + + update : true, + + clear : true, + + beforeload : true, + + load : true, + + loadexception : true + }); + + if(this.proxy){ + this.relayEvents(this.proxy, ["loadexception"]); + } + this.sortToggle = {}; + + Ext.data.Store.superclass.constructor.call(this); + + if(this.inlineData){ + this.loadData(this.inlineData); + delete this.inlineData; + } +}; +Ext.extend(Ext.data.Store, Ext.util.Observable, { + + + + + + + remoteSort : false, + + + pruneModifiedRecords : false, + + + lastOptions : null, + + + add : function(records){ + records = [].concat(records); + for(var i = 0, len = records.length; i < len; i++){ + records[i].join(this); + } + var index = this.data.length; + this.data.addAll(records); + this.fireEvent("add", this, records, index); + }, + + + remove : function(record){ + var index = this.data.indexOf(record); + this.data.removeAt(index); + if(this.pruneModifiedRecords){ + this.modified.remove(record); + } + this.fireEvent("remove", this, record, index); + }, + + + removeAll : function(){ + this.data.clear(); + if(this.pruneModifiedRecords){ + this.modified = []; + } + this.fireEvent("clear", this); + }, + + + insert : function(index, records){ + records = [].concat(records); + for(var i = 0, len = records.length; i < len; i++){ + this.data.insert(index, records[i]); + records[i].join(this); + } + this.fireEvent("add", this, records, index); + }, + + + indexOf : function(record){ + return this.data.indexOf(record); + }, + + + indexOfId : function(id){ + return this.data.indexOfKey(id); + }, + + + getById : function(id){ + return this.data.key(id); + }, + + + getAt : function(index){ + return this.data.itemAt(index); + }, + + + getRange : function(start, end){ + return this.data.getRange(start, end); + }, + + + storeOptions : function(o){ + o = Ext.apply({}, o); + delete o.callback; + delete o.scope; + this.lastOptions = o; + }, + + + load : function(options){ + options = options || {}; + if(this.fireEvent("beforeload", this, options) !== false){ + this.storeOptions(options); + var p = Ext.apply(options.params || {}, this.baseParams); + if(this.sortInfo && this.remoteSort){ + var pn = this.paramNames; + p[pn["sort"]] = this.sortInfo.field; + p[pn["dir"]] = this.sortInfo.direction; + } + this.proxy.load(p, this.reader, this.loadRecords, this, options); + } + }, + + + reload : function(options){ + this.load(Ext.applyIf(options||{}, this.lastOptions)); + }, + + + + loadRecords : function(o, options, success){ + if(!o || success === false){ + if(success !== false){ + this.fireEvent("load", this, [], options); + } + if(options.callback){ + options.callback.call(options.scope || this, [], options, false); + } + return; + } + var r = o.records, t = o.totalRecords || r.length; + if(!options || options.add !== true){ + if(this.pruneModifiedRecords){ + this.modified = []; + } + for(var i = 0, len = r.length; i < len; i++){ + r[i].join(this); + } + if(this.snapshot){ + this.data = this.snapshot; + delete this.snapshot; + } + this.data.clear(); + this.data.addAll(r); + this.totalLength = t; + this.applySort(); + this.fireEvent("datachanged", this); + }else{ + this.totalLength = Math.max(t, this.data.length+r.length); + this.add(r); + } + this.fireEvent("load", this, r, options); + if(options.callback){ + options.callback.call(options.scope || this, r, options, true); + } + }, + + + loadData : function(o, append){ + var r = this.reader.readRecords(o); + this.loadRecords(r, {add: append}, true); + }, + + + getCount : function(){ + return this.data.length || 0; + }, + + + getTotalCount : function(){ + return this.totalLength || 0; + }, + + + getSortState : function(){ + return this.sortInfo; + }, + + + applySort : function(){ + if(this.sortInfo && !this.remoteSort){ + var s = this.sortInfo, f = s.field; + var st = this.fields.get(f).sortType; + var fn = function(r1, r2){ + var v1 = st(r1.data[f]), v2 = st(r2.data[f]); + return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0); + }; + this.data.sort(s.direction, fn); + if(this.snapshot && this.snapshot != this.data){ + this.snapshot.sort(s.direction, fn); + } + } + }, + + + setDefaultSort : function(field, dir){ + this.sortInfo = {field: field, direction: dir ? dir.toUpperCase() : "ASC"}; + }, + + + sort : function(fieldName, dir){ + var f = this.fields.get(fieldName); + if(!dir){ + if(this.sortInfo && this.sortInfo.field == f.name){ + dir = (this.sortToggle[f.name] || "ASC").toggle("ASC", "DESC"); + }else{ + dir = f.sortDir; + } + } + this.sortToggle[f.name] = dir; + this.sortInfo = {field: f.name, direction: dir}; + if(!this.remoteSort){ + this.applySort(); + this.fireEvent("datachanged", this); + }else{ + this.load(this.lastOptions); + } + }, + + + each : function(fn, scope){ + this.data.each(fn, scope); + }, + + + getModifiedRecords : function(){ + return this.modified; + }, + + + createFilterFn : function(property, value, anyMatch){ + if(!value.exec){ + value = String(value); + if(value.length == 0){ + return false; + } + value = new RegExp((anyMatch === true ? '' : '^') + Ext.escapeRe(value), "i"); + } + return function(r){ + return value.test(r.data[property]); + }; + }, + + + sum : function(property, start, end){ + var rs = this.data.items, v = 0; + start = start || 0; + end = (end || end === 0) ? end : rs.length-1; + + for(var i = start; i <= end; i++){ + v += (rs[i].data[property] || 0); + } + return v; + }, + + + filter : function(property, value, anyMatch){ + var fn = this.createFilterFn(property, value, anyMatch); + return fn ? this.filterBy(fn) : this.clearFilter(); + }, + + + filterBy : function(fn, scope){ + this.snapshot = this.snapshot || this.data; + this.data = this.queryBy(fn, scope||this); + this.fireEvent("datachanged", this); + }, + + + query : function(property, value, anyMatch){ + var fn = this.createFilterFn(property, value, anyMatch); + return fn ? this.queryBy(fn) : this.data.clone(); + }, + + + queryBy : function(fn, scope){ + var data = this.snapshot || this.data; + return data.filterBy(fn, scope||this); + }, + + + collect : function(dataIndex, allowNull, bypassFilter){ + var d = (bypassFilter === true && this.snapshot) ? + this.snapshot.items : this.data.items; + var v, sv, r = [], l = {}; + for(var i = 0, len = d.length; i < len; i++){ + v = d[i].data[dataIndex]; + sv = String(v); + if((allowNull || !Ext.isEmpty(v)) && !l[sv]){ + l[sv] = true; + r[r.length] = v; + } + } + return r; + }, + + + clearFilter : function(suppressEvent){ + if(this.snapshot && this.snapshot != this.data){ + this.data = this.snapshot; + delete this.snapshot; + if(suppressEvent !== true){ + this.fireEvent("datachanged", this); + } + } + }, + + + afterEdit : function(record){ + if(this.modified.indexOf(record) == -1){ + this.modified.push(record); + } + this.fireEvent("update", this, record, Ext.data.Record.EDIT); + }, + + + afterReject : function(record){ + this.modified.remove(record); + this.fireEvent("update", this, record, Ext.data.Record.REJECT); + }, + + + afterCommit : function(record){ + this.modified.remove(record); + this.fireEvent("update", this, record, Ext.data.Record.COMMIT); + }, + + + commitChanges : function(){ + var m = this.modified.slice(0); + this.modified = []; + for(var i = 0, len = m.length; i < len; i++){ + m[i].commit(); + } + }, + + + rejectChanges : function(){ + var m = this.modified.slice(0); + this.modified = []; + for(var i = 0, len = m.length; i < len; i++){ + m[i].reject(); + } + }, + + onMetaChange : function(meta, rtype, o){ + this.recordType = rtype; + this.fields = rtype.prototype.fields; + delete this.snapshot; + this.sortInfo = meta.sortInfo; + this.modified = []; + this.fireEvent('metachange', this, this.reader.meta); + } +}); + +Ext.data.SimpleStore = function(config){ + Ext.data.SimpleStore.superclass.constructor.call(this, { + reader: new Ext.data.ArrayReader({ + id: config.id + }, + Ext.data.Record.create(config.fields) + ), + proxy : new Ext.data.MemoryProxy(config.data) + }); + this.load(); +}; +Ext.extend(Ext.data.SimpleStore, Ext.data.Store); + +Ext.data.JsonStore = function(c){ + Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(c, { + proxy: !c.data ? new Ext.data.HttpProxy({url: c.url}) : undefined, + reader: new Ext.data.JsonReader(c, c.fields) + })); +}; +Ext.extend(Ext.data.JsonStore, Ext.data.Store); +Ext.data.Field = function(config){ + if(typeof config == "string"){ + config = {name: config}; + } + Ext.apply(this, config); + + if(!this.type){ + this.type = "auto"; + } + + var st = Ext.data.SortTypes; + + if(typeof this.sortType == "string"){ + this.sortType = st[this.sortType]; + } + + + if(!this.sortType){ + switch(this.type){ + case "string": + this.sortType = st.asUCString; + break; + case "date": + this.sortType = st.asDate; + break; + default: + this.sortType = st.none; + } + } + + + var stripRe = /[\$,%]/g; + + + + if(!this.convert){ + var cv, dateFormat = this.dateFormat; + switch(this.type){ + case "": + case "auto": + case undefined: + cv = function(v){ return v; }; + break; + case "string": + cv = function(v){ return (v === undefined || v === null) ? '' : String(v); }; + break; + case "int": + cv = function(v){ + return v !== undefined && v !== null && v !== '' ? + parseInt(String(v).replace(stripRe, ""), 10) : ''; + }; + break; + case "float": + cv = function(v){ + return v !== undefined && v !== null && v !== '' ? + parseFloat(String(v).replace(stripRe, ""), 10) : ''; + }; + break; + case "bool": + case "boolean": + cv = function(v){ return v === true || v === "true" || v == 1; }; + break; + case "date": + cv = function(v){ + if(!v){ + return ''; + } + if(v instanceof Date){ + return v; + } + if(dateFormat){ + if(dateFormat == "timestamp"){ + return new Date(v*1000); + } + return Date.parseDate(v, dateFormat); + } + var parsed = Date.parse(v); + return parsed ? new Date(parsed) : null; + }; + break; + + } + this.convert = cv; + } +}; + +Ext.data.Field.prototype = { + dateFormat: null, + defaultValue: "", + mapping: null, + sortType : null, + sortDir : "ASC" +}; + + +Ext.data.DataReader = function(meta, recordType){ + this.meta = meta; + this.recordType = recordType instanceof Array ? + Ext.data.Record.create(recordType) : recordType; +}; + +Ext.data.DataReader.prototype = { + +}; + +Ext.data.DataProxy = function(){ + this.addEvents({ + + beforeload : true, + + load : true, + + loadexception : true + }); + Ext.data.DataProxy.superclass.constructor.call(this); +}; + +Ext.extend(Ext.data.DataProxy, Ext.util.Observable); + +Ext.data.MemoryProxy = function(data){ + Ext.data.MemoryProxy.superclass.constructor.call(this); + this.data = data; +}; + +Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, { + + load : function(params, reader, callback, scope, arg){ + params = params || {}; + var result; + try { + result = reader.readRecords(this.data); + }catch(e){ + this.fireEvent("loadexception", this, arg, null, e); + callback.call(scope, null, arg, false); + return; + } + callback.call(scope, result, arg, true); + }, + + + update : function(params, records){ + + } +}); + +Ext.data.HttpProxy = function(conn){ + Ext.data.HttpProxy.superclass.constructor.call(this); + + this.conn = conn; + this.useAjax = !conn || !conn.events; +}; + +Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, { + + getConnection : function(){ + return this.useAjax ? Ext.Ajax : this.conn; + }, + + + load : function(params, reader, callback, scope, arg){ + if(this.fireEvent("beforeload", this, params) !== false){ + var o = { + params : params || {}, + request: { + callback : callback, + scope : scope, + arg : arg + }, + reader: reader, + callback : this.loadResponse, + scope: this + }; + if(this.useAjax){ + Ext.applyIf(o, this.conn); + if(this.activeRequest){ + Ext.Ajax.abort(this.activeRequest); + } + this.activeRequest = Ext.Ajax.request(o); + }else{ + this.conn.request(o); + } + }else{ + callback.call(scope||this, null, arg, false); + } + }, + + + loadResponse : function(o, success, response){ + delete this.activeRequest; + if(!success){ + this.fireEvent("loadexception", this, o, response); + o.request.callback.call(o.request.scope, null, o.request.arg, false); + return; + } + var result; + try { + result = o.reader.read(response); + }catch(e){ + this.fireEvent("loadexception", this, o, response, e); + o.request.callback.call(o.request.scope, null, o.request.arg, false); + return; + } + this.fireEvent("load", this, o, o.request.arg); + o.request.callback.call(o.request.scope, result, o.request.arg, true); + }, + + + update : function(dataSet){ + + }, + + + updateResponse : function(dataSet){ + + } +}); + +Ext.data.ScriptTagProxy = function(config){ + Ext.data.ScriptTagProxy.superclass.constructor.call(this); + Ext.apply(this, config); + this.head = document.getElementsByTagName("head")[0]; +}; + +Ext.data.ScriptTagProxy.TRANS_ID = 1000; + +Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, { + + + timeout : 30000, + + callbackParam : "callback", + + nocache : true, + + + load : function(params, reader, callback, scope, arg){ + if(this.fireEvent("beforeload", this, params) !== false){ + + var p = Ext.urlEncode(Ext.apply(params, this.extraParams)); + + var url = this.url; + url += (url.indexOf("?") != -1 ? "&" : "?") + p; + if(this.nocache){ + url += "&_dc=" + (new Date().getTime()); + } + var transId = ++Ext.data.ScriptTagProxy.TRANS_ID; + var trans = { + id : transId, + cb : "stcCallback"+transId, + scriptId : "stcScript"+transId, + params : params, + arg : arg, + url : url, + callback : callback, + scope : scope, + reader : reader + }; + var conn = this; + + window[trans.cb] = function(o){ + conn.handleResponse(o, trans); + }; + + url += String.format("&{0}={1}", this.callbackParam, trans.cb); + + if(this.autoAbort !== false){ + this.abort(); + } + + trans.timeoutId = this.handleFailure.defer(this.timeout, this, [trans]); + + var script = document.createElement("script"); + script.setAttribute("src", url); + script.setAttribute("type", "text/javascript"); + script.setAttribute("id", trans.scriptId); + this.head.appendChild(script); + + this.trans = trans; + }else{ + callback.call(scope||this, null, arg, false); + } + }, + + + isLoading : function(){ + return this.trans ? true : false; + }, + + + abort : function(){ + if(this.isLoading()){ + this.destroyTrans(this.trans); + } + }, + + + destroyTrans : function(trans, isLoaded){ + this.head.removeChild(document.getElementById(trans.scriptId)); + clearTimeout(trans.timeoutId); + if(isLoaded){ + window[trans.cb] = undefined; + try{ + delete window[trans.cb]; + }catch(e){} + }else{ + + window[trans.cb] = function(){ + window[trans.cb] = undefined; + try{ + delete window[trans.cb]; + }catch(e){} + }; + } + }, + + + handleResponse : function(o, trans){ + this.trans = false; + this.destroyTrans(trans, true); + var result; + try { + result = trans.reader.readRecords(o); + }catch(e){ + this.fireEvent("loadexception", this, o, trans.arg, e); + trans.callback.call(trans.scope||window, null, trans.arg, false); + return; + } + this.fireEvent("load", this, o, trans.arg); + trans.callback.call(trans.scope||window, result, trans.arg, true); + }, + + + handleFailure : function(trans){ + this.trans = false; + this.destroyTrans(trans, false); + this.fireEvent("loadexception", this, null, trans.arg); + trans.callback.call(trans.scope||window, null, trans.arg, false); + } +}); + +Ext.data.JsonReader = function(meta, recordType){ + meta = meta || {}; + Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType||meta.fields); +}; +Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, { + + read : function(response){ + var json = response.responseText; + var o = eval("("+json+")"); + if(!o) { + throw {message: "JsonReader.read: Json object not found"}; + } + if(o.metaData){ + delete this.ef; + this.meta = o.metaData; + this.recordType = Ext.data.Record.create(o.metaData.fields); + this.onMetaChange(this.meta, this.recordType, o); + } + return this.readRecords(o); + }, + + + onMetaChange : function(meta, recordType, o){ + + }, + + + simpleAccess: function(obj, subsc) { + return obj[subsc]; + }, + + + getJsonAccessor: function(){ + var re = /[\[\.]/; + return function(expr) { + try { + return(re.test(expr)) + ? new Function("obj", "return obj." + expr) + : function(obj){ + return obj[expr]; + }; + } catch(e){} + return Ext.emptyFn; + }; + }(), + + + readRecords : function(o){ + + this.jsonData = o; + var s = this.meta, Record = this.recordType, + f = Record.prototype.fields, fi = f.items, fl = f.length; + + + if (!this.ef) { + if(s.totalProperty) { + this.getTotal = this.getJsonAccessor(s.totalProperty); + } + if(s.successProperty) { + this.getSuccess = this.getJsonAccessor(s.successProperty); + } + this.getRoot = s.root ? this.getJsonAccessor(s.root) : function(p){return p;}; + if (s.id) { + var g = this.getJsonAccessor(s.id); + this.getId = function(rec) { + var r = g(rec); + return (r === undefined || r === "") ? null : r; + }; + } else { + this.getId = function(){return null;}; + } + this.ef = []; + for(var i = 0; i < fl; i++){ + f = fi[i]; + var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name; + this.ef[i] = this.getJsonAccessor(map); + } + } + + var root = this.getRoot(o), c = root.length, totalRecords = c, success = true; + if(s.totalProperty){ + var v = parseInt(this.getTotal(o), 10); + if(!isNaN(v)){ + totalRecords = v; + } + } + if(s.successProperty){ + var v = this.getSuccess(o); + if(v === false || v === 'false'){ + success = false; + } + } + var records = []; + for(var i = 0; i < c; i++){ + var n = root[i]; + var values = {}; + var id = this.getId(n); + for(var j = 0; j < fl; j++){ + f = fi[j]; + var v = this.ef[j](n); + values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue); + } + var record = new Record(values, id); + record.json = n; + records[i] = record; + } + return { + success : success, + records : records, + totalRecords : totalRecords + }; + } +}); + +Ext.data.XmlReader = function(meta, recordType){ + meta = meta || {}; + Ext.data.XmlReader.superclass.constructor.call(this, meta, recordType||meta.fields); +}; +Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, { + + read : function(response){ + var doc = response.responseXML; + if(!doc) { + throw {message: "XmlReader.read: XML Document not available"}; + } + return this.readRecords(doc); + }, + + + readRecords : function(doc){ + + this.xmlData = doc; + var root = doc.documentElement || doc; + var q = Ext.DomQuery; + var recordType = this.recordType, fields = recordType.prototype.fields; + var sid = this.meta.id; + var totalRecords = 0, success = true; + if(this.meta.totalRecords){ + totalRecords = q.selectNumber(this.meta.totalRecords, root, 0); + } + + if(this.meta.success){ + var sv = q.selectValue(this.meta.success, root, true); + success = sv !== false && sv !== 'false'; + } + var records = []; + var ns = q.select(this.meta.record, root); + for(var i = 0, len = ns.length; i < len; i++) { + var n = ns[i]; + var values = {}; + var id = sid ? q.selectValue(sid, n) : undefined; + for(var j = 0, jlen = fields.length; j < jlen; j++){ + var f = fields.items[j]; + var v = q.selectValue(f.mapping || f.name, n, f.defaultValue); + v = f.convert(v); + values[f.name] = v; + } + var record = new recordType(values, id); + record.node = n; + records[records.length] = record; + } + + return { + success : success, + records : records, + totalRecords : totalRecords || records.length + }; + } +}); + +Ext.data.ArrayReader = function(meta, recordType){ + Ext.data.ArrayReader.superclass.constructor.call(this, meta, recordType); +}; + +Ext.extend(Ext.data.ArrayReader, Ext.data.JsonReader, { + + readRecords : function(o){ + var sid = this.meta ? this.meta.id : null; + var recordType = this.recordType, fields = recordType.prototype.fields; + var records = []; + var root = o; + for(var i = 0; i < root.length; i++){ + var n = root[i]; + var values = {}; + var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null); + for(var j = 0, jlen = fields.length; j < jlen; j++){ + var f = fields.items[j]; + var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j; + var v = n[k] !== undefined ? n[k] : f.defaultValue; + v = f.convert(v); + values[f.name] = v; + } + var record = new recordType(values, id); + record.json = n; + records[records.length] = record; + } + return { + records : records, + totalRecords : records.length + }; + } +}); + +Ext.data.Tree = function(root){ + this.nodeHash = {}; + + this.root = null; + if(root){ + this.setRootNode(root); + } + this.addEvents({ + + "append" : true, + + "remove" : true, + + "move" : true, + + "insert" : true, + + "beforeappend" : true, + + "beforeremove" : true, + + "beforemove" : true, + + "beforeinsert" : true + }); + + Ext.data.Tree.superclass.constructor.call(this); +}; + +Ext.extend(Ext.data.Tree, Ext.util.Observable, { + pathSeparator: "/", + + proxyNodeEvent : function(){ + return this.fireEvent.apply(this, arguments); + }, + + + getRootNode : function(){ + return this.root; + }, + + + setRootNode : function(node){ + this.root = node; + node.ownerTree = this; + node.isRoot = true; + this.registerNode(node); + return node; + }, + + + getNodeById : function(id){ + return this.nodeHash[id]; + }, + + registerNode : function(node){ + this.nodeHash[node.id] = node; + }, + + unregisterNode : function(node){ + delete this.nodeHash[node.id]; + }, + + toString : function(){ + return "[Tree"+(this.id?" "+this.id:"")+"]"; + } +}); + + +Ext.data.Node = function(attributes){ + + this.attributes = attributes || {}; + this.leaf = this.attributes.leaf; + + this.id = this.attributes.id; + if(!this.id){ + this.id = Ext.id(null, "ynode-"); + this.attributes.id = this.id; + } + + this.childNodes = []; + if(!this.childNodes.indexOf){ + this.childNodes.indexOf = function(o){ + for(var i = 0, len = this.length; i < len; i++){ + if(this[i] == o) return i; + } + return -1; + }; + } + + 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); +}; + +Ext.extend(Ext.data.Node, Ext.util.Observable, { + fireEvent : function(evtName){ + + if(Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false){ + return false; + } + + var ot = this.getOwnerTree(); + if(ot){ + if(ot.proxyNodeEvent.apply(ot, arguments) === false){ + return false; + } + } + return true; + }, + + + isLeaf : function(){ + return this.leaf === true; + }, + + + setFirstChild : function(node){ + this.firstChild = node; + }, + + + setLastChild : function(node){ + this.lastChild = node; + }, + + + + isLast : function(){ + return (!this.parentNode ? true : this.parentNode.lastChild == this); + }, + + + isFirst : function(){ + return (!this.parentNode ? true : this.parentNode.firstChild == this); + }, + + hasChildNodes : function(){ + return !this.isLeaf() && this.childNodes.length > 0; + }, + + + appendChild : function(node){ + var multi = false; + if(node instanceof Array){ + multi = node; + }else if(arguments.length > 1){ + multi = arguments; + } + + if(multi){ + for(var i = 0, len = multi.length; i < len; i++) { + this.appendChild(multi[i]); + } + }else{ + if(this.fireEvent("beforeappend", this.ownerTree, this, node) === false){ + return false; + } + var index = this.childNodes.length; + var oldParent = node.parentNode; + + if(oldParent){ + if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index) === false){ + return false; + } + oldParent.removeChild(node); + } + index = this.childNodes.length; + if(index == 0){ + this.setFirstChild(node); + } + this.childNodes.push(node); + node.parentNode = this; + var ps = this.childNodes[index-1]; + if(ps){ + node.previousSibling = ps; + ps.nextSibling = node; + }else{ + node.previousSibling = null; + } + node.nextSibling = null; + this.setLastChild(node); + node.setOwnerTree(this.getOwnerTree()); + this.fireEvent("append", this.ownerTree, this, node, index); + if(oldParent){ + node.fireEvent("move", this.ownerTree, node, oldParent, this, index); + } + return node; + } + }, + + + removeChild : function(node){ + var index = this.childNodes.indexOf(node); + if(index == -1){ + return false; + } + if(this.fireEvent("beforeremove", this.ownerTree, this, node) === false){ + return false; + } + + + this.childNodes.splice(index, 1); + + + if(node.previousSibling){ + node.previousSibling.nextSibling = node.nextSibling; + } + if(node.nextSibling){ + node.nextSibling.previousSibling = node.previousSibling; + } + + + if(this.firstChild == node){ + this.setFirstChild(node.nextSibling); + } + if(this.lastChild == node){ + this.setLastChild(node.previousSibling); + } + + node.setOwnerTree(null); + + node.parentNode = null; + node.previousSibling = null; + node.nextSibling = null; + this.fireEvent("remove", this.ownerTree, this, node); + return node; + }, + + + insertBefore : function(node, refNode){ + if(!refNode){ + return this.appendChild(node); + } + + if(node == refNode){ + return false; + } + + if(this.fireEvent("beforeinsert", this.ownerTree, this, node, refNode) === false){ + return false; + } + var index = this.childNodes.indexOf(refNode); + var oldParent = node.parentNode; + var refIndex = index; + + + if(oldParent == this && this.childNodes.indexOf(node) < index){ + refIndex--; + } + + + if(oldParent){ + if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index, refNode) === false){ + return false; + } + oldParent.removeChild(node); + } + if(refIndex == 0){ + this.setFirstChild(node); + } + this.childNodes.splice(refIndex, 0, node); + node.parentNode = this; + var ps = this.childNodes[refIndex-1]; + if(ps){ + node.previousSibling = ps; + ps.nextSibling = node; + }else{ + node.previousSibling = null; + } + node.nextSibling = refNode; + refNode.previousSibling = node; + node.setOwnerTree(this.getOwnerTree()); + this.fireEvent("insert", this.ownerTree, this, node, refNode); + if(oldParent){ + node.fireEvent("move", this.ownerTree, node, oldParent, this, refIndex, refNode); + } + return node; + }, + + + item : function(index){ + return this.childNodes[index]; + }, + + + replaceChild : function(newChild, oldChild){ + this.insertBefore(newChild, oldChild); + this.removeChild(oldChild); + return oldChild; + }, + + + indexOf : function(child){ + return this.childNodes.indexOf(child); + }, + + + getOwnerTree : function(){ + + if(!this.ownerTree){ + var p = this; + while(p){ + if(p.ownerTree){ + this.ownerTree = p.ownerTree; + break; + } + p = p.parentNode; + } + } + return this.ownerTree; + }, + + + getDepth : function(){ + var depth = 0; + var p = this; + while(p.parentNode){ + ++depth; + p = p.parentNode; + } + return depth; + }, + + + setOwnerTree : function(tree){ + + if(tree != this.ownerTree){ + if(this.ownerTree){ + this.ownerTree.unregisterNode(this); + } + this.ownerTree = tree; + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].setOwnerTree(tree); + } + if(tree){ + tree.registerNode(this); + } + } + }, + + + getPath : function(attr){ + attr = attr || "id"; + var p = this.parentNode; + var b = [this.attributes[attr]]; + while(p){ + b.unshift(p.attributes[attr]); + p = p.parentNode; + } + var sep = this.getOwnerTree().pathSeparator; + return sep + b.join(sep); + }, + + + bubble : function(fn, scope, args){ + var p = this; + while(p){ + if(fn.call(scope || p, args || p) === false){ + break; + } + p = p.parentNode; + } + }, + + + cascade : function(fn, scope, args){ + if(fn.call(scope || this, args || this) !== false){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].cascade(fn, scope, args); + } + } + }, + + + eachChild : function(fn, scope, args){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + if(fn.call(scope || this, args || cs[i]) === false){ + break; + } + } + }, + + + findChild : function(attribute, value){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + if(cs[i].attributes[attribute] == value){ + return cs[i]; + } + } + return null; + }, + + + findChildBy : function(fn, scope){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + if(fn.call(scope||cs[i], cs[i]) === true){ + return cs[i]; + } + } + return null; + }, + + + sort : function(fn, scope){ + var cs = this.childNodes; + var len = cs.length; + if(len > 0){ + var sortFn = scope ? function(){fn.apply(scope, arguments);} : fn; + cs.sort(sortFn); + for(var i = 0; i < len; i++){ + var n = cs[i]; + n.previousSibling = cs[i-1]; + n.nextSibling = cs[i+1]; + if(i == 0){ + this.setFirstChild(n); + } + if(i == len-1){ + this.setLastChild(n); + } + } + } + }, + + + contains : function(node){ + return node.isAncestor(this); + }, + + + isAncestor : function(node){ + var p = this.parentNode; + while(p){ + if(p == node){ + return true; + } + p = p.parentNode; + } + return false; + }, + + toString : function(){ + return "[Node"+(this.id?" "+this.id:"")+"]"; + } +}); + +Ext.ComponentMgr = function(){ + var all = new Ext.util.MixedCollection(); + + return { + + register : function(c){ + all.add(c); + }, + + + unregister : function(c){ + all.remove(c); + }, + + + get : function(id){ + return all.get(id); + }, + + + onAvailable : function(id, fn, scope){ + all.on("add", function(index, o){ + if(o.id == id){ + fn.call(scope || o, o); + all.un("add", fn, scope); + } + }); + } + }; +}(); + + +Ext.Component = function(config){ + config = config || {}; + if(config.tagName || config.dom || typeof config == "string"){ config = {el: config, id: config.id || config}; + } + this.initialConfig = config; + + Ext.apply(this, config); + this.addEvents({ + + disable : true, + + enable : true, + + beforeshow : true, + + show : true, + + beforehide : true, + + hide : true, + + beforerender : true, + + render : true, + + beforedestroy : true, + + destroy : true + }); + if(!this.id){ + this.id = "ext-comp-" + (++Ext.Component.AUTO_ID); + } + Ext.ComponentMgr.register(this); + Ext.Component.superclass.constructor.call(this); + this.initComponent(); + if(this.renderTo){ this.render(this.renderTo); + delete this.renderTo; + } +}; + +Ext.Component.AUTO_ID = 1000; + +Ext.extend(Ext.Component, Ext.util.Observable, { + + hidden : false, + + disabled : false, + + rendered : false, + + + disabledClass : "x-item-disabled", + + allowDomMove : true, + + hideMode: 'display', + + ctype : "Ext.Component", + + actionMode : "el", + + getActionEl : function(){ + return this[this.actionMode]; + }, + + initComponent : Ext.emptyFn, + + render : function(container, position){ + if(!this.rendered && this.fireEvent("beforerender", this) !== false){ + if(!container && this.el){ + this.el = Ext.get(this.el); + container = this.el.dom.parentNode; + this.allowDomMove = false; + } + this.container = Ext.get(container); + this.rendered = true; + if(position !== undefined){ + if(typeof position == 'number'){ + position = this.container.dom.childNodes[position]; + }else{ + position = Ext.getDom(position); + } + } + this.onRender(this.container, position || null); + if(this.cls){ + this.el.addClass(this.cls); + delete this.cls; + } + if(this.style){ + this.el.applyStyles(this.style); + delete this.style; + } + this.fireEvent("render", this); + this.afterRender(this.container); + if(this.hidden){ + this.hide(); + } + if(this.disabled){ + this.disable(); + } + } + return this; + }, + + onRender : function(ct, position){ + if(this.el){ + this.el = Ext.get(this.el); + if(this.allowDomMove !== false){ + ct.dom.insertBefore(this.el.dom, position); + } + } + }, + + getAutoCreate : function(){ + var cfg = typeof this.autoCreate == "object" ? + this.autoCreate : Ext.apply({}, this.defaultAutoCreate); + if(this.id && !cfg.id){ + cfg.id = this.id; + } + return cfg; + }, + + afterRender : Ext.emptyFn, + + + destroy : function(){ + if(this.fireEvent("beforedestroy", this) !== false){ + this.purgeListeners(); + this.beforeDestroy(); + if(this.rendered){ + this.el.removeAllListeners(); + this.el.remove(); + if(this.actionMode == "container"){ + this.container.remove(); + } + } + this.onDestroy(); + Ext.ComponentMgr.unregister(this); + this.fireEvent("destroy", this); + } + }, + + beforeDestroy : function(){ + + }, + + onDestroy : function(){ + + }, + + + getEl : function(){ + return this.el; + }, + + + getId : function(){ + return this.id; + }, + + + focus : function(selectText){ + if(this.rendered){ + this.el.focus(); + if(selectText === true){ + this.el.dom.select(); + } + } + return this; + }, + + blur : function(){ + if(this.rendered){ + this.el.blur(); + } + return this; + }, + + + disable : function(){ + if(this.rendered){ + this.onDisable(); + } + this.disabled = true; + this.fireEvent("disable", this); + return this; + }, + + onDisable : function(){ + this.getActionEl().addClass(this.disabledClass); + this.el.dom.disabled = true; + }, + + + enable : function(){ + if(this.rendered){ + this.onEnable(); + } + this.disabled = false; + this.fireEvent("enable", this); + return this; + }, + + onEnable : function(){ + this.getActionEl().removeClass(this.disabledClass); + this.el.dom.disabled = false; + }, + + + setDisabled : function(disabled){ + this[disabled ? "disable" : "enable"](); + }, + + + show: function(){ + if(this.fireEvent("beforeshow", this) !== false){ + this.hidden = false; + if(this.rendered){ + this.onShow(); + } + this.fireEvent("show", this); + } + return this; + }, + + onShow : function(){ + var ae = this.getActionEl(); + if(this.hideMode == 'visibility'){ + ae.dom.style.visibility = "visible"; + }else if(this.hideMode == 'offsets'){ + ae.removeClass('x-hidden'); + }else{ + ae.dom.style.display = ""; + } + }, + + + hide: function(){ + if(this.fireEvent("beforehide", this) !== false){ + this.hidden = true; + if(this.rendered){ + this.onHide(); + } + this.fireEvent("hide", this); + } + return this; + }, + + onHide : function(){ + var ae = this.getActionEl(); + if(this.hideMode == 'visibility'){ + ae.dom.style.visibility = "hidden"; + }else if(this.hideMode == 'offsets'){ + ae.addClass('x-hidden'); + }else{ + ae.dom.style.display = "none"; + } + }, + + + setVisible: function(visible){ + if(visible) { + this.show(); + }else{ + this.hide(); + } + return this; + }, + + + isVisible : function(){ + return this.getActionEl().isVisible(); + }, + + cloneConfig : function(overrides){ + overrides = overrides || {}; + var id = overrides.id || Ext.id(); + var cfg = Ext.applyIf(overrides, this.initialConfig); + cfg.id = id; return new this.constructor(cfg); + } +}); + +(function(){ +Ext.Layer = function(config, existingEl){ + config = config || {}; + var dh = Ext.DomHelper; + var cp = config.parentEl, pel = cp ? Ext.getDom(cp) : document.body; + if(existingEl){ + this.dom = Ext.getDom(existingEl); + } + if(!this.dom){ + var o = config.dh || {tag: "div", cls: "x-layer"}; + this.dom = dh.append(pel, o); + } + if(config.cls){ + this.addClass(config.cls); + } + this.constrain = config.constrain !== false; + this.visibilityMode = Ext.Element.VISIBILITY; + if(config.id){ + this.id = this.dom.id = config.id; + }else{ + this.id = Ext.id(this.dom); + } + this.zindex = config.zindex || this.getZIndex(); + this.position("absolute", this.zindex); + if(config.shadow){ + this.shadowOffset = config.shadowOffset || 4; + this.shadow = new Ext.Shadow({ + offset : this.shadowOffset, + mode : config.shadow + }); + }else{ + this.shadowOffset = 0; + } + this.useShim = config.shim !== false && Ext.useShims; + this.useDisplay = config.useDisplay; + this.hide(); +}; + +var supr = Ext.Element.prototype; + + +var shims = []; + +Ext.extend(Ext.Layer, Ext.Element, { + + getZIndex : function(){ + return this.zindex || parseInt(this.getStyle("z-index"), 10) || 11000; + }, + + getShim : function(){ + if(!this.useShim){ + return null; + } + if(this.shim){ + return this.shim; + } + var shim = shims.shift(); + if(!shim){ + shim = this.createShim(); + shim.enableDisplayMode('block'); + shim.dom.style.display = 'none'; + shim.dom.style.visibility = 'visible'; + } + var pn = this.dom.parentNode; + if(shim.dom.parentNode != pn){ + pn.insertBefore(shim.dom, this.dom); + } + shim.setStyle('z-index', this.getZIndex()-2); + this.shim = shim; + return shim; + }, + + hideShim : function(){ + if(this.shim){ + this.shim.setDisplayed(false); + shims.push(this.shim); + delete this.shim; + } + }, + + disableShadow : function(){ + if(this.shadow){ + this.shadowDisabled = true; + this.shadow.hide(); + this.lastShadowOffset = this.shadowOffset; + this.shadowOffset = 0; + } + }, + + enableShadow : function(show){ + if(this.shadow){ + this.shadowDisabled = false; + this.shadowOffset = this.lastShadowOffset; + delete this.lastShadowOffset; + if(show){ + this.sync(true); + } + } + }, + + + + + sync : function(doShow){ + var sw = this.shadow; + if(!this.updating && this.isVisible() && (sw || this.useShim)){ + var sh = this.getShim(); + + var w = this.getWidth(), + h = this.getHeight(); + + var l = this.getLeft(true), + t = this.getTop(true); + + if(sw && !this.shadowDisabled){ + if(doShow && !sw.isVisible()){ + sw.show(this); + }else{ + sw.realign(l, t, w, h); + } + if(sh){ + if(doShow){ + sh.show(); + } + + var a = sw.adjusts, s = sh.dom.style; + s.left = (Math.min(l, l+a.l))+"px"; + s.top = (Math.min(t, t+a.t))+"px"; + s.width = (w+a.w)+"px"; + s.height = (h+a.h)+"px"; + } + }else if(sh){ + if(doShow){ + sh.show(); + } + sh.setSize(w, h); + sh.setLeftTop(l, t); + } + + } + }, + + + destroy : function(){ + this.hideShim(); + if(this.shadow){ + this.shadow.hide(); + } + this.removeAllListeners(); + var pn = this.dom.parentNode; + if(pn){ + pn.removeChild(this.dom); + } + Ext.Element.uncache(this.id); + }, + + remove : function(){ + this.destroy(); + }, + + + beginUpdate : function(){ + this.updating = true; + }, + + + endUpdate : function(){ + this.updating = false; + this.sync(true); + }, + + + hideUnders : function(negOffset){ + if(this.shadow){ + this.shadow.hide(); + } + this.hideShim(); + }, + + + constrainXY : function(){ + if(this.constrain){ + var vw = Ext.lib.Dom.getViewWidth(), + vh = Ext.lib.Dom.getViewHeight(); + var s = Ext.get(document).getScroll(); + + var xy = this.getXY(); + var x = xy[0], y = xy[1]; + var w = this.dom.offsetWidth+this.shadowOffset, h = this.dom.offsetHeight+this.shadowOffset; + + var moved = false; + + if((x + w) > vw+s.left){ + x = vw - w - this.shadowOffset; + moved = true; + } + if((y + h) > vh+s.top){ + y = vh - h - this.shadowOffset; + moved = true; + } + + if(x < s.left){ + x = s.left; + moved = true; + } + if(y < s.top){ + y = s.top; + moved = true; + } + if(moved){ + if(this.avoidY){ + var ay = this.avoidY; + if(y <= ay && (y+h) >= ay){ + y = ay-h-5; + } + } + xy = [x, y]; + this.storeXY(xy); + supr.setXY.call(this, xy); + this.sync(); + } + } + }, + + isVisible : function(){ + return this.visible; + }, + + + showAction : function(){ + this.visible = true; + if(this.useDisplay === true){ + this.setDisplayed(""); + }else if(this.lastXY){ + supr.setXY.call(this, this.lastXY); + }else if(this.lastLT){ + supr.setLeftTop.call(this, this.lastLT[0], this.lastLT[1]); + } + }, + + + hideAction : function(){ + this.visible = false; + if(this.useDisplay === true){ + this.setDisplayed(false); + }else{ + this.setLeftTop(-10000,-10000); + } + }, + + + setVisible : function(v, a, d, c, e){ + if(v){ + this.showAction(); + } + if(a && v){ + var cb = function(){ + this.sync(true); + if(c){ + c(); + } + }.createDelegate(this); + supr.setVisible.call(this, true, true, d, cb, e); + }else{ + if(!v){ + this.hideUnders(true); + } + var cb = c; + if(a){ + cb = function(){ + this.hideAction(); + if(c){ + c(); + } + }.createDelegate(this); + } + supr.setVisible.call(this, v, a, d, cb, e); + if(v){ + this.sync(true); + }else if(!a){ + this.hideAction(); + } + } + }, + + storeXY : function(xy){ + delete this.lastLT; + this.lastXY = xy; + }, + + storeLeftTop : function(left, top){ + delete this.lastXY; + this.lastLT = [left, top]; + }, + + + beforeFx : function(){ + this.beforeAction(); + return Ext.Layer.superclass.beforeFx.apply(this, arguments); + }, + + + afterFx : function(){ + Ext.Layer.superclass.afterFx.apply(this, arguments); + this.sync(this.isVisible()); + }, + + + beforeAction : function(){ + if(!this.updating && this.shadow){ + this.shadow.hide(); + } + }, + + + setLeft : function(left){ + this.storeLeftTop(left, this.getTop(true)); + supr.setLeft.apply(this, arguments); + this.sync(); + }, + + setTop : function(top){ + this.storeLeftTop(this.getLeft(true), top); + supr.setTop.apply(this, arguments); + this.sync(); + }, + + setLeftTop : function(left, top){ + this.storeLeftTop(left, top); + supr.setLeftTop.apply(this, arguments); + this.sync(); + }, + + setXY : function(xy, a, d, c, e){ + this.fixDisplay(); + this.beforeAction(); + this.storeXY(xy); + var cb = this.createCB(c); + supr.setXY.call(this, xy, a, d, cb, e); + if(!a){ + cb(); + } + }, + + + createCB : function(c){ + var el = this; + return function(){ + el.constrainXY(); + el.sync(true); + if(c){ + c(); + } + }; + }, + + + setX : function(x, a, d, c, e){ + this.setXY([x, this.getY()], a, d, c, e); + }, + + + setY : function(y, a, d, c, e){ + this.setXY([this.getX(), y], a, d, c, e); + }, + + + setSize : function(w, h, a, d, c, e){ + this.beforeAction(); + var cb = this.createCB(c); + supr.setSize.call(this, w, h, a, d, cb, e); + if(!a){ + cb(); + } + }, + + + setWidth : function(w, a, d, c, e){ + this.beforeAction(); + var cb = this.createCB(c); + supr.setWidth.call(this, w, a, d, cb, e); + if(!a){ + cb(); + } + }, + + + setHeight : function(h, a, d, c, e){ + this.beforeAction(); + var cb = this.createCB(c); + supr.setHeight.call(this, h, a, d, cb, e); + if(!a){ + cb(); + } + }, + + + setBounds : function(x, y, w, h, a, d, c, e){ + this.beforeAction(); + var cb = this.createCB(c); + if(!a){ + this.storeXY([x, y]); + supr.setXY.call(this, [x, y]); + supr.setSize.call(this, w, h, a, d, cb, e); + cb(); + }else{ + supr.setBounds.call(this, x, y, w, h, a, d, cb, e); + } + return this; + }, + + + setZIndex : function(zindex){ + this.zindex = zindex; + this.setStyle("z-index", zindex + 2); + if(this.shadow){ + this.shadow.setZIndex(zindex + 1); + } + if(this.shim){ + this.shim.setStyle("z-index", zindex); + } + } +}); +})(); + +Ext.Shadow = function(config){ + Ext.apply(this, config); + if(typeof this.mode != "string"){ + this.mode = this.defaultMode; + } + var o = this.offset, a = {h: 0}; + var rad = Math.floor(this.offset/2); + switch(this.mode.toLowerCase()){ case "drop": + a.w = 0; + a.l = a.t = o; + a.t -= 1; + if(Ext.isIE){ + a.l -= this.offset + rad; + a.t -= this.offset + rad; + a.w -= rad; + a.h -= rad; + a.t += 1; + } + break; + case "sides": + a.w = (o*2); + a.l = -o; + a.t = o-1; + if(Ext.isIE){ + a.l -= (this.offset - rad); + a.t -= this.offset + rad; + a.l += 1; + a.w -= (this.offset - rad)*2; + a.w -= rad + 1; + a.h -= 1; + } + break; + case "frame": + a.w = a.h = (o*2); + a.l = a.t = -o; + a.t += 1; + a.h -= 2; + if(Ext.isIE){ + a.l -= (this.offset - rad); + a.t -= (this.offset - rad); + a.l += 1; + a.w -= (this.offset + rad + 1); + a.h -= (this.offset + rad); + a.h += 1; + } + break; + }; + + this.adjusts = a; +}; + +Ext.Shadow.prototype = { + + + offset: 4, + + defaultMode: "drop", + + + show : function(target){ + target = Ext.get(target); + if(!this.el){ + this.el = Ext.Shadow.Pool.pull(); + if(this.el.dom.nextSibling != target.dom){ + this.el.insertBefore(target); + } + } + this.el.setStyle("z-index", this.zIndex || parseInt(target.getStyle("z-index"), 10)-1); + if(Ext.isIE){ + this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+(this.offset)+")"; + } + this.realign( + target.getLeft(true), + target.getTop(true), + target.getWidth(), + target.getHeight() + ); + this.el.dom.style.display = "block"; + }, + + + isVisible : function(){ + return this.el ? true : false; + }, + + + realign : function(l, t, w, h){ + if(!this.el){ + return; + } + var a = this.adjusts, d = this.el.dom, s = d.style; + var iea = 0; + s.left = (l+a.l)+"px"; + s.top = (t+a.t)+"px"; + var sw = (w+a.w), sh = (h+a.h), sws = sw +"px", shs = sh + "px"; + if(s.width != sws || s.height != shs){ + s.width = sws; + s.height = shs; + if(!Ext.isIE){ + var cn = d.childNodes; + var sww = Math.max(0, (sw-12))+"px"; + cn[0].childNodes[1].style.width = sww; + cn[1].childNodes[1].style.width = sww; + cn[2].childNodes[1].style.width = sww; + cn[1].style.height = Math.max(0, (sh-12))+"px"; + } + } + }, + + + hide : function(){ + if(this.el){ + this.el.dom.style.display = "none"; + Ext.Shadow.Pool.push(this.el); + delete this.el; + } + }, + + + setZIndex : function(z){ + this.zIndex = z; + if(this.el){ + this.el.setStyle("z-index", z); + } + } +}; + +Ext.Shadow.Pool = function(){ + var p = []; + var markup = Ext.isIE ? + '
' : + '
'; + return { + pull : function(){ + var sh = p.shift(); + if(!sh){ + sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, markup)); + sh.autoBoxAdjust = false; + } + return sh; + }, + + push : function(sh){ + p.push(sh); + } + }; +}(); + +Ext.BoxComponent = function(config){ + Ext.BoxComponent.superclass.constructor.call(this, config); + this.addEvents({ + + resize : true, + + move : true + }); +}; + +Ext.extend(Ext.BoxComponent, Ext.Component, { + boxReady : false, + deferHeight: false, + + + setSize : function(w, h){ + if(typeof w == 'object'){ + h = w.height; + w = w.width; + } + if(!this.boxReady){ + this.width = w; + this.height = h; + return this; + } + + if(this.lastSize && this.lastSize.width == w && this.lastSize.height == h){ + return this; + } + this.lastSize = {width: w, height: h}; + + var adj = this.adjustSize(w, h); + var aw = adj.width, ah = adj.height; + if(aw !== undefined || ah !== undefined){ var rz = this.getResizeEl(); + if(!this.deferHeight && aw !== undefined && ah !== undefined){ + rz.setSize(aw, ah); + }else if(!this.deferHeight && ah !== undefined){ + rz.setHeight(ah); + }else if(aw !== undefined){ + rz.setWidth(aw); + } + this.onResize(aw, ah, w, h); + this.fireEvent('resize', this, aw, ah, w, h); + } + return this; + }, + + + getSize : function(){ + return this.el.getSize(); + }, + + + getPosition : function(local){ + if(local === true){ + return [this.el.getLeft(true), this.el.getTop(true)]; + } + return this.xy || this.el.getXY(); + }, + + + getBox : function(local){ + var s = this.el.getSize(); + if(local){ + s.x = this.el.getLeft(true); + s.y = this.el.getTop(true); + }else{ + var xy = this.xy || this.el.getXY(); + s.x = xy[0]; + s.y = xy[1]; + } + return s; + }, + + + updateBox : function(box){ + this.setSize(box.width, box.height); + this.setPagePosition(box.x, box.y); + return this; + }, + + getResizeEl : function(){ + return this.resizeEl || this.el; + }, + + getPositionEl : function(){ + return this.positionEl || this.el; + }, + + + setPosition : function(x, y){ + this.x = x; + this.y = y; + if(!this.boxReady){ + return this; + } + var adj = this.adjustPosition(x, y); + var ax = adj.x, ay = adj.y; + + var el = this.getPositionEl(); + if(ax !== undefined || ay !== undefined){ + if(ax !== undefined && ay !== undefined){ + el.setLeftTop(ax, ay); + }else if(ax !== undefined){ + el.setLeft(ax); + }else if(ay !== undefined){ + el.setTop(ay); + } + this.onPosition(ax, ay); + this.fireEvent('move', this, ax, ay); + } + return this; + }, + + + setPagePosition : function(x, y){ + this.pageX = x; + this.pageY = y; + if(!this.boxReady){ + return; + } + if(x === undefined || y === undefined){ return; + } + var p = this.el.translatePoints(x, y); + this.setPosition(p.left, p.top); + return this; + }, + + onRender : function(ct, position){ + Ext.BoxComponent.superclass.onRender.call(this, ct, position); + if(this.resizeEl){ + this.resizeEl = Ext.get(this.resizeEl); + } + if(this.positionEl){ + this.positionEl = Ext.get(this.positionEl); + } + }, + + afterRender : function(){ + Ext.BoxComponent.superclass.afterRender.call(this); + this.boxReady = true; + this.setSize(this.width, this.height); + if(this.x || this.y){ + this.setPosition(this.x, this.y); + } + if(this.pageX || this.pageY){ + this.setPagePosition(this.pageX, this.pageY); + } + }, + + + syncSize : function(){ + delete this.lastSize; + this.setSize(this.el.getWidth(), this.el.getHeight()); + return this; + }, + + + onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){ + + }, + + + onPosition : function(x, y){ + + }, + + adjustSize : function(w, h){ + if(this.autoWidth){ + w = 'auto'; + } + if(this.autoHeight){ + h = 'auto'; + } + return {width : w, height: h}; + }, + + adjustPosition : function(x, y){ + return {x : x, y: y}; + } +}); + +Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){ + + + this.el = Ext.get(dragElement, true); + this.el.dom.unselectable = "on"; + + this.resizingEl = Ext.get(resizingElement, true); + + + this.orientation = orientation || Ext.SplitBar.HORIZONTAL; + + + this.minSize = 0; + + + this.maxSize = 2000; + + + this.animate = false; + + + this.useShim = false; + + + this.shim = null; + + if(!existingProxy){ + + this.proxy = Ext.SplitBar.createProxy(this.orientation); + }else{ + this.proxy = Ext.get(existingProxy).dom; + } + + this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {dragElId : this.proxy.id}); + + + this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this); + + + this.dd.endDrag = this.onEndProxyDrag.createDelegate(this); + + + this.dragSpecs = {}; + + + this.adapter = new Ext.SplitBar.BasicLayoutAdapter(); + this.adapter.init(this); + + if(this.orientation == Ext.SplitBar.HORIZONTAL){ + + this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT); + this.el.addClass("x-splitbar-h"); + }else{ + + this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM); + this.el.addClass("x-splitbar-v"); + } + + this.addEvents({ + + "resize" : true, + + "moved" : true, + + "beforeresize" : true, + + "beforeapply" : true + }); + + Ext.SplitBar.superclass.constructor.call(this); +}; + +Ext.extend(Ext.SplitBar, Ext.util.Observable, { + onStartProxyDrag : function(x, y){ + this.fireEvent("beforeresize", this); + if(!this.overlay){ + var o = Ext.DomHelper.insertFirst(document.body, {cls: "x-drag-overlay", html: " "}, true); + o.unselectable(); + o.enableDisplayMode("block"); + + Ext.SplitBar.prototype.overlay = o; + } + this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); + this.overlay.show(); + Ext.get(this.proxy).setDisplayed("block"); + var size = this.adapter.getElementSize(this); + this.activeMinSize = this.getMinimumSize();; + this.activeMaxSize = this.getMaximumSize();; + var c1 = size - this.activeMinSize; + var c2 = Math.max(this.activeMaxSize - size, 0); + if(this.orientation == Ext.SplitBar.HORIZONTAL){ + this.dd.resetConstraints(); + this.dd.setXConstraint( + this.placement == Ext.SplitBar.LEFT ? c1 : c2, + this.placement == Ext.SplitBar.LEFT ? c2 : c1 + ); + this.dd.setYConstraint(0, 0); + }else{ + this.dd.resetConstraints(); + this.dd.setXConstraint(0, 0); + this.dd.setYConstraint( + this.placement == Ext.SplitBar.TOP ? c1 : c2, + this.placement == Ext.SplitBar.TOP ? c2 : c1 + ); + } + this.dragSpecs.startSize = size; + this.dragSpecs.startPoint = [x, y]; + Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, x, y); + }, + + + onEndProxyDrag : function(e){ + Ext.get(this.proxy).setDisplayed(false); + var endPoint = Ext.lib.Event.getXY(e); + if(this.overlay){ + this.overlay.hide(); + } + var newSize; + if(this.orientation == Ext.SplitBar.HORIZONTAL){ + newSize = this.dragSpecs.startSize + + (this.placement == Ext.SplitBar.LEFT ? + endPoint[0] - this.dragSpecs.startPoint[0] : + this.dragSpecs.startPoint[0] - endPoint[0] + ); + }else{ + newSize = this.dragSpecs.startSize + + (this.placement == Ext.SplitBar.TOP ? + endPoint[1] - this.dragSpecs.startPoint[1] : + this.dragSpecs.startPoint[1] - endPoint[1] + ); + } + newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize); + if(newSize != this.dragSpecs.startSize){ + if(this.fireEvent('beforeapply', this, newSize) !== false){ + this.adapter.setElementSize(this, newSize); + this.fireEvent("moved", this, newSize); + this.fireEvent("resize", this, newSize); + } + } + }, + + + getAdapter : function(){ + return this.adapter; + }, + + + setAdapter : function(adapter){ + this.adapter = adapter; + this.adapter.init(this); + }, + + + getMinimumSize : function(){ + return this.minSize; + }, + + + setMinimumSize : function(minSize){ + this.minSize = minSize; + }, + + + getMaximumSize : function(){ + return this.maxSize; + }, + + + setMaximumSize : function(maxSize){ + this.maxSize = maxSize; + }, + + + setCurrentSize : function(size){ + var oldAnimate = this.animate; + this.animate = false; + this.adapter.setElementSize(this, size); + this.animate = oldAnimate; + }, + + + destroy : function(removeEl){ + if(this.shim){ + this.shim.remove(); + } + this.dd.unreg(); + this.proxy.parentNode.removeChild(this.proxy); + if(removeEl){ + this.el.remove(); + } + } +}); + + +Ext.SplitBar.createProxy = function(dir){ + var proxy = new Ext.Element(document.createElement("div")); + proxy.unselectable(); + var cls = 'x-splitbar-proxy'; + proxy.addClass(cls + ' ' + (dir == Ext.SplitBar.HORIZONTAL ? cls +'-h' : cls + '-v')); + document.body.appendChild(proxy.dom); + return proxy.dom; +}; + + +Ext.SplitBar.BasicLayoutAdapter = function(){ +}; + +Ext.SplitBar.BasicLayoutAdapter.prototype = { + + init : function(s){ + + }, + + getElementSize : function(s){ + if(s.orientation == Ext.SplitBar.HORIZONTAL){ + return s.resizingEl.getWidth(); + }else{ + return s.resizingEl.getHeight(); + } + }, + + + setElementSize : function(s, newSize, onComplete){ + if(s.orientation == Ext.SplitBar.HORIZONTAL){ + if(!s.animate){ + s.resizingEl.setWidth(newSize); + if(onComplete){ + onComplete(s, newSize); + } + }else{ + s.resizingEl.setWidth(newSize, true, .1, onComplete, 'easeOut'); + } + }else{ + + if(!s.animate){ + s.resizingEl.setHeight(newSize); + if(onComplete){ + onComplete(s, newSize); + } + }else{ + s.resizingEl.setHeight(newSize, true, .1, onComplete, 'easeOut'); + } + } + } +}; + + +Ext.SplitBar.AbsoluteLayoutAdapter = function(container){ + this.basic = new Ext.SplitBar.BasicLayoutAdapter(); + this.container = Ext.get(container); +}; + +Ext.SplitBar.AbsoluteLayoutAdapter.prototype = { + init : function(s){ + this.basic.init(s); + }, + + getElementSize : function(s){ + return this.basic.getElementSize(s); + }, + + setElementSize : function(s, newSize, onComplete){ + this.basic.setElementSize(s, newSize, this.moveSplitter.createDelegate(this, [s])); + }, + + moveSplitter : function(s){ + var yes = Ext.SplitBar; + switch(s.placement){ + case yes.LEFT: + s.el.setX(s.resizingEl.getRight()); + break; + case yes.RIGHT: + s.el.setStyle("right", (this.container.getWidth() - s.resizingEl.getLeft()) + "px"); + break; + case yes.TOP: + s.el.setY(s.resizingEl.getBottom()); + break; + case yes.BOTTOM: + s.el.setY(s.resizingEl.getTop() - s.el.getHeight()); + break; + } + } +}; + + +Ext.SplitBar.VERTICAL = 1; + + +Ext.SplitBar.HORIZONTAL = 2; + + +Ext.SplitBar.LEFT = 1; + + +Ext.SplitBar.RIGHT = 2; + + +Ext.SplitBar.TOP = 3; + + +Ext.SplitBar.BOTTOM = 4; + + +Ext.View = function(container, tpl, config){ + this.el = Ext.get(container); + if(typeof tpl == "string"){ + tpl = new Ext.Template(tpl); + } + tpl.compile(); + + this.tpl = tpl; + + Ext.apply(this, config); + + + this.addEvents({ + + "beforeclick" : true, + + "click" : true, + + "dblclick" : true, + + "contextmenu" : true, + + "selectionchange" : true, + + + "beforeselect" : true + }); + + this.el.on({ + "click": this.onClick, + "dblclick": this.onDblClick, + "contextmenu": this.onContextMenu, + scope:this + }); + + this.selections = []; + this.nodes = []; + this.cmp = new Ext.CompositeElementLite([]); + if(this.store){ + this.setStore(this.store, true); + } + Ext.View.superclass.constructor.call(this); +}; + +Ext.extend(Ext.View, Ext.util.Observable, { + + selectedClass : "x-view-selected", + + emptyText : "", + + getEl : function(){ + return this.el; + }, + + + refresh : function(){ + var t = this.tpl; + this.clearSelections(); + this.el.update(""); + var html = []; + var records = this.store.getRange(); + if(records.length < 1){ + this.el.update(this.emptyText); + return; + } + for(var i = 0, len = records.length; i < len; i++){ + var data = this.prepareData(records[i].data, i, records[i]); + html[html.length] = t.apply(data); + } + this.el.update(html.join("")); + this.nodes = this.el.dom.childNodes; + this.updateIndexes(0); + }, + + + prepareData : function(data){ + return data; + }, + + onUpdate : function(ds, record){ + this.clearSelections(); + var index = this.store.indexOf(record); + var n = this.nodes[index]; + this.tpl.insertBefore(n, this.prepareData(record.data)); + n.parentNode.removeChild(n); + this.updateIndexes(index, index); + }, + + onAdd : function(ds, records, index){ + this.clearSelections(); + if(this.nodes.length == 0){ + this.refresh(); + return; + } + var n = this.nodes[index]; + for(var i = 0, len = records.length; i < len; i++){ + var d = this.prepareData(records[i].data); + if(n){ + this.tpl.insertBefore(n, d); + }else{ + this.tpl.append(this.el, d); + } + } + this.updateIndexes(index); + }, + + onRemove : function(ds, record, index){ + this.clearSelections(); + this.el.dom.removeChild(this.nodes[index]); + this.updateIndexes(index); + }, + + + refreshNode : function(index){ + this.onUpdate(this.store, this.store.getAt(index)); + }, + + updateIndexes : function(startIndex, endIndex){ + var ns = this.nodes; + startIndex = startIndex || 0; + endIndex = endIndex || ns.length - 1; + for(var i = startIndex; i <= endIndex; i++){ + ns[i].nodeIndex = i; + } + }, + + + setStore : function(store, initial){ + if(!initial && this.store){ + this.store.un("datachanged", this.refresh); + this.store.un("add", this.onAdd); + this.store.un("remove", this.onRemove); + this.store.un("update", this.onUpdate); + this.store.un("clear", this.refresh); + } + if(store){ + store.on("datachanged", this.refresh, this); + store.on("add", this.onAdd, this); + store.on("remove", this.onRemove, this); + store.on("update", this.onUpdate, this); + store.on("clear", this.refresh, this); + } + this.store = store; + if(store){ + this.refresh(); + } + }, + + + findItemFromChild : function(node){ + var el = this.el.dom; + if(!node || node.parentNode == el){ + return node; + } + var p = node.parentNode; + while(p && p != el){ + if(p.parentNode == el){ + return p; + } + p = p.parentNode; + } + return null; + }, + + + onClick : function(e){ + var item = this.findItemFromChild(e.getTarget()); + if(item){ + var index = this.indexOf(item); + if(this.onItemClick(item, index, e) !== false){ + this.fireEvent("click", this, index, item, e); + } + }else{ + this.clearSelections(); + } + }, + + + onContextMenu : function(e){ + var item = this.findItemFromChild(e.getTarget()); + if(item){ + this.fireEvent("contextmenu", this, this.indexOf(item), item, e); + } + }, + + + onDblClick : function(e){ + var item = this.findItemFromChild(e.getTarget()); + if(item){ + this.fireEvent("dblclick", this, this.indexOf(item), item, e); + } + }, + + onItemClick : function(item, index, e){ + if(this.fireEvent("beforeclick", this, index, item, e) === false){ + return false; + } + if(this.multiSelect || this.singleSelect){ + if(this.multiSelect && e.shiftKey && this.lastSelection){ + this.select(this.getNodes(this.indexOf(this.lastSelection), index), false); + }else{ + this.select(item, this.multiSelect && e.ctrlKey); + this.lastSelection = item; + } + e.preventDefault(); + } + return true; + }, + + + getSelectionCount : function(){ + return this.selections.length; + }, + + + getSelectedNodes : function(){ + return this.selections; + }, + + + getSelectedIndexes : function(){ + var indexes = [], s = this.selections; + for(var i = 0, len = s.length; i < len; i++){ + indexes.push(s[i].nodeIndex); + } + return indexes; + }, + + + clearSelections : function(suppressEvent){ + if(this.nodes && (this.multiSelect || this.singleSelect) && this.selections.length > 0){ + this.cmp.elements = this.selections; + this.cmp.removeClass(this.selectedClass); + this.selections = []; + if(!suppressEvent){ + this.fireEvent("selectionchange", this, this.selections); + } + } + }, + + + isSelected : function(node){ + var s = this.selections; + if(s.length < 1){ + return false; + } + node = this.getNode(node); + return s.indexOf(node) !== -1; + }, + + + select : function(nodeInfo, keepExisting, suppressEvent){ + if(nodeInfo instanceof Array){ + if(!keepExisting){ + this.clearSelections(true); + } + for(var i = 0, len = nodeInfo.length; i < len; i++){ + this.select(nodeInfo[i], true, true); + } + } else{ + var node = this.getNode(nodeInfo); + if(node && !this.isSelected(node)){ + if(!keepExisting){ + this.clearSelections(true); + } + if(this.fireEvent("beforeselect", this, node, this.selections) !== false){ + Ext.fly(node).addClass(this.selectedClass); + this.selections.push(node); + if(!suppressEvent){ + this.fireEvent("selectionchange", this, this.selections); + } + } + } + } + }, + + + getNode : function(nodeInfo){ + if(typeof nodeInfo == "string"){ + return document.getElementById(nodeInfo); + }else if(typeof nodeInfo == "number"){ + return this.nodes[nodeInfo]; + } + return nodeInfo; + }, + + + getNodes : function(start, end){ + var ns = this.nodes; + start = start || 0; + end = typeof end == "undefined" ? ns.length - 1 : end; + var nodes = []; + if(start <= end){ + for(var i = start; i <= end; i++){ + nodes.push(ns[i]); + } + } else{ + for(var i = start; i >= end; i--){ + nodes.push(ns[i]); + } + } + return nodes; + }, + + + indexOf : function(node){ + node = this.getNode(node); + if(typeof node.nodeIndex == "number"){ + return node.nodeIndex; + } + var ns = this.nodes; + for(var i = 0, len = ns.length; i < len; i++){ + if(ns[i] == node){ + return i; + } + } + return -1; + } +}); + + +Ext.JsonView = function(container, tpl, config){ + Ext.JsonView.superclass.constructor.call(this, container, tpl, config); + + var um = this.el.getUpdateManager(); + um.setRenderer(this); + um.on("update", this.onLoad, this); + um.on("failure", this.onLoadException, this); + + + + + this.addEvents({ + 'beforerender' : true, + 'load' : true, + 'loadexception' : true + }); +}; +Ext.extend(Ext.JsonView, Ext.View, { + + jsonRoot : "", + + + refresh : function(){ + this.clearSelections(); + this.el.update(""); + var html = []; + var o = this.jsonData; + if(o && o.length > 0){ + for(var i = 0, len = o.length; i < len; i++){ + var data = this.prepareData(o[i], i, o); + html[html.length] = this.tpl.apply(data); + } + }else{ + html.push(this.emptyText); + } + this.el.update(html.join("")); + this.nodes = this.el.dom.childNodes; + this.updateIndexes(0); + }, + + + load : function(){ + var um = this.el.getUpdateManager(); + um.update.apply(um, arguments); + }, + + render : function(el, response){ + this.clearSelections(); + this.el.update(""); + var o; + try{ + o = Ext.util.JSON.decode(response.responseText); + if(this.jsonRoot){ + o = eval("o." + this.jsonRoot); + } + } catch(e){ + } + + this.jsonData = o; + this.beforeRender(); + this.refresh(); + }, + + + getCount : function(){ + return this.jsonData ? this.jsonData.length : 0; + }, + + + getNodeData : function(node){ + if(node instanceof Array){ + var data = []; + for(var i = 0, len = node.length; i < len; i++){ + data.push(this.getNodeData(node[i])); + } + return data; + } + return this.jsonData[this.indexOf(node)] || null; + }, + + beforeRender : function(){ + this.snapshot = this.jsonData; + if(this.sortInfo){ + this.sort.apply(this, this.sortInfo); + } + this.fireEvent("beforerender", this, this.jsonData); + }, + + onLoad : function(el, o){ + this.fireEvent("load", this, this.jsonData, o); + }, + + onLoadException : function(el, o){ + this.fireEvent("loadexception", this, o); + }, + + + filter : function(property, value){ + if(this.jsonData){ + var data = []; + var ss = this.snapshot; + if(typeof value == "string"){ + var vlen = value.length; + if(vlen == 0){ + this.clearFilter(); + return; + } + value = value.toLowerCase(); + for(var i = 0, len = ss.length; i < len; i++){ + var o = ss[i]; + if(o[property].substr(0, vlen).toLowerCase() == value){ + data.push(o); + } + } + } else if(value.exec){ + for(var i = 0, len = ss.length; i < len; i++){ + var o = ss[i]; + if(value.test(o[property])){ + data.push(o); + } + } + } else{ + return; + } + this.jsonData = data; + this.refresh(); + } + }, + + + filterBy : function(fn, scope){ + if(this.jsonData){ + var data = []; + var ss = this.snapshot; + for(var i = 0, len = ss.length; i < len; i++){ + var o = ss[i]; + if(fn.call(scope || this, o)){ + data.push(o); + } + } + this.jsonData = data; + this.refresh(); + } + }, + + + clearFilter : function(){ + if(this.snapshot && this.jsonData != this.snapshot){ + this.jsonData = this.snapshot; + this.refresh(); + } + }, + + + + sort : function(property, dir, sortType){ + this.sortInfo = Array.prototype.slice.call(arguments, 0); + if(this.jsonData){ + var p = property; + var dsc = dir && dir.toLowerCase() == "desc"; + var f = function(o1, o2){ + var v1 = sortType ? sortType(o1[p]) : o1[p]; + var v2 = sortType ? sortType(o2[p]) : o2[p]; + ; + if(v1 < v2){ + return dsc ? +1 : -1; + } else if(v1 > v2){ + return dsc ? -1 : +1; + } else{ + return 0; + } + }; + this.jsonData.sort(f); + this.refresh(); + if(this.jsonData != this.snapshot){ + this.snapshot.sort(f); + } + } + } +}); + +Ext.ColorPalette = function(config){ + Ext.ColorPalette.superclass.constructor.call(this, config); + this.addEvents({ + + select: true + }); + + if(this.handler){ + this.on("select", this.handler, this.scope, true); + } +}; +Ext.extend(Ext.ColorPalette, 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" + ], + + onRender : function(container, position){ + var t = new Ext.MasterTemplate( + ' ' + ); + var c = this.colors; + for(var i = 0, len = c.length; i < len; i++){ + t.add([c[i]]); + } + var el = document.createElement("div"); + el.className = this.itemCls; + t.overwrite(el); + container.dom.insertBefore(el, position); + this.el = Ext.get(el); + this.el.on(this.clickEvent, this.handleClick, this, {delegate: "a"}); + if(this.clickEvent != 'click'){ + this.el.on('click', Ext.emptyFn, this, {delegate: "a", preventDefault:true}); + } + }, + + afterRender : function(){ + Ext.ColorPalette.superclass.afterRender.call(this); + if(this.value){ + var s = this.value; + this.value = null; + this.select(s); + } + }, + + handleClick : function(e, t){ + e.preventDefault(); + if(!this.disabled){ + var c = t.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1]; + this.select(c.toUpperCase()); + } + }, + + + select : function(color){ + color = color.replace("#", ""); + if(color != this.value || this.allowReselect){ + var el = this.el; + if(this.value){ + el.child("a.color-"+this.value).removeClass("x-color-palette-sel"); + } + el.child("a.color-"+color).addClass("x-color-palette-sel"); + this.value = color; + this.fireEvent("select", this, color); + } + } +}); + +Ext.DatePicker = function(config){ + Ext.DatePicker.superclass.constructor.call(this, config); + + this.value = config && config.value ? + config.value.clearTime() : new Date().clearTime(); + + this.addEvents({ + + select: true + }); + + if(this.handler){ + this.on("select", this.handler, this.scope || this); + } + + if(!this.disabledDatesRE && this.disabledDates){ + var dd = this.disabledDates; + var re = "(?:"; + for(var i = 0; i < dd.length; i++){ + re += dd[i]; + if(i != dd.length-1) re += "|"; + } + this.disabledDatesRE = new RegExp(re + ")"); + } +}; + +Ext.extend(Ext.DatePicker, Ext.Component, { + + todayText : "Today", + + okText : " OK ", + + cancelText : "Cancel", + + todayTip : "{0} (Spacebar)", + + minDate : null, + + maxDate : null, + + minText : "This date is before the minimum date", + + maxText : "This date is after the maximum date", + + format : "m/d/y", + + disabledDays : null, + + disabledDaysText : "", + + disabledDatesRE : null, + + disabledDatesText : "", + + constrainToViewport : true, + + 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, + + + setValue : function(value){ + var old = this.value; + this.value = value.clearTime(true); + if(this.el){ + this.update(this.value); + } + }, + + + getValue : function(){ + return this.value; + }, + + + focus : function(){ + if(this.el){ + this.update(this.activeDate); + } + }, + + + onRender : function(container, position){ + var m = [ + '', + '', + '
  
']; + var dn = this.dayNames; + for(var i = 0; i < 7; i++){ + var d = this.startDay+i; + if(d > 6){ + d = d-7; + } + m.push(""); + } + m[m.length] = ""; + for(var i = 0; i < 42; i++) { + if(i % 7 == 0 && i != 0){ + m[m.length] = ""; + } + m[m.length] = ''; + } + m[m.length] = '
", dn[d].substr(0,1), "
'; + + var el = document.createElement("div"); + el.className = "x-date-picker"; + el.innerHTML = m.join(""); + + container.dom.insertBefore(el, position); + + this.el = Ext.get(el); + this.eventEl = Ext.get(el.firstChild); + + new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"), { + handler: this.showPrevMonth, + scope: this, + preventDefault:true, + stopDefault:true + }); + + new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"), { + handler: this.showNextMonth, + scope: this, + preventDefault:true, + stopDefault:true + }); + + this.eventEl.on("mousewheel", this.handleMouseWheel, this); + + this.monthPicker = this.el.down('div.x-date-mp'); + this.monthPicker.enableDisplayMode('block'); + + var kn = new Ext.KeyNav(this.eventEl, { + "left" : function(e){ + e.ctrlKey ? + this.showPrevMonth() : + this.update(this.activeDate.add("d", -1)); + }, + + "right" : function(e){ + e.ctrlKey ? + this.showNextMonth() : + this.update(this.activeDate.add("d", 1)); + }, + + "up" : function(e){ + e.ctrlKey ? + this.showNextYear() : + this.update(this.activeDate.add("d", -7)); + }, + + "down" : function(e){ + e.ctrlKey ? + this.showPrevYear() : + this.update(this.activeDate.add("d", 7)); + }, + + "pageUp" : function(e){ + this.showNextMonth(); + }, + + "pageDown" : function(e){ + this.showPrevMonth(); + }, + + "enter" : function(e){ + e.stopPropagation(); + return true; + }, + + scope : this + }); + + this.eventEl.on("click", this.handleDateClick, this, {delegate: "a.x-date-date"}); + + this.eventEl.addKeyListener(Ext.EventObject.SPACE, this.selectToday, 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(this.el.child("td.x-date-middle", true), { + text: " ", + tooltip: this.monthYearText + }); + + this.mbtn.on('click', this.showMonthPicker, this); + this.mbtn.el.child(this.mbtn.menuClassTarget).addClass("x-btn-with-menu"); + + + var today = (new Date()).dateFormat(this.format); + var todayBtn = new Ext.Button(this.el.child("td.x-date-bottom", true), { + text: String.format(this.todayText, today), + tooltip: String.format(this.todayTip, today), + handler: this.selectToday, + scope: this + }); + + if(Ext.isIE){ + this.el.repaint(); + } + this.update(this.value); + }, + + createMonthPicker : function(){ + if(!this.monthPicker.dom.firstChild){ + var buf = ['']; + for(var i = 0; i < 6; i++){ + buf.push( + '', + '', + i == 0 ? + '' : + '' + ); + } + buf.push( + '', + '
', this.monthNames[i].substr(0, 3), '', this.monthNames[i+6].substr(0, 3), '
' + ); + this.monthPicker.update(buf.join('')); + this.monthPicker.on('click', this.onMonthClick, this); + this.monthPicker.on('dblclick', this.onMonthDblClick, this); + + this.mpMonths = this.monthPicker.select('td.x-date-mp-month'); + this.mpYears = this.monthPicker.select('td.x-date-mp-year'); + + this.mpMonths.each(function(m, a, i){ + i += 1; + if((i%2) == 0){ + m.dom.xmonth = 5 + Math.round(i * .5); + }else{ + m.dom.xmonth = Math.round((i-1) * .5); + } + }); + } + }, + + showMonthPicker : function(){ + this.createMonthPicker(); + var size = this.el.getSize(); + this.monthPicker.setSize(size); + this.monthPicker.child('table').setSize(size); + + this.mpSelMonth = (this.activeDate || this.value).getMonth(); + this.updateMPMonth(this.mpSelMonth); + this.mpSelYear = (this.activeDate || this.value).getFullYear(); + this.updateMPYear(this.mpSelYear); + + this.monthPicker.slideIn('t', {duration:.2}); + }, + + updateMPYear : function(y){ + this.mpyear = y; + var ys = this.mpYears.elements; + for(var i = 1; i <= 10; i++){ + var td = ys[i-1], y2; + if((i%2) == 0){ + y2 = y + Math.round(i * .5); + td.firstChild.innerHTML = y2; + td.xyear = y2; + }else{ + y2 = y - (5-Math.round(i * .5)); + td.firstChild.innerHTML = y2; + td.xyear = y2; + } + this.mpYears.item(i-1)[y2 == this.mpSelYear ? 'addClass' : 'removeClass']('x-date-mp-sel'); + } + }, + + updateMPMonth : function(sm){ + this.mpMonths.each(function(m, a, i){ + m[m.dom.xmonth == sm ? 'addClass' : 'removeClass']('x-date-mp-sel'); + }); + }, + + selectMPMonth: function(m){ + + }, + + onMonthClick : function(e, t){ + e.stopEvent(); + var el = new Ext.Element(t), pn; + if(el.is('button.x-date-mp-cancel')){ + this.hideMonthPicker(); + } + else if(el.is('button.x-date-mp-ok')){ + this.update(new Date(this.mpSelYear, this.mpSelMonth, (this.activeDate || this.value).getDate())); + this.hideMonthPicker(); + } + else if(pn = el.up('td.x-date-mp-month', 2)){ + this.mpMonths.removeClass('x-date-mp-sel'); + pn.addClass('x-date-mp-sel'); + this.mpSelMonth = pn.dom.xmonth; + } + else if(pn = el.up('td.x-date-mp-year', 2)){ + this.mpYears.removeClass('x-date-mp-sel'); + pn.addClass('x-date-mp-sel'); + this.mpSelYear = pn.dom.xyear; + } + else if(el.is('a.x-date-mp-prev')){ + this.updateMPYear(this.mpyear-10); + } + else if(el.is('a.x-date-mp-next')){ + this.updateMPYear(this.mpyear+10); + } + }, + + onMonthDblClick : function(e, t){ + e.stopEvent(); + var el = new Ext.Element(t), pn; + if(pn = el.up('td.x-date-mp-month', 2)){ + this.update(new Date(this.mpSelYear, pn.dom.xmonth, (this.activeDate || this.value).getDate())); + this.hideMonthPicker(); + } + else if(pn = el.up('td.x-date-mp-year', 2)){ + this.update(new Date(pn.dom.xyear, this.mpSelMonth, (this.activeDate || this.value).getDate())); + this.hideMonthPicker(); + } + }, + + hideMonthPicker : function(disableAnim){ + if(this.monthPicker){ + if(disableAnim === true){ + this.monthPicker.hide(); + }else{ + this.monthPicker.slideOut('t', {duration:.2}); + } + } + }, + + + showPrevMonth : function(e){ + this.update(this.activeDate.add("mo", -1)); + }, + + + showNextMonth : function(e){ + this.update(this.activeDate.add("mo", 1)); + }, + + + showPrevYear : function(){ + this.update(this.activeDate.add("y", -1)); + }, + + + showNextYear : function(){ + this.update(this.activeDate.add("y", 1)); + }, + + + handleMouseWheel : function(e){ + var delta = e.getWheelDelta(); + if(delta > 0){ + this.showPrevMonth(); + e.stopEvent(); + } else if(delta < 0){ + this.showNextMonth(); + e.stopEvent(); + } + }, + + + handleDateClick : function(e, t){ + e.stopEvent(); + if(t.dateValue && !Ext.fly(t.parentNode).hasClass("x-date-disabled")){ + this.setValue(new Date(t.dateValue)); + this.fireEvent("select", this, this.value); + } + }, + + + selectToday : function(){ + this.setValue(new Date().clearTime()); + this.fireEvent("select", this, this.value); + }, + + + update : function(date){ + var vd = this.activeDate; + this.activeDate = date; + if(vd && this.el){ + var t = date.getTime(); + if(vd.getMonth() == date.getMonth() && vd.getFullYear() == date.getFullYear()){ + this.cells.removeClass("x-date-selected"); + this.cells.each(function(c){ + if(c.dom.firstChild.dateValue == t){ + c.addClass("x-date-selected"); + setTimeout(function(){ + try{c.dom.firstChild.focus();}catch(e){} + }, 50); + return false; + } + }); + return; + } + } + var days = date.getDaysInMonth(); + var firstOfMonth = date.getFirstDateOfMonth(); + var startingPos = firstOfMonth.getDay()-this.startDay; + + if(startingPos <= this.startDay){ + startingPos += 7; + } + + var pm = date.add("mo", -1); + var prevStart = pm.getDaysInMonth()-startingPos; + + var cells = this.cells.elements; + var textEls = this.textNodes; + days += startingPos; + + + var day = 86400000; + var d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart)).clearTime(); + var today = new Date().clearTime().getTime(); + var sel = date.clearTime().getTime(); + var min = this.minDate ? this.minDate.clearTime() : Number.NEGATIVE_INFINITY; + var max = this.maxDate ? this.maxDate.clearTime() : Number.POSITIVE_INFINITY; + var ddMatch = this.disabledDatesRE; + var ddText = this.disabledDatesText; + var ddays = this.disabledDays ? this.disabledDays.join("") : false; + var ddaysText = this.disabledDaysText; + var format = this.format; + + var setCellClass = function(cal, cell){ + cell.title = ""; + var t = d.getTime(); + cell.firstChild.dateValue = t; + if(t == today){ + cell.className += " x-date-today"; + cell.title = cal.todayText; + } + if(t == sel){ + cell.className += " x-date-selected"; + setTimeout(function(){ + try{cell.firstChild.focus();}catch(e){} + }, 50); + } + + if(t < min) { + cell.className = " x-date-disabled"; + cell.title = cal.minText; + return; + } + if(t > max) { + cell.className = " x-date-disabled"; + cell.title = cal.maxText; + return; + } + if(ddays){ + if(ddays.indexOf(d.getDay()) != -1){ + cell.title = ddaysText; + cell.className = " x-date-disabled"; + } + } + if(ddMatch && format){ + var fvalue = d.dateFormat(format); + if(ddMatch.test(fvalue)){ + cell.title = ddText.replace("%0", fvalue); + cell.className = " x-date-disabled"; + } + } + }; + + var i = 0; + for(; i < startingPos; i++) { + textEls[i].innerHTML = (++prevStart); + d.setDate(d.getDate()+1); + cells[i].className = "x-date-prevday"; + setCellClass(this, cells[i]); + } + for(; i < days; i++){ + intDay = i - startingPos + 1; + textEls[i].innerHTML = (intDay); + d.setDate(d.getDate()+1); + cells[i].className = "x-date-active"; + setCellClass(this, cells[i]); + } + var extraDays = 0; + for(; i < 42; i++) { + textEls[i].innerHTML = (++extraDays); + d.setDate(d.getDate()+1); + cells[i].className = "x-date-nextday"; + setCellClass(this, cells[i]); + } + + this.mbtn.setText(this.monthNames[date.getMonth()] + " " + date.getFullYear()); + + if(!this.internalRender){ + var main = this.el.dom.firstChild; + var w = main.offsetWidth; + this.el.setWidth(w + this.el.getBorderWidth("lr")); + Ext.fly(main).setWidth(w); + this.internalRender = true; + + + + if(Ext.isOpera && !this.secondPass){ + main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth)) + "px"; + this.secondPass = true; + this.update.defer(10, this, [date]); + } + } + } +}); + +Ext.TabPanel = function(container, config){ + + this.el = Ext.get(container, true); + if(config){ + if(typeof config == "boolean"){ + this.tabPosition = config ? "bottom" : "top"; + }else{ + Ext.apply(this, config); + } + } + if(this.tabPosition == "bottom"){ + this.bodyEl = Ext.get(this.createBody(this.el.dom)); + this.el.addClass("x-tabs-bottom"); + } + this.stripWrap = Ext.get(this.createStrip(this.el.dom), true); + this.stripEl = Ext.get(this.createStripList(this.stripWrap.dom), true); + this.stripBody = Ext.get(this.stripWrap.dom.firstChild.firstChild, true); + if(Ext.isIE){ + Ext.fly(this.stripWrap.dom.firstChild).setStyle("overflow-x", "hidden"); + } + if(this.tabPosition != "bottom"){ + + this.bodyEl = Ext.get(this.createBody(this.el.dom)); + this.el.addClass("x-tabs-top"); + } + this.items = []; + + this.bodyEl.setStyle("position", "relative"); + + this.active = null; + this.activateDelegate = this.activate.createDelegate(this); + + this.addEvents({ + + "tabchange": true, + + "beforetabchange" : true + }); + + Ext.EventManager.onWindowResize(this.onResize, this); + this.cpad = this.el.getPadding("lr"); + this.hiddenCount = 0; + + Ext.TabPanel.superclass.constructor.call(this); +}; + +Ext.extend(Ext.TabPanel, Ext.util.Observable, { + + tabPosition : "top", + + currentTabWidth : 0, + + minTabWidth : 40, + + maxTabWidth : 250, + + preferredTabWidth : 175, + + resizeTabs : false, + + monitorResize : true, + + + addTab : function(id, text, content, closable){ + var item = new Ext.TabPanelItem(this, id, text, closable); + this.addTabItem(item); + if(content){ + item.setContent(content); + } + return item; + }, + + + getTab : function(id){ + return this.items[id]; + }, + + + hideTab : function(id){ + var t = this.items[id]; + if(!t.isHidden()){ + t.setHidden(true); + this.hiddenCount++; + this.autoSizeTabs(); + } + }, + + + unhideTab : function(id){ + var t = this.items[id]; + if(t.isHidden()){ + t.setHidden(false); + this.hiddenCount--; + this.autoSizeTabs(); + } + }, + + + addTabItem : function(item){ + this.items[item.id] = item; + this.items.push(item); + if(this.resizeTabs){ + item.setWidth(this.currentTabWidth || this.preferredTabWidth); + this.autoSizeTabs(); + }else{ + item.autoSize(); + } + }, + + + removeTab : function(id){ + var items = this.items; + var tab = items[id]; + if(!tab) return; + var index = items.indexOf(tab); + if(this.active == tab && items.length > 1){ + var newTab = this.getNextAvailable(index); + if(newTab)newTab.activate(); + } + this.stripEl.dom.removeChild(tab.pnode.dom); + if(tab.bodyEl.dom.parentNode == this.bodyEl.dom){ + this.bodyEl.dom.removeChild(tab.bodyEl.dom); + } + items.splice(index, 1); + delete this.items[tab.id]; + tab.fireEvent("close", tab); + tab.purgeListeners(); + this.autoSizeTabs(); + }, + + getNextAvailable : function(start){ + var items = this.items; + var index = start; + + + while(index < items.length){ + var item = items[++index]; + if(item && !item.isHidden()){ + return item; + } + } + + index = start; + while(index >= 0){ + var item = items[--index]; + if(item && !item.isHidden()){ + return item; + } + } + return null; + }, + + + disableTab : function(id){ + var tab = this.items[id]; + if(tab && this.active != tab){ + tab.disable(); + } + }, + + + enableTab : function(id){ + var tab = this.items[id]; + tab.enable(); + }, + + + activate : function(id){ + var tab = this.items[id]; + if(!tab){ + return null; + } + if(tab == this.active || tab.disabled){ + return tab; + } + var e = {}; + this.fireEvent("beforetabchange", this, e, tab); + if(e.cancel !== true && !tab.disabled){ + if(this.active){ + this.active.hide(); + } + this.active = this.items[id]; + this.active.show(); + this.fireEvent("tabchange", this, this.active); + } + return tab; + }, + + + getActiveTab : function(){ + return this.active; + }, + + + syncHeight : function(targetHeight){ + var height = (targetHeight || this.el.getHeight())-this.el.getBorderWidth("tb")-this.el.getPadding("tb"); + var bm = this.bodyEl.getMargins(); + var newHeight = height-(this.stripWrap.getHeight()||0)-(bm.top+bm.bottom); + this.bodyEl.setHeight(newHeight); + return newHeight; + }, + + onResize : function(){ + if(this.monitorResize){ + this.autoSizeTabs(); + } + }, + + + beginUpdate : function(){ + this.updating = true; + }, + + + endUpdate : function(){ + this.updating = false; + this.autoSizeTabs(); + }, + + + autoSizeTabs : function(){ + var count = this.items.length; + var vcount = count - this.hiddenCount; + if(!this.resizeTabs || count < 1 || vcount < 1 || this.updating) return; + var w = Math.max(this.el.getWidth() - this.cpad, 10); + var availWidth = Math.floor(w / vcount); + var b = this.stripBody; + if(b.getWidth() > w){ + var tabs = this.items; + this.setTabWidth(Math.max(availWidth, this.minTabWidth)-2); + if(availWidth < this.minTabWidth){ + + } + }else{ + if(this.currentTabWidth < this.preferredTabWidth){ + this.setTabWidth(Math.min(availWidth, this.preferredTabWidth)-2); + } + } + }, + + + getCount : function(){ + return this.items.length; + }, + + + setTabWidth : function(width){ + this.currentTabWidth = width; + for(var i = 0, len = this.items.length; i < len; i++) { + if(!this.items[i].isHidden())this.items[i].setWidth(width); + } + }, + + + destroy : function(removeEl){ + Ext.EventManager.removeResizeListener(this.onResize, this); + for(var i = 0, len = this.items.length; i < len; i++){ + this.items[i].purgeListeners(); + } + if(removeEl === true){ + this.el.update(""); + this.el.remove(); + } + } +}); + + +Ext.TabPanelItem = function(tabPanel, id, text, closable){ + + this.tabPanel = tabPanel; + + this.id = id; + + this.disabled = false; + + this.text = text; + + this.loaded = false; + this.closable = closable; + + + this.bodyEl = Ext.get(tabPanel.createItemBody(tabPanel.bodyEl.dom, id)); + this.bodyEl.setVisibilityMode(Ext.Element.VISIBILITY); + this.bodyEl.setStyle("display", "block"); + this.bodyEl.setStyle("zoom", "1"); + this.hideAction(); + + var els = tabPanel.createStripElements(tabPanel.stripEl.dom, text, closable); + + this.el = Ext.get(els.el, true); + this.inner = Ext.get(els.inner, true); + this.textEl = Ext.get(this.el.dom.firstChild.firstChild.firstChild, true); + this.pnode = Ext.get(els.el.parentNode, true); + this.el.on("mousedown", this.onTabMouseDown, this); + this.el.on("click", this.onTabClick, this); + + if(closable){ + var c = Ext.get(els.close, true); + c.dom.title = this.closeText; + c.addClassOnOver("close-over"); + c.on("click", this.closeClick, this); + } + + this.addEvents({ + + "activate": true, + + "beforeclose": true, + + "close": true, + + "deactivate" : true + }); + this.hidden = false; + + Ext.TabPanelItem.superclass.constructor.call(this); +}; + +Ext.extend(Ext.TabPanelItem, Ext.util.Observable, { + purgeListeners : function(){ + Ext.util.Observable.prototype.purgeListeners.call(this); + this.el.removeAllListeners(); + }, + + show : function(){ + this.pnode.addClass("on"); + this.showAction(); + if(Ext.isOpera){ + this.tabPanel.stripWrap.repaint(); + } + this.fireEvent("activate", this.tabPanel, this); + }, + + + isActive : function(){ + return this.tabPanel.getActiveTab() == this; + }, + + + hide : function(){ + this.pnode.removeClass("on"); + this.hideAction(); + this.fireEvent("deactivate", this.tabPanel, this); + }, + + hideAction : function(){ + this.bodyEl.hide(); + this.bodyEl.setStyle("position", "absolute"); + this.bodyEl.setLeft("-20000px"); + this.bodyEl.setTop("-20000px"); + }, + + showAction : function(){ + this.bodyEl.setStyle("position", "relative"); + this.bodyEl.setTop(""); + this.bodyEl.setLeft(""); + this.bodyEl.show(); + }, + + + setTooltip : function(text){ + if(Ext.QuickTips && Ext.QuickTips.isEnabled()){ + this.textEl.dom.qtip = text; + this.textEl.dom.removeAttribute('title'); + }else{ + this.textEl.dom.title = text; + } + }, + + onTabClick : function(e){ + e.preventDefault(); + this.tabPanel.activate(this.id); + }, + + onTabMouseDown : function(e){ + e.preventDefault(); + this.tabPanel.activate(this.id); + }, + + getWidth : function(){ + return this.inner.getWidth(); + }, + + setWidth : function(width){ + var iwidth = width - this.pnode.getPadding("lr"); + this.inner.setWidth(iwidth); + this.textEl.setWidth(iwidth-this.inner.getPadding("lr")); + this.pnode.setWidth(width); + }, + + + setHidden : function(hidden){ + this.hidden = hidden; + this.pnode.setStyle("display", hidden ? "none" : ""); + }, + + + isHidden : function(){ + return this.hidden; + }, + + + getText : function(){ + return this.text; + }, + + autoSize : function(){ + + this.textEl.setWidth(1); + this.setWidth(this.textEl.dom.scrollWidth+this.pnode.getPadding("lr")+this.inner.getPadding("lr")); + + }, + + + setText : function(text){ + this.text = text; + this.textEl.update(text); + this.setTooltip(text); + if(!this.tabPanel.resizeTabs){ + this.autoSize(); + } + }, + + activate : function(){ + this.tabPanel.activate(this.id); + }, + + + disable : function(){ + if(this.tabPanel.active != this){ + this.disabled = true; + this.pnode.addClass("disabled"); + } + }, + + + enable : function(){ + this.disabled = false; + this.pnode.removeClass("disabled"); + }, + + + setContent : function(content, loadScripts){ + this.bodyEl.update(content, loadScripts); + }, + + + getUpdateManager : function(){ + return this.bodyEl.getUpdateManager(); + }, + + + setUrl : function(url, params, loadOnce){ + if(this.refreshDelegate){ + this.un('activate', this.refreshDelegate); + } + this.refreshDelegate = this._handleRefresh.createDelegate(this, [url, params, loadOnce]); + this.on("activate", this.refreshDelegate); + return this.bodyEl.getUpdateManager(); + }, + + + _handleRefresh : function(url, params, loadOnce){ + if(!loadOnce || !this.loaded){ + var updater = this.bodyEl.getUpdateManager(); + updater.update(url, params, this._setLoaded.createDelegate(this)); + } + }, + + + refresh : function(){ + if(this.refreshDelegate){ + this.loaded = false; + this.refreshDelegate(); + } + }, + + + _setLoaded : function(){ + this.loaded = true; + }, + + + closeClick : function(e){ + var o = {}; + e.stopEvent(); + this.fireEvent("beforeclose", this, o); + if(o.cancel !== true){ + this.tabPanel.removeTab(this.id); + } + }, + + closeText : "Close this tab" +}); + + +Ext.TabPanel.prototype.createStrip = function(container){ + var strip = document.createElement("div"); + strip.className = "x-tabs-wrap"; + container.appendChild(strip); + return strip; +}; + +Ext.TabPanel.prototype.createStripList = function(strip){ + + strip.innerHTML = '
'; + return strip.firstChild.firstChild.firstChild.firstChild; +}; + +Ext.TabPanel.prototype.createBody = function(container){ + var body = document.createElement("div"); + Ext.id(body, "tab-body"); + Ext.fly(body).addClass("x-tabs-body"); + container.appendChild(body); + return body; +}; + +Ext.TabPanel.prototype.createItemBody = function(bodyEl, id){ + var body = Ext.getDom(id); + if(!body){ + body = document.createElement("div"); + body.id = id; + } + Ext.fly(body).addClass("x-tabs-item-body"); + bodyEl.insertBefore(body, bodyEl.firstChild); + return body; +}; + +Ext.TabPanel.prototype.createStripElements = function(stripEl, text, closable){ + var td = document.createElement("td"); + stripEl.appendChild(td); + if(closable){ + td.className = "x-tabs-closable"; + if(!this.closeTpl){ + this.closeTpl = new Ext.Template( + '' + + '{text}' + + '
 
' + ); + } + var el = this.closeTpl.overwrite(td, {"text": text}); + var close = el.getElementsByTagName("div")[0]; + var inner = el.getElementsByTagName("em")[0]; + return {"el": el, "close": close, "inner": inner}; + } else { + if(!this.tabTpl){ + this.tabTpl = new Ext.Template( + '' + + '{text}' + ); + } + var el = this.tabTpl.overwrite(td, {"text": text}); + var inner = el.getElementsByTagName("em")[0]; + return {"el": el, "inner": inner}; + } +}; + +Ext.Button = function(renderTo, config){ + Ext.apply(this, config); + this.addEvents({ + + "click" : true, + + "toggle" : true, + + 'mouseover' : true, + + 'mouseout': true + }); + if(this.menu){ + this.menu = Ext.menu.MenuMgr.get(this.menu); + } + if(renderTo){ + this.render(renderTo); + } + Ext.Button.superclass.constructor.call(this); +}; + +Ext.extend(Ext.Button, Ext.util.Observable, { + + hidden : false, + + disabled : false, + + pressed : false, + + + tabIndex : undefined, + + + enableToggle: false, + + menu : undefined, + + menuAlign : "tl-bl?", + + + iconCls : undefined, + + type : 'button', + + + menuClassTarget: 'tr', + + + clickEvent : 'click', + + + handleMouseEvents : true, + + + tooltipType : 'qtip', + + + + + + + render : function(renderTo){ + var btn; + if(this.hideParent){ + this.parentEl = Ext.get(renderTo); + } + if(!this.dhconfig){ + if(!this.template){ + if(!Ext.Button.buttonTemplate){ + + Ext.Button.buttonTemplate = new Ext.Template( + '', + '', + "
  
"); + } + this.template = Ext.Button.buttonTemplate; + } + btn = this.template.append(renderTo, [this.text || ' ', this.type], true); + var btnEl = btn.child("button:first"); + btnEl.on('focus', this.onFocus, this); + btnEl.on('blur', this.onBlur, this); + if(this.cls){ + btn.addClass(this.cls); + } + if(this.icon){ + btnEl.setStyle('background-image', 'url(' +this.icon +')'); + } + if(this.iconCls){ + btnEl.addClass(this.iconCls); + if(!this.cls){ + btn.addClass(this.text ? 'x-btn-text-icon' : 'x-btn-icon'); + } + } + if(this.tabIndex !== undefined){ + btnEl.dom.tabIndex = this.tabIndex; + } + if(this.tooltip){ + if(typeof this.tooltip == 'object'){ + Ext.QuickTips.tips(Ext.apply({ + target: btnEl.id + }, this.tooltip)); + } else { + btnEl.dom[this.tooltipType] = this.tooltip; + } + } + }else{ + btn = Ext.DomHelper.append(Ext.get(renderTo).dom, this.dhconfig, true); + } + this.el = btn; + if(this.id){ + this.el.dom.id = this.el.id = this.id; + } + if(this.menu){ + this.el.child(this.menuClassTarget).addClass("x-btn-with-menu"); + this.menu.on("show", this.onMenuShow, this); + this.menu.on("hide", this.onMenuHide, this); + } + btn.addClass("x-btn"); + if(Ext.isIE && !Ext.isIE7){ + this.autoWidth.defer(1, this); + }else{ + this.autoWidth(); + } + if(this.handleMouseEvents){ + btn.on("mouseover", this.onMouseOver, this); + btn.on("mouseout", this.onMouseOut, this); + btn.on("mousedown", this.onMouseDown, this); + } + btn.on(this.clickEvent, this.onClick, this); + + if(this.hidden){ + this.hide(); + } + if(this.disabled){ + this.disable(); + } + Ext.ButtonToggleMgr.register(this); + if(this.pressed){ + this.el.addClass("x-btn-pressed"); + } + if(this.repeat){ + var repeater = new Ext.util.ClickRepeater(btn, + typeof this.repeat == "object" ? this.repeat : {} + ); + repeater.on("click", this.onClick, this); + } + }, + + getEl : function(){ + return this.el; + }, + + + destroy : function(){ + Ext.ButtonToggleMgr.unregister(this); + this.el.removeAllListeners(); + this.purgeListeners(); + this.el.remove(); + }, + + + autoWidth : function(){ + if(this.el){ + this.el.setWidth("auto"); + if(Ext.isIE7 && Ext.isStrict){ + var ib = this.el.child('button'); + if(ib && ib.getWidth() > 20){ + ib.clip(); + ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr')); + } + } + if(this.minWidth){ + if(this.hidden){ + this.el.beginMeasure(); + } + if(this.el.getWidth() < this.minWidth){ + this.el.setWidth(this.minWidth); + } + if(this.hidden){ + this.el.endMeasure(); + } + } + } + }, + + + setHandler : function(handler, scope){ + this.handler = handler; + this.scope = scope; + }, + + + setText : function(text){ + this.text = text; + if(this.el){ + this.el.child("td.x-btn-center button.x-btn-text").update(text); + } + this.autoWidth(); + }, + + + getText : function(){ + return this.text; + }, + + + show: function(){ + this.hidden = false; + if(this.el){ + this[this.hideParent? 'parentEl' : 'el'].setStyle("display", ""); + } + }, + + + hide: function(){ + this.hidden = true; + if(this.el){ + this[this.hideParent? 'parentEl' : 'el'].setStyle("display", "none"); + } + }, + + + setVisible: function(visible){ + if(visible) { + this.show(); + }else{ + this.hide(); + } + }, + + + toggle : function(state){ + state = state === undefined ? !this.pressed : state; + if(state != this.pressed){ + if(state){ + this.el.addClass("x-btn-pressed"); + this.pressed = true; + this.fireEvent("toggle", this, true); + }else{ + this.el.removeClass("x-btn-pressed"); + this.pressed = false; + this.fireEvent("toggle", this, false); + } + if(this.toggleHandler){ + this.toggleHandler.call(this.scope || this, this, state); + } + } + }, + + + focus : function(){ + this.el.child('button:first').focus(); + }, + + + disable : function(){ + if(this.el){ + this.el.addClass("x-btn-disabled"); + } + this.disabled = true; + }, + + + enable : function(){ + if(this.el){ + this.el.removeClass("x-btn-disabled"); + } + this.disabled = false; + }, + + + setDisabled : function(v){ + this[v !== true ? "enable" : "disable"](); + }, + + + onClick : function(e){ + if(e){ + e.preventDefault(); + } + if(e.button != 0){ + return; + } + if(!this.disabled){ + if(this.enableToggle){ + this.toggle(); + } + if(this.menu && !this.menu.isVisible()){ + this.menu.show(this.el, this.menuAlign); + } + this.fireEvent("click", this, e); + if(this.handler){ + this.el.removeClass("x-btn-over"); + this.handler.call(this.scope || this, this, e); + } + } + }, + + onMouseOver : function(e){ + if(!this.disabled){ + this.el.addClass("x-btn-over"); + this.fireEvent('mouseover', this, e); + } + }, + + onMouseOut : function(e){ + if(!e.within(this.el, true)){ + this.el.removeClass("x-btn-over"); + this.fireEvent('mouseout', this, e); + } + }, + + onFocus : function(e){ + if(!this.disabled){ + this.el.addClass("x-btn-focus"); + } + }, + + onBlur : function(e){ + this.el.removeClass("x-btn-focus"); + }, + + onMouseDown : function(e){ + if(!this.disabled && e.button == 0){ + this.el.addClass("x-btn-click"); + Ext.get(document).on('mouseup', this.onMouseUp, this); + } + }, + + onMouseUp : function(e){ + if(e.button == 0){ + this.el.removeClass("x-btn-click"); + Ext.get(document).un('mouseup', this.onMouseUp, this); + } + }, + + onMenuShow : function(e){ + this.el.addClass("x-btn-menu-active"); + }, + + onMenuHide : function(e){ + this.el.removeClass("x-btn-menu-active"); + } +}); + + +Ext.ButtonToggleMgr = function(){ + var groups = {}; + + function toggleGroup(btn, state){ + if(state){ + var g = groups[btn.toggleGroup]; + for(var i = 0, l = g.length; i < l; i++){ + if(g[i] != btn){ + g[i].toggle(false); + } + } + } + } + + return { + register : function(btn){ + if(!btn.toggleGroup){ + return; + } + var g = groups[btn.toggleGroup]; + if(!g){ + g = groups[btn.toggleGroup] = []; + } + g.push(btn); + btn.on("toggle", toggleGroup); + }, + + unregister : function(btn){ + if(!btn.toggleGroup){ + return; + } + var g = groups[btn.toggleGroup]; + if(g){ + g.remove(btn); + btn.un("toggle", toggleGroup); + } + } + }; +}(); + +Ext.SplitButton = function(renderTo, config){ + Ext.SplitButton.superclass.constructor.call(this, renderTo, config); + + this.addEvents({"arrowclick":true}); +}; + +Ext.extend(Ext.SplitButton, Ext.Button, { + render : function(renderTo){ + + var tpl = new Ext.Template( + '
', + '', + '', + "
 
", + '', + '', + "
 
" + ); + var btn = tpl.append(renderTo, [this.text, this.type], true); + var btnEl = btn.child("button"); + if(this.cls){ + btn.addClass(this.cls); + } + if(this.icon){ + btnEl.setStyle('background-image', 'url(' +this.icon +')'); + } + if(this.iconCls){ + btnEl.addClass(this.iconCls); + if(!this.cls){ + btn.addClass(this.text ? 'x-btn-text-icon' : 'x-btn-icon'); + } + } + this.el = btn; + if(this.handleMouseEvents){ + btn.on("mouseover", this.onMouseOver, this); + btn.on("mouseout", this.onMouseOut, this); + btn.on("mousedown", this.onMouseDown, this); + btn.on("mouseup", this.onMouseUp, this); + } + btn.on(this.clickEvent, this.onClick, this); + if(this.tooltip){ + if(typeof this.tooltip == 'object'){ + Ext.QuickTips.tips(Ext.apply({ + target: btnEl.id + }, this.tooltip)); + } else { + btnEl.dom[this.tooltipType] = this.tooltip; + } + } + if(this.arrowTooltip){ + btn.child("button:nth(2)").dom[this.tooltipType] = this.arrowTooltip; + } + if(this.hidden){ + this.hide(); + } + if(this.disabled){ + this.disable(); + } + if(this.pressed){ + this.el.addClass("x-btn-pressed"); + } + if(Ext.isIE && !Ext.isIE7){ + this.autoWidth.defer(1, this); + }else{ + this.autoWidth(); + } + if(this.menu){ + this.menu.on("show", this.onMenuShow, this); + this.menu.on("hide", this.onMenuHide, this); + } + }, + + + autoWidth : function(){ + if(this.el){ + var tbl = this.el.child("table:first"); + var tbl2 = this.el.child("table:last"); + this.el.setWidth("auto"); + tbl.setWidth("auto"); + if(Ext.isIE7 && Ext.isStrict){ + var ib = this.el.child('button:first'); + if(ib && ib.getWidth() > 20){ + ib.clip(); + ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr')); + } + } + if(this.minWidth){ + if(this.hidden){ + this.el.beginMeasure(); + } + if((tbl.getWidth()+tbl2.getWidth()) < this.minWidth){ + tbl.setWidth(this.minWidth-tbl2.getWidth()); + } + if(this.hidden){ + this.el.endMeasure(); + } + } + this.el.setWidth(tbl.getWidth()+tbl2.getWidth()); + } + }, + + setHandler : function(handler, scope){ + this.handler = handler; + this.scope = scope; + }, + + + setArrowHandler : function(handler, scope){ + this.arrowHandler = handler; + this.scope = scope; + }, + + + focus : function(){ + if(this.el){ + this.el.child("button:first").focus(); + } + }, + + + onClick : function(e){ + e.preventDefault(); + if(!this.disabled){ + if(e.getTarget(".x-btn-menu-arrow-wrap")){ + if(this.menu && !this.menu.isVisible()){ + this.menu.show(this.el, this.menuAlign); + } + this.fireEvent("arrowclick", this, e); + if(this.arrowHandler){ + this.arrowHandler.call(this.scope || this, this, e); + } + }else{ + this.fireEvent("click", this, e); + if(this.handler){ + this.handler.call(this.scope || this, this, e); + } + } + } + }, + + onMouseDown : function(e){ + if(!this.disabled){ + Ext.fly(e.getTarget("table")).addClass("x-btn-click"); + } + }, + + onMouseUp : function(e){ + Ext.fly(e.getTarget("table")).removeClass("x-btn-click"); + } +}); + + +Ext.MenuButton = Ext.SplitButton; + +Ext.Toolbar = function(container, buttons, config){ + if(container instanceof Array){ + buttons = container; + config = buttons; + container = null; + } + Ext.apply(this, config); + this.buttons = buttons; + if(container){ + this.render(container); + } +}; + +Ext.Toolbar.prototype = { + + render : function(ct){ + this.el = Ext.get(ct); + if(this.cls){ + this.el.addClass(this.cls); + } + + this.el.update('
'); + this.tr = this.el.child("tr", true); + var autoId = 0; + this.items = new Ext.util.MixedCollection(false, function(o){ + return o.id || ("item" + (++autoId)); + }); + if(this.buttons){ + this.add.apply(this, this.buttons); + delete this.buttons; + } + }, + + + add : function(){ + var a = arguments, l = a.length; + for(var i = 0; i < l; i++){ + var el = a[i]; + if(el.applyTo){ + this.addField(el); + }else if(el.render){ + this.addItem(el); + }else if(typeof el == "string"){ + if(el == "separator" || el == "-"){ + this.addSeparator(); + }else if(el == " "){ + this.addSpacer(); + }else if(el == "->"){ + this.addFill(); + }else{ + this.addText(el); + } + }else if(el.tagName){ + this.addElement(el); + }else if(typeof el == "object"){ + this.addButton(el); + } + } + }, + + + getEl : function(){ + return this.el; + }, + + + addSeparator : function(){ + return this.addItem(new Ext.Toolbar.Separator()); + }, + + + addSpacer : function(){ + return this.addItem(new Ext.Toolbar.Spacer()); + }, + + + addFill : function(){ + return this.addItem(new Ext.Toolbar.Fill()); + }, + + + addElement : function(el){ + return this.addItem(new Ext.Toolbar.Item(el)); + }, + + + addItem : function(item){ + var td = this.nextBlock(); + item.render(td); + this.items.add(item); + return item; + }, + + + addButton : function(config){ + if(config instanceof Array){ + var buttons = []; + for(var i = 0, len = config.length; i < len; i++) { + buttons.push(this.addButton(config[i])); + } + return buttons; + } + var b = config; + if(!(config instanceof Ext.Toolbar.Button)){ + b = config.split ? + new Ext.Toolbar.SplitButton(config) : + new Ext.Toolbar.Button(config); + } + var td = this.nextBlock(); + b.render(td); + this.items.add(b); + return b; + }, + + + addText : function(text){ + return this.addItem(new Ext.Toolbar.TextItem(text)); + }, + + + insertButton : function(index, item){ + if(item instanceof Array){ + var buttons = []; + for(var i = 0, len = item.length; i < len; i++) { + buttons.push(this.insertButton(index + i, item[i])); + } + return buttons; + } + if (!(item instanceof Ext.Toolbar.Button)){ + item = new Ext.Toolbar.Button(item); + } + var td = document.createElement("td"); + this.tr.insertBefore(td, this.tr.childNodes[index]); + item.render(td); + this.items.insert(index, item); + return item; + }, + + + addDom : function(config, returnEl){ + var td = this.nextBlock(); + Ext.DomHelper.overwrite(td, config); + var ti = new Ext.Toolbar.Item(td.firstChild); + ti.render(td); + this.items.add(ti); + return ti; + }, + + + addField : function(field){ + var td = this.nextBlock(); + field.render(td); + var ti = new Ext.Toolbar.Item(td.firstChild); + ti.render(td); + this.items.add(ti); + return ti; + }, + + + nextBlock : function(){ + var td = document.createElement("td"); + this.tr.appendChild(td); + return td; + }, + + + destroy : function(){ + if(this.items){ + Ext.destroy.apply(Ext, this.items.items); + } + Ext.Element.uncache(this.el, this.tr); + } +}; + + +Ext.Toolbar.Item = function(el){ + this.el = Ext.getDom(el); + this.id = Ext.id(this.el); + this.hidden = false; +}; + +Ext.Toolbar.Item.prototype = { + + + getEl : function(){ + return this.el; + }, + + + render : function(td){ + this.td = td; + td.appendChild(this.el); + }, + + + destroy : function(){ + this.td.parentNode.removeChild(this.td); + }, + + + show: function(){ + this.hidden = false; + this.td.style.display = ""; + }, + + + hide: function(){ + this.hidden = true; + this.td.style.display = "none"; + }, + + + setVisible: function(visible){ + if(visible) { + this.show(); + }else{ + this.hide(); + } + }, + + + focus : function(){ + Ext.fly(this.el).focus(); + }, + + + disable : function(){ + Ext.fly(this.td).addClass("x-item-disabled"); + this.disabled = true; + this.el.disabled = true; + }, + + + enable : function(){ + Ext.fly(this.td).removeClass("x-item-disabled"); + this.disabled = false; + this.el.disabled = false; + } +}; + + + +Ext.Toolbar.Separator = function(){ + var s = document.createElement("span"); + s.className = "ytb-sep"; + Ext.Toolbar.Separator.superclass.constructor.call(this, s); +}; +Ext.extend(Ext.Toolbar.Separator, Ext.Toolbar.Item, { + enable:Ext.emptyFn, + disable:Ext.emptyFn, + focus:Ext.emptyFn +}); + + +Ext.Toolbar.Spacer = function(){ + var s = document.createElement("div"); + s.className = "ytb-spacer"; + Ext.Toolbar.Spacer.superclass.constructor.call(this, s); +}; +Ext.extend(Ext.Toolbar.Spacer, Ext.Toolbar.Item, { + enable:Ext.emptyFn, + disable:Ext.emptyFn, + focus:Ext.emptyFn +}); + + +Ext.Toolbar.Fill = Ext.extend(Ext.Toolbar.Spacer, { + + render : function(td){ + td.style.width = '100%'; + Ext.Toolbar.Fill.superclass.render.call(this, td); + } +}); + + +Ext.Toolbar.TextItem = function(text){ + var s = document.createElement("span"); + s.className = "ytb-text"; + s.innerHTML = text; + Ext.Toolbar.TextItem.superclass.constructor.call(this, s); +}; +Ext.extend(Ext.Toolbar.TextItem, Ext.Toolbar.Item, { + enable:Ext.emptyFn, + disable:Ext.emptyFn, + focus:Ext.emptyFn +}); + + +Ext.Toolbar.Button = function(config){ + Ext.Toolbar.Button.superclass.constructor.call(this, null, config); +}; +Ext.extend(Ext.Toolbar.Button, Ext.Button, { + render : function(td){ + this.td = td; + Ext.Toolbar.Button.superclass.render.call(this, td); + }, + + + destroy : function(){ + Ext.Toolbar.Button.superclass.destroy.call(this); + this.td.parentNode.removeChild(this.td); + }, + + + show: function(){ + this.hidden = false; + this.td.style.display = ""; + }, + + + hide: function(){ + this.hidden = true; + this.td.style.display = "none"; + }, + + + disable : function(){ + Ext.fly(this.td).addClass("x-item-disabled"); + this.disabled = true; + }, + + + enable : function(){ + Ext.fly(this.td).removeClass("x-item-disabled"); + this.disabled = false; + } +}); + +Ext.ToolbarButton = Ext.Toolbar.Button; + + +Ext.Toolbar.SplitButton = function(config){ + Ext.Toolbar.SplitButton.superclass.constructor.call(this, null, config); +}; +Ext.extend(Ext.Toolbar.SplitButton, Ext.SplitButton, { + render : function(td){ + this.td = td; + Ext.Toolbar.SplitButton.superclass.render.call(this, td); + }, + + + destroy : function(){ + Ext.Toolbar.SplitButton.superclass.destroy.call(this); + this.td.parentNode.removeChild(this.td); + }, + + + show: function(){ + this.hidden = false; + this.td.style.display = ""; + }, + + + hide: function(){ + this.hidden = true; + this.td.style.display = "none"; + } +}); + + +Ext.Toolbar.MenuButton = Ext.Toolbar.SplitButton; + +Ext.PagingToolbar = function(el, ds, config){ + Ext.PagingToolbar.superclass.constructor.call(this, el, null, config); + this.ds = ds; + this.cursor = 0; + this.renderButtons(this.el); + this.bind(ds); +}; + +Ext.extend(Ext.PagingToolbar, 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", + + renderButtons : function(el){ + Ext.PagingToolbar.superclass.render.call(this, el); + this.first = this.addButton({ + tooltip: this.firstText, + cls: "x-btn-icon x-grid-page-first", + disabled: true, + handler: this.onClick.createDelegate(this, ["first"]) + }); + this.prev = this.addButton({ + tooltip: this.prevText, + cls: "x-btn-icon x-grid-page-prev", + disabled: true, + handler: this.onClick.createDelegate(this, ["prev"]) + }); + this.addSeparator(); + this.add(this.beforePageText); + this.field = Ext.get(this.addDom({ + tag: "input", + type: "text", + size: "3", + value: "1", + cls: "x-grid-page-number" + }).el); + this.field.on("keydown", this.onPagingKeydown, this); + this.field.on("focus", function(){this.dom.select();}); + this.afterTextEl = this.addText(String.format(this.afterPageText, 1)); + this.field.setHeight(18); + this.addSeparator(); + this.next = this.addButton({ + tooltip: this.nextText, + cls: "x-btn-icon x-grid-page-next", + disabled: true, + handler: this.onClick.createDelegate(this, ["next"]) + }); + this.last = this.addButton({ + tooltip: this.lastText, + cls: "x-btn-icon x-grid-page-last", + disabled: true, + handler: this.onClick.createDelegate(this, ["last"]) + }); + this.addSeparator(); + this.loading = this.addButton({ + tooltip: this.refreshText, + cls: "x-btn-icon x-grid-loading", + handler: this.onClick.createDelegate(this, ["refresh"]) + }); + + if(this.displayInfo){ + this.displayEl = Ext.fly(this.el.dom.firstChild).createChild({cls:'x-paging-info'}); + } + }, + + updateInfo : function(){ + if(this.displayEl){ + var count = this.ds.getCount(); + var msg = count == 0 ? + this.emptyMsg : + String.format( + this.displayMsg, + this.cursor+1, this.cursor+count, this.ds.getTotalCount() + ); + this.displayEl.update(msg); + } + }, + + onLoad : function(ds, r, o){ + this.cursor = o.params ? o.params.start : 0; + var d = this.getPageData(), ap = d.activePage, ps = d.pages; + + this.afterTextEl.el.innerHTML = String.format(this.afterPageText, d.pages); + this.field.dom.value = ap; + this.first.setDisabled(ap == 1); + this.prev.setDisabled(ap == 1); + this.next.setDisabled(ap == ps); + this.last.setDisabled(ap == ps); + this.loading.enable(); + this.updateInfo(); + }, + + getPageData : function(){ + var total = this.ds.getTotalCount(); + return { + total : total, + activePage : Math.ceil((this.cursor+this.pageSize)/this.pageSize), + pages : total < this.pageSize ? 1 : Math.ceil(total/this.pageSize) + }; + }, + + onLoadError : function(){ + this.loading.enable(); + }, + + onPagingKeydown : function(e){ + var k = e.getKey(); + var d = this.getPageData(); + if(k == e.RETURN){ + var v = this.field.dom.value, pageNum; + if(!v || isNaN(pageNum = parseInt(v, 10))){ + this.field.dom.value = d.activePage; + return; + } + pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1; + this.ds.load({params:{start: pageNum * this.pageSize, limit: this.pageSize}}); + e.stopEvent(); + } + else if(k == e.HOME || (k == e.UP && e.ctrlKey) || (k == e.PAGEUP && e.ctrlKey) || (k == e.RIGHT && e.ctrlKey) || k == e.END || (k == e.DOWN && e.ctrlKey) || (k == e.LEFT && e.ctrlKey) || (k == e.PAGEDOWN && e.ctrlKey)) + { + var pageNum = (k == e.HOME || (k == e.DOWN && e.ctrlKey) || (k == e.LEFT && e.ctrlKey) || (k == e.PAGEDOWN && e.ctrlKey)) ? 1 : d.pages; + this.field.dom.value = pageNum; + this.ds.load({params:{start: (pageNum - 1) * this.pageSize, limit: this.pageSize}}); + e.stopEvent(); + } + else if(k == e.UP || k == e.RIGHT || k == e.PAGEUP || k == e.DOWN || k == e.LEFT || k == e.PAGEDOWN) + { + var v = this.field.dom.value, pageNum; + var increment = (e.shiftKey) ? 10 : 1; + if(k == e.DOWN || k == e.LEFT || k == e.PAGEDOWN) + increment *= -1; + if(!v || isNaN(pageNum = parseInt(v, 10))) { + this.field.dom.value = d.activePage; + return; + } + else if(parseInt(v, 10) + increment >= 1 & parseInt(v, 10) + increment <= d.pages) + { + this.field.dom.value = parseInt(v, 10) + increment; + pageNum = Math.min(Math.max(1, pageNum + increment), d.pages) - 1; + this.ds.load({params:{start: pageNum * this.pageSize, limit: this.pageSize}}); + } + e.stopEvent(); + } + }, + + beforeLoad : function(){ + if(this.loading){ + this.loading.disable(); + } + }, + + onClick : function(which){ + var ds = this.ds; + switch(which){ + case "first": + ds.load({params:{start: 0, limit: this.pageSize}}); + break; + case "prev": + ds.load({params:{start: Math.max(0, this.cursor-this.pageSize), limit: this.pageSize}}); + break; + case "next": + ds.load({params:{start: this.cursor+this.pageSize, limit: this.pageSize}}); + break; + case "last": + var total = ds.getTotalCount(); + var extra = total % this.pageSize; + var lastStart = extra ? (total - extra) : total-this.pageSize; + ds.load({params:{start: lastStart, limit: this.pageSize}}); + break; + case "refresh": + ds.load({params:{start: this.cursor, limit: this.pageSize}}); + break; + } + }, + + + unbind : function(ds){ + ds.un("beforeload", this.beforeLoad, this); + ds.un("load", this.onLoad, this); + ds.un("loadexception", this.onLoadError, this); + this.ds = undefined; + }, + + + bind : function(ds){ + ds.on("beforeload", this.beforeLoad, this); + ds.on("load", this.onLoad, this); + ds.on("loadexception", this.onLoadError, this); + this.ds = ds; + } +}); + Ext.Resizable = function(el, config){ this.el = Ext.get(el); if(config && config.wrap){ config.resizeChild = this.el; this.el = this.el.wrap(typeof config.wrap == "object" ? config.wrap : {cls:"xresizable-wrap"}); this.el.id = this.el.dom.id = config.resizeChild.id + "-rzwrap"; this.el.setStyle("overflow", "hidden"); this.el.setPositioning(config.resizeChild.getPositioning()); config.resizeChild.clearPositioning(); if(!config.width || !config.height){ var csize = config.resizeChild.getSize(); this.el.setSize(csize.width, csize.height); } if(config.pinned && !config.adjustments){ config.adjustments = "auto"; } } this.proxy = this.el.createProxy({tag: "div", cls: "x-resizable-proxy", id: this.el.id + "-rzproxy"}); this.proxy.unselectable(); this.proxy.enableDisplayMode('block'); Ext.apply(this, config); if(this.pinned){ this.disableTrackOver = true; this.el.addClass("x-resizable-pinned"); } var position = this.el.getStyle("position"); if(position != "absolute" && position != "fixed"){ this.el.setStyle("position", "relative"); } if(!this.handles){ this.handles = 's,e,se'; if(this.multiDirectional){ this.handles += ',n,w'; } } if(this.handles == "all"){ this.handles = "n s e w ne nw se sw"; } var hs = this.handles.split(/\s*?[,;]\s*?| /); var ps = Ext.Resizable.positions; for(var i = 0, len = hs.length; i < len; i++){ if(hs[i] && ps[hs[i]]){ var pos = ps[hs[i]]; this[pos] = new Ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent); } } this.corner = this.southeast; if(this.handles.indexOf("n") != -1 || this.handles.indexOf("w") != -1){ this.updateBox = true; } this.activeHandle = null; if(this.resizeChild){ if(typeof this.resizeChild == "boolean"){ this.resizeChild = Ext.get(this.el.dom.firstChild, true); }else{ this.resizeChild = Ext.get(this.resizeChild, true); } } if(this.adjustments == "auto"){ var rc = this.resizeChild; var hw = this.west, he = this.east, hn = this.north, hs = this.south; if(rc && (hw || hn)){ rc.position("relative"); rc.setLeft(hw ? hw.el.getWidth() : 0); rc.setTop(hn ? hn.el.getHeight() : 0); } this.adjustments = [ (he ? -he.el.getWidth() : 0) + (hw ? -hw.el.getWidth() : 0), (hn ? -hn.el.getHeight() : 0) + (hs ? -hs.el.getHeight() : 0) -1 ]; } if(this.draggable){ this.dd = this.dynamic ? this.el.initDD(null) : this.el.initDDProxy(null, {dragElId: this.proxy.id}); this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id : this.el.id); } this.addEvents({ "beforeresize" : true, "resize" : true }); 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); }; Ext.extend(Ext.Resizable, Ext.util.Observable, { resizeChild : false, adjustments : [0, 0], minWidth : 5, minHeight : 5, maxWidth : 10000, maxHeight : 10000, enabled : true, animate : false, duration : .35, dynamic : false, handles : false, multiDirectional : false, disableTrackOver : false, easing : 'easeOutStrong', widthIncrement : 0, heightIncrement : 0, pinned : false, width : null, height : null, preserveRatio : false, transparent: false, minX: 0, minY: 0, draggable: false, constrainTo: undefined, resizeRegion: undefined, resizeTo : function(width, height){ this.el.setSize(width, height); this.updateChildSize(); this.fireEvent("resize", this, width, height, null); }, startSizing : function(e, handle){ this.fireEvent("beforeresize", this, e); if(this.enabled){ if(!this.overlay){ this.overlay = this.el.createProxy({tag: "div", cls: "x-resizable-overlay", html: " "}); this.overlay.unselectable(); this.overlay.enableDisplayMode("block"); this.overlay.on("mousemove", this.onMouseMove, this); this.overlay.on("mouseup", this.onMouseUp, this); } this.overlay.setStyle("cursor", handle.el.getStyle("cursor")); this.resizing = true; this.startBox = this.el.getBox(); this.startPoint = e.getXY(); this.offsets = [(this.startBox.x + this.startBox.width) - this.startPoint[0], (this.startBox.y + this.startBox.height) - this.startPoint[1]]; this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); this.overlay.show(); if(this.constrainTo) { var ct = Ext.get(this.constrainTo); this.resizeRegion = ct.getRegion().adjust( ct.getFrameWidth('t'), ct.getFrameWidth('l'), -ct.getFrameWidth('b'), -ct.getFrameWidth('r') ); } this.proxy.setStyle('visibility', 'hidden'); this.proxy.show(); this.proxy.setBox(this.startBox); if(!this.dynamic){ this.proxy.setStyle('visibility', 'visible'); } } }, onMouseDown : function(handle, e){ if(this.enabled){ e.stopEvent(); this.activeHandle = handle; this.startSizing(e, handle); } }, onMouseUp : function(e){ var size = this.resizeElement(); this.resizing = false; this.handleOut(); this.overlay.hide(); this.proxy.hide(); this.fireEvent("resize", this, size.width, size.height, e); }, updateChildSize : function(){ if(this.resizeChild){ var el = this.el; var child = this.resizeChild; var adj = this.adjustments; if(el.dom.offsetWidth){ var b = el.getSize(true); child.setSize(b.width+adj[0], b.height+adj[1]); } if(Ext.isIE){ setTimeout(function(){ if(el.dom.offsetWidth){ var b = el.getSize(true); child.setSize(b.width+adj[0], b.height+adj[1]); } }, 10); } } }, snap : function(value, inc, min){ if(!inc || !value) return value; var newValue = value; var m = value % inc; if(m > 0){ if(m > (inc/2)){ newValue = value + (inc-m); }else{ newValue = value - m; } } return Math.max(min, newValue); }, resizeElement : function(){ var box = this.proxy.getBox(); if(this.updateBox){ this.el.setBox(box, false, this.animate, this.duration, null, this.easing); }else{ this.el.setSize(box.width, box.height, this.animate, this.duration, null, this.easing); } this.updateChildSize(); if(!this.dynamic){ this.proxy.hide(); } return box; }, constrain : function(v, diff, m, mx){ if(v - diff < m){ diff = v - m; }else if(v - diff > mx){ diff = mx - v; } return diff; }, onMouseMove : function(e){ if(this.enabled){ try{ if(this.resizeRegion && !this.resizeRegion.contains(e.getPoint())) { return; } var curSize = this.curSize || this.startBox; var x = this.startBox.x, y = this.startBox.y; var ox = x, oy = y; var w = curSize.width, h = curSize.height; var ow = w, oh = h; var mw = this.minWidth, mh = this.minHeight; var mxw = this.maxWidth, mxh = this.maxHeight; var wi = this.widthIncrement; var hi = this.heightIncrement; var eventXY = e.getXY(); var diffX = -(this.startPoint[0] - Math.max(this.minX, eventXY[0])); var diffY = -(this.startPoint[1] - Math.max(this.minY, eventXY[1])); var pos = this.activeHandle.position; switch(pos){ case "east": w += diffX; w = Math.min(Math.max(mw, w), mxw); break; case "south": h += diffY; h = Math.min(Math.max(mh, h), mxh); break; case "southeast": w += diffX; h += diffY; w = Math.min(Math.max(mw, w), mxw); h = Math.min(Math.max(mh, h), mxh); break; case "north": diffY = this.constrain(h, diffY, mh, mxh); y += diffY; h -= diffY; break; case "west": diffX = this.constrain(w, diffX, mw, mxw); x += diffX; w -= diffX; break; case "northeast": w += diffX; w = Math.min(Math.max(mw, w), mxw); diffY = this.constrain(h, diffY, mh, mxh); y += diffY; h -= diffY; break; case "northwest": diffX = this.constrain(w, diffX, mw, mxw); diffY = this.constrain(h, diffY, mh, mxh); y += diffY; h -= diffY; x += diffX; w -= diffX; break; case "southwest": diffX = this.constrain(w, diffX, mw, mxw); h += diffY; h = Math.min(Math.max(mh, h), mxh); x += diffX; w -= diffX; break; } var sw = this.snap(w, wi, mw); var sh = this.snap(h, hi, mh); if(sw != w || sh != h){ switch(pos){ case "northeast": y -= sh - h; break; case "north": y -= sh - h; break; case "southwest": x -= sw - w; break; case "west": x -= sw - w; break; case "northwest": x -= sw - w; y -= sh - h; break; } w = sw; h = sh; } if(this.preserveRatio){ switch(pos){ case "southeast": case "east": h = oh * (w/ow); h = Math.min(Math.max(mh, h), mxh); w = ow * (h/oh); break; case "south": w = ow * (h/oh); w = Math.min(Math.max(mw, w), mxw); h = oh * (w/ow); break; case "northeast": w = ow * (h/oh); w = Math.min(Math.max(mw, w), mxw); h = oh * (w/ow); break; case "north": var tw = w; w = ow * (h/oh); w = Math.min(Math.max(mw, w), mxw); h = oh * (w/ow); x += (tw - w) / 2; break; case "southwest": h = oh * (w/ow); h = Math.min(Math.max(mh, h), mxh); var tw = w; w = ow * (h/oh); x += tw - w; break; case "west": var th = h; h = oh * (w/ow); h = Math.min(Math.max(mh, h), mxh); y += (th - h) / 2; var tw = w; w = ow * (h/oh); x += tw - w; break; case "northwest": var tw = w; var th = h; h = oh * (w/ow); h = Math.min(Math.max(mh, h), mxh); w = ow * (h/oh); y += th - h; x += tw - w; break; } } this.proxy.setBounds(x, y, w, h); if(this.dynamic){ this.resizeElement(); } }catch(e){} } }, handleOver : function(){ if(this.enabled){ this.el.addClass("x-resizable-over"); } }, handleOut : function(){ if(!this.resizing){ this.el.removeClass("x-resizable-over"); } }, getEl : function(){ return this.el; }, getResizeChild : function(){ return this.resizeChild; }, destroy : function(removeEl){ this.proxy.remove(); if(this.overlay){ this.overlay.removeAllListeners(); this.overlay.remove(); } var ps = Ext.Resizable.positions; for(var k in ps){ if(typeof ps[k] != "function" && this[ps[k]]){ var h = this[ps[k]]; h.el.removeAllListeners(); h.el.remove(); } } if(removeEl){ this.el.update(""); this.el.remove(); } } }); Ext.Resizable.positions = { n: "north", s: "south", e: "east", w: "west", se: "southeast", sw: "southwest", nw: "northwest", ne: "northeast" }; Ext.Resizable.Handle = function(rz, pos, disableTrackOver, transparent){ if(!this.tpl){ var tpl = Ext.DomHelper.createTemplate( {tag: "div", cls: "x-resizable-handle x-resizable-handle-{0}"} ); tpl.compile(); Ext.Resizable.Handle.prototype.tpl = tpl; } this.position = pos; this.rz = rz; this.el = this.tpl.append(rz.el.dom, [this.position], true); this.el.unselectable(); if(transparent){ this.el.setOpacity(0); } this.el.on("mousedown", this.onMouseDown, this); if(!disableTrackOver){ this.el.on("mouseover", this.onMouseOver, this); this.el.on("mouseout", this.onMouseOut, this); } }; Ext.Resizable.Handle.prototype = { afterResize : function(rz){ }, onMouseDown : function(e){ this.rz.onMouseDown(this, e); }, onMouseOver : function(e){ this.rz.handleOver(this, e); }, onMouseOut : function(e){ this.rz.handleOut(this, e); } }; + +Ext.Editor = function(field, config){ + Ext.Editor.superclass.constructor.call(this, config); + this.field = field; + this.addEvents({ + + "beforestartedit" : true, + + "startedit" : true, + + "beforecomplete" : true, + + "complete" : true, + + "specialkey" : true + }); +}; + +Ext.extend(Ext.Editor, Ext.Component, { + + + + + + value : "", + + alignment: "c-c?", + + shadow : "frame", + + constrain : false, + + completeOnEnter : false, + + cancelOnEsc : false, + + updateEl : false, + + onRender : function(ct, position){ + this.el = new Ext.Layer({ + shadow: this.shadow, + cls: "x-editor", + parentEl : ct, + shim : this.shim, + shadowOffset:4, + id: this.id, + constrain: this.constrain + }); + this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden"); + if(this.field.msgTarget != 'title'){ + this.field.msgTarget = 'qtip'; + } + this.field.render(this.el); + if(Ext.isGecko){ + this.field.el.dom.setAttribute('autocomplete', 'off'); + } + this.field.on("specialkey", this.onSpecialKey, this); + if(this.swallowKeys){ + this.field.el.swallowEvent(['keydown','keypress']); + } + this.field.show(); + this.field.on("blur", this.onBlur, this); + if(this.field.grow){ + this.field.on("autosize", this.el.sync, this.el, {delay:1}); + } + }, + + onSpecialKey : function(field, e){ + if(this.completeOnEnter && e.getKey() == e.ENTER){ + e.stopEvent(); + this.completeEdit(); + }else if(this.cancelOnEsc && e.getKey() == e.ESC){ + this.cancelEdit(); + }else{ + this.fireEvent('specialkey', field, e); + } + }, + + + startEdit : function(el, value){ + if(this.editing){ + this.completeEdit(); + } + this.boundEl = Ext.get(el); + var v = value !== undefined ? value : this.boundEl.dom.innerHTML; + if(!this.rendered){ + this.render(this.parentEl || document.body); + } + if(this.fireEvent("beforestartedit", this, this.boundEl, v) === false){ + return; + } + this.startValue = v; + this.field.setValue(v); + if(this.autoSize){ + var sz = this.boundEl.getSize(); + switch(this.autoSize){ + case "width": + this.setSize(sz.width, ""); + break; + case "height": + this.setSize("", sz.height); + break; + default: + this.setSize(sz.width, sz.height); + } + } + this.el.alignTo(this.boundEl, this.alignment); + this.editing = true; + if(Ext.QuickTips){ + Ext.QuickTips.disable(); + } + this.show(); + }, + + + setSize : function(w, h){ + this.field.setSize(w, h); + if(this.el){ + this.el.sync(); + } + }, + + + realign : function(){ + this.el.alignTo(this.boundEl, this.alignment); + }, + + + completeEdit : function(remainVisible){ + if(!this.editing){ + return; + } + var v = this.getValue(); + if(this.revertInvalid !== false && !this.field.isValid()){ + v = this.startValue; + this.cancelEdit(true); + } + if(String(v) === String(this.startValue) && this.ignoreNoChange){ + this.editing = false; + this.hide(); + return; + } + if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){ + this.editing = false; + if(this.updateEl && this.boundEl){ + this.boundEl.update(v); + } + if(remainVisible !== true){ + this.hide(); + } + this.fireEvent("complete", this, v, this.startValue); + } + }, + + onShow : function(){ + this.el.show(); + if(this.hideEl !== false){ + this.boundEl.hide(); + } + this.field.show(); + if(Ext.isIE && !this.fixIEFocus){ this.fixIEFocus = true; + this.deferredFocus.defer(50, this); + }else{ + this.field.focus(); + } + this.fireEvent("startedit", this.boundEl, this.startValue); + }, + + deferredFocus : function(){ + if(this.editing){ + this.field.focus(); + } + }, + + + cancelEdit : function(remainVisible){ + if(this.editing){ + this.setValue(this.startValue); + if(remainVisible !== true){ + this.hide(); + } + } + }, + + onBlur : function(){ + if(this.allowBlur !== true && this.editing){ + 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(); + } + if(Ext.QuickTips){ + Ext.QuickTips.enable(); + } + }, + + + setValue : function(v){ + this.field.setValue(v); + }, + + + getValue : function(){ + return this.field.getValue(); + } +}); + +Ext.BasicDialog = function(el, config){ + this.el = Ext.get(el); + var dh = Ext.DomHelper; + if(!this.el && config && config.autoCreate){ + if(typeof config.autoCreate == "object"){ + if(!config.autoCreate.id){ + config.autoCreate.id = el; + } + this.el = dh.append(document.body, + config.autoCreate, true); + }else{ + this.el = dh.append(document.body, + {tag: "div", id: el, style:'visibility:hidden;'}, true); + } + } + el = this.el; + el.setDisplayed(true); + el.hide = this.hideAction; + this.id = el.id; + el.addClass("x-dlg"); + + Ext.apply(this, config); + + this.proxy = el.createProxy("x-dlg-proxy"); + this.proxy.hide = this.hideAction; + this.proxy.setOpacity(.5); + this.proxy.hide(); + + if(config.width){ + el.setWidth(config.width); + } + if(config.height){ + el.setHeight(config.height); + } + this.size = el.getSize(); + if(typeof config.x != "undefined" && typeof config.y != "undefined"){ + this.xy = [config.x,config.y]; + }else{ + this.xy = el.getCenterXY(true); + } + + this.header = el.child("> .x-dlg-hd"); + + this.body = el.child("> .x-dlg-bd"); + + this.footer = el.child("> .x-dlg-ft"); + + if(!this.header){ + this.header = el.createChild({tag: "div", cls:"x-dlg-hd", html: " "}, this.body ? this.body.dom : null); + } + if(!this.body){ + this.body = el.createChild({tag: "div", cls:"x-dlg-bd"}); + } + + this.header.unselectable(); + if(this.title){ + this.header.update(this.title); + } + + this.focusEl = el.createChild({tag: "a", href:"#", cls:"x-dlg-focus", tabIndex:"-1"}); + this.focusEl.swallowEvent("click", true); + + this.header.wrap({cls:"x-dlg-hd-right"}).wrap({cls:"x-dlg-hd-left"}, true); + + + this.bwrap = this.body.wrap({tag: "div", cls:"x-dlg-dlg-body"}); + if(this.footer){ + this.bwrap.dom.appendChild(this.footer.dom); + } + + this.bg = this.el.createChild({ + tag: "div", cls:"x-dlg-bg", + html: '
 
' + }); + this.centerBg = this.bg.child("div.x-dlg-bg-center"); + + + if(this.autoScroll !== false && !this.autoTabs){ + this.body.setStyle("overflow", "auto"); + } + + this.toolbox = this.el.createChild({cls: "x-dlg-toolbox"}); + + if(this.closable !== false){ + this.el.addClass("x-dlg-closable"); + this.close = this.toolbox.createChild({cls:"x-dlg-close"}); + this.close.on("click", this.closeClick, this); + this.close.addClassOnOver("x-dlg-close-over"); + } + if(this.collapsible !== false){ + this.collapseBtn = this.toolbox.createChild({cls:"x-dlg-collapse"}); + this.collapseBtn.on("click", this.collapseClick, this); + this.collapseBtn.addClassOnOver("x-dlg-collapse-over"); + this.header.on("dblclick", this.collapseClick, this); + } + if(this.resizable !== false){ + this.el.addClass("x-dlg-resizable"); + this.resizer = new Ext.Resizable(el, { + minWidth: this.minWidth || 80, + minHeight:this.minHeight || 80, + handles: this.resizeHandles || "all", + pinned: true + }); + this.resizer.on("beforeresize", this.beforeResize, this); + this.resizer.on("resize", this.onResize, this); + } + if(this.draggable !== false){ + el.addClass("x-dlg-draggable"); + if (!this.proxyDrag) { + var dd = new Ext.dd.DD(el.dom.id, "WindowDrag"); + } + else { + var dd = new Ext.dd.DDProxy(el.dom.id, "WindowDrag", {dragElId: this.proxy.id}); + } + dd.setHandleElId(this.header.id); + dd.endDrag = this.endMove.createDelegate(this); + dd.startDrag = this.startMove.createDelegate(this); + dd.onDrag = this.onDrag.createDelegate(this); + dd.scroll = false; + this.dd = dd; + } + if(this.modal){ + this.mask = dh.append(document.body, {tag: "div", cls:"x-dlg-mask"}, true); + this.mask.enableDisplayMode("block"); + this.mask.hide(); + this.el.addClass("x-dlg-modal"); + } + if(this.shadow){ + this.shadow = new Ext.Shadow({ + mode : typeof this.shadow == "string" ? this.shadow : "sides", + offset : this.shadowOffset + }); + }else{ + this.shadowOffset = 0; + } + if(Ext.useShims && this.shim !== false){ + this.shim = this.el.createShim(); + this.shim.hide = this.hideAction; + this.shim.hide(); + }else{ + this.shim = false; + } + if(this.autoTabs){ + this.initTabs(); + } + this.addEvents({ + + "keydown" : true, + + "move" : true, + + "resize" : true, + + "beforehide" : true, + + "hide" : true, + + "beforeshow" : true, + + "show" : true + }); + el.on("keydown", this.onKeyDown, this); + el.on("mousedown", this.toFront, this); + Ext.EventManager.onWindowResize(this.adjustViewport, this, true); + this.el.hide(); + Ext.DialogManager.register(this); + Ext.BasicDialog.superclass.constructor.call(this); +}; + +Ext.extend(Ext.BasicDialog, Ext.util.Observable, { + shadowOffset: Ext.isIE ? 6 : 5, + minHeight: 80, + minWidth: 200, + minButtonWidth: 75, + defaultButton: null, + buttonAlign: "right", + tabTag: 'div', + firstShow: true, + + + setTitle : function(text){ + this.header.update(text); + return this; + }, + + + closeClick : function(){ + this.hide(); + }, + + + collapseClick : function(){ + this[this.collapsed ? "expand" : "collapse"](); + }, + + + collapse : function(){ + if(!this.collapsed){ + this.collapsed = true; + this.el.addClass("x-dlg-collapsed"); + this.restoreHeight = this.el.getHeight(); + this.resizeTo(this.el.getWidth(), this.header.getHeight()); + } + }, + + + expand : function(){ + if(this.collapsed){ + this.collapsed = false; + this.el.removeClass("x-dlg-collapsed"); + this.resizeTo(this.el.getWidth(), this.restoreHeight); + } + }, + + + initTabs : function(){ + var tabs = this.getTabs(); + while(tabs.getTab(0)){ + tabs.removeTab(0); + } + this.el.select(this.tabTag+'.x-dlg-tab').each(function(el){ + var dom = el.dom; + tabs.addTab(Ext.id(dom), dom.title); + dom.title = ""; + }); + tabs.activate(0); + return tabs; + }, + + + beforeResize : function(){ + this.resizer.minHeight = Math.max(this.minHeight, this.getHeaderFooterHeight(true)+40); + }, + + + onResize : function(){ + this.refreshSize(); + this.syncBodyHeight(); + this.adjustAssets(); + this.focus(); + this.fireEvent("resize", this, this.size.width, this.size.height); + }, + + + onKeyDown : function(e){ + if(this.isVisible()){ + this.fireEvent("keydown", this, e); + } + }, + + + resizeTo : function(width, height){ + this.el.setSize(width, height); + this.size = {width: width, height: height}; + this.syncBodyHeight(); + if(this.fixedcenter){ + this.center(); + } + if(this.isVisible()){ + this.constrainXY(); + this.adjustAssets(); + } + this.fireEvent("resize", this, width, height); + return this; + }, + + + + setContentSize : function(w, h){ + h += this.getHeaderFooterHeight() + this.body.getMargins("tb"); + w += this.body.getMargins("lr") + this.bwrap.getMargins("lr") + this.centerBg.getPadding("lr"); + + h += this.body.getPadding("tb") + this.bwrap.getBorderWidth("tb") + this.body.getBorderWidth("tb") + this.el.getBorderWidth("tb"); + w += this.body.getPadding("lr") + this.bwrap.getBorderWidth("lr") + this.body.getBorderWidth("lr") + this.bwrap.getPadding("lr") + this.el.getBorderWidth("lr"); + + if(this.tabs){ + h += this.tabs.stripWrap.getHeight() + this.tabs.bodyEl.getMargins("tb") + this.tabs.bodyEl.getPadding("tb"); + w += this.tabs.bodyEl.getMargins("lr") + this.tabs.bodyEl.getPadding("lr"); + } + this.resizeTo(w, h); + return this; + }, + + + addKeyListener : function(key, fn, scope){ + var keyCode, shift, ctrl, alt; + if(typeof key == "object" && !(key instanceof Array)){ + keyCode = key["key"]; + shift = key["shift"]; + ctrl = key["ctrl"]; + alt = key["alt"]; + }else{ + keyCode = key; + } + var handler = function(dlg, e){ + if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) && (!alt || e.altKey)){ + var k = e.getKey(); + if(keyCode instanceof Array){ + for(var i = 0, len = keyCode.length; i < len; i++){ + if(keyCode[i] == k){ + fn.call(scope || window, dlg, k, e); + return; + } + } + }else{ + if(k == keyCode){ + fn.call(scope || window, dlg, k, e); + } + } + } + }; + this.on("keydown", handler); + return this; + }, + + + getTabs : function(){ + if(!this.tabs){ + this.el.addClass("x-dlg-auto-tabs"); + this.body.addClass(this.tabPosition == "bottom" ? "x-tabs-bottom" : "x-tabs-top"); + this.tabs = new Ext.TabPanel(this.body.dom, this.tabPosition == "bottom"); + } + return this.tabs; + }, + + + addButton : function(config, handler, scope){ + var dh = Ext.DomHelper; + if(!this.footer){ + this.footer = dh.append(this.bwrap, {tag: "div", cls:"x-dlg-ft"}, true); + } + if(!this.btnContainer){ + var tb = this.footer.createChild({ + + cls:"x-dlg-btns x-dlg-btns-"+this.buttonAlign, + html:'
' + }, null, true); + this.btnContainer = tb.firstChild.firstChild.firstChild; + } + var bconfig = { + handler: handler, + scope: scope, + minWidth: this.minButtonWidth, + hideParent:true + }; + if(typeof config == "string"){ + bconfig.text = config; + }else{ + if(config.tag){ + bconfig.dhconfig = config; + }else{ + Ext.apply(bconfig, config); + } + } + var btn = new Ext.Button( + this.btnContainer.appendChild(document.createElement("td")), + bconfig + ); + this.syncBodyHeight(); + if(!this.buttons){ + + this.buttons = []; + } + this.buttons.push(btn); + return btn; + }, + + + setDefaultButton : function(btn){ + this.defaultButton = btn; + return this; + }, + + + getHeaderFooterHeight : function(safe){ + var height = 0; + if(this.header){ + height += this.header.getHeight(); + } + if(this.footer){ + var fm = this.footer.getMargins(); + height += (this.footer.getHeight()+fm.top+fm.bottom); + } + height += this.bwrap.getPadding("tb")+this.bwrap.getBorderWidth("tb"); + height += this.centerBg.getPadding("tb"); + return height; + }, + + + syncBodyHeight : function(){ + var bd = this.body, cb = this.centerBg, bw = this.bwrap; + var height = this.size.height - this.getHeaderFooterHeight(false); + bd.setHeight(height-bd.getMargins("tb")); + var hh = this.header.getHeight(); + var h = this.size.height-hh; + cb.setHeight(h); + bw.setLeftTop(cb.getPadding("l"), hh+cb.getPadding("t")); + bw.setHeight(h-cb.getPadding("tb")); + bw.setWidth(this.el.getWidth(true)-cb.getPadding("lr")); + bd.setWidth(bw.getWidth(true)); + if(this.tabs){ + this.tabs.syncHeight(); + if(Ext.isIE){ + this.tabs.el.repaint(); + } + } + }, + + + restoreState : function(){ + var box = Ext.state.Manager.get(this.stateId || (this.el.id + "-state")); + if(box && box.width){ + this.xy = [box.x, box.y]; + this.resizeTo(box.width, box.height); + } + return this; + }, + + + beforeShow : function(){ + this.expand(); + if(this.fixedcenter){ + this.xy = this.el.getCenterXY(true); + } + if(this.modal){ + Ext.get(document.body).addClass("x-body-masked"); + this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); + this.mask.show(); + } + this.constrainXY(); + }, + + + animShow : function(){ + var b = Ext.get(this.animateTarget, true).getBox(); + this.proxy.setSize(b.width, b.height); + this.proxy.setLocation(b.x, b.y); + this.proxy.show(); + this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height, + true, .35, this.showEl.createDelegate(this)); + }, + + + show : function(animateTarget){ + if (this.fireEvent("beforeshow", this) === false){ + return; + } + if(this.syncHeightBeforeShow){ + this.syncBodyHeight(); + }else if(this.firstShow){ + this.firstShow = false; + this.syncBodyHeight(); + } + this.animateTarget = animateTarget || this.animateTarget; + if(!this.el.isVisible()){ + this.beforeShow(); + if(this.animateTarget){ + this.animShow(); + }else{ + this.showEl(); + } + } + return this; + }, + + + showEl : function(){ + this.proxy.hide(); + this.el.setXY(this.xy); + this.el.show(); + this.adjustAssets(true); + this.toFront(); + this.focus(); + + if(Ext.isIE){ + this.el.repaint(); + } + this.fireEvent("show", this); + }, + + + focus : function(){ + if(this.defaultButton){ + this.defaultButton.focus(); + }else{ + this.focusEl.focus(); + } + }, + + + constrainXY : function(){ + if(this.constraintoviewport !== false){ + if(!this.viewSize){ + if(this.container){ + var s = this.container.getSize(); + this.viewSize = [s.width, s.height]; + }else{ + this.viewSize = [Ext.lib.Dom.getViewWidth(),Ext.lib.Dom.getViewHeight()]; + } + } + var s = Ext.get(this.container||document).getScroll(); + + var x = this.xy[0], y = this.xy[1]; + var w = this.size.width, h = this.size.height; + var vw = this.viewSize[0], vh = this.viewSize[1]; + + var moved = false; + + if(x + w > vw+s.left){ + x = vw - w; + moved = true; + } + if(y + h > vh+s.top){ + y = vh - h; + moved = true; + } + + if(x < s.left){ + x = s.left; + moved = true; + } + if(y < s.top){ + y = s.top; + moved = true; + } + if(moved){ + + this.xy = [x, y]; + if(this.isVisible()){ + this.el.setLocation(x, y); + this.adjustAssets(); + } + } + } + }, + + + onDrag : function(){ + if(!this.proxyDrag){ + this.xy = this.el.getXY(); + this.adjustAssets(); + } + }, + + + adjustAssets : function(doShow){ + var x = this.xy[0], y = this.xy[1]; + var w = this.size.width, h = this.size.height; + if(doShow === true){ + if(this.shadow){ + this.shadow.show(this.el); + } + if(this.shim){ + this.shim.show(); + } + } + if(this.shadow && this.shadow.isVisible()){ + this.shadow.show(this.el); + } + if(this.shim && this.shim.isVisible()){ + this.shim.setBounds(x, y, w, h); + } + }, + + + adjustViewport : function(w, h){ + if(!w || !h){ + w = Ext.lib.Dom.getViewWidth(); + h = Ext.lib.Dom.getViewHeight(); + } + + this.viewSize = [w, h]; + if(this.modal && this.mask.isVisible()){ + this.mask.setSize(w, h); + this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); + } + if(this.isVisible()){ + this.constrainXY(); + } + }, + + + destroy : function(removeEl){ + if(this.isVisible()){ + this.animateTarget = null; + this.hide(); + } + Ext.EventManager.removeResizeListener(this.adjustViewport, this); + if(this.tabs){ + this.tabs.destroy(removeEl); + } + Ext.destroy( + this.shim, + this.proxy, + this.resizer, + this.close, + this.mask + ); + if(this.dd){ + this.dd.unreg(); + } + if(this.buttons){ + for(var i = 0, len = this.buttons.length; i < len; i++){ + this.buttons[i].destroy(); + } + } + this.el.removeAllListeners(); + if(removeEl === true){ + this.el.update(""); + this.el.remove(); + } + Ext.DialogManager.unregister(this); + }, + + + startMove : function(){ + if(this.proxyDrag){ + this.proxy.show(); + } + if(this.constraintoviewport !== false){ + this.dd.constrainTo(document.body, {right: this.shadowOffset, bottom: this.shadowOffset}); + } + }, + + + endMove : function(){ + if(!this.proxyDrag){ + Ext.dd.DD.prototype.endDrag.apply(this.dd, arguments); + }else{ + Ext.dd.DDProxy.prototype.endDrag.apply(this.dd, arguments); + this.proxy.hide(); + } + this.refreshSize(); + this.adjustAssets(); + this.focus(); + this.fireEvent("move", this, this.xy[0], this.xy[1]); + }, + + + toFront : function(){ + Ext.DialogManager.bringToFront(this); + return this; + }, + + + toBack : function(){ + Ext.DialogManager.sendToBack(this); + return this; + }, + + + center : function(){ + var xy = this.el.getCenterXY(true); + this.moveTo(xy[0], xy[1]); + return this; + }, + + + moveTo : function(x, y){ + this.xy = [x,y]; + if(this.isVisible()){ + this.el.setXY(this.xy); + this.adjustAssets(); + } + return this; + }, + + + alignTo : function(element, position, offsets){ + this.xy = this.el.getAlignToXY(element, position, offsets); + if(this.isVisible()){ + this.el.setXY(this.xy); + this.adjustAssets(); + } + return this; + }, + + + anchorTo : function(el, alignment, offsets, monitorScroll){ + var action = function(){ + this.alignTo(el, alignment, offsets); + }; + Ext.EventManager.onWindowResize(action, this); + var tm = typeof monitorScroll; + if(tm != 'undefined'){ + Ext.EventManager.on(window, 'scroll', action, this, + {buffer: tm == 'number' ? monitorScroll : 50}); + } + action.call(this); + return this; + }, + + + isVisible : function(){ + return this.el.isVisible(); + }, + + + animHide : function(callback){ + var b = Ext.get(this.animateTarget).getBox(); + this.proxy.show(); + this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height); + this.el.hide(); + this.proxy.setBounds(b.x, b.y, b.width, b.height, true, .35, + this.hideEl.createDelegate(this, [callback])); + }, + + + hide : function(callback){ + if (this.fireEvent("beforehide", this) === false){ + return; + } + if(this.shadow){ + this.shadow.hide(); + } + if(this.shim) { + this.shim.hide(); + } + if(this.animateTarget){ + this.animHide(callback); + }else{ + this.el.hide(); + this.hideEl(callback); + } + return this; + }, + + + hideEl : function(callback){ + this.proxy.hide(); + if(this.modal){ + this.mask.hide(); + Ext.get(document.body).removeClass("x-body-masked"); + } + this.fireEvent("hide", this); + if(typeof callback == "function"){ + callback(); + } + }, + + + hideAction : function(){ + this.setLeft("-10000px"); + this.setTop("-10000px"); + this.setStyle("visibility", "hidden"); + }, + + + refreshSize : function(){ + this.size = this.el.getSize(); + this.xy = this.el.getXY(); + Ext.state.Manager.set(this.stateId || this.el.id + "-state", this.el.getBox()); + }, + + + + setZIndex : function(index){ + if(this.modal){ + this.mask.setStyle("z-index", index); + } + if(this.shim){ + this.shim.setStyle("z-index", ++index); + } + if(this.shadow){ + this.shadow.setZIndex(++index); + } + this.el.setStyle("z-index", ++index); + if(this.proxy){ + this.proxy.setStyle("z-index", ++index); + } + if(this.resizer){ + this.resizer.proxy.setStyle("z-index", ++index); + } + + this.lastZIndex = index; + }, + + + getEl : function(){ + return this.el; + } +}); + + +Ext.DialogManager = function(){ + var list = {}; + var accessList = []; + var front = null; + + + var sortDialogs = function(d1, d2){ + return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1; + }; + + + var orderDialogs = function(){ + accessList.sort(sortDialogs); + var seed = Ext.DialogManager.zseed; + for(var i = 0, len = accessList.length; i < len; i++){ + var dlg = accessList[i]; + if(dlg){ + dlg.setZIndex(seed + (i*10)); + } + } + }; + + return { + + zseed : 9000, + + + register : function(dlg){ + list[dlg.id] = dlg; + accessList.push(dlg); + }, + + + unregister : function(dlg){ + delete list[dlg.id]; + if(!accessList.indexOf){ + for(var i = 0, len = accessList.length; i < len; i++){ + if(accessList[i] == dlg){ + accessList.splice(i, 1); + return; + } + } + }else{ + var i = accessList.indexOf(dlg); + if(i != -1){ + accessList.splice(i, 1); + } + } + }, + + + get : function(id){ + return typeof id == "object" ? id : list[id]; + }, + + + bringToFront : function(dlg){ + dlg = this.get(dlg); + if(dlg != front){ + front = dlg; + dlg._lastAccess = new Date().getTime(); + orderDialogs(); + } + return dlg; + }, + + + sendToBack : function(dlg){ + dlg = this.get(dlg); + dlg._lastAccess = -(new Date().getTime()); + orderDialogs(); + return dlg; + }, + + + hideAll : function(){ + for(var id in list){ + if(list[id] && typeof list[id] != "function" && list[id].isVisible()){ + list[id].hide(); + } + } + } + }; +}(); + + +Ext.LayoutDialog = function(el, config){ + config.autoTabs = false; + Ext.LayoutDialog.superclass.constructor.call(this, el, config); + this.body.setStyle({overflow:"hidden", position:"relative"}); + this.layout = new Ext.BorderLayout(this.body.dom, config); + this.layout.monitorWindowResize = false; + this.el.addClass("x-dlg-auto-layout"); + + this.center = Ext.BasicDialog.prototype.center; + this.on("show", this.layout.layout, this.layout, true); +}; +Ext.extend(Ext.LayoutDialog, Ext.BasicDialog, { + + endUpdate : function(){ + this.layout.endUpdate(); + }, + + + beginUpdate : function(){ + this.layout.beginUpdate(); + }, + + + getLayout : function(){ + return this.layout; + }, + + showEl : function(){ + Ext.LayoutDialog.superclass.showEl.apply(this, arguments); + if(Ext.isIE7){ + this.layout.layout(); + } + }, + + + + syncBodyHeight : function(){ + Ext.LayoutDialog.superclass.syncBodyHeight.call(this); + if(this.layout){this.layout.layout();} + } +}); + +Ext.MessageBox = function(){ + var dlg, opt, mask, waitTimer; + var bodyEl, msgEl, textboxEl, textareaEl, progressEl, pp; + var buttons, activeTextEl, bwidth; + + + var handleButton = function(button){ + dlg.hide(); + Ext.callback(opt.fn, opt.scope||window, [button, activeTextEl.dom.value], 1); + }; + + + var handleHide = function(){ + if(opt && opt.cls){ + dlg.el.removeClass(opt.cls); + } + if(waitTimer){ + Ext.TaskMgr.stop(waitTimer); + waitTimer = null; + } + }; + + + var updateButtons = function(b){ + var width = 0; + if(!b){ + buttons["ok"].hide(); + buttons["cancel"].hide(); + buttons["yes"].hide(); + buttons["no"].hide(); + dlg.footer.dom.style.display = 'none'; + return width; + } + dlg.footer.dom.style.display = ''; + for(var k in buttons){ + if(typeof buttons[k] != "function"){ + if(b[k]){ + buttons[k].show(); + buttons[k].setText(typeof b[k] == "string" ? b[k] : Ext.MessageBox.buttonText[k]); + width += buttons[k].el.getWidth()+15; + }else{ + buttons[k].hide(); + } + } + } + return width; + }; + + + var handleEsc = function(d, k, e){ + if(opt && opt.closable !== false){ + dlg.hide(); + } + if(e){ + e.stopEvent(); + } + }; + + return { + + getDialog : function(){ + if(!dlg){ + dlg = new Ext.BasicDialog("x-msg-box", { + autoCreate : true, + shadow: true, + draggable: true, + resizable:false, + constraintoviewport:false, + fixedcenter:true, + collapsible : false, + shim:true, + modal: true, + width:400, height:100, + buttonAlign:"center", + closeClick : function(){ + if(opt && opt.buttons && opt.buttons.no && !opt.buttons.cancel){ + handleButton("no"); + }else{ + handleButton("cancel"); + } + } + }); + dlg.on("hide", handleHide); + mask = dlg.mask; + dlg.addKeyListener(27, handleEsc); + buttons = {}; + var bt = this.buttonText; + buttons["ok"] = dlg.addButton(bt["ok"], handleButton.createCallback("ok")); + buttons["yes"] = dlg.addButton(bt["yes"], handleButton.createCallback("yes")); + buttons["no"] = dlg.addButton(bt["no"], handleButton.createCallback("no")); + buttons["cancel"] = dlg.addButton(bt["cancel"], handleButton.createCallback("cancel")); + bodyEl = dlg.body.createChild({ + + html:'
 
' + }); + msgEl = bodyEl.dom.firstChild; + textboxEl = Ext.get(bodyEl.dom.childNodes[2]); + textboxEl.enableDisplayMode(); + textboxEl.addKeyListener([10,13], function(){ + if(dlg.isVisible() && opt && opt.buttons){ + if(opt.buttons.ok){ + handleButton("ok"); + }else if(opt.buttons.yes){ + handleButton("yes"); + } + } + }); + textareaEl = Ext.get(bodyEl.dom.childNodes[3]); + textareaEl.enableDisplayMode(); + progressEl = Ext.get(bodyEl.dom.childNodes[4]); + progressEl.enableDisplayMode(); + var pf = progressEl.dom.firstChild; + pp = Ext.get(pf.firstChild); + pp.setHeight(pf.offsetHeight); + } + return dlg; + }, + + + updateText : function(text){ + if(!dlg.isVisible() && !opt.width){ + dlg.resizeTo(this.maxWidth, 100); + } + msgEl.innerHTML = text || ' '; + var w = Math.max(Math.min(opt.width || msgEl.offsetWidth, this.maxWidth), + Math.max(opt.minWidth || this.minWidth, bwidth)); + if(opt.prompt){ + activeTextEl.setWidth(w); + } + if(dlg.isVisible()){ + dlg.fixedcenter = false; + } + dlg.setContentSize(w, bodyEl.getHeight()); + if(dlg.isVisible()){ + dlg.fixedcenter = true; + } + return this; + }, + + + updateProgress : function(value, text){ + if(text){ + this.updateText(text); + } + pp.setWidth(Math.floor(value*progressEl.dom.firstChild.offsetWidth)); + return this; + }, + + + isVisible : function(){ + return dlg && dlg.isVisible(); + }, + + + hide : function(){ + if(this.isVisible()){ + dlg.hide(); + } + }, + + + show : function(options){ + if(this.isVisible()){ + this.hide(); + } + var d = this.getDialog(); + opt = options; + d.setTitle(opt.title || " "); + d.close.setDisplayed(opt.closable !== false); + activeTextEl = textboxEl; + opt.prompt = opt.prompt || (opt.multiline ? true : false); + if(opt.prompt){ + if(opt.multiline){ + textboxEl.hide(); + textareaEl.show(); + textareaEl.setHeight(typeof opt.multiline == "number" ? + opt.multiline : this.defaultTextHeight); + activeTextEl = textareaEl; + }else{ + textboxEl.show(); + textareaEl.hide(); + } + }else{ + textboxEl.hide(); + textareaEl.hide(); + } + progressEl.setDisplayed(opt.progress === true); + this.updateProgress(0); + activeTextEl.dom.value = opt.value || ""; + if(opt.prompt){ + dlg.setDefaultButton(activeTextEl); + }else{ + var bs = opt.buttons; + var db = null; + if(bs && bs.ok){ + db = buttons["ok"]; + }else if(bs && bs.yes){ + db = buttons["yes"]; + } + dlg.setDefaultButton(db); + } + bwidth = updateButtons(opt.buttons); + this.updateText(opt.msg); + if(opt.cls){ + d.el.addClass(opt.cls); + } + d.proxyDrag = opt.proxyDrag === true; + d.modal = opt.modal !== false; + d.mask = opt.modal !== false ? mask : false; + if(!d.isVisible()){ + + document.body.appendChild(dlg.el.dom); + d.animateTarget = null; + d.show(options.animEl); + } + return this; + }, + + + progress : function(title, msg){ + this.show({ + title : title, + msg : msg, + buttons: false, + progress:true, + closable:false, + minWidth: this.minProgressWidth + }); + return this; + }, + + + alert : function(title, msg, fn, scope){ + this.show({ + title : title, + msg : msg, + buttons: this.OK, + fn: fn, + scope : scope + }); + return this; + }, + + + wait : function(msg, title){ + this.show({ + title : title, + msg : msg, + buttons: false, + closable:false, + progress:true, + modal:true, + width:300, + wait:true + }); + waitTimer = Ext.TaskMgr.start({ + run: function(i){ + Ext.MessageBox.updateProgress(((((i+20)%20)+1)*5)*.01); + }, + interval: 1000 + }); + return this; + }, + + + confirm : function(title, msg, fn, scope){ + this.show({ + title : title, + msg : msg, + buttons: this.YESNO, + fn: fn, + scope : scope + }); + return this; + }, + + + prompt : function(title, msg, fn, scope, multiline){ + this.show({ + title : title, + msg : msg, + buttons: this.OKCANCEL, + fn: fn, + minWidth:250, + scope : scope, + prompt:true, + multiline: multiline + }); + return this; + }, + + + OK : {ok:true}, + + YESNO : {yes:true, no:true}, + + OKCANCEL : {ok:true, cancel:true}, + + YESNOCANCEL : {yes:true, no:true, cancel:true}, + + + defaultTextHeight : 75, + + maxWidth : 600, + + minWidth : 100, + + minProgressWidth : 250, + + buttonText : { + ok : "OK", + cancel : "Cancel", + yes : "Yes", + no : "No" + } + }; +}(); + + +Ext.Msg = Ext.MessageBox; + +Ext.QuickTips = function(){ + var el, tipBody, tipBodyText, tipTitle, tm, cfg, close, tagEls = {}, esc, removeCls = null, bdLeft, bdRight; + var ce, bd, xy, dd; + var visible = false, disabled = true, inited = false; + var showProc = 1, hideProc = 1, dismissProc = 1, locks = []; + + var onOver = function(e){ + if(disabled){ + return; + } + var t = e.getTarget(); + if(!t || t.nodeType !== 1 || t == document || t == document.body){ + return; + } + if(ce && t == ce.el){ + clearTimeout(hideProc); + return; + } + if(t && tagEls[t.id]){ + tagEls[t.id].el = t; + showProc = show.defer(tm.showDelay, tm, [tagEls[t.id]]); + return; + } + var ttp, et = Ext.fly(t); + var ns = cfg.namespace; + if(tm.interceptTitles && t.title){ + ttp = t.title; + t.qtip = ttp; + t.removeAttribute("title"); + e.preventDefault(); + }else{ + ttp = t.qtip || et.getAttributeNS(ns, cfg.attribute); + } + if(ttp){ + showProc = show.defer(tm.showDelay, tm, [{ + el: t, + text: ttp, + width: et.getAttributeNS(ns, cfg.width), + autoHide: et.getAttributeNS(ns, cfg.hide) != "user", + title: et.getAttributeNS(ns, cfg.title), + cls: et.getAttributeNS(ns, cfg.cls) + }]); + } + }; + + var onOut = function(e){ + clearTimeout(showProc); + var t = e.getTarget(); + if(t && ce && ce.el == t && (tm.autoHide && ce.autoHide !== false)){ + hideProc = setTimeout(hide, tm.hideDelay); + } + }; + + var onMove = function(e){ + if(disabled){ + return; + } + xy = e.getXY(); + xy[1] += 18; + if(tm.trackMouse && ce){ + el.setXY(xy); + } + }; + + var onDown = function(e){ + clearTimeout(showProc); + clearTimeout(hideProc); + if(!e.within(el)){ + if(tm.hideOnClick){ + hide(); + tm.disable(); + tm.enable.defer(100, tm); + } + } + }; + + var getPad = function(){ + return bdLeft.getPadding('l')+bdRight.getPadding('r'); + }; + + var show = function(o){ + if(disabled){ + return; + } + clearTimeout(dismissProc); + ce = o; + if(removeCls){ + el.removeClass(removeCls); + removeCls = null; + } + if(ce.cls){ + el.addClass(ce.cls); + removeCls = ce.cls; + } + if(ce.title){ + tipTitle.update(ce.title); + tipTitle.show(); + }else{ + tipTitle.update(''); + tipTitle.hide(); + } + el.dom.style.width = tm.maxWidth+'px'; + + tipBodyText.update(o.text); + var p = getPad(), w = ce.width; + if(!w){ + var td = tipBodyText.dom; + var aw = Math.max(td.offsetWidth, td.clientWidth, td.scrollWidth); + if(aw > tm.maxWidth){ + w = tm.maxWidth; + }else if(aw < tm.minWidth){ + w = tm.minWidth; + }else{ + w = aw; + } + } + + el.setWidth(parseInt(w, 10) + p); + if(ce.autoHide === false){ + close.setDisplayed(true); + if(dd){ + dd.unlock(); + } + }else{ + close.setDisplayed(false); + if(dd){ + dd.lock(); + } + } + if(xy){ + el.avoidY = xy[1]-18; + el.setXY(xy); + } + if(tm.animate){ + el.setOpacity(.1); + el.setStyle("visibility", "visible"); + el.fadeIn({callback: afterShow}); + }else{ + afterShow(); + } + }; + + var afterShow = function(){ + if(ce){ + el.show(); + esc.enable(); + if(tm.autoDismiss && ce.autoHide !== false){ + dismissProc = setTimeout(hide, tm.autoDismissDelay); + } + } + }; + + var hide = function(noanim){ + clearTimeout(dismissProc); + clearTimeout(hideProc); + ce = null; + if(el.isVisible()){ + esc.disable(); + if(noanim !== true && tm.animate){ + el.fadeOut({callback: afterHide}); + }else{ + afterHide(); + } + } + }; + + var afterHide = function(){ + el.hide(); + if(removeCls){ + el.removeClass(removeCls); + removeCls = null; + } + }; + + return { + + minWidth : 40, + + maxWidth : 300, + + interceptTitles : false, + + trackMouse : false, + + hideOnClick : true, + + showDelay : 500, + + hideDelay : 200, + + autoHide : true, + + autoDismiss : true, + + autoDismissDelay : 5000, + + animate : false, + + + + + + + + init : function(){ + tm = Ext.QuickTips; + cfg = tm.tagConfig; + if(!inited){ + if(!Ext.isReady){ + Ext.onReady(Ext.QuickTips.init, Ext.QuickTips); + return; + } + el = new Ext.Layer({cls:"x-tip", shadow:"drop", shim: true, constrain:true, shadowOffset:4}); + el.fxDefaults = {stopFx: true}; + + el.update('

'); + tipTitle = el.child('h3'); + tipTitle.enableDisplayMode("block"); + tipBody = el.child('div.x-tip-bd'); + tipBodyText = el.child('div.x-tip-bd-inner'); + bdLeft = el.child('div.x-tip-bd-left'); + bdRight = el.child('div.x-tip-bd-right'); + close = el.child('div.x-tip-close'); + close.enableDisplayMode("block"); + close.on("click", hide); + var d = Ext.get(document); + d.on("mousedown", onDown); + d.on("mouseover", onOver); + d.on("mouseout", onOut); + d.on("mousemove", onMove); + esc = d.addKeyListener(27, hide); + esc.disable(); + if(Ext.dd.DD){ + dd = el.initDD("default", null, { + onDrag : function(){ + el.sync(); + } + }); + dd.setHandleElId(tipTitle.id); + dd.lock(); + } + inited = true; + } + this.enable(); + }, + + + register : function(config){ + var cs = config instanceof Array ? config : arguments; + for(var i = 0, len = cs.length; i < len; i++) { + var c = cs[i]; + var target = c.target; + if(target){ + if(target instanceof Array){ + for(var j = 0, jlen = target.length; j < jlen; j++){ + tagEls[target[j]] = c; + } + }else{ + tagEls[typeof target == 'string' ? target : Ext.id(target)] = c; + } + } + } + }, + + + unregister : function(el){ + delete tagEls[Ext.id(el)]; + }, + + + enable : function(){ + if(inited && disabled){ + locks.pop(); + if(locks.length < 1){ + disabled = false; + } + } + }, + + + disable : function(){ + disabled = true; + clearTimeout(showProc); + clearTimeout(hideProc); + clearTimeout(dismissProc); + if(ce){ + hide(true); + } + locks.push(1); + }, + + + isEnabled : function(){ + return !disabled; + }, + + + tagConfig : { + namespace : "ext", + attribute : "qtip", + width : "width", + target : "target", + title : "qtitle", + hide : "hide", + cls : "qclass" + } + }; +}(); + + +Ext.QuickTips.tips = Ext.QuickTips.register; + +Ext.tree.TreePanel = function(el, config){ + Ext.apply(this, config); + Ext.tree.TreePanel.superclass.constructor.call(this); + this.el = Ext.get(el); + this.el.addClass('x-tree'); + + this.id = this.el.id; + this.addEvents({ + + "beforeload" : true, + + "load" : true, + + "textchange" : true, + + "beforeexpand" : true, + + "beforecollapse" : true, + + "expand" : true, + + "disabledchange" : true, + + "collapse" : true, + + "beforeclick":true, + + "checkchange":true, + + "click":true, + + "dblclick":true, + + "contextmenu":true, + + "beforechildrenrendered":true, + + "startdrag" : true, + + "enddrag" : true, + + "dragdrop" : true, + + "beforenodedrop" : true, + + "nodedrop" : true, + + "nodedragover" : true + }); + if(this.singleExpand){ + this.on("beforeexpand", this.restrictExpand, this); + } +}; +Ext.extend(Ext.tree.TreePanel, Ext.data.Tree, { + rootVisible : true, + animate: Ext.enableFx, + lines : true, + enableDD : false, + hlDrop : Ext.enableFx, + + + restrictExpand : function(node){ + var p = node.parentNode; + if(p){ + if(p.expandedChild && p.expandedChild.parentNode == p){ + p.expandedChild.collapse(); + } + p.expandedChild = node; + } + }, + + + setRootNode : function(node){ + Ext.tree.TreePanel.superclass.setRootNode.call(this, node); + if(!this.rootVisible){ + node.ui = new Ext.tree.RootTreeNodeUI(node); + } + return node; + }, + + + getEl : function(){ + return this.el; + }, + + + 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; + }, + + + getChecked : function(a, startNode){ + startNode = startNode || this.root; + var r = []; + var f = function(){ + if(this.attributes.checked){ + r.push(!a ? this : (a == 'id' ? this.id : this.attributes[a])); + } + } + startNode.cascade(f); + return r; + }, + + + expandPath : function(path, attr, callback){ + attr = attr || "id"; + var keys = path.split(this.pathSeparator); + var curNode = this.root; + if(curNode.attributes[attr] != keys[1]){ + if(callback){ + callback(false, null); + } + return; + } + var index = 1; + var f = function(){ + if(++index == keys.length){ + if(callback){ + callback(true, curNode); + } + return; + } + var c = curNode.findChild(attr, keys[index]); + if(!c){ + if(callback){ + callback(false, curNode); + } + return; + } + curNode = c; + c.expand(false, false, f); + }; + curNode.expand(false, false, f); + }, + + + selectPath : function(path, attr, callback){ + attr = attr || "id"; + var keys = path.split(this.pathSeparator); + var v = keys.pop(); + if(keys.length > 0){ + var f = function(success, node){ + if(success && node){ + var n = node.findChild(attr, v); + if(n){ + n.select(); + if(callback){ + callback(true, n); + } + }else if(callback){ + callback(false, n); + } + }else{ + if(callback){ + callback(false, n); + } + } + }; + this.expandPath(keys.join(this.pathSeparator), attr, f); + }else{ + this.root.select(); + if(callback){ + callback(true, this.root); + } + } + }, + + getTreeEl : function(){ + return this.el; + }, + + + render : function(){ + this.innerCt = this.el.createChild({tag:"ul", + cls:"x-tree-root-ct " + + (this.lines ? "x-tree-lines" : "x-tree-no-lines")}); + + if(this.containerScroll){ + Ext.dd.ScrollManager.register(this.el); + } + 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); + this.root.render(); + if(!this.rootVisible){ + this.root.renderChildren(); + } + return this; + } +}); + +Ext.tree.DefaultSelectionModel = function(){ + this.selNode = null; + + this.addEvents({ + + "selectionchange" : true, + + + "beforeselect" : true + }); +}; + +Ext.extend(Ext.tree.DefaultSelectionModel, Ext.util.Observable, { + init : function(tree){ + this.tree = tree; + tree.getTreeEl().on("keydown", this.onKeyDown, this); + tree.on("click", this.onNodeClick, this); + }, + + onNodeClick : function(node, e){ + this.select(node); + }, + + + select : function(node){ + var last = this.selNode; + if(last != node && this.fireEvent('beforeselect', this, node, last) !== false){ + if(last){ + last.ui.onSelectedChange(false); + } + this.selNode = node; + node.ui.onSelectedChange(true); + this.fireEvent("selectionchange", this, node, last); + } + return node; + }, + + + unselect : function(node){ + if(this.selNode == node){ + this.clearSelections(); + } + }, + + + clearSelections : function(){ + var n = this.selNode; + if(n){ + n.ui.onSelectedChange(false); + this.selNode = null; + this.fireEvent("selectionchange", this, null); + } + return n; + }, + + + getSelectedNode : function(){ + return this.selNode; + }, + + + isSelected : function(node){ + return this.selNode == node; + }, + + + selectPrevious : function(){ + var s = this.selNode || this.lastSelNode; + if(!s){ + return null; + } + var ps = s.previousSibling; + if(ps){ + if(!ps.isExpanded() || ps.childNodes.length < 1){ + return this.select(ps); + } else{ + var lc = ps.lastChild; + while(lc && lc.isExpanded() && lc.childNodes.length > 0){ + lc = lc.lastChild; + } + return this.select(lc); + } + } else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){ + return this.select(s.parentNode); + } + return null; + }, + + + selectNext : function(){ + var s = this.selNode || this.lastSelNode; + if(!s){ + return null; + } + if(s.firstChild && s.isExpanded()){ + return this.select(s.firstChild); + }else if(s.nextSibling){ + return this.select(s.nextSibling); + }else if(s.parentNode){ + var newS = null; + s.parentNode.bubble(function(){ + if(this.nextSibling){ + newS = this.getOwnerTree().selModel.select(this.nextSibling); + return false; + } + }); + return newS; + } + return null; + }, + + onKeyDown : function(e){ + var s = this.selNode || this.lastSelNode; + + var sm = this; + if(!s){ + return; + } + var k = e.getKey(); + switch(k){ + case e.DOWN: + e.stopEvent(); + this.selectNext(); + break; + case e.UP: + e.stopEvent(); + this.selectPrevious(); + break; + case e.RIGHT: + e.preventDefault(); + if(s.hasChildNodes()){ + if(!s.isExpanded()){ + s.expand(); + }else if(s.firstChild){ + this.select(s.firstChild, e); + } + } + break; + case e.LEFT: + e.preventDefault(); + if(s.hasChildNodes() && s.isExpanded()){ + s.collapse(); + }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){ + this.select(s.parentNode, e); + } + break; + }; + } +}); + + +Ext.tree.MultiSelectionModel = function(){ + this.selNodes = []; + this.selMap = {}; + this.addEvents({ + + "selectionchange" : true + }); +}; + +Ext.extend(Ext.tree.MultiSelectionModel, Ext.util.Observable, { + init : function(tree){ + this.tree = tree; + tree.getTreeEl().on("keydown", this.onKeyDown, this); + tree.on("click", this.onNodeClick, this); + }, + + onNodeClick : function(node, e){ + this.select(node, e, e.ctrlKey); + }, + + + select : function(node, e, keepExisting){ + if(keepExisting !== true){ + this.clearSelections(true); + } + if(this.isSelected(node)){ + this.lastSelNode = node; + return node; + } + this.selNodes.push(node); + this.selMap[node.id] = node; + this.lastSelNode = node; + node.ui.onSelectedChange(true); + this.fireEvent("selectionchange", this, this.selNodes); + return node; + }, + + + unselect : function(node){ + if(this.selMap[node.id]){ + node.ui.onSelectedChange(false); + var sn = this.selNodes; + var index = -1; + if(sn.indexOf){ + index = sn.indexOf(node); + }else{ + for(var i = 0, len = sn.length; i < len; i++){ + if(sn[i] == node){ + index = i; + break; + } + } + } + if(index != -1){ + this.selNodes.splice(index, 1); + } + delete this.selMap[node.id]; + this.fireEvent("selectionchange", this, this.selNodes); + } + }, + + + clearSelections : function(suppressEvent){ + var sn = this.selNodes; + if(sn.length > 0){ + for(var i = 0, len = sn.length; i < len; i++){ + sn[i].ui.onSelectedChange(false); + } + this.selNodes = []; + this.selMap = {}; + if(suppressEvent !== true){ + this.fireEvent("selectionchange", this, this.selNodes); + } + } + }, + + + isSelected : function(node){ + return this.selMap[node.id] ? true : false; + }, + + + getSelectedNodes : function(){ + return this.selNodes; + }, + + onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown, + + selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext, + + selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious +}); + +Ext.tree.TreeNode = function(attributes){ + attributes = attributes || {}; + if(typeof attributes == "string"){ + attributes = {text: attributes}; + } + this.childrenRendered = false; + this.rendered = false; + Ext.tree.TreeNode.superclass.constructor.call(this, attributes); + this.expanded = attributes.expanded === true; + this.isTarget = attributes.isTarget !== false; + this.draggable = attributes.draggable !== false && attributes.allowDrag !== false; + this.allowChildren = attributes.allowChildren !== false && attributes.allowDrop !== false; + + + this.text = attributes.text; + + this.disabled = attributes.disabled === true; + + this.addEvents({ + + "textchange" : true, + + "beforeexpand" : true, + + "beforecollapse" : true, + + "expand" : true, + + "disabledchange" : true, + + "collapse" : true, + + "beforeclick":true, + + "checkchange":true, + + "click":true, + + "dblclick":true, + + "contextmenu":true, + + "beforechildrenrendered":true + }); + + var uiClass = this.attributes.uiProvider || Ext.tree.TreeNodeUI; + + + this.ui = new uiClass(this); +}; +Ext.extend(Ext.tree.TreeNode, Ext.data.Node, { + preventHScroll: true, + + isExpanded : function(){ + return this.expanded; + }, + + + getUI : function(){ + return this.ui; + }, + + + setFirstChild : function(node){ + var of = this.firstChild; + Ext.tree.TreeNode.superclass.setFirstChild.call(this, node); + if(this.childrenRendered && of && node != of){ + of.renderIndent(true, true); + } + if(this.rendered){ + this.renderIndent(true, true); + } + }, + + + setLastChild : function(node){ + var ol = this.lastChild; + Ext.tree.TreeNode.superclass.setLastChild.call(this, node); + if(this.childrenRendered && ol && node != ol){ + ol.renderIndent(true, true); + } + if(this.rendered){ + this.renderIndent(true, true); + } + }, + + + + appendChild : function(){ + var node = Ext.tree.TreeNode.superclass.appendChild.apply(this, arguments); + if(node && this.childrenRendered){ + node.render(); + } + this.ui.updateExpandIcon(); + return node; + }, + + + removeChild : function(node){ + this.ownerTree.getSelectionModel().unselect(node); + Ext.tree.TreeNode.superclass.removeChild.apply(this, arguments); + + if(this.childrenRendered){ + node.ui.remove(); + } + if(this.childNodes.length < 1){ + this.collapse(false, false); + }else{ + this.ui.updateExpandIcon(); + } + if(!this.firstChild) { + this.childrenRendered = false; + } + return node; + }, + + + insertBefore : function(node, refNode){ + var newNode = Ext.tree.TreeNode.superclass.insertBefore.apply(this, arguments); + if(newNode && refNode && this.childrenRendered){ + node.render(); + } + this.ui.updateExpandIcon(); + return newNode; + }, + + + setText : function(text){ + var oldText = this.text; + this.text = text; + this.attributes.text = text; + if(this.rendered){ + this.ui.onTextChange(this, text, oldText); + } + this.fireEvent("textchange", this, text, oldText); + }, + + + select : function(){ + this.getOwnerTree().getSelectionModel().select(this); + }, + + + unselect : function(){ + this.getOwnerTree().getSelectionModel().unselect(this); + }, + + + isSelected : function(){ + return this.getOwnerTree().getSelectionModel().isSelected(this); + }, + + + expand : function(deep, anim, callback){ + if(!this.expanded){ + if(this.fireEvent("beforeexpand", this, deep, anim) === false){ + return; + } + if(!this.childrenRendered){ + this.renderChildren(); + } + this.expanded = true; + if(!this.isHiddenRoot() && (this.getOwnerTree().animate && anim !== false) || anim){ + this.ui.animExpand(function(){ + this.fireEvent("expand", this); + if(typeof callback == "function"){ + callback(this); + } + if(deep === true){ + this.expandChildNodes(true); + } + }.createDelegate(this)); + return; + }else{ + this.ui.expand(); + this.fireEvent("expand", this); + if(typeof callback == "function"){ + callback(this); + } + } + }else{ + if(typeof callback == "function"){ + callback(this); + } + } + if(deep === true){ + this.expandChildNodes(true); + } + }, + + isHiddenRoot : function(){ + return this.isRoot && !this.getOwnerTree().rootVisible; + }, + + + collapse : function(deep, anim){ + if(this.expanded && !this.isHiddenRoot()){ + if(this.fireEvent("beforecollapse", this, deep, anim) === false){ + return; + } + this.expanded = false; + if((this.getOwnerTree().animate && anim !== false) || anim){ + this.ui.animCollapse(function(){ + this.fireEvent("collapse", this); + if(deep === true){ + this.collapseChildNodes(true); + } + }.createDelegate(this)); + return; + }else{ + this.ui.collapse(); + this.fireEvent("collapse", this); + } + } + if(deep === true){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].collapse(true, false); + } + } + }, + + + delayedExpand : function(delay){ + if(!this.expandProcId){ + this.expandProcId = this.expand.defer(delay, this); + } + }, + + + cancelExpand : function(){ + if(this.expandProcId){ + clearTimeout(this.expandProcId); + } + this.expandProcId = false; + }, + + + toggle : function(){ + if(this.expanded){ + this.collapse(); + }else{ + this.expand(); + } + }, + + + ensureVisible : function(callback){ + var tree = this.getOwnerTree(); + tree.expandPath(this.parentNode.getPath(), false, function(){ + tree.getTreeEl().scrollChildIntoView(this.ui.anchor); + Ext.callback(callback); + }.createDelegate(this)); + }, + + + expandChildNodes : function(deep){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].expand(deep); + } + }, + + + collapseChildNodes : function(deep){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++) { + cs[i].collapse(deep); + } + }, + + + disable : function(){ + this.disabled = true; + this.unselect(); + if(this.rendered && this.ui.onDisableChange){ + this.ui.onDisableChange(this, true); + } + this.fireEvent("disabledchange", this, true); + }, + + + enable : function(){ + this.disabled = false; + if(this.rendered && this.ui.onDisableChange){ + this.ui.onDisableChange(this, false); + } + this.fireEvent("disabledchange", this, false); + }, + + + renderChildren : function(suppressEvent){ + if(suppressEvent !== false){ + this.fireEvent("beforechildrenrendered", this); + } + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++){ + cs[i].render(true); + } + this.childrenRendered = true; + }, + + + sort : function(fn, scope){ + Ext.tree.TreeNode.superclass.sort.apply(this, arguments); + if(this.childrenRendered){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++){ + cs[i].render(true); + } + } + }, + + + render : function(bulkRender){ + this.ui.render(bulkRender); + if(!this.rendered){ + this.rendered = true; + if(this.expanded){ + this.expanded = false; + this.expand(false, false); + } + } + }, + + + renderIndent : function(deep, refresh){ + if(refresh){ + this.ui.childIndent = null; + } + this.ui.renderIndent(); + if(deep === true && this.childrenRendered){ + var cs = this.childNodes; + for(var i = 0, len = cs.length; i < len; i++){ + cs[i].renderIndent(true, refresh); + } + } + } +}); + + Ext.tree.AsyncTreeNode = function(config){ + this.loaded = false; + this.loading = false; + Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments); + + this.addEvents({'beforeload':true, 'load': true}); + + +}; +Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, { + expand : function(deep, anim, callback){ + if(this.loading){ + var timer; + var f = function(){ + if(!this.loading){ + clearInterval(timer); + this.expand(deep, anim, callback); + } + }.createDelegate(this); + timer = setInterval(f, 200); + return; + } + if(!this.loaded){ + if(this.fireEvent("beforeload", this) === false){ + return; + } + this.loading = true; + this.ui.beforeLoad(this); + var loader = this.loader || this.attributes.loader || this.getOwnerTree().getLoader(); + if(loader){ + loader.load(this, this.loadComplete.createDelegate(this, [deep, anim, callback])); + return; + } + } + Ext.tree.AsyncTreeNode.superclass.expand.call(this, deep, anim, callback); + }, + + + isLoading : function(){ + return this.loading; + }, + + loadComplete : function(deep, anim, callback){ + this.loading = false; + this.loaded = true; + this.ui.afterLoad(this); + this.fireEvent("load", this); + this.expand(deep, anim, callback); + }, + + + isLoaded : function(){ + return this.loaded; + }, + + hasChildNodes : function(){ + if(!this.isLeaf() && !this.loaded){ + return true; + }else{ + return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this); + } + }, + + + reload : function(callback){ + this.collapse(false, false); + while(this.firstChild){ + this.removeChild(this.firstChild); + } + this.childrenRendered = false; + this.loaded = false; + if(this.isHiddenRoot()){ + this.expanded = false; + } + this.expand(false, false, callback); + } +}); + +Ext.tree.TreeNodeUI = function(node){ + this.node = node; + this.rendered = false; + this.animating = false; + this.emptyIcon = Ext.BLANK_IMAGE_URL; +}; + +Ext.tree.TreeNodeUI.prototype = { + removeChild : function(node){ + if(this.rendered){ + this.ctNode.removeChild(node.ui.getEl()); + } + }, + + beforeLoad : function(){ + this.addClass("x-tree-node-loading"); + }, + + afterLoad : function(){ + this.removeClass("x-tree-node-loading"); + }, + + onTextChange : function(node, text, oldText){ + if(this.rendered){ + this.textNode.innerHTML = text; + } + }, + + onDisableChange : function(node, state){ + this.disabled = state; + if(state){ + this.addClass("x-tree-node-disabled"); + }else{ + this.removeClass("x-tree-node-disabled"); + } + }, + + onSelectedChange : function(state){ + if(state){ + this.focus(); + this.addClass("x-tree-selected"); + }else{ + + this.removeClass("x-tree-selected"); + } + }, + + onMove : function(tree, node, oldParent, newParent, index, refNode){ + this.childIndent = null; + if(this.rendered){ + var targetNode = newParent.ui.getContainer(); + if(!targetNode){ + this.holder = document.createElement("div"); + this.holder.appendChild(this.wrap); + return; + } + var insertBefore = refNode ? refNode.ui.getEl() : null; + if(insertBefore){ + targetNode.insertBefore(this.wrap, insertBefore); + }else{ + targetNode.appendChild(this.wrap); + } + this.node.renderIndent(true); + } + }, + + addClass : function(cls){ + if(this.elNode){ + Ext.fly(this.elNode).addClass(cls); + } + }, + + removeClass : function(cls){ + if(this.elNode){ + Ext.fly(this.elNode).removeClass(cls); + } + }, + + remove : function(){ + if(this.rendered){ + this.holder = document.createElement("div"); + this.holder.appendChild(this.wrap); + } + }, + + fireEvent : function(){ + return this.node.fireEvent.apply(this.node, arguments); + }, + + initEvents : function(){ + this.node.on("move", this.onMove, this); + var E = Ext.EventManager; + var a = this.anchor; + + var el = Ext.fly(a, '_treeui'); + + if(Ext.isOpera){ + el.setStyle("text-decoration", "none"); + } + + el.on("click", this.onClick, this); + el.on("dblclick", this.onDblClick, this); + + if(this.checkbox){ + Ext.EventManager.on(this.checkbox, + Ext.isIE ? 'click' : 'change', this.onCheckChange, this); + } + + el.on("contextmenu", this.onContextMenu, this); + + var icon = Ext.fly(this.iconNode); + icon.on("click", this.onClick, this); + icon.on("dblclick", this.onDblClick, this); + icon.on("contextmenu", this.onContextMenu, this); + E.on(this.ecNode, "click", this.ecClick, this, true); + + if(this.node.disabled){ + this.addClass("x-tree-node-disabled"); + } + if(this.node.hidden){ + this.addClass("x-tree-node-disabled"); + } + var ot = this.node.getOwnerTree(); + var dd = ot.enableDD || ot.enableDrag || ot.enableDrop; + if(dd && (!this.node.isRoot || ot.rootVisible)){ + Ext.dd.Registry.register(this.elNode, { + node: this.node, + handles: this.getDDHandles(), + isHandle: false + }); + } + }, + + getDDHandles : function(){ + return [this.iconNode, this.textNode]; + }, + + hide : function(){ + if(this.rendered){ + this.wrap.style.display = "none"; + } + }, + + show : function(){ + if(this.rendered){ + this.wrap.style.display = ""; + } + }, + + onContextMenu : function(e){ + if (this.node.hasListener("contextmenu") || this.node.getOwnerTree().hasListener("contextmenu")) { + e.preventDefault(); + this.focus(); + this.fireEvent("contextmenu", this.node, e); + } + }, + + onClick : function(e){ + if(this.dropping){ + e.stopEvent(); + return; + } + if(this.fireEvent("beforeclick", this.node, e) !== false){ + if(!this.disabled && this.node.attributes.href){ + this.fireEvent("click", this.node, e); + return; + } + e.preventDefault(); + if(this.disabled){ + return; + } + + if(this.node.attributes.singleClickExpand && !this.animating && this.node.hasChildNodes()){ + this.node.toggle(); + } + + this.fireEvent("click", this.node, e); + }else{ + e.stopEvent(); + } + }, + + onDblClick : function(e){ + e.preventDefault(); + if(this.disabled){ + return; + } + if(this.checkbox){ + this.toggleCheck(); + } + if(!this.animating && this.node.hasChildNodes()){ + this.node.toggle(); + } + this.fireEvent("dblclick", this.node, e); + }, + + onCheckChange : function(){ + var checked = this.checkbox.checked; + this.node.attributes.checked = checked; + this.fireEvent('checkchange', this.node, checked); + }, + + ecClick : function(e){ + if(!this.animating && this.node.hasChildNodes()){ + this.node.toggle(); + } + }, + + startDrop : function(){ + this.dropping = true; + }, + + + endDrop : function(){ + setTimeout(function(){ + this.dropping = false; + }.createDelegate(this), 50); + }, + + expand : function(){ + this.updateExpandIcon(); + this.ctNode.style.display = ""; + }, + + focus : function(){ + if(!this.node.preventHScroll){ + try{this.anchor.focus(); + }catch(e){} + }else if(!Ext.isIE){ + try{ + var noscroll = this.node.getOwnerTree().getTreeEl().dom; + var l = noscroll.scrollLeft; + this.anchor.focus(); + noscroll.scrollLeft = l; + }catch(e){} + } + }, + + toggleCheck : function(value){ + var cb = this.checkbox; + if(cb){ + cb.checked = (value === undefined ? !cb.checked : value); + } + }, + + blur : function(){ + try{ + this.anchor.blur(); + }catch(e){} + }, + + animExpand : function(callback){ + var ct = Ext.get(this.ctNode); + ct.stopFx(); + if(!this.node.hasChildNodes()){ + this.updateExpandIcon(); + this.ctNode.style.display = ""; + Ext.callback(callback); + return; + } + this.animating = true; + this.updateExpandIcon(); + + ct.slideIn('t', { + callback : function(){ + this.animating = false; + Ext.callback(callback); + }, + scope: this, + duration: this.node.ownerTree.duration || .25 + }); + }, + + highlight : function(){ + var tree = this.node.getOwnerTree(); + Ext.fly(this.wrap).highlight( + tree.hlColor || "C3DAF9", + {endColor: tree.hlBaseColor} + ); + }, + + collapse : function(){ + this.updateExpandIcon(); + this.ctNode.style.display = "none"; + }, + + animCollapse : function(callback){ + var ct = Ext.get(this.ctNode); + ct.enableDisplayMode('block'); + ct.stopFx(); + + this.animating = true; + this.updateExpandIcon(); + + ct.slideOut('t', { + callback : function(){ + this.animating = false; + Ext.callback(callback); + }, + scope: this, + duration: this.node.ownerTree.duration || .25 + }); + }, + + getContainer : function(){ + return this.ctNode; + }, + + getEl : function(){ + return this.wrap; + }, + + appendDDGhost : function(ghostNode){ + ghostNode.appendChild(this.elNode.cloneNode(true)); + }, + + getDDRepairXY : function(){ + return Ext.lib.Dom.getXY(this.iconNode); + }, + + onRender : function(){ + this.render(); + }, + + render : function(bulkRender){ + var n = this.node, a = n.attributes; + var targetNode = n.parentNode ? + n.parentNode.ui.getContainer() : n.ownerTree.innerCt.dom; + + if(!this.rendered){ + this.rendered = true; + + this.renderElements(n, a, targetNode, bulkRender); + + if(a.qtip){ + if(this.textNode.setAttributeNS){ + this.textNode.setAttributeNS("ext", "qtip", a.qtip); + if(a.qtipTitle){ + this.textNode.setAttributeNS("ext", "qtitle", a.qtipTitle); + } + }else{ + this.textNode.setAttribute("ext:qtip", a.qtip); + if(a.qtipTitle){ + this.textNode.setAttribute("ext:qtitle", a.qtipTitle); + } + } + }else if(a.qtipCfg){ + a.qtipCfg.target = Ext.id(this.textNode); + Ext.QuickTips.register(a.qtipCfg); + } + this.initEvents(); + if(!this.node.expanded){ + this.updateExpandIcon(); + } + }else{ + if(bulkRender === true) { + targetNode.appendChild(this.wrap); + } + } + }, + + renderElements : function(n, a, targetNode, bulkRender){ + + this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : ''; + + var cb = typeof a.checked == 'boolean'; + var href = a.href ? a.href : Ext.isGecko ? "" : "#"; + var buf = ['
  • ', + '',this.indentMarkup,"", + '', + '', + cb ? ('' : ' />')) : '', + '',n.text,"
    ", + '', + "
  • "]; + + if(bulkRender !== true && n.nextSibling && n.nextSibling.ui.getEl()){ + this.wrap = Ext.DomHelper.insertHtml("beforeBegin", + n.nextSibling.ui.getEl(), buf.join("")); + }else{ + this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf.join("")); + } + + this.elNode = this.wrap.childNodes[0]; + this.ctNode = this.wrap.childNodes[1]; + var cs = this.elNode.childNodes; + this.indentNode = cs[0]; + this.ecNode = cs[1]; + this.iconNode = cs[2]; + var index = 3; + if(cb){ + this.checkbox = cs[3]; + index++; + } + this.anchor = cs[index]; + this.textNode = cs[index].firstChild; + }, + + getAnchor : function(){ + return this.anchor; + }, + + getTextEl : function(){ + return this.textNode; + }, + + getIconEl : function(){ + return this.iconNode; + }, + + isChecked : function(){ + return this.checkbox ? this.checkbox.checked : false; + }, + + updateExpandIcon : function(){ + if(this.rendered){ + var n = this.node, c1, c2; + var cls = n.isLast() ? "x-tree-elbow-end" : "x-tree-elbow"; + var hasChild = n.hasChildNodes(); + if(hasChild){ + if(n.expanded){ + cls += "-minus"; + c1 = "x-tree-node-collapsed"; + c2 = "x-tree-node-expanded"; + }else{ + cls += "-plus"; + c1 = "x-tree-node-expanded"; + c2 = "x-tree-node-collapsed"; + } + if(this.wasLeaf){ + this.removeClass("x-tree-node-leaf"); + this.wasLeaf = false; + } + if(this.c1 != c1 || this.c2 != c2){ + Ext.fly(this.elNode).replaceClass(c1, c2); + this.c1 = c1; this.c2 = c2; + } + }else{ + if(!this.wasLeaf){ + Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-leaf"); + delete this.c1; + delete this.c2; + this.wasLeaf = true; + } + } + var ecc = "x-tree-ec-icon "+cls; + if(this.ecc != ecc){ + this.ecNode.className = ecc; + this.ecc = ecc; + } + } + }, + + getChildIndent : function(){ + if(!this.childIndent){ + var buf = []; + var p = this.node; + while(p){ + if(!p.isRoot || (p.isRoot && p.ownerTree.rootVisible)){ + if(!p.isLast()) { + buf.unshift(''); + } else { + buf.unshift(''); + } + } + p = p.parentNode; + } + this.childIndent = buf.join(""); + } + return this.childIndent; + }, + + renderIndent : function(){ + if(this.rendered){ + var indent = ""; + var p = this.node.parentNode; + if(p){ + indent = p.ui.getChildIndent(); + } + if(this.indentMarkup != indent){ + this.indentNode.innerHTML = indent; + this.indentMarkup = indent; + } + this.updateExpandIcon(); + } + } +}; + +Ext.tree.RootTreeNodeUI = function(){ + Ext.tree.RootTreeNodeUI.superclass.constructor.apply(this, arguments); +}; +Ext.extend(Ext.tree.RootTreeNodeUI, Ext.tree.TreeNodeUI, { + render : function(){ + if(!this.rendered){ + var targetNode = this.node.ownerTree.innerCt.dom; + this.node.expanded = true; + targetNode.innerHTML = '
    '; + this.wrap = this.ctNode = targetNode.firstChild; + } + }, + collapse : function(){ + }, + expand : function(){ + } +}); + +Ext.tree.TreeLoader = function(config){ + this.baseParams = {}; + this.requestMethod = "POST"; + Ext.apply(this, config); + + this.addEvents({ + + "beforeload" : true, + + "load" : true, + + "loadexception" : true + }); + + Ext.tree.TreeLoader.superclass.constructor.call(this); +}; + +Ext.extend(Ext.tree.TreeLoader, Ext.util.Observable, { + + + + + uiProviders : {}, + + + clearOnLoad : true, + + + load : function(node, callback){ + if(this.clearOnLoad){ + while(node.firstChild){ + node.removeChild(node.firstChild); + } + } + if(node.attributes.children){ + var cs = node.attributes.children; + for(var i = 0, len = cs.length; i < len; i++){ + node.appendChild(this.createNode(cs[i])); + } + if(typeof callback == "function"){ + callback(); + } + }else if(this.dataUrl){ + this.requestData(node, callback); + } + }, + + getParams: function(node){ + var buf = [], bp = this.baseParams; + for(var key in bp){ + if(typeof bp[key] != "function"){ + buf.push(encodeURIComponent(key), "=", encodeURIComponent(bp[key]), "&"); + } + } + buf.push("node=", encodeURIComponent(node.id)); + return buf.join(""); + }, + + requestData : function(node, callback){ + if(this.fireEvent("beforeload", this, node, callback) !== false){ + this.transId = Ext.Ajax.request({ + method:this.requestMethod, + url: this.dataUrl||this.url, + success: this.handleResponse, + failure: this.handleFailure, + scope: this, + argument: {callback: callback, node: node}, + params: this.getParams(node) + }); + }else{ + + + if(typeof callback == "function"){ + callback(); + } + } + }, + + isLoading : function(){ + return this.transId ? true : false; + }, + + 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 = this; + } + if(typeof attr.uiProvider == 'string'){ + attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider); + } + return(attr.leaf ? + new Ext.tree.TreeNode(attr) : + new Ext.tree.AsyncTreeNode(attr)); + }, + + processResponse : function(response, node, callback){ + var json = response.responseText; + try { + var o = eval("("+json+")"); + for(var i = 0, len = o.length; i < len; i++){ + var n = this.createNode(o[i]); + if(n){ + node.appendChild(n); + } + } + if(typeof callback == "function"){ + callback(this, node); + } + }catch(e){ + this.handleFailure(response); + } + }, + + handleResponse : function(response){ + this.transId = false; + var a = response.argument; + this.processResponse(response, a.node, a.callback); + this.fireEvent("load", this, a.node, response); + }, + + handleFailure : function(response){ + this.transId = false; + var a = response.argument; + this.fireEvent("loadexception", this, a.node, response); + if(typeof a.callback == "function"){ + a.callback(this, a.node); + } + } +}); + +Ext.tree.TreeFilter = function(tree, config){ + this.tree = tree; + this.filtered = {}; + Ext.apply(this, config); +}; + +Ext.tree.TreeFilter.prototype = { + clearBlank:false, + reverse:false, + autoClear:false, + remove:false, + + + filter : function(value, attr, startNode){ + attr = attr || "text"; + var f; + if(typeof value == "string"){ + var vlen = value.length; + + if(vlen == 0 && this.clearBlank){ + this.clear(); + return; + } + value = value.toLowerCase(); + f = function(n){ + return n.attributes[attr].substr(0, vlen).toLowerCase() == value; + }; + }else if(value.exec){ + f = function(n){ + return value.test(n.attributes[attr]); + }; + }else{ + throw 'Illegal filter type, must be string or regex'; + } + this.filterBy(f, null, startNode); + }, + + + filterBy : function(fn, scope, startNode){ + startNode = startNode || this.tree.root; + if(this.autoClear){ + this.clear(); + } + var af = this.filtered, rv = this.reverse; + var f = function(n){ + if(n == startNode){ + return true; + } + if(af[n.id]){ + return false; + } + var m = fn.call(scope || n, n); + if(!m || rv){ + af[n.id] = n; + n.ui.hide(); + return false; + } + return true; + }; + startNode.cascade(f); + if(this.remove){ + for(var id in af){ + if(typeof id != "function"){ + var n = af[id]; + if(n && n.parentNode){ + n.parentNode.removeChild(n); + } + } + } + } + }, + + + clear : function(){ + var t = this.tree; + var af = this.filtered; + for(var id in af){ + if(typeof id != "function"){ + var n = af[id]; + if(n){ + n.ui.show(); + } + } + } + this.filtered = {}; + } +}; + + +Ext.tree.TreeSorter = function(tree, config){ + Ext.apply(this, config); + tree.on("beforechildrenrendered", this.doSort, this); + tree.on("append", this.updateSort, this); + tree.on("insert", this.updateSort, this); + + var dsc = this.dir && this.dir.toLowerCase() == "desc"; + var p = this.property || "text"; + var sortType = this.sortType; + var fs = this.folderSort; + var cs = this.caseSensitive === true; + var leafAttr = this.leafAttr || 'leaf'; + + this.sortFn = function(n1, n2){ + if(fs){ + if(n1.attributes[leafAttr] && !n2.attributes[leafAttr]){ + return 1; + } + if(!n1.attributes[leafAttr] && n2.attributes[leafAttr]){ + return -1; + } + } + var v1 = sortType ? sortType(n1) : (cs ? n1.attributes[p] : n1.attributes[p].toUpperCase()); + var v2 = sortType ? sortType(n2) : (cs ? n2.attributes[p] : n2.attributes[p].toUpperCase()); + if(v1 < v2){ + return dsc ? +1 : -1; + }else if(v1 > v2){ + return dsc ? -1 : +1; + }else{ + return 0; + } + }; +}; + +Ext.tree.TreeSorter.prototype = { + doSort : function(node){ + node.sort(this.sortFn); + }, + + compareNodes : function(n1, n2){ + return (n1.text.toUpperCase() > n2.text.toUpperCase() ? 1 : -1); + }, + + updateSort : function(tree, node){ + if(node.childrenRendered){ + this.doSort.defer(1, this, [node]); + } + } +}; +if(Ext.dd.DropZone){ + +Ext.tree.TreeDropZone = function(tree, config){ + this.allowParentInsert = false; + this.allowContainerDrop = false; + this.appendOnly = false; + Ext.tree.TreeDropZone.superclass.constructor.call(this, tree.innerCt, config); + this.tree = tree; + this.lastInsertClass = "x-tree-no-status"; + this.dragOverData = {}; +}; + +Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, { + ddGroup : "TreeDD", + + expandDelay : 1000, + + expandNode : function(node){ + if(node.hasChildNodes() && !node.isExpanded()){ + node.expand(false, null, this.triggerCacheRefresh.createDelegate(this)); + } + }, + + queueExpand : function(node){ + this.expandProcId = this.expandNode.defer(this.expandDelay, this, [node]); + }, + + cancelExpand : function(){ + if(this.expandProcId){ + clearTimeout(this.expandProcId); + this.expandProcId = false; + } + }, + + isValidDropPoint : function(n, pt, dd, e, data){ + if(!n || !data){ return false; } + var targetNode = n.node; + var dropNode = data.node; + + if(!(targetNode && targetNode.isTarget && pt)){ + return false; + } + if(pt == "append" && targetNode.allowChildren === false){ + return false; + } + if((pt == "above" || pt == "below") && (targetNode.parentNode && targetNode.parentNode.allowChildren === false)){ + return false; + } + if(dropNode && (targetNode == dropNode || dropNode.contains(targetNode))){ + return false; + } + + var overEvent = this.dragOverData; + overEvent.tree = this.tree; + overEvent.target = targetNode; + overEvent.data = data; + overEvent.point = pt; + overEvent.source = dd; + overEvent.rawEvent = e; + overEvent.dropNode = dropNode; + overEvent.cancel = false; + var result = this.tree.fireEvent("nodedragover", overEvent); + return overEvent.cancel === false && result !== false; + }, + + getDropPoint : function(e, n, dd){ + var tn = n.node; + if(tn.isRoot){ + return tn.allowChildren !== false ? "append" : false; + } + var dragEl = n.ddel; + var t = Ext.lib.Dom.getY(dragEl), b = t + dragEl.offsetHeight; + var y = Ext.lib.Event.getPageY(e); + var noAppend = tn.allowChildren === false || tn.isLeaf(); + if(this.appendOnly || tn.parentNode.allowChildren === false){ + return noAppend ? false : "append"; + } + var noBelow = false; + if(!this.allowParentInsert){ + noBelow = tn.hasChildNodes() && tn.isExpanded(); + } + var q = (b - t) / (noAppend ? 2 : 3); + if(y >= t && y < (t + q)){ + return "above"; + }else if(!noBelow && (noAppend || y >= b-q && y <= b)){ + return "below"; + }else{ + return "append"; + } + }, + + onNodeEnter : function(n, dd, e, data){ + this.cancelExpand(); + }, + + onNodeOver : function(n, dd, e, data){ + var pt = this.getDropPoint(e, n, dd); + var node = n.node; + + + if(!this.expandProcId && pt == "append" && node.hasChildNodes() && !n.node.isExpanded()){ + this.queueExpand(node); + }else if(pt != "append"){ + this.cancelExpand(); + } + + + var returnCls = this.dropNotAllowed; + if(this.isValidDropPoint(n, pt, dd, e, data)){ + if(pt){ + var el = n.ddel; + var cls; + if(pt == "above"){ + returnCls = n.node.isFirst() ? "x-tree-drop-ok-above" : "x-tree-drop-ok-between"; + cls = "x-tree-drag-insert-above"; + }else if(pt == "below"){ + returnCls = n.node.isLast() ? "x-tree-drop-ok-below" : "x-tree-drop-ok-between"; + cls = "x-tree-drag-insert-below"; + }else{ + returnCls = "x-tree-drop-ok-append"; + cls = "x-tree-drag-append"; + } + if(this.lastInsertClass != cls){ + Ext.fly(el).replaceClass(this.lastInsertClass, cls); + this.lastInsertClass = cls; + } + } + } + return returnCls; + }, + + onNodeOut : function(n, dd, e, data){ + this.cancelExpand(); + this.removeDropIndicators(n); + }, + + onNodeDrop : function(n, dd, e, data){ + var point = this.getDropPoint(e, n, dd); + var targetNode = n.node; + targetNode.ui.startDrop(); + if(!this.isValidDropPoint(n, point, dd, e, data)){ + targetNode.ui.endDrop(); + return false; + } + + var dropNode = data.node || (dd.getTreeNode ? dd.getTreeNode(data, targetNode, point, e) : null); + var dropEvent = { + tree : this.tree, + target: targetNode, + data: data, + point: point, + source: dd, + rawEvent: e, + dropNode: dropNode, + cancel: !dropNode + }; + var retval = this.tree.fireEvent("beforenodedrop", dropEvent); + if(retval === false || dropEvent.cancel === true || !dropEvent.dropNode){ + targetNode.ui.endDrop(); + return false; + } + + targetNode = dropEvent.target; + if(point == "append" && !targetNode.isExpanded()){ + targetNode.expand(false, null, function(){ + this.completeDrop(dropEvent); + }.createDelegate(this)); + }else{ + this.completeDrop(dropEvent); + } + return true; + }, + + completeDrop : function(de){ + var ns = de.dropNode, p = de.point, t = de.target; + if(!(ns instanceof Array)){ + ns = [ns]; + } + var n; + for(var i = 0, len = ns.length; i < len; i++){ + n = ns[i]; + if(p == "above"){ + t.parentNode.insertBefore(n, t); + }else if(p == "below"){ + t.parentNode.insertBefore(n, t.nextSibling); + }else{ + t.appendChild(n); + } + } + n.ui.focus(); + if(this.tree.hlDrop){ + n.ui.highlight(); + } + t.ui.endDrop(); + this.tree.fireEvent("nodedrop", de); + }, + + afterNodeMoved : function(dd, data, e, targetNode, dropNode){ + if(this.tree.hlDrop){ + dropNode.ui.focus(); + dropNode.ui.highlight(); + } + this.tree.fireEvent("nodedrop", this.tree, targetNode, data, dd, e); + }, + + getTree : function(){ + return this.tree; + }, + + removeDropIndicators : function(n){ + if(n && n.ddel){ + var el = n.ddel; + Ext.fly(el).removeClass([ + "x-tree-drag-insert-above", + "x-tree-drag-insert-below", + "x-tree-drag-append"]); + this.lastInsertClass = "_noclass"; + } + }, + + beforeDragDrop : function(target, e, id){ + this.cancelExpand(); + return true; + }, + + afterRepair : function(data){ + if(data && Ext.enableFx){ + data.node.ui.highlight(); + } + this.hideProxy(); + } +}); + +} +if(Ext.dd.DragZone){ +Ext.tree.TreeDragZone = function(tree, config){ + Ext.tree.TreeDragZone.superclass.constructor.call(this, tree.getTreeEl(), config); + this.tree = tree; +}; + +Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone, { + ddGroup : "TreeDD", + + onBeforeDrag : function(data, e){ + var n = data.node; + return n && n.draggable && !n.disabled; + }, + + onInitDrag : function(e){ + var data = this.dragData; + this.tree.getSelectionModel().select(data.node); + this.proxy.update(""); + data.node.ui.appendDDGhost(this.proxy.ghost.dom); + this.tree.fireEvent("startdrag", this.tree, data.node, e); + }, + + getRepairXY : function(e, data){ + return data.node.ui.getDDRepairXY(); + }, + + onEndDrag : function(data, e){ + this.tree.fireEvent("enddrag", this.tree, data.node, e); + }, + + onValidDrop : function(dd, e, id){ + this.tree.fireEvent("dragdrop", this.tree, this.dragData.node, dd, e); + this.hideProxy(); + }, + + beforeInvalidDrop : function(e, id){ + + var sm = this.tree.getSelectionModel(); + sm.clearSelections(); + sm.select(this.dragData.node); + } +}); +} + +Ext.tree.TreeEditor = function(tree, config){ + config = config || {}; + var field = config.events ? config : new Ext.form.TextField(config); + Ext.tree.TreeEditor.superclass.constructor.call(this, field); + + this.tree = tree; + + tree.on('beforeclick', this.beforeNodeClick, this); + tree.getTreeEl().on('mousedown', this.hide, this); + this.on('complete', this.updateNode, this); + this.on('beforestartedit', this.fitToTree, this); + this.on('startedit', this.bindScroll, this, {delay:10}); + this.on('specialkey', this.onSpecialKey, this); +}; + +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, + + fitToTree : function(ed, el){ + var td = this.tree.getTreeEl().dom, nd = el.dom; + if(td.scrollLeft > nd.offsetLeft){ td.scrollLeft = nd.offsetLeft; + } + var w = Math.min( + this.maxWidth, + (td.clientWidth > 20 ? td.clientWidth : td.offsetWidth) - Math.max(0, nd.offsetLeft-td.scrollLeft) - 5); + this.setSize(w, ''); + }, + + triggerEdit : function(node){ + this.completeEdit(); + this.editNode = node; + this.startEdit(node.ui.textNode, node.text); + }, + + bindScroll : function(){ + this.tree.getTreeEl().on('scroll', this.cancelEdit, this); + }, + + beforeNodeClick : function(node, e){ + var sinceLast = (this.lastClick ? this.lastClick.getElapsed() : 0); + this.lastClick = new Date(); + if(sinceLast > this.editDelay && this.tree.getSelectionModel().isSelected(node)){ + e.stopEvent(); + this.triggerEdit(node); + return false; + } + }, + + updateNode : function(ed, value){ + this.tree.getTreeEl().un('scroll', this.cancelEdit, this); + this.editNode.setText(value); + }, + + onHide : function(){ + Ext.tree.TreeEditor.superclass.onHide.call(this); + if(this.editNode){ + this.editNode.ui.focus(); + } + }, + + onSpecialKey : function(field, e){ + var k = e.getKey(); + if(k == e.ESC){ + e.stopEvent(); + this.cancelEdit(); + }else if(k == e.ENTER && !e.hasModifier()){ + e.stopEvent(); + this.completeEdit(); + } + } +}); + +Ext.menu.Menu = function(config){ + Ext.apply(this, config); + this.id = this.id || Ext.id(); + this.addEvents({ + + beforeshow : true, + + beforehide : true, + + show : true, + + hide : true, + + click : true, + + mouseover : true, + + mouseout : true, + + itemclick: true + }); + Ext.menu.MenuMgr.register(this); + var mis = this.items; + this.items = new Ext.util.MixedCollection(); + if(mis){ + this.add.apply(this, mis); + } +}; + +Ext.extend(Ext.menu.Menu, Ext.util.Observable, { + + minWidth : 120, + + shadow : "sides", + + subMenuAlign : "tl-tr?", + + defaultAlign : "tl-bl?", + + allowOtherMenus : false, + + hidden:true, + + render : function(){ + if(this.el){ + return; + } + var el = this.el = new Ext.Layer({ + cls: "x-menu", + shadow:this.shadow, + constrain: false, + parentEl: this.parentEl || document.body, + zindex:15000 + }); + + this.keyNav = new Ext.menu.MenuNav(this); + + if(this.plain){ + el.addClass("x-menu-plain"); + } + if(this.cls){ + el.addClass(this.cls); + } + this.focusEl = el.createChild({ + tag: "a", cls: "x-menu-focus", href: "#", onclick: "return false;", tabIndex:"-1" + }); + var ul = el.createChild({tag: "ul", cls: "x-menu-list"}); + ul.on("click", this.onClick, this); + ul.on("mouseover", this.onMouseOver, this); + ul.on("mouseout", this.onMouseOut, this); + this.items.each(function(item){ + var li = document.createElement("li"); + li.className = "x-menu-list-item"; + ul.dom.appendChild(li); + item.render(li, this); + }, this); + this.ul = ul; + this.autoWidth(); + }, + + autoWidth : function(){ + var el = this.el, ul = this.ul; + if(!el){ + return; + } + var w = this.width; + if(w){ + el.setWidth(w); + }else if(Ext.isIE){ + el.setWidth(this.minWidth); + var t = el.dom.offsetWidth; el.setWidth(ul.getWidth()+el.getFrameWidth("lr")); + } + }, + + delayAutoWidth : function(){ + if(this.rendered){ + if(!this.awTask){ + this.awTask = new Ext.util.DelayedTask(this.autoWidth, this); + } + this.awTask.delay(20); + } + }, + + findTargetItem : function(e){ + var t = e.getTarget(".x-menu-list-item", this.ul, true); + if(t && t.menuItemId){ + return this.items.get(t.menuItemId); + } + }, + + onClick : function(e){ + var t; + if(t = this.findTargetItem(e)){ + t.onClick(e); + this.fireEvent("click", this, t, e); + } + }, + + setActiveItem : function(item, autoExpand){ + if(item != this.activeItem){ + if(this.activeItem){ + this.activeItem.deactivate(); + } + this.activeItem = item; + item.activate(autoExpand); + }else if(autoExpand){ + item.expandMenu(); + } + }, + + tryActivate : function(start, step){ + var items = this.items; + for(var i = start, len = items.length; i >= 0 && i < len; i+= step){ + var item = items.get(i); + if(!item.disabled && item.canActivate){ + this.setActiveItem(item, false); + return item; + } + } + return false; + }, + + onMouseOver : function(e){ + var t; + if(t = this.findTargetItem(e)){ + if(t.canActivate && !t.disabled){ + this.setActiveItem(t, true); + } + } + this.fireEvent("mouseover", this, e, t); + }, + + onMouseOut : function(e){ + var t; + if(t = this.findTargetItem(e)){ + if(t == this.activeItem && t.shouldDeactivate(e)){ + this.activeItem.deactivate(); + delete this.activeItem; + } + } + this.fireEvent("mouseout", this, e, t); + }, + + + isVisible : function(){ + return this.el && !this.hidden; + }, + + + show : function(el, pos, parentMenu){ + this.parentMenu = parentMenu; + if(!this.el){ + this.render(); + } + this.fireEvent("beforeshow", this); + this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign), parentMenu, false); + }, + + + showAt : function(xy, parentMenu, _e){ + this.parentMenu = parentMenu; + if(!this.el){ + this.render(); + } + if(_e !== false){ + this.fireEvent("beforeshow", this); + xy = this.el.adjustForConstraints(xy); + } + this.el.setXY(xy); + this.el.show(); + this.hidden = false; + this.focus(); + this.fireEvent("show", this); + }, + + focus : function(){ + if(!this.hidden){ + this.doFocus.defer(50, this); + } + }, + + doFocus : function(){ + if(!this.hidden){ + this.focusEl.focus(); + } + }, + + + hide : function(deep){ + if(this.el && this.isVisible()){ + this.fireEvent("beforehide", this); + if(this.activeItem){ + this.activeItem.deactivate(); + this.activeItem = null; + } + this.el.hide(); + this.hidden = true; + this.fireEvent("hide", this); + } + if(deep === true && this.parentMenu){ + this.parentMenu.hide(true); + } + }, + + + add : function(){ + var a = arguments, l = a.length, item; + for(var i = 0; i < l; i++){ + var el = a[i]; + if(el.render){ item = this.addItem(el); + }else if(typeof el == "string"){ if(el == "separator" || el == "-"){ + item = this.addSeparator(); + }else{ + item = this.addText(el); + } + }else if(el.tagName || el.el){ item = this.addElement(el); + }else if(typeof el == "object"){ item = this.addMenuItem(el); + } + } + return item; + }, + + + getEl : function(){ + if(!this.el){ + this.render(); + } + return this.el; + }, + + + addSeparator : function(){ + return this.addItem(new Ext.menu.Separator()); + }, + + + addElement : function(el){ + return this.addItem(new Ext.menu.BaseItem(el)); + }, + + + addItem : function(item){ + this.items.add(item); + if(this.ul){ + var li = document.createElement("li"); + li.className = "x-menu-list-item"; + this.ul.dom.appendChild(li); + item.render(li, this); + this.delayAutoWidth(); + } + return item; + }, + + + addMenuItem : function(config){ + if(!(config instanceof Ext.menu.Item)){ + if(typeof config.checked == "boolean"){ config = new Ext.menu.CheckItem(config); + }else{ + config = new Ext.menu.Item(config); + } + } + return this.addItem(config); + }, + + + addText : function(text){ + return this.addItem(new Ext.menu.TextItem(text)); + }, + + + insert : function(index, item){ + this.items.insert(index, item); + if(this.ul){ + var li = document.createElement("li"); + li.className = "x-menu-list-item"; + this.ul.dom.insertBefore(li, this.ul.dom.childNodes[index]); + item.render(li, this); + this.delayAutoWidth(); + } + return item; + }, + + + remove : function(item){ + this.items.removeKey(item.id); + item.destroy(); + }, + + + removeAll : function(){ + var f; + while(f = this.items.first()){ + this.remove(f); + } + } +}); + +Ext.menu.MenuNav = function(menu){ + Ext.menu.MenuNav.superclass.constructor.call(this, menu.el); + this.scope = this.menu = menu; +}; + +Ext.extend(Ext.menu.MenuNav, Ext.KeyNav, { + doRelay : function(e, h){ + var k = e.getKey(); + if(!this.menu.activeItem && e.isNavKeyPress() && k != e.SPACE && k != e.RETURN){ + this.menu.tryActivate(0, 1); + return false; + } + return h.call(this.scope || this, e, this.menu); + }, + + up : function(e, m){ + if(!m.tryActivate(m.items.indexOf(m.activeItem)-1, -1)){ + m.tryActivate(m.items.length-1, -1); + } + }, + + down : function(e, m){ + if(!m.tryActivate(m.items.indexOf(m.activeItem)+1, 1)){ + m.tryActivate(0, 1); + } + }, + + right : function(e, m){ + if(m.activeItem){ + m.activeItem.expandMenu(true); + } + }, + + left : function(e, m){ + m.hide(); + if(m.parentMenu && m.parentMenu.activeItem){ + m.parentMenu.activeItem.activate(); + } + }, + + enter : function(e, m){ + if(m.activeItem){ + e.stopPropagation(); + m.activeItem.onClick(e); + m.fireEvent("click", this, m.activeItem); + return true; + } + } +}); + +Ext.menu.MenuMgr = function(){ + var menus, active, groups = {}, attached = false, lastShow = new Date(); + + function init(){ + menus = {}; + active = new Ext.util.MixedCollection(); + Ext.get(document).addKeyListener(27, function(){ + if(active.length > 0){ + hideAll(); + } + }); + } + + function hideAll(){ + if(active && active.length > 0){ + var c = active.clone(); + c.each(function(m){ + m.hide(); + }); + } + } + + function onHide(m){ + active.remove(m); + if(active.length < 1){ + Ext.get(document).un("mousedown", onMouseDown); + attached = false; + } + } + + function onShow(m){ + var last = active.last(); + lastShow = new Date(); + active.add(m); + if(!attached){ + Ext.get(document).on("mousedown", onMouseDown); + attached = true; + } + if(m.parentMenu){ + m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3); + m.parentMenu.activeChild = m; + }else if(last && last.isVisible()){ + m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3); + } + } + + function onBeforeHide(m){ + if(m.activeChild){ + m.activeChild.hide(); + } + if(m.autoHideTimer){ + clearTimeout(m.autoHideTimer); + delete m.autoHideTimer; + } + } + + function onBeforeShow(m){ + var pm = m.parentMenu; + if(!pm && !m.allowOtherMenus){ + hideAll(); + }else if(pm && pm.activeChild){ + pm.activeChild.hide(); + } + } + + function onMouseDown(e){ + if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){ + hideAll(); + } + } + + function onBeforeCheck(mi, state){ + if(state){ + var g = groups[mi.group]; + for(var i = 0, l = g.length; i < l; i++){ + if(g[i] != mi){ + g[i].setChecked(false); + } + } + } + } + + return { + + + hideAll : function(){ + hideAll(); + }, + + register : function(menu){ + if(!menus){ + init(); + } + menus[menu.id] = menu; + menu.on("beforehide", onBeforeHide); + menu.on("hide", onHide); + menu.on("beforeshow", onBeforeShow); + menu.on("show", onShow); + var g = menu.group; + if(g && menu.events["checkchange"]){ + if(!groups[g]){ + groups[g] = []; + } + groups[g].push(menu); + menu.on("checkchange", onCheck); + } + }, + + + get : function(menu){ + if(typeof menu == "string"){ return menus[menu]; + }else if(menu.events){ return menu; + }else if(typeof menu.length == 'number'){ return new Ext.menu.Menu({items:menu}); + }else{ return new Ext.menu.Menu(menu); + } + }, + + unregister : function(menu){ + delete menus[menu.id]; + menu.un("beforehide", onBeforeHide); + menu.un("hide", onHide); + menu.un("beforeshow", onBeforeShow); + menu.un("show", onShow); + var g = menu.group; + if(g && menu.events["checkchange"]){ + groups[g].remove(menu); + menu.un("checkchange", onCheck); + } + }, + + registerCheckable : function(menuItem){ + var g = menuItem.group; + if(g){ + if(!groups[g]){ + groups[g] = []; + } + groups[g].push(menuItem); + menuItem.on("beforecheckchange", onBeforeCheck); + } + }, + + unregisterCheckable : function(menuItem){ + var g = menuItem.group; + if(g){ + groups[g].remove(menuItem); + menuItem.un("beforecheckchange", onBeforeCheck); + } + } + }; +}(); + + +Ext.menu.BaseItem = function(config){ + Ext.menu.BaseItem.superclass.constructor.call(this, config); + + this.addEvents({ + + click: true, + + activate : true, + + deactivate : true + }); + + if(this.handler){ + this.on("click", this.handler, this.scope, true); + } +}; + +Ext.extend(Ext.menu.BaseItem, Ext.Component, { + + + canActivate : false, + + activeClass : "x-menu-item-active", + + hideOnClick : true, + + hideDelay : 100, + + ctype: "Ext.menu.BaseItem", + + actionMode : "container", + + render : function(container, parentMenu){ + this.parentMenu = parentMenu; + Ext.menu.BaseItem.superclass.render.call(this, container); + this.container.menuItemId = this.id; + }, + + onRender : function(container, position){ + this.el = Ext.get(this.el); + container.dom.appendChild(this.el.dom); + }, + + onClick : function(e){ + if(!this.disabled && this.fireEvent("click", this, e) !== false + && this.parentMenu.fireEvent("itemclick", this, e) !== false){ + this.handleClick(e); + }else{ + e.stopEvent(); + } + }, + + activate : function(){ + if(this.disabled){ + return false; + } + var li = this.container; + li.addClass(this.activeClass); + this.region = li.getRegion().adjust(2, 2, -2, -2); + this.fireEvent("activate", this); + return true; + }, + + deactivate : function(){ + this.container.removeClass(this.activeClass); + this.fireEvent("deactivate", this); + }, + + shouldDeactivate : function(e){ + return !this.region || !this.region.contains(e.getPoint()); + }, + + handleClick : function(e){ + if(this.hideOnClick){ + this.parentMenu.hide.defer(this.hideDelay, this.parentMenu, [true]); + } + }, + + expandMenu : function(autoActivate){ + }, + + hideMenu : function(){ + } +}); + +Ext.menu.TextItem = function(text){ + this.text = text; + Ext.menu.TextItem.superclass.constructor.call(this); +}; + +Ext.extend(Ext.menu.TextItem, Ext.menu.BaseItem, { + + hideOnClick : false, + + itemCls : "x-menu-text", + + onRender : function(){ + var s = document.createElement("span"); + s.className = this.itemCls; + s.innerHTML = this.text; + this.el = s; + Ext.menu.TextItem.superclass.onRender.apply(this, arguments); + } +}); + +Ext.menu.Separator = function(config){ + Ext.menu.Separator.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.menu.Separator, Ext.menu.BaseItem, { + + itemCls : "x-menu-sep", + + hideOnClick : false, + + onRender : function(li){ + var s = document.createElement("span"); + s.className = this.itemCls; + s.innerHTML = " "; + this.el = s; + li.addClass("x-menu-sep-li"); + Ext.menu.Separator.superclass.onRender.apply(this, arguments); + } +}); + +Ext.menu.Item = function(config){ + Ext.menu.Item.superclass.constructor.call(this, config); + if(this.menu){ + this.menu = Ext.menu.MenuMgr.get(this.menu); + } +}; +Ext.extend(Ext.menu.Item, Ext.menu.BaseItem, { + + + itemCls : "x-menu-item", + + canActivate : true, + + showDelay: 200, + hideDelay: 200, + + ctype: "Ext.menu.Item", + + onRender : function(container, position){ + var el = document.createElement("a"); + el.hideFocus = true; + el.unselectable = "on"; + el.href = this.href || "#"; + if(this.hrefTarget){ + el.target = this.hrefTarget; + } + el.className = this.itemCls + (this.menu ? " x-menu-item-arrow" : "") + (this.cls ? " " + this.cls : ""); + el.innerHTML = String.format( + '{1}', + this.icon || Ext.BLANK_IMAGE_URL, this.text, this.iconCls || ''); + this.el = el; + Ext.menu.Item.superclass.onRender.call(this, container, position); + }, + + + setText : function(text){ + this.text = text; + if(this.rendered){ + this.el.update(String.format( + '{1}', + this.icon || Ext.BLANK_IMAGE_URL, this.text, this.iconCls || '')); + this.parentMenu.autoWidth(); + } + }, + + handleClick : function(e){ + if(!this.href){ e.stopEvent(); + } + Ext.menu.Item.superclass.handleClick.apply(this, arguments); + }, + + activate : function(autoExpand){ + if(Ext.menu.Item.superclass.activate.apply(this, arguments)){ + this.focus(); + if(autoExpand){ + this.expandMenu(); + } + } + return true; + }, + + shouldDeactivate : function(e){ + if(Ext.menu.Item.superclass.shouldDeactivate.call(this, e)){ + if(this.menu && this.menu.isVisible()){ + return !this.menu.getEl().getRegion().contains(e.getPoint()); + } + return true; + } + return false; + }, + + deactivate : function(){ + Ext.menu.Item.superclass.deactivate.apply(this, arguments); + this.hideMenu(); + }, + + expandMenu : function(autoActivate){ + if(!this.disabled && this.menu){ + clearTimeout(this.hideTimer); + delete this.hideTimer; + if(!this.menu.isVisible() && !this.showTimer){ + this.showTimer = this.deferExpand.defer(this.showDelay, this, [autoActivate]); + }else if (this.menu.isVisible() && autoActivate){ + this.menu.tryActivate(0, 1); + } + } + }, + + deferExpand : function(autoActivate){ + delete this.showTimer; + this.menu.show(this.container, this.parentMenu.subMenuAlign || "tl-tr?", this.parentMenu); + if(autoActivate){ + this.menu.tryActivate(0, 1); + } + }, + + hideMenu : function(){ + clearTimeout(this.showTimer); + delete this.showTimer; + if(!this.hideTimer && this.menu && this.menu.isVisible()){ + this.hideTimer = this.deferHide.defer(this.hideDelay, this); + } + }, + + deferHide : function(){ + delete this.hideTimer; + this.menu.hide(); + } +}); + +Ext.menu.CheckItem = function(config){ + Ext.menu.CheckItem.superclass.constructor.call(this, config); + this.addEvents({ + + "beforecheckchange" : true, + + "checkchange" : true + }); + if(this.checkHandler){ + this.on('checkchange', this.checkHandler, this.scope); + } +}; +Ext.extend(Ext.menu.CheckItem, Ext.menu.Item, { + + + itemCls : "x-menu-item x-menu-check-item", + + groupClass : "x-menu-group-item", + + + checked: false, + + ctype: "Ext.menu.CheckItem", + + onRender : function(c){ + Ext.menu.CheckItem.superclass.onRender.apply(this, arguments); + if(this.group){ + this.el.addClass(this.groupClass); + } + Ext.menu.MenuMgr.registerCheckable(this); + if(this.checked){ + this.checked = false; + this.setChecked(true, true); + } + }, + + destroy : function(){ + if(this.rendered){ + Ext.menu.MenuMgr.unregisterCheckable(this); + } + Ext.menu.CheckItem.superclass.destroy.apply(this, arguments); + }, + + + setChecked : function(state, suppressEvent){ + if(this.checked != state && this.fireEvent("beforecheckchange", this, state) !== false){ + if(this.container){ + this.container[state ? "addClass" : "removeClass"]("x-menu-item-checked"); + } + this.checked = state; + if(suppressEvent !== true){ + this.fireEvent("checkchange", this, state); + } + } + }, + + handleClick : function(e){ + if(!this.disabled && !(this.checked && this.group)){ this.setChecked(!this.checked); + } + Ext.menu.CheckItem.superclass.handleClick.apply(this, arguments); + } +}); + +Ext.menu.Adapter = function(component, config){ + Ext.menu.Adapter.superclass.constructor.call(this, config); + this.component = component; +}; +Ext.extend(Ext.menu.Adapter, Ext.menu.BaseItem, { + canActivate : true, + + onRender : function(container, position){ + this.component.render(container); + this.el = this.component.getEl(); + }, + + activate : function(){ + if(this.disabled){ + return false; + } + this.component.focus(); + this.fireEvent("activate", this); + return true; + }, + + deactivate : function(){ + this.fireEvent("deactivate", this); + }, + + disable : function(){ + this.component.disable(); + Ext.menu.Adapter.superclass.disable.call(this); + }, + + enable : function(){ + this.component.enable(); + Ext.menu.Adapter.superclass.enable.call(this); + } +}); + +Ext.menu.DateItem = function(config){ + Ext.menu.DateItem.superclass.constructor.call(this, new Ext.DatePicker(config), config); + + this.picker = this.component; + this.addEvents({select: true}); + + this.picker.on("render", function(picker){ + picker.getEl().swallowEvent("click"); + picker.container.addClass("x-menu-date-item"); + }); + + this.picker.on("select", this.onSelect, this); +}; + +Ext.extend(Ext.menu.DateItem, Ext.menu.Adapter, { + onSelect : function(picker, date){ + this.fireEvent("select", this, date, picker); + Ext.menu.DateItem.superclass.handleClick.call(this); + } +}); + +Ext.menu.ColorItem = function(config){ + Ext.menu.ColorItem.superclass.constructor.call(this, new Ext.ColorPalette(config), config); + + this.palette = this.component; + this.relayEvents(this.palette, ["select"]); + if(this.selectHandler){ + this.on('select', this.selectHandler, this.scope); + } +}; +Ext.extend(Ext.menu.ColorItem, Ext.menu.Adapter); + +Ext.menu.DateMenu = function(config){ + Ext.menu.DateMenu.superclass.constructor.call(this, config); + this.plain = true; + var di = new Ext.menu.DateItem(config); + this.add(di); + + this.picker = di.picker; + + this.relayEvents(di, ["select"]); + + this.on('beforeshow', function(){ + if(this.picker){ + this.picker.hideMonthPicker(true); + } + }, this); +}; +Ext.extend(Ext.menu.DateMenu, Ext.menu.Menu, { + cls:'x-date-menu' +}); + +Ext.menu.ColorMenu = function(config){ + Ext.menu.ColorMenu.superclass.constructor.call(this, config); + this.plain = true; + var ci = new Ext.menu.ColorItem(config); + this.add(ci); + + this.palette = ci.palette; + + this.relayEvents(ci, ["select"]); +}; +Ext.extend(Ext.menu.ColorMenu, Ext.menu.Menu); + +Ext.form.Field = function(config){ + Ext.form.Field.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.Field, 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, + + + inputType : undefined, + + + tabIndex : undefined, + + isFormField : true, + + hasFocus : false, + + + value : undefined, + + + + + initComponent : function(){ + Ext.form.Field.superclass.initComponent.call(this); + this.addEvents({ + + focus : true, + + blur : true, + + specialkey : true, + + change : true, + + invalid : true, + + valid : true + }); + }, + + + getName: function(){ + return this.rendered && this.el.dom.name ? this.el.dom.name : (this.hiddenName || ''); + }, + + onRender : function(ct, position){ + Ext.form.Field.superclass.onRender.call(this, ct, position); + if(!this.el){ + var cfg = this.getAutoCreate(); + if(!cfg.name){ + cfg.name = this.name || this.id; + } + if(this.inputType){ + cfg.type = this.inputType; + } + this.el = ct.createChild(cfg, position); + } + var type = this.el.dom.type; + if(type){ + if(type == 'password'){ + type = 'text'; + } + this.el.addClass('x-form-'+type); + } + if(this.readOnly){ + this.el.dom.readOnly = true; + } + if(this.tabIndex !== undefined){ + this.el.dom.setAttribute('tabIndex', this.tabIndex); + } + + this.el.addClass([this.fieldClass, this.cls]); + this.initValue(); + }, + + + applyTo : function(target){ + this.allowDomMove = false; + this.el = Ext.get(target); + this.render(this.el.dom.parentNode); + return this; + }, + + initValue : function(){ + if(this.value !== undefined){ + this.setValue(this.value); + }else if(this.el.dom.value.length > 0){ + this.setValue(this.el.dom.value); + } + }, + + + isDirty : function() { + if(this.disabled) { + return false; + } + return String(this.getValue()) !== String(this.originalValue); + }, + + afterRender : function(){ + Ext.form.Field.superclass.afterRender.call(this); + this.initEvents(); + }, + + fireKey : function(e){ + if(e.isNavKeyPress()){ + this.fireEvent("specialkey", this, e); + } + }, + + + reset : function(){ + this.setValue(this.originalValue); + this.clearInvalid(); + }, + + initEvents : function(){ + this.el.on(Ext.isIE ? "keydown" : "keypress", this.fireKey, this); + this.el.on("focus", this.onFocus, this); + this.el.on("blur", this.onBlur, this); + + this.originalValue = this.getValue(); + }, + + onFocus : function(){ + if(!Ext.isOpera && 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(!Ext.isOpera && this.focusClass){ this.el.removeClass(this.focusClass); + } + this.hasFocus = false; + if(this.validationEvent !== false && this.validateOnBlur && this.validationEvent != "blur"){ + this.validate(); + } + var v = this.getValue(); + if(String(v) !== String(this.startValue)){ + this.fireEvent('change', this, v, this.startValue); + } + this.fireEvent("blur", this); + }, + + + isValid : function(preventMark){ + if(this.disabled){ + return true; + } + var restore = this.preventMark; + this.preventMark = preventMark === true; + var v = this.validateValue(this.processValue(this.getRawValue())); + this.preventMark = restore; + return v; + }, + + + validate : function(){ + if(this.disabled || this.validateValue(this.processValue(this.getRawValue()))){ + this.clearInvalid(); + return true; + } + return false; + }, + + processValue : function(value){ + return value; + }, + + validateValue : function(value){ + return true; + }, + + + markInvalid : function(msg){ + if(!this.rendered || this.preventMark){ return; + } + this.el.addClass(this.invalidClass); + msg = msg || this.invalidText; + switch(this.msgTarget){ + case 'qtip': + this.el.dom.qtip = msg; + this.el.dom.qclass = 'x-form-invalid-tip'; + if(Ext.QuickTips){ Ext.QuickTips.enable(); + } + break; + case 'title': + this.el.dom.title = msg; + break; + case 'under': + if(!this.errorEl){ + var elp = this.el.findParent('.x-form-element', 5, true); + this.errorEl = elp.createChild({cls:'x-form-invalid-msg'}); + this.errorEl.setWidth(elp.getWidth(true)-20); + } + this.errorEl.update(msg); + Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this); + break; + case 'side': + if(!this.errorIcon){ + var elp = this.el.findParent('.x-form-element', 5, true); + this.errorIcon = elp.createChild({cls:'x-form-invalid-icon'}); + } + this.alignErrorIcon(); + this.errorIcon.dom.qtip = msg; + this.errorIcon.dom.qclass = 'x-form-invalid-tip'; + this.errorIcon.show(); + this.on('resize', this.alignErrorIcon, this); + break; + default: + var t = Ext.getDom(this.msgTarget); + t.innerHTML = msg; + t.style.display = this.msgDisplay; + break; + } + this.fireEvent('invalid', this, msg); + }, + + alignErrorIcon : function(){ + this.errorIcon.alignTo(this.el, 'tl-tr', [2, 0]); + }, + + + clearInvalid : function(){ + if(!this.rendered || this.preventMark){ return; + } + this.el.removeClass(this.invalidClass); + switch(this.msgTarget){ + case 'qtip': + this.el.dom.qtip = ''; + break; + case 'title': + this.el.dom.title = ''; + break; + case 'under': + if(this.errorEl){ + Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this); + } + break; + case 'side': + if(this.errorIcon){ + this.errorIcon.dom.qtip = ''; + this.errorIcon.hide(); + this.un('resize', this.alignErrorIcon, this); + } + break; + default: + var t = Ext.getDom(this.msgTarget); + t.innerHTML = ''; + t.style.display = 'none'; + break; + } + this.fireEvent('valid', this); + }, + + + getRawValue : function(){ + var v = this.el.getValue(); + if(v === this.emptyText){ + v = ''; + } + return v; + }, + + + getValue : function(){ + var v = this.el.getValue(); + if(v === this.emptyText || v === undefined){ + v = ''; + } + return v; + }, + + + setRawValue : function(v){ + return this.el.dom.value = (v === null || v === undefined ? '' : v); + }, + + + setValue : function(v){ + this.value = v; + if(this.rendered){ + this.el.dom.value = (v === null || v === undefined ? '' : v); + this.validate(); + } + }, + + adjustSize : function(w, h){ + var s = Ext.form.Field.superclass.adjustSize.call(this, w, h); + s.width = this.adjustWidth(this.el.dom.tagName, s.width); + return s; + }, + + adjustWidth : function(tag, w){ + tag = tag.toLowerCase(); + if(typeof w == 'number' && Ext.isStrict && !Ext.isSafari){ + if(Ext.isIE && (tag == 'input' || tag == 'textarea')){ + if(tag == 'input'){ + return w + 2; + } + if(tag = 'textarea'){ + return w-2; + } + }else if(Ext.isOpera){ + if(tag == 'input'){ + return w + 2; + } + if(tag = 'textarea'){ + return w-2; + } + } + } + return w; + } +}); + + +Ext.form.Field.msgFx = { + normal : { + show: function(msgEl, f){ + msgEl.setDisplayed('block'); + }, + + hide : function(msgEl, f){ + msgEl.setDisplayed(false).update(''); + } + }, + + slide : { + show: function(msgEl, f){ + msgEl.slideIn('t', {stopFx:true}); + }, + + hide : function(msgEl, f){ + msgEl.slideOut('t', {stopFx:true,useDisplay:true}); + } + }, + + slideRight : { + show: function(msgEl, f){ + msgEl.fixDisplay(); + msgEl.alignTo(f.el, 'tl-tr'); + msgEl.slideIn('l', {stopFx:true}); + }, + + hide : function(msgEl, f){ + msgEl.slideOut('l', {stopFx:true,useDisplay:true}); + } + } +}; + +Ext.form.TextField = function(config){ + Ext.form.TextField.superclass.constructor.call(this, config); + this.addEvents({ + + autosize : true + }); +}; + +Ext.extend(Ext.form.TextField, 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', + + initEvents : function(){ + Ext.form.TextField.superclass.initEvents.call(this); + if(this.validationEvent == 'keyup'){ + this.validationTask = new Ext.util.DelayedTask(this.validate, this); + this.el.on('keyup', this.filterValidation, this); + } + else if(this.validationEvent !== false){ + this.el.on(this.validationEvent, this.validate, this, {buffer: this.validationDelay}); + } + if(this.selectOnFocus || this.emptyText){ + this.on("focus", this.preFocus, this); + if(this.emptyText){ + this.on('blur', this.postBlur, this); + this.applyEmptyText(); + } + } + if(this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype+'Mask']))){ + this.el.on("keypress", this.filterKeys, this); + } + if(this.grow){ + this.el.on("keyup", this.onKeyUp, this, {buffer:50}); + this.el.on("click", this.autoSize, this); + } + }, + + processValue : function(value){ + if(this.stripCharsRe){ + var newValue = value.replace(this.stripCharsRe, ''); + if(newValue !== value){ + this.setRawValue(newValue); + return newValue; + } + } + return value; + }, + + filterValidation : function(e){ + if(!e.isNavKeyPress()){ + this.validationTask.delay(this.validationDelay); + } + }, + + onKeyUp : function(e){ + if(!e.isNavKeyPress()){ + this.autoSize(); + } + }, + + + reset : function(){ + Ext.form.TextField.superclass.reset.call(this); + this.applyEmptyText(); + }, + + applyEmptyText : function(){ + if(this.rendered && this.emptyText && this.getRawValue().length < 1){ + this.setRawValue(this.emptyText); + this.el.addClass(this.emptyClass); + } + }, + + preFocus : function(){ + if(this.emptyText){ + if(this.el.dom.value == this.emptyText){ + this.setRawValue(''); + } + this.el.removeClass(this.emptyClass); + } + if(this.selectOnFocus){ + this.el.dom.select(); + } + }, + + postBlur : function(){ + this.applyEmptyText(); + }, + + filterKeys : function(e){ + var k = e.getKey(); + if(!Ext.isIE && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){ + return; + } + var c = e.getCharCode(), cc = String.fromCharCode(c); + if(Ext.isIE && (e.isSpecialKey() || !cc)){ + return; + } + if(!this.maskRe.test(cc)){ + e.stopEvent(); + } + }, + + setValue : function(v){ + if(this.emptyText && this.el && v !== undefined && v !== null && v !== ''){ + this.el.removeClass(this.emptyClass); + } + Ext.form.TextField.superclass.setValue.apply(this, arguments); + this.applyEmptyText(); + this.autoSize(); + }, + + + validateValue : function(value){ + if(value.length < 1 || value === this.emptyText){ if(this.allowBlank){ + this.clearInvalid(); + return true; + }else{ + this.markInvalid(this.blankText); + return false; + } + } + if(value.length < this.minLength){ + this.markInvalid(String.format(this.minLengthText, this.minLength)); + return false; + } + if(value.length > this.maxLength){ + this.markInvalid(String.format(this.maxLengthText, this.maxLength)); + return false; + } + if(this.vtype){ + var vt = Ext.form.VTypes; + if(!vt[this.vtype](value, this)){ + this.markInvalid(this.vtypeText || vt[this.vtype +'Text']); + return false; + } + } + if(typeof this.validator == "function"){ + var msg = this.validator(value); + if(msg !== true){ + this.markInvalid(msg); + return false; + } + } + if(this.regex && !this.regex.test(value)){ + this.markInvalid(this.regexText); + return false; + } + return true; + }, + + + selectText : function(start, end){ + var v = this.getRawValue(); + if(v.length > 0){ + start = start === undefined ? 0 : start; + end = end === undefined ? v.length : end; + var d = this.el.dom; + if(d.setSelectionRange){ + d.setSelectionRange(start, end); + }else if(d.createTextRange){ + var range = d.createTextRange(); + range.moveStart("character", start); + range.moveEnd("character", v.length-end); + range.select(); + } + } + }, + + + autoSize : function(){ + if(!this.grow || !this.rendered){ + return; + } + if(!this.metrics){ + this.metrics = Ext.util.TextMetrics.createInstance(this.el); + } + var el = this.el; + var v = el.dom.value; + var d = document.createElement('div'); + d.appendChild(document.createTextNode(v)); + v = d.innerHTML; + d = null; + v += " "; + var w = Math.min(this.growMax, Math.max(this.metrics.getWidth(v) + 10, this.growMin)); + this.el.setWidth(w); + this.fireEvent("autosize", this, w); + } +}); + +Ext.form.TriggerField = function(config){ + this.mimicing = false; + Ext.form.TriggerField.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.TriggerField, Ext.form.TextField, { + + + defaultAutoCreate : {tag: "input", type: "text", size: "16", autocomplete: "off"}, + + hideTrigger:false, + + + + + + + autoSize: Ext.emptyFn, + monitorTab : true, + deferHeight : true, + + onResize : function(w, h){ + Ext.form.TriggerField.superclass.onResize.apply(this, arguments); + if(typeof w == 'number'){ + this.el.setWidth(this.adjustWidth('input', w - this.trigger.getWidth())); + } + }, + + adjustSize : Ext.BoxComponent.prototype.adjustSize, + + getResizeEl : function(){ + return this.wrap; + }, + + getPositionEl : function(){ + return this.wrap; + }, + + alignErrorIcon : function(){ + this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]); + }, + + onRender : function(ct, position){ + Ext.form.TriggerField.superclass.onRender.call(this, ct, position); + this.wrap = this.el.wrap({cls: "x-form-field-wrap"}); + this.trigger = this.wrap.createChild(this.triggerConfig || + {tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger " + this.triggerClass}); + if(this.hideTrigger){ + this.trigger.setDisplayed(false); + } + this.initTrigger(); + if(!this.width){ + this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth()); + } + }, + + initTrigger : function(){ + this.trigger.on("click", this.onTriggerClick, this, {preventDefault:true}); + this.trigger.addClassOnOver('x-form-trigger-over'); + this.trigger.addClassOnClick('x-form-trigger-click'); + }, + + onDestroy : function(){ + if(this.trigger){ + this.trigger.removeAllListeners(); + this.trigger.remove(); + } + if(this.wrap){ + this.wrap.remove(); + } + Ext.form.TriggerField.superclass.onDestroy.call(this); + }, + + onFocus : function(){ + Ext.form.TriggerField.superclass.onFocus.call(this); + if(!this.mimicing){ + this.wrap.addClass('x-trigger-wrap-focus'); + this.mimicing = true; + Ext.get(Ext.isIE ? document.body : document).on("mousedown", this.mimicBlur, this); + if(this.monitorTab){ + this.el.on("keydown", this.checkTab, this); + } + } + }, + + checkTab : function(e){ + if(e.getKey() == e.TAB){ + this.triggerBlur(); + } + }, + + onBlur : function(){ + }, + + mimicBlur : function(e, t){ + if(!this.wrap.contains(t) && this.validateBlur()){ + this.triggerBlur(); + } + }, + + triggerBlur : function(){ + this.mimicing = false; + Ext.get(Ext.isIE ? document.body : document).un("mousedown", this.mimicBlur); + if(this.monitorTab){ + this.el.un("keydown", this.checkTab, this); + } + this.wrap.removeClass('x-trigger-wrap-focus'); + Ext.form.TriggerField.superclass.onBlur.call(this); + }, + + validateBlur : function(e, t){ + return true; + }, + + onDisable : function(){ + Ext.form.TriggerField.superclass.onDisable.call(this); + if(this.wrap){ + this.wrap.addClass('x-item-disabled'); + } + }, + + onEnable : function(){ + Ext.form.TriggerField.superclass.onEnable.call(this); + if(this.wrap){ + this.wrap.removeClass('x-item-disabled'); + } + }, + + onShow : function(){ + if(this.wrap){ + this.wrap.dom.style.display = ''; + this.wrap.dom.style.visibility = 'visible'; + } + }, + + onHide : function(){ + this.wrap.dom.style.display = 'none'; + }, + + + 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, cls: "x-form-trigger " + this.trigger1Class}, + {tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger " + this.trigger2Class} + ]}; + }, + + getTrigger : function(index){ + return this.triggers[index]; + }, + + initTrigger : function(){ + var ts = this.trigger.select('.x-form-trigger', true); + this.wrap.setStyle('overflow', 'hidden'); + var triggerField = this; + ts.each(function(t, all, index){ + t.hide = function(){ + var w = triggerField.wrap.getWidth(); + this.dom.style.display = 'none'; + triggerField.el.setWidth(w-triggerField.trigger.getWidth()); + }; + t.show = function(){ + var w = triggerField.wrap.getWidth(); + this.dom.style.display = ''; + triggerField.el.setWidth(w-triggerField.trigger.getWidth()); + }; + var triggerIndex = 'Trigger'+(index+1); + + if(this['hide'+triggerIndex]){ + t.dom.style.display = 'none'; + } + t.on("click", this['on'+triggerIndex+'Click'], this, {preventDefault:true}); + t.addClassOnOver('x-form-trigger-over'); + t.addClassOnClick('x-form-trigger-click'); + }, this); + this.triggers = ts.elements; + }, + + onTrigger1Click : Ext.emptyFn, + onTrigger2Click : Ext.emptyFn +}); + +Ext.form.TextArea = function(config){ + Ext.form.TextArea.superclass.constructor.call(this, config); + if(this.minHeight !== undefined){ + this.growMin = this.minHeight; + } + if(this.maxHeight !== undefined){ + this.growMax = this.maxHeight; + } +}; + +Ext.extend(Ext.form.TextArea, Ext.form.TextField, { + + growMin : 60, + + growMax: 1000, + + preventScrollbars: false, + + + onRender : function(ct, position){ + if(!this.el){ + this.defaultAutoCreate = { + tag: "textarea", + style:"width:300px;height:60px;", + autocomplete: "off" + }; + } + Ext.form.TextArea.superclass.onRender.call(this, ct, position); + if(this.grow){ + this.textSizeEl = Ext.DomHelper.append(document.body, { + tag: "pre", cls: "x-form-grow-sizer" + }); + if(this.preventScrollbars){ + this.el.setStyle("overflow", "hidden"); + } + this.el.setHeight(this.growMin); + } + }, + + onDestroy : function(){ + if(this.textSizeEl){ + this.textSizeEl.parentNode.removeChild(this.textSizeEl); + } + Ext.form.TextArea.superclass.onDestroy.call(this); + }, + + onKeyUp : function(e){ + if(!e.isNavKeyPress() || e.getKey() == e.ENTER){ + this.autoSize(); + } + }, + + + autoSize : function(){ + if(!this.grow || !this.textSizeEl){ + return; + } + var el = this.el; + var v = el.dom.value; + var ts = this.textSizeEl; + + ts.innerHTML = ''; + ts.appendChild(document.createTextNode(v)); + v = ts.innerHTML; + + Ext.fly(ts).setWidth(this.el.getWidth()); + if(v.length < 1){ + v = "  "; + }else{ + if(Ext.isIE){ + v = v.replace(/\n/g, '

     

    '); + } + v += " \n "; + } + ts.innerHTML = v; + var h = Math.min(this.growMax, Math.max(ts.offsetHeight, this.growMin)); + if(h != this.lastHeight){ + this.lastHeight = h; + this.el.setHeight(h); + this.fireEvent("autosize", this, h); + } + } +}); + +Ext.form.NumberField = function(config){ + Ext.form.NumberField.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.NumberField, 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", + + initEvents : function(){ + Ext.form.NumberField.superclass.initEvents.call(this); + var allowed = "0123456789"; + if(this.allowDecimals){ + allowed += this.decimalSeparator; + } + if(this.allowNegative){ + allowed += "-"; + } + this.stripCharsRe = new RegExp('[^'+allowed+']', 'gi'); + var keyPress = function(e){ + var k = e.getKey(); + if(!Ext.isIE && (e.isSpecialKey() || k == e.BACKSPACE || k == e.DELETE)){ + return; + } + var c = e.getCharCode(); + if(allowed.indexOf(String.fromCharCode(c)) === -1){ + e.stopEvent(); + } + }; + this.el.on("keypress", keyPress, this); + }, + + validateValue : function(value){ + if(!Ext.form.NumberField.superclass.validateValue.call(this, value)){ + return false; + } + if(value.length < 1){ return true; + } + var num = this.parseValue(value); + if(isNaN(num)){ + this.markInvalid(String.format(this.nanText, value)); + return false; + } + if(num < this.minValue){ + this.markInvalid(String.format(this.minText, this.minValue)); + return false; + } + if(num > this.maxValue){ + this.markInvalid(String.format(this.maxText, this.maxValue)); + return false; + } + return true; + }, + + getValue : function(){ + return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this))); + }, + + parseValue : function(value){ + value = parseFloat(String(value).replace(this.decimalSeparator, ".")); + return isNaN(value) ? '' : value; + }, + + fixPrecision : function(value){ + var nan = isNaN(value); + if(!this.allowDecimals || this.decimalPrecision == -1 || nan || !value){ + return nan ? '' : value; + } + return parseFloat(value).toFixed(this.decimalPrecision); + }, + + setValue : function(v){ + Ext.form.NumberField.superclass.setValue.call(this, String(v).replace(".", this.decimalSeparator)); + }, + + decimalPrecisionFcn : function(v){ + return Math.floor(v); + }, + + beforeBlur : function(){ + var v = this.parseValue(this.getRawValue()); + if(v){ + this.setValue(this.fixPrecision(v)); + } + } +}); + +Ext.form.DateField = function(config){ + Ext.form.DateField.superclass.constructor.call(this, config); + if(typeof this.minValue == "string") this.minValue = this.parseDate(this.minValue); + if(typeof this.maxValue == "string") this.maxValue = this.parseDate(this.maxValue); + this.ddMatch = null; + if(this.disabledDates){ + var dd = this.disabledDates; + var re = "(?:"; + for(var i = 0; i < dd.length; i++){ + re += dd[i]; + if(i != dd.length-1) re += "|"; + } + this.ddMatch = new RegExp(re + ")"); + } +}; + +Ext.extend(Ext.form.DateField, Ext.form.TriggerField, { + + format : "m/d/y", + + altFormats : "m/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d", + + disabledDays : null, + + disabledDaysText : "Disabled", + + disabledDates : null, + + disabledDatesText : "Disabled", + + minValue : null, + + maxValue : null, + + 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', + + + defaultAutoCreate : {tag: "input", type: "text", size: "10", autocomplete: "off"}, + + validateValue : function(value){ + value = this.formatDate(value); + if(!Ext.form.DateField.superclass.validateValue.call(this, value)){ + return false; + } + if(value.length < 1){ return true; + } + var svalue = value; + value = this.parseDate(value); + if(!value){ + this.markInvalid(String.format(this.invalidText, svalue, this.format)); + return false; + } + var time = value.getTime(); + if(this.minValue && time < this.minValue.getTime()){ + this.markInvalid(String.format(this.minText, this.formatDate(this.minValue))); + return false; + } + if(this.maxValue && time > this.maxValue.getTime()){ + this.markInvalid(String.format(this.maxText, this.formatDate(this.maxValue))); + return false; + } + if(this.disabledDays){ + var day = value.getDay(); + for(var i = 0; i < this.disabledDays.length; i++) { + if(day === this.disabledDays[i]){ + this.markInvalid(this.disabledDaysText); + return false; + } + } + } + var fvalue = this.formatDate(value); + if(this.ddMatch && this.ddMatch.test(fvalue)){ + this.markInvalid(String.format(this.disabledDatesText, fvalue)); + return false; + } + return true; + }, + + validateBlur : function(){ + return !this.menu || !this.menu.isVisible(); + }, + + + getValue : function(){ + return this.parseDate(Ext.form.DateField.superclass.getValue.call(this)) || ""; + }, + + + setValue : function(date){ + Ext.form.DateField.superclass.setValue.call(this, this.formatDate(this.parseDate(date))); + }, + + parseDate : function(value){ + if(!value || value instanceof Date){ + return value; + } + var v = Date.parseDate(value, this.format); + if(!v && this.altFormats){ + if(!this.altFormatsArray){ + this.altFormatsArray = this.altFormats.split("|"); + } + for(var i = 0, len = this.altFormatsArray.length; i < len && !v; i++){ + v = Date.parseDate(value, this.altFormatsArray[i]); + } + } + return v; + }, + + formatDate : function(date){ + return (!date || !(date instanceof Date)) ? + date : date.dateFormat(this.format); + }, + + menuListeners : { + select: function(m, d){ + this.setValue(d); + }, + show : function(){ this.onFocus(); + }, + hide : function(){ + this.focus.defer(10, this); + var ml = this.menuListeners; + this.menu.un("select", ml.select, this); + this.menu.un("show", ml.show, this); + this.menu.un("hide", ml.hide, this); + } + }, + + onTriggerClick : function(){ + if(this.disabled){ + return; + } + if(this.menu == null){ + this.menu = new Ext.menu.DateMenu(); + } + Ext.apply(this.menu.picker, { + minDate : this.minValue, + maxDate : this.maxValue, + disabledDatesRE : this.ddMatch, + disabledDatesText : this.disabledDatesText, + disabledDays : this.disabledDays, + disabledDaysText : this.disabledDaysText, + format : this.format, + minText : String.format(this.minText, this.formatDate(this.minValue)), + maxText : String.format(this.maxText, this.formatDate(this.maxValue)) + }); + this.menu.on(Ext.apply({}, this.menuListeners, { + scope:this + })); + this.menu.picker.setValue(this.getValue() || new Date()); + this.menu.show(this.el, "tl-bl?"); + }, + + beforeBlur : function(){ + var v = this.parseDate(this.getRawValue()); + if(v){ + this.setValue(v); + } + } + + + + + +}); + +Ext.form.ComboBox = function(config){ + Ext.form.ComboBox.superclass.constructor.call(this, config); + this.addEvents({ + + 'expand' : true, + + 'collapse' : true, + + 'beforeselect' : true, + + 'select' : true, + + 'beforequery': true + }); + if(this.transform){ + this.allowDomMove = false; + var s = Ext.getDom(this.transform); + if(!this.hiddenName){ + this.hiddenName = s.name; + } + if(!this.store){ + this.mode = 'local'; + var d = [], opts = s.options; + for(var i = 0, len = opts.length;i < len; i++){ + var o = opts[i]; + var value = (Ext.isIE ? o.getAttributeNode('value').specified : o.hasAttribute('value')) ? o.value : o.text; + if(o.selected) { + this.value = value; + } + d.push([value, o.text]); + } + this.store = new Ext.data.SimpleStore({ + 'id': 0, + fields: ['value', 'text'], + data : d + }); + this.valueField = 'value'; + this.displayField = 'text'; + } + s.name = Ext.id(); if(!this.lazyRender){ + this.target = true; + this.el = Ext.DomHelper.insertBefore(s, this.autoCreate || this.defaultAutoCreate); + s.parentNode.removeChild(s); this.render(this.el.parentNode); + }else{ + s.parentNode.removeChild(s); } + + } + this.selectedIndex = -1; + if(this.mode == 'local'){ + if(config.queryDelay === undefined){ + this.queryDelay = 10; + } + if(config.minChars === undefined){ + this.minChars = 0; + } + } +}; + +Ext.extend(Ext.form.ComboBox, Ext.form.TriggerField, { + + + + + + + defaultAutoCreate : {tag: "input", type: "text", size: "24", autocomplete: "off"}, + + listWidth: undefined, + + displayField: undefined, + + valueField: undefined, + + hiddenName: undefined, + + listClass: '', + + selectedClass: 'x-combo-selected', + + triggerClass : 'x-form-arrow-trigger', + + shadow:'sides', + + listAlign: 'tl-bl?', + + maxHeight: 300, + + triggerAction: 'query', + + minChars : 4, + + typeAhead: false, + + queryDelay: 500, + + pageSize: 0, + + selectOnFocus:false, + + queryParam: 'query', + + loadingText: 'Loading...', + + resizable: false, + + handleHeight : 8, + + editable: true, + + allQuery: '', + + mode: 'remote', + + minListWidth : 70, + + forceSelection:false, + + typeAheadDelay : 250, + + valueNotFoundText : undefined, + + onRender : function(ct, position){ + Ext.form.ComboBox.superclass.onRender.call(this, ct, position); + if(this.hiddenName){ + this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName, id: (this.hiddenId||this.hiddenName)}, + 'before', true); + this.hiddenField.value = + this.hiddenValue !== undefined ? this.hiddenValue : + this.value !== undefined ? this.value : ''; + + this.el.dom.removeAttribute('name'); + } + if(Ext.isGecko){ + this.el.dom.setAttribute('autocomplete', 'off'); + } + + var cls = 'x-combo-list'; + + this.list = new Ext.Layer({ + shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false + }); + + var lw = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth); + this.list.setWidth(lw); + this.list.swallowEvent('mousewheel'); + this.assetHeight = 0; + + if(this.title){ + this.header = this.list.createChild({cls:cls+'-hd', html: this.title}); + this.assetHeight += this.header.getHeight(); + } + + this.innerList = this.list.createChild({cls:cls+'-inner'}); + this.innerList.on('mouseover', this.onViewOver, this); + this.innerList.on('mousemove', this.onViewMove, this); + this.innerList.setWidth(lw - this.list.getFrameWidth('lr')) + + if(this.pageSize){ + this.footer = this.list.createChild({cls:cls+'-ft'}); + this.pageTb = new Ext.PagingToolbar(this.footer, this.store, + {pageSize: this.pageSize}); + this.assetHeight += this.footer.getHeight(); + } + + if(!this.tpl){ + this.tpl = '
    {' + this.displayField + '}
    '; + } + + this.view = new Ext.View(this.innerList, this.tpl, { + singleSelect:true, store: this.store, selectedClass: this.selectedClass + }); + + this.view.on('click', this.onViewClick, this); + + this.store.on('beforeload', this.onBeforeLoad, this); + this.store.on('load', this.onLoad, this); + this.store.on('loadexception', this.collapse, this); + + if(this.resizable){ + this.resizer = new Ext.Resizable(this.list, { + pinned:true, handles:'se' + }); + this.resizer.on('resize', function(r, w, h){ + this.maxHeight = h-this.handleHeight-this.list.getFrameWidth('tb')-this.assetHeight; + this.listWidth = w; + this.innerList.setWidth(w - this.list.getFrameWidth('lr')); + this.restrictHeight(); + }, this); + this[this.pageSize?'footer':'innerList'].setStyle('margin-bottom', this.handleHeight+'px'); + } + if(!this.editable){ + this.editable = true; + this.setEditable(false); + } + }, + + initEvents : function(){ + Ext.form.ComboBox.superclass.initEvents.call(this); + + this.keyNav = new Ext.KeyNav(this.el, { + "up" : function(e){ + this.inKeyMode = true; + this.selectPrev(); + }, + + "down" : function(e){ + if(!this.isExpanded()){ + this.onTriggerClick(); + }else{ + this.inKeyMode = true; + this.selectNext(); + } + }, + + "enter" : function(e){ + this.onViewClick(); + }, + + "esc" : function(e){ + this.collapse(); + }, + + "tab" : function(e){ + this.onViewClick(false); + return true; + }, + + scope : this, + + doRelay : function(foo, bar, hname){ + if(hname == 'down' || this.scope.isExpanded()){ + return Ext.KeyNav.prototype.doRelay.apply(this, arguments); + } + return true; + }, + + forceKeyDown: true + }); + 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.editable !== false){ + this.el.on("keyup", this.onKeyUp, this); + } + if(this.forceSelection){ + this.on('blur', this.doForce, this); + } + }, + + onDestroy : function(){ + if(this.view){ + this.view.setStore(null); + this.view.el.removeAllListeners(); + this.view.el.remove(); + this.view.purgeListeners(); + } + if(this.list){ + this.list.destroy(); + } + if(this.store){ + this.store.un('beforeload', this.onBeforeLoad, this); + this.store.un('load', this.onLoad, this); + this.store.un('loadexception', this.collapse, this); + } + Ext.form.ComboBox.superclass.onDestroy.call(this); + }, + + fireKey : function(e){ + if(e.isNavKeyPress() && !this.list.isVisible()){ + this.fireEvent("specialkey", this, e); + } + }, + + onResize: function(w, h){ + Ext.form.ComboBox.superclass.onResize.apply(this, arguments); + if(this.list && this.listWidth === undefined){ + var lw = Math.max(w, this.minListWidth); + this.list.setWidth(lw); + this.innerList.setWidth(lw - this.list.getFrameWidth('lr')); + } + }, + + + setEditable : function(value){ + if(value == this.editable){ + return; + } + this.editable = value; + if(!value){ + this.el.dom.setAttribute('readOnly', true); + this.el.on('mousedown', this.onTriggerClick, this); + this.el.addClass('x-combo-noedit'); + }else{ + this.el.dom.setAttribute('readOnly', false); + this.el.un('mousedown', this.onTriggerClick, this); + this.el.removeClass('x-combo-noedit'); + } + }, + + onBeforeLoad : function(){ + if(!this.hasFocus){ + return; + } + this.innerList.update(this.loadingText ? + '
    '+this.loadingText+'
    ' : ''); + this.restrictHeight(); + this.selectedIndex = -1; + }, + + onLoad : function(){ + if(!this.hasFocus){ + return; + } + if(this.store.getCount() > 0){ + this.expand(); + this.restrictHeight(); + if(this.lastQuery == this.allQuery){ + if(this.editable){ + this.el.dom.select(); + } + if(!this.selectByValue(this.value, true)){ + this.select(0, true); + } + }else{ + this.selectNext(); + if(this.typeAhead && this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE){ + this.taTask.delay(this.typeAheadDelay); + } + } + }else{ + this.onEmptyResults(); + } + }, + + onTypeAhead : function(){ + if(this.store.getCount() > 0){ + var r = this.store.getAt(0); + var newValue = r.data[this.displayField]; + var len = newValue.length; + var selStart = this.getRawValue().length; + if(selStart != len){ + this.setRawValue(newValue); + this.selectText(selStart, newValue.length); + } + } + }, + + onSelect : function(record, index){ + if(this.fireEvent('beforeselect', this, record, index) !== false){ + this.setValue(record.data[this.valueField || this.displayField]); + this.collapse(); + this.fireEvent('select', this, record, index); + } + }, + + + getValue : function(){ + if(this.valueField){ + return typeof this.value != 'undefined' ? 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(); + }, + + + setValue : function(v){ + var text = v; + if(this.valueField){ + var r = this.findRecord(this.valueField, v); + if(r){ + text = r.data[this.displayField]; + }else if(this.valueNotFoundText !== undefined){ + text = this.valueNotFoundText; + } + } + this.lastSelectionText = text; + if(this.hiddenField){ + this.hiddenField.value = v; + } + Ext.form.ComboBox.superclass.setValue.call(this, text); + this.value = v; + }, + + findRecord : function(prop, value){ + var record; + if(this.store.getCount() > 0){ + this.store.each(function(r){ + if(r.data[prop] == value){ + record = r; + return false; + } + }); + } + return record; + }, + + onViewMove : function(e, t){ + this.inKeyMode = false; + }, + + onViewOver : function(e, t){ + if(this.inKeyMode){ return; + } + var item = this.view.findItemFromChild(t); + if(item){ + var index = this.view.indexOf(item); + this.select(index, false); + } + }, + + onViewClick : function(doFocus){ + var index = this.view.getSelectedIndexes()[0]; + var r = this.store.getAt(index); + if(r){ + this.onSelect(r, index); + } + if(doFocus !== false){ + this.el.focus(); + } + }, + + restrictHeight : function(){ + this.innerList.dom.style.height = ''; + var inner = this.innerList.dom; + var h = Math.max(inner.clientHeight, inner.offsetHeight, inner.scrollHeight); + this.innerList.setHeight(h < this.maxHeight ? 'auto' : this.maxHeight); + this.list.beginUpdate(); + this.list.setHeight(this.innerList.getHeight()+this.list.getFrameWidth('tb')+(this.resizable?this.handleHeight:0)+this.assetHeight); + this.list.alignTo(this.el, this.listAlign); + this.list.endUpdate(); + }, + + onEmptyResults : function(){ + this.collapse(); + }, + + + isExpanded : function(){ + return this.list.isVisible(); + }, + + + selectByValue : function(v, scrollIntoView){ + if(v !== undefined && v !== null){ + var r = this.findRecord(this.valueField || this.displayField, v); + if(r){ + this.select(this.store.indexOf(r), scrollIntoView); + return true; + } + } + return false; + }, + + + select : function(index, scrollIntoView){ + this.selectedIndex = index; + this.view.select(index); + if(scrollIntoView !== false){ + var el = this.view.getNode(index); + if(el){ + this.innerList.scrollChildIntoView(el, false); + } + } + }, + + selectNext : function(){ + var ct = this.store.getCount(); + if(ct > 0){ + if(this.selectedIndex == -1){ + this.select(0); + }else if(this.selectedIndex < ct-1){ + this.select(this.selectedIndex+1); + } + } + }, + + selectPrev : function(){ + var ct = this.store.getCount(); + if(ct > 0){ + if(this.selectedIndex == -1){ + this.select(0); + }else if(this.selectedIndex != 0){ + this.select(this.selectedIndex-1); + } + } + }, + + onKeyUp : function(e){ + if(this.editable !== false && !e.isSpecialKey()){ + this.lastKey = e.getKey(); + this.dqTask.delay(this.queryDelay); + } + }, + + validateBlur : function(){ + return !this.list || !this.list.isVisible(); + }, + + initQuery : function(){ + this.doQuery(this.getRawValue()); + }, + + doForce : function(){ + if(this.el.dom.value.length > 0){ + this.el.dom.value = + this.lastSelectionText === undefined ? '' : this.lastSelectionText; + this.applyEmptyText(); + } + }, + + + doQuery : function(q, forceAll){ + if(q === undefined || q === null){ + q = ''; + } + var qe = { + query: q, + forceAll: forceAll, + combo: this, + cancel:false + }; + if(this.fireEvent('beforequery', qe)===false || qe.cancel){ + return false; + } + q = qe.query; + forceAll = qe.forceAll; + if(forceAll === true || (q.length >= this.minChars)){ + if(this.lastQuery != q){ + this.lastQuery = q; + if(this.mode == 'local'){ + this.selectedIndex = -1; + if(forceAll){ + this.store.clearFilter(); + }else{ + this.store.filter(this.displayField, q); + } + this.onLoad(); + }else{ + this.store.baseParams[this.queryParam] = q; + this.store.load({ + params: this.getParams(q) + }); + this.expand(); + } + }else{ + this.selectedIndex = -1; + this.onLoad(); + } + } + }, + + getParams : function(q){ + var p = {}; + if(this.pageSize){ + p.start = 0; + p.limit = this.pageSize; + } + return p; + }, + + + collapse : function(){ + if(!this.isExpanded()){ + return; + } + this.list.hide(); + Ext.get(document).un('mousedown', this.collapseIf, this); + Ext.get(document).un('mousewheel', this.collapseIf, this); + this.fireEvent('collapse', this); + }, + + collapseIf : function(e){ + if(!e.within(this.wrap) && !e.within(this.list)){ + this.collapse(); + } + }, + + + expand : function(){ + if(this.isExpanded() || !this.hasFocus){ + return; + } + this.list.alignTo(this.el, this.listAlign); + this.list.show(); + Ext.get(document).on('mousedown', this.collapseIf, this); + Ext.get(document).on('mousewheel', this.collapseIf, this); + this.fireEvent('expand', this); + }, + + onTriggerClick : function(){ + if(this.disabled){ + return; + } + if(this.isExpanded()){ + this.collapse(); + this.el.focus(); + }else { + this.hasFocus = true; + if(this.triggerAction == 'all') { + this.doQuery(this.allQuery, true); + } else { + this.doQuery(this.getRawValue()); + } + this.el.focus(); + } + } + + + + + +}); + +Ext.form.Checkbox = function(config){ + Ext.form.Checkbox.superclass.constructor.call(this, config); + this.addEvents({ + + check : true + }); +}; + +Ext.extend(Ext.form.Checkbox, Ext.form.Field, { + + focusClass : undefined, + + fieldClass: "x-form-field", + + checked: false, + + defaultAutoCreate : { tag: "input", type: 'checkbox', autocomplete: "off"}, + + boxLabel : undefined, + + onResize : function(){ + Ext.form.Checkbox.superclass.onResize.apply(this, arguments); + if(!this.boxLabel){ + this.el.alignTo(this.wrap, 'c-c'); + } + }, + + initEvents : function(){ + Ext.form.Checkbox.superclass.initEvents.call(this); + this.el.on("click", this.onClick, this); + this.el.on("change", this.onClick, this); + }, + + + getResizeEl : function(){ + return this.wrap; + }, + + getPositionEl : function(){ + return this.wrap; + }, + + onRender : function(ct, position){ + Ext.form.Checkbox.superclass.onRender.call(this, ct, position); + if(this.inputValue !== undefined){ + this.el.dom.value = this.inputValue; + } + this.wrap = this.el.wrap({cls: "x-form-check-wrap"}); + if(this.boxLabel){ + this.wrap.createChild({tag: 'label', htmlFor: this.el.id, cls: 'x-form-cb-label', html: this.boxLabel}); + } + if(this.checked){ + this.setValue(true); + }else{ + this.checked = this.el.dom.checked; + } + }, + + initValue : Ext.emptyFn, + + + getValue : function(){ + if(this.rendered){ + return this.el.dom.checked; + } + return false; + }, + + onClick : function(){ + if(this.el.dom.checked != this.checked){ + this.setValue(this.el.dom.checked); + } + }, + + + setValue : function(v){ + this.checked = (v === true || v === 'true' || v == '1' || String(v).toLowerCase() == 'on'); + if(this.el && this.el.dom){ + this.el.dom.checked = this.checked; + this.el.dom.defaultChecked = this.checked; + } + this.fireEvent("check", this, this.checked); + } +}); + +Ext.form.Radio = function(){ + Ext.form.Radio.superclass.constructor.apply(this, arguments); +}; +Ext.extend(Ext.form.Radio, Ext.form.Checkbox, { + inputType: 'radio', + + + getGroupValue : function(){ + return this.el.up('form').child('input[name='+this.el.dom.name+']:checked', true).value; + } +}); + +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', + + + 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: true, + + activate: true, + + beforesync: true, + + beforepush: true, + + sync: true, + + push: true, + + editmodechange: true + }) + }, + + createFontOptions : function(){ + var buf = [], fs = this.fontFamilies, ff, lc; + for(var i = 0, len = fs.length; i< len; i++){ + ff = fs[i]; + lc = ff.toLowerCase(); + buf.push( + '' + ); + } + return buf.join(''); + }, + + createToolbar : function(editor){ + + function btn(id, toggle, handler){ + return { + id : id, + cls : 'x-btn-icon x-edit-'+id, + enableToggle:toggle !== false, + scope: editor, + handler:handler||editor.relayBtnCmd, + clickEvent:'mousedown', + tooltip: editor.buttonTips[id] || undefined, + tabIndex:-1 + }; + } + + + var tb = new Ext.Toolbar(this.wrap.dom.firstChild); + + + tb.el.on('click', function(e){ + e.preventDefault(); + }); + + if(this.enableFont && !Ext.isSafari){ + this.fontSelect = tb.el.createChild({ + tag:'select', + tabIndex: -1, + cls:'x-font-select', + html: this.createFontOptions() + }); + this.fontSelect.on('change', function(){ + var font = this.fontSelect.dom.value; + this.relayCmd('fontname', font); + this.deferFocus(); + }, this); + tb.add( + this.fontSelect.dom, + '-' + ); + }; + + if(this.enableFormat){ + tb.add( + btn('bold'), + btn('italic'), + btn('underline') + ); + }; + + if(this.enableFontSize){ + tb.add( + '-', + btn('increasefontsize', false, this.adjustFont), + btn('decreasefontsize', false, this.adjustFont) + ); + }; + + if(this.enableColors){ + tb.add( + '-', { + id:'forecolor', + cls:'x-btn-icon x-edit-forecolor', + clickEvent:'mousedown', + tooltip: editor.buttonTips['forecolor'] || undefined, + tabIndex:-1, + menu : new Ext.menu.ColorMenu({ + allowReselect: true, + focus: Ext.emptyFn, + value:'000000', + plain:true, + selectHandler: function(cp, color){ + this.execCmd('forecolor', Ext.isSafari || Ext.isIE ? '#'+color : color); + this.deferFocus(); + }, + scope: this, + clickEvent:'mousedown' + }) + }, { + id:'backcolor', + cls:'x-btn-icon x-edit-backcolor', + clickEvent:'mousedown', + tooltip: editor.buttonTips['backcolor'] || undefined, + tabIndex:-1, + menu : new Ext.menu.ColorMenu({ + focus: Ext.emptyFn, + value:'FFFFFF', + plain:true, + allowReselect: true, + selectHandler: function(cp, color){ + if(Ext.isGecko){ + this.execCmd('useCSS', false); + this.execCmd('hilitecolor', color); + this.execCmd('useCSS', true); + this.deferFocus(); + }else{ + this.execCmd(Ext.isOpera ? 'hilitecolor' : 'backcolor', Ext.isSafari || Ext.isIE ? '#'+color : color); + this.deferFocus(); + } + }, + scope:this, + clickEvent:'mousedown' + }) + } + ); + }; + + if(this.enableAlignments){ + tb.add( + '-', + btn('justifyleft'), + btn('justifycenter'), + btn('justifyright') + ); + }; + + if(!Ext.isSafari){ + if(this.enableLinks){ + tb.add( + '-', + btn('createlink', false, this.createLink) + ); + }; + + if(this.enableLists){ + tb.add( + '-', + btn('insertorderedlist'), + btn('insertunorderedlist') + ); + } + if(this.enableSourceEdit){ + tb.add( + '-', + btn('sourceedit', true, function(btn){ + this.toggleSourceEdit(btn.pressed); + }) + ); + } + } + + this.tb = tb; + }, + + + getDocMarkup : function(){ + return ''; + }, + + + onRender : function(ct, position){ + Ext.form.HtmlEditor.superclass.onRender.call(this, ct, position); + this.el.dom.style.border = '0 none'; + this.el.dom.setAttribute('tabIndex', -1); + this.el.addClass('x-hidden'); + if(Ext.isIE){ + this.el.applyStyles('margin-top:-1px;margin-bottom:-1px;') + } + this.wrap = this.el.wrap({ + cls:'x-html-editor-wrap', cn:{cls:'x-html-editor-tb'} + }); + + + this.createToolbar(this); + + this.tb.items.each(function(item){ + if(item.id != 'sourceedit'){ + item.disable(); + } + }); + + var iframe = document.createElement('iframe'); + iframe.name = Ext.id(); + iframe.frameBorder = 'no'; + + iframe.src = (Ext.SSL_SECURE_URL || "javascript:false"); + + this.wrap.dom.appendChild(iframe); + + this.iframe = iframe; + + if(Ext.isIE){ + this.doc = iframe.contentWindow.document; + this.win = iframe.contentWindow; + } else { + this.doc = (iframe.contentDocument || window.frames[iframe.name].document); + this.win = window.frames[iframe.name]; + } + this.doc.designMode = 'on'; + this.doc.open(); + this.doc.write(this.getDocMarkup()) + this.doc.close(); + + var task = { + run : function(){ + if(this.doc.body || this.doc.readyState == 'complete'){ + this.doc.designMode="on"; + Ext.TaskMgr.stop(task); + this.initEditor.defer(10, this); + } + }, + interval : 10, + duration:10000, + scope: this + }; + Ext.TaskMgr.start(task); + + if(!this.width){ + this.setSize(this.el.getSize()); + } + }, + + + onResize : function(w, h){ + Ext.form.HtmlEditor.superclass.onResize.apply(this, arguments); + if(this.el && this.iframe){ + if(typeof w == 'number'){ + var aw = w - this.wrap.getFrameWidth('lr'); + this.el.setWidth(this.adjustWidth('textarea', aw)); + this.iframe.style.width = aw + 'px'; + } + if(typeof h == 'number'){ + var ah = h - this.wrap.getFrameWidth('tb') - this.tb.el.getHeight(); + this.el.setHeight(this.adjustWidth('textarea', ah)); + this.iframe.style.height = ah + 'px'; + if(this.doc){ + (this.doc.body || this.doc.documentElement).style.height = (ah - (this.iframePad*2)) + 'px'; + } + } + } + }, + + + toggleSourceEdit : function(sourceEditMode){ + if(sourceEditMode === undefined){ + sourceEditMode = !this.sourceEditMode; + } + this.sourceEditMode = sourceEditMode === true; + var btn = this.tb.items.get('sourceedit'); + if(btn.pressed !== this.sourceEditMode){ + btn.toggle(this.sourceEditMode); + return; + } + if(this.sourceEditMode){ + this.tb.items.each(function(item){ + if(item.id != 'sourceedit'){ + item.disable(); + } + }); + this.syncValue(); + this.iframe.className = 'x-hidden'; + this.el.removeClass('x-hidden'); + this.el.dom.removeAttribute('tabIndex'); + this.el.focus(); + }else{ + if(this.initialized){ + this.tb.items.each(function(item){ + item.enable(); + }); + } + this.pushValue(); + this.iframe.className = ''; + this.el.addClass('x-hidden'); + this.el.dom.setAttribute('tabIndex', -1); + this.deferFocus(); + } + this.setSize(this.wrap.getSize()); + this.fireEvent('editmodechange', this, this.sourceEditMode); + }, + + + createLink : function(){ + var url = prompt(this.createLinkText, this.defaultLinkValue); + if(url && url != 'http:/'+'/'){ + this.relayCmd('createlink', url); + } + }, + + + adjustSize : Ext.BoxComponent.prototype.adjustSize, + + + getResizeEl : function(){ + return this.wrap; + }, + + + getPositionEl : function(){ + return this.wrap; + }, + + + initEvents : function(){ + this.originalValue = this.getValue(); + }, + + + markInvalid : Ext.emptyFn, + + clearInvalid : Ext.emptyFn, + + setValue : function(v){ + Ext.form.HtmlEditor.superclass.setValue.call(this, v); + this.pushValue(); + }, + + + cleanHtml : function(html){ + html = String(html); + if(html.length > 5){ + if(Ext.isSafari){ + html = html.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi, ''); + } + } + if(html == ' '){ + html = ''; + } + return html; + }, + + + syncValue : function(){ + if(this.initialized){ + var bd = (this.doc.body || this.doc.documentElement); + var html = bd.innerHTML; + if(Ext.isSafari){ + var bs = bd.getAttribute('style'); + var m = bs.match(/text-align:(.*?);/i); + if(m && m[1]){ + html = '
    ' + html + '
    '; + } + } + html = this.cleanHtml(html); + if(this.fireEvent('beforesync', this, html) !== false){ + this.el.dom.value = html; + this.fireEvent('sync', this, html); + } + } + }, + + + pushValue : function(){ + if(this.initialized){ + var v = this.el.dom.value; + if(v.length < 1){ + v = ' '; + } + if(this.fireEvent('beforepush', this, v) !== false){ + (this.doc.body || this.doc.documentElement).innerHTML = v; + this.fireEvent('push', this, v); + } + } + }, + + + deferFocus : function(){ + this.focus.defer(10, this); + }, + + + focus : function(){ + if(this.win && !this.sourceEditMode){ + this.win.focus(); + }else{ + this.el.focus(); + } + }, + + + initEditor : function(){ + var dbody = (this.doc.body || this.doc.documentElement); + var ss = this.el.getStyles('font-size', 'font-family', 'background-image', 'background-repeat'); + ss['background-attachment'] = 'fixed'; + dbody.bgProperties = 'fixed'; + Ext.DomHelper.applyStyles(dbody, ss); + Ext.EventManager.on(this.doc, { + 'mousedown': this.onEditorEvent, + 'dblclick': this.onEditorEvent, + 'click': this.onEditorEvent, + 'keyup': this.onEditorEvent, + buffer:100, + scope: this + }); + if(Ext.isGecko){ + Ext.EventManager.on(this.doc, 'keypress', this.applyCommand, this); + } + if(Ext.isIE || Ext.isSafari || Ext.isOpera){ + Ext.EventManager.on(this.doc, 'keydown', this.fixKeys, this); + } + this.initialized = true; + + this.fireEvent('initialize', this); + this.pushValue(); + }, + + + onDestroy : function(){ + if(this.rendered){ + this.tb.items.each(function(item){ + if(item.menu){ + item.menu.removeAll(); + if(item.menu.el){ + item.menu.el.destroy(); + } + } + item.destroy(); + }); + this.wrap.dom.innerHTML = ''; + this.wrap.remove(); + } + }, + + + onFirstFocus : function(){ + this.activated = true; + this.tb.items.each(function(item){ + item.enable(); + }); + if(Ext.isGecko){ + this.win.focus(); + var s = this.win.getSelection(); + if(!s.focusNode || s.focusNode.nodeType != 3){ + var r = s.getRangeAt(0); + r.selectNodeContents((this.doc.body || this.doc.documentElement)); + r.collapse(true); + this.deferFocus(); + } + try{ + this.execCmd('useCSS', true); + this.execCmd('styleWithCSS', false); + }catch(e){} + } + this.fireEvent('activate', this); + }, + + + adjustFont: function(btn){ + var adjust = btn.id == 'increasefontsize' ? 1 : -1; + if(Ext.isSafari){ + adjust *= 2; + } + var v = parseInt(this.doc.queryCommandValue('FontSize')|| 3, 10); + v = Math.max(1, v+adjust); + this.execCmd('FontSize', v + (Ext.isSafari ? 'px' : 0)); + }, + + onEditorEvent : function(e){ + this.updateToolbar(); + }, + + + + updateToolbar: function(){ + + if(!this.activated){ + this.onFirstFocus(); + return; + } + + var btns = this.tb.items.map, doc = this.doc; + + if(this.enableFont && !Ext.isSafari){ + var name = (this.doc.queryCommandValue('FontName')||this.defaultFont).toLowerCase(); + if(name != this.fontSelect.dom.value){ + this.fontSelect.dom.value = name; + } + } + if(this.enableFormat){ + btns.bold.toggle(doc.queryCommandState('bold')); + btns.italic.toggle(doc.queryCommandState('italic')); + btns.underline.toggle(doc.queryCommandState('underline')); + } + if(this.enableAlignments){ + btns.justifyleft.toggle(doc.queryCommandState('justifyleft')); + btns.justifycenter.toggle(doc.queryCommandState('justifycenter')); + btns.justifyright.toggle(doc.queryCommandState('justifyright')); + } + if(!Ext.isSafari && this.enableLists){ + btns.insertorderedlist.toggle(doc.queryCommandState('insertorderedlist')); + btns.insertunorderedlist.toggle(doc.queryCommandState('insertunorderedlist')); + } + Ext.menu.MenuMgr.hideAll(); + + this.syncValue(); + }, + + + relayBtnCmd : function(btn){ + this.relayCmd(btn.id); + }, + + + relayCmd : function(cmd, value){ + this.win.focus(); + this.execCmd(cmd, value); + this.updateToolbar(); + this.deferFocus(); + }, + + + execCmd : function(cmd, value){ + this.doc.execCommand(cmd, false, value === undefined ? null : value); + this.syncValue(); + }, + + + applyCommand : function(e){ + if(e.ctrlKey){ + var c = e.getCharCode(), cmd; + if(c > 0){ + c = String.fromCharCode(c); + switch(c){ + case 'b': + cmd = 'bold'; + break; + case 'i': + cmd = 'italic'; + break; + case 'u': + cmd = 'underline'; + break; + } + if(cmd){ + this.win.focus(); + this.execCmd(cmd); + this.deferFocus(); + e.preventDefault(); + } + } + } + }, + + + insertAtCursor : function(text){ + if(!this.activated){ + return; + } + if(Ext.isIE){ + this.win.focus(); + var r = this.doc.selection.createRange(); + if(r){ + r.collapse(true); + r.pasteHTML(text); + this.syncValue(); + this.deferFocus(); + } + }else if(Ext.isGecko || Ext.isOpera){ + this.win.focus(); + this.execCmd('InsertHTML', text); + this.deferFocus(); + }else if(Ext.isSafari){ + this.execCmd('InsertText', text); + this.deferFocus(); + } + }, + + + fixKeys : function(){ + if(Ext.isIE){ + return function(e){ + var k = e.getKey(), r; + if(k == e.TAB){ + e.stopEvent(); + r = this.doc.selection.createRange(); + if(r){ + r.collapse(true); + r.pasteHTML('    '); + this.deferFocus(); + } + }else if(k == e.ENTER){ + r = this.doc.selection.createRange(); + if(r){ + var target = r.parentElement(); + if(!target || target.tagName.toLowerCase() != 'li'){ + e.stopEvent(); + r.pasteHTML('
    '); + r.collapse(false); + r.select(); + } + } + } + }; + }else if(Ext.isOpera){ + return function(e){ + var k = e.getKey(); + if(k == e.TAB){ + e.stopEvent(); + this.win.focus(); + this.execCmd('InsertHTML','    '); + this.deferFocus(); + } + }; + }else if(Ext.isSafari){ + return function(e){ + var k = e.getKey(); + if(k == e.TAB){ + e.stopEvent(); + this.execCmd('InsertText','\t'); + 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.form.BasicForm = function(el, config){ + Ext.apply(this, config); + + this.items = new Ext.util.MixedCollection(false, function(o){ + return o.id || (o.id = Ext.id()); + }); + this.addEvents({ + + beforeaction: true, + + actionfailed : true, + + actioncomplete : true + }); + if(el){ + this.initEl(el); + } + Ext.form.BasicForm.superclass.constructor.call(this); +}; + +Ext.extend(Ext.form.BasicForm, Ext.util.Observable, { + + + + + + + + timeout: 30, + + activeAction : null, + + + trackResetOnLoad : false, + + + waitMsgTarget : undefined, + + initEl : function(el){ + this.el = Ext.get(el); + this.id = this.el.id || Ext.id(); + this.el.on('submit', this.onSubmit, this); + this.el.addClass('x-form'); + }, + + onSubmit : function(e){ + e.stopEvent(); + }, + + + isValid : function(){ + var valid = true; + this.items.each(function(f){ + if(!f.validate()){ + valid = false; + } + }); + return valid; + }, + + + isDirty : function(){ + var dirty = false; + this.items.each(function(f){ + if(f.isDirty()){ + dirty = true; + return false; + } + }); + return dirty; + }, + + + doAction : function(action, options){ + if(typeof action == 'string'){ + action = new Ext.form.Action.ACTION_TYPES[action](this, options); + } + if(this.fireEvent('beforeaction', this, action) !== false){ + this.beforeAction(action); + action.run.defer(100, action); + } + return this; + }, + + + submit : function(options){ + this.doAction('submit', options); + return this; + }, + + + load : function(options){ + this.doAction('load', options); + return this; + }, + + + updateRecord : function(record){ + record.beginEdit(); + var fs = record.fields; + fs.each(function(f){ + var field = this.findField(f.name); + if(field){ + record.set(f.name, field.getValue()); + } + }, this); + record.endEdit(); + return this; + }, + + + loadRecord : function(record){ + this.setValues(record.data); + return this; + }, + + beforeAction : function(action){ + var o = action.options; + if(o.waitMsg){ + if(this.waitMsgTarget === true){ + this.el.mask(o.waitMsg, 'x-mask-loading'); + }else if(this.waitMsgTarget){ + this.waitMsgTarget = Ext.get(this.waitMsgTarget); + this.waitMsgTarget.mask(o.waitMsg, 'x-mask-loading'); + }else{ + Ext.MessageBox.wait(o.waitMsg, o.waitTitle || this.waitTitle || 'Please Wait...'); + } + } + }, + + afterAction : function(action, success){ + this.activeAction = null; + var o = action.options; + if(o.waitMsg){ + if(this.waitMsgTarget === true){ + this.el.unmask(); + }else if(this.waitMsgTarget){ + this.waitMsgTarget.unmask(); + }else{ + Ext.MessageBox.updateProgress(1); + Ext.MessageBox.hide(); + } + } + if(success){ + if(o.reset){ + this.reset(); + } + Ext.callback(o.success, o.scope, [this, action]); + this.fireEvent('actioncomplete', this, action); + }else{ + Ext.callback(o.failure, o.scope, [this, action]); + this.fireEvent('actionfailed', this, action); + } + }, + + + findField : function(id){ + var field = this.items.get(id); + if(!field){ + this.items.each(function(f){ + if(f.isFormField && (f.dataIndex == id || f.id == id || f.getName() == id)){ + field = f; + return false; + } + }); + } + return field || null; + }, + + + + markInvalid : function(errors){ + if(errors instanceof Array){ + for(var i = 0, len = errors.length; i < len; i++){ + var fieldError = errors[i]; + var f = this.findField(fieldError.id); + if(f){ + f.markInvalid(fieldError.msg); + } + } + }else{ + var field, id; + for(id in errors){ + if(typeof errors[id] != 'function' && (field = this.findField(id))){ + field.markInvalid(errors[id]); + } + } + } + return this; + }, + + + setValues : function(values){ + if(values instanceof Array){ for(var i = 0, len = values.length; i < len; i++){ + var v = values[i]; + var f = this.findField(v.id); + if(f){ + f.setValue(v.value); + if(this.trackResetOnLoad){ + f.originalValue = f.getValue(); + } + } + } + }else{ var field, id; + for(id in values){ + if(typeof values[id] != 'function' && (field = this.findField(id))){ + field.setValue(values[id]); + if(this.trackResetOnLoad){ + field.originalValue = field.getValue(); + } + } + } + } + return this; + }, + + + getValues : function(asString){ + var fs = Ext.lib.Ajax.serializeForm(this.el.dom); + if(asString === true){ + return fs; + } + return Ext.urlDecode(fs); + }, + + + clearInvalid : function(){ + this.items.each(function(f){ + f.clearInvalid(); + }); + return this; + }, + + + reset : function(){ + this.items.each(function(f){ + f.reset(); + }); + return this; + }, + + + add : function(){ + this.items.addAll(Array.prototype.slice.call(arguments, 0)); + return this; + }, + + + + remove : function(field){ + this.items.remove(field); + return this; + }, + + + render : function(){ + this.items.each(function(f){ + if(f.isFormField && !f.rendered && document.getElementById(f.id)){ f.applyTo(f.id); + } + }); + return this; + }, + + + applyToFields : function(o){ + this.items.each(function(f){ + Ext.apply(f, o); + }); + return this; + }, + + + applyIfToFields : function(o){ + this.items.each(function(f){ + Ext.applyIf(f, o); + }); + return this; + } +}); + +Ext.BasicForm = Ext.form.BasicForm; + +Ext.form.Form = function(config){ + Ext.form.Form.superclass.constructor.call(this, null, config); + this.url = this.url || this.action; + if(!this.root){ + this.root = new Ext.form.Layout(Ext.applyIf({ + id: Ext.id() + }, config)); + } + this.active = this.root; + + this.buttons = []; + this.addEvents({ + + clientvalidation: true + }); +}; + +Ext.extend(Ext.form.Form, Ext.form.BasicForm, { + + + + buttonAlign:'center', + + + minButtonWidth:75, + + + labelAlign:'left', + + + monitorValid : false, + + + monitorPoll : 200, + + + column : function(c){ + var col = new Ext.form.Column(c); + this.start(col); + if(arguments.length > 1){ this.add.apply(this, Array.prototype.slice.call(arguments, 1)); + this.end(); + } + return col; + }, + + + fieldset : function(c){ + var fs = new Ext.form.FieldSet(c); + this.start(fs); + if(arguments.length > 1){ this.add.apply(this, Array.prototype.slice.call(arguments, 1)); + this.end(); + } + return fs; + }, + + + container : function(c){ + var l = new Ext.form.Layout(c); + this.start(l); + if(arguments.length > 1){ this.add.apply(this, Array.prototype.slice.call(arguments, 1)); + this.end(); + } + return l; + }, + + + start : function(c){ + Ext.applyIf(c, {'labelAlign': this.active.labelAlign, 'labelWidth': this.active.labelWidth, 'itemCls': this.active.itemCls}); + this.active.stack.push(c); + c.ownerCt = this.active; + this.active = c; + return this; + }, + + + end : function(){ + if(this.active == this.root){ + return this; + } + this.active = this.active.ownerCt; + return this; + }, + + + add : function(){ + this.active.stack.push.apply(this.active.stack, arguments); + var r = []; + for(var i = 0, a = arguments, len = a.length; i < len; i++) { + if(a[i].isFormField){ + r.push(a[i]); + } + } + if(r.length > 0){ + Ext.form.Form.superclass.add.apply(this, r); + } + return this; + }, + + + render : function(ct){ + ct = Ext.get(ct); + var o = this.autoCreate || { + tag: 'form', + method : this.method || 'POST', + id : this.id || Ext.id() + }; + this.initEl(ct.createChild(o)); + + this.root.render(this.el); + + this.items.each(function(f){ + f.render('x-form-el-'+f.id); + }); + + if(this.buttons.length > 0){ + var tb = this.el.createChild({cls:'x-form-btns-ct', cn: { + cls:"x-form-btns x-form-btns-"+this.buttonAlign, + html:'
    ' + }}, null, true); + var tr = tb.getElementsByTagName('tr')[0]; + for(var i = 0, len = this.buttons.length; i < len; i++) { + var b = this.buttons[i]; + var td = document.createElement('td'); + td.className = 'x-form-btn-td'; + b.render(tr.appendChild(td)); + } + } + if(this.monitorValid){ this.startMonitoring(); + } + return this; + }, + + + addButton : function(config, handler, scope){ + var bc = { + handler: handler, + scope: scope, + minWidth: this.minButtonWidth, + hideParent:true + }; + if(typeof config == "string"){ + bc.text = config; + }else{ + Ext.apply(bc, config); + } + var btn = new Ext.Button(null, bc); + this.buttons.push(btn); + return btn; + }, + + + startMonitoring : function(){ + if(!this.bound){ + this.bound = true; + Ext.TaskMgr.start({ + run : this.bindHandler, + interval : this.monitorPoll || 200, + scope: this + }); + } + }, + + + stopMonitoring : function(){ + this.bound = false; + }, + + bindHandler : function(){ + if(!this.bound){ + return false; } + var valid = true; + this.items.each(function(f){ + if(!f.isValid(true)){ + valid = false; + return false; + } + }); + for(var i = 0, len = this.buttons.length; i < len; i++){ + var btn = this.buttons[i]; + if(btn.formBind === true && btn.disabled === valid){ + btn.setDisabled(!valid); + } + } + this.fireEvent('clientvalidation', this, valid); + } +}); + + +Ext.Form = Ext.form.Form; + + +Ext.form.Action = function(form, options){ + this.form = form; + this.options = options || {}; +}; + +Ext.form.Action.CLIENT_INVALID = 'client'; +Ext.form.Action.SERVER_INVALID = 'server'; +Ext.form.Action.CONNECT_FAILURE = 'connect'; +Ext.form.Action.LOAD_FAILURE = 'load'; + +Ext.form.Action.prototype = { + type : 'default', + failureType : undefined, + response : undefined, + result : undefined, + + run : function(options){ + + }, + + success : function(response){ + + }, + + handleResponse : function(response){ + + }, + + failure : function(response){ + this.response = response; + this.failureType = Ext.form.Action.CONNECT_FAILURE; + this.form.afterAction(this, false); + }, + + processResponse : function(response){ + this.response = response; + if(!response.responseText){ + return true; + } + this.result = this.handleResponse(response); + return this.result; + }, + + getUrl : function(appendParams){ + var url = this.options.url || this.form.url || this.form.el.dom.action; + if(appendParams){ + var p = this.getParams(); + if(p){ + url += (url.indexOf('?') != -1 ? '&' : '?') + p; + } + } + return url; + }, + + getMethod : function(){ + return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase(); + }, + + getParams : function(){ + var bp = this.form.baseParams; + var p = this.options.params; + if(p){ + if(typeof p == "object"){ + p = Ext.urlEncode(Ext.applyIf(p, bp)); + }else if(typeof p == 'string' && bp){ + p += '&' + Ext.urlEncode(bp); + } + }else if(bp){ + p = Ext.urlEncode(bp); + } + return p; + }, + + createCallback : function(){ + return { + success: this.success, + failure: this.failure, + scope: this, + timeout: (this.form.timeout*1000), + upload: this.form.fileUpload ? this.success : undefined + }; + } +}; + +Ext.form.Action.Submit = function(form, options){ + Ext.form.Action.Submit.superclass.constructor.call(this, form, options); +}; + +Ext.extend(Ext.form.Action.Submit, Ext.form.Action, { + type : 'submit', + + run : function(){ + var o = this.options; + var method = this.getMethod(); + var isPost = method == 'POST'; + if(o.clientValidation === false || this.form.isValid()){ + Ext.Ajax.request(Ext.apply(this.createCallback(), { + form:this.form.el.dom, + url:this.getUrl(!isPost), + method: method, + params:isPost ? this.getParams() : null, + isUpload: this.form.fileUpload + })); + + }else if (o.clientValidation !== false){ this.failureType = Ext.form.Action.CLIENT_INVALID; + this.form.afterAction(this, false); + } + }, + + success : function(response){ + var result = this.processResponse(response); + if(result === true || result.success){ + this.form.afterAction(this, true); + return; + } + if(result.errors){ + this.form.markInvalid(result.errors); + this.failureType = Ext.form.Action.SERVER_INVALID; + } + this.form.afterAction(this, false); + }, + + handleResponse : function(response){ + if(this.form.errorReader){ + var rs = this.form.errorReader.read(response); + var errors = []; + if(rs.records){ + for(var i = 0, len = rs.records.length; i < len; i++) { + var r = rs.records[i]; + errors[i] = r.data; + } + } + if(errors.length < 1){ + errors = null; + } + return { + success : rs.success, + errors : errors + }; + } + return Ext.decode(response.responseText); + } +}); + + +Ext.form.Action.Load = function(form, options){ + Ext.form.Action.Load.superclass.constructor.call(this, form, options); + this.reader = this.form.reader; +}; + +Ext.extend(Ext.form.Action.Load, Ext.form.Action, { + type : 'load', + + run : function(){ + Ext.Ajax.request(Ext.apply( + this.createCallback(), { + method:this.getMethod(), + url:this.getUrl(false), + params:this.getParams() + })); + }, + + success : function(response){ + var result = this.processResponse(response); + if(result === true || !result.success || !result.data){ + this.failureType = Ext.form.Action.LOAD_FAILURE; + this.form.afterAction(this, false); + return; + } + this.form.clearInvalid(); + this.form.setValues(result.data); + this.form.afterAction(this, true); + }, + + handleResponse : function(response){ + if(this.form.reader){ + var rs = this.form.reader.read(response); + var data = rs.records && rs.records[0] ? rs.records[0].data : null; + return { + success : rs.success, + data : data + }; + } + return Ext.decode(response.responseText); + } +}); + +Ext.form.Action.ACTION_TYPES = { + 'load' : Ext.form.Action.Load, + 'submit' : Ext.form.Action.Submit +}; + + +Ext.form.Layout = function(config){ + Ext.form.Layout.superclass.constructor.call(this, config); + this.stack = []; +}; + +Ext.extend(Ext.form.Layout, Ext.Component, { + + + + + + clear : true, + + labelSeparator : ':', + + hideLabels : false, + + defaultAutoCreate : {tag: 'div', cls: 'x-form-ct'}, + + onRender : function(ct, position){ + if(this.el){ this.el = Ext.get(this.el); + }else { var cfg = this.getAutoCreate(); + this.el = ct.createChild(cfg, position); + } + if(this.style){ + this.el.applyStyles(this.style); + } + if(this.labelAlign){ + this.el.addClass('x-form-label-'+this.labelAlign); + } + if(this.hideLabels){ + this.labelStyle = "display:none"; + this.elementStyle = "padding-left:0;"; + }else{ + if(typeof this.labelWidth == 'number'){ + this.labelStyle = "width:"+this.labelWidth+"px;"; + this.elementStyle = "padding-left:"+((this.labelWidth+(typeof this.labelPad == 'number' ? this.labelPad : 5))+'px')+";"; + } + if(this.labelAlign == 'top'){ + this.labelStyle = "width:auto;"; + this.elementStyle = "padding-left:0;"; + } + } + var stack = this.stack; + var slen = stack.length; + if(slen > 0){ + if(!this.fieldTpl){ + var t = new Ext.Template( + '
    ', + '', + '
    ', + '
    ', + '
    ' + ); + t.disableFormats = true; + t.compile(); + Ext.form.Layout.prototype.fieldTpl = t; + } + for(var i = 0; i < slen; i++) { + if(stack[i].isFormField){ + this.renderField(stack[i]); + }else{ + this.renderComponent(stack[i]); + } + } + } + if(this.clear){ + this.el.createChild({cls:'x-form-clear'}); + } + }, + + renderField : function(f){ + this.fieldTpl.append(this.el, [ + f.id, f.fieldLabel, + f.labelStyle||this.labelStyle||'', + this.elementStyle||'', + typeof f.labelSeparator == 'undefined' ? this.labelSeparator : f.labelSeparator, + f.itemCls||this.itemCls||'' + ]); + }, + + renderComponent : function(c){ + c.render(this.el); + } +}); + + +Ext.form.Column = function(config){ + Ext.form.Column.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.Column, Ext.form.Layout, { + + + + defaultAutoCreate : {tag: 'div', cls: 'x-form-ct x-form-column'}, + + onRender : function(ct, position){ + Ext.form.Column.superclass.onRender.call(this, ct, position); + if(this.width){ + this.el.setWidth(this.width); + } + } +}); + + +Ext.form.FieldSet = function(config){ + Ext.form.FieldSet.superclass.constructor.call(this, config); +}; + +Ext.extend(Ext.form.FieldSet, Ext.form.Layout, { + + + + defaultAutoCreate : {tag: 'fieldset', cn: {tag:'legend'}}, + + onRender : function(ct, position){ + Ext.form.FieldSet.superclass.onRender.call(this, ct, position); + if(this.legend){ + this.setLegend(this.legend); + } + }, + + setLegend : function(text){ + if(this.rendered){ + this.el.child('legend').update(text); + } + } +}); + +Ext.form.VTypes = function(){ + var alpha = /^[a-zA-Z_]+$/; + var alphanum = /^[a-zA-Z0-9_]+$/; + var email = /^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/; + var url = /(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i; + + return { + + 'email' : function(v){ + return email.test(v); + }, + + 'emailText' : 'This field should be an e-mail address in the format "user@domain.com"', + + 'emailMask' : /[a-z0-9_\.\-@]/i, + + + 'url' : function(v){ + return url.test(v); + }, + + 'urlText' : 'This field should be a URL in the format "http:/'+'/www.domain.com"', + + + 'alpha' : function(v){ + return alpha.test(v); + }, + + 'alphaText' : 'This field should only contain letters and _', + + 'alphaMask' : /[a-z_]/i, + + + 'alphanum' : function(v){ + return alphanum.test(v); + }, + + 'alphanumText' : 'This field should only contain letters, numbers and _', + + 'alphanumMask' : /[a-z0-9_]/i + }; +}(); + +Ext.LayoutManager = function(container, config){ + Ext.LayoutManager.superclass.constructor.call(this); + this.el = Ext.get(container); + + if(this.el.dom == document.body && Ext.isIE && !config.allowScroll){ + document.body.scroll = "no"; + }else if(this.el.dom != document.body && this.el.getStyle('position') == 'static'){ + this.el.position('relative'); + } + this.id = this.el.id; + this.el.addClass("x-layout-container"); + + this.monitorWindowResize = true; + this.regions = {}; + this.addEvents({ + + "layout" : true, + + "regionresized" : true, + + "regioncollapsed" : true, + + "regionexpanded" : true + }); + this.updating = false; + Ext.EventManager.onWindowResize(this.onWindowResize, this, true); +}; + +Ext.extend(Ext.LayoutManager, Ext.util.Observable, { + + isUpdating : function(){ + return this.updating; + }, + + + beginUpdate : function(){ + this.updating = true; + }, + + + endUpdate : function(noLayout){ + this.updating = false; + if(!noLayout){ + this.layout(); + } + }, + + layout: function(){ + + }, + + onRegionResized : function(region, newSize){ + this.fireEvent("regionresized", region, newSize); + this.layout(); + }, + + onRegionCollapsed : function(region){ + this.fireEvent("regioncollapsed", region); + }, + + onRegionExpanded : function(region){ + this.fireEvent("regionexpanded", region); + }, + + + getViewSize : function(){ + var size; + if(this.el.dom != document.body){ + size = this.el.getSize(); + }else{ + size = {width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()}; + } + size.width -= this.el.getBorderWidth("lr")-this.el.getPadding("lr"); + size.height -= this.el.getBorderWidth("tb")-this.el.getPadding("tb"); + return size; + }, + + + getEl : function(){ + return this.el; + }, + + + getRegion : function(target){ + return this.regions[target.toLowerCase()]; + }, + + onWindowResize : function(){ + if(this.monitorWindowResize){ + this.layout(); + } + } +}); + +Ext.BorderLayout = function(container, config){ + config = config || {}; + Ext.BorderLayout.superclass.constructor.call(this, container, config); + this.factory = config.factory || Ext.BorderLayout.RegionFactory; + for(var i = 0, len = this.factory.validRegions.length; i < len; i++) { + var target = this.factory.validRegions[i]; + if(config[target]){ + this.addRegion(target, config[target]); + } + } +}; + +Ext.extend(Ext.BorderLayout, Ext.LayoutManager, { + + addRegion : function(target, config){ + if(!this.regions[target]){ + var r = this.factory.create(target, this, config); + this.bindRegion(target, r); + } + return this.regions[target]; + }, + + + bindRegion : function(name, r){ + this.regions[name] = r; + r.on("visibilitychange", this.layout, this); + r.on("paneladded", this.layout, this); + r.on("panelremoved", this.layout, this); + r.on("invalidated", this.layout, this); + r.on("resized", this.onRegionResized, this); + r.on("collapsed", this.onRegionCollapsed, this); + r.on("expanded", this.onRegionExpanded, this); + }, + + + layout : function(){ + if(this.updating) return; + var size = this.getViewSize(); + var w = size.width, h = size.height; + var centerW = w, centerH = h, centerY = 0, centerX = 0; + + + var rs = this.regions; + var n = rs["north"], s = rs["south"], west = rs["west"], e = rs["east"], c = rs["center"]; + + + + if(n && n.isVisible()){ + var b = n.getBox(); + var m = n.getMargins(); + b.width = w - (m.left+m.right); + b.x = m.left; + b.y = m.top; + centerY = b.height + b.y + m.bottom; + centerH -= centerY; + n.updateBox(this.safeBox(b)); + } + if(s && s.isVisible()){ + var b = s.getBox(); + var m = s.getMargins(); + b.width = w - (m.left+m.right); + b.x = m.left; + var totalHeight = (b.height + m.top + m.bottom); + b.y = h - totalHeight + m.top; + centerH -= totalHeight; + s.updateBox(this.safeBox(b)); + } + if(west && west.isVisible()){ + var b = west.getBox(); + var m = west.getMargins(); + b.height = centerH - (m.top+m.bottom); + b.x = m.left; + b.y = centerY + m.top; + var totalWidth = (b.width + m.left + m.right); + centerX += totalWidth; + centerW -= totalWidth; + west.updateBox(this.safeBox(b)); + } + if(e && e.isVisible()){ + var b = e.getBox(); + var m = e.getMargins(); + b.height = centerH - (m.top+m.bottom); + var totalWidth = (b.width + m.left + m.right); + b.x = w - totalWidth + m.left; + b.y = centerY + m.top; + centerW -= totalWidth; + e.updateBox(this.safeBox(b)); + } + if(c){ + var m = c.getMargins(); + var centerBox = { + x: centerX + m.left, + y: centerY + m.top, + width: centerW - (m.left+m.right), + height: centerH - (m.top+m.bottom) + }; + + + + c.updateBox(this.safeBox(centerBox)); + } + this.el.repaint(); + this.fireEvent("layout", this); + }, + + + safeBox : function(box){ + box.width = Math.max(0, box.width); + box.height = Math.max(0, box.height); + return box; + }, + + + add : function(target, panel){ + target = target.toLowerCase(); + return this.regions[target].add(panel); + }, + + + remove : function(target, panel){ + target = target.toLowerCase(); + return this.regions[target].remove(panel); + }, + + + findPanel : function(panelId){ + var rs = this.regions; + for(var target in rs){ + if(typeof rs[target] != "function"){ + var p = rs[target].getPanel(panelId); + if(p){ + return p; + } + } + } + return null; + }, + + + showPanel : function(panelId) { + var rs = this.regions; + for(var target in rs){ + var r = rs[target]; + if(typeof r != "function"){ + if(r.hasPanel(panelId)){ + return r.showPanel(panelId); + } + } + } + return null; + }, + + + restoreState : function(provider){ + if(!provider){ + provider = Ext.state.Manager; + } + var sm = new Ext.LayoutStateManager(); + sm.init(this, provider); + }, + + + batchAdd : function(regions){ + this.beginUpdate(); + for(var rname in regions){ + var lr = this.regions[rname]; + if(lr){ + this.addTypedPanels(lr, regions[rname]); + } + } + this.endUpdate(); + }, + + + addTypedPanels : function(lr, ps){ + if(typeof ps == 'string'){ + lr.add(new Ext.ContentPanel(ps)); + } + else if(ps instanceof Array){ + for(var i =0, len = ps.length; i < len; i++){ + this.addTypedPanels(lr, ps[i]); + } + } + else if(!ps.events){ + var el = ps.el; + delete ps.el; + lr.add(new Ext.ContentPanel(el || Ext.id(), ps)); + } + else { + lr.add(ps); + } + } +}); + + +Ext.BorderLayout.create = function(config, targetEl){ + var layout = new Ext.BorderLayout(targetEl || document.body, config); + layout.beginUpdate(); + var regions = Ext.BorderLayout.RegionFactory.validRegions; + for(var j = 0, jlen = regions.length; j < jlen; j++){ + var lr = regions[j]; + if(layout.regions[lr] && config[lr].panels){ + var r = layout.regions[lr]; + var ps = config[lr].panels; + layout.addTypedPanels(r, ps); + } + } + layout.endUpdate(); + return layout; +}; + + +Ext.BorderLayout.RegionFactory = { + + validRegions : ["north","south","east","west","center"], + + + create : function(target, mgr, config){ + target = target.toLowerCase(); + if(config.lightweight || config.basic){ + return new Ext.BasicLayoutRegion(mgr, config, target); + } + switch(target){ + case "north": + return new Ext.NorthLayoutRegion(mgr, config); + case "south": + return new Ext.SouthLayoutRegion(mgr, config); + case "east": + return new Ext.EastLayoutRegion(mgr, config); + case "west": + return new Ext.WestLayoutRegion(mgr, config); + case "center": + return new Ext.CenterLayoutRegion(mgr, config); + } + throw 'Layout region "'+target+'" not supported.'; + } +}; + +Ext.BasicLayoutRegion = function(mgr, config, pos, skipConfig){ + this.mgr = mgr; + this.position = pos; + this.events = { + + "beforeremove" : true, + + "invalidated" : true, + + "visibilitychange" : true, + + "paneladded" : true, + + "panelremoved" : true, + + "collapsed" : true, + + "expanded" : true, + + "slideshow" : true, + + "slidehide" : true, + + "panelactivated" : true, + + "resized" : true + }; + + this.panels = new Ext.util.MixedCollection(); + this.panels.getKey = this.getPanelId.createDelegate(this); + this.box = null; + this.activePanel = null; + if(skipConfig !== true){ + this.applyConfig(config); + } +}; + +Ext.extend(Ext.BasicLayoutRegion, Ext.util.Observable, { + getPanelId : function(p){ + return p.getId(); + }, + + applyConfig : function(config){ + this.margins = config.margins || this.margins || {top: 0, left: 0, right:0, bottom: 0}; + this.config = config; + }, + + + resizeTo : function(newSize){ + var el = this.el ? this.el : + (this.activePanel ? this.activePanel.getEl() : null); + if(el){ + switch(this.position){ + case "east": + case "west": + el.setWidth(newSize); + this.fireEvent("resized", this, newSize); + break; + case "north": + case "south": + el.setHeight(newSize); + this.fireEvent("resized", this, newSize); + break; + } + } + }, + + getBox : function(){ + return this.activePanel ? this.activePanel.getEl().getBox(false, true) : null; + }, + + getMargins : function(){ + return this.margins; + }, + + updateBox : function(box){ + this.box = box; + var el = this.activePanel.getEl(); + el.dom.style.left = box.x + "px"; + el.dom.style.top = box.y + "px"; + this.activePanel.setSize(box.width, box.height); + }, + + + getEl : function(){ + return this.activePanel; + }, + + + isVisible : function(){ + return this.activePanel ? true : false; + }, + + setActivePanel : function(panel){ + panel = this.getPanel(panel); + if(this.activePanel && this.activePanel != panel){ + this.activePanel.setActiveState(false); + this.activePanel.getEl().setLeftTop(-10000,-10000); + } + this.activePanel = panel; + panel.setActiveState(true); + if(this.box){ + panel.setSize(this.box.width, this.box.height); + } + this.fireEvent("panelactivated", this, panel); + this.fireEvent("invalidated"); + }, + + + showPanel : function(panel){ + if(panel = this.getPanel(panel)){ + this.setActivePanel(panel); + } + return panel; + }, + + + getActivePanel : function(){ + return this.activePanel; + }, + + + add : function(panel){ + if(arguments.length > 1){ + for(var i = 0, len = arguments.length; i < len; i++) { + this.add(arguments[i]); + } + return null; + } + if(this.hasPanel(panel)){ + this.showPanel(panel); + return panel; + } + var el = panel.getEl(); + if(el.dom.parentNode != this.mgr.el.dom){ + this.mgr.el.dom.appendChild(el.dom); + } + if(panel.setRegion){ + panel.setRegion(this); + } + this.panels.add(panel); + el.setStyle("position", "absolute"); + if(!panel.background){ + this.setActivePanel(panel); + if(this.config.initialSize && this.panels.getCount()==1){ + this.resizeTo(this.config.initialSize); + } + } + this.fireEvent("paneladded", this, panel); + return panel; + }, + + + hasPanel : function(panel){ + if(typeof panel == "object"){ + panel = panel.getId(); + } + return this.getPanel(panel) ? true : false; + }, + + + remove : function(panel, preservePanel){ + panel = this.getPanel(panel); + if(!panel){ + return null; + } + var e = {}; + this.fireEvent("beforeremove", this, panel, e); + if(e.cancel === true){ + return null; + } + var panelId = panel.getId(); + this.panels.removeKey(panelId); + return panel; + }, + + + getPanel : function(id){ + if(typeof id == "object"){ + return id; + } + return this.panels.get(id); + }, + + + getPosition: function(){ + return this.position; + } +}); + +Ext.LayoutRegion = function(mgr, config, pos){ + Ext.LayoutRegion.superclass.constructor.call(this, mgr, config, pos, true); + var dh = Ext.DomHelper; + + this.el = dh.append(mgr.el.dom, {tag: "div", cls: "x-layout-panel x-layout-panel-" + this.position}, true); + + + this.titleEl = dh.append(this.el.dom, {tag: "div", unselectable: "on", cls: "x-unselectable x-layout-panel-hd x-layout-title-"+this.position, children:[ + {tag: "span", cls: "x-unselectable x-layout-panel-hd-text", unselectable: "on", html: " "}, + {tag: "div", cls: "x-unselectable x-layout-panel-hd-tools", unselectable: "on"} + ]}, true); + this.titleEl.enableDisplayMode(); + + this.titleTextEl = this.titleEl.dom.firstChild; + this.tools = Ext.get(this.titleEl.dom.childNodes[1], true); + this.closeBtn = this.createTool(this.tools.dom, "x-layout-close"); + this.closeBtn.enableDisplayMode(); + this.closeBtn.on("click", this.closeClicked, this); + this.closeBtn.hide(); + + this.createBody(config); + this.visible = true; + this.collapsed = false; + + if(config.hideWhenEmpty){ + this.hide(); + this.on("paneladded", this.validateVisibility, this); + this.on("panelremoved", this.validateVisibility, this); + } + this.applyConfig(config); +}; + +Ext.extend(Ext.LayoutRegion, Ext.BasicLayoutRegion, { + + createBody : function(){ + + this.bodyEl = this.el.createChild({tag: "div", cls: "x-layout-panel-body"}); + }, + + applyConfig : function(c){ + if(c.collapsible && this.position != "center" && !this.collapsedEl){ + var dh = Ext.DomHelper; + if(c.titlebar !== false){ + this.collapseBtn = this.createTool(this.tools.dom, "x-layout-collapse-"+this.position); + this.collapseBtn.on("click", this.collapse, this); + this.collapseBtn.enableDisplayMode(); + + if(c.showPin === true || this.showPin){ + this.stickBtn = this.createTool(this.tools.dom, "x-layout-stick"); + this.stickBtn.enableDisplayMode(); + this.stickBtn.on("click", this.expand, this); + this.stickBtn.hide(); + } + } + + this.collapsedEl = dh.append(this.mgr.el.dom, {cls: "x-layout-collapsed x-layout-collapsed-"+this.position, children:[ + {cls: "x-layout-collapsed-tools", children:[{cls: "x-layout-ctools-inner"}]} + ]}, true); + if(c.floatable !== false){ + this.collapsedEl.addClassOnOver("x-layout-collapsed-over"); + this.collapsedEl.on("click", this.collapseClick, this); + } + + if(c.collapsedTitle && (this.position == "north" || this.position== "south")) { + this.collapsedTitleTextEl = dh.append(this.collapsedEl.dom, {tag: "div", cls: "x-unselectable x-layout-panel-hd-text", + id: "message", unselectable: "on", style:{"float":"left"}}); + this.collapsedTitleTextEl.innerHTML = c.collapsedTitle; + } + this.expandBtn = this.createTool(this.collapsedEl.dom.firstChild.firstChild, "x-layout-expand-"+this.position); + this.expandBtn.on("click", this.expand, this); + } + if(this.collapseBtn){ + this.collapseBtn.setVisible(c.collapsible == true); + } + this.cmargins = c.cmargins || this.cmargins || + (this.position == "west" || this.position == "east" ? + {top: 0, left: 2, right:2, bottom: 0} : + {top: 2, left: 0, right:0, bottom: 2}); + this.margins = c.margins || this.margins || {top: 0, left: 0, right:0, bottom: 0}; + this.bottomTabs = c.tabPosition != "top"; + this.autoScroll = c.autoScroll || false; + if(this.autoScroll){ + this.bodyEl.setStyle("overflow", "auto"); + }else{ + this.bodyEl.setStyle("overflow", "hidden"); + } + + if((!c.titlebar && !c.title) || c.titlebar === false){ + this.titleEl.hide(); + }else{ + this.titleEl.show(); + if(c.title){ + this.titleTextEl.innerHTML = c.title; + } + } + + this.duration = c.duration || .30; + this.slideDuration = c.slideDuration || .45; + this.config = c; + if(c.collapsed){ + this.collapse(true); + } + if(c.hidden){ + this.hide(); + } + }, + + isVisible : function(){ + return this.visible; + }, + + + setCollapsedTitle : function(title){ + title = title || " "; + if(this.collapsedTitleTextEl){ + this.collapsedTitleTextEl.innerHTML = title; + } + }, + + getBox : function(){ + var b; + if(!this.collapsed){ + b = this.el.getBox(false, true); + }else{ + b = this.collapsedEl.getBox(false, true); + } + return b; + }, + + getMargins : function(){ + return this.collapsed ? this.cmargins : this.margins; + }, + + highlight : function(){ + this.el.addClass("x-layout-panel-dragover"); + }, + + unhighlight : function(){ + this.el.removeClass("x-layout-panel-dragover"); + }, + + updateBox : function(box){ + this.box = box; + if(!this.collapsed){ + this.el.dom.style.left = box.x + "px"; + this.el.dom.style.top = box.y + "px"; + this.updateBody(box.width, box.height); + }else{ + this.collapsedEl.dom.style.left = box.x + "px"; + this.collapsedEl.dom.style.top = box.y + "px"; + this.collapsedEl.setSize(box.width, box.height); + } + if(this.tabs){ + this.tabs.autoSizeTabs(); + } + }, + + updateBody : function(w, h){ + if(w !== null){ + this.el.setWidth(w); + w -= this.el.getBorderWidth("rl"); + if(this.config.adjustments){ + w += this.config.adjustments[0]; + } + } + if(h !== null){ + this.el.setHeight(h); + h = this.titleEl && this.titleEl.isDisplayed() ? h - (this.titleEl.getHeight()||0) : h; + h -= this.el.getBorderWidth("tb"); + if(this.config.adjustments){ + h += this.config.adjustments[1]; + } + this.bodyEl.setHeight(h); + if(this.tabs){ + h = this.tabs.syncHeight(h); + } + } + if(this.panelSize){ + w = w !== null ? w : this.panelSize.width; + h = h !== null ? h : this.panelSize.height; + } + if(this.activePanel){ + var el = this.activePanel.getEl(); + w = w !== null ? w : el.getWidth(); + h = h !== null ? h : el.getHeight(); + this.panelSize = {width: w, height: h}; + this.activePanel.setSize(w, h); + } + if(Ext.isIE && this.tabs){ + this.tabs.el.repaint(); + } + }, + + + getEl : function(){ + return this.el; + }, + + + hide : function(){ + if(!this.collapsed){ + this.el.dom.style.left = "-2000px"; + this.el.hide(); + }else{ + this.collapsedEl.dom.style.left = "-2000px"; + this.collapsedEl.hide(); + } + this.visible = false; + this.fireEvent("visibilitychange", this, false); + }, + + + show : function(){ + if(!this.collapsed){ + this.el.show(); + }else{ + this.collapsedEl.show(); + } + this.visible = true; + this.fireEvent("visibilitychange", this, true); + }, + + closeClicked : function(){ + if(this.activePanel){ + this.remove(this.activePanel); + } + }, + + collapseClick : function(e){ + if(this.isSlid){ + e.stopPropagation(); + this.slideIn(); + }else{ + e.stopPropagation(); + this.slideOut(); + } + }, + + + collapse : function(skipAnim){ + if(this.collapsed) return; + this.collapsed = true; + if(this.split){ + this.split.el.hide(); + } + if(this.config.animate && skipAnim !== true){ + this.fireEvent("invalidated", this); + this.animateCollapse(); + }else{ + this.el.setLocation(-20000,-20000); + this.el.hide(); + this.collapsedEl.show(); + this.fireEvent("collapsed", this); + this.fireEvent("invalidated", this); + } + }, + + animateCollapse : function(){ + + }, + + + expand : function(e, skipAnim){ + if(e) e.stopPropagation(); + if(!this.collapsed || this.el.hasActiveFx()) return; + if(this.isSlid){ + this.afterSlideIn(); + skipAnim = true; + } + this.collapsed = false; + if(this.config.animate && skipAnim !== true){ + this.animateExpand(); + }else{ + this.el.show(); + if(this.split){ + this.split.el.show(); + } + this.collapsedEl.setLocation(-2000,-2000); + this.collapsedEl.hide(); + this.fireEvent("invalidated", this); + this.fireEvent("expanded", this); + } + }, + + animateExpand : function(){ + + }, + + initTabs : function(){ + this.bodyEl.setStyle("overflow", "hidden"); + var ts = new Ext.TabPanel(this.bodyEl.dom, { + tabPosition: this.bottomTabs ? 'bottom' : 'top', + disableTooltips: this.config.disableTabTips + }); + if(this.config.hideTabs){ + ts.stripWrap.setDisplayed(false); + } + this.tabs = ts; + ts.resizeTabs = this.config.resizeTabs === true; + ts.minTabWidth = this.config.minTabWidth || 40; + ts.maxTabWidth = this.config.maxTabWidth || 250; + ts.preferredTabWidth = this.config.preferredTabWidth || 150; + ts.monitorResize = false; + ts.bodyEl.setStyle("overflow", this.config.autoScroll ? "auto" : "hidden"); + ts.bodyEl.addClass('x-layout-tabs-body'); + this.panels.each(this.initPanelAsTab, this); + }, + + initPanelAsTab : function(panel){ + var ti = this.tabs.addTab(panel.getEl().id, panel.getTitle(), null, + this.config.closeOnTab && panel.isClosable()); + if(panel.tabTip !== undefined){ + ti.setTooltip(panel.tabTip); + } + ti.on("activate", function(){ + this.setActivePanel(panel); + }, this); + if(this.config.closeOnTab){ + ti.on("beforeclose", function(t, e){ + e.cancel = true; + this.remove(panel); + }, this); + } + return ti; + }, + + updatePanelTitle : function(panel, title){ + if(this.activePanel == panel){ + this.updateTitle(title); + } + if(this.tabs){ + var ti = this.tabs.getTab(panel.getEl().id); + ti.setText(title); + if(panel.tabTip !== undefined){ + ti.setTooltip(panel.tabTip); + } + } + }, + + updateTitle : function(title){ + if(this.titleTextEl && !this.config.title){ + this.titleTextEl.innerHTML = (typeof title != "undefined" && title.length > 0 ? title : " "); + } + }, + + setActivePanel : function(panel){ + panel = this.getPanel(panel); + if(this.activePanel && this.activePanel != panel){ + this.activePanel.setActiveState(false); + } + this.activePanel = panel; + panel.setActiveState(true); + if(this.panelSize){ + panel.setSize(this.panelSize.width, this.panelSize.height); + } + if(this.closeBtn){ + this.closeBtn.setVisible(!this.config.closeOnTab && !this.isSlid && panel.isClosable()); + } + this.updateTitle(panel.getTitle()); + if(this.tabs){ + this.fireEvent("invalidated", this); + } + this.fireEvent("panelactivated", this, panel); + }, + + + showPanel : function(panel){ + if(panel = this.getPanel(panel)){ + if(this.tabs){ + var tab = this.tabs.getTab(panel.getEl().id); + if(tab.isHidden()){ + this.tabs.unhideTab(tab.id); + } + tab.activate(); + }else{ + this.setActivePanel(panel); + } + } + return panel; + }, + + + getActivePanel : function(){ + return this.activePanel; + }, + + validateVisibility : function(){ + if(this.panels.getCount() < 1){ + this.updateTitle(" "); + this.closeBtn.hide(); + this.hide(); + }else{ + if(!this.isVisible()){ + this.show(); + } + } + }, + + + add : function(panel){ + if(arguments.length > 1){ + for(var i = 0, len = arguments.length; i < len; i++) { + this.add(arguments[i]); + } + return null; + } + if(this.hasPanel(panel)){ + this.showPanel(panel); + return panel; + } + panel.setRegion(this); + this.panels.add(panel); + if(this.panels.getCount() == 1 && !this.config.alwaysShowTabs){ + this.bodyEl.dom.appendChild(panel.getEl().dom); + if(panel.background !== true){ + this.setActivePanel(panel); + } + this.fireEvent("paneladded", this, panel); + return panel; + } + if(!this.tabs){ + this.initTabs(); + }else{ + this.initPanelAsTab(panel); + } + if(panel.background !== true){ + this.tabs.activate(panel.getEl().id); + } + this.fireEvent("paneladded", this, panel); + return panel; + }, + + + hidePanel : function(panel){ + if(this.tabs && (panel = this.getPanel(panel))){ + this.tabs.hideTab(panel.getEl().id); + } + }, + + + unhidePanel : function(panel){ + if(this.tabs && (panel = this.getPanel(panel))){ + this.tabs.unhideTab(panel.getEl().id); + } + }, + + clearPanels : function(){ + while(this.panels.getCount() > 0){ + this.remove(this.panels.first()); + } + }, + + + remove : function(panel, preservePanel){ + panel = this.getPanel(panel); + if(!panel){ + return null; + } + var e = {}; + this.fireEvent("beforeremove", this, panel, e); + if(e.cancel === true){ + return null; + } + preservePanel = (typeof preservePanel != "undefined" ? preservePanel : (this.config.preservePanels === true || panel.preserve === true)); + var panelId = panel.getId(); + this.panels.removeKey(panelId); + if(preservePanel){ + document.body.appendChild(panel.getEl().dom); + } + if(this.tabs){ + this.tabs.removeTab(panel.getEl().id); + }else if (!preservePanel){ + this.bodyEl.dom.removeChild(panel.getEl().dom); + } + if(this.panels.getCount() == 1 && this.tabs && !this.config.alwaysShowTabs){ + var p = this.panels.first(); + var tempEl = document.createElement("div"); + tempEl.appendChild(p.getEl().dom); + this.bodyEl.update(""); + this.bodyEl.dom.appendChild(p.getEl().dom); + tempEl = null; + this.updateTitle(p.getTitle()); + this.tabs = null; + this.bodyEl.setStyle("overflow", this.config.autoScroll ? "auto" : "hidden"); + this.setActivePanel(p); + } + panel.setRegion(null); + if(this.activePanel == panel){ + this.activePanel = null; + } + if(this.config.autoDestroy !== false && preservePanel !== true){ + try{panel.destroy();}catch(e){} + } + this.fireEvent("panelremoved", this, panel); + return panel; + }, + + + getTabs : function(){ + return this.tabs; + }, + + createTool : function(parentEl, className){ + var btn = Ext.DomHelper.append(parentEl, {tag: "div", cls: "x-layout-tools-button", + children: [{tag: "div", cls: "x-layout-tools-button-inner " + className, html: " "}]}, true); + btn.addClassOnOver("x-layout-tools-button-over"); + return btn; + } +}); + +Ext.SplitLayoutRegion = function(mgr, config, pos, cursor){ + this.cursor = cursor; + Ext.SplitLayoutRegion.superclass.constructor.call(this, mgr, config, pos); +}; + +Ext.extend(Ext.SplitLayoutRegion, Ext.LayoutRegion, { + splitTip : "Drag to resize.", + collapsibleSplitTip : "Drag to resize. Double click to hide.", + useSplitTips : false, + + applyConfig : function(config){ + Ext.SplitLayoutRegion.superclass.applyConfig.call(this, config); + if(config.split){ + if(!this.split){ + var splitEl = Ext.DomHelper.append(this.mgr.el.dom, + {tag: "div", id: this.el.id + "-split", cls: "x-layout-split x-layout-split-"+this.position, html: " "}); + + this.split = new Ext.SplitBar(splitEl, this.el, this.orientation); + this.split.on("moved", this.onSplitMove, this); + this.split.useShim = config.useShim === true; + this.split.getMaximumSize = this[this.position == 'north' || this.position == 'south' ? 'getVMaxSize' : 'getHMaxSize'].createDelegate(this); + if(this.useSplitTips){ + this.split.el.dom.title = config.collapsible ? this.collapsibleSplitTip : this.splitTip; + } + if(config.collapsible){ + this.split.el.on("dblclick", this.collapse, this); + } + } + if(typeof config.minSize != "undefined"){ + this.split.minSize = config.minSize; + } + if(typeof config.maxSize != "undefined"){ + this.split.maxSize = config.maxSize; + } + if(config.hideWhenEmpty || config.hidden || config.collapsed){ + this.hideSplitter(); + } + } + }, + + getHMaxSize : function(){ + var cmax = this.config.maxSize || 10000; + var center = this.mgr.getRegion("center"); + return Math.min(cmax, (this.el.getWidth()+center.getEl().getWidth())-center.getMinWidth()); + }, + + getVMaxSize : function(){ + var cmax = this.config.maxSize || 10000; + var center = this.mgr.getRegion("center"); + return Math.min(cmax, (this.el.getHeight()+center.getEl().getHeight())-center.getMinHeight()); + }, + + onSplitMove : function(split, newSize){ + this.fireEvent("resized", this, newSize); + }, + + + getSplitBar : function(){ + return this.split; + }, + + hide : function(){ + this.hideSplitter(); + Ext.SplitLayoutRegion.superclass.hide.call(this); + }, + + hideSplitter : function(){ + if(this.split){ + this.split.el.setLocation(-2000,-2000); + this.split.el.hide(); + } + }, + + show : function(){ + if(this.split){ + this.split.el.show(); + } + Ext.SplitLayoutRegion.superclass.show.call(this); + }, + + beforeSlide: function(){ + if(Ext.isGecko){ + this.bodyEl.clip(); + if(this.tabs) this.tabs.bodyEl.clip(); + if(this.activePanel){ + this.activePanel.getEl().clip(); + + if(this.activePanel.beforeSlide){ + this.activePanel.beforeSlide(); + } + } + } + }, + + afterSlide : function(){ + if(Ext.isGecko){ + this.bodyEl.unclip(); + if(this.tabs) this.tabs.bodyEl.unclip(); + if(this.activePanel){ + this.activePanel.getEl().unclip(); + if(this.activePanel.afterSlide){ + this.activePanel.afterSlide(); + } + } + } + }, + + initAutoHide : function(){ + if(this.autoHide !== false){ + if(!this.autoHideHd){ + var st = new Ext.util.DelayedTask(this.slideIn, this); + this.autoHideHd = { + "mouseout": function(e){ + if(!e.within(this.el, true)){ + st.delay(500); + } + }, + "mouseover" : function(e){ + st.cancel(); + }, + scope : this + }; + } + this.el.on(this.autoHideHd); + } + }, + + clearAutoHide : function(){ + if(this.autoHide !== false){ + this.el.un("mouseout", this.autoHideHd.mouseout); + this.el.un("mouseover", this.autoHideHd.mouseover); + } + }, + + clearMonitor : function(){ + Ext.get(document).un("click", this.slideInIf, this); + }, + + + slideOut : function(){ + if(this.isSlid || this.el.hasActiveFx()){ + return; + } + this.isSlid = true; + if(this.collapseBtn){ + this.collapseBtn.hide(); + } + this.closeBtnState = this.closeBtn.getStyle('display'); + this.closeBtn.hide(); + if(this.stickBtn){ + this.stickBtn.show(); + } + this.el.show(); + this.el.alignTo(this.collapsedEl, this.getCollapseAnchor()); + this.beforeSlide(); + this.el.setStyle("z-index", 10001); + this.el.slideIn(this.getSlideAnchor(), { + callback: function(){ + this.afterSlide(); + this.initAutoHide(); + Ext.get(document).on("click", this.slideInIf, this); + this.fireEvent("slideshow", this); + }, + scope: this, + block: true + }); + }, + + afterSlideIn : function(){ + this.clearAutoHide(); + this.isSlid = false; + this.clearMonitor(); + this.el.setStyle("z-index", ""); + if(this.collapseBtn){ + this.collapseBtn.show(); + } + this.closeBtn.setStyle('display', this.closeBtnState); + if(this.stickBtn){ + this.stickBtn.hide(); + } + this.fireEvent("slidehide", this); + }, + + slideIn : function(cb){ + if(!this.isSlid || this.el.hasActiveFx()){ + Ext.callback(cb); + return; + } + this.isSlid = false; + this.beforeSlide(); + this.el.slideOut(this.getSlideAnchor(), { + callback: function(){ + this.el.setLeftTop(-10000, -10000); + this.afterSlide(); + this.afterSlideIn(); + Ext.callback(cb); + }, + scope: this, + block: true + }); + }, + + slideInIf : function(e){ + if(!e.within(this.el)){ + this.slideIn(); + } + }, + + animateCollapse : function(){ + this.beforeSlide(); + this.el.setStyle("z-index", 20000); + var anchor = this.getSlideAnchor(); + this.el.slideOut(anchor, { + callback : function(){ + this.el.setStyle("z-index", ""); + this.collapsedEl.slideIn(anchor, {duration:.3}); + this.afterSlide(); + this.el.setLocation(-10000,-10000); + this.el.hide(); + this.fireEvent("collapsed", this); + }, + scope: this, + block: true + }); + }, + + animateExpand : function(){ + this.beforeSlide(); + this.el.alignTo(this.collapsedEl, this.getCollapseAnchor(), this.getExpandAdj()); + this.el.setStyle("z-index", 20000); + this.collapsedEl.hide({ + duration:.1 + }); + this.el.slideIn(this.getSlideAnchor(), { + callback : function(){ + this.el.setStyle("z-index", ""); + this.afterSlide(); + if(this.split){ + this.split.el.show(); + } + this.fireEvent("invalidated", this); + this.fireEvent("expanded", this); + }, + scope: this, + block: true + }); + }, + + anchors : { + "west" : "left", + "east" : "right", + "north" : "top", + "south" : "bottom" + }, + + sanchors : { + "west" : "l", + "east" : "r", + "north" : "t", + "south" : "b" + }, + + canchors : { + "west" : "tl-tr", + "east" : "tr-tl", + "north" : "tl-bl", + "south" : "bl-tl" + }, + + getAnchor : function(){ + return this.anchors[this.position]; + }, + + getCollapseAnchor : function(){ + return this.canchors[this.position]; + }, + + getSlideAnchor : function(){ + return this.sanchors[this.position]; + }, + + getAlignAdj : function(){ + var cm = this.cmargins; + switch(this.position){ + case "west": + return [0, 0]; + break; + case "east": + return [0, 0]; + break; + case "north": + return [0, 0]; + break; + case "south": + return [0, 0]; + break; + } + }, + + getExpandAdj : function(){ + var c = this.collapsedEl, cm = this.cmargins; + switch(this.position){ + case "west": + return [-(cm.right+c.getWidth()+cm.left), 0]; + break; + case "east": + return [cm.right+c.getWidth()+cm.left, 0]; + break; + case "north": + return [0, -(cm.top+cm.bottom+c.getHeight())]; + break; + case "south": + return [0, cm.top+cm.bottom+c.getHeight()]; + break; + } + } +}); + +Ext.CenterLayoutRegion = function(mgr, config){ + Ext.CenterLayoutRegion.superclass.constructor.call(this, mgr, config, "center"); + this.visible = true; + this.minWidth = config.minWidth || 20; + this.minHeight = config.minHeight || 20; +}; + +Ext.extend(Ext.CenterLayoutRegion, Ext.LayoutRegion, { + hide : function(){ + + }, + + show : function(){ + + }, + + getMinWidth: function(){ + return this.minWidth; + }, + + getMinHeight: function(){ + return this.minHeight; + } +}); + + +Ext.NorthLayoutRegion = function(mgr, config){ + Ext.NorthLayoutRegion.superclass.constructor.call(this, mgr, config, "north", "n-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.TOP; + this.split.orientation = Ext.SplitBar.VERTICAL; + this.split.el.addClass("x-layout-split-v"); + } + var size = config.initialSize || config.height; + if(typeof size != "undefined"){ + this.el.setHeight(size); + } +}; +Ext.extend(Ext.NorthLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.VERTICAL, + getBox : function(){ + if(this.collapsed){ + return this.collapsedEl.getBox(); + } + var box = this.el.getBox(); + if(this.split){ + box.height += this.split.el.getHeight(); + } + return box; + }, + + updateBox : function(box){ + if(this.split && !this.collapsed){ + box.height -= this.split.el.getHeight(); + this.split.el.setLeft(box.x); + this.split.el.setTop(box.y+box.height); + this.split.el.setWidth(box.width); + } + if(this.collapsed){ + this.updateBody(box.width, null); + } + Ext.NorthLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +Ext.SouthLayoutRegion = function(mgr, config){ + Ext.SouthLayoutRegion.superclass.constructor.call(this, mgr, config, "south", "s-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.BOTTOM; + this.split.orientation = Ext.SplitBar.VERTICAL; + this.split.el.addClass("x-layout-split-v"); + } + var size = config.initialSize || config.height; + if(typeof size != "undefined"){ + this.el.setHeight(size); + } +}; +Ext.extend(Ext.SouthLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.VERTICAL, + getBox : function(){ + if(this.collapsed){ + return this.collapsedEl.getBox(); + } + var box = this.el.getBox(); + if(this.split){ + var sh = this.split.el.getHeight(); + box.height += sh; + box.y -= sh; + } + return box; + }, + + updateBox : function(box){ + if(this.split && !this.collapsed){ + var sh = this.split.el.getHeight(); + box.height -= sh; + box.y += sh; + this.split.el.setLeft(box.x); + this.split.el.setTop(box.y-sh); + this.split.el.setWidth(box.width); + } + if(this.collapsed){ + this.updateBody(box.width, null); + } + Ext.SouthLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +Ext.EastLayoutRegion = function(mgr, config){ + Ext.EastLayoutRegion.superclass.constructor.call(this, mgr, config, "east", "e-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.RIGHT; + this.split.orientation = Ext.SplitBar.HORIZONTAL; + this.split.el.addClass("x-layout-split-h"); + } + var size = config.initialSize || config.width; + if(typeof size != "undefined"){ + this.el.setWidth(size); + } +}; +Ext.extend(Ext.EastLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.HORIZONTAL, + getBox : function(){ + if(this.collapsed){ + return this.collapsedEl.getBox(); + } + var box = this.el.getBox(); + if(this.split){ + var sw = this.split.el.getWidth(); + box.width += sw; + box.x -= sw; + } + return box; + }, + + updateBox : function(box){ + if(this.split && !this.collapsed){ + var sw = this.split.el.getWidth(); + box.width -= sw; + this.split.el.setLeft(box.x); + this.split.el.setTop(box.y); + this.split.el.setHeight(box.height); + box.x += sw; + } + if(this.collapsed){ + this.updateBody(null, box.height); + } + Ext.EastLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +Ext.WestLayoutRegion = function(mgr, config){ + Ext.WestLayoutRegion.superclass.constructor.call(this, mgr, config, "west", "w-resize"); + if(this.split){ + this.split.placement = Ext.SplitBar.LEFT; + this.split.orientation = Ext.SplitBar.HORIZONTAL; + this.split.el.addClass("x-layout-split-h"); + } + var size = config.initialSize || config.width; + if(typeof size != "undefined"){ + this.el.setWidth(size); + } +}; +Ext.extend(Ext.WestLayoutRegion, Ext.SplitLayoutRegion, { + orientation: Ext.SplitBar.HORIZONTAL, + getBox : function(){ + if(this.collapsed){ + return this.collapsedEl.getBox(); + } + var box = this.el.getBox(); + if(this.split){ + box.width += this.split.el.getWidth(); + } + return box; + }, + + updateBox : function(box){ + if(this.split && !this.collapsed){ + var sw = this.split.el.getWidth(); + box.width -= sw; + this.split.el.setLeft(box.x+box.width); + this.split.el.setTop(box.y); + this.split.el.setHeight(box.height); + } + if(this.collapsed){ + this.updateBody(null, box.height); + } + Ext.WestLayoutRegion.superclass.updateBox.call(this, box); + } +}); + + +Ext.LayoutStateManager = function(layout){ + + this.state = { + north: {}, + south: {}, + east: {}, + west: {} + }; +}; + +Ext.LayoutStateManager.prototype = { + init : function(layout, provider){ + this.provider = provider; + var state = provider.get(layout.id+"-layout-state"); + if(state){ + var wasUpdating = layout.isUpdating(); + if(!wasUpdating){ + layout.beginUpdate(); + } + for(var key in state){ + if(typeof state[key] != "function"){ + var rstate = state[key]; + var r = layout.getRegion(key); + if(r && rstate){ + if(rstate.size){ + r.resizeTo(rstate.size); + } + if(rstate.collapsed == true){ + r.collapse(true); + }else{ + r.expand(null, true); + } + } + } + } + if(!wasUpdating){ + layout.endUpdate(); + } + this.state = state; + } + this.layout = layout; + layout.on("regionresized", this.onRegionResized, this); + layout.on("regioncollapsed", this.onRegionCollapsed, this); + layout.on("regionexpanded", this.onRegionExpanded, this); + }, + + storeState : function(){ + this.provider.set(this.layout.id+"-layout-state", this.state); + }, + + onRegionResized : function(region, newSize){ + this.state[region.getPosition()].size = newSize; + this.storeState(); + }, + + onRegionCollapsed : function(region){ + this.state[region.getPosition()].collapsed = true; + this.storeState(); + }, + + onRegionExpanded : function(region){ + this.state[region.getPosition()].collapsed = false; + this.storeState(); + } +}; + +Ext.ContentPanel = function(el, config, content){ + if(el.autoCreate){ + config = el; + el = Ext.id(); + } + this.el = Ext.get(el); + if(!this.el && config && config.autoCreate){ + if(typeof config.autoCreate == "object"){ + if(!config.autoCreate.id){ + config.autoCreate.id = config.id||el; + } + this.el = Ext.DomHelper.append(document.body, + config.autoCreate, true); + }else{ + this.el = Ext.DomHelper.append(document.body, + {tag: "div", cls: "x-layout-inactive-content", id: config.id||el}, true); + } + } + this.closable = false; + this.loaded = false; + this.active = false; + if(typeof config == "string"){ + this.title = config; + }else{ + Ext.apply(this, config); + } + if(this.resizeEl){ + this.resizeEl = Ext.get(this.resizeEl, true); + }else{ + this.resizeEl = this.el; + } + this.addEvents({ + + "activate" : true, + + "deactivate" : true, + + + "resize" : true + }); + if(this.autoScroll){ + this.resizeEl.setStyle("overflow", "auto"); + } + content = content || this.content; + if(content){ + this.setContent(content); + } + if(config && config.url){ + this.setUrl(this.url, this.params, this.loadOnce); + } + Ext.ContentPanel.superclass.constructor.call(this); +}; + +Ext.extend(Ext.ContentPanel, Ext.util.Observable, { + tabTip:'', + setRegion : function(region){ + this.region = region; + if(region){ + this.el.replaceClass("x-layout-inactive-content", "x-layout-active-content"); + }else{ + this.el.replaceClass("x-layout-active-content", "x-layout-inactive-content"); + } + }, + + + getToolbar : function(){ + return this.toolbar; + }, + + setActiveState : function(active){ + this.active = active; + if(!active){ + this.fireEvent("deactivate", this); + }else{ + this.fireEvent("activate", this); + } + }, + + setContent : function(content, loadScripts){ + this.el.update(content, loadScripts); + }, + + ignoreResize : function(w, h){ + if(this.lastSize && this.lastSize.width == w && this.lastSize.height == h){ + return true; + }else{ + this.lastSize = {width: w, height: h}; + return false; + } + }, + + getUpdateManager : function(){ + return this.el.getUpdateManager(); + }, + + load : function(){ + var um = this.el.getUpdateManager(); + um.update.apply(um, arguments); + return this; + }, + + + + setUrl : function(url, params, loadOnce){ + if(this.refreshDelegate){ + this.removeListener("activate", this.refreshDelegate); + } + this.refreshDelegate = this._handleRefresh.createDelegate(this, [url, params, loadOnce]); + this.on("activate", this.refreshDelegate); + return this.el.getUpdateManager(); + }, + + _handleRefresh : function(url, params, loadOnce){ + if(!loadOnce || !this.loaded){ + var updater = this.el.getUpdateManager(); + updater.update(url, params, this._setLoaded.createDelegate(this)); + } + }, + + _setLoaded : function(){ + this.loaded = true; + }, + + + getId : function(){ + return this.el.id; + }, + + + getEl : function(){ + return this.el; + }, + + adjustForComponents : function(width, height){ + if(this.resizeEl != this.el){ + width -= this.el.getFrameWidth('lr'); + height -= this.el.getFrameWidth('tb'); + } + if(this.toolbar){ + var te = this.toolbar.getEl(); + height -= te.getHeight(); + te.setWidth(width); + } + if(this.adjustments){ + width += this.adjustments[0]; + height += this.adjustments[1]; + } + return {"width": width, "height": height}; + }, + + setSize : function(width, height){ + if(this.fitToFrame && !this.ignoreResize(width, height)){ + if(this.fitContainer && this.resizeEl != this.el){ + this.el.setSize(width, height); + } + var size = this.adjustForComponents(width, height); + this.resizeEl.setSize(this.autoWidth ? "auto" : size.width, this.autoHeight ? "auto" : size.height); + this.fireEvent('resize', this, size.width, size.height); + } + }, + + + getTitle : function(){ + return this.title; + }, + + + setTitle : function(title){ + this.title = title; + if(this.region){ + this.region.updatePanelTitle(this, title); + } + }, + + + isClosable : function(){ + return this.closable; + }, + + beforeSlide : function(){ + this.el.clip(); + this.resizeEl.clip(); + }, + + afterSlide : function(){ + this.el.unclip(); + this.resizeEl.unclip(); + }, + + + refresh : function(){ + if(this.refreshDelegate){ + this.loaded = false; + this.refreshDelegate(); + } + }, + + + destroy : function(){ + this.el.removeAllListeners(); + var tempEl = document.createElement("span"); + tempEl.appendChild(this.el.dom); + tempEl.innerHTML = ""; + this.el.remove(); + this.el = null; + } +}); + + +Ext.GridPanel = function(grid, config){ + this.wrapper = Ext.DomHelper.append(document.body, + {tag: "div", cls: "x-layout-grid-wrapper x-layout-inactive-content"}, true); + this.wrapper.dom.appendChild(grid.getGridEl().dom); + Ext.GridPanel.superclass.constructor.call(this, this.wrapper, config); + if(this.toolbar){ + this.toolbar.el.insertBefore(this.wrapper.dom.firstChild); + } + grid.monitorWindowResize = false; + grid.autoHeight = false; + grid.autoWidth = false; + this.grid = grid; + this.grid.getGridEl().replaceClass("x-layout-inactive-content", "x-layout-component-panel"); +}; + +Ext.extend(Ext.GridPanel, Ext.ContentPanel, { + getId : function(){ + return this.grid.id; + }, + + + getGrid : function(){ + return this.grid; + }, + + setSize : function(width, height){ + if(!this.ignoreResize(width, height)){ + var grid = this.grid; + var size = this.adjustForComponents(width, height); + grid.getGridEl().setSize(size.width, size.height); + grid.autoSize(); + } + }, + + beforeSlide : function(){ + this.grid.getView().scroller.clip(); + }, + + afterSlide : function(){ + this.grid.getView().scroller.unclip(); + }, + + destroy : function(){ + this.grid.destroy(); + delete this.grid; + Ext.GridPanel.superclass.destroy.call(this); + } +}); + + + +Ext.NestedLayoutPanel = function(layout, config){ + Ext.NestedLayoutPanel.superclass.constructor.call(this, layout.getEl(), config); + layout.monitorWindowResize = false; + this.layout = layout; + this.layout.getEl().addClass("x-layout-nested-layout"); +}; + +Ext.extend(Ext.NestedLayoutPanel, Ext.ContentPanel, { + + setSize : function(width, height){ + if(!this.ignoreResize(width, height)){ + var size = this.adjustForComponents(width, height); + var el = this.layout.getEl(); + el.setSize(size.width, size.height); + var touch = el.dom.offsetWidth; + this.layout.layout(); + + if(Ext.isIE && !this.initialized){ + this.initialized = true; + this.layout.layout(); + } + } + }, + + + getLayout : function(){ + return this.layout; + } +}); + +Ext.ScrollPanel = function(el, config, content){ + config = config || {}; + config.fitToFrame = true; + Ext.ScrollPanel.superclass.constructor.call(this, el, config, content); + + this.el.dom.style.overflow = "hidden"; + var wrap = this.el.wrap({cls: "x-scroller x-layout-inactive-content"}); + this.el.removeClass("x-layout-inactive-content"); + this.el.on("mousewheel", this.onWheel, this); + + var up = wrap.createChild({cls: "x-scroller-up", html: " "}, this.el.dom); + var down = wrap.createChild({cls: "x-scroller-down", html: " "}); + up.unselectable(); down.unselectable(); + up.on("click", this.scrollUp, this); + down.on("click", this.scrollDown, this); + up.addClassOnOver("x-scroller-btn-over"); + down.addClassOnOver("x-scroller-btn-over"); + up.addClassOnClick("x-scroller-btn-click"); + down.addClassOnClick("x-scroller-btn-click"); + this.adjustments = [0, -(up.getHeight() + down.getHeight())]; + + this.resizeEl = this.el; + this.el = wrap; this.up = up; this.down = down; +}; + +Ext.extend(Ext.ScrollPanel, Ext.ContentPanel, { + increment : 100, + wheelIncrement : 5, + scrollUp : function(){ + this.resizeEl.scroll("up", this.increment, {callback: this.afterScroll, scope: this}); + }, + + scrollDown : function(){ + this.resizeEl.scroll("down", this.increment, {callback: this.afterScroll, scope: this}); + }, + + afterScroll : function(){ + var el = this.resizeEl; + var t = el.dom.scrollTop, h = el.dom.scrollHeight, ch = el.dom.clientHeight; + this.up[t == 0 ? "addClass" : "removeClass"]("x-scroller-btn-disabled"); + this.down[h - t <= ch ? "addClass" : "removeClass"]("x-scroller-btn-disabled"); + }, + + setSize : function(){ + Ext.ScrollPanel.superclass.setSize.apply(this, arguments); + this.afterScroll(); + }, + + onWheel : function(e){ + var d = e.getWheelDelta(); + this.resizeEl.dom.scrollTop -= (d*this.wheelIncrement); + this.afterScroll(); + e.stopEvent(); + }, + + setContent : function(content, loadScripts){ + this.resizeEl.update(content, loadScripts); + } + +}); + +Ext.ReaderLayout = function(config, renderTo){ + var c = config || {size:{}}; + Ext.ReaderLayout.superclass.constructor.call(this, renderTo || document.body, { + north: c.north !== false ? Ext.apply({ + split:false, + initialSize: 32, + titlebar: false + }, c.north) : false, + west: c.west !== false ? Ext.apply({ + split:true, + initialSize: 200, + minSize: 175, + maxSize: 400, + titlebar: true, + collapsible: true, + animate: true, + margins:{left:5,right:0,bottom:5,top:5}, + cmargins:{left:5,right:5,bottom:5,top:5} + }, c.west) : false, + east: c.east !== false ? Ext.apply({ + split:true, + initialSize: 200, + minSize: 175, + maxSize: 400, + titlebar: true, + collapsible: true, + animate: true, + margins:{left:0,right:5,bottom:5,top:5}, + cmargins:{left:5,right:5,bottom:5,top:5} + }, c.east) : false, + center: Ext.apply({ + tabPosition: 'top', + autoScroll:false, + closeOnTab: true, + titlebar:false, + margins:{left:c.west!==false ? 0 : 5,right:c.east!==false ? 0 : 5,bottom:5,top:2} + }, c.center) + }); + + this.el.addClass('x-reader'); + + this.beginUpdate(); + + var inner = new Ext.BorderLayout(Ext.get(document.body).createChild(), { + south: c.preview !== false ? Ext.apply({ + split:true, + initialSize: 200, + minSize: 100, + autoScroll:true, + collapsible:true, + titlebar: true, + cmargins:{top:5,left:0, right:0, bottom:0} + }, c.preview) : false, + center: Ext.apply({ + autoScroll:false, + titlebar:false, + minHeight:200 + }, c.listView) + }); + this.add('center', new Ext.NestedLayoutPanel(inner, + Ext.apply({title: c.mainTitle || '',tabTip:''},c.innerPanelCfg))); + + this.endUpdate(); + + this.regions.preview = inner.getRegion('south'); + this.regions.listView = inner.getRegion('center'); +}; + +Ext.extend(Ext.ReaderLayout, Ext.BorderLayout); + +Ext.grid.Grid = function(container, config){ + + this.container = Ext.get(container); + this.container.update(""); + this.container.setStyle("overflow", "hidden"); + this.container.addClass('x-grid-container'); + + this.id = this.container.id; + + Ext.apply(this, config); + + if(this.ds){ + this.dataSource = 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; + } + + if(this.width){ + this.container.setWidth(this.width); + } + + if(this.height){ + this.container.setHeight(this.height); + } + + this.addEvents({ + + + "click" : true, + + "dblclick" : true, + + "contextmenu" : true, + + "mousedown" : true, + + "mouseup" : true, + + "mouseover" : true, + + "mouseout" : true, + + "keypress" : true, + + "keydown" : true, + + + + + "cellclick" : true, + + "celldblclick" : true, + + "rowclick" : true, + + "rowdblclick" : true, + + "headerclick" : true, + + "headerdblclick" : true, + + "rowcontextmenu" : true, + + "cellcontextmenu" : true, + + "headercontextmenu" : true, + + "bodyscroll" : true, + + "columnresize" : true, + + "columnmove" : true, + + "startdrag" : true, + + "enddrag" : true, + + "dragdrop" : true, + + "dragover" : true, + + "dragenter" : true, + + "dragout" : true, + + render : true + }); + + Ext.grid.Grid.superclass.constructor.call(this); +}; +Ext.extend(Ext.grid.Grid, Ext.util.Observable, { + + minColumnWidth : 25, + + + autoSizeColumns : false, + + + autoSizeHeaders : true, + + + monitorWindowResize : true, + + + maxRowsToMeasure : 0, + + + trackMouseOver : true, + + + enableDragDrop : false, + + + enableColumnMove : true, + + + enableColumnHide : true, + + + enableRowHeightSync : false, + + + stripeRows : true, + + + autoHeight : false, + + + autoExpandColumn : false, + + + autoExpandMin : 50, + + + autoExpandMax : 1000, + + + view : null, + + + loadMask : false, + + + rendered : false, + + + + + render : function(){ + var c = this.container; + + if((!c.dom.offsetHeight || c.dom.offsetHeight < 20) || c.getStyle("height") == "auto"){ + this.autoHeight = true; + } + var view = this.getView(); + view.init(this); + + c.on("click", this.onClick, this); + c.on("dblclick", this.onDblClick, this); + c.on("contextmenu", this.onContextMenu, this); + c.on("keydown", this.onKeyDown, this); + + this.relayEvents(c, ["mousedown","mouseup","mouseover","mouseout","keypress"]); + + this.getSelectionModel().init(this); + + view.render(); + + if(this.loadMask){ + this.loadMask = new Ext.LoadMask(this.container, + Ext.apply({store:this.dataSource}, this.loadMask)); + } + this.rendered = true; + this.fireEvent('render', this); + return this; + }, + + + reconfigure : function(dataSource, colModel){ + if(this.loadMask){ + this.loadMask.destroy(); + this.loadMask = new Ext.LoadMask(this.container, + Ext.apply({store:dataSource}, this.loadMask)); + } + this.view.bind(dataSource, colModel); + this.dataSource = dataSource; + this.colModel = colModel; + this.view.refresh(true); + }, + + + onKeyDown : function(e){ + this.fireEvent("keydown", e); + }, + + + destroy : function(removeEl, keepListeners){ + if(this.loadMask){ + this.loadMask.destroy(); + } + var c = this.container; + c.removeAllListeners(); + this.view.destroy(); + this.colModel.purgeListeners(); + if(!keepListeners){ + this.purgeListeners(); + } + c.update(""); + if(removeEl === true){ + c.remove(); + } + }, + + + processEvent : function(name, e){ + this.fireEvent(name, e); + var t = e.getTarget(); + var v = this.view; + var header = v.findHeaderIndex(t); + if(header !== false){ + this.fireEvent("header" + name, this, header, e); + }else{ + var row = v.findRowIndex(t); + var cell = v.findCellIndex(t); + if(row !== false){ + this.fireEvent("row" + name, this, row, e); + if(cell !== false){ + this.fireEvent("cell" + name, this, row, cell, e); + } + } + } + }, + + + onClick : function(e){ + this.processEvent("click", e); + }, + + + onContextMenu : function(e, t){ + this.processEvent("contextmenu", e); + }, + + + onDblClick : function(e){ + this.processEvent("dblclick", e); + }, + + + walkCells : function(row, col, step, fn, scope){ + var cm = this.colModel, clen = cm.getColumnCount(); + var ds = this.dataSource, rlen = ds.getCount(), first = true; + if(step < 0){ + if(col < 0){ + row--; + first = false; + } + while(row >= 0){ + if(!first){ + col = clen-1; + } + first = false; + while(col >= 0){ + if(fn.call(scope || this, row, col, cm) === true){ + return [row, col]; + } + col--; + } + row--; + } + } else { + if(col >= clen){ + row++; + first = false; + } + while(row < rlen){ + if(!first){ + col = 0; + } + first = false; + while(col < clen){ + if(fn.call(scope || this, row, col, cm) === true){ + return [row, col]; + } + col++; + } + row++; + } + } + return null; + }, + + + getSelections : function(){ + return this.selModel.getSelections(); + }, + + + autoSize : function(){ + if(this.rendered){ + this.view.layout(); + if(this.view.adjustForScroll){ + this.view.adjustForScroll(); + } + } + }, + + + getGridEl : function(){ + return this.container; + }, + + + stopEditing : function(){}, + + + getSelectionModel : function(){ + if(!this.selModel){ + this.selModel = new Ext.grid.RowSelectionModel(); + } + return this.selModel; + }, + + + getDataSource : function(){ + return this.dataSource; + }, + + + getColumnModel : function(){ + return this.colModel; + }, + + + getView : function(){ + if(!this.view){ + this.view = new Ext.grid.GridView(this.viewConfig); + } + return this.view; + }, + + getDragDropText : function(){ + var count = this.selModel.getCount(); + return String.format(this.ddText, count, count == 1 ? '' : 's'); + } +}); + +Ext.grid.Grid.prototype.ddText = "{0} selected row{1}"; +Ext.grid.AbstractGridView = function(){ + this.grid = null; + + this.events = { + "beforerowremoved" : true, + "beforerowsinserted" : true, + "beforerefresh" : true, + "rowremoved" : true, + "rowsinserted" : true, + "rowupdated" : true, + "refresh" : true + }; + Ext.grid.AbstractGridView.superclass.constructor.call(this); +}; + +Ext.extend(Ext.grid.AbstractGridView, Ext.util.Observable, { + rowClass : "x-grid-row", + cellClass : "x-grid-cell", + tdClass : "x-grid-td", + hdClass : "x-grid-hd", + splitClass : "x-grid-hd-split", + + init: function(grid){ + this.grid = grid; + var cid = this.grid.getGridEl().id; + this.colSelector = "#" + cid + " ." + this.cellClass + "-"; + this.tdSelector = "#" + cid + " ." + this.tdClass + "-"; + this.hdSelector = "#" + cid + " ." + this.hdClass + "-"; + this.splitSelector = "#" + cid + " ." + this.splitClass + "-"; + }, + + getColumnRenderers : function(){ + var renderers = []; + var cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + for(var i = 0; i < colCount; i++){ + renderers[i] = cm.getRenderer(i); + } + return renderers; + }, + + getColumnIds : function(){ + var ids = []; + var cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + for(var i = 0; i < colCount; i++){ + ids[i] = cm.getColumnId(i); + } + return ids; + }, + + getDataIndexes : function(){ + if(!this.indexMap){ + this.indexMap = this.buildIndexMap(); + } + return this.indexMap.colToData; + }, + + getColumnIndexByDataIndex : function(dataIndex){ + if(!this.indexMap){ + this.indexMap = this.buildIndexMap(); + } + return this.indexMap.dataToCol[dataIndex]; + }, + + + setCSSStyle : function(colIndex, name, value){ + var selector = "#" + this.grid.id + " .x-grid-col-" + colIndex; + Ext.util.CSS.updateRule(selector, name, value); + }, + + generateRules : function(cm){ + var ruleBuf = [], rulesId = this.grid.id + '-cssrules'; + Ext.util.CSS.removeStyleSheet(rulesId); + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + var cid = cm.getColumnId(i); + ruleBuf.push(this.colSelector, cid, " {\n", cm.config[i].css, "}\n", + this.tdSelector, cid, " {\n}\n", + this.hdSelector, cid, " {\n}\n", + this.splitSelector, cid, " {\n}\n"); + } + return Ext.util.CSS.createStyleSheet(ruleBuf.join(""), rulesId); + } +}); + +Ext.grid.GridView = function(config){ + Ext.grid.GridView.superclass.constructor.call(this); + this.el = null; + + Ext.apply(this, config); +}; + +Ext.extend(Ext.grid.GridView, Ext.grid.AbstractGridView, { + + + rowClass : "x-grid-row", + + cellClass : "x-grid-col", + + tdClass : "x-grid-td", + + hdClass : "x-grid-hd", + + splitClass : "x-grid-split", + + sortClasses : ["sort-asc", "sort-desc"], + + enableMoveAnim : false, + + hlColor: "C3DAF9", + + dh : Ext.DomHelper, + + fly : Ext.Element.fly, + + css : Ext.util.CSS, + + borderWidth: 1, + + splitOffset: 3, + + scrollIncrement : 22, + + cellRE: /(?:.*?)x-grid-(?:hd|cell|csplit)-(?:[\d]+)-([\d]+)(?:.*?)/, + + findRE: /\s?(?:x-grid-hd|x-grid-col|x-grid-csplit)\s/, + + bind : function(ds, cm){ + if(this.ds){ + this.ds.un("load", this.onLoad, this); + this.ds.un("datachanged", this.onDataChange, this); + this.ds.un("add", this.onAdd, this); + this.ds.un("remove", this.onRemove, this); + this.ds.un("update", this.onUpdate, this); + this.ds.un("clear", this.onClear, this); + } + if(ds){ + ds.on("load", this.onLoad, this); + ds.on("datachanged", this.onDataChange, this); + ds.on("add", this.onAdd, this); + ds.on("remove", this.onRemove, this); + ds.on("update", this.onUpdate, this); + ds.on("clear", this.onClear, this); + } + this.ds = ds; + + if(this.cm){ + this.cm.un("widthchange", this.onColWidthChange, this); + this.cm.un("headerchange", this.onHeaderChange, this); + this.cm.un("hiddenchange", this.onHiddenChange, this); + this.cm.un("columnmoved", this.onColumnMove, this); + this.cm.un("columnlockchange", this.onColumnLock, this); + } + if(cm){ + this.generateRules(cm); + cm.on("widthchange", this.onColWidthChange, this); + cm.on("headerchange", this.onHeaderChange, this); + cm.on("hiddenchange", this.onHiddenChange, this); + cm.on("columnmoved", this.onColumnMove, this); + cm.on("columnlockchange", this.onColumnLock, this); + } + this.cm = cm; + }, + + init: function(grid){ + Ext.grid.GridView.superclass.init.call(this, grid); + + this.bind(grid.dataSource, grid.colModel); + + grid.on("headerclick", this.handleHeaderClick, this); + + if(grid.trackMouseOver){ + grid.on("mouseover", this.onRowOver, this); + grid.on("mouseout", this.onRowOut, this); + } + grid.cancelTextSelection = function(){}; + this.gridId = grid.id; + + var tpls = this.templates || {}; + + if(!tpls.master){ + tpls.master = new Ext.Template( + '
    ', + '
    ', + '
    ', + '
    ', + '
    {lockedHeader}
    ', + '
    {lockedBody}
    ', + "
    ", + '
    ', + '
    {header}
    ', + '
    {body}
    ', + "
    ", + '
    ', + '', + '
     
    ', + "
    " + ); + tpls.master.disableformats = true; + } + + if(!tpls.header){ + tpls.header = new Ext.Template( + '', + '{cells}', + "
    {splits}" + ); + tpls.header.disableformats = true; + } + tpls.header.compile(); + + if(!tpls.hcell){ + tpls.hcell = new Ext.Template( + '
    ', + '
    {value}
    ', + "
    " + ); + tpls.hcell.disableFormats = true; + } + tpls.hcell.compile(); + + if(!tpls.hsplit){ + tpls.hsplit = new Ext.Template('
     
    '); + tpls.hsplit.disableFormats = true; + } + tpls.hsplit.compile(); + + if(!tpls.body){ + tpls.body = new Ext.Template( + '', + "{rows}", + "
    " + ); + tpls.body.disableFormats = true; + } + tpls.body.compile(); + + if(!tpls.row){ + tpls.row = new Ext.Template('{cells}'); + tpls.row.disableFormats = true; + } + tpls.row.compile(); + + if(!tpls.cell){ + tpls.cell = new Ext.Template( + '', + '
    {value}
    ', + "" + ); + tpls.cell.disableFormats = true; + } + tpls.cell.compile(); + + this.templates = tpls; + }, + + + onColWidthChange : function(){ + this.updateColumns.apply(this, arguments); + }, + onHeaderChange : function(){ + this.updateHeaders.apply(this, arguments); + }, + onHiddenChange : function(){ + this.handleHiddenChange.apply(this, arguments); + }, + onColumnMove : function(){ + this.handleColumnMove.apply(this, arguments); + }, + onColumnLock : function(){ + this.handleLockChange.apply(this, arguments); + }, + + onDataChange : function(){ + this.refresh(); + this.updateHeaderSortState(); + }, + + onClear : function(){ + this.refresh(); + }, + + onUpdate : function(ds, record){ + this.refreshRow(record); + }, + + refreshRow : function(record){ + var ds = this.ds, index; + if(typeof record == 'number'){ + index = record; + record = ds.getAt(index); + }else{ + index = ds.indexOf(record); + } + this.insertRows(ds, index, index, true); + this.onRemove(ds, record, index+1, true); + this.syncRowHeights(index, index); + this.layout(); + this.fireEvent("rowupdated", this, index, record); + }, + + onAdd : function(ds, records, index){ + this.insertRows(ds, index, index + (records.length-1)); + }, + + onRemove : function(ds, record, index, isUpdate){ + if(isUpdate !== true){ + this.fireEvent("beforerowremoved", this, index, record); + } + var bt = this.getBodyTable(), lt = this.getLockedTable(); + if(bt.rows[index]){ + bt.firstChild.removeChild(bt.rows[index]); + } + if(lt.rows[index]){ + lt.firstChild.removeChild(lt.rows[index]); + } + if(isUpdate !== true){ + this.stripeRows(index); + this.syncRowHeights(index, index); + this.layout(); + this.fireEvent("rowremoved", this, index, record); + } + }, + + onLoad : function(){ + this.scrollToTop(); + }, + + + scrollToTop : function(){ + if(this.scroller){ + this.scroller.dom.scrollTop = 0; + this.syncScroll(); + } + }, + + + getHeaderPanel : function(doShow){ + if(doShow){ + this.headerPanel.show(); + } + return this.headerPanel; + }, + + + getFooterPanel : function(doShow){ + if(doShow){ + this.footerPanel.show(); + } + return this.footerPanel; + }, + + initElements : function(){ + var E = Ext.Element; + var el = this.grid.getGridEl().dom.firstChild; + var cs = el.childNodes; + + this.el = new E(el); + this.headerPanel = new E(el.firstChild); + this.headerPanel.enableDisplayMode("block"); + + this.scroller = new E(cs[1]); + this.scrollSizer = new E(this.scroller.dom.firstChild); + + this.lockedWrap = new E(cs[2]); + this.lockedHd = new E(this.lockedWrap.dom.firstChild); + this.lockedBody = new E(this.lockedWrap.dom.childNodes[1]); + + this.mainWrap = new E(cs[3]); + this.mainHd = new E(this.mainWrap.dom.firstChild); + this.mainBody = new E(this.mainWrap.dom.childNodes[1]); + + this.footerPanel = new E(cs[4]); + this.footerPanel.enableDisplayMode("block"); + + this.focusEl = new E(cs[5]); + this.focusEl.swallowEvent("click", true); + this.resizeProxy = new E(cs[6]); + + this.headerSelector = String.format( + '#{0} td.x-grid-hd, #{1} td.x-grid-hd', + this.lockedHd.id, this.mainHd.id + ); + + this.splitterSelector = String.format( + '#{0} div.x-grid-split, #{1} div.x-grid-split', + this.lockedHd.id, this.mainHd.id + ); + }, + + getHeaderCell : function(index){ + return Ext.DomQuery.select(this.headerSelector)[index]; + }, + + getHeaderCellMeasure : function(index){ + return this.getHeaderCell(index).firstChild; + }, + + getHeaderCellText : function(index){ + return this.getHeaderCell(index).firstChild.firstChild; + }, + + getLockedTable : function(){ + return this.lockedBody.dom.firstChild; + }, + + getBodyTable : function(){ + return this.mainBody.dom.firstChild; + }, + + getLockedRow : function(index){ + return this.getLockedTable().rows[index]; + }, + + getRow : function(index){ + return this.getBodyTable().rows[index]; + }, + + getRowComposite : function(index){ + if(!this.rowEl){ + this.rowEl = new Ext.CompositeElementLite(); + } + var els = [], lrow, mrow; + if(lrow = this.getLockedRow(index)){ + els.push(lrow); + } + if(mrow = this.getRow(index)){ + els.push(mrow); + } + this.rowEl.elements = els; + return this.rowEl; + }, + + getCell : function(rowIndex, colIndex){ + var locked = this.cm.getLockedCount(); + var source; + if(colIndex < locked){ + source = this.lockedBody.dom.firstChild; + }else{ + source = this.mainBody.dom.firstChild; + colIndex -= locked; + } + return source.rows[rowIndex].childNodes[colIndex]; + }, + + getCellText : function(rowIndex, colIndex){ + return this.getCell(rowIndex, colIndex).firstChild.firstChild; + }, + + getCellBox : function(cell){ + var b = this.fly(cell).getBox(); + if(Ext.isOpera){ + b.y = cell.offsetTop + this.mainBody.getY(); + } + return b; + }, + + getCellIndex : function(cell){ + var id = String(cell.className).match(this.cellRE); + if(id){ + return parseInt(id[1], 10); + } + return 0; + }, + + findHeaderIndex : function(n){ + var r = Ext.fly(n).findParent("td." + this.hdClass, 6); + return r ? this.getCellIndex(r) : false; + }, + + findHeaderCell : function(n){ + var r = Ext.fly(n).findParent("td." + this.hdClass, 6); + return r ? r : false; + }, + + findRowIndex : function(n){ + if(!n){ + return false; + } + var r = Ext.fly(n).findParent("tr." + this.rowClass, 6); + return r ? r.rowIndex : false; + }, + + findCellIndex : function(node){ + var stop = this.el.dom; + while(node && node != stop){ + if(this.findRE.test(node.className)){ + return this.getCellIndex(node); + } + node = node.parentNode; + } + return false; + }, + + getColumnId : function(index){ + return this.cm.getColumnId(index); + }, + + getSplitters : function(){ + if(this.splitterSelector){ + return Ext.DomQuery.select(this.splitterSelector); + }else{ + return null; + } + }, + + getSplitter : function(index){ + return this.getSplitters()[index]; + }, + + onRowOver : function(e, t){ + var row; + if((row = this.findRowIndex(t)) !== false){ + this.getRowComposite(row).addClass("x-grid-row-over"); + } + }, + + onRowOut : function(e, t){ + var row; + if((row = this.findRowIndex(t)) !== false && row !== this.findRowIndex(e.getRelatedTarget())){ + this.getRowComposite(row).removeClass("x-grid-row-over"); + } + }, + + renderHeaders : function(){ + var cm = this.cm; + var ct = this.templates.hcell, ht = this.templates.header, st = this.templates.hsplit; + var cb = [], lb = [], sb = [], lsb = [], p = {}; + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + p.cellId = "x-grid-hd-0-" + i; + p.splitId = "x-grid-csplit-0-" + i; + p.id = cm.getColumnId(i); + p.title = cm.getColumnTooltip(i) || ""; + p.value = cm.getColumnHeader(i) || ""; + p.style = (this.grid.enableColumnResize === false || !cm.isResizable(i) || cm.isFixed(i)) ? 'cursor:default' : ''; + if(!cm.isLocked(i)){ + cb[cb.length] = ct.apply(p); + sb[sb.length] = st.apply(p); + }else{ + lb[lb.length] = ct.apply(p); + lsb[lsb.length] = st.apply(p); + } + } + return [ht.apply({cells: lb.join(""), splits:lsb.join("")}), + ht.apply({cells: cb.join(""), splits:sb.join("")})]; + }, + + updateHeaders : function(){ + var html = this.renderHeaders(); + this.lockedHd.update(html[0]); + this.mainHd.update(html[1]); + }, + + + focusRow : function(row){ + var x = this.scroller.dom.scrollLeft; + this.focusCell(row, 0, false); + this.scroller.dom.scrollLeft = x; + }, + + + focusCell : function(row, col, hscroll){ + var el = this.ensureVisible(row, col, hscroll); + this.focusEl.alignTo(el, "tl-tl"); + if(Ext.isGecko){ + this.focusEl.focus(); + }else{ + this.focusEl.focus.defer(1, this.focusEl); + } + }, + + + ensureVisible : function(row, col, hscroll){ + if(typeof row != "number"){ + row = row.rowIndex; + } + if(row < 0 && row >= this.ds.getCount()){ + return; + } + col = (col !== undefined ? col : 0); + var cm = this.grid.colModel; + while(cm.isHidden(col)){ + col++; + } + + var el = this.getCell(row, col); + if(!el){ + return; + } + var c = this.scroller.dom; + + var ctop = parseInt(el.offsetTop, 10); + var cleft = parseInt(el.offsetLeft, 10); + var cbot = ctop + el.offsetHeight; + var cright = cleft + el.offsetWidth; + + var ch = c.clientHeight - this.mainHd.dom.offsetHeight; + var stop = parseInt(c.scrollTop, 10); + var sleft = parseInt(c.scrollLeft, 10); + var sbot = stop + ch; + var sright = sleft + c.clientWidth; + + if(ctop < stop){ + c.scrollTop = ctop; + }else if(cbot > sbot){ + c.scrollTop = cbot-ch; + } + + if(hscroll !== false){ + if(cleft < sleft){ + c.scrollLeft = cleft; + }else if(cright > sright){ + c.scrollLeft = cright-c.clientWidth; + } + } + return el; + }, + + updateColumns : function(){ + this.grid.stopEditing(); + var cm = this.grid.colModel, colIds = this.getColumnIds(); + + var pos = 0; + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + + var w = cm.getColumnWidth(i); + this.css.updateRule(this.colSelector+colIds[i], "width", (w - this.borderWidth) + "px"); + this.css.updateRule(this.hdSelector+colIds[i], "width", (w - this.borderWidth) + "px"); + } + this.updateSplitters(); + }, + + generateRules : function(cm){ + var ruleBuf = [], rulesId = this.grid.id + '-cssrules'; + Ext.util.CSS.removeStyleSheet(rulesId); + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + var cid = cm.getColumnId(i); + var align = ''; + if(cm.config[i].align){ + align = 'text-align:'+cm.config[i].align+';'; + } + var hidden = ''; + if(cm.isHidden(i)){ + hidden = 'display:none;'; + } + var width = "width:" + (cm.getColumnWidth(i) - this.borderWidth) + "px;"; + ruleBuf.push( + this.colSelector, cid, " {\n", cm.config[i].css, align, width, "\n}\n", + this.hdSelector, cid, " {\n", align, width, "}\n", + this.tdSelector, cid, " {\n",hidden,"\n}\n", + this.splitSelector, cid, " {\n", hidden , "\n}\n"); + } + return Ext.util.CSS.createStyleSheet(ruleBuf.join(""), rulesId); + }, + + updateSplitters : function(){ + var cm = this.cm, s = this.getSplitters(); + if(s){ + var pos = 0, locked = true; + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + if(cm.isHidden(i)) continue; + var w = cm.getColumnWidth(i); + if(!cm.isLocked(i) && locked){ + pos = 0; + locked = false; + } + pos += w; + s[i].style.left = (pos-this.splitOffset) + "px"; + } + } + }, + + handleHiddenChange : function(colModel, colIndex, hidden){ + if(hidden){ + this.hideColumn(colIndex); + }else{ + this.unhideColumn(colIndex); + } + }, + + hideColumn : function(colIndex){ + var cid = this.getColumnId(colIndex); + this.css.updateRule(this.tdSelector+cid, "display", "none"); + this.css.updateRule(this.splitSelector+cid, "display", "none"); + if(Ext.isSafari){ + this.updateHeaders(); + } + this.updateSplitters(); + this.layout(); + }, + + unhideColumn : function(colIndex){ + var cid = this.getColumnId(colIndex); + this.css.updateRule(this.tdSelector+cid, "display", ""); + this.css.updateRule(this.splitSelector+cid, "display", ""); + + if(Ext.isSafari){ + this.updateHeaders(); + } + this.updateSplitters(); + this.layout(); + }, + + insertRows : function(dm, firstRow, lastRow, isUpdate){ + if(firstRow == 0 && lastRow == dm.getCount()-1){ + this.refresh(); + }else{ + if(!isUpdate){ + this.fireEvent("beforerowsinserted", this, firstRow, lastRow); + } + var s = this.getScrollState(); + var markup = this.renderRows(firstRow, lastRow); + this.bufferRows(markup[0], this.getLockedTable(), firstRow); + this.bufferRows(markup[1], this.getBodyTable(), firstRow); + this.restoreScroll(s); + if(!isUpdate){ + this.fireEvent("rowsinserted", this, firstRow, lastRow); + this.syncRowHeights(firstRow, lastRow); + this.stripeRows(firstRow); + this.layout(); + } + } + }, + + bufferRows : function(markup, target, index){ + var before = null, trows = target.rows, tbody = target.tBodies[0]; + if(index < trows.length){ + before = trows[index]; + } + var b = document.createElement("div"); + b.innerHTML = ""+markup+"
    "; + var rows = b.firstChild.rows; + for(var i = 0, len = rows.length; i < len; i++){ + if(before){ + tbody.insertBefore(rows[0], before); + }else{ + tbody.appendChild(rows[0]); + } + } + b.innerHTML = ""; + b = null; + }, + + deleteRows : function(dm, firstRow, lastRow){ + if(dm.getRowCount()<1){ + this.fireEvent("beforerefresh", this); + this.mainBody.update(""); + this.lockedBody.update(""); + this.fireEvent("refresh", this); + }else{ + this.fireEvent("beforerowsdeleted", this, firstRow, lastRow); + var bt = this.getBodyTable(); + var tbody = bt.firstChild; + var rows = bt.rows; + for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){ + tbody.removeChild(rows[firstRow]); + } + this.stripeRows(firstRow); + this.fireEvent("rowsdeleted", this, firstRow, lastRow); + } + }, + + updateRows : function(dataSource, firstRow, lastRow){ + var s = this.getScrollState(); + this.refresh(); + this.restoreScroll(s); + }, + + handleSort : function(dataSource, sortColumnIndex, sortDir, noRefresh){ + if(!noRefresh){ + this.refresh(); + } + this.updateHeaderSortState(); + }, + + getScrollState : function(){ + var sb = this.scroller.dom; + return {left: sb.scrollLeft, top: sb.scrollTop}; + }, + + stripeRows : function(startRow){ + if(!this.grid.stripeRows || this.ds.getCount() < 1){ + return; + } + startRow = startRow || 0; + var rows = this.getBodyTable().rows; + var lrows = this.getLockedTable().rows; + var cls = ' x-grid-row-alt '; + for(var i = startRow, len = rows.length; i < len; i++){ + var row = rows[i], lrow = lrows[i]; + var isAlt = ((i+1) % 2 == 0); + var hasAlt = (' '+row.className + ' ').indexOf(cls) != -1; + if(isAlt == hasAlt){ + continue; + } + if(isAlt){ + row.className += " x-grid-row-alt"; + }else{ + row.className = row.className.replace("x-grid-row-alt", ""); + } + if(lrow){ + lrow.className = row.className; + } + } + }, + + restoreScroll : function(state){ + var sb = this.scroller.dom; + sb.scrollLeft = state.left; + sb.scrollTop = state.top; + this.syncScroll(); + }, + + syncScroll : function(){ + var sb = this.scroller.dom; + var sh = this.mainHd.dom; + var bs = this.mainBody.dom; + var lv = this.lockedBody.dom; + sh.scrollLeft = bs.scrollLeft = sb.scrollLeft; + lv.scrollTop = bs.scrollTop = sb.scrollTop; + }, + + handleScroll : function(e){ + this.syncScroll(); + var sb = this.scroller.dom; + this.grid.fireEvent("bodyscroll", sb.scrollLeft, sb.scrollTop); + e.stopEvent(); + }, + + handleWheel : function(e){ + var d = e.getWheelDelta(); + this.scroller.dom.scrollTop -= d*22; + + this.lockedBody.dom.scrollTop = this.mainBody.dom.scrollTop = this.scroller.dom.scrollTop; + e.stopEvent(); + }, + + renderRows : function(startRow, endRow){ + + var g = this.grid, cm = g.colModel, ds = g.dataSource, stripe = g.stripeRows; + var colCount = cm.getColumnCount(); + + if(ds.getCount() < 1){ + return ["", ""]; + } + + + var cs = []; + for(var i = 0; i < colCount; i++){ + var name = cm.getDataIndex(i); + cs[i] = { + name : typeof name == 'undefined' ? ds.fields.get(i).name : name, + renderer : cm.getRenderer(i), + id : cm.getColumnId(i), + locked : cm.isLocked(i) + }; + } + + startRow = startRow || 0; + endRow = typeof endRow == "undefined"? ds.getCount()-1 : endRow; + + + var rs = ds.getRange(startRow, endRow); + + return this.doRender(cs, rs, ds, startRow, colCount, stripe); + }, + + + + + doRender : Ext.isGecko ? + function(cs, rs, ds, startRow, colCount, stripe){ + var ts = this.templates, ct = ts.cell, rt = ts.row; + + var buf = "", lbuf = "", cb, lcb, c, p = {}, rp = {}, r, rowIndex; + for(var j = 0, len = rs.length; j < len; j++){ + r = rs[j]; cb = ""; lcb = ""; rowIndex = (j+startRow); + for(var i = 0; i < colCount; i++){ + c = cs[i]; + p.cellId = "x-grid-cell-" + rowIndex + "-" + i; + p.id = c.id; + p.css = p.attr = ""; + p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds); + if(p.value == undefined || p.value === "") p.value = " "; + if(r.dirty && typeof r.modified[c.name] !== 'undefined'){ + p.css += p.css ? ' x-grid-dirty-cell' : 'x-grid-dirty-cell'; + } + var markup = ct.apply(p); + if(!c.locked){ + cb+= markup; + }else{ + lcb+= markup; + } + } + var alt = []; + if(stripe && ((rowIndex+1) % 2 == 0)){ + alt[0] = "x-grid-row-alt"; + } + if(r.dirty){ + alt[1] = " x-grid-dirty-row"; + } + rp.cells = lcb; + if(this.getRowClass){ + alt[2] = this.getRowClass(r, rowIndex); + } + rp.alt = alt.join(" "); + lbuf+= rt.apply(rp); + rp.cells = cb; + buf+= rt.apply(rp); + } + return [lbuf, buf]; + } : + function(cs, rs, ds, startRow, colCount, stripe){ + var ts = this.templates, ct = ts.cell, rt = ts.row; + + var buf = [], lbuf = [], cb, lcb, c, p = {}, rp = {}, r, rowIndex; + for(var j = 0, len = rs.length; j < len; j++){ + r = rs[j]; cb = []; lcb = []; rowIndex = (j+startRow); + for(var i = 0; i < colCount; i++){ + c = cs[i]; + p.cellId = "x-grid-cell-" + rowIndex + "-" + i; + p.id = c.id; + p.css = p.attr = ""; + p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds); + if(p.value == undefined || p.value === "") p.value = " "; + if(r.dirty && typeof r.modified[c.name] !== 'undefined'){ + p.css += p.css ? ' x-grid-dirty-cell' : 'x-grid-dirty-cell'; + } + var markup = ct.apply(p); + if(!c.locked){ + cb[cb.length] = markup; + }else{ + lcb[lcb.length] = markup; + } + } + var alt = []; + if(stripe && ((rowIndex+1) % 2 == 0)){ + alt[0] = "x-grid-row-alt"; + } + if(r.dirty){ + alt[1] = " x-grid-dirty-row"; + } + rp.cells = lcb; + if(this.getRowClass){ + alt[2] = this.getRowClass(r, rowIndex); + } + rp.alt = alt.join(" "); + rp.cells = lcb.join(""); + lbuf[lbuf.length] = rt.apply(rp); + rp.cells = cb.join(""); + buf[buf.length] = rt.apply(rp); + } + return [lbuf.join(""), buf.join("")]; + }, + + renderBody : function(){ + var markup = this.renderRows(); + var bt = this.templates.body; + return [bt.apply({rows: markup[0]}), bt.apply({rows: markup[1]})]; + }, + + + refresh : function(headersToo){ + this.fireEvent("beforerefresh", this); + this.grid.stopEditing(); + var result = this.renderBody(); + this.lockedBody.update(result[0]); + this.mainBody.update(result[1]); + if(headersToo === true){ + this.updateHeaders(); + this.updateColumns(); + this.updateSplitters(); + this.updateHeaderSortState(); + } + this.syncRowHeights(); + this.layout(); + this.fireEvent("refresh", this); + }, + + handleColumnMove : function(cm, oldIndex, newIndex){ + this.indexMap = null; + var s = this.getScrollState(); + this.refresh(true); + this.restoreScroll(s); + this.afterMove(newIndex); + }, + + afterMove : function(colIndex){ + if(this.enableMoveAnim && Ext.enableFx){ + this.fly(this.getHeaderCell(colIndex).firstChild).highlight(this.hlColor); + } + }, + + updateCell : function(dm, rowIndex, dataIndex){ + var colIndex = this.getColumnIndexByDataIndex(dataIndex); + if(typeof colIndex == "undefined"){ + return; + } + var cm = this.grid.colModel; + var cell = this.getCell(rowIndex, colIndex); + var cellText = this.getCellText(rowIndex, colIndex); + + var p = { + cellId : "x-grid-cell-" + rowIndex + "-" + colIndex, + id : cm.getColumnId(colIndex), + css: colIndex == cm.getColumnCount()-1 ? "x-grid-col-last" : "" + }; + var renderer = cm.getRenderer(colIndex); + var val = renderer(dm.getValueAt(rowIndex, dataIndex), p, rowIndex, colIndex, dm); + if(typeof val == "undefined" || val === "") val = " "; + cellText.innerHTML = val; + cell.className = this.cellClass + " " + p.cellId + " " + p.css; + this.syncRowHeights(rowIndex, rowIndex); + }, + + calcColumnWidth : function(colIndex, maxRowsToMeasure){ + var maxWidth = 0; + if(this.grid.autoSizeHeaders){ + var h = this.getHeaderCellMeasure(colIndex); + maxWidth = Math.max(maxWidth, h.scrollWidth); + } + var tb, index; + if(this.cm.isLocked(colIndex)){ + tb = this.getLockedTable(); + index = colIndex; + }else{ + tb = this.getBodyTable(); + index = colIndex - this.cm.getLockedCount(); + } + if(tb && tb.rows){ + var rows = tb.rows; + var stopIndex = Math.min(maxRowsToMeasure || rows.length, rows.length); + for(var i = 0; i < stopIndex; i++){ + var cell = rows[i].childNodes[index].firstChild; + maxWidth = Math.max(maxWidth, cell.scrollWidth); + } + } + return maxWidth + 5; + }, + + autoSizeColumn : function(colIndex, forceMinSize, suppressEvent){ + if(this.cm.isHidden(colIndex)){ + return; + } + if(forceMinSize){ + var cid = this.cm.getColumnId(colIndex); + this.css.updateRule(this.colSelector + cid, "width", this.grid.minColumnWidth + "px"); + if(this.grid.autoSizeHeaders){ + this.css.updateRule(this.hdSelector + cid, "width", this.grid.minColumnWidth + "px"); + } + } + var newWidth = this.calcColumnWidth(colIndex); + this.cm.setColumnWidth(colIndex, + Math.max(this.grid.minColumnWidth, newWidth), suppressEvent); + if(!suppressEvent){ + this.grid.fireEvent("columnresize", colIndex, newWidth); + } + }, + + + autoSizeColumns : function(){ + var cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + for(var i = 0; i < colCount; i++){ + this.autoSizeColumn(i, true, true); + } + if(cm.getTotalWidth() < this.scroller.dom.clientWidth){ + this.fitColumns(); + }else{ + this.updateColumns(); + this.layout(); + } + }, + + + fitColumns : function(reserveScrollSpace){ + var cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + var cols = []; + var width = 0; + var i, w; + for (i = 0; i < colCount; i++){ + if(!cm.isHidden(i) && !cm.isFixed(i)){ + w = cm.getColumnWidth(i); + cols.push(i); + cols.push(w); + width += w; + } + } + var avail = Math.min(this.scroller.dom.clientWidth, this.el.getWidth()); + if(reserveScrollSpace){ + avail -= 17; + } + var frac = (avail - cm.getTotalWidth())/width; + while (cols.length){ + w = cols.pop(); + i = cols.pop(); + cm.setColumnWidth(i, Math.floor(w + w*frac), true); + } + this.updateColumns(); + this.layout(); + }, + + onRowSelect : function(rowIndex){ + var row = this.getRowComposite(rowIndex); + row.addClass("x-grid-row-selected"); + }, + + onRowDeselect : function(rowIndex){ + var row = this.getRowComposite(rowIndex); + row.removeClass("x-grid-row-selected"); + }, + + onCellSelect : function(row, col){ + var cell = this.getCell(row, col); + if(cell){ + Ext.fly(cell).addClass("x-grid-cell-selected"); + } + }, + + onCellDeselect : function(row, col){ + var cell = this.getCell(row, col); + if(cell){ + Ext.fly(cell).removeClass("x-grid-cell-selected"); + } + }, + + updateHeaderSortState : function(){ + var state = this.ds.getSortState(); + if(!state){ + return; + } + this.sortState = state; + var sortColumn = this.cm.findColumnIndex(state.field); + if(sortColumn != -1){ + var sortDir = state.direction; + var sc = this.sortClasses; + var hds = this.el.select(this.headerSelector).removeClass(sc); + hds.item(sortColumn).addClass(sc[sortDir == "DESC" ? 1 : 0]); + } + }, + + handleHeaderClick : function(g, index){ + if(this.headersDisabled){ + return; + } + var dm = g.dataSource, cm = g.colModel; + if(!cm.isSortable(index)){ + return; + } + g.stopEditing(); + dm.sort(cm.getDataIndex(index)); + }, + + + destroy : function(){ + if(this.colMenu){ + this.colMenu.removeAll(); + Ext.menu.MenuMgr.unregister(this.colMenu); + this.colMenu.getEl().remove(); + delete this.colMenu; + } + if(this.hmenu){ + this.hmenu.removeAll(); + Ext.menu.MenuMgr.unregister(this.hmenu); + this.hmenu.getEl().remove(); + delete this.hmenu; + } + if(this.grid.enableColumnMove){ + var dds = Ext.dd.DDM.ids['gridHeader' + this.grid.getGridEl().id]; + if(dds){ + for(var dd in dds){ + if(!dds[dd].config.isTarget && dds[dd].dragElId){ + var elid = dds[dd].dragElId; + dds[dd].unreg(); + Ext.get(elid).remove(); + } else if(dds[dd].config.isTarget){ + dds[dd].proxyTop.remove(); + dds[dd].proxyBottom.remove(); + dds[dd].unreg(); + } + if(Ext.dd.DDM.locationCache[dd]){ + delete Ext.dd.DDM.locationCache[dd]; + } + } + delete Ext.dd.DDM.ids['gridHeader' + this.grid.getGridEl().id]; + } + } + Ext.util.CSS.removeStyleSheet(this.grid.id + '-cssrules'); + this.bind(null, null); + Ext.EventManager.removeResizeListener(this.onWindowResize, this); + }, + + handleLockChange : function(){ + this.refresh(true); + }, + + onDenyColumnLock : function(){ + + }, + + onDenyColumnHide : function(){ + + }, + + handleHdMenuClick : function(item){ + var index = this.hdCtxIndex; + var cm = this.cm, ds = this.ds; + switch(item.id){ + case "asc": + ds.sort(cm.getDataIndex(index), "ASC"); + break; + case "desc": + ds.sort(cm.getDataIndex(index), "DESC"); + break; + case "lock": + var lc = cm.getLockedCount(); + if(cm.getColumnCount(true) <= lc+1){ + this.onDenyColumnLock(); + return; + } + if(lc != index){ + cm.setLocked(index, true, true); + cm.moveColumn(index, lc); + this.grid.fireEvent("columnmove", index, lc); + }else{ + cm.setLocked(index, true); + } + break; + case "unlock": + var lc = cm.getLockedCount(); + if((lc-1) != index){ + cm.setLocked(index, false, true); + cm.moveColumn(index, lc-1); + this.grid.fireEvent("columnmove", index, lc-1); + }else{ + cm.setLocked(index, false); + } + break; + default: + index = cm.getIndexById(item.id.substr(4)); + if(index != -1){ + if(item.checked && cm.getColumnCount(true) <= 1){ + this.onDenyColumnHide(); + return false; + } + cm.setHidden(index, item.checked); + } + } + return true; + }, + + beforeColMenuShow : function(){ + var cm = this.cm, colCount = cm.getColumnCount(); + this.colMenu.removeAll(); + for(var i = 0; i < colCount; i++){ + this.colMenu.add(new Ext.menu.CheckItem({ + id: "col-"+cm.getColumnId(i), + text: cm.getColumnHeader(i), + checked: !cm.isHidden(i), + hideOnClick:false + })); + } + }, + + handleHdCtx : function(g, index, e){ + e.stopEvent(); + var hd = this.getHeaderCell(index); + this.hdCtxIndex = index; + var ms = this.hmenu.items, cm = this.cm; + ms.get("asc").setDisabled(!cm.isSortable(index)); + ms.get("desc").setDisabled(!cm.isSortable(index)); + if(this.grid.enableColLock !== false){ + ms.get("lock").setDisabled(cm.isLocked(index)); + ms.get("unlock").setDisabled(!cm.isLocked(index)); + } + this.hmenu.show(hd, "tl-bl"); + }, + + handleHdOver : function(e){ + var hd = this.findHeaderCell(e.getTarget()); + if(hd && !this.headersDisabled){ + if(this.grid.colModel.isSortable(this.getCellIndex(hd))){ + this.fly(hd).addClass("x-grid-hd-over"); + } + } + }, + + handleHdOut : function(e){ + var hd = this.findHeaderCell(e.getTarget()); + if(hd){ + this.fly(hd).removeClass("x-grid-hd-over"); + } + }, + + handleSplitDblClick : function(e, t){ + var i = this.getCellIndex(t); + if(this.grid.enableColumnResize !== false && this.cm.isResizable(i) && !this.cm.isFixed(i)){ + this.autoSizeColumn(i, true); + this.layout(); + } + }, + + render : function(){ + + var cm = this.cm; + var colCount = cm.getColumnCount(); + + if(this.grid.monitorWindowResize === true){ + Ext.EventManager.onWindowResize(this.onWindowResize, this, true); + } + var header = this.renderHeaders(); + var body = this.templates.body.apply({rows:""}); + var html = this.templates.master.apply({ + lockedBody: body, + body: body, + lockedHeader: header[0], + header: header[1] + }); + + + + this.grid.getGridEl().dom.innerHTML = html; + + this.initElements(); + + this.scroller.on("scroll", this.handleScroll, this); + this.lockedBody.on("mousewheel", this.handleWheel, this); + this.mainBody.on("mousewheel", this.handleWheel, this); + + this.mainHd.on("mouseover", this.handleHdOver, this); + this.mainHd.on("mouseout", this.handleHdOut, this); + this.mainHd.on("dblclick", this.handleSplitDblClick, this, + {delegate: "."+this.splitClass}); + + this.lockedHd.on("mouseover", this.handleHdOver, this); + this.lockedHd.on("mouseout", this.handleHdOut, this); + this.lockedHd.on("dblclick", this.handleSplitDblClick, this, + {delegate: "."+this.splitClass}); + + if(this.grid.enableColumnResize !== false && Ext.grid.SplitDragZone){ + new Ext.grid.SplitDragZone(this.grid, this.lockedHd.dom, this.mainHd.dom); + } + + this.updateSplitters(); + + if(this.grid.enableColumnMove && Ext.grid.HeaderDragZone){ + new Ext.grid.HeaderDragZone(this.grid, this.lockedHd.dom, this.mainHd.dom); + new Ext.grid.HeaderDropZone(this.grid, this.lockedHd.dom, this.mainHd.dom); + } + + if(this.grid.enableCtxMenu !== false && Ext.menu.Menu){ + this.hmenu = new Ext.menu.Menu({id: this.grid.id + "-hctx"}); + this.hmenu.add( + {id:"asc", text: this.sortAscText, cls: "xg-hmenu-sort-asc"}, + {id:"desc", text: this.sortDescText, cls: "xg-hmenu-sort-desc"} + ); + if(this.grid.enableColLock !== false){ + this.hmenu.add('-', + {id:"lock", text: this.lockText, cls: "xg-hmenu-lock"}, + {id:"unlock", text: this.unlockText, cls: "xg-hmenu-unlock"} + ); + } + if(this.grid.enableColumnHide !== false){ + + this.colMenu = new Ext.menu.Menu({id:this.grid.id + "-hcols-menu"}); + this.colMenu.on("beforeshow", this.beforeColMenuShow, this); + this.colMenu.on("itemclick", this.handleHdMenuClick, this); + + this.hmenu.add('-', + {id:"columns", text: this.columnsText, menu: this.colMenu} + ); + } + this.hmenu.on("itemclick", this.handleHdMenuClick, this); + + this.grid.on("headercontextmenu", this.handleHdCtx, this); + } + + if((this.grid.enableDragDrop || this.grid.enableDrag) && Ext.grid.GridDragZone){ + this.dd = new Ext.grid.GridDragZone(this.grid, { + ddGroup : this.grid.ddGroup || 'GridDD' + }); + } + + + + this.updateHeaderSortState(); + + this.beforeInitialResize(); + this.layout(true); + + + this.renderPhase2.defer(1, this); + }, + + renderPhase2 : function(){ + + this.refresh(); + if(this.grid.autoSizeColumns){ + this.autoSizeColumns(); + } + }, + + beforeInitialResize : function(){ + + }, + + onColumnSplitterMoved : function(i, w){ + this.userResized = true; + var cm = this.grid.colModel; + cm.setColumnWidth(i, w, true); + var cid = cm.getColumnId(i); + this.css.updateRule(this.colSelector + cid, "width", (w-this.borderWidth) + "px"); + this.css.updateRule(this.hdSelector + cid, "width", (w-this.borderWidth) + "px"); + this.updateSplitters(); + this.layout(); + this.grid.fireEvent("columnresize", i, w); + }, + + syncRowHeights : function(startIndex, endIndex){ + if(this.grid.enableRowHeightSync === true && this.cm.getLockedCount() > 0){ + startIndex = startIndex || 0; + var mrows = this.getBodyTable().rows; + var lrows = this.getLockedTable().rows; + var len = mrows.length-1; + endIndex = Math.min(endIndex || len, len); + for(var i = startIndex; i <= endIndex; i++){ + var m = mrows[i], l = lrows[i]; + var h = Math.max(m.offsetHeight, l.offsetHeight); + m.style.height = l.style.height = h + "px"; + } + } + }, + + layout : function(initialRender, is2ndPass){ + var g = this.grid; + var auto = g.autoHeight; + var scrollOffset = 16; + var c = g.getGridEl(), cm = this.cm, + expandCol = g.autoExpandColumn, + gv = this; + + + if(!c.dom.offsetWidth){ + if(initialRender){ + this.lockedWrap.show(); + this.mainWrap.show(); + } + return; + } + + var hasLock = this.cm.isLocked(0); + + var tbh = this.headerPanel.getHeight(); + var bbh = this.footerPanel.getHeight(); + + if(auto){ + var ch = this.getBodyTable().offsetHeight + tbh + bbh + this.mainHd.getHeight(); + var newHeight = ch + c.getBorderWidth("tb"); + if(g.maxHeight){ + newHeight = Math.min(g.maxHeight, newHeight); + } + c.setHeight(newHeight); + } + + if(g.autoWidth){ + c.setWidth(cm.getTotalWidth()+c.getBorderWidth('lr')); + } + + var s = this.scroller; + + var csize = c.getSize(true); + + this.el.setSize(csize.width, csize.height); + + this.headerPanel.setWidth(csize.width); + this.footerPanel.setWidth(csize.width); + + var hdHeight = this.mainHd.getHeight(); + var vw = csize.width; + var vh = csize.height - (tbh + bbh); + + s.setSize(vw, vh); + + var bt = this.getBodyTable(); + var ltWidth = hasLock ? + Math.max(this.getLockedTable().offsetWidth, this.lockedHd.dom.firstChild.offsetWidth) : 0; + + var scrollHeight = bt.offsetHeight; + var scrollWidth = ltWidth + bt.offsetWidth; + var vscroll = false, hscroll = false; + + this.scrollSizer.setSize(scrollWidth, scrollHeight+hdHeight); + + var lw = this.lockedWrap, mw = this.mainWrap; + var lb = this.lockedBody, mb = this.mainBody; + + setTimeout(function(){ + var t = s.dom.offsetTop; + var w = s.dom.clientWidth, + h = s.dom.clientHeight; + + lw.setTop(t); + lw.setSize(ltWidth, h); + + mw.setLeftTop(ltWidth, t); + mw.setSize(w-ltWidth, h); + + lb.setHeight(h-hdHeight); + mb.setHeight(h-hdHeight); + + if(is2ndPass !== true && !gv.userResized && expandCol){ + + var ci = cm.getIndexById(expandCol); + var tw = cm.getTotalWidth(false); + var currentWidth = cm.getColumnWidth(ci); + var cw = Math.min(Math.max(((w-tw)+currentWidth-2)-(w <= s.dom.offsetWidth ? 0 : 18), g.autoExpandMin), g.autoExpandMax); + if(currentWidth != cw){ + cm.setColumnWidth(ci, cw, true); + gv.css.updateRule(gv.colSelector+expandCol, "width", (cw - gv.borderWidth) + "px"); + gv.css.updateRule(gv.hdSelector+expandCol, "width", (cw - gv.borderWidth) + "px"); + gv.updateSplitters(); + gv.layout(false, true); + } + } + + if(initialRender){ + lw.show(); + mw.show(); + } + + }, 10); + }, + + onWindowResize : function(){ + if(!this.grid.monitorWindowResize || this.grid.autoHeight){ + return; + } + this.layout(); + }, + + appendFooter : function(parentEl){ + return null; + }, + + sortAscText : "Sort Ascending", + sortDescText : "Sort Descending", + lockText : "Lock Column", + unlockText : "Unlock Column", + columnsText : "Columns" +}); + + +Ext.grid.HeaderDragZone = function(grid, hd, hd2){ + this.grid = grid; + this.view = grid.getView(); + this.ddGroup = "gridHeader" + this.grid.getGridEl().id; + Ext.grid.HeaderDragZone.superclass.constructor.call(this, hd); + if(hd2){ + this.setHandleElId(Ext.id(hd)); + this.setOuterHandleElId(Ext.id(hd2)); + } + this.scroll = false; +}; +Ext.extend(Ext.grid.HeaderDragZone, Ext.dd.DragZone, { + maxDragWidth: 120, + getDragData : function(e){ + var t = Ext.lib.Event.getTarget(e); + var h = this.view.findHeaderCell(t); + if(h){ + return {ddel: h.firstChild, header:h}; + } + return false; + }, + + onInitDrag : function(e){ + this.view.headersDisabled = true; + var clone = this.dragData.ddel.cloneNode(true); + clone.id = Ext.id(); + clone.style.width = Math.min(this.dragData.header.offsetWidth,this.maxDragWidth) + "px"; + this.proxy.update(clone); + return true; + }, + + afterValidDrop : function(){ + var v = this.view; + setTimeout(function(){ + v.headersDisabled = false; + }, 50); + }, + + afterInvalidDrop : function(){ + var v = this.view; + setTimeout(function(){ + v.headersDisabled = false; + }, 50); + } +}); + + + +Ext.grid.HeaderDropZone = function(grid, hd, hd2){ + this.grid = grid; + this.view = grid.getView(); + + this.proxyTop = Ext.DomHelper.append(document.body, { + cls:"col-move-top", html:" " + }, true); + this.proxyBottom = Ext.DomHelper.append(document.body, { + cls:"col-move-bottom", html:" " + }, true); + this.proxyTop.hide = this.proxyBottom.hide = function(){ + this.setLeftTop(-100,-100); + this.setStyle("visibility", "hidden"); + }; + this.ddGroup = "gridHeader" + this.grid.getGridEl().id; + + + Ext.grid.HeaderDropZone.superclass.constructor.call(this, grid.getGridEl().dom); +}; +Ext.extend(Ext.grid.HeaderDropZone, Ext.dd.DropZone, { + proxyOffsets : [-4, -9], + fly: Ext.Element.fly, + + getTargetFromEvent : function(e){ + var t = Ext.lib.Event.getTarget(e); + var cindex = this.view.findCellIndex(t); + if(cindex !== false){ + return this.view.getHeaderCell(cindex); + } + }, + + nextVisible : function(h){ + var v = this.view, cm = this.grid.colModel; + h = h.nextSibling; + while(h){ + if(!cm.isHidden(v.getCellIndex(h))){ + return h; + } + h = h.nextSibling; + } + return null; + }, + + prevVisible : function(h){ + var v = this.view, cm = this.grid.colModel; + h = h.prevSibling; + while(h){ + if(!cm.isHidden(v.getCellIndex(h))){ + return h; + } + h = h.prevSibling; + } + return null; + }, + + positionIndicator : function(h, n, e){ + var x = Ext.lib.Event.getPageX(e); + var r = Ext.lib.Dom.getRegion(n.firstChild); + var px, pt, py = r.top + this.proxyOffsets[1]; + if((r.right - x) <= (r.right-r.left)/2){ + px = r.right+this.view.borderWidth; + pt = "after"; + }else{ + px = r.left; + pt = "before"; + } + var oldIndex = this.view.getCellIndex(h); + var newIndex = this.view.getCellIndex(n); + + if(this.grid.colModel.isFixed(newIndex)){ + return false; + } + + var locked = this.grid.colModel.isLocked(newIndex); + + if(pt == "after"){ + newIndex++; + } + if(oldIndex < newIndex){ + newIndex--; + } + if(oldIndex == newIndex && (locked == this.grid.colModel.isLocked(oldIndex))){ + return false; + } + px += this.proxyOffsets[0]; + this.proxyTop.setLeftTop(px, py); + this.proxyTop.show(); + if(!this.bottomOffset){ + this.bottomOffset = this.view.mainHd.getHeight(); + } + this.proxyBottom.setLeftTop(px, py+this.proxyTop.dom.offsetHeight+this.bottomOffset); + this.proxyBottom.show(); + return pt; + }, + + onNodeEnter : function(n, dd, e, data){ + if(data.header != n){ + this.positionIndicator(data.header, n, e); + } + }, + + onNodeOver : function(n, dd, e, data){ + var result = false; + if(data.header != n){ + result = this.positionIndicator(data.header, n, e); + } + if(!result){ + this.proxyTop.hide(); + this.proxyBottom.hide(); + } + return result ? this.dropAllowed : this.dropNotAllowed; + }, + + onNodeOut : function(n, dd, e, data){ + this.proxyTop.hide(); + this.proxyBottom.hide(); + }, + + onNodeDrop : function(n, dd, e, data){ + var h = data.header; + if(h != n){ + var cm = this.grid.colModel; + var x = Ext.lib.Event.getPageX(e); + var r = Ext.lib.Dom.getRegion(n.firstChild); + var pt = (r.right - x) <= ((r.right-r.left)/2) ? "after" : "before"; + var oldIndex = this.view.getCellIndex(h); + var newIndex = this.view.getCellIndex(n); + var locked = cm.isLocked(newIndex); + if(pt == "after"){ + newIndex++; + } + if(oldIndex < newIndex){ + newIndex--; + } + if(oldIndex == newIndex && (locked == cm.isLocked(oldIndex))){ + return false; + } + cm.setLocked(oldIndex, locked, true); + cm.moveColumn(oldIndex, newIndex); + this.grid.fireEvent("columnmove", oldIndex, newIndex); + return true; + } + return false; + } +}); + + +Ext.grid.GridView.ColumnDragZone = function(grid, hd){ + Ext.grid.GridView.ColumnDragZone.superclass.constructor.call(this, grid, hd, null); + this.proxy.el.addClass('x-grid3-col-dd'); +}; + +Ext.extend(Ext.grid.GridView.ColumnDragZone, Ext.grid.HeaderDragZone, { + handleMouseDown : function(e){ + + }, + + callHandleMouseDown : function(e){ + Ext.grid.GridView.ColumnDragZone.superclass.handleMouseDown.call(this, e); + } +}); +Ext.grid.SplitDragZone = function(grid, hd, hd2){ + this.grid = grid; + this.view = grid.getView(); + this.proxy = this.view.resizeProxy; + Ext.grid.SplitDragZone.superclass.constructor.call(this, hd, + "gridSplitters" + this.grid.getGridEl().id, { + dragElId : Ext.id(this.proxy.dom), resizeFrame:false + }); + this.setHandleElId(Ext.id(hd)); + this.setOuterHandleElId(Ext.id(hd2)); + this.scroll = false; +}; +Ext.extend(Ext.grid.SplitDragZone, Ext.dd.DDProxy, { + fly: Ext.Element.fly, + + b4StartDrag : function(x, y){ + this.view.headersDisabled = true; + this.proxy.setHeight(this.view.mainWrap.getHeight()); + var w = this.cm.getColumnWidth(this.cellIndex); + var minw = Math.max(w-this.grid.minColumnWidth, 0); + this.resetConstraints(); + this.setXConstraint(minw, 1000); + this.setYConstraint(0, 0); + this.minX = x - minw; + this.maxX = x + 1000; + this.startPos = x; + Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y); + }, + + + handleMouseDown : function(e){ + ev = Ext.EventObject.setEvent(e); + var t = this.fly(ev.getTarget()); + if(t.hasClass("x-grid-split")){ + this.cellIndex = this.view.getCellIndex(t.dom); + this.split = t.dom; + this.cm = this.grid.colModel; + if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){ + Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this, arguments); + } + } + }, + + endDrag : function(e){ + this.view.headersDisabled = false; + var endX = Math.max(this.minX, Ext.lib.Event.getPageX(e)); + var diff = endX - this.startPos; + this.view.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff); + }, + + autoOffset : function(){ + this.setDelta(0,0); + } +}); +Ext.grid.GridDragZone = function(grid, config){ + this.view = grid.getView(); + Ext.grid.GridDragZone.superclass.constructor.call(this, this.view.mainBody.dom, config); + if(this.view.lockedBody){ + this.setHandleElId(Ext.id(this.view.mainBody.dom)); + this.setOuterHandleElId(Ext.id(this.view.lockedBody.dom)); + } + this.scroll = false; + this.grid = grid; + this.ddel = document.createElement('div'); + this.ddel.className = 'x-grid-dd-wrap'; +}; + +Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, { + ddGroup : "GridDD", + + getDragData : function(e){ + var t = Ext.lib.Event.getTarget(e); + var rowIndex = this.view.findRowIndex(t); + if(rowIndex !== false){ + var sm = this.grid.selModel; + if(!sm.isSelected(rowIndex) || e.hasModifier()){ + sm.handleMouseDown(e, t); + } + return {grid: this.grid, ddel: this.ddel, rowIndex: rowIndex, selections:sm.getSelections()}; + } + return false; + }, + + onInitDrag : function(e){ + var data = this.dragData; + this.ddel.innerHTML = this.grid.getDragDropText(); + this.proxy.update(this.ddel); + }, + + afterRepair : function(){ + this.dragging = false; + }, + + getRepairXY : function(e, data){ + return false; + }, + + onEndDrag : function(data, e){ + }, + + onValidDrop : function(dd, e, id){ + this.hideProxy(); + }, + + beforeInvalidDrop : function(e, id){ + + } +}); + +Ext.grid.ColumnModel = function(config){ + + this.config = config; + this.lookup = {}; + + + + + for(var i = 0, len = config.length; i < len; i++){ + var c = config[i]; + if(typeof c.dataIndex == "undefined"){ + c.dataIndex = i; + } + if(typeof c.renderer == "string"){ + c.renderer = Ext.util.Format[c.renderer]; + } + if(typeof c.id == "undefined"){ + c.id = i; + } + if(c.editor && c.editor.isFormField){ + c.editor = new Ext.grid.GridEditor(c.editor); + } + this.lookup[c.id] = c; + } + + + this.defaultWidth = 100; + + + this.defaultSortable = false; + + this.addEvents({ + + "widthchange": true, + + "headerchange": true, + + "hiddenchange": true, + + "columnmoved" : true, + + "columnlockchange" : true + }); + Ext.grid.ColumnModel.superclass.constructor.call(this); +}; +Ext.extend(Ext.grid.ColumnModel, Ext.util.Observable, { + + + + + + + + + + + + + getColumnId : function(index){ + return this.config[index].id; + }, + + + getColumnById : function(id){ + return this.lookup[id]; + }, + + + getIndexById : function(id){ + for(var i = 0, len = this.config.length; i < len; i++){ + if(this.config[i].id == id){ + return i; + } + } + return -1; + }, + + moveColumn : function(oldIndex, newIndex){ + var c = this.config[oldIndex]; + this.config.splice(oldIndex, 1); + this.config.splice(newIndex, 0, c); + this.dataMap = null; + this.fireEvent("columnmoved", this, oldIndex, newIndex); + }, + + isLocked : function(colIndex){ + return this.config[colIndex].locked === true; + }, + + setLocked : function(colIndex, value, suppressEvent){ + if(this.isLocked(colIndex) == value){ + return; + } + this.config[colIndex].locked = value; + if(!suppressEvent){ + this.fireEvent("columnlockchange", this, colIndex, value); + } + }, + + getTotalLockedWidth : function(){ + var totalWidth = 0; + for(var i = 0; i < this.config.length; i++){ + if(this.isLocked(i) && !this.isHidden(i)){ + this.totalWidth += this.getColumnWidth(i); + } + } + return totalWidth; + }, + + getLockedCount : function(){ + for(var i = 0, len = this.config.length; i < len; i++){ + if(!this.isLocked(i)){ + return i; + } + } + }, + + + getColumnCount : function(visibleOnly){ + if(visibleOnly === true){ + var c = 0; + for(var i = 0, len = this.config.length; i < len; i++){ + if(!this.isHidden(i)){ + c++; + } + } + return c; + } + return this.config.length; + }, + + + getColumnsBy : function(fn, scope){ + var r = []; + for(var i = 0, len = this.config.length; i < len; i++){ + var c = this.config[i]; + if(fn.call(scope||this, c, i) === true){ + r[r.length] = c; + } + } + return r; + }, + + + isSortable : function(col){ + if(typeof this.config[col].sortable == "undefined"){ + return this.defaultSortable; + } + return this.config[col].sortable; + }, + + + getRenderer : function(col){ + if(!this.config[col].renderer){ + return Ext.grid.ColumnModel.defaultRenderer; + } + return this.config[col].renderer; + }, + + + setRenderer : function(col, fn){ + this.config[col].renderer = fn; + }, + + + getColumnWidth : function(col){ + return this.config[col].width || this.defaultWidth; + }, + + + setColumnWidth : function(col, width, suppressEvent){ + this.config[col].width = width; + this.totalWidth = null; + if(!suppressEvent){ + this.fireEvent("widthchange", this, col, width); + } + }, + + + getTotalWidth : function(includeHidden){ + if(!this.totalWidth){ + this.totalWidth = 0; + for(var i = 0, len = this.config.length; i < len; i++){ + if(includeHidden || !this.isHidden(i)){ + this.totalWidth += this.getColumnWidth(i); + } + } + } + return this.totalWidth; + }, + + + getColumnHeader : function(col){ + return this.config[col].header; + }, + + + setColumnHeader : function(col, header){ + this.config[col].header = header; + this.fireEvent("headerchange", this, col, header); + }, + + + getColumnTooltip : function(col){ + return this.config[col].tooltip; + }, + + setColumnTooltip : function(col, tooltip){ + this.config[col].tooltip = tooltip; + }, + + + getDataIndex : function(col){ + return this.config[col].dataIndex; + }, + + + setDataIndex : function(col, dataIndex){ + this.config[col].dataIndex = dataIndex; + }, + + findColumnIndex : function(dataIndex){ + var c = this.config; + for(var i = 0, len = c.length; i < len; i++){ + if(c[i].dataIndex == dataIndex){ + return i; + } + } + return -1; + }, + + + isCellEditable : function(colIndex, rowIndex){ + return (this.config[colIndex].editable || (typeof this.config[colIndex].editable == "undefined" && this.config[colIndex].editor)) ? true : false; + }, + + + getCellEditor : function(colIndex, rowIndex){ + return this.config[colIndex].editor; + }, + + + setEditable : function(col, editable){ + this.config[col].editable = editable; + }, + + + + isHidden : function(colIndex){ + return this.config[colIndex].hidden; + }, + + + + isFixed : function(colIndex){ + return this.config[colIndex].fixed; + }, + + + isResizable : function(colIndex){ + return colIndex >= 0 && this.config[colIndex].resizable !== false && this.config[colIndex].fixed !== true; + }, + + setHidden : function(colIndex, hidden){ + this.config[colIndex].hidden = hidden; + this.totalWidth = null; + this.fireEvent("hiddenchange", this, colIndex, hidden); + }, + + + setEditor : function(col, editor){ + this.config[col].editor = editor; + } +}); + +Ext.grid.ColumnModel.defaultRenderer = function(value){ + if(typeof value == "string" && value.length < 1){ + return " "; + } + return value; +}; + + +Ext.grid.DefaultColumnModel = Ext.grid.ColumnModel; + + +Ext.grid.AbstractSelectionModel = function(){ + this.locked = false; + Ext.grid.AbstractSelectionModel.superclass.constructor.call(this); +}; + +Ext.extend(Ext.grid.AbstractSelectionModel, Ext.util.Observable, { + + init : function(grid){ + this.grid = grid; + this.initEvents(); + }, + + + lock : function(){ + this.locked = true; + }, + + + unlock : function(){ + this.locked = false; + }, + + + isLocked : function(){ + return this.locked; + } +}); + +Ext.grid.RowSelectionModel = function(config){ + Ext.apply(this, config); + this.selections = new Ext.util.MixedCollection(false, function(o){ + return o.id; + }); + + this.last = false; + this.lastActive = false; + + this.addEvents({ + + "selectionchange" : true, + + "beforerowselect" : true, + + "rowselect" : true, + + "rowdeselect" : true + }); + + this.locked = false; +}; + +Ext.extend(Ext.grid.RowSelectionModel, Ext.grid.AbstractSelectionModel, { + + singleSelect : false, + + + initEvents : function(){ + + if(!this.grid.enableDragDrop && !this.grid.enableDrag){ + this.grid.on("mousedown", this.handleMouseDown, this); + }else{ + this.grid.on("rowclick", function(grid, rowIndex, e) { + if(e.button === 0 && !e.shiftKey && !e.ctrlKey) { + this.selectRow(rowIndex, false); + grid.view.focusRow(rowIndex); + } + }, this); + } + + this.rowNav = new Ext.KeyNav(this.grid.getGridEl(), { + "up" : function(e){ + if(!e.shiftKey){ + this.selectPrevious(e.shiftKey); + }else if(this.last !== false && this.lastActive !== false){ + var last = this.last; + this.selectRange(this.last, this.lastActive-1); + this.grid.getView().focusRow(this.lastActive); + if(last !== false){ + this.last = last; + } + }else{ + this.selectFirstRow(); + } + }, + "down" : function(e){ + if(!e.shiftKey){ + this.selectNext(e.shiftKey); + }else if(this.last !== false && this.lastActive !== false){ + var last = this.last; + this.selectRange(this.last, this.lastActive+1); + this.grid.getView().focusRow(this.lastActive); + if(last !== false){ + this.last = last; + } + }else{ + this.selectFirstRow(); + } + }, + scope: this + }); + + var view = this.grid.view; + view.on("refresh", this.onRefresh, this); + view.on("rowupdated", this.onRowUpdated, this); + view.on("rowremoved", this.onRemove, this); + }, + + + onRefresh : function(){ + var ds = this.grid.dataSource, i, v = this.grid.view; + var s = this.selections; + s.each(function(r){ + if((i = ds.indexOfId(r.id)) != -1){ + v.onRowSelect(i); + }else{ + s.remove(r); + } + }); + }, + + + onRemove : function(v, index, r){ + this.selections.remove(r); + }, + + + onRowUpdated : function(v, index, r){ + if(this.isSelected(r)){ + v.onRowSelect(index); + } + }, + + + selectRecords : function(records, keepExisting){ + if(!keepExisting){ + this.clearSelections(); + } + var ds = this.grid.dataSource; + for(var i = 0, len = records.length; i < len; i++){ + this.selectRow(ds.indexOf(records[i]), true); + } + }, + + + getCount : function(){ + return this.selections.length; + }, + + + selectFirstRow : function(){ + this.selectRow(0); + }, + + + selectLastRow : function(keepExisting){ + this.selectRow(this.grid.dataSource.getCount() - 1, keepExisting); + }, + + + selectNext : function(keepExisting){ + if(this.last !== false && (this.last+1) < this.grid.dataSource.getCount()){ + this.selectRow(this.last+1, keepExisting); + this.grid.getView().focusRow(this.last); + } + }, + + + selectPrevious : function(keepExisting){ + if(this.last){ + this.selectRow(this.last-1, keepExisting); + this.grid.getView().focusRow(this.last); + } + }, + + + getSelections : function(){ + return [].concat(this.selections.items); + }, + + + getSelected : function(){ + return this.selections.itemAt(0); + }, + + + + clearSelections : function(fast){ + if(this.locked) return; + if(fast !== true){ + var ds = this.grid.dataSource; + var s = this.selections; + s.each(function(r){ + this.deselectRow(ds.indexOfId(r.id)); + }, this); + s.clear(); + }else{ + this.selections.clear(); + } + this.last = false; + }, + + + + selectAll : function(){ + if(this.locked) return; + this.selections.clear(); + for(var i = 0, len = this.grid.dataSource.getCount(); i < len; i++){ + this.selectRow(i, true); + } + }, + + + hasSelection : function(){ + return this.selections.length > 0; + }, + + + isSelected : function(index){ + var r = typeof index == "number" ? this.grid.dataSource.getAt(index) : index; + return (r && this.selections.key(r.id) ? true : false); + }, + + + isIdSelected : function(id){ + return (this.selections.key(id) ? true : false); + }, + + + handleMouseDown : function(e, t){ + var view = this.grid.getView(), rowIndex; + if(this.isLocked() || (rowIndex = view.findRowIndex(t)) === false){ + return; + }; + if(e.shiftKey && this.last !== false){ + var last = this.last; + this.selectRange(last, rowIndex, e.ctrlKey); + this.last = last; + view.focusRow(rowIndex); + }else{ + var isSelected = this.isSelected(rowIndex); + if(e.button !== 0 && isSelected){ + view.focusRow(rowIndex); + }else if(e.ctrlKey && isSelected){ + this.deselectRow(rowIndex); + }else if(!isSelected){ + this.selectRow(rowIndex, e.button === 0 && (e.ctrlKey || e.shiftKey)); + view.focusRow(rowIndex); + } + } + }, + + + selectRows : function(rows, keepExisting){ + if(!keepExisting){ + this.clearSelections(); + } + for(var i = 0, len = rows.length; i < len; i++){ + this.selectRow(rows[i], true); + } + }, + + + selectRange : function(startRow, endRow, keepExisting){ + if(this.locked) return; + if(!keepExisting){ + this.clearSelections(); + } + if(startRow <= endRow){ + for(var i = startRow; i <= endRow; i++){ + this.selectRow(i, true); + } + }else{ + for(var i = startRow; i >= endRow; i--){ + this.selectRow(i, true); + } + } + }, + + + deselectRange : function(startRow, endRow, preventViewNotify){ + if(this.locked) return; + for(var i = startRow; i <= endRow; i++){ + this.deselectRow(i, preventViewNotify); + } + }, + + + selectRow : function(index, keepExisting, preventViewNotify){ + if(this.locked || (index < 0 || index >= this.grid.dataSource.getCount())) return; + if(this.fireEvent("beforerowselect", this, index, keepExisting) !== false){ + if(!keepExisting || this.singleSelect){ + this.clearSelections(); + } + var r = this.grid.dataSource.getAt(index); + this.selections.add(r); + this.last = this.lastActive = index; + if(!preventViewNotify){ + this.grid.getView().onRowSelect(index); + } + this.fireEvent("rowselect", this, index, r); + this.fireEvent("selectionchange", this); + } + }, + + + deselectRow : function(index, preventViewNotify){ + if(this.locked) return; + if(this.last == index){ + this.last = false; + } + if(this.lastActive == index){ + this.lastActive = false; + } + var r = this.grid.dataSource.getAt(index); + this.selections.remove(r); + if(!preventViewNotify){ + this.grid.getView().onRowDeselect(index); + } + this.fireEvent("rowdeselect", this, index); + this.fireEvent("selectionchange", this); + }, + + + restoreLast : function(){ + if(this._last){ + this.last = this._last; + } + }, + + + acceptsNav : function(row, col, cm){ + return !cm.isHidden(col) && cm.isCellEditable(col, row); + }, + + + onEditorKey : function(field, e){ + var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor; + if(k == e.TAB){ + e.stopEvent(); + ed.completeEdit(); + if(e.shiftKey){ + newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this); + }else{ + newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this); + } + }else if(k == e.ENTER && !e.ctrlKey){ + e.stopEvent(); + ed.completeEdit(); + if(e.shiftKey){ + newCell = g.walkCells(ed.row-1, ed.col, -1, this.acceptsNav, this); + }else{ + newCell = g.walkCells(ed.row+1, ed.col, 1, this.acceptsNav, this); + } + }else if(k == e.ESC){ + ed.cancelEdit(); + } + if(newCell){ + g.startEditing(newCell[0], newCell[1]); + } + } +}); + +Ext.grid.CellSelectionModel = function(config){ + Ext.apply(this, config); + + this.selection = null; + + this.addEvents({ + + "beforecellselect" : true, + + "cellselect" : true, + + "selectionchange" : true + }); +}; + +Ext.extend(Ext.grid.CellSelectionModel, Ext.grid.AbstractSelectionModel, { + + + initEvents : function(){ + this.grid.on("mousedown", this.handleMouseDown, this); + this.grid.getGridEl().on(Ext.isIE ? "keydown" : "keypress", this.handleKeyDown, this); + var view = this.grid.view; + view.on("refresh", this.onViewChange, this); + view.on("rowupdated", this.onRowUpdated, this); + view.on("beforerowremoved", this.clearSelections, this); + view.on("beforerowsinserted", this.clearSelections, this); + if(this.grid.isEditor){ + this.grid.on("beforeedit", this.beforeEdit, this); + } + }, + + beforeEdit : function(e){ + this.select(e.row, e.column, false, true, e.record); + }, + + onRowUpdated : function(v, index, r){ + if(this.selection && this.selection.record == r){ + v.onCellSelect(index, this.selection.cell[1]); + } + }, + + onViewChange : function(){ + this.clearSelections(true); + }, + + + getSelectedCell : function(){ + return this.selection ? this.selection.cell : null; + }, + + + clearSelections : function(preventNotify){ + var s = this.selection; + if(s){ + if(preventNotify !== true){ + this.grid.view.onCellDeselect(s.cell[0], s.cell[1]); + } + this.selection = null; + this.fireEvent("selectionchange", this, null); + } + }, + + + hasSelection : function(){ + return this.selection ? true : false; + }, + + + handleMouseDown : function(e, t){ + var v = this.grid.getView(); + if(this.isLocked()){ + return; + }; + var row = v.findRowIndex(t); + var cell = v.findCellIndex(t); + if(row !== false && cell !== false){ + this.select(row, cell); + } + }, + + + select : function(rowIndex, colIndex, preventViewNotify, preventFocus, r){ + if(this.fireEvent("beforecellselect", this, rowIndex, colIndex) !== false){ + this.clearSelections(); + r = r || this.grid.dataSource.getAt(rowIndex); + this.selection = { + record : r, + cell : [rowIndex, colIndex] + }; + if(!preventViewNotify){ + var v = this.grid.getView(); + v.onCellSelect(rowIndex, colIndex); + if(preventFocus !== true){ + v.focusCell(rowIndex, colIndex); + } + } + this.fireEvent("cellselect", this, rowIndex, colIndex); + this.fireEvent("selectionchange", this, this.selection); + } + }, + + isSelectable : function(rowIndex, colIndex, cm){ + return !cm.isHidden(colIndex); + }, + + + handleKeyDown : function(e){ + if(!e.isNavKeyPress()){ + return; + } + var g = this.grid, s = this.selection; + if(!s){ + e.stopEvent(); + var cell = g.walkCells(0, 0, 1, this.isSelectable, this); + if(cell){ + this.select(cell[0], cell[1]); + } + return; + } + var sm = this; + var walk = function(row, col, step){ + return g.walkCells(row, col, step, sm.isSelectable, sm); + }; + var k = e.getKey(), r = s.cell[0], c = s.cell[1]; + var newCell; + + switch(k){ + case e.TAB: + if(e.shiftKey){ + newCell = walk(r, c-1, -1); + }else{ + newCell = walk(r, c+1, 1); + } + break; + case e.DOWN: + newCell = walk(r+1, c, 1); + break; + case e.UP: + newCell = walk(r-1, c, -1); + break; + case e.RIGHT: + newCell = walk(r, c+1, 1); + break; + case e.LEFT: + newCell = walk(r, c-1, -1); + break; + case e.ENTER: + if(g.isEditor && !g.editing){ + g.startEditing(r, c); + e.stopEvent(); + return; + } + break; + }; + if(newCell){ + this.select(newCell[0], newCell[1]); + e.stopEvent(); + } + }, + + acceptsNav : function(row, col, cm){ + return !cm.isHidden(col) && cm.isCellEditable(col, row); + }, + + onEditorKey : function(field, e){ + var k = e.getKey(), newCell, g = this.grid, ed = g.activeEditor; + if(k == e.TAB){ + if(e.shiftKey){ + newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this); + }else{ + newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this); + } + e.stopEvent(); + }else if(k == e.ENTER && !e.ctrlKey){ + ed.completeEdit(); + e.stopEvent(); + }else if(k == e.ESC){ + ed.cancelEdit(); + } + if(newCell){ + g.startEditing(newCell[0], newCell[1]); + } + } +}); + +Ext.grid.EditorGrid = function(container, config){ + Ext.grid.EditorGrid.superclass.constructor.call(this, container, config); + this.getGridEl().addClass("xedit-grid"); + + if(!this.selModel){ + this.selModel = new Ext.grid.CellSelectionModel(); + } + + this.activeEditor = null; + + this.addEvents({ + + "beforeedit" : true, + + "afteredit" : true, + + "validateedit" : true + }); + this.on("bodyscroll", this.stopEditing, this); + this.on(this.clicksToEdit == 1 ? "cellclick" : "celldblclick", this.onCellDblClick, this); +}; + +Ext.extend(Ext.grid.EditorGrid, Ext.grid.Grid, { + + clicksToEdit: 2, + + + isEditor : true, + + trackMouseOver: false, + + onCellDblClick : function(g, row, col){ + this.startEditing(row, col); + }, + + onEditComplete : function(ed, value, startValue){ + this.editing = false; + this.activeEditor = null; + ed.un("specialkey", this.selModel.onEditorKey, this.selModel); + if(String(value) !== String(startValue)){ + var r = ed.record; + var field = this.colModel.getDataIndex(ed.col); + var e = { + grid: this, + record: r, + field: field, + originalValue: startValue, + value: value, + row: ed.row, + column: ed.col, + cancel:false + }; + if(this.fireEvent("validateedit", e) !== false && !e.cancel){ + r.set(field, e.value); + delete e.cancel; + this.fireEvent("afteredit", e); + } + } + this.view.focusCell(ed.row, ed.col); + }, + + + startEditing : function(row, col){ + this.stopEditing(); + if(this.colModel.isCellEditable(col, row)){ + this.view.ensureVisible(row, col, true); + var r = this.dataSource.getAt(row); + var field = this.colModel.getDataIndex(col); + var e = { + grid: this, + record: r, + field: field, + value: r.data[field], + row: row, + column: col, + cancel:false + }; + if(this.fireEvent("beforeedit", e) !== false && !e.cancel){ + this.editing = true; + var ed = this.colModel.getCellEditor(col, row); + if(!ed.rendered){ + ed.render(ed.parentEl || document.body); + } + (function(){ + ed.row = row; + ed.col = col; + ed.record = r; + ed.on("complete", this.onEditComplete, this, {single: true}); + ed.on("specialkey", this.selModel.onEditorKey, this.selModel); + this.activeEditor = ed; + var v = r.data[field]; + ed.startEdit(this.view.getCell(row, col), v); + }).defer(50, this); + } + } + }, + + + stopEditing : function(){ + if(this.activeEditor){ + this.activeEditor.completeEdit(); + } + this.activeEditor = null; + } +}); +Ext.grid.GridEditor = function(field, config){ + Ext.grid.GridEditor.superclass.constructor.call(this, field, config); + field.monitorTab = false; +}; + +Ext.extend(Ext.grid.GridEditor, Ext.Editor, { + alignment: "tl-tl", + autoSize: "width", + hideEl : false, + cls: "x-small-editor x-grid-editor", + shim:false, + shadow:"frame" +}); +Ext.grid.PropertyRecord = Ext.data.Record.create([ + {name:'name',type:'string'}, 'value' +]); + +Ext.grid.PropertyStore = function(grid, source){ + this.grid = grid; + this.store = new Ext.data.Store({ + recordType : Ext.grid.PropertyRecord + }); + this.store.on('update', this.onUpdate, this); + if(source){ + this.setSource(source); + } + Ext.grid.PropertyStore.superclass.constructor.call(this); +}; +Ext.extend(Ext.grid.PropertyStore, Ext.util.Observable, { + setSource : function(o){ + this.source = o; + this.store.removeAll(); + var data = []; + for(var k in o){ + if(this.isEditableValue(o[k])){ + data.push(new Ext.grid.PropertyRecord({name: k, value: o[k]}, k)); + } + } + this.store.loadRecords({records: data}, {}, true); + }, + + onUpdate : function(ds, record, type){ + if(type == Ext.data.Record.EDIT){ + var v = record.data['value']; + var oldValue = record.modified['value']; + if(this.grid.fireEvent('beforepropertychange', this.source, record.id, v, oldValue) !== false){ + this.source[record.id] = v; + record.commit(); + this.grid.fireEvent('propertychange', this.source, record.id, v, oldValue); + }else{ + record.reject(); + } + } + }, + + getProperty : function(row){ + return this.store.getAt(row); + }, + + isEditableValue: function(val){ + if(val && val instanceof Date){ + return true; + }else if(typeof val == 'object' || typeof val == 'function'){ + return false; + } + return true; + }, + + setValue : function(prop, value){ + this.source[prop] = value; + this.store.getById(prop).set('value', value); + }, + + getSource : function(){ + return this.source; + } +}); + +Ext.grid.PropertyColumnModel = function(grid, store){ + this.grid = grid; + var g = Ext.grid; + g.PropertyColumnModel.superclass.constructor.call(this, [ + {header: this.nameText, sortable: true, dataIndex:'name', id: 'name'}, + {header: this.valueText, resizable:false, dataIndex: 'value', id: 'value'} + ]); + this.store = store; + this.bselect = Ext.DomHelper.append(document.body, { + tag: 'select', style:'display:none', cls: 'x-grid-editor', children: [ + {tag: 'option', value: 'true', html: 'true'}, + {tag: 'option', value: 'false', html: 'false'} + ] + }); + Ext.id(this.bselect); + var f = Ext.form; + this.editors = { + 'date' : new g.GridEditor(new f.DateField({selectOnFocus:true})), + 'string' : new g.GridEditor(new f.TextField({selectOnFocus:true})), + 'number' : new g.GridEditor(new f.NumberField({selectOnFocus:true, style:'text-align:left;'})), + 'boolean' : new g.GridEditor(new f.Field({el:this.bselect,selectOnFocus:true})) + }; + this.renderCellDelegate = this.renderCell.createDelegate(this); + this.renderPropDelegate = this.renderProp.createDelegate(this); +}; + +Ext.extend(Ext.grid.PropertyColumnModel, Ext.grid.ColumnModel, { + nameText : 'Name', + valueText : 'Value', + dateFormat : 'm/j/Y', + renderDate : function(dateVal){ + return dateVal.dateFormat(this.dateFormat); + }, + + renderBool : function(bVal){ + return bVal ? 'true' : 'false'; + }, + + isCellEditable : function(colIndex, rowIndex){ + return colIndex == 1; + }, + + getRenderer : function(col){ + return col == 1 ? + this.renderCellDelegate : this.renderPropDelegate; + }, + + renderProp : function(v){ + return this.getPropertyName(v); + }, + + renderCell : function(val){ + var rv = val; + if(val instanceof Date){ + rv = this.renderDate(val); + }else if(typeof val == 'boolean'){ + rv = this.renderBool(val); + } + return Ext.util.Format.htmlEncode(rv); + }, + + getPropertyName : function(name){ + var pn = this.grid.propertyNames; + return pn && pn[name] ? pn[name] : name; + }, + + getCellEditor : function(colIndex, rowIndex){ + var p = this.store.getProperty(rowIndex); + var n = p.data['name'], val = p.data['value']; + if(this.grid.customEditors[n]){ + return this.grid.customEditors[n]; + } + if(val instanceof Date){ + return this.editors['date']; + }else if(typeof val == 'number'){ + return this.editors['number']; + }else if(typeof val == 'boolean'){ + return this.editors['boolean']; + }else{ + return this.editors['string']; + } + } +}); + +Ext.grid.PropertyGrid = function(container, config){ + config = config || {}; + var store = new Ext.grid.PropertyStore(this); + this.store = store; + var cm = new Ext.grid.PropertyColumnModel(this, store); + store.store.sort('name', 'ASC'); + Ext.grid.PropertyGrid.superclass.constructor.call(this, container, Ext.apply({ + ds: store.store, + cm: cm, + enableColLock:false, + enableColumnMove:false, + stripeRows:false, + trackMouseOver: false, + clicksToEdit:1 + }, config)); + this.getGridEl().addClass('x-props-grid'); + this.lastEditRow = null; + this.on('columnresize', this.onColumnResize, this); + this.addEvents({ + beforepropertychange: true, + propertychange: true + }); + this.customEditors = this.customEditors || {}; +}; +Ext.extend(Ext.grid.PropertyGrid, Ext.grid.EditorGrid, { + render : function(){ + Ext.grid.PropertyGrid.superclass.render.call(this); + this.autoSize.defer(100, this); + }, + + autoSize : function(){ + Ext.grid.PropertyGrid.superclass.autoSize.call(this); + if(this.view){ + this.view.fitColumns(); + } + }, + + onColumnResize : function(){ + this.colModel.setColumnWidth(1, this.container.getWidth(true)-this.colModel.getColumnWidth(0)); + this.autoSize(); + }, + + setSource : function(source){ + this.store.setSource(source); + }, + + getSource : function(){ + return this.store.getSource(); + } +}); + +Ext.LoadMask = function(el, config){ + this.el = Ext.get(el); + Ext.apply(this, config); + if(this.store){ + this.store.on('beforeload', this.onBeforeLoad, this); + this.store.on('load', this.onLoad, this); + this.store.on('loadexception', this.onLoad, this); + this.removeMask = false; + }else{ + var um = this.el.getUpdateManager(); + um.showLoadIndicator = false; um.on('beforeupdate', this.onBeforeLoad, this); + um.on('update', this.onLoad, this); + um.on('failure', this.onLoad, this); + 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); + } + }, + + destroy : function(){ + if(this.store){ + this.store.un('beforeload', this.onBeforeLoad, this); + this.store.un('load', this.onLoad, this); + this.store.un('loadexception', this.onLoad, this); + }else{ + var um = this.el.getUpdateManager(); + um.un('beforeupdate', this.onBeforeLoad, this); + um.un('update', this.onLoad, this); + um.un('failure', this.onLoad, this); + } + } +}; +Ext.debug = { + init : function(){ + var CP = Ext.ContentPanel; + var bd = Ext.get(document.body); + + var dlg = new Ext.LayoutDialog('x-debug-browser', { + autoCreate:true, + width:800, + height:450, + title: 'Ext Debug Console & Inspector', + proxyDrag:true, + shadow:true, + center:{alwaysShowTabs:true}, + constraintoviewport:false + }); + + dlg.el.swallowEvent('click'); + + var mainLayout = dlg.getLayout(); + mainLayout.beginUpdate(); + + var clayout = mainLayout.add('center', + new Ext.debug.InnerLayout('x-debug-console', 400, { + title: 'Debug Console' + } + )); + + var ilayout = mainLayout.add('center', + new Ext.debug.InnerLayout('x-debug-inspector', 250, { + title: 'DOM Inspector' + } + )); + + var scriptPanel = clayout.add('east', new CP({ + autoCreate:{ + tag: 'div', children: [ + {tag: 'div'}, + {tag:'textarea'} + ] + }, + fitContainer:true, + fitToFrame:true, + title:'Script Console', + autoScroll: Ext.isGecko, setSize : function(w, h){ + Ext.ContentPanel.prototype.setSize.call(this, w, h); + if(Ext.isGecko && Ext.isStrict){ + var s = this.adjustForComponents(w, h); + this.resizeEl.setSize(s.width-2, s.height-2); + } + } + })); + var sel = scriptPanel.el; + var script = sel.child('textarea'); + scriptPanel.resizeEl = script; + var sctb = scriptPanel.toolbar = new Ext.Toolbar(sel.child('div')); + sctb.add({ + text: 'Run', + handler: function(){ + var s = script.dom.value; + if(trap.checked){ + try{ + var rt = eval(s); + Ext.debug.dump(rt === undefined? '(no return)' : rt); + }catch(e){ + Ext.debug.log(e.message || e.descript); + } + }else{ + var rt = eval(s); + Ext.debug.dump(rt === undefined? '(no return)' : rt); + } + } + }, { + text: 'Clear', + handler: function(){ + script.dom.value = ''; + script.dom.focus(); + } + }); + + var trap = Ext.DomHelper.append(sctb.el, {tag:'input', type:'checkbox', checked: 'checked'}); + trap.checked = true; + sctb.add('-', trap, 'Trap Errors'); + + + var stylesGrid = new Ext.grid.PropertyGrid(bd.createChild(), { + nameText: 'Style', + enableHdMenu: false, + enableColumnResize: false + }); + + var stylePanel = ilayout.add('east', new Ext.GridPanel(stylesGrid, + {title: '(No element selected)'})); + + stylesGrid.render(); + + stylesGrid.getView().mainHd.setDisplayed(false); + + clayout.tbar.add({ + text: 'Clear', + handler: function(){ + Ext.debug.console.jsonData = []; + Ext.debug.console.refresh(); + } + }); + + var treeEl = ilayout.main.getEl(); + var tb = ilayout.tbar; + + var inspectIgnore, inspecting; + + function inspectListener(e, t){ + if(!inspectIgnore.contains(e.getPoint())){ + findNode(t); + } + } + + function stopInspecting(e, t){ + if(!inspectIgnore.contains(e.getPoint())){ + inspect.toggle(false); + if(findNode(t) !== false){ + e.stopEvent(); + } + } + } + + function stopInspectingEsc(e, t){ + if(e.getKey() == e.ESC){ + inspect.toggle(false); + } + } + + var inspect = tb.addButton({ + text: 'Inspect', + enableToggle: true, + pressed:false, + toggleHandler: function(n, pressed){ + var d = Ext.get(document); + if(pressed){ + d.on('mouseover', inspectListener, window, {buffer:50}); + d.on('mousedown', stopInspecting); + d.on('keydown', stopInspectingEsc); + inspectIgnore = dlg.el.getRegion(); + inspecting = true; + }else{ + d.un('mouseover', inspectListener); + d.un('mousedown', stopInspecting); + d.on('keydown', stopInspectingEsc); + inspecting = false; + var n = tree.getSelectionModel().getSelectedNode(); + if(n && n.htmlNode){ + onNodeSelect(tree, n, false); + } + } + } + }); + + tb.addSeparator(); + + var frameEl = tb.addButton({ + text: 'Highlight Selection', + enableToggle: true, + pressed:false, + toggleHandler: function(n, pressed){ + var n = tree.getSelectionModel().getSelectedNode(); + if(n && n.htmlNode){ + n[pressed ? 'frame' : 'unframe'](); + } + } + }); + + tb.addSeparator(); + + var reload = tb.addButton({ + text: 'Refresh Children', + disabled:true, + handler: function(){ + var n = tree.getSelectionModel().getSelectedNode(); + if(n && n.reload){ + n.reload(); + } + } + }); + + tb.add( '-', { + text: 'Collapse All', + handler: function(){ + tree.root.collapse(true); + } + }); + + mainLayout.endUpdate(); + + mainLayout.getRegion('center').showPanel(0); + + stylesGrid.on('propertychange', function(s, name, value){ + var node = stylesGrid.treeNode; + if(styles){ + node.htmlNode.style[name] = value; + }else{ + node.htmlNode[name] = value; + } + node.refresh(true); + }); + + var stb = new Ext.Toolbar(stylesGrid.view.getHeaderPanel(true)); + + var swap = stb.addButton({ + text: 'DOM Attributes', + menu: { + items: [ + new Ext.menu.CheckItem({id:'dom', text:'DOM Attributes', checked: true, group:'xdb-styles'}), + new Ext.menu.CheckItem({id:'styles', text:'CSS Properties', group:'xdb-styles'}) + ] + } + }); + + swap.menu.on('click', function(){ + styles = swap.menu.items.get('styles').checked; + showAll[styles? 'show' : 'hide'](); + swap.setText(styles ? 'CSS Properties' : 'DOM Attributes'); + var n = tree.getSelectionModel().getSelectedNode(); + if(n){ + onNodeSelect(tree, n); + } + }); + + var addStyle = stb.addButton({ + text: 'Add', + disabled: true, + handler: function(){ + Ext.MessageBox.prompt('Add Property', 'Property Name:', function(btn, v){ + var store = stylesGrid.store.store; + if(btn == 'ok' && v && !store.getById(v)){ + var r = new Ext.grid.PropertyRecord({name:v, value: ''}, v); + store.add(r); + stylesGrid.startEditing(store.getCount()-1, 1); + } + }); + } + }); + + var showAll = stb.addButton({ + text: 'Computed Styles', + hidden: true, + pressed: false, + enableToggle: true, + toggleHandler: function(){ + var n = tree.getSelectionModel().getSelectedNode(); + if(n){ + onNodeSelect(tree, n); + } + } + }); + + var styles = false, hnode; + var nonSpace = /^\s*$/; + var html = Ext.util.Format.htmlEncode; + var ellipsis = Ext.util.Format.ellipsis; + var styleRe = /\s?([a-z\-]*)\:([^;]*)(?:[;\s\n\r]*)/gi; + + function findNode(n){ + if(!n || n.nodeType != 1 || n == document.body || n == document){ + return false; + } + var pn = [n], p = n; + while((p = p.parentNode) && p.nodeType == 1 && p.tagName.toUpperCase() != 'HTML'){ + pn.unshift(p); + } + var cn = hnode; + for(var i = 0, len = pn.length; i < len; i++){ + cn.expand(); + cn = cn.findChild('htmlNode', pn[i]); + if(!cn){ return false; + } + } + cn.select(); + var a = cn.ui.anchor; + treeEl.dom.scrollTop = Math.max(0 ,a.offsetTop-10); + cn.highlight(); + return true; + } + + function nodeTitle(n){ + var s = n.tagName; + if(n.id){ + s += '#'+n.id; + }else if(n.className){ + s += '.'+n.className; + } + return s; + } + + function onNodeSelect(t, n, last){ + if(last && last.unframe){ + last.unframe(); + } + var props = {}; + if(n && n.htmlNode){ + if(frameEl.pressed){ + n.frame(); + } + if(inspecting){ + return; + } + addStyle.enable(); + reload.setDisabled(n.leaf); + var dom = n.htmlNode; + stylePanel.setTitle(nodeTitle(dom)); + if(styles && !showAll.pressed){ + var s = dom.style ? dom.style.cssText : ''; + if(s){ + var m; + while ((m = styleRe.exec(s)) != null){ + props[m[1].toLowerCase()] = m[2]; + } + } + }else if(styles){ + var cl = Ext.debug.cssList; + var s = dom.style, fly = Ext.fly(dom); + if(s){ + for(var i = 0, len = cl.length; i' + ellipsis(html(String(c.nodeValue)), 35) + '', + cls: 'x-tree-noicon' + })); + } + } + cb(); + }; + + var tree = new Ext.tree.TreePanel(treeEl, { + enableDD:false , + loader: loader, + lines:false, + rootVisible:false, + animate:false, + hlColor:'ffff9c' + }); + tree.getSelectionModel().on('selectionchange', onNodeSelect, null, {buffer:250}); + + var root = tree.setRootNode(new Ext.tree.TreeNode('Ext')); + + hnode = root.appendChild(new Ext.debug.HtmlNode( + document.getElementsByTagName('html')[0] + )); + + tree.render(); + + Ext.debug.console = new Ext.JsonView(clayout.main.getEl(), + '
    > {msg}
    '); + Ext.debug.console.jsonData = []; + + Ext.debug.dialog = dlg; + }, + + show : function(){ + var d = Ext.debug; + if(!d.dialog){ + d.init(); + } + if(!d.dialog.isVisible()){ + d.dialog.show(); + } + }, + + hide : function(){ + if(Ext.debug.dialog){ + Ext.debug.dialog.hide(); + } + }, + + + log : function(arg1, arg2, etc){ + Ext.debug.show(); + var m = ""; + for(var i = 0, len = arguments.length; i < len; i++){ + m += (i == 0 ? "" : ", ") + arguments[i]; + } + var cn = Ext.debug.console; + cn.jsonData.unshift({msg: m}); + cn.refresh(); + }, + + + logf : function(format, arg1, arg2, etc){ + Ext.debug.log(String.format.apply(String, arguments)); + }, + + + dump : function(o){ + if(typeof o == 'string' || typeof o == 'number' || typeof o == 'undefined' || o instanceof Date){ + Ext.debug.log(o); + }else if(!o){ + Ext.debug.log("null"); + }else if(typeof o != "object"){ + Ext.debug.log('Unknown return type'); + }else if(o instanceof Array){ + Ext.debug.log('['+o.join(',')+']'); + }else{ + var b = ["{\n"]; + for(var key in o){ + var to = typeof o[key]; + if(to != "function" && to != "object"){ + b.push(String.format(" {0}: {1},\n", key, o[key])); + } + } + var s = b.join(""); + if(s.length > 3){ + s = s.substr(0, s.length-2); + } + Ext.debug.log(s + "\n}"); + } + }, + + _timers : {}, + + time : function(name){ + name = name || "def"; + Ext.debug._timers[name] = new Date().getTime(); + }, + + + timeEnd : function(name, printResults){ + var t = new Date().getTime(); + name = name || "def"; + var v = String.format("{0} ms", t-Ext.debug._timers[name]); + Ext.debug._timers[name] = new Date().getTime(); + if(printResults !== false){ + Ext.debug.log('Timer ' + (name == "def" ? v : name + ": " + v)); + } + return v; + } +}; + +Ext.debug.HtmlNode = function(){ + var html = Ext.util.Format.htmlEncode; + var ellipsis = Ext.util.Format.ellipsis; + var nonSpace = /^\s*$/; + + var attrs = [ + {n: 'id', v: 'id'}, + {n: 'className', v: 'class'}, + {n: 'name', v: 'name'}, + {n: 'type', v: 'type'}, + {n: 'src', v: 'src'}, + {n: 'href', v: 'href'} + ]; + + function hasChild(n){ + for(var i = 0, c; c = n.childNodes[i]; i++){ + if(c.nodeType == 1){ + return true; + } + } + return false; + } + + function renderNode(n, leaf){ + var tag = n.tagName.toLowerCase(); + var s = '<' + tag; + for(var i = 0, len = attrs.length; i < len; i++){ + var a = attrs[i]; + var v = n[a.n]; + if(v && !nonSpace.test(v)){ + s += ' ' + a.v + '="' + html(v) +'"'; + } + } + var style = n.style ? n.style.cssText : ''; + if(style){ + s += ' style="' + html(style.toLowerCase()) +'"'; + } + if(leaf && n.childNodes.length > 0){ + s+='>' + ellipsis(html(String(n.innerHTML)), 35) + '</'+tag+'>'; + }else if(leaf){ + s += ' />'; + }else{ + s += '>'; + } + return s; + } + + var HtmlNode = function(n){ + var leaf = !hasChild(n); + this.htmlNode = n; + this.tagName = n.tagName.toLowerCase(); + var attr = { + text : renderNode(n, leaf), + leaf : leaf, + cls: 'x-tree-noicon' + }; + HtmlNode.superclass.constructor.call(this, attr); + this.attributes.htmlNode = n; if(!leaf){ + this.on('expand', this.onExpand, this); + this.on('collapse', this.onCollapse, this); + } + }; + + + Ext.extend(HtmlNode, Ext.tree.AsyncTreeNode, { + cls: 'x-tree-noicon', + preventHScroll: true, + refresh : function(highlight){ + var leaf = !hasChild(this.htmlNode); + this.setText(renderNode(this.htmlNode, leaf)); + if(highlight){ + Ext.fly(this.ui.textNode).highlight(); + } + }, + + onExpand : function(){ + if(!this.closeNode && this.parentNode){ + this.closeNode = this.parentNode.insertBefore(new Ext.tree.TreeNode({ + text:'</' + this.tagName + '>', + cls: 'x-tree-noicon' + }), this.nextSibling); + }else if(this.closeNode){ + this.closeNode.ui.show(); + } + }, + + onCollapse : function(){ + if(this.closeNode){ + this.closeNode.ui.hide(); + } + }, + + render : function(bulkRender){ + HtmlNode.superclass.render.call(this, bulkRender); + }, + + highlightNode : function(){ + }, + + highlight : function(){ + }, + + frame : function(){ + this.htmlNode.style.border = '1px solid #0000ff'; + }, + + unframe : function(){ + this.htmlNode.style.border = ''; + } + }); + + return HtmlNode; +}(); + +Ext.debug.InnerLayout = function(id, w, cfg){ + var el = Ext.DomHelper.append(document.body, {id:id}); + var layout = new Ext.BorderLayout(el, { + north: { + initialSize:28 + }, + center: { + titlebar: false + }, + east: { + split:true, + initialSize:w, + titlebar:true + } + }); + Ext.debug.InnerLayout.superclass.constructor.call(this, layout, cfg); + + layout.beginUpdate(); + + var tbPanel = layout.add('north', new Ext.ContentPanel({ + autoCreate:true, fitToFrame:true})); + + this.main = layout.add('center', new Ext.ContentPanel({ + autoCreate:true, fitToFrame:true, autoScroll:true})); + + this.tbar = new Ext.Toolbar(tbPanel.el); + + var mtbEl = tbPanel.resizeEl = tbPanel.el.child('div.x-toolbar'); + mtbEl.setStyle('border-bottom', '0 none'); + layout.endUpdate(true); +}; + +Ext.extend(Ext.debug.InnerLayout, Ext.NestedLayoutPanel, { + add : function(){ + return this.layout.add.apply(this.layout, arguments); + } +}); + +Ext.debug.cssList = ['background-color','border','border-color','border-spacing', +'border-style','border-top','border-right','border-bottom','border-left','border-top-color', +'border-right-color','border-bottom-color','border-left-color','border-top-width','border-right-width', +'border-bottom-width','border-left-width','border-width','bottom','color','font-size','font-size-adjust', +'font-stretch','font-style','height','left','letter-spacing','line-height','margin','margin-top', +'margin-right','margin-bottom','margin-left','marker-offset','max-height','max-width','min-height', +'min-width','orphans','outline','outline-color','outline-style','outline-width','overflow','padding', +'padding-top','padding-right','padding-bottom','padding-left','quotes','right','size','text-indent', +'top','width','word-spacing','z-index','opacity','outline-offset']; + +if(typeof console == 'undefined'){ + console = Ext.debug; +} + + +Ext.EventManager.on(window, 'load', function(){ + Ext.get(document).on('keydown', function(e){ + if(e.ctrlKey && e.shiftKey && e.getKey() == e.HOME){ + Ext.debug.show(); + } + }); +}); + +Ext.print = Ext.log = Ext.debug.log; +Ext.printf = Ext.logf = Ext.debug.logf; +Ext.dump = Ext.debug.dump; +Ext.timer = Ext.debug.time; +Ext.timerEnd = Ext.debug.timeEnd; + diff --git a/thirdparty/jsmin/test/prototype.js b/thirdparty/jsmin/test/prototype.js new file mode 100644 index 000000000..9c90f9932 --- /dev/null +++ b/thirdparty/jsmin/test/prototype.js @@ -0,0 +1,3271 @@ +/* Prototype JavaScript framework, version 1.5.1 + * (c) 2005-2007 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://www.prototypejs.org/ + * +/*--------------------------------------------------------------------------*/ + +var Prototype = { + Version: '1.5.1', + + Browser: { + IE: !!(window.attachEvent && !window.opera), + Opera: !!window.opera, + WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, + Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1 + }, + + BrowserFeatures: { + XPath: !!document.evaluate, + ElementExtensions: !!window.HTMLElement, + SpecificElementExtensions: + (document.createElement('div').__proto__ !== + document.createElement('form').__proto__) + }, + + ScriptFragment: ']*>([\u0001-\uFFFF]*?)', + JSONFilter: /^\/\*-secure-\s*(.*)\s*\*\/\s*$/, + + emptyFunction: function() { }, + K: function(x) { return x } +} + +var Class = { + create: function() { + return function() { + this.initialize.apply(this, arguments); + } + } +} + +var Abstract = new Object(); + +Object.extend = function(destination, source) { + for (var property in source) { + destination[property] = source[property]; + } + return destination; +} + +Object.extend(Object, { + inspect: function(object) { + try { + if (object === undefined) return 'undefined'; + if (object === null) return 'null'; + return object.inspect ? object.inspect() : object.toString(); + } catch (e) { + if (e instanceof RangeError) return '...'; + throw e; + } + }, + + toJSON: function(object) { + var type = typeof object; + switch(type) { + case 'undefined': + case 'function': + case 'unknown': return; + case 'boolean': return object.toString(); + } + if (object === null) return 'null'; + if (object.toJSON) return object.toJSON(); + if (object.ownerDocument === document) return; + var results = []; + for (var property in object) { + var value = Object.toJSON(object[property]); + if (value !== undefined) + results.push(property.toJSON() + ': ' + value); + } + return '{' + results.join(', ') + '}'; + }, + + keys: function(object) { + var keys = []; + for (var property in object) + keys.push(property); + return keys; + }, + + values: function(object) { + var values = []; + for (var property in object) + values.push(object[property]); + return values; + }, + + clone: function(object) { + return Object.extend({}, object); + } +}); + +Function.prototype.bind = function() { + var __method = this, args = $A(arguments), object = args.shift(); + return function() { + return __method.apply(object, args.concat($A(arguments))); + } +} + +Function.prototype.bindAsEventListener = function(object) { + var __method = this, args = $A(arguments), object = args.shift(); + return function(event) { + return __method.apply(object, [event || window.event].concat(args)); + } +} + +Object.extend(Number.prototype, { + toColorPart: function() { + return this.toPaddedString(2, 16); + }, + + succ: function() { + return this + 1; + }, + + times: function(iterator) { + $R(0, this, true).each(iterator); + return this; + }, + + toPaddedString: function(length, radix) { + var string = this.toString(radix || 10); + return '0'.times(length - string.length) + string; + }, + + toJSON: function() { + return isFinite(this) ? this.toString() : 'null'; + } +}); + +Date.prototype.toJSON = function() { + return '"' + this.getFullYear() + '-' + + (this.getMonth() + 1).toPaddedString(2) + '-' + + this.getDate().toPaddedString(2) + 'T' + + this.getHours().toPaddedString(2) + ':' + + this.getMinutes().toPaddedString(2) + ':' + + this.getSeconds().toPaddedString(2) + '"'; +}; + +var Try = { + these: function() { + var returnValue; + + for (var i = 0, length = arguments.length; i < length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) {} + } + + return returnValue; + } +} + +/*--------------------------------------------------------------------------*/ + +var PeriodicalExecuter = Class.create(); +PeriodicalExecuter.prototype = { + initialize: function(callback, frequency) { + this.callback = callback; + this.frequency = frequency; + this.currentlyExecuting = false; + + this.registerCallback(); + }, + + registerCallback: function() { + this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + stop: function() { + if (!this.timer) return; + clearInterval(this.timer); + this.timer = null; + }, + + onTimerEvent: function() { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.callback(this); + } finally { + this.currentlyExecuting = false; + } + } + } +} +Object.extend(String, { + interpret: function(value) { + return value == null ? '' : String(value); + }, + specialChar: { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '\\': '\\\\' + } +}); + +Object.extend(String.prototype, { + gsub: function(pattern, replacement) { + var result = '', source = this, match; + replacement = arguments.callee.prepareReplacement(replacement); + + while (source.length > 0) { + if (match = source.match(pattern)) { + result += source.slice(0, match.index); + result += String.interpret(replacement(match)); + source = source.slice(match.index + match[0].length); + } else { + result += source, source = ''; + } + } + return result; + }, + + sub: function(pattern, replacement, count) { + replacement = this.gsub.prepareReplacement(replacement); + count = count === undefined ? 1 : count; + + return this.gsub(pattern, function(match) { + if (--count < 0) return match[0]; + return replacement(match); + }); + }, + + scan: function(pattern, iterator) { + this.gsub(pattern, iterator); + return this; + }, + + truncate: function(length, truncation) { + length = length || 30; + truncation = truncation === undefined ? '...' : truncation; + return this.length > length ? + this.slice(0, length - truncation.length) + truncation : this; + }, + + strip: function() { + return this.replace(/^\s+/, '').replace(/\s+$/, ''); + }, + + stripTags: function() { + return this.replace(/<\/?[^>]+>/gi, ''); + }, + + stripScripts: function() { + return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); + }, + + extractScripts: function() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); + var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + return (this.match(matchAll) || []).map(function(scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }); + }, + + evalScripts: function() { + return this.extractScripts().map(function(script) { return eval(script) }); + }, + + escapeHTML: function() { + var self = arguments.callee; + self.text.data = this; + return self.div.innerHTML; + }, + + unescapeHTML: function() { + var div = document.createElement('div'); + div.innerHTML = this.stripTags(); + return div.childNodes[0] ? (div.childNodes.length > 1 ? + $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : + div.childNodes[0].nodeValue) : ''; + }, + + toQueryParams: function(separator) { + var match = this.strip().match(/([^?#]*)(#.*)?$/); + if (!match) return {}; + + return match[1].split(separator || '&').inject({}, function(hash, pair) { + if ((pair = pair.split('='))[0]) { + var key = decodeURIComponent(pair.shift()); + var value = pair.length > 1 ? pair.join('=') : pair[0]; + if (value != undefined) value = decodeURIComponent(value); + + if (key in hash) { + if (hash[key].constructor != Array) hash[key] = [hash[key]]; + hash[key].push(value); + } + else hash[key] = value; + } + return hash; + }); + }, + + toArray: function() { + return this.split(''); + }, + + succ: function() { + return this.slice(0, this.length - 1) + + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); + }, + + times: function(count) { + var result = ''; + for (var i = 0; i < count; i++) result += this; + return result; + }, + + camelize: function() { + var parts = this.split('-'), len = parts.length; + if (len == 1) return parts[0]; + + var camelized = this.charAt(0) == '-' + ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) + : parts[0]; + + for (var i = 1; i < len; i++) + camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); + + return camelized; + }, + + capitalize: function() { + return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); + }, + + underscore: function() { + return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); + }, + + dasherize: function() { + return this.gsub(/_/,'-'); + }, + + inspect: function(useDoubleQuotes) { + var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { + var character = String.specialChar[match[0]]; + return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); + }); + if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; + return "'" + escapedString.replace(/'/g, '\\\'') + "'"; + }, + + toJSON: function() { + return this.inspect(true); + }, + + unfilterJSON: function(filter) { + return this.sub(filter || Prototype.JSONFilter, '#{1}'); + }, + + evalJSON: function(sanitize) { + var json = this.unfilterJSON(); + try { + if (!sanitize || (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(json))) + return eval('(' + json + ')'); + } catch (e) { } + throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); + }, + + include: function(pattern) { + return this.indexOf(pattern) > -1; + }, + + startsWith: function(pattern) { + return this.indexOf(pattern) === 0; + }, + + endsWith: function(pattern) { + var d = this.length - pattern.length; + return d >= 0 && this.lastIndexOf(pattern) === d; + }, + + empty: function() { + return this == ''; + }, + + blank: function() { + return /^\s*$/.test(this); + } +}); + +if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { + escapeHTML: function() { + return this.replace(/&/g,'&').replace(//g,'>'); + }, + unescapeHTML: function() { + return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); + } +}); + +String.prototype.gsub.prepareReplacement = function(replacement) { + if (typeof replacement == 'function') return replacement; + var template = new Template(replacement); + return function(match) { return template.evaluate(match) }; +} + +String.prototype.parseQuery = String.prototype.toQueryParams; + +Object.extend(String.prototype.escapeHTML, { + div: document.createElement('div'), + text: document.createTextNode('') +}); + +with (String.prototype.escapeHTML) div.appendChild(text); + +var Template = Class.create(); +Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; +Template.prototype = { + initialize: function(template, pattern) { + this.template = template.toString(); + this.pattern = pattern || Template.Pattern; + }, + + evaluate: function(object) { + return this.template.gsub(this.pattern, function(match) { + var before = match[1]; + if (before == '\\') return match[2]; + return before + String.interpret(object[match[3]]); + }); + } +} + +var $break = {}, $continue = new Error('"throw $continue" is deprecated, use "return" instead'); + +var Enumerable = { + each: function(iterator) { + var index = 0; + try { + this._each(function(value) { + iterator(value, index++); + }); + } catch (e) { + if (e != $break) throw e; + } + return this; + }, + + eachSlice: function(number, iterator) { + var index = -number, slices = [], array = this.toArray(); + while ((index += number) < array.length) + slices.push(array.slice(index, index+number)); + return slices.map(iterator); + }, + + all: function(iterator) { + var result = true; + this.each(function(value, index) { + result = result && !!(iterator || Prototype.K)(value, index); + if (!result) throw $break; + }); + return result; + }, + + any: function(iterator) { + var result = false; + this.each(function(value, index) { + if (result = !!(iterator || Prototype.K)(value, index)) + throw $break; + }); + return result; + }, + + collect: function(iterator) { + var results = []; + this.each(function(value, index) { + results.push((iterator || Prototype.K)(value, index)); + }); + return results; + }, + + detect: function(iterator) { + var result; + this.each(function(value, index) { + if (iterator(value, index)) { + result = value; + throw $break; + } + }); + return result; + }, + + findAll: function(iterator) { + var results = []; + this.each(function(value, index) { + if (iterator(value, index)) + results.push(value); + }); + return results; + }, + + grep: function(pattern, iterator) { + var results = []; + this.each(function(value, index) { + var stringValue = value.toString(); + if (stringValue.match(pattern)) + results.push((iterator || Prototype.K)(value, index)); + }) + return results; + }, + + include: function(object) { + var found = false; + this.each(function(value) { + if (value == object) { + found = true; + throw $break; + } + }); + return found; + }, + + inGroupsOf: function(number, fillWith) { + fillWith = fillWith === undefined ? null : fillWith; + return this.eachSlice(number, function(slice) { + while(slice.length < number) slice.push(fillWith); + return slice; + }); + }, + + inject: function(memo, iterator) { + this.each(function(value, index) { + memo = iterator(memo, value, index); + }); + return memo; + }, + + invoke: function(method) { + var args = $A(arguments).slice(1); + return this.map(function(value) { + return value[method].apply(value, args); + }); + }, + + max: function(iterator) { + var result; + this.each(function(value, index) { + value = (iterator || Prototype.K)(value, index); + if (result == undefined || value >= result) + result = value; + }); + return result; + }, + + min: function(iterator) { + var result; + this.each(function(value, index) { + value = (iterator || Prototype.K)(value, index); + if (result == undefined || value < result) + result = value; + }); + return result; + }, + + partition: function(iterator) { + var trues = [], falses = []; + this.each(function(value, index) { + ((iterator || Prototype.K)(value, index) ? + trues : falses).push(value); + }); + return [trues, falses]; + }, + + pluck: function(property) { + var results = []; + this.each(function(value, index) { + results.push(value[property]); + }); + return results; + }, + + reject: function(iterator) { + var results = []; + this.each(function(value, index) { + if (!iterator(value, index)) + results.push(value); + }); + return results; + }, + + sortBy: function(iterator) { + return this.map(function(value, index) { + return {value: value, criteria: iterator(value, index)}; + }).sort(function(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }).pluck('value'); + }, + + toArray: function() { + return this.map(); + }, + + zip: function() { + var iterator = Prototype.K, args = $A(arguments); + if (typeof args.last() == 'function') + iterator = args.pop(); + + var collections = [this].concat(args).map($A); + return this.map(function(value, index) { + return iterator(collections.pluck(index)); + }); + }, + + size: function() { + return this.toArray().length; + }, + + inspect: function() { + return '#'; + } +} + +Object.extend(Enumerable, { + map: Enumerable.collect, + find: Enumerable.detect, + select: Enumerable.findAll, + member: Enumerable.include, + entries: Enumerable.toArray +}); +var $A = Array.from = function(iterable) { + if (!iterable) return []; + if (iterable.toArray) { + return iterable.toArray(); + } else { + var results = []; + for (var i = 0, length = iterable.length; i < length; i++) + results.push(iterable[i]); + return results; + } +} + +if (Prototype.Browser.WebKit) { + $A = Array.from = function(iterable) { + if (!iterable) return []; + if (!(typeof iterable == 'function' && iterable == '[object NodeList]') && + iterable.toArray) { + return iterable.toArray(); + } else { + var results = []; + for (var i = 0, length = iterable.length; i < length; i++) + results.push(iterable[i]); + return results; + } + } +} + +Object.extend(Array.prototype, Enumerable); + +if (!Array.prototype._reverse) + Array.prototype._reverse = Array.prototype.reverse; + +Object.extend(Array.prototype, { + _each: function(iterator) { + for (var i = 0, length = this.length; i < length; i++) + iterator(this[i]); + }, + + clear: function() { + this.length = 0; + return this; + }, + + first: function() { + return this[0]; + }, + + last: function() { + return this[this.length - 1]; + }, + + compact: function() { + return this.select(function(value) { + return value != null; + }); + }, + + flatten: function() { + return this.inject([], function(array, value) { + return array.concat(value && value.constructor == Array ? + value.flatten() : [value]); + }); + }, + + without: function() { + var values = $A(arguments); + return this.select(function(value) { + return !values.include(value); + }); + }, + + indexOf: function(object) { + for (var i = 0, length = this.length; i < length; i++) + if (this[i] == object) return i; + return -1; + }, + + reverse: function(inline) { + return (inline !== false ? this : this.toArray())._reverse(); + }, + + reduce: function() { + return this.length > 1 ? this : this[0]; + }, + + uniq: function(sorted) { + return this.inject([], function(array, value, index) { + if (0 == index || (sorted ? array.last() != value : !array.include(value))) + array.push(value); + return array; + }); + }, + + clone: function() { + return [].concat(this); + }, + + size: function() { + return this.length; + }, + + inspect: function() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + }, + + toJSON: function() { + var results = []; + this.each(function(object) { + var value = Object.toJSON(object); + if (value !== undefined) results.push(value); + }); + return '[' + results.join(', ') + ']'; + } +}); + +Array.prototype.toArray = Array.prototype.clone; + +function $w(string) { + string = string.strip(); + return string ? string.split(/\s+/) : []; +} + +if (Prototype.Browser.Opera){ + Array.prototype.concat = function() { + var array = []; + for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); + for (var i = 0, length = arguments.length; i < length; i++) { + if (arguments[i].constructor == Array) { + for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) + array.push(arguments[i][j]); + } else { + array.push(arguments[i]); + } + } + return array; + } +} +var Hash = function(object) { + if (object instanceof Hash) this.merge(object); + else Object.extend(this, object || {}); +}; + +Object.extend(Hash, { + toQueryString: function(obj) { + var parts = []; + parts.add = arguments.callee.addPair; + + this.prototype._each.call(obj, function(pair) { + if (!pair.key) return; + var value = pair.value; + + if (value && typeof value == 'object') { + if (value.constructor == Array) value.each(function(value) { + parts.add(pair.key, value); + }); + return; + } + parts.add(pair.key, value); + }); + + return parts.join('&'); + }, + + toJSON: function(object) { + var results = []; + this.prototype._each.call(object, function(pair) { + var value = Object.toJSON(pair.value); + if (value !== undefined) results.push(pair.key.toJSON() + ': ' + value); + }); + return '{' + results.join(', ') + '}'; + } +}); + +Hash.toQueryString.addPair = function(key, value, prefix) { + key = encodeURIComponent(key); + if (value === undefined) this.push(key); + else this.push(key + '=' + (value == null ? '' : encodeURIComponent(value))); +} + +Object.extend(Hash.prototype, Enumerable); +Object.extend(Hash.prototype, { + _each: function(iterator) { + for (var key in this) { + var value = this[key]; + if (value && value == Hash.prototype[key]) continue; + + var pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + }, + + keys: function() { + return this.pluck('key'); + }, + + values: function() { + return this.pluck('value'); + }, + + merge: function(hash) { + return $H(hash).inject(this, function(mergedHash, pair) { + mergedHash[pair.key] = pair.value; + return mergedHash; + }); + }, + + remove: function() { + var result; + for(var i = 0, length = arguments.length; i < length; i++) { + var value = this[arguments[i]]; + if (value !== undefined){ + if (result === undefined) result = value; + else { + if (result.constructor != Array) result = [result]; + result.push(value) + } + } + delete this[arguments[i]]; + } + return result; + }, + + toQueryString: function() { + return Hash.toQueryString(this); + }, + + inspect: function() { + return '#'; + }, + + toJSON: function() { + return Hash.toJSON(this); + } +}); + +function $H(object) { + if (object instanceof Hash) return object; + return new Hash(object); +}; + +// Safari iterates over shadowed properties +if (function() { + var i = 0, Test = function(value) { this.key = value }; + Test.prototype.key = 'foo'; + for (var property in new Test('bar')) i++; + return i > 1; +}()) Hash.prototype._each = function(iterator) { + var cache = []; + for (var key in this) { + var value = this[key]; + if ((value && value == Hash.prototype[key]) || cache.include(key)) continue; + cache.push(key); + var pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } +}; +ObjectRange = Class.create(); +Object.extend(ObjectRange.prototype, Enumerable); +Object.extend(ObjectRange.prototype, { + initialize: function(start, end, exclusive) { + this.start = start; + this.end = end; + this.exclusive = exclusive; + }, + + _each: function(iterator) { + var value = this.start; + while (this.include(value)) { + iterator(value); + value = value.succ(); + } + }, + + include: function(value) { + if (value < this.start) + return false; + if (this.exclusive) + return value < this.end; + return value <= this.end; + } +}); + +var $R = function(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +} + +var Ajax = { + getTransport: function() { + return Try.these( + function() {return new XMLHttpRequest()}, + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')} + ) || false; + }, + + activeRequestCount: 0 +} + +Ajax.Responders = { + responders: [], + + _each: function(iterator) { + this.responders._each(iterator); + }, + + register: function(responder) { + if (!this.include(responder)) + this.responders.push(responder); + }, + + unregister: function(responder) { + this.responders = this.responders.without(responder); + }, + + dispatch: function(callback, request, transport, json) { + this.each(function(responder) { + if (typeof responder[callback] == 'function') { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) {} + } + }); + } +}; + +Object.extend(Ajax.Responders, Enumerable); + +Ajax.Responders.register({ + onCreate: function() { + Ajax.activeRequestCount++; + }, + onComplete: function() { + Ajax.activeRequestCount--; + } +}); + +Ajax.Base = function() {}; +Ajax.Base.prototype = { + setOptions: function(options) { + this.options = { + method: 'post', + asynchronous: true, + contentType: 'application/x-www-form-urlencoded', + encoding: 'UTF-8', + parameters: '' + } + Object.extend(this.options, options || {}); + + this.options.method = this.options.method.toLowerCase(); + if (typeof this.options.parameters == 'string') + this.options.parameters = this.options.parameters.toQueryParams(); + } +} + +Ajax.Request = Class.create(); +Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + +Ajax.Request.prototype = Object.extend(new Ajax.Base(), { + _complete: false, + + initialize: function(url, options) { + this.transport = Ajax.getTransport(); + this.setOptions(options); + this.request(url); + }, + + request: function(url) { + this.url = url; + this.method = this.options.method; + var params = Object.clone(this.options.parameters); + + if (!['get', 'post'].include(this.method)) { + // simulate other verbs over post + params['_method'] = this.method; + this.method = 'post'; + } + + this.parameters = params; + + if (params = Hash.toQueryString(params)) { + // when GET, append parameters to URL + if (this.method == 'get') + this.url += (this.url.include('?') ? '&' : '?') + params; + else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) + params += '&_='; + } + + try { + if (this.options.onCreate) this.options.onCreate(this.transport); + Ajax.Responders.dispatch('onCreate', this, this.transport); + + this.transport.open(this.method.toUpperCase(), this.url, + this.options.asynchronous); + + if (this.options.asynchronous) + setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10); + + this.transport.onreadystatechange = this.onStateChange.bind(this); + this.setRequestHeaders(); + + this.body = this.method == 'post' ? (this.options.postBody || params) : null; + this.transport.send(this.body); + + /* Force Firefox to handle ready state 4 for synchronous requests */ + if (!this.options.asynchronous && this.transport.overrideMimeType) + this.onStateChange(); + + } + catch (e) { + this.dispatchException(e); + } + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState > 1 && !((readyState == 4) && this._complete)) + this.respondToReadyState(this.transport.readyState); + }, + + setRequestHeaders: function() { + var headers = { + 'X-Requested-With': 'XMLHttpRequest', + 'X-Prototype-Version': Prototype.Version, + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }; + + if (this.method == 'post') { + headers['Content-type'] = this.options.contentType + + (this.options.encoding ? '; charset=' + this.options.encoding : ''); + + /* Force "Connection: close" for older Mozilla browsers to work + * around a bug where XMLHttpRequest sends an incorrect + * Content-length header. See Mozilla Bugzilla #246651. + */ + if (this.transport.overrideMimeType && + (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) + headers['Connection'] = 'close'; + } + + // user-defined headers + if (typeof this.options.requestHeaders == 'object') { + var extras = this.options.requestHeaders; + + if (typeof extras.push == 'function') + for (var i = 0, length = extras.length; i < length; i += 2) + headers[extras[i]] = extras[i+1]; + else + $H(extras).each(function(pair) { headers[pair.key] = pair.value }); + } + + for (var name in headers) + this.transport.setRequestHeader(name, headers[name]); + }, + + success: function() { + return !this.transport.status + || (this.transport.status >= 200 && this.transport.status < 300); + }, + + respondToReadyState: function(readyState) { + var state = Ajax.Request.Events[readyState]; + var transport = this.transport, json = this.evalJSON(); + + if (state == 'Complete') { + try { + this._complete = true; + (this.options['on' + this.transport.status] + || this.options['on' + (this.success() ? 'Success' : 'Failure')] + || Prototype.emptyFunction)(transport, json); + } catch (e) { + this.dispatchException(e); + } + + var contentType = this.getHeader('Content-type'); + if (contentType && contentType.strip(). + match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i)) + this.evalResponse(); + } + + try { + (this.options['on' + state] || Prototype.emptyFunction)(transport, json); + Ajax.Responders.dispatch('on' + state, this, transport, json); + } catch (e) { + this.dispatchException(e); + } + + if (state == 'Complete') { + // avoid memory leak in MSIE: clean up + this.transport.onreadystatechange = Prototype.emptyFunction; + } + }, + + getHeader: function(name) { + try { + return this.transport.getResponseHeader(name); + } catch (e) { return null } + }, + + evalJSON: function() { + try { + var json = this.getHeader('X-JSON'); + return json ? json.evalJSON() : null; + } catch (e) { return null } + }, + + evalResponse: function() { + try { + return eval((this.transport.responseText || '').unfilterJSON()); + } catch (e) { + this.dispatchException(e); + } + }, + + dispatchException: function(exception) { + (this.options.onException || Prototype.emptyFunction)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +Ajax.Updater = Class.create(); + +Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { + initialize: function(container, url, options) { + this.container = { + success: (container.success || container), + failure: (container.failure || (container.success ? null : container)) + } + + this.transport = Ajax.getTransport(); + this.setOptions(options); + + var onComplete = this.options.onComplete || Prototype.emptyFunction; + this.options.onComplete = (function(transport, param) { + this.updateContent(); + onComplete(transport, param); + }).bind(this); + + this.request(url); + }, + + updateContent: function() { + var receiver = this.container[this.success() ? 'success' : 'failure']; + var response = this.transport.responseText; + + if (!this.options.evalScripts) response = response.stripScripts(); + + if (receiver = $(receiver)) { + if (this.options.insertion) + new this.options.insertion(receiver, response); + else + receiver.update(response); + } + + if (this.success()) { + if (this.onComplete) + setTimeout(this.onComplete.bind(this), 10); + } + } +}); + +Ajax.PeriodicalUpdater = Class.create(); +Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { + initialize: function(container, url, options) { + this.setOptions(options); + this.onComplete = this.options.onComplete; + + this.frequency = (this.options.frequency || 2); + this.decay = (this.options.decay || 1); + + this.updater = {}; + this.container = container; + this.url = url; + + this.start(); + }, + + start: function() { + this.options.onComplete = this.updateComplete.bind(this); + this.onTimerEvent(); + }, + + stop: function() { + this.updater.options.onComplete = undefined; + clearTimeout(this.timer); + (this.onComplete || Prototype.emptyFunction).apply(this, arguments); + }, + + updateComplete: function(request) { + if (this.options.decay) { + this.decay = (request.responseText == this.lastText ? + this.decay * this.options.decay : 1); + + this.lastText = request.responseText; + } + this.timer = setTimeout(this.onTimerEvent.bind(this), + this.decay * this.frequency * 1000); + }, + + onTimerEvent: function() { + this.updater = new Ajax.Updater(this.container, this.url, this.options); + } +}); +function $(element) { + if (arguments.length > 1) { + for (var i = 0, elements = [], length = arguments.length; i < length; i++) + elements.push($(arguments[i])); + return elements; + } + if (typeof element == 'string') + element = document.getElementById(element); + return Element.extend(element); +} + +if (Prototype.BrowserFeatures.XPath) { + document._getElementsByXPath = function(expression, parentElement) { + var results = []; + var query = document.evaluate(expression, $(parentElement) || document, + null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = 0, length = query.snapshotLength; i < length; i++) + results.push(query.snapshotItem(i)); + return results; + }; + + document.getElementsByClassName = function(className, parentElement) { + var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]"; + return document._getElementsByXPath(q, parentElement); + } + +} else document.getElementsByClassName = function(className, parentElement) { + var children = ($(parentElement) || document.body).getElementsByTagName('*'); + var elements = [], child; + for (var i = 0, length = children.length; i < length; i++) { + child = children[i]; + if (Element.hasClassName(child, className)) + elements.push(Element.extend(child)); + } + return elements; +}; + +/*--------------------------------------------------------------------------*/ + +if (!window.Element) var Element = {}; + +Element.extend = function(element) { + var F = Prototype.BrowserFeatures; + if (!element || !element.tagName || element.nodeType == 3 || + element._extended || F.SpecificElementExtensions || element == window) + return element; + + var methods = {}, tagName = element.tagName, cache = Element.extend.cache, + T = Element.Methods.ByTag; + + // extend methods for all tags (Safari doesn't need this) + if (!F.ElementExtensions) { + Object.extend(methods, Element.Methods), + Object.extend(methods, Element.Methods.Simulated); + } + + // extend methods for specific tags + if (T[tagName]) Object.extend(methods, T[tagName]); + + for (var property in methods) { + var value = methods[property]; + if (typeof value == 'function' && !(property in element)) + element[property] = cache.findOrStore(value); + } + + element._extended = Prototype.emptyFunction; + return element; +}; + +Element.extend.cache = { + findOrStore: function(value) { + return this[value] = this[value] || function() { + return value.apply(null, [this].concat($A(arguments))); + } + } +}; + +Element.Methods = { + visible: function(element) { + return $(element).style.display != 'none'; + }, + + toggle: function(element) { + element = $(element); + Element[Element.visible(element) ? 'hide' : 'show'](element); + return element; + }, + + hide: function(element) { + $(element).style.display = 'none'; + return element; + }, + + show: function(element) { + $(element).style.display = ''; + return element; + }, + + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + return element; + }, + + update: function(element, html) { + html = typeof html == 'undefined' ? '' : html.toString(); + $(element).innerHTML = html.stripScripts(); + setTimeout(function() {html.evalScripts()}, 10); + return element; + }, + + replace: function(element, html) { + element = $(element); + html = typeof html == 'undefined' ? '' : html.toString(); + if (element.outerHTML) { + element.outerHTML = html.stripScripts(); + } else { + var range = element.ownerDocument.createRange(); + range.selectNodeContents(element); + element.parentNode.replaceChild( + range.createContextualFragment(html.stripScripts()), element); + } + setTimeout(function() {html.evalScripts()}, 10); + return element; + }, + + inspect: function(element) { + element = $(element); + var result = '<' + element.tagName.toLowerCase(); + $H({'id': 'id', 'className': 'class'}).each(function(pair) { + var property = pair.first(), attribute = pair.last(); + var value = (element[property] || '').toString(); + if (value) result += ' ' + attribute + '=' + value.inspect(true); + }); + return result + '>'; + }, + + recursivelyCollect: function(element, property) { + element = $(element); + var elements = []; + while (element = element[property]) + if (element.nodeType == 1) + elements.push(Element.extend(element)); + return elements; + }, + + ancestors: function(element) { + return $(element).recursivelyCollect('parentNode'); + }, + + descendants: function(element) { + return $A($(element).getElementsByTagName('*')).each(Element.extend); + }, + + firstDescendant: function(element) { + element = $(element).firstChild; + while (element && element.nodeType != 1) element = element.nextSibling; + return $(element); + }, + + immediateDescendants: function(element) { + if (!(element = $(element).firstChild)) return []; + while (element && element.nodeType != 1) element = element.nextSibling; + if (element) return [element].concat($(element).nextSiblings()); + return []; + }, + + previousSiblings: function(element) { + return $(element).recursivelyCollect('previousSibling'); + }, + + nextSiblings: function(element) { + return $(element).recursivelyCollect('nextSibling'); + }, + + siblings: function(element) { + element = $(element); + return element.previousSiblings().reverse().concat(element.nextSiblings()); + }, + + match: function(element, selector) { + if (typeof selector == 'string') + selector = new Selector(selector); + return selector.match($(element)); + }, + + up: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(element.parentNode); + var ancestors = element.ancestors(); + return expression ? Selector.findElement(ancestors, expression, index) : + ancestors[index || 0]; + }, + + down: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return element.firstDescendant(); + var descendants = element.descendants(); + return expression ? Selector.findElement(descendants, expression, index) : + descendants[index || 0]; + }, + + previous: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); + var previousSiblings = element.previousSiblings(); + return expression ? Selector.findElement(previousSiblings, expression, index) : + previousSiblings[index || 0]; + }, + + next: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); + var nextSiblings = element.nextSiblings(); + return expression ? Selector.findElement(nextSiblings, expression, index) : + nextSiblings[index || 0]; + }, + + getElementsBySelector: function() { + var args = $A(arguments), element = $(args.shift()); + return Selector.findChildElements(element, args); + }, + + getElementsByClassName: function(element, className) { + return document.getElementsByClassName(className, element); + }, + + readAttribute: function(element, name) { + element = $(element); + if (Prototype.Browser.IE) { + if (!element.attributes) return null; + var t = Element._attributeTranslations; + if (t.values[name]) return t.values[name](element, name); + if (t.names[name]) name = t.names[name]; + var attribute = element.attributes[name]; + return attribute ? attribute.nodeValue : null; + } + return element.getAttribute(name); + }, + + getHeight: function(element) { + return $(element).getDimensions().height; + }, + + getWidth: function(element) { + return $(element).getDimensions().width; + }, + + classNames: function(element) { + return new Element.ClassNames(element); + }, + + hasClassName: function(element, className) { + if (!(element = $(element))) return; + var elementClassName = element.className; + if (elementClassName.length == 0) return false; + if (elementClassName == className || + elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) + return true; + return false; + }, + + addClassName: function(element, className) { + if (!(element = $(element))) return; + Element.classNames(element).add(className); + return element; + }, + + removeClassName: function(element, className) { + if (!(element = $(element))) return; + Element.classNames(element).remove(className); + return element; + }, + + toggleClassName: function(element, className) { + if (!(element = $(element))) return; + Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className); + return element; + }, + + observe: function() { + Event.observe.apply(Event, arguments); + return $A(arguments).first(); + }, + + stopObserving: function() { + Event.stopObserving.apply(Event, arguments); + return $A(arguments).first(); + }, + + // removes whitespace-only text node children + cleanWhitespace: function(element) { + element = $(element); + var node = element.firstChild; + while (node) { + var nextNode = node.nextSibling; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) + element.removeChild(node); + node = nextNode; + } + return element; + }, + + empty: function(element) { + return $(element).innerHTML.blank(); + }, + + descendantOf: function(element, ancestor) { + element = $(element), ancestor = $(ancestor); + while (element = element.parentNode) + if (element == ancestor) return true; + return false; + }, + + scrollTo: function(element) { + element = $(element); + var pos = Position.cumulativeOffset(element); + window.scrollTo(pos[0], pos[1]); + return element; + }, + + getStyle: function(element, style) { + element = $(element); + style = style == 'float' ? 'cssFloat' : style.camelize(); + var value = element.style[style]; + if (!value) { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css[style] : null; + } + if (style == 'opacity') return value ? parseFloat(value) : 1.0; + return value == 'auto' ? null : value; + }, + + getOpacity: function(element) { + return $(element).getStyle('opacity'); + }, + + setStyle: function(element, styles, camelized) { + element = $(element); + var elementStyle = element.style; + + for (var property in styles) + if (property == 'opacity') element.setOpacity(styles[property]) + else + elementStyle[(property == 'float' || property == 'cssFloat') ? + (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') : + (camelized ? property : property.camelize())] = styles[property]; + + return element; + }, + + setOpacity: function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + return element; + }, + + getDimensions: function(element) { + element = $(element); + var display = $(element).getStyle('display'); + if (display != 'none' && display != null) // Safari bug + return {width: element.offsetWidth, height: element.offsetHeight}; + + // All *Width and *Height properties give 0 on elements with display none, + // so enable the element temporarily + var els = element.style; + var originalVisibility = els.visibility; + var originalPosition = els.position; + var originalDisplay = els.display; + els.visibility = 'hidden'; + els.position = 'absolute'; + els.display = 'block'; + var originalWidth = element.clientWidth; + var originalHeight = element.clientHeight; + els.display = originalDisplay; + els.position = originalPosition; + els.visibility = originalVisibility; + return {width: originalWidth, height: originalHeight}; + }, + + makePositioned: function(element) { + element = $(element); + var pos = Element.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + element._madePositioned = true; + element.style.position = 'relative'; + // Opera returns the offset relative to the positioning context, when an + // element is position relative but top and left have not been defined + if (window.opera) { + element.style.top = 0; + element.style.left = 0; + } + } + return element; + }, + + undoPositioned: function(element) { + element = $(element); + if (element._madePositioned) { + element._madePositioned = undefined; + element.style.position = + element.style.top = + element.style.left = + element.style.bottom = + element.style.right = ''; + } + return element; + }, + + makeClipping: function(element) { + element = $(element); + if (element._overflow) return element; + element._overflow = element.style.overflow || 'auto'; + if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') + element.style.overflow = 'hidden'; + return element; + }, + + undoClipping: function(element) { + element = $(element); + if (!element._overflow) return element; + element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; + element._overflow = null; + return element; + } +}; + +Object.extend(Element.Methods, { + childOf: Element.Methods.descendantOf, + childElements: Element.Methods.immediateDescendants +}); + +if (Prototype.Browser.Opera) { + Element.Methods._getStyle = Element.Methods.getStyle; + Element.Methods.getStyle = function(element, style) { + switch(style) { + case 'left': + case 'top': + case 'right': + case 'bottom': + if (Element._getStyle(element, 'position') == 'static') return null; + default: return Element._getStyle(element, style); + } + }; +} +else if (Prototype.Browser.IE) { + Element.Methods.getStyle = function(element, style) { + element = $(element); + style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); + var value = element.style[style]; + if (!value && element.currentStyle) value = element.currentStyle[style]; + + if (style == 'opacity') { + if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) + if (value[1]) return parseFloat(value[1]) / 100; + return 1.0; + } + + if (value == 'auto') { + if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) + return element['offset'+style.capitalize()] + 'px'; + return null; + } + return value; + }; + + Element.Methods.setOpacity = function(element, value) { + element = $(element); + var filter = element.getStyle('filter'), style = element.style; + if (value == 1 || value === '') { + style.filter = filter.replace(/alpha\([^\)]*\)/gi,''); + return element; + } else if (value < 0.00001) value = 0; + style.filter = filter.replace(/alpha\([^\)]*\)/gi, '') + + 'alpha(opacity=' + (value * 100) + ')'; + return element; + }; + + // IE is missing .innerHTML support for TABLE-related elements + Element.Methods.update = function(element, html) { + element = $(element); + html = typeof html == 'undefined' ? '' : html.toString(); + var tagName = element.tagName.toUpperCase(); + if (['THEAD','TBODY','TR','TD'].include(tagName)) { + var div = document.createElement('div'); + switch (tagName) { + case 'THEAD': + case 'TBODY': + div.innerHTML = '' + html.stripScripts() + '
    '; + depth = 2; + break; + case 'TR': + div.innerHTML = '' + html.stripScripts() + '
    '; + depth = 3; + break; + case 'TD': + div.innerHTML = '
    ' + html.stripScripts() + '
    '; + depth = 4; + } + $A(element.childNodes).each(function(node) { element.removeChild(node) }); + depth.times(function() { div = div.firstChild }); + $A(div.childNodes).each(function(node) { element.appendChild(node) }); + } else { + element.innerHTML = html.stripScripts(); + } + setTimeout(function() { html.evalScripts() }, 10); + return element; + } +} +else if (Prototype.Browser.Gecko) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1) ? 0.999999 : + (value === '') ? '' : (value < 0.00001) ? 0 : value; + return element; + }; +} + +Element._attributeTranslations = { + names: { + colspan: "colSpan", + rowspan: "rowSpan", + valign: "vAlign", + datetime: "dateTime", + accesskey: "accessKey", + tabindex: "tabIndex", + enctype: "encType", + maxlength: "maxLength", + readonly: "readOnly", + longdesc: "longDesc" + }, + values: { + _getAttr: function(element, attribute) { + return element.getAttribute(attribute, 2); + }, + _flag: function(element, attribute) { + return $(element).hasAttribute(attribute) ? attribute : null; + }, + style: function(element) { + return element.style.cssText.toLowerCase(); + }, + title: function(element) { + var node = element.getAttributeNode('title'); + return node.specified ? node.nodeValue : null; + } + } +}; + +(function() { + Object.extend(this, { + href: this._getAttr, + src: this._getAttr, + type: this._getAttr, + disabled: this._flag, + checked: this._flag, + readonly: this._flag, + multiple: this._flag + }); +}).call(Element._attributeTranslations.values); + +Element.Methods.Simulated = { + hasAttribute: function(element, attribute) { + var t = Element._attributeTranslations, node; + attribute = t.names[attribute] || attribute; + node = $(element).getAttributeNode(attribute); + return node && node.specified; + } +}; + +Element.Methods.ByTag = {}; + +Object.extend(Element, Element.Methods); + +if (!Prototype.BrowserFeatures.ElementExtensions && + document.createElement('div').__proto__) { + window.HTMLElement = {}; + window.HTMLElement.prototype = document.createElement('div').__proto__; + Prototype.BrowserFeatures.ElementExtensions = true; +} + +Element.hasAttribute = function(element, attribute) { + if (element.hasAttribute) return element.hasAttribute(attribute); + return Element.Methods.Simulated.hasAttribute(element, attribute); +}; + +Element.addMethods = function(methods) { + var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; + + if (!methods) { + Object.extend(Form, Form.Methods); + Object.extend(Form.Element, Form.Element.Methods); + Object.extend(Element.Methods.ByTag, { + "FORM": Object.clone(Form.Methods), + "INPUT": Object.clone(Form.Element.Methods), + "SELECT": Object.clone(Form.Element.Methods), + "TEXTAREA": Object.clone(Form.Element.Methods) + }); + } + + if (arguments.length == 2) { + var tagName = methods; + methods = arguments[1]; + } + + if (!tagName) Object.extend(Element.Methods, methods || {}); + else { + if (tagName.constructor == Array) tagName.each(extend); + else extend(tagName); + } + + function extend(tagName) { + tagName = tagName.toUpperCase(); + if (!Element.Methods.ByTag[tagName]) + Element.Methods.ByTag[tagName] = {}; + Object.extend(Element.Methods.ByTag[tagName], methods); + } + + function copy(methods, destination, onlyIfAbsent) { + onlyIfAbsent = onlyIfAbsent || false; + var cache = Element.extend.cache; + for (var property in methods) { + var value = methods[property]; + if (!onlyIfAbsent || !(property in destination)) + destination[property] = cache.findOrStore(value); + } + } + + function findDOMClass(tagName) { + var klass; + var trans = { + "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", + "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", + "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", + "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", + "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": + "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": + "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": + "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": + "FrameSet", "IFRAME": "IFrame" + }; + if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName.capitalize() + 'Element'; + if (window[klass]) return window[klass]; + + window[klass] = {}; + window[klass].prototype = document.createElement(tagName).__proto__; + return window[klass]; + } + + if (F.ElementExtensions) { + copy(Element.Methods, HTMLElement.prototype); + copy(Element.Methods.Simulated, HTMLElement.prototype, true); + } + + if (F.SpecificElementExtensions) { + for (var tag in Element.Methods.ByTag) { + var klass = findDOMClass(tag); + if (typeof klass == "undefined") continue; + copy(T[tag], klass.prototype); + } + } + + Object.extend(Element, Element.Methods); + delete Element.ByTag; +}; + +var Toggle = { display: Element.toggle }; + +/*--------------------------------------------------------------------------*/ + +Abstract.Insertion = function(adjacency) { + this.adjacency = adjacency; +} + +Abstract.Insertion.prototype = { + initialize: function(element, content) { + this.element = $(element); + this.content = content.stripScripts(); + + if (this.adjacency && this.element.insertAdjacentHTML) { + try { + this.element.insertAdjacentHTML(this.adjacency, this.content); + } catch (e) { + var tagName = this.element.tagName.toUpperCase(); + if (['TBODY', 'TR'].include(tagName)) { + this.insertContent(this.contentFromAnonymousTable()); + } else { + throw e; + } + } + } else { + this.range = this.element.ownerDocument.createRange(); + if (this.initializeRange) this.initializeRange(); + this.insertContent([this.range.createContextualFragment(this.content)]); + } + + setTimeout(function() {content.evalScripts()}, 10); + }, + + contentFromAnonymousTable: function() { + var div = document.createElement('div'); + div.innerHTML = '' + this.content + '
    '; + return $A(div.childNodes[0].childNodes[0].childNodes); + } +} + +var Insertion = new Object(); + +Insertion.Before = Class.create(); +Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { + initializeRange: function() { + this.range.setStartBefore(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.parentNode.insertBefore(fragment, this.element); + }).bind(this)); + } +}); + +Insertion.Top = Class.create(); +Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { + initializeRange: function() { + this.range.selectNodeContents(this.element); + this.range.collapse(true); + }, + + insertContent: function(fragments) { + fragments.reverse(false).each((function(fragment) { + this.element.insertBefore(fragment, this.element.firstChild); + }).bind(this)); + } +}); + +Insertion.Bottom = Class.create(); +Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { + initializeRange: function() { + this.range.selectNodeContents(this.element); + this.range.collapse(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.appendChild(fragment); + }).bind(this)); + } +}); + +Insertion.After = Class.create(); +Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { + initializeRange: function() { + this.range.setStartAfter(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.parentNode.insertBefore(fragment, + this.element.nextSibling); + }).bind(this)); + } +}); + +/*--------------------------------------------------------------------------*/ + +Element.ClassNames = Class.create(); +Element.ClassNames.prototype = { + initialize: function(element) { + this.element = $(element); + }, + + _each: function(iterator) { + this.element.className.split(/\s+/).select(function(name) { + return name.length > 0; + })._each(iterator); + }, + + set: function(className) { + this.element.className = className; + }, + + add: function(classNameToAdd) { + if (this.include(classNameToAdd)) return; + this.set($A(this).concat(classNameToAdd).join(' ')); + }, + + remove: function(classNameToRemove) { + if (!this.include(classNameToRemove)) return; + this.set($A(this).without(classNameToRemove).join(' ')); + }, + + toString: function() { + return $A(this).join(' '); + } +}; + +Object.extend(Element.ClassNames.prototype, Enumerable); +/* Portions of the Selector class are derived from Jack Slocum’s DomQuery, + * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style + * license. Please see http://www.yui-ext.com/ for more information. */ + +var Selector = Class.create(); + +Selector.prototype = { + initialize: function(expression) { + this.expression = expression.strip(); + this.compileMatcher(); + }, + + compileMatcher: function() { + // Selectors with namespaced attributes can't use the XPath version + if (Prototype.BrowserFeatures.XPath && !(/\[[\w-]*?:/).test(this.expression)) + return this.compileXPathMatcher(); + + var e = this.expression, ps = Selector.patterns, h = Selector.handlers, + c = Selector.criteria, le, p, m; + + if (Selector._cache[e]) { + this.matcher = Selector._cache[e]; return; + } + this.matcher = ["this.matcher = function(root) {", + "var r = root, h = Selector.handlers, c = false, n;"]; + + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + p = ps[i]; + if (m = e.match(p)) { + this.matcher.push(typeof c[i] == 'function' ? c[i](m) : + new Template(c[i]).evaluate(m)); + e = e.replace(m[0], ''); + break; + } + } + } + + this.matcher.push("return h.unique(n);\n}"); + eval(this.matcher.join('\n')); + Selector._cache[this.expression] = this.matcher; + }, + + compileXPathMatcher: function() { + var e = this.expression, ps = Selector.patterns, + x = Selector.xpath, le, m; + + if (Selector._cache[e]) { + this.xpath = Selector._cache[e]; return; + } + + this.matcher = ['.//*']; + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + if (m = e.match(ps[i])) { + this.matcher.push(typeof x[i] == 'function' ? x[i](m) : + new Template(x[i]).evaluate(m)); + e = e.replace(m[0], ''); + break; + } + } + } + + this.xpath = this.matcher.join(''); + Selector._cache[this.expression] = this.xpath; + }, + + findElements: function(root) { + root = root || document; + if (this.xpath) return document._getElementsByXPath(this.xpath, root); + return this.matcher(root); + }, + + match: function(element) { + return this.findElements(document).include(element); + }, + + toString: function() { + return this.expression; + }, + + inspect: function() { + return "#"; + } +}; + +Object.extend(Selector, { + _cache: {}, + + xpath: { + descendant: "//*", + child: "/*", + adjacent: "/following-sibling::*[1]", + laterSibling: '/following-sibling::*', + tagName: function(m) { + if (m[1] == '*') return ''; + return "[local-name()='" + m[1].toLowerCase() + + "' or local-name()='" + m[1].toUpperCase() + "']"; + }, + className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", + id: "[@id='#{1}']", + attrPresence: "[@#{1}]", + attr: function(m) { + m[3] = m[5] || m[6]; + return new Template(Selector.xpath.operators[m[2]]).evaluate(m); + }, + pseudo: function(m) { + var h = Selector.xpath.pseudos[m[1]]; + if (!h) return ''; + if (typeof h === 'function') return h(m); + return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); + }, + operators: { + '=': "[@#{1}='#{3}']", + '!=': "[@#{1}!='#{3}']", + '^=': "[starts-with(@#{1}, '#{3}')]", + '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", + '*=': "[contains(@#{1}, '#{3}')]", + '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", + '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" + }, + pseudos: { + 'first-child': '[not(preceding-sibling::*)]', + 'last-child': '[not(following-sibling::*)]', + 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', + 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]", + 'checked': "[@checked]", + 'disabled': "[@disabled]", + 'enabled': "[not(@disabled)]", + 'not': function(m) { + var e = m[6], p = Selector.patterns, + x = Selector.xpath, le, m, v; + + var exclusion = []; + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in p) { + if (m = e.match(p[i])) { + v = typeof x[i] == 'function' ? x[i](m) : new Template(x[i]).evaluate(m); + exclusion.push("(" + v.substring(1, v.length - 1) + ")"); + e = e.replace(m[0], ''); + break; + } + } + } + return "[not(" + exclusion.join(" and ") + ")]"; + }, + 'nth-child': function(m) { + return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); + }, + 'nth-last-child': function(m) { + return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); + }, + 'nth-of-type': function(m) { + return Selector.xpath.pseudos.nth("position() ", m); + }, + 'nth-last-of-type': function(m) { + return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); + }, + 'first-of-type': function(m) { + m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); + }, + 'last-of-type': function(m) { + m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); + }, + 'only-of-type': function(m) { + var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); + }, + nth: function(fragment, m) { + var mm, formula = m[6], predicate; + if (formula == 'even') formula = '2n+0'; + if (formula == 'odd') formula = '2n+1'; + if (mm = formula.match(/^(\d+)$/)) // digit only + return '[' + fragment + "= " + mm[1] + ']'; + if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b + if (mm[1] == "-") mm[1] = -1; + var a = mm[1] ? Number(mm[1]) : 1; + var b = mm[2] ? Number(mm[2]) : 0; + predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + + "((#{fragment} - #{b}) div #{a} >= 0)]"; + return new Template(predicate).evaluate({ + fragment: fragment, a: a, b: b }); + } + } + } + }, + + criteria: { + tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', + className: 'n = h.className(n, r, "#{1}", c); c = false;', + id: 'n = h.id(n, r, "#{1}", c); c = false;', + attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;', + attr: function(m) { + m[3] = (m[5] || m[6]); + return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m); + }, + pseudo: function(m) { + if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); + return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); + }, + descendant: 'c = "descendant";', + child: 'c = "child";', + adjacent: 'c = "adjacent";', + laterSibling: 'c = "laterSibling";' + }, + + patterns: { + // combinators must be listed first + // (and descendant needs to be last combinator) + laterSibling: /^\s*~\s*/, + child: /^\s*>\s*/, + adjacent: /^\s*\+\s*/, + descendant: /^\s/, + + // selectors follow + tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, + id: /^#([\w\-\*]+)(\b|$)/, + className: /^\.([\w\-\*]+)(\b|$)/, + pseudo: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|\s|(?=:))/, + attrPresence: /^\[([\w]+)\]/, + attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\]]*?)\4|([^'"][^\]]*?)))?\]/ + }, + + handlers: { + // UTILITY FUNCTIONS + // joins two collections + concat: function(a, b) { + for (var i = 0, node; node = b[i]; i++) + a.push(node); + return a; + }, + + // marks an array of nodes for counting + mark: function(nodes) { + for (var i = 0, node; node = nodes[i]; i++) + node._counted = true; + return nodes; + }, + + unmark: function(nodes) { + for (var i = 0, node; node = nodes[i]; i++) + node._counted = undefined; + return nodes; + }, + + // mark each child node with its position (for nth calls) + // "ofType" flag indicates whether we're indexing for nth-of-type + // rather than nth-child + index: function(parentNode, reverse, ofType) { + parentNode._counted = true; + if (reverse) { + for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { + node = nodes[i]; + if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; + } + } else { + for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) + if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; + } + }, + + // filters out duplicates and extends all nodes + unique: function(nodes) { + if (nodes.length == 0) return nodes; + var results = [], n; + for (var i = 0, l = nodes.length; i < l; i++) + if (!(n = nodes[i])._counted) { + n._counted = true; + results.push(Element.extend(n)); + } + return Selector.handlers.unmark(results); + }, + + // COMBINATOR FUNCTIONS + descendant: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + h.concat(results, node.getElementsByTagName('*')); + return results; + }, + + child: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) { + for (var j = 0, children = [], child; child = node.childNodes[j]; j++) + if (child.nodeType == 1 && child.tagName != '!') results.push(child); + } + return results; + }, + + adjacent: function(nodes) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + var next = this.nextElementSibling(node); + if (next) results.push(next); + } + return results; + }, + + laterSibling: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + h.concat(results, Element.nextSiblings(node)); + return results; + }, + + nextElementSibling: function(node) { + while (node = node.nextSibling) + if (node.nodeType == 1) return node; + return null; + }, + + previousElementSibling: function(node) { + while (node = node.previousSibling) + if (node.nodeType == 1) return node; + return null; + }, + + // TOKEN FUNCTIONS + tagName: function(nodes, root, tagName, combinator) { + tagName = tagName.toUpperCase(); + var results = [], h = Selector.handlers; + if (nodes) { + if (combinator) { + // fastlane for ordinary descendant combinators + if (combinator == "descendant") { + for (var i = 0, node; node = nodes[i]; i++) + h.concat(results, node.getElementsByTagName(tagName)); + return results; + } else nodes = this[combinator](nodes); + if (tagName == "*") return nodes; + } + for (var i = 0, node; node = nodes[i]; i++) + if (node.tagName.toUpperCase() == tagName) results.push(node); + return results; + } else return root.getElementsByTagName(tagName); + }, + + id: function(nodes, root, id, combinator) { + var targetNode = $(id), h = Selector.handlers; + if (!nodes && root == document) return targetNode ? [targetNode] : []; + if (nodes) { + if (combinator) { + if (combinator == 'child') { + for (var i = 0, node; node = nodes[i]; i++) + if (targetNode.parentNode == node) return [targetNode]; + } else if (combinator == 'descendant') { + for (var i = 0, node; node = nodes[i]; i++) + if (Element.descendantOf(targetNode, node)) return [targetNode]; + } else if (combinator == 'adjacent') { + for (var i = 0, node; node = nodes[i]; i++) + if (Selector.handlers.previousElementSibling(targetNode) == node) + return [targetNode]; + } else nodes = h[combinator](nodes); + } + for (var i = 0, node; node = nodes[i]; i++) + if (node == targetNode) return [targetNode]; + return []; + } + return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; + }, + + className: function(nodes, root, className, combinator) { + if (nodes && combinator) nodes = this[combinator](nodes); + return Selector.handlers.byClassName(nodes, root, className); + }, + + byClassName: function(nodes, root, className) { + if (!nodes) nodes = Selector.handlers.descendant([root]); + var needle = ' ' + className + ' '; + for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { + nodeClassName = node.className; + if (nodeClassName.length == 0) continue; + if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) + results.push(node); + } + return results; + }, + + attrPresence: function(nodes, root, attr) { + var results = []; + for (var i = 0, node; node = nodes[i]; i++) + if (Element.hasAttribute(node, attr)) results.push(node); + return results; + }, + + attr: function(nodes, root, attr, value, operator) { + if (!nodes) nodes = root.getElementsByTagName("*"); + var handler = Selector.operators[operator], results = []; + for (var i = 0, node; node = nodes[i]; i++) { + var nodeValue = Element.readAttribute(node, attr); + if (nodeValue === null) continue; + if (handler(nodeValue, value)) results.push(node); + } + return results; + }, + + pseudo: function(nodes, name, value, root, combinator) { + if (nodes && combinator) nodes = this[combinator](nodes); + if (!nodes) nodes = root.getElementsByTagName("*"); + return Selector.pseudos[name](nodes, value, root); + } + }, + + pseudos: { + 'first-child': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + if (Selector.handlers.previousElementSibling(node)) continue; + results.push(node); + } + return results; + }, + 'last-child': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + if (Selector.handlers.nextElementSibling(node)) continue; + results.push(node); + } + return results; + }, + 'only-child': function(nodes, value, root) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) + results.push(node); + return results; + }, + 'nth-child': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root); + }, + 'nth-last-child': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, true); + }, + 'nth-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, false, true); + }, + 'nth-last-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, true, true); + }, + 'first-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, "1", root, false, true); + }, + 'last-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, "1", root, true, true); + }, + 'only-of-type': function(nodes, formula, root) { + var p = Selector.pseudos; + return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); + }, + + // handles the an+b logic + getIndices: function(a, b, total) { + if (a == 0) return b > 0 ? [b] : []; + return $R(1, total).inject([], function(memo, i) { + if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); + return memo; + }); + }, + + // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type + nth: function(nodes, formula, root, reverse, ofType) { + if (nodes.length == 0) return []; + if (formula == 'even') formula = '2n+0'; + if (formula == 'odd') formula = '2n+1'; + var h = Selector.handlers, results = [], indexed = [], m; + h.mark(nodes); + for (var i = 0, node; node = nodes[i]; i++) { + if (!node.parentNode._counted) { + h.index(node.parentNode, reverse, ofType); + indexed.push(node.parentNode); + } + } + if (formula.match(/^\d+$/)) { // just a number + formula = Number(formula); + for (var i = 0, node; node = nodes[i]; i++) + if (node.nodeIndex == formula) results.push(node); + } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b + if (m[1] == "-") m[1] = -1; + var a = m[1] ? Number(m[1]) : 1; + var b = m[2] ? Number(m[2]) : 0; + var indices = Selector.pseudos.getIndices(a, b, nodes.length); + for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { + for (var j = 0; j < l; j++) + if (node.nodeIndex == indices[j]) results.push(node); + } + } + h.unmark(nodes); + h.unmark(indexed); + return results; + }, + + 'empty': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + // IE treats comments as element nodes + if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue; + results.push(node); + } + return results; + }, + + 'not': function(nodes, selector, root) { + var h = Selector.handlers, selectorType, m; + var exclusions = new Selector(selector).findElements(root); + h.mark(exclusions); + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!node._counted) results.push(node); + h.unmark(exclusions); + return results; + }, + + 'enabled': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!node.disabled) results.push(node); + return results; + }, + + 'disabled': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (node.disabled) results.push(node); + return results; + }, + + 'checked': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (node.checked) results.push(node); + return results; + } + }, + + operators: { + '=': function(nv, v) { return nv == v; }, + '!=': function(nv, v) { return nv != v; }, + '^=': function(nv, v) { return nv.startsWith(v); }, + '$=': function(nv, v) { return nv.endsWith(v); }, + '*=': function(nv, v) { return nv.include(v); }, + '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, + '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); } + }, + + matchElements: function(elements, expression) { + var matches = new Selector(expression).findElements(), h = Selector.handlers; + h.mark(matches); + for (var i = 0, results = [], element; element = elements[i]; i++) + if (element._counted) results.push(element); + h.unmark(matches); + return results; + }, + + findElement: function(elements, expression, index) { + if (typeof expression == 'number') { + index = expression; expression = false; + } + return Selector.matchElements(elements, expression || '*')[index || 0]; + }, + + findChildElements: function(element, expressions) { + var exprs = expressions.join(','), expressions = []; + exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { + expressions.push(m[1].strip()); + }); + var results = [], h = Selector.handlers; + for (var i = 0, l = expressions.length, selector; i < l; i++) { + selector = new Selector(expressions[i].strip()); + h.concat(results, selector.findElements(element)); + } + return (l > 1) ? h.unique(results) : results; + } +}); + +function $$() { + return Selector.findChildElements(document, $A(arguments)); +} +var Form = { + reset: function(form) { + $(form).reset(); + return form; + }, + + serializeElements: function(elements, getHash) { + var data = elements.inject({}, function(result, element) { + if (!element.disabled && element.name) { + var key = element.name, value = $(element).getValue(); + if (value != null) { + if (key in result) { + if (result[key].constructor != Array) result[key] = [result[key]]; + result[key].push(value); + } + else result[key] = value; + } + } + return result; + }); + + return getHash ? data : Hash.toQueryString(data); + } +}; + +Form.Methods = { + serialize: function(form, getHash) { + return Form.serializeElements(Form.getElements(form), getHash); + }, + + getElements: function(form) { + return $A($(form).getElementsByTagName('*')).inject([], + function(elements, child) { + if (Form.Element.Serializers[child.tagName.toLowerCase()]) + elements.push(Element.extend(child)); + return elements; + } + ); + }, + + getInputs: function(form, typeName, name) { + form = $(form); + var inputs = form.getElementsByTagName('input'); + + if (!typeName && !name) return $A(inputs).map(Element.extend); + + for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { + var input = inputs[i]; + if ((typeName && input.type != typeName) || (name && input.name != name)) + continue; + matchingInputs.push(Element.extend(input)); + } + + return matchingInputs; + }, + + disable: function(form) { + form = $(form); + Form.getElements(form).invoke('disable'); + return form; + }, + + enable: function(form) { + form = $(form); + Form.getElements(form).invoke('enable'); + return form; + }, + + findFirstElement: function(form) { + return $(form).getElements().find(function(element) { + return element.type != 'hidden' && !element.disabled && + ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); + }); + }, + + focusFirstElement: function(form) { + form = $(form); + form.findFirstElement().activate(); + return form; + }, + + request: function(form, options) { + form = $(form), options = Object.clone(options || {}); + + var params = options.parameters; + options.parameters = form.serialize(true); + + if (params) { + if (typeof params == 'string') params = params.toQueryParams(); + Object.extend(options.parameters, params); + } + + if (form.hasAttribute('method') && !options.method) + options.method = form.method; + + return new Ajax.Request(form.readAttribute('action'), options); + } +} + +/*--------------------------------------------------------------------------*/ + +Form.Element = { + focus: function(element) { + $(element).focus(); + return element; + }, + + select: function(element) { + $(element).select(); + return element; + } +} + +Form.Element.Methods = { + serialize: function(element) { + element = $(element); + if (!element.disabled && element.name) { + var value = element.getValue(); + if (value != undefined) { + var pair = {}; + pair[element.name] = value; + return Hash.toQueryString(pair); + } + } + return ''; + }, + + getValue: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + return Form.Element.Serializers[method](element); + }, + + clear: function(element) { + $(element).value = ''; + return element; + }, + + present: function(element) { + return $(element).value != ''; + }, + + activate: function(element) { + element = $(element); + try { + element.focus(); + if (element.select && (element.tagName.toLowerCase() != 'input' || + !['button', 'reset', 'submit'].include(element.type))) + element.select(); + } catch (e) {} + return element; + }, + + disable: function(element) { + element = $(element); + element.blur(); + element.disabled = true; + return element; + }, + + enable: function(element) { + element = $(element); + element.disabled = false; + return element; + } +} + +/*--------------------------------------------------------------------------*/ + +var Field = Form.Element; +var $F = Form.Element.Methods.getValue; + +/*--------------------------------------------------------------------------*/ + +Form.Element.Serializers = { + input: function(element) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + return Form.Element.Serializers.inputSelector(element); + default: + return Form.Element.Serializers.textarea(element); + } + }, + + inputSelector: function(element) { + return element.checked ? element.value : null; + }, + + textarea: function(element) { + return element.value; + }, + + select: function(element) { + return this[element.type == 'select-one' ? + 'selectOne' : 'selectMany'](element); + }, + + selectOne: function(element) { + var index = element.selectedIndex; + return index >= 0 ? this.optionValue(element.options[index]) : null; + }, + + selectMany: function(element) { + var values, length = element.length; + if (!length) return null; + + for (var i = 0, values = []; i < length; i++) { + var opt = element.options[i]; + if (opt.selected) values.push(this.optionValue(opt)); + } + return values; + }, + + optionValue: function(opt) { + // extend element because hasAttribute may not be native + return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; + } +} + +/*--------------------------------------------------------------------------*/ + +Abstract.TimedObserver = function() {} +Abstract.TimedObserver.prototype = { + initialize: function(element, frequency, callback) { + this.frequency = frequency; + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + this.registerCallback(); + }, + + registerCallback: function() { + setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + onTimerEvent: function() { + var value = this.getValue(); + var changed = ('string' == typeof this.lastValue && 'string' == typeof value + ? this.lastValue != value : String(this.lastValue) != String(value)); + if (changed) { + this.callback(this.element, value); + this.lastValue = value; + } + } +} + +Form.Element.Observer = Class.create(); +Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(); +Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { + getValue: function() { + return Form.serialize(this.element); + } +}); + +/*--------------------------------------------------------------------------*/ + +Abstract.EventObserver = function() {} +Abstract.EventObserver.prototype = { + initialize: function(element, callback) { + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + if (this.element.tagName.toLowerCase() == 'form') + this.registerFormCallbacks(); + else + this.registerCallback(this.element); + }, + + onElementEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + }, + + registerFormCallbacks: function() { + Form.getElements(this.element).each(this.registerCallback.bind(this)); + }, + + registerCallback: function(element) { + if (element.type) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + Event.observe(element, 'click', this.onElementEvent.bind(this)); + break; + default: + Event.observe(element, 'change', this.onElementEvent.bind(this)); + break; + } + } + } +} + +Form.Element.EventObserver = Class.create(); +Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.EventObserver = Class.create(); +Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { + getValue: function() { + return Form.serialize(this.element); + } +}); +if (!window.Event) { + var Event = new Object(); +} + +Object.extend(Event, { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + + element: function(event) { + return $(event.target || event.srcElement); + }, + + isLeftClick: function(event) { + return (((event.which) && (event.which == 1)) || + ((event.button) && (event.button == 1))); + }, + + pointerX: function(event) { + return event.pageX || (event.clientX + + (document.documentElement.scrollLeft || document.body.scrollLeft)); + }, + + pointerY: function(event) { + return event.pageY || (event.clientY + + (document.documentElement.scrollTop || document.body.scrollTop)); + }, + + stop: function(event) { + if (event.preventDefault) { + event.preventDefault(); + event.stopPropagation(); + } else { + event.returnValue = false; + event.cancelBubble = true; + } + }, + + // find the first node with the given tagName, starting from the + // node the event was triggered on; traverses the DOM upwards + findElement: function(event, tagName) { + var element = Event.element(event); + while (element.parentNode && (!element.tagName || + (element.tagName.toUpperCase() != tagName.toUpperCase()))) + element = element.parentNode; + return element; + }, + + observers: false, + + _observeAndCache: function(element, name, observer, useCapture) { + if (!this.observers) this.observers = []; + if (element.addEventListener) { + this.observers.push([element, name, observer, useCapture]); + element.addEventListener(name, observer, useCapture); + } else if (element.attachEvent) { + this.observers.push([element, name, observer, useCapture]); + element.attachEvent('on' + name, observer); + } + }, + + unloadCache: function() { + if (!Event.observers) return; + for (var i = 0, length = Event.observers.length; i < length; i++) { + Event.stopObserving.apply(this, Event.observers[i]); + Event.observers[i][0] = null; + } + Event.observers = false; + }, + + observe: function(element, name, observer, useCapture) { + element = $(element); + useCapture = useCapture || false; + + if (name == 'keypress' && + (Prototype.Browser.WebKit || element.attachEvent)) + name = 'keydown'; + + Event._observeAndCache(element, name, observer, useCapture); + }, + + stopObserving: function(element, name, observer, useCapture) { + element = $(element); + useCapture = useCapture || false; + + if (name == 'keypress' && + (Prototype.Browser.WebKit || element.attachEvent)) + name = 'keydown'; + + if (element.removeEventListener) { + element.removeEventListener(name, observer, useCapture); + } else if (element.detachEvent) { + try { + element.detachEvent('on' + name, observer); + } catch (e) {} + } + } +}); + +/* prevent memory leaks in IE */ +if (Prototype.Browser.IE) + Event.observe(window, 'unload', Event.unloadCache, false); +var Position = { + // set to true if needed, warning: firefox performance problems + // NOT neeeded for page scrolling, only if draggable contained in + // scrollable elements + includeScrollOffsets: false, + + // must be called before calling withinIncludingScrolloffset, every time the + // page is scrolled + prepare: function() { + this.deltaX = window.pageXOffset + || document.documentElement.scrollLeft + || document.body.scrollLeft + || 0; + this.deltaY = window.pageYOffset + || document.documentElement.scrollTop + || document.body.scrollTop + || 0; + }, + + realOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return [valueL, valueT]; + }, + + cumulativeOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return [valueL, valueT]; + }, + + positionedOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if(element.tagName=='BODY') break; + var p = Element.getStyle(element, 'position'); + if (p == 'relative' || p == 'absolute') break; + } + } while (element); + return [valueL, valueT]; + }, + + offsetParent: function(element) { + if (element.offsetParent) return element.offsetParent; + if (element == document.body) return element; + + while ((element = element.parentNode) && element != document.body) + if (Element.getStyle(element, 'position') != 'static') + return element; + + return document.body; + }, + + // caches x/y coordinate pair to use with overlap + within: function(element, x, y) { + if (this.includeScrollOffsets) + return this.withinIncludingScrolloffsets(element, x, y); + this.xcomp = x; + this.ycomp = y; + this.offset = this.cumulativeOffset(element); + + return (y >= this.offset[1] && + y < this.offset[1] + element.offsetHeight && + x >= this.offset[0] && + x < this.offset[0] + element.offsetWidth); + }, + + withinIncludingScrolloffsets: function(element, x, y) { + var offsetcache = this.realOffset(element); + + this.xcomp = x + offsetcache[0] - this.deltaX; + this.ycomp = y + offsetcache[1] - this.deltaY; + this.offset = this.cumulativeOffset(element); + + return (this.ycomp >= this.offset[1] && + this.ycomp < this.offset[1] + element.offsetHeight && + this.xcomp >= this.offset[0] && + this.xcomp < this.offset[0] + element.offsetWidth); + }, + + // within must be called directly before + overlap: function(mode, element) { + if (!mode) return 0; + if (mode == 'vertical') + return ((this.offset[1] + element.offsetHeight) - this.ycomp) / + element.offsetHeight; + if (mode == 'horizontal') + return ((this.offset[0] + element.offsetWidth) - this.xcomp) / + element.offsetWidth; + }, + + page: function(forElement) { + var valueT = 0, valueL = 0; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + // Safari fix + if (element.offsetParent == document.body) + if (Element.getStyle(element,'position')=='absolute') break; + + } while (element = element.offsetParent); + + element = forElement; + do { + if (!window.opera || element.tagName=='BODY') { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while (element = element.parentNode); + + return [valueL, valueT]; + }, + + clone: function(source, target) { + var options = Object.extend({ + setLeft: true, + setTop: true, + setWidth: true, + setHeight: true, + offsetTop: 0, + offsetLeft: 0 + }, arguments[2] || {}) + + // find page position of source + source = $(source); + var p = Position.page(source); + + // find coordinate system to use + target = $(target); + var delta = [0, 0]; + var parent = null; + // delta [0,0] will do fine with position: fixed elements, + // position:absolute needs offsetParent deltas + if (Element.getStyle(target,'position') == 'absolute') { + parent = Position.offsetParent(target); + delta = Position.page(parent); + } + + // correct by body offsets (fixes Safari) + if (parent == document.body) { + delta[0] -= document.body.offsetLeft; + delta[1] -= document.body.offsetTop; + } + + // set position + if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; + if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; + if(options.setWidth) target.style.width = source.offsetWidth + 'px'; + if(options.setHeight) target.style.height = source.offsetHeight + 'px'; + }, + + absolutize: function(element) { + element = $(element); + if (element.style.position == 'absolute') return; + Position.prepare(); + + var offsets = Position.positionedOffset(element); + var top = offsets[1]; + var left = offsets[0]; + var width = element.clientWidth; + var height = element.clientHeight; + + element._originalLeft = left - parseFloat(element.style.left || 0); + element._originalTop = top - parseFloat(element.style.top || 0); + element._originalWidth = element.style.width; + element._originalHeight = element.style.height; + + element.style.position = 'absolute'; + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.width = width + 'px'; + element.style.height = height + 'px'; + }, + + relativize: function(element) { + element = $(element); + if (element.style.position == 'relative') return; + Position.prepare(); + + element.style.position = 'relative'; + var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); + var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); + + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.height = element._originalHeight; + element.style.width = element._originalWidth; + } +} + +// Safari returns margins on body which is incorrect if the child is absolutely +// positioned. For performance reasons, redefine Position.cumulativeOffset for +// KHTML/WebKit only. +if (Prototype.Browser.WebKit) { + Position.cumulativeOffset = function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) + if (Element.getStyle(element, 'position') == 'absolute') break; + + element = element.offsetParent; + } while (element); + + return [valueL, valueT]; + } +} + +Element.addMethods(); \ No newline at end of file diff --git a/thirdparty/jsmin/test/test.php b/thirdparty/jsmin/test/test.php new file mode 100644 index 000000000..eab8f7206 --- /dev/null +++ b/thirdparty/jsmin/test/test.php @@ -0,0 +1,10 @@ + \ No newline at end of file