Use key_name instead of link_id
Some entities do not have a link_id, but all entities are guaranteed
to have a key_name (or an id).
// 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';
};