/*
   Datei: add_event.js
   Datum: 11.06.2007

   Einen Eventaufruf einem Objekt zufügen.

   Folgende Parameter werden übergeben:
   
   obj 		- Das Objekt auf dem der Event stattfindet. [Default: window]
   event 	- Der Event der beobachtet werden soll (ohne 'on') [Default: load]
   function - Eine Funktionsreferenz

   Die Funktion kann auf 2 Arten benutzt werden. 
   
   addEvent( obj, event, func);
   addEvent( { func: function, evt: event, obj: obj})
   
*/

function addEvent() {
	// Parameterauswertung
	{
	var obj, name, func;
	if( typeof arguments[0] == 'object' && arguments.length == 1 ) {
		
		// Der Parameter ist ein Objekt
		obj = arguments[0]['obj']; 
		name = arguments[0]['evt']; 
		func = arguments[0]['func'];
		
	} else {
		
		// Parameterliste
		obj = arguments[0]; 
		name = arguments[1]; 
		func = arguments[2];
	}
	
	// Defaultwerte 
	if(!obj) obj = window;
	if(!name) name = 'load';
	
	if( typeof func != 'function') throw('usage addEvent( object, name, *function*) - miss function.');
	}
	
	/*
		Die Funktion führt den Event aus.
	*/
	function EventHandler(n) {
		var chain = [];
		var o = obj;
		var evt = new Event(n, o);
		var f = function(e) {
			evt.set(e);
			
			for(var i = 0; i < chain.length; ++i) {
				evt.returnValue = chain[i].call(o, evt);
				if(evt.isCancel()) break;
			}
			return evt.returnValue;
		}
		;
		f.add = function(f){return chain.push(f) - 1;};
		f.remove = function(idx){	
			if(typeof idx == 'number') return chain.splice(idx, 1);
			
			for(var i = 0; i < chain.length; ++i) {
				if(chain[i] == idx ){
					return chain.splice(i, 1);
					return true;
				}
			}
			return false;
		};
		return f;
	}
	
	// Den Eventhandler für das Objekt erzeugen
	if(!obj['on' + name])  obj['on' + name] = EventHandler(name);
	
	// Den Event hinzufügen
	return obj['on' + name].add(func);
}
function removeEvent(o, n, f) {
	if(!o['on' + n]) return;
	o['on' + n].remove(f);

}
function Event(n, obj) {
	var cancel = false;
	var o = obj;
	var evt = null;
	
	this.name = n;
	this.set = function(e) {
		evt = e ||  window.event || {};
		
		var body = window.document.body;
		// Position im Dokument
		this.Y = evt.pageY ? evt.pageY : evt.clientY + body.scrollTop;
		this.X = evt.pageX ? evt.pageX : evt.clientX + body.scrollLeft;
		
		// Position im Browserfenster
		this.clientX = evt.clientX ? evt.clientX : evt.pageX - window.pageXOffset;
		this.clientY = evt.clientY ? evt.clientY : evt.pageY - window.pageYOffset;
		this.type = evt.type;
		
		this.obj = evt.target ? evt.target : evt.srcElement ? evt.srcElement : {};

		this.tagName = this.obj.tagName || '[unknown]';

		this.self = this.obj == o;

		cancel = false;
	};
	this.getPos = function() {return [this.X, this.Y]; };

	this.isCancel = function() { return cancel;};
	this.stopPropagation = function() {
		if (evt.stopPropagation) evt.stopPropagation();
		else evt.cancelBubble = true;
		cancel = true;
		return false;
	};
	this.preventDefault = function() {
		if (evt.preventDefault) evt.preventDefault();
		else evt.returnResult = false;
		return false;
	};
};