+function X_Callback_handleSystemEvent( e ){\r
+ switch( e ){\r
+ case '':\r
+ };\r
+};\r
+\r
+function X_Callback_create( thisObject, opt_callback, opt_args /* [ listener || ( context + function ) || function ][ args... ] */ ){\r
+ var obj = X_Callback_classifyCallbackArgs( thisObject, opt_callback, opt_args ),\r
+ l, ret, _obj;\r
+ if( !obj.k ) return obj;\r
+ if( l = X_Callback_POOL_LIST.length ){\r
+ ret = X_Callback_POOL_LIST[ l - 1 ]; --X_Callback_POOL_LIST.length; // ret = X_Callback_POOL_LIST.pop();\r
+ _obj = ret( X_Closure_COMMAND_BACK );\r
+ _obj.k = obj.k;\r
+ _obj.f = obj.f;\r
+ _obj.x = obj.x;\r
+ _obj.s = obj.s;\r
+ } else {\r
+ ret = X_Closure_actualClosure( obj );\r
+ ret.kill = X_Callback_kill;\r
+ ret.same = X_Callback_same;\r
+ };\r
+ X_Callback_LIVE_LIST[ X_Callback_LIVE_LIST.length ] = ret;\r
+ return ret; \r
+};\r
+\r
+function X_Closure_actualClosure( obj ){\r
+ return function(){\r
+ if( arguments[ 0 ] === X_Closure_COMMAND_BACK ) return obj;\r
+ if( arguments[ 0 ] !== X_Closure_COMMAND_DROP ) return X_Callback_proxyCallback( obj, arguments );\r
+ };\r
+};\r
+\r
+function X_Callback_classifyCallbackArgs( arg1, arg2, arg3, alt_context ){\r
+ var obj;\r
+ \r
+ if( arg1 && X.Type.isFunction( arg2 ) ){\r
+ obj = { x : arg1, f : arg2, k : X_Callback_THIS_FUNC };\r
+ } else\r
+ if( arg1 && X.Type.isFunction( arg1[ 'handleEvent' ] ) ){\r
+ obj = { x : arg1, k : X_Callback_HANDLEEVENT };\r
+ arg3 = arg2;\r
+ } else\r
+ if( X.Type.isFunction( arg1 ) ){\r
+ arg3 = arg2;\r
+ if( alt_context ){\r
+ obj = { x : alt_context, f : arg1, k : X_Callback_THIS_FUNC };\r
+ } else {\r
+ obj = { f : arg1, k : X_Callback_FUNC_ONLY };\r
+ };\r
+ } else\r
+ if( X.Type.isFunction( arg2 ) ){\r
+ //console.log( 'X_Callback_classifyCallbackArgs : arg1 が ' + arg1 + 'です' ); ie4 で error\r
+ if( alt_context ){\r
+ obj = { x : alt_context, f : arg2, k : X_Callback_THIS_FUNC };\r
+ } else {\r
+ obj = { f : arg2, k : X_Callback_FUNC_ONLY };\r
+ };\r
+ } else\r
+ if( alt_context ){\r
+ obj = { x : alt_context, k : X_Callback_HANDLEEVENT };\r
+ arg3 = arg1;\r
+ } else {\r
+ console.log( '不正 ' + arg1 );\r
+ console.dir( arg1 );\r
+ return;\r
+ };\r
+ \r
+ if( X.Type.isArray( arg3 )){\r
+ obj.s = arg3;\r
+ };\r
+ return ( obj.x || obj.s ) ? obj : arg1;\r
+};\r
+\r
+function X_Callback_proxyCallback( xfunc, _args ){\r
+ var args = _args || [],\r
+ thisObj = xfunc.x,\r
+ func = xfunc.f,\r
+ supp = xfunc.s,\r
+ temp, ret; \r
+ \r
+ if( supp && supp.length ){\r
+ temp = [];\r
+ args.length &&\r
+ (\r
+ args.length === 1 ?\r
+ ( temp[ 0 ] = args[ 0 ] ) :\r
+ temp.push.apply( temp, args )\r
+ );\r
+ supp.length === 1 ?\r
+ ( temp[ temp.length ] = supp[ 0 ] ) :\r
+ temp.push.apply( temp, supp );\r
+ args = temp;\r
+ };\r
+ \r
+ switch( xfunc.k ){\r
+\r
+ case X_Callback_THIS_FUNC :\r
+ return args.length === 0 ? func.call( thisObj ) : func.apply( thisObj, args );\r
+ \r
+ case X_Callback_HANDLEEVENT :\r
+ temp = thisObj[ 'handleEvent' ];\r
+ if( X.Type.isFunction( temp ) ){\r
+ return args.length === 0 ? thisObj[ 'handleEvent' ]() :\r
+ args.length === 1 ? thisObj[ 'handleEvent' ]( args[ 0 ] ) : temp.apply( thisObj, args );\r
+ };\r
+ break;\r
+ /*\r
+ if( temp !== func && X.Type.isFunction( temp ) ){\r
+ return args.length === 0 ? thisObj[ 'handleEvent' ]() : temp.apply( thisObj, args );\r
+ } else\r
+ if( X.Type.isFunction( thisObj ) ){\r
+ return args.length === 0 ? thisObj.call( thisObj ) : thisObj.apply( thisObj, args );\r
+ };\r
+ return args.length === 0 ? func.call( thisObj ) : func.apply( thisObj, args );*/\r
+ \r
+ case X_Callback_FUNC_ONLY :\r
+ return args.length === 0 ?\r
+ func() :\r
+ args.length === 1 ?\r
+ func( args[ 0 ] ) :\r
+ func.apply( null, args );\r
+ };\r
+ return X_Callback_NONE;\r
+};\r
+\r
+function X_Callback_same( arg1, arg2, arg3 ){\r
+ var hash;\r
+ \r
+ if( arg1 && arg1[ 'kill' ] === X_Callback_kill ) return this === arg1;\r
+ \r
+ hash = X_Callback_classifyCallbackArgs( arg1, arg2, arg3 );\r
+ \r
+ return hash && this.k === hash.k && this.x === hash.x && this.f === hash.f && this.s === hash.s;\r
+};\r
+\r
+function X_Callback_kill(){\r
+ X_Callback_correct( this );\r
+};\r
+\r
+function X_Callback_correct( f ){\r
+ var i = X_Callback_LIVE_LIST.indexOf( f ),\r
+ obj;\r
+ if( i !== -1 ){\r
+ X_Callback_LIVE_LIST.splice( i, 1 );\r
+ X_Callback_POOL_LIST[ X_Callback_POOL_LIST.length ] = f;\r
+ obj = f( X_Closure_COMMAND_BACK );\r
+ delete obj.k;\r
+ if( obj.f ) delete obj.f;\r
+ if( obj.x ) delete obj.x;\r
+ if( obj.s ) delete obj.s;\r
+ return true;\r
+ };\r
+ return false;\r
+};\r