aboutsummaryrefslogtreecommitdiffstats
path: root/js/lib_event.js
blob: 9d5df93e2a1882f0d41f828be55c9440f69fed0c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/**
 * eventHandler
 *
 * @author Icewind <icewind (at) derideal (dot) com>
 * @copyright 2009
 * @license http://www.gnu.org/licenses/gpl.html GNU Public License
 * @version 0.1
 */

/*event handling
usage:    document.events.add(node,type,function,arguments);
   or:    node.addEvent(type,function,arguments);
*/

eventHandler=function(){
	this.holders=Array();
}

eventHandler.prototype={
	add:function(element,type,func,arguments){
		var holder=this.getHolderByElement(element);
		holder.addListner(type,func,arguments);
	},
	getHolderByElement:function(element){
		var holder=false;
		for (var i=0;i<this.holders.length;i++){
			if (this.holders[i].getElement()==element){
				var holder=this.holders[i];
			}
		}
		if (!holder){
			var holder=new eventHolder(element);
			this.holders[this.holders.length]=holder;
		}
		return holder;
	},
	trigger:function(element,type,event){
		var holder=eventHandler.getHolderByElement(element);
		return holder.trigerEvent.call(holder,type,event);
	}
}

eventHolder=function(element){
	this.element=element;
	this.listners=Array();
}

eventHolder.prototype={
	addListner:function(type,func,arguments){
		if (type && this.element){
			if (!this.listners[type]){
				this.listners[type]=Array();
				eval("callback=function(event){return holder.trigerEvent.call(holder,'"+type+"',event)}");
				if (this.element.tagName){//do we have a element (not an named event)
					var holder=this;
					//IE doesn't let you set the onload event the regulair way
					if (type=="onload" && this.element.addEventListener && window.ActiveXObject){
						this.element.addEventListener(type, callback, false);
					}else if (type=="onload" && this.element.attachEvent && window.ActiveXObject){
						this.element.attachEvent(type, callback);
					}else{
						eval("this.element."+type+"=function(event){return holder.trigerEvent.call(holder,'"+type+"',event)}");
					}
				}else{
					eval("this.element."+type+"=function(event){return holder.trigerEvent.call(holder,'"+type+"',event)}");
				}
			}
			var i=this.listners[type].length
			this.listners[type][i]=func;
			this.listners[type][i].applyArguments=arguments;
		}else{
			var i=this.listners.length
			this.listners[i]=func;
			this.listners[type][i].applyArguments=arguments;
		}
	},
	trigerEvent:function(type,event){
		if (type && this.element && this.listners[type]){
			for (var i=0;i<this.listners[type].length;i++){
                   if(this.listners[type][i].applyArguments){
                       return this.listners[type][i].apply(this,this.listners[type][i].applyArguments)
                   }else{
                       return this.listners[type][i].call();
                   }
			}
		}else{
			for (var i=0;i<this.listners.length;i++){
                return this.listners[i](event);
			}
		}
	},
	getElement:function(){
		return this.element;
	}
}

document.events=new eventHandler();

Node.prototype.addEvent=function(type,func,arguments){
    document.events.add(this,type,func,arguments);
}