var MovementParser = Class.create();

MovementParser.prototype = {

  initialize: function(animatorFrameMs, windowDimensions) {
  	
  	this.winDim = windowDimensions;
  	this.frameMs = animatorFrameMs;
  },
  
  _getStepsFromSpeed: function(speed){
   if(Animator.prototype.NORMAL_FRAME_MS == this.frameMs){ return speed; }
   var factor = Animator.prototype.NORMAL_FRAME_MS / this.frameMs;
   return Math.round(speed * factor);
  },
  
  _getTimeInNormalizedSteps: function(msToConvert){
   var steps = msToConvert / this.frameMs;
   return Math.round(steps);
  },
  
  getPauseStepsFromPauseRange: function(pauseMovementObj){
	var rSt = pauseMovementObj.rangeStart;
  	var pauseTime = rSt;
  	if(rSt != null && pauseMovementObj.rangeEnd){
  	  var rEn = pauseMovementObj.rangeEnd;
  	  if(rEn != rSt){
	   pauseTime = (Math.random() * (rEn - rSt)) + rSt;
	  }
  	}
  	var pauseSteps = this._getTimeInNormalizedSteps(pauseTime);
  	return pauseSteps;
  },
  
  parsePause: function(pauseMovementObj, intruder){
  	var pauseSteps = this.getPauseStepsFromPauseRange(pauseMovementObj); 	
  	return new StrategyPause(intruder, pauseSteps, null, null);
  },
  
  _parsePlainPoint: function(pointObj){
   	var result = null;
  	var x = pointObj.x;
  	var y = pointObj.y;
  	if(pointObj && ((x || x == 0) && (y || y == 0))){
  		if(pointObj.isPercentage){
  		 result = this.winDim.getPoint(x, y);
  		} else {
  		 result = new Point(x, y);
  		}
  	}
  	return result;
  },
  
  parsePoint: function(pointObj){
  	
  	var pos = this._parsePlainPoint(pointObj.position);
  	
  	if(pointObj.offset){
	 var offset = this._parsePlainPoint(pointObj.offset);
	 pos = pos.add(offset);
	}
  	return pos;
  },
  
  _parseCommonStrategy: function(strategyMovementObj){
  	
  	var r = strategyMovementObj.repeats;
  	if(r && r > 1){
  		this.repeats = r;
  	}
  	
  	var s = strategyMovementObj.speed;
  	if(s && s > 0){
  		this.speed = _getStepsFromSpeed(s);
  	} else {
  		this.speed = 50;
  	}
  },
  
  _parseLine: function(lineMovementObj, intruder){
  	this._parseCommonStrategy(lineMovementObj);
  	
  	if(!lineMovementObj.end){
  		throw new Error("Lines must have an end point");
  	 }
  	 
  	if(!lineMovementObj.begin){ // is a move to
	 var end = this._parsePlainPoint( lineMovementObj.end );
	 return new StrategyMoveTo(intruder, end, false, this.speed);
  	} else { // is regular line
  	 var begin = this._parsePlainPoint( lineMovementObj.begin );
  	 var end = this._parsePlainPoint( lineMovementObj.end );
  	 return new StrategyLine(intruder, begin, end, this.speed);
  	}
  },

  _getParsingFunctionName: function(movementName){
   if(movementName == "Line"){
   	return this._parseLine;
   }
   if(movementName == "Pause"){
   	return this.parsePause;
   }
   
   throw new Error("There is no function registered responsible for parsing movements of 'type': " + oneMovementObj.name);
  },
  
  parseMovement: function(item, oneMovementObj){
    if(!item){
  		throw new Error("There is no item  defined.");
  	}
   var parserFuncName = this._getParsingFunctionName(oneMovementObj.name);
   var strategy = parserFuncName.call(this, oneMovementObj, item);
   return strategy;
  }
  
};
