OSDN Git Service

Version 0.6.159, fix X.Class & X.XHR.Gadget.
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 13_XEventDispatcher.js
index 946cbfc..27649db 100644 (file)
@@ -10,7 +10,7 @@
  * \r
  * <dl>\r
  * <dt>0:ACTUAL_HANDLER\r
- * <dd>ã\82¤ã\83\99ã\83³ã\83\88ã\82¿ã\83¼ã\82²ã\83\83ã\83\88ã\81® addEventListener ç­\89ã\81«æ¸¡ã\81\95ã\82\8cã\82\8bå®\9fé\9a\9bã\81®é\96¢æ\95°(å\86\8då\88©ç\94¨å\8f¯è\83½ã\82¯ã\83­ã\83¼ã\82¸ã\83£)を控えています。\r
+ * <dd>ã\82¤ã\83\99ã\83³ã\83\88ã\82¿ã\83¼ã\82²ã\83\83ã\83\88ã\81® addEventListener ç­\89ã\81«æ¸¡ã\81\95ã\82\8cã\82\8bå®\9fé\9a\9bã\81®é\96¢æ\95°(å¤\9aã\81\8fã\81®å ´å\90\88ã\80\81å\86\8då\88©ç\94¨å\8f¯è\83½ã\82¯ã\83­ã\83¼ã\82¸ã\83£ã\80\81ã\81\9dã\82\8c以å¤\96ã\81¯é\80\9a常ã\81®é\96¢æ\95°)を控えています。\r
  * <dt>1:DISPATCHING number\r
  * <dd>dispatch 中か?さらにインスタンス自身の dispatch がネストした場合、その深さを記憶します。\r
  * <dt>2:RESERVES Array\r
  * <dd>dispatch 中に kill() が呼ばれた場合に一旦 kill をキャンセルし、完了時(DISPATCHING===0)に再度 kill() するためのフラグです。\r
  * </dl>\r
  * \r
- * @class __X_EventDispatcher_Listeners__\r
+ * @class __Listeners__\r
  * @private\r
  * @abstract\r
  */\r
-var\r
-       /** @enum {number} */\r
-       X_Listeners_ =\r
-               /** @lends __X_EventDispatcher_Listeners__ */\r
-               {\r
-                       ACTUAL_HANDLER : 0,\r
-                       DISPATCHING    : 1,\r
-                       RESERVES       : 2,\r
-                       UNLISTENS      : 3,\r
-                       KILL_RESERVED  : 4 // X.Event で、イベントIDを 5 から始めているので注意。\r
-               };\r
+var X_Listeners_;\r
+\r
+var /** @const */\r
+       X_LISTENERS_ACTUAL_HANDLER = 0,\r
+       /** @const */\r
+       X_LISTENERS_DISPATCHING    = 1,\r
+       /** @const */\r
+       X_LISTENERS_RESERVES       = 2,\r
+       /** @const */\r
+       X_LISTENERS_UNLISTENS      = 3,\r
+       /** @const */\r
+       X_LISTENERS_KILL_RESERVED  = 4; // X.Event で、イベントIDを 5 から始めているので注意。\r
 \r
 \r
 \r
@@ -50,14 +51,12 @@ var X_EventDispatcher_once       = false,
        \r
        X_EventDispatcher_safariPreventDefault = false, // Safari3-\r
        \r
-       /**\r
-        * @enum {number} \r
-        */\r
-       X_EventDispatcher_EVENT_TARGET_TYPE = {\r
-               OTHER        : 0,\r
-               XHR          : 1,\r
-               SILVER_LIGHT : 2\r
-       },\r
+       /* @const */\r
+       X_EventDispatcher_EVENT_TARGET_OTHER        = 0,\r
+       /* @const */\r
+       X_EventDispatcher_EVENT_TARGET_XHR          = 1,\r
+       /* @const */\r
+       X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT = 2,\r
        \r
        X_EventDispatcher_LAZY_TIMERS = {}; // Object.<number, X.EventDispatcher> number は timerID\r
 \r
@@ -69,8 +68,8 @@ var X_EventDispatcher_once       = false,
  * <ol>\r
  * <li>as3 の EventDispatcher ライクなクラス。そのまま使ったり、継承したり。\r
  * <li>_rawObject メンバがいる場合、addEventListener, attachEvent, on 等で生のブラウザオブジェクトにリスナを登録する。\r
