mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-11-04 00:02:37 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			339 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			339 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/*
 | 
						|
Licensed to the Apache Software Foundation (ASF) under one
 | 
						|
or more contributor license agreements.  See the NOTICE file
 | 
						|
distributed with this work for additional information
 | 
						|
regarding copyright ownership.  The ASF licenses this file
 | 
						|
to you 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.
 | 
						|
*/
 | 
						|
 | 
						|
// Version: 1.9.1.152
 | 
						|
 | 
						|
//
 | 
						|
// Javascript logger utility
 | 
						|
// Author
 | 
						|
//		Kelven Yang
 | 
						|
//		2/25/2010
 | 
						|
//
 | 
						|
 | 
						|
function Logger() {
 | 
						|
	this.bDockEnabled = true;
 | 
						|
	
 | 
						|
	this.logWin = null;
 | 
						|
	this.logger = null;
 | 
						|
	this.header = null;
 | 
						|
	
 | 
						|
	this.bEnabled = true;
 | 
						|
	this.level = 0;
 | 
						|
	
 | 
						|
	this.bMoving = false;
 | 
						|
	this.offsetStart = {left: 0, top: 0};
 | 
						|
	this.ptStart = {x: 0, y: 0};
 | 
						|
}
 | 
						|
 | 
						|
Logger.DEFAULT_WIN_HEIGHT = 500;
 | 
						|
Logger.LEVEL_TRACE = 0;
 | 
						|
Logger.LEVEL_DEBUG = 1;
 | 
						|
Logger.LEVEL_INFO = 2;
 | 
						|
Logger.LEVEL_WARN = 3;
 | 
						|
Logger.LEVEL_ERROR = 4;
 | 
						|
Logger.LEVEL_FATAL = 5;
 | 
						|
Logger.LEVEL_SYS = 100;
 | 
						|
 | 
						|
