function EventSource ()
	{
	this.eventListeners = new Array () ;
	}

EventSource.prototype.addEventListener = function (listener)
	{
	var	i ;

	if (listener.diagnosticName)
		if (this.diagnosticName)
			alert ('adding ' + listener.diagnosticName + ' as listener to ' + this.diagnosticName) ;
		else
			alert ('adding ' + listener.diagnosticName + ' as listener') ;

	for (i = 0 ; i != this.eventListeners.length ; i++)
		if (this.eventListeners[i] === listener)
			return false ;

	if (listener.diagnosticName)
		if (this.diagnosticName)
			alert (listener.diagnosticName + ' added as listener to ' + this.diagnosticName) ;
		else
			alert (listener.diagnosticName + ' added as listener') ;
	this.eventListeners[i] = listener ;
	return true ;
	}

EventSource.prototype.removeEventListener = function (listener)
	{
	var	i ;

	i = 0 ;
	while (i != this.eventListeners.length)
		if (this.eventListeners[i] === listener)
			{
			this.eventListeners.splice (i, 1) ;
			if (listener.diagnosticName)
				if (this.diagnosticName)
					alert (listener.diagnosticName + ' removed as listener from ' + this.diagnosticName) ;
				else
					alert (listener.diagnosticName + ' removed as listener') ;
			}
		else
			i++ ;
	}

EventSource.prototype.dispatchEvent = function (eventName)
	{
	var	i ;
	var	args ;
	var	listeners ;

	args = new Array (this) ;
	for (i = 1 ; i < arguments.length ; i++)
		args[args.length] = arguments[i] ;
	listeners = this.eventListeners.slice (0) ;
	for (i = 0 ; i != listeners.length ; i++)
		{
		if (listeners[i]['on' + eventName])
			{
			listeners[i]['on' + eventName].apply (listeners[i], args) ;
			if (listeners[i].diagnosticName && (eventName != 'WindowFocus'))
				if (this.diagnosticName)
					alert (listeners[i].diagnosticName + ' received ' + eventName + ' event from ' + this.diagnosticName) ;
				else
					alert (listeners[i].diagnosticName + ' received ' + eventName + ' event') ;
			}
		else
			{
			if (listeners[i].diagnosticName && (eventName != 'WindowFocus'))
				alert (listeners[i].diagnosticName + ' not interested in ' + eventName + ' events') ;
			}
		}
	}

