/*
 * SpriteAnimation & SpriteAnimationButton classes
 * @author Melvyn Hills
 * @company Bureau347
 * @date 2010-11-23
 *
 * Usage:
 * var spriteAnimation = new SpriteAnimation($('#element'), 20, 60); // element, total frames, frames per second
 * var spriteAnimationButton = new SpriteAnimationButton(spriteAnimation); // SpriteAnimation instance
 *
 */

function SpriteAnimation(target, totalFrames, fps) {
	
	// public variables
	this.target = target;
	this.fps = fps || 25;
	this.reverse = false;
	
	// private variables
	var _self = this;
	var _framePositions = [];
	var _totalFrames = totalFrames;
	var _currentFrame = 0;
	var _playInterval;
	
	init();
	
	// public functions
	this.playAnimation = function(reverse) {
		_self.reverse = reverse || false;
		clearInterval(_playInterval);
		_playInterval = setInterval($.proxy(playFrame, _self), 1000 / _self.fps);
	};
	
	this.stopAnimation = function() {
		clearInterval(_playInterval);
	};
	
	this.destroy = function() {
		_self.target.css('background-position', '0 0');
		_self.stopAnimation();
		_self.target = null;
	};
	
	// private functions
	function init() {
		var frameWidth = target.width();
		for (var i=0; i < totalFrames; i++)
			_framePositions.push(-i * frameWidth);
	}
	
	function setFrame(frame) {
		_currentFrame = frame;
		target.css('background-position', (_framePositions[_currentFrame] || 0) + 'px 0');
	}
	
	function previousFrame() {
		if (_currentFrame > 0)
			setFrame(_currentFrame - 1);
		else
			_self.stopAnimation();
	}
	
	function nextFrame() {
		if (_currentFrame < _totalFrames - 1)
			setFrame(_currentFrame + 1);
		else
			_self.stopAnimation();
	}
	
	function playFrame() {
		_self.reverse ? previousFrame() : nextFrame();
	}
}


function SpriteAnimationButton(spriteAnimation)
{
	var _self = this;
	var _spriteAnimation = spriteAnimation;
	
	this.enable = function() {
		_spriteAnimation.target.hover(
			function(){
				_spriteAnimation.playAnimation();
			},
			function(){
				_spriteAnimation.playAnimation(true);
			});
	};
	
	this.disable = function() {
		_spriteAnimation.target.unbind('mouseenter mouseleave');
	};
	
	this.destroy = function() {
		_self.disable();
		_spriteAnimation = null;
	};
	
	this.enable();
}

