
// public Error handling functions {{{
function Error( msg )
{
	alert( msg );
}
// end error handling functions }}}

// public Debug functions{{{
function DebugWindowExists()
{
	var win = document.getElementById( 'core_debug_window' );
	return win != null;
}
function DestroyDebugWindow()
{
	var win = document.getElementById( 'core_debug_window' );
	if( win ){
		win.parentNode.removeChild( win );
	}
}
function CreateDebugWindow()
{
	// Remove existing window if present:
	DestroyDebugWindow();

	// Construct the debug 'window':
	win = document.createElement( 'div' );
	win.id = 'core_debug_window';
	win.className = 'core_debug_window';

	// Construct link to close debug 'window':
	var closeLink = document.createElement( 'a' );
	closeLink.innerHTML = '[close]';
	closeLink.href = 'javascript:DestroyDebugWindow();';
	win.appendChild( closeLink );

	// Construct linebreak:
	var br = document.createElement( 'br' );
	win.appendChild( br );

	// Construct output div as part of debug 'window':
	var output = document.createElement( 'div' );
	output.id = 'core_debug_window_output';
	win.appendChild( output );

	document.body.appendChild( win );
	return output;
}
function DebugAppend( text )
{
	if( ! DebugWindowExists() ){
		CreateDebugWindow();
	}
	var output = document.getElementById( 'core_debug_window_output' );
	if( output ){
		output.innerHTML += text;
	}
}
function DebugWrite( text )
{
	if( ! DebugWindowExists() ){
		CreateDebugWindow();
	}
	var output = document.getElementById( 'core_debug_window_output' );
	if( output ){
		output.innerHTML = text;
	}
}
function pa( object )
{
	var html = '<table>';
	for( var i in object ){
		html +=  '<tr><td valign="top">' + i + '</td>' +
			'<td valign="top"> : </td>' + 
			'<td valign="top">' + object[i] + '</td>' + 
			'<td valign="top">' + typeof object[i] + '</td>' +
			'</tr>';
	}
	html += '</table>';
	DebugWrite( html );
}
// end debug functions }}}

// public Element query/set functions {{{
function GetElementX( el )
{
	var currentLeft = 0;
	if( el.offsetParent ){
		while( el.offsetParent ){
			currentLeft += el.offsetLeft;
			el = el.offsetParent;
		}
	}
	else if( el.x ){
		currentLeft += el.x;
	}
	return currentLeft;
}
function GetElementY( el )
{
	var currentTop = 0;
	if( el.offsetParent ){
		while( el.offsetParent )
		{
			currentTop += el.offsetTop;
			el = el.offsetParent;
		}
	}
	else if( el.y ){
		currentTop += el.y;
	}
	return currentTop;
}
function SetElementX( el, left )
{
	el.style.left = left + 'px';
}
function SetElementY( el, top )
{
	el.style.top = top + 'px';
}
function SetElementPosition( el, left, top )
{
	el.style.left = left + 'px';
	el.style.top = top + 'px';
}
function GetElementWidth( el )
{
	if( el.offsetWidth ){
		return el.offsetWidth;
	}
	else {
		// alert( "offsetWidth not supported" );
	}
}
function GetElementHeight( el )
{
	if( el.offsetHeight ){
		return el.offsetHeight;
	}
	else {
		// alert( "offsetWidth not supported" );
	}
}
// }}}


// public Mouse object {{{
function Mouse()
{
	this.x = 0;
	this.y = 0;
	this.screenX = 0;
	this.screenY = 0;
	this.button1 = false;
}
Mouse.prototype.toString = function()
{
	return "x: " + this.x + "\n" +
		"y: " + this.y + "\n" +
		"screenX: " + this.screenX + "\n" +
		"screenY: " + this.screenY + "\n" +
		"button1: " + ((this.button1) ? 'down' : 'up');
}
// End of mouse object }}}

// public mouse
var mouse = new Mouse();

