/*
* Entity
* @author: Joseph 'Pcjoe' Florencio
* @date: 12-03-05
*/

// Think
function Think()
{
    // Get velocity
    this.vecVelocity.normalizeVector();
    var vecVelocity = this.vecVelocity;
    var imgSuffix = "";
    var docObj = document.getElementById(this.getDocID());

    // Entity has at least 4 different animations for directions
    if(!this.getOneFrame())
    {
        // Character is moving
        if(vecVelocity.getLength()>0)
        {
          // Get directional constant
          this.setDirection(getDirectionFromVector(vecVelocity,this.getUseDiag()));

          // Set image suffix
          if(this.getAnimFiles())
          { imgSuffix = "_anim";
          }
        }

        // Setbackgorund image
        docObj.style.backgroundImage = "url(images/"+this.getImgPrefix()+getStringFromDir(this.getDirection())+imgSuffix+".gif)";
    }
    // Single sprite
    else
    {
        docObj.style.backgroundImage = "url(images/"+this.getImgPrefix()+".gif)";
    }

    // Add movement vector to position
    vecVelocity.scaleVector(this.getSpeed());
    this.vecOrigin.addVector(vecVelocity);
    this.updatePosition();
}

// Update position on html page
function updatePosition()
{
    var docObj = document.getElementById(this.getDocID());
    docObj.style.left = this.vecOrigin.getX();
	docObj.style.top = this.vecOrigin.getY();
}

// Make entity visible
function makeVisible()
{
    var docObj = document.getElementById(this.getDocID());
    docObj.style.display = "block";
}

// Make entity invisible
function makeInvisible()
{
    var docObj = document.getElementById(this.getDocID());
    docObj.style.display = "none";
}

// Precache images
function Precache()
{
    // Single gif, precache that
    if(this.getOneFrame())
    {
        precacheImage("images/"+this.getImgPrefix()+".gif");
    }
    // Precache multiple gifs
    else
    {
        for(var i = 0; i <= DIR_RIGHT; i++)
        {
          // Don't precache diagonal directions that dont exist
          if(this.getUseDiag() ? false : (i == DIR_FRONTLEFT || i == DIR_FRONTRIGHT || i == DIR_BACKLEFT || i == DIR_BACKRIGHT))
          { continue;
          }
          // precache normal directions
          precacheImage("images/"+this.getImgPrefix()+getStringFromDir(i)+".gif");
          // precache animated directions
          if(this.getAnimFiles())
          {
            precacheImage("images/"+this.getImgPrefix()+getStringFromDir(i)+"_anim.gif");
          }
        }
    }
}

// Accessors
function setUseDiag(diag){ this.useDiag = diag; }
function getUseDiag(){ return this.useDiag; }
function setAnimFiles(anim){ this.hasAnimFiles = anim; }
function getAnimFiles(){ return this.hasAnimFiles; }
function setDocID( id ) { this.documentID = id; }
function getDocID() { return this.documentID; }
function setImgPrefix(prefix) { this.imgPrefix = prefix; }
function getImgPrefix() { return this.imgPrefix; }
function setDirection(dir) { this.direction = dir; }
function getDirection() { return this.direction; }
function setOneFrame(value){ this.oneFrame = value; }
function getOneFrame() { return this.oneFrame; }
function setSpeed(speed) { this.speed = speed; }
function getSpeed() { return this.speed; }

// Constructor
function Entity()
{
  // Variables
  this.vecOrigin = new Vector();    // Origin
  this.vecVelocity = new Vector();  // Velocity
  this.vecSize = new Vector();      // Size of entity
  this.useDiag = false;             // Use diagonal sprites
  this.hasAnimFiles = true;         // Has animation files
  this.documentID = "";             // Document id
  this.imgPrefix = "";              // Image prefix
  this.direction = DIR_BACK;        // Direction index
  this.oneFrame = false;
  this.speed = 1;
  
  // Functions
  this.setUseDiag = setUseDiag;
  this.getUseDiag = getUseDiag;
  this.setAnimFiles = setAnimFiles;
  this.getAnimFiles = getAnimFiles;
  this.setDocID = setDocID;
  this.getDocID = getDocID;
  this.setImgPrefix = setImgPrefix;
  this.getImgPrefix = getImgPrefix;
  this.setDirection = setDirection;
  this.getDirection = getDirection;
  this.setOneFrame = setOneFrame;
  this.getOneFrame = getOneFrame;
  this.setSpeed = setSpeed;
  this.getSpeed = getSpeed;
  this.Think = Think;
  this.updatePosition = updatePosition;
  this.Precache = Precache;
  this.makeVisible = makeVisible;
  this.makeInvisible = makeInvisible;
}
