Blame | Last modification | View Log | RSS feed
if(!dojo._hasResource["dojo._firebug.firebug"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["dojo._firebug.firebug"] = true;dojo.provide("dojo._firebug.firebug");dojo.deprecated = function(/*String*/ behaviour, /*String?*/ extra, /*String?*/ removal){// summary:// Log a debug message to indicate that a behavior has been// deprecated.// extra: Text to append to the message.// removal:// Text to indicate when in the future the behavior will be removed.var message = "DEPRECATED: " + behaviour;if(extra){ message += " " + extra; }if(removal){ message += " -- will be removed in version: " + removal; }console.debug(message);}dojo.experimental = function(/* String */ moduleName, /* String? */ extra){// summary: Marks code as experimental.// description:// This can be used to mark a function, file, or module as// experimental. Experimental code is not ready to be used, and the// APIs are subject to change without notice. Experimental code may be// completed deleted without going through the normal deprecation// process.// moduleName:// The name of a module, or the name of a module file or a specific// function// extra:// some additional message for the user// example:// | dojo.experimental("dojo.data.Result");// example:// | dojo.experimental("dojo.weather.toKelvin()", "PENDING approval from NOAA");var message = "EXPERIMENTAL: " + moduleName + " -- APIs subject to change without notice.";if(extra){ message += " " + extra; }console.debug(message);}// FIREBUG LITE// summary: Firebug Lite, the baby brother to Joe Hewitt's Firebug for Mozilla Firefox// description:// Opens a console for logging, debugging, and error messages.// Contains partial functionality to Firebug. See function list below.// NOTE:// Firebug is a Firefox extension created by Joe Hewitt (see license). You do not need Dojo to run Firebug.// Firebug Lite is included in Dojo by permission from Joe Hewitt// If you are new to Firebug, or used to the Dojo 0.4 dojo.debug, you can learn Firebug// functionality by reading the function comments below or visiting http://www.getfirebug.com/docs.html// NOTE:// To test Firebug Lite in Firefox, set console = null;//// example:// Supports inline objects in object inspector window (only simple trace of dom nodes, however)// | console.log("my object", {foo:"bar"})// example:// Option for console to open in popup window// | var djConfig = {isDebug: true, popup:true };// example:// Option for console height (ignored for popup)// | var djConfig = {isDebug: true, debugHeight:100 };if(((!("console" in window)) ||(!("firebug" in console)))&&((djConfig["noFirebugLite"] !== true))){(function(){// don't build a firebug frame in iframestry{if(window != window.parent){// but if we've got a parent logger, connect to itif(window.parent["console"]){window.console = window.parent.console;}return;}}catch(e){}window.console = {log: function(){// summary:// Sends arguments to console.logFormatted(arguments, "");},debug: function(){// summary:// Sends arguments to console. Missing finctionality to show script line of trace.logFormatted(arguments, "debug");},info: function(){// summary:// Sends arguments to console, highlighted with (I) icon.logFormatted(arguments, "info");},warn: function(){// summary:// Sends warning arguments to console, highlighted with (!) icon and blue style.logFormatted(arguments, "warning");},error: function(){// summary:// Sends error arguments (object) to console, highlighted with (X) icon and yellow style// NEW: error object now displays in object inspectorlogFormatted(arguments, "error");},assert: function(truth, message){// summary:// Tests for true. Throws exception if false.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){// summary:// Traces object. Only partially implemented.var html = [];var pairs = [];for(var name in object){try{pairs.push([name, object[name]]);}catch(e){/* squelch */}}pairs.sort(function(a, b){return a[0] < b[0] ? -1 : 1;});html.push('<table>');for(var i = 0; i < pairs.length; ++i){var name = pairs[i][0], value = pairs[i][1];html.push('<tr>','<td class="propertyNameCell"><span class="propertyName">',escapeHTML(name), '</span></td>', '<td><span class="propertyValue">');appendObject(value, html);html.push('</span></td></tr>');}html.push('</table>');logRow(html, "dir");},dirxml: function(node){// summary://var html = [];appendNode(node, html);logRow(html, "dirxml");},group: function(){// summary:// collects log messages into a group, starting with this call and ending with// groupEnd(). Missing collapse functionalitylogRow(arguments, "group", pushGroup);},groupEnd: function(){// summary:// Closes group. See abovelogRow(arguments, "", popGroup);},time: function(name){// summary:// Starts timers assigned to name given in argument. Timer stops and displays on timeEnd(title);// example:// | console.time("load");// | console.time("myFunction");// | console.timeEnd("load");// | console.timeEnd("myFunction");timeMap[name] = (new Date()).getTime();},timeEnd: function(name){// summary:// See above.if(name in timeMap){var delta = (new Date()).getTime() - timeMap[name];logFormatted([name+ ":", delta+"ms"]);delete timeMap[name];}},count: function(){// summary:// Not supportedthis.warn(["count() not supported."]);},trace: function(){// summary:// Not supportedthis.warn(["trace() not supported."]);},profile: function(){// summary:// Not supportedthis.warn(["profile() not supported."]);},profileEnd: function(){ },clear: function(){// summary:// Clears message console. Do not call this directlyconsoleBody.innerHTML = "";},open: function(){// summary:// Opens message console. Do not call this directlytoggleConsole(true);},close: function(){// summary:// Closes message console. Do not call this directlyif(frameVisible){toggleConsole();}},closeObjectInspector:function(){// summary:// Closes object inspector and opens message console. Do not call this directlyconsoleObjectInspector.innerHTML = "";consoleObjectInspector.style.display = "none";consoleBody.style.display = "block";}};// ***************************************************************************// using global objects so they can be accessed// most of the objects in this script are run anonomouslyvar _firebugDoc = document;var _firebugWin = window;var __consoleAnchorId__ = 0;var consoleFrame = null;var consoleBody = null;var commandLine = null;var frameVisible = false;var messageQueue = [];var groupStack = [];var timeMap = {};var clPrefix = ">>> ";// ***************************************************************************function toggleConsole(forceOpen){frameVisible = forceOpen || !frameVisible;if(consoleFrame){consoleFrame.style.display = frameVisible ? "block" : "none";}}function focusCommandLine(){toggleConsole(true);if(commandLine){commandLine.focus();}}openWin = function(){var win = window.open("","_firebug","status=0,menubar=0,resizable=1,width=640,height=480,scrollbars=1,addressbar=0");var newDoc=win.document;HTMLstring='<html><head><title>Firebug Lite</title></head>\n';HTMLstring+='<body bgColor="#CCCCCC">\n';//Testing access to dojo from the popup window/*HTMLstring+='<button onclick="(function(){ console.log(dojo.version.toString()); })()">Test Parent Dojo</button>\n';*/HTMLstring+='<div id="fb"></div>';HTMLstring+='</body></html>';newDoc.write(HTMLstring);newDoc.close();return win;}function createFrame(){if(consoleFrame){return;}if(djConfig.popup){_firebugWin = openWin();_firebugDoc = _firebugWin.document;djConfig.debugContainerId = 'fb';var containerHeight = "100%";// connecting popup_firebugWin.console = window.console;_firebugWin.dojo = window.dojo;}else{_firebugDoc = document;var containerHeight = (djConfig.debugHeight) ? djConfig.debugHeight + "px" :"300px";}var styleElement = _firebugDoc.createElement("link");styleElement.href = dojo.moduleUrl("dojo._firebug", "firebug.css");styleElement.rel = "stylesheet";styleElement.type = "text/css";var styleParent = _firebugDoc.getElementsByTagName("head");if(styleParent){styleParent = styleParent[0];}if(!styleParent){styleParent = _firebugDoc.getElementsByTagName("html")[0];}if(dojo.isIE){window.setTimeout(function(){ styleParent.appendChild(styleElement); }, 0);}else{styleParent.appendChild(styleElement);}if(typeof djConfig != "undefined" && djConfig["debugContainerId"]){consoleFrame = _firebugDoc.getElementById(djConfig.debugContainerId);}if(!consoleFrame){consoleFrame = _firebugDoc.createElement("div");_firebugDoc.body.appendChild(consoleFrame);}consoleFrame.className += " firebug";consoleFrame.style.height = containerHeight;consoleFrame.style.display = (frameVisible ? "block" : "none");var closeStr = (djConfig.popup) ? "" : ' <a href="#" onclick="console.close(); return false;">Close</a>';consoleFrame.innerHTML ='<div id="firebugToolbar">'+ ' <a href="#" onclick="console.clear(); return false;">Clear</a>'+ ' <span class="firebugToolbarRight">'+ closeStr+ ' </span>'+ '</div>'+ '<input type="text" id="firebugCommandLine">'+ '<div id="firebugLog"></div>'+ '<div id="objectLog" style="display:none;"></div>';var toolbar = _firebugDoc.getElementById("firebugToolbar");toolbar.onmousedown = onSplitterMouseDown;commandLine = _firebugDoc.getElementById("firebugCommandLine");addEvent(commandLine, "keydown", onCommandLineKeyDown);addEvent(_firebugDoc, dojo.isIE || dojo.isSafari ? "keydown" : "keypress", onKeyDown);consoleBody = _firebugDoc.getElementById("firebugLog");consoleObjectInspector = _firebugDoc.getElementById("objectLog");layout();flush();}dojo.addOnLoad(createFrame);function evalCommandLine(){var text = commandLine.value;commandLine.value = "";logRow([clPrefix, text], "command");var value;try{value = eval(text);}catch(e){console.debug(e);/* squelch */}console.log(value);}function layout(){var toolbar = consoleBody.ownerDocument.getElementById("firebugToolbar");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]);}}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;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);}}var ids = [];var obs = [];for(var i = objIndex+1; i < objects.length; ++i){appendText(" ", html);var object = objects[i];if(!object){ continue; }if(typeof(object) == "string"){appendText(object, html);}else if(object.nodeType == 1){// simple tracing of dom nodesappendText("< "+object.tagName+" id=\""+ object.id+"\" />", html);}else{// Create link for object inspector// need to create an ID for this link, since it is currently textvar id = "_a" + __consoleAnchorId__++;ids.push(id);// need to save the object, so the arrays line upobs.push(object)var str = '<a id="'+id+'" href="javascript:void(0);">'+getObjectAbbr(object)+'</a>';appendLink( str , html);}}logRow(html, className);// Now that the row is inserted in the DOM, loop through all of the links that were just createdfor(var i=0; i<ids.length; i++){var btn = _firebugDoc.getElementById(ids[i]);if(!btn){ continue; }// store the object in the dom btn for reference later// avoid parsing these objects unless necessarybtn.obj = obs[i];dojo.connect(btn, "onclick", function(){// hide rowsconsoleBody.style.display = "none";consoleObjectInspector.style.display = "block";// create a back buttonvar bkBtn = '<a href="javascript:console.closeObjectInspector();"> << Back</a>';consoleObjectInspector.innerHTML = bkBtn + "<pre>" + printObject( this.obj ) + "</pre>";})}}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 "<";case ">":return ">";case "&":return "&";case "'":return "'";case '"':return """;}return "?";};return String(value).replace(/[<>&"']/g, replaceChars);}function objectToString(object){try{return object+"";}catch(e){return null;}}// ***************************************************************************function appendLink(object, html){// needed for object links - no HTML escapinghtml.push( objectToString(object) );}function appendText(object, html){html.push(escapeHTML(objectToString(object)));}function appendNull(object, html){html.push('<span class="objectBox-null">', escapeHTML(objectToString(object)), '</span>');}function appendString(object, html){html.push('<span class="objectBox-string">"', escapeHTML(objectToString(object)),'"</span>');}function appendInteger(object, html){html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');}function appendFloat(object, html){html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');}function appendFunction(object, html){var reName = /function ?(.*?)\(/;var m = reName.exec(objectToString(object));var name = m ? m[1] : "function";html.push('<span class="objectBox-function">', escapeHTML(name), '()</span>');}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(e){/* squelch */}}function appendObjectFormatted(object, html){var text = objectToString(object);var reObject = /\[object (.*?)\]/;var m = reObject.exec(text);html.push('<span class="objectBox-object">', m ? m[1] : text, '</span>')}function appendSelector(object, html){html.push('<span class="objectBox-selector">');html.push('<span class="selectorTag">', escapeHTML(object.nodeName.toLowerCase()), '</span>');if(object.id){html.push('<span class="selectorId">#', escapeHTML(object.id), '</span>');}if(object.className){html.push('<span class="selectorClass">.', escapeHTML(object.className), '</span>');}html.push('</span>');}function appendNode(node, html){if(node.nodeType == 1){html.push('<div class="objectBox-element">','<<span class="nodeTag">', node.nodeName.toLowerCase(), '</span>');for(var i = 0; i < node.attributes.length; ++i){var attr = node.attributes[i];if(!attr.specified){ continue; }html.push(' <span class="nodeName">', attr.nodeName.toLowerCase(),'</span>="<span class="nodeValue">', escapeHTML(attr.nodeValue),'</span>"')}if(node.firstChild){html.push('></div><div class="nodeChildren">');for(var child = node.firstChild; child; child = child.nextSibling){appendNode(child, html);}html.push('</div><div class="objectBox-element"></<span class="nodeTag">',node.nodeName.toLowerCase(), '></span></div>');}else{html.push('/></div>');}}else if (node.nodeType == 3){html.push('<div class="nodeText">', escapeHTML(node.nodeValue),'</div>');}}// ***************************************************************************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('<span class="errorMessage">', msg, '</span>','<div class="objectBox-sourceLink">', fileName, ' (line ', lineNo, ')</div>');logRow(html, "error");};//After converting to div instead of iframe, now getting two keydowns right away in IE 6.//Make sure there is a little bit of delay.var onKeyDownTime = (new Date()).getTime();function onKeyDown(event){var timestamp = (new Date()).getTime();if(timestamp > onKeyDownTime + 200){var event = dojo.fixEvent(event);var keys = dojo.keys;var ekc = event.keyCode;onKeyDownTime = timestamp;if(ekc == keys.F12){toggleConsole();}else if((ekc == keys.NUMPAD_ENTER || ekc == 76) &&event.shiftKey &&(event.metaKey || event.ctrlKey)){focusCommandLine();}else{return;}cancelEvent(event);}}function onSplitterMouseDown(event){if(dojo.isSafari || dojo.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 = "";}}//***************************************************************************************************// Print Object HelpersgetAtts = function(o){//Get amount of items in an objectif(dojo.isArray(o)) {return "[array with " + o.length + " slots]";}else{var i = 0;for(var nm in o){i++;}return "{object with " + i + " items}";}}printObject = function(o, i, txt){// Recursively trace object, indenting to represent depth for display in object inspector// TODO: counter to prevent overly complex or looped objects (will probably help with dom nodes)var br = "\n"; // using a <pre>... otherwise we'd need a <br />var ind = " ";txt = (txt) ? txt : "";i = (i) ? i : ind;for(var nm in o){if(typeof(o[nm]) == "object"){txt += i+nm +" -> " + getAtts(o[nm]) + br;txt += printObject(o[nm], i+ind);}else{txt += i+nm +" : "+o[nm] + br;}}return txt;}getObjectAbbr = function(obj){// Gets an abbreviation of an object for display in log// X items in object, including id// X items in an array// TODO: Firebug Sr. actually goes by char countvar isError = (obj instanceof Error);var nm = obj.id || obj.name || obj.ObjectID || obj.widgetId;if(!isError && nm){ return "{"+nm+"}"; }var obCnt = 2;var arCnt = 4;var cnt = 0;if(isError){nm = "[ Error: "+(obj["message"]||obj["description"]||obj)+" ]";}else if(dojo.isArray(obj)){nm ="[";for(var i=0;i<obj.length;i++){nm+=obj[i]+","if(i>arCnt){nm+=" ... ("+obj.length+" items)";break;}}nm+="]";}else if((!dojo.isObject(obj))||dojo.isString(obj)){nm = obj+"";}else{nm = "{";for(var i in obj){cnt++if(cnt > obCnt) break;nm += i+"="+obj[i]+" ";}nm+="}"}return nm;}//*************************************************************************************window.onerror = onError;addEvent(document, dojo.isIE || dojo.isSafari ? "keydown" : "keypress", onKeyDown);if( (document.documentElement.getAttribute("debug") == "true")||(djConfig.isDebug)){toggleConsole(true);}})();}}