var MouseDownHandlers = new Array();
var MouseUpHandlers   = new Array();
var MouseMoveHandlers = new Array();
// public functions for registering for mouse events {{{
// The following 3 functions register a function by name for a specific mouse event.
// If the second argument is null, the function will be called as:
// function( mouseObject ){ .. }
// If the second argument is an object, the function will be called as:
// funciton( object, mouseObject ){ .. }
function RegisterMouseDownEvent( name, object, fun )
{
	if( typeof fun != 'function' ){
		Error( 'Invalid params: RegisterMouseDownEvent( string, function )' );
	}
	else {
		MouseDownHandlers[name] = new Array();
		MouseDownHandlers[name]['object'] = object;
		MouseDownHandlers[name]['function'] = fun;
	}
}
function RegisterMouseUpEvent( name, object, fun )
{
	if( typeof fun != 'function' ){
		Error( 'Invalid params: RegisterMouseDownEvent( string, function )' );
	}
	else {
		MouseUpHandlers[name] = fun;
		MouseUpHandlers[name] = new Array();
		MouseUpHandlers[name]['object'] = object;
		MouseUpHandlers[name]['function'] = fun;
	}
}
function RegisterMouseMoveEvent( name, object, fun )
{
	if( typeof fun != 'function' ){
		Error( 'Invalid params: RegisterMouseDownEvent( string, function )' );
	}
	else {
		MouseMoveHandlers[name] = fun;
		MouseMoveHandlers[name] = new Array();
		MouseMoveHandlers[name]['object'] = object;
		MouseMoveHandlers[name]['function'] = fun;
	}
}
// End event registering functions }}}

// private Mouse update functions {{{
function core_MouseDown( e )
{
	if( e ){
		mouse.x = e.pageX;
		mouse.y = e.pageY;
		mouse.screenX = e.clientX;
		mouse.screenY = e.clientY;
	}
	else if( event ){
		mouse.x = event.clientX + document.body.scrollLeft;
		mouse.y = event.clientY + document.body.scrollTop;
		mouse.screenX = event.clientX;
		mouse.screenY = event.clientY;
	}
	else {
		// Error, not supported?
	}
	mouse.button1 = true;

	for( var name in MouseDownHandlers ){
		if( MouseDownHandlers[name]['object'] != null ){
			var obj = MouseDownHandlers[name]['object'];
			MouseDownHandlers[name]['function']( obj, mouse );
		}
		else {
			MouseDownHandlers[name]['function']( mouse );
		}
	}
}

function core_MouseUp( e )
{
	if( e ){
		mouse.x = e.pageX;
		mouse.y = e.pageY;
		mouse.screenX = e.clientX;
		mouse.screenY = e.clientY;
	}
	else if( event ){
		mouse.x = event.clientX + document.body.scrollLeft;
		mouse.y = event.clientY + document.body.scrollTop;
		mouse.screenX = event.clientX;
		mouse.screenY = event.clientY;
	}
	else {
		// Error, not supported?
	}

	for( var name in MouseUpHandlers ){
		if( MouseUpHandlers[name]['object'] != null ){
			var obj = MouseUpHandlers[name]['object'];
			MouseUpHandlers[name]['function']( obj, mouse );
		}
		else {
			MouseUpHandlers[name]['function']( mouse );
		}
	}
}

function core_MouseMove( e )
{
	if( e ){
		mouse.x = e.pageX;
		mouse.y = e.pageY;
		mouse.screenX = e.clientX;
		mouse.screenY = e.clientY;
	}
	else if( event ){
		mouse.x = event.clientX + document.body.scrollLeft;
		mouse.y = event.clientY + document.body.scrollTop;
		mouse.screenX = event.clientX;
		mouse.screenY = event.clientY;
	}
	else {
		// Error, not supported?
	}
	mouse.button1 = false;

	for( var name in MouseMoveHandlers ){
		if( MouseMoveHandlers[name]['object'] != null ){
			var obj = MouseMoveHandlers[name]['object'];
			MouseMoveHandlers[name]['function']( obj, mouse );
		}
		else {
			MouseMoveHandlers[name]['function']( mouse );
		}
	}
}
//}}}

document.onmousedown = core_MouseDown;
document.onmouseup   = core_MouseUp;
document.onmousemove = core_MouseMove;







