+function X_Timer_onTimeout(){\r
+ var next = X_Timer_next,\r
+ list = X_Timer_TICKET_LIST,\r
+ i = 0,\r
+ l = list.length,\r
+ limit = X.getTime() + X_Timer_INTERVAL_TIME / 2,\r
+ heavy,\r
+ q, f, c, r, uid;\r
+ \r
+ if( X_Timer_busyTimeout ){\r
+ alert( 'busy!' );\r
+ };\r
+ \r
+ X_Timer_busyTimeout = true;\r
+ \r
+ for( ; i < l; ++i ){\r
+ q = list[ i ];\r
+ if( X_Timer_removal && X_Timer_removal[ q.uid ] ) continue;\r
+ if( 0 < ( q.last -= next ) ) continue;\r
+ if( heavy ){\r
+ if( q.last <= 0 ) q.last = 1;\r
+ continue;\r
+ };\r
+ c = q.count;\r
+ \r
+ if( q.k ){\r
+ q.a = [];\r
+ r = X.Callback._proxyCallback( q );\r
+ } else {\r
+ r = q.f();\r
+ };\r
+ \r
+ //console.log( 'fire....' );\r
+ \r
+ if( limit <= X.getTime() ){\r
+ console.log( '******* heavy!' );\r
+ // 関数の実行に時間がかかる場合、次のタイミングに\r
+ heavy = true;\r
+ };\r
+ \r
+ if( r & X.Callback.UN_LISTEN || c === 1 ){\r
+ list.splice( i, 1 );\r
+ --i;\r
+ --l;\r
+ continue;\r
+ } else\r
+ if( 1 < c ) --q.count;\r
+ q.last = q.time;\r
+ };\r
+ X_Timer_timerId = 0;\r
+ X_Timer_busyTimeout = false;\r
+ if( X_Timer_removal ){\r
+ for( uid in X_Timer_removal ){\r
+ X.Timer.remove( X_Timer_removal[ uid ] );\r
+ };\r
+ X_Timer_removal = null;\r
+ };\r
+ X_Timer_update();\r
+};\r
+\r
+function X_Timer_update(){\r
+ var list = X_Timer_TICKET_LIST,\r
+ i = list.length,\r
+ n;\r
+ if( i === 0 ){\r
+ X_Timer_timerId && X_Timer_CLEAR_TIMEOUT( X_Timer_timerId );\r
+ X_Timer_timerId = 0;\r
+ return;\r
+ };\r
+ \r
+ 1 < i && list.sort( X_Timer_compareQueue );\r
+ \r
+ n = list[ i - 1 ].last;\r
+ \r
+ if( n < X_Timer_next || X_Timer_timerId === 0 ){\r
+ X_Timer_timerId && X_Timer_CLEAR_TIMEOUT( X_Timer_timerId );\r
+ X_Timer_timerId = X_Timer_SET_TIMEOUT( X_Timer_onTimeout, X_Timer_INTERVAL_TIME * n );\r
+ X_Timer_endTime = X.getTime() + X_Timer_INTERVAL_TIME * n; // iOS\r
+ X_Timer_next = n;\r
+ };\r
+};\r