Logger.prototype = {
 | 
						|
	
 | 
						|
	open: function() {
 | 
						|
		if(this.logWin) {
 | 
						|
			this.logWin.show();
 | 
						|
			
 | 
						|
			this.log(Logger.LEVEL_SYS, "Logger is open in browser: " + this.objectToString($.browser));
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		
 | 
						|
		var logger = this;
 | 
						|
		var logWinMarkup = [ 
 | 
						|
				'<div class="logwin">',
 | 
						|
				'<div class="logwin_title">',
 | 
						|
					'<div class="logwin_title_actionbox">',
 | 
						|
		        		'<a class="logwin_playbutton" href="#" cmd="1"></a>', 
 | 
						|
		        		'<a class="logwin_stopbutton" href="#" cmd="2"></a>',
 | 
						|
		        		'<a class="logwin_clrbutton" href="#" cmd="3"></a>',
 | 
						|
		        		'<form action="#">',
 | 
						|
						'<select class="select" id="template_type">',
 | 
						|
		                  '<option value="0">TRACE</option>',
 | 
						|
		                  '<option value="1">DEBUG</option>',
 | 
						|
		                  '<option value="2">INFO</option>',
 | 
						|
		                  '<option value="3">WARN</option>',
 | 
						|
		                  '<option value="4">ERROR</option>',
 | 
						|
		                  '<option value="5">FATAL</option>',
 | 
						|
		         		'</select>',
 | 
						|
		         		'</form>',
 | 
						|
		            '</div>',
 | 
						|
		            '<div class="logwin_title_rgtactionbox">',
 | 
						|
			        	'<a class="logwin_minimizebutton" href="#" cmd="4"></a>',
 | 
						|
			            '<a class="logwin_shrinkbutton" href="#" cmd="5"></a>',
 | 
						|
		            '</div>',
 | 
						|
				'</div>',
 | 
						|
				'<div class="logwin_content"></div>',
 | 
						|
				'</div>'
 | 
						|
		    ].join('');
 | 
						|
		
 | 
						|
		this.logWin = $(logWinMarkup).appendTo(document.body);
 | 
						|
		this.header = $('.logwin_title:first', this.logWin);
 | 
						|
		this.logger = $('.logwin_content:first', this.logWin);
 | 
						|
 | 
						|
		$(".logwin_title", this.logWin).mousedown(function(e) {
 | 
						|
			if($(e.target).attr('cmd'))
 | 
						|
				return true;
 | 
						|
			
 | 
						|
			if(!logger.bMoving) {
 | 
						|
				logger.bMoving = true;
 | 
						|
				logger.offsetStart = logger.logWin.offset();
 | 
						|
				logger.ptStart = {x: e.pageX, y: e.pageY};
 | 
						|
				
 | 
						|
				$(document).bind("mousemove", function(e) {
 | 
						|
					if(logger.bMoving) {
 | 
						|
						logger.enableDocking(false);
 | 
						|
						
 | 
						|
						var logWinNewLeft = logger.offsetStart.left + e.pageX - logger.ptStart.x;
 | 
						|
						var logWinNewTop = logger.offsetStart.top + e.pageY - logger.ptStart.y;
 | 
						|
						
 | 
						|
						logger.logWin.css("left", logWinNewLeft + "px").css("top", logWinNewTop + "px");
 | 
						|
					}
 | 
						|
					return false; 
 | 
						|
				});
 | 
						|
 | 
						|
				$(document).bind("mouseup", function(e) {
 | 
						|
					if(logger.bMoving) {
 | 
						|
						logger.bMoving = false;
 | 
						|
						$(document).unbind("mousemove", arguments.callee.name);
 | 
						|
						$(document).unbind("mouseup", arguments.callee.name);
 | 
						|
						
 | 
						|
						return false;
 | 
						|
					}
 | 
						|
					return true;
 | 
						|
				});
 | 
						|
			}
 | 
						|
			
 | 
						|
			// prevent default handling
 | 
						|
			return false;
 | 
						|
		}).dblclick(function(e) {
 | 
						|
			logger.expand(!logger.isExpanded());
 | 
						|
		});
 | 
						|
		
 | 
						|
		this.logWin.click(function(e) {
 | 
						|
			if($(e.target).attr('cmd')) {
 | 
						|
				switch($(e.target).attr('cmd')) {
 | 
						|
				case '1' :
 | 
						|
					logger.enable(true);
 | 
						|
					break;
 | 
						|
					
 | 
						|
				case '2' :
 | 
						|
					logger.enable(false);
 | 
						|
					break;
 | 
						|
					
 | 
						|
				case '3' :
 | 
						|
					logger.clear();
 | 
						|
					break;
 | 
						|
					
 | 
						|
				case '4' :
 | 
						|
					logger.enableDocking(true);
 | 
						|
					logger.dockIn();
 | 
						|
					break;
 | 
						|
					
 | 
						|
				case '5' :
 | 
						|
					logger.expand(!logger.isExpanded());
 | 
						|
					break;
 | 
						|
					
 | 
						|
				default :
 | 
						|
					break;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		});
 | 
						|
		
 | 
						|
		$("#template_type", this.logWin).change(function(e) {
 | 
						|
			logger.setLevel(parseInt($(this).val()));
 | 
						|
		});
 | 
						|
		
 | 
						|
		this.logWin.css("left", (($(document.body).width() - this.logWin.width()) / 2) + "px");
 | 
						|
		this.dockIn();
 | 
						|
		
 | 
						|
		this.log(Logger.LEVEL_SYS, "Logger is open in browser: " + this.objectToString($.browser));
 | 
						|
	},
 | 
						|
	
 | 
						|
	close: function() {
 | 
						|
		if(this.logWin)
 | 
						|
			this.logWin.hide();
 | 
						|
	},
 | 
						|
	
 | 
						|
	isOpen: function() {
 | 
						|
		if(this.logWin)
 | 
						|
			return this.logWin.is(":visible");
 | 
						|
		return false;
 | 
						|
	},
 | 
						|
	
 | 
						|
	dockIn: function() {
 | 
						|
		var logger = this;
 | 
						|
		var offset = this.logWin.offset();
 | 
						|
		var bottom = offset.top + this.logWin.height();
 | 
						|
		var delta = bottom - 2;
 | 
						|
		
 | 
						|
		this.logWin.animate({top: (offset.top - delta) + "px"}, 200, 
 | 
						|
			function() {
 | 
						|
				logger.logWin.unbind("mouseleave");
 | 
						|
				logger.logWin.bind("mouseenter", function(e) {
 | 
						|
					if(logger.bDockEnabled)
 | 
						|
						logger.dockOut();
 | 
						|
				});
 | 
						|
			} 
 | 
						|
		);
 | 
						|
	},
 | 
						|
	
 | 
						|
	dockOut: function() {
 | 
						|
		var logger = this;
 | 
						|
		this.logWin.animate({top: "0px"}, 200, 
 | 
						|
			function() {
 | 
						|
				logger.logWin.unbind("mouseenter");
 | 
						|
				logger.logWin.bind("mouseleave", function(e) {
 | 
						|
					if(logger.bDockEnabled) {
 | 
						|
						var xPosInLogWin = e.pageX - logger.logWin.offset().left;
 | 
						|
						var yPosInLogWin = e.pageY - logger.logWin.offset().top;
 | 
						|
						
 | 
						|
						if(xPosInLogWin < 0 || yPosInLogWin < 0 || 
 | 
						|
							xPosInLogWin > logger.logWin.width() || yPosInLogWin > logger.logWin.height()) {
 | 
						|
							logger.dockIn();
 | 
						|
						}
 | 
						|
					}
 | 
						|
				});
 | 
						|
			}
 | 
						|
		);
 | 
						|
	},
 | 
						|
	
 | 
						|
	enableDocking: function(bEnable) {
 | 
						|
		this.bDockEnabled = bEnable;
 | 
						|
	},
 | 
						|
	
 | 
						|
	log: function(level, message) {
 | 
						|
		// Note : LEVEL_SYS message will always be logged
 | 
						|
		if(this.logger && (level == Logger.LEVEL_SYS || this.bEnabled && level >= this.level)) {
 | 
						|
			var curTime = new Date();
 | 
						|
			var curTimeString = [
 | 
						|
			    '', curTime.getMonth(),
 | 
						|
			    '/', curTime.getDate(),
 | 
						|
			    '/', curTime.getYear(),
 | 
						|
			    ' ',
 | 
						|
				curTime.getHours(),
 | 
						|
				':', curTime.getMinutes(),
 | 
						|
				":", curTime.getSeconds(),
 | 
						|
				".", curTime.getMilliseconds()].join('');
 | 
						|
			
 | 
						|
			this.logger.append(this.getLevelDisplayString(level) + " - " + curTimeString + " - " + message + '<br>');
 | 
						|
		}
 | 
						|
	},
 | 
						|
	
 | 
						|
	clear: function() {
 | 
						|
		if(this.logger) {
 | 
						|
			this.logger.empty();
 | 
						|
			this.log(Logger.LEVEL_SYS, "Logger is cleared");
 | 
						|
		}
 | 
						|
	},
 | 
						|
	
 | 
						|
	setLevel: function(level) {
 | 
						|
		this.level = level;
 | 
						|
		
 | 
						|
		this.log(Logger.LEVEL_SYS, "Set logger trace level to " + this.getLevelDisplayString(level));
 | 
						|
	},
 | 
						|
	
 | 
						|
	enable: function(bEnabled) {
 | 
						|
		this.bEnabled = bEnabled;
 | 
						|
		
 | 
						|
		if(bEnabled)
 | 
						|
			this.log(Logger.LEVEL_SYS, "Logger is enabled");
 | 
						|
		else
 | 
						|
			this.log(Logger.LEVEL_SYS, "Logger is disabled");
 | 
						|
	},
 | 
						|
	
 | 
						|
	expand: function(bExpand) {
 | 
						|
		if(bExpand) {
 | 
						|
			this.logWin.height(Logger.DEFAULT_WIN_HEIGHT);
 | 
						|
			this.logger.height(Logger.DEFAULT_WIN_HEIGHT - this.header.height());
 | 
						|
		} else {
 | 
						|
			this.logWin.height(this.header.height());
 | 
						|
			this.logger.height(0);
 | 
						|
		}
 | 
						|
	},
 | 
						|
	
 | 
						|
	isExpanded: function() {
 | 
						|
		return this.logWin.height() > this.header.height();
 | 
						|
	},
 | 
						|
	
 | 
						|
	getLevelDisplayString: function(level) {
 | 
						|
		switch(level) {
 | 
						|
		case Logger.LEVEL_TRACE :
 | 
						|
			return "TRACE";
 | 
						|
			
 | 
						|
		case Logger.LEVEL_DEBUG :
 | 
						|
			return "DEBUG";
 | 
						|
			
 | 
						|
		case Logger.LEVEL_INFO :
 | 
						|
			return "INFO";
 | 
						|
			
 | 
						|
		case Logger.LEVEL_WARN :
 | 
						|
			return "WARN";
 | 
						|
			
 | 
						|
		case Logger.LEVEL_ERROR :
 | 
						|
			return "ERROR";
 | 
						|
			
 | 
						|
		case Logger.LEVEL_FATAL :
 | 
						|
			return "FATAL";
 | 
						|
			
 | 
						|
		case Logger.LEVEL_SYS :
 | 
						|
			return "SYSINFO";
 | 
						|
		}
 | 
						|
		
 | 
						|
		return "LEVEL " + level;
 | 
						|
	},
 | 
						|
	
 | 
						|
	// this is a util function which actually can be put elsewhere instead of in this class
 | 
						|
	objectToString : function(object) {
 | 
						|
		if(object) {
 | 
						|
			if(object instanceof Object) {
 | 
						|
				var sb = ['{' ];
 | 
						|
				
 | 
						|
				$.each(object, function(name, val) {
 | 
						|
					sb.push('' + name + ': ');
 | 
						|
					
 | 
						|
					if(val instanceof Object) {
 | 
						|
						sb.push(this.objectToString(val));
 | 
						|
					} else {
 | 
						|
						sb.push('' + val);
 | 
						|
					}
 | 
						|
					
 | 
						|
					sb.push(',');
 | 
						|
				});
 | 
						|
				
 | 
						|
				if(sb[sb.length - 1] == ',' )
 | 
						|
					sb.length = sb.length - 1;
 | 
						|
				
 | 
						|
				sb.push('}');
 | 
						|
				return sb.join("");
 | 
						|
			} else {
 | 
						|
				return '' + object;
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			return 'N/A';
 | 
						|
		}
 | 
						|
	}
 | 
						|
};
 | 
						|
 |