+ * 登録されたイベントリスナを呼び出す。イベントリスナの返り値(数値)を OR したものを返す。イベントハッシュでなく、string|number を渡すと内部でイベントハッシュを作る\r
+ * @this {X.EventDispatcher}\r
+ * @return {number} X.Callback で定義された数値\r
+ * @param {(eventHash|string|number)} e\r
+ */\r
+function X_EventDispatcher_dispatch( e ){\r
+ var list = this[ '_listeners' ],\r
+ ret = X.Callback.NONE,\r
+ type = e[ 'type' ],\r
+ unlistens, i, l, f, r, sysOnly;\r
+ \r
+ if( !list || !( list = list[ type || e ] ) ) return ret;\r
+ \r
+ // 数値, 文字が渡された場合\r
+ if( !type ){\r
+ e = { type : type = e };\r
+ };\r
+ e.target = e.target || this;\r
+ \r
+ ++this._dispatching;\r
+ \r
+ // todo:\r
+ // type も保存\r
+ this._unlistens = this._unlistens || {};\r
+ unlistens = this._unlistens[ type ];\r
+ \r
+ for( i = 0; i < list.length; ++i ){\r
+ f = list[ i ];\r
+ if( !unlistens ){\r
+ unlistens = this._unlistens[ type ];\r
+ };\r
+ if( unlistens && unlistens.indexOf( f ) !== -1 ) continue;\r
+ \r
+ r = X.Callback.NONE;\r
+ if( f.k ){\r
+ f.a = [ e ];\r
+ r = X.Callback._proxyCallback( f );\r
+ } else {\r
+ r = f.call( this, e );\r
+ };\r
+ \r
+ if( f.once || r & X.Callback.UN_LISTEN ){\r
+ // dispatch 中に unlisten が作られることがある\r
+ if( !unlistens ){\r
+ unlistens = this._unlistens || ( this._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
+ sysOnly = true;\r
+ };\r
+ ret |= r;\r
+ };\r
+ \r
+ if( ( --this._dispatching ) === 0 ){\r
+ // dispatch 中に unlisten された要素の削除\r
+ unlistens = this._unlistens;\r
+ delete this._dispatching;\r
+ delete this._unlistens; \r
+ \r
+ for( type in unlistens ){\r
+ list = unlistens[ type ];\r
+ for( i = list.length; i; ){\r
+ this.unlisten( type, list[ --i ] );\r
+ };\r
+ list.length = 0;\r
+ delete unlistens[ type ];\r
+ };\r
+ \r
+ if( this._killReserved ){\r
+ this.kill();\r
+ } else\r
+ if( list = this._reserves ){\r
+ for( i = 0, l = list.length; i < l; ++i ){\r
+ f = list[ i ];\r
+ X_EventDispatcher_once = f[ 4 ];\r
+ this.listen( f[ 0 ], f[ 1 ], f[ 2 ], f[ 3 ] );\r
+ X_EventDispatcher_once = false;\r
+ f.length = 0;\r
+ };\r
+ list.length = 0;\r
+ delete this._reserves;\r
+ };\r
+ };\r
+ \r
+ return ret;\r
+};\r
+\r
+/**\r