events_array = new Array();

var events = function( OlOs ){
	this.OlOs = OlOs;
	this.array_id = events_array.length
	events_array[events_array.length] = this;

	/* tells browser where to continually run event functions threw */
		this.attach(
			target		= document,
			eventType	= "onkeydown",
			action		= 'events_array[' + this.array_id + '].parseUserEvent(event)'
		);
		this.attach(
			target		= document,
			eventType	= "onkeyup",
			action		= 'events_array[' + this.array_id + '].parseUserEvent(event)'
		);
		this.attach(
			target		= document,
			eventType	= "onkeypress",
			action		= 'events_array[' + this.array_id + '].parseUserEvent(event)'
		);
		this.attach(
			target		= document,
			eventType	= "onmousedown",
			action		= 'events_array[' + this.array_id + '].parseUserEvent(event)'
		);
		this.attach(
			target		= document,
			eventType	= "onmouseup",
			action		= 'events_array[' + this.array_id + '].parseUserEvent(event)'
		);

		this._last_event				= new Array();
		this._last_event.shift_used		= 0;
		this._last_event.keypress_code	= 0;
		this._last_event.keydown_code	= 0;
		this._last_event.keyup_code		= 0;
		this._last_event.keypress_key	= 0;
		this._last_event.keydown_key	= 0;
		this._last_event.keyup_key		= 0;
	/* end */

	
	return this;
}
/* */
	events.prototype.attach = function( target , eventType , action ){
	
		if( typeof(action) == typeof('') ){
			if( target.attachEvent ){
				eval('target.attachEvent( eventType , function(event){' + action + '} )');
			}else if( target.addEventListener ){
				eventType = eventType.replace(/^on/,'');
				eval('target.addEventListener( eventType , function(event){' + action + '} , false )');
			}
		}else{
			if( target.attachEvent ){
				target.attachEvent( eventType , action );
			}else if( target.addEventListener ){
				target.addEventListener( eventType.replace(/on/,'') , action , false );
			}
		}		
	}
/* */
	events.prototype.stopRequest = function( ){
		try{
			window.stop();
		}catch(e){
			document.execCommand('Stop');
		}
	
	}
/* */
	events.prototype.getEventTarget = function(event_var){
		if( typeof(event_var.srcElement) != 'undefined' ){
			return event_var.srcElement;
		}else if( typeof(event_var.target) != 'undefined' ){
			return event_var.target;
		}
		return false;
	}
/* */
	events.prototype.getKeyboardCode = function(event){
		var v_key;
		event=(event) ? event : ((event) ? event : null);
		if( event.keyCode ){
			v_key=event.keyCode;
		}else if(event.charCode){
			v_key=event.charCode;
		}
		return v_key
	}
/* */
	asobu_array	= new Array();
	events.prototype.attachSafeOnBeforeUnload = function( method ){

		if( typeof(window.isSafeOnBeforeUnload_On) == 'undefined' ){
			/* capture any existing events */
				if(
					window.onbeforeunload != null
				&&
					typeof(window.onbeforeunload) != 'undefined'
				){
					alert(window.onbeforeunload+' - '+typeof(window.onbeforeunload))
					asobu_array[asobu_array.length] = window.onbeforeunload;
				}
			/* end */

			window.onbeforeunload	= function(){
				var local = new Object
				for( local.x=0; local.x < asobu_array.length; ++local.x ){
					local.test	= asobu_array[local.x]();
					if(typeof(local.test) == typeof(" ")){
						return local.test;
					}
				}
			};
			window.isSafeOnBeforeUnload_On = true;
		}

		asobu_array[asobu_array.length] = method;
	}
/* */
	onSubmit_array	= new Array();
	events.prototype.appendOnSubmit = function( form , method ){
		return this.attachOnSubmit( form , method , true );
	}
/* */
	events.prototype.prependOnSubmit = function( form , method ){
		return this.attachOnSubmit( form , method , false );
	}
/* */
	events.prototype.attachOnSubmit = function( form , method , isAppend ){
		var local = new Object();
		
		if( isAppend == null )isAppend=true;

		/* first time use setup */
			if( form.getAttribute("onSubmit_id") == null ){
				
				local.submitArray_ID					= onSubmit_array.length;
				onSubmit_array[local.submitArray_ID]	= new Array();
				local.submit_sub_array					= onSubmit_array[local.submitArray_ID];

				form.setAttribute("onSubmit_id" , local.submitArray_ID);

				if( typeof( form.onsubmit ) != 'undefined' ){
					local.sub_submit_id						= local.submit_sub_array.length;
					local.name								= "onsubmit_" + local.sub_submit_id;
					
					local.submit_sub_array[local.sub_submit_id] = local.name;
					
					OlOs.node.setElementAttribute( form , local.name , form.onsubmit );
				}

				form.onsubmit = function(evt){
					evt=(evt||event);
					return OlOs.events.processOnSubmit_array( this , evt );
				}

			}else{
				local.submitArray_ID = form.getAttribute("onSubmit_id");
				local.submit_sub_array	= onSubmit_array[local.submitArray_ID];
			}
		/* end */

		/* add the requested method */
			local.sub_submit_id = local.submit_sub_array.length;
			local.submit_sub_array[local.sub_submit_id] = new Array();
			local.name		= "onsubmit_" + local.sub_submit_id;

			if( !isAppend ){
				/* push all the elements up a spot */
					for( local.x=local.submit_sub_array.length-1; local.x > 0 ; --local.x ){
						local.submit_sub_array[local.x] = local.submit_sub_array[local.x-1];
					}
					local.submit_sub_array[0]	= local.name;
				/* end */
			}else{
				local.submit_sub_array[local.sub_submit_id] = local.name;
			}
	
			OlOs.node.setElementAttribute( form , local.name , method );
		/* end */
		
		return ;
	}
/* */
	events.prototype.processOnSubmit_array = function(form,evt){
		var local = new Object();
		
		local.id = form.getAttribute("onSubmit_id");
		local.array_target	= onSubmit_array[local.id];
		local.array_count	= local.array_target.length;
		
		for( local.x=0; local.x < local.array_count; ++local.x ){
			local.test = form[local.array_target[local.x]](evt);

			if( local.test == false ){
				return false;
			}
		}

		return true;
	}

/* PAGE LISTENERS */
	events.prototype.parseUserEvent = function( evt ){ 
		var skey, scode;

		/* actual event processing logic */
			evt=(evt) ? evt : ((event) ? event : null);
			if( evt.charCode ){
				scode = evt.charCode;
			}else if(evt){
				scode = evt.keyCode;
			}
			if( evt.charCode ){
				skey=String.fromCharCode(evt.charCode);
			}else if(evt){
				skey=String.fromCharCode(evt.keyCode)
			}
		/* end */
		/* set global event variables */
			if( evt.type == 'keyup' ){
				this._last_event.keyup_code	= scode;
				this._last_event.keyup_key	= skey;
			}
	
			if( evt.type == 'keydown'){
				this._last_event.keydown_code	= scode;
				this._last_event.keydown_key	= skey;
			}
	
			if( evt.type == 'keypress'){
				this._last_event.keypress_code	= scode;
				this._last_event.keypress_key	= skey;
			}
	
			if( evt.shiftKey == 1 ){
				this._last_event.shift_used=1;
			}else{
				this._last_event.shift_used=0;
			}
		/* end */
	}
/* end */

if( OlOs == null ){
	document.write("<script type=\"text/javascript\" src=\"OlOs.js\"></script>");
}
OlOs.attachTo( new events( OlOs ) , "events" );