home *** CD-ROM | disk | FTP | other *** search
/ 404 Jogos / CLJG.iso / Diversos / Beez.swf / scripts / caurina / transitions / Tweener.as < prev    next >
Encoding:
Text File  |  2008-09-03  |  35.4 KB  |  997 lines

  1. package caurina.transitions
  2. {
  3.    import flash.display.*;
  4.    import flash.events.Event;
  5.    import flash.utils.getTimer;
  6.    
  7.    public class Tweener
  8.    {
  9.       
  10.       private static var _timeScale:Number = 1;
  11.       
  12.       private static var _currentTimeFrame:Number;
  13.       
  14.       private static var _specialPropertySplitterList:Object;
  15.       
  16.       private static var _engineExists:Boolean = false;
  17.       
  18.       private static var _specialPropertyModifierList:Object;
  19.       
  20.       private static var _currentTime:Number;
  21.       
  22.       private static var _tweenList:Array;
  23.       
  24.       private static var _specialPropertyList:Object;
  25.       
  26.       private static var _transitionList:Object;
  27.       
  28.       private static var _inited:Boolean = false;
  29.       
  30.       private static var __tweener_controller__:MovieClip;
  31.        
  32.       
  33.       public function Tweener()
  34.       {
  35.          super();
  36.          trace("Tweener is a static class and should not be instantiated.");
  37.       }
  38.       
  39.       public static function registerSpecialPropertyModifier(p_name:String, p_modifyFunction:Function, p_getFunction:Function) : void
  40.       {
  41.          if(!_inited)
  42.          {
  43.             init();
  44.          }
  45.          var spm:SpecialPropertyModifier = new SpecialPropertyModifier(p_modifyFunction,p_getFunction);
  46.          _specialPropertyModifierList[p_name] = spm;
  47.       }
  48.       
  49.       public static function registerSpecialProperty(p_name:String, p_getFunction:Function, p_setFunction:Function, p_parameters:Array = null, p_preProcessFunction:Function = null) : void
  50.       {
  51.          if(!_inited)
  52.          {
  53.             init();
  54.          }
  55.          var sp:SpecialProperty = new SpecialProperty(p_getFunction,p_setFunction,p_parameters,p_preProcessFunction);
  56.          _specialPropertyList[p_name] = sp;
  57.       }
  58.       
  59.       public static function init(... rest) : void
  60.       {
  61.          _inited = true;
  62.          _transitionList = new Object();
  63.          Equations.init();
  64.          _specialPropertyList = new Object();
  65.          _specialPropertyModifierList = new Object();
  66.          _specialPropertySplitterList = new Object();
  67.       }
  68.       
  69.       private static function updateTweens() : Boolean
  70.       {
  71.          var i:int = 0;
  72.          if(_tweenList.length == 0)
  73.          {
  74.             return false;
  75.          }
  76.          for(i = 0; i < _tweenList.length; i++)
  77.          {
  78.             if(_tweenList[i] == undefined || !_tweenList[i].isPaused)
  79.             {
  80.                if(!updateTweenByIndex(i))
  81.                {
  82.                   removeTweenByIndex(i);
  83.                }
  84.                if(_tweenList[i] == null)
  85.                {
  86.                   removeTweenByIndex(i,true);
  87.                   i--;
  88.                }
  89.             }
  90.          }
  91.          return true;
  92.       }
  93.       
  94.       public static function addCaller(p_scopes:Object = null, p_parameters:Object = null) : Boolean
  95.       {
  96.          var i:Number = NaN;
  97.          var rScopes:Array = null;
  98.          var rTransition:Function = null;
  99.          var nTween:TweenListObj = null;
  100.          var myT:Number = NaN;
  101.          var trans:String = null;
  102.          if(!Boolean(p_scopes))
  103.          {
  104.             return false;
  105.          }
  106.          if(p_scopes is Array)
  107.          {
  108.             rScopes = p_scopes.concat();
  109.          }
  110.          else
  111.          {
  112.             rScopes = [p_scopes];
  113.          }
  114.          var p_obj:Object = p_parameters;
  115.          if(!_inited)
  116.          {
  117.             init();
  118.          }
  119.          if(!_engineExists || !Boolean(__tweener_controller__))
  120.          {
  121.             startEngine();
  122.          }
  123.          var rTime:Number = isNaN(p_obj.time) ? 0 : Number(p_obj.time);
  124.          var rDelay:Number = isNaN(p_obj.delay) ? 0 : Number(p_obj.delay);
  125.          if(typeof p_obj.transition == "string")
  126.          {
  127.             trans = String(p_obj.transition.toLowerCase());
  128.             rTransition = _transitionList[trans];
  129.          }
  130.          else
  131.          {
  132.             rTransition = p_obj.transition;
  133.          }
  134.          if(!Boolean(rTransition))
  135.          {
  136.             rTransition = _transitionList["easeoutexpo"];
  137.          }
  138.          for(i = 0; i < rScopes.length; i++)
  139.          {
  140.             if(p_obj.useFrames == true)
  141.             {
  142.                nTween = new TweenListObj(rScopes[i],_currentTimeFrame + rDelay / _timeScale,_currentTimeFrame + (rDelay + rTime) / _timeScale,true,rTransition,p_obj.transitionParams);
  143.             }
  144.             else
  145.             {
  146.                nTween = new TweenListObj(rScopes[i],_currentTime + rDelay * 1000 / _timeScale,_currentTime + (rDelay * 1000 + rTime * 1000) / _timeScale,false,rTransition,p_obj.transitionParams);
  147.             }
  148.             nTween.properties = null;
  149.             nTween.onStart = p_obj.onStart;
  150.             nTween.onUpdate = p_obj.onUpdate;
  151.             nTween.onComplete = p_obj.onComplete;
  152.             nTween.onOverwrite = p_obj.onOverwrite;
  153.             nTween.onStartParams = p_obj.onStartParams;
  154.             nTween.onUpdateParams = p_obj.onUpdateParams;
  155.             nTween.onCompleteParams = p_obj.onCompleteParams;
  156.             nTween.onOverwriteParams = p_obj.onOverwriteParams;
  157.             nTween.onStartScope = p_obj.onStartScope;
  158.             nTween.onUpdateScope = p_obj.onUpdateScope;
  159.             nTween.onCompleteScope = p_obj.onCompleteScope;
  160.             nTween.onOverwriteScope = p_obj.onOverwriteScope;
  161.             nTween.onErrorScope = p_obj.onErrorScope;
  162.             nTween.isCaller = true;
  163.             nTween.count = p_obj.count;
  164.             nTween.waitFrames = p_obj.waitFrames;
  165.             _tweenList.push(nTween);
  166.             if(rTime == 0 && rDelay == 0)
  167.             {
  168.                myT = _tweenList.length - 1;
  169.                updateTweenByIndex(myT);
  170.                removeTweenByIndex(myT);
  171.             }
  172.          }
  173.          return true;
  174.       }
  175.       
  176.       public static function pauseAllTweens() : Boolean
  177.       {
  178.          var i:uint = 0;
  179.          if(!Boolean(_tweenList))
  180.          {
  181.             return false;
  182.          }
  183.          var paused:Boolean = false;
  184.          for(i = 0; i < _tweenList.length; i++)
  185.          {
  186.             pauseTweenByIndex(i);
  187.             paused = true;
  188.          }
  189.          return paused;
  190.       }
  191.       
  192.       public static function removeTweens(p_scope:Object, ... args) : Boolean
  193.       {
  194.          var i:uint = 0;
  195.          var properties:Array = new Array();
  196.          for(i = 0; i < args.length; i++)
  197.          {
  198.             if(typeof args[i] == "string" && !AuxFunctions.isInArray(args[i],properties))
  199.             {
  200.                properties.push(args[i]);
  201.             }
  202.          }
  203.          return affectTweens(removeTweenByIndex,p_scope,properties);
  204.       }
  205.       
  206.       public static function splitTweens(p_tween:Number, p_properties:Array) : uint
  207.       {
  208.          var i:uint = 0;
  209.          var pName:String = null;
  210.          var found:Boolean = false;
  211.          var originalTween:TweenListObj = _tweenList[p_tween];
  212.          var newTween:TweenListObj = originalTween.clone(false);
  213.          for(i = 0; i < p_properties.length; i++)
  214.          {
  215.             pName = String(p_properties[i]);
  216.             if(Boolean(originalTween.properties[pName]))
  217.             {
  218.                originalTween.properties[pName] = undefined;
  219.                delete originalTween.properties[pName];
  220.             }
  221.          }
  222.          for(pName in newTween.properties)
  223.          {
  224.             found = false;
  225.             for(i = 0; i < p_properties.length; i++)
  226.             {
  227.                if(p_properties[i] == pName)
  228.                {
  229.                   found = true;
  230.                   break;
  231.                }
  232.             }
  233.             if(!found)
  234.             {
  235.                newTween.properties[pName] = undefined;
  236.                delete newTween.properties[pName];
  237.             }
  238.          }
  239.          _tweenList.push(newTween);
  240.          return _tweenList.length - 1;
  241.       }
  242.       
  243.       public static function updateFrame() : void
  244.       {
  245.          ++_currentTimeFrame;
  246.       }
  247.       
  248.       public static function resumeTweenByIndex(p_tween:Number) : Boolean
  249.       {
  250.          var tTweening:TweenListObj = _tweenList[p_tween];
  251.          if(tTweening == null || !tTweening.isPaused)
  252.          {
  253.             return false;
  254.          }
  255.          var cTime:Number = getCurrentTweeningTime(tTweening);
  256.          tTweening.timeStart += cTime - tTweening.timePaused;
  257.          tTweening.timeComplete += cTime - tTweening.timePaused;
  258.          tTweening.timePaused = undefined;
  259.          tTweening.isPaused = false;
  260.          return true;
  261.       }
  262.       
  263.       public static function getVersion() : String
  264.       {
  265.          return "AS3 1.31.71";
  266.       }
  267.       
  268.       public static function onEnterFrame(e:Event) : void
  269.       {
  270.          updateTime();
  271.          updateFrame();
  272.          var hasUpdated:Boolean = false;
  273.          hasUpdated = updateTweens();
  274.          if(!hasUpdated)
  275.          {
  276.             stopEngine();
  277.          }
  278.       }
  279.       
  280.       public static function updateTime() : void
  281.       {
  282.          _currentTime = getTimer();
  283.       }
  284.       
  285.       private static function updateTweenByIndex(i:Number) : Boolean
  286.       {
  287.          var cTime:Number;
  288.          var isOver:Boolean;
  289.          var tTweening:TweenListObj = null;
  290.          var mustUpdate:Boolean = false;
  291.          var nv:Number = NaN;
  292.          var t:Number = NaN;
  293.          var b:Number = NaN;
  294.          var c:Number = NaN;
  295.          var d:Number = NaN;
  296.          var pName:String = null;
  297.          var eventScope:Object = null;
  298.          var tScope:Object = null;
  299.          var tProperty:Object = null;
  300.          var pv:Number = NaN;
  301.          tTweening = _tweenList[i];
  302.          if(tTweening == null || !Boolean(tTweening.scope))
  303.          {
  304.             return false;
  305.          }
  306.          isOver = false;
  307.          cTime = getCurrentTweeningTime(tTweening);
  308.          if(cTime >= tTweening.timeStart)
  309.          {
  310.             tScope = tTweening.scope;
  311.             if(tTweening.isCaller)
  312.             {
  313.                do
  314.                {
  315.                   t = (tTweening.timeComplete - tTweening.timeStart) / tTweening.count * (tTweening.timesCalled + 1);
  316.                   b = tTweening.timeStart;
  317.                   c = tTweening.timeComplete - tTweening.timeStart;
  318.                   d = tTweening.timeComplete - tTweening.timeStart;
  319.                   nv = tTweening.transition(t,b,c,d);
  320.                   if(cTime >= nv)
  321.                   {
  322.                      if(Boolean(tTweening.onUpdate))
  323.                      {
  324.                         eventScope = Boolean(tTweening.onUpdateScope) ? tTweening.onUpdateScope : tScope;
  325.                         try
  326.                         {
  327.                            tTweening.onUpdate.apply(eventScope,tTweening.onUpdateParams);
  328.                         }
  329.                         catch(e:Error)
  330.                         {
  331.                            handleError(tTweening,e,"onUpdate");
  332.                         }
  333.                      }
  334.                      ++tTweening.timesCalled;
  335.                      if(tTweening.timesCalled >= tTweening.count)
  336.                      {
  337.                         isOver = true;
  338.                         break;
  339.                      }
  340.                      if(tTweening.waitFrames)
  341.                      {
  342.                         break;
  343.                      }
  344.                   }
  345.                }
  346.                while(cTime >= nv);
  347.                
  348.             }
  349.             else
  350.             {
  351.                mustUpdate = tTweening.skipUpdates < 1 || !tTweening.skipUpdates || tTweening.updatesSkipped >= tTweening.skipUpdates;
  352.                if(cTime >= tTweening.timeComplete)
  353.                {
  354.                   isOver = true;
  355.                   mustUpdate = true;
  356.                }
  357.                if(!tTweening.hasStarted)
  358.                {
  359.                   if(Boolean(tTweening.onStart))
  360.                   {
  361.                      eventScope = Boolean(tTweening.onStartScope) ? tTweening.onStartScope : tScope;
  362.                      try
  363.                      {
  364.                         tTweening.onStart.apply(eventScope,tTweening.onStartParams);
  365.                      }
  366.                      catch(e:Error)
  367.                      {
  368.                         handleError(tTweening,e,"onStart");
  369.                      }
  370.                   }
  371.                   for(pName in tTweening.properties)
  372.                   {
  373.                      if(tTweening.properties[pName].isSpecialProperty)
  374.                      {
  375.                         if(Boolean(_specialPropertyList[pName].preProcess))
  376.                         {
  377.                            tTweening.properties[pName].valueComplete = _specialPropertyList[pName].preProcess(tScope,_specialPropertyList[pName].parameters,tTweening.properties[pName].originalValueComplete,tTweening.properties[pName].extra);
  378.                         }
  379.                         pv = Number(_specialPropertyList[pName].getValue(tScope,_specialPropertyList[pName].parameters,tTweening.properties[pName].extra));
  380.                      }
  381.                      else
  382.                      {
  383.                         pv = Number(tScope[pName]);
  384.                      }
  385.                      tTweening.properties[pName].valueStart = isNaN(pv) ? tTweening.properties[pName].valueComplete : pv;
  386.                   }
  387.                   mustUpdate = true;
  388.                   tTweening.hasStarted = true;
  389.                }
  390.                if(mustUpdate)
  391.                {
  392.                   for(pName in tTweening.properties)
  393.                   {
  394.                      tProperty = tTweening.properties[pName];
  395.                      if(isOver)
  396.                      {
  397.                         nv = Number(tProperty.valueComplete);
  398.                      }
  399.                      else if(tProperty.hasModifier)
  400.                      {
  401.                         t = cTime - tTweening.timeStart;
  402.                         d = tTweening.timeComplete - tTweening.timeStart;
  403.                         nv = tTweening.transition(t,0,1,d,tTweening.transitionParams);
  404.                         nv = Number(tProperty.modifierFunction(tProperty.valueStart,tProperty.valueComplete,nv,tProperty.modifierParameters));
  405.                      }
  406.                      else
  407.                      {
  408.                         t = cTime - tTweening.timeStart;
  409.                         b = Number(tProperty.valueStart);
  410.                         c = tProperty.valueComplete - tProperty.valueStart;
  411.                         d = tTweening.timeComplete - tTweening.timeStart;
  412.                         nv = tTweening.transition(t,b,c,d,tTweening.transitionParams);
  413.                      }
  414.                      if(tTweening.rounded)
  415.                      {
  416.                         nv = Math.round(nv);
  417.                      }
  418.                      if(tProperty.isSpecialProperty)
  419.                      {
  420.                         _specialPropertyList[pName].setValue(tScope,nv,_specialPropertyList[pName].parameters,tTweening.properties[pName].extra);
  421.                      }
  422.                      else
  423.                      {
  424.                         tScope[pName] = nv;
  425.                      }
  426.                   }
  427.                   tTweening.updatesSkipped = 0;
  428.                   if(Boolean(tTweening.onUpdate))
  429.                   {
  430.                      eventScope = Boolean(tTweening.onUpdateScope) ? tTweening.onUpdateScope : tScope;
  431.                      try
  432.                      {
  433.                         tTweening.onUpdate.apply(eventScope,tTweening.onUpdateParams);
  434.                      }
  435.                      catch(e:Error)
  436.                      {
  437.                         handleError(tTweening,e,"onUpdate");
  438.                      }
  439.                   }
  440.                }
  441.                else
  442.                {
  443.                   ++tTweening.updatesSkipped;
  444.                }
  445.             }
  446.             if(isOver && Boolean(tTweening.onComplete))
  447.             {
  448.                eventScope = Boolean(tTweening.onCompleteScope) ? tTweening.onCompleteScope : tScope;
  449.                try
  450.                {
  451.                   tTweening.onComplete.apply(eventScope,tTweening.onCompleteParams);
  452.                }
  453.                catch(e:Error)
  454.                {
  455.                   handleError(tTweening,e,"onComplete");
  456.                }
  457.             }
  458.             return !isOver;
  459.          }
  460.          return true;
  461.       }
  462.       
  463.       public static function setTimeScale(p_time:Number) : void
  464.       {
  465.          var i:Number = NaN;
  466.          var cTime:Number = NaN;
  467.          if(isNaN(p_time))
  468.          {
  469.             p_time = 1;
  470.          }
  471.          if(p_time < 0.00001)
  472.          {
  473.             p_time = 0.00001;
  474.          }
  475.          if(p_time != _timeScale)
  476.          {
  477.             if(_tweenList != null)
  478.             {
  479.                for(i = 0; i < _tweenList.length; i++)
  480.                {
  481.                   cTime = getCurrentTweeningTime(_tweenList[i]);
  482.                   _tweenList[i].timeStart = cTime - (cTime - _tweenList[i].timeStart) * _timeScale / p_time;
  483.                   _tweenList[i].timeComplete = cTime - (cTime - _tweenList[i].timeComplete) * _timeScale / p_time;
  484.                   if(_tweenList[i].timePaused != undefined)
  485.                   {
  486.                      _tweenList[i].timePaused = cTime - (cTime - _tweenList[i].timePaused) * _timeScale / p_time;
  487.                   }
  488.                }
  489.             }
  490.             _timeScale = p_time;
  491.          }
  492.       }
  493.       
  494.       public static function resumeAllTweens() : Boolean
  495.       {
  496.          var i:uint = 0;
  497.          if(!Boolean(_tweenList))
  498.          {
  499.             return false;
  500.          }
  501.          var resumed:Boolean = false;
  502.          for(i = 0; i < _tweenList.length; i++)
  503.          {
  504.             resumeTweenByIndex(i);
  505.             resumed = true;
  506.          }
  507.          return resumed;
  508.       }
  509.       
  510.       private static function handleError(pTweening:TweenListObj, pError:Error, pCallBackName:String) : void
  511.       {
  512.          var eventScope:Object = null;
  513.          if(Boolean(pTweening.onError) && pTweening.onError is Function)
  514.          {
  515.             eventScope = Boolean(pTweening.onErrorScope) ? pTweening.onErrorScope : pTweening.scope;
  516.             try
  517.             {
  518.                pTweening.onError.apply(eventScope,[pTweening.scope,pError]);
  519.             }
  520.             catch(metaError:Error)
  521.             {
  522.                printError(String(pTweening.scope) + " raised an error while executing the \'onError\' handler. Original error:\n " + pError.getStackTrace() + "\nonError error: " + metaError.getStackTrace());
  523.             }
  524.          }
  525.          else if(!Boolean(pTweening.onError))
  526.          {
  527.             printError(String(pTweening.scope) + " raised an error while executing the \'" + pCallBackName + "\'handler. \n" + pError.getStackTrace());
  528.          }
  529.       }
  530.       
  531.       private static function startEngine() : void
  532.       {
  533.          _engineExists = true;
  534.          _tweenList = new Array();
  535.          __tweener_controller__ = new MovieClip();
  536.          __tweener_controller__.addEventListener(Event.ENTER_FRAME,Tweener.onEnterFrame);
  537.          _currentTimeFrame = 0;
  538.          updateTime();
  539.       }
  540.       
  541.       public static function removeAllTweens() : Boolean
  542.       {
  543.          var i:uint = 0;
  544.          if(!Boolean(_tweenList))
  545.          {
  546.             return false;
  547.          }
  548.          var removed:Boolean = false;
  549.          for(i = 0; i < _tweenList.length; i++)
  550.          {
  551.             removeTweenByIndex(i);
  552.             removed = true;
  553.          }
  554.          return removed;
  555.       }
  556.       
  557.       public static function addTween(p_scopes:Object = null, p_parameters:Object = null) : Boolean
  558.       {
  559.          var i:Number = NaN;
  560.          var j:Number = NaN;
  561.          var istr:String = null;
  562.          var rScopes:Array = null;
  563.          var rTransition:Function = null;
  564.          var nProperties:Object = null;
  565.          var nTween:TweenListObj = null;
  566.          var myT:Number = NaN;
  567.          var splitProperties:Array = null;
  568.          var splitProperties2:Array = null;
  569.          var tempModifiedProperties:Array = null;
  570.          var trans:String = null;
  571.          if(!Boolean(p_scopes))
  572.          {
  573.             return false;
  574.          }
  575.          if(p_scopes is Array)
  576.          {
  577.             rScopes = p_scopes.concat();
  578.          }
  579.          else
  580.          {
  581.             rScopes = [p_scopes];
  582.          }
  583.          var p_obj:Object = TweenListObj.makePropertiesChain(p_parameters);
  584.          if(!_inited)
  585.          {
  586.             init();
  587.          }
  588.          if(!_engineExists || !Boolean(__tweener_controller__))
  589.          {
  590.             startEngine();
  591.          }
  592.          var rTime:Number = isNaN(p_obj.time) ? 0 : Number(p_obj.time);
  593.          var rDelay:Number = isNaN(p_obj.delay) ? 0 : Number(p_obj.delay);
  594.          var rProperties:Array = new Array();
  595.          var restrictedWords:Object = {
  596.             "time":true,
  597.             "delay":true,
  598.             "useFrames":true,
  599.             "skipUpdates":true,
  600.             "transition":true,
  601.             "transitionParams":true,
  602.             "onStart":true,
  603.             "onUpdate":true,
  604.             "onComplete":true,
  605.             "onOverwrite":true,
  606.             "onError":true,
  607.             "rounded":true,
  608.             "onStartParams":true,
  609.             "onUpdateParams":true,
  610.             "onCompleteParams":true,
  611.             "onOverwriteParams":true,
  612.             "onStartScope":true,
  613.             "onUpdateScope":true,
  614.             "onCompleteScope":true,
  615.             "onOverwriteScope":true,
  616.             "onErrorScope":true
  617.          };
  618.          var modifiedProperties:Object = new Object();
  619.          for(istr in p_obj)
  620.          {
  621.             if(!restrictedWords[istr])
  622.             {
  623.                if(_specialPropertySplitterList[istr])
  624.                {
  625.                   splitProperties = _specialPropertySplitterList[istr].splitValues(p_obj[istr],_specialPropertySplitterList[istr].parameters);
  626.                   for(i = 0; i < splitProperties.length; i++)
  627.                   {
  628.                      if(_specialPropertySplitterList[splitProperties[i].name])
  629.                      {
  630.                         splitProperties2 = _specialPropertySplitterList[splitProperties[i].name].splitValues(splitProperties[i].value,_specialPropertySplitterList[splitProperties[i].name].parameters);
  631.                         for(j = 0; j < splitProperties2.length; j++)
  632.                         {
  633.                            rProperties[splitProperties2[j].name] = {
  634.                               "valueStart":undefined,
  635.                               "valueComplete":splitProperties2[j].value,
  636.                               "arrayIndex":splitProperties2[j].arrayIndex,
  637.                               "isSpecialProperty":false
  638.                            };
  639.                         }
  640.                      }
  641.                      else
  642.                      {
  643.                         rProperties[splitProperties[i].name] = {
  644.                            "valueStart":undefined,
  645.                            "valueComplete":splitProperties[i].value,
  646.                            "arrayIndex":splitProperties[i].arrayIndex,
  647.                            "isSpecialProperty":false
  648.                         };
  649.                      }
  650.                   }
  651.                }
  652.                else if(_specialPropertyModifierList[istr] != undefined)
  653.                {
  654.                   tempModifiedProperties = _specialPropertyModifierList[istr].modifyValues(p_obj[istr]);
  655.                   for(i = 0; i < tempModifiedProperties.length; i++)
  656.                   {
  657.                      modifiedProperties[tempModifiedProperties[i].name] = {
  658.                         "modifierParameters":tempModifiedProperties[i].parameters,
  659.                         "modifierFunction":_specialPropertyModifierList[istr].getValue
  660.                      };
  661.                   }
  662.                }
  663.                else
  664.                {
  665.                   rProperties[istr] = {
  666.                      "valueStart":undefined,
  667.                      "valueComplete":p_obj[istr]
  668.                   };
  669.                }
  670.             }
  671.          }
  672.          for(istr in rProperties)
  673.          {
  674.             if(_specialPropertyList[istr] != undefined)
  675.             {
  676.                rProperties[istr].isSpecialProperty = true;
  677.             }
  678.             else if(rScopes[0][istr] == undefined)
  679.             {
  680.                printError("The property \'" + istr + "\' doesn\'t seem to be a normal object property of " + String(rScopes[0]) + " or a registered special property.");
  681.             }
  682.          }
  683.          for(istr in modifiedProperties)
  684.          {
  685.             if(rProperties[istr] != undefined)
  686.             {
  687.                rProperties[istr].modifierParameters = modifiedProperties[istr].modifierParameters;
  688.                rProperties[istr].modifierFunction = modifiedProperties[istr].modifierFunction;
  689.             }
  690.          }
  691.          if(typeof p_obj.transition == "string")
  692.          {
  693.             trans = String(p_obj.transition.toLowerCase());
  694.             rTransition = _transitionList[trans];
  695.          }
  696.          else
  697.          {
  698.             rTransition = p_obj.transition;
  699.          }
  700.          if(!Boolean(rTransition))
  701.          {
  702.             rTransition = _transitionList["easeoutexpo"];
  703.          }
  704.          for(i = 0; i < rScopes.length; i++)
  705.          {
  706.             nProperties = new Object();
  707.             for(istr in rProperties)
  708.             {
  709.                nProperties[istr] = new PropertyInfoObj(rProperties[istr].valueStart,rProperties[istr].valueComplete,rProperties[istr].valueComplete,rProperties[istr].arrayIndex,{},rProperties[istr].isSpecialProperty,rProperties[istr].modifierFunction,rProperties[istr].modifierParameters);
  710.             }
  711.             if(p_obj.useFrames == true)
  712.             {
  713.                nTween = new TweenListObj(rScopes[i],_currentTimeFrame + rDelay / _timeScale,_currentTimeFrame + (rDelay + rTime) / _timeScale,true,rTransition,p_obj.transitionParams);
  714.             }
  715.             else
  716.             {
  717.                nTween = new TweenListObj(rScopes[i],_currentTime + rDelay * 1000 / _timeScale,_currentTime + (rDelay * 1000 + rTime * 1000) / _timeScale,false,rTransition,p_obj.transitionParams);
  718.             }
  719.             nTween.properties = nProperties;
  720.             nTween.onStart = p_obj.onStart;
  721.             nTween.onUpdate = p_obj.onUpdate;
  722.             nTween.onComplete = p_obj.onComplete;
  723.             nTween.onOverwrite = p_obj.onOverwrite;
  724.             nTween.onError = p_obj.onError;
  725.             nTween.onStartParams = p_obj.onStartParams;
  726.             nTween.onUpdateParams = p_obj.onUpdateParams;
  727.             nTween.onCompleteParams = p_obj.onCompleteParams;
  728.             nTween.onOverwriteParams = p_obj.onOverwriteParams;
  729.             nTween.onStartScope = p_obj.onStartScope;
  730.             nTween.onUpdateScope = p_obj.onUpdateScope;
  731.             nTween.onCompleteScope = p_obj.onCompleteScope;
  732.             nTween.onOverwriteScope = p_obj.onOverwriteScope;
  733.             nTween.onErrorScope = p_obj.onErrorScope;
  734.             nTween.rounded = p_obj.rounded;
  735.             nTween.skipUpdates = p_obj.skipUpdates;
  736.             removeTweensByTime(nTween.scope,nTween.properties,nTween.timeStart,nTween.timeComplete);
  737.             _tweenList.push(nTween);
  738.             if(rTime == 0 && rDelay == 0)
  739.             {
  740.                myT = _tweenList.length - 1;
  741.                updateTweenByIndex(myT);
  742.                removeTweenByIndex(myT);
  743.             }
  744.          }
  745.          return true;
  746.       }
  747.       
  748.       public static function registerTransition(p_name:String, p_function:Function) : void
  749.       {
  750.          if(!_inited)
  751.          {
  752.             init();
  753.          }
  754.          _transitionList[p_name] = p_function;
  755.       }
  756.       
  757.       public static function printError(p_message:String) : void
  758.       {
  759.          trace("## [Tweener] Error: " + p_message);
  760.       }
  761.       
  762.       private static function affectTweens(p_affectFunction:Function, p_scope:Object, p_properties:Array) : Boolean
  763.       {
  764.          var i:uint = 0;
  765.          var affectedProperties:Array = null;
  766.          var j:uint = 0;
  767.          var objectProperties:uint = 0;
  768.          var slicedTweenIndex:uint = 0;
  769.          var affected:Boolean = false;
  770.          if(!Boolean(_tweenList))
  771.          {
  772.             return false;
  773.          }
  774.          for(i = 0; i < _tweenList.length; i++)
  775.          {
  776.             if(Boolean(_tweenList[i]) && _tweenList[i].scope == p_scope)
  777.             {
  778.                if(p_properties.length == 0)
  779.                {
  780.                   p_affectFunction(i);
  781.                   affected = true;
  782.                }
  783.                else
  784.                {
  785.                   affectedProperties = new Array();
  786.                   for(j = 0; j < p_properties.length; j++)
  787.                   {
  788.                      if(Boolean(_tweenList[i].properties[p_properties[j]]))
  789.                      {
  790.                         affectedProperties.push(p_properties[j]);
  791.                      }
  792.                   }
  793.                   if(affectedProperties.length > 0)
  794.                   {
  795.                      objectProperties = AuxFunctions.getObjectLength(_tweenList[i].properties);
  796.                      if(objectProperties == affectedProperties.length)
  797.                      {
  798.                         p_affectFunction(i);
  799.                         affected = true;
  800.                      }
  801.                      else
  802.                      {
  803.                         slicedTweenIndex = splitTweens(i,affectedProperties);
  804.                         p_affectFunction(slicedTweenIndex);
  805.                         affected = true;
  806.                      }
  807.                   }
  808.                }
  809.             }
  810.          }
  811.          return affected;
  812.       }
  813.       
  814.       public static function getTweens(p_scope:Object) : Array
  815.       {
  816.          var i:uint = 0;
  817.          var pName:String = null;
  818.          if(!Boolean(_tweenList))
  819.          {
  820.             return [];
  821.          }
  822.          var tList:Array = new Array();
  823.          for(i = 0; i < _tweenList.length; i++)
  824.          {
  825.             if(Boolean(_tweenList[i]) && _tweenList[i].scope == p_scope)
  826.             {
  827.                for(pName in _tweenList[i].properties)
  828.                {
  829.                   tList.push(pName);
  830.                }
  831.             }
  832.          }
  833.          return tList;
  834.       }
  835.       
  836.       public static function isTweening(p_scope:Object) : Boolean
  837.       {
  838.          var i:uint = 0;
  839.          if(!Boolean(_tweenList))
  840.          {
  841.             return false;
  842.          }
  843.          for(i = 0; i < _tweenList.length; i++)
  844.          {
  845.             if(Boolean(_tweenList[i]) && _tweenList[i].scope == p_scope)
  846.             {
  847.                return true;
  848.             }
  849.          }
  850.          return false;
  851.       }
  852.       
  853.       public static function pauseTweenByIndex(p_tween:Number) : Boolean
  854.       {
  855.          var tTweening:TweenListObj = _tweenList[p_tween];
  856.          if(tTweening == null || tTweening.isPaused)
  857.          {
  858.             return false;
  859.          }
  860.          tTweening.timePaused = getCurrentTweeningTime(tTweening);
  861.          tTweening.isPaused = true;
  862.          return true;
  863.       }
  864.       
  865.       public static function getCurrentTweeningTime(p_tweening:Object) : Number
  866.       {
  867.          return !!p_tweening.useFrames ? _currentTimeFrame : _currentTime;
  868.       }
  869.       
  870.       public static function getTweenCount(p_scope:Object) : Number
  871.       {
  872.          var i:uint = 0;
  873.          if(!Boolean(_tweenList))
  874.          {
  875.             return 0;
  876.          }
  877.          var c:Number = 0;
  878.          for(i = 0; i < _tweenList.length; i++)
  879.          {
  880.             if(Boolean(_tweenList[i]) && _tweenList[i].scope == p_scope)
  881.             {
  882.                c += AuxFunctions.getObjectLength(_tweenList[i].properties);
  883.             }
  884.          }
  885.          return c;
  886.       }
  887.       
  888.       private static function stopEngine() : void
  889.       {
  890.          _engineExists = false;
  891.          _tweenList = null;
  892.          _currentTime = 0;
  893.          _currentTimeFrame = 0;
  894.          __tweener_controller__.removeEventListener(Event.ENTER_FRAME,Tweener.onEnterFrame);
  895.          __tweener_controller__ = null;
  896.       }
  897.       
  898.       public static function removeTweensByTime(p_scope:Object, p_properties:Object, p_timeStart:Number, p_timeComplete:Number) : Boolean
  899.       {
  900.          var removedLocally:Boolean = false;
  901.          var i:uint = 0;
  902.          var pName:String = null;
  903.          var eventScope:Object = null;
  904.          var removed:Boolean = false;
  905.          var tl:uint = _tweenList.length;
  906.          for(i = 0; i < tl; i++)
  907.          {
  908.             if(Boolean(_tweenList[i]) && p_scope == _tweenList[i].scope)
  909.             {
  910.                if(p_timeComplete > _tweenList[i].timeStart && p_timeStart < _tweenList[i].timeComplete)
  911.                {
  912.                   removedLocally = false;
  913.                   for(pName in _tweenList[i].properties)
  914.                   {
  915.                      if(Boolean(p_properties[pName]))
  916.                      {
  917.                         if(Boolean(_tweenList[i].onOverwrite))
  918.                         {
  919.                            eventScope = Boolean(_tweenList[i].onOverwriteScope) ? _tweenList[i].onOverwriteScope : _tweenList[i].scope;
  920.                            try
  921.                            {
  922.                               _tweenList[i].onOverwrite.apply(eventScope,_tweenList[i].onOverwriteParams);
  923.                            }
  924.                            catch(e:Error)
  925.                            {
  926.                               handleError(_tweenList[i],e,"onOverwrite");
  927.                            }
  928.                         }
  929.                         _tweenList[i].properties[pName] = undefined;
  930.                         delete _tweenList[i].properties[pName];
  931.                         removedLocally = true;
  932.                         removed = true;
  933.                      }
  934.                   }
  935.                   if(removedLocally)
  936.                   {
  937.                      if(AuxFunctions.getObjectLength(_tweenList[i].properties) == 0)
  938.                      {
  939.                         removeTweenByIndex(i);
  940.                      }
  941.                   }
  942.                }
  943.             }
  944.          }
  945.          return removed;
  946.       }
  947.       
  948.       public static function registerSpecialPropertySplitter(p_name:String, p_splitFunction:Function, p_parameters:Array = null) : void
  949.       {
  950.          if(!_inited)
  951.          {
  952.             init();
  953.          }
  954.          var sps:SpecialPropertySplitter = new SpecialPropertySplitter(p_splitFunction,p_parameters);
  955.          _specialPropertySplitterList[p_name] = sps;
  956.       }
  957.       
  958.       public static function removeTweenByIndex(i:Number, p_finalRemoval:Boolean = false) : Boolean
  959.       {
  960.          _tweenList[i] = null;
  961.          if(p_finalRemoval)
  962.          {
  963.             _tweenList.splice(i,1);
  964.          }
  965.          return true;
  966.       }
  967.       
  968.       public static function resumeTweens(p_scope:Object, ... args) : Boolean
  969.       {
  970.          var i:uint = 0;
  971.          var properties:Array = new Array();
  972.          for(i = 0; i < args.length; i++)
  973.          {
  974.             if(typeof args[i] == "string" && !AuxFunctions.isInArray(args[i],properties))
  975.             {
  976.                properties.push(args[i]);
  977.             }
  978.          }
  979.          return affectTweens(resumeTweenByIndex,p_scope,properties);
  980.       }
  981.       
  982.       public static function pauseTweens(p_scope:Object, ... args) : Boolean
  983.       {
  984.          var i:uint = 0;
  985.          var properties:Array = new Array();
  986.          for(i = 0; i < args.length; i++)
  987.          {
  988.             if(typeof args[i] == "string" && !AuxFunctions.isInArray(args[i],properties))
  989.             {
  990.                properties.push(args[i]);
  991.             }
  992.          }
  993.          return affectTweens(pauseTweenByIndex,p_scope,properties);
  994.       }
  995.    }
  996. }
  997.