/*
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';
		}
	}
};

