1 //part of mootools.js - by Valerio Proietti (http://mad4milk.net). MIT-style license.
2 //Debug.js : nice crossbrowser javascript debugger - depends on ??
8 evt = evt || window.event;
9 if (evt.keyCode == 13) {
10 if (!this.value) return;
11 $debug.currentCommand = $debug.commands.length;
13 $debug.write(eval(this.value));
19 $debug.commands.push(this.value);
23 } else if (evt.keyCode == 38) {
25 } else if (evt.keyCode == 40) {
32 commandUp: function(){
33 if ($debug.commands[$debug.currentCommand]){
35 $debug.inputs.value = $debug.commands[$debug.currentCommand];
36 $debug.currentCommand = $debug.currentCommand-1;
40 commandDown: function(){
41 if ($debug.commands[$debug.currentCommand+1]){
43 $debug.inputs.value = $debug.commands[$debug.currentCommand+1];
44 $debug.currentCommand = $debug.currentCommand+1;
48 swapColors: function(){
49 if ($debug.currentColor == '#ddd') {
50 $debug.console.setStyle('background-color', '#ccc');
51 $debug.currentColor = '#ccc';
53 $debug.console.setStyle('background-color', '#ddd');
54 $debug.currentColor = '#ddd';
60 $debug.currentColor = '#ddd';
62 new Element('style').setProperties({
65 }).injectInside(document.getElementsByTagName('head')[0]).appendText($debug.css);
67 $debug.main = new Element('div').injectInside(document.body).addClass('moobug').setStyles({
68 'top': 100+Window.getScrollTop()+'px',
69 'left': Window.getWidth()/2-150+'px'
72 $debug.dragger = new Element('div').injectInside($debug.main).addClass('moobug_drag');
74 $debug.closer = new Element('div').injectInside($debug.dragger).addClass('moobug_close');
76 $debug.expander = new Element('div').injectInside($debug.dragger).addClass('moobug_expand');
78 $debug.dragger.appendText('moobugger');
80 var mainLeft = $debug.main.effect('left', {duration: 300, transition: Fx.backOut, wait: false});
81 var mainTop = $debug.main.effect('top', {duration: 300, transition: Fx.backOut, wait: false});
83 if (window.ActiveXObject) var position = 'absolute';
84 else var position = 'fixed';
86 $debug.main.setStyle('position', position);
88 $debug.dragfx = new Drag.Move($debug.main, {
89 handle: $debug.dragger,
90 onComplete: function(){
91 if (this.element.getTop() < 10) mainTop.custom(this.element.getTop(), 10);
92 if (this.element.getLeft() < 10) mainLeft.custom(this.element.getLeft(), 10);
96 $debug.mainOpacity = $debug.main.effect('opacity', {duration: 200, wait: false}).set(0);
98 $debug.bugsContainer = new Element('div').injectInside($debug.main).addClass('moobug_bugscontainer');
100 $debug.bugs = new Element('div').injectInside($debug.bugsContainer).addClass('moobug_bugs');
101 $debug.bugsHeight = $debug.bugs.effect('height', {duration: 1000, transition: Fx.quadIn});
102 $debug.effects = new Fx.Styles($debug.main, {duration: 1000, transition: Fx.quadIn});
104 var setBugsScrollTop = function(evt){
106 if (evt.wheelDelta) {
107 delta = evt.wheelDelta/120;
108 if (window.opera) delta = -delta;
109 } else if (evt.detail) {
110 delta = -evt.detail/3;
113 $debug.bugs.scrollTop -= delta*2;
116 if ($debug.bugs.addEventListener) $debug.bugs.addEventListener('DOMMouseScroll', setBugsScrollTop.bindAsEventListener($debug.bugs), false);
117 else $debug.bugs.onmousewheel = setBugsScrollTop.bindAsEventListener($debug.bugs);
119 $debug.scroller = new Fx.Scroll($debug.bugs, {duration: 200, wait: false});
121 $debug.console = new Element('div').addClass('moobug_console').injectInside($debug.main);
122 $debug.inputs = new Element('input').setProperties({
124 'autocomplete': 'off'
125 }).addClass('moobug_input').injectInside($debug.console);
127 $debug.inputs.onkeydown = $debug.submit;
129 if (Cookie.get('moobug_commands')) {
130 $debug.commands = Cookie.get('moobug_commands').split(':::::');
133 $debug.currentCommand = $debug.commands.length-1;
135 $debug.resizer = new Element('div').addClass('moobug_resize').injectInside($debug.main);
137 $debug.mainOpacity.goTo(1);
139 if (!window.ActiveXObject){
140 $debug.closer = $debug.closer.replaceWith(new Element('img').setProperty('src', 'data:image/png;base64,\
141 iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAABGdBTUEAANbY1E9YMgAAABl0RVh0\
142 U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABhSURBVHjadE/BEcAgCEM3gL10WLoXK1Dz\
143 wFJqveOMSS5EYuaxxnG7O8VkvgHQc6aZXSIyFtYgO4Rk0mqA3hB9EF7JSCKAkrgNse4vKVYTin86\
144 1HevxGG15t/tDsU4bwEGAL1IOEpjYO9qAAAAAElFTkSuQmCC').addClass('moobug_close').setStyle('background', 'none'));
146 $debug.expander = $debug.expander.replaceWith(new Element('img').setProperty('src', 'data:image/png;base64,\
147 iVBORw0KGgoAAAANSUhEUgAAAAsAAAAJCAYAAADkZNYtAAAABGdBTUEAANbY1E9YMgAAABl0RVh0\
148 U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABjSURBVHjalJABCsAgCEXNG+i98rDtXl7B\
149 6TDYCqR9kCzf70dgZjCLiLqXZW+xf88RUszcfRnw1cjzR1iAm6FF1AqqanPAFpNgceOWELAcwoIe\
150 eR0YJDjMN1YGyTnAn3++BRgAo4lMLEPm7s4AAAAASUVORK5CYII=').addClass('moobug_expand').setStyle('background', 'none'));
152 $debug.main.setStyle('font-size', '12px');
153 $debug.bugs.setStyle('font-size', '11px');
154 $debug.inputs.setStyle('font-size', '11px');
157 $debug.expanded = false;
159 $debug.closer.onclick = function(){
163 $debug.expander.onclick = function(){
165 if (!$debug.expanded){
166 $debug.expanded = true;
167 $debug.dragfx.pause();
168 $debug.dragger.setStyle('cursor', 'default');
170 $debug.bugsHeight.custom($debug.bugs.offsetHeight, 100).chain(function(){
171 $debug.scroller.custom($debug.bugs.scrollTop, $debug.bugs.scrollHeight+1);
172 $debug.main.setStyle('width', '100%');
174 $debug.effects.custom({
175 'top': [$debug.main.getTop(), Window.getHeight()-165],
176 'left': [$debug.main.getLeft(), 0],
177 'width': [$debug.main.offsetWidth, Window.getWidth()]
180 $debug.expanded = false;
181 $debug.dragfx.resume();
182 $debug.dragger.setStyle('cursor', 'move');
184 var h = $debug.bugs.scrollHeight;
187 if (h > 300) j = 300;
190 $debug.bugsHeight.custom(100, j);
192 $debug.effects.custom({
193 'top': [Window.getHeight()-165, 100],
194 'left': [0, Window.getWidth()/2-150],
195 'width': [Window.getWidth(), 300]
197 $debug.bugs.scrollTop = $debug.bugs.scrollHeight;
198 $debug.bugs.setStyle('height', 'auto');
199 $debug.checkHeight();
204 window.addEvent('unload', function(){
205 Cookie.set('moobug_commands', $debug.commands.join(':::::'));
209 checkHeight: function(){
210 if ($debug.bugs.scrollHeight > 300) {
211 $debug.bugs.setStyle('height', '300px');
213 $debug.bugs.setStyle('height', 'auto');
218 $debug.main.onmouseover = null;
219 $debug.main.onmouseout = null;
220 $debug.mainOpacity.goTo(0).chain(function(){
221 $debug.main.remove();
226 test: function(fn, args, bind){
227 if (!$debug.main) $debug.create();
230 fn.apply(bind || fn, args);
232 $debug.write(catched);
235 if (!error) $debug.write('function ok');
239 write: function(message){
240 if (!$debug.main) $debug.create();
241 if (!$debug.expanded) $debug.checkHeight();
242 var container = new Element('div').injectInside($debug.bugs).setStyles({
246 var line = new Element('p').addClass('moobug_line').injectInside(container);
247 var deleter = new Element('div').addClass('moobug_del').injectInside(line);
249 if (!window.ActiveXObject) {
250 deleter = deleter.replaceWith(new Element('img').setProperty('src', 'data:image/png;base64,\
251 iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAABGdBTUEAANbY1E9YMgAAABl0RVh0\
252 U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABfSURBVHjajI7RDYAwCEQPVtI12mFxDXfC\
253 Qmut4IckhOvl9QC6obRWn6qYvfhkAk9VnHpgp9K03KZBL8PB8CaLjj9jMru0FT0hASY69J0kw/93\
254 EycgrxZejHlDAOslwAAzHzpAOYR3jQAAAABJRU5ErkJggg==').addClass('moobug_del').setStyle('background', 'none'));
257 line.appendText(message);
259 var containerEffects = container.effects({duration: 300, wait: false});
261 containerEffects.custom({'opacity': [0,1], 'height': [0, container.scrollHeight]});
263 $debug.scroller.custom($debug.bugs.scrollTop, $debug.bugs.scrollHeight+1);
265 deleter.onclick = function(){
266 deleter.onclick = null;
267 containerEffects.custom({'opacity': [1,0], 'height': [container.scrollHeight, 0]}).chain(function(){
269 $debug.scroller.custom($debug.bugs.scrollTop, $debug.bugs.scrollHeight+1);
274 parseFunction: function(fn){
275 var txt = fn.toString().match(/^function[\s]*\((.*)\)[\s]*$/);
282 font: 10px "Monaco", "Andale Mono", "Courier New";\
286 margin: 3px 4px 0 2px;\
294 margin: 3px 10px 0 2px;\
302 margin: 1px 10px 2px 2px;\
306 background: #ff3300;\
312 border-bottom: 1px solid #333;\
319 .moobug_bugscontainer {\
320 padding: 5px 5px 10px;\
334 font: 10px "Monaco", "Andale Mono", "Courier New";\
340 background: #ff3300;\
345 background: #ff3300;\