var IntrudersParser = Class.create();

IntrudersParser.INTRUDER_ZINDEX = 333;

// all intruder html element id's are prefixed with:
IntrudersParser.INTRUDER_ID_PREFIX = "intruder_";

// the url to get intruder image is: INTRUDER_IMAGEPATH_PREFIX + id + INTRUDER_IMAGEPATH_SUFFIX
IntrudersParser.INTRUDER_IMAGEPATH_PREFIX = "/actorpic"
IntrudersParser.INTRUDER_IMAGEPATH_SUFFIX = ".gif"


IntrudersParser.prototype = {

  intruderPauses: new Hash(),
  intruderMovements: new Hash(),
  intruderPositions: new Hash(),

  initialize: function(animatorsMsPerFrame) {

  	this.msPerFrame = animatorsMsPerFrame;
  	this.intruders = null;
  },

  parseAllIntrudersResponse: function(jsonIntruders){

    this.intruders = new Array();
    for(var i = 0; i < jsonIntruders.length; i++){
		var intruder = jsonIntruders[i];
		var actorIntruding = intruder.actor;
		var imagePath = IntrudersParser.INTRUDER_IMAGEPATH_PREFIX + actorIntruding.id + IntrudersParser.INTRUDER_IMAGEPATH_SUFFIX;
		var item = new ItemBuilder().newImageItem(IntrudersParser.INTRUDER_ID_PREFIX + intruder.id, imagePath, actorIntruding.width, actorIntruding.height);
        item.hide();
        item.setZindex(IntrudersParser.INTRUDER_ZINDEX);
        
        var intruderUrl = intruder.intruderUrl;
        if(intruderUrl && intruderUrl.url) {
           item.setLink(intruderUrl.url, intruderUrl.target, intruderUrl.title)
        }

		var actor = item;

		if(!intruder.position){
		 throw new Error("Missing intruder parameter: 'position' of type Point.");
		}
		if(!intruder.interval){
		 throw new Error("Missing intruder parameter: 'interval' of type Pause.");
		}
		if(!intruder.movement){
		 throw new Error("Missing intruder parameter: 'movement' of type Movement[].");
		}


		var strategies = new Array();

		// adding an extra strategy for positioning & making visible
		var makeVisibleStrategy = new StrategyPause(actor, 2,
		 null,
		 function(){
		  this.getItem().show();
		 }
		)
		makeVisibleStrategy.isParsed = true;
		strategies.push(makeVisibleStrategy);


		var movements = intruder.movement;
		strategies = strategies.concat(movements);

		// adding an extra strategy for making the item invisible
		var makeInvisibleStrategy = new StrategyPause(actor, 2,
		 null,
		 function(){
		  this.getItem().hide();
		 }
		)
		makeInvisibleStrategy.isParsed = true;
		strategies.push(makeInvisibleStrategy);

		this.intruderPositions[intruder.id] = {'position':intruder.position, 'offset':intruder.positionOffset};
		this.intruderPauses[intruder.id] = intruder.interval;
		this.intruderMovements[intruder.id] = strategies;
		this.intruders.push(actor);
  	}
  },

  getIntruders: function(){
   return this.intruders;
  },

  getIntruderPause: function(intruderId){
   return this.intruderPauses[intruderId];
  },
  getIntruderMovement: function(intruderId){
   return this.intruderMovements[intruderId];
  },
  getIntruderStartPosition: function(intruderId){
   return this.intruderPositions[intruderId];
  }
}
