Add header.
[sfrench/samba-autobuild/.git] / source4 / lib / appweb / ejs-2.0 / ejs / lib / event.js
1 /*
2  *      @file   event.js
3  *      @brief  Event class
4  *      @copy   Copyright (c) Mbedthis Software LLC, 2005-2006. All Rights Reserved.
5  *
6  *      Usage:
7  *              listener = new System.Listener();
8  *              listener.onClick = function() {
9  *                      // Any code here 
10  *              }
11  *              eventTarget.addListener(eventName, listener);
12  *      or
13  *              listener = new System.Listener(obj, method);
14  *              eventTarget.addListener(eventName, listener);
15  *
16  *      To fire events:
17  *              eventTarget.fire(eventName, new System.Event("My Event"));
18  */
19
20 /******************************************************************************/
21 /*
22  *      Base event class
23  */
24 class System.Event 
25 {
26         var             type;                                                   // keyboard
27         var     timeStamp;
28         var             arg;
29
30         /* MOB -- constructor should take a type */
31         function Event(arg)
32         {
33                 timeStamp = time();
34                 type = "default";
35                 this.arg = arg;
36         }
37 }
38
39 /* MOB -- should not be needed */
40 Event = System.Event;
41
42 class System.Listener
43 {
44         var             obj;
45         var             method;
46
47         function Listener(obj, method)
48         {
49                 if (arguments.length >= 1) {
50                         this.obj = obj;
51                 } else {
52                         this.obj = this;
53                 }
54                 if (arguments.length == 2) {
55                         this.method = method;
56                 } else {
57                         this.method = "onEvent";
58                 }
59         }
60 }
61 /* MOB -- should not be needed */
62 Listener = System.Listener;
63
64
65 /*
66  *      The Event target class
67  */
68 class System.EventTarget
69 {
70         //      Private
71         var     events;                                                         /* Hash of a event names */
72
73         function EventTarget()
74         {
75                 events = new Object();
76         }
77
78         //      Public
79         function addListener(eventName, listener) 
80         {
81                 var listeners = events[eventName];
82                 if (listeners == undefined) {
83                         listeners = events[eventName] = new Array();
84                 }
85                 if (arguments.length == 2) {
86                         var method = eventName;
87                 }
88                 /* MOB OPT */
89                 for (var i = 0; i < listeners.length; i++) {
90                         var l = listeners[i];
91                         if (l == listener) {
92                                 return;
93                         }
94                 }
95                 listeners[listeners.length] = listener;
96         }
97
98         function removeListener(eventName, listener)
99         {
100                 var listeners = events[eventName];
101
102                 if (listeners == undefined) {
103                         return;
104                 }
105
106                 for (var i = 0; i < listeners.length; i++) {
107                         var l = listeners[i];
108                         if (l == listener) {
109                                 // MOB -- want listeners.splice here
110                                 // listeners.splice(i, 1);
111                                 for (var j = i; j < (listeners.length - 1); j++) {
112                                         listeners[j] = listeners[j + 1];
113                                 }
114                                 delete listeners[listeners.length - 1];
115                                 i = listeners.length;
116                         }
117                 }
118         }
119
120         function fire(eventName, event) 
121         {
122                 var listeners = events[eventName];
123         
124                 if (listeners == undefined) {
125                         // println("Event.fire(): unknown eventName " + eventName);
126                         return;
127                 }
128
129                 for (var i = listeners.length - 1; i >= 0; i--) {
130                         var listener = listeners[i];
131                         var method = listener.obj[listener.method];
132                         if (method == undefined) {
133                                 throw new EvalError("Undefined method: " + listener.method);
134                         }
135                         listener.obj[listener.method](listener, event);
136                 }
137         }
138 }
139
140 /* MOB -- should not be needed */
141 EventTarget = System.EventTarget;