OSDN Git Service

Version 0.6.x starting.
[pettanr/clientJs.git] / 0.6.x / js / core / 12_XDomEvent.js
1 /**
2  * use X.Callback
3  */
4 var X = X || {};
5
6 X.DomEvent = {
7         _load   : false,
8         _ready  : false,
9         _unload : false,
10         add :
11                 document.addEventListener ?
12                         (function( element, type, arg2, arg3, arg4 /* [ listener || ( context + function ) || function ][ arguments ] */ ){
13                                 var callback;
14                                 if( typeof arg2 === 'function' ){
15                                         callback = X.Callback.create( element, arg2, arg3 );
16                                 } else {
17                                         callback = X.Callback.create( arg2, arg3, arg4 );
18                                 };
19                                 callback.c   = X.DomEvent._callback; // override
20                                 element.addEventListener( type, callback, false );
21                         }) :
22                 document.attachEvent ?
23                         (function( element, type, arg2, arg3, arg4 /* [ listener || ( context + function ) || function ][ arguments ] */ ){
24                                 var callback;
25                                 if( typeof arg2 === 'function' ){
26                                         callback = X.Callback.create( element, arg2, arg3 );
27                                 } else {
28                                         callback = X.Callback.create( arg2, arg3, arg4 );
29                                 };
30                                 callback.c = X.DomEvent._callback; // override
31                                 callback.e = element;
32                                 element.attachEvent( 'on' + type, callback );
33                         }) :
34                         (function( element, type, arg2, arg3, arg4 /* [ listener || ( context + function ) || function ][ arguments ] */ ){
35                                 var callback;
36                                 if( typeof arg2 === 'function' ){
37                                         callback = X.Callback.create( element, arg2, arg3 );
38                                 } else {
39                                         callback = X.Callback.create( arg2, arg3, arg4 );
40                                 };
41                                 if( X.DomEvent.helper( element, type, callback ) === false ){
42                                         callback.c   = X.DomEvent._callback; // override
43                                         return;
44                                 };
45                                 helper = X.DomEvent.Dom0.find( element, type, callback );
46                                 if( helper ){
47                                         if( helper.list.indexOf( callback ) === -1 ) helper.list[ helper.list.length ] = callback;
48                                 } else {
49                                         new X.DomEvent.Dom0.Helper( element, type, callback );
50                                 };
51                         }),
52         remove :
53                 document.removeEventListener ?
54                         (function( element, type, arg2, arg3 ){
55                                 var callback = X.Callback.find( arg2, arg3 );
56                                 if( callback ){
57                                         element.removeEventListener( type, callback, false );
58                                         X.Callback._correct( callback );                                        
59                                 };
60                         }) :
61                 document.detachEvent ?
62                         (function( element, type, arg2, arg3 ){
63                                 var callback = X.Callback.find( arg2, arg3 );
64                                 if( callback ){
65                                         element.detachEvent( 'on' + type, callback );
66                                         X.Callback._correct( callback );
67                                 };
68                         }) :
69                         (function( element, type, arg2, arg3 ){
70                                 var t = X.DomEvent.Dom0.find( element, type ),
71                                         c = X.Callback.find( arg2, arg3 ),
72                                         i;
73                                 if( t && c ){
74                                         i = t.list.indexOf( c );
75                                         if( i !== -1 ){
76                                                 t.list.splice( i, 1 );
77                                                 X.Callback._correct( c );
78                                         };
79                                         if( t.list.length === 0 ){
80                                                 t.elm[ 'on' + t.type ] = X.DomEvent.Dom0.emptyFunc;
81                                                 t.elm[ 'on' + t.type ] = '';
82                                                 c = X.Callback.find( t );
83                                                 X.Callback._correct( c );
84                                                 X.DomEvent.Dom0.LIST.splice( X.DomEvent.Dom0.LIST.indexOf( t ), 1 );
85                                                 delete t.elm;
86                                                 delete t.type;
87                                                 delete t.list;
88                                         };
89                                 };
90                         }),
91         _callback :
92                 window.addEventListener ?
93                         (function( event ){
94                                 var f = this,
95                                         r = f.callback.call( f.context, event );
96                                 if( r !== false ) return r;
97                                 event.preventDefault();
98                                 event.stopPropagation();
99                                 return false;
100                         }) :            
101                         (function(){
102                                 var f = this,
103                                         e = window.event,
104                                         x = f.context,
105                                         r = f.callback.call( x, new X.DomEvent.xEvent( e, x.elm ));
106                                 if( r !== false ) return r;
107                                 e.cancelBubble = true;
108                                 e.returnValue  = false;
109                                 return r;
110                         })
111 };
112 if( !window.addEventListener ){
113         X.DomEvent.xEvent = function( e, element ){
114                 this._event        = e;
115                 this.type          = e.type;
116                 this.target        = e.srcElement;
117                 this.currentTarget = element;
118                 this.relatedTarget = e.formElement ? e.formElement : e.toElement;
119                 this.eventPhase    = e.srcElement === element ? 2: 3;
120                 
121                 this.clientX       = e.clientX;
122                 this.clientY       = e.clientY;
123                 this.screenX       = e.screenX;
124                 this.screenY       = e.screenY;
125                 
126                 this.keyCode       = e.keyCode;
127                 this.altKey        = e.altKey;
128                 this.ctrlKey       = e.ctrlKey;
129                 this.shiftKey      = e.shiftKey;
130                 
131                 this.wheelDelta    = e.wheelDelta;
132         };
133 };
134 if( !document.addEventListener && !document.attachEvent ){
135         X.DomEvent.Dom0 = {
136                 LIST      : [],
137                 emptyFunc : new Function(),
138                 find      : function( element, type ){
139                         var list = X.DomEvent.Dom0.LIST,
140                                 i    = list.length,
141                                 helper;
142                         for( ; i < l; ){
143                                 helper = list[ --i ];
144                                 if( helper.elm === element && helper.type === type ) return helper;
145                         };
146                         return null;
147                 },
148                 Helper : function( elm, type, callback ){
149                         this.elm  = elm;
150                         this.type = type;
151                         this.list = [ callback ];
152                         
153                         var callback = elm[ 'on' + type ] = X.DomEvent.create( this );
154                         callback.c   = X.DomEvent._callback; // override
155                         X.DomEvent.Dom0.LIST[ X.DomEvent.Dom0.LIST.length ] = this;
156                 }
157         };
158         X.DomEvent.Dom0.Helper.prototype.handleEvent = function(e){
159                 //e = e.copy();
160                 var list = this.list,
161                         i    = list.length,
162                         cancel;
163                 for( ; i; ){
164                         if( list[ --i ]( e ) === false ) cancel = false;
165                 };
166                 return cancel;
167         };
168 };