- *     window, document, HTMLElement, Image, XHR, Silverlight などが _rawObject\r
- * <li>イベントディスパッチにリスナの追加が呼び出された場合、リスナはこれ以降のイベントから呼ばれます。同様にリスナの削除が呼ばれた場合、そのリスナが呼ばれることはありません。\r
+ *     window, document, HTMLElement, Image, XHR, Silverlight などが _rawObject になる。\r
+ * <li>イベントディスパッチにリスナの追加が呼び出された場合、リスナはこれ以降のイベントから呼ばれます。同様にリスナの削除が呼ばれた場合、そのリスナが呼ばれることはありません。\r
  * </ol>\r
  * \r
  * <blockquot>\r
@@ -95,7 +94,7 @@ var X_EventDispatcher_once       = false,
  * \r
  * <p>またコールバックに対して、this コンテキストや、追加の引数を指定もできます。 this コンテキストを指定しなかった場合、EventDispatcher インスタンスがコールバックの this になります。 \r
  * \r
- * <p>unlisten() ã\81¯ã\80\81å¼\95æ\95°ã\82\92æ\8c\87å®\9aã\81\97ã\81ªã\81\8bã\81£ã\81\9få ´å\90\88ã\80\81å\85¨ã\81¦ã\81®ã\82¤ã\83\99ã\83³ã\83\88ã\82\92解é\99¤ã\81\97ã\81¾ã\81\99ã\80\82ã\81\9fã\81 ã\81\97ã\80\81systemListen 経由で登録されたハンドラは解除されません。\r
+ * <p>unlisten() ã\81§ã\81¯ systemListen 経由で登録されたハンドラは解除されません。\r
  * \r
  * systemListen, systemUnlisten は、ライブラリ内のコードからしかアクセスできません。\r
  * \r
@@ -117,11 +116,11 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
                 * @private\r
                 * @type {number}\r
                 */\r
