JSLog =
{
	logId: 0,
	logLevel: Fly.jsLogLevel || 0,
	debugEnabled: function() { return JSLog.logLevel > 2; },
	infoEnabled: function() { return JSLog.logLevel > 1; },
	warnEnabled: function() { return JSLog.logLevel > 0; },
	errorEnabled: function() { return JSLog.logLevel >= 0; },
	
	pageLoad: function()
	{
		JSLog.pageId = new Date().getTime();

		JSLog.log('page-load');

		Event.observe(window, "unload", JSLog.pageUnload);
	},

	pageUnload: function()
	{
		var unloaded = new Date().getTime();

		JSLog.log('page-unload', String(unloaded-JSLog.pageId) + " ms");
	},

	onclick: function(evt)
	{
		try
		{
			var evt = (evt) ? evt : ((event) ? event : null);

			var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);

			var msg = node.id + ':' + node.name;

			JSLog.log('click', msg);
		}
		catch (e)
		{
			JSLog.error(e);
		}
	},

	onchange: function(evt)
	{
		try
		{
			var evt = (evt) ? evt : ((event) ? event : null);

			var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);

			var msg = node.id + ':' + node.name + ':' + $F(node);

			JSLog.log('change', msg);
		}
		catch (e)
		{
			JSLog.error(e);
		}
	},

	onfocus: function(evt)
	{
		try
		{
			var evt = (evt) ? evt : ((event) ? event : null);

			var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);

			var msg = node.id + ':' + node.name;

			JSLog.log('focus', msg);
		}
		catch (e)
		{
			JSLog.error(e);
		}
	},

	onblur: function(evt)
	{
		try
		{
			var evt = (evt) ? evt : ((event) ? event : null);

			var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);

			var msg = node.id + ':' + node.name;

			JSLog.log('blur', msg);
		}
		catch (e)
		{
			JSLog.error(e);
		}
	},

	keypress: function(evt)
	{
		var evt = (evt) ? evt : ((event) ? event : null);

		try
		{
			JSLog.keyCode = evt.charCode || evt.keyCode;
			JSLog.keyNode = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
		}
		catch (e)
		{
			try
			{
				delete JSLog.keyCode;
				delete JSLog.keyNode;
			}
			catch (ee) { }

			// JSLog.error(e);
		}
	},

	keyup: function(evt)
	{
		try
		{
			if (JSLog.keyNode)
			{

				var msg = JSLog.keyNode.id + ':' + JSLog.keyNode.name + ':' + JSLog.keyCode + ":" + $F(JSLog.keyNode);

				JSLog.log('key', msg);
			}
			else if (JSLog.keyCode)
			{
				JSLog.log('key', JSLog.keyCode);
			}
		}
		catch (e)
		{
			JSLog.error(e);
		}
	},

	watchFormElement: function(element)
	{
		//Event.observe(element, "focus", JSLog.onfocus);
		//Event.observe(element, "blur", JSLog.onblur);
		Event.observe(element, "change", JSLog.onchange);

		if (
			(element.type == 'submit') ||
			(element.type == 'button') ||
			(element.type == 'checkbox')
		)
		{
			Event.observe(element, "click", JSLog.onclick);
		}
	},

	watchForm: function(form)
	{
		try
		{
			if (!form) return;

			form = $(form);

			form.getElements().each(JSLog.watchFormElement);
			form.select('button').each(JSLog.watchFormElement);
		}
		catch (e)
		{
			JSLog.error(e);
		}
	},

	watchKeys: function()
	{
		var oldkeypress = document.onkeypress;

		document.onkeypress = function(evt)
		{
			JSLog.keypress(evt);

			if (oldkeypress) return oldkeypress.call(evt);
		};

		var oldkeyup = document.onkeyup;

		document.onkeyup = function(evt)
		{
			JSLog.keyup(evt);

			if (oldkeyup) return oldkeyup.call(evt);
		};
	},

	warn: function(logObj, url, line)
	{
		JSLog.log('warn', logObj, url, line);
	},

	error: function(error, url, line)
	{
		JSLog.log('error', error, url, line);
	},

	debug: function(logObj, url, line)
	{
		JSLog.log('debug', logObj, url, line);
	},

	log: function(type, logObj, url, line)
	{
        try
        {
            if (url && (url.endsWith("/xpopup.js")))
            {
                // ignore silently if firewall injected code is the source
                
                return;
            }
        }
        catch (e) { }

		type = type || 'info';

		if (
			((type == 'debug') && JSLog.debugEnabled()) ||
			((type == 'info') && JSLog.infoEnabled()) ||
			((type == 'warn') && JSLog.warnEnabled()) ||
			(type == 'error') && JSLog.errorEnabled())
		{
			var message = '';
	
			url = url || window.location.href;
			line = line || 0;

			if (logObj)
			{
				if (logObj.message)
				{
					message = logObj.name+': '+logObj.message;
				}
				else
				{
					message = logObj;
				}
			}
	
			// workaround FF bug 361271
			if (message == '$ is not defined') return true; 
			if (message == '$A is not defined') return true;
	
			var id = (JSLog.logId = (JSLog.logId + 1));
	
			try
			{
				if (typeof(Ajax)!='undefined' && Ajax.Request)
				{
					new Ajax.Request(
						"ajax/client-event",
						{
							method: 'post',
							parameters:
							{
								type: type,
								id: id,
								pageId: JSLog.pageId,
								msg: message,
								url: url,
								line: line
							}
						});
				}
				else
				{
					// keeping references necessary or else IE discards requrests
	
					window.logQueue = window.logQueue || {};
	
					var newLog = new Image();
			
					window.logQueue[id] = newLog;
	
					newLog.src =
						"ajax/client-event?" +
						"type=" + type + "&" +
						"id=" + id + "&" +
						"pageId=" + JSLog.pageId + "&" +
						"msg=" + encodeURIComponent(message) + "&" +
						"url=" + encodeURIComponent(url) + "&" +
						"line=" + encodeURIComponent(line);
				}
			}
			catch (e)
			{
				alert(e.message);
			}
		}
	}
};

JSLog.pageLoad();

window.onerror = JSLog.error;

//JSLog.watchKeys();

JSLog.debug('JSLog loaded.');
