/*!
 * Sprite JavaScript Library v0.1.0
 * http://saulrennison.me/spritejs
 *
 * Copyright 2011, Saul Rennison
 * Licensed under Creative Commons Attribution-ShareAlike 3.0 Unported License
 * http://creativecommons.org/licenses/by-sa/3.0/
 */
jQuery.sprite=(function(){var DEBUG=false;var defaultOptions={fps:30,size:undefined,frameSize:undefined,loop:true,direction:1,initialOffset:[0,0],index:undefined,loops:0};var animations=[];function log(message){if(console===undefined)
return;console.log('sprite: '+message);}
function debug(message){if(!DEBUG)
return;log('[debug] '+message);}
function advanceFrame(element,options){if(options['size']===undefined)
return;var dir=options['direction'];var offset=getOffset(element);var scalar=dir==1?-1:1;offset[dir]+=options['frameSize'][dir]*scalar;if(offset[dir]*scalar>=options['size'][dir]){options['loops']++;debug('animation starting new loop ('+options['loops']+')');if(options['loop']==0||(options['loop']!==true&&options['loops']>options['loop'])){jQuery.sprite.stop(options['index']);return;}
offset=options['initialOffset'];}
setOffset(element,offset);}
function getImageSize(src,options){if(options['size']instanceof Array)
return;if(options['size']!==undefined&&!(options['size']instanceof Array))
throw new Error("size option must be an Array instance");var img=new Image();img.src=src;img.onload=function(){options['size']=[img.width,img.height];debug('getImageSize('+src+') => ['+options['size']+']');}
img.onerror=function(){log('getImageSize('+src+') failed');jQuery.sprite.cancel(options['index']);}}
function getOffset(element){var offset=element.css('background-position').split(' ');if(offset.length!=2)
throw new Error("Unexpected offsets length (expected 2 components, got "+offset.length+")");return[parseInt(offset[0]),parseInt(offset[1])];}
function setOffset(element,offset){element.css('background-position',offset[0]+'px '+offset[1]+'px');}
return{animate:function(element,options){element=$(element);if(element===undefined||element[0]===undefined)
throw new Error("element must be a valid DOM element or selector");options=options||{};for(var name in defaultOptions){if(!options.hasOwnProperty(name)){options[name]=defaultOptions[name];}}
if(options['direction']<0||options['direction']>1)
throw new Error("direction must be 0 (horizontal) or 1 (vertical)");var src=undefined;var tagName=element[0].tagName.toLowerCase();if(tagName=='img'){log('animating <img> element as sprite...');src=element.attr('src');element.attr('src','');element.css('background-image','url('+src+')');element.css('display','inline-block');}else{log('animating generic element as sprite...');src=element.css('background-image').replace('url(','').replace(')','').replace(/'/g,'').replace(/"/g,'');}
if(options['frameSize']===undefined){options['frameSize']=[element.width(),element.height()];debug('set frameSize to element dimensions: ['+options['frameSize']+']');}
if(!(options['frameSize']instanceof Array))
throw new Error("frameSize option must be an Array instance");options['initialOffset']=getOffset(element);var interval=(1/options['fps'])*1000;options['index']=animations.push(setInterval(function(){advanceFrame(element,options)},interval))-1;getImageSize(src,options);return options['index'];},stop:function(index){debug('stopping animation index '+index+'...');clearInterval(animations[index]);}};})();$.fn.hasAttr=function(name){return this.attr(name)!==undefined&&this.attr(name)!==false;};

