function SpriteAnimation(){
    
    var speedMulitplier = 1.5;
    
    var showFrameID = false;
    
    var actorID = null;
    var bufferID = null;
    var spriteMapLayout = null;
    var spriteMapID = null;
    var currentAnimationSequence = null;
    var previousAnimationSequence = null;
    var animationSequence = {};
       
    var currentFrameTop = 0;
    var currentFrameLeft = 0;
    
    var numFrames = 0;      // number of frames in teh current animation
    var frameDivisor = 0;     // FPS / Num Frames       
    var currentFrame = 0;   // Current frame to render
    
    var defaultFrameRateObject = window[ "frameRate"  ];
    var frameRateObj = defaultFrameRateObject;
    
       
    this.init = function( o ){
        actorID =  (o.actorID != undefined ) ? o.actorID : actorID;
        bufferID = window[ actorID ].getBufferID(); 
        spriteMapLayout = (o.spriteMapLayout != undefined ) ? o.spriteMapLayout : spriteMapLayout;        
        
        currentAnimationSequence = window[ actorID ].getCurrentAnimationSequence();        
        spriteMapID = window[spriteMapLayout][currentAnimationSequence].id;
        animationSequence = window[ spriteMapLayout ][ currentAnimationSequence ];
        numFrames = window[ spriteMapLayout ][ currentAnimationSequence ].numFrames;
    }
    
    this.updateAnimationSequence = function(){
        // Make sure we're not calling the same animation during reset.
        if( currentAnimationSequence != window[ actorID ].getCurrentAnimationSequence()  ){            
            previousAnimationSequnce = currentAnimationSequence;
            currentAnimationSequence= window[ actorID ].getCurrentAnimationSequence();        
            spriteMapID = window[spriteMapLayout][currentAnimationSequence].id;
            animationSequence = window[ spriteMapLayout ][ currentAnimationSequence ];
            numFrames = window[ spriteMapLayout ][ currentAnimationSequence ].numFrames;
        }
    }
    
    this.setFrameRateObject = function( i ){
        frameRateObj = ( i != undefined ) ? window[ i ] : defaultFrameRateObject ;
    }
    
    this.setPlayHead = function(){
        frameDivisor =  frameRateObj.fps / numFrames;
    }
    
    this.setCurrentFrame = function(){        
        
        var elapsed = ( tickTime - startTime ) / 1000;
        currentFrame = Math.floor( (numFrames * speedMulitplier)  * elapsed ) % numFrames;
    }
        
    this.animate = function(){
        
        this.setPlayHead();
        this.setCurrentFrame();
      
        currentFrameTop = 0  + animationSequence.y;
        currentFrameLeft = (currentFrame * animationSequence.frameWidth) + animationSequence.x;    
        
        var atx = document.getElementById( bufferID ).getContext('2d');
        var img = document.getElementById( spriteMapID  );
        
        atx.clearRect( 0, 0, canvasWidth, canvasHeight);                
        atx.save();       
        
         if( window[ actorID ].getDirection() == "west" ){
            atx.translate( animationSequence.frameWidth - 1, 0  );
            atx.scale( -1, 1);
        }
                
        atx.drawImage(  img,
                                    currentFrameLeft,
                                    currentFrameTop,
                                    animationSequence.frameWidth,
                                    animationSequence.frameHeight,
                                    0, 0,
                                    animationSequence.frameWidth,
                                    animationSequence.frameHeight
                                );
        
        atx.restore();   
        
        if( this.displayFrameID ) this.displayFrameID();        
    }
    
    this.displayFrameID = function(){
        document.getElementById("frameInfo").style.display = "block";
        document.getElementById("frameID").innerHTML = currentFrame;
    }
}
