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