+var VisualEffect = ( function(){\r
+ \r
+ var ANIMATION_TICKET_ARRAY = [],\r
+ fpms = 50,\r
+ TIMER = null,\r
+ FILTER = 'filter',\r
+ OPACITY = 'opacity',\r
+ REG_ALPHA = /alpha\([^)]*\)/i,\r
+ CORON = ':',\r
+ EMPTY = '',\r
+ SEMICORON = ';';\r
+ \r
+ function startAnimation( _elm, _cssObject, _onComplete, _onEnterFrame, _numFrames){\r
+ var _ticket;\r
+ for( var i=0, l=ANIMATION_TICKET_ARRAY.length; i<l; ++i){\r
+ _ticket = ANIMATION_TICKET_ARRAY[ i];\r
+ if( _ticket.elm === _elm) {\r
+ _ticket.destroy();\r
+ break;\r
+ }\r
+ }\r
+ // coputedStyle と _cssObject を比較して , 一致及び非数は削除しつつ コピー\r
+ // filter opacity の追加 REG_ALPHA.test( _value ) ? _value.replace( REG_ALPHA, opacity ) : _value + " " + opacity\r
+ /*\r
+ * cssObject をまわす\r
+ * 非数は削除\r
+ * cssText と一致も削除\r
+ * coputedStyle と一致も削除\r
+ * updateTraget ととして記録\r
+ * 初期値を cssObject としてセット\r
+ * cssTest にセット zoom もセット\r
+ */\r
+ \r
+ //\r
+ /*\r
+ var style = elem.style,\r
+ currentStyle = elem.currentStyle,\r
+ opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",\r
+ filter = currentStyle && currentStyle.filter || style.filter || "";\r
+\r
+ // IE has trouble with opacity if it does not have layout\r
+ // Force it by setting the zoom level\r
+ style.zoom = 1;\r
+ */\r
+ \r
+ var _currentParameters = [],\r
+ _offsetParameters = [],\r
+ _endParameters = [],\r
+ _targetAttributes = [];\r
+ \r
+ ANIMATION_TICKET_ARRAY.push( new AnimationTaskClass(\r
+ _elm,\r
+ _currentParameters, _offsetParameters, _endParameters, _targetAttributes,\r
+ typeof _onComplete === 'function' ? _onComplete : null,\r
+ typeof _onEnterFrame === 'function' ? _onEnterFrame : null,\r
+ _numFrames\r
+ ));\r
+ \r
+ if( TIMER === null){\r
+ TIMER = window.setInterval( onEnterFrame, fpms);\r
+ }\r
+ }\r
+ function onEnterFrame(){\r
+ var _ticket,\r
+ i = 0;\r
+ while( i<ANIMATION_TICKET_ARRAY.length){\r
+ _ticket = ANIMATION_TICKET_ARRAY[ i];\r
+ if( _ticket.onEnterFrame() === true){\r
+ _ticket.destroy();\r
+ ANIMATION_TICKET_ARRAY.splice( i, 1);\r
+ } else {\r
+ ++i;\r
+ }\r
+ }\r
+ if( ANIMATION_TICKET_ARRAY.length === 0){\r
+ window.clearInterval( TIMER);\r
+ TIMER = null;\r
+ }\r
+ }\r
+ function updateCss( _elm, _updateParameters, _targetAttributes, _numAttributes){\r
+ if( _numAttributes > 1){\r
+ var _cssTexts = _elm.style.cssText.split( ';'), _css,\r
+ _separate,\r
+ _cssObject = {}, _target, _value, _number, _px,\r
+ j;\r
+ for(var i=0, l=_cssTexts.length; i<l; ++i){\r
+ _css = _cssTexts[ i];\r
+ _separate = _css.indexOf( ':');\r
+ if( _separate >= 3){\r
+ _target = _css.substr( 0, _separate +1);\r
+ _value = _css.substr( _separate +1);\r
+ /*\r
+ * ie filter\r
+ */\r
+ if( _target === FILTER){\r
+ for( j=0; j<_numAttributes; ++j){\r
+ if( _targetAttributes[ j] === OPACITY){\r
+ _cssTexts[ i] = [\r
+ _target, ':',\r
+ _value.replace( REG_ALPHA, "alpha(opacity=" + _updateParameters[ j] * 100 + ")")\r
+ ].join( '');\r
+ break;\r
+ }\r
+ }\r
+ /*\r
+ * other\r
+ */\r
+ } else {\r
+ _number = '' + parseFloat( _value);\r
+ _px = _value.indexOf( _number);\r
+ _px = _px > 0 ? _value.substr( _px + _number.length) : '';\r
+ for( j=0; j<_numAttributes; ++j){\r
+ if( _targetAttributes[ j] === _target){\r
+ _cssTexts[ i] = [ _target, ':', _updateParameters[ j], _px].join( '');\r
+ break;\r
+ }\r
+ } \r
+ }\r
+ }\r
+ }\r
+ _elm.style.cssText = _cssTexts.join( ';');\r
+ return; \r
+ }\r
+ /*\r
+ * 一度に update する Attributes が少ない場合、cssText は使用しない.\r
+ */\r
+ }\r
+ \r
+ var AnimationTaskClass = function( ELM, currentParameters, offsetParameters, endParameters, targetAttributes, onComplete, onEnterFrame, numFrames){\r
+ var l = targetAttributes.length;\r
+ return {\r
+ elm: ELM,\r
+ onEnterFrame: function(){\r
+ var _updateCss = {}, i;\r
+ if( numFrames === 1){\r
+ for( i=0; i<l; ++i){\r
+ _updateCss[ targetAttributes[ i]] = endParameters[ i];\r
+ ++i;\r
+ }\r
+ updateCss( ELM, currentParameters, targetAttributes, l);\r
+ onComplete !== null && onComplete();\r
+ } else {\r
+ for( i=0; i<l; ++i){\r
+ _updateCss[ targetAttributes[ i]] = currentParameters[ i] = Math.floor( currentParameters[ i] + offsetParameters[ i]);\r
+ ++i;\r
+ }\r
+ updateCss( ELM, currentParameters, targetAttributes, l);\r
+ onEnterFrame !== null && onEnterFrame( _updateCss);\r
+ }\r
+ --numFrames;\r
+ return numFrames === 0;\r
+ },\r
+ destroy: function(){\r
+ ELM = onComplete = onEnterFrame = null;\r
+ }\r
+ }\r
+ }\r
+ \r
+ var VisualEffectClass = function( ELM){\r
+ var isHtmlElement;\r
+ \r
+ function registerAnime( _cssObject, _onComplete, _onEnterFrame, _time){\r
+ var _numFrames = Math.floor( _time / fpms);\r
+ startAnimation( ELM, _cssObject, _onComplete, _onEnterFrame, _numFrames);\r
+ }\r
+ function startFadeIn(){\r
+ \r
+ }\r
+ function startFadeOut(){\r
+ \r
+ }\r
+ function update( _x, _y, _w, _h){\r
+ var _cssText = ELM.style.cssText;\r
+ \r
+ }\r
+ \r
+ this.anime = registerAnime;\r
+ this.fadeIn = startFadeIn;\r
+ this.fadeOut = startFadeOut;\r
+ this.update = update;\r
+ }\r
+ \r
+ return {\r
+ createVisualEffect: function( _elm){\r
+ return new VisualEffectClass( _elm);\r
+ },\r
+ isInstanceOfVisualEffect: function( _instance){\r
+ return _instance instanceof VisualEffectClass;\r
+ }\r
+ }\r
+})();\r