New file |
0,0 → 1,33799 |
/* |
* Ext JS Library 2.0.2 |
* Copyright(c) 2006-2008, Ext JS, LLC. |
* licensing@extjs.com |
* |
* http://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 (Ext.isArray(o)) { |
for (var i = 0, l = o.length; i < l; i++) { |
b += createHtml(o[i]); |
} |
return 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){ |
b += createHtml(cn); |
} else if(o.html){ |
b += o.html; |
} |
b += "</" + o.tag + ">"; |
} |
return b; |
}; |
|
|
|
var createDom = function(o, parentNode){ |
var el; |
if (Ext.isArray(o)) { |
el = document.createDocumentFragment(); |
for(var i = 0, l = o.length; i < l; i++) { |
createDom(o[i], el); |
} |
} else if (typeof o == "string)") { |
el = document.createTextNode(o); |
} else { |
el = document.createElement(o.tag||'div'); |
var useSet = !!el.setAttribute; |
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){ |
createDom(cn, el); |
} else 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 = '<table>', |
te = '</table>', |
tbs = ts+'<tbody>', |
tbe = '</tbody>'+te, |
trs = tbs + '<tr>', |
tre = '</tr>'+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", "firstChild"); |
}, |
|
|
doInsert : function(el, o, returnElement, pos, sibling){ |
el = Ext.getDom(el); |
var newNode; |
if(this.useDom){ |
newNode = createDom(o, null); |
(sibling === "firstChild" ? el : 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){ |
var a = arguments; |
if(Ext.isArray(html)){ |
html = html.join(""); |
}else if(a.length > 1){ |
var buf = []; |
for(var i = 0, len = a.length; i < len; i++){ |
if(typeof a[i] == 'object'){ |
Ext.apply(this, a[i]); |
}else{ |
buf[buf.length] = a[i]; |
} |
} |
html = buf.join(''); |
} |
|
this.html = html; |
if(this.compiled){ |
this.compile(); |
} |
}; |
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, config){ |
el = Ext.getDom(el); |
return new Ext.Template(el.value || el.innerHTML, config || ''); |
}; |
|
|
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 = Ext.isArray(el); |
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); |
}, |
|
"any" : function(c, selectors){ |
var ss = selectors.split('|'); |
var r = [], ri = -1, s; |
for(var i = 0, ci; ci = c[i]; i++){ |
for(var j = 0; s = ss[j]; j++){ |
if(Ext.DomQuery.is(ci, s)){ |
r[++ri] = ci; |
break; |
} |
} |
} |
return r; |
}, |
|
"odd" : function(c){ |
return this["nth-child"](c, "odd"); |
}, |
|
"even" : function(c){ |
return this["nth-child"](c, "even"); |
}, |
|
"nth" : function(c, a){ |
return c[a-1] || []; |
}, |
|
"first" : function(c){ |
return c[0] || []; |
}, |
|
"last" : function(c){ |
return c[c.length-1] || []; |
}, |
|
"has" : function(c, ss){ |
var s = Ext.DomQuery.select; |
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(){ |
if(this.eventsSuspended !== true){ |
var ce = this.events[arguments[0].toLowerCase()]; |
if(typeof ce == "object"){ |
return ce.fire.apply(ce, Array.prototype.slice.call(arguments, 1)); |
} |
} |
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 = {}; |
} |
if(typeof o == 'string'){ |
for(var i = 0, a = arguments, v; v = a[i]; i++){ |
if(!this.events[a[i]]){ |
o[a[i]] = true; |
} |
} |
}else{ |
Ext.applyIf(this.events, o); |
} |
}, |
|
|
hasListener : function(eventName){ |
var e = this.events[eventName]; |
return typeof e == "object" && e.listeners.length > 0; |
}, |
|
|
suspendEvents : function(){ |
this.eventsSuspended = true; |
}, |
|
|
resumeEvents : function(){ |
this.eventsSuspended = false; |
}, |
|
getMethodEvent : function(method){ |
if(!this.methodEvents){ |
this.methodEvents = {}; |
} |
var e = this.methodEvents[method]; |
if(!e){ |
e = {}; |
this.methodEvents[method] = e; |
|
e.originalFn = this[method]; |
e.methodName = method; |
e.before = []; |
e.after = []; |
|
|
var returnValue, v, cancel; |
var obj = this; |
|
var makeCall = function(fn, scope, args){ |
if((v = fn.apply(scope || obj, args)) !== undefined){ |
if(typeof v === 'object'){ |
if(v.returnValue !== undefined){ |
returnValue = v.returnValue; |
}else{ |
returnValue = v; |
} |
if(v.cancel === true){ |
cancel = true; |
} |
}else if(v === false){ |
cancel = true; |
}else { |
returnValue = v; |
} |
} |
} |
|
this[method] = function(){ |
returnValue = v = undefined; cancel = false; |
var args = Array.prototype.slice.call(arguments, 0); |
for(var i = 0, len = e.before.length; i < len; i++){ |
makeCall(e.before[i].fn, e.before[i].scope, args); |
if(cancel){ |
return returnValue; |
} |
} |
|
if((v = e.originalFn.apply(obj, args)) !== undefined){ |
returnValue = v; |
} |
|
for(var i = 0, len = e.after.length; i < len; i++){ |
makeCall(e.after[i].fn, e.after[i].scope, args); |
if(cancel){ |
return returnValue; |
} |
} |
return returnValue; |
}; |
} |
return e; |
}, |
|
beforeMethod : function(method, fn, scope){ |
var e = this.getMethodEvent(method); |
e.before.push({fn: fn, scope: scope}); |
}, |
|
afterMethod : function(method, fn, scope){ |
var e = this.getMethodEvent(method); |
e.after.push({fn: fn, scope: scope}); |
}, |
|
removeMethodListener : function(method, fn, scope){ |
var e = this.getMethodEvent(method); |
for(var i = 0, len = e.before.length; i < len; i++){ |
if(e.before[i].fn == fn && e.before[i].scope == scope){ |
e.before.splice(i, 1); |
return; |
} |
} |
for(var i = 0, len = e.after.length; i < len; i++){ |
if(e.after[i].fn == fn && e.after[i].scope == scope){ |
e.after.splice(i, 1); |
return; |
} |
} |
} |
}; |
|
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){ |
scope = scope || this.obj; |
if(!this.isListening(fn, scope)){ |
var l = this.createListener(fn, scope, options); |
if(!this.firing){ |
this.listeners.push(l); |
}else{ this.listeners = this.listeners.slice(0); |
this.listeners.push(l); |
} |
} |
}, |
|
createListener : function(fn, scope, o){ |
o = o || {}; |
scope = scope || this.obj; |
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; |
return 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("<s"+'cript id="ie-deferred-loader" defer="defer" src="/'+'/:"></s'+"cript>"); |
var defer = document.getElementById("ie-deferred-loader"); |
defer.onreadystatechange = function(){ |
if(this.readyState == "complete"){ |
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 = { |
|
|
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", this.fireWindowResize, this); |
} |
resizeEvent.addListener(fn, scope, options); |
}, |
|
|
fireWindowResize : function(){ |
if(resizeEvent){ |
if((Ext.isIE||Ext.isAir) && resizeTask){ |
resizeTask.delay(50); |
}else{ |
resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); |
} |
} |
}, |
|
|
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.getBody(); |
if(!bd){ return; } |
|
var cls = [ |
Ext.isIE ? "ext-ie " + (Ext.isIE6 ? 'ext-ie6' : 'ext-ie7') |
: 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.browserEvent.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){ |
var t = Ext.get(this.target); |
return selector ? t.findParent(selector, maxDepth, returnEl) : (returnEl ? t : 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) ? true : false; |
}, |
|
|
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; |
}, |
|
|
scrollIntoView : function(container, hscroll){ |
var c = Ext.getDom(container) || Ext.getBody().dom; |
var el = this.dom; |
|
var o = this.getOffsetsTo(c), |
l = o[0] + c.scrollLeft, |
t = o[1] + c.scrollTop, |
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(el.offsetHeight > ch || t < ct){ |
c.scrollTop = t; |
}else if(b > cb){ |
c.scrollTop = b-ch; |
} |
c.scrollTop = c.scrollTop; |
if(hscroll !== false){ |
if(el.offsetWidth > c.clientWidth || l < cl){ |
c.scrollLeft = l; |
}else if(r > cr){ |
c.scrollLeft = r-c.clientWidth; |
} |
c.scrollLeft = c.scrollLeft; |
} |
return this; |
}, |
|
scrollChildIntoView : function(child, hscroll){ |
Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll); |
}, |
|
|
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(Ext.isArray(className)){ |
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(Ext.isArray(className)){ |
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); |
}, |
|
|
getOffsetsTo : function(el){ |
var o = this.getXY(); |
var e = Ext.fly(el, '_internal').getXY(); |
return [o[0]-e[0],o[1]-e[1]]; |
}, |
|
|
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; |
h = contentHeight !== true ? h : h-this.getBorderWidth("tb")-this.getPadding("tb"); |
return h < 0 ? 0 : h; |
}, |
|
|
getWidth : function(contentWidth){ |
var w = this.dom.offsetWidth || 0; |
w = contentWidth !== true ? w : w-this.getBorderWidth("lr")-this.getPadding("lr"); |
return w < 0 ? 0 : w; |
}, |
|
|
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)}; |
}, |
|
getStyleSize : function(){ |
var w, h, d = this.dom, s = d.style; |
if(s.width && s.width != 'auto'){ |
w = parseInt(s.width, 10); |
if(Ext.isBorderBox){ |
w -= this.getFrameWidth('lr'); |
} |
} |
if(s.height && s.height != 'auto'){ |
h = parseInt(s.height, 10); |
if(Ext.isBorderBox){ |
h -= this.getFrameWidth('tb'); |
} |
} |
return {width: w || this.getWidth(true), height: h || this.getHeight(true)}; |
|
}, |
|
|
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"); |
} |
} |
}, |
|
setOverflow : function(v){ |
if(v=='auto' && Ext.isMac && Ext.isGecko){ this.dom.style.overflow = 'hidden'; |
(function(){this.dom.style.overflow = 'auto';}).defer(1, this); |
}else{ |
this.dom.style.overflow = v; |
} |
}, |
|
|
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); |
if(!el || !el.dom){ |
throw "Element.alignToXY with an element that doesn't exist"; |
} |
var d = this.dom; |
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); |
}, |
|
|
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 += '<span id="' + id + '"></span>'; |
|
E.onAvailable(id, function(){ |
var hd = document.getElementsByTagName("head")[0]; |
var re = /(?:<script([^>]*)?>)((\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){Ext.removeNode(el);} |
if(typeof callback == "function"){ |
callback(); |
} |
}); |
dom.innerHTML = html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, ""); |
return this; |
}, |
|
|
load : function(){ |
var um = this.getUpdater(); |
um.update.apply(um, arguments); |
return this; |
}, |
|
|
getUpdater : function(){ |
if(!this.updateManager){ |
this.updateManager = new Ext.Updater(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 >= 0 ? w : -1 * w); } |
} |
} |
return val; |
}, |
|
|
createProxy : function(config, renderTo, matchBox){ |
config = typeof config == "object" ? |
config : {tag : "div", cls: config}; |
|
var proxy; |
if(renderTo){ |
proxy = Ext.DomHelper.append(renderTo, config, true); |
}else { |
proxy = Ext.DomHelper.insertBefore(this.dom, 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._maskMsg){ |
this._maskMsg.remove(); |
} |
if(this._mask){ |
this._mask.remove(); |
} |
|
this._mask = Ext.DomHelper.append(this.dom, {cls:"ext-el-mask"}, true); |
|
this.addClass("x-masked"); |
this._mask.setDisplayed(true); |
if(typeof msg == 'string'){ |
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.setSize(this.dom.clientWidth, this.getHeight()); |
} |
return this._mask; |
}, |
|
|
unmask : function(){ |
if(this._mask){ |
if(this._maskMsg){ |
this._maskMsg.remove(); |
delete this._maskMsg; |
} |
this._mask.remove(); |
delete this._mask; |
} |
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(){ |
Ext.removeNode(this.dom); |
delete El.cache[this.dom.id]; |
}, |
|
|
hover : function(overFn, outFn, scope){ |
var preOverFn = function(e){ |
if(!e.within(this, true)){ |
overFn.apply(scope || this, arguments); |
} |
}; |
var preOutFn = function(e){ |
if(!e.within(this, true)){ |
outFn.apply(scope || this, arguments); |
} |
}; |
this.on("mouseover", preOverFn, this.dom); |
this.on("mouseout", preOutFn, this.dom); |
return this; |
}, |
|
|
addClassOnOver : function(className, preventFlicker){ |
this.hover( |
function(){ |
Ext.fly(this, '_internal').addClass(className); |
}, |
function(){ |
Ext.fly(this, '_internal').removeClass(className); |
} |
); |
return this; |
}, |
|
|
addClassOnFocus : function(className){ |
this.on("focus", function(){ |
Ext.fly(this, '_internal').addClass(className); |
}, this.dom); |
this.on("blur", function(){ |
Ext.fly(this, '_internal').removeClass(className); |
}, this.dom); |
return this; |
}, |
|
addClassOnClick : function(className){ |
var dom = this.dom; |
this.on("mousedown", function(){ |
Ext.fly(dom, '_internal').addClass(className); |
var d = Ext.getDoc(); |
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(Ext.isArray(eventName)){ |
for(var i = 0, len = eventName.length; i < len; i++){ |
this.on(eventName[i], fn); |
} |
return this; |
} |
this.on(eventName, fn); |
return this; |
}, |
|
|
parent : function(selector, returnDom){ |
return this.matchNode('parentNode', 'parentNode', selector, returnDom); |
}, |
|
|
next : function(selector, returnDom){ |
return this.matchNode('nextSibling', 'nextSibling', selector, returnDom); |
}, |
|
|
prev : function(selector, returnDom){ |
return this.matchNode('previousSibling', 'previousSibling', selector, returnDom); |
}, |
|
|
|
first : function(selector, returnDom){ |
return this.matchNode('nextSibling', 'firstChild', selector, returnDom); |
}, |
|
|
last : function(selector, returnDom){ |
return this.matchNode('previousSibling', 'lastChild', selector, returnDom); |
}, |
|
matchNode : function(dir, start, selector, returnDom){ |
var n = this.dom[start]; |
while(n){ |
if(n.nodeType == 1 && (!selector || Ext.DomQuery.is(n, selector))){ |
return !returnDom ? Ext.get(n) : n; |
} |
n = n[dir]; |
} |
return null; |
}, |
|
|
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 && !el.dom){ 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){ |
var rt; |
if(Ext.isArray(el)){ |
for(var i = 0, len = el.length; i < len; i++){ |
rt = this.insertSibling(el[i], where, returnDom); |
} |
return rt; |
} |
where = where ? where.toLowerCase() : 'before'; |
el = el || {}; |
var refNode = where == 'before' ? this.dom : this.dom.nextSibling; |
|
if(typeof el == 'object' && !el.nodeType && !el.dom){ 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), refNode); |
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; |
}, |
|
|
replaceWith: function(el){ |
if(typeof el == 'object' && !el.nodeType && !el.dom){ el = this.insertSibling(el, 'before'); |
}else{ |
el = Ext.getDom(el); |
this.dom.parentNode.insertBefore(el, this.dom); |
} |
El.uncache(this.id); |
this.dom.parentNode.removeChild(this.dom); |
this.dom = el; |
this.id = Ext.id(el); |
El.cache[this.id] = this; |
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(o.hasOwnProperty(attr)){ |
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" || Ext.isArray(key)){ |
config = { |
key: key, |
fn: fn, |
scope: scope |
}; |
}else{ |
config = { |
key : key.key, |
shift : key.shift, |
ctrl : key.ctrl, |
alt : key.alt, |
fn: fn, |
scope: scope |
}; |
} |
return new Ext.KeyMap(this, config); |
}, |
|
|
addKeyMap : function(config){ |
return new Ext.KeyMap(this, config); |
}, |
|
|
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' || Ext.isArray(x)){ |
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, t; |
if(Ext.isIE && Ext.isStrict){ |
l = doc.documentElement.scrollLeft || (doc.body.scrollLeft || 0); |
t = doc.documentElement.scrollTop || (doc.body.scrollTop || 0); |
}else{ |
l = window.pageXOffset || (doc.body.scrollLeft || 0); |
t = window.pageYOffset || (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]); |
var s = h.toString(16); |
if(h < 16){ |
s = "0" + s; |
} |
color += s; |
} |
} 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('<div class="{0}">'+El.boxMarkup+'</div>', 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]; |
}, |
|
getTextWidth : function(text, min, max){ |
return (Ext.util.TextMetrics.measure(this.dom, Ext.value(text, this.dom.innerHTML, true)).width).constrain(min || 0, max || 1000000); |
} |
}; |
|
var ep = El.prototype; |
|
|
ep.on = ep.addListener; |
ep.mon = ep.addListener; |
|
ep.getUpdateManager = ep.getUpdater; |
|
|
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 = '<div class="{0}-tl"><div class="{0}-tr"><div class="{0}-tc"></div></div></div><div class="{0}-ml"><div class="{0}-mr"><div class="{0}-mc"></div></div></div><div class="{0}-bl"><div class="{0}-br"><div class="{0}-bc"></div></div></div>'; |
|
El.VISIBILITY = 1; |
|
El.DISPLAY = 2; |
|
El.borders = {l: "border-left-width", r: "border-right-width", t: "border-top-width", b: "border-bottom-width"}; |
El.paddings = {l: "padding-left", r: "padding-right", t: "padding-top", b: "padding-bottom"}; |
El.margins = {l: "margin-left", r: "margin-right", t: "margin-top", b: "margin-bottom"}; |
|
|
|
|
El.cache = {}; |
|
var 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(Ext.isArray(el)){ |
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); |
|
var flyFn = function(){}; |
flyFn.prototype = El.prototype; |
var _cls = new flyFn(); |
|
El.Flyweight = function(dom){ |
this.dom = dom; |
}; |
|
El.Flyweight.prototype = _cls; |
El.Flyweight.prototype.isFlyweight = true; |
|
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"; |
var attr = o.attr || "backgroundColor"; |
|
this.clearOpacity(); |
this.show(); |
|
var origColor = this.getColor(attr); |
var restoreColor = this.dom.style[attr]; |
var 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; |
var duration = o.duration || 1; |
this.show(); |
|
var b = this.getBox(); |
var animFn = function(){ |
var proxy = Ext.getBody().createChild({ |
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(); |
}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(Ext.isArray(el)){ |
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 && this.elements[index]){ |
if(removeDom){ |
var d = this.elements[index]; |
if(d.dom){ |
d.remove(); |
}else{ |
Ext.removeNode(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(Ext.isArray(els)){ |
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); |
Ext.removeNode(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", |
|
"requestcomplete", |
|
"requestexception" |
); |
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(p); |
} |
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 : 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 || o.jsonData){ |
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(){Ext.removeNode(frame);}, 100); |
} |
|
Ext.EventManager.on(frame, 'load', cb, this); |
form.submit(); |
|
if(hiddens){ |
for(var i = 0, len = hiddens.length; i < len; i++){ |
Ext.removeNode(hiddens[i]); |
} |
} |
} |
}); |
|
|
Ext.Ajax = new Ext.data.Connection({ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
autoAbort : false, |
|
|
serializeForm : function(form){ |
return Ext.lib.Ajax.serializeForm(form); |
} |
}); |
|
Ext.Updater = function(el, forceNew){ |
el = Ext.get(el); |
if(!forceNew && el.updateManager){ |
return el.updateManager; |
} |
|
this.el = el; |
|
this.defaultUrl = null; |
|
this.addEvents( |
|
"beforeupdate", |
|
"update", |
|
"failure" |
); |
var d = Ext.Updater.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); |
|
if(!this.renderer){ |
|
this.renderer = new Ext.Updater.BasicRenderer(); |
} |
Ext.Updater.superclass.constructor.call(this); |
}; |
|
Ext.extend(Ext.Updater, 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, callerScope; |
if(typeof url == "object"){ |
cfg = url; |
url = cfg.url; |
params = params || cfg.params; |
callback = callback || cfg.callback; |
discardUrl = discardUrl || cfg.discardUrl; |
callerScope = cfg.scope; |
if(typeof cfg.method != "undefined"){method = cfg.method;}; |
if(typeof cfg.nocache != "undefined"){this.disableCaching = cfg.nocache;}; |
if(typeof cfg.text != "undefined"){this.indicatorText = '<div class="loading-indicator">'+cfg.text+"</div>";}; |
if(typeof cfg.scripts != "undefined"){this.loadScripts = cfg.scripts;}; |
if(typeof cfg.timeout != "undefined"){this.timeout = cfg.timeout;}; |
} |
this.showLoading(); |
if(!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: (typeof params == "function" && callerScope) ? params.createDelegate(callerScope) : params, |
success: this.processSuccess, |
failure: this.processFailure, |
scope: this, |
callback: undefined, |
timeout: (this.timeout*1000), |
argument: { |
"options": cfg, |
"url": url, |
"form": null, |
"callback": callback, |
"scope": callerScope || window, |
"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.processSuccess, |
failure: this.processFailure, |
scope: this, |
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.call(response.argument.scope, this.el, true, response, response.argument.options); |
} |
}, |
|
|
processFailure : function(response){ |
this.transaction = null; |
this.fireEvent("failure", this.el, response); |
if(typeof response.argument.callback == "function"){ |
response.argument.callback.call(response.argument.scope, this.el, false, response, response.argument.options); |
} |
}, |
|
|
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.Updater.defaults = { |
|
timeout : 30, |
|
|
loadScripts : false, |
|
|
sslBlankUrl : (Ext.SSL_SECURE_URL || "javascript:false"), |
|
disableCaching : false, |
|
showLoadIndicator : true, |
|
indicatorText : '<div class="loading-indicator">Loading...</div>' |
}; |
|
|
Ext.Updater.updateElement = function(el, url, params, options){ |
var um = Ext.get(el).getUpdater(); |
Ext.apply(um, options); |
um.update(url, params, options ? options.callback : null); |
}; |
|
Ext.Updater.update = Ext.Updater.updateElement; |
|
Ext.Updater.BasicRenderer = function(){}; |
|
Ext.Updater.BasicRenderer.prototype = { |
|
render : function(el, response, updateManager, callback){ |
el.update(response.responseText, updateManager.loadScripts, callback); |
} |
}; |
|
Ext.UpdateManager = Ext.Updater; |
|
|
|
|
|
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.getShortDayName(this.getDay()) + "; case "j": |
return "this.getDate() + "; |
case "l": |
return "Date.dayNames[this.getDay()] + "; |
case "N": |
return "(this.getDay() ? this.getDay() : 7) + "; |
case "S": |
return "this.getSuffix() + "; |
case "w": |
return "this.getDay() + "; |
case "z": |
return "this.getDayOfYear() + "; |
case "W": |
return "String.leftPad(this.getWeekOfYear(), 2, '0') + "; |
case "F": |
return "Date.monthNames[this.getMonth()] + "; |
case "m": |
return "String.leftPad(this.getMonth() + 1, 2, '0') + "; |
case "M": |
return "Date.getShortMonthName(this.getMonth()) + "; case "n": |
return "(this.getMonth() + 1) + "; |
case "t": |
return "this.getDaysInMonth() + "; |
case "L": |
return "(this.isLeapYear() ? 1 : 0) + "; |
case "o": |
return "(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -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 "u": |
return "String.leftPad(this.getMilliseconds(), 3, '0') + "; |
case "O": |
return "this.getGMTOffset() + "; |
case "P": |
return "this.getGMTOffset(true) + "; |
case "T": |
return "this.getTimezone() + "; |
case "Z": |
return "(this.getTimezoneOffset() * -60) + "; |
case "c": |
for (var df = Date.getFormatCode, c = "Y-m-dTH:i:sP", code = "", i = 0, l = c.length; i < l; ++i) { |
var e = c.charAt(i); |
code += e == "T" ? "'T' + " : df(e); } |
return code; |
case "U": |
return "Math.round(this.getTime() / 1000) + "; |
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, ms = -1, o, z, u, v;\n" |
+ "input = String(input);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 (u)\n" |
+ "{v = new Date(u * 1000);}" + "else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0 && ms >= 0)\n" |
+ "{v = new Date(y, m, d, h, i, s, ms);}\n" |
+ "else 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 + "$", "i"); |
eval(code); |
}; |
|
Date.formatCodeToRegex = function(character, currentGroup) { |
|
switch (character) { |
case "d": |
return {g:1, |
c:"d = parseInt(results[" + currentGroup + "], 10);\n", |
s:"(\\d{2})"}; case "D": |
for (var a = [], i = 0; i < 7; a.push(Date.getShortDayName(i)), ++i); return {g:0, |
c:null, |
s:"(?:" + a.join("|") +")"}; |
case "j": |
return {g:1, |
c:"d = parseInt(results[" + currentGroup + "], 10);\n", |
s:"(\\d{1,2})"}; case "l": |
return {g:0, |
c:null, |
s:"(?:" + Date.dayNames.join("|") + ")"}; |
case "N": |
return {g:0, |
c:null, |
s:"[1-7]"}; case "S": |
return {g:0, |
c:null, |
s:"(?:st|nd|rd|th)"}; |
case "w": |
return {g:0, |
c:null, |
s:"[0-6]"}; 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.getMonthNumber(results[" + currentGroup + "]), 10);\n", s:"(" + Date.monthNames.join("|") + ")"}; |
case "m": |
return {g:1, |
c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n", |
s:"(\\d{2})"}; case "M": |
for (var a = [], i = 0; i < 12; a.push(Date.getShortMonthName(i)), ++i); return {g:1, |
c:"m = parseInt(Date.getMonthNumber(results[" + currentGroup + "]), 10);\n", s:"(" + a.join("|") + ")"}; |
case "n": |
return {g:1, |
c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n", |
s:"(\\d{1,2})"}; case "t": |
return {g:0, |
c:null, |
s:"(?:\\d{2})"}; case "L": |
return {g:0, |
c:null, |
s:"(?:1|0)"}; |
case "o": |
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 "u": |
return {g:1, |
c:"ms = parseInt(results[" + currentGroup + "], 10);\n", |
s:"(\\d{3})"}; 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 "P": |
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(4,6) / 60);\n", "var mn = o.substring(4,6) % 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{2}:\\d{2})"}; case "T": |
return {g:0, |
c:null, |
s:"[A-Z]{1,4}"}; case "Z": |
return {g:1, |
c:"z = results[" + currentGroup + "] * 1;\n" + "z = (-43200 <= z && z <= 50400)? z : null;\n", |
s:"([+\-]?\\d{1,5})"}; case "c": |
var df = Date.formatCodeToRegex, calc = []; |
var arr = [df("Y", 1), df("m", 2), df("d", 3), df("h", 4), df("i", 5), df("s", 6), df("P", 7)]; |
for (var i = 0, l = arr.length; i < l; ++i) { |
calc.push(arr[i].c); |
} |
return {g:1, |
c:calc.join(""), |
s:arr[0].s + "-" + arr[1].s + "-" + arr[2].s + "T" + arr[3].s + ":" + arr[4].s + ":" + arr[5].s + arr[6].s}; |
case "U": |
return {g:1, |
c:"u = parseInt(results[" + currentGroup + "], 10);\n", |
s:"(-?\\d+)"}; default: |
return {g:0, |
c:null, |
s:Ext.escapeRe(character)}; |
} |
}; |
|
|
Date.prototype.getTimezone = function() { |
return this.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, ""); |
}; |
|
|
Date.prototype.getGMTOffset = function(colon) { |
return (this.getTimezoneOffset() > 0 ? "-" : "+") |
+ String.leftPad(Math.abs(Math.floor(this.getTimezoneOffset() / 60)), 2, "0") |
+ (colon ? ":" : "") |
+ 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 ms1d = 864e5; var ms7d = 7 * ms1d; var DC3 = Date.UTC(this.getFullYear(), this.getMonth(), this.getDate() + 3) / ms1d; var AWN = Math.floor(DC3 / 7); var Wyr = new Date(AWN * ms7d).getUTCFullYear(); |
return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1; |
}; |
|
|
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.getShortMonthName = function(month) { |
return Date.monthNames[month].substring(0, 3); |
} |
|
|
Date.dayNames = |
["Sunday", |
"Monday", |
"Tuesday", |
"Wednesday", |
"Thursday", |
"Friday", |
"Saturday"]; |
|
|
Date.getShortDayName = function(day) { |
return Date.dayNames[day].substring(0, 3); |
} |
|
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.getMonthNumber = function(name) { |
return Date.monthNumbers[name.substring(0, 1).toUpperCase() + name.substring(1, 3).toLowerCase()]; |
} |
|
|
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; |
}; |
|
|
Date.prototype.between = function(start, end){ |
var t = this.getTime(); |
return start.getTime() <= t && t <= end.getTime(); |
} |
|
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(t){ |
removeQueue.push(t); |
if(t.onStop){ |
t.onStop.apply(t.scope || t); |
} |
}; |
|
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", |
|
"add", |
|
"replace", |
|
"remove", |
"sort" |
); |
this.allowFunctions = allowFunctions === true; |
if(keyFn){ |
this.getKey = keyFn; |
} |
Ext.util.MixedCollection.superclass.constructor.call(this); |
}; |
|
Ext.extend(Ext.util.MixedCollection, Ext.util.Observable, { |
allowFunctions : false, |
|
|
add : function(key, o){ |
if(arguments.length == 1){ |
o = arguments[0]; |
key = this.getKey(o); |
} |
if(typeof key == "undefined" || key === null){ |
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 || Ext.isArray(objs)){ |
var args = arguments.length > 1 ? arguments : objs; |
for(var i = 0, len = args.length; i < len; i++){ |
this.add(args[i]); |
} |
}else{ |
for(var key in objs){ |
if(this.allowFunctions || typeof objs[key] != "function"){ |
this.add(key, objs[key]); |
} |
} |
} |
}, |
|
|
each : function(fn, scope){ |
var items = [].concat(this.items); |
for(var i = 0, len = items.length; i < len; i++){ |
if(fn.call(scope || items[i], items[i], i, len) === false){ |
break; |
} |
} |
}, |
|
|
eachKey : function(fn, scope){ |
for(var i = 0, len = this.keys.length; i < len; i++){ |
fn.call(scope || window, this.keys[i], this.items[i], i, len); |
} |
}, |
|
|
find : function(fn, scope){ |
for(var i = 0, len = this.items.length; i < len; i++){ |
if(fn.call(scope || window, this.items[i], this.keys[i])){ |
return this.items[i]; |
} |
} |
return null; |
}, |
|
|
insert : function(index, key, o){ |
if(arguments.length == 2){ |
o = arguments[1]; |
key = this.getKey(o); |
} |
if(index >= this.length){ |
return this.add(key, o); |
} |
this.length++; |
this.items.splice(index, 0, o); |
if(typeof key != "undefined" && key != null){ |
this.map[key] = o; |
} |
this.keys.splice(index, 0, key); |
this.fireEvent("add", index, o, key); |
return o; |
}, |
|
|
remove : function(o){ |
return this.removeAt(this.indexOf(o)); |
}, |
|
|
removeAt : function(index){ |
if(index < this.length && index >= 0){ |
this.length--; |
var o = this.items[index]; |
this.items.splice(index, 1); |
var key = this.keys[index]; |
if(typeof key != "undefined"){ |
delete this.map[key]; |
} |
this.keys.splice(index, 1); |
this.fireEvent("remove", o, key); |
return o; |
} |
return false; |
}, |
|
|
removeKey : function(key){ |
return this.removeAt(this.indexOfKey(key)); |
}, |
|
|
getCount : function(){ |
return this.length; |
}, |
|
|
indexOf : function(o){ |
return this.items.indexOf(o); |
}, |
|
|
indexOfKey : function(key){ |
return this.keys.indexOf(key); |
}, |
|
|
item : function(key){ |
var 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, anyMatch, caseSensitive){ |
if(Ext.isEmpty(value, false)){ |
return this.clone(); |
} |
value = this.createValueMatcher(value, anyMatch, caseSensitive); |
return this.filterBy(function(o){ |
return o && value.test(o[property]); |
}); |
}, |
|
|
filterBy : function(fn, scope){ |
var r = new Ext.util.MixedCollection(); |
r.getKey = this.getKey; |
var k = this.keys, it = this.items; |
for(var i = 0, len = it.length; i < len; i++){ |
if(fn.call(scope||this, it[i], k[i])){ |
r.add(k[i], it[i]); |
} |
} |
return r; |
}, |
|
|
findIndex : function(property, value, start, anyMatch, caseSensitive){ |
if(Ext.isEmpty(value, false)){ |
return -1; |
} |
value = this.createValueMatcher(value, anyMatch, caseSensitive); |
return this.findIndexBy(function(o){ |
return o && value.test(o[property]); |
}, null, start); |
}, |
|
|
findIndexBy : function(fn, scope, start){ |
var k = this.keys, it = this.items; |
for(var i = (start||0), len = it.length; i < len; i++){ |
if(fn.call(scope||this, it[i], k[i])){ |
return i; |
} |
} |
if(typeof start == 'number' && start > 0){ |
for(var i = 0; i < start; i++){ |
if(fn.call(scope||this, it[i], k[i])){ |
return i; |
} |
} |
} |
return -1; |
}, |
|
|
createValueMatcher : function(value, anyMatch, caseSensitive){ |
if(!value.exec){ |
value = String(value); |
value = new RegExp((anyMatch === true ? '' : '^') + Ext.escapeRe(value), caseSensitive ? '' : 'i'); |
} |
return value; |
}, |
|
|
clone : function(){ |
var r = new Ext.util.MixedCollection(); |
var k = this.keys, it = this.items; |
for(var i = 0, len = it.length; i < len; i++){ |
r.add(k[i], it[i]); |
} |
r.getKey = this.getKey; |
return r; |
} |
}); |
|
Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item; |
|
Ext.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(Ext.isArray(o)){ |
return encodeArray(o); |
}else if(Ext.isDate(o)){ |
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 value !== undefined ? value : ""; |
}, |
|
|
defaultValue : function(value, defaultValue){ |
return value !== undefined && value !== '' ? value : defaultValue; |
}, |
|
|
htmlEncode : function(value){ |
return !value ? value : String(value).replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, """); |
}, |
|
|
htmlDecode : function(value){ |
return !value ? value : String(value).replace(/&/g, "&").replace(/>/g, ">").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'); |
} |
v = whole + sub; |
if(v.charAt(0) == '-'){ |
return '-$' + v.substr(1); |
} |
return "$" + v; |
}, |
|
|
date : function(v, format){ |
if(!v){ |
return ""; |
} |
if(!Ext.isDate(v)){ |
v = new Date(Date.parse(v)); |
} |
return v.dateFormat(format || "m/d/Y"); |
}, |
|
|
dateRenderer : function(format){ |
return function(v){ |
return Ext.util.Format.date(v, format); |
}; |
}, |
|
|
stripTagsRE : /<\/?[^>]+>/gi, |
|
|
stripTags : function(v){ |
return !v ? v : String(v).replace(this.stripTagsRE, ""); |
}, |
|
stripScriptsRe : /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, |
|
|
stripScripts : function(v){ |
return !v ? v : String(v).replace(this.stripScriptsRe, ""); |
}, |
|
|
fileSize : function(size){ |
if(size < 1024) { |
return size + " bytes"; |
} else if(size < 1048576) { |
return (Math.round(((size*10) / 1024))/10) + " KB"; |
} else { |
return (Math.round(((size*10) / 1048576))/10) + " MB"; |
} |
}, |
|
math : function(){ |
var fns = {}; |
return function(v, a){ |
if(!fns[a]){ |
fns[a] = new Function('v', 'return v ' + a + ';'); |
} |
return fns[a](v); |
} |
}() |
}; |
}(); |
|
Ext.XTemplate = function(){ |
Ext.XTemplate.superclass.constructor.apply(this, arguments); |
var s = this.html; |
|
s = ['<tpl>', s, '</tpl>'].join(''); |
|
var re = /<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/; |
|
var nameRe = /^<tpl\b[^>]*?for="(.*?)"/; |
var ifRe = /^<tpl\b[^>]*?if="(.*?)"/; |
var execRe = /^<tpl\b[^>]*?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', 'xindex', 'xcount', 'with(values){ return '+(Ext.util.Format.htmlDecode(exp))+'; }'); |
} |
} |
if(m4){ |
exp = m4 && m4[1] ? m4[1] : null; |
if(exp){ |
exec = new Function('values', 'parent', 'xindex', 'xcount', '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\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g, |
|
codeRe : /\{\[((?:\\\]|.|\n)*?)\]\}/g, |
|
|
applySubTemplate : function(id, values, parent, xindex, xcount){ |
var t = this.tpls[id]; |
if(t.test && !t.test.call(this, values, parent, xindex, xcount)){ |
return ''; |
} |
if(t.exec && t.exec.call(this, values, parent, xindex, xcount)){ |
return ''; |
} |
var vs = t.target ? t.target.call(this, values, parent) : values; |
parent = t.target ? values : parent; |
if(t.target && Ext.isArray(vs)){ |
var buf = []; |
for(var i = 0, len = vs.length; i < len; i++){ |
buf[buf.length] = t.compiled.call(this, vs[i], parent, i+1, len); |
} |
return buf.join(''); |
} |
return t.compiled.call(this, vs, parent, xindex, xcount); |
}, |
|
|
compileTpl : function(tpl){ |
var fm = Ext.util.Format; |
var useF = this.disableFormats !== true; |
var sep = Ext.isGecko ? "+" : ","; |
var fn = function(m, name, format, args, math){ |
if(name.substr(0, 4) == 'xtpl'){ |
return "'"+ sep +'this.applySubTemplate('+name.substr(4)+', values, parent, xindex, xcount)'+sep+"'"; |
} |
var v; |
if(name === '.'){ |
v = 'values'; |
}else if(name === '#'){ |
v = 'xindex'; |
}else if(name.indexOf('.') != -1){ |
v = name; |
}else{ |
v = "values['" + name + "']"; |
} |
if(math){ |
v = '(' + v + math + ')'; |
} |
if(format && useF){ |
args = args ? ',' + args : ""; |
if(format.substr(0, 5) != "this."){ |
format = "fm." + format + '('; |
}else{ |
format = 'this.call("'+ format.substr(5) + '", '; |
args = ", values"; |
} |
}else{ |
args= ''; format = "("+v+" === undefined ? '' : "; |
} |
return "'"+ sep + format + v + args + ")"+sep+"'"; |
}; |
var codeFn = function(m, code){ |
return "'"+ sep +'('+code+')'+sep+"'"; |
}; |
|
var body; |
|
if(Ext.isGecko){ |
body = "tpl.compiled = function(values, parent, xindex, xcount){ return '" + |
tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn) + |
"';};"; |
}else{ |
body = ["tpl.compiled = function(values, parent, xindex, xcount){ return ['"]; |
body.push(tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn)); |
body.push("'].join('');};"); |
body = body.join(''); |
} |
eval(body); |
return this; |
}, |
|
|
apply : function(values){ |
return this.master.compiled.call(this, values, {}, 1, 1); |
}, |
|
|
applyTemplate : function(values){ |
return this.master.compiled.call(this, values, {}, 1, 1); |
}, |
|
|
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(!Ext.isArray(selector)){ |
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(!Ext.isArray(selector)){ |
var rule = this.getRule(selector); |
if(rule){ |
rule.style[property.replace(camelRe, camelFn)] = value; |
return true; |
} |
}else{ |
for(var i = 0; i < selector.length; i++){ |
if(this.updateRule(selector[i], property, value)){ |
return true; |
} |
} |
} |
return false; |
} |
}; |
}(); |
|
Ext.util.ClickRepeater = function(el, config) |
{ |
this.el = Ext.get(el); |
this.el.unselectable(); |
|
Ext.apply(this, config); |
|
this.addEvents( |
|
"mousedown", |
|
"click", |
|
"mouseup" |
); |
|
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.getDoc().on("mouseup", this.handleMouseUp, this); |
this.el.on("mouseout", this.handleMouseOut, this); |
|
this.fireEvent("mousedown", this); |
this.fireEvent("click", this); |
|
if (this.accelerate) { |
this.delay = 400; |
} |
this.timer = this.click.defer(this.delay || this.interval, this); |
}, |
|
click : function(){ |
this.fireEvent("click", this); |
this.timer = this.click.defer(this.accelerate ? |
this.easeOutExpo(this.mousedownTime.getElapsed(), |
400, |
-390, |
12000) : |
this.interval, this); |
}, |
|
easeOutExpo : function (t, b, c, d) { |
return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; |
}, |
|
handleMouseOut : function(){ |
clearTimeout(this.timer); |
if(this.pressClass){ |
this.el.removeClass(this.pressClass); |
} |
this.el.on("mouseover", this.handleMouseReturn, this); |
}, |
|
handleMouseReturn : function(){ |
this.el.un("mouseover", this.handleMouseReturn); |
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.getDoc().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(Ext.isArray(config)){ |
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 || config.handler, |
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 = Ext.isArray(keyCode); |
|
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" && !Ext.isArray(key)){ |
keyCode = key.key; |
shift = key.shift; |
ctrl = key.ctrl; |
alt = key.alt; |
}else{ |
keyCode = key; |
} |
this.addBinding({ |
key: keyCode, |
shift: shift, |
ctrl: ctrl, |
alt: alt, |
fn: fn, |
scope: scope |
}) |
}, |
|
|
handleKeyDown : function(e){ |
if(this.enabled){ |
var b = this.bindings; |
for(var i = 0, len = b.length; i < len; i++){ |
b[i].call(this, e); |
} |
} |
}, |
|
|
isEnabled : function(){ |
return this.enabled; |
}, |
|
|
enable: function(){ |
if(!this.enabled){ |
this.el.on(this.eventName, this.handleKeyDown, this); |
this.enabled = true; |
} |
}, |
|
|
disable: function(){ |
if(this.enabled){ |
this.el.removeListener(this.eventName, this.handleKeyDown, this); |
this.enabled = false; |
} |
} |
}; |
|
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; |
|
|
(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{ |
var 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.xTickSize |
); |
this.setYConstraint(topSpace - (pad.top||0), |
c.height - topSpace - b.height - (pad.bottom||0), |
this.yTickSize |
); |
}, |
|
|
getEl: function() { |
if (!this._domRef) { |
this._domRef = Ext.getDom(this.id); |
} |
|
return this._domRef; |
}, |
|
|
getDragEl: function() { |
return Ext.getDom(this.dragElId); |
}, |
|
|
init: function(id, sGroup, config) { |
this.initTarget(id, sGroup, config); |
Event.on(this.id, "mousedown", this.handleMouseDown, this); |
|
}, |
|
|
initTarget: function(id, sGroup, config) { |
|
|
this.config = config || {}; |
|
|
this.DDM = Ext.dd.DDM; |
|
this.groups = {}; |
|
|
|
if (typeof id !== "string") { |
id = Ext.id(id); |
} |
|
|
this.id = id; |
|
|
this.addToGroup((sGroup) ? sGroup : "default"); |
|
|
|
this.handleElId = id; |
|
|
this.setDragElId(id); |
|
|
this.invalidHandleTypes = { A: "A" }; |
this.invalidHandleIds = {}; |
this.invalidHandleClasses = []; |
|
this.applyConfig(); |
|
this.handleOnAvailable(); |
}, |
|
|
applyConfig: function() { |
|
|
|
this.padding = this.config.padding || [0, 0, 0, 0]; |
this.isTarget = (this.config.isTarget !== false); |
this.maintainOffset = (this.config.maintainOffset); |
this.primaryButtonOnly = (this.config.primaryButtonOnly !== false); |
|
}, |
|
|
handleOnAvailable: function() { |
this.available = true; |
this.resetConstraints(); |
this.onAvailable(); |
}, |
|
|
setPadding: function(iTop, iRight, iBot, iLeft) { |
|
if (!iRight && 0 !== iRight) { |
this.padding = [iTop, iTop, iTop, iTop]; |
} else if (!iBot && 0 !== iBot) { |
this.padding = [iTop, iRight, iTop, iRight]; |
} else { |
this.padding = [iTop, iRight, iBot, iLeft]; |
} |
}, |
|
|
setInitPosition: function(diffX, diffY) { |
var el = this.getEl(); |
|
if (!this.DDM.verifyEl(el)) { |
return; |
} |
|
var dx = diffX || 0; |
var dy = diffY || 0; |
|
var p = Dom.getXY( el ); |
|
this.initPageX = p[0] - dx; |
this.initPageY = p[1] - dy; |
|
this.lastPageX = p[0]; |
this.lastPageY = p[1]; |
|
|
this.setStartPosition(p); |
}, |
|
|
setStartPosition: function(pos) { |
var p = pos || Dom.getXY( this.getEl() ); |
this.deltaSetXY = null; |
|
this.startPageX = p[0]; |
this.startPageY = p[1]; |
}, |
|
|
addToGroup: function(sGroup) { |
this.groups[sGroup] = true; |
this.DDM.regDragDrop(this, sGroup); |
}, |
|
|
removeFromGroup: function(sGroup) { |
if (this.groups[sGroup]) { |
delete this.groups[sGroup]; |
} |
|
this.DDM.removeDDFromGroup(this, sGroup); |
}, |
|
|
setDragElId: function(id) { |
this.dragElId = id; |
}, |
|
|
setHandleElId: function(id) { |
if (typeof id !== "string") { |
id = Ext.id(id); |
} |
this.handleElId = id; |
this.DDM.regHandle(this.id, id); |
}, |
|
|
setOuterHandleElId: function(id) { |
if (typeof id !== "string") { |
id = Ext.id(id); |
} |
Event.on(id, "mousedown", |
this.handleMouseDown, this); |
this.setHandleElId(id); |
|
this.hasOuterHandles = true; |
}, |
|
|
unreg: function() { |
Event.un(this.id, "mousedown", |
this.handleMouseDown); |
this._domRef = null; |
this.DDM._remove(this); |
}, |
|
destroy : function(){ |
this.unreg(); |
}, |
|
|
isLocked: function() { |
return (this.DDM.isLocked() || this.locked); |
}, |
|
|
handleMouseDown: function(e, oDD){ |
if (this.primaryButtonOnly && e.button != 0) { |
return; |
} |
|
if (this.isLocked()) { |
return; |
} |
|
this.DDM.refreshCache(this.groups); |
|
var pt = new Ext.lib.Point(Ext.lib.Event.getPageX(e), Ext.lib.Event.getPageY(e)); |
if (!this.hasOuterHandles && !this.DDM.isOverTarget(pt, this) ) { |
} else { |
if (this.clickValidator(e)) { |
|
|
this.setStartPosition(); |
|
|
this.b4MouseDown(e); |
this.onMouseDown(e); |
|
this.DDM.handleMouseDown(e, this); |
|
this.DDM.stopEvent(e); |
} else { |
|
|
} |
} |
}, |
|
clickValidator: function(e) { |
var target = e.getTarget(); |
return ( this.isValidHandleChild(target) && |
(this.id == this.handleElId || |
this.DDM.handleWasClicked(target, this.id)) ); |
}, |
|
|
addInvalidHandleType: function(tagName) { |
var type = tagName.toUpperCase(); |
this.invalidHandleTypes[type] = type; |
}, |
|
|
addInvalidHandleId: function(id) { |
if (typeof id !== "string") { |
id = Ext.id(id); |
} |
this.invalidHandleIds[id] = id; |
}, |
|
|
addInvalidHandleClass: function(cssClass) { |
this.invalidHandleClasses.push(cssClass); |
}, |
|
|
removeInvalidHandleType: function(tagName) { |
var type = tagName.toUpperCase(); |
|
delete this.invalidHandleTypes[type]; |
}, |
|
|
removeInvalidHandleId: function(id) { |
if (typeof id !== "string") { |
id = Ext.id(id); |
} |
delete this.invalidHandleIds[id]; |
}, |
|
|
removeInvalidHandleClass: function(cssClass) { |
for (var i=0, len=this.invalidHandleClasses.length; i<len; ++i) { |
if (this.invalidHandleClasses[i] == cssClass) { |
delete this.invalidHandleClasses[i]; |
} |
} |
}, |
|
|
isValidHandleChild: function(node) { |
|
var valid = true; |
|
var nodeName; |
try { |
nodeName = node.nodeName.toUpperCase(); |
} catch(e) { |
nodeName = node.nodeName; |
} |
valid = valid && !this.invalidHandleTypes[nodeName]; |
valid = valid && !this.invalidHandleIds[node.id]; |
|
for (var i=0, len=this.invalidHandleClasses.length; valid && i<len; ++i) { |
valid = !Dom.hasClass(node, this.invalidHandleClasses[i]); |
} |
|
|
return valid; |
|
}, |
|
|
setXTicks: function(iStartX, iTickSize) { |
this.xTicks = []; |
this.xTickSize = iTickSize; |
|
var tickMap = {}; |
|
for (var i = this.initPageX; i >= this.minX; i = i - iTickSize) { |
if (!tickMap[i]) { |
this.xTicks[this.xTicks.length] = i; |
tickMap[i] = true; |
} |
} |
|
for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) { |
if (!tickMap[i]) { |
this.xTicks[this.xTicks.length] = i; |
tickMap[i] = true; |
} |
} |
|
this.xTicks.sort(this.DDM.numericSort) ; |
}, |
|
|
setYTicks: function(iStartY, iTickSize) { |
this.yTicks = []; |
this.yTickSize = iTickSize; |
|
var tickMap = {}; |
|
for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) { |
if (!tickMap[i]) { |
this.yTicks[this.yTicks.length] = i; |
tickMap[i] = true; |
} |
} |
|
for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) { |
if (!tickMap[i]) { |
this.yTicks[this.yTicks.length] = i; |
tickMap[i] = true; |
} |
} |
|
this.yTicks.sort(this.DDM.numericSort) ; |
}, |
|
|
setXConstraint: function(iLeft, iRight, iTickSize) { |
this.leftConstraint = iLeft; |
this.rightConstraint = iRight; |
|
this.minX = this.initPageX - iLeft; |
this.maxX = this.initPageX + iRight; |
if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); } |
|
this.constrainX = true; |
}, |
|
|
clearConstraints: function() { |
this.constrainX = false; |
this.constrainY = false; |
this.clearTicks(); |
}, |
|
|
clearTicks: function() { |
this.xTicks = null; |
this.yTicks = null; |
this.xTickSize = 0; |
this.yTickSize = 0; |
}, |
|
|
setYConstraint: function(iUp, iDown, iTickSize) { |
this.topConstraint = iUp; |
this.bottomConstraint = iDown; |
|
this.minY = this.initPageY - iUp; |
this.maxY = this.initPageY + iDown; |
if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); } |
|
this.constrainY = true; |
|
}, |
|
|
resetConstraints: function() { |
|
|
|
if (this.initPageX || this.initPageX === 0) { |
|
var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0; |
var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0; |
|
this.setInitPosition(dx, dy); |
|
|
} else { |
this.setInitPosition(); |
} |
|
if (this.constrainX) { |
this.setXConstraint( this.leftConstraint, |
this.rightConstraint, |
this.xTickSize ); |
} |
|
if (this.constrainY) { |
this.setYConstraint( this.topConstraint, |
this.bottomConstraint, |
this.yTickSize ); |
} |
}, |
|
|
getTick: function(val, tickArray) { |
|
if (!tickArray) { |
|
|
return val; |
} else if (tickArray[0] >= val) { |
|
|
return tickArray[0]; |
} else { |
for (var i=0, len=tickArray.length; i<len; ++i) { |
var next = i + 1; |
if (tickArray[next] && tickArray[next] >= val) { |
var diff1 = val - tickArray[i]; |
var diff2 = tickArray[next] - val; |
return (diff2 > diff1) ? tickArray[i] : tickArray[next]; |
} |
} |
|
|
|
return tickArray[tickArray.length - 1]; |
} |
}, |
|
|
toString: function() { |
return ("DragDrop " + this.id); |
} |
|
}; |
|
})(); |
|
|
|
|
if (!Ext.dd.DragDropMgr) { |
|
|
Ext.dd.DragDropMgr = function() { |
|
var Event = Ext.EventManager; |
|
return { |
|
|
ids: {}, |
|
|
handleIds: {}, |
|
|
dragCurrent: null, |
|
|
dragOvers: {}, |
|
|
deltaX: 0, |
|
|
deltaY: 0, |
|
|
preventDefault: true, |
|
|
stopPropagation: true, |
|
|
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<len;++i) { |
if (targets[i].id == oTargetDD.id) { |
return true; |
} |
} |
|
return false; |
}, |
|
|
isTypeOfDD: function (oDD) { |
return (oDD && oDD.__ygDragDrop); |
}, |
|
|
isHandle: function(sDDId, sHandleId) { |
return ( this.handleIds[sDDId] && |
this.handleIds[sDDId][sHandleId] ); |
}, |
|
|
getDDById: function(id) { |
for (var i in this.ids) { |
if (this.ids[i][id]) { |
return this.ids[i][id]; |
} |
} |
return null; |
}, |
|
|
handleMouseDown: function(e, oDD) { |
if(Ext.QuickTips){ |
Ext.QuickTips.disable(); |
} |
this.currentTarget = e.getTarget(); |
|
this.dragCurrent = oDD; |
|
var el = oDD.getEl(); |
|
|
this.startX = e.getPageX(); |
this.startY = e.getPageY(); |
|
this.deltaX = this.startX - el.offsetLeft; |
this.deltaY = this.startY - el.offsetTop; |
|
this.dragThreshMet = false; |
|
this.clickTimeout = setTimeout( |
function() { |
var DDM = Ext.dd.DDM; |
DDM.startDrag(DDM.startX, DDM.startY); |
}, |
this.clickTimeThresh ); |
}, |
|
|
startDrag: function(x, y) { |
clearTimeout(this.clickTimeout); |
if (this.dragCurrent) { |
this.dragCurrent.b4StartDrag(x, y); |
this.dragCurrent.startDrag(x, y); |
} |
this.dragThreshMet = true; |
}, |
|
|
handleMouseUp: function(e) { |
|
if(Ext.QuickTips){ |
Ext.QuickTips.enable(); |
} |
if (! this.dragCurrent) { |
return; |
} |
|
clearTimeout(this.clickTimeout); |
|
if (this.dragThreshMet) { |
this.fireEvents(e, true); |
} else { |
} |
|
this.stopDrag(e); |
|
this.stopEvent(e); |
}, |
|
|
stopEvent: function(e){ |
if(this.stopPropagation) { |
e.stopPropagation(); |
} |
|
if (this.preventDefault) { |
e.preventDefault(); |
} |
}, |
|
|
stopDrag: function(e) { |
|
if (this.dragCurrent) { |
if (this.dragThreshMet) { |
this.dragCurrent.b4EndDrag(e); |
this.dragCurrent.endDrag(e); |
} |
|
this.dragCurrent.onMouseUp(e); |
} |
|
this.dragCurrent = null; |
this.dragOvers = {}; |
}, |
|
|
handleMouseMove: function(e) { |
if (! this.dragCurrent) { |
return true; |
} |
|
|
|
|
if (Ext.isIE && (e.button !== 0 && e.button !== 1 && e.button !== 2)) { |
this.stopEvent(e); |
return this.handleMouseUp(e); |
} |
|
if (!this.dragThreshMet) { |
var diffX = Math.abs(this.startX - e.getPageX()); |
var diffY = Math.abs(this.startY - e.getPageY()); |
if (diffX > this.clickPixelThresh || |
diffY > this.clickPixelThresh) { |
this.startDrag(this.startX, this.startY); |
} |
} |
|
if (this.dragThreshMet) { |
this.dragCurrent.b4Drag(e); |
this.dragCurrent.onDrag(e); |
if(!this.dragCurrent.moveOnly){ |
this.fireEvents(e, false); |
} |
} |
|
this.stopEvent(e); |
|
return true; |
}, |
|
|
fireEvents: function(e, isDrop) { |
var dc = this.dragCurrent; |
|
|
|
if (!dc || dc.isLocked()) { |
return; |
} |
|
var pt = e.getPoint(); |
|
|
var oldOvers = []; |
|
var outEvts = []; |
var overEvts = []; |
var dropEvts = []; |
var enterEvts = []; |
|
|
|
for (var i in this.dragOvers) { |
|
var ddo = this.dragOvers[i]; |
|
if (! this.isTypeOfDD(ddo)) { |
continue; |
} |
|
if (! this.isOverTarget(pt, ddo, this.mode)) { |
outEvts.push( ddo ); |
} |
|
oldOvers[i] = true; |
delete this.dragOvers[i]; |
} |
|
for (var sGroup in dc.groups) { |
|
if ("string" != typeof sGroup) { |
continue; |
} |
|
for (i in this.ids[sGroup]) { |
var oDD = this.ids[sGroup][i]; |
if (! this.isTypeOfDD(oDD)) { |
continue; |
} |
|
if (oDD.isTarget && !oDD.isLocked() && oDD != dc) { |
if (this.isOverTarget(pt, oDD, this.mode)) { |
|
if (isDrop) { |
dropEvts.push( oDD ); |
|
} else { |
|
|
if (!oldOvers[oDD.id]) { |
enterEvts.push( oDD ); |
|
} else { |
overEvts.push( oDD ); |
} |
|
this.dragOvers[oDD.id] = oDD; |
} |
} |
} |
} |
} |
|
if (this.mode) { |
if (outEvts.length) { |
dc.b4DragOut(e, outEvts); |
dc.onDragOut(e, outEvts); |
} |
|
if (enterEvts.length) { |
dc.onDragEnter(e, enterEvts); |
} |
|
if (overEvts.length) { |
dc.b4DragOver(e, overEvts); |
dc.onDragOver(e, overEvts); |
} |
|
if (dropEvts.length) { |
dc.b4DragDrop(e, dropEvts); |
dc.onDragDrop(e, dropEvts); |
} |
|
} else { |
|
var len = 0; |
for (i=0, len=outEvts.length; i<len; ++i) { |
dc.b4DragOut(e, outEvts[i].id); |
dc.onDragOut(e, outEvts[i].id); |
} |
|
|
for (i=0,len=enterEvts.length; i<len; ++i) { |
|
dc.onDragEnter(e, enterEvts[i].id); |
} |
|
|
for (i=0,len=overEvts.length; i<len; ++i) { |
dc.b4DragOver(e, overEvts[i].id); |
dc.onDragOver(e, overEvts[i].id); |
} |
|
|
for (i=0, len=dropEvts.length; i<len; ++i) { |
dc.b4DragDrop(e, dropEvts[i].id); |
dc.onDragDrop(e, dropEvts[i].id); |
} |
|
} |
|
|
if (isDrop && !dropEvts.length) { |
dc.onInvalidDrop(e); |
} |
|
}, |
|
|
getBestMatch: function(dds) { |
var winner = null; |
|
|
|
|
|
|
var len = dds.length; |
|
if (len == 1) { |
winner = dds[0]; |
} else { |
|
for (var i=0; i<len; ++i) { |
var dd = dds[i]; |
|
|
|
if (dd.cursorIsOver) { |
winner = dd; |
break; |
|
} else { |
if (!winner || |
winner.overlap.getArea() < dd.overlap.getArea()) { |
winner = dd; |
} |
} |
} |
} |
|
return winner; |
}, |
|
|
refreshCache: function(groups) { |
for (var sGroup in groups) { |
if ("string" != typeof sGroup) { |
continue; |
} |
for (var i in this.ids[sGroup]) { |
var oDD = this.ids[sGroup][i]; |
|
if (this.isTypeOfDD(oDD)) { |
|
var loc = this.getLocation(oDD); |
if (loc) { |
this.locationCache[oDD.id] = loc; |
} else { |
delete this.locationCache[oDD.id]; |
|
|
|
} |
} |
} |
} |
}, |
|
|
verifyEl: function(el) { |
if (el) { |
var parent; |
if(Ext.isIE){ |
try{ |
parent = el.offsetParent; |
}catch(e){} |
}else{ |
parent = el.offsetParent; |
} |
if (parent) { |
return true; |
} |
} |
|
return false; |
}, |
|
|
getLocation: function(oDD) { |
if (! this.isTypeOfDD(oDD)) { |
return null; |
} |
|
var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l; |
|
try { |
pos= Ext.lib.Dom.getXY(el); |
} catch (e) { } |
|
if (!pos) { |
return null; |
} |
|
x1 = pos[0]; |
x2 = x1 + el.offsetWidth; |
y1 = pos[1]; |
y2 = y1 + el.offsetHeight; |
|
t = y1 - oDD.padding[0]; |
r = x2 + oDD.padding[1]; |
b = y2 + oDD.padding[2]; |
l = x1 - oDD.padding[3]; |
|
return new Ext.lib.Region( t, r, b, l ); |
}, |
|
|
isOverTarget: function(pt, oTarget, intersect) { |
|
var loc = this.locationCache[oTarget.id]; |
if (!loc || !this.useCache) { |
loc = this.getLocation(oTarget); |
this.locationCache[oTarget.id] = loc; |
|
} |
|
if (!loc) { |
return false; |
} |
|
oTarget.cursorIsOver = loc.contains( pt ); |
|
|
|
|
|
|
var dc = this.dragCurrent; |
if (!dc || !dc.getTargetCoord || |
(!intersect && !dc.constrainX && !dc.constrainY)) { |
return oTarget.cursorIsOver; |
} |
|
oTarget.overlap = null; |
|
|
|
|
|
var pos = dc.getTargetCoord(pt.x, pt.y); |
|
var el = dc.getDragEl(); |
var curRegion = new Ext.lib.Region( pos.y, |
pos.x + el.offsetWidth, |
pos.y + el.offsetHeight, |
pos.x ); |
|
var overlap = curRegion.intersect(loc); |
|
if (overlap) { |
oTarget.overlap = overlap; |
return (intersect) ? true : oTarget.cursorIsOver; |
} else { |
return false; |
} |
}, |
|
|
_onUnload: function(e, me) { |
Ext.dd.DragDropMgr.unregAll(); |
}, |
|
|
unregAll: function() { |
|
if (this.dragCurrent) { |
this.stopDrag(); |
this.dragCurrent = null; |
} |
|
this._execOnAll("unreg", []); |
|
for (var i in this.elementCache) { |
delete this.elementCache[i]; |
} |
|
this.elementCache = {}; |
this.ids = {}; |
}, |
|
|
elementCache: {}, |
|
|
getElWrapper: function(id) { |
var oWrapper = this.elementCache[id]; |
if (!oWrapper || !oWrapper.el) { |
oWrapper = this.elementCache[id] = |
new this.ElementWrapper(Ext.getDom(id)); |
} |
return oWrapper; |
}, |
|
|
getElement: function(id) { |
return Ext.getDom(id); |
}, |
|
|
getCss: function(id) { |
var el = Ext.getDom(id); |
return (el) ? el.style : null; |
}, |
|
|
ElementWrapper: function(el) { |
|
this.el = el || null; |
|
this.id = this.el && el.id; |
|
this.css = this.el && el.style; |
}, |
|
|
getPosX: function(el) { |
return Ext.lib.Dom.getX(el); |
}, |
|
|
getPosY: function(el) { |
return Ext.lib.Dom.getY(el); |
}, |
|
|
swapNode: function(n1, n2) { |
if (n1.swapNode) { |
n1.swapNode(n2); |
} else { |
var p = n2.parentNode; |
var s = n2.nextSibling; |
|
if (s == n1) { |
p.insertBefore(n1, n2); |
} else if (n2 == n1.nextSibling) { |
p.insertBefore(n2, n1); |
} else { |
n1.parentNode.replaceChild(n2, n1); |
p.insertBefore(n1, s); |
} |
} |
}, |
|
|
getScroll: function () { |
var t, l, dde=document.documentElement, db=document.body; |
if (dde && (dde.scrollTop || dde.scrollLeft)) { |
t = dde.scrollTop; |
l = dde.scrollLeft; |
} else if (db) { |
t = db.scrollTop; |
l = db.scrollLeft; |
} else { |
|
} |
return { top: t, left: l }; |
}, |
|
|
getStyle: function(el, styleProp) { |
return Ext.fly(el).getStyle(styleProp); |
}, |
|
|
getScrollTop: function () { return this.getScroll().top; }, |
|
|
getScrollLeft: function () { return this.getScroll().left; }, |
|
|
moveToEl: function (moveEl, targetEl) { |
var aCoord = Ext.lib.Dom.getXY(targetEl); |
Ext.lib.Dom.setXY(moveEl, aCoord); |
}, |
|
|
numericSort: function(a, b) { return (a - b); }, |
|
|
_timeoutCount: 0, |
|
|
_addListeners: function() { |
var DDM = Ext.dd.DDM; |
if ( Ext.lib.Event && document ) { |
DDM._onLoad(); |
} else { |
if (DDM._timeoutCount > 2000) { |
} else { |
setTimeout(DDM._addListeners, 10); |
if (document && document.body) { |
DDM._timeoutCount += 1; |
} |
} |
} |
}, |
|
|
handleWasClicked: function(node, id) { |
if (this.isHandle(id, node.id)) { |
return true; |
} else { |
|
var p = node.parentNode; |
|
while (p) { |
if (this.isHandle(id, p.id)) { |
return true; |
} else { |
p = p.parentNode; |
} |
} |
} |
|
return false; |
} |
|
}; |
|
}(); |
|
|
Ext.dd.DDM = Ext.dd.DragDropMgr; |
Ext.dd.DDM._addListeners(); |
|
} |
|
|
Ext.dd.DD = function(id, sGroup, config) { |
if (id) { |
this.init(id, sGroup, config); |
} |
}; |
|
Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, { |
|
|
scroll: true, |
|
|
autoOffset: function(iPageX, iPageY) { |
var x = iPageX - this.startPageX; |
var y = iPageY - this.startPageY; |
this.setDelta(x, y); |
}, |
|
|
setDelta: function(iDeltaX, iDeltaY) { |
this.deltaX = iDeltaX; |
this.deltaY = iDeltaY; |
}, |
|
|
setDragElPos: function(iPageX, iPageY) { |
|
|
|
var el = this.getDragEl(); |
this.alignElWithMouse(el, iPageX, iPageY); |
}, |
|
|
alignElWithMouse: function(el, iPageX, iPageY) { |
var oCoord = this.getTargetCoord(iPageX, iPageY); |
var fly = el.dom ? el : Ext.fly(el, '_dd'); |
if (!this.deltaSetXY) { |
var aCoord = [oCoord.x, oCoord.y]; |
fly.setXY(aCoord); |
var newLeft = fly.getLeft(true); |
var newTop = fly.getTop(true); |
this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ]; |
} else { |
fly.setLeftTop(oCoord.x + this.deltaSetXY[0], oCoord.y + this.deltaSetXY[1]); |
} |
|
this.cachePosition(oCoord.x, oCoord.y); |
this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth); |
return oCoord; |
}, |
|
|
cachePosition: function(iPageX, iPageY) { |
if (iPageX) { |
this.lastPageX = iPageX; |
this.lastPageY = iPageY; |
} else { |
var aCoord = Ext.lib.Dom.getXY(this.getEl()); |
this.lastPageX = aCoord[0]; |
this.lastPageY = aCoord[1]; |
} |
}, |
|
|
autoScroll: function(x, y, h, w) { |
|
if (this.scroll) { |
|
var clientH = Ext.lib.Dom.getViewHeight(); |
|
|
var clientW = Ext.lib.Dom.getViewWidth(); |
|
|
var st = this.DDM.getScrollTop(); |
|
|
var sl = this.DDM.getScrollLeft(); |
|
|
var bot = h + y; |
|
|
var right = w + x; |
|
|
|
|
var toBot = (clientH + st - y - this.deltaY); |
|
|
var toRight = (clientW + sl - x - this.deltaX); |
|
|
|
|
var thresh = 40; |
|
|
|
|
var scrAmt = (document.all) ? 80 : 30; |
|
|
|
if ( bot > clientH && toBot < thresh ) { |
window.scrollTo(sl, st + scrAmt); |
} |
|
|
|
if ( y < st && st > 0 && y - st < thresh ) { |
window.scrollTo(sl, st - scrAmt); |
} |
|
|
|
if ( right > clientW && toRight < thresh ) { |
window.scrollTo(sl + scrAmt, st); |
} |
|
|
|
if ( x < sl && sl > 0 && x - sl < thresh ) { |
window.scrollTo(sl - scrAmt, st); |
} |
} |
}, |
|
|
getTargetCoord: function(iPageX, iPageY) { |
|
|
var x = iPageX - this.deltaX; |
var y = iPageY - this.deltaY; |
|
if (this.constrainX) { |
if (x < this.minX) { x = this.minX; } |
if (x > this.maxX) { x = this.maxX; } |
} |
|
if (this.constrainY) { |
if (y < this.minY) { y = this.minY; } |
if (y > this.maxY) { y = this.maxY; } |
} |
|
x = this.getTick(x, this.xTicks); |
y = this.getTick(y, this.yTicks); |
|
|
return {x:x, y:y}; |
}, |
|
|
applyConfig: function() { |
Ext.dd.DD.superclass.applyConfig.call(this); |
this.scroll = (this.config.scroll !== false); |
}, |
|
|
b4MouseDown: function(e) { |
|
this.autoOffset(e.getPageX(), |
e.getPageY()); |
}, |
|
|
b4Drag: function(e) { |
this.setDragElPos(e.getPageX(), |
e.getPageY()); |
}, |
|
toString: function() { |
return ("DD " + this.id); |
} |
|
|
|
|
|
|
}); |
|
Ext.dd.DDProxy = function(id, sGroup, config) { |
if (id) { |
this.init(id, sGroup, config); |
this.initFrame(); |
} |
}; |
|
|
Ext.dd.DDProxy.dragElId = "ygddfdiv"; |
|
Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, { |
|
|
resizeFrame: true, |
|
|
centerFrame: false, |
|
|
createFrame: function() { |
var self = this; |
var body = document.body; |
|
if (!body || !body.firstChild) { |
setTimeout( function() { self.createFrame(); }, 50 ); |
return; |
} |
|
var div = this.getDragEl(); |
|
if (!div) { |
div = document.createElement("div"); |
div.id = this.dragElId; |
var s = div.style; |
|
s.position = "absolute"; |
s.visibility = "hidden"; |
s.cursor = "move"; |
s.border = "2px solid #aaa"; |
s.zIndex = 999; |
|
|
|
|
body.insertBefore(div, body.firstChild); |
} |
}, |
|
|
initFrame: function() { |
this.createFrame(); |
}, |
|
applyConfig: function() { |
Ext.dd.DDProxy.superclass.applyConfig.call(this); |
|
this.resizeFrame = (this.config.resizeFrame !== false); |
this.centerFrame = (this.config.centerFrame); |
this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId); |
}, |
|
|
showFrame: function(iPageX, iPageY) { |
var el = this.getEl(); |
var dragEl = this.getDragEl(); |
var s = dragEl.style; |
|
this._resizeProxy(); |
|
if (this.centerFrame) { |
this.setDelta( Math.round(parseInt(s.width, 10)/2), |
Math.round(parseInt(s.height, 10)/2) ); |
} |
|
this.setDragElPos(iPageX, iPageY); |
|
Ext.fly(dragEl).show(); |
}, |
|
|
_resizeProxy: function() { |
if (this.resizeFrame) { |
var el = this.getEl(); |
Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight); |
} |
}, |
|
|
b4MouseDown: function(e) { |
var x = e.getPageX(); |
var y = e.getPageY(); |
this.autoOffset(x, y); |
this.setDragElPos(x, y); |
}, |
|
|
b4StartDrag: function(x, y) { |
|
this.showFrame(x, y); |
}, |
|
|
b4EndDrag: function(e) { |
Ext.fly(this.getDragEl()).hide(); |
}, |
|
|
|
|
endDrag: function(e) { |
|
var lel = this.getEl(); |
var del = this.getDragEl(); |
|
|
del.style.visibility = ""; |
|
this.beforeMove(); |
|
|
lel.style.visibility = "hidden"; |
Ext.dd.DDM.moveToEl(lel, del); |
del.style.visibility = "hidden"; |
lel.style.visibility = ""; |
|
this.afterDrag(); |
}, |
|
beforeMove : function(){ |
|
}, |
|
afterDrag : function(){ |
|
}, |
|
toString: function() { |
return ("DDProxy " + this.id); |
} |
|
}); |
|
Ext.dd.DDTarget = function(id, sGroup, config) { |
if (id) { |
this.initTarget(id, sGroup, config); |
} |
}; |
|
|
Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, { |
toString: function() { |
return ("DDTarget " + this.id); |
} |
}); |
|
Ext.dd.DragTracker = function(config){ |
Ext.apply(this, config); |
this.addEvents( |
'mousedown', |
'mouseup', |
'mousemove', |
'dragstart', |
'dragend', |
'drag' |
); |
|
this.dragRegion = new Ext.lib.Region(0,0,0,0); |
|
if(this.el){ |
this.initEl(this.el); |
} |
} |
|
Ext.extend(Ext.dd.DragTracker, Ext.util.Observable, { |
active: false, |
tolerance: 5, |
autoStart: false, |
|
initEl: function(el){ |
this.el = Ext.get(el); |
el.on('mousedown', this.onMouseDown, this, |
this.delegate ? {delegate: this.delegate} : undefined); |
}, |
|
destroy : function(){ |
this.el.un('mousedown', this.onMouseDown, this); |
}, |
|
onMouseDown: function(e, target){ |
if(this.fireEvent('mousedown', this, e) !== false && this.onBeforeStart(e) !== false){ |
this.startXY = this.lastXY = e.getXY(); |
this.dragTarget = this.delegate ? target : this.el.dom; |
e.preventDefault(); |
var doc = Ext.getDoc(); |
doc.on('mouseup', this.onMouseUp, this); |
doc.on('mousemove', this.onMouseMove, this); |
doc.on('selectstart', this.stopSelect, this); |
if(this.autoStart){ |
this.timer = this.triggerStart.defer(this.autoStart === true ? 1000 : this.autoStart, this); |
} |
} |
}, |
|
onMouseMove: function(e, target){ |
e.preventDefault(); |
var xy = e.getXY(), s = this.startXY; |
this.lastXY = xy; |
if(!this.active){ |
if(Math.abs(s[0]-xy[0]) > this.tolerance || Math.abs(s[1]-xy[1]) > this.tolerance){ |
this.triggerStart(); |
}else{ |
return; |
} |
} |
this.fireEvent('mousemove', this, e); |
this.onDrag(e); |
this.fireEvent('drag', this, e); |
}, |
|
onMouseUp: function(e){ |
var doc = Ext.getDoc(); |
doc.un('mousemove', this.onMouseMove, this); |
doc.un('mouseup', this.onMouseUp, this); |
doc.un('selectstart', this.stopSelect, this); |
e.preventDefault(); |
this.clearStart(); |
this.active = false; |
delete this.elRegion; |
this.fireEvent('mouseup', this, e); |
this.onEnd(e); |
this.fireEvent('dragend', this, e); |
}, |
|
triggerStart: function(isTimer){ |
this.clearStart(); |
this.active = true; |
this.onStart(this.startXY); |
this.fireEvent('dragstart', this, this.startXY); |
}, |
|
clearStart : function(){ |
if(this.timer){ |
clearTimeout(this.timer); |
delete this.timer; |
} |
}, |
|
stopSelect : function(e){ |
e.stopEvent(); |
return false; |
}, |
|
onBeforeStart : function(e){ |
|
}, |
|
onStart : function(xy){ |
|
}, |
|
onDrag : function(e){ |
|
}, |
|
onEnd : function(e){ |
|
}, |
|
getDragTarget : function(){ |
return this.dragTarget; |
}, |
|
getDragCt : function(){ |
return this.el; |
}, |
|
getXY : function(constrain){ |
return constrain ? |
this.constrainModes[constrain].call(this, this.lastXY) : this.lastXY; |
}, |
|
getOffset : function(constrain){ |
var xy = this.getXY(constrain); |
var s = this.startXY; |
return [s[0]-xy[0], s[1]-xy[1]]; |
}, |
|
constrainModes: { |
'point' : function(xy){ |
|
if(!this.elRegion){ |
this.elRegion = this.getDragCt().getRegion(); |
} |
|
var dr = this.dragRegion; |
|
dr.left = xy[0]; |
dr.top = xy[1]; |
dr.right = xy[0]; |
dr.bottom = xy[1]; |
|
dr.constrainTo(this.elRegion); |
|
return [dr.left, dr.top]; |
} |
} |
}); |
|
Ext.dd.ScrollManager = function(){ |
var ddm = Ext.dd.DragDropMgr; |
var els = {}; |
var dragEl = null; |
var proc = {}; |
|
var onStop = function(e){ |
dragEl = null; |
clearProc(); |
}; |
|
var triggerRefresh = function(){ |
if(ddm.dragCurrent){ |
ddm.refreshCache(ddm.dragCurrent.groups); |
} |
}; |
|
var doScroll = function(){ |
if(ddm.dragCurrent){ |
var dds = Ext.dd.ScrollManager; |
var inc = proc.el.ddScrollConfig ? |
proc.el.ddScrollConfig.increment : dds.increment; |
if(!dds.animate){ |
if(proc.el.scroll(proc.dir, inc)){ |
triggerRefresh(); |
} |
}else{ |
proc.el.scroll(proc.dir, inc, true, dds.animDuration, triggerRefresh); |
} |
} |
}; |
|
var clearProc = function(){ |
if(proc.id){ |
clearInterval(proc.id); |
} |
proc.id = 0; |
proc.el = null; |
proc.dir = ""; |
}; |
|
var startProc = function(el, dir){ |
clearProc(); |
proc.el = el; |
proc.dir = dir; |
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; |
var c = el.ddScrollConfig ? el.ddScrollConfig : dds; |
if(r && r.contains(pt) && el.isScrollable()){ |
if(r.bottom - pt.y <= c.vthresh){ |
if(proc.el != el){ |
startProc(el, "down"); |
} |
return; |
}else if(r.right - pt.x <= c.hthresh){ |
if(proc.el != el){ |
startProc(el, "left"); |
} |
return; |
}else if(pt.y - r.top <= c.vthresh){ |
if(proc.el != el){ |
startProc(el, "up"); |
} |
return; |
}else if(pt.x - r.left <= c.hthresh){ |
if(proc.el != el){ |
startProc(el, "right"); |
} |
return; |
} |
} |
} |
clearProc(); |
}; |
|
ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm); |
ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm); |
|
return { |
|
register : function(el){ |
if(Ext.isArray(el)){ |
for(var i = 0, len = el.length; i < len; i++) { |
this.register(el[i]); |
} |
}else{ |
el = Ext.get(el); |
els[el.id] = el; |
} |
}, |
|
|
unregister : function(el){ |
if(Ext.isArray(el)){ |
for(var i = 0, len = el.length; i < len; i++) { |
this.unregister(el[i]); |
} |
}else{ |
el = Ext.get(el); |
delete els[el.id]; |
} |
}, |
|
|
vthresh : 25, |
|
hthresh : 25, |
|
|
increment : 100, |
|
|
frequency : 500, |
|
|
animate: true, |
|
|
animDuration: .4, |
|
|
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); |
if(!this.dragData){ |
this.dragData = {}; |
} |
|
Ext.apply(this, config); |
|
if(!this.proxy){ |
this.proxy = new Ext.dd.StatusProxy(); |
} |
Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, |
{dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true}); |
|
this.dragging = false; |
}; |
|
Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, { |
|
|
dropAllowed : "x-dd-drop-ok", |
|
dropNotAllowed : "x-dd-drop-nodrop", |
|
|
getDragData : function(e){ |
return this.dragData; |
}, |
|
|
onDragEnter : function(e, id){ |
var target = Ext.dd.DragDropMgr.getDDById(id); |
this.cachedTarget = target; |
if(this.beforeDragEnter(target, e, id) !== false){ |
if(target.isNotifyTarget){ |
var status = target.notifyEnter(this, e, this.dragData); |
this.proxy.setStatus(status); |
}else{ |
this.proxy.setStatus(this.dropAllowed); |
} |
|
if(this.afterDragEnter){ |
|
this.afterDragEnter(target, e, id); |
} |
} |
}, |
|
|
beforeDragEnter : function(target, e, id){ |
return true; |
}, |
|
|
alignElWithMouse: function() { |
Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments); |
this.proxy.sync(); |
}, |
|
|
onDragOver : function(e, id){ |
var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); |
if(this.beforeDragOver(target, e, id) !== false){ |
if(target.isNotifyTarget){ |
var status = target.notifyOver(this, e, this.dragData); |
this.proxy.setStatus(status); |
} |
|
if(this.afterDragOver){ |
|
this.afterDragOver(target, e, id); |
} |
} |
}, |
|
|
beforeDragOver : function(target, e, id){ |
return true; |
}, |
|
|
onDragOut : function(e, id){ |
var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); |
if(this.beforeDragOut(target, e, id) !== false){ |
if(target.isNotifyTarget){ |
target.notifyOut(this, e, this.dragData); |
} |
this.proxy.reset(); |
if(this.afterDragOut){ |
|
this.afterDragOut(target, e, id); |
} |
} |
this.cachedTarget = null; |
}, |
|
|
beforeDragOut : function(target, e, id){ |
return true; |
}, |
|
|
onDragDrop : function(e, id){ |
var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); |
if(this.beforeDragDrop(target, e, id) !== false){ |
if(target.isNotifyTarget){ |
if(target.notifyDrop(this, e, this.dragData)){ |
this.onValidDrop(target, e, id); |
}else{ |
this.onInvalidDrop(target, e, id); |
} |
}else{ |
this.onValidDrop(target, e, id); |
} |
|
if(this.afterDragDrop){ |
|
this.afterDragDrop(target, e, id); |
} |
} |
delete this.cachedTarget; |
}, |
|
|
beforeDragDrop : function(target, e, id){ |
return true; |
}, |
|
|
onValidDrop : function(target, e, id){ |
this.hideProxy(); |
if(this.afterValidDrop){ |
|
this.afterValidDrop(target, e, id); |
} |
}, |
|
|
getRepairXY : function(e, data){ |
return this.el.getXY(); |
}, |
|
|
onInvalidDrop : function(target, e, id){ |
this.beforeInvalidDrop(target, e, id); |
if(this.cachedTarget){ |
if(this.cachedTarget.isNotifyTarget){ |
this.cachedTarget.notifyOut(this, e, this.dragData); |
} |
this.cacheTarget = null; |
} |
this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this); |
|
if(this.afterInvalidDrop){ |
|
this.afterInvalidDrop(e, id); |
} |
}, |
|
|
afterRepair : function(){ |
if(Ext.enableFx){ |
this.el.highlight(this.hlColor || "c3daf9"); |
} |
this.dragging = false; |
}, |
|
|
beforeInvalidDrop : function(target, e, id){ |
return true; |
}, |
|
|
handleMouseDown : function(e){ |
if(this.dragging) { |
return; |
} |
var data = this.getDragData(e); |
if(data && this.onBeforeDrag(data, e) !== false){ |
this.dragData = data; |
this.proxy.stop(); |
Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments); |
} |
}, |
|
|
onBeforeDrag : function(data, e){ |
return true; |
}, |
|
|
onStartDrag : Ext.emptyFn, |
|
|
startDrag : function(x, y){ |
this.proxy.reset(); |
this.dragging = true; |
this.proxy.update(""); |
this.onInitDrag(x, y); |
this.proxy.show(); |
}, |
|
|
onInitDrag : function(x, y){ |
var clone = this.el.dom.cloneNode(true); |
clone.id = Ext.id(); |
this.proxy.update(clone); |
this.onStartDrag(x, y); |
return true; |
}, |
|
|
getProxy : function(){ |
return this.proxy; |
}, |
|
|
hideProxy : function(){ |
this.proxy.hide(); |
this.proxy.reset(true); |
this.dragging = false; |
}, |
|
|
triggerCacheRefresh : function(){ |
Ext.dd.DDM.refreshCache(this.groups); |
}, |
|
|
b4EndDrag: function(e) { |
}, |
|
|
endDrag : function(e){ |
this.onEndDrag(this.dragData, e); |
}, |
|
|
onEndDrag : function(data, e){ |
}, |
|
|
autoOffset : function(x, y) { |
this.setDelta(-12, -20); |
} |
}); |
|
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(Ext.isDate(s)){ |
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 = Ext.extend(Ext.data.Record, {}); |
var p = f.prototype; |
p.fields = new Ext.util.MixedCollection(false, function(field){ |
return field.name; |
}); |
for(var i = 0, len = o.length; i < len; i++){ |
p.fields.add(new Ext.data.Field(o[i])); |
} |
f.getField = function(name){ |
return p.fields.get(name); |
}; |
return f; |
}; |
|
Ext.data.Record.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(String(this.data[name]) == String(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){ |
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(silent){ |
var m = this.modified; |
for(var n in m){ |
if(typeof m[n] != "function"){ |
this.data[n] = m[n]; |
} |
} |
this.dirty = false; |
delete this.modified; |
this.editing = false; |
if(this.store && silent !== true){ |
this.store.afterReject(this); |
} |
}, |
|
|
commit : function(silent){ |
this.dirty = false; |
delete this.modified; |
this.editing = false; |
if(this.store && silent !== true){ |
this.store.afterCommit(this); |
} |
}, |
|
|
getChanges : function(){ |
var m = this.modified, cs = {}; |
for(var n in m){ |
if(m.hasOwnProperty(n)){ |
cs[n] = this.data[n]; |
} |
} |
return cs; |
}, |
|
|
hasError : function(){ |
return this.error != null; |
}, |
|
|
clearError : function(){ |
this.error = null; |
}, |
|
|
copy : function(newId) { |
return new this.constructor(Ext.apply({}, this.data), newId || this.id); |
}, |
|
|
isModified : function(fieldName){ |
return this.modified && this.modified.hasOwnProperty(fieldName); |
} |
}; |
|
Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), { |
register : function(){ |
for(var i = 0, s; s = arguments[i]; i++){ |
this.add(s); |
} |
}, |
|
unregister : function(){ |
for(var i = 0, s; s = arguments[i]; i++){ |
this.remove(this.lookup(s)); |
} |
}, |
|
|
lookup : function(id){ |
return typeof id == "object" ? id : this.get(id); |
}, |
|
|
getKey : function(o){ |
return o.storeId || o.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.url && !this.proxy){ |
this.proxy = new Ext.data.HttpProxy({url: this.url}); |
} |
|
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', |
|
'metachange', |
|
'add', |
|
'remove', |
|
'update', |
|
'clear', |
|
'beforeload', |
|
'load', |
|
'loadexception' |
); |
|
if(this.proxy){ |
this.relayEvents(this.proxy, ["loadexception"]); |
} |
|
this.sortToggle = {}; |
if(this.sortInfo){ |
this.setDefaultSort(this.sortInfo.field, this.sortInfo.direction); |
} |
|
Ext.data.Store.superclass.constructor.call(this); |
|
if(this.storeId || this.id){ |
Ext.StoreMgr.register(this); |
} |
if(this.inlineData){ |
this.loadData(this.inlineData); |
delete this.inlineData; |
}else if(this.autoLoad){ |
this.load.defer(10, this, [ |
typeof this.autoLoad == 'object' ? |
this.autoLoad : undefined]); |
} |
}; |
Ext.extend(Ext.data.Store, Ext.util.Observable, { |
|
|
|
|
|
|
|
|
|
remoteSort : false, |
|
|
pruneModifiedRecords : false, |
|
|
lastOptions : null, |
|
destroy : function(){ |
if(this.id){ |
Ext.StoreMgr.unregister(this); |
} |
this.data = null; |
this.purgeListeners(); |
}, |
|
|
add : function(records){ |
records = [].concat(records); |
if(records.length < 1){ |
return; |
} |
for(var i = 0, len = records.length; i < len; i++){ |
records[i].join(this); |
} |
var index = this.data.length; |
this.data.addAll(records); |
if(this.snapshot){ |
this.snapshot.addAll(records); |
} |
this.fireEvent("add", this, records, index); |
}, |
|
|
addSorted : function(record){ |
var index = this.findInsertIndex(record); |
this.insert(index, record); |
}, |
|
|
remove : function(record){ |
var index = this.data.indexOf(record); |
this.data.removeAt(index); |
if(this.pruneModifiedRecords){ |
this.modified.remove(record); |
} |
if(this.snapshot){ |
this.snapshot.remove(record); |
} |
this.fireEvent("remove", this, record, index); |
}, |
|
|
removeAll : function(){ |
this.data.clear(); |
if(this.snapshot){ |
this.snapshot.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); |
return true; |
} else { |
return false; |
} |
}, |
|
|
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; |
this.sortData(f, s.direction); |
} |
}, |
|
|
sortData : function(f, direction){ |
direction = direction || 'ASC'; |
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(direction, fn); |
if(this.snapshot && this.snapshot != this.data){ |
this.snapshot.sort(direction, fn); |
} |
}, |
|
|
setDefaultSort : function(field, dir){ |
dir = dir ? dir.toUpperCase() : "ASC"; |
this.sortInfo = {field: field, direction: dir}; |
this.sortToggle[field] = dir; |
}, |
|
|
sort : function(fieldName, dir){ |
var f = this.fields.get(fieldName); |
if(!f){ |
return false; |
} |
if(!dir){ |
if(this.sortInfo && this.sortInfo.field == f.name){ |
dir = (this.sortToggle[f.name] || "ASC").toggle("ASC", "DESC"); |
}else{ |
dir = f.sortDir; |
} |
} |
var st = (this.sortToggle) ? this.sortToggle[f.name] : null; |
var si = (this.sortInfo) ? this.sortInfo : null; |
|
this.sortToggle[f.name] = dir; |
this.sortInfo = {field: f.name, direction: dir}; |
if(!this.remoteSort){ |
this.applySort(); |
this.fireEvent("datachanged", this); |
}else{ |
if (!this.load(this.lastOptions)) { |
if (st) { |
this.sortToggle[f.name] = st; |
} |
if (si) { |
this.sortInfo = si; |
} |
} |
} |
}, |
|
|
each : function(fn, scope){ |
this.data.each(fn, scope); |
}, |
|
|
getModifiedRecords : function(){ |
return this.modified; |
}, |
|
|
createFilterFn : function(property, value, anyMatch, caseSensitive){ |
if(Ext.isEmpty(value, false)){ |
return false; |
} |
value = this.data.createValueMatcher(value, anyMatch, caseSensitive); |
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, caseSensitive){ |
var fn = this.createFilterFn(property, value, anyMatch, caseSensitive); |
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, caseSensitive){ |
var fn = this.createFilterFn(property, value, anyMatch, caseSensitive); |
return fn ? this.queryBy(fn) : this.data.clone(); |
}, |
|
|
queryBy : function(fn, scope){ |
var data = this.snapshot || this.data; |
return data.filterBy(fn, scope||this); |
}, |
|
|
find : function(property, value, start, anyMatch, caseSensitive){ |
var fn = this.createFilterFn(property, value, anyMatch, caseSensitive); |
return fn ? this.data.findIndexBy(fn, null, start) : -1; |
}, |
|
|
findBy : function(fn, scope, start){ |
return this.data.findIndexBy(fn, scope, start); |
}, |
|
|
collect : function(dataIndex, allowNull, bypassFilter){ |
var d = (bypassFilter === true && this.snapshot) ? |
this.snapshot.items : this.data.items; |
var v, sv, r = [], l = {}; |
for(var i = 0, len = d.length; i < len; i++){ |
v = d[i].data[dataIndex]; |
sv = String(v); |
if((allowNull || !Ext.isEmpty(v)) && !l[sv]){ |
l[sv] = true; |
r[r.length] = v; |
} |
} |
return r; |
}, |
|
|
clearFilter : function(suppressEvent){ |
if(this.isFiltered()){ |
this.data = this.snapshot; |
delete this.snapshot; |
if(suppressEvent !== true){ |
this.fireEvent("datachanged", this); |
} |
} |
}, |
|
|
isFiltered : function(){ |
return this.snapshot && this.snapshot != this.data; |
}, |
|
|
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); |
}, |
|
|
findInsertIndex : function(record){ |
this.suspendEvents(); |
var data = this.data.clone(); |
this.data.add(record); |
this.applySort(); |
var index = this.data.indexOf(record); |
this.data = data; |
this.resumeEvents(); |
return index; |
} |
}); |
|
Ext.data.SimpleStore = function(config){ |
Ext.data.SimpleStore.superclass.constructor.call(this, Ext.apply(config, { |
reader: new Ext.data.ArrayReader({ |
id: config.id |
}, |
Ext.data.Record.create(config.fields) |
) |
})); |
}; |
Ext.extend(Ext.data.SimpleStore, Ext.data.Store, { |
loadData : function(data, append){ |
if(this.expandData === true){ |
var r = []; |
for(var i = 0, len = data.length; i < len; i++){ |
r[r.length] = [data[i]]; |
} |
data = r; |
} |
Ext.data.SimpleStore.superclass.loadData.call(this, data, append); |
} |
}); |
|
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(Ext.isDate(v)){ |
return v; |
} |
if(dateFormat){ |
if(dateFormat == "timestamp"){ |
return new Date(v*1000); |
} |
if(dateFormat == "time"){ |
return new Date(parseInt(v, 10)); |
} |
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 = Ext.isArray(recordType) ? |
Ext.data.Record.create(recordType) : recordType; |
}; |
|
Ext.data.DataReader.prototype = { |
|
}; |
|
Ext.data.DataProxy = function(){ |
this.addEvents( |
|
'beforeload', |
|
'load', |
|
'loadexception' |
); |
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, n); |
} |
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, n); |
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 = Ext.extend(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, n); |
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", |
|
"remove", |
|
"move", |
|
"insert", |
|
"beforeappend", |
|
"beforeremove", |
|
"beforemove", |
|
"beforeinsert" |
); |
|
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(Ext.isArray(node)){ |
multi = node; |
}else if(arguments.length > 1){ |
multi = arguments; |
} |
|
if(multi){ |
for(var i = 0, len = multi.length; i < len; i++) { |
this.appendChild(multi[i]); |
} |
}else{ |
if(this.fireEvent("beforeappend", this.ownerTree, this, node) === false){ |
return false; |
} |
var index = this.childNodes.length; |
var oldParent = node.parentNode; |
|
if(oldParent){ |
if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index) === false){ |
return false; |
} |
oldParent.removeChild(node); |
} |
index = this.childNodes.length; |
if(index == 0){ |
this.setFirstChild(node); |
} |
this.childNodes.push(node); |
node.parentNode = this; |
var ps = this.childNodes[index-1]; |
if(ps){ |
node.previousSibling = ps; |
ps.nextSibling = node; |
}else{ |
node.previousSibling = null; |
} |
node.nextSibling = null; |
this.setLastChild(node); |
node.setOwnerTree(this.getOwnerTree()); |
this.fireEvent("append", this.ownerTree, this, node, index); |
if(oldParent){ |
node.fireEvent("move", this.ownerTree, node, oldParent, this, index); |
} |
return node; |
} |
}, |
|
|
removeChild : function(node){ |
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; |
}, |
|
|
remove : function(){ |
this.parentNode.removeChild(this); |
return this; |
}, |
|
|
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.apply(scope || p, args || [p]) === false){ |
break; |
} |
p = p.parentNode; |
} |
}, |
|
|
cascade : function(fn, scope, args){ |
if(fn.apply(scope || this, args || [this]) !== false){ |
var cs = this.childNodes; |
for(var i = 0, len = cs.length; i < len; i++) { |
cs[i].cascade(fn, scope, args); |
} |
} |
}, |
|
|
eachChild : function(fn, scope, args){ |
var cs = this.childNodes; |
for(var i = 0, len = cs.length; i < len; i++) { |
if(fn.apply(scope || 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.data.GroupingStore = Ext.extend(Ext.data.Store, { |
|
|
remoteGroup : false, |
|
groupOnSort:false, |
|
|
clearGrouping : function(){ |
this.groupField = false; |
if(this.remoteGroup){ |
if(this.baseParams){ |
delete this.baseParams.groupBy; |
} |
this.reload(); |
}else{ |
this.applySort(); |
this.fireEvent('datachanged', this); |
} |
}, |
|
|
groupBy : function(field, forceRegroup){ |
if(this.groupField == field && !forceRegroup){ |
return; |
} |
this.groupField = field; |
if(this.remoteGroup){ |
if(!this.baseParams){ |
this.baseParams = {}; |
} |
this.baseParams['groupBy'] = field; |
} |
if(this.groupOnSort){ |
this.sort(field); |
return; |
} |
if(this.remoteGroup){ |
this.reload(); |
}else{ |
var si = this.sortInfo || {}; |
if(si.field != field){ |
this.applySort(); |
}else{ |
this.sortData(field); |
} |
this.fireEvent('datachanged', this); |
} |
}, |
|
|
applySort : function(){ |
Ext.data.GroupingStore.superclass.applySort.call(this); |
if(!this.groupOnSort && !this.remoteGroup){ |
var gs = this.getGroupState(); |
if(gs && gs != this.sortInfo.field){ |
this.sortData(this.groupField); |
} |
} |
}, |
|
|
applyGrouping : function(alwaysFireChange){ |
if(this.groupField !== false){ |
this.groupBy(this.groupField, true); |
return true; |
}else{ |
if(alwaysFireChange === true){ |
this.fireEvent('datachanged', this); |
} |
return false; |
} |
}, |
|
|
getGroupState : function(){ |
return this.groupOnSort && this.groupField !== false ? |
(this.sortInfo ? this.sortInfo.field : undefined) : this.groupField; |
} |
}); |
|
Ext.ComponentMgr = function(){ |
var all = new Ext.util.MixedCollection(); |
var types = {}; |
|
return { |
|
register : function(c){ |
all.add(c); |
}, |
|
|
unregister : function(c){ |
all.remove(c); |
}, |
|
|
get : function(id){ |
return all.get(id); |
}, |
|
|
onAvailable : function(id, fn, scope){ |
all.on("add", function(index, o){ |
if(o.id == id){ |
fn.call(scope || o, o); |
all.un("add", fn, scope); |
} |
}); |
}, |
|
|
all : all, |
|
|
registerType : function(xtype, cls){ |
types[xtype] = cls; |
cls.xtype = xtype; |
}, |
|
|
create : function(config, defaultType){ |
return new types[config.xtype || defaultType](config); |
} |
}; |
}(); |
|
|
|
Ext.reg = Ext.ComponentMgr.registerType; |
|
Ext.Component = function(config){ |
config = config || {}; |
if(config.initialConfig){ |
if(config.isAction){ this.baseAction = config; |
} |
config = config.initialConfig; }else if(config.tagName || config.dom || typeof config == "string"){ config = {applyTo: config, id: config.id || config}; |
} |
|
|
this.initialConfig = config; |
|
Ext.apply(this, config); |
this.addEvents( |
|
'disable', |
|
'enable', |
|
'beforeshow', |
|
'show', |
|
'beforehide', |
|
'hide', |
|
'beforerender', |
|
'render', |
|
'beforedestroy', |
|
'destroy', |
|
'beforestaterestore', |
|
'staterestore', |
|
'beforestatesave', |
|
'statesave' |
); |
this.getId(); |
Ext.ComponentMgr.register(this); |
Ext.Component.superclass.constructor.call(this); |
|
if(this.baseAction){ |
this.baseAction.addComponent(this); |
} |
|
this.initComponent(); |
|
if(this.plugins){ |
if(Ext.isArray(this.plugins)){ |
for(var i = 0, len = this.plugins.length; i < len; i++){ |
this.plugins[i].init(this); |
} |
}else{ |
this.plugins.init(this); |
} |
} |
|
if(this.stateful !== false){ |
this.initState(config); |
} |
|
if(this.applyTo){ |
this.applyToMarkup(this.applyTo); |
delete this.applyTo; |
}else if(this.renderTo){ |
this.render(this.renderTo); |
delete this.renderTo; |
} |
}; |
|
Ext.Component.AUTO_ID = 1000; |
|
Ext.extend(Ext.Component, Ext.util.Observable, { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
disabledClass : "x-item-disabled", |
|
allowDomMove : true, |
|
autoShow : false, |
|
hideMode: 'display', |
|
hideParent: false, |
|
|
|
hidden : false, |
|
disabled : false, |
|
rendered : false, |
|
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); |
if(this.ctCls){ |
this.container.addClass(this.ctCls); |
} |
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.autoShow){ |
this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]); |
} |
if(this.cls){ |
this.el.addClass(this.cls); |
delete this.cls; |
} |
if(this.style){ |
this.el.applyStyles(this.style); |
delete this.style; |
} |
this.fireEvent("render", this); |
this.afterRender(this.container); |
if(this.hidden){ |
this.hide(); |
} |
if(this.disabled){ |
this.disable(); |
} |
|
this.initStateEvents(); |
} |
return this; |
}, |
|
initState : function(config){ |
if(Ext.state.Manager){ |
var state = Ext.state.Manager.get(this.stateId || this.id); |
if(state){ |
if(this.fireEvent('beforestaterestore', this, state) !== false){ |
this.applyState(state); |
this.fireEvent('staterestore', this, state); |
} |
} |
} |
}, |
|
initStateEvents : function(){ |
if(this.stateEvents){ |
for(var i = 0, e; e = this.stateEvents[i]; i++){ |
this.on(e, this.saveState, this, {delay:100}); |
} |
} |
}, |
|
applyState : function(state, config){ |
if(state){ |
Ext.apply(this, state); |
} |
}, |
|
getState : function(){ |
return null; |
}, |
|
saveState : function(){ |
if(Ext.state.Manager){ |
var state = this.getState(); |
if(this.fireEvent('beforestatesave', this, state) !== false){ |
Ext.state.Manager.set(this.stateId || this.id, state); |
this.fireEvent('statesave', this, state); |
} |
} |
}, |
|
|
applyToMarkup : function(el){ |
this.allowDomMove = false; |
this.el = Ext.get(el); |
this.render(this.el.dom.parentNode); |
}, |
|
|
addClass : function(cls){ |
if(this.el){ |
this.el.addClass(cls); |
}else{ |
this.cls = this.cls ? this.cls + ' ' + cls : cls; |
} |
}, |
|
|
removeClass : function(cls){ |
if(this.el){ |
this.el.removeClass(cls); |
}else if(this.cls){ |
this.cls = this.cls.split(' ').remove(cls).join(' '); |
} |
}, |
|
onRender : function(ct, position){ |
if(this.autoEl){ |
if(typeof this.autoEl == 'string'){ |
this.el = document.createElement(this.autoEl); |
}else{ |
var div = document.createElement('div'); |
Ext.DomHelper.overwrite(div, this.autoEl); |
this.el = div.firstChild; |
} |
if (!this.el.id) { |
this.el.id = this.getId(); |
} |
} |
if(this.el){ |
this.el = Ext.get(this.el); |
if(this.allowDomMove !== false){ |
ct.dom.insertBefore(this.el.dom, position); |
} |
} |
}, |
|
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.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); |
this.purgeListeners(); |
} |
}, |
|
beforeDestroy : Ext.emptyFn, |
|
onDestroy : Ext.emptyFn, |
|
|
getEl : function(){ |
return this.el; |
}, |
|
|
getId : function(){ |
return this.id || (this.id = "ext-comp-" + (++Ext.Component.AUTO_ID)); |
}, |
|
|
getItemId : function(){ |
return this.itemId || this.getId(); |
}, |
|
|
focus : function(selectText, delay){ |
if(delay){ |
this.focus.defer(typeof delay == 'number' ? delay : 10, this, [selectText, false]); |
return; |
} |
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.autoRender){ |
this.render(typeof this.autoRender == 'boolean' ? Ext.getBody() : this.autoRender); |
} |
if(this.rendered){ |
this.onShow(); |
} |
this.fireEvent("show", this); |
} |
return this; |
}, |
|
onShow : function(){ |
if(this.hideParent){ |
this.container.removeClass('x-hide-' + this.hideMode); |
}else{ |
this.getActionEl().removeClass('x-hide-' + this.hideMode); |
} |
|
}, |
|
|
hide: function(){ |
if(this.fireEvent("beforehide", this) !== false){ |
this.hidden = true; |
if(this.rendered){ |
this.onHide(); |
} |
this.fireEvent("hide", this); |
} |
return this; |
}, |
|
onHide : function(){ |
if(this.hideParent){ |
this.container.addClass('x-hide-' + this.hideMode); |
}else{ |
this.getActionEl().addClass('x-hide-' + this.hideMode); |
} |
}, |
|
|
setVisible: function(visible){ |
if(visible) { |
this.show(); |
}else{ |
this.hide(); |
} |
return this; |
}, |
|
|
isVisible : function(){ |
return this.rendered && 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); |
}, |
|
|
getXType : function(){ |
return this.constructor.xtype; |
}, |
|
|
isXType : function(xtype, shallow){ |
return !shallow ? |
('/' + this.getXTypes() + '/').indexOf('/' + xtype + '/') != -1 : |
this.constructor.xtype == xtype; |
}, |
|
|
getXTypes : function(){ |
var tc = this.constructor; |
if(!tc.xtypes){ |
var c = [], sc = this; |
while(sc && sc.constructor.xtype){ |
c.unshift(sc.constructor.xtype); |
sc = sc.constructor.superclass; |
} |
tc.xtypeChain = c; |
tc.xtypes = c.join('/'); |
} |
return tc.xtypes; |
}, |
|
|
findParentBy: function(fn) { |
for (var p = this.ownerCt; (p != null) && !fn(p, this); p = p.ownerCt); |
return p || null; |
}, |
|
|
findParentByType: function(xtype) { |
return typeof xtype == 'function' ? |
this.findParentBy(function(p){ |
return p.constructor === xtype; |
}) : |
this.findParentBy(function(p){ |
return p.constructor.xtype === xtype; |
}); |
} |
}); |
|
Ext.reg('component', Ext.Component); |
|
|
Ext.Action = function(config){ |
this.initialConfig = config; |
this.items = []; |
} |
|
Ext.Action.prototype = { |
|
|
|
|
|
|
|
|
isAction : true, |
|
|
setText : function(text){ |
this.initialConfig.text = text; |
this.callEach('setText', [text]); |
}, |
|
|
getText : function(){ |
return this.initialConfig.text; |
}, |
|
|
setIconClass : function(cls){ |
this.initialConfig.iconCls = cls; |
this.callEach('setIconClass', [cls]); |
}, |
|
|
getIconClass : function(){ |
return this.initialConfig.iconCls; |
}, |
|
|
setDisabled : function(v){ |
this.initialConfig.disabled = v; |
this.callEach('setDisabled', [v]); |
}, |
|
|
enable : function(){ |
this.setDisabled(false); |
}, |
|
|
disable : function(){ |
this.setDisabled(true); |
}, |
|
|
isDisabled : function(){ |
return this.initialConfig.disabled; |
}, |
|
|
setHidden : function(v){ |
this.initialConfig.hidden = v; |
this.callEach('setVisible', [!v]); |
}, |
|
|
show : function(){ |
this.setHidden(false); |
}, |
|
|
hide : function(){ |
this.setHidden(true); |
}, |
|
|
isHidden : function(){ |
return this.initialConfig.hidden; |
}, |
|
|
setHandler : function(fn, scope){ |
this.initialConfig.handler = fn; |
this.initialConfig.scope = scope; |
this.callEach('setHandler', [fn, scope]); |
}, |
|
|
each : function(fn, scope){ |
Ext.each(this.items, fn, scope); |
}, |
|
|
callEach : function(fnName, args){ |
var cs = this.items; |
for(var i = 0, len = cs.length; i < len; i++){ |
cs[i][fnName].apply(cs[i], args); |
} |
}, |
|
|
addComponent : function(comp){ |
this.items.push(comp); |
comp.on('destroy', this.removeComponent, this); |
}, |
|
|
removeComponent : function(comp){ |
this.items.remove(comp); |
}, |
|
|
execute : function(){ |
this.initialConfig.handler.apply(this.initialConfig.scope || window, arguments); |
} |
}; |
|
(function(){ |
Ext.Layer = function(config, existingEl){ |
config = config || {}; |
var dh = Ext.DomHelper; |
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(); |
Ext.removeNode(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.getDoc().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 ? |
'<div class="x-ie-shadow"></div>' : |
'<div class="x-shadow"><div class="xst"><div class="xstl"></div><div class="xstc"></div><div class="xstr"></div></div><div class="xsc"><div class="xsml"></div><div class="xsmc"></div><div class="xsmr"></div></div><div class="xsb"><div class="xsbl"></div><div class="xsbc"></div><div class="xsbr"></div></div></div>'; |
return { |
pull : function(){ |
var sh = p.shift(); |
if(!sh){ |
sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, markup)); |
sh.autoBoxAdjust = false; |
} |
return sh; |
}, |
|
push : function(sh){ |
p.push(sh); |
} |
}; |
}(); |
|
Ext.BoxComponent = Ext.extend(Ext.Component, { |
|
|
|
|
|
|
|
|
|
|
initComponent : function(){ |
Ext.BoxComponent.superclass.initComponent.call(this); |
this.addEvents( |
|
'resize', |
|
'move' |
); |
}, |
|
boxReady : false, |
deferHeight: false, |
|
|
setSize : function(w, h){ |
if(typeof w == 'object'){ |
h = w.height; |
w = w.width; |
} |
if(!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; |
}, |
|
|
setWidth : function(width){ |
return this.setSize(width); |
}, |
|
|
setHeight : function(height){ |
return this.setSize(undefined, height); |
}, |
|
|
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 === true){ |
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){ |
if(x && typeof x[1] == 'number'){ |
y = x[1]; |
x = x[0]; |
} |
this.x = x; |
this.y = y; |
if(!this.boxReady){ |
return this; |
} |
var adj = this.adjustPosition(x, y); |
var ax = adj.x, ay = adj.y; |
|
var el = this.getPositionEl(); |
if(ax !== undefined || ay !== undefined){ |
if(ax !== undefined && ay !== undefined){ |
el.setLeftTop(ax, ay); |
}else if(ax !== undefined){ |
el.setLeft(ax); |
}else if(ay !== undefined){ |
el.setTop(ay); |
} |
this.onPosition(ax, ay); |
this.fireEvent('move', this, ax, ay); |
} |
return this; |
}, |
|
|
setPagePosition : function(x, y){ |
if(x && typeof x[1] == 'number'){ |
y = x[1]; |
x = x[0]; |
} |
this.pageX = x; |
this.pageY = y; |
if(!this.boxReady){ |
return; |
} |
if(x === undefined || y === undefined){ return; |
} |
var p = this.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); |
}else if(this.pageX || this.pageY){ |
this.setPagePosition(this.pageX, this.pageY); |
} |
}, |
|
|
syncSize : function(){ |
delete this.lastSize; |
this.setSize(this.autoWidth ? undefined : this.el.getWidth(), this.autoHeight ? undefined : 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.reg('box', Ext.BoxComponent); |
|
Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){ |
|
|
this.el = Ext.get(dragElement, true); |
this.el.dom.unselectable = "on"; |
|
this.resizingEl = Ext.get(resizingElement, true); |
|
|
this.orientation = orientation || Ext.SplitBar.HORIZONTAL; |
|
|
this.minSize = 0; |
|
|
this.maxSize = 2000; |
|
|
this.animate = false; |
|
|
this.useShim = false; |
|
|
this.shim = null; |
|
if(!existingProxy){ |
|
this.proxy = Ext.SplitBar.createProxy(this.orientation); |
}else{ |
this.proxy = Ext.get(existingProxy).dom; |
} |
|
this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {dragElId : this.proxy.id}); |
|
|
this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this); |
|
|
this.dd.endDrag = this.onEndProxyDrag.createDelegate(this); |
|
|
this.dragSpecs = {}; |
|
|
this.adapter = new Ext.SplitBar.BasicLayoutAdapter(); |
this.adapter.init(this); |
|
if(this.orientation == Ext.SplitBar.HORIZONTAL){ |
|
this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT); |
this.el.addClass("x-splitbar-h"); |
}else{ |
|
this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM); |
this.el.addClass("x-splitbar-v"); |
} |
|
this.addEvents( |
|
"resize", |
|
"moved", |
|
"beforeresize", |
|
"beforeapply" |
); |
|
Ext.SplitBar.superclass.constructor.call(this); |
}; |
|
Ext.extend(Ext.SplitBar, Ext.util.Observable, { |
onStartProxyDrag : function(x, y){ |
this.fireEvent("beforeresize", this); |
this.overlay = Ext.DomHelper.append(document.body, {cls: "x-drag-overlay", html: " "}, true); |
this.overlay.unselectable(); |
this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); |
this.overlay.show(); |
Ext.get(this.proxy).setDisplayed("block"); |
var size = this.adapter.getElementSize(this); |
this.activeMinSize = this.getMinimumSize();; |
this.activeMaxSize = this.getMaximumSize();; |
var c1 = size - this.activeMinSize; |
var c2 = Math.max(this.activeMaxSize - size, 0); |
if(this.orientation == Ext.SplitBar.HORIZONTAL){ |
this.dd.resetConstraints(); |
this.dd.setXConstraint( |
this.placement == Ext.SplitBar.LEFT ? c1 : c2, |
this.placement == Ext.SplitBar.LEFT ? c2 : c1 |
); |
this.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.remove(); |
delete this.overlay; |
} |
var newSize; |
if(this.orientation == Ext.SplitBar.HORIZONTAL){ |
newSize = this.dragSpecs.startSize + |
(this.placement == Ext.SplitBar.LEFT ? |
endPoint[0] - this.dragSpecs.startPoint[0] : |
this.dragSpecs.startPoint[0] - endPoint[0] |
); |
}else{ |
newSize = this.dragSpecs.startSize + |
(this.placement == Ext.SplitBar.TOP ? |
endPoint[1] - this.dragSpecs.startPoint[1] : |
this.dragSpecs.startPoint[1] - endPoint[1] |
); |
} |
newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize); |
if(newSize != this.dragSpecs.startSize){ |
if(this.fireEvent('beforeapply', this, newSize) !== false){ |
this.adapter.setElementSize(this, newSize); |
this.fireEvent("moved", this, newSize); |
this.fireEvent("resize", this, newSize); |
} |
} |
}, |
|
|
getAdapter : function(){ |
return this.adapter; |
}, |
|
|
setAdapter : function(adapter){ |
this.adapter = adapter; |
this.adapter.init(this); |
}, |
|
|
getMinimumSize : function(){ |
return this.minSize; |
}, |
|
|
setMinimumSize : function(minSize){ |
this.minSize = minSize; |
}, |
|
|
getMaximumSize : function(){ |
return this.maxSize; |
}, |
|
|
setMaximumSize : function(maxSize){ |
this.maxSize = maxSize; |
}, |
|
|
setCurrentSize : function(size){ |
var oldAnimate = this.animate; |
this.animate = false; |
this.adapter.setElementSize(this, size); |
this.animate = oldAnimate; |
}, |
|
|
destroy : function(removeEl){ |
if(this.shim){ |
this.shim.remove(); |
} |
this.dd.unreg(); |
Ext.removeNode(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.Container = Ext.extend(Ext.BoxComponent, { |
|
|
|
|
|
|
|
|
|
autoDestroy: true, |
|
|
defaultType: 'panel', |
|
initComponent : function(){ |
Ext.Container.superclass.initComponent.call(this); |
|
this.addEvents( |
|
'afterlayout', |
|
'beforeadd', |
|
'beforeremove', |
|
'add', |
|
'remove' |
); |
|
|
var items = this.items; |
if(items){ |
delete this.items; |
if(Ext.isArray(items)){ |
this.add.apply(this, items); |
}else{ |
this.add(items); |
} |
} |
}, |
|
initItems : function(){ |
if(!this.items){ |
this.items = new Ext.util.MixedCollection(false, this.getComponentId); |
this.getLayout(); } |
}, |
|
setLayout : function(layout){ |
if(this.layout && this.layout != layout){ |
this.layout.setContainer(null); |
} |
this.initItems(); |
this.layout = layout; |
layout.setContainer(this); |
}, |
|
render : function(){ |
Ext.Container.superclass.render.apply(this, arguments); |
if(this.layout){ |
if(typeof this.layout == 'string'){ |
this.layout = new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig); |
} |
this.setLayout(this.layout); |
|
if(this.activeItem !== undefined){ |
var item = this.activeItem; |
delete this.activeItem; |
this.layout.setActiveItem(item); |
return; |
} |
} |
if(!this.ownerCt){ |
this.doLayout(); |
} |
if(this.monitorResize === true){ |
Ext.EventManager.onWindowResize(this.doLayout, this, [false]); |
} |
}, |
|
getLayoutTarget : function(){ |
return this.el; |
}, |
|
getComponentId : function(comp){ |
return comp.itemId || comp.id; |
}, |
|
|
add : function(comp){ |
if(!this.items){ |
this.initItems(); |
} |
var a = arguments, len = a.length; |
if(len > 1){ |
for(var i = 0; i < len; i++) { |
this.add(a[i]); |
} |
return; |
} |
var c = this.lookupComponent(this.applyDefaults(comp)); |
var pos = this.items.length; |
if(this.fireEvent('beforeadd', this, c, pos) !== false && this.onBeforeAdd(c) !== false){ |
this.items.add(c); |
c.ownerCt = this; |
this.fireEvent('add', this, c, pos); |
} |
return c; |
}, |
|
|
insert : function(index, comp){ |
if(!this.items){ |
this.initItems(); |
} |
var a = arguments, len = a.length; |
if(len > 2){ |
for(var i = len-1; i >= 1; --i) { |
this.insert(index, a[i]); |
} |
return; |
} |
var c = this.lookupComponent(this.applyDefaults(comp)); |
|
if(c.ownerCt == this && this.items.indexOf(c) < index){ |
--index; |
} |
|
if(this.fireEvent('beforeadd', this, c, index) !== false && this.onBeforeAdd(c) !== false){ |
this.items.insert(index, c); |
c.ownerCt = this; |
this.fireEvent('add', this, c, index); |
} |
return c; |
}, |
|
applyDefaults : function(c){ |
if(this.defaults){ |
if(typeof c == 'string'){ |
c = Ext.ComponentMgr.get(c); |
Ext.apply(c, this.defaults); |
}else if(!c.events){ |
Ext.applyIf(c, this.defaults); |
}else{ |
Ext.apply(c, this.defaults); |
} |
} |
return c; |
}, |
|
onBeforeAdd : function(item){ |
if(item.ownerCt){ |
item.ownerCt.remove(item, false); |
} |
if(this.hideBorders === true){ |
item.border = (item.border === true); |
} |
}, |
|
|
remove : function(comp, autoDestroy){ |
var c = this.getComponent(comp); |
if(c && this.fireEvent('beforeremove', this, c) !== false){ |
this.items.remove(c); |
delete c.ownerCt; |
if(autoDestroy === true || (autoDestroy !== false && this.autoDestroy)){ |
c.destroy(); |
} |
if(this.layout && this.layout.activeItem == c){ |
delete this.layout.activeItem; |
} |
this.fireEvent('remove', this, c); |
} |
return c; |
}, |
|
|
getComponent : function(comp){ |
if(typeof comp == 'object'){ |
return comp; |
} |
return this.items.get(comp); |
}, |
|
lookupComponent : function(comp){ |
if(typeof comp == 'string'){ |
return Ext.ComponentMgr.get(comp); |
}else if(!comp.events){ |
return this.createComponent(comp); |
} |
return comp; |
}, |
|
createComponent : function(config){ |
return Ext.ComponentMgr.create(config, this.defaultType); |
}, |
|
|
doLayout : function(shallow){ |
if(this.rendered && this.layout){ |
this.layout.layout(); |
} |
if(shallow !== false && this.items){ |
var cs = this.items.items; |
for(var i = 0, len = cs.length; i < len; i++) { |
var c = cs[i]; |
if(c.doLayout){ |
c.doLayout(); |
} |
} |
} |
}, |
|
|
getLayout : function(){ |
if(!this.layout){ |
var layout = new Ext.layout.ContainerLayout(this.layoutConfig); |
this.setLayout(layout); |
} |
return this.layout; |
}, |
|
onDestroy : function(){ |
if(this.items){ |
var cs = this.items.items; |
for(var i = 0, len = cs.length; i < len; i++) { |
Ext.destroy(cs[i]); |
} |
} |
if(this.monitorResize){ |
Ext.EventManager.removeResizeListener(this.doLayout, this); |
} |
Ext.Container.superclass.onDestroy.call(this); |
}, |
|
|
bubble : function(fn, scope, args){ |
var p = this; |
while(p){ |
if(fn.apply(scope || p, args || [p]) === false){ |
break; |
} |
p = p.ownerCt; |
} |
}, |
|
|
cascade : function(fn, scope, args){ |
if(fn.apply(scope || this, args || [this]) !== false){ |
if(this.items){ |
var cs = this.items.items; |
for(var i = 0, len = cs.length; i < len; i++){ |
if(cs[i].cascade){ |
cs[i].cascade(fn, scope, args); |
}else{ |
fn.apply(scope || this, args || [cs[i]]); |
} |
} |
} |
} |
}, |
|
|
findById : function(id){ |
var m, ct = this; |
this.cascade(function(c){ |
if(ct != c && c.id === id){ |
m = c; |
return false; |
} |
}); |
return m || null; |
}, |
|
|
findByType : function(xtype){ |
return typeof xtype == 'function' ? |
this.findBy(function(c){ |
return c.constructor === xtype; |
}) : |
this.findBy(function(c){ |
return c.constructor.xtype === xtype; |
}); |
}, |
|
|
find : function(prop, value){ |
return this.findBy(function(c){ |
return c[prop] === value; |
}); |
}, |
|
|
findBy : function(fn, scope){ |
var m = [], ct = this; |
this.cascade(function(c){ |
if(ct != c && fn.call(scope || c, c, ct) === true){ |
m.push(c); |
} |
}); |
return m; |
} |
}); |
|
Ext.Container.LAYOUTS = {}; |
Ext.reg('container', Ext.Container); |
|
Ext.layout.ContainerLayout = function(config){ |
Ext.apply(this, config); |
}; |
|
Ext.layout.ContainerLayout.prototype = { |
|
|
|
|
|
monitorResize:false, |
activeItem : null, |
|
layout : function(){ |
var target = this.container.getLayoutTarget(); |
this.onLayout(this.container, target); |
this.container.fireEvent('afterlayout', this.container, this); |
}, |
|
onLayout : function(ct, target){ |
this.renderAll(ct, target); |
}, |
|
isValidParent : function(c, target){ |
var el = c.getPositionEl ? c.getPositionEl() : c.getEl(); |
return el.dom.parentNode == target.dom; |
}, |
|
renderAll : function(ct, target){ |
var items = ct.items.items; |
for(var i = 0, len = items.length; i < len; i++) { |
var c = items[i]; |
if(c && (!c.rendered || !this.isValidParent(c, target))){ |
this.renderItem(c, i, target); |
} |
} |
}, |
|
renderItem : function(c, position, target){ |
if(c && !c.rendered){ |
c.render(target, position); |
if(this.extraCls){ |
var t = c.getPositionEl ? c.getPositionEl() : c; |
t.addClass(this.extraCls); |
} |
if (this.renderHidden && c != this.activeItem) { |
c.hide(); |
} |
}else if(c && !this.isValidParent(c, target)){ |
if(this.extraCls){ |
c.addClass(this.extraCls); |
} |
if(typeof position == 'number'){ |
position = target.dom.childNodes[position]; |
} |
target.dom.insertBefore(c.getEl().dom, position || null); |
if (this.renderHidden && c != this.activeItem) { |
c.hide(); |
} |
} |
}, |
|
onResize: function(){ |
if(this.container.collapsed){ |
return; |
} |
var b = this.container.bufferResize; |
if(b){ |
if(!this.resizeTask){ |
this.resizeTask = new Ext.util.DelayedTask(this.layout, this); |
this.resizeBuffer = typeof b == 'number' ? b : 100; |
} |
this.resizeTask.delay(this.resizeBuffer); |
}else{ |
this.layout(); |
} |
}, |
|
setContainer : function(ct){ |
if(this.monitorResize && ct != this.container){ |
if(this.container){ |
this.container.un('resize', this.onResize, this); |
} |
if(ct){ |
ct.on('resize', this.onResize, this); |
} |
} |
this.container = ct; |
}, |
|
parseMargins : function(v){ |
var ms = v.split(' '); |
var len = ms.length; |
if(len == 1){ |
ms[1] = ms[0]; |
ms[2] = ms[0]; |
ms[3] = ms[0]; |
} |
if(len == 2){ |
ms[2] = ms[0]; |
ms[3] = ms[1]; |
} |
return { |
top:parseInt(ms[0], 10) || 0, |
right:parseInt(ms[1], 10) || 0, |
bottom:parseInt(ms[2], 10) || 0, |
left:parseInt(ms[3], 10) || 0 |
}; |
} |
}; |
Ext.Container.LAYOUTS['auto'] = Ext.layout.ContainerLayout; |
|
Ext.layout.FitLayout = Ext.extend(Ext.layout.ContainerLayout, { |
|
monitorResize:true, |
|
|
onLayout : function(ct, target){ |
Ext.layout.FitLayout.superclass.onLayout.call(this, ct, target); |
if(!this.container.collapsed){ |
this.setItemSize(this.activeItem || ct.items.itemAt(0), target.getStyleSize()); |
} |
}, |
|
|
setItemSize : function(item, size){ |
if(item && size.height > 0){ |
item.setSize(size); |
} |
} |
}); |
Ext.Container.LAYOUTS['fit'] = Ext.layout.FitLayout; |
|
Ext.layout.CardLayout = Ext.extend(Ext.layout.FitLayout, { |
|
deferredRender : false, |
|
|
renderHidden : true, |
|
|
setActiveItem : function(item){ |
item = this.container.getComponent(item); |
if(this.activeItem != item){ |
if(this.activeItem){ |
this.activeItem.hide(); |
} |
this.activeItem = item; |
item.show(); |
this.layout(); |
} |
}, |
|
|
renderAll : function(ct, target){ |
if(this.deferredRender){ |
this.renderItem(this.activeItem, undefined, target); |
}else{ |
Ext.layout.CardLayout.superclass.renderAll.call(this, ct, target); |
} |
} |
}); |
Ext.Container.LAYOUTS['card'] = Ext.layout.CardLayout; |
|
Ext.layout.AnchorLayout = Ext.extend(Ext.layout.ContainerLayout, { |
|
monitorResize:true, |
|
|
getAnchorViewSize : function(ct, target){ |
return target.dom == document.body ? |
target.getViewSize() : target.getStyleSize(); |
}, |
|
|
onLayout : function(ct, target){ |
Ext.layout.AnchorLayout.superclass.onLayout.call(this, ct, target); |
|
var size = this.getAnchorViewSize(ct, target); |
|
var w = size.width, h = size.height; |
|
if(w < 20 || h < 20){ |
return; |
} |
|
|
var aw, ah; |
if(ct.anchorSize){ |
if(typeof ct.anchorSize == 'number'){ |
aw = ct.anchorSize; |
}else{ |
aw = ct.anchorSize.width; |
ah = ct.anchorSize.height; |
} |
}else{ |
aw = ct.initialConfig.width; |
ah = ct.initialConfig.height; |
} |
|
var cs = ct.items.items, len = cs.length, i, c, a, cw, ch; |
for(i = 0; i < len; i++){ |
c = cs[i]; |
if(c.anchor){ |
a = c.anchorSpec; |
if(!a){ |
var vs = c.anchor.split(' '); |
c.anchorSpec = a = { |
right: this.parseAnchor(vs[0], c.initialConfig.width, aw), |
bottom: this.parseAnchor(vs[1], c.initialConfig.height, ah) |
}; |
} |
cw = a.right ? this.adjustWidthAnchor(a.right(w), c) : undefined; |
ch = a.bottom ? this.adjustHeightAnchor(a.bottom(h), c) : undefined; |
|
if(cw || ch){ |
c.setSize(cw || undefined, ch || undefined); |
} |
} |
} |
}, |
|
|
parseAnchor : function(a, start, cstart){ |
if(a && a != 'none'){ |
var last; |
if(/^(r|right|b|bottom)$/i.test(a)){ |
var diff = cstart - start; |
return function(v){ |
if(v !== last){ |
last = v; |
return v - diff; |
} |
} |
}else if(a.indexOf('%') != -1){ |
var ratio = parseFloat(a.replace('%', ''))*.01; |
return function(v){ |
if(v !== last){ |
last = v; |
return Math.floor(v*ratio); |
} |
} |
}else{ |
a = parseInt(a, 10); |
if(!isNaN(a)){ |
return function(v){ |
if(v !== last){ |
last = v; |
return v + a; |
} |
} |
} |
} |
} |
return false; |
}, |
|
|
adjustWidthAnchor : function(value, comp){ |
return value; |
}, |
|
|
adjustHeightAnchor : function(value, comp){ |
return value; |
} |
|
|
}); |
Ext.Container.LAYOUTS['anchor'] = Ext.layout.AnchorLayout; |
|
Ext.layout.ColumnLayout = Ext.extend(Ext.layout.ContainerLayout, { |
|
monitorResize:true, |
|
extraCls: 'x-column', |
|
scrollOffset : 0, |
|
|
isValidParent : function(c, target){ |
return c.getEl().dom.parentNode == this.innerCt.dom; |
}, |
|
|
onLayout : function(ct, target){ |
var cs = ct.items.items, len = cs.length, c, i; |
|
if(!this.innerCt){ |
target.addClass('x-column-layout-ct'); |
|
|
|
this.innerCt = target.createChild({cls:'x-column-inner'}); |
this.innerCt.createChild({cls:'x-clear'}); |
} |
this.renderAll(ct, this.innerCt); |
|
var size = target.getViewSize(); |
|
if(size.width < 1 && size.height < 1){ |
return; |
} |
|
var w = size.width - target.getPadding('lr') - this.scrollOffset, |
h = size.height - target.getPadding('tb'), |
pw = w; |
|
this.innerCt.setWidth(w); |
|
|
|
|
for(i = 0; i < len; i++){ |
c = cs[i]; |
if(!c.columnWidth){ |
pw -= (c.getSize().width + c.getEl().getMargins('lr')); |
} |
} |
|
pw = pw < 0 ? 0 : pw; |
|
for(i = 0; i < len; i++){ |
c = cs[i]; |
if(c.columnWidth){ |
c.setSize(Math.floor(c.columnWidth*pw) - c.getEl().getMargins('lr')); |
} |
} |
} |
|
|
}); |
|
Ext.Container.LAYOUTS['column'] = Ext.layout.ColumnLayout; |
|
Ext.layout.BorderLayout = Ext.extend(Ext.layout.ContainerLayout, { |
monitorResize:true, |
rendered : false, |
|
onLayout : function(ct, target){ |
var collapsed; |
if(!this.rendered){ |
target.position(); |
target.addClass('x-border-layout-ct'); |
var items = ct.items.items; |
collapsed = []; |
for(var i = 0, len = items.length; i < len; i++) { |
var c = items[i]; |
var pos = c.region; |
if(c.collapsed){ |
collapsed.push(c); |
} |
c.collapsed = false; |
if(!c.rendered){ |
c.cls = c.cls ? c.cls +' x-border-panel' : 'x-border-panel'; |
c.render(target, i); |
} |
this[pos] = pos != 'center' && c.split ? |
new Ext.layout.BorderLayout.SplitRegion(this, c.initialConfig, pos) : |
new Ext.layout.BorderLayout.Region(this, c.initialConfig, pos); |
this[pos].render(target, c); |
} |
this.rendered = true; |
} |
|
var size = target.getViewSize(); |
if(size.width < 20 || size.height < 20){ if(collapsed){ |
this.restoreCollapsed = collapsed; |
} |
return; |
}else if(this.restoreCollapsed){ |
collapsed = this.restoreCollapsed; |
delete this.restoreCollapsed; |
} |
|
var w = size.width, h = size.height; |
var centerW = w, centerH = h, centerY = 0, centerX = 0; |
|
var n = this.north, s = this.south, west = this.west, e = this.east, c = this.center; |
if(!c){ |
throw 'No center region defined in BorderLayout ' + ct.id; |
} |
|
if(n && n.isVisible()){ |
var b = n.getSize(); |
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.applyLayout(b); |
} |
if(s && s.isVisible()){ |
var b = s.getSize(); |
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.applyLayout(b); |
} |
if(west && west.isVisible()){ |
var b = west.getSize(); |
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.applyLayout(b); |
} |
if(e && e.isVisible()){ |
var b = e.getSize(); |
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.applyLayout(b); |
} |
|
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.applyLayout(centerBox); |
|
if(collapsed){ |
for(var i = 0, len = collapsed.length; i < len; i++){ |
collapsed[i].collapse(false); |
} |
} |
|
if(Ext.isIE && Ext.isStrict){ target.repaint(); |
} |
} |
|
|
}); |
|
|
Ext.layout.BorderLayout.Region = function(layout, config, pos){ |
Ext.apply(this, config); |
this.layout = layout; |
this.position = pos; |
this.state = {}; |
if(typeof this.margins == 'string'){ |
this.margins = this.layout.parseMargins(this.margins); |
} |
this.margins = Ext.applyIf(this.margins || {}, this.defaultMargins); |
if(this.collapsible){ |
if(typeof this.cmargins == 'string'){ |
this.cmargins = this.layout.parseMargins(this.cmargins); |
} |
if(this.collapseMode == 'mini' && !this.cmargins){ |
this.cmargins = {left:0,top:0,right:0,bottom:0}; |
}else{ |
this.cmargins = Ext.applyIf(this.cmargins || {}, |
pos == 'north' || pos == 'south' ? this.defaultNSCMargins : this.defaultEWCMargins); |
} |
} |
}; |
|
Ext.layout.BorderLayout.Region.prototype = { |
|
|
|
|
|
|
collapsible : false, |
|
split:false, |
|
floatable: true, |
|
minWidth:50, |
|
minHeight:50, |
|
defaultMargins : {left:0,top:0,right:0,bottom:0}, |
defaultNSCMargins : {left:5,top:5,right:5,bottom:5}, |
defaultEWCMargins : {left:5,top:0,right:5,bottom:0}, |
|
|
isCollapsed : false, |
|
|
|
|
|
render : function(ct, p){ |
this.panel = p; |
p.el.enableDisplayMode(); |
this.targetEl = ct; |
this.el = p.el; |
|
var gs = p.getState, ps = this.position; |
p.getState = function(){ |
return Ext.apply(gs.call(p) || {}, this.state); |
}.createDelegate(this); |
|
if(ps != 'center'){ |
p.allowQueuedExpand = false; |
p.on({ |
beforecollapse: this.beforeCollapse, |
collapse: this.onCollapse, |
beforeexpand: this.beforeExpand, |
expand: this.onExpand, |
hide: this.onHide, |
show: this.onShow, |
scope: this |
}); |
if(this.collapsible){ |
p.collapseEl = 'el'; |
p.slideAnchor = this.getSlideAnchor(); |
} |
if(p.tools && p.tools.toggle){ |
p.tools.toggle.addClass('x-tool-collapse-'+ps); |
p.tools.toggle.addClassOnOver('x-tool-collapse-'+ps+'-over'); |
} |
} |
}, |
|
getCollapsedEl : function(){ |
if(!this.collapsedEl){ |
if(!this.toolTemplate){ |
var tt = new Ext.Template( |
'<div class="x-tool x-tool-{id}"> </div>' |
); |
tt.disableFormats = true; |
tt.compile(); |
Ext.layout.BorderLayout.Region.prototype.toolTemplate = tt; |
} |
this.collapsedEl = this.targetEl.createChild({ |
cls: "x-layout-collapsed x-layout-collapsed-"+this.position, |
id: this.panel.id + '-xcollapsed' |
}); |
this.collapsedEl.enableDisplayMode('block'); |
|
if(this.collapseMode == 'mini'){ |
this.collapsedEl.addClass('x-layout-cmini-'+this.position); |
this.miniCollapsedEl = this.collapsedEl.createChild({ |
cls: "x-layout-mini x-layout-mini-"+this.position, html: " " |
}); |
this.miniCollapsedEl.addClassOnOver('x-layout-mini-over'); |
this.collapsedEl.addClassOnOver("x-layout-collapsed-over"); |
this.collapsedEl.on('click', this.onExpandClick, this, {stopEvent:true}); |
}else { |
var t = this.toolTemplate.append( |
this.collapsedEl.dom, |
{id:'expand-'+this.position}, true); |
t.addClassOnOver('x-tool-expand-'+this.position+'-over'); |
t.on('click', this.onExpandClick, this, {stopEvent:true}); |
|
if(this.floatable !== false){ |
this.collapsedEl.addClassOnOver("x-layout-collapsed-over"); |
this.collapsedEl.on("click", this.collapseClick, this); |
} |
} |
} |
return this.collapsedEl; |
}, |
|
onExpandClick : function(e){ |
if(this.isSlid){ |
this.afterSlideIn(); |
this.panel.expand(false); |
}else{ |
this.panel.expand(); |
} |
}, |
|
onCollapseClick : function(e){ |
this.panel.collapse(); |
}, |
|
beforeCollapse : function(p, animate){ |
this.lastAnim = animate; |
if(this.splitEl){ |
this.splitEl.hide(); |
} |
this.getCollapsedEl().show(); |
this.panel.el.setStyle('z-index', 100); |
this.isCollapsed = true; |
this.layout.layout(); |
}, |
|
onCollapse : function(animate){ |
this.panel.el.setStyle('z-index', 1); |
if(this.lastAnim === false || this.panel.animCollapse === false){ |
this.getCollapsedEl().dom.style.visibility = 'visible'; |
}else{ |
this.getCollapsedEl().slideIn(this.panel.slideAnchor, {duration:.2}); |
} |
this.state.collapsed = true; |
this.panel.saveState(); |
}, |
|
beforeExpand : function(animate){ |
var c = this.getCollapsedEl(); |
this.el.show(); |
if(this.position == 'east' || this.position == 'west'){ |
this.panel.setSize(undefined, c.getHeight()); |
}else{ |
this.panel.setSize(c.getWidth(), undefined); |
} |
c.hide(); |
c.dom.style.visibility = 'hidden'; |
this.panel.el.setStyle('z-index', 100); |
}, |
|
onExpand : function(){ |
this.isCollapsed = false; |
if(this.splitEl){ |
this.splitEl.show(); |
} |
this.layout.layout(); |
this.panel.el.setStyle('z-index', 1); |
this.state.collapsed = false; |
this.panel.saveState(); |
}, |
|
collapseClick : function(e){ |
if(this.isSlid){ |
e.stopPropagation(); |
this.slideIn(); |
}else{ |
e.stopPropagation(); |
this.slideOut(); |
} |
}, |
|
onHide : function(){ |
if(this.isCollapsed){ |
this.getCollapsedEl().hide(); |
}else if(this.splitEl){ |
this.splitEl.hide(); |
} |
}, |
|
onShow : function(){ |
if(this.isCollapsed){ |
this.getCollapsedEl().show(); |
}else if(this.splitEl){ |
this.splitEl.show(); |
} |
}, |
|
|
isVisible : function(){ |
return !this.panel.hidden; |
}, |
|
|
getMargins : function(){ |
return this.isCollapsed && this.cmargins ? this.cmargins : this.margins; |
}, |
|
|
getSize : function(){ |
return this.isCollapsed ? this.getCollapsedEl().getSize() : this.panel.getSize(); |
}, |
|
|
setPanel : function(panel){ |
this.panel = panel; |
}, |
|
|
getMinWidth: function(){ |
return this.minWidth; |
}, |
|
|
getMinHeight: function(){ |
return this.minHeight; |
}, |
|
applyLayoutCollapsed : function(box){ |
var ce = this.getCollapsedEl(); |
ce.setLeftTop(box.x, box.y); |
ce.setSize(box.width, box.height); |
}, |
|
applyLayout : function(box){ |
if(this.isCollapsed){ |
this.applyLayoutCollapsed(box); |
}else{ |
this.panel.setPosition(box.x, box.y); |
this.panel.setSize(box.width, box.height); |
} |
}, |
|
beforeSlide: function(){ |
this.panel.beforeEffect(); |
}, |
|
afterSlide : function(){ |
this.panel.afterEffect(); |
}, |
|
initAutoHide : function(){ |
if(this.autoHide !== false){ |
if(!this.autoHideHd){ |
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.getDoc().un("click", this.slideInIf, this); |
}, |
|
slideOut : function(){ |
if(this.isSlid || this.el.hasActiveFx()){ |
return; |
} |
this.isSlid = true; |
var ts = this.panel.tools; |
if(ts && ts.toggle){ |
ts.toggle.hide(); |
} |
this.el.show(); |
if(this.position == 'east' || this.position == 'west'){ |
this.panel.setSize(undefined, this.collapsedEl.getHeight()); |
}else{ |
this.panel.setSize(this.collapsedEl.getWidth(), undefined); |
} |
this.restoreLT = [this.el.dom.style.left, this.el.dom.style.top]; |
this.el.alignTo(this.collapsedEl, this.getCollapseAnchor()); |
this.el.setStyle("z-index", 102); |
if(this.animFloat !== false){ |
this.beforeSlide(); |
this.el.slideIn(this.getSlideAnchor(), { |
callback: function(){ |
this.afterSlide(); |
this.initAutoHide(); |
Ext.getDoc().on("click", this.slideInIf, this); |
}, |
scope: this, |
block: true |
}); |
}else{ |
this.initAutoHide(); |
Ext.getDoc().on("click", this.slideInIf, this); |
} |
}, |
|
afterSlideIn : function(){ |
this.clearAutoHide(); |
this.isSlid = false; |
this.clearMonitor(); |
this.el.setStyle("z-index", ""); |
this.el.dom.style.left = this.restoreLT[0]; |
this.el.dom.style.top = this.restoreLT[1]; |
|
var ts = this.panel.tools; |
if(ts && ts.toggle){ |
ts.toggle.show(); |
} |
}, |
|
slideIn : function(cb){ |
if(!this.isSlid || this.el.hasActiveFx()){ |
Ext.callback(cb); |
return; |
} |
this.isSlid = false; |
if(this.animFloat !== false){ |
this.beforeSlide(); |
this.el.slideOut(this.getSlideAnchor(), { |
callback: function(){ |
this.el.hide(); |
this.afterSlide(); |
this.afterSlideIn(); |
Ext.callback(cb); |
}, |
scope: this, |
block: true |
}); |
}else{ |
this.el.hide(); |
this.afterSlideIn(); |
} |
}, |
|
slideInIf : function(e){ |
if(!e.within(this.el)){ |
this.slideIn(); |
} |
}, |
|
anchors : { |
"west" : "left", |
"east" : "right", |
"north" : "top", |
"south" : "bottom" |
}, |
|
sanchors : { |
"west" : "l", |
"east" : "r", |
"north" : "t", |
"south" : "b" |
}, |
|
canchors : { |
"west" : "tl-tr", |
"east" : "tr-tl", |
"north" : "tl-bl", |
"south" : "bl-tl" |
}, |
|
getAnchor : function(){ |
return this.anchors[this.position]; |
}, |
|
getCollapseAnchor : function(){ |
return this.canchors[this.position]; |
}, |
|
getSlideAnchor : function(){ |
return this.sanchors[this.position]; |
}, |
|
getAlignAdj : function(){ |
var cm = this.cmargins; |
switch(this.position){ |
case "west": |
return [0, 0]; |
break; |
case "east": |
return [0, 0]; |
break; |
case "north": |
return [0, 0]; |
break; |
case "south": |
return [0, 0]; |
break; |
} |
}, |
|
getExpandAdj : function(){ |
var c = this.collapsedEl, cm = this.cmargins; |
switch(this.position){ |
case "west": |
return [-(cm.right+c.getWidth()+cm.left), 0]; |
break; |
case "east": |
return [cm.right+c.getWidth()+cm.left, 0]; |
break; |
case "north": |
return [0, -(cm.top+cm.bottom+c.getHeight())]; |
break; |
case "south": |
return [0, cm.top+cm.bottom+c.getHeight()]; |
break; |
} |
} |
}; |
|
|
Ext.layout.BorderLayout.SplitRegion = function(layout, config, pos){ |
Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, layout, config, pos); |
this.applyLayout = this.applyFns[pos]; |
}; |
|
Ext.extend(Ext.layout.BorderLayout.SplitRegion, Ext.layout.BorderLayout.Region, { |
|
splitTip : "Drag to resize.", |
|
collapsibleSplitTip : "Drag to resize. Double click to hide.", |
|
useSplitTips : false, |
|
splitSettings : { |
north : { |
orientation: Ext.SplitBar.VERTICAL, |
placement: Ext.SplitBar.TOP, |
maxFn : 'getVMaxSize', |
minProp: 'minHeight', |
maxProp: 'maxHeight' |
}, |
south : { |
orientation: Ext.SplitBar.VERTICAL, |
placement: Ext.SplitBar.BOTTOM, |
maxFn : 'getVMaxSize', |
minProp: 'minHeight', |
maxProp: 'maxHeight' |
}, |
east : { |
orientation: Ext.SplitBar.HORIZONTAL, |
placement: Ext.SplitBar.RIGHT, |
maxFn : 'getHMaxSize', |
minProp: 'minWidth', |
maxProp: 'maxWidth' |
}, |
west : { |
orientation: Ext.SplitBar.HORIZONTAL, |
placement: Ext.SplitBar.LEFT, |
maxFn : 'getHMaxSize', |
minProp: 'minWidth', |
maxProp: 'maxWidth' |
} |
}, |
|
applyFns : { |
west : function(box){ |
if(this.isCollapsed){ |
return this.applyLayoutCollapsed(box); |
} |
var sd = this.splitEl.dom, s = sd.style; |
this.panel.setPosition(box.x, box.y); |
var sw = sd.offsetWidth; |
s.left = (box.x+box.width-sw)+'px'; |
s.top = (box.y)+'px'; |
s.height = Math.max(0, box.height)+'px'; |
this.panel.setSize(box.width-sw, box.height); |
}, |
east : function(box){ |
if(this.isCollapsed){ |
return this.applyLayoutCollapsed(box); |
} |
var sd = this.splitEl.dom, s = sd.style; |
var sw = sd.offsetWidth; |
this.panel.setPosition(box.x+sw, box.y); |
s.left = (box.x)+'px'; |
s.top = (box.y)+'px'; |
s.height = Math.max(0, box.height)+'px'; |
this.panel.setSize(box.width-sw, box.height); |
}, |
north : function(box){ |
if(this.isCollapsed){ |
return this.applyLayoutCollapsed(box); |
} |
var sd = this.splitEl.dom, s = sd.style; |
var sh = sd.offsetHeight; |
this.panel.setPosition(box.x, box.y); |
s.left = (box.x)+'px'; |
s.top = (box.y+box.height-sh)+'px'; |
s.width = Math.max(0, box.width)+'px'; |
this.panel.setSize(box.width, box.height-sh); |
}, |
south : function(box){ |
if(this.isCollapsed){ |
return this.applyLayoutCollapsed(box); |
} |
var sd = this.splitEl.dom, s = sd.style; |
var sh = sd.offsetHeight; |
this.panel.setPosition(box.x, box.y+sh); |
s.left = (box.x)+'px'; |
s.top = (box.y)+'px'; |
s.width = Math.max(0, box.width)+'px'; |
this.panel.setSize(box.width, box.height-sh); |
} |
}, |
|
render : function(ct, p){ |
Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this, ct, p); |
|
var ps = this.position; |
|
this.splitEl = ct.createChild({ |
cls: "x-layout-split x-layout-split-"+ps, html: " ", |
id: this.panel.id + '-xsplit' |
}); |
|
if(this.collapseMode == 'mini'){ |
this.miniSplitEl = this.splitEl.createChild({ |
cls: "x-layout-mini x-layout-mini-"+ps, html: " " |
}); |
this.miniSplitEl.addClassOnOver('x-layout-mini-over'); |
this.miniSplitEl.on('click', this.onCollapseClick, this, {stopEvent:true}); |
} |
|
var s = this.splitSettings[ps]; |
|
this.split = new Ext.SplitBar(this.splitEl.dom, p.el, s.orientation); |
this.split.placement = s.placement; |
this.split.getMaximumSize = this[s.maxFn].createDelegate(this); |
this.split.minSize = this.minSize || this[s.minProp]; |
this.split.on("beforeapply", this.onSplitMove, this); |
this.split.useShim = this.useShim === true; |
this.maxSize = this.maxSize || this[s.maxProp]; |
|
if(p.hidden){ |
this.splitEl.hide(); |
} |
|
if(this.useSplitTips){ |
this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip : this.splitTip; |
} |
if(this.collapsible){ |
this.splitEl.on("dblclick", this.onCollapseClick, this); |
} |
}, |
|
getSize : function(){ |
if(this.isCollapsed){ |
return this.collapsedEl.getSize(); |
} |
var s = this.panel.getSize(); |
if(this.position == 'north' || this.position == 'south'){ |
s.height += this.splitEl.dom.offsetHeight; |
}else{ |
s.width += this.splitEl.dom.offsetWidth; |
} |
return s; |
}, |
|
getHMaxSize : function(){ |
var cmax = this.maxSize || 10000; |
var center = this.layout.center; |
return Math.min(cmax, (this.el.getWidth()+center.el.getWidth())-center.getMinWidth()); |
}, |
|
getVMaxSize : function(){ |
var cmax = this.maxSize || 10000; |
var center = this.layout.center; |
return Math.min(cmax, (this.el.getHeight()+center.el.getHeight())-center.getMinHeight()); |
}, |
|
onSplitMove : function(split, newSize){ |
var s = this.panel.getSize(); |
this.lastSplitSize = newSize; |
if(this.position == 'north' || this.position == 'south'){ |
this.panel.setSize(s.width, newSize); |
this.state.height = newSize; |
}else{ |
this.panel.setSize(newSize, s.height); |
this.state.width = newSize; |
} |
this.layout.layout(); |
this.panel.saveState(); |
return false; |
}, |
|
|
getSplitBar : function(){ |
return this.split; |
} |
}); |
|
Ext.Container.LAYOUTS['border'] = Ext.layout.BorderLayout; |
|
Ext.layout.FormLayout = Ext.extend(Ext.layout.AnchorLayout, { |
|
|
|
labelSeparator : ':', |
|
getAnchorViewSize : function(ct, target){ |
return ct.body.getStyleSize(); |
}, |
|
setContainer : function(ct){ |
Ext.layout.FormLayout.superclass.setContainer.call(this, ct); |
|
if(ct.labelAlign){ |
ct.addClass('x-form-label-'+ct.labelAlign); |
} |
|
if(ct.hideLabels){ |
this.labelStyle = "display:none"; |
this.elementStyle = "padding-left:0;"; |
this.labelAdjust = 0; |
}else{ |
this.labelSeparator = ct.labelSeparator || this.labelSeparator; |
ct.labelWidth = ct.labelWidth || 100; |
if(typeof ct.labelWidth == 'number'){ |
var pad = (typeof ct.labelPad == 'number' ? ct.labelPad : 5); |
this.labelAdjust = ct.labelWidth+pad; |
this.labelStyle = "width:"+ct.labelWidth+"px;"; |
this.elementStyle = "padding-left:"+(ct.labelWidth+pad)+'px'; |
} |
if(ct.labelAlign == 'top'){ |
this.labelStyle = "width:auto;"; |
this.labelAdjust = 0; |
this.elementStyle = "padding-left:0;"; |
} |
} |
|
if(!this.fieldTpl){ |
var t = new Ext.Template( |
'<div class="x-form-item {5}" tabIndex="-1">', |
'<label for="{0}" style="{2}" class="x-form-item-label">{1}{4}</label>', |
'<div class="x-form-element" id="x-form-el-{0}" style="{3}">', |
'</div><div class="{6}"></div>', |
'</div>' |
); |
t.disableFormats = true; |
t.compile(); |
Ext.layout.FormLayout.prototype.fieldTpl = t; |
} |
}, |
|
renderItem : function(c, position, target){ |
if(c && !c.rendered && c.isFormField && c.inputType != 'hidden'){ |
var args = [ |
c.id, c.fieldLabel, |
c.labelStyle||this.labelStyle||'', |
this.elementStyle||'', |
typeof c.labelSeparator == 'undefined' ? this.labelSeparator : c.labelSeparator, |
(c.itemCls||this.container.itemCls||'') + (c.hideLabel ? ' x-hide-label' : ''), |
c.clearCls || 'x-form-clear-left' |
]; |
if(typeof position == 'number'){ |
position = target.dom.childNodes[position] || null; |
} |
if(position){ |
this.fieldTpl.insertBefore(position, args); |
}else{ |
this.fieldTpl.append(target, args); |
} |
c.render('x-form-el-'+c.id); |
}else { |
Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments); |
} |
}, |
|
adjustWidthAnchor : function(value, comp){ |
return value - (comp.isFormField ? (comp.hideLabel ? 0 : this.labelAdjust) : 0); |
}, |
|
isValidParent : function(c, target){ |
return true; |
} |
|
|
}); |
|
Ext.Container.LAYOUTS['form'] = Ext.layout.FormLayout; |
|
Ext.layout.Accordion = Ext.extend(Ext.layout.FitLayout, { |
|
fill : true, |
|
autoWidth : true, |
|
titleCollapse : true, |
|
hideCollapseTool : false, |
|
collapseFirst : false, |
|
animate : false, |
|
sequence : false, |
|
activeOnTop : false, |
|
renderItem : function(c){ |
if(this.animate === false){ |
c.animCollapse = false; |
} |
c.collapsible = true; |
if(this.autoWidth){ |
c.autoWidth = true; |
} |
if(this.titleCollapse){ |
c.titleCollapse = true; |
} |
if(this.hideCollapseTool){ |
c.hideCollapseTool = true; |
} |
if(this.collapseFirst !== undefined){ |
c.collapseFirst = this.collapseFirst; |
} |
if(!this.activeItem && !c.collapsed){ |
this.activeItem = c; |
}else if(this.activeItem){ |
c.collapsed = true; |
} |
Ext.layout.Accordion.superclass.renderItem.apply(this, arguments); |
c.header.addClass('x-accordion-hd'); |
c.on('beforeexpand', this.beforeExpand, this); |
}, |
|
|
beforeExpand : function(p, anim){ |
var ai = this.activeItem; |
if(ai){ |
if(this.sequence){ |
delete this.activeItem; |
ai.collapse({callback:function(){ |
p.expand(anim || true); |
}, scope: this}); |
return false; |
}else{ |
ai.collapse(this.animate); |
} |
} |
this.activeItem = p; |
if(this.activeOnTop){ |
p.el.dom.parentNode.insertBefore(p.el.dom, p.el.dom.parentNode.firstChild); |
} |
this.layout(); |
}, |
|
|
setItemSize : function(item, size){ |
if(this.fill && item){ |
var items = this.container.items.items; |
var hh = 0; |
for(var i = 0, len = items.length; i < len; i++){ |
var p = items[i]; |
if(p != item){ |
hh += (p.getSize().height - p.bwrap.getHeight()); |
} |
} |
size.height -= hh; |
item.setSize(size); |
} |
} |
}); |
Ext.Container.LAYOUTS['accordion'] = Ext.layout.Accordion; |
|
Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, { |
|
|
|
monitorResize:false, |
|
|
setContainer : function(ct){ |
Ext.layout.TableLayout.superclass.setContainer.call(this, ct); |
|
this.currentRow = 0; |
this.currentColumn = 0; |
this.cells = []; |
}, |
|
|
onLayout : function(ct, target){ |
var cs = ct.items.items, len = cs.length, c, i; |
|
if(!this.table){ |
target.addClass('x-table-layout-ct'); |
|
this.table = target.createChild( |
{tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, null, true); |
|
this.renderAll(ct, target); |
} |
}, |
|
|
getRow : function(index){ |
var row = this.table.tBodies[0].childNodes[index]; |
if(!row){ |
row = document.createElement('tr'); |
this.table.tBodies[0].appendChild(row); |
} |
return row; |
}, |
|
|
getNextCell : function(c){ |
var cell = this.getNextNonSpan(this.currentColumn, this.currentRow); |
var curCol = this.currentColumn = cell[0], curRow = this.currentRow = cell[1]; |
for(var rowIndex = curRow; rowIndex < curRow + (c.rowspan || 1); rowIndex++){ |
if(!this.cells[rowIndex]){ |
this.cells[rowIndex] = []; |
} |
for(var colIndex = curCol; colIndex < curCol + (c.colspan || 1); colIndex++){ |
this.cells[rowIndex][colIndex] = true; |
} |
} |
var td = document.createElement('td'); |
if(c.cellId){ |
td.id = c.cellId; |
} |
var cls = 'x-table-layout-cell'; |
if(c.cellCls){ |
cls += ' ' + c.cellCls; |
} |
td.className = cls; |
if(c.colspan){ |
td.colSpan = c.colspan; |
} |
if(c.rowspan){ |
td.rowSpan = c.rowspan; |
} |
this.getRow(curRow).appendChild(td); |
return td; |
}, |
|
|
getNextNonSpan: function(colIndex, rowIndex){ |
var cols = this.columns; |
while((cols && colIndex >= cols) || (this.cells[rowIndex] && this.cells[rowIndex][colIndex])) { |
if(cols && colIndex >= cols){ |
rowIndex++; |
colIndex = 0; |
}else{ |
colIndex++; |
} |
} |
return [colIndex, rowIndex]; |
}, |
|
|
renderItem : function(c, position, target){ |
if(c && !c.rendered){ |
c.render(this.getNextCell(c)); |
} |
}, |
|
|
isValidParent : function(c, target){ |
return true; |
} |
|
|
}); |
|
Ext.Container.LAYOUTS['table'] = Ext.layout.TableLayout; |
|
Ext.layout.AbsoluteLayout = Ext.extend(Ext.layout.AnchorLayout, { |
extraCls: 'x-abs-layout-item', |
isForm: false, |
|
setContainer : function(ct){ |
Ext.layout.AbsoluteLayout.superclass.setContainer.call(this, ct); |
if(ct.isXType('form')){ |
this.isForm = true; |
} |
}, |
|
onLayout : function(ct, target){ |
if(this.isForm){ ct.body.position(); } else { target.position(); } |
Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, ct, target); |
}, |
|
|
getAnchorViewSize : function(ct, target){ |
return this.isForm ? ct.body.getStyleSize() : Ext.layout.AbsoluteLayout.superclass.getAnchorViewSize.call(this, ct, target); |
}, |
|
|
isValidParent : function(c, target){ |
return this.isForm ? true : Ext.layout.AbsoluteLayout.superclass.isValidParent.call(this, c, target); |
}, |
|
|
adjustWidthAnchor : function(value, comp){ |
return value ? value - comp.getPosition(true)[0] : value; |
}, |
|
|
adjustHeightAnchor : function(value, comp){ |
return value ? value - comp.getPosition(true)[1] : value; |
} |
|
}); |
Ext.Container.LAYOUTS['absolute'] = Ext.layout.AbsoluteLayout; |
|
Ext.Viewport = Ext.extend(Ext.Container, { |
|
|
|
|
|
|
|
|
|
|
|
|
initComponent : function() { |
Ext.Viewport.superclass.initComponent.call(this); |
document.getElementsByTagName('html')[0].className += ' x-viewport'; |
this.el = Ext.getBody(); |
this.el.setHeight = Ext.emptyFn; |
this.el.setWidth = Ext.emptyFn; |
this.el.setSize = Ext.emptyFn; |
this.el.dom.scroll = 'no'; |
this.allowDomMove = false; |
this.autoWidth = true; |
this.autoHeight = true; |
Ext.EventManager.onWindowResize(this.fireResize, this); |
this.renderTo = this.el; |
}, |
|
fireResize : function(w, h){ |
this.fireEvent('resize', this, w, h, w, h); |
} |
}); |
Ext.reg('viewport', Ext.Viewport); |
|
Ext.Panel = Ext.extend(Ext.Container, { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
baseCls : 'x-panel', |
|
collapsedCls : 'x-panel-collapsed', |
|
maskDisabled: true, |
|
animCollapse: Ext.enableFx, |
|
headerAsText: true, |
|
buttonAlign: 'right', |
|
collapsed : false, |
|
collapseFirst: true, |
|
minButtonWidth:75, |
|
elements : 'body', |
|
toolTarget : 'header', |
collapseEl : 'bwrap', |
slideAnchor : 't', |
|
deferHeight: true, |
expandDefaults: { |
duration:.25 |
}, |
collapseDefaults: { |
duration:.25 |
}, |
|
initComponent : function(){ |
Ext.Panel.superclass.initComponent.call(this); |
|
this.addEvents( |
|
'bodyresize', |
|
'titlechange', |
|
'collapse', |
|
'expand', |
|
'beforecollapse', |
|
'beforeexpand', |
|
'beforeclose', |
|
'close', |
|
'activate', |
|
'deactivate' |
); |
|
if(this.tbar){ |
this.elements += ',tbar'; |
if(typeof this.tbar == 'object'){ |
this.topToolbar = this.tbar; |
} |
delete this.tbar; |
} |
if(this.bbar){ |
this.elements += ',bbar'; |
if(typeof this.bbar == 'object'){ |
this.bottomToolbar = this.bbar; |
} |
delete this.bbar; |
} |
|
if(this.header === true){ |
this.elements += ',header'; |
delete this.header; |
}else if(this.title && this.header !== false){ |
this.elements += ',header'; |
} |
|
if(this.footer === true){ |
this.elements += ',footer'; |
delete this.footer; |
} |
|
if(this.buttons){ |
var btns = this.buttons; |
|
this.buttons = []; |
for(var i = 0, len = btns.length; i < len; i++) { |
if(btns[i].render){ this.buttons.push(btns[i]); |
}else{ |
this.addButton(btns[i]); |
} |
} |
} |
if(this.autoLoad){ |
this.on('render', this.doAutoLoad, this, {delay:10}); |
} |
}, |
|
createElement : function(name, pnode){ |
if(this[name]){ |
pnode.appendChild(this[name].dom); |
return; |
} |
|
if(name === 'bwrap' || this.elements.indexOf(name) != -1){ |
if(this[name+'Cfg']){ |
this[name] = Ext.fly(pnode).createChild(this[name+'Cfg']); |
}else{ |
var el = document.createElement('div'); |
el.className = this[name+'Cls']; |
this[name] = Ext.get(pnode.appendChild(el)); |
} |
} |
}, |
|
onRender : function(ct, position){ |
Ext.Panel.superclass.onRender.call(this, ct, position); |
|
this.createClasses(); |
|
if(this.el){ this.el.addClass(this.baseCls); |
this.header = this.el.down('.'+this.headerCls); |
this.bwrap = this.el.down('.'+this.bwrapCls); |
var cp = this.bwrap ? this.bwrap : this.el; |
this.tbar = cp.down('.'+this.tbarCls); |
this.body = cp.down('.'+this.bodyCls); |
this.bbar = cp.down('.'+this.bbarCls); |
this.footer = cp.down('.'+this.footerCls); |
this.fromMarkup = true; |
}else{ |
this.el = ct.createChild({ |
id: this.id, |
cls: this.baseCls |
}, position); |
} |
var el = this.el, d = el.dom; |
|
if(this.cls){ |
this.el.addClass(this.cls); |
} |
|
if(this.buttons){ |
this.elements += ',footer'; |
} |
|
|
if(this.frame){ |
el.insertHtml('afterBegin', String.format(Ext.Element.boxMarkup, this.baseCls)); |
|
this.createElement('header', d.firstChild.firstChild.firstChild); |
this.createElement('bwrap', d); |
|
var bw = this.bwrap.dom; |
var ml = d.childNodes[1], bl = d.childNodes[2]; |
bw.appendChild(ml); |
bw.appendChild(bl); |
|
var mc = bw.firstChild.firstChild.firstChild; |
this.createElement('tbar', mc); |
this.createElement('body', mc); |
this.createElement('bbar', mc); |
this.createElement('footer', bw.lastChild.firstChild.firstChild); |
|
if(!this.footer){ |
this.bwrap.dom.lastChild.className += ' x-panel-nofooter'; |
} |
}else{ |
this.createElement('header', d); |
this.createElement('bwrap', d); |
|
var bw = this.bwrap.dom; |
this.createElement('tbar', bw); |
this.createElement('body', bw); |
this.createElement('bbar', bw); |
this.createElement('footer', bw); |
|
if(!this.header){ |
this.body.addClass(this.bodyCls + '-noheader'); |
if(this.tbar){ |
this.tbar.addClass(this.tbarCls + '-noheader'); |
} |
} |
} |
|
if(this.border === false){ |
this.el.addClass(this.baseCls + '-noborder'); |
this.body.addClass(this.bodyCls + '-noborder'); |
if(this.header){ |
this.header.addClass(this.headerCls + '-noborder'); |
} |
if(this.footer){ |
this.footer.addClass(this.footerCls + '-noborder'); |
} |
if(this.tbar){ |
this.tbar.addClass(this.tbarCls + '-noborder'); |
} |
if(this.bbar){ |
this.bbar.addClass(this.bbarCls + '-noborder'); |
} |
} |
|
if(this.bodyBorder === false){ |
this.body.addClass(this.bodyCls + '-noborder'); |
} |
|
if(this.bodyStyle){ |
this.body.applyStyles(this.bodyStyle); |
} |
|
this.bwrap.enableDisplayMode('block'); |
|
if(this.header){ |
this.header.unselectable(); |
|
if(this.headerAsText){ |
this.header.dom.innerHTML = |
'<span class="' + this.headerTextCls + '">'+this.header.dom.innerHTML+'</span>'; |
|
if(this.iconCls){ |
this.setIconClass(this.iconCls); |
} |
} |
} |
|
if(this.floating){ |
this.makeFloating(this.floating); |
} |
|
if(this.collapsible){ |
this.tools = this.tools ? this.tools.slice(0) : []; |
if(!this.hideCollapseTool){ |
this.tools[this.collapseFirst?'unshift':'push']({ |
id: 'toggle', |
handler : this.toggleCollapse, |
scope: this |
}); |
} |
if(this.titleCollapse && this.header){ |
this.header.on('click', this.toggleCollapse, this); |
this.header.setStyle('cursor', 'pointer'); |
} |
} |
if(this.tools){ |
var ts = this.tools; |
this.tools = {}; |
this.addTool.apply(this, ts); |
}else{ |
this.tools = {}; |
} |
|
if(this.buttons && this.buttons.length > 0){ |
var tb = this.footer.createChild({cls:'x-panel-btns-ct', cn: { |
cls:"x-panel-btns x-panel-btns-"+this.buttonAlign, |
html:'<table cellspacing="0"><tbody><tr></tr></tbody></table><div class="x-clear"></div>' |
}}, 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-panel-btn-td'; |
b.render(tr.appendChild(td)); |
} |
} |
|
if(this.tbar && this.topToolbar){ |
if(Ext.isArray(this.topToolbar)){ |
this.topToolbar = new Ext.Toolbar(this.topToolbar); |
} |
this.topToolbar.render(this.tbar); |
} |
if(this.bbar && this.bottomToolbar){ |
if(Ext.isArray(this.bottomToolbar)){ |
this.bottomToolbar = new Ext.Toolbar(this.bottomToolbar); |
} |
this.bottomToolbar.render(this.bbar); |
} |
}, |
|
|
setIconClass : function(cls){ |
var old = this.iconCls; |
this.iconCls = cls; |
if(this.rendered && this.header){ |
if(this.frame){ |
this.header.addClass('x-panel-icon'); |
this.header.replaceClass(old, this.iconCls); |
}else{ |
var hd = this.header.dom; |
var img = hd.firstChild && String(hd.firstChild.tagName).toLowerCase() == 'img' ? hd.firstChild : null; |
if(img){ |
Ext.fly(img).replaceClass(old, this.iconCls); |
}else{ |
Ext.DomHelper.insertBefore(hd.firstChild, { |
tag:'img', src: Ext.BLANK_IMAGE_URL, cls:'x-panel-inline-icon '+this.iconCls |
}); |
} |
} |
} |
}, |
|
makeFloating : function(cfg){ |
this.floating = true; |
this.el = new Ext.Layer( |
typeof cfg == 'object' ? cfg : { |
shadow: this.shadow !== undefined ? this.shadow : 'sides', |
shadowOffset: this.shadowOffset, |
constrain:false, |
shim: this.shim === false ? false : undefined |
}, this.el |
); |
}, |
|
|
getTopToolbar : function(){ |
return this.topToolbar; |
}, |
|
|
getBottomToolbar : function(){ |
return this.bottomToolbar; |
}, |
|
|
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(bc); |
btn.ownerCt = this; |
if(!this.buttons){ |
this.buttons = []; |
} |
this.buttons.push(btn); |
return btn; |
}, |
|
addTool : function(){ |
if(!this[this.toolTarget]) { return; |
} |
if(!this.toolTemplate){ |
var tt = new Ext.Template( |
'<div class="x-tool x-tool-{id}"> </div>' |
); |
tt.disableFormats = true; |
tt.compile(); |
Ext.Panel.prototype.toolTemplate = tt; |
} |
for(var i = 0, a = arguments, len = a.length; i < len; i++) { |
var tc = a[i], overCls = 'x-tool-'+tc.id+'-over'; |
var t = this.toolTemplate.insertFirst(this[this.toolTarget], tc, true); |
this.tools[tc.id] = t; |
t.enableDisplayMode('block'); |
t.on('click', this.createToolHandler(t, tc, overCls, this)); |
if(tc.on){ |
t.on(tc.on); |
} |
if(tc.hidden){ |
t.hide(); |
} |
if(tc.qtip){ |
if(typeof tc.qtip == 'object'){ |
Ext.QuickTips.register(Ext.apply({ |
target: t.id |
}, tc.qtip)); |
} else { |
t.dom.qtip = tc.qtip; |
} |
} |
t.addClassOnOver(overCls); |
} |
}, |
|
onShow : function(){ |
if(this.floating){ |
return this.el.show(); |
} |
Ext.Panel.superclass.onShow.call(this); |
}, |
|
onHide : function(){ |
if(this.floating){ |
return this.el.hide(); |
} |
Ext.Panel.superclass.onHide.call(this); |
}, |
|
createToolHandler : function(t, tc, overCls, panel){ |
return function(e){ |
t.removeClass(overCls); |
e.stopEvent(); |
if(tc.handler){ |
tc.handler.call(tc.scope || t, e, t, panel); |
} |
}; |
}, |
|
afterRender : function(){ |
if(this.fromMarkup && this.height === undefined && !this.autoHeight){ |
this.height = this.el.getHeight(); |
} |
if(this.floating && !this.hidden && !this.initHidden){ |
this.el.show(); |
} |
if(this.title){ |
this.setTitle(this.title); |
} |
this.setAutoScroll(); |
if(this.html){ |
this.body.update(typeof this.html == 'object' ? |
Ext.DomHelper.markup(this.html) : |
this.html); |
delete this.html; |
} |
if(this.contentEl){ |
var ce = Ext.getDom(this.contentEl); |
Ext.fly(ce).removeClass(['x-hidden', 'x-hide-display']); |
this.body.dom.appendChild(ce); |
} |
if(this.collapsed){ |
this.collapsed = false; |
this.collapse(false); |
} |
Ext.Panel.superclass.afterRender.call(this); this.initEvents(); |
}, |
|
setAutoScroll : function(){ |
if(this.rendered && this.autoScroll){ |
this.body.setOverflow('auto'); |
} |
}, |
|
getKeyMap : function(){ |
if(!this.keyMap){ |
this.keyMap = new Ext.KeyMap(this.el, this.keys); |
} |
return this.keyMap; |
}, |
|
initEvents : function(){ |
if(this.keys){ |
this.getKeyMap(); |
} |
if(this.draggable){ |
this.initDraggable(); |
} |
}, |
|
initDraggable : function(){ |
this.dd = new Ext.Panel.DD(this, typeof this.draggable == 'boolean' ? null : this.draggable); |
}, |
|
beforeEffect : function(){ |
if(this.floating){ |
this.el.beforeAction(); |
} |
this.el.addClass('x-panel-animated'); |
}, |
|
afterEffect : function(){ |
this.syncShadow(); |
this.el.removeClass('x-panel-animated'); |
}, |
|
createEffect : function(a, cb, scope){ |
var o = { |
scope:scope, |
block:true |
}; |
if(a === true){ |
o.callback = cb; |
return o; |
}else if(!a.callback){ |
o.callback = cb; |
}else { o.callback = function(){ |
cb.call(scope); |
Ext.callback(a.callback, a.scope); |
}; |
} |
return Ext.applyIf(o, a); |
}, |
|
|
collapse : function(animate){ |
if(this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforecollapse', this, animate) === false){ |
return; |
} |
var doAnim = animate === true || (animate !== false && this.animCollapse); |
this.beforeEffect(); |
this.onCollapse(doAnim, animate); |
return this; |
}, |
|
onCollapse : function(doAnim, animArg){ |
if(doAnim){ |
this[this.collapseEl].slideOut(this.slideAnchor, |
Ext.apply(this.createEffect(animArg||true, this.afterCollapse, this), |
this.collapseDefaults)); |
}else{ |
this[this.collapseEl].hide(); |
this.afterCollapse(); |
} |
}, |
|
afterCollapse : function(){ |
this.collapsed = true; |
this.el.addClass(this.collapsedCls); |
this.afterEffect(); |
this.fireEvent('collapse', this); |
}, |
|
|
expand : function(animate){ |
if(!this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforeexpand', this, animate) === false){ |
return; |
} |
var doAnim = animate === true || (animate !== false && this.animCollapse); |
this.el.removeClass(this.collapsedCls); |
this.beforeEffect(); |
this.onExpand(doAnim, animate); |
return this; |
}, |
|
onExpand : function(doAnim, animArg){ |
if(doAnim){ |
this[this.collapseEl].slideIn(this.slideAnchor, |
Ext.apply(this.createEffect(animArg||true, this.afterExpand, this), |
this.expandDefaults)); |
}else{ |
this[this.collapseEl].show(); |
this.afterExpand(); |
} |
}, |
|
afterExpand : function(){ |
this.collapsed = false; |
this.afterEffect(); |
this.fireEvent('expand', this); |
}, |
|
|
toggleCollapse : function(animate){ |
this[this.collapsed ? 'expand' : 'collapse'](animate); |
return this; |
}, |
|
onDisable : function(){ |
if(this.rendered && this.maskDisabled){ |
this.el.mask(); |
} |
Ext.Panel.superclass.onDisable.call(this); |
}, |
|
onEnable : function(){ |
if(this.rendered && this.maskDisabled){ |
this.el.unmask(); |
} |
Ext.Panel.superclass.onEnable.call(this); |
}, |
|
onResize : function(w, h){ |
if(w !== undefined || h !== undefined){ |
if(!this.collapsed){ |
if(typeof w == 'number'){ |
this.body.setWidth( |
this.adjustBodyWidth(w - this.getFrameWidth())); |
}else if(w == 'auto'){ |
this.body.setWidth(w); |
} |
|
if(typeof h == 'number'){ |
this.body.setHeight( |
this.adjustBodyHeight(h - this.getFrameHeight())); |
}else if(h == 'auto'){ |
this.body.setHeight(h); |
} |
}else{ |
this.queuedBodySize = {width: w, height: h}; |
if(!this.queuedExpand && this.allowQueuedExpand !== false){ |
this.queuedExpand = true; |
this.on('expand', function(){ |
delete this.queuedExpand; |
this.onResize(this.queuedBodySize.width, this.queuedBodySize.height); |
this.doLayout(); |
}, this, {single:true}); |
} |
} |
this.fireEvent('bodyresize', this, w, h); |
} |
this.syncShadow(); |
}, |
|
adjustBodyHeight : function(h){ |
return h; |
}, |
|
adjustBodyWidth : function(w){ |
return w; |
}, |
|
onPosition : function(){ |
this.syncShadow(); |
}, |
|
onDestroy : function(){ |
if(this.tools){ |
for(var k in this.tools){ |
Ext.destroy(this.tools[k]); |
} |
} |
if(this.buttons){ |
for(var b in this.buttons){ |
Ext.destroy(this.buttons[b]); |
} |
} |
Ext.destroy( |
this.topToolbar, |
this.bottomToolbar |
); |
Ext.Panel.superclass.onDestroy.call(this); |
}, |
|
|
getFrameWidth : function(){ |
var w = this.el.getFrameWidth('lr'); |
|
if(this.frame){ |
var l = this.bwrap.dom.firstChild; |
w += (Ext.fly(l).getFrameWidth('l') + Ext.fly(l.firstChild).getFrameWidth('r')); |
var mc = this.bwrap.dom.firstChild.firstChild.firstChild; |
w += Ext.fly(mc).getFrameWidth('lr'); |
} |
return w; |
}, |
|
|
getFrameHeight : function(){ |
var h = this.el.getFrameWidth('tb'); |
h += (this.tbar ? this.tbar.getHeight() : 0) + |
(this.bbar ? this.bbar.getHeight() : 0); |
|
if(this.frame){ |
var hd = this.el.dom.firstChild; |
var ft = this.bwrap.dom.lastChild; |
h += (hd.offsetHeight + ft.offsetHeight); |
var mc = this.bwrap.dom.firstChild.firstChild.firstChild; |
h += Ext.fly(mc).getFrameWidth('tb'); |
}else{ |
h += (this.header ? this.header.getHeight() : 0) + |
(this.footer ? this.footer.getHeight() : 0); |
} |
return h; |
}, |
|
|
getInnerWidth : function(){ |
return this.getSize().width - this.getFrameWidth(); |
}, |
|
|
getInnerHeight : function(){ |
return this.getSize().height - this.getFrameHeight(); |
}, |
|
syncShadow : function(){ |
if(this.floating){ |
this.el.sync(true); |
} |
}, |
|
getLayoutTarget : function(){ |
return this.body; |
}, |
|
|
setTitle : function(title, iconCls){ |
this.title = title; |
if(this.header && this.headerAsText){ |
this.header.child('span').update(title); |
} |
if(iconCls){ |
this.setIconClass(iconCls); |
} |
this.fireEvent('titlechange', this, title); |
return this; |
}, |
|
|
getUpdater : function(){ |
return this.body.getUpdater(); |
}, |
|
|
load : function(){ |
var um = this.body.getUpdater(); |
um.update.apply(um, arguments); |
return this; |
}, |
|
beforeDestroy : function(){ |
Ext.Element.uncache( |
this.header, |
this.tbar, |
this.bbar, |
this.footer, |
this.body |
); |
}, |
|
createClasses : function(){ |
this.headerCls = this.baseCls + '-header'; |
this.headerTextCls = this.baseCls + '-header-text'; |
this.bwrapCls = this.baseCls + '-bwrap'; |
this.tbarCls = this.baseCls + '-tbar'; |
this.bodyCls = this.baseCls + '-body'; |
this.bbarCls = this.baseCls + '-bbar'; |
this.footerCls = this.baseCls + '-footer'; |
}, |
|
createGhost : function(cls, useShim, appendTo){ |
var el = document.createElement('div'); |
el.className = 'x-panel-ghost ' + (cls ? cls : ''); |
if(this.header){ |
el.appendChild(this.el.dom.firstChild.cloneNode(true)); |
} |
Ext.fly(el.appendChild(document.createElement('ul'))).setHeight(this.bwrap.getHeight()); |
el.style.width = this.el.dom.offsetWidth + 'px';; |
if(!appendTo){ |
this.container.dom.appendChild(el); |
}else{ |
Ext.getDom(appendTo).appendChild(el); |
} |
if(useShim !== false && this.el.useShim !== false){ |
var layer = new Ext.Layer({shadow:false, useDisplay:true, constrain:false}, el); |
layer.show(); |
return layer; |
}else{ |
return new Ext.Element(el); |
} |
}, |
|
doAutoLoad : function(){ |
this.body.load( |
typeof this.autoLoad == 'object' ? |
this.autoLoad : {url: this.autoLoad}); |
} |
|
|
}); |
Ext.reg('panel', Ext.Panel); |
|
|
Ext.Window = Ext.extend(Ext.Panel, { |
|
|
|
|
|
|
|
baseCls : 'x-window', |
|
resizable:true, |
|
draggable:true, |
|
closable : true, |
|
constrain:false, |
|
constrainHeader:false, |
|
plain:false, |
|
minimizable : false, |
|
maximizable : false, |
|
minHeight: 100, |
|
minWidth: 200, |
|
expandOnShow: true, |
|
closeAction: 'close', |
|
collapsible:false, |
|
initHidden : true, |
|
monitorResize : true, |
|
|
elements: 'header,body', |
|
frame:true, |
|
floating:true, |
|
initComponent : function(){ |
Ext.Window.superclass.initComponent.call(this); |
this.addEvents( |
|
|
|
'resize', |
|
'maximize', |
|
'minimize', |
|
'restore' |
); |
}, |
|
getState : function(){ |
return Ext.apply(Ext.Window.superclass.getState.call(this) || {}, this.getBox()); |
}, |
|
onRender : function(ct, position){ |
Ext.Window.superclass.onRender.call(this, ct, position); |
|
if(this.plain){ |
this.el.addClass('x-window-plain'); |
} |
|
this.focusEl = this.el.createChild({ |
tag: "a", href:"#", cls:"x-dlg-focus", |
tabIndex:"-1", html: " "}); |
this.focusEl.swallowEvent('click', true); |
|
this.proxy = this.el.createProxy("x-window-proxy"); |
this.proxy.enableDisplayMode('block'); |
|
if(this.modal){ |
this.mask = this.container.createChild({cls:"ext-el-mask"}, this.el.dom); |
this.mask.enableDisplayMode("block"); |
this.mask.hide(); |
} |
}, |
|
initEvents : function(){ |
Ext.Window.superclass.initEvents.call(this); |
if(this.animateTarget){ |
this.setAnimateTarget(this.animateTarget); |
} |
|
if(this.resizable){ |
this.resizer = new Ext.Resizable(this.el, { |
minWidth: this.minWidth, |
minHeight:this.minHeight, |
handles: this.resizeHandles || "all", |
pinned: true, |
resizeElement : this.resizerAction |
}); |
this.resizer.window = this; |
this.resizer.on("beforeresize", this.beforeResize, this); |
} |
|
if(this.draggable){ |
this.header.addClass("x-window-draggable"); |
} |
this.initTools(); |
|
this.el.on("mousedown", this.toFront, this); |
this.manager = this.manager || Ext.WindowMgr; |
this.manager.register(this); |
this.hidden = true; |
if(this.maximized){ |
this.maximized = false; |
this.maximize(); |
} |
if(this.closable){ |
var km = this.getKeyMap(); |
km.on(27, this.onEsc, this); |
km.disable(); |
} |
}, |
|
initDraggable : function(){ |
this.dd = new Ext.Window.DD(this); |
}, |
|
onEsc : function(){ |
this[this.closeAction](); |
}, |
|
beforeDestroy : function(){ |
Ext.destroy( |
this.resizer, |
this.dd, |
this.proxy, |
this.mask |
); |
Ext.Window.superclass.beforeDestroy.call(this); |
}, |
|
onDestroy : function(){ |
if(this.manager){ |
this.manager.unregister(this); |
} |
Ext.Window.superclass.onDestroy.call(this); |
}, |
|
initTools : function(){ |
if(this.minimizable){ |
this.addTool({ |
id: 'minimize', |
handler: this.minimize.createDelegate(this, []) |
}); |
} |
if(this.maximizable){ |
this.addTool({ |
id: 'maximize', |
handler: this.maximize.createDelegate(this, []) |
}); |
this.addTool({ |
id: 'restore', |
handler: this.restore.createDelegate(this, []), |
hidden:true |
}); |
this.header.on('dblclick', this.toggleMaximize, this); |
} |
if(this.closable){ |
this.addTool({ |
id: 'close', |
handler: this[this.closeAction].createDelegate(this, []) |
}); |
} |
}, |
|
resizerAction : function(){ |
var box = this.proxy.getBox(); |
this.proxy.hide(); |
this.window.handleResize(box); |
return box; |
}, |
|
beforeResize : function(){ |
this.resizer.minHeight = Math.max(this.minHeight, this.getFrameHeight() + 40); this.resizer.minWidth = Math.max(this.minWidth, this.getFrameWidth() + 40); |
this.resizeBox = this.el.getBox(); |
}, |
|
updateHandles : function(){ |
if(Ext.isIE && this.resizer){ |
this.resizer.syncHandleHeight(); |
this.el.repaint(); |
} |
}, |
|
handleResize : function(box){ |
var rz = this.resizeBox; |
if(rz.x != box.x || rz.y != box.y){ |
this.updateBox(box); |
}else{ |
this.setSize(box); |
} |
this.focus(); |
this.updateHandles(); |
this.saveState(); |
this.fireEvent("resize", this, box.width, box.height); |
}, |
|
|
focus : function(){ |
var f = this.focusEl, db = this.defaultButton, t = typeof db; |
if(t != 'undefined'){ |
if(t == 'number'){ |
f = this.buttons[db]; |
}else if(t == 'string'){ |
f = Ext.getCmp(db); |
}else{ |
f = db; |
} |
} |
f.focus.defer(10, f); |
}, |
|
|
setAnimateTarget : function(el){ |
el = Ext.get(el); |
this.animateTarget = el; |
}, |
|
beforeShow : function(){ |
delete this.el.lastXY; |
delete this.el.lastLT; |
if(this.x === undefined || this.y === undefined){ |
var xy = this.el.getAlignToXY(this.container, 'c-c'); |
var pos = this.el.translatePoints(xy[0], xy[1]); |
this.x = this.x === undefined? pos.left : this.x; |
this.y = this.y === undefined? pos.top : this.y; |
} |
this.el.setLeftTop(this.x, this.y); |
|
if(this.expandOnShow){ |
this.expand(false); |
} |
|
if(this.modal){ |
Ext.getBody().addClass("x-body-masked"); |
this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); |
this.mask.show(); |
} |
}, |
|
|
show : function(animateTarget, cb, scope){ |
if(!this.rendered){ |
this.render(Ext.getBody()); |
} |
if(this.hidden === false){ |
this.toFront(); |
return; |
} |
if(this.fireEvent("beforeshow", this) === false){ |
return; |
} |
if(cb){ |
this.on('show', cb, scope, {single:true}); |
} |
this.hidden = false; |
if(animateTarget !== undefined){ |
this.setAnimateTarget(animateTarget); |
} |
this.beforeShow(); |
if(this.animateTarget){ |
this.animShow(); |
}else{ |
this.afterShow(); |
} |
}, |
|
afterShow : function(){ |
this.proxy.hide(); |
this.el.setStyle('display', 'block'); |
this.el.show(); |
if(this.maximized){ |
this.fitContainer(); |
} |
if(Ext.isMac && Ext.isGecko){ this.cascade(this.setAutoScroll); |
} |
|
if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){ |
Ext.EventManager.onWindowResize(this.onWindowResize, this); |
} |
this.doConstrain(); |
if(this.layout){ |
this.doLayout(); |
} |
if(this.keyMap){ |
this.keyMap.enable(); |
} |
this.toFront(); |
this.updateHandles(); |
this.fireEvent("show", this); |
}, |
|
animShow : function(){ |
this.proxy.show(); |
this.proxy.setBox(this.animateTarget.getBox()); |
this.proxy.setOpacity(0); |
var b = this.getBox(false); |
b.callback = this.afterShow; |
b.scope = this; |
b.duration = .25; |
b.easing = 'easeNone'; |
b.opacity = .5; |
b.block = true; |
this.el.setStyle('display', 'none'); |
this.proxy.shift(b); |
}, |
|
|
hide : function(animateTarget, cb, scope){ |
if(this.hidden || this.fireEvent("beforehide", this) === false){ |
return; |
} |
if(cb){ |
this.on('hide', cb, scope, {single:true}); |
} |
this.hidden = true; |
if(animateTarget !== undefined){ |
this.setAnimateTarget(animateTarget); |
} |
if(this.animateTarget){ |
this.animHide(); |
}else{ |
this.el.hide(); |
this.afterHide(); |
} |
}, |
|
afterHide : function(){ |
this.proxy.hide(); |
if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){ |
Ext.EventManager.removeResizeListener(this.onWindowResize, this); |
} |
if(this.modal){ |
this.mask.hide(); |
Ext.getBody().removeClass("x-body-masked"); |
} |
if(this.keyMap){ |
this.keyMap.disable(); |
} |
this.fireEvent("hide", this); |
}, |
|
animHide : function(){ |
this.proxy.setOpacity(.5); |
this.proxy.show(); |
var tb = this.getBox(false); |
this.proxy.setBox(tb); |
this.el.hide(); |
var b = this.animateTarget.getBox(); |
b.callback = this.afterHide; |
b.scope = this; |
b.duration = .25; |
b.easing = 'easeNone'; |
b.block = true; |
b.opacity = 0; |
this.proxy.shift(b); |
}, |
|
onWindowResize : function(){ |
if(this.maximized){ |
this.fitContainer(); |
} |
if(this.modal){ |
this.mask.setSize('100%', '100%'); |
var force = this.mask.dom.offsetHeight; |
this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); |
} |
this.doConstrain(); |
}, |
|
doConstrain : function(){ |
if(this.constrain || this.constrainHeader){ |
var offsets; |
if(this.constrain){ |
offsets = { |
right:this.el.shadowOffset, |
left:this.el.shadowOffset, |
bottom:this.el.shadowOffset |
}; |
}else { |
var s = this.getSize(); |
offsets = { |
right:-(s.width - 100), |
bottom:-(s.height - 25) |
}; |
} |
|
var xy = this.el.getConstrainToXY(this.container, true, offsets); |
if(xy){ |
this.setPosition(xy[0], xy[1]); |
} |
} |
}, |
|
ghost : function(cls){ |
var ghost = this.createGhost(cls); |
var box = this.getBox(true); |
ghost.setLeftTop(box.x, box.y); |
ghost.setWidth(box.width); |
this.el.hide(); |
this.activeGhost = ghost; |
return ghost; |
}, |
|
unghost : function(show, matchPosition){ |
if(show !== false){ |
this.el.show(); |
this.focus(); |
if(Ext.isMac && Ext.isGecko){ this.cascade(this.setAutoScroll); |
} |
} |
if(matchPosition !== false){ |
this.setPosition(this.activeGhost.getLeft(true), this.activeGhost.getTop(true)); |
} |
this.activeGhost.hide(); |
this.activeGhost.remove(); |
delete this.activeGhost; |
}, |
|
|
minimize : function(){ |
this.fireEvent('minimize', this); |
}, |
|
|
close : function(){ |
if(this.fireEvent("beforeclose", this) !== false){ |
this.hide(null, function(){ |
this.fireEvent('close', this); |
this.destroy(); |
}, this); |
} |
}, |
|
|
maximize : function(){ |
if(!this.maximized){ |
this.expand(false); |
this.restoreSize = this.getSize(); |
this.restorePos = this.getPosition(true); |
this.tools.maximize.hide(); |
this.tools.restore.show(); |
this.maximized = true; |
this.el.disableShadow(); |
|
if(this.dd){ |
this.dd.lock(); |
} |
if(this.collapsible){ |
this.tools.toggle.hide(); |
} |
this.el.addClass('x-window-maximized'); |
this.container.addClass('x-window-maximized-ct'); |
|
this.setPosition(0, 0); |
this.fitContainer(); |
this.fireEvent('maximize', this); |
} |
}, |
|
|
restore : function(){ |
if(this.maximized){ |
this.el.removeClass('x-window-maximized'); |
this.tools.restore.hide(); |
this.tools.maximize.show(); |
this.setPosition(this.restorePos[0], this.restorePos[1]); |
this.setSize(this.restoreSize.width, this.restoreSize.height); |
delete this.restorePos; |
delete this.restoreSize; |
this.maximized = false; |
this.el.enableShadow(true); |
|
if(this.dd){ |
this.dd.unlock(); |
} |
if(this.collapsible){ |
this.tools.toggle.show(); |
} |
this.container.removeClass('x-window-maximized-ct'); |
|
this.doConstrain(); |
this.fireEvent('restore', this); |
} |
}, |
|
|
toggleMaximize : function(){ |
this[this.maximized ? 'restore' : 'maximize'](); |
}, |
|
fitContainer : function(){ |
var vs = this.container.getViewSize(); |
this.setSize(vs.width, vs.height); |
}, |
|
setZIndex : function(index){ |
if(this.modal){ |
this.mask.setStyle("z-index", index); |
} |
this.el.setZIndex(++index); |
index += 5; |
|
if(this.resizer){ |
this.resizer.proxy.setStyle("z-index", ++index); |
} |
|
this.lastZIndex = index; |
}, |
|
|
alignTo : function(element, position, offsets){ |
var xy = this.el.getAlignToXY(element, position, offsets); |
this.setPagePosition(xy[0], xy[1]); |
return this; |
}, |
|
|
anchorTo : function(el, alignment, offsets, monitorScroll, _pname){ |
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); |
this[_pname] = action; |
return this; |
}, |
|
|
toFront : function(){ |
if(this.manager.bringToFront(this)){ |
this.focus(); |
} |
return this; |
}, |
|
|
setActive : function(active){ |
if(active){ |
if(!this.maximized){ |
this.el.enableShadow(true); |
} |
this.fireEvent('activate', this); |
}else{ |
this.el.disableShadow(); |
this.fireEvent('deactivate', this); |
} |
}, |
|
|
toBack : function(){ |
this.manager.sendToBack(this); |
return this; |
}, |
|
|
center : function(){ |
var xy = this.el.getAlignToXY(this.container, 'c-c'); |
this.setPagePosition(xy[0], xy[1]); |
return this; |
} |
}); |
Ext.reg('window', Ext.Window); |
|
Ext.Window.DD = function(win){ |
this.win = win; |
Ext.Window.DD.superclass.constructor.call(this, win.el.id, 'WindowDD-'+win.id); |
this.setHandleElId(win.header.id); |
this.scroll = false; |
}; |
|
Ext.extend(Ext.Window.DD, Ext.dd.DD, { |
moveOnly:true, |
headerOffsets:[100, 25], |
startDrag : function(){ |
var w = this.win; |
this.proxy = w.ghost(); |
if(w.constrain !== false){ |
var so = w.el.shadowOffset; |
this.constrainTo(w.container, {right: so, left: so, bottom: so}); |
}else if(w.constrainHeader !== false){ |
var s = this.proxy.getSize(); |
this.constrainTo(w.container, {right: -(s.width-this.headerOffsets[0]), bottom: -(s.height-this.headerOffsets[1])}); |
} |
}, |
b4Drag : Ext.emptyFn, |
|
onDrag : function(e){ |
this.alignElWithMouse(this.proxy, e.getPageX(), e.getPageY()); |
}, |
|
endDrag : function(e){ |
this.win.unghost(); |
this.win.saveState(); |
} |
}); |
|
Ext.WindowGroup = function(){ |
var list = {}; |
var accessList = []; |
var front = null; |
|
var sortWindows = function(d1, d2){ |
return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1; |
}; |
|
var orderWindows = function(){ |
var a = accessList, len = a.length; |
if(len > 0){ |
a.sort(sortWindows); |
var seed = a[0].manager.zseed; |
for(var i = 0; i < len; i++){ |
var win = a[i]; |
if(win && !win.hidden){ |
win.setZIndex(seed + (i*10)); |
} |
} |
} |
activateLast(); |
}; |
|
var setActiveWin = function(win){ |
if(win != front){ |
if(front){ |
front.setActive(false); |
} |
front = win; |
if(win){ |
win.setActive(true); |
} |
} |
}; |
|
var activateLast = function(){ |
for(var i = accessList.length-1; i >=0; --i) { |
if(!accessList[i].hidden){ |
setActiveWin(accessList[i]); |
return; |
} |
} |
setActiveWin(null); |
}; |
|
return { |
|
zseed : 9000, |
|
register : function(win){ |
list[win.id] = win; |
accessList.push(win); |
win.on('hide', activateLast); |
}, |
|
unregister : function(win){ |
delete list[win.id]; |
win.un('hide', activateLast); |
accessList.remove(win); |
}, |
|
|
get : function(id){ |
return typeof id == "object" ? id : list[id]; |
}, |
|
|
bringToFront : function(win){ |
win = this.get(win); |
if(win != front){ |
win._lastAccess = new Date().getTime(); |
orderWindows(); |
return true; |
} |
return false; |
}, |
|
|
sendToBack : function(win){ |
win = this.get(win); |
win._lastAccess = -(new Date().getTime()); |
orderWindows(); |
return win; |
}, |
|
|
hideAll : function(){ |
for(var id in list){ |
if(list[id] && typeof list[id] != "function" && list[id].isVisible()){ |
list[id].hide(); |
} |
} |
}, |
|
|
getActive : function(){ |
return front; |
}, |
|
|
getBy : function(fn, scope){ |
var r = []; |
for(var i = accessList.length-1; i >=0; --i) { |
var win = accessList[i]; |
if(fn.call(scope||win, win) !== false){ |
r.push(win); |
} |
} |
return r; |
}, |
|
|
each : function(fn, scope){ |
for(var id in list){ |
if(list[id] && typeof list[id] != "function"){ |
if(fn.call(scope || list[id], list[id]) === false){ |
return; |
} |
} |
} |
} |
}; |
}; |
|
|
|
Ext.WindowMgr = new Ext.WindowGroup(); |
|
Ext.dd.PanelProxy = function(panel, config){ |
this.panel = panel; |
this.id = this.panel.id +'-ddproxy'; |
Ext.apply(this, config); |
}; |
|
Ext.dd.PanelProxy.prototype = { |
|
insertProxy : true, |
|
|
setStatus : Ext.emptyFn, |
reset : Ext.emptyFn, |
update : Ext.emptyFn, |
stop : Ext.emptyFn, |
sync: Ext.emptyFn, |
|
|
getEl : function(){ |
return this.ghost; |
}, |
|
|
getGhost : function(){ |
return this.ghost; |
}, |
|
|
getProxy : function(){ |
return this.proxy; |
}, |
|
|
hide : function(){ |
if(this.ghost){ |
if(this.proxy){ |
this.proxy.remove(); |
delete this.proxy; |
} |
this.panel.el.dom.style.display = ''; |
this.ghost.remove(); |
delete this.ghost; |
} |
}, |
|
|
show : function(){ |
if(!this.ghost){ |
this.ghost = this.panel.createGhost(undefined, undefined, Ext.getBody()); |
this.ghost.setXY(this.panel.el.getXY()) |
if(this.insertProxy){ |
this.proxy = this.panel.el.insertSibling({cls:'x-panel-dd-spacer'}); |
this.proxy.setSize(this.panel.getSize()); |
} |
this.panel.el.dom.style.display = 'none'; |
} |
}, |
|
|
repair : function(xy, callback, scope){ |
this.hide(); |
if(typeof callback == "function"){ |
callback.call(scope || this); |
} |
}, |
|
|
moveProxy : function(parentNode, before){ |
if(this.proxy){ |
parentNode.insertBefore(this.proxy.dom, before); |
} |
} |
}; |
|
|
Ext.Panel.DD = function(panel, cfg){ |
this.panel = panel; |
this.dragData = {panel: panel}; |
this.proxy = new Ext.dd.PanelProxy(panel, cfg); |
Ext.Panel.DD.superclass.constructor.call(this, panel.el, cfg); |
this.setHandleElId(panel.header.id); |
panel.header.setStyle('cursor', 'move'); |
this.scroll = false; |
}; |
|
Ext.extend(Ext.Panel.DD, Ext.dd.DragSource, { |
showFrame: Ext.emptyFn, |
startDrag: Ext.emptyFn, |
b4StartDrag: function(x, y) { |
this.proxy.show(); |
}, |
b4MouseDown: function(e) { |
var x = e.getPageX(); |
var y = e.getPageY(); |
this.autoOffset(x, y); |
}, |
onInitDrag : function(x, y){ |
this.onStartDrag(x, y); |
return true; |
}, |
createFrame : Ext.emptyFn, |
getDragEl : function(e){ |
return this.proxy.ghost.dom; |
}, |
endDrag : function(e){ |
this.proxy.hide(); |
this.panel.saveState(); |
}, |
|
autoOffset : function(x, y) { |
x -= this.startPageX; |
y -= this.startPageY; |
this.setDelta(x, y); |
} |
}); |
|
Ext.state.Provider = function(){ |
|
this.addEvents("statechange"); |
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(Ext.isDate(v)){ |
enc = "d:" + v.toGMTString(); |
}else if(Ext.isArray(v)){ |
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" && v[key] !== undefined){ |
flat += key + "=" + this.encodeValue(v[key]) + "^"; |
} |
} |
enc = "o:" + flat.substring(0, flat.length-1); |
}else{ |
enc = "s:" + v; |
} |
return escape(enc); |
} |
}); |
|
|
Ext.state.Manager = function(){ |
var provider = new Ext.state.Provider(); |
|
return { |
|
setProvider : function(stateProvider){ |
provider = stateProvider; |
}, |
|
|
get : function(key, defaultValue){ |
return provider.get(key, defaultValue); |
}, |
|
|
set : function(key, value){ |
provider.set(key, value); |
}, |
|
|
clear : function(key){ |
provider.clear(key); |
}, |
|
|
getProvider : function(){ |
return provider; |
} |
}; |
}(); |
|
|
Ext.state.CookieProvider = 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" : ""); |
} |
}); |
|
Ext.DataView = Ext.extend(Ext.BoxComponent, { |
|
|
|
|
|
|
|
|
|
selectedClass : "x-view-selected", |
|
emptyText : "", |
|
|
last: false, |
|
|
initComponent : function(){ |
Ext.DataView.superclass.initComponent.call(this); |
if(typeof this.tpl == "string"){ |
this.tpl = new Ext.XTemplate(this.tpl); |
} |
|
this.addEvents( |
|
"beforeclick", |
|
"click", |
|
"containerclick", |
|
"dblclick", |
|
"contextmenu", |
|
"selectionchange", |
|
|
"beforeselect" |
); |
|
this.all = new Ext.CompositeElementLite(); |
this.selected = new Ext.CompositeElementLite(); |
}, |
|
|
onRender : function(){ |
if(!this.el){ |
this.el = document.createElement('div'); |
} |
Ext.DataView.superclass.onRender.apply(this, arguments); |
}, |
|
|
afterRender : function(){ |
Ext.DataView.superclass.afterRender.call(this); |
|
this.el.on({ |
"click": this.onClick, |
"dblclick": this.onDblClick, |
"contextmenu": this.onContextMenu, |
scope:this |
}); |
|
if(this.overClass){ |
this.el.on({ |
"mouseover": this.onMouseOver, |
"mouseout": this.onMouseOut, |
scope:this |
}); |
} |
|
if(this.store){ |
this.setStore(this.store, true); |
} |
}, |
|
|
refresh : function(){ |
this.clearSelections(false, true); |
this.el.update(""); |
var html = []; |
var records = this.store.getRange(); |
if(records.length < 1){ |
this.el.update(this.emptyText); |
this.all.clear(); |
return; |
} |
this.tpl.overwrite(this.el, this.collectData(records, 0)); |
this.all.fill(Ext.query(this.itemSelector, this.el.dom)); |
this.updateIndexes(0); |
}, |
|
|
prepareData : function(data){ |
return data; |
}, |
|
|
collectData : function(records, startIndex){ |
var r = []; |
for(var i = 0, len = records.length; i < len; i++){ |
r[r.length] = this.prepareData(records[i].data, startIndex+i, records[i]); |
} |
return r; |
}, |
|
|
bufferRender : function(records){ |
var div = document.createElement('div'); |
this.tpl.overwrite(div, this.collectData(records)); |
return Ext.query(this.itemSelector, div); |
}, |
|
|
onUpdate : function(ds, record){ |
var index = this.store.indexOf(record); |
var sel = this.isSelected(index); |
var original = this.all.elements[index]; |
var node = this.bufferRender([record], index)[0]; |
|
this.all.replaceElement(index, node, true); |
if(sel){ |
this.selected.replaceElement(original, node); |
this.all.item(index).addClass(this.selectedClass); |
} |
this.updateIndexes(index, index); |
}, |
|
|
onAdd : function(ds, records, index){ |
if(this.all.getCount() == 0){ |
this.refresh(); |
return; |
} |
var nodes = this.bufferRender(records, index), n; |
if(index < this.all.getCount()){ |
n = this.all.item(index).insertSibling(nodes, 'before', true); |
this.all.elements.splice(index, 0, n); |
}else{ |
n = this.all.last().insertSibling(nodes, 'after', true); |
this.all.elements.push(n); |
} |
this.updateIndexes(index); |
}, |
|
|
onRemove : function(ds, record, index){ |
this.deselect(index); |
this.all.removeElement(index, true); |
this.updateIndexes(index); |
}, |
|
|
refreshNode : function(index){ |
this.onUpdate(this.store, this.store.getAt(index)); |
}, |
|
|
updateIndexes : function(startIndex, endIndex){ |
var ns = this.all.elements; |
startIndex = startIndex || 0; |
endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length - 1)); |
for(var i = startIndex; i <= endIndex; i++){ |
ns[i].viewIndex = i; |
} |
}, |
|
|
setStore : function(store, initial){ |
if(!initial && this.store){ |
this.store.un("beforeload", this.onBeforeLoad, this); |
this.store.un("datachanged", this.refresh, this); |
this.store.un("add", this.onAdd, this); |
this.store.un("remove", this.onRemove, this); |
this.store.un("update", this.onUpdate, this); |
this.store.un("clear", this.refresh, this); |
} |
if(store){ |
store = Ext.StoreMgr.lookup(store); |
store.on("beforeload", this.onBeforeLoad, this); |
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){ |
return Ext.fly(node).findParent(this.itemSelector, this.el); |
}, |
|
|
onClick : function(e){ |
var item = e.getTarget(this.itemSelector, this.el); |
if(item){ |
var index = this.indexOf(item); |
if(this.onItemClick(item, index, e) !== false){ |
this.fireEvent("click", this, index, item, e); |
} |
}else{ |
if(this.fireEvent("containerclick", this, e) !== false){ |
this.clearSelections(); |
} |
} |
}, |
|
|
onContextMenu : function(e){ |
var item = e.getTarget(this.itemSelector, this.el); |
if(item){ |
this.fireEvent("contextmenu", this, this.indexOf(item), item, e); |
} |
}, |
|
|
onDblClick : function(e){ |
var item = e.getTarget(this.itemSelector, this.el); |
if(item){ |
this.fireEvent("dblclick", this, this.indexOf(item), item, e); |
} |
}, |
|
|
onMouseOver : function(e){ |
var item = e.getTarget(this.itemSelector, this.el); |
if(item && item !== this.lastItem){ |
this.lastItem = item; |
Ext.fly(item).addClass(this.overClass); |
} |
}, |
|
|
onMouseOut : function(e){ |
if(this.lastItem){ |
if(!e.within(this.lastItem, true)){ |
Ext.fly(this.lastItem).removeClass(this.overClass); |
delete this.lastItem; |
} |
} |
}, |
|
|
onItemClick : function(item, index, e){ |
if(this.fireEvent("beforeclick", this, index, item, e) === false){ |
return false; |
} |
if(this.multiSelect){ |
this.doMultiSelection(item, index, e); |
e.preventDefault(); |
}else if(this.singleSelect){ |
this.doSingleSelection(item, index, e); |
e.preventDefault(); |
} |
return true; |
}, |
|
|
doSingleSelection : function(item, index, e){ |
if(e.ctrlKey && this.isSelected(index)){ |
this.deselect(index); |
}else{ |
this.select(index, false); |
} |
}, |
|
|
doMultiSelection : function(item, index, e){ |
if(e.shiftKey && this.last !== false){ |
var last = this.last; |
this.selectRange(last, index, e.ctrlKey); |
this.last = last; |
}else{ |
if((e.ctrlKey||this.simpleSelect) && this.isSelected(index)){ |
this.deselect(index); |
}else{ |
this.select(index, e.ctrlKey || e.shiftKey || this.simpleSelect); |
} |
} |
}, |
|
|
getSelectionCount : function(){ |
return this.selected.getCount() |
}, |
|
|
getSelectedNodes : function(){ |
return this.selected.elements; |
}, |
|
|
getSelectedIndexes : function(){ |
var indexes = [], s = this.selected.elements; |
for(var i = 0, len = s.length; i < len; i++){ |
indexes.push(s[i].viewIndex); |
} |
return indexes; |
}, |
|
|
getSelectedRecords : function(){ |
var r = [], s = this.selected.elements; |
for(var i = 0, len = s.length; i < len; i++){ |
r[r.length] = this.store.getAt(s[i].viewIndex); |
} |
return r; |
}, |
|
|
getRecords : function(nodes){ |
var r = [], s = nodes; |
for(var i = 0, len = s.length; i < len; i++){ |
r[r.length] = this.store.getAt(s[i].viewIndex); |
} |
return r; |
}, |
|
|
getRecord : function(node){ |
return this.store.getAt(node.viewIndex); |
}, |
|
|
clearSelections : function(suppressEvent, skipUpdate){ |
if(this.multiSelect || this.singleSelect){ |
if(!skipUpdate){ |
this.selected.removeClass(this.selectedClass); |
} |
this.selected.clear(); |
this.last = false; |
if(!suppressEvent){ |
this.fireEvent("selectionchange", this, this.selected.elements); |
} |
} |
}, |
|
|
isSelected : function(node){ |
return this.selected.contains(this.getNode(node)); |
}, |
|
|
deselect : function(node){ |
if(this.isSelected(node)){ |
var node = this.getNode(node); |
this.selected.removeElement(node); |
if(this.last == node.viewIndex){ |
this.last = false; |
} |
Ext.fly(node).removeClass(this.selectedClass); |
this.fireEvent("selectionchange", this, this.selected.elements); |
} |
}, |
|
|
select : function(nodeInfo, keepExisting, suppressEvent){ |
if(Ext.isArray(nodeInfo)){ |
if(!keepExisting){ |
this.clearSelections(true); |
} |
for(var i = 0, len = nodeInfo.length; i < len; i++){ |
this.select(nodeInfo[i], true, true); |
} |
} else{ |
var node = this.getNode(nodeInfo); |
if(!keepExisting){ |
this.clearSelections(true); |
} |
if(node && !this.isSelected(node)){ |
if(this.fireEvent("beforeselect", this, node, this.selected.elements) !== false){ |
Ext.fly(node).addClass(this.selectedClass); |
this.selected.add(node); |
this.last = node.viewIndex; |
if(!suppressEvent){ |
this.fireEvent("selectionchange", this, this.selected.elements); |
} |
} |
} |
} |
}, |
|
|
selectRange : function(start, end, keepExisting){ |
if(!keepExisting){ |
this.clearSelections(true); |
} |
this.select(this.getNodes(start, end), true); |
}, |
|
|
getNode : function(nodeInfo){ |
if(typeof nodeInfo == "string"){ |
return document.getElementById(nodeInfo); |
}else if(typeof nodeInfo == "number"){ |
return this.all.elements[nodeInfo]; |
} |
return nodeInfo; |
}, |
|
|
getNodes : function(start, end){ |
var ns = this.all.elements; |
start = start || 0; |
end = typeof end == "undefined" ? ns.length - 1 : end; |
var nodes = [], i; |
if(start <= end){ |
for(i = start; i <= end; i++){ |
nodes.push(ns[i]); |
} |
} else{ |
for(i = start; i >= end; i--){ |
nodes.push(ns[i]); |
} |
} |
return nodes; |
}, |
|
|
indexOf : function(node){ |
node = this.getNode(node); |
if(typeof node.viewIndex == "number"){ |
return node.viewIndex; |
} |
return this.all.indexOf(node); |
}, |
|
|
onBeforeLoad : function(){ |
if(this.loadingText){ |
this.clearSelections(false, true); |
this.el.update('<div class="loading-indicator">'+this.loadingText+'</div>'); |
this.all.clear(); |
} |
} |
}); |
|
Ext.reg('dataview', Ext.DataView); |
|
Ext.ColorPalette = function(config){ |
Ext.ColorPalette.superclass.constructor.call(this, config); |
this.addEvents( |
|
'select' |
); |
|
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 = this.tpl || new Ext.XTemplate( |
'<tpl for="."><a href="#" class="color-{.}" hidefocus="on"><em><span style="background:#{.}" unselectable="on"> </span></em></a></tpl>' |
); |
var el = document.createElement("div"); |
el.className = this.itemCls; |
t.overwrite(el, this.colors); |
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.reg('colorpalette', Ext.ColorPalette); |
|
Ext.DatePicker = Ext.extend(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, |
|
initComponent : function(){ |
Ext.DatePicker.superclass.initComponent.call(this); |
|
this.value = this.value ? |
this.value.clearTime() : new Date().clearTime(); |
|
this.addEvents( |
|
'select' |
); |
|
if(this.handler){ |
this.on("select", this.handler, this.scope || this); |
} |
|
this.initDisabledDays(); |
}, |
|
|
initDisabledDays : function(){ |
if(!this.disabledDatesRE && this.disabledDates){ |
var dd = this.disabledDates; |
var re = "(?:"; |
for(var i = 0; i < dd.length; i++){ |
re += dd[i]; |
if(i != dd.length-1) re += "|"; |
} |
this.disabledDatesRE = new RegExp(re + ")"); |
} |
}, |
|
|
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 = [ |
'<table cellspacing="0">', |
'<tr><td class="x-date-left"><a href="#" title="', this.prevText ,'"> </a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="', this.nextText ,'"> </a></td></tr>', |
'<tr><td colspan="3"><table class="x-date-inner" cellspacing="0"><thead><tr>']; |
var dn = this.dayNames; |
for(var i = 0; i < 7; i++){ |
var d = this.startDay+i; |
if(d > 6){ |
d = d-7; |
} |
m.push("<th><span>", dn[d].substr(0,1), "</span></th>"); |
} |
m[m.length] = "</tr></thead><tbody><tr>"; |
for(var i = 0; i < 42; i++) { |
if(i % 7 == 0 && i != 0){ |
m[m.length] = "</tr><tr>"; |
} |
m[m.length] = '<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>'; |
} |
m[m.length] = '</tr></tbody></table></td></tr><tr><td colspan="3" class="x-date-bottom" align="center"></td></tr></table><div class="x-date-mp"></div>'; |
|
var el = document.createElement("div"); |
el.className = "x-date-picker"; |
el.innerHTML = m.join(""); |
|
container.dom.insertBefore(el, position); |
|
this.el = Ext.get(el); |
this.eventEl = Ext.get(el.firstChild); |
|
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({ |
text: " ", |
tooltip: this.monthYearText, |
renderTo: this.el.child("td.x-date-middle", true) |
}); |
|
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); |
this.todayBtn = new Ext.Button({ |
renderTo: this.el.child("td.x-date-bottom", true), |
text: String.format(this.todayText, today), |
tooltip: String.format(this.todayTip, today), |
handler: this.selectToday, |
scope: this |
}); |
|
if(Ext.isIE){ |
this.el.repaint(); |
} |
this.update(this.value); |
}, |
|
createMonthPicker : function(){ |
if(!this.monthPicker.dom.firstChild){ |
var buf = ['<table border="0" cellspacing="0">']; |
for(var i = 0; i < 6; i++){ |
buf.push( |
'<tr><td class="x-date-mp-month"><a href="#">', this.monthNames[i].substr(0, 3), '</a></td>', |
'<td class="x-date-mp-month x-date-mp-sep"><a href="#">', this.monthNames[i+6].substr(0, 3), '</a></td>', |
i == 0 ? |
'<td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-prev"></a></td><td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-next"></a></td></tr>' : |
'<td class="x-date-mp-year"><a href="#"></a></td><td class="x-date-mp-year"><a href="#"></a></td></tr>' |
); |
} |
buf.push( |
'<tr class="x-date-mp-btns"><td colspan="4"><button type="button" class="x-date-mp-ok">', |
this.okText, |
'</button><button type="button" class="x-date-mp-cancel">', |
this.cancelText, |
'</button></td></tr>', |
'</table>' |
); |
this.monthPicker.update(buf.join('')); |
this.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]); |
} |
} |
}, |
|
|
beforeDestroy : function() { |
this.mbtn.destroy(); |
this.todayBtn.destroy(); |
} |
|
|
}); |
Ext.reg('datepicker', Ext.DatePicker); |
|
Ext.TabPanel = Ext.extend(Ext.Panel, { |
|
|
monitorResize : true, |
|
deferredRender : true, |
|
tabWidth: 120, |
|
minTabWidth: 30, |
|
resizeTabs:false, |
|
enableTabScroll: false, |
|
scrollIncrement : 0, |
|
scrollRepeatInterval : 400, |
|
scrollDuration : .35, |
|
animScroll : true, |
|
tabPosition: 'top', |
|
baseCls: 'x-tab-panel', |
|
autoTabs : false, |
|
autoTabSelector:'div.x-tab', |
|
activeTab : null, |
|
tabMargin : 2, |
|
plain: false, |
|
wheelIncrement : 20, |
|
|
idDelimiter : '__', |
|
itemCls : 'x-tab-item', |
|
elements: 'body', |
headerAsText: false, |
frame: false, |
hideBorders:true, |
|
initComponent : function(){ |
this.frame = false; |
Ext.TabPanel.superclass.initComponent.call(this); |
this.addEvents( |
|
'beforetabchange', |
|
'tabchange', |
|
'contextmenu' |
); |
this.setLayout(new Ext.layout.CardLayout({ |
deferredRender: this.deferredRender |
})); |
if(this.tabPosition == 'top'){ |
this.elements += ',header'; |
this.stripTarget = 'header'; |
}else { |
this.elements += ',footer'; |
this.stripTarget = 'footer'; |
} |
if(!this.stack){ |
this.stack = Ext.TabPanel.AccessStack(); |
} |
this.initItems(); |
}, |
|
render : function(){ |
Ext.TabPanel.superclass.render.apply(this, arguments); |
if(this.activeTab !== undefined){ |
var item = this.activeTab; |
delete this.activeTab; |
this.setActiveTab(item); |
} |
}, |
|
onRender : function(ct, position){ |
Ext.TabPanel.superclass.onRender.call(this, ct, position); |
|
if(this.plain){ |
var pos = this.tabPosition == 'top' ? 'header' : 'footer'; |
this[pos].addClass('x-tab-panel-'+pos+'-plain'); |
} |
|
var st = this[this.stripTarget]; |
|
this.stripWrap = st.createChild({cls:'x-tab-strip-wrap', cn:{ |
tag:'ul', cls:'x-tab-strip x-tab-strip-'+this.tabPosition}}); |
this.stripSpacer = st.createChild({cls:'x-tab-strip-spacer'}); |
this.strip = new Ext.Element(this.stripWrap.dom.firstChild); |
|
this.edge = this.strip.createChild({tag:'li', cls:'x-tab-edge'}); |
this.strip.createChild({cls:'x-clear'}); |
|
this.body.addClass('x-tab-panel-body-'+this.tabPosition); |
|
if(!this.itemTpl){ |
var tt = new Ext.Template( |
'<li class="{cls}" id="{id}"><a class="x-tab-strip-close" onclick="return false;"></a>', |
'<a class="x-tab-right" href="#" onclick="return false;"><em class="x-tab-left">', |
'<span class="x-tab-strip-inner"><span class="x-tab-strip-text {iconCls}">{text}</span></span>', |
'</em></a></li>' |
); |
tt.disableFormats = true; |
tt.compile(); |
Ext.TabPanel.prototype.itemTpl = tt; |
} |
|
this.items.each(this.initTab, this); |
}, |
|
afterRender : function(){ |
Ext.TabPanel.superclass.afterRender.call(this); |
if(this.autoTabs){ |
this.readTabs(false); |
} |
}, |
|
initEvents : function(){ |
Ext.TabPanel.superclass.initEvents.call(this); |
this.on('add', this.onAdd, this); |
this.on('remove', this.onRemove, this); |
|
this.strip.on('mousedown', this.onStripMouseDown, this); |
this.strip.on('click', this.onStripClick, this); |
this.strip.on('contextmenu', this.onStripContextMenu, this); |
if(this.enableTabScroll){ |
this.strip.on('mousewheel', this.onWheel, this); |
} |
}, |
|
findTargets : function(e){ |
var item = null; |
var itemEl = e.getTarget('li', this.strip); |
if(itemEl){ |
item = this.getComponent(itemEl.id.split(this.idDelimiter)[1]); |
if(item.disabled){ |
return { |
close : null, |
item : null, |
el : null |
}; |
} |
} |
return { |
close : e.getTarget('.x-tab-strip-close', this.strip), |
item : item, |
el : itemEl |
}; |
}, |
|
onStripMouseDown : function(e){ |
e.preventDefault(); |
if(e.button != 0){ |
return; |
} |
var t = this.findTargets(e); |
if(t.close){ |
this.remove(t.item); |
return; |
} |
if(t.item && t.item != this.activeTab){ |
this.setActiveTab(t.item); |
} |
}, |
|
onStripClick : function(e){ |
var t = this.findTargets(e); |
if(!t.close && t.item && t.item != this.activeTab){ |
this.setActiveTab(t.item); |
} |
}, |
|
onStripContextMenu : function(e){ |
e.preventDefault(); |
var t = this.findTargets(e); |
if(t.item){ |
this.fireEvent('contextmenu', this, t.item, e); |
} |
}, |
|
|
readTabs : function(removeExisting){ |
if(removeExisting === true){ |
this.items.each(function(item){ |
this.remove(item); |
}, this); |
} |
var tabs = this.el.query(this.autoTabSelector); |
for(var i = 0, len = tabs.length; i < len; i++){ |
var tab = tabs[i]; |
var title = tab.getAttribute('title'); |
tab.removeAttribute('title'); |
this.add({ |
title: title, |
el: tab |
}); |
} |
}, |
|
initTab : function(item, index){ |
var before = this.strip.dom.childNodes[index]; |
var cls = item.closable ? 'x-tab-strip-closable' : ''; |
if(item.disabled){ |
cls += ' x-item-disabled'; |
} |
if(item.iconCls){ |
cls += ' x-tab-with-icon'; |
} |
if(item.tabCls){ |
cls += ' ' + item.tabCls; |
} |
|
var p = { |
id: this.id + this.idDelimiter + item.getItemId(), |
text: item.title, |
cls: cls, |
iconCls: item.iconCls || '' |
}; |
var el = before ? |
this.itemTpl.insertBefore(before, p) : |
this.itemTpl.append(this.strip, p); |
|
Ext.fly(el).addClassOnOver('x-tab-strip-over'); |
|
if(item.tabTip){ |
Ext.fly(el).child('span.x-tab-strip-text', true).qtip = item.tabTip; |
} |
item.on('disable', this.onItemDisabled, this); |
item.on('enable', this.onItemEnabled, this); |
item.on('titlechange', this.onItemTitleChanged, this); |
item.on('beforeshow', this.onBeforeShowItem, this); |
}, |
|
onAdd : function(tp, item, index){ |
this.initTab(item, index); |
if(this.items.getCount() == 1){ |
this.syncSize(); |
} |
this.delegateUpdates(); |
}, |
|
onBeforeAdd : function(item){ |
var existing = item.events ? (this.items.containsKey(item.getItemId()) ? item : null) : this.items.get(item); |
if(existing){ |
this.setActiveTab(item); |
return false; |
} |
Ext.TabPanel.superclass.onBeforeAdd.apply(this, arguments); |
var es = item.elements; |
item.elements = es ? es.replace(',header', '') : es; |
item.border = (item.border === true); |
}, |
|
onRemove : function(tp, item){ |
Ext.removeNode(this.getTabEl(item)); |
this.stack.remove(item); |
if(item == this.activeTab){ |
var next = this.stack.next(); |
if(next){ |
this.setActiveTab(next); |
}else{ |
this.setActiveTab(0); |
} |
} |
this.delegateUpdates(); |
}, |
|
onBeforeShowItem : function(item){ |
if(item != this.activeTab){ |
this.setActiveTab(item); |
return false; |
} |
}, |
|
onItemDisabled : function(item){ |
var el = this.getTabEl(item); |
if(el){ |
Ext.fly(el).addClass('x-item-disabled'); |
} |
this.stack.remove(item); |
}, |
|
onItemEnabled : function(item){ |
var el = this.getTabEl(item); |
if(el){ |
Ext.fly(el).removeClass('x-item-disabled'); |
} |
}, |
|
onItemTitleChanged : function(item){ |
var el = this.getTabEl(item); |
if(el){ |
Ext.fly(el).child('span.x-tab-strip-text', true).innerHTML = item.title; |
} |
}, |
|
|
getTabEl : function(item){ |
var itemId = (typeof item === 'number')?this.items.items[item].getItemId() : item.getItemId(); |
return document.getElementById(this.id+this.idDelimiter+itemId); |
}, |
|
onResize : function(){ |
Ext.TabPanel.superclass.onResize.apply(this, arguments); |
this.delegateUpdates(); |
}, |
|
|
beginUpdate : function(){ |
this.suspendUpdates = true; |
}, |
|
|
endUpdate : function(){ |
this.suspendUpdates = false; |
this.delegateUpdates(); |
}, |
|
|
hideTabStripItem : function(item){ |
item = this.getComponent(item); |
var el = this.getTabEl(item); |
if(el){ |
el.style.display = 'none'; |
this.delegateUpdates(); |
} |
}, |
|
|
unhideTabStripItem : function(item){ |
item = this.getComponent(item); |
var el = this.getTabEl(item); |
if(el){ |
el.style.display = ''; |
this.delegateUpdates(); |
} |
}, |
|
delegateUpdates : function(){ |
if(this.suspendUpdates){ |
return; |
} |
if(this.resizeTabs && this.rendered){ |
this.autoSizeTabs(); |
} |
if(this.enableTabScroll && this.rendered){ |
this.autoScrollTabs(); |
} |
}, |
|
autoSizeTabs : function(){ |
var count = this.items.length; |
var ce = this.tabPosition != 'bottom' ? 'header' : 'footer'; |
var ow = this[ce].dom.offsetWidth; |
var aw = this[ce].dom.clientWidth; |
|
if(!this.resizeTabs || count < 1 || !aw){ return; |
} |
|
var each = Math.max(Math.min(Math.floor((aw-4) / count) - this.tabMargin, this.tabWidth), this.minTabWidth); this.lastTabWidth = each; |
var lis = this.stripWrap.dom.getElementsByTagName('li'); |
for(var i = 0, len = lis.length-1; i < len; i++) { var li = lis[i]; |
var inner = li.childNodes[1].firstChild.firstChild; |
var tw = li.offsetWidth; |
var iw = inner.offsetWidth; |
inner.style.width = (each - (tw-iw)) + 'px'; |
} |
}, |
|
adjustBodyWidth : function(w){ |
if(this.header){ |
this.header.setWidth(w); |
} |
if(this.footer){ |
this.footer.setWidth(w); |
} |
return w; |
}, |
|
|
setActiveTab : function(item){ |
item = this.getComponent(item); |
if(!item || this.fireEvent('beforetabchange', this, item, this.activeTab) === false){ |
return; |
} |
if(!this.rendered){ |
this.activeTab = item; |
return; |
} |
if(this.activeTab != item){ |
if(this.activeTab){ |
var oldEl = this.getTabEl(this.activeTab); |
if(oldEl){ |
Ext.fly(oldEl).removeClass('x-tab-strip-active'); |
} |
this.activeTab.fireEvent('deactivate', this.activeTab); |
} |
var el = this.getTabEl(item); |
Ext.fly(el).addClass('x-tab-strip-active'); |
this.activeTab = item; |
this.stack.add(item); |
|
this.layout.setActiveItem(item); |
if(this.layoutOnTabChange && item.doLayout){ |
item.doLayout(); |
} |
if(this.scrolling){ |
this.scrollToTab(item, this.animScroll); |
} |
|
item.fireEvent('activate', item); |
this.fireEvent('tabchange', this, item); |
} |
}, |
|
|
getActiveTab : function(){ |
return this.activeTab || null; |
}, |
|
|
getItem : function(item){ |
return this.getComponent(item); |
}, |
|
autoScrollTabs : function(){ |
var count = this.items.length; |
var ow = this.header.dom.offsetWidth; |
var tw = this.header.dom.clientWidth; |
|
var wrap = this.stripWrap; |
var wd = wrap.dom; |
var cw = wd.offsetWidth; |
var pos = this.getScrollPos(); |
var l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos; |
|
if(!this.enableTabScroll || count < 1 || cw < 20){ return; |
} |
if(l <= tw){ |
wd.scrollLeft = 0; |
wrap.setWidth(tw); |
if(this.scrolling){ |
this.scrolling = false; |
this.header.removeClass('x-tab-scrolling'); |
this.scrollLeft.hide(); |
this.scrollRight.hide(); |
if(Ext.isAir){ |
wd.style.marginLeft = ''; |
wd.style.marginRight = ''; |
} |
} |
}else{ |
if(!this.scrolling){ |
this.header.addClass('x-tab-scrolling'); |
if(Ext.isAir){ |
wd.style.marginLeft = '18px'; |
wd.style.marginRight = '18px'; |
} |
} |
tw -= wrap.getMargins('lr'); |
wrap.setWidth(tw > 20 ? tw : 20); |
if(!this.scrolling){ |
if(!this.scrollLeft){ |
this.createScrollers(); |
}else{ |
this.scrollLeft.show(); |
this.scrollRight.show(); |
} |
} |
this.scrolling = true; |
if(pos > (l-tw)){ wd.scrollLeft = l-tw; |
}else{ this.scrollToTab(this.activeTab, false); |
} |
this.updateScrollButtons(); |
} |
}, |
|
createScrollers : function(){ |
var h = this.stripWrap.dom.offsetHeight; |
|
var sl = this.header.insertFirst({ |
cls:'x-tab-scroller-left' |
}); |
sl.setHeight(h); |
sl.addClassOnOver('x-tab-scroller-left-over'); |
this.leftRepeater = new Ext.util.ClickRepeater(sl, { |
interval : this.scrollRepeatInterval, |
handler: this.onScrollLeft, |
scope: this |
}); |
this.scrollLeft = sl; |
|
var sr = this.header.insertFirst({ |
cls:'x-tab-scroller-right' |
}); |
sr.setHeight(h); |
sr.addClassOnOver('x-tab-scroller-right-over'); |
this.rightRepeater = new Ext.util.ClickRepeater(sr, { |
interval : this.scrollRepeatInterval, |
handler: this.onScrollRight, |
scope: this |
}); |
this.scrollRight = sr; |
}, |
|
getScrollWidth : function(){ |
return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos(); |
}, |
|
getScrollPos : function(){ |
return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0; |
}, |
|
getScrollArea : function(){ |
return parseInt(this.stripWrap.dom.clientWidth, 10) || 0; |
}, |
|
getScrollAnim : function(){ |
return {duration:this.scrollDuration, callback: this.updateScrollButtons, scope: this}; |
}, |
|
getScrollIncrement : function(){ |
return this.scrollIncrement || (this.resizeTabs ? this.lastTabWidth+2 : 100); |
}, |
|
|
|
scrollToTab : function(item, animate){ |
if(!item){ return; } |
var el = this.getTabEl(item); |
var pos = this.getScrollPos(), area = this.getScrollArea(); |
var left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos; |
var right = left + el.offsetWidth; |
if(left < pos){ |
this.scrollTo(left, animate); |
}else if(right > (pos + area)){ |
this.scrollTo(right - area, animate); |
} |
}, |
|
scrollTo : function(pos, animate){ |
this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false); |
if(!animate){ |
this.updateScrollButtons(); |
} |
}, |
|
onWheel : function(e){ |
var d = e.getWheelDelta()*this.wheelIncrement*-1; |
e.stopEvent(); |
|
var pos = this.getScrollPos(); |
var newpos = pos + d; |
var sw = this.getScrollWidth()-this.getScrollArea(); |
|
var s = Math.max(0, Math.min(sw, newpos)); |
if(s != pos){ |
this.scrollTo(s, false); |
} |
}, |
|
onScrollRight : function(){ |
var sw = this.getScrollWidth()-this.getScrollArea(); |
var pos = this.getScrollPos(); |
var s = Math.min(sw, pos + this.getScrollIncrement()); |
if(s != pos){ |
this.scrollTo(s, this.animScroll); |
} |
}, |
|
onScrollLeft : function(){ |
var pos = this.getScrollPos(); |
var s = Math.max(0, pos - this.getScrollIncrement()); |
if(s != pos){ |
this.scrollTo(s, this.animScroll); |
} |
}, |
|
updateScrollButtons : function(){ |
var pos = this.getScrollPos(); |
this.scrollLeft[pos == 0 ? 'addClass' : 'removeClass']('x-tab-scroller-left-disabled'); |
this.scrollRight[pos >= (this.getScrollWidth()-this.getScrollArea()) ? 'addClass' : 'removeClass']('x-tab-scroller-right-disabled'); |
} |
|
|
|
|
|
|
|
|
|
|
|
}); |
Ext.reg('tabpanel', Ext.TabPanel); |
|
|
Ext.TabPanel.prototype.activate = Ext.TabPanel.prototype.setActiveTab; |
|
Ext.TabPanel.AccessStack = function(){ |
var items = []; |
return { |
add : function(item){ |
items.push(item); |
if(items.length > 10){ |
items.shift(); |
} |
}, |
|
remove : function(item){ |
var s = []; |
for(var i = 0, len = items.length; i < len; i++) { |
if(items[i] != item){ |
s.push(items[i]); |
} |
} |
items = s; |
}, |
|
next : function(){ |
return items.pop(); |
} |
}; |
}; |
|
|
|
|
Ext.Button = Ext.extend(Ext.Component, { |
|
hidden : false, |
|
disabled : false, |
|
pressed : false, |
|
|
|
|
|
enableToggle: false, |
|
|
menuAlign : "tl-bl?", |
|
|
|
type : 'button', |
|
menuClassTarget: 'tr', |
|
|
clickEvent : 'click', |
|
|
handleMouseEvents : true, |
|
|
tooltipType : 'qtip', |
|
buttonSelector : "button:first", |
|
|
|
|
initComponent : function(){ |
Ext.Button.superclass.initComponent.call(this); |
|
this.addEvents( |
|
"click", |
|
"toggle", |
|
'mouseover', |
|
'mouseout', |
|
'menushow', |
|
'menuhide', |
|
'menutriggerover', |
|
'menutriggerout' |
); |
if(this.menu){ |
this.menu = Ext.menu.MenuMgr.get(this.menu); |
} |
if(typeof this.toggleGroup === 'string'){ |
this.enableToggle = true; |
} |
}, |
|
onRender : function(ct, position){ |
if(!this.template){ |
if(!Ext.Button.buttonTemplate){ |
Ext.Button.buttonTemplate = new Ext.Template( |
'<table border="0" cellpadding="0" cellspacing="0" class="x-btn-wrap"><tbody><tr>', |
'<td class="x-btn-left"><i> </i></td><td class="x-btn-center"><em unselectable="on"><button class="x-btn-text" type="{1}">{0}</button></em></td><td class="x-btn-right"><i> </i></td>', |
"</tr></tbody></table>"); |
} |
this.template = Ext.Button.buttonTemplate; |
} |
var btn, targs = [this.text || ' ', this.type]; |
|
if(position){ |
btn = this.template.insertBefore(position, targs, true); |
}else{ |
btn = this.template.append(ct, targs, true); |
} |
var btnEl = btn.child(this.buttonSelector); |
btnEl.on('focus', this.onFocus, this); |
btnEl.on('blur', this.onBlur, this); |
|
this.initButtonEl(btn, btnEl); |
|
if(this.menu){ |
this.el.child(this.menuClassTarget).addClass("x-btn-with-menu"); |
} |
Ext.ButtonToggleMgr.register(this); |
}, |
|
initButtonEl : function(btn, btnEl){ |
|
this.el = btn; |
btn.addClass("x-btn"); |
|
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.register(Ext.apply({ |
target: btnEl.id |
}, this.tooltip)); |
} else { |
btnEl.dom[this.tooltipType] = this.tooltip; |
} |
} |
|
if(this.pressed){ |
this.el.addClass("x-btn-pressed"); |
} |
|
if(this.handleMouseEvents){ |
btn.on("mouseover", this.onMouseOver, this); |
btn.on("mousedown", this.onMouseDown, this); |
} |
|
if(this.menu){ |
this.menu.on("show", this.onMenuShow, this); |
this.menu.on("hide", this.onMenuHide, this); |
} |
|
if(this.id){ |
this.el.dom.id = this.el.id = this.id; |
} |
|
if(this.repeat){ |
var repeater = new Ext.util.ClickRepeater(btn, |
typeof this.repeat == "object" ? this.repeat : {} |
); |
repeater.on("click", this.onClick, this); |
} |
|
btn.on(this.clickEvent, this.onClick, this); |
}, |
|
afterRender : function(){ |
Ext.Button.superclass.afterRender.call(this); |
if(Ext.isIE6){ |
this.autoWidth.defer(1, this); |
}else{ |
this.autoWidth(); |
} |
}, |
|
|
setIconClass : function(cls){ |
if(this.el){ |
this.el.child(this.buttonSelector).replaceClass(this.iconCls, cls); |
} |
this.iconCls = cls; |
}, |
|
beforeDestroy: function(){ |
if(this.rendered){ |
var btn = this.el.child(this.buttonSelector); |
if(btn){ |
btn.removeAllListeners(); |
} |
} |
if(this.menu){ |
Ext.destroy(this.menu); |
} |
}, |
|
onDestroy : function(){ |
if(this.rendered){ |
Ext.ButtonToggleMgr.unregister(this); |
} |
}, |
|
autoWidth : function(){ |
if(this.el){ |
this.el.setWidth("auto"); |
if(Ext.isIE7 && Ext.isStrict){ |
var ib = this.el.child(this.buttonSelector); |
if(ib && ib.getWidth() > 20){ |
ib.clip(); |
ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr')); |
} |
} |
if(this.minWidth){ |
if(this.el.getWidth() < this.minWidth){ |
this.el.setWidth(this.minWidth); |
} |
} |
} |
}, |
|
|
setHandler : function(handler, scope){ |
this.handler = handler; |
this.scope = scope; |
}, |
|
|
setText : function(text){ |
this.text = text; |
if(this.el){ |
this.el.child("td.x-btn-center " + this.buttonSelector).update(text); |
} |
this.autoWidth(); |
}, |
|
|
getText : function(){ |
return this.text; |
}, |
|
|
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(this.buttonSelector).focus(); |
}, |
|
onDisable : function(){ |
if(this.el){ |
if(!Ext.isIE6 || !this.text){ |
this.el.addClass(this.disabledClass); |
} |
this.el.dom.disabled = true; |
} |
this.disabled = true; |
}, |
|
onEnable : function(){ |
if(this.el){ |
if(!Ext.isIE6 || !this.text){ |
this.el.removeClass(this.disabledClass); |
} |
this.el.dom.disabled = false; |
} |
this.disabled = false; |
}, |
|
|
showMenu : function(){ |
if(this.menu){ |
this.menu.show(this.el, this.menuAlign); |
} |
return this; |
}, |
|
|
hideMenu : function(){ |
if(this.menu){ |
this.menu.hide(); |
} |
return this; |
}, |
|
|
hasVisibleMenu : function(){ |
return this.menu && this.menu.isVisible(); |
}, |
|
onClick : function(e){ |
if(e){ |
e.preventDefault(); |
} |
if(e.button != 0){ |
return; |
} |
if(!this.disabled){ |
if(this.enableToggle && (this.allowDepress !== false || !this.pressed)){ |
this.toggle(); |
} |
if(this.menu && !this.menu.isVisible() && !this.ignoreNextClick){ |
this.showMenu(); |
} |
this.fireEvent("click", this, e); |
if(this.handler){ |
this.handler.call(this.scope || this, this, e); |
} |
} |
}, |
|
isMenuTriggerOver : function(e, internal){ |
return this.menu && !internal; |
}, |
|
isMenuTriggerOut : function(e, internal){ |
return this.menu && !internal; |
}, |
|
onMouseOver : function(e){ |
if(!this.disabled){ |
var internal = e.within(this.el, true); |
if(!internal){ |
this.el.addClass("x-btn-over"); |
Ext.getDoc().on('mouseover', this.monitorMouseOver, this); |
this.fireEvent('mouseover', this, e); |
} |
if(this.isMenuTriggerOver(e, internal)){ |
this.fireEvent('menutriggerover', this, this.menu, e); |
} |
} |
}, |
|
monitorMouseOver : function(e){ |
if(e.target != this.el.dom && !e.within(this.el)){ |
Ext.getDoc().un('mouseover', this.monitorMouseOver, this); |
this.onMouseOut(e); |
} |
}, |
|
onMouseOut : function(e){ |
var internal = e.within(this.el) && e.target != this.el.dom; |
this.el.removeClass("x-btn-over"); |
this.fireEvent('mouseout', this, e); |
if(this.isMenuTriggerOut(e, internal)){ |
this.fireEvent('menutriggerout', this, this.menu, e); |
} |
}, |
onFocus : function(e){ |
if(!this.disabled){ |
this.el.addClass("x-btn-focus"); |
} |
}, |
onBlur : function(e){ |
this.el.removeClass("x-btn-focus"); |
}, |
|
getClickEl : function(e, isUp){ |
return this.el; |
}, |
|
onMouseDown : function(e){ |
if(!this.disabled && e.button == 0){ |
this.getClickEl(e).addClass("x-btn-click"); |
Ext.getDoc().on('mouseup', this.onMouseUp, this); |
} |
}, |
onMouseUp : function(e){ |
if(e.button == 0){ |
this.getClickEl(e, true).removeClass("x-btn-click"); |
Ext.getDoc().un('mouseup', this.onMouseUp, this); |
} |
}, |
onMenuShow : function(e){ |
this.ignoreNextClick = 0; |
this.el.addClass("x-btn-menu-active"); |
this.fireEvent('menushow', this, this.menu); |
}, |
onMenuHide : function(e){ |
this.el.removeClass("x-btn-menu-active"); |
this.ignoreNextClick = this.restoreClick.defer(250, this); |
this.fireEvent('menuhide', this, this.menu); |
}, |
|
restoreClick : function(){ |
this.ignoreNextClick = 0; |
} |
|
|
|
|
}); |
Ext.reg('button', Ext.Button); |
|
Ext.ButtonToggleMgr = function(){ |
var groups = {}; |
|
function toggleGroup(btn, state){ |
if(state){ |
var g = groups[btn.toggleGroup]; |
for(var i = 0, l = g.length; i < l; i++){ |
if(g[i] != btn){ |
g[i].toggle(false); |
} |
} |
} |
} |
|
return { |
register : function(btn){ |
if(!btn.toggleGroup){ |
return; |
} |
var g = groups[btn.toggleGroup]; |
if(!g){ |
g = groups[btn.toggleGroup] = []; |
} |
g.push(btn); |
btn.on("toggle", toggleGroup); |
}, |
|
unregister : function(btn){ |
if(!btn.toggleGroup){ |
return; |
} |
var g = groups[btn.toggleGroup]; |
if(g){ |
g.remove(btn); |
btn.un("toggle", toggleGroup); |
} |
} |
}; |
}(); |
|
Ext.SplitButton = Ext.extend(Ext.Button, { |
|
arrowSelector : 'button:last', |
|
|
initComponent : function(){ |
Ext.SplitButton.superclass.initComponent.call(this); |
|
this.addEvents("arrowclick"); |
}, |
|
|
onRender : function(ct, position){ |
|
var tpl = new Ext.Template( |
'<table cellspacing="0" class="x-btn-menu-wrap x-btn"><tr><td>', |
'<table cellspacing="0" class="x-btn-wrap x-btn-menu-text-wrap"><tbody>', |
'<tr><td class="x-btn-left"><i> </i></td><td class="x-btn-center"><button class="x-btn-text" type="{1}">{0}</button></td></tr>', |
"</tbody></table></td><td>", |
'<table cellspacing="0" class="x-btn-wrap x-btn-menu-arrow-wrap"><tbody>', |
'<tr><td class="x-btn-center"><button class="x-btn-menu-arrow-el" type="button"> </button></td><td class="x-btn-right"><i> </i></td></tr>', |
"</tbody></table></td></tr></table>" |
); |
var btn, targs = [this.text || ' ', this.type]; |
if(position){ |
btn = tpl.insertBefore(position, targs, true); |
}else{ |
btn = tpl.append(ct, targs, true); |
} |
var btnEl = btn.child(this.buttonSelector); |
|
this.initButtonEl(btn, btnEl); |
this.arrowBtnTable = btn.child("table:last"); |
if(this.arrowTooltip){ |
btn.child(this.arrowSelector).dom[this.tooltipType] = this.arrowTooltip; |
} |
}, |
|
|
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(this.buttonSelector); |
if(ib && ib.getWidth() > 20){ |
ib.clip(); |
ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr')); |
} |
} |
if(this.minWidth){ |
if((tbl.getWidth()+tbl2.getWidth()) < this.minWidth){ |
tbl.setWidth(this.minWidth-tbl2.getWidth()); |
} |
} |
this.el.setWidth(tbl.getWidth()+tbl2.getWidth()); |
} |
}, |
|
|
setArrowHandler : function(handler, scope){ |
this.arrowHandler = handler; |
this.scope = scope; |
}, |
|
|
onClick : function(e){ |
e.preventDefault(); |
if(!this.disabled){ |
if(e.getTarget(".x-btn-menu-arrow-wrap")){ |
if(this.menu && !this.menu.isVisible() && !this.ignoreNextClick){ |
this.showMenu(); |
} |
this.fireEvent("arrowclick", this, e); |
if(this.arrowHandler){ |
this.arrowHandler.call(this.scope || this, this, e); |
} |
}else{ |
if(this.enableToggle){ |
this.toggle(); |
} |
this.fireEvent("click", this, e); |
if(this.handler){ |
this.handler.call(this.scope || this, this, e); |
} |
} |
} |
}, |
|
|
getClickEl : function(e, isUp){ |
if(!isUp){ |
return (this.lastClickEl = e.getTarget("table", 10, true)); |
} |
return this.lastClickEl; |
}, |
|
|
onDisable : function(){ |
if(this.el){ |
if(!Ext.isIE6){ |
this.el.addClass("x-item-disabled"); |
} |
this.el.child(this.buttonSelector).dom.disabled = true; |
this.el.child(this.arrowSelector).dom.disabled = true; |
} |
this.disabled = true; |
}, |
|
|
onEnable : function(){ |
if(this.el){ |
if(!Ext.isIE6){ |
this.el.removeClass("x-item-disabled"); |
} |
this.el.child(this.buttonSelector).dom.disabled = false; |
this.el.child(this.arrowSelector).dom.disabled = false; |
} |
this.disabled = false; |
}, |
|
|
isMenuTriggerOver : function(e){ |
return this.menu && e.within(this.arrowBtnTable) && !e.within(this.arrowBtnTable, true); |
}, |
|
|
isMenuTriggerOut : function(e, internal){ |
return this.menu && !e.within(this.arrowBtnTable); |
}, |
|
|
onDestroy : function(){ |
Ext.destroy(this.arrowBtnTable); |
Ext.SplitButton.superclass.onDestroy.call(this); |
} |
}); |
|
|
Ext.MenuButton = Ext.SplitButton; |
|
|
Ext.reg('splitbutton', Ext.SplitButton); |
|
Ext.CycleButton = Ext.extend(Ext.SplitButton, { |
|
|
|
|
|
|
|
getItemText : function(item){ |
if(item && this.showText === true){ |
var text = ''; |
if(this.prependText){ |
text += this.prependText; |
} |
text += item.text; |
return text; |
} |
return undefined; |
}, |
|
|
setActiveItem : function(item, suppressEvent){ |
if(typeof item != 'object'){ |
item = this.menu.items.get(item); |
} |
if(item){ |
if(!this.rendered){ |
this.text = this.getItemText(item); |
this.iconCls = item.iconCls; |
}else{ |
var t = this.getItemText(item); |
if(t){ |
this.setText(t); |
} |
this.setIconClass(item.iconCls); |
} |
this.activeItem = item; |
if(!item.checked){ |
item.setChecked(true, true); |
} |
if(this.forceIcon){ |
this.setIconClass(this.forceIcon); |
} |
if(!suppressEvent){ |
this.fireEvent('change', this, item); |
} |
} |
}, |
|
|
getActiveItem : function(){ |
return this.activeItem; |
}, |
|
|
initComponent : function(){ |
this.addEvents( |
|
"change" |
); |
|
if(this.changeHandler){ |
this.on('change', this.changeHandler, this.scope||this); |
delete this.changeHandler; |
} |
|
this.itemCount = this.items.length; |
|
this.menu = {cls:'x-cycle-menu', items:[]}; |
var checked; |
for(var i = 0, len = this.itemCount; i < len; i++){ |
var item = this.items[i]; |
item.group = item.group || this.id; |
item.itemIndex = i; |
item.checkHandler = this.checkHandler; |
item.scope = this; |
item.checked = item.checked || false; |
this.menu.items.push(item); |
if(item.checked){ |
checked = item; |
} |
} |
this.setActiveItem(checked, true); |
Ext.CycleButton.superclass.initComponent.call(this); |
|
this.on('click', this.toggleSelected, this); |
}, |
|
|
checkHandler : function(item, pressed){ |
if(pressed){ |
this.setActiveItem(item); |
} |
}, |
|
|
toggleSelected : function(){ |
this.menu.render(); |
|
var nextIdx, checkItem; |
for (var i = 1; i < this.itemCount; i++) { |
nextIdx = (this.activeItem.itemIndex + i) % this.itemCount; |
|
checkItem = this.menu.items.itemAt(nextIdx); |
|
if (!checkItem.disabled) { |
checkItem.setChecked(true); |
break; |
} |
} |
} |
}); |
Ext.reg('cycle', Ext.CycleButton); |
|
Ext.Toolbar = function(config){ |
if(Ext.isArray(config)){ |
config = {buttons:config}; |
} |
Ext.Toolbar.superclass.constructor.call(this, config); |
}; |
|
(function(){ |
|
var T = Ext.Toolbar; |
|
Ext.extend(T, Ext.BoxComponent, { |
|
trackMenus : true, |
|
|
initComponent : function(){ |
T.superclass.initComponent.call(this); |
|
if(this.items){ |
this.buttons = this.items; |
} |
|
this.items = new Ext.util.MixedCollection(false, function(o){ |
return o.itemId || o.id || Ext.id(); |
}); |
}, |
|
|
autoCreate: { |
cls:'x-toolbar x-small-editor', |
html:'<table cellspacing="0"><tr></tr></table>' |
}, |
|
|
onRender : function(ct, position){ |
this.el = ct.createChild(Ext.apply({ id: this.id },this.autoCreate), position); |
this.tr = this.el.child("tr", true); |
}, |
|
|
afterRender : function(){ |
T.superclass.afterRender.call(this); |
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.isFormField){ |
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"){ |
if(el.xtype){ |
this.addField(Ext.ComponentMgr.create(el, 'button')); |
}else{ |
this.addButton(el); |
} |
} |
} |
}, |
|
|
addSeparator : function(){ |
return this.addItem(new T.Separator()); |
}, |
|
|
addSpacer : function(){ |
return this.addItem(new T.Spacer()); |
}, |
|
|
addFill : function(){ |
return this.addItem(new T.Fill()); |
}, |
|
|
addElement : function(el){ |
return this.addItem(new T.Item(el)); |
}, |
|
|
addItem : function(item){ |
var td = this.nextBlock(); |
this.initMenuTracking(item); |
item.render(td); |
this.items.add(item); |
return item; |
}, |
|
|
addButton : function(config){ |
if(Ext.isArray(config)){ |
var buttons = []; |
for(var i = 0, len = config.length; i < len; i++) { |
buttons.push(this.addButton(config[i])); |
} |
return buttons; |
} |
var b = config; |
if(!(config instanceof T.Button)){ |
b = config.split ? |
new T.SplitButton(config) : |
new T.Button(config); |
} |
var td = this.nextBlock(); |
this.initMenuTracking(b); |
b.render(td); |
this.items.add(b); |
return b; |
}, |
|
|
initMenuTracking : function(item){ |
if(this.trackMenus && item.menu){ |
item.on({ |
'menutriggerover' : this.onButtonTriggerOver, |
'menushow' : this.onButtonMenuShow, |
'menuhide' : this.onButtonMenuHide, |
scope: this |
}) |
} |
}, |
|
|
addText : function(text){ |
return this.addItem(new T.TextItem(text)); |
}, |
|
|
insertButton : function(index, item){ |
if(Ext.isArray(item)){ |
var buttons = []; |
for(var i = 0, len = item.length; i < len; i++) { |
buttons.push(this.insertButton(index + i, item[i])); |
} |
return buttons; |
} |
if (!(item instanceof T.Button)){ |
item = new T.Button(item); |
} |
var td = document.createElement("td"); |
this.tr.insertBefore(td, this.tr.childNodes[index]); |
this.initMenuTracking(item); |
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 T.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 T.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; |
}, |
|
|
onDestroy : function(){ |
Ext.Toolbar.superclass.onDestroy.call(this); |
if(this.rendered){ |
if(this.items){ |
Ext.destroy.apply(Ext, this.items.items); |
} |
Ext.Element.uncache(this.tr); |
} |
}, |
|
|
onDisable : function(){ |
this.items.each(function(item){ |
if(item.disable){ |
item.disable(); |
} |
}); |
}, |
|
|
onEnable : function(){ |
this.items.each(function(item){ |
if(item.enable){ |
item.enable(); |
} |
}); |
}, |
|
|
onButtonTriggerOver : function(btn){ |
if(this.activeMenuBtn && this.activeMenuBtn != btn){ |
this.activeMenuBtn.hideMenu(); |
btn.showMenu(); |
this.activeMenuBtn = btn; |
} |
}, |
|
|
onButtonMenuShow : function(btn){ |
this.activeMenuBtn = btn; |
}, |
|
|
onButtonMenuHide : function(btn){ |
delete this.activeMenuBtn; |
} |
|
|
}); |
Ext.reg('toolbar', Ext.Toolbar); |
|
|
T.Item = function(el){ |
this.el = Ext.getDom(el); |
this.id = Ext.id(this.el); |
this.hidden = false; |
}; |
|
T.Item.prototype = { |
|
|
getEl : function(){ |
return this.el; |
}, |
|
|
render : function(td){ |
this.td = td; |
td.appendChild(this.el); |
}, |
|
|
destroy : function(){ |
if(this.td && this.td.parentNode){ |
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.reg('tbitem', T.Item); |
|
|
|
T.Separator = function(){ |
var s = document.createElement("span"); |
s.className = "ytb-sep"; |
T.Separator.superclass.constructor.call(this, s); |
}; |
Ext.extend(T.Separator, T.Item, { |
enable:Ext.emptyFn, |
disable:Ext.emptyFn, |
focus:Ext.emptyFn |
}); |
Ext.reg('tbseparator', T.Separator); |
|
|
T.Spacer = function(){ |
var s = document.createElement("div"); |
s.className = "ytb-spacer"; |
T.Spacer.superclass.constructor.call(this, s); |
}; |
Ext.extend(T.Spacer, T.Item, { |
enable:Ext.emptyFn, |
disable:Ext.emptyFn, |
focus:Ext.emptyFn |
}); |
|
Ext.reg('tbspacer', T.Spacer); |
|
|
T.Fill = Ext.extend(T.Spacer, { |
|
render : function(td){ |
td.style.width = '100%'; |
T.Fill.superclass.render.call(this, td); |
} |
}); |
Ext.reg('tbfill', T.Fill); |
|
|
T.TextItem = function(t){ |
var s = document.createElement("span"); |
s.className = "ytb-text"; |
s.innerHTML = t.text ? t.text : t; |
T.TextItem.superclass.constructor.call(this, s); |
}; |
Ext.extend(T.TextItem, T.Item, { |
enable:Ext.emptyFn, |
disable:Ext.emptyFn, |
focus:Ext.emptyFn |
}); |
Ext.reg('tbtext', T.TextItem); |
|
|
|
T.Button = Ext.extend(Ext.Button, { |
hideParent : true, |
|
onDestroy : function(){ |
T.Button.superclass.onDestroy.call(this); |
if(this.container){ |
this.container.remove(); |
} |
} |
}); |
Ext.reg('tbbutton', T.Button); |
|
|
T.SplitButton = Ext.extend(Ext.SplitButton, { |
hideParent : true, |
|
onDestroy : function(){ |
T.SplitButton.superclass.onDestroy.call(this); |
if(this.container){ |
this.container.remove(); |
} |
} |
}); |
|
Ext.reg('tbsplit', T.SplitButton); |
|
T.MenuButton = T.SplitButton; |
|
})(); |
|
|
Ext.PagingToolbar = Ext.extend(Ext.Toolbar, { |
|
|
|
pageSize: 20, |
|
displayMsg : 'Displaying {0} - {1} of {2}', |
|
emptyMsg : 'No data to display', |
|
beforePageText : "Page", |
|
afterPageText : "of {0}", |
|
firstText : "First Page", |
|
prevText : "Previous Page", |
|
nextText : "Next Page", |
|
lastText : "Last Page", |
|
refreshText : "Refresh", |
|
|
paramNames : {start: 'start', limit: 'limit'}, |
|
initComponent : function(){ |
Ext.PagingToolbar.superclass.initComponent.call(this); |
this.cursor = 0; |
this.bind(this.store); |
}, |
|
onRender : function(ct, position){ |
Ext.PagingToolbar.superclass.onRender.call(this, ct, position); |
this.first = this.addButton({ |
tooltip: this.firstText, |
iconCls: "x-tbar-page-first", |
disabled: true, |
handler: this.onClick.createDelegate(this, ["first"]) |
}); |
this.prev = this.addButton({ |
tooltip: this.prevText, |
iconCls: "x-tbar-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-tbar-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, |
iconCls: "x-tbar-page-next", |
disabled: true, |
handler: this.onClick.createDelegate(this, ["next"]) |
}); |
this.last = this.addButton({ |
tooltip: this.lastText, |
iconCls: "x-tbar-page-last", |
disabled: true, |
handler: this.onClick.createDelegate(this, ["last"]) |
}); |
this.addSeparator(); |
this.loading = this.addButton({ |
tooltip: this.refreshText, |
iconCls: "x-tbar-loading", |
handler: this.onClick.createDelegate(this, ["refresh"]) |
}); |
|
if(this.displayInfo){ |
this.displayEl = Ext.fly(this.el.dom).createChild({cls:'x-paging-info'}); |
} |
if(this.dsLoaded){ |
this.onLoad.apply(this, this.dsLoaded); |
} |
}, |
|
updateInfo : function(){ |
if(this.displayEl){ |
var count = this.store.getCount(); |
var msg = count == 0 ? |
this.emptyMsg : |
String.format( |
this.displayMsg, |
this.cursor+1, this.cursor+count, this.store.getTotalCount() |
); |
this.displayEl.update(msg); |
} |
}, |
|
onLoad : function(store, r, o){ |
if(!this.rendered){ |
this.dsLoaded = [store, r, o]; |
return; |
} |
this.cursor = o.params ? o.params[this.paramNames.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.store.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(){ |
if(!this.rendered){ |
return; |
} |
this.loading.enable(); |
}, |
|
readPage : function(d){ |
var v = this.field.dom.value, pageNum; |
if (!v || isNaN(pageNum = parseInt(v, 10))) { |
this.field.dom.value = d.activePage; |
return false; |
} |
return pageNum; |
}, |
|
onPagingKeydown : function(e){ |
var k = e.getKey(), d = this.getPageData(), pageNum; |
if (k == e.RETURN) { |
e.stopEvent(); |
if(pageNum = this.readPage(d)){ |
pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1; |
this.doLoad(pageNum * this.pageSize); |
} |
}else if (k == e.HOME || k == e.END){ |
e.stopEvent(); |
pageNum = k == e.HOME ? 1 : d.pages; |
this.field.dom.value = pageNum; |
}else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN){ |
e.stopEvent(); |
if(pageNum = this.readPage(d)){ |
var increment = e.shiftKey ? 10 : 1; |
if(k == e.DOWN || k == e.PAGEDOWN){ |
increment *= -1; |
} |
pageNum += increment; |
if(pageNum >= 1 & pageNum <= d.pages){ |
this.field.dom.value = pageNum; |
} |
} |
} |
}, |
|
beforeLoad : function(){ |
if(this.rendered && this.loading){ |
this.loading.disable(); |
} |
}, |
|
doLoad : function(start){ |
var o = {}, pn = this.paramNames; |
o[pn.start] = start; |
o[pn.limit] = this.pageSize; |
this.store.load({params:o}); |
}, |
|
onClick : function(which){ |
var store = this.store; |
switch(which){ |
case "first": |
this.doLoad(0); |
break; |
case "prev": |
this.doLoad(Math.max(0, this.cursor-this.pageSize)); |
break; |
case "next": |
this.doLoad(this.cursor+this.pageSize); |
break; |
case "last": |
var total = store.getTotalCount(); |
var extra = total % this.pageSize; |
var lastStart = extra ? (total - extra) : total-this.pageSize; |
this.doLoad(lastStart); |
break; |
case "refresh": |
this.doLoad(this.cursor); |
break; |
} |
}, |
|
|
unbind : function(store){ |
store = Ext.StoreMgr.lookup(store); |
store.un("beforeload", this.beforeLoad, this); |
store.un("load", this.onLoad, this); |
store.un("loadexception", this.onLoadError, this); |
this.store = undefined; |
}, |
|
|
bind : function(store){ |
store = Ext.StoreMgr.lookup(store); |
store.on("beforeload", this.beforeLoad, this); |
store.on("load", this.onLoad, this); |
store.on("loadexception", this.onLoadError, this); |
this.store = store; |
} |
}); |
Ext.reg('paging', Ext.PagingToolbar); |
|
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", |
"resize" |
); |
|
if(this.width !== null && this.height !== null){ |
this.resizeTo(this.width, this.height); |
}else{ |
this.updateChildSize(); |
} |
if(Ext.isIE){ |
this.el.dom.style.zoom = 1; |
} |
Ext.Resizable.superclass.constructor.call(this); |
}; |
|
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, |
|
|
|
|
|
|
|
|
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: " "}, Ext.getBody()); |
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(); |
} |
}, |
|
syncHandleHeight : function(){ |
var h = this.el.getHeight(true); |
if(this.west){ |
this.west.el.setHeight(h); |
} |
if(this.east){ |
this.east.el.setHeight(h); |
} |
} |
}); |
|
|
|
Ext.Resizable.positions = { |
n: "north", s: "south", e: "east", w: "west", se: "southeast", sw: "southwest", nw: "northwest", ne: "northeast" |
}; |
|
|
Ext.Resizable.Handle = 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){ |
this.field = field; |
Ext.Editor.superclass.constructor.call(this, config); |
}; |
|
Ext.extend(Ext.Editor, Ext.Component, { |
|
|
|
|
|
value : "", |
|
alignment: "c-c?", |
|
shadow : "frame", |
|
constrain : false, |
|
swallowKeys : true, |
|
completeOnEnter : false, |
|
cancelOnEsc : false, |
|
updateEl : false, |
|
initComponent : function(){ |
Ext.Editor.superclass.initComponent.call(this); |
this.addEvents( |
|
"beforestartedit", |
|
"startedit", |
|
"beforecomplete", |
|
"complete", |
|
"specialkey" |
); |
}, |
|
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.inEditor = true; |
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); |
this.doAutoSize(); |
this.el.alignTo(this.boundEl, this.alignment); |
this.editing = true; |
this.show(); |
}, |
|
doAutoSize : function(){ |
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); |
} |
} |
}, |
|
|
setSize : function(w, h){ |
delete this.field.lastSize; |
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(); |
} |
}, |
|
|
setValue : function(v){ |
this.field.setValue(v); |
}, |
|
|
getValue : function(){ |
return this.field.getValue(); |
}, |
|
beforeDestroy : function(){ |
this.field.destroy(); |
this.field = null; |
} |
}); |
Ext.reg('editor', Ext.Editor); |
|
Ext.MessageBox = function(){ |
var dlg, opt, mask, waitTimer; |
var bodyEl, msgEl, textboxEl, textareaEl, progressBar, pp, iconEl, spacerEl; |
var buttons, activeTextEl, bwidth, iconCls = ''; |
|
|
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); |
} |
progressBar.reset(); |
}; |
|
|
var handleEsc = function(d, k, e){ |
if(opt && opt.closable !== false){ |
dlg.hide(); |
} |
if(e){ |
e.stopEvent(); |
} |
}; |
|
|
var updateButtons = function(b){ |
var width = 0; |
if(!b){ |
buttons["ok"].hide(); |
buttons["cancel"].hide(); |
buttons["yes"].hide(); |
buttons["no"].hide(); |
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; |
}; |
|
return { |
|
getDialog : function(titleText){ |
if(!dlg){ |
dlg = new Ext.Window({ |
autoCreate : true, |
title:titleText, |
resizable:false, |
constrain:true, |
constrainHeader:true, |
minimizable : false, |
maximizable : false, |
stateful: false, |
modal: true, |
shim:true, |
buttonAlign:"center", |
width:400, |
height:100, |
minHeight: 80, |
plain:true, |
footer:true, |
closable:true, |
close : function(){ |
if(opt && opt.buttons && opt.buttons.no && !opt.buttons.cancel){ |
handleButton("no"); |
}else{ |
handleButton("cancel"); |
} |
} |
}); |
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")); |
buttons["ok"].hideMode = buttons["yes"].hideMode = buttons["no"].hideMode = buttons["cancel"].hideMode = 'offsets'; |
dlg.render(document.body); |
dlg.getEl().addClass('x-window-dlg'); |
mask = dlg.mask; |
bodyEl = dlg.body.createChild({ |
html:'<div class="ext-mb-icon"></div><div class="ext-mb-content"><span class="ext-mb-text"></span><br /><input type="text" class="ext-mb-input" /><textarea class="ext-mb-textarea"></textarea></div>' |
}); |
iconEl = Ext.get(bodyEl.dom.firstChild); |
var contentEl = bodyEl.dom.childNodes[1]; |
msgEl = Ext.get(contentEl.firstChild); |
textboxEl = Ext.get(contentEl.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(contentEl.childNodes[3]); |
textareaEl.enableDisplayMode(); |
progressBar = new Ext.ProgressBar({ |
renderTo:bodyEl |
}); |
bodyEl.createChild({cls:'x-clear'}); |
} |
return dlg; |
}, |
|
|
updateText : function(text){ |
if(!dlg.isVisible() && !opt.width){ |
dlg.setSize(this.maxWidth, 100); |
} |
msgEl.update(text || ' '); |
|
var iw = iconCls != '' ? (iconEl.getWidth() + iconEl.getMargins('lr')) : 0; |
var mw = msgEl.getWidth() + msgEl.getMargins('lr'); |
var fw = dlg.getFrameWidth('lr'); |
var bw = dlg.body.getFrameWidth('lr'); |
if (Ext.isIE && iw > 0){ |
|
|
iw += 3; |
} |
var w = Math.max(Math.min(opt.width || iw+mw+fw+bw, this.maxWidth), |
Math.max(opt.minWidth || this.minWidth, bwidth || 0)); |
|
if(opt.prompt === true){ |
activeTextEl.setWidth(w-iw-fw-bw); |
} |
if(opt.progress === true || opt.wait === true){ |
progressBar.setSize(w-iw-fw-bw); |
} |
dlg.setSize(w, 'auto').center(); |
return this; |
}, |
|
|
updateProgress : function(value, progressText, msg){ |
progressBar.updateProgress(value, progressText); |
if(msg){ |
this.updateText(msg); |
} |
return this; |
}, |
|
|
isVisible : function(){ |
return dlg && dlg.isVisible(); |
}, |
|
|
hide : function(){ |
if(this.isVisible()){ |
dlg.hide(); |
handleHide(); |
} |
return this; |
}, |
|
|
show : function(options){ |
if(this.isVisible()){ |
this.hide(); |
} |
opt = options; |
var d = this.getDialog(opt.title || " "); |
|
d.setTitle(opt.title || " "); |
var allowClose = (opt.closable !== false && opt.progress !== true && opt.wait !== true); |
d.tools.close.setDisplayed(allowClose); |
activeTextEl = textboxEl; |
opt.prompt = opt.prompt || (opt.multiline ? true : false); |
if(opt.prompt){ |
if(opt.multiline){ |
textboxEl.hide(); |
textareaEl.show(); |
textareaEl.setHeight(typeof opt.multiline == "number" ? |
opt.multiline : this.defaultTextHeight); |
activeTextEl = textareaEl; |
}else{ |
textboxEl.show(); |
textareaEl.hide(); |
} |
}else{ |
textboxEl.hide(); |
textareaEl.hide(); |
} |
activeTextEl.dom.value = opt.value || ""; |
if(opt.prompt){ |
d.focusEl = activeTextEl; |
}else{ |
var bs = opt.buttons; |
var db = null; |
if(bs && bs.ok){ |
db = buttons["ok"]; |
}else if(bs && bs.yes){ |
db = buttons["yes"]; |
} |
if (db){ |
d.focusEl = db; |
} |
} |
this.setIcon(opt.icon); |
bwidth = updateButtons(opt.buttons); |
progressBar.setVisible(opt.progress === true || opt.wait === true); |
this.updateProgress(0, opt.progressText); |
this.updateText(opt.msg); |
if(opt.cls){ |
d.el.addClass(opt.cls); |
} |
d.proxyDrag = opt.proxyDrag === true; |
d.modal = opt.modal !== false; |
d.mask = opt.modal !== false ? mask : false; |
if(!d.isVisible()){ |
|
document.body.appendChild(dlg.el.dom); |
d.setAnimateTarget(opt.animEl); |
d.show(opt.animEl); |
} |
|
|
d.on('show', function(){ |
if(allowClose === true){ |
d.keyMap.enable(); |
}else{ |
d.keyMap.disable(); |
} |
}, this, {single:true}); |
|
if(opt.wait === true){ |
progressBar.wait(opt.waitConfig); |
} |
return this; |
}, |
|
|
setIcon : function(icon){ |
if(icon && icon != ''){ |
iconEl.removeClass('x-hidden'); |
iconEl.replaceClass(iconCls, icon); |
iconCls = icon; |
}else{ |
iconEl.replaceClass(iconCls, 'x-hidden'); |
iconCls = ''; |
} |
return this; |
}, |
|
|
progress : function(title, msg, progressText){ |
this.show({ |
title : title, |
msg : msg, |
buttons: false, |
progress:true, |
closable:false, |
minWidth: this.minProgressWidth, |
progressText: progressText |
}); |
return this; |
}, |
|
|
wait : function(msg, title, config){ |
this.show({ |
title : title, |
msg : msg, |
buttons: false, |
closable:false, |
wait:true, |
modal:true, |
minWidth: this.minProgressWidth, |
waitConfig: config |
}); |
return this; |
}, |
|
|
alert : function(title, msg, fn, scope){ |
this.show({ |
title : title, |
msg : msg, |
buttons: this.OK, |
fn: fn, |
scope : scope |
}); |
return this; |
}, |
|
|
confirm : function(title, msg, fn, scope){ |
this.show({ |
title : title, |
msg : msg, |
buttons: this.YESNO, |
fn: fn, |
scope : scope, |
icon: this.QUESTION |
}); |
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}, |
|
CANCEL : {cancel:true}, |
|
OKCANCEL : {ok:true, cancel:true}, |
|
YESNO : {yes:true, no:true}, |
|
YESNOCANCEL : {yes:true, no:true, cancel:true}, |
|
INFO : 'ext-mb-info', |
|
WARNING : 'ext-mb-warning', |
|
QUESTION : 'ext-mb-question', |
|
ERROR : 'ext-mb-error', |
|
|
defaultTextHeight : 75, |
|
maxWidth : 600, |
|
minWidth : 100, |
|
minProgressWidth : 250, |
|
buttonText : { |
ok : "OK", |
cancel : "Cancel", |
yes : "Yes", |
no : "No" |
} |
}; |
}(); |
|
|
Ext.Msg = Ext.MessageBox; |
|
Ext.Tip = Ext.extend(Ext.Panel, { |
|
|
|
minWidth : 40, |
|
maxWidth : 300, |
|
shadow : "sides", |
|
defaultAlign : "tl-bl?", |
autoRender: true, |
quickShowInterval : 250, |
|
|
frame:true, |
hidden:true, |
baseCls: 'x-tip', |
floating:{shadow:true,shim:true,useDisplay:true,constrain:false}, |
autoHeight:true, |
|
|
initComponent : function(){ |
Ext.Tip.superclass.initComponent.call(this); |
if(this.closable && !this.title){ |
this.elements += ',header'; |
} |
}, |
|
|
afterRender : function(){ |
Ext.Tip.superclass.afterRender.call(this); |
if(this.closable){ |
this.addTool({ |
id: 'close', |
handler: this.hide, |
scope: this |
}); |
} |
}, |
|
|
showAt : function(xy){ |
Ext.Tip.superclass.show.call(this); |
if(this.measureWidth !== false && (!this.initialConfig || typeof this.initialConfig.width != 'number')){ |
var bw = this.body.getTextWidth(); |
if(this.title){ |
bw = Math.max(bw, this.header.child('span').getTextWidth(this.title)); |
} |
bw += this.getFrameWidth() + (this.closable ? 20 : 0) + this.body.getPadding("lr"); |
this.setWidth(bw.constrain(this.minWidth, this.maxWidth)); |
} |
if(this.constrainPosition){ |
xy = this.el.adjustForConstraints(xy); |
} |
this.setPagePosition(xy[0], xy[1]); |
}, |
|
|
showBy : function(el, pos){ |
if(!this.rendered){ |
this.render(Ext.getBody()); |
} |
this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign)); |
}, |
|
initDraggable : function(){ |
this.dd = new Ext.Tip.DD(this, typeof this.draggable == 'boolean' ? null : this.draggable); |
this.header.addClass('x-tip-draggable'); |
} |
}); |
|
|
Ext.Tip.DD = function(tip, config){ |
Ext.apply(this, config); |
this.tip = tip; |
Ext.Tip.DD.superclass.constructor.call(this, tip.el.id, 'WindowDD-'+tip.id); |
this.setHandleElId(tip.header.id); |
this.scroll = false; |
}; |
|
Ext.extend(Ext.Tip.DD, Ext.dd.DD, { |
moveOnly:true, |
scroll:false, |
headerOffsets:[100, 25], |
startDrag : function(){ |
this.tip.el.disableShadow(); |
}, |
endDrag : function(e){ |
this.tip.el.enableShadow(true); |
} |
}); |
|
Ext.ToolTip = Ext.extend(Ext.Tip, { |
|
|
|
showDelay: 500, |
|
hideDelay: 200, |
|
dismissDelay: 5000, |
|
mouseOffset: [15,18], |
|
trackMouse : false, |
constrainPosition: true, |
|
|
initComponent: function(){ |
Ext.ToolTip.superclass.initComponent.call(this); |
this.lastActive = new Date(); |
this.initTarget(); |
}, |
|
|
initTarget : function(){ |
if(this.target){ |
this.target = Ext.get(this.target); |
this.target.on('mouseover', this.onTargetOver, this); |
this.target.on('mouseout', this.onTargetOut, this); |
this.target.on('mousemove', this.onMouseMove, this); |
} |
}, |
|
|
onMouseMove : function(e){ |
this.targetXY = e.getXY(); |
if(!this.hidden && this.trackMouse){ |
this.setPagePosition(this.getTargetXY()); |
} |
}, |
|
|
getTargetXY : function(){ |
return [this.targetXY[0]+this.mouseOffset[0], this.targetXY[1]+this.mouseOffset[1]]; |
}, |
|
|
onTargetOver : function(e){ |
if(this.disabled || e.within(this.target.dom, true)){ |
return; |
} |
this.clearTimer('hide'); |
this.targetXY = e.getXY(); |
this.delayShow(); |
}, |
|
|
delayShow : function(){ |
if(this.hidden && !this.showTimer){ |
if(this.lastActive.getElapsed() < this.quickShowInterval){ |
this.show(); |
}else{ |
this.showTimer = this.show.defer(this.showDelay, this); |
} |
}else if(!this.hidden && this.autoHide !== false){ |
this.show(); |
} |
}, |
|
|
onTargetOut : function(e){ |
if(this.disabled || e.within(this.target.dom, true)){ |
return; |
} |
this.clearTimer('show'); |
if(this.autoHide !== false){ |
this.delayHide(); |
} |
}, |
|
|
delayHide : function(){ |
if(!this.hidden && !this.hideTimer){ |
this.hideTimer = this.hide.defer(this.hideDelay, this); |
} |
}, |
|
|
hide: function(){ |
this.clearTimer('dismiss'); |
this.lastActive = new Date(); |
Ext.ToolTip.superclass.hide.call(this); |
}, |
|
|
show : function(){ |
this.showAt(this.getTargetXY()); |
}, |
|
|
showAt : function(xy){ |
this.lastActive = new Date(); |
this.clearTimers(); |
Ext.ToolTip.superclass.showAt.call(this, xy); |
if(this.dismissDelay && this.autoHide !== false){ |
this.dismissTimer = this.hide.defer(this.dismissDelay, this); |
} |
}, |
|
|
clearTimer : function(name){ |
name = name + 'Timer'; |
clearTimeout(this[name]); |
delete this[name]; |
}, |
|
|
clearTimers : function(){ |
this.clearTimer('show'); |
this.clearTimer('dismiss'); |
this.clearTimer('hide'); |
}, |
|
|
onShow : function(){ |
Ext.ToolTip.superclass.onShow.call(this); |
Ext.getDoc().on('mousedown', this.onDocMouseDown, this); |
}, |
|
|
onHide : function(){ |
Ext.ToolTip.superclass.onHide.call(this); |
Ext.getDoc().un('mousedown', this.onDocMouseDown, this); |
}, |
|
|
onDocMouseDown : function(e){ |
if(this.autoHide !== false && !e.within(this.el.dom)){ |
this.disable(); |
this.enable.defer(100, this); |
} |
}, |
|
|
onDisable : function(){ |
this.clearTimers(); |
this.hide(); |
}, |
|
|
adjustPosition : function(x, y){ |
|
var ay = this.targetXY[1], h = this.getSize().height; |
if(this.constrainPosition && y <= ay && (y+h) >= ay){ |
y = ay-h-5; |
} |
return {x : x, y: y}; |
}, |
|
|
onDestroy : function(){ |
Ext.ToolTip.superclass.onDestroy.call(this); |
if(this.target){ |
this.target.un('mouseover', this.onTargetOver, this); |
this.target.un('mouseout', this.onTargetOut, this); |
this.target.un('mousemove', this.onMouseMove, this); |
} |
} |
}); |
|
Ext.QuickTip = Ext.extend(Ext.ToolTip, { |
|
|
interceptTitles : false, |
|
|
tagConfig : { |
namespace : "ext", |
attribute : "qtip", |
width : "qwidth", |
target : "target", |
title : "qtitle", |
hide : "hide", |
cls : "qclass", |
align : "qalign" |
}, |
|
|
initComponent : function(){ |
this.target = this.target || Ext.getDoc(); |
this.targets = this.targets || {}; |
Ext.QuickTip.superclass.initComponent.call(this); |
}, |
|
|
register : function(config){ |
var cs = Ext.isArray(config) ? config : arguments; |
for(var i = 0, len = cs.length; i < len; i++){ |
var c = cs[i]; |
var target = c.target; |
if(target){ |
if(Ext.isArray(target)){ |
for(var j = 0, jlen = target.length; j < jlen; j++){ |
this.targets[Ext.id(target[j])] = c; |
} |
} else{ |
this.targets[Ext.id(target)] = c; |
} |
} |
} |
}, |
|
|
unregister : function(el){ |
delete this.targets[Ext.id(el)]; |
}, |
|
|
onTargetOver : function(e){ |
if(this.disabled){ |
return; |
} |
this.targetXY = e.getXY(); |
var t = e.getTarget(); |
if(!t || t.nodeType !== 1 || t == document || t == document.body){ |
return; |
} |
if(this.activeTarget && t == this.activeTarget.el){ |
this.clearTimer('hide'); |
this.show(); |
return; |
} |
if(t && this.targets[t.id]){ |
this.activeTarget = this.targets[t.id]; |
this.activeTarget.el = t; |
this.delayShow(); |
return; |
} |
var ttp, et = Ext.fly(t), cfg = this.tagConfig; |
var ns = cfg.namespace; |
if(this.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){ |
var autoHide = et.getAttributeNS(ns, cfg.hide); |
this.activeTarget = { |
el: t, |
text: ttp, |
width: et.getAttributeNS(ns, cfg.width), |
autoHide: autoHide != "user" && autoHide !== 'false', |
title: et.getAttributeNS(ns, cfg.title), |
cls: et.getAttributeNS(ns, cfg.cls), |
align: et.getAttributeNS(ns, cfg.align) |
}; |
this.delayShow(); |
} |
}, |
|
|
onTargetOut : function(e){ |
this.clearTimer('show'); |
if(this.autoHide !== false){ |
this.delayHide(); |
} |
}, |
|
|
showAt : function(xy){ |
var t = this.activeTarget; |
if(t){ |
if(!this.rendered){ |
this.render(Ext.getBody()); |
this.activeTarget = t; |
} |
if(t.width){ |
this.setWidth(t.width); |
this.body.setWidth(this.adjustBodyWidth(t.width - this.getFrameWidth())); |
this.measureWidth = false; |
} else{ |
this.measureWidth = true; |
} |
this.setTitle(t.title || ''); |
this.body.update(t.text); |
this.autoHide = t.autoHide; |
this.dismissDelay = t.dismissDelay || this.dismissDelay; |
if(this.lastCls){ |
this.el.removeClass(this.lastCls); |
delete this.lastCls; |
} |
if(t.cls){ |
this.el.addClass(t.cls); |
this.lastCls = t.cls; |
} |
if(t.align){ |
xy = this.el.getAlignToXY(t.el, t.align); |
this.constrainPosition = false; |
} else{ |
this.constrainPosition = true; |
} |
} |
Ext.QuickTip.superclass.showAt.call(this, xy); |
}, |
|
|
hide: function(){ |
delete this.activeTarget; |
Ext.QuickTip.superclass.hide.call(this); |
} |
}); |
|
Ext.QuickTips = function(){ |
var tip, locks = []; |
return { |
|
init : function(){ |
if(!tip){ |
tip = new Ext.QuickTip({elements:'header,body'}); |
} |
}, |
|
|
enable : function(){ |
if(tip){ |
locks.pop(); |
if(locks.length < 1){ |
tip.enable(); |
} |
} |
}, |
|
|
disable : function(){ |
if(tip){ |
tip.disable(); |
} |
locks.push(1); |
}, |
|
|
isEnabled : function(){ |
return tip && !tip.disabled; |
}, |
|
|
getQuickTip : function(){ |
return tip; |
}, |
|
|
register : function(){ |
tip.register.apply(tip, arguments); |
}, |
|
|
unregister : function(){ |
tip.unregister.apply(tip, arguments); |
}, |
|
|
tips :function(){ |
tip.register.apply(tip, arguments); |
} |
} |
}(); |
|
Ext.tree.TreePanel = Ext.extend(Ext.Panel, { |
rootVisible : true, |
animate: Ext.enableFx, |
lines : true, |
enableDD : false, |
hlDrop : Ext.enableFx, |
pathSeparator: "/", |
|
initComponent : function(){ |
Ext.tree.TreePanel.superclass.initComponent.call(this); |
|
if(!this.eventModel){ |
this.eventModel = new Ext.tree.TreeEventModel(this); |
} |
|
this.nodeHash = {}; |
|
|
if(this.root){ |
this.setRootNode(this.root); |
} |
|
this.addEvents( |
|
|
"append", |
|
"remove", |
|
"movenode", |
|
"insert", |
|
"beforeappend", |
|
"beforeremove", |
|
"beforemovenode", |
|
"beforeinsert", |
|
|
"beforeload", |
|
"load", |
|
"textchange", |
|
"beforeexpandnode", |
|
"beforecollapsenode", |
|
"expandnode", |
|
"disabledchange", |
|
"collapsenode", |
|
"beforeclick", |
|
"click", |
|
"checkchange", |
|
"dblclick", |
|
"contextmenu", |
|
"beforechildrenrendered", |
|
"startdrag", |
|
"enddrag", |
|
"dragdrop", |
|
"beforenodedrop", |
|
"nodedrop", |
|
"nodedragover" |
); |
if(this.singleExpand){ |
this.on("beforeexpandnode", this.restrictExpand, this); |
} |
}, |
|
|
proxyNodeEvent : function(ename, a1, a2, a3, a4, a5, a6){ |
if(ename == 'collapse' || ename == 'expand' || ename == 'beforecollapse' || ename == 'beforeexpand' || ename == 'move' || ename == 'beforemove'){ |
ename = ename+'node'; |
} |
|
return this.fireEvent(ename, a1, a2, a3, a4, a5, a6); |
}, |
|
|
|
getRootNode : function(){ |
return this.root; |
}, |
|
|
setRootNode : function(node){ |
this.root = node; |
node.ownerTree = this; |
node.isRoot = true; |
this.registerNode(node); |
if(!this.rootVisible){ |
var uiP = node.attributes.uiProvider; |
node.ui = uiP ? new uiP(node) : new Ext.tree.RootTreeNodeUI(node); |
} |
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:"")+"]"; |
}, |
|
|
restrictExpand : function(node){ |
var p = node.parentNode; |
if(p){ |
if(p.expandedChild && p.expandedChild.parentNode == p){ |
p.expandedChild.collapse(); |
} |
p.expandedChild = node; |
} |
}, |
|
|
getChecked : function(a, startNode){ |
startNode = startNode || this.root; |
var r = []; |
var f = function(){ |
if(this.attributes.checked){ |
r.push(!a ? this : (a == 'id' ? this.id : this.attributes[a])); |
} |
} |
startNode.cascade(f); |
return r; |
}, |
|
|
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; |
}, |
|
|
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.body; |
}, |
|
|
onRender : function(ct, position){ |
Ext.tree.TreePanel.superclass.onRender.call(this, ct, position); |
this.el.addClass('x-tree'); |
this.innerCt = this.body.createChild({tag:"ul", |
cls:"x-tree-root-ct " + |
(this.useArrows ? 'x-tree-arrows' : this.lines ? "x-tree-lines" : "x-tree-no-lines")}); |
}, |
|
|
initEvents : function(){ |
Ext.tree.TreePanel.superclass.initEvents.call(this); |
|
if(this.containerScroll){ |
Ext.dd.ScrollManager.register(this.body); |
} |
if((this.enableDD || this.enableDrop) && !this.dropZone){ |
|
this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig || { |
ddGroup: this.ddGroup || "TreeDD", appendOnly: this.ddAppendOnly === true |
}); |
} |
if((this.enableDD || this.enableDrag) && !this.dragZone){ |
|
this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig || { |
ddGroup: this.ddGroup || "TreeDD", |
scroll: this.ddScroll |
}); |
} |
this.getSelectionModel().init(this); |
}, |
|
|
afterRender : function(){ |
Ext.tree.TreePanel.superclass.afterRender.call(this); |
this.root.render(); |
if(!this.rootVisible){ |
this.root.renderChildren(); |
} |
}, |
|
onDestroy : function(){ |
if(this.rendered){ |
this.body.removeAllListeners(); |
Ext.dd.ScrollManager.unregister(this.body); |
if(this.dropZone){ |
this.dropZone.unreg(); |
} |
if(this.dragZone){ |
this.dragZone.unreg(); |
} |
} |
this.root.destroy(); |
this.nodeHash = null; |
Ext.tree.TreePanel.superclass.onDestroy.call(this); |
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}); |
Ext.reg('treepanel', Ext.tree.TreePanel); |
Ext.tree.TreeEventModel = function(tree){ |
this.tree = tree; |
this.tree.on('render', this.initEvents, this); |
} |
|
Ext.tree.TreeEventModel.prototype = { |
initEvents : function(){ |
var el = this.tree.getTreeEl(); |
el.on('click', this.delegateClick, this); |
if(this.tree.trackMouseOver !== false){ |
el.on('mouseover', this.delegateOver, this); |
el.on('mouseout', this.delegateOut, this); |
} |
el.on('dblclick', this.delegateDblClick, this); |
el.on('contextmenu', this.delegateContextMenu, this); |
}, |
|
getNode : function(e){ |
var t; |
if(t = e.getTarget('.x-tree-node-el', 10)){ |
var id = Ext.fly(t, '_treeEvents').getAttributeNS('ext', 'tree-node-id'); |
if(id){ |
return this.tree.getNodeById(id); |
} |
} |
return null; |
}, |
|
getNodeTarget : function(e){ |
var t = e.getTarget('.x-tree-node-icon', 1); |
if(!t){ |
t = e.getTarget('.x-tree-node-el', 6); |
} |
return t; |
}, |
|
delegateOut : function(e, t){ |
if(!this.beforeEvent(e)){ |
return; |
} |
if(e.getTarget('.x-tree-ec-icon', 1)){ |
var n = this.getNode(e); |
this.onIconOut(e, n); |
if(n == this.lastEcOver){ |
delete this.lastEcOver; |
} |
} |
if((t = this.getNodeTarget(e)) && !e.within(t, true)){ |
this.onNodeOut(e, this.getNode(e)); |
} |
}, |
|
delegateOver : function(e, t){ |
if(!this.beforeEvent(e)){ |
return; |
} |
if(this.lastEcOver){ |
this.onIconOut(e, this.lastEcOver); |
delete this.lastEcOver; |
} |
if(e.getTarget('.x-tree-ec-icon', 1)){ |
this.lastEcOver = this.getNode(e); |
this.onIconOver(e, this.lastEcOver); |
} |
if(t = this.getNodeTarget(e)){ |
this.onNodeOver(e, this.getNode(e)); |
} |
}, |
|
delegateClick : function(e, t){ |
if(!this.beforeEvent(e)){ |
return; |
} |
|
if(e.getTarget('input[type=checkbox]', 1)){ |
this.onCheckboxClick(e, this.getNode(e)); |
} |
else if(e.getTarget('.x-tree-ec-icon', 1)){ |
this.onIconClick(e, this.getNode(e)); |
} |
else if(this.getNodeTarget(e)){ |
this.onNodeClick(e, this.getNode(e)); |
} |
}, |
|
delegateDblClick : function(e, t){ |
if(this.beforeEvent(e) && this.getNodeTarget(e)){ |
this.onNodeDblClick(e, this.getNode(e)); |
} |
}, |
|
delegateContextMenu : function(e, t){ |
if(this.beforeEvent(e) && this.getNodeTarget(e)){ |
this.onNodeContextMenu(e, this.getNode(e)); |
} |
}, |
|
onNodeClick : function(e, node){ |
node.ui.onClick(e); |
}, |
|
onNodeOver : function(e, node){ |
node.ui.onOver(e); |
}, |
|
onNodeOut : function(e, node){ |
node.ui.onOut(e); |
}, |
|
onIconOver : function(e, node){ |
node.ui.addClass('x-tree-ec-over'); |
}, |
|
onIconOut : function(e, node){ |
node.ui.removeClass('x-tree-ec-over'); |
}, |
|
onIconClick : function(e, node){ |
node.ui.ecClick(e); |
}, |
|
onCheckboxClick : function(e, node){ |
node.ui.onCheckChange(e); |
}, |
|
onNodeDblClick : function(e, node){ |
node.ui.onDblClick(e); |
}, |
|
onNodeContextMenu : function(e, node){ |
node.ui.onContextMenu(e); |
}, |
|
beforeEvent : function(e){ |
if(this.disabled){ |
e.stopEvent(); |
return false; |
} |
return true; |
}, |
|
disable: function(){ |
this.disabled = true; |
}, |
|
enable: function(){ |
this.disabled = false; |
} |
}; |
|
Ext.tree.DefaultSelectionModel = function(config){ |
this.selNode = null; |
|
this.addEvents( |
|
"selectionchange", |
|
|
"beforeselect" |
); |
|
Ext.apply(this, config); |
Ext.tree.DefaultSelectionModel.superclass.constructor.call(this); |
}; |
|
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(config){ |
this.selNodes = []; |
this.selMap = {}; |
this.addEvents( |
|
"selectionchange" |
); |
Ext.apply(this, config); |
Ext.tree.MultiSelectionModel.superclass.constructor.call(this); |
}; |
|
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 = sn.indexOf(node); |
if(index != -1){ |
this.selNodes.splice(index, 1); |
} |
delete this.selMap[node.id]; |
this.fireEvent("selectionchange", this, this.selNodes); |
} |
}, |
|
|
clearSelections : function(suppressEvent){ |
var sn = this.selNodes; |
if(sn.length > 0){ |
for(var i = 0, len = sn.length; i < len; i++){ |
sn[i].ui.onSelectedChange(false); |
} |
this.selNodes = []; |
this.selMap = {}; |
if(suppressEvent !== true){ |
this.fireEvent("selectionchange", this, this.selNodes); |
} |
} |
}, |
|
|
isSelected : function(node){ |
return this.selMap[node.id] ? true : false; |
}, |
|
|
getSelectedNodes : function(){ |
return this.selNodes; |
}, |
|
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", |
|
"beforeexpand", |
|
"beforecollapse", |
|
"expand", |
|
"disabledchange", |
|
"collapse", |
|
"beforeclick", |
|
"click", |
|
"checkchange", |
|
"dblclick", |
|
"contextmenu", |
|
"beforechildrenrendered" |
); |
|
var uiClass = this.attributes.uiProvider || this.defaultUI || 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.isHiddenRoot()) { |
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(){ |
var node = tree.getNodeById(this.id); |
tree.getTreeEl().scrollChildIntoView(node.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.getOwnerTree().registerNode(this); |
this.rendered = true; |
if(this.expanded){ |
this.expanded = false; |
this.expand(false, false); |
} |
} |
}, |
|
|
renderIndent : function(deep, refresh){ |
if(refresh){ |
this.ui.childIndent = null; |
} |
this.ui.renderIndent(); |
if(deep === true && this.childrenRendered){ |
var cs = this.childNodes; |
for(var i = 0, len = cs.length; i < len; i++){ |
cs[i].renderIndent(true, refresh); |
} |
} |
}, |
|
beginUpdate : function(){ |
this.childrenRendered = false; |
}, |
|
endUpdate : function(){ |
if(this.expanded){ |
this.renderChildren(); |
} |
}, |
|
destroy : function(){ |
for(var i = 0,l = this.childNodes.length; i < l; i++){ |
this.childNodes[i].destroy(); |
} |
this.childNodes = null; |
if(this.ui.destroy){ |
this.ui.destroy(); |
} |
} |
}); |
|
Ext.tree.AsyncTreeNode = function(config){ |
this.loaded = false; |
this.loading = false; |
Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments); |
|
this.addEvents('beforeload', 'load'); |
|
|
}; |
Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, { |
expand : function(deep, anim, callback){ |
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.wasLeaf = true; |
this.ecc = 'x-tree-ec-icon x-tree-elbow'; |
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 (this.checkbox) { |
this.checkbox.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); |
|
if(this.node.disabled){ |
this.addClass("x-tree-node-disabled"); |
if (this.checkbox) { |
this.checkbox.disabled = true; |
} |
} |
if(this.node.hidden){ |
this.hide(); |
} |
var ot = this.node.getOwnerTree(); |
var dd = ot.enableDD || ot.enableDrag || ot.enableDrop; |
if(dd && (!this.node.isRoot || ot.rootVisible)){ |
Ext.dd.Registry.register(this.elNode, { |
node: this.node, |
handles: this.getDDHandles(), |
isHandle: false |
}); |
} |
}, |
|
|
getDDHandles : function(){ |
return [this.iconNode, this.textNode, this.elNode]; |
}, |
|
|
hide : function(){ |
this.node.hidden = true; |
if(this.wrap){ |
this.wrap.style.display = "none"; |
} |
}, |
|
|
show : function(){ |
this.node.hidden = false; |
if(this.wrap){ |
this.wrap.style.display = ""; |
} |
}, |
|
|
onContextMenu : function(e){ |
if (this.node.hasListener("contextmenu") || this.node.getOwnerTree().hasListener("contextmenu")) { |
e.preventDefault(); |
this.focus(); |
this.fireEvent("contextmenu", this.node, e); |
} |
}, |
|
|
onClick : function(e){ |
if(this.dropping){ |
e.stopEvent(); |
return; |
} |
if(this.fireEvent("beforeclick", this.node, e) !== false){ |
var a = e.getTarget('a'); |
if(!this.disabled && this.node.attributes.href && a){ |
this.fireEvent("click", this.node, e); |
return; |
}else if(a && e.ctrlKey){ |
e.stopEvent(); |
} |
e.preventDefault(); |
if(this.disabled){ |
return; |
} |
|
if(this.node.attributes.singleClickExpand && !this.animating && this.node.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); |
}, |
|
onOver : function(e){ |
this.addClass('x-tree-node-over'); |
}, |
|
onOut : function(e){ |
this.removeClass('x-tree-node-over'); |
}, |
|
|
onCheckChange : function(){ |
var checked = this.checkbox.checked; |
this.node.attributes.checked = checked; |
this.fireEvent('checkchange', this.node, checked); |
}, |
|
|
ecClick : function(e){ |
if(!this.animating && (this.node.hasChildNodes() || this.node.attributes.expandable)){ |
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(true); |
} |
}else{ |
if(bulkRender === true) { |
targetNode.appendChild(this.wrap); |
} |
} |
}, |
|
|
renderElements : function(n, a, targetNode, bulkRender){ |
|
this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : ''; |
|
var cb = typeof a.checked == 'boolean'; |
|
var href = a.href ? a.href : Ext.isGecko ? "" : "#"; |
var buf = ['<li class="x-tree-node"><div ext:tree-node-id="',n.id,'" class="x-tree-node-el x-tree-node-leaf x-unselectable ', a.cls,'" unselectable="on">', |
'<span class="x-tree-node-indent">',this.indentMarkup,"</span>", |
'<img src="', this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow" />', |
'<img src="', a.icon || this.emptyIcon, '" class="x-tree-node-icon',(a.icon ? " x-tree-node-inline-icon" : ""),(a.iconCls ? " "+a.iconCls : ""),'" unselectable="on" />', |
cb ? ('<input class="x-tree-node-cb" type="checkbox" ' + (a.checked ? 'checked="checked" />' : '/>')) : '', |
'<a hidefocus="on" class="x-tree-node-anchor" href="',href,'" tabIndex="1" ', |
a.hrefTarget ? ' target="'+a.hrefTarget+'"' : "", '><span unselectable="on">',n.text,"</span></a></div>", |
'<ul class="x-tree-node-ct" style="display:none;"></ul>', |
"</li>"].join(''); |
|
var nel; |
if(bulkRender !== true && n.nextSibling && (nel = n.nextSibling.ui.getEl())){ |
this.wrap = Ext.DomHelper.insertHtml("beforeBegin", nel, buf); |
}else{ |
this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf); |
} |
|
this.elNode = this.wrap.childNodes[0]; |
this.ctNode = this.wrap.childNodes[1]; |
var cs = this.elNode.childNodes; |
this.indentNode = cs[0]; |
this.ecNode = cs[1]; |
this.iconNode = cs[2]; |
var index = 3; |
if(cb){ |
this.checkbox = cs[3]; |
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 || n.attributes.expandable){ |
if(n.expanded){ |
cls += "-minus"; |
c1 = "x-tree-node-collapsed"; |
c2 = "x-tree-node-expanded"; |
}else{ |
cls += "-plus"; |
c1 = "x-tree-node-expanded"; |
c2 = "x-tree-node-collapsed"; |
} |
if(this.wasLeaf){ |
this.removeClass("x-tree-node-leaf"); |
this.wasLeaf = false; |
} |
if(this.c1 != c1 || this.c2 != c2){ |
Ext.fly(this.elNode).replaceClass(c1, c2); |
this.c1 = c1; this.c2 = c2; |
} |
}else{ |
if(!this.wasLeaf){ |
Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-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('<img src="'+this.emptyIcon+'" class="x-tree-elbow-line" />'); |
} else { |
buf.unshift('<img src="'+this.emptyIcon+'" class="x-tree-icon" />'); |
} |
} |
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(); |
} |
}, |
|
destroy : function(){ |
if(this.elNode){ |
Ext.dd.Registry.unregister(this.elNode.id); |
} |
delete this.elNode; |
delete this.ctNode; |
delete this.indentNode; |
delete this.ecNode; |
delete this.iconNode; |
delete this.checkbox; |
delete this.anchor; |
delete this.textNode; |
Ext.removeNode(this.ctNode); |
} |
}; |
|
|
Ext.tree.RootTreeNodeUI = Ext.extend(Ext.tree.TreeNodeUI, { |
|
render : function(){ |
if(!this.rendered){ |
var targetNode = this.node.ownerTree.innerCt.dom; |
this.node.expanded = true; |
targetNode.innerHTML = '<div class="x-tree-root-node"></div>'; |
this.wrap = this.ctNode = targetNode.firstChild; |
} |
}, |
collapse : Ext.emptyFn, |
expand : Ext.emptyFn |
}); |
|
Ext.tree.TreeLoader = function(config){ |
this.baseParams = {}; |
this.requestMethod = "POST"; |
Ext.apply(this, config); |
|
this.addEvents( |
|
"beforeload", |
|
"load", |
|
"loadexception" |
); |
|
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(this.doPreload(node)){ |
if(typeof callback == "function"){ |
callback(); |
} |
}else if(this.dataUrl||this.url){ |
this.requestData(node, callback); |
} |
}, |
|
doPreload : function(node){ |
if(node.attributes.children){ |
if(node.childNodes.length < 1){ |
var cs = node.attributes.children; |
node.beginUpdate(); |
for(var i = 0, len = cs.length; i < len; i++){ |
var cn = node.appendChild(this.createNode(cs[i])); |
if(this.preloadChildren){ |
this.doPreload(cn); |
} |
} |
node.endUpdate(); |
} |
return true; |
}else { |
return false; |
} |
}, |
|
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+")"); |
node.beginUpdate(); |
for(var i = 0, len = o.length; i < len; i++){ |
var n = this.createNode(o[i]); |
if(n){ |
node.appendChild(n); |
} |
} |
node.endUpdate(); |
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); |
tree.on("textchange", this.updateSortParent, 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]); |
} |
}, |
|
updateSortParent : function(node){ |
var p = node.parentNode; |
if(p && p.childrenRendered){ |
this.doSort.defer(1, this, [p]); |
} |
} |
}; |
|
if(Ext.dd.DropZone){ |
|
Ext.tree.TreeDropZone = function(tree, config){ |
|
this.allowParentInsert = false; |
|
this.allowContainerDrop = false; |
|
this.appendOnly = false; |
Ext.tree.TreeDropZone.superclass.constructor.call(this, tree.innerCt, config); |
|
this.tree = tree; |
|
this.dragOverData = {}; |
|
this.lastInsertClass = "x-tree-no-status"; |
}; |
|
Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, { |
|
ddGroup : "TreeDD", |
|
|
expandDelay : 1000, |
|
|
expandNode : function(node){ |
if(node.hasChildNodes() && !node.isExpanded()){ |
node.expand(false, null, this.triggerCacheRefresh.createDelegate(this)); |
} |
}, |
|
|
queueExpand : function(node){ |
this.expandProcId = this.expandNode.defer(this.expandDelay, this, [node]); |
}, |
|
|
cancelExpand : function(){ |
if(this.expandProcId){ |
clearTimeout(this.expandProcId); |
this.expandProcId = false; |
} |
}, |
|
|
isValidDropPoint : function(n, pt, dd, e, data){ |
if(!n || !data){ return false; } |
var targetNode = n.node; |
var dropNode = data.node; |
|
if(!(targetNode && targetNode.isTarget && pt)){ |
return false; |
} |
if(pt == "append" && targetNode.allowChildren === false){ |
return false; |
} |
if((pt == "above" || pt == "below") && (targetNode.parentNode && targetNode.parentNode.allowChildren === false)){ |
return false; |
} |
if(dropNode && (targetNode == dropNode || dropNode.contains(targetNode))){ |
return false; |
} |
|
var overEvent = this.dragOverData; |
overEvent.tree = this.tree; |
overEvent.target = targetNode; |
overEvent.data = data; |
overEvent.point = pt; |
overEvent.source = dd; |
overEvent.rawEvent = e; |
overEvent.dropNode = dropNode; |
overEvent.cancel = false; |
var result = this.tree.fireEvent("nodedragover", overEvent); |
return overEvent.cancel === false && result !== false; |
}, |
|
|
getDropPoint : function(e, n, dd){ |
var tn = n.node; |
if(tn.isRoot){ |
return tn.allowChildren !== false ? "append" : false; |
} |
var dragEl = n.ddel; |
var t = Ext.lib.Dom.getY(dragEl), b = t + dragEl.offsetHeight; |
var y = Ext.lib.Event.getPageY(e); |
var noAppend = tn.allowChildren === false || tn.isLeaf(); |
if(this.appendOnly || tn.parentNode.allowChildren === false){ |
return noAppend ? false : "append"; |
} |
var noBelow = false; |
if(!this.allowParentInsert){ |
noBelow = tn.hasChildNodes() && tn.isExpanded(); |
} |
var q = (b - t) / (noAppend ? 2 : 3); |
if(y >= t && y < (t + q)){ |
return "above"; |
}else if(!noBelow && (noAppend || y >= b-q && y <= b)){ |
return "below"; |
}else{ |
return "append"; |
} |
}, |
|
|
onNodeEnter : function(n, dd, e, data){ |
this.cancelExpand(); |
}, |
|
|
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, |
dropStatus: false |
}; |
var retval = this.tree.fireEvent("beforenodedrop", dropEvent); |
if(retval === false || dropEvent.cancel === true || !dropEvent.dropNode){ |
targetNode.ui.endDrop(); |
return dropEvent.dropStatus; |
} |
|
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(!Ext.isArray(ns)){ |
ns = [ns]; |
} |
var n; |
for(var i = 0, len = ns.length; i < len; i++){ |
n = ns[i]; |
if(p == "above"){ |
t.parentNode.insertBefore(n, t); |
}else if(p == "below"){ |
t.parentNode.insertBefore(n, t.nextSibling); |
}else{ |
t.appendChild(n); |
} |
} |
n.ui.focus(); |
if(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.tree.eventModel.disable(); |
this.proxy.update(""); |
data.node.ui.appendDDGhost(this.proxy.ghost.dom); |
this.tree.fireEvent("startdrag", this.tree, data.node, e); |
}, |
|
|
getRepairXY : function(e, data){ |
return data.node.ui.getDDRepairXY(); |
}, |
|
|
onEndDrag : function(data, e){ |
this.tree.eventModel.enable.defer(100, this.tree.eventModel); |
this.tree.fireEvent("enddrag", this.tree, data.node, e); |
}, |
|
|
onValidDrop : function(dd, e, id){ |
this.tree.fireEvent("dragdrop", this.tree, this.dragData.node, dd, e); |
this.hideProxy(); |
}, |
|
|
beforeInvalidDrop : function(e, id){ |
|
var sm = this.tree.getSelectionModel(); |
sm.clearSelections(); |
sm.select(this.dragData.node); |
} |
}); |
} |
|
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; |
|
if(!tree.rendered){ |
tree.on('render', this.initEditor, this); |
}else{ |
this.initEditor(tree); |
} |
}; |
|
Ext.extend(Ext.tree.TreeEditor, Ext.Editor, { |
|
alignment: "l-l", |
autoSize: false, |
|
hideEl : false, |
|
cls: "x-small-editor x-tree-editor", |
|
shim:false, |
shadow:"frame", |
|
maxWidth: 250, |
|
editDelay : 350, |
|
initEditor : function(tree){ |
tree.on('beforeclick', this.beforeNodeClick, this); |
tree.on('dblclick', this.onNodeDblClick, 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); |
}, |
|
fitToTree : function(ed, el){ |
var td = this.tree.getTreeEl().dom, nd = el.dom; |
if(td.scrollLeft > nd.offsetLeft){ td.scrollLeft = nd.offsetLeft; |
} |
var w = Math.min( |
this.maxWidth, |
(td.clientWidth > 20 ? td.clientWidth : td.offsetWidth) - Math.max(0, nd.offsetLeft-td.scrollLeft) - 5); |
this.setSize(w, ''); |
}, |
|
triggerEdit : function(node, defer){ |
this.completeEdit(); |
if(node.attributes.editable !== false){ |
this.editNode = node; |
this.autoEditTimer = this.startEdit.defer(this.editDelay, this, [node.ui.textNode, node.text]); |
return false; |
} |
}, |
|
bindScroll : function(){ |
this.tree.getTreeEl().on('scroll', this.cancelEdit, this); |
}, |
|
beforeNodeClick : function(node, e){ |
clearTimeout(this.autoEditTimer); |
if(this.tree.getSelectionModel().isSelected(node)){ |
e.stopEvent(); |
return this.triggerEdit(node); |
} |
}, |
|
onNodeDblClick : function(node, e){ |
clearTimeout(this.autoEditTimer); |
}, |
|
updateNode : function(ed, value){ |
this.tree.getTreeEl().un('scroll', this.cancelEdit, this); |
this.editNode.setText(value); |
}, |
|
onHide : function(){ |
Ext.tree.TreeEditor.superclass.onHide.call(this); |
if(this.editNode){ |
this.editNode.ui.focus.defer(50, this.editNode.ui); |
} |
}, |
|
onSpecialKey : function(field, e){ |
var k = e.getKey(); |
if(k == e.ESC){ |
e.stopEvent(); |
this.cancelEdit(); |
}else if(k == e.ENTER && !e.hasModifier()){ |
e.stopEvent(); |
this.completeEdit(); |
} |
} |
}); |
|
Ext.menu.Menu = function(config){ |
if(Ext.isArray(config)){ |
config = {items:config}; |
} |
Ext.apply(this, config); |
this.id = this.id || Ext.id(); |
this.addEvents( |
|
'beforeshow', |
|
'beforehide', |
|
'show', |
|
'hide', |
|
'click', |
|
'mouseover', |
|
'mouseout', |
|
'itemclick' |
); |
Ext.menu.MenuMgr.register(this); |
Ext.menu.Menu.superclass.constructor.call(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, |
|
createEl : function(){ |
return new Ext.Layer({ |
cls: "x-menu", |
shadow:this.shadow, |
constrain: false, |
parentEl: this.parentEl || document.body, |
zindex:15000 |
}); |
}, |
|
render : function(){ |
if(this.el){ |
return; |
} |
var el = this.el = this.createEl(); |
|
if(!this.keyNav){ |
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.el){ |
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"){ Ext.applyIf(el, this.defaults); |
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); |
} |
}, |
|
|
destroy : function(){ |
this.beforeDestroy(); |
Ext.menu.MenuMgr.unregister(this); |
if (this.keyNav) { |
this.keyNav.disable(); |
} |
this.removeAll(); |
if (this.ul) { |
this.ul.removeAllListeners(); |
} |
if (this.el) { |
this.el.destroy(); |
} |
}, |
|
beforeDestroy : Ext.emptyFn |
|
}); |
|
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.getDoc().addKeyListener(27, function(){ |
if(active.length > 0){ |
hideAll(); |
} |
}); |
} |
|
function hideAll(){ |
if(active && active.length > 0){ |
var c = active.clone(); |
c.each(function(m){ |
m.hide(); |
}); |
} |
} |
|
function onHide(m){ |
active.remove(m); |
if(active.length < 1){ |
Ext.getDoc().un("mousedown", onMouseDown); |
attached = false; |
} |
} |
|
function onShow(m){ |
var last = active.last(); |
lastShow = new Date(); |
active.add(m); |
if(!attached){ |
Ext.getDoc().on("mousedown", onMouseDown); |
attached = true; |
} |
if(m.parentMenu){ |
m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3); |
m.parentMenu.activeChild = m; |
}else if(last && last.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"){ if(!menus){ return null; |
} |
return menus[menu]; |
}else if(menu.events){ return menu; |
}else if(typeof menu.length == 'number'){ return new Ext.menu.Menu({items:menu}); |
}else{ return 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); |
} |
}, |
|
getCheckedItem : function(groupId){ |
var g = groups[groupId]; |
if(g){ |
for(var i = 0, l = g.length; i < l; i++){ |
if(g[i].checked){ |
return g[i]; |
} |
} |
} |
return null; |
}, |
|
setCheckedItem : function(groupId, itemId){ |
var g = groups[groupId]; |
if(g){ |
for(var i = 0, l = g.length; i < l; i++){ |
if(g[i].id == itemId){ |
g[i].setChecked(true); |
} |
} |
} |
return null; |
} |
}; |
}(); |
|
|
Ext.menu.BaseItem = function(config){ |
Ext.menu.BaseItem.superclass.constructor.call(this, config); |
|
this.addEvents( |
|
'click', |
|
'activate', |
|
'deactivate' |
); |
|
if(this.handler){ |
this.on("click", this.handler, this.scope); |
} |
}; |
|
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); |
}, |
|
|
setHandler : function(handler, scope){ |
if(this.handler){ |
this.un("click", this.handler, this.scope); |
} |
this.on("click", this.handler = handler, this.scope = scope); |
}, |
|
onClick : function(e){ |
if(!this.disabled && this.fireEvent("click", this, e) !== false |
&& this.parentMenu.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( |
'<img src="{0}" class="x-menu-item-icon {2}" />{1}', |
this.icon || Ext.BLANK_IMAGE_URL, this.itemText||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( |
'<img src="{0}" class="x-menu-item-icon {2}">{1}', |
this.icon || Ext.BLANK_IMAGE_URL, this.text, this.iconCls || '')); |
this.parentMenu.autoWidth(); |
} |
}, |
|
|
setIconClass : function(cls){ |
var oldCls = this.iconCls; |
this.iconCls = cls; |
if(this.rendered){ |
this.el.child('img.x-menu-item-icon').replaceClass(oldCls, this.iconCls); |
} |
}, |
|
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" , |
|
"checkchange" |
); |
|
if(this.checkHandler){ |
this.on('checkchange', this.checkHandler, this.scope); |
} |
Ext.menu.MenuMgr.registerCheckable(this); |
}; |
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); |
} |
if(this.checked){ |
this.checked = false; |
this.setChecked(true, true); |
} |
}, |
|
destroy : function(){ |
Ext.menu.MenuMgr.unregisterCheckable(this); |
Ext.menu.CheckItem.superclass.destroy.apply(this, arguments); |
}, |
|
|
setChecked : function(state, suppressEvent){ |
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'); |
|
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', |
|
beforeDestroy : function() { |
this.picker.destroy(); |
} |
}); |
|
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 = Ext.extend(Ext.BoxComponent, { |
|
|
|
|
|
|
|
|
invalidClass : "x-form-invalid", |
|
invalidText : "The value in this field is invalid", |
|
focusClass : "x-form-focus", |
|
validationEvent : "keyup", |
|
validateOnBlur : true, |
|
validationDelay : 250, |
|
defaultAutoCreate : {tag: "input", type: "text", size: "20", autocomplete: "off"}, |
|
fieldClass : "x-form-field", |
|
msgTarget : 'qtip', |
|
msgFx : 'normal', |
|
|
readOnly : false, |
|
|
disabled : false, |
|
|
|
|
|
isFormField : true, |
|
hasFocus : false, |
|
|
|
|
|
|
initComponent : function(){ |
Ext.form.Field.superclass.initComponent.call(this); |
this.addEvents( |
|
'focus', |
|
'blur', |
|
'specialkey', |
|
'change', |
|
'invalid', |
|
'valid' |
); |
}, |
|
|
getName: function(){ |
return this.rendered && this.el.dom.name ? this.el.dom.name : (this.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(); |
}, |
|
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.isSpecialKey()){ |
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.rendered ? this.el.getValue() : Ext.value(this.value, ''); |
if(v === this.emptyText){ |
v = ''; |
} |
return v; |
}, |
|
|
getValue : function(){ |
if(!this.rendered) { |
return this.value; |
} |
var v = this.el.getValue(); |
if(v === this.emptyText || v === undefined){ |
v = ''; |
} |
return v; |
}, |
|
|
setRawValue : function(v){ |
return this.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.isSafari){ |
if(Ext.isIE && (tag == 'input' || tag == 'textarea')){ |
if(tag == 'input' && !Ext.isStrict){ |
return this.inEditor ? w : w - 3; |
} |
if(tag == 'input' && Ext.isStrict){ |
return w - (Ext.isIE6 ? 4 : 1); |
} |
if(tag = 'textarea' && Ext.isStrict){ |
return w-2; |
} |
}else if(Ext.isOpera && Ext.isStrict){ |
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.reg('field', Ext.form.Field); |
|
|
Ext.form.TextField = Ext.extend(Ext.form.Field, { |
|
|
grow : false, |
|
growMin : 30, |
|
growMax : 800, |
|
vtype : null, |
|
maskRe : null, |
|
disableKeyFilter : false, |
|
allowBlank : true, |
|
minLength : 0, |
|
maxLength : Number.MAX_VALUE, |
|
minLengthText : "The minimum length for this field is {0}", |
|
maxLengthText : "The maximum length for this field is {0}", |
|
selectOnFocus : false, |
|
blankText : "This field is required", |
|
validator : null, |
|
regex : null, |
|
regexText : "", |
|
emptyText : null, |
|
emptyClass : 'x-form-empty-field', |
|
initComponent : function(){ |
Ext.form.TextField.superclass.initComponent.call(this); |
this.addEvents( |
|
'autosize' |
); |
}, |
|
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", end-v.length); |
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.reg('textfield', Ext.form.TextField); |
|
|
Ext.form.TriggerField = Ext.extend(Ext.form.TextField, { |
|
|
defaultAutoCreate : {tag: "input", type: "text", size: "16", autocomplete: "off"}, |
|
hideTrigger:false, |
|
|
autoSize: Ext.emptyFn, |
monitorTab : true, |
deferHeight : true, |
mimicing : false, |
|
onResize : function(w, h){ |
Ext.form.TriggerField.superclass.onResize.call(this, w, h); |
if(typeof w == 'number'){ |
this.el.setWidth(this.adjustWidth('input', w - this.trigger.getWidth())); |
} |
this.wrap.setWidth(this.el.getWidth()+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, {delay: 10}); |
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){ |
if(!this.wrap.contains(e.target) && this.validateBlur(e)){ |
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.beforeBlur(); |
this.wrap.removeClass('x-trigger-wrap-focus'); |
Ext.form.TriggerField.superclass.onBlur.call(this); |
}, |
|
beforeBlur : Ext.emptyFn, |
|
validateBlur : function(e){ |
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.reg('trigger', Ext.form.TriggerField); |
|
Ext.form.TextArea = Ext.extend(Ext.form.TextField, { |
|
growMin : 60, |
|
growMax: 1000, |
growAppend : ' \n ', |
growPad : 0, |
|
enterIsSpecial : false, |
|
|
preventScrollbars: false, |
|
|
onRender : function(ct, position){ |
if(!this.el){ |
this.defaultAutoCreate = { |
tag: "textarea", |
style:"width:100px;height:60px;", |
autocomplete: "off" |
}; |
} |
Ext.form.TextArea.superclass.onRender.call(this, ct, position); |
if(this.grow){ |
this.textSizeEl = Ext.DomHelper.append(document.body, { |
tag: "pre", cls: "x-form-grow-sizer" |
}); |
if(this.preventScrollbars){ |
this.el.setStyle("overflow", "hidden"); |
} |
this.el.setHeight(this.growMin); |
} |
}, |
|
onDestroy : function(){ |
if(this.textSizeEl){ |
Ext.removeNode(this.textSizeEl); |
} |
Ext.form.TextArea.superclass.onDestroy.call(this); |
}, |
|
fireKey : function(e){ |
if(e.isSpecialKey() && (this.enterIsSpecial || (e.getKey() != e.ENTER || e.hasModifier()))){ |
this.fireEvent("specialkey", this, e); |
} |
}, |
|
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, '<p> </p>'); |
} |
v += this.growAppend; |
} |
ts.innerHTML = v; |
var h = Math.min(this.growMax, Math.max(ts.offsetHeight, this.growMin)+this.growPad); |
if(h != this.lastHeight){ |
this.lastHeight = h; |
this.el.setHeight(h); |
this.fireEvent("autosize", this, h); |
} |
} |
}); |
Ext.reg('textarea', Ext.form.TextArea); |
|
Ext.form.NumberField = Ext.extend(Ext.form.TextField, { |
|
fieldClass: "x-form-field x-form-num-field", |
|
allowDecimals : true, |
|
decimalSeparator : ".", |
|
decimalPrecision : 2, |
|
allowNegative : true, |
|
minValue : Number.NEGATIVE_INFINITY, |
|
maxValue : Number.MAX_VALUE, |
|
minText : "The minimum value for this field is {0}", |
|
maxText : "The maximum value for this field is {0}", |
|
nanText : "{0} is not a valid number", |
|
baseChars : "0123456789", |
|
initEvents : function(){ |
Ext.form.NumberField.superclass.initEvents.call(this); |
var allowed = this.baseChars+''; |
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; |
} |
value = String(value).replace(this.decimalSeparator, "."); |
if(isNaN(value)){ |
this.markInvalid(String.format(this.nanText, value)); |
return false; |
} |
var num = this.parseValue(value); |
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))); |
}, |
|
setValue : function(v){ |
v = parseFloat(v); |
v = isNaN(v) ? '' : String(v).replace(".", this.decimalSeparator); |
Ext.form.NumberField.superclass.setValue.call(this, v); |
}, |
|
parseValue : function(value){ |
value = parseFloat(String(value).replace(this.decimalSeparator, ".")); |
return isNaN(value) ? '' : value; |
}, |
|
fixPrecision : function(value){ |
var nan = isNaN(value); |
if(!this.allowDecimals || this.decimalPrecision == -1 || nan || !value){ |
return nan ? '' : value; |
} |
return parseFloat(parseFloat(value).toFixed(this.decimalPrecision)); |
}, |
|
beforeBlur : function(){ |
var v = this.parseValue(this.getRawValue()); |
if(v){ |
this.setValue(this.fixPrecision(v)); |
} |
} |
}); |
Ext.reg('numberfield', Ext.form.NumberField); |
|
Ext.form.DateField = Ext.extend(Ext.form.TriggerField, { |
|
format : "m/d/y", |
|
altFormats : "m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d", |
|
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"}, |
|
initComponent : function(){ |
Ext.form.DateField.superclass.initComponent.call(this); |
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 + ")"); |
} |
}, |
|
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 || Ext.isDate(value)){ |
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; |
}, |
|
onDestroy : function(){ |
if(this.menu) { |
this.menu.destroy(); |
} |
if(this.wrap){ |
this.wrap.remove(); |
} |
Ext.form.DateField.superclass.onDestroy.call(this); |
}, |
|
formatDate : function(date){ |
return Ext.isDate(date) ? date.dateFormat(this.format) : date; |
}, |
|
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.reg('datefield', Ext.form.DateField); |
|
Ext.form.ComboBox = Ext.extend(Ext.form.TriggerField, { |
|
|
|
|
|
|
defaultAutoCreate : {tag: "input", type: "text", size: "24", autocomplete: "off"}, |
|
|
|
|
|
|
listClass: '', |
|
selectedClass: 'x-combo-selected', |
|
triggerClass : 'x-form-arrow-trigger', |
|
shadow:'sides', |
|
listAlign: 'tl-bl?', |
|
maxHeight: 300, |
|
minHeight: 90, |
|
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, |
|
|
|
lazyInit : true, |
|
initComponent : function(){ |
Ext.form.ComboBox.superclass.initComponent.call(this); |
this.addEvents( |
|
'expand', |
|
'collapse', |
|
'beforeselect', |
|
'select', |
|
'beforequery' |
); |
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); |
Ext.removeNode(s); this.render(this.el.parentNode); |
}else{ |
Ext.removeNode(s); } |
|
} |
this.selectedIndex = -1; |
if(this.mode == 'local'){ |
if(this.initialConfig.queryDelay === undefined){ |
this.queryDelay = 10; |
} |
if(this.initialConfig.minChars === undefined){ |
this.minChars = 0; |
} |
} |
}, |
|
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'); |
} |
|
if(!this.lazyInit){ |
this.initList(); |
}else{ |
this.on('focus', this.initList, this, {single: true}); |
} |
|
if(!this.editable){ |
this.editable = true; |
this.setEditable(false); |
} |
}, |
|
initList : function(){ |
if(!this.list){ |
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({ |
store:this.store, |
pageSize: this.pageSize, |
renderTo:this.footer |
}); |
this.assetHeight += this.footer.getHeight(); |
} |
|
if(!this.tpl){ |
|
this.tpl = '<tpl for="."><div class="'+cls+'-item">{' + this.displayField + '}</div></tpl>'; |
} |
|
|
this.view = new Ext.DataView({ |
applyTo: this.innerList, |
tpl: this.tpl, |
singleSelect: true, |
selectedClass: this.selectedClass, |
itemSelector: this.itemSelector || '.' + cls + '-item' |
}); |
|
this.view.on('click', this.onViewClick, this); |
|
this.bindStore(this.store, true); |
|
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'); |
} |
} |
}, |
|
|
bindStore : function(store, initial){ |
if(this.store && !initial){ |
this.store.un('beforeload', this.onBeforeLoad, this); |
this.store.un('load', this.onLoad, this); |
this.store.un('loadexception', this.collapse, this); |
if(!store){ |
this.store = null; |
if(this.view){ |
this.view.setStore(null); |
} |
} |
} |
if(store){ |
this.store = Ext.StoreMgr.lookup(store); |
|
this.store.on('beforeload', this.onBeforeLoad, this); |
this.store.on('load', this.onLoad, this); |
this.store.on('loadexception', this.collapse, this); |
|
if(this.view){ |
this.view.setStore(store); |
} |
} |
}, |
|
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(); |
this.delayedCheck = true; |
this.unsetDelayCheck.defer(10, this); |
}, |
|
"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.el.removeAllListeners(); |
this.view.el.remove(); |
this.view.purgeListeners(); |
} |
if(this.list){ |
this.list.destroy(); |
} |
this.bindStore(null); |
Ext.form.ComboBox.superclass.onDestroy.call(this); |
}, |
|
unsetDelayCheck : function(){ |
delete this.delayedCheck; |
}, |
fireKey : function(e){ |
if(e.isNavKeyPress() && !this.isExpanded() && !this.delayedCheck){ |
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')); |
} |
}, |
|
onEnable: function(){ |
Ext.form.ComboBox.superclass.onEnable.apply(this, arguments); |
if(this.hiddenField){ |
this.hiddenField.disabled = false; |
} |
}, |
|
onDisable: function(){ |
Ext.form.ComboBox.superclass.onDisable.apply(this, arguments); |
if(this.hiddenField){ |
this.hiddenField.disabled = true; |
} |
}, |
|
|
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 ? |
'<div class="loading-indicator">'+this.loadingText+'</div>' : ''); |
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(); |
this.value = ''; |
}, |
|
|
setValue : function(v){ |
var text = v; |
if(this.valueField){ |
var r = this.findRecord(this.valueField, v); |
if(r){ |
text = r.data[this.displayField]; |
}else if(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 pad = this.list.getFrameWidth('tb')+(this.resizable?this.handleHeight:0)+this.assetHeight; |
var h = Math.max(inner.clientHeight, inner.offsetHeight, inner.scrollHeight); |
var ha = this.getPosition()[1]-Ext.getBody().getScroll().top; |
var hb = Ext.lib.Dom.getViewHeight()-ha-this.getSize().height; |
var space = Math.max(ha, hb, this.minHeight || 0)-this.list.shadow.offset-pad-2; |
h = Math.min(h, space, this.maxHeight); |
|
this.innerList.setHeight(h); |
this.list.beginUpdate(); |
this.list.setHeight(h+pad); |
this.list.alignTo(this.el, this.listAlign); |
this.list.endUpdate(); |
}, |
|
onEmptyResults : function(){ |
this.collapse(); |
}, |
|
|
isExpanded : function(){ |
return this.list && 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.getDoc().un('mousewheel', this.collapseIf, this); |
Ext.getDoc().un('mousedown', 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.wrap, this.listAlign); |
this.list.show(); |
this.innerList.setOverflow('auto'); Ext.getDoc().on('mousewheel', this.collapseIf, this); |
Ext.getDoc().on('mousedown', this.collapseIf, this); |
this.fireEvent('expand', this); |
}, |
|
onTriggerClick : function(){ |
if(this.disabled){ |
return; |
} |
if(this.isExpanded()){ |
this.collapse(); |
this.el.focus(); |
}else { |
this.onFocus({}); |
if(this.triggerAction == 'all') { |
this.doQuery(this.allQuery, true); |
} else { |
this.doQuery(this.getRawValue()); |
} |
this.el.focus(); |
} |
} |
|
|
|
|
|
|
}); |
Ext.reg('combo', Ext.form.ComboBox); |
|
Ext.form.Checkbox = Ext.extend(Ext.form.Field, { |
|
focusClass : undefined, |
|
fieldClass: "x-form-field", |
|
checked: false, |
|
defaultAutoCreate : { tag: "input", type: 'checkbox', autocomplete: "off"}, |
|
|
|
initComponent : function(){ |
Ext.form.Checkbox.superclass.initComponent.call(this); |
this.addEvents( |
|
'check' |
); |
}, |
|
onResize : function(){ |
Ext.form.Checkbox.superclass.onResize.apply(this, arguments); |
if(!this.boxLabel){ |
this.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; |
}, |
|
|
markInvalid : Ext.emptyFn, |
|
clearInvalid : Ext.emptyFn, |
|
onRender : function(ct, position){ |
Ext.form.Checkbox.superclass.onRender.call(this, ct, position); |
if(this.inputValue !== undefined){ |
this.el.dom.value = this.inputValue; |
} |
this.wrap = this.el.wrap({cls: "x-form-check-wrap"}); |
if(this.boxLabel){ |
this.wrap.createChild({tag: 'label', htmlFor: this.el.id, cls: 'x-form-cb-label', html: this.boxLabel}); |
} |
if(this.checked){ |
this.setValue(true); |
}else{ |
this.checked = this.el.dom.checked; |
} |
}, |
|
onDestroy : function(){ |
if(this.wrap){ |
this.wrap.remove(); |
} |
Ext.form.Checkbox.superclass.onDestroy.call(this); |
}, |
|
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.reg('checkbox', Ext.form.Checkbox); |
|
Ext.form.Radio = Ext.extend(Ext.form.Checkbox, { |
inputType: 'radio', |
|
|
markInvalid : Ext.emptyFn, |
|
clearInvalid : Ext.emptyFn, |
|
|
getGroupValue : function(){ |
var p = this.el.up('form') || Ext.getBody(); |
var c = p.child('input[name='+this.el.dom.name+']:checked', true); |
return c ? c.value : null; |
}, |
|
onClick : function(){ |
if(this.el.dom.checked != this.checked){ |
var p = this.el.up('form') || Ext.getBody(); |
var els = p.select('input[name='+this.el.dom.name+']'); |
els.each(function(el){ |
if(el.dom.id == this.id){ |
this.setValue(true); |
}else{ |
Ext.getCmp(el.dom.id).setValue(false); |
} |
}, this); |
} |
}, |
|
|
setValue : function(v){ |
if (typeof v == 'boolean') { |
Ext.form.Radio.superclass.setValue.call(this, v); |
} else { |
var r = this.el.up('form').child('input[name='+this.el.dom.name+'][value='+v+']', true); |
if (r){ |
r.checked = true; |
}; |
} |
} |
}); |
Ext.reg('radio', Ext.form.Radio); |
|
Ext.form.Hidden = Ext.extend(Ext.form.Field, { |
|
inputType : 'hidden', |
|
|
onRender : function(){ |
Ext.form.Hidden.superclass.onRender.apply(this, arguments); |
}, |
|
|
initEvents : function(){ |
this.originalValue = this.getValue(); |
}, |
|
|
setSize : Ext.emptyFn, |
setWidth : Ext.emptyFn, |
setHeight : Ext.emptyFn, |
setPosition : Ext.emptyFn, |
setPagePosition : Ext.emptyFn, |
markInvalid : Ext.emptyFn, |
clearInvalid : Ext.emptyFn |
}); |
Ext.reg('hidden', Ext.form.Hidden); |
|
Ext.form.BasicForm = 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', |
|
'actionfailed', |
|
'actioncomplete' |
); |
|
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, |
|
|
|
|
initEl : function(el){ |
this.el = Ext.get(el); |
this.id = this.el.id || Ext.id(); |
if(!this.standardSubmit){ |
this.el.on('submit', this.onSubmit, this); |
} |
this.el.addClass('x-form'); |
}, |
|
|
getEl: function(){ |
return this.el; |
}, |
|
onSubmit : function(e){ |
e.stopEvent(); |
}, |
|
destroy: function() { |
this.items.each(function(f){ |
Ext.destroy(f); |
}); |
if(this.el){ |
this.el.removeAllListeners(); |
this.el.remove(); |
} |
this.purgeListeners(); |
}, |
|
|
isValid : function(){ |
var valid = true; |
this.items.each(function(f){ |
if(!f.validate()){ |
valid = false; |
} |
}); |
return valid; |
}, |
|
|
isDirty : function(){ |
var dirty = false; |
this.items.each(function(f){ |
if(f.isDirty()){ |
dirty = true; |
return false; |
} |
}); |
return dirty; |
}, |
|
|
doAction : function(action, options){ |
if(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){ |
if(this.standardSubmit){ |
var v = this.isValid(); |
if(v){ |
this.el.dom.submit(); |
} |
return v; |
} |
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(Ext.isArray(errors)){ |
for(var i = 0, len = errors.length; i < len; i++){ |
var fieldError = errors[i]; |
var f = this.findField(fieldError.id); |
if(f){ |
f.markInvalid(fieldError.msg); |
} |
} |
}else{ |
var field, id; |
for(id in errors){ |
if(typeof errors[id] != 'function' && (field = this.findField(id))){ |
field.markInvalid(errors[id]); |
} |
} |
} |
return this; |
}, |
|
|
setValues : function(values){ |
if(Ext.isArray(values)){ for(var i = 0, len = values.length; i < len; i++){ |
var v = values[i]; |
var f = this.findField(v.id); |
if(f){ |
f.setValue(v.value); |
if(this.trackResetOnLoad){ |
f.originalValue = f.getValue(); |
} |
} |
} |
}else{ var field, id; |
for(id in values){ |
if(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.applyToMarkup(f.id); |
} |
}); |
return this; |
}, |
|
|
applyToFields : function(o){ |
this.items.each(function(f){ |
Ext.apply(f, o); |
}); |
return this; |
}, |
|
|
applyIfToFields : function(o){ |
this.items.each(function(f){ |
Ext.applyIf(f, o); |
}); |
return this; |
} |
}); |
|
Ext.BasicForm = Ext.form.BasicForm; |
|
Ext.FormPanel = Ext.extend(Ext.Panel, { |
|
|
|
|
buttonAlign:'center', |
|
|
minButtonWidth:75, |
|
|
labelAlign:'left', |
|
|
monitorValid : false, |
|
|
monitorPoll : 200, |
|
|
layout: 'form', |
|
initComponent :function(){ |
this.form = this.createForm(); |
|
Ext.FormPanel.superclass.initComponent.call(this); |
|
this.addEvents( |
|
'clientvalidation' |
); |
|
this.relayEvents(this.form, ['beforeaction', 'actionfailed', 'actioncomplete']); |
}, |
|
createForm: function(){ |
delete this.initialConfig.listeners; |
return new Ext.form.BasicForm(null, this.initialConfig); |
}, |
|
initFields : function(){ |
var f = this.form; |
var formPanel = this; |
var fn = function(c){ |
if(c.doLayout && c != formPanel){ |
Ext.applyIf(c, { |
labelAlign: c.ownerCt.labelAlign, |
labelWidth: c.ownerCt.labelWidth, |
itemCls: c.ownerCt.itemCls |
}); |
if(c.items){ |
c.items.each(fn); |
} |
}else if(c.isFormField){ |
f.add(c); |
} |
} |
this.items.each(fn); |
}, |
|
getLayoutTarget : function(){ |
return this.form.el; |
}, |
|
|
getForm : function(){ |
return this.form; |
}, |
|
onRender : function(ct, position){ |
this.initFields(); |
|
Ext.FormPanel.superclass.onRender.call(this, ct, position); |
var o = { |
tag: 'form', |
method : this.method || 'POST', |
id : this.formId || Ext.id() |
}; |
if(this.fileUpload) { |
o.enctype = 'multipart/form-data'; |
} |
this.form.initEl(this.body.createChild(o)); |
}, |
|
beforeDestroy: function(){ |
Ext.FormPanel.superclass.beforeDestroy.call(this); |
Ext.destroy(this.form); |
}, |
|
initEvents : function(){ |
Ext.FormPanel.superclass.initEvents.call(this); |
this.items.on('remove', this.onRemove, this); |
this.items.on('add', this.onAdd, this); |
if(this.monitorValid){ this.startMonitoring(); |
} |
}, |
|
onAdd : function(ct, c) { |
if (c.isFormField) { |
this.form.add(c); |
} |
}, |
|
onRemove : function(c) { |
if (c.isFormField) { |
Ext.destroy(c.container.up('.x-form-item')); |
this.form.remove(c); |
} |
}, |
|
|
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; |
}, |
|
|
load : function(){ |
this.form.load.apply(this.form, arguments); |
}, |
|
onDisable : function(){ |
Ext.FormPanel.superclass.onDisable.call(this); |
if(this.form){ |
this.form.items.each(function(){ |
this.disable(); |
}); |
} |
}, |
|
onEnable : function(){ |
Ext.FormPanel.superclass.onEnable.call(this); |
if(this.form){ |
this.form.items.each(function(){ |
this.enable(); |
}); |
} |
}, |
|
bindHandler : function(){ |
if(!this.bound){ |
return false; } |
var valid = true; |
this.form.items.each(function(f){ |
if(!f.isValid(true)){ |
valid = false; |
return false; |
} |
}); |
if(this.buttons){ |
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.reg('form', Ext.FormPanel); |
|
Ext.form.FormPanel = Ext.FormPanel; |
|
|
|
Ext.form.FieldSet = Ext.extend(Ext.Panel, { |
|
|
|
|
|
baseCls:'x-fieldset', |
|
layout: 'form', |
|
|
onRender : function(ct, position){ |
if(!this.el){ |
this.el = document.createElement('fieldset'); |
this.el.id = this.id; |
if (this.title || this.header || this.checkboxToggle) { |
this.el.appendChild(document.createElement('legend')).className = 'x-fieldset-header'; |
} |
} |
|
Ext.form.FieldSet.superclass.onRender.call(this, ct, position); |
|
if(this.checkboxToggle){ |
var o = typeof this.checkboxToggle == 'object' ? |
this.checkboxToggle : |
{tag: 'input', type: 'checkbox', name: this.checkboxName || this.id+'-checkbox'}; |
this.checkbox = this.header.insertFirst(o); |
this.checkbox.dom.checked = !this.collapsed; |
this.checkbox.on('click', this.onCheckClick, this); |
} |
}, |
|
|
onCollapse : function(doAnim, animArg){ |
if(this.checkbox){ |
this.checkbox.dom.checked = false; |
} |
this.afterCollapse(); |
|
}, |
|
|
onExpand : function(doAnim, animArg){ |
if(this.checkbox){ |
this.checkbox.dom.checked = true; |
} |
this.afterExpand(); |
}, |
|
|
onCheckClick : function(){ |
this[this.checkbox.dom.checked ? 'expand' : 'collapse'](); |
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}); |
Ext.reg('fieldset', Ext.form.FieldSet); |
|
|
|
|
Ext.form.HtmlEditor = Ext.extend(Ext.form.Field, { |
|
enableFormat : true, |
|
enableFontSize : true, |
|
enableColors : true, |
|
enableAlignments : true, |
|
enableLists : true, |
|
enableSourceEdit : true, |
|
enableLinks : true, |
|
enableFont : true, |
|
createLinkText : 'Please enter the URL for the link:', |
|
defaultLinkValue : 'http:/'+'/', |
|
fontFamilies : [ |
'Arial', |
'Courier New', |
'Tahoma', |
'Times New Roman', |
'Verdana' |
], |
defaultFont: 'tahoma', |
|
|
validationEvent : false, |
deferHeight: true, |
initialized : false, |
activated : false, |
sourceEditMode : false, |
onFocus : Ext.emptyFn, |
iframePad:3, |
hideMode:'offsets', |
defaultAutoCreate : { |
tag: "textarea", |
style:"width:500px;height:300px;", |
autocomplete: "off" |
}, |
|
|
initComponent : function(){ |
this.addEvents( |
|
'initialize', |
|
'activate', |
|
'beforesync', |
|
'beforepush', |
|
'sync', |
|
'push', |
|
'editmodechange' |
) |
}, |
|
createFontOptions : function(){ |
var buf = [], fs = this.fontFamilies, ff, lc; |
for(var i = 0, len = fs.length; i< len; i++){ |
ff = fs[i]; |
lc = ff.toLowerCase(); |
buf.push( |
'<option value="',lc,'" style="font-family:',ff,';"', |
(this.defaultFont == lc ? ' selected="true">' : '>'), |
ff, |
'</option>' |
); |
} |
return buf.join(''); |
}, |
|
createToolbar : function(editor){ |
|
function btn(id, toggle, handler){ |
return { |
itemId : 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({ |
renderTo:this.wrap.dom.firstChild |
}); |
|
|
tb.el.on('click', function(e){ |
e.preventDefault(); |
}); |
|
if(this.enableFont && !Ext.isSafari){ |
this.fontSelect = tb.el.createChild({ |
tag:'select', |
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( |
'-', { |
itemId:'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' |
}) |
}, { |
itemId:'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 '<html><head><style type="text/css">body{border:0;margin:0;padding:3px;height:98%;cursor:text;}</style></head><body></body></html>'; |
}, |
|
getEditorBody : function(){ |
return this.doc.body || this.doc.documentElement; |
}, |
|
|
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.itemId != '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){ |
iframe.contentWindow.document.designMode = 'on'; |
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'){ |
Ext.TaskMgr.stop(task); |
this.doc.designMode="on"; |
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.getEditorBody().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.itemId != '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(); |
} |
var lastSize = this.lastSize; |
if(lastSize){ |
delete this.lastSize; |
this.setSize(lastSize); |
} |
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.getEditorBody(); |
var html = bd.innerHTML; |
if(Ext.isSafari){ |
var bs = bd.getAttribute('style'); |
var m = bs.match(/text-align:(.*?);/i); |
if(m && m[1]){ |
html = '<div style="'+m[0]+'">' + html + '</div>'; |
} |
} |
html = this.cleanHtml(html); |
if(this.fireEvent('beforesync', this, html) !== false){ |
this.el.dom.value = html; |
this.fireEvent('sync', this, html); |
} |
} |
}, |
|
|
pushValue : function(){ |
if(this.initialized){ |
var v = this.el.dom.value; |
if(!this.activated && v.length < 1){ |
v = ' '; |
} |
if(this.fireEvent('beforepush', this, v) !== false){ |
this.getEditorBody().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.getEditorBody(); |
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.getEditorBody()); |
r.collapse(true); |
this.deferFocus(); |
} |
try{ |
this.execCmd('useCSS', true); |
this.execCmd('styleWithCSS', false); |
}catch(e){} |
} |
this.fireEvent('activate', this); |
}, |
|
|
adjustFont: function(btn){ |
var adjust = btn.itemId == 'increasefontsize' ? 1 : -1; |
|
var v = parseInt(this.doc.queryCommandValue('FontSize') || 2, 10); |
if(Ext.isSafari3 || Ext.isAir){ |
|
|
if(v <= 10){ |
v = 1 + adjust; |
}else if(v <= 13){ |
v = 2 + adjust; |
}else if(v <= 16){ |
v = 3 + adjust; |
}else if(v <= 18){ |
v = 4 + adjust; |
}else if(v <= 24){ |
v = 5 + adjust; |
}else { |
v = 6 + adjust; |
} |
v = v.constrain(1, 6); |
}else{ |
if(Ext.isSafari){ |
adjust *= 2; |
} |
v = Math.max(1, v+adjust) + (Ext.isSafari ? 'px' : 0); |
} |
this.execCmd('FontSize', v); |
}, |
|
onEditorEvent : function(e){ |
this.updateToolbar(); |
}, |
|
|
|
updateToolbar: function(){ |
|
if(!this.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.itemId); |
}, |
|
|
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('<br />'); |
r.collapse(false); |
r.select(); |
} |
} |
} |
}; |
}else if(Ext.isOpera){ |
return function(e){ |
var k = e.getKey(); |
if(k == e.TAB){ |
e.stopEvent(); |
this.win.focus(); |
this.execCmd('InsertHTML',' '); |
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.reg('htmleditor', Ext.form.HtmlEditor); |
|
Ext.form.TimeField = Ext.extend(Ext.form.ComboBox, { |
|
minValue : null, |
|
maxValue : null, |
|
minText : "The time in this field must be equal to or after {0}", |
|
maxText : "The time in this field must be equal to or before {0}", |
|
invalidText : "{0} is not a valid time", |
|
format : "g:i A", |
|
altFormats : "g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H", |
|
increment: 15, |
|
|
mode: 'local', |
|
triggerAction: 'all', |
|
typeAhead: false, |
|
|
initComponent : function(){ |
Ext.form.TimeField.superclass.initComponent.call(this); |
|
if(typeof this.minValue == "string"){ |
this.minValue = this.parseDate(this.minValue); |
} |
if(typeof this.maxValue == "string"){ |
this.maxValue = this.parseDate(this.maxValue); |
} |
|
if(!this.store){ |
var min = this.parseDate(this.minValue); |
if(!min){ |
min = new Date().clearTime(); |
} |
var max = this.parseDate(this.maxValue); |
if(!max){ |
max = new Date().clearTime().add('mi', (24 * 60) - 1); |
} |
var times = []; |
while(min <= max){ |
times.push([min.dateFormat(this.format)]); |
min = min.add('mi', this.increment); |
} |
this.store = new Ext.data.SimpleStore({ |
fields: ['text'], |
data : times |
}); |
this.displayField = 'text'; |
} |
}, |
|
|
getValue : function(){ |
var v = Ext.form.TimeField.superclass.getValue.call(this); |
return this.formatDate(this.parseDate(v)) || ''; |
}, |
|
|
setValue : function(value){ |
Ext.form.TimeField.superclass.setValue.call(this, this.formatDate(this.parseDate(value))); |
}, |
|
|
validateValue : Ext.form.DateField.prototype.validateValue, |
parseDate : Ext.form.DateField.prototype.parseDate, |
formatDate : Ext.form.DateField.prototype.formatDate, |
|
|
beforeBlur : function(){ |
var v = this.parseDate(this.getRawValue()); |
if(v){ |
this.setValue(v.dateFormat(this.format)); |
} |
} |
|
|
|
|
|
}); |
Ext.reg('timefield', Ext.form.TimeField); |
Ext.form.Label = Ext.extend(Ext.BoxComponent, { |
onRender : function(ct, position){ |
if(!this.el){ |
this.el = document.createElement('label'); |
this.el.innerHTML = this.text ? Ext.util.Format.htmlEncode(this.text) : (this.html || ''); |
if(this.forId){ |
this.el.setAttribute('htmlFor', this.forId); |
} |
} |
Ext.form.Label.superclass.onRender.call(this, ct, position); |
} |
}); |
|
Ext.reg('label', Ext.form.Label); |
|
Ext.form.Action = function(form, options){ |
this.form = form; |
this.options = options || {}; |
}; |
|
|
Ext.form.Action.CLIENT_INVALID = 'client'; |
|
Ext.form.Action.SERVER_INVALID = 'server'; |
|
Ext.form.Action.CONNECT_FAILURE = 'connect'; |
|
Ext.form.Action.LOAD_FAILURE = 'load'; |
|
Ext.form.Action.prototype = { |
|
|
|
|
|
|
|
|
|
|
type : 'default', |
|
|
run : function(options){ |
|
}, |
|
success : function(response){ |
|
}, |
|
handleResponse : function(response){ |
|
}, |
|
failure : function(response){ |
this.response = response; |
this.failureType = Ext.form.Action.CONNECT_FAILURE; |
this.form.afterAction(this, false); |
}, |
|
processResponse : function(response){ |
this.response = response; |
if(!response.responseText){ |
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(opts){ |
var opts = opts || {}; |
return { |
success: this.success, |
failure: this.failure, |
scope: this, |
timeout: (opts.timeout*1000) || (this.form.timeout*1000), |
upload: this.form.fileUpload ? this.success : undefined |
}; |
} |
}; |
|
|
Ext.form.Action.Submit = function(form, options){ |
Ext.form.Action.Submit.superclass.constructor.call(this, form, options); |
}; |
|
Ext.extend(Ext.form.Action.Submit, Ext.form.Action, { |
|
type : 'submit', |
|
run : function(){ |
var o = this.options; |
var method = this.getMethod(); |
var isPost = method == 'POST'; |
if(o.clientValidation === false || this.form.isValid()){ |
Ext.Ajax.request(Ext.apply(this.createCallback(o), { |
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(this.options), { |
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.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.grid.GridPanel = Ext.extend(Ext.Panel, { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ddText : "{0} selected row{1}", |
|
minColumnWidth : 25, |
|
trackMouseOver : true, |
|
enableDragDrop : false, |
|
enableColumnMove : true, |
|
enableColumnHide : true, |
|
enableHdMenu : true, |
|
stripeRows : false, |
|
autoExpandColumn : false, |
|
autoExpandMin : 50, |
|
autoExpandMax : 1000, |
|
view : null, |
|
loadMask : false, |
|
|
rendered : false, |
|
viewReady: false, |
|
stateEvents: ["columnmove", "columnresize", "sortchange"], |
|
|
initComponent : function(){ |
Ext.grid.GridPanel.superclass.initComponent.call(this); |
|
|
|
this.autoScroll = false; |
this.autoWidth = false; |
|
if(Ext.isArray(this.columns)){ |
this.colModel = new Ext.grid.ColumnModel(this.columns); |
delete this.columns; |
} |
|
|
if(this.ds){ |
this.store = this.ds; |
delete this.ds; |
} |
if(this.cm){ |
this.colModel = this.cm; |
delete this.cm; |
} |
if(this.sm){ |
this.selModel = this.sm; |
delete this.sm; |
} |
this.store = Ext.StoreMgr.lookup(this.store); |
|
this.addEvents( |
|
|
"click", |
|
"dblclick", |
|
"contextmenu", |
|
"mousedown", |
|
"mouseup", |
|
"mouseover", |
|
"mouseout", |
|
"keypress", |
|
"keydown", |
|
|
|
"cellmousedown", |
|
"rowmousedown", |
|
"headermousedown", |
|
|
"cellclick", |
|
"celldblclick", |
|
"rowclick", |
|
"rowdblclick", |
|
"headerclick", |
|
"headerdblclick", |
|
"rowcontextmenu", |
|
"cellcontextmenu", |
|
"headercontextmenu", |
|
"bodyscroll", |
|
"columnresize", |
|
"columnmove", |
|
"sortchange" |
); |
}, |
|
|
onRender : function(ct, position){ |
Ext.grid.GridPanel.superclass.onRender.apply(this, arguments); |
|
var c = this.body; |
|
this.el.addClass('x-grid-panel'); |
|
var view = this.getView(); |
view.init(this); |
|
c.on("mousedown", this.onMouseDown, 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); |
this.view.render(); |
}, |
|
|
initEvents : function(){ |
Ext.grid.GridPanel.superclass.initEvents.call(this); |
|
if(this.loadMask){ |
this.loadMask = new Ext.LoadMask(this.bwrap, |
Ext.apply({store:this.store}, this.loadMask)); |
} |
}, |
|
initStateEvents : function(){ |
Ext.grid.GridPanel.superclass.initStateEvents.call(this); |
this.colModel.on('hiddenchange', this.saveState, this, {delay: 100}); |
}, |
|
applyState : function(state){ |
var cm = this.colModel; |
var cs = state.columns; |
if(cs){ |
for(var i = 0, len = cs.length; i < len; i++){ |
var s = cs[i]; |
var c = cm.getColumnById(s.id); |
if(c){ |
c.hidden = s.hidden; |
c.width = s.width; |
var oldIndex = cm.getIndexById(s.id); |
if(oldIndex != i){ |
cm.moveColumn(oldIndex, i); |
} |
} |
} |
} |
if(state.sort){ |
this.store[this.store.remoteSort ? 'setDefaultSort' : 'sort'](state.sort.field, state.sort.direction); |
} |
}, |
|
getState : function(){ |
var o = {columns: []}; |
for(var i = 0, c; c = this.colModel.config[i]; i++){ |
o.columns[i] = { |
id: c.id, |
width: c.width |
}; |
if(c.hidden){ |
o.columns[i].hidden = true; |
} |
} |
var ss = this.store.getSortState(); |
if(ss){ |
o.sort = ss; |
} |
return o; |
}, |
|
|
afterRender : function(){ |
Ext.grid.GridPanel.superclass.afterRender.call(this); |
this.view.layout(); |
this.viewReady = true; |
}, |
|
|
reconfigure : function(store, colModel){ |
if(this.loadMask){ |
this.loadMask.destroy(); |
this.loadMask = new Ext.LoadMask(this.bwrap, |
Ext.apply({store:store}, this.initialConfig.loadMask)); |
} |
this.view.bind(store, colModel); |
this.store = store; |
this.colModel = colModel; |
if(this.rendered){ |
this.view.refresh(true); |
} |
}, |
|
|
onKeyDown : function(e){ |
this.fireEvent("keydown", e); |
}, |
|
|
onDestroy : function(){ |
if(this.rendered){ |
if(this.loadMask){ |
this.loadMask.destroy(); |
} |
var c = this.body; |
c.removeAllListeners(); |
this.view.destroy(); |
c.update(""); |
} |
this.colModel.purgeListeners(); |
Ext.grid.GridPanel.superclass.onDestroy.call(this); |
}, |
|
|
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); |
}, |
|
|
onMouseDown : function(e){ |
this.processEvent("mousedown", e); |
}, |
|
|
onContextMenu : function(e, t){ |
this.processEvent("contextmenu", e); |
}, |
|
|
onDblClick : function(e){ |
this.processEvent("dblclick", e); |
}, |
|
|
walkCells : function(row, col, step, fn, scope){ |
var cm = this.colModel, clen = cm.getColumnCount(); |
var ds = this.store, rlen = ds.getCount(), first = true; |
if(step < 0){ |
if(col < 0){ |
row--; |
first = false; |
} |
while(row >= 0){ |
if(!first){ |
col = clen-1; |
} |
first = false; |
while(col >= 0){ |
if(fn.call(scope || this, row, col, cm) === true){ |
return [row, col]; |
} |
col--; |
} |
row--; |
} |
} else { |
if(col >= clen){ |
row++; |
first = false; |
} |
while(row < rlen){ |
if(!first){ |
col = 0; |
} |
first = false; |
while(col < clen){ |
if(fn.call(scope || this, row, col, cm) === true){ |
return [row, col]; |
} |
col++; |
} |
row++; |
} |
} |
return null; |
}, |
|
|
getSelections : function(){ |
return this.selModel.getSelections(); |
}, |
|
|
onResize : function(){ |
Ext.grid.GridPanel.superclass.onResize.apply(this, arguments); |
if(this.viewReady){ |
this.view.layout(); |
} |
}, |
|
|
getGridEl : function(){ |
return this.body; |
}, |
|
|
stopEditing : function(){}, |
|
|
getSelectionModel : function(){ |
if(!this.selModel){ |
this.selModel = new Ext.grid.RowSelectionModel( |
this.disableSelection ? {selectRow: Ext.emptyFn} : null); |
} |
return this.selModel; |
}, |
|
|
getStore : function(){ |
return this.store; |
}, |
|
|
getColumnModel : function(){ |
return this.colModel; |
}, |
|
|
getView : function(){ |
if(!this.view){ |
this.view = new Ext.grid.GridView(this.viewConfig); |
} |
return this.view; |
}, |
|
getDragDropText : function(){ |
var count = this.selModel.getCount(); |
return String.format(this.ddText, count, count == 1 ? '' : 's'); |
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}); |
Ext.reg('grid', Ext.grid.GridPanel); |
|
Ext.grid.GridView = function(config){ |
Ext.apply(this, config); |
this.addEvents( |
|
"beforerowremoved", |
|
"beforerowsinserted", |
|
"beforerefresh", |
|
"rowremoved", |
|
"rowsinserted", |
|
"rowupdated", |
|
"refresh" |
); |
Ext.grid.GridView.superclass.constructor.call(this); |
}; |
|
Ext.extend(Ext.grid.GridView, Ext.util.Observable, { |
|
|
|
|
scrollOffset: 19, |
|
autoFill: false, |
|
forceFit: false, |
|
sortClasses : ["sort-asc", "sort-desc"], |
|
sortAscText : "Sort Ascending", |
|
sortDescText : "Sort Descending", |
|
columnsText : "Columns", |
|
borderWidth: 2, |
|
|
|
initTemplates : function(){ |
var ts = this.templates || {}; |
if(!ts.master){ |
ts.master = new Ext.Template( |
'<div class="x-grid3" hidefocus="true">', |
'<div class="x-grid3-viewport">', |
'<div class="x-grid3-header"><div class="x-grid3-header-inner"><div class="x-grid3-header-offset">{header}</div></div><div class="x-clear"></div></div>', |
'<div class="x-grid3-scroller"><div class="x-grid3-body">{body}</div><a href="#" class="x-grid3-focus" tabIndex="-1"></a></div>', |
"</div>", |
'<div class="x-grid3-resize-marker"> </div>', |
'<div class="x-grid3-resize-proxy"> </div>', |
"</div>" |
); |
} |
|
if(!ts.header){ |
ts.header = new Ext.Template( |
'<table border="0" cellspacing="0" cellpadding="0" style="{tstyle}">', |
'<thead><tr class="x-grid3-hd-row">{cells}</tr></thead>', |
"</table>" |
); |
} |
|
if(!ts.hcell){ |
ts.hcell = new Ext.Template( |
'<td class="x-grid3-hd x-grid3-cell x-grid3-td-{id}" style="{style}"><div {tooltip} {attr} class="x-grid3-hd-inner x-grid3-hd-{id}" unselectable="on" style="{istyle}">', this.grid.enableHdMenu ? '<a class="x-grid3-hd-btn" href="#"></a>' : '', |
'{value}<img class="x-grid3-sort-icon" src="', Ext.BLANK_IMAGE_URL, '" />', |
"</div></td>" |
); |
} |
|
if(!ts.body){ |
ts.body = new Ext.Template('{rows}'); |
} |
|
if(!ts.row){ |
ts.row = new Ext.Template( |
'<div class="x-grid3-row {alt}" style="{tstyle}"><table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">', |
'<tbody><tr>{cells}</tr>', |
(this.enableRowBody ? '<tr class="x-grid3-row-body-tr" style="{bodyStyle}"><td colspan="{cols}" class="x-grid3-body-cell" tabIndex="0" hidefocus="on"><div class="x-grid3-row-body">{body}</div></td></tr>' : ''), |
'</tbody></table></div>' |
); |
} |
|
if(!ts.cell){ |
ts.cell = new Ext.Template( |
'<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} {css}" style="{style}" tabIndex="0" {cellAttr}>', |
'<div class="x-grid3-cell-inner x-grid3-col-{id}" unselectable="on" {attr}>{value}</div>', |
"</td>" |
); |
} |
|
for(var k in ts){ |
var t = ts[k]; |
if(t && typeof t.compile == 'function' && !t.compiled){ |
t.disableFormats = true; |
t.compile(); |
} |
} |
|
this.templates = ts; |
|
this.tdClass = 'x-grid3-cell'; |
this.cellSelector = 'td.x-grid3-cell'; |
this.hdCls = 'x-grid3-hd'; |
this.rowSelector = 'div.x-grid3-row'; |
this.colRe = new RegExp("x-grid3-td-([^\\s]+)", ""); |
}, |
|
fly : function(el){ |
if(!this._flyweight){ |
this._flyweight = new Ext.Element.Flyweight(document.body); |
} |
this._flyweight.dom = el; |
return this._flyweight; |
}, |
|
getEditorParent : function(ed){ |
return this.scroller.dom; |
}, |
|
initElements : function(){ |
var E = Ext.Element; |
|
var el = this.grid.getGridEl().dom.firstChild; |
var cs = el.childNodes; |
|
this.el = new E(el); |
|
this.mainWrap = new E(cs[0]); |
this.mainHd = new E(this.mainWrap.dom.firstChild); |
|
if(this.grid.hideHeaders){ |
this.mainHd.setDisplayed(false); |
} |
|
this.innerHd = this.mainHd.dom.firstChild; |
this.scroller = new E(this.mainWrap.dom.childNodes[1]); |
if(this.forceFit){ |
this.scroller.setStyle('overflow-x', 'hidden'); |
} |
this.mainBody = new E(this.scroller.dom.firstChild); |
|
this.focusEl = new E(this.scroller.dom.childNodes[1]); |
this.focusEl.swallowEvent("click", true); |
|
this.resizeMarker = new E(cs[1]); |
this.resizeProxy = new E(cs[2]); |
}, |
|
getRows : function(){ |
return this.hasRows() ? this.mainBody.dom.childNodes : []; |
}, |
|
|
findCell : function(el){ |
if(!el){ |
return false; |
} |
return this.fly(el).findParent(this.cellSelector, 3); |
}, |
|
findCellIndex : function(el, requiredCls){ |
var cell = this.findCell(el); |
if(cell && (!requiredCls || this.fly(cell).hasClass(requiredCls))){ |
return this.getCellIndex(cell); |
} |
return false; |
}, |
|
getCellIndex : function(el){ |
if(el){ |
var m = el.className.match(this.colRe); |
if(m && m[1]){ |
return this.cm.getIndexById(m[1]); |
} |
} |
return false; |
}, |
|
findHeaderCell : function(el){ |
var cell = this.findCell(el); |
return cell && this.fly(cell).hasClass(this.hdCls) ? cell : null; |
}, |
|
findHeaderIndex : function(el){ |
return this.findCellIndex(el, this.hdCls); |
}, |
|
findRow : function(el){ |
if(!el){ |
return false; |
} |
return this.fly(el).findParent(this.rowSelector, 10); |
}, |
|
findRowIndex : function(el){ |
var r = this.findRow(el); |
return r ? r.rowIndex : false; |
}, |
|
|
|
getRow : function(row){ |
return this.getRows()[row]; |
}, |
|
|
getCell : function(row, col){ |
return this.getRow(row).getElementsByTagName('td')[col]; |
}, |
|
|
getHeaderCell : function(index){ |
return this.mainHd.dom.getElementsByTagName('td')[index]; |
}, |
|
|
addRowClass : function(row, cls){ |
var r = this.getRow(row); |
if(r){ |
this.fly(r).addClass(cls); |
} |
}, |
|
removeRowClass : function(row, cls){ |
var r = this.getRow(row); |
if(r){ |
this.fly(r).removeClass(cls); |
} |
}, |
|
removeRow : function(row){ |
Ext.removeNode(this.getRow(row)); |
}, |
|
removeRows : function(firstRow, lastRow){ |
var bd = this.mainBody.dom; |
for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){ |
Ext.removeNode(bd.childNodes[firstRow]); |
} |
}, |
|
|
getScrollState : function(){ |
var sb = this.scroller.dom; |
return {left: sb.scrollLeft, top: sb.scrollTop}; |
}, |
|
restoreScroll : function(state){ |
var sb = this.scroller.dom; |
sb.scrollLeft = state.left; |
sb.scrollTop = state.top; |
}, |
|
|
scrollToTop : function(){ |
this.scroller.dom.scrollTop = 0; |
this.scroller.dom.scrollLeft = 0; |
}, |
|
syncScroll : function(){ |
this.syncHeaderScroll(); |
var mb = this.scroller.dom; |
this.grid.fireEvent("bodyscroll", mb.scrollLeft, mb.scrollTop); |
}, |
|
syncHeaderScroll : function(){ |
var mb = this.scroller.dom; |
this.innerHd.scrollLeft = mb.scrollLeft; |
this.innerHd.scrollLeft = mb.scrollLeft; }, |
|
updateSortIcon : function(col, dir){ |
var sc = this.sortClasses; |
var hds = this.mainHd.select('td').removeClass(sc); |
hds.item(col).addClass(sc[dir == "DESC" ? 1 : 0]); |
}, |
|
updateAllColumnWidths : function(){ |
var tw = this.getTotalWidth(); |
var clen = this.cm.getColumnCount(); |
var ws = []; |
for(var i = 0; i < clen; i++){ |
ws[i] = this.getColumnWidth(i); |
} |
|
this.innerHd.firstChild.firstChild.style.width = tw; |
|
for(var i = 0; i < clen; i++){ |
var hd = this.getHeaderCell(i); |
hd.style.width = ws[i]; |
} |
|
var ns = this.getRows(); |
for(var i = 0, len = ns.length; i < len; i++){ |
ns[i].style.width = tw; |
ns[i].firstChild.style.width = tw; |
var row = ns[i].firstChild.rows[0]; |
for(var j = 0; j < clen; j++){ |
row.childNodes[j].style.width = ws[j]; |
} |
} |
|
this.onAllColumnWidthsUpdated(ws, tw); |
}, |
|
updateColumnWidth : function(col, width){ |
var w = this.getColumnWidth(col); |
var tw = this.getTotalWidth(); |
|
this.innerHd.firstChild.firstChild.style.width = tw; |
var hd = this.getHeaderCell(col); |
hd.style.width = w; |
|
var ns = this.getRows(); |
for(var i = 0, len = ns.length; i < len; i++){ |
ns[i].style.width = tw; |
ns[i].firstChild.style.width = tw; |
ns[i].firstChild.rows[0].childNodes[col].style.width = w; |
} |
|
this.onColumnWidthUpdated(col, w, tw); |
}, |
|
updateColumnHidden : function(col, hidden){ |
var tw = this.getTotalWidth(); |
|
this.innerHd.firstChild.firstChild.style.width = tw; |
|
var display = hidden ? 'none' : ''; |
|
var hd = this.getHeaderCell(col); |
hd.style.display = display; |
|
var ns = this.getRows(); |
for(var i = 0, len = ns.length; i < len; i++){ |
ns[i].style.width = tw; |
ns[i].firstChild.style.width = tw; |
ns[i].firstChild.rows[0].childNodes[col].style.display = display; |
} |
|
this.onColumnHiddenUpdated(col, hidden, tw); |
|
delete this.lastViewWidth; this.layout(); |
}, |
|
doRender : function(cs, rs, ds, startRow, colCount, stripe){ |
var ts = this.templates, ct = ts.cell, rt = ts.row, last = colCount-1; |
var tstyle = 'width:'+this.getTotalWidth()+';'; |
var buf = [], cb, c, p = {}, rp = {tstyle: tstyle}, r; |
for(var j = 0, len = rs.length; j < len; j++){ |
r = rs[j]; cb = []; |
var rowIndex = (j+startRow); |
for(var i = 0; i < colCount; i++){ |
c = cs[i]; |
p.id = c.id; |
p.css = i == 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : ''); |
p.attr = p.cellAttr = ""; |
p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds); |
p.style = c.style; |
if(p.value == undefined || p.value === "") p.value = " "; |
if(r.dirty && typeof r.modified[c.name] !== 'undefined'){ |
p.css += ' x-grid3-dirty-cell'; |
} |
cb[cb.length] = ct.apply(p); |
} |
var alt = []; |
if(stripe && ((rowIndex+1) % 2 == 0)){ |
alt[0] = "x-grid3-row-alt"; |
} |
if(r.dirty){ |
alt[1] = " x-grid3-dirty-row"; |
} |
rp.cols = colCount; |
if(this.getRowClass){ |
alt[2] = this.getRowClass(r, rowIndex, rp, ds); |
} |
rp.alt = alt.join(" "); |
rp.cells = cb.join(""); |
buf[buf.length] = rt.apply(rp); |
} |
return buf.join(""); |
}, |
|
processRows : function(startRow, skipStripe){ |
if(this.ds.getCount() < 1){ |
return; |
} |
skipStripe = skipStripe || !this.grid.stripeRows; |
startRow = startRow || 0; |
var rows = this.getRows(); |
var cls = ' x-grid3-row-alt '; |
for(var i = startRow, len = rows.length; i < len; i++){ |
var row = rows[i]; |
row.rowIndex = i; |
if(!skipStripe){ |
var isAlt = ((i+1) % 2 == 0); |
var hasAlt = (' '+row.className + ' ').indexOf(cls) != -1; |
if(isAlt == hasAlt){ |
continue; |
} |
if(isAlt){ |
row.className += " x-grid3-row-alt"; |
}else{ |
row.className = row.className.replace("x-grid3-row-alt", ""); |
} |
} |
} |
}, |
|
renderUI : function(){ |
|
var header = this.renderHeaders(); |
var body = this.templates.body.apply({rows:''}); |
|
|
var html = this.templates.master.apply({ |
body: body, |
header: header |
}); |
|
var g = this.grid; |
|
g.getGridEl().dom.innerHTML = html; |
|
this.initElements(); |
|
|
this.mainBody.dom.innerHTML = this.renderRows(); |
this.processRows(0, true); |
|
|
Ext.fly(this.innerHd).on("click", this.handleHdDown, this); |
this.mainHd.on("mouseover", this.handleHdOver, this); |
this.mainHd.on("mouseout", this.handleHdOut, this); |
this.mainHd.on("mousemove", this.handleHdMove, this); |
|
this.scroller.on('scroll', this.syncScroll, this); |
if(g.enableColumnResize !== false){ |
this.splitone = new Ext.grid.GridView.SplitDragZone(g, this.mainHd.dom); |
} |
|
if(g.enableColumnMove){ |
this.columnDrag = new Ext.grid.GridView.ColumnDragZone(g, this.innerHd); |
this.columnDrop = new Ext.grid.HeaderDropZone(g, this.mainHd.dom); |
} |
|
if(g.enableHdMenu !== false){ |
if(g.enableColumnHide !== false){ |
this.colMenu = new Ext.menu.Menu({id:g.id + "-hcols-menu"}); |
this.colMenu.on("beforeshow", this.beforeColMenuShow, this); |
this.colMenu.on("itemclick", this.handleHdMenuClick, this); |
} |
this.hmenu = new Ext.menu.Menu({id: g.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(g.enableColumnHide !== false){ |
this.hmenu.add('-', |
{id:"columns", text: this.columnsText, menu: this.colMenu, iconCls: 'x-cols-icon'} |
); |
} |
this.hmenu.on("itemclick", this.handleHdMenuClick, this); |
|
} |
|
if(g.enableDragDrop || g.enableDrag){ |
var dd = new Ext.grid.GridDragZone(g, { |
ddGroup : g.ddGroup || 'GridDD' |
}); |
} |
|
this.updateHeaderSortState(); |
|
}, |
|
layout : function(){ |
if(!this.mainBody){ |
return; } |
var g = this.grid; |
var c = g.getGridEl(), cm = this.cm, |
expandCol = g.autoExpandColumn, |
gv = this; |
|
var csize = c.getSize(true); |
var vw = csize.width; |
|
if(vw < 20 || csize.height < 20){ return; |
} |
|
if(g.autoHeight){ |
this.scroller.dom.style.overflow = 'visible'; |
}else{ |
this.el.setSize(csize.width, csize.height); |
|
var hdHeight = this.mainHd.getHeight(); |
var vh = csize.height - (hdHeight); |
|
this.scroller.setSize(vw, vh); |
if(this.innerHd){ |
this.innerHd.style.width = (vw)+'px'; |
} |
} |
if(this.forceFit){ |
if(this.lastViewWidth != vw){ |
this.fitColumns(false, false); |
this.lastViewWidth = vw; |
} |
}else { |
this.autoExpand(); |
this.syncHeaderScroll(); |
} |
this.onLayout(vw, vh); |
}, |
|
onLayout : function(vw, vh){ |
}, |
|
onColumnWidthUpdated : function(col, w, tw){ |
}, |
|
onAllColumnWidthsUpdated : function(ws, tw){ |
}, |
|
onColumnHiddenUpdated : function(col, hidden, tw){ |
}, |
|
updateColumnText : function(col, text){ |
}, |
|
afterMove : function(colIndex){ |
}, |
|
|
init: function(grid){ |
this.grid = grid; |
|
this.initTemplates(); |
this.initData(grid.store, grid.colModel); |
this.initUI(grid); |
}, |
|
getColumnId : function(index){ |
return this.cm.getColumnId(index); |
}, |
|
renderHeaders : function(){ |
var cm = this.cm, ts = this.templates; |
var ct = ts.hcell; |
|
var cb = [], sb = [], p = {}; |
|
for(var i = 0, len = cm.getColumnCount(); i < len; i++){ |
p.id = cm.getColumnId(i); |
p.value = cm.getColumnHeader(i) || ""; |
p.style = this.getColumnStyle(i, true); |
p.tooltip = this.getColumnTooltip(i); |
if(cm.config[i].align == 'right'){ |
p.istyle = 'padding-right:16px'; |
} else { |
delete p.istyle; |
} |
cb[cb.length] = ct.apply(p); |
} |
return ts.header.apply({cells: cb.join(""), tstyle:'width:'+this.getTotalWidth()+';'}); |
}, |
|
getColumnTooltip : function(i){ |
var tt = this.cm.getColumnTooltip(i); |
if(tt){ |
if(Ext.QuickTips.isEnabled()){ |
return 'ext:qtip="'+tt+'"'; |
}else{ |
return 'title="'+tt+'"'; |
} |
} |
return ""; |
}, |
|
beforeUpdate : function(){ |
this.grid.stopEditing(true); |
}, |
|
updateHeaders : function(){ |
this.innerHd.firstChild.innerHTML = this.renderHeaders(); |
}, |
|
|
focusRow : function(row){ |
this.focusCell(row, 0, false); |
}, |
|
|
focusCell : function(row, col, hscroll){ |
var xy = this.ensureVisible(row, col, hscroll); |
this.focusEl.setXY(xy); |
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(!this.ds){ |
return; |
} |
if(row < 0 || row >= this.ds.getCount()){ |
return; |
} |
col = (col !== undefined ? col : 0); |
|
var rowEl = this.getRow(row), cellEl; |
if(!(hscroll === false && col === 0)){ |
while(this.cm.isHidden(col)){ |
col++; |
} |
cellEl = this.getCell(row, col); |
} |
if(!rowEl){ |
return; |
} |
|
var c = this.scroller.dom; |
|
var ctop = 0; |
var p = rowEl, stop = this.el.dom; |
while(p && p != stop){ |
ctop += p.offsetTop; |
p = p.offsetParent; |
} |
ctop -= this.mainHd.dom.offsetHeight; |
|
var cbot = ctop + rowEl.offsetHeight; |
|
var ch = c.clientHeight; |
var stop = parseInt(c.scrollTop, 10); |
var sbot = stop + ch; |
|
if(ctop < stop){ |
c.scrollTop = ctop; |
}else if(cbot > sbot){ |
c.scrollTop = cbot-ch; |
} |
|
if(hscroll !== false){ |
var cleft = parseInt(cellEl.offsetLeft, 10); |
var cright = cleft + cellEl.offsetWidth; |
|
var sleft = parseInt(c.scrollLeft, 10); |
var sright = sleft + c.clientWidth; |
if(cleft < sleft){ |
c.scrollLeft = cleft; |
}else if(cright > sright){ |
c.scrollLeft = cright-c.clientWidth; |
} |
} |
return cellEl ? Ext.fly(cellEl).getXY() : [c.scrollLeft, Ext.fly(rowEl).getY()]; |
}, |
|
insertRows : function(dm, firstRow, lastRow, isUpdate){ |
if(!isUpdate && firstRow === 0 && lastRow == dm.getCount()-1){ |
this.refresh(); |
}else{ |
if(!isUpdate){ |
this.fireEvent("beforerowsinserted", this, firstRow, lastRow); |
} |
var html = this.renderRows(firstRow, lastRow); |
var before = this.getRow(firstRow); |
if(before){ |
Ext.DomHelper.insertHtml('beforeBegin', before, html); |
}else{ |
Ext.DomHelper.insertHtml('beforeEnd', this.mainBody.dom, html); |
} |
if(!isUpdate){ |
this.fireEvent("rowsinserted", this, firstRow, lastRow); |
this.processRows(firstRow); |
} |
} |
}, |
|
deleteRows : function(dm, firstRow, lastRow){ |
if(dm.getRowCount()<1){ |
this.refresh(); |
}else{ |
this.fireEvent("beforerowsdeleted", this, firstRow, lastRow); |
|
this.removeRows(firstRow, lastRow); |
|
this.processRows(firstRow); |
this.fireEvent("rowsdeleted", this, firstRow, lastRow); |
} |
}, |
|
getColumnStyle : function(col, isHeader){ |
var style = !isHeader ? (this.cm.config[col].css || '') : ''; |
style += 'width:'+this.getColumnWidth(col)+';'; |
if(this.cm.isHidden(col)){ |
style += 'display:none;'; |
} |
var align = this.cm.config[col].align; |
if(align){ |
style += 'text-align:'+align+';'; |
} |
return style; |
}, |
|
getColumnWidth : function(col){ |
var w = this.cm.getColumnWidth(col); |
if(typeof w == 'number'){ |
return (Ext.isBorderBox ? w : (w-this.borderWidth > 0 ? w-this.borderWidth:0)) + 'px'; |
} |
return w; |
}, |
|
getTotalWidth : function(){ |
return this.cm.getTotalWidth()+'px'; |
}, |
|
fitColumns : function(preventRefresh, onlyExpand, omitColumn){ |
var cm = this.cm, leftOver, dist, i; |
var tw = cm.getTotalWidth(false); |
var aw = this.grid.getGridEl().getWidth(true)-this.scrollOffset; |
|
if(aw < 20){ return; |
} |
var extra = aw - tw; |
|
if(extra === 0){ |
return false; |
} |
|
var vc = cm.getColumnCount(true); |
var ac = vc-(typeof omitColumn == 'number' ? 1 : 0); |
if(ac === 0){ |
ac = 1; |
omitColumn = undefined; |
} |
var colCount = cm.getColumnCount(); |
var cols = []; |
var extraCol = 0; |
var width = 0; |
var w; |
for (i = 0; i < colCount; i++){ |
if(!cm.isHidden(i) && !cm.isFixed(i) && i !== omitColumn){ |
w = cm.getColumnWidth(i); |
cols.push(i); |
extraCol = i; |
cols.push(w); |
width += w; |
} |
} |
var frac = (aw - cm.getTotalWidth())/width; |
while (cols.length){ |
w = cols.pop(); |
i = cols.pop(); |
cm.setColumnWidth(i, Math.max(this.grid.minColumnWidth, Math.floor(w + w*frac)), true); |
} |
|
if((tw = cm.getTotalWidth(false)) > aw){ |
var adjustCol = ac != vc ? omitColumn : extraCol; |
cm.setColumnWidth(adjustCol, Math.max(1, |
cm.getColumnWidth(adjustCol)- (tw-aw)), true); |
} |
|
if(preventRefresh !== true){ |
this.updateAllColumnWidths(); |
} |
|
|
return true; |
}, |
|
autoExpand : function(preventUpdate){ |
var g = this.grid, cm = this.cm; |
if(!this.userResized && g.autoExpandColumn){ |
var tw = cm.getTotalWidth(false); |
var aw = this.grid.getGridEl().getWidth(true)-this.scrollOffset; |
if(tw != aw){ |
var ci = cm.getIndexById(g.autoExpandColumn); |
var currentWidth = cm.getColumnWidth(ci); |
var cw = Math.min(Math.max(((aw-tw)+currentWidth), g.autoExpandMin), g.autoExpandMax); |
if(cw != currentWidth){ |
cm.setColumnWidth(ci, cw, true); |
if(preventUpdate !== true){ |
this.updateColumnWidth(ci, cw); |
} |
} |
} |
} |
}, |
|
getColumnData : function(){ |
var cs = [], cm = this.cm, colCount = cm.getColumnCount(); |
for(var i = 0; i < colCount; i++){ |
var name = cm.getDataIndex(i); |
cs[i] = { |
name : (typeof name == 'undefined' ? this.ds.fields.get(i).name : name), |
renderer : cm.getRenderer(i), |
id : cm.getColumnId(i), |
style : this.getColumnStyle(i) |
}; |
} |
return cs; |
}, |
|
renderRows : function(startRow, endRow){ |
var g = this.grid, cm = g.colModel, ds = g.store, stripe = g.stripeRows; |
var colCount = cm.getColumnCount(); |
|
if(ds.getCount() < 1){ |
return ""; |
} |
|
var cs = this.getColumnData(); |
|
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); |
}, |
|
renderBody : function(){ |
var markup = this.renderRows(); |
return this.templates.body.apply({rows: markup}); |
}, |
|
refreshRow : function(record){ |
var ds = this.ds, index; |
if(typeof record == 'number'){ |
index = record; |
record = ds.getAt(index); |
}else{ |
index = ds.indexOf(record); |
} |
var cls = []; |
this.insertRows(ds, index, index, true); |
this.getRow(index).rowIndex = index; |
this.onRemove(ds, record, index+1, true); |
this.fireEvent("rowupdated", this, index, record); |
}, |
|
|
refresh : function(headersToo){ |
this.fireEvent("beforerefresh", this); |
this.grid.stopEditing(true); |
|
var result = this.renderBody(); |
this.mainBody.update(result); |
|
if(headersToo === true){ |
this.updateHeaders(); |
this.updateHeaderSortState(); |
} |
this.processRows(0, true); |
this.layout(); |
this.applyEmptyText(); |
this.fireEvent("refresh", this); |
}, |
|
applyEmptyText : function(){ |
if(this.emptyText && !this.hasRows()){ |
this.mainBody.update('<div class="x-grid-empty">' + this.emptyText + '</div>'); |
} |
}, |
|
updateHeaderSortState : function(){ |
var state = this.ds.getSortState(); |
if(!state){ |
return; |
} |
if(!this.sortState || (this.sortState.field != state.field || this.sortState.direction != state.direction)){ |
this.grid.fireEvent('sortchange', this.grid, state); |
} |
this.sortState = state; |
var sortColumn = this.cm.findColumnIndex(state.field); |
if(sortColumn != -1){ |
var sortDir = state.direction; |
this.updateSortIcon(sortColumn, sortDir); |
} |
}, |
|
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.destroy(this.resizeMarker, this.resizeProxy); |
|
this.initData(null, null); |
Ext.EventManager.removeResizeListener(this.onWindowResize, this); |
}, |
|
onDenyColumnHide : function(){ |
|
}, |
|
render : function(){ |
|
var cm = this.cm; |
var colCount = cm.getColumnCount(); |
|
if(this.autoFill){ |
this.fitColumns(true, true); |
}else if(this.forceFit){ |
this.fitColumns(true, false); |
}else if(this.grid.autoExpandColumn){ |
this.autoExpand(true); |
} |
|
this.renderUI(); |
}, |
|
|
initData : 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("configchange", this.onColConfigChange, this); |
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){ |
cm.on("configchange", this.onColConfigChange, this); |
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; |
}, |
|
onDataChange : function(){ |
this.refresh(); |
this.updateHeaderSortState(); |
}, |
|
onClear : function(){ |
this.refresh(); |
}, |
|
onUpdate : function(ds, record){ |
this.refreshRow(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); |
} |
this.removeRow(index); |
if(isUpdate !== true){ |
this.processRows(index); |
this.applyEmptyText(); |
this.fireEvent("rowremoved", this, index, record); |
} |
}, |
|
onLoad : function(){ |
this.scrollToTop(); |
}, |
|
onColWidthChange : function(cm, col, width){ |
this.updateColumnWidth(col, width); |
}, |
|
onHeaderChange : function(cm, col, text){ |
this.updateHeaders(); |
}, |
|
onHiddenChange : function(cm, col, hidden){ |
this.updateColumnHidden(col, hidden); |
}, |
|
onColumnMove : function(cm, oldIndex, newIndex){ |
this.indexMap = null; |
var s = this.getScrollState(); |
this.refresh(true); |
this.restoreScroll(s); |
this.afterMove(newIndex); |
}, |
|
onColConfigChange : function(){ |
delete this.lastViewWidth; |
this.indexMap = null; |
this.refresh(true); |
}, |
|
|
initUI : function(grid){ |
grid.on("headerclick", this.onHeaderClick, this); |
|
if(grid.trackMouseOver){ |
grid.on("mouseover", this.onRowOver, this); |
grid.on("mouseout", this.onRowOut, this); |
} |
}, |
|
initEvents : function(){ |
|
}, |
|
onHeaderClick : function(g, index){ |
if(this.headersDisabled || !this.cm.isSortable(index)){ |
return; |
} |
g.stopEditing(true); |
g.store.sort(this.cm.getDataIndex(index)); |
}, |
|
onRowOver : function(e, t){ |
var row; |
if((row = this.findRowIndex(t)) !== false){ |
this.addRowClass(row, "x-grid3-row-over"); |
} |
}, |
|
onRowOut : function(e, t){ |
var row; |
if((row = this.findRowIndex(t)) !== false && row !== this.findRowIndex(e.getRelatedTarget())){ |
this.removeRowClass(row, "x-grid3-row-over"); |
} |
}, |
|
handleWheel : function(e){ |
e.stopPropagation(); |
}, |
|
onRowSelect : function(row){ |
this.addRowClass(row, "x-grid3-row-selected"); |
}, |
|
onRowDeselect : function(row){ |
this.removeRowClass(row, "x-grid3-row-selected"); |
}, |
|
onCellSelect : function(row, col){ |
var cell = this.getCell(row, col); |
if(cell){ |
this.fly(cell).addClass("x-grid3-cell-selected"); |
} |
}, |
|
onCellDeselect : function(row, col){ |
var cell = this.getCell(row, col); |
if(cell){ |
this.fly(cell).removeClass("x-grid3-cell-selected"); |
} |
}, |
|
onColumnSplitterMoved : function(i, w){ |
this.userResized = true; |
var cm = this.grid.colModel; |
cm.setColumnWidth(i, w, true); |
|
if(this.forceFit){ |
this.fitColumns(true, false, i); |
this.updateAllColumnWidths(); |
}else{ |
this.updateColumnWidth(i, w); |
} |
|
this.grid.fireEvent("columnresize", i, w); |
}, |
|
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; |
default: |
index = cm.getIndexById(item.id.substr(4)); |
if(index != -1){ |
if(item.checked && cm.getColumnsBy(this.isHideableColumn, this).length <= 1){ |
this.onDenyColumnHide(); |
return false; |
} |
cm.setHidden(index, item.checked); |
} |
} |
return true; |
}, |
|
isHideableColumn : function(c){ |
return !c.hidden && !c.fixed; |
}, |
|
beforeColMenuShow : function(){ |
var cm = this.cm, colCount = cm.getColumnCount(); |
this.colMenu.removeAll(); |
for(var i = 0; i < colCount; i++){ |
if(cm.config[i].fixed !== true && cm.config[i].hideable !== false){ |
this.colMenu.add(new Ext.menu.CheckItem({ |
id: "col-"+cm.getColumnId(i), |
text: cm.getColumnHeader(i), |
checked: !cm.isHidden(i), |
hideOnClick:false, |
disabled: cm.config[i].hideable === false |
})); |
} |
} |
}, |
|
handleHdDown : function(e, t){ |
if(Ext.fly(t).hasClass('x-grid3-hd-btn')){ |
e.stopEvent(); |
var hd = this.findHeaderCell(t); |
Ext.fly(hd).addClass('x-grid3-hd-menu-open'); |
var index = this.getCellIndex(hd); |
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)); |
this.hmenu.on("hide", function(){ |
Ext.fly(hd).removeClass('x-grid3-hd-menu-open'); |
}, this, {single:true}); |
this.hmenu.show(t, "tl-bl?"); |
} |
}, |
|
handleHdOver : function(e, t){ |
var hd = this.findHeaderCell(t); |
if(hd && !this.headersDisabled){ |
this.activeHd = hd; |
this.activeHdIndex = this.getCellIndex(hd); |
var fly = this.fly(hd); |
this.activeHdRegion = fly.getRegion(); |
if(!this.cm.isMenuDisabled(this.activeHdIndex)){ |
fly.addClass("x-grid3-hd-over"); |
this.activeHdBtn = fly.child('.x-grid3-hd-btn'); |
if(this.activeHdBtn){ |
this.activeHdBtn.dom.style.height = (hd.firstChild.offsetHeight-1)+'px'; |
} |
} |
} |
}, |
|
handleHdMove : function(e, t){ |
if(this.activeHd && !this.headersDisabled){ |
var hw = this.splitHandleWidth || 5; |
var r = this.activeHdRegion; |
var x = e.getPageX(); |
var ss = this.activeHd.style; |
if(x - r.left <= hw && this.cm.isResizable(this.activeHdIndex-1)){ |
ss.cursor = Ext.isAir ? 'move' : Ext.isSafari ? 'e-resize' : 'col-resize'; }else if(r.right - x <= (!this.activeHdBtn ? hw : 2) && this.cm.isResizable(this.activeHdIndex)){ |
ss.cursor = Ext.isAir ? 'move' : Ext.isSafari ? 'w-resize' : 'col-resize'; |
}else{ |
ss.cursor = ''; |
} |
} |
}, |
|
handleHdOut : function(e, t){ |
var hd = this.findHeaderCell(t); |
if(hd && (!Ext.isIE || !e.within(hd, true))){ |
this.activeHd = null; |
this.fly(hd).removeClass("x-grid3-hd-over"); |
hd.style.cursor = ''; |
} |
}, |
|
hasRows : function(){ |
var fc = this.mainBody.dom.firstChild; |
return fc && fc.className != 'x-grid-empty'; |
}, |
|
bind : function(d, c){ |
this.initData(d, c); |
} |
}); |
|
|
Ext.grid.GridView.SplitDragZone = function(grid, hd){ |
this.grid = grid; |
this.view = grid.getView(); |
this.marker = this.view.resizeMarker; |
this.proxy = this.view.resizeProxy; |
Ext.grid.GridView.SplitDragZone.superclass.constructor.call(this, hd, |
"gridSplitters" + this.grid.getGridEl().id, { |
dragElId : Ext.id(this.proxy.dom), resizeFrame:false |
}); |
this.scroll = false; |
this.hw = this.view.splitHandleWidth || 5; |
}; |
Ext.extend(Ext.grid.GridView.SplitDragZone, Ext.dd.DDProxy, { |
|
b4StartDrag : function(x, y){ |
this.view.headersDisabled = true; |
var h = this.view.mainWrap.getHeight(); |
this.marker.setHeight(h); |
this.marker.show(); |
this.marker.alignTo(this.view.getHeaderCell(this.cellIndex), 'tl-tl', [-2, 0]); |
this.proxy.setHeight(h); |
var w = this.cm.getColumnWidth(this.cellIndex); |
var minw = Math.max(w-this.grid.minColumnWidth, 0); |
this.resetConstraints(); |
this.setXConstraint(minw, 1000); |
this.setYConstraint(0, 0); |
this.minX = x - minw; |
this.maxX = x + 1000; |
this.startPos = x; |
Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y); |
}, |
|
|
handleMouseDown : function(e){ |
var t = this.view.findHeaderCell(e.getTarget()); |
if(t){ |
var xy = this.view.fly(t).getXY(), x = xy[0], y = xy[1]; |
var exy = e.getXY(), ex = exy[0], ey = exy[1]; |
var w = t.offsetWidth, adjust = false; |
if((ex - x) <= this.hw){ |
adjust = -1; |
}else if((x+w) - ex <= this.hw){ |
adjust = 0; |
} |
if(adjust !== false){ |
this.cm = this.grid.colModel; |
var ci = this.view.getCellIndex(t); |
if(adjust == -1){ |
if (ci + adjust < 0) { |
return; |
} |
while(this.cm.isHidden(ci+adjust)){ |
--adjust; |
if(ci+adjust < 0){ |
return; |
} |
} |
} |
this.cellIndex = ci+adjust; |
this.split = t.dom; |
if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){ |
Ext.grid.GridView.SplitDragZone.superclass.handleMouseDown.apply(this, arguments); |
} |
}else if(this.view.columnDrag){ |
this.view.columnDrag.callHandleMouseDown(e); |
} |
} |
}, |
|
endDrag : function(e){ |
this.marker.hide(); |
var v = this.view; |
var endX = Math.max(this.minX, e.getPageX()); |
var diff = endX - this.startPos; |
v.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff); |
setTimeout(function(){ |
v.headersDisabled = false; |
}, 50); |
}, |
|
autoOffset : function(){ |
this.setDelta(0,0); |
} |
}); |
|
|
Ext.grid.GroupingView = Ext.extend(Ext.grid.GridView, { |
|
hideGroupedColumn:false, |
|
showGroupName:true, |
|
startCollapsed:false, |
|
enableGrouping:true, |
|
enableGroupingMenu:true, |
|
enableNoGroups:true, |
|
emptyGroupText : '(None)', |
|
ignoreAdd: false, |
|
groupTextTpl : '{text}', |
|
|
|
|
gidSeed : 1000, |
|
|
initTemplates : function(){ |
Ext.grid.GroupingView.superclass.initTemplates.call(this); |
this.state = {}; |
|
var sm = this.grid.getSelectionModel(); |
sm.on(sm.selectRow ? 'beforerowselect' : 'beforecellselect', |
this.onBeforeRowSelect, this); |
|
if(!this.startGroup){ |
this.startGroup = new Ext.XTemplate( |
'<div id="{groupId}" class="x-grid-group {cls}">', |
'<div id="{groupId}-hd" class="x-grid-group-hd" style="{style}"><div>', this.groupTextTpl ,'</div></div>', |
'<div id="{groupId}-bd" class="x-grid-group-body">' |
); |
} |
this.startGroup.compile(); |
this.endGroup = '</div></div>'; |
}, |
|
|
findGroup : function(el){ |
return Ext.fly(el).up('.x-grid-group', this.mainBody.dom); |
}, |
|
|
getGroups : function(){ |
return this.hasRows() ? this.mainBody.dom.childNodes : []; |
}, |
|
|
onAdd : function(){ |
if(this.enableGrouping && !this.ignoreAdd){ |
var ss = this.getScrollState(); |
this.refresh(); |
this.restoreScroll(ss); |
}else if(!this.enableGrouping){ |
Ext.grid.GroupingView.superclass.onAdd.apply(this, arguments); |
} |
}, |
|
|
onRemove : function(ds, record, index, isUpdate){ |
Ext.grid.GroupingView.superclass.onRemove.apply(this, arguments); |
var g = document.getElementById(record._groupId); |
if(g && g.childNodes[1].childNodes.length < 1){ |
Ext.removeNode(g); |
} |
this.applyEmptyText(); |
}, |
|
|
refreshRow : function(record){ |
if(this.ds.getCount()==1){ |
this.refresh(); |
}else{ |
this.isUpdating = true; |
Ext.grid.GroupingView.superclass.refreshRow.apply(this, arguments); |
this.isUpdating = false; |
} |
}, |
|
|
beforeMenuShow : function(){ |
var field = this.getGroupField(); |
var g = this.hmenu.items.get('groupBy'); |
if(g){ |
g.setDisabled(this.cm.config[this.hdCtxIndex].groupable === false); |
} |
var s = this.hmenu.items.get('showGroups'); |
if(s){ |
if (!!field){ |
s.setDisabled(this.cm.config[this.hdCtxIndex].groupable === false) |
} |
s.setChecked(!!field); |
} |
}, |
|
|
renderUI : function(){ |
Ext.grid.GroupingView.superclass.renderUI.call(this); |
this.mainBody.on('mousedown', this.interceptMouse, this); |
|
if(this.enableGroupingMenu && this.hmenu){ |
this.hmenu.add('-',{ |
id:'groupBy', |
text: this.groupByText, |
handler: this.onGroupByClick, |
scope: this, |
iconCls:'x-group-by-icon' |
}); |
if(this.enableNoGroups){ |
this.hmenu.add({ |
id:'showGroups', |
text: this.showGroupsText, |
checked: true, |
checkHandler: this.onShowGroupsClick, |
scope: this |
}); |
} |
this.hmenu.on('beforeshow', this.beforeMenuShow, this); |
} |
}, |
|
|
onGroupByClick : function(){ |
this.grid.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex)); |
this.beforeMenuShow(); |
}, |
|
|
onShowGroupsClick : function(mi, checked){ |
if(checked){ |
this.onGroupByClick(); |
}else{ |
this.grid.store.clearGrouping(); |
} |
}, |
|
|
toggleGroup : function(group, expanded){ |
this.grid.stopEditing(true); |
group = Ext.getDom(group); |
var gel = Ext.fly(group); |
expanded = expanded !== undefined ? |
expanded : gel.hasClass('x-grid-group-collapsed'); |
|
this.state[gel.dom.id] = expanded; |
gel[expanded ? 'removeClass' : 'addClass']('x-grid-group-collapsed'); |
}, |
|
|
toggleAllGroups : function(expanded){ |
var groups = this.getGroups(); |
for(var i = 0, len = groups.length; i < len; i++){ |
this.toggleGroup(groups[i], expanded); |
} |
}, |
|
|
expandAllGroups : function(){ |
this.toggleAllGroups(true); |
}, |
|
|
collapseAllGroups : function(){ |
this.toggleAllGroups(false); |
}, |
|
|
interceptMouse : function(e){ |
var hd = e.getTarget('.x-grid-group-hd', this.mainBody); |
if(hd){ |
e.stopEvent(); |
this.toggleGroup(hd.parentNode); |
} |
}, |
|
|
getGroup : function(v, r, groupRenderer, rowIndex, colIndex, ds){ |
var g = groupRenderer ? groupRenderer(v, {}, r, rowIndex, colIndex, ds) : String(v); |
if(g === ''){ |
g = this.cm.config[colIndex].emptyGroupText || this.emptyGroupText; |
} |
return g; |
}, |
|
|
getGroupField : function(){ |
return this.grid.store.getGroupState(); |
}, |
|
|
renderRows : function(){ |
var groupField = this.getGroupField(); |
var eg = !!groupField; |
|
if(this.hideGroupedColumn) { |
var colIndex = this.cm.findColumnIndex(groupField); |
if(!eg && this.lastGroupField !== undefined) { |
this.mainBody.update(''); |
this.cm.setHidden(this.cm.findColumnIndex(this.lastGroupField), false); |
delete this.lastGroupField; |
}else if (eg && this.lastGroupField === undefined) { |
this.lastGroupField = groupField; |
this.cm.setHidden(colIndex, true); |
}else if (eg && this.lastGroupField !== undefined && groupField !== this.lastGroupField) { |
this.mainBody.update(''); |
var oldIndex = this.cm.findColumnIndex(this.lastGroupField); |
this.cm.setHidden(oldIndex, false); |
this.lastGroupField = groupField; |
this.cm.setHidden(colIndex, true); |
} |
} |
return Ext.grid.GroupingView.superclass.renderRows.apply( |
this, arguments); |
}, |
|
|
doRender : function(cs, rs, ds, startRow, colCount, stripe){ |
if(rs.length < 1){ |
return ''; |
} |
var groupField = this.getGroupField(); |
var colIndex = this.cm.findColumnIndex(groupField); |
|
this.enableGrouping = !!groupField; |
|
if(!this.enableGrouping || this.isUpdating){ |
return Ext.grid.GroupingView.superclass.doRender.apply( |
this, arguments); |
} |
var gstyle = 'width:'+this.getTotalWidth()+';'; |
|
var gidPrefix = this.grid.getGridEl().id; |
var cfg = this.cm.config[colIndex]; |
var groupRenderer = cfg.groupRenderer || cfg.renderer; |
var prefix = this.showGroupName ? |
(cfg.groupName || cfg.header)+': ' : ''; |
|
var groups = [], curGroup, i, len, gid; |
for(i = 0, len = rs.length; i < len; i++){ |
var rowIndex = startRow + i; |
var r = rs[i], |
gvalue = r.data[groupField], |
g = this.getGroup(gvalue, r, groupRenderer, rowIndex, colIndex, ds); |
if(!curGroup || curGroup.group != g){ |
gid = gidPrefix + '-gp-' + groupField + '-' + Ext.util.Format.htmlEncode(g); |
|
|
var isCollapsed = typeof this.state[gid] !== 'undefined' ? !this.state[gid] : this.startCollapsed; |
var gcls = isCollapsed ? 'x-grid-group-collapsed' : ''; |
curGroup = { |
group: g, |
gvalue: gvalue, |
text: prefix + g, |
groupId: gid, |
startRow: rowIndex, |
rs: [r], |
cls: gcls, |
style: gstyle |
}; |
groups.push(curGroup); |
}else{ |
curGroup.rs.push(r); |
} |
r._groupId = gid; |
} |
|
var buf = []; |
for(i = 0, len = groups.length; i < len; i++){ |
var g = groups[i]; |
this.doGroupStart(buf, g, cs, ds, colCount); |
buf[buf.length] = Ext.grid.GroupingView.superclass.doRender.call( |
this, cs, g.rs, ds, g.startRow, colCount, stripe); |
|
this.doGroupEnd(buf, g, cs, ds, colCount); |
} |
return buf.join(''); |
}, |
|
|
getGroupId : function(value){ |
var gidPrefix = this.grid.getGridEl().id; |
var groupField = this.getGroupField(); |
var colIndex = this.cm.findColumnIndex(groupField); |
var cfg = this.cm.config[colIndex]; |
var groupRenderer = cfg.groupRenderer || cfg.renderer; |
var gtext = this.getGroup(value, {data:{}}, groupRenderer, 0, colIndex, this.ds); |
return gidPrefix + '-gp-' + groupField + '-' + Ext.util.Format.htmlEncode(value); |
}, |
|
|
doGroupStart : function(buf, g, cs, ds, colCount){ |
buf[buf.length] = this.startGroup.apply(g); |
}, |
|
|
doGroupEnd : function(buf, g, cs, ds, colCount){ |
buf[buf.length] = this.endGroup; |
}, |
|
|
getRows : function(){ |
if(!this.enableGrouping){ |
return Ext.grid.GroupingView.superclass.getRows.call(this); |
} |
var r = []; |
var g, gs = this.getGroups(); |
for(var i = 0, len = gs.length; i < len; i++){ |
g = gs[i].childNodes[1].childNodes; |
for(var j = 0, jlen = g.length; j < jlen; j++){ |
r[r.length] = g[j]; |
} |
} |
return r; |
}, |
|
|
updateGroupWidths : function(){ |
if(!this.enableGrouping || !this.hasRows()){ |
return; |
} |
var tw = Math.max(this.cm.getTotalWidth(), this.el.dom.offsetWidth-this.scrollOffset) +'px'; |
var gs = this.getGroups(); |
for(var i = 0, len = gs.length; i < len; i++){ |
gs[i].firstChild.style.width = tw; |
} |
}, |
|
|
onColumnWidthUpdated : function(col, w, tw){ |
this.updateGroupWidths(); |
}, |
|
|
onAllColumnWidthsUpdated : function(ws, tw){ |
this.updateGroupWidths(); |
}, |
|
|
onColumnHiddenUpdated : function(col, hidden, tw){ |
this.updateGroupWidths(); |
}, |
|
|
onLayout : function(){ |
this.updateGroupWidths(); |
}, |
|
|
onBeforeRowSelect : function(sm, rowIndex){ |
if(!this.enableGrouping){ |
return; |
} |
var row = this.getRow(rowIndex); |
if(row && !row.offsetParent){ |
var g = this.findGroup(row); |
this.toggleGroup(g, true); |
} |
}, |
|
|
groupByText: 'Group By This Field', |
|
showGroupsText: 'Show in Groups' |
}); |
|
Ext.grid.GroupingView.GROUP_ID = 1000; |
|
|
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(this.grid, rowIndex, e); |
} |
return {grid: this.grid, ddel: this.ddel, rowIndex: rowIndex, selections:sm.getSelections()}; |
} |
return false; |
}, |
|
onInitDrag : function(e){ |
var data = this.dragData; |
this.ddel.innerHTML = this.grid.getDragDropText(); |
this.proxy.update(this.ddel); |
}, |
|
afterRepair : function(){ |
this.dragging = false; |
}, |
|
getRepairXY : function(e, data){ |
return false; |
}, |
|
onEndDrag : function(data, e){ |
}, |
|
onValidDrop : function(dd, e, id){ |
this.hideProxy(); |
}, |
|
beforeInvalidDrop : function(e, id){ |
|
} |
}); |
|
|
Ext.grid.ColumnModel = function(config){ |
|
this.defaultWidth = 100; |
|
|
this.defaultSortable = false; |
|
|
if(config.columns){ |
Ext.apply(this, config); |
this.setConfig(config.columns, true); |
}else{ |
this.setConfig(config, true); |
} |
this.addEvents( |
|
"widthchange", |
|
"headerchange", |
|
"hiddenchange", |
|
"columnmoved", |
|
"columnlockchange", |
|
"configchange" |
); |
Ext.grid.ColumnModel.superclass.constructor.call(this); |
}; |
Ext.extend(Ext.grid.ColumnModel, Ext.util.Observable, { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
getColumnId : function(index){ |
return this.config[index].id; |
}, |
|
|
setConfig : function(config, initial){ |
if(!initial){ |
delete this.totalWidth; |
for(var i = 0, len = this.config.length; i < len; i++){ |
var c = this.config[i]; |
if(c.editor){ |
c.editor.destroy(); |
} |
} |
} |
this.config = config; |
this.lookup = {}; |
|
for(var i = 0, len = config.length; i < len; i++){ |
var c = config[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; |
} |
if(!initial){ |
this.fireEvent('configchange', this); |
} |
}, |
|
|
getColumnById : function(id){ |
return this.lookup[id]; |
}, |
|
|
getIndexById : function(id){ |
for(var i = 0, len = this.config.length; i < len; i++){ |
if(this.config[i].id == id){ |
return i; |
} |
} |
return -1; |
}, |
|
|
moveColumn : function(oldIndex, newIndex){ |
var 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; |
}, |
|
|
isMenuDisabled : function(col){ |
return !!this.config[col].menuDisabled; |
}, |
|
|
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){ |
var c = this.config[colIndex]; |
if(c.hidden !== hidden){ |
c.hidden = hidden; |
this.totalWidth = null; |
this.fireEvent("hiddenchange", this, colIndex, hidden); |
} |
}, |
|
|
setEditor : function(col, editor){ |
this.config[col].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", |
|
"beforerowselect", |
|
"rowselect", |
|
"rowdeselect" |
); |
|
Ext.grid.RowSelectionModel.superclass.constructor.call(this); |
}; |
|
Ext.extend(Ext.grid.RowSelectionModel, Ext.grid.AbstractSelectionModel, { |
|
singleSelect : false, |
|
|
initEvents : function(){ |
|
if(!this.grid.enableDragDrop && !this.grid.enableDrag){ |
this.grid.on("rowmousedown", 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.store, index; |
var s = this.getSelections(); |
this.clearSelections(true); |
for(var i = 0, len = s.length; i < len; i++){ |
var r = s[i]; |
if((index = ds.indexOfId(r.id)) != -1){ |
this.selectRow(index, true); |
} |
} |
if(s.length != this.selections.getCount()){ |
this.fireEvent("selectionchange", this); |
} |
}, |
|
onRemove : function(v, index, r){ |
if(this.selections.remove(r) !== false){ |
this.fireEvent('selectionchange', this); |
} |
}, |
|
onRowUpdated : function(v, index, r){ |
if(this.isSelected(r)){ |
v.onRowSelect(index); |
} |
}, |
|
|
selectRecords : function(records, keepExisting){ |
if(!keepExisting){ |
this.clearSelections(); |
} |
var ds = this.grid.store; |
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.store.getCount() - 1, keepExisting); |
}, |
|
|
selectNext : function(keepExisting){ |
if(this.hasNext()){ |
this.selectRow(this.last+1, keepExisting); |
this.grid.getView().focusRow(this.last); |
return true; |
} |
return false; |
}, |
|
|
selectPrevious : function(keepExisting){ |
if(this.hasPrevious()){ |
this.selectRow(this.last-1, keepExisting); |
this.grid.getView().focusRow(this.last); |
return true; |
} |
return false; |
}, |
|
|
hasNext : function(){ |
return this.last !== false && (this.last+1) < this.grid.store.getCount(); |
}, |
|
|
hasPrevious : function(){ |
return !!this.last; |
}, |
|
|
|
getSelections : function(){ |
return [].concat(this.selections.items); |
}, |
|
|
getSelected : function(){ |
return this.selections.itemAt(0); |
}, |
|
|
each : function(fn, scope){ |
var s = this.getSelections(); |
for(var i = 0, len = s.length; i < len; i++){ |
if(fn.call(scope || this, s[i], i) === false){ |
return false; |
} |
} |
return true; |
}, |
|
|
clearSelections : function(fast){ |
if(this.locked) return; |
if(fast !== true){ |
var ds = this.grid.store; |
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.store.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.store.getAt(index) : index; |
return (r && this.selections.key(r.id) ? true : false); |
}, |
|
|
isIdSelected : function(id){ |
return (this.selections.key(id) ? true : false); |
}, |
|
handleMouseDown : function(g, rowIndex, e){ |
if(e.button !== 0 || this.isLocked()){ |
return; |
}; |
var view = this.grid.getView(); |
if(e.shiftKey && this.last !== false){ |
var last = this.last; |
this.selectRange(last, rowIndex, e.ctrlKey); |
this.last = last; view.focusRow(rowIndex); |
}else{ |
var isSelected = this.isSelected(rowIndex); |
if(e.ctrlKey && isSelected){ |
this.deselectRow(rowIndex); |
}else if(!isSelected || this.getCount() > 1){ |
this.selectRow(rowIndex, e.ctrlKey || e.shiftKey); |
view.focusRow(rowIndex); |
} |
} |
}, |
|
|
selectRows : function(rows, keepExisting){ |
if(!keepExisting){ |
this.clearSelections(); |
} |
for(var i = 0, len = rows.length; i < len; i++){ |
this.selectRow(rows[i], true); |
} |
}, |
|
|
selectRange : function(startRow, endRow, keepExisting){ |
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.store.getCount())) return; |
var r = this.grid.store.getAt(index); |
if(r && this.fireEvent("beforerowselect", this, index, keepExisting, r) !== false){ |
if(!keepExisting || this.singleSelect){ |
this.clearSelections(); |
} |
this.selections.add(r); |
this.last = this.lastActive = index; |
if(!preventViewNotify){ |
this.grid.getView().onRowSelect(index); |
} |
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.store.getAt(index); |
if(r){ |
this.selections.remove(r); |
if(!preventViewNotify){ |
this.grid.getView().onRowDeselect(index); |
} |
this.fireEvent("rowdeselect", this, index, r); |
this.fireEvent("selectionchange", this); |
} |
}, |
|
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; |
var shift = e.shiftKey; |
if(k == e.TAB){ |
e.stopEvent(); |
ed.completeEdit(); |
if(shift){ |
newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this); |
}else{ |
newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this); |
} |
}else if(k == e.ENTER){ |
e.stopEvent(); |
ed.completeEdit(); |
if(this.moveEditorOnEnter !== false){ |
if(shift){ |
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", |
|
"cellselect", |
|
"selectionchange" |
); |
|
Ext.grid.CellSelectionModel.superclass.constructor.call(this); |
}; |
|
Ext.extend(Ext.grid.CellSelectionModel, Ext.grid.AbstractSelectionModel, { |
|
|
initEvents : function(){ |
this.grid.on("cellmousedown", 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(g, row, cell, e){ |
if(e.button !== 0 || this.isLocked()){ |
return; |
}; |
this.select(row, cell); |
}, |
|
|
select : function(rowIndex, colIndex, preventViewNotify, preventFocus, r){ |
if(this.fireEvent("beforecellselect", this, rowIndex, colIndex) !== false){ |
this.clearSelections(); |
r = r || this.grid.store.getAt(rowIndex); |
this.selection = { |
record : r, |
cell : [rowIndex, colIndex] |
}; |
if(!preventViewNotify){ |
var v = this.grid.getView(); |
v.onCellSelect(rowIndex, colIndex); |
if(preventFocus !== true){ |
v.focusCell(rowIndex, colIndex); |
} |
} |
this.fireEvent("cellselect", this, rowIndex, colIndex); |
this.fireEvent("selectionchange", this, this.selection); |
} |
}, |
|
isSelectable : function(rowIndex, colIndex, cm){ |
return !cm.isHidden(colIndex); |
}, |
|
|
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){ |
ed.completeEdit(); |
e.stopEvent(); |
}else if(k == e.ESC){ |
e.stopEvent(); |
ed.cancelEdit(); |
} |
if(newCell){ |
g.startEditing(newCell[0], newCell[1]); |
} |
} |
}); |
|
Ext.grid.EditorGridPanel = Ext.extend(Ext.grid.GridPanel, { |
|
clicksToEdit: 2, |
|
|
isEditor : true, |
|
detectEdit: false, |
|
|
autoEncode : false, |
|
|
|
trackMouseOver: false, |
|
|
initComponent : function(){ |
Ext.grid.EditorGridPanel.superclass.initComponent.call(this); |
|
if(!this.selModel){ |
this.selModel = new Ext.grid.CellSelectionModel(); |
} |
|
this.activeEditor = null; |
|
this.addEvents( |
|
"beforeedit", |
|
"afteredit", |
|
"validateedit" |
); |
}, |
|
|
initEvents : function(){ |
Ext.grid.EditorGridPanel.superclass.initEvents.call(this); |
|
this.on("bodyscroll", this.stopEditing, this, [true]); |
|
if(this.clicksToEdit == 1){ |
this.on("cellclick", this.onCellDblClick, this); |
}else { |
if(this.clicksToEdit == 'auto' && this.view.mainBody){ |
this.view.mainBody.on("mousedown", this.onAutoEditClick, this); |
} |
this.on("celldblclick", this.onCellDblClick, this); |
} |
this.getGridEl().addClass("xedit-grid"); |
}, |
|
|
onCellDblClick : function(g, row, col){ |
this.startEditing(row, col); |
}, |
|
|
onAutoEditClick : function(e, t){ |
if(e.button !== 0){ |
return; |
} |
var row = this.view.findRowIndex(t); |
var col = this.view.findCellIndex(t); |
if(row !== false && col !== false){ |
this.stopEditing(); |
if(this.selModel.getSelectedCell){ |
var sc = this.selModel.getSelectedCell(); |
if(sc && sc.cell[0] === row && sc.cell[1] === col){ |
this.startEditing(row, col); |
} |
}else{ |
if(this.selModel.isSelected(row)){ |
this.startEditing(row, col); |
} |
} |
} |
}, |
|
|
onEditComplete : function(ed, value, startValue){ |
this.editing = false; |
this.activeEditor = null; |
ed.un("specialkey", this.selModel.onEditorKey, this.selModel); |
var r = ed.record; |
var field = this.colModel.getDataIndex(ed.col); |
value = this.postEditValue(value, startValue, r, field); |
if(String(value) !== String(startValue)){ |
var e = { |
grid: this, |
record: r, |
field: field, |
originalValue: startValue, |
value: value, |
row: ed.row, |
column: ed.col, |
cancel:false |
}; |
if(this.fireEvent("validateedit", e) !== false && !e.cancel){ |
r.set(field, e.value); |
delete e.cancel; |
this.fireEvent("afteredit", e); |
} |
} |
this.view.focusCell(ed.row, ed.col); |
}, |
|
|
startEditing : function(row, col){ |
this.stopEditing(); |
if(this.colModel.isCellEditable(col, row)){ |
this.view.ensureVisible(row, col, true); |
var r = this.store.getAt(row); |
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(this.view.getEditorParent(ed)); |
} |
(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 = this.preEditValue(r, field); |
ed.startEdit(this.view.getCell(row, col), v); |
}).defer(50, this); |
} |
} |
}, |
|
preEditValue : function(r, field){ |
return this.autoEncode && typeof value == 'string' ? Ext.util.Format.htmlDecode(r.data[field]) : r.data[field]; |
}, |
|
postEditValue : function(value, originalValue, r, field){ |
return this.autoEncode && typeof value == 'string' ? Ext.util.Format.htmlEncode(value) : value; |
}, |
|
|
stopEditing : function(cancel){ |
if(this.activeEditor){ |
this.activeEditor[cancel === true ? 'cancelEdit' : 'completeEdit'](); |
} |
this.activeEditor = null; |
} |
}); |
Ext.reg('editorgrid', Ext.grid.EditorGridPanel); |
Ext.grid.GridEditor = function(field, config){ |
Ext.grid.GridEditor.superclass.constructor.call(this, field, config); |
field.monitorTab = false; |
}; |
|
Ext.extend(Ext.grid.GridEditor, Ext.Editor, { |
alignment: "tl-tl", |
autoSize: "width", |
hideEl : false, |
cls: "x-small-editor x-grid-editor", |
shim:false, |
shadow:false |
}); |
|
Ext.grid.PropertyRecord = Ext.data.Record.create([ |
{name:'name',type:'string'}, 'value' |
]); |
|
|
Ext.grid.PropertyStore = 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(Ext.isDate(val)){ |
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, width:50, sortable: true, dataIndex:'name', id: 'name', menuDisabled:true}, |
{header: this.valueText, width:50, resizable:false, dataIndex: 'value', id: 'value', menuDisabled:true} |
]); |
this.store = store; |
this.bselect = Ext.DomHelper.append(document.body, { |
tag: 'select', cls: 'x-grid-editor x-hide-display', children: [ |
{tag: 'option', value: 'true', html: 'true'}, |
{tag: 'option', value: 'false', html: 'false'} |
] |
}); |
var f = Ext.form; |
|
var bfield = new f.Field({ |
el:this.bselect, |
bselect : this.bselect, |
autoShow: true, |
getValue : function(){ |
return this.bselect.value == 'true'; |
} |
}); |
this.editors = { |
'date' : new g.GridEditor(new f.DateField({selectOnFocus:true})), |
'string' : new g.GridEditor(new f.TextField({selectOnFocus:true})), |
'number' : new g.GridEditor(new f.NumberField({selectOnFocus:true, style:'text-align:left;'})), |
'boolean' : new g.GridEditor(bfield) |
}; |
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(Ext.isDate(val)){ |
rv = this.renderDate(val); |
}else if(typeof val == 'boolean'){ |
rv = this.renderBool(val); |
} |
return Ext.util.Format.htmlEncode(rv); |
}, |
|
getPropertyName : function(name){ |
var pn = this.grid.propertyNames; |
return pn && pn[name] ? pn[name] : name; |
}, |
|
getCellEditor : function(colIndex, rowIndex){ |
var p = this.store.getProperty(rowIndex); |
var n = p.data['name'], val = p.data['value']; |
if(this.grid.customEditors[n]){ |
return this.grid.customEditors[n]; |
} |
if(Ext.isDate(val)){ |
return this.editors['date']; |
}else if(typeof val == 'number'){ |
return this.editors['number']; |
}else if(typeof val == 'boolean'){ |
return this.editors['boolean']; |
}else{ |
return this.editors['string']; |
} |
} |
}); |
|
|
Ext.grid.PropertyGrid = Ext.extend(Ext.grid.EditorGridPanel, { |
|
|
|
enableColumnMove:false, |
stripeRows:false, |
trackMouseOver: false, |
clicksToEdit:1, |
enableHdMenu : false, |
viewConfig : { |
forceFit:true |
}, |
|
initComponent : function(){ |
this.customEditors = this.customEditors || {}; |
this.lastEditRow = null; |
var store = new Ext.grid.PropertyStore(this); |
this.propStore = store; |
var cm = new Ext.grid.PropertyColumnModel(this, store); |
store.store.sort('name', 'ASC'); |
this.addEvents( |
|
'beforepropertychange', |
|
'propertychange' |
); |
this.cm = cm; |
this.ds = store.store; |
Ext.grid.PropertyGrid.superclass.initComponent.call(this); |
|
this.selModel.on('beforecellselect', function(sm, rowIndex, colIndex){ |
if(colIndex === 0){ |
this.startEditing.defer(200, this, [rowIndex, 1]); |
return false; |
} |
}, this); |
}, |
|
onRender : function(){ |
Ext.grid.PropertyGrid.superclass.onRender.apply(this, arguments); |
|
this.getGridEl().addClass('x-props-grid'); |
}, |
|
afterRender: function(){ |
Ext.grid.PropertyGrid.superclass.afterRender.apply(this, arguments); |
if(this.source){ |
this.setSource(this.source); |
} |
}, |
|
|
setSource : function(source){ |
this.propStore.setSource(source); |
}, |
|
|
getSource : function(){ |
return this.propStore.getSource(); |
} |
}); |
|
Ext.grid.RowNumberer = function(config){ |
Ext.apply(this, config); |
if(this.rowspan){ |
this.renderer = this.renderer.createDelegate(this); |
} |
}; |
|
Ext.grid.RowNumberer.prototype = { |
|
header: "", |
|
width: 23, |
|
sortable: false, |
|
|
fixed:true, |
menuDisabled:true, |
dataIndex: '', |
id: 'numberer', |
rowspan: undefined, |
|
|
renderer : function(v, p, record, rowIndex){ |
if(this.rowspan){ |
p.cellAttr = 'rowspan="'+this.rowspan+'"'; |
} |
return rowIndex+1; |
} |
}; |
|
Ext.grid.CheckboxSelectionModel = Ext.extend(Ext.grid.RowSelectionModel, { |
|
header: '<div class="x-grid3-hd-checker"> </div>', |
|
width: 20, |
|
sortable: false, |
|
|
menuDisabled:true, |
fixed:true, |
dataIndex: '', |
id: 'checker', |
|
|
initEvents : function(){ |
Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this); |
this.grid.on('render', function(){ |
var view = this.grid.getView(); |
view.mainBody.on('mousedown', this.onMouseDown, this); |
Ext.fly(view.innerHd).on('mousedown', this.onHdMouseDown, this); |
|
}, this); |
}, |
|
|
onMouseDown : function(e, t){ |
if(e.button === 0 && t.className == 'x-grid3-row-checker'){ |
e.stopEvent(); |
var row = e.getTarget('.x-grid3-row'); |
if(row){ |
var index = row.rowIndex; |
if(this.isSelected(index)){ |
this.deselectRow(index); |
}else{ |
this.selectRow(index, true); |
} |
} |
} |
}, |
|
|
onHdMouseDown : function(e, t){ |
if(t.className == 'x-grid3-hd-checker'){ |
e.stopEvent(); |
var hd = Ext.fly(t.parentNode); |
var isChecked = hd.hasClass('x-grid3-hd-checker-on'); |
if(isChecked){ |
hd.removeClass('x-grid3-hd-checker-on'); |
this.clearSelections(); |
}else{ |
hd.addClass('x-grid3-hd-checker-on'); |
this.selectAll(); |
} |
} |
}, |
|
|
renderer : function(v, p, record){ |
return '<div class="x-grid3-row-checker"> </div>'; |
} |
}); |
|
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 = Ext.value(this.removeMask, false); |
}else{ |
var um = this.el.getUpdater(); |
um.showLoadIndicator = false; um.on('beforeupdate', this.onBeforeLoad, this); |
um.on('update', this.onLoad, this); |
um.on('failure', this.onLoad, this); |
this.removeMask = Ext.value(this.removeMask, true); |
} |
}; |
|
Ext.LoadMask.prototype = { |
|
|
|
msg : 'Loading...', |
|
msgCls : 'x-mask-loading', |
|
|
disabled: false, |
|
|
disable : function(){ |
this.disabled = true; |
}, |
|
|
enable : function(){ |
this.disabled = false; |
}, |
|
onLoad : function(){ |
this.el.unmask(this.removeMask); |
}, |
|
onBeforeLoad : function(){ |
if(!this.disabled){ |
this.el.mask(this.msg, this.msgCls); |
} |
}, |
|
|
show: function(){ |
this.onBeforeLoad(); |
}, |
|
|
hide: function(){ |
this.onLoad(); |
}, |
|
destroy : function(){ |
if(this.store){ |
this.store.un('beforeload', this.onBeforeLoad, this); |
this.store.un('load', this.onLoad, this); |
this.store.un('loadexception', this.onLoad, this); |
}else{ |
var um = this.el.getUpdater(); |
um.un('beforeupdate', this.onBeforeLoad, this); |
um.un('update', this.onLoad, this); |
um.un('failure', this.onLoad, this); |
} |
} |
}; |
|
Ext.ProgressBar = Ext.extend(Ext.BoxComponent, { |
|
baseCls : 'x-progress', |
|
|
waitTimer : null, |
|
|
initComponent : function(){ |
Ext.ProgressBar.superclass.initComponent.call(this); |
this.addEvents( |
|
"update" |
); |
}, |
|
|
onRender : function(ct, position){ |
Ext.ProgressBar.superclass.onRender.call(this, ct, position); |
|
var tpl = new Ext.Template( |
'<div class="{cls}-wrap">', |
'<div class="{cls}-inner">', |
'<div class="{cls}-bar">', |
'<div class="{cls}-text">', |
'<div> </div>', |
'</div>', |
'</div>', |
'<div class="{cls}-text {cls}-text-back">', |
'<div> </div>', |
'</div>', |
'</div>', |
'</div>' |
); |
|
if(position){ |
this.el = tpl.insertBefore(position, {cls: this.baseCls}, true); |
}else{ |
this.el = tpl.append(ct, {cls: this.baseCls}, true); |
} |
if(this.id){ |
this.el.dom.id = this.id; |
} |
var inner = this.el.dom.firstChild; |
this.progressBar = Ext.get(inner.firstChild); |
|
if(this.textEl){ |
|
this.textEl = Ext.get(this.textEl); |
delete this.textTopEl; |
}else{ |
|
this.textTopEl = Ext.get(this.progressBar.dom.firstChild); |
var textBackEl = Ext.get(inner.childNodes[1]); |
this.textTopEl.setStyle("z-index", 99).addClass('x-hidden'); |
this.textEl = new Ext.CompositeElement([this.textTopEl.dom.firstChild, textBackEl.dom.firstChild]); |
this.textEl.setWidth(inner.offsetWidth); |
} |
if(this.value){ |
this.updateProgress(this.value, this.text); |
}else{ |
this.updateText(this.text); |
} |
this.setSize(this.width || 'auto', 'auto'); |
this.progressBar.setHeight(inner.offsetHeight); |
}, |
|
|
updateProgress : function(value, text){ |
this.value = value || 0; |
if(text){ |
this.updateText(text); |
} |
var w = Math.floor(value*this.el.dom.firstChild.offsetWidth); |
this.progressBar.setWidth(w); |
if(this.textTopEl){ |
|
this.textTopEl.removeClass('x-hidden').setWidth(w); |
} |
this.fireEvent('update', this, value, text); |
return this; |
}, |
|
|
wait : function(o){ |
if(!this.waitTimer){ |
var scope = this; |
o = o || {}; |
this.waitTimer = Ext.TaskMgr.start({ |
run: function(i){ |
var inc = o.increment || 10; |
this.updateProgress(((((i+inc)%inc)+1)*(100/inc))*.01); |
}, |
interval: o.interval || 1000, |
duration: o.duration, |
onStop: function(){ |
if(o.fn){ |
o.fn.apply(o.scope || this); |
} |
this.reset(); |
}, |
scope: scope |
}); |
} |
return this; |
}, |
|
|
isWaiting : function(){ |
return this.waitTimer != null; |
}, |
|
|
updateText : function(text){ |
this.text = text || ' '; |
this.textEl.update(this.text); |
return this; |
}, |
|
|
setSize : function(w, h){ |
Ext.ProgressBar.superclass.setSize.call(this, w, h); |
if(this.textTopEl){ |
var inner = this.el.dom.firstChild; |
this.textEl.setSize(inner.offsetWidth, inner.offsetHeight); |
} |
return this; |
}, |
|
|
reset : function(hide){ |
this.updateProgress(0); |
if(this.textTopEl){ |
this.textTopEl.addClass('x-hidden'); |
} |
if(this.waitTimer){ |
this.waitTimer.onStop = null; |
Ext.TaskMgr.stop(this.waitTimer); |
this.waitTimer = null; |
} |
if(hide === true){ |
this.hide(); |
} |
return this; |
} |
}); |
Ext.reg('progress', Ext.ProgressBar); |
Ext.debug = {}; |
|
(function(){ |
|
var cp; |
|
function createConsole(){ |
|
var scriptPanel = new Ext.debug.ScriptsPanel(); |
var logView = new Ext.debug.LogPanel(); |
var tree = new Ext.debug.DomTree(); |
|
var tabs = new Ext.TabPanel({ |
activeTab: 0, |
border: false, |
tabPosition: 'bottom', |
items: [{ |
title: 'Debug Console', |
layout:'border', |
items: [logView, scriptPanel] |
},{ |
title: 'DOM Inspector', |
layout:'border', |
items: [tree] |
}] |
}); |
|
cp = new Ext.Panel({ |
id: 'x-debug-browser', |
title: 'Console', |
collapsible: true, |
animCollapse: false, |
style: 'position:absolute;left:0;bottom:0;', |
height:200, |
logView: logView, |
layout: 'fit', |
|
tools:[{ |
id: 'close', |
handler: function(){ |
cp.destroy(); |
cp = null; |
Ext.EventManager.removeResizeListener(handleResize); |
} |
}], |
|
items: tabs |
}); |
|
cp.render(document.body); |
|
cp.resizer = new Ext.Resizable(cp.el, { |
minHeight:50, |
handles: "n", |
pinned: true, |
transparent:true, |
resizeElement : function(){ |
var box = this.proxy.getBox(); |
this.proxy.hide(); |
cp.setHeight(box.height); |
return box; |
} |
}); |
|
function handleResize(){ |
cp.setWidth(Ext.getBody().getViewSize().width); |
} |
Ext.EventManager.onWindowResize(handleResize); |
|
handleResize(); |
} |
|
|
Ext.apply(Ext, { |
log : function(){ |
if(!cp){ |
createConsole(); |
} |
cp.logView.log.apply(cp.logView, arguments); |
}, |
|
logf : function(format, arg1, arg2, etc){ |
Ext.log(String.format.apply(String, arguments)); |
}, |
|
dump : function(o){ |
if(typeof o == 'string' || typeof o == 'number' || typeof o == 'undefined' || Ext.isDate(o)){ |
Ext.log(o); |
}else if(!o){ |
Ext.log("null"); |
}else if(typeof o != "object"){ |
Ext.log('Unknown return type'); |
}else if(Ext.isArray(o)){ |
Ext.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.log(s + "\n}"); |
} |
}, |
|
_timers : {}, |
|
time : function(name){ |
name = name || "def"; |
Ext._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._timers[name]); |
Ext._timers[name] = new Date().getTime(); |
if(printResults !== false){ |
Ext.log('Timer ' + (name == "def" ? v : name + ": " + v)); |
} |
return v; |
} |
}); |
|
})(); |
|
|
Ext.debug.ScriptsPanel = Ext.extend(Ext.Panel, { |
id:'x-debug-scripts', |
region: 'east', |
minWidth: 200, |
split: true, |
width: 350, |
border: false, |
layout:'anchor', |
style:'border-width:0 0 0 1px;', |
|
initComponent : function(){ |
|
this.scriptField = new Ext.form.TextArea({ |
anchor: '100% -26', |
style:'border-width:0;' |
}); |
|
this.trapBox = new Ext.form.Checkbox({ |
id: 'console-trap', |
boxLabel: 'Trap Errors', |
checked: true |
}); |
|
this.toolbar = new Ext.Toolbar([{ |
text: 'Run', |
scope: this, |
handler: this.evalScript |
},{ |
text: 'Clear', |
scope: this, |
handler: this.clear |
}, |
'->', |
this.trapBox, |
' ', ' ' |
]); |
|
this.items = [this.toolbar, this.scriptField]; |
|
Ext.debug.ScriptsPanel.superclass.initComponent.call(this); |
}, |
|
evalScript : function(){ |
var s = this.scriptField.getValue(); |
if(this.trapBox.getValue()){ |
try{ |
var rt = eval(s); |
Ext.dump(rt === undefined? '(no return)' : rt); |
}catch(e){ |
Ext.log(e.message || e.descript); |
} |
}else{ |
var rt = eval(s); |
Ext.dump(rt === undefined? '(no return)' : rt); |
} |
}, |
|
clear : function(){ |
this.scriptField.setValue(''); |
this.scriptField.focus(); |
} |
|
}); |
|
Ext.debug.LogPanel = Ext.extend(Ext.Panel, { |
autoScroll: true, |
region: 'center', |
border: false, |
style:'border-width:0 1px 0 0', |
|
log : function(){ |
var markup = [ '<div style="padding:5px !important;border-bottom:1px solid #ccc;">', |
Ext.util.Format.htmlEncode(Array.prototype.join.call(arguments, ', ')).replace(/\n/g, '<br />').replace(/\s/g, ' '), |
'</div>'].join(''); |
|
this.body.insertHtml('beforeend', markup); |
this.body.scrollTo('top', 100000); |
}, |
|
clear : function(){ |
this.body.update(''); |
this.body.dom.scrollTop = 0; |
} |
}); |
|
Ext.debug.DomTree = Ext.extend(Ext.tree.TreePanel, { |
enableDD:false , |
lines:false, |
rootVisible:false, |
animate:false, |
hlColor:'ffff9c', |
autoScroll: true, |
region:'center', |
border:false, |
|
initComponent : function(){ |
|
|
Ext.debug.DomTree.superclass.initComponent.call(this); |
|
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){ |
return; |
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<len; i++){ |
var st = cl[i]; |
var v = s[st] || fly.getStyle(st); |
if(v != undefined && v !== null && v !== ''){ |
props[st] = v; |
} |
} |
} |
}else{ |
for(var a in dom){ |
var v = dom[a]; |
if((isNaN(a+10)) && v != undefined && v !== null && v !== '' && !(Ext.isGecko && a[0] == a[0].toUpperCase())){ |
props[a] = v; |
} |
} |
} |
}else{ |
if(inspecting){ |
return; |
} |
addStyle.disable(); |
reload.disabled(); |
} |
stylesGrid.setSource(props); |
stylesGrid.treeNode = n; |
stylesGrid.view.fitColumns(); |
} |
|
this.loader = new Ext.tree.TreeLoader(); |
this.loader.load = function(n, cb){ |
var isBody = n.htmlNode == document.body; |
var cn = n.htmlNode.childNodes; |
for(var i = 0, c; c = cn[i]; i++){ |
if(isBody && c.id == 'x-debug-browser'){ |
continue; |
} |
if(c.nodeType == 1){ |
n.appendChild(new Ext.debug.HtmlNode(c)); |
}else if(c.nodeType == 3 && !nonSpace.test(c.nodeValue)){ |
n.appendChild(new Ext.tree.TreeNode({ |
text:'<em>' + ellipsis(html(String(c.nodeValue)), 35) + '</em>', |
cls: 'x-tree-noicon' |
})); |
} |
} |
cb(); |
}; |
|
|
this.root = this.setRootNode(new Ext.tree.TreeNode('Ext')); |
|
hnode = this.root.appendChild(new Ext.debug.HtmlNode( |
document.getElementsByTagName('html')[0] |
)); |
|
} |
}); |
|
|
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 + '="<i>' + html(v) +'</i>"'; |
} |
} |
var style = n.style ? n.style.cssText : ''; |
if(style){ |
s += ' style="<i>' + html(style.toLowerCase()) +'</i>"'; |
} |
if(leaf && n.childNodes.length > 0){ |
s+='><em>' + ellipsis(html(String(n.innerHTML)), 35) + '</em></'+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; |
}(); |
|
|
|