/**
 * A high-level event registry that abstracts away the details
 * of the browser native events.
 *
 * Not much here right now...
 */
function Event( target ) { 
	this.target = target ;
	this.type = '' ;
	
	Event.prototype.getTarget = function() {
		return this.target ;
	}
}

var EventRegistryFactory = new function() {

	this.registry = null ;
	
	this.getRegistry = function() {
		if ( this.registry == null ) {
			this.registry = new EventRegistry() ;
		}
		return this.registry ;
	}
}

function EventRegistry() {	

	EventRegistry.prototype.listeners = [] ;
	
	//EventRegistry.prototype.log = new Log() ;
	
	/**
	 * Dispatch a native browser event to an object-based listener.
	 */
	EventRegistry.prototype.eventHandler = function( nativeEvent ) {
		var target = null ;
		
		if ( window.event ) {
			// IE6 DOM 
			//document.write( 'got event: ie6' ) ;
			// Instead of being an instance of EventRegistry,
			// the variable 'this' is a reference to the
			// HTML element that called this function.
			target = this ;
			//window.alert( target ) ;		
		} else  {
			// W3C DOM			
			target = nativeEvent.currentTarget ;			
		}
		var event = new Event( target ) ;
		for ( var i = 0 ; i < EventRegistry.prototype.listeners.length ; i++ ) {
			var entry = EventRegistry.prototype.listeners[ i ] ;
			if ( entry[ 0 ] == target ) {
				//EventRegistry.prototype.log.debug( "EventRegistry: dispatching event <" +
				 //entry[ 0 ].tagName + " id='" + entry[ 0 ].id + "'/>" ) ;
				eval( 'entry[ 1 ]( event )' ) ;
			}
		}
	}
	
	// Map listener to target and add this EventRegistry as a listener
	// to the element event.
	//
	EventRegistry.prototype.registerEvent = function( eventType, target, listener ) {
		if ( target.addEventListener ) {
			// W3C Compatible.
			target.addEventListener( eventType, EventRegistry.prototype.eventHandler, false ) ;
		} else if ( target.attachEvent ) {
			// IE6+ Compatible.
			// Register event using 'traditional' model.  Only one
			// listener per target is allowed.  We use this model
			// because the handler will be called with 'this' set
			// to 'target'.  This is the only way to get a
			// reference to the element that the handler was
			// set on from within the handler function/method.
			if ( eventType == 'change' ) {
				//alert( 'registered change event' ) ;
				target.onchange = EventRegistry.prototype.eventHandler ;
			} else {
				eval( 'target.on' + eventType + ' = EventRegistry.prototype.eventHandler' ) ;			
			}
			
			//EventRegistry.prototype.log.debug( "EventRegistry: attached event " + eventType + "to" + target ) ;
		}
		
		var entry = new Array( 2 ) ;
		entry[ 0 ] = target ;
		entry[ 1 ] = listener ;
		entry[ 2 ] = eventType ;
		this.listeners.push( entry ) ;
	}
}
