
/***************************************************************
*  ROLLOUT
****************************************************************/
 
function JAVASCRIPT_SFX_ROLLOUT(objectName, followOptions) {
   
  this.sfx                     = new JAVASCRIPT_SFX(); //uses JAVASCRIPT_SFX
  this.sfx.objectName          = objectName;
  this.oid                     = element_buildUniqueObjectID(this);
  
  this.effect_type             = 'slide';
  this.status_open             = false;  

  if(typeof followOptions != 'undefined'){
    unlock_sizing = followOptions['unlock_sizing']==true?true:false; 
    this.sfx.setFollowingOptions('unlock_sizing', unlock_sizing);      
  }
  /// register Functions 
  this.doEffect                = JAVASCRIPT_SFX_ROLLOUT_doEffect;   
  this.addItem                 = JAVASCRIPT_SFX_ROLLOUT_addItem;   
  this.setSpeedParameters      = JAVASCRIPT_SFX_ROLLOUT_setSpeedParameters;   
  this.start                   = this.sfx.start;
  this.stop                    = this.sfx.stop;

  return true;
}

//Wrapper Function
JAVASCRIPT_SFX_ROLLOUT_addItem = function(object, destinationX, destinationY, effectType){
  object = element_isObject(object);
  
  var size = element_getSize(object);
  
  switch(effectType){
    default:
    case 'slide':
      var visibleByPercentX = destinationX.toString().substring((destinationX.toString().length-1))=='%'?true:false;
      var visibleByPercentY = destinationY.toString().substring((destinationY.toString().length-1))=='%'?true:false;
      
      var visibleThresholdX = size.width * (-1);
      var visibleThresholdY = size.height * (-1);
    
      var initPosition = element_getPosition(object); //aktuelle Position als Fallback

      var destinationX = (destinationX!='')?element_recalcValue2px(destinationX, size.width):initPosition.x; //Prozentualwerte umrechnen
      var destinationY = (destinationY!='')?element_recalcValue2px(destinationY, size.height):initPosition.y;      

      var x = (visibleByPercentX)?visibleThresholdX + destinationX:parseInt(destinationX); //Werte umrechnen
      var y = (visibleByPercentY)?visibleThresholdY + destinationY:parseInt(destinationY);
      
    break;
    
    case 'size':
      var x = element_recalcValue2px(destinationX, size.width);
      var y = element_recalcValue2px(destinationY, size.height);
    break;
  }

  this.sfx.addObject(object, x, y);  

  this.sfx.objectPool[object.id]['effectType'] = (typeof effectType != 'undefined')?effectType:'slide';

}

JAVASCRIPT_SFX_ROLLOUT_setSpeedParameters = function(intervalSpeed, a, b, c){

  this.sfx.calc.setParameters(intervalSpeed, a, b, c);  
  
}


JAVASCRIPT_SFX_ROLLOUT_doEffect = function(){

  var objects = this.sfx.objectPool;

  var currentValues = new Object();
  currentValues['x'] = null;
  currentValues['y'] = null;
  for(var id in objects){
    
    var object = objects[id];

    //get currentValues
    switch(object.effectType){
    default:
    case 'slide':
      //positions
      var currentPos = element_getPosition(object);  
      currentValues['x'] = currentPos.x;
      currentValues['y'] = currentPos.y;
    break;
    
    case 'size':
      var currentSize = element_getSize(object);  
      currentValues['x'] = currentSize.width;
      currentValues['y'] = currentSize.height;
    break;
    }
    
    
    //direction
    var direction = new Object();
    direction['x'] = (currentValues.x<object.destination.x)?1:-1;
    direction['y'] = (currentValues.y<object.destination.y)?1:-1;  

    //parameters
    var y = 0;
    
    //calculation
    for(axis in direction){
      
      if(currentValues[axis] == object.destination[axis]) continue;
      
      y = this.sfx.calc.getValue(direction[axis]);

      if(direction[axis] > 0){
        currentValues[axis]+= y;    
        currentValues[axis] = (currentValues[axis]<object.destination[axis])?currentValues[axis]:object.destination[axis];    
      } else if(direction[axis] < 0){
        currentValues[axis]-= y;
        currentValues[axis] = (currentValues[axis]>object.destination[axis])?currentValues[axis]:object.destination[axis];
      }    
    }
    
    //make movement/sizing
    switch(object.effectType){
    default:
    case 'slide':
      element_move(object, currentValues.x, currentValues.y);
    break;
    
    case 'size':
      element_setSize(object, currentValues.x, currentValues.y);
    break;
    }
    
    
    if(currentValues.x == object.destination.x && currentValues.y == object.destination.y) {
      delete this.sfx.objectPool[id];
      continue;      
    }
  } 

  if(object_count(this.sfx.objectPool) == 0) {
    this.stop();
  }
      
  return true;
}

