// SpryDebug.js - version 0.8 - Spry Pre-Release 1.6 // // Copyright (c) 2007. Adobe Systems Incorporated. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Adobe Systems Incorporated nor the names of its // contributors may be used to endorse or promote products derived from this // software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. var Spry; if (!Spry) Spry = {}; Spry.BrowserSniff = function() { var b = navigator.appName.toString(); var up = navigator.platform.toString(); var ua = navigator.userAgent.toString(); this.mozilla = this.ie = this.opera = r = false; var re_opera = /Opera.([0-9\.]*)/i; var re_msie = /MSIE.([0-9\.]*)/i; var re_gecko = /gecko/i; var re_safari = /safari\/([\d\.]*)/i; if (ua.match(re_opera)) { r = ua.match(re_opera); this.opera = true; this.version = parseFloat(r[1]); } else if (ua.match(re_msie)) { r = ua.match(re_msie); this.ie = true; this.version = parseFloat(r[1]); } else if (ua.match(re_safari)) { this.safari = true; this.version = 1.4; } else if (ua.match(re_gecko)) { var re_gecko_version = /rv:\s*([0-9\.]+)/i; r = ua.match(re_gecko_version); this.mozilla = true; this.version = parseFloat(r[1]); } this.windows = this.mac = this.linux = false; this.Platform = ua.match(/windows/i) ? "windows" : (ua.match(/linux/i) ? "linux" : (ua.match(/mac/i) ? "mac" : ua.match(/unix/i)? "unix" : "unknown")); this[this.Platform] = true; this.v = this.version; if (this.safari && this.mac && this.mozilla) { this.mozilla = false; } }; Spry.is = new Spry.BrowserSniff(); Spry.Debugger = function(){ var self = this; this.onunloaddocument = function(){ var rmvListener = Spry.Debugger.Utils.removeEvListener; rmvListener(window, 'beforeunload', self.unloadfunc, false); rmvListener(window, 'load', self.loadfunc, false); rmvListener(self.jstext, 'keydown', self.dkfunc, false); rmvListener(self.jstext, 'keypress', self.dkfunc, false); rmvListener(self.closediv,'click', self.cdwfunc, false); rmvListener(self.cleardiv,'click', self.cldwfunc, false); rmvListener(self.maximdiv,'click', self.mdwfunc, false); rmvListener(self.headdiv, 'mousedown', self.mddwfunc, false); rmvListener(self.headdiv, 'mouseup', this.mudwfunc, false); rmvListener(document.body, 'mousemove', self.mmdwfunc, false); for (var k in self){ var t = typeof self[k]; if (t != "function"){ if (t == "object" && self[k].innerHTML) self[k].innerHTML = ''; self[k] = null; } } }; this.myerrorhandler = function( errType, errURL, errLineNum ) { try{ self.out('
' + self.explode(errType + " \n " + errURL + ' on line: ' + errLineNum, 0) + '
'); }catch(err){alert(err.message);} return false; }; if (window.XMLHttpRequest && window.XMLHttpRequest.prototype){ window.XMLHttpRequest.prototype.debugopen = window.XMLHttpRequest.prototype.open; window.XMLHttpRequest.prototype.open = function(method, url, asyncFlag, username, password){ var self = this; // Firefox if (this.addEventListener){ this.addEventListener("load", function(){Spry.Debugger.Utils.logXHRequest(self, method, url);}, false); // Opera }else if (window.opera){ var a = this.onreadystatechange; this.onreadystatechange = function(){if (typeof a == 'function')a(); Spry.Debugger.Utils.logXHRequest(self, method, url);}; } return this.debugopen(method, url, asyncFlag, username, password); }; } this.unloadfunc = function(e){self.onunloaddocument()}; this.loadfunc = function(e){self.init()}; Spry.Debugger.Utils.addEvListener(window, 'beforeunload', this.unloadfunc, false); Spry.Debugger.Utils.addEvListener(window, 'load', this.loadfunc, false); window.onerror = this.myerrorhandler; }; Spry.Debugger.prototype.init = function(){ var w = document.getElementById('debugdiv'); if (!w){ var debugwindow = document.createElement('div'); var headdiv = document.createElement('div'); var closediv = document.createElement('div'); var maximdiv = document.createElement('div'); var invdiv = document.createElement('div'); var textdiv = document.createElement('div'); var consolediv = document.createElement('div'); var cleardiv = document.createElement('div'); var iframe = document.createElement('iframe'); var scripts = document.getElementsByTagName('script'); var link = ''; for (var k=0; k< scripts.length; k++){ if (scripts[k].src != null && scripts[k].src != '' && scripts[k].src.match(/SpryDebug.js$/)){ link = scripts[k].src.replace(/SpryDebug.js/, '../css/SpryDebug.css'); break; } } if (link != ''){ var cssfile = document.createElement("link"); cssfile.setAttribute("rel", "stylesheet"); cssfile.setAttribute("type", "text/css"); cssfile.setAttribute("href", link); document.getElementsByTagName("head").item(0).appendChild(cssfile); } textdiv.id = 'textdiv'; textdiv.innerHTML = '
  1. Click the (left) button above.
  2. Click on the page element to introspect. The red outline shows the current selection.
