User:Hippietrail/firebug.js

if (!("console" in window) || !("firebug" in console)) { (function {   window.console =     {        log: function        {            logFormatted(arguments, "");        },        debug: function        {            logFormatted(arguments, "debug");        },        info: function        {            logFormatted(arguments, "info");        },        warn: function        {            logFormatted(arguments, "warning");        },        error: function        {            logFormatted(arguments, "error");        },        assert: function(truth, message)        {            if (!truth)            {                var args = [];                for (var i = 1; i < arguments.length; ++i)                    args.push(arguments[i]);                logFormatted(args.length ? args : ["Assertion Failure"], "error");               throw message ? message : "Assertion Failure";            }        },        dir: function(object)        {            var html = [];            var pairs = [];            for (var name in object)            {                try                {                    pairs.push([name, object[name]]);                }                catch (exc)                {                }            }            pairs.sort(function(a, b) { return a[0] < b[0] ? -1 : 1; });           html.push(' ');            logRow(html, "dir");        },        dirxml: function(node)        {            var html = [];            appendNode(node, html);            logRow(html, "dirxml");        },        group: function        {            logRow(arguments, "group", pushGroup);        },        groupEnd: function        {            logRow(arguments, "", popGroup);        },        time: function(name)        {            timeMap[name] = (new Date).getTime;        },        timeEnd: function(name)        {            if (name in timeMap)            {                var delta = (new Date).getTime - timeMap[name];                logFormatted([name+ ":", delta+"ms"]);                delete timeMap[name];            }        },        count: function        {            this.warn(["count not supported."]);        },        trace: function        { this.warn(["trace not supported."]); },       profile: function {           this.warn(["profile not supported."]); },       profileEnd: function {       },        clear: function {           consoleBody.innerHTML = ""; },

open: function {           toggleConsole(true); },       close: function {           if (frameVisible) toggleConsole; }   };    // ********************************************************************************************    var consoleFrame = null; var consoleBody = null; var commandLine = null; var frameVisible = false; var messageQueue = []; var groupStack = []; var timeMap = {}; var clPrefix = ">>> "; var isFirefox = navigator.userAgent.indexOf("Firefox") != -1; var isIE = navigator.userAgent.indexOf("MSIE") != -1; var isOpera = navigator.userAgent.indexOf("Opera") != -1; var isSafari = navigator.userAgent.indexOf("AppleWebKit") != -1;

// ********************************************************************************************

function toggleConsole(forceOpen) {       frameVisible = forceOpen || !frameVisible; if (consoleFrame) consoleFrame.style.visibility = frameVisible ? "visible" : "hidden"; else waitForBody; }

function focusCommandLine {       toggleConsole(true); if (commandLine) commandLine.focus; }

function waitForBody {       if (document.body) createFrame; else setTimeout(waitForBody, 200); }

function createFrame {       if (consoleFrame) return; window.onFirebugReady = function(doc) {           window.onFirebugReady = null;

var toolbar = doc.getElementById("toolbar"); toolbar.onmousedown = onSplitterMouseDown;

commandLine = doc.getElementById("commandLine"); addEvent(commandLine, "keydown", onCommandLineKeyDown);

addEvent(doc, isIE || isSafari ? "keydown" : "keypress", onKeyDown); consoleBody = doc.getElementById("log"); layout; flush; }

var baseURL = getFirebugURL;

consoleFrame = document.createElement("iframe"); consoleFrame.setAttribute("src", baseURL+"/firebug.html"); consoleFrame.setAttribute("frameBorder", "0"); consoleFrame.style.visibility = (frameVisible ? "visible" : "hidden"); consoleFrame.style.zIndex = "2147483647"; consoleFrame.style.position = "fixed"; consoleFrame.style.width = "100%"; consoleFrame.style.left = "0"; consoleFrame.style.bottom = "0"; consoleFrame.style.height = "200px"; document.body.appendChild(consoleFrame); }   function getFirebugURL {       var scripts = document.getElementsByTagName("script"); for (var i = 0; i < scripts.length; ++i) {           if (scripts[i].src.indexOf("firebug.js") != -1) {               var lastSlash = scripts[i].src.lastIndexOf("/"); return scripts[i].src.substr(0, lastSlash); }       }    }    function evalCommandLine {       var text = commandLine.value; commandLine.value = "";

logRow([clPrefix, text], "command"); var value; try {           value = eval(text); }       catch (exc) {       }

console.log(value); }   function layout {       var toolbar = consoleBody.ownerDocument.getElementById("toolbar"); var height = consoleFrame.offsetHeight - (toolbar.offsetHeight + commandLine.offsetHeight); consoleBody.style.top = toolbar.offsetHeight + "px"; consoleBody.style.height = height + "px"; commandLine.style.top = (consoleFrame.offsetHeight - commandLine.offsetHeight) + "px"; }   function logRow(message, className, handler) {       if (consoleBody) writeMessage(message, className, handler); else {           messageQueue.push([message, className, handler]); waitForBody; }   }    function flush {       var queue = messageQueue; messageQueue = []; for (var i = 0; i < queue.length; ++i) writeMessage(queue[i][0], queue[i][1], queue[i][2]); }

function writeMessage(message, className, handler) {       var isScrolledToBottom = consoleBody.scrollTop + consoleBody.offsetHeight >= consoleBody.scrollHeight;

if (!handler) handler = writeRow; handler(message, className); if (isScrolledToBottom) consoleBody.scrollTop = consoleBody.scrollHeight - consoleBody.offsetHeight; }   function appendRow(row) {       var container = groupStack.length ? groupStack[groupStack.length-1] : consoleBody; container.appendChild(row); }

function writeRow(message, className) {       var row = consoleBody.ownerDocument.createElement("div"); row.className = "logRow" + (className ? " logRow-"+className : ""); row.innerHTML = message.join(""); appendRow(row); }

function pushGroup(message, className) {       logFormatted(message, className);

var groupRow = consoleBody.ownerDocument.createElement("div"); groupRow.className = "logGroup"; var groupRowBox = consoleBody.ownerDocument.createElement("div"); groupRowBox.className = "logGroupBox"; groupRow.appendChild(groupRowBox); appendRow(groupRowBox); groupStack.push(groupRowBox); }

function popGroup {       groupStack.pop; }   // ********************************************************************************************

function logFormatted(objects, className) {       var html = [];

var format = objects[0]; var objIndex = 0;

if (typeof(format) != "string") {           format = ""; objIndex = -1; }

var parts = parseFormat(format); for (var i = 0; i < parts.length; ++i) {           var part = parts[i]; if (part && typeof(part) == "object") {               var object = objects[++objIndex]; part.appender(object, html); }           else appendText(part, html); }

for (var i = objIndex+1; i < objects.length; ++i) {           appendText(" ", html); var object = objects[i]; if (typeof(object) == "string") appendText(object, html); else appendObject(object, html); }       logRow(html, className); }

function parseFormat(format) {       var parts = [];

var reg = /((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/; var appenderMap = {s: appendText, d: appendInteger, i: appendInteger, f: appendFloat};

for (var m = reg.exec(format); m; m = reg.exec(format)) {           var type = m[8] ? m[8] : m[5]; var appender = type in appenderMap ? appenderMap[type] : appendObject; var precision = m[3] ? parseInt(m[3]) : (m[4] == "." ? -1 : 0);

parts.push(format.substr(0, m[0][0] == "%" ? m.index : m.index+1)); parts.push({appender: appender, precision: precision});

format = format.substr(m.index+m[0].length); }

parts.push(format);

return parts; }

function escapeHTML(value) {       function replaceChars(ch) {           switch (ch) {               case "<": return "&lt;"; case ">": return "&gt;"; case "&": return "&amp;"; case "'": return "&#39;"; case '"':                   return "&quot;";            }            return "?";        };        return String(value).replace(/[<>&"']/g, replaceChars); }

function objectToString(object) {       try {           return object+""; }       catch (exc) {           return null; }   }

// ********************************************************************************************

function appendText(object, html) {       html.push(escapeHTML(objectToString(object))); }

function appendNull(object, html) {       html.push(' ', escapeHTML(objectToString(object)), ' '); }

function appendString(object, html) {       html.push(' &quot;', escapeHTML(objectToString(object)),            '&quot; '); }

function appendInteger(object, html) {       html.push(' ', escapeHTML(objectToString(object)), ' '); }

function appendFloat(object, html) {       html.push(' ', escapeHTML(objectToString(object)), ' '); }

function appendFunction(object, html) {       var reName = /function ?(.*?)\(/;        var m = reName.exec(objectToString(object));        var name = m ? m[1] : "function";        html.push(' ', escapeHTML(name), ' ');    }    function appendObject(object, html)    {        try        {            if (object == undefined)                appendNull("undefined", html);            else if (object == null)                appendNull("null", html);            else if (typeof object == "string")                appendString(object, html);            else if (typeof object == "number")                appendInteger(object, html);            else if (typeof object == "function")                appendFunction(object, html);            else if (object.nodeType == 1)                appendSelector(object, html);            else if (typeof object == "object")                appendObjectFormatted(object, html);            else                appendText(object, html); }       catch (exc) {       }    }    function appendObjectFormatted(object, html) {       var text = objectToString(object); var reObject = /\[object (.*?)\]/;

var m = reObject.exec(text); html.push(' ', m ? m[1] : text, ' ') }   function appendSelector(object, html) {       html.push(' ');

html.push(' ', escapeHTML(object.nodeName.toLowerCase), ' '); if (object.id) html.push(' #', escapeHTML(object.id), ' '); if (object.className) html.push(' .', escapeHTML(object.className), ' ');

html.push(' '); }

function appendNode(node, html) {       if (node.nodeType == 1) {           html.push(                ' ',                    '&lt; ', node.nodeName.toLowerCase, ' ');

for (var i = 0; i < node.attributes.length; ++i) {               var attr = node.attributes[i]; if (!attr.specified) continue; html.push(' ', attr.nodeName.toLowerCase,                   ' =&quot; ', escapeHTML(attr.nodeValue),                    ' &quot;') }

if (node.firstChild) {               html.push('&gt; ');

for (var child = node.firstChild; child; child = child.nextSibling) appendNode(child, html); html.push(' &lt;/ ',                    node.nodeName.toLowerCase, '&gt;  '); }           else html.push('/&gt; '); }       else if (node.nodeType == 3) {           html.push(' ', escapeHTML(node.nodeValue),                ' '); }   }

// ********************************************************************************************   function addEvent(object, name, handler) {       if (document.all) object.attachEvent("on"+name, handler); else object.addEventListener(name, handler, false); }   function removeEvent(object, name, handler) {       if (document.all) object.detachEvent("on"+name, handler); else object.removeEventListener(name, handler, false); }   function cancelEvent(event) {       if (document.all) event.cancelBubble = true; else event.stopPropagation; }

function onError(msg, href, lineNo) {       var html = []; var lastSlash = href.lastIndexOf("/"); var fileName = lastSlash == -1 ? href : href.substr(lastSlash+1); html.push(           ' ', msg, ' ',             ' ', fileName, ' (line ', lineNo, ') '        ); logRow(html, "error"); };

function onKeyDown(event) {       if (event.keyCode == 123) toggleConsole; else if ((event.keyCode == 108 || event.keyCode == 76) && event.shiftKey                && (event.metaKey || event.ctrlKey)) focusCommandLine; else return; cancelEvent(event); }

function onSplitterMouseDown(event) {       if (isSafari || isOpera) return; addEvent(document, "mousemove", onSplitterMouseMove); addEvent(document, "mouseup", onSplitterMouseUp);

for (var i = 0; i < frames.length; ++i) {           addEvent(frames[i].document, "mousemove", onSplitterMouseMove); addEvent(frames[i].document, "mouseup", onSplitterMouseUp); }   }    function onSplitterMouseMove(event) {       var win = document.all ? event.srcElement.ownerDocument.parentWindow : event.target.ownerDocument.defaultView;

var clientY = event.clientY; if (win != win.parent) clientY += win.frameElement ? win.frameElement.offsetTop : 0; var height = consoleFrame.offsetTop + consoleFrame.clientHeight; var y = height - clientY; consoleFrame.style.height = y + "px"; layout; }   function onSplitterMouseUp(event) {       removeEvent(document, "mousemove", onSplitterMouseMove); removeEvent(document, "mouseup", onSplitterMouseUp);

for (var i = 0; i < frames.length; ++i) {           removeEvent(frames[i].document, "mousemove", onSplitterMouseMove); removeEvent(frames[i].document, "mouseup", onSplitterMouseUp); }   }    function onCommandLineKeyDown(event) {       if (event.keyCode == 13) evalCommandLine; else if (event.keyCode == 27) commandLine.value = ""; }   window.onerror = onError; addEvent(document, isIE || isSafari ? "keydown" : "keypress", onKeyDown); if (document.documentElement.getAttribute("debug") == "true") toggleConsole(true); }); }