+ /**\r
+ * タイマーをセットします。\r
+ * @alias X.Timer.add\r
+ * @param {number} time ミリ秒\r
+ * @param {number} opt_count 回数。省略可能。指定回数で自動でタイマーを破棄します。0 を指定した場合無限にタイマーが呼ばれます。省略した場合 0 と同じです。\r
+ * @param {*} args1 コールバックのための最大で 3 つの引数を指定します。参考:__CallbackHash__\r
+ * @param {*} args2\r
+ * @param {*} args3\r
+ * @return {number} タイマーID。1 以上の数値。タイマーの解除に使用。\r
+ * @example timerID = X.Timer.add( 1000, 5, thisContext, onTimer );\r
+ */\r
+ function X_Timer_add( time, opt_count, args1, args2, args3 ){\r
+ var list = X_Timer_TICKET_LIST,\r
+ hash, obj;\r
+ time = time < X_Timer_INTERVAL_TIME ? 1 : time / X_Timer_INTERVAL_TIME | 0; // 正の数で使える「Math.floor(x)」を「(x | 0)」に;\r
+ \r
+ if( !X_Type_isNumber( opt_count ) ){\r
+ args3 = args2;\r
+ args2 = args1;\r
+ args1 = opt_count;\r
+ opt_count = 0;\r
+ };\r
+ \r
+ hash = X_Callback_classifyCallbackArgs( args1, args2, args3 );\r
+ if( !hash ) return -1; // dev only\r
+ \r
+ if( !hash.kind ) hash = { func : hash };\r
+ hash.time = time;\r
+ hash.last = time;\r
+ hash.count = opt_count;\r
+ hash.uid = ++X_Timer_uid;\r
+ list[ list.length ] = hash;\r
+ \r
+ !X_Timer_busyTimeout && X_Timer_update();\r
+ return X_Timer_uid;\r
+ };\r
+ \r
+ /**\r
+ * 1 回呼ばれたら解除されるタイマーをセットします。\r
+ * @alias X.Timer.once\r
+ * @param {number} time ミリ秒\r
+ * @param {*} args1 コールバックのための最大で 3 つの引数を指定します。参考:__CallbackHash__\r
+ * @param {*} args2\r
+ * @param {*} args3\r
+ * @return {number} タイマーID。1 以上の数値。タイマーの解除に使用。\r
+ */\r
+ function X_Timer_once( time, args1, args2, args3 ){\r
+ return X_Timer_add( time, 1, args1, args2, args3 );\r
+ };\r
+ \r
+ /**\r
+ * タイマーを解除します。登録時に受け取ったタイマーIDを使用します。\r
+ * @alias X.Timer.remove\r
+ * @param {number} タイマーID\r
+ * @return {number} 0 が返る\r
+ * @example if( timerID ) timerID = X.Timer.remove( timerID );\r
+ */\r
+ function X_Timer_remove( uid ){\r
+ var list = X_Timer_TICKET_LIST,\r
+ i = list.length,\r
+ l = i,\r
+ f, q, eventDispatcher, lazy, listeners;\r
+ \r
+ if( X_Timer_busyTimeout ){\r
+ // fire 中の cancel\r
+ if( !X_Timer_removal ) X_Timer_removal = {};\r
+ X_Timer_removal[ uid ] = true;\r
+ } else {\r
+ for( ; i; ){\r
+ if( ( q = list[ --i ] ).uid === uid ){\r
+ list.splice( i, 1 );\r
+ \r
+ /*\r
+ * lazyDispatch 中の EventDispatcher の有無を調べる\r
+ */\r
+ if( X_EventDispatcher_LAZY_TIMERS[ uid ] ){\r
+ delete X_EventDispatcher_LAZY_TIMERS[ uid ];\r
+ };\r
+ \r
+ !X_Timer_skipUpdate && ( q.last <= X_Timer_waitTime || l === 1 ) && X_Timer_update();\r
+ break;\r
+ };\r
+ }; \r
+ };\r
+ return 0;\r
+ };\r
+\r
+if( X_UA[ 'IE4' ] || X_UA[ 'MacIE' ] ){\r