'; headdiv.id = 'headdiv'; closediv.id = 'closediv'; closediv.innerHTML = 'x'; maximdiv.id = 'maximdiv'; maximdiv.innerHTML = '
'; cleardiv.id = 'cleardiv'; cleardiv.innerHTML = 'clear'; invdiv.id = 'invdiv'; invdiv.innerHTML = 'o'; debugwindow.id = 'debugdiv'; iframe.src = 'javascript:""'; iframe.frameBorder = '0'; iframe.scrolling = 'no'; iframe.id = 'debugIframe'; //scroll in the visible area on refresh setTimeout(function(){ try{ var top = 0; if (document.documentElement && document.documentElement.scrollTop) var top = parseInt(document.documentElement.scrollTop, 10); else if (document.body) var top = parseInt(document.body.scrollTop, 10); top = top + 10; if ( !isNaN(top) && top > 10) debugwindow.style.top = top+'px'; }catch(silent){alert(silent.message);} }, 500); consolediv.id = 'consolediv'; consolediv.innerHTML = '
'; document.body.appendChild(debugwindow); debugwindow.appendChild(headdiv); debugwindow.appendChild(textdiv); debugwindow.appendChild(consolediv); headdiv.appendChild(closediv); headdiv.appendChild(maximdiv); headdiv.appendChild(cleardiv); headdiv.appendChild(invdiv); debugwindow.parentNode.appendChild(iframe); this.jstext = document.getElementById('debugtext'); this.jstext.setAttribute('AutoComplete', 'off'); var self = this; this.dkfunc = function(e){return self.debuggerKey(e)}; this.cdwfunc = function(e){return self.closeDebugWindow(e)}; this.cldwfunc = function(e){return self.clearDebugWindow(e)}; this.mdwfunc = function(e){return self.maximDebugWindow(e)}; this.mddwfunc = function(e){return self.mousedownDebugWindow(e)}; this.mmdwfunc = function(e){return self.mousemoveDebugWindow(e)}; this.mudwfunc = function(e){return self.mouseupDebugWindow(e)}; this.imdfunc = function(e){return self.introspectPage(e)}; var addEv = Spry.Debugger.Utils.addEvListener; addEv(self.jstext, 'keydown', this.dkfunc, false); addEv(closediv,'click', this.cdwfunc, false); addEv(cleardiv,'click', this.cldwfunc, false); addEv(invdiv,'click', this.imdfunc, false); addEv(maximdiv,'click', this.mdwfunc, false); addEv(headdiv, 'mousedown', this.mddwfunc, false); addEv(document.body, 'mousemove', this.mmdwfunc, false); addEv(headdiv, 'mouseup', this.mudwfunc, false); this.debugdiv = debugwindow; this.jshints = document.getElementById('debuggersuggestions'); this.headdiv = headdiv; this.closediv = closediv; this.maximdiv = maximdiv; this.textdiv = textdiv; this.consolediv = consolediv; this.cleardiv = cleardiv; } // clear stack this.out(); setTimeout(function(){if (Spry.is.ie && Spry.is.version < 7) { iframe.style.height = debugwindow.offsetHeight + 'px'; iframe.style.width = debugwindow.offsetWidth + 'px'; }},0); }; Spry.Debugger.prototype.introspectPage = function(e){ if (this.introspRun && this.introspRun == true){ this.introspRun = false; self.stopHi(); }else{ this.introspRun = true; if (typeof this.hiElTop == 'undefined'){ var self = this; Spry.Debugger.Utils.addEvListener(document, 'mouseover', function(ev){ if (!self.introspRun) return; ev = ev || event; var el; if (Spry.is.mozilla) el = ev.target; else el = ev.srcElement; if (self.hiEl && el == self.hiEl) return true; if (!self.prevT || self.prevT != ev.target) { self.highlight(el, self.prevT); self.prevT = el; } Spry.Debugger.Utils.stopEvent(ev); return false; }, true); Spry.Debugger.Utils.addEvListener(document, 'mousedown', function(ev){ ev = ev || event; if (!self.introspRun) return; var el; if (Spry.is.mozilla) el = ev.target; else el = ev.srcElement; if (el != self.invdiv) self.log(el); self.stopHi(); self.introspRun = false; Spry.Debugger.Utils.stopEvent(ev); return false; }, true); } } }; Spry.Debugger.prototype.highlight = function(targ){ if (typeof this.introspRun == 'undefined' || !this.introspRun){ return; } if (!this.hiElTop){ this.hiElTop = document.createElement('div'); this.hiElTop.id = 'highlighterTop'; this.hiElRight = document.createElement('div'); this.hiElRight.id = 'highlighterRight'; this.hiElBottom = document.createElement('div'); this.hiElBottom.id = 'highlighterBottom'; this.hiElLeft = document.createElement('div'); this.hiElLeft.id = 'highlighterLeft'; document.body.appendChild(this.hiElTop); document.body.appendChild(this.hiElBottom); document.body.appendChild(this.hiElLeft); document.body.appendChild(this.hiElRight); } if (targ != this.hiElTop && targ != this.hiElLeft && targ != this.hiElBottom && targ != this.hiElRight){ try{ var tmp = Spry.Debugger.Utils.getBorderBox(targ); this.hiElBottom.style.width = this.hiElTop.style.width = tmp.width + 'px'; this.hiElRight.style.height = this.hiElLeft.style.height = tmp.height + 'px'; this.hiElRight.style.top = this.hiElLeft.style.top = this.hiElTop.style.top = tmp.y + 'px'; this.hiElBottom.style.left = this.hiElLeft.style.left = this.hiElTop.style.left = tmp.x + 'px'; this.hiElBottom.style.top = (tmp.y + tmp.height - 1) + 'px'; this.hiElRight.style.left = (tmp.x + tmp.width - 1) + 'px'; }catch(eroare){} } }; Spry.Debugger.prototype.stopHi = function(){ try{ this.hiElBottom.style.top = this.hiElLeft.style.top = this.hiElRight.style.top = this.hiElTop.style.top = this.hiElBottom.style.left = this.hiElLeft.style.left = this.hiElRight.style.left = this.hiElTop.style.left = this.hiElBottom.style.width = this.hiElLeft.style.width = this.hiElRight.style.width = this.hiElTop.style.width = this.hiElBottom.style.height = this.hiElLeft.style.height = this.hiElRight.style.height = this.hiElTop.style.height = "0px"; }catch(error){}; }; Spry.Debugger.prototype.debuggerKey = function(e){ e = e || event; if (e && e.keyCode){ switch (e.keyCode){ case 9: var l = []; var b = this.jstext.value.replace(/.*\(/,''); var a = b.replace(/\.?[^.]*$/,''); if (a == '') a = 'window'; a = 'var c = ' + a; try{eval(a)}catch(e){}; if (typeof c != 'undefined' && c){ inner = ''; debug.out(); for (var k in c){ if (k.toLowerCase().indexOf(b.toLowerCase().replace(/.*\./, '')) == 0){ if (k.toUpperCase() == k) continue; try{ if (k != 'domConfig' && typeof c[k] == 'function'){ k += '('; } }catch(e){this.myerrorhandler('debug.debuggerKey: '+ k +'()' + e.message, 'debug.js',152);} l[l.length] = k; } } for (var j = 0; j < l.length; j++) inner+='
' + l[j] + '
'; if (inner.length != 0){ this.jshints.innerHTML = inner; this.jshints.style.display = 'block'; } } this.jstext.focus(); Spry.Debugger.Utils.stopEvent(e); return false; break; case 40: case 38: if (this.jshints.style.display != 'block'){ Spry.Debugger.Utils.stopEvent(e); return false; } var ch = this.jshints.getElementsByTagName('div'); var prev = -1; if (ch && ch.length){ prev = ch.length; } var next = false; var found = false; for (var k = 0; k < ch.length; k++) { if (next) { ch[k].style.backgroundColor = '#CCCCCC'; this.debuggerScroll(ch[k]); break; } if (ch[k].style.backgroundColor.toUpperCase() == '#CCCCCC' || ch[k].style.backgroundColor == 'rgb(204, 204, 204)') { ch[k].style.backgroundColor = ''; found = true; if (e.keyCode == 40) { next = true; continue; } else { ch[prev].style.backgroundColor = '#CCCCCC'; this.debuggerScroll(ch[prev]); break; } } prev = k; } if (!found || (next && k == ch.length)) { ch[0].style.backgroundColor = '#CCCCCC'; this.debuggerScroll(ch[0]); } Spry.Debugger.Utils.stopEvent(e); return false; break; case 13: if (this.jshints.style.display != 'block') return true; var ch = this.jshints.getElementsByTagName('div'); for (var k=0; k < ch.length ;k++) if (ch[k].style.backgroundColor.toUpperCase() == '#CCCCCC' || ch[k].style.backgroundColor == 'rgb(204, 204, 204)'){ this.jstext.value = this.jstext.value.replace(/\.[^.]*$/, '.') + ch[k].innerHTML; this.jshints.style.display = 'none'; Spry.Debugger.Utils.stopEvent(e); return false; } Spry.Debugger.Utils.stopEvent(e); return false; break; default: this.jshints.style.display = 'none'; break; } } }; Spry.Debugger.prototype.debuggerScroll = function(el){ var a = this.jshints; var h = 100; if (el.offsetTop < a.scrollTop) a.scrollTop = el.offsetTop; else if (el.offsetTop + el.offsetHeight > a.scrollTop + h) { // the 5 pixels make the latest option more visible. a.scrollTop = el.offsetTop + el.offsetHeight - h + 5; if (a.scrollTop < 0) a.scrollTop = 0; } }; Spry.Debugger.prototype.jseval = function(){ if (!this.history) this.history = []; try{ var val = this.jstext.value; this.history[this.history.length] = val; val = 'var tmp = ' + val + '; if (tmp){ var asd = false; try{debug.log("
Command Execution Result:" + debug.explode(tmp, 0) + "
")}catch(asd){}}'; var bug = false; try{ eval(val); }catch(bug){alert(bug.message)} if (bug && bug.message){ eval(this.jstext.value); } }catch(e){this.myerrorhandler(e.message, ' debug.console ', 255);} this.jstext.value = ''; return false; }; Spry.Debugger.prototype.dumpObjectEl = function(e, k, depth){ if (k == 'domConfig') return; var ctrl=''; try{ var tipe = typeof e[k]; if (tipe == 'unknown') return '
'+k+'
value unknown
'; if (tipe != 'function'){ if (typeof k == 'number' || k.toUpperCase() != k){ ctrl += '
' + k + '
'; if (tipe == 'object' && e[k] != null && depth < 1) ctrl += ''; if (tipe == 'undefined'){ ctrl += 'undefined'; }else if (e[k] == null){ ctrl += 'null'; }else if (tipe == 'string'){ if (e[k] == ''){ ctrl += '""'; }else if (e[k].match(/^#[0-9a-z]{3,6}$/) || e[k].indexOf('rgb(') == 0){ var color = e[k]; if (e[k].indexOf('rgb(') == 0) color = '#' + parseInt(e[k].substr(e[k].indexOf('(')+1, e[k].indexOf(',') - e[k].indexOf('(')-1),10).toString(16) + "" + parseInt(e[k].substr(e[k].indexOf(',') +1 ,e[k].lastIndexOf(',') - e[k].indexOf(',')-1),10).toString(16) + "" + parseInt(e[k].substr(e[k].lastIndexOf(',')+1, e[k].indexOf(')') - e[k].lastIndexOf(',')-1),10).toString(16); ctrl += '' + e[k] + ''; }else{ ctrl += e[k].replace(//g, '>').replace(/\n/g, '
'); } }else{ try{ ctrl += e[k]; }catch(e){ctrl += '[object ?!]';} } if (tipe == 'object' && e[k] != null && depth < 1){ ctrl += '
'; try{ ctrl += this.explode(e[k], depth + 1); }catch(erp){}; } ctrl+= '
'; } } }catch(errr){}; return ctrl; }; Spry.Debugger.prototype.explode = function (e, depth){ try{ var ctrl = ''; var ctrl_al = ''; if (typeof depth == 'undefined') depth = 0; ctrl += '
'; switch (typeof e){ case 'object': if ( typeof e.length == 'undefined' || (e.length > 0 && typeof e.push == 'undefined')){ for (var k in e){ if (k != 'domConfig' && typeof e[k] != 'function'){ ctrl += this.dumpObjectEl(e, k, depth); try{ if (k == 'style' && depth == 0){ var css = ''; if (document.defaultView && document.defaultView.getComputedStyle) css = document.defaultView.getComputedStyle(e, null); else if (e.currentStyle) css = e.currentStyle; ctrl += '
[Computed Style]:
[STYLE]'; ctrl += this.explode(css, 1); ctrl += '
'; } }catch(arr){alert(arr.message);} }else{ ctrl_al += ', ' + k + '()'; } } if (ctrl_al.length > 0){ ctrl_al = ctrl_al.substring(2); ctrl += '
FUNCTIONS:
'; ctrl += '
' + ctrl_al + '
'; } }else{ if (e.length == 0){ ctrl += '
Empty Array
'; }else{ ctrl += '
Length
'+e.length+'
'; for (var k = 0; k < e.length; k++) ctrl += this.dumpObjectEl(e, k, depth); } } break; case 'string': var len = e.length; var content = e; if (e.indexOf('<')){ var content = e.replace(//ig, '>'); content = '
' + content + '
'; } ctrl += '
string(' + len + '):
' + content +'
'; break; case 'function': try{ var a = ''+e; ctrl += '
function()
 ' + a.replace(//g, '>') +'
'; }catch(e){this.log(e.message)}; break; case 'undefined': ctrl += '
undefined
'; break; case 'number': var type = parseInt(e, 10) == e ? 'Integer:' : (parseFloat(e) == e ? 'Float:' : 'Number:'); ctrl += '
'+type+'
' + e +'
'; break; case 'boolean': ctrl += '
Boolean:
' + e +'
'; } ctrl += '
'; return ctrl; }catch(e){this.out('Spry.Debugger.explode error: ' + e.message);} }; //public static methods Spry.Debugger.prototype.log = function (){ var t = arguments; var self = this; setTimeout(function(){ var ctrl = ''; if (t.length > 0) for (var j =0; j < t.length; j++) ctrl += self.explode(t[j], 0); self.out(ctrl); }, 10); }; Spry.Debugger.prototype.out = function(str, notype){ if (typeof buffer == 'undefined') buffer = ''; var t = this.textdiv; var self = this; if (t){ if (!t.innerHTML) t.innerHTML = ''; setTimeout(function(){ if (buffer.length > 0){ t.innerHTML += buffer; buffer = ''; } if (typeof str == 'string'){ var scrollSave = self.textdiv.scrollHeight; t.innerHTML += str + '
'; self.textdiv.scrollTop = scrollSave; } }, 0); }else{ setTimeout(function(){self.out();}, 400); if (typeof str == 'string') buffer += str+'
'; } }; Spry.Debugger.prototype.closeDebugWindow = function(e){ var dw = this.debugdiv; if (this.textdiv.style.display == 'none'){ this.textdiv.style.display = ''; dw.style.height = '500px'; }else{ this.textdiv.style.display = 'none'; dw.style.height = '14px'; } return true; }; Spry.Debugger.prototype.clearDebugWindow = function(e){ this.textdiv.innerHTML = ''; return true; }; Spry.Debugger.prototype.maximDebugWindow = function(){ var main = this.debugdiv; if (this.textdiv) this.textdiv.style.display = 'block'; if (!main.className) main.className = ''; if (main.className.indexOf('maximized') == -1){ this.left = main.style.left; main.className += 'maximized'; main.style.left = '0'; if (document.documentElement){ main.style.height = document.documentElement.clientHeight; main.style.width = document.documentElement.clientWidth; } }else{ main.className = main.className.replace(/maximized/i, ''); main.style.left = this.left; main.style.height = ''; main.style.width = ''; } var layer = document.getElementById('debugIframe'); if (layer){ layer.style.top = main.style.top; layer.style.left = main.style.left; layer.style.height = main.offsetHeight; layer.style.width = main.offsetWidth; } return true; }; Spry.Debugger.prototype.mousedownDebugWindow = function (e){ e = e || event; var mainarea = this.debugdiv; if (!this.startDrag){ this.startDrag = true; initialX = e.screenX; initialY = e.screenY; topX = mainarea.offsetLeft; topY = mainarea.offsetTop; } return false; }; Spry.Debugger.prototype.mouseupDebugWindow = function (e){ if (this.startDrag){ if (Spry.is.ie) this.debugdiv.style.filter = 'alpha(opacity=100)'; else this.debugdiv.style.opacity = 1; this.startDrag = false; } return false; }; Spry.Debugger.prototype.mousemoveDebugWindow = function (e){ e = e||event; if (this.startDrag){ if (Spry.is.ie) this.debugdiv.style.filter = 'alpha(opacity=60)'; else this.debugdiv.style.opacity = 0.6; var x = e.screenX - initialX; var y = e.screenY - initialY; this.debugdiv.style.left = (topX + x) + 'px'; this.debugdiv.style.top = (topY + y) + 'px'; var layer = document.getElementById('debugIframe'); if (layer){ layer.style.top = this.debugdiv.style.top; layer.style.left = this.debugdiv.style.left; } } return false; }; //////////////////////////////////////////////////////////////// // // Spry.Debugger.Utils // ///////////////////////////////////////////////////////////////// if (!Spry.Debugger.Utils) Spry.Debugger.Utils = {}; Spry.Debugger.Utils.camelize = function(stringToCamelize) { if (stringToCamelize.indexOf('-') == -1){ return stringToCamelize; } var oStringList = stringToCamelize.split('-'); var isFirstEntry = true; var camelizedString = ''; for(var i=0; i < oStringList.length; i++) { if(oStringList[i].length>0) { if(isFirstEntry) { camelizedString = oStringList[i]; isFirstEntry = false; } else { var s = oStringList[i]; camelizedString += s.charAt(0).toUpperCase() + s.substring(1); } } } return camelizedString; }; Spry.Debugger.Utils.getStyleProp = function(element, prop) { var value; try { if (element.style) value = element.style[Spry.Debugger.Utils.camelize(prop)]; if (!value) { if (document.defaultView && document.defaultView.getComputedStyle) { var css = document.defaultView.getComputedStyle(element, null); value = css ? css.getPropertyValue(prop) : null; } else if (element.currentStyle) { value = element.currentStyle[Spry.Debugger.Utils.camelize(prop)]; } } } catch (e) {} return value == 'auto' ? null : value; }; Spry.Debugger.Utils.getIntProp = function(element, prop){ var a = parseInt(Spry.Debugger.Utils.getStyleProp(element, prop),10); if (isNaN(a)) return 0; return a; }; Spry.Debugger.Utils.getBorderBox = function (el, doc) { doc = doc || document; if (typeof(el) == 'string') { el = doc.getElementById(el); } if (!el) { return false; } if (el.parentNode === null || Spry.Debugger.Utils.getStyleProp(el, 'display') == 'none') { //element must be visible to have a box return false; } var ret = {x:0, y:0, width:0, height:0}; var parent = null; var box; if (el.getBoundingClientRect) { // IE box = el.getBoundingClientRect(); var scrollTop = doc.documentElement.scrollTop || doc.body.scrollTop; var scrollLeft = doc.documentElement.scrollLeft || doc.body.scrollLeft; ret.x = box.left + scrollLeft; ret.y = box.top + scrollTop; ret.width = box.right - box.left; ret.height = box.bottom - box.top; } else if (doc.getBoxObjectFor) { // gecko box = doc.getBoxObjectFor(el); ret.x = box.x; ret.y = box.y; ret.width = box.width; ret.height = box.height; var btw = Spry.Debugger.Utils.getIntProp(el, "border-top-width"); var blw = Spry.Debugger.Utils.getIntProp(el, "border-left-width"); ret.x -= blw; ret.y -= btw; } else { // safari/opera ret.x = el.offsetLeft; ret.y = el.offsetTop; ret.width = el.offsetWidth; ret.height = el.offsetHeight; parent = el.offsetParent; if (parent != el) { while (parent) { ret.x += parent.offsetLeft; ret.y += parent.offsetTop; parent = parent.offsetParent; } } var blw = Spry.Debugger.Utils.getIntProp(el, "border-left-width"); var btw = Spry.Debugger.Utils.getIntProp(el, "border-top-width"); ret.x -= blw; ret.y -= btw; // opera & (safari absolute) incorrectly account for body offsetTop if (Spry.is.opera || Spry.is.safari && Spry.Debugger.Utils.getStyleProp(el, 'position') == 'absolute') ret.y -= doc.body.offsetTop; } if (el.parentNode) parent = el.parentNode; else parent = null; if (parent.nodeName){ var cas = parent.nodeName.toUpperCase(); while (parent && cas != 'BODY' && cas != 'HTML') { cas = parent.nodeName.toUpperCase(); ret.x -= parent.scrollLeft; ret.y -= parent.scrollTop; if (parent.parentNode) parent = parent.parentNode; else parent = null; } } // adjust the margin var gi = Spry.Debugger.Utils.getIntProp; var btw = gi(el, "margin-top"); var blw = gi(el, "margin-left"); var bbw = gi(el, "margin-bottom"); var brw = gi(el, "margin-right"); ret.x -= blw; ret.y -= btw; ret.height += btw + bbw; ret.width += blw + brw; return ret; }; Spry.Debugger.Utils.removeEvListener = function(el, eventType, handler, capture){ try{ if (el.removeEventListener) el.removeEventListener(eventType, handler, capture); else if (el.detachEvent) el.detachEvent("on" + eventType, handler, capture); }catch (e) {} }; Spry.Debugger.Utils.addEvListener = function(el, eventType, handler, capture){ try{ if (el.addEventListener) el.addEventListener(eventType, handler, capture); else if (el.attachEvent) el.attachEvent("on" + eventType, handler); }catch (e) {} }; Spry.Debugger.Utils.stopEvent = function(e){ try{ if (e){ if (e.stopPropagation) e.stopPropagation(); else e.cancelBubble = true; if (e.preventDefault) e.preventDefault(); else e.returnValue = false; } }catch (e){} }; Spry.Debugger.Utils.logXHRequest = function(req, m, url){ if (req.readyState == 4){ var uniqIdHeader = (new Date()).getTime() + '' + Math.random(); var uniqIdContent = (new Date()).getTime() + '' + Math.random(); var o = '
' + m + ' ' + url + ' Content | Headers'; o += '
' + req.responseText.replace(/
'; var k = req.getAllResponseHeaders(); o += '
' + k + '
'; debug.out(o); } }; Spry.Debugger.Utils.makeVisible = function(el, visible){ el = Spry.Debugger.Utils.getElement(el); if (typeof visible != 'undefined') { if (visible == 'block'){ el.style.display = 'block'; }else{ el.style.display = 'none'; } return; } if (el.parentNode) { var l = el.parentNode.getElementsByTagName('div'); var b = false; for (var i = 0; i < l.length; i++){ if (l[i].className.match(/hidedump/)){ b = l[i]; break; } } if (b){ var tmp = b.style.display || Spry.Debugger.Utils.getStyleProp(b, 'display'); if (tmp && tmp == 'block'){ b.style.display = 'none'; //b.innerHTML = b.innerHTML.replace(/&/g, '&').replace(//g, '>'); }else{ //b.innerHTML = b.innerHTML.replace(/>/g, '>').replace(/</g, '<').replace(/&/g, '&'); b.style.display = 'block'; } } } }; Spry.Debugger.Utils.getElement = function(el){ if (typeof el == 'string') return document.getElementById(el); return el; }; if (typeof debug == 'undefined' || typeof debug.toString == 'undefined'){ var debug = new Spry.Debugger(); if (typeof console == 'undefined'){ var console = debug; } };