/**********************************************************************************
 * 
 * LastChangedDate:		$Date: 2007-05-02 17:13:07 +0200 (Wed, 02 May 2007) $
 * LastChangedRevision	$Rev: 95 $
 * LastChangedBy:		$Author: $
 * HeadURL:				$URL: http://linux/cd/balance/trunk/httpdocs/js/nl/xd/util/event.js $
 * ID:					$Id: event.js 95 2007-05-02 15:13:07Z  $
 * 
/**********************************************************************************/

// Create namespace
if ( ! window.nl.xd.util ) {
	window.nl.xd.util = {} ;
} ;

// Event Class
nl.xd.util.Event = function() {
	var listeners = [] ;
	
	return {
		addListener: function( element , type , func ) {
			listeners[ listeners.length ] = [ element , type , func ] ;
			
			if ( element.addEventListener ) {
				element.addEventListener( type , func , false ) ;
			} else if ( element.attachEvent ) {
				element.attachEvent( 'on' + type , func ) ;
			} ;
		} ,
		removeListener: function( element , type , func ) {
			if ( element.removeEventListener ) {
				element.removeEventListener( type , func , false ) ;
			} else if ( element.detachEvent ) {
				element.detachEvent( 'on' + type , func ) ;
			} ;
			
			var index = -1 ;
			
			for ( var i = 0; i < listeners.length; i++ ) {
			 	var listener = listeners[ i ] ;
			 	
				if ( listener && listener[ 2 ] == func && listener[ 0 ] == element && listener[ 1 ] == type ) {
					index = i ;
				} ;
			} ;
			
			if ( index >= 0 ) {
				delete listeners[ index ];
			} ;
			
			return true;
		} ,
		unload: function() {
			if ( listeners && listeners.length > 0 ) {
				for ( var i = 0; i < listeners.length; ++i ) {
					this.removeListener( listeners[ i ][ 0 ] , listeners[ i ][ 1 ] , listeners[ i ][ 2 ] ) ;
				} ;
			} ;
		} ,
		get: function( event ) {
			var e ;
			
			if ( ! event ) {
				e = window.event ;
			} else {
				e = event ;
			} ;
			return e ;
		} ,
		target: function( event ) {
			var target = null ;
			var e      = this.get( event ) ;
			
			if ( e.target  ) {
				target = e.target ;
			} else {
				target = e.srcElement ;
			} ;
			
			target = this.checkTarget( target ) ;
			
			return target ;
		} ,
		relatedTarget: function( event ) {
			var e      = this.get( event ) ;
			var target = e.relatedTarget ;
			
			if ( ! target ) {
				if ( e.type == 'mouseout' ) {
					target = e.toElement ;
				} else if ( e.type == 'mouseover' ) {
					target = e.fromElement ;
				} ;
			} ;
			
			target = this.checkTarget( target ) ;
			
			return target ;
		} ,
		checkTarget: function( target ) {
			if ( target.nodeType == 3 ) {
				target = target.parentNode ;
			} ;
			
			return target ;
		} ,
		preventDefault: function( e ) {
			if ( e.preventDefault ) {
				e.preventDefault() ;
			} ;
			
			e.returnValue = false ;
		}
	} ;
} () ;

nl.xd.util.Event.addListener( window , 'unload' , function() { nl.xd.util.Event.unload() ; } ) ;