/*
* Ext JS Library 2.0 Copyright(c) 2006-2007, Ext JS, LLC. licensing@extjs.com
*
* http://extjs.com/license
*/
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' || o instanceof Date) {
Ext.log(o);
} else if (!o) {
Ext.log("null");
} else if (typeof o != "object") {
Ext.log('Unknown return type');
} else if (o instanceof Array) {
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] = allGetServerTime().getTime();
},
timeEnd : function(name, printResults) {
var t = allGetServerTime().getTime();
name = name || "def";
var v = String.format("{0} ms", t - Ext._timers[name]);
Ext._timers[name] = allGetServerTime().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 = [
'
',
Ext.util.Format.htmlEncode(Array.prototype.join.call(arguments,
', ')).replace(/\n/g, '
')
.replace(/\s/g, ' '), '
'].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);
// tree related stuff
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) { // in this dialog?
return false;
}
}
cn.select();
var a = cn.ui.anchor;
treeEl.dom.scrollTop = Math.max(0, a.offsetTop - 10);
// treeEl.dom.scrollLeft = Math.max(0 ,a.offsetLeft-10); no likey
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 : ''
+ ellipsis(html(String(c.nodeValue)),
35) + '',
cls : 'x-tree-noicon'
}));
}
}
cb();
};
// tree.getSelectionModel().on('selectionchange', onNodeSelect, null,
// {buffer:250});
this.root = this.setRootNode(new Ext.tree.TreeNode('Ext'));
hnode = this.root.appendChild(new Ext.debug.HtmlNode(document
.getElementsByTagName('html')[0]));
}
});
// highly unusual class declaration
Ext.debug.HtmlNode = function() {
var html = Ext.util.Format.htmlEncode;
var ellipsis = Ext.util.Format.ellipsis;
var nonSpace = /^\s*$/;
var attrs = [{
n : 'id',
v : 'id'
}, {
n : 'className',
v : 'class'
}, {
n : 'name',
v : 'name'
}, {
n : 'type',
v : 'type'
}, {
n : 'src',
v : 'src'
}, {
n : 'href',
v : 'href'
}];
function hasChild(n) {
for (var i = 0, c; c = n.childNodes[i]; i++) {
if (c.nodeType == 1) {
return true;
}
}
return false;
}
function renderNode(n, leaf) {
var tag = n.tagName.toLowerCase();
var s = '<' + tag;
for (var i = 0, len = attrs.length; i < len; i++) {
var a = attrs[i];
var v = n[a.n];
if (v && !nonSpace.test(v)) {
s += ' ' + a.v + '="' + html(v) + '"';
}
}
var style = n.style ? n.style.cssText : '';
if (style) {
s += ' style="' + html(style.toLowerCase()) + '"';
}
if (leaf && n.childNodes.length > 0) {
s += '>' + ellipsis(html(String(n.innerHTML)), 35)
+ '</' + tag + '>';
} else if (leaf) {
s += ' />';
} else {
s += '>';
}
return s;
}
var HtmlNode = function(n) {
var leaf = !hasChild(n);
this.htmlNode = n;
this.tagName = n.tagName.toLowerCase();
var attr = {
text : renderNode(n, leaf),
leaf : leaf,
cls : 'x-tree-noicon'
};
HtmlNode.superclass.constructor.call(this, attr);
this.attributes.htmlNode = n; // for searching
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() {
// Ext.fly(this.htmlNode).highlight();
},
highlight : function() {
// Ext.fly(this.ui.textNode).highlight();
},
frame : function() {
this.htmlNode.style.border = '1px solid #0000ff';
// this.highlightNode();
},
unframe : function() {
// Ext.fly(this.htmlNode).removeClass('x-debug-frame');
this.htmlNode.style.border = '';
}
});
return HtmlNode;
}();