-                       '_rawType'      : X_EventDispatcher_EVENT_TARGET_TYPE.OTHER,\r
+                       '_rawType'      : X_EventDispatcher_EVENT_TARGET_OTHER,\r
                \r
                /**\r
-                * イベントリスナをイベント名文字列や数値(1~,フレームワーク内で定義)をキーとするArrayで記憶します。<br>\r
-                * Arrayには、{k:種類,x:コンテキスト(thisObject),f:関数,s:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
+                * イベントリスナをイベント名文字列や数値(5以上、フレームワーク内で定義)をキーとするArrayで記憶します。<br>\r
+                * Arrayには、{kind:種類,context:コンテキスト(thisObject),func:コールバック関数,supplement:サプリメントする引数の配列} というハッシュ、または関数が蓄えられています。\r
                 * \r
                 * @private\r
                 * @type {__X_EventDispatcher_Listeners__}\r
@@ -173,13 +172,13 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
 \r
                /**\r
                 * <p>イベントリスナの登録状況を真偽値で返す。戻り値が数値(index)の場合もあるが、これは内部のみで使用。\r
-                * <p>this[ 'listening' ](); のように type を省略した場合、一つでも登録があれば true を返す。\r
-                * <p>this[ 'listening' ]( 'myevent' ); と type だけを与えた場合、その type に登録があれば true を返す。\r
+                * <p>this.listening(); のように type を省略した場合、一つでも登録があれば true を返す。\r
+                * <p>this.listening( 'myevent' ); と type だけを与えた場合、その type に登録があれば true を返す。\r
                 * <p>type と イベントリスナの組み合わせが登録されているかを調べる場合は、listen 時の thisObject や args(Array) も一致させて渡す必要がある。\r
                 * \r
                 * @example \r
-                *  this[ 'listen' ]( [ 'myevent', 'yourevent' ], this, onMyEvent, args = [ 1, 'a' ] );\r
-                *  this[ 'listening' ]( 'myevent', this, onMyEvent, args ) === true;\r
+                *  this.listen( [ 'myevent', 'yourevent' ], this, onMyEvent, args = [ 1, 'a' ] );\r
+                *  this.listening( 'myevent', this, onMyEvent, args ) === true;\r
                 * \r
                 * @return {number|boolean}\r
                 * @param {string|number} opt_type\r
@@ -194,15 +193,16 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
                                \r
                                if( opt_type === undefined ) return !!listeners;\r
                                if( !listeners || !( list = listeners[ opt_type ] ) ) return false;\r
-                               if( opt_arg1 === undefined ) return true;\r
+                               if( opt_arg1 === undefined ) return X_EventDispatcher_needsIndex ? 0 : true;\r
                                \r
+                               // TODO callbackHash か?判定が不十分!\r
                                if( opt_arg1.kind ){\r
                                        cbHash = opt_arg1;\r
                                } else {\r
                                        cbHash = X_Callback_classifyCallbackArgs( opt_arg1, opt_arg2, opt_arg3, this );\r
                                };\r
                                \r
-                               if( ( unlistens = listeners[ X_Listeners_.UNLISTENS ] ) && ( unlistens = unlistens[ opt_type ] ) ){\r
+                               if( ( unlistens = listeners[ X_LISTENERS_UNLISTENS ] ) && ( unlistens = unlistens[ opt_type ] ) ){\r
                                        for( i = unlistens.length; i; ){\r
                                                f = unlistens[ --i ];\r
                                                if( f === cbHash || ( f.context === cbHash.context && f.func === cbHash.func && f.supplement === cbHash.supplement && f.lock === lock ) ) return false;\r
@@ -223,7 +223,7 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
                 * kill() 時には内部でまだ呼ばれていないタイマーの X.Timer.remove() が行われる。インスタンスが破棄された後にタイマーが呼ばれることがないので神経質にならなくても安全に使える。\r
                 * @example this[ 'asyncDispatch' ]( 'myevent' );\r
                 * // どちらのコードも同じ動作をする。\r
-                * this[ 'asyncDispatch' ]( 0, 'myevent' );\r
+                * this.asyncDispatch( 0, 'myevent' );\r
                 * @param {number|eventHash|string} delay ms 省略した場合は 0 として扱う asyncDispatch( 'myevent' ) -> asyncDispatch( 0, 'myevent' )\r
                 * @param {eventHash|string|number} e イベントを表す数値、文字列、{ type : XXX, ... } なオブジェクト\r
                 * @return {number} X.Timer.add() の戻り値\r
@@ -252,7 +252,7 @@ var X_EventDispatcher = X[ 'EventDispatcher' ] =
  * dispatch のコールバック中で unlisten() が呼ばれた場合、即座に反映され削除されたイベントリスナーは呼ばれない。\r
  * @alias EventDispatcher.prototype.dispatch\r
  * @param {eventHash|string|number} e\r
- * @return {number} X.Callback で定義された数値\r
+ * @return {number} X.Callback で定義された数値(ビットフラグ)\r
  */\r
 function X_EventDispatcher_dispatch( e ){\r
        var listeners = this[ '_listeners' ],\r
@@ -260,7 +260,7 @@ function X_EventDispatcher_dispatch( e ){
                type      = e[ 'type' ],\r
                list, unlistens, i, l, args, f, r, sysOnly, timerID;\r
        \r
-       if( !listeners || !( list = listeners[ type || e ] ) ) return ret;\r
+       if( !listeners || !( list = listeners[ type || e ] ) ) return X_Callback_NONE;\r
        \r
        // 数値, 文字が渡された場合\r
        if( !type ){\r
@@ -269,47 +269,48 @@ function X_EventDispatcher_dispatch( e ){
        e[ 'target' ]        = e[ 'target' ] || this;\r
        e[ 'currentTarget' ] = e[ 'currentTarget' ] || this;\r
        \r
-       if( listeners[ X_Listeners_.DISPATCHING ] ){\r
-               ++listeners[ X_Listeners_.DISPATCHING ];\r
+       if( listeners[ X_LISTENERS_DISPATCHING ] ){\r
+               ++listeners[ X_LISTENERS_DISPATCHING ];\r
        } else {\r
-               listeners[ X_Listeners_.DISPATCHING ] = 1;\r
+               listeners[ X_LISTENERS_DISPATCHING ] = 1;\r
        };\r
        \r
        // todo:\r
        // type も保存\r
-       listeners[ X_Listeners_.UNLISTENS ] = listeners[ X_Listeners_.UNLISTENS ] || {};\r
-       unlistens = listeners[ X_Listeners_.UNLISTENS ][ type ];\r
+       listeners[ X_LISTENERS_UNLISTENS ] = listeners[ X_LISTENERS_UNLISTENS ] || {};\r
+       unlistens = listeners[ X_LISTENERS_UNLISTENS ][ type ];\r
        \r
        for( i = 0; i < list.length; ++i ){\r
                f = list[ i ];\r
                if( !unlistens ){\r
-                       unlistens = listeners[ X_Listeners_.UNLISTENS ][ type ];\r
+                       unlistens = listeners[ X_LISTENERS_UNLISTENS ][ type ];\r
                };\r
                if( unlistens && unlistens.indexOf( f ) !== -1 ) continue;\r
                \r
-               r = X_Callback_proxyCallback( f, args || ( args = [ e ] ) );\r
+               r = X_Callback_proxyCallback( f, args || ( args = [ e ] ) ) || 0;\r
                \r
                if( f.once || r & X_Callback_UN_LISTEN ){\r
                        // dispatch 中に unlisten が作られることがある\r
                        if( !unlistens ){\r
-                               unlistens = listeners[ X_Listeners_.UNLISTENS ] || ( listeners[ X_Listeners_.UNLISTENS ] = {} );\r
+                               unlistens = listeners[ X_LISTENERS_UNLISTENS ] || ( listeners[ X_LISTENERS_UNLISTENS ] = {} );\r
                                unlistens = unlistens[ type ] || ( unlistens[ type ] = [] );\r
                        };\r
                        unlistens.indexOf( f ) === -1 && ( unlistens[ unlistens.length ] = f );\r
                };\r
-\r
-               if( r & X_Callback_STOP_NOW ){\r
+               ret |= X_Type_isFinite( r ) ? r : 0;\r
+               \r
+               if( ( r & X_Callback_STOP_NOW ) === X_Callback_STOP_NOW ){ // iOS では ( & ) 括弧が無いと判定を誤る\r
                        sysOnly = true;\r
+                       break;\r
                };\r
-               ret |= X_Type_isFinite( r ) ? r : 0;\r
        };\r
        \r
-       if( ( --listeners[ X_Listeners_.DISPATCHING ] ) === 0 ){\r
+       if( ( --listeners[ X_LISTENERS_DISPATCHING ] ) === 0 ){\r
 \r
-               delete listeners[ X_Listeners_.DISPATCHING ];\r
+               delete listeners[ X_LISTENERS_DISPATCHING ];\r
                \r
                // dispatch 中に listen されたイベントの追加\r
-               if( list = listeners[ X_Listeners_.RESERVES ] ){\r
+               if( list = listeners[ X_LISTENERS_RESERVES ] ){\r
                        for( i = 0, l = list.length; i < l; ++i ){\r
                                f = list[ i ];\r
                                X_EventDispatcher_once = f[ 4 ];\r
@@ -319,12 +320,12 @@ function X_EventDispatcher_dispatch( e ){
                        };\r
                        list.length = 0;\r
                        X_EventDispatcher_once = X_EventDispatcher_lock = false;\r
-                       delete listeners[ X_Listeners_.RESERVES ];\r
+                       delete listeners[ X_LISTENERS_RESERVES ];\r
                };              \r
                \r
                // dispatch 中に unlisten されたイベントの削除\r
-               if( unlistens = listeners[ X_Listeners_.UNLISTENS ] ){\r
-                       delete listeners[ X_Listeners_.UNLISTENS ];\r
+               if( unlistens = listeners[ X_LISTENERS_UNLISTENS ] ){\r
+                       delete listeners[ X_LISTENERS_UNLISTENS ];\r
                        \r
                        // _unlistens に入っている callbackHash は、lock をクリアしている\r
                        X_EventDispatcher_unlock = true;\r
@@ -344,11 +345,7 @@ function X_EventDispatcher_dispatch( e ){
                        delete X_EventDispatcher_LAZY_TIMERS[ X_Timer_currentUID ];\r
                };\r
 \r
-               if( listeners[ X_Listeners_.KILL_RESERVED ] ){\r
-                       /*\r
-                       for( timerID in X_EventDispatcher_LAZY_TIMERS ){\r
-                               if( X_EventDispatcher_LAZY_TIMERS[ timerID ] === this ) return ret;\r
-                       }; */\r
+               if( listeners[ X_LISTENERS_KILL_RESERVED ] ){\r
                        this[ 'kill' ]();\r
                };\r
        };\r
@@ -394,9 +391,9 @@ function X_EventDispatcher_listen( type, opt_arg1, opt_arg2, opt_arg3 ){
 \r
        if( !type ) return this;\r
        \r
-       if( listeners && listeners[ X_Listeners_.DISPATCHING ] ){\r
-               if( !listeners[ X_Listeners_.RESERVES ] ) listeners[ X_Listeners_.RESERVES ] = [];\r
-               listeners[ X_Listeners_.RESERVES ][ listeners[ X_Listeners_.RESERVES ].length ] = [ type, opt_arg1, opt_arg2, opt_arg3, X_EventDispatcher_once, X_EventDispatcher_lock ];\r
+       if( listeners && listeners[ X_LISTENERS_DISPATCHING ] ){\r
+               if( !listeners[ X_LISTENERS_RESERVES ] ) listeners[ X_LISTENERS_RESERVES ] = [];\r
+               listeners[ X_LISTENERS_RESERVES ][ listeners[ X_LISTENERS_RESERVES ].length ] = [ type, opt_arg1, opt_arg2, opt_arg3, X_EventDispatcher_once, X_EventDispatcher_lock ];\r
                return this;\r
        };\r
        \r
@@ -458,12 +455,12 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){
                return this;\r
        };\r
 \r
-       if( reserves = listeners[ X_Listeners_.RESERVES ] ){\r
+       if( reserves = listeners[ X_LISTENERS_RESERVES ] ){\r
                for( i = reserves.length; i; ){\r
                        f = reserves[ --i ];\r
                        if( f[ 0 ] === opt_type && f[ 1 ] === opt_arg1 && f[ 2 ] === opt_arg2 && f[ 3 ] === opt_arg3 && ( !f[ 5 ] || X_EventDispatcher_unlock ) ){\r
                                reserves.splice( i, 1 );\r
-                               if( !reserves.legth ) delete listeners[ X_Listeners_.RESERVES ];\r
+                               if( !reserves.legth ) delete listeners[ X_LISTENERS_RESERVES ];\r
                                return this;\r
                        };\r
                };\r
@@ -476,11 +473,11 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){
 \r
        f = ( list = listeners[ opt_type ] )[ i ];\r
        \r
-       if( unlistens = listeners[ X_Listeners_.UNLISTENS ] ){\r
+       if( unlistens = listeners[ X_LISTENERS_UNLISTENS ] ){\r
                // _unlistens に入っている callbackHash は、lock のチェックは済んでいる\r
                ( unlistens = unlistens[ opt_type ] ) ?\r
                        ( unlistens[ unlistens.length ] = f ) :\r
-                       ( listeners[ X_Listeners_.UNLISTENS ][ opt_type ] = [ f ] );\r
+                       ( listeners[ X_LISTENERS_UNLISTENS ][ opt_type ] = [ f ] );\r
        } else {\r
                delete f.once;\r
                list.splice( i, 1 );\r
@@ -491,11 +488,11 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){
                        // TODO カウンター\r
                        empty = true;\r
                        for( k in listeners ){\r
-                               if( k <= X_Listeners_.KILL_RESERVED ) continue;\r
+                               if( k <= X_LISTENERS_KILL_RESERVED ) continue;\r
                                empty = false;\r
                                break;\r
                        };\r
-                       if( raw && !X_String_isNumberString( opt_type ) ){ // 数字イベントの除外\r
+                       if( raw && !X_String_isNumberString( '' + opt_type ) ){ // 数字イベントの除外\r
                                X_EventDispatcher_removeEvent( this, opt_type, raw, list, !empty );\r
                        };\r
                        if( empty ) delete this[ '_listeners' ];\r
@@ -520,7 +517,7 @@ function X_EventDispatcher_unlistenAll( that ){
        \r
        for( type in listeners ){\r
                //if( X_EMPTY_OBJECT[ opt_type ] ) continue;\r
-               if( type <= X_Listeners_.KILL_RESERVED ) continue;\r
+               if( type <= X_LISTENERS_KILL_RESERVED ) continue;\r
                list = listeners[ type ];\r
                for( i = list.length; i; ){\r
                        that[ 'unlisten' ]( type, list[ --i ] );\r
@@ -529,7 +526,7 @@ function X_EventDispatcher_unlistenAll( that ){
 };\r
 \r
 function X_EventDispatcher_addEvent( that, type, raw, list ){\r
-       var i;\r
+       var i, f;\r
        X_EventDispatcher_lock || ( type = X_Event_Rename[ type ] || type );\r
        \r
        if( X_Type_isArray( type ) ){\r
@@ -538,24 +535,19 @@ function X_EventDispatcher_addEvent( that, type, raw, list ){
                        console.log( 'events fix > ' + type[ i ] );\r
                };\r
        } else {\r
-               X_EventDispatcher_actualAddEvent( that, type, raw, list );\r
-       };\r
-};\r
-\r
-var X_EventDispatcher_actualAddEvent =\r
+               \r
        // Days on the Moon DOM Events とブラウザの実装 \r
        // http://nanto.asablo.jp/blog/2007/03/23/1339502\r
        // Safari 2 では関数オブジェクトしか EventListener として使えませんが、Safari のナイトリービルドでは handleEvent メソッドを持つオブジェクトも EventListener として使えるようです。\r
-       X_UA_EVENT.W3C ?\r
-               (function( that, type, raw, list ){\r
-                       var f;\r
+               \r
+               if( X_UA_EVENT.W3C ){\r
                        switch( that[ '_rawType' ] ){\r
-                               case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+                               case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
                                        list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
-                                       list.sltoken    = raw.AddEventListener( type, list.slcallback );\r
+                                       list.sltoken    = raw[ 'AddEventListener' ]( type, list.slcallback );\r
                                        break;\r
                                \r
-                               case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+                               case X_EventDispatcher_EVENT_TARGET_XHR :\r
                                        if( X_UA[ 'Opera' ] < 12 ){\r
                                                // Opera11- の XHR は event オブジェクトが返らないため, eventType 毎に callback を指定する addEventListener もない\r
                                                raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
@@ -572,7 +564,7 @@ var X_EventDispatcher_actualAddEvent =
                                                  type === 'animationiteration'  || type === 'webkitAnimationIteration' ) ){\r
                                                raw.addEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
                                        } else {\r
-                                               f = that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ] || ( that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ] = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
+                                               f = that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] || ( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
                \r
                                                if( raw.addEventListener ){\r
                                                        raw.addEventListener( type, f, false );\r
@@ -582,23 +574,22 @@ var X_EventDispatcher_actualAddEvent =
                                                };\r
                                        };\r
                        };\r
-               }) :\r
-       X_UA_EVENT.IE ?\r
-               (function( that, type, raw, list ){\r
-                       var f;\r
+               } else\r
+               if( X_UA_EVENT.IE ){\r
                        switch( that[ '_rawType' ] ){   \r
-                               case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+                               case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
                                        list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
-                                       list.sltoken    = raw.AddEventListener( type, list.slcallback );\r
+                                       list.sltoken    = raw[ 'AddEventListener' ]( type, list.slcallback );\r
                                        break;                          \r
                                \r
-                               case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+                               case X_EventDispatcher_EVENT_TARGET_XHR :\r
+                                       console.log( 'XHR addEvent ' + type );\r
                                        // ie8- の XHR は window.event が更新されないため, eventType 毎に callback を指定する\r
                                        raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
                                        break;\r
                                \r
                                default :\r
-                                       f = that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ] || ( that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ] = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
+                                       f = that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] || ( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
                                        \r
                                        if( raw.attachEvent ){\r
                                                raw.attachEvent( 'on' + type, f );\r
@@ -607,29 +598,31 @@ var X_EventDispatcher_actualAddEvent =
                                        };\r
                                        break;\r
                        };\r
-               }) :\r
-               (function( that, type, raw, list ){\r
+               } else {\r
                        switch( that[ '_rawType' ] ){\r
-                               case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
+                               case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
                                        // DOM0 で Silverlight ってあるの -> ie4 mobile?\r
                                        list.slcallback = X_Callback_create( that, X_EventDispatcher_sliverLightDispatch, [ type ] );\r
-                                       list.sltoken    = raw.AddEventListener( type, list.slcallback );\r
+                                       list.sltoken    = raw[ 'AddEventListener' ]( type, list.slcallback );\r
                                        break;                          \r
                                \r
-                               case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+                               case X_EventDispatcher_EVENT_TARGET_XHR :\r
                                        // ie4 mobile は XHR をサポート!\r
                                        raw[ 'on' + type ] = X_Callback_create( that, X_EventDispatcher_dispatch, [ type ] );\r
                                        break;\r
 \r
                                default :\r
-                                       raw[ 'on' + type ] = that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ] || ( that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ] = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
+                                       raw[ 'on' + type ] = that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] || ( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] = X_Callback_create( that, X_EventDispatcher_actualHandleEvent ) );\r
                                        break;\r
                        };\r
-               });\r
+               }\r
+       };\r
+};\r
+\r
 \r
 /*\r
  * iOS の webkitTransitionEnd が連続して起こる場合、\r
- * コールバックの(that[ X_Listeners_.ACTUAL_HANDLER ])クロージャ内の実際のコールバック(X_Callback_actualClosure:obj._)が\r
+ * コールバックの(that[ X_LISTENERS_ACTUAL_HANDLER ])クロージャ内の実際のコールバック(X_Callback_actualClosure:obj._)が\r
  * 参照できていない問題に遭遇、、、iOS3.1.3 & iOS6.1.5 で確認\r
  * animation も怪しい、、、\r
  */\r
@@ -654,22 +647,16 @@ function X_EventDispatcher_removeEvent( that, type, raw, list, skip ){
                        X_EventDispatcher_systemUnlisten( that, type[ --i ], X_emptyFunction );\r
                };\r
        } else {\r
-               X_EventDispatcher_actualRemoveEvent( that, type, raw, list, skip );\r
-       };\r
-};\r
-\r
-var X_EventDispatcher_actualRemoveEvent =\r
-       X_UA_EVENT.W3C ?\r
-               (function( that, type, raw, list, skip ){\r
+               if( X_UA_EVENT.W3C ){\r
                        switch( that[ '_rawType' ] ){\r
-                               case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
-                                       raw.RemoveEventListener( type, list.sltoken ); // token\r
+                               case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
+                                       raw[ 'RemoveEventListener' ]( type, list.sltoken ); // token\r
                                        X_Callback_correct( list.slcallback );\r
                                        delete list.sltoken;\r
                                        delete list.slcallback;\r
                                        break;\r
                                \r
-                               case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+                               case X_EventDispatcher_EVENT_TARGET_XHR :\r
                                        if( X_UA[ 'Opera' ] < 12 ){\r
                                                // Opera11- の XHR は event オブジェクトが返らないため, eventType 毎に callback を指定する addEventListener もない\r
                                                X_Callback_correct( raw[ 'on' + type ] );\r
@@ -686,57 +673,56 @@ var X_EventDispatcher_actualRemoveEvent =
                                                raw.removeEventListener( type, X_EventDispatcher_iOSTransitionEndDispatch, false );\r
                                        } else                  \r
                                        if( raw.addEventListener ){\r
-                                               raw.removeEventListener( type, that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ], false );\r
+                                               raw.removeEventListener( type, that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ], false );\r
                                        } else {\r
                                                raw[ 'on' + type ] = null;\r
                                        };\r
                                        \r
-                                       if( !skip && that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ] ){\r
-                                               X_Callback_correct( that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ] );\r
-                                               delete that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ];\r
+                                       if( !skip && that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] ){\r
+                                               X_Callback_correct( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] );\r
+                                               delete that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ];\r
                                        };\r
                        };\r
-               }) :\r
-       X_UA_EVENT.IE ?\r
-               (function( that, type, raw, list, skip ){\r
+               } else\r
+               if( X_UA_EVENT.IE ){\r
                        switch( that[ '_rawType' ] ){\r
-                               case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
-                                       raw.RemoveEventListener( type, list.sltoken ); // token\r
+                               case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
+                                       raw[ 'RemoveEventListener' ]( type, list.sltoken ); // token\r
                                        X_Callback_correct( list.slcallback );\r
                                        delete list.sltoken;\r
                                        delete list.slcallback;\r
                                        break;\r
                                \r
-                               case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+                               case X_EventDispatcher_EVENT_TARGET_XHR :\r
                                        X_Callback_correct( raw[ 'on' + type ] );\r
                                        raw[ 'on' + type ] = X_emptyFunction;\r
                                        raw[ 'on' + type ] = '';\r
+                                       console.log( 'XHR rmEvent ' + type );\r
                                        break;\r
 \r
                                default :\r
                                        if( raw.attachEvent ){\r
-                                               raw.detachEvent( 'on' + type, that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ] );\r
+                                               raw.detachEvent( 'on' + type, that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] );\r
                                        } else {\r
                                                raw[ 'on' + type ] = X_emptyFunction;\r
                                                raw[ 'on' + type ] = '';\r
                                        };\r
                                        \r
                                        if( !skip ){\r
-                                               X_Callback_correct( that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ] );\r
-                                               delete that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ];\r
+                                               X_Callback_correct( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] );\r
+                                               delete that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ];\r
                                        };\r
                        };\r
-               }) :\r
-               (function( that, type, raw, list, skip ){\r
+               } else {\r
                        switch( that[ '_rawType' ] ){\r
-                               case X_EventDispatcher_EVENT_TARGET_TYPE.SILVER_LIGHT :\r
-                                       raw.RemoveEventListener( type, list.sltoken ); // token\r
+                               case X_EventDispatcher_EVENT_TARGET_SILVER_LIGHT :\r
+                                       raw[ 'RemoveEventListener' ]( type, list.sltoken ); // token\r
                                        X_Callback_correct( list.slcallback );\r
                                        delete list.sltoken;\r
                                        delete list.slcallback;\r
                                        break;\r
                                \r
-                               case X_EventDispatcher_EVENT_TARGET_TYPE.XHR :\r
+                               case X_EventDispatcher_EVENT_TARGET_XHR :\r
                                        X_Callback_correct( raw[ 'on' + type ] );\r
                                        raw[ 'on' + type ] = X_emptyFunction;\r
                                        raw[ 'on' + type ] = '';\r
@@ -747,11 +733,13 @@ var X_EventDispatcher_actualRemoveEvent =
                                        raw[ 'on' + type ] = '';\r
                                        \r
                                        if( !skip ){\r
-                                               X_Callback_correct( that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ] );\r
-                                               delete that[ '_listeners' ][ X_Listeners_.ACTUAL_HANDLER ];\r
+                                               X_Callback_correct( that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ] );\r
+                                               delete that[ '_listeners' ][ X_LISTENERS_ACTUAL_HANDLER ];\r
                                        };\r
                        };\r
