/********************************************************************************
 *	This file contains javascript for all global event handling
 *	Author: Nick Kolba and Brian Schwinn
 ********************************************************************************/

/*
 *	MxGlobal - global event handler, manages a collection of objects 
 *	providing a way of invoking global event handling methods (call backs) on them.
 *	Author: Nick Kolba and Brian Schwinn
 *
 *	NOTE:  SEE GLOBAL VARS AT END OF FILE - globalArray, ua, and request
 */
function MxGlobal() {
	this.init()
}
MxGlobal.prototype = new Object();

//MxGlobal method: init - initialize object
MxGlobal.prototype.init = function() {
	this.members = new Array();
	this.browser = new MxBrowser();
	this.id = "test";
}
// MxGlobal method: registerMember
// Registers object - adds ojbect which implement "IMxGlobal" to the collection.  - 
//		onGlobalRightClick( event );
//		onGlobalClick( event );
//		onGlobalMouseUp( event );
//		onGlobalMouseMove( event );
//		onGlobalMouseDown( event );
// NOTE: binding to onGlobalMouseMove must be initiated by caller via:
//		document.onmousemove = docOnMouseMove;  // see docOnMouseMove below
MxGlobal.prototype.registerMember = function( element ) {
	this.members[this.members.length] = element;
}
// MxGlobal method: getMember - gets member from the collection
MxGlobal.prototype.getMember = function( id ) {
	for ( var i = 0; i < this.members.length; i++ ) {	
		if (this.members[i].id) {
			if ( this.members[i].id  == id )
				return this.members[i];
		}
	}
	return null;
}
// MxGlobal method: getCurrentMember - returns the corresponding member object for the 
// dom element which initiated the event.  traverses the dom elements ancestor axis to  
// find a match between the dom element's and member object's ids.
MxGlobal.prototype.getCurrentMember = function(theEvent) {
	var domElem = this.browser.ie ? theEvent.srcElement : theEvent.target;
	// process dom element and his ancestors
	while( domElem != null ) {
		//check to see if source dom element has corresponding member in collection
		if ( domElem.id ) {
			var member = this.getMember( domElem.id );
			if ( member != null ) {
				return member;
			}
		}
		// if not here, check dom elements parent
		domElem = domElem.parentElement;
	}
	return null;
}	
// MxGlobal method: onClick - invokes "onGlobalClick" method on any registered objects
MxGlobal.prototype.onClick = function( theEvent ) {
	for (var i = 0; i < this.members.length; i++) {
		element = this.members[i];
		if (element.id && element.onGlobalClick)
			element.onGlobalClick( theEvent );
	}
}
// MxGlobal method: onRightClick - invokes "onGlobalRightClick" method on any registered objects
MxGlobal.prototype.onRightClick = function( theEvent ) {
	var current = this.getCurrentMember(theEvent);
	for (var i = 0; i < this.members.length; i++) {
		element = this.members[i];
		if (element.id && element.onGlobalRightClick)
				return element.onGlobalRightClick( theEvent ); 
	}
}
// MxGlobal method: onMouseMove - invokes "onGlobalMouseMove" method on any registered objects
MxGlobal.prototype.onMouseMove = function( theEvent ) {
	var current = this.getCurrentMember(theEvent);
	for (var i = 0; i < this.members.length; i++) {
		element = this.members[i];
		if (element.id && element.onGlobalMouseMove)
			return element.onGlobalMouseMove( theEvent ); 
	}
}
// MxGlobal method: onMouseUp - invokes "onGlobalMouseUp" method on any registered objects
MxGlobal.prototype.onMouseUp = function( theEvent ) {
	var current = this.getCurrentMember(theEvent);
	for (var i = 0; i < this.members.length; i++) {
		element = this.members[i];
		if (element.id && element.onGlobalMouseUp)
			return element.onGlobalMouseUp( theEvent ); 
	}
}
// MxGlobal method: onKeyDown - invokes "onGlobalMouseUp" method on any registered objects
MxGlobal.prototype.onKeyDown = function( theEvent ) {
	var current = this.getCurrentMember(theEvent);
	for (var i = 0; i < this.members.length; i++) {
		element = this.members[i];
		if (element.id && element.onGlobalKeyDown)
			return element.onGlobalKeyDown( theEvent ); 
	}
}


