00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 window.CPLogDisable = false;
00024
00025 var CPLogDefaultTitle = "Cappuccino";
00026
00027 var CPLogLevels = ["fatal", "error", "warn", "info", "debug", "trace"];
00028 var CPLogDefaultLevel = CPLogLevels[0];
00029
00030 var _CPLogLevelsInverted = {};
00031 for (var i = 0; i < CPLogLevels.length; i++)
00032 _CPLogLevelsInverted[CPLogLevels[i]] = i;
00033
00034 var _CPLogRegistrations = {};
00035
00036
00037
00038 var _CPFormatLogMessage = function(aString, aLevel, aTitle)
00039 {
00040 var now = new Date();
00041
00042 if (typeof sprintf == "function")
00043 return sprintf("%4d-%02d-%02d %02d:%02d:%02d.%03d %s [%s]: %s",
00044 now.getFullYear(), now.getMonth(), now.getDate(),
00045 now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds(),
00046 aTitle, aLevel, aString);
00047 else
00048 return now + " " + aTitle + " [" + aLevel + "]: " + aString;
00049 }
00050
00051
00052
00053
00054 function CPLogRegister(aProvider, aMaxLevel)
00055 {
00056 CPLogRegisterRange(aProvider, CPLogLevels[0], aMaxLevel || CPLogLevels[CPLogLevels.length-1]);
00057 }
00058
00059 function CPLogRegisterRange(aProvider, aMinLevel, aMaxLevel)
00060 {
00061 var min = _CPLogLevelsInverted[aMinLevel];
00062 var max = _CPLogLevelsInverted[aMaxLevel];
00063
00064 if (min != undefined && max != undefined)
00065 for (var i = 0; i <= max; i++)
00066 CPLogRegisterSingle(aProvider, CPLogLevels[i]);
00067 }
00068
00069 function CPLogRegisterSingle(aProvider, aLevel)
00070 {
00071 if (_CPLogRegistrations[aLevel] == undefined)
00072 _CPLogRegistrations[aLevel] = [aProvider];
00073 else
00074 _CPLogRegistrations[aLevel].push(aProvider);
00075 }
00076
00077
00078 function _CPLogDispatch(parameters, aLevel, aTitle)
00079 {
00080 if (aTitle == undefined)
00081 aTitle = CPLogDefaultTitle;
00082 if (aLevel == undefined)
00083 aLevel = CPLogDefaultLevel;
00084
00085
00086 var message = (typeof sprintf == "function") ? sprintf.apply(null, parameters) : Array.prototype.join.call(parameters, ", ");
00087
00088 if (_CPLogRegistrations[aLevel])
00089 for (var i = 0; i < _CPLogRegistrations[aLevel].length; i++)
00090 _CPLogRegistrations[aLevel][i](message, aLevel, aTitle);
00091 }
00092
00093
00094
00095 function CPLog() { _CPLogDispatch(arguments); }
00096
00097 for (var i = 0; i < CPLogLevels.length; i++)
00098 CPLog[CPLogLevels[i]] = (function(level) { return function() { _CPLogDispatch(arguments, level); }; })(CPLogLevels[i]);
00099
00100
00101
00102 ANSI_ESC = String.fromCharCode(0x1B);
00103 ANSI_CSI = ANSI_ESC + '[';
00104 ANSI_TEXT_PROP = 'm';
00105 ANSI_RESET = '0';
00106 ANSI_BOLD = '1';
00107 ANSI_FAINT = '2';
00108 ANSI_NORMAL = '22';
00109 ANSI_ITALIC = '3';
00110 ANSI_UNDER = '4';
00111 ANSI_UNDER_DBL = '21';
00112 ANSI_UNDER_OFF = '24';
00113 ANSI_BLINK = '5';
00114 ANSI_BLINK_FAST = '6';
00115 ANSI_BLINK_OFF = '25';
00116 ANSI_REVERSE = '7';
00117 ANSI_POSITIVE = '27';
00118 ANSI_CONCEAL = '8';
00119 ANSI_REVEAL = '28';
00120 ANSI_FG = '3';
00121 ANSI_BG = '4';
00122 ANSI_FG_INTENSE = '9';
00123 ANSI_BG_INTENSE = '10';
00124 ANSI_BLACK = '0';
00125 ANSI_RED = '1';
00126 ANSI_GREEN = '2';
00127 ANSI_YELLOW = '3';
00128 ANSI_BLUE = '4';
00129 ANSI_MAGENTA = '5';
00130 ANSI_CYAN = '6';
00131 ANSI_WHITE = '7';
00132
00133 var colorCodeMap = {
00134 "black" : ANSI_BLACK,
00135 "red" : ANSI_RED,
00136 "green" : ANSI_GREEN,
00137 "yellow" : ANSI_YELLOW,
00138 "blue" : ANSI_BLUE,
00139 "magenta" : ANSI_MAGENTA,
00140 "cyan" : ANSI_CYAN,
00141 "white" : ANSI_WHITE
00142 }
00143
00144 ANSIControlCode = function(code, parameters)
00145 {
00146 if (parameters == undefined)
00147 parameters = "";
00148 else if (typeof(parameters) == 'object' && (parameters instanceof Array))
00149 parameters = parameters.join(';');
00150 return ANSI_CSI + String(parameters) + String(code);
00151 }
00152
00153
00154
00155 ANSITextApplyProperties = function(string, properties)
00156 {
00157 return ANSIControlCode(ANSI_TEXT_PROP, properties) + String(string) + ANSIControlCode(ANSI_TEXT_PROP);
00158 }
00159
00160 ANSITextColorize = function(string, color)
00161 {
00162 if (colorCodeMap[color] == undefined)
00163 return string;
00164 return ANSITextApplyProperties(string, ANSI_FG + colorCodeMap[color]);
00165 }
00166
00167
00168 var levelColorMap = {
00169 "fatal": "red",
00170 "error": "red",
00171 "warn" : "yellow",
00172 "info" : "green",
00173 "debug": "cyan",
00174 "trace": "blue"
00175 }
00176
00177 function CPLogPrint(aString, aLevel, aTitle)
00178 {
00179 if (typeof print != "undefined")
00180 {
00181 if (aLevel == "fatal" || aLevel == "error" || aLevel == "warn")
00182 var message = ANSITextColorize(_CPFormatLogMessage(aString, aLevel, aTitle), levelColorMap[aLevel]);
00183 else
00184 var message = _CPFormatLogMessage(aString, ANSITextColorize(aLevel, levelColorMap[aLevel]), aTitle);
00185 print(message);
00186 }
00187 }
00188
00189
00190 function CPLogAlert(aString, aLevel, aTitle)
00191 {
00192 if (typeof alert != "undefined" && !window.CPLogDisable)
00193 {
00194 var message = _CPFormatLogMessage(aString, aLevel, aTitle);
00195 window.CPLogDisable = !confirm(message + "\n\n(Click cancel to stop log alerts)");
00196 }
00197 }
00198
00199
00200 function CPLogConsole(aString, aLevel, aTitle)
00201 {
00202 if (typeof console != "undefined")
00203 {
00204 var message = _CPFormatLogMessage(aString, aLevel, aTitle);
00205
00206 var logger = {
00207 "fatal": "error",
00208 "error": "error",
00209 "warn": "warn",
00210 "info": "info",
00211 "debug": "debug",
00212 "trace": "debug"
00213 }[aLevel];
00214
00215 if (logger && console[logger])
00216 console[logger](message);
00217 else if (console.log)
00218 console.log(message);
00219 }
00220 }
00221
00222
00223 var CPLogWindow = null;
00224 CPLogPopup = function(aString, aLevel, aTitle)
00225 {
00226 try {
00227 if (window.CPLogDisable || window.open == undefined)
00228 return;
00229
00230 if (!CPLogWindow || !CPLogWindow.document)
00231 {
00232 CPLogWindow = window.open("", "_blank", "width=600,height=400,status=no,resizable=yes,scrollbars=yes");
00233
00234 if (!CPLogWindow) {
00235 window.CPLogDisable = !confirm(aString + "\n\n(Disable pop-up blocking for CPLog window; Click cancel to stop log alerts)");
00236 return;
00237 }
00238
00239 _CPLogInitPopup(CPLogWindow);
00240 }
00241
00242 var logDiv = CPLogWindow.document.createElement("div");
00243 logDiv.setAttribute("class", aLevel || "fatal");
00244
00245 var message = _CPFormatLogMessage(aString, null, aTitle);
00246
00247 logDiv.appendChild(CPLogWindow.document.createTextNode(message));
00248 CPLogWindow.log.appendChild(logDiv);
00249
00250 if (CPLogWindow.focusEnabled.checked)
00251 CPLogWindow.focus();
00252 if (CPLogWindow.blockEnabled.checked)
00253 CPLogWindow.blockEnabled.checked = CPLogWindow.confirm(message+"\nContinue blocking?");
00254 if (CPLogWindow.scrollEnabled.checked)
00255 CPLogWindow.scrollToBottom();
00256 } catch(e) {
00257
00258 }
00259 }
00260
00261 var _CPLogInitPopup = function(logWindow)
00262 {
00263 var doc = logWindow.document;
00264
00265
00266 doc.writeln("<html><head><title></title></head><body></body></html>");
00267
00268 doc.title = CPLogDefaultTitle + " Run Log";
00269
00270 var head = doc.getElementsByTagName("head")[0];
00271 var body = doc.getElementsByTagName("body")[0];
00272
00273 var base = window.location.protocol + "//" + window.location.host + window.location.pathname;
00274 base = base.substring(0,base.lastIndexOf("/")+1);
00275
00276 var link = doc.createElement("link");
00277 link.setAttribute("type", "text/css");
00278 link.setAttribute("rel", "stylesheet");
00279 link.setAttribute("href", base+"Frameworks/Foundation/Resources/log.css");
00280 link.setAttribute("media", "screen");
00281 head.appendChild(link);
00282
00283 var div = doc.createElement("div");
00284 div.setAttribute("id", "header");
00285 body.appendChild(div);
00286
00287
00288 var ul = doc.createElement("ul");
00289 ul.setAttribute("id", "enablers");
00290 div.appendChild(ul);
00291
00292 for (var i = 0; i < CPLogLevels.length; i++) {
00293 var li = doc.createElement("li");
00294 li.setAttribute("id", "en"+CPLogLevels[i]);
00295 li.setAttribute("class", CPLogLevels[i]);
00296 li.setAttribute("onclick", "toggle(this);");
00297 li.setAttribute("enabled", "yes");
00298 li.appendChild(doc.createTextNode(CPLogLevels[i]));
00299 ul.appendChild(li);
00300 }
00301
00302
00303 var ul = doc.createElement("ul");
00304 ul.setAttribute("id", "options");
00305 div.appendChild(ul);
00306
00307 var options = {"focus":["Focus",false], "block":["Block",false], "wrap":["Wrap",false], "scroll":["Scroll",true], "close":["Close",true]};
00308 for (o in options) {
00309 var li = doc.createElement("li");
00310 ul.appendChild(li);
00311
00312 logWindow[o+"Enabled"] = doc.createElement("input");
00313 logWindow[o+"Enabled"].setAttribute("id", o);
00314 logWindow[o+"Enabled"].setAttribute("type", "checkbox");
00315 if (options[o][1])
00316 logWindow[o+"Enabled"].setAttribute("checked", "checked");
00317 li.appendChild(logWindow[o+"Enabled"]);
00318
00319 var label = doc.createElement("label");
00320 label.setAttribute("for", o);
00321 label.appendChild(doc.createTextNode(options[o][0]));
00322 li.appendChild(label);
00323 }
00324
00325
00326 logWindow.log = doc.createElement("div");
00327 logWindow.log.setAttribute("class", "enerror endebug enwarn eninfo enfatal entrace");
00328 body.appendChild(logWindow.log);
00329
00330 logWindow.toggle = function(elem) {
00331 var enabled = (elem.getAttribute("enabled") == "yes") ? "no" : "yes";
00332 elem.setAttribute("enabled", enabled);
00333
00334 if (enabled == "yes")
00335 logWindow.log.className += " " + elem.id
00336 else
00337 logWindow.log.className = logWindow.log.className.replace(new RegExp("[\\s]*"+elem.id, "g"), "");
00338 }
00339
00340
00341 logWindow.scrollToBottom = function() {
00342 logWindow.scrollTo(0, body.offsetHeight);
00343 }
00344
00345
00346 logWindow.wrapEnabled.addEventListener("click", function() {
00347 logWindow.log.setAttribute("wrap", logWindow.wrapEnabled.checked ? "yes" : "no");
00348 }, false);
00349
00350
00351 logWindow.addEventListener("keydown", function(e) {
00352 var e = e || logWindow.event;
00353 if (e.keyCode == 75 && (e.ctrlKey || e.metaKey)) {
00354 while (logWindow.log.firstChild) {
00355 logWindow.log.removeChild(logWindow.log.firstChild);
00356 }
00357 e.preventDefault();
00358 }
00359 }, "false");
00360
00361
00362 window.addEventListener("unload", function() {
00363 if (logWindow && logWindow.closeEnabled && logWindow.closeEnabled.checked) {
00364 window.CPLogDisable = true;
00365 logWindow.close();
00366 }
00367 }, false);
00368
00369
00370 logWindow.addEventListener("unload", function() {
00371 if (!window.CPLogDisable) {
00372 window.CPLogDisable = !confirm("Click cancel to stop logging");
00373 }
00374 }, false);
00375 }