-               });\r
+               };\r
+       };\r
+};\r
 \r
 \r
 // TODO ブラウザからの呼び出しの最後に登録された関数を呼び出す機能(例えば画面の更新)\r
@@ -762,16 +750,16 @@ var X_EventDispatcher_actualRemoveEvent =
 var X_EventDispatcher_actualHandleEvent =\r
        X_UA_EVENT.IE4 || X_UA_EVENT.IE ? // ie45678 EVENT_IE & EVENT_DOM0 for ie4\r
                (function(){\r
-                       var ret;\r
+                       var e = event, ret;\r
                        \r
-                       ret = this[ 'dispatch' ]( new X_DomEvent( event, this, this[ '_rawObject' ] ) );\r
+                       ret = this[ 'dispatch' ]( new X_DomEvent( e, this, this[ '_rawObject' ] ) );\r
 \r
                        if( ret & X_Callback_STOP_PROPAGATION ){\r
-                               event.cancelBubble = true;\r
+                               e.cancelBubble = true;\r
                        };\r
                        if( ret & X_Callback_PREVENT_DEFAULT ){\r
                                this[ '_tag' ] === 'A' && this[ '_rawObject' ].blur();\r
-                               return event.returnValue = false;\r
+                               return e.returnValue = false;\r
                        };\r
                }) :\r
        //X_UA_EVENT.W3C || X_UA_EVENT.DOM0\r
@@ -831,7 +819,7 @@ function X_EventDispatcher_toggleAllEvents( that, add ){
        if( !list || !raw ) return;\r
        for( type in list ){\r
                //if( X_EMPTY_OBJECT[ type ] ) continue;\r
-               //if( type <= X_Listeners_.KILL_RESERVED ) continue;\r
+               //if( type <= X_LISTENERS_KILL_RESERVED ) continue;\r
                // 数字イベントの除外\r
                if( !X_String_isNumberString( type ) ){\r
                        // TODO type rename はここ\r