// Global Handler Fuctions: map events to MxGlobal handler functions 
//		(ultimately to methods on registered target objects)
function docOnRightClick( e ) {
	var theEvent = ua.ie ? event : e;
	if (globalArray) {
		if (globalArray.onRightClick)
			return globalArray.onRightClick(theEvent);
	}
}
function docOnClick( e ) {
	var theEvent = ua.ie ? event : e;
	if (globalArray) {
		if (globalArray.onClick)
			return globalArray.onClick(theEvent);
	}
}
function docOnMouseMove( e ) {
	var theEvent = ua.ie ? event : e;
	if (globalArray) {
		if (globalArray.onMouseMove)
			return globalArray.onMouseMove(theEvent);
	}
}
function docOnMouseUp( e ) {
	var theEvent = ua.ie ? event : e;
	if (globalArray) {
		if (globalArray.onMouseUp)
			return globalArray.onMouseUp(theEvent);
	}
}
function docOnKeyDown( e ) {
	var key_enter		= 13;
	var key_help		= 112;
	var key_refresh		= 116;

	var theEvent	= ua.ie ? event : e;
	var keyPressed	= getKeyCode(e);
	var srcElem		= ua.ie ? theEvent.srcElement : theEvent.target;

	switch ( keyPressed ) {
		case key_help :
			if ( globalHelp != null ) {
				globalHelp.getHelp( srcElem );
			}
			break;
		default :
			if (globalArray) {
				if (globalArray.onKeyDown)
					return globalArray.onKeyDown(theEvent);
			}
			break;
	}
}

// return the keyboard ascii code
function getKeyCode( e ) {
	var theEvent	= ua.ie ? event : e;
	return ua.ie ? theEvent.keyCode : theEvent.which;
}

// Global Event Handler Mappings
document.oncontextmenu = docOnRightClick;
document.onclick = docOnClick;
document.onmouseup = docOnMouseUp;
//document.onmousemove = docOnMouseMove;

// hook up to events - netscape needs wiring
if ( document.layers ) {
	document.captureEvents( Event.KEYPRESS )
}
document.onkeydown = docOnKeyDown;

/*****************************************************************************
 * Function:		MxQueryString
 * Description:		Object which parses the current QS
 ****************************************************************************/
function MxQueryString() {
	this.init();
}
MxQueryString.prototype = new Object();

// MxQueryString method: init - parses current document url into object
MxQueryString.prototype.init = function() {
	this.keys		= new Array();
	this.hash		= window.location.hash;
	this.host		= window.location.host;
	this.hostname	= window.location.hostname;
	this.href		= window.location.href;
	this.pathname	= window.location.pathname;
	this.port		= window.location.port;
	this.protocol	= window.location.protocol;
	this.QS			= window.location.search.substring(1);
	this.values		= new Array();
	var pairs = this.QS.split("&");
	for ( var i=0; i<pairs.length; i++ ) {
		var pos = pairs[i].indexOf('=');
		if (pos >= 0) {
			var argname = pairs[i].substring(0,pos);
			var value = pairs[i].substring(pos+1);
			this.keys[this.keys.length] = argname;
			this.values[this.values.length] = value;
		}
	}
	this.initialized = true;
}
// MxQueryString method: getValue - parses current document url into object
MxQueryString.prototype.getValue = function( key ) {
	var value = null; 
	for ( var i=0; i<this.keys.length; i++ ) {
		if (this.keys[i]==key) { 
			value = this.values[i]; 
			break; 
		} 
	} 
	return value; 
}		
// Global Variables:
var ua = new MxBrowser();
var globalArray = new MxGlobal();
var requestQS = new MxQueryString();
