thirdparty/google_appengine/templates/logging_console.js
changeset 109 620f9b141567
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/thirdparty/google_appengine/templates/logging_console.js	Tue Aug 26 21:49:54 2008 +0000
@@ -0,0 +1,257 @@
+// Copyright 2007 Google Inc.
+// All Rights Reserved.
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Defines the code for the application logging console.
+ */
+
+/**
+ * The namespace we're using for all javascript classes and functions related
+ * to the logging console.
+ */
+var AH = {};
+
+
+/**
+ * A collection of utility functions for reading and writing cookies.
+ * @constructor
+ */
+AH.CookieUtil = function() {};
+
+
+/**
+ * Creates and adds a cookie with the specified expiration.
+ * @param {String} name  The name of the desired cookie.
+ * @param {String} value  The value of the desired cookie.
+ * @param {Number} opt_days  If non-negative, the expiration time in days of the
+ *     desired cookie. If not provided, the default value is 1.
+ */
+AH.CookieUtil.prototype.setCookie = function(name, value, opt_days) {
+  if (opt_days == null) {
+    opt_days = 1;
+  }
+
+  var expires = '';
+  if (opt_days < 0) {
+    var date = new Date;
+    date.setTime(date.getTime() + (opt_days * 24 * 60 * 60 * 1000));
+    expires = '; expires=' + date.toGMTString();
+  }
+  document.cookie = name + '=' + value + expires + '; path=/';
+};
+
+
+/**
+ * Returns the value of the requested cookie if it is available, and otherwise
+ * returns a default value.
+ * @param {String} name  The name of the requested cookie.
+ * @param {String} defaultValue  The value to return if the requested cookie
+ *     cannot be found.
+ * @return {String} The requested cookie's value, or the default value.
+ */
+AH.CookieUtil.prototype.getCookie = function(name, defaultValue) {
+  var nameEQ = name + '=';
+  var cookiePieces = document.cookie.split(';');
+  for (var i = 0; i < cookiePieces.length; i++) {
+    var c = cookiePieces[i];
+    c = c.replace(/^\s+/, '');
+    if (c.indexOf(nameEQ) == 0) {
+      return c.substring(nameEQ.length, c.length);
+    }
+  }
+  return defaultValue;
+};
+
+
+/**
+ * Deletes the specified cookie.
+ * @param {String} name  The name of the specified cookie.
+ */
+AH.CookieUtil.prototype.removeCookie = function(name) {
+  this.setCookie(name, '', -100);
+};
+
+
+/**
+ * The logging console is a div that displays log statements generated by the
+ * application during it's execution. It can be moved around, and the verbosity
+ * can be adjusted.
+ * @constructor
+ */
+AH.LoggingConsole = function() {
+  this.baseDiv = document.getElementById('_ah_base');
+  this.logSeverityLevels = ['debug', 'info', 'warning', 'error', 'critical'];
+  this.cookieUtil = new AH.CookieUtil;
+};
+
+
+/**
+ * Creates and positions the logging console based on preferences available from
+ * the cookies '_ah_severity' and '_ah_position'.
+ */
+AH.LoggingConsole.prototype.initConsole = function() {
+  // Define the font colors for the different log severity levels.
+  this.addCssRule('._ah_logline_debug_prefix', 'color:#110000');
+  this.addCssRule('._ah_logline_info_prefix', 'color:#440000');
+  this.addCssRule('._ah_logline_warning_prefix', 'color:#880000');
+  this.addCssRule('._ah_logline_error_prefix', 'color:#CC0000');
+  this.addCssRule('._ah_logline_critical_prefix', 'color:#FF0000');
+
+  // Change to the severity level stored in the cookie, defaulting to the lowest
+  // severity level.
+  this.changeLogSeverity(this.cookieUtil.getCookie('_ah_severity', 'debug'));
+
+  // Move the console to position stored in the cookie, defaulting to the
+  // bottom right position.
+  this.moveBaseDiv(this.cookieUtil.getCookie('_ah_position', 'down_right'));
+};
+
+
+/**
+ * Add CSS rules to the document to modify the presentation for elements of the
+ * specified class name. This works for IE and Firefox, but does not work for
+ * Safari.
+ * @param {String} selector  A selector for the style class rule to modify.
+ * @param {String} styleRules  The rules to add to the specified style class.
+ */
+AH.LoggingConsole.prototype.addCssRule = function(selector, styleRules) {
+  // If no sheet exists for the document, create one.
+  var sheet;
+  if (document.createStyleSheet) {
+    // For IE:
+    sheet = document.createStyleSheet();
+  } else {
+    // For Firefox:
+    var styleElement = document.createElement('style');
+    document.getElementsByTagName('head')[0].appendChild(styleElement);
+    sheet = (styleElement.styleSheet ?
+             styleElement.styleSheet :
+             styleElement.sheet);
+  }
+
+  // Add the new style rules to the style sheet.
+  if (sheet.addRule) {
+    // For IE:
+    sheet.addRule(selector, styleRules);
+  } else if (sheet.insertRule) {
+    // For Firefox:
+    sheet.insertRule(selector + ' { ' + styleRules + ' }',
+                     sheet.cssRules.length);
+  }
+};
+
+
+/**
+ * Change the log severity level, and persist the change to the '_ah_severity'
+ * cookie.
+ * @param {String} newSeverity  The desired log severity level.
+ */
+AH.LoggingConsole.prototype.changeLogSeverity = function(newSeverity) {
+  // First, find the numeric level for the provided severity.
+  var severityLevel = -1;
+  for (var i = 0; i < this.logSeverityLevels.length; i++) {
+    if (newSeverity == this.logSeverityLevels[i]) {
+      severityLevel = i;
+    }
+  }
+
+  // An unknown logging severity was provided, so ignore the call.
+  if (severityLevel == -1) {
+    return;
+  }
+
+  // Display log lines if they have severity greater than or equal to the
+  // desired severity.
+  for (var i = 0; i < this.logSeverityLevels.length; i++) {
+    var selector =
+        '._ah_logline_' + this.logSeverityLevels[i];
+    if (i < severityLevel) {
+      this.addCssRule(selector, 'display:none');
+    } else {
+      this.addCssRule(selector, 'display:block');
+    }
+  }
+
+  // Update the link text colors for the severity controls, and blur the links.
+  for (var i = 0; i < this.logSeverityLevels.length; i++) {
+    var linkToUpdate = document.getElementById(
+        '_ah_show_' + this.logSeverityLevels[i]);
+    if (i == severityLevel) {
+      linkToUpdate.style.color = 'red';
+    } else {
+      linkToUpdate.style.color = 'blue';
+    }
+    linkToUpdate.blur();
+  }
+
+  // Save the new severity level to a cookie.
+  this.cookieUtil.setCookie('_ah_severity', newSeverity);
+};
+
+
+/**
+ * Set the colors for the whole navigation table to white.
+ */
+AH.LoggingConsole.prototype.clearNavigationTable = function() {
+  document.getElementById('_ah_up_left').style.backgroundColor = 'white';
+  document.getElementById('_ah_up_right').style.backgroundColor = 'white';
+  document.getElementById('_ah_down_left').style.backgroundColor = 'white';
+  document.getElementById('_ah_down_right').style.backgroundColor = 'white';
+};
+
+
+/**
+ * Moves the logging console to the desired position.
+ * @param {String} newPosition  The desired position, which must be one of
+ *     'up_left', 'up_right', 'down_left', or 'down_right'.
+ */
+AH.LoggingConsole.prototype.moveBaseDiv = function(newPosition) {
+  // Move the logging console to the desired position on the page.
+  var newPositionPieces = newPosition.split('_');
+  var newVerticalPosition = newPositionPieces[0];
+  var newHorizontalPosition = newPositionPieces[1];
+  if (newVerticalPosition == 'up') {
+    this.baseDiv.style.top = '10px';
+    this.baseDiv.style.bottom = '';
+  } else {
+    this.baseDiv.style.top = '';
+    this.baseDiv.style.bottom = '10px';
+  }
+  if (newHorizontalPosition == 'left') {
+    this.baseDiv.style.left = '10px';
+    this.baseDiv.style.right = '';
+  } else {
+    this.baseDiv.style.left = '';
+    this.baseDiv.style.right = '10px';
+  }
+
+  // Update the navigation table cell colors to reflect the new position.
+  this.clearNavigationTable();
+  document.getElementById('_ah_' + newPosition).style.backgroundColor = 'red';
+
+  // Save the new position to a cookie.
+  this.cookieUtil.setCookie('_ah_position', newPosition);
+};
+
+
+/**
+ * Disable the logging console, and delete all cookies which were storing
+ * logging console preferences.
+ */
+AH.LoggingConsole.prototype.closeEverything = function() {
+  this.cookieUtil.removeCookie('_ah_severity');
+  this.cookieUtil.removeCookie('_ah_position');
+  this.baseDiv.style.display = 'none';
+};