(function($,undefined){$.fn.spritespin=function(method){if(methods[method]){return methods[method].apply(this,Array.prototype.slice.call(arguments,1));}else if(typeof(method)==='object'||!method){return methods.init.apply(this,arguments);}else{$.error('Method '+method+' does not exist on jQuery.spritespin');}};var methods={init:function(options){var settings={width:undefined,height:undefined,offsetX:0,offsetY:0,frameStepX:1,frameStepY:undefined,frameStep:undefined,framesX:undefined,frames:15,frame:0,resolutionX:undefined,resolutionY:undefined,animate:true,loop:true,loopFrame:0,frameTime:1,reverse:false,sense:0.8,slider:undefined,behavior:"drag",image:"",preloadText:"",preloadHtml:"",preloadBackground:undefined,preloadCSS:undefined,onFrame:undefined,onLoad:undefined}
options=(options||{});$.extend(settings,options);return this.each(function(){var $this=$(this);var data=$this.data('spritespin');if(!data){$this.attr("unselectable","on");$this.data('spritespin',{target:$this,settings:settings,animation:null,frameTime:settings.frameTime,touchable:(/iphone|ipod|ipad|android/i).test(navigator.userAgent)});data=$this.data('spritespin');helper.reconfiger($this,data);}else{$.extend(data.settings,options);helper.reconfiger($this,data);}});},destroy:function(){return this.each(function(){var $this=$(this);data=$this.data('spritespin');$this.unbind('.spritespin');$this.removeData('spritespin');});},update:function(frame,reverse){return this.each(function(){var $this=$(this);data=$this.data('spritespin');settings=data.settings;if(reverse!=undefined){settings.reverse=reverse;}
if(frame==undefined){settings.frame=(settings.frame+(settings.reverse?-1:1));}else{settings.frame=frame;}
settings.frame=helper.wrapValue(settings.frame,0,settings.frames);data.target.trigger("onFrame",data);});},animate:function(animate,loop){if(animate==undefined){return $(this).data('spritespin').animation!=null;}else{return this.each(function(){var $this=$(this);data=$this.data('spritespin');settings=data.settings;if(typeof(loop)=="boolean"){settings.loop=loop;}
if(animate=="toggle"){animate=!settings.animate
settings.animate=animate;}else{settings.animate=animate;}
if(animate&&data.animation==null){data.animation=setInterval(function(){try{methods.update.apply($this,[]);}catch(err){}},data.frameTime);}else if(!animate&&data.animation!=null){clearInterval(data.animation);data.animation=null;}});}},frame:function(frame){if(frame==undefined){return $(this).data('spritespin').settings.frame;}else{return this.each(function(){methods.update.apply($(this),[frame]);});}},loop:function(value){if(value==undefined){return $(this).data('spritespin').settings.loop;}else{return this.each(function(){var $this=$(this);data=$this.data('spritespin');methods.animate.apply($(this),[data.settings.animate,value]);});}}};var helper={reconfiger:function(instance,data){helper.blankBackground(instance,data);helper.preloadImages(instance,data,function(){helper.updateBackground(instance,data);helper.hookSlider(instance,data);helper.rebindEvents(instance,data);if(data.settings.animate){methods.animate.apply(instance,[data.settings.animate,data.settings.loop]);}
instance.trigger("onLoad",data);});},wrapValue:function(value,min,max){while(value>=max){value-=max;}
while(value<min){value+=max;}
return value;},blankBackground:function(instance,data){image="none";if(typeof(data.settings.preloadBackground)=="string"){image=["url('",data.settings.preloadBackground,"')"].join("");}
instance.css({width:[data.settings.width,"px"].join(""),height:[data.settings.height,"px"].join(""),"background-image":image,"background-repeat":"repeat-x","background-position":"0px 0px"});},updateBackground:function(instance){var data=instance.data("spritespin");var image=data.settings.image;var x=data.settings.offsetX;var y=-data.settings.offsetY;if(typeof(data.settings.image)=="string"){var stepX=(data.settings.frameStepX!=undefined?data.settings.frameStepX:data.settings.width);var stepY=(data.settings.frameStepY!=undefined?data.settings.frameStepY:data.settings.height);var numFramesX=(data.settings.framesX!=undefined?data.settings.framesX:data.settings.frames);var numFramesY=(numFramesX==data.settings.frames?1:data.settings.framesY);var frameX=(data.settings.frame%numFramesX);var frameY=(data.settings.frame/numFramesX)|0;x-=(frameX*stepX);y-=(frameY*stepY);}else{image=data.settings.image[data.settings.frame];}
var css={width:[data.settings.width,"px"].join(""),height:[data.settings.height,"px"].join(""),"background-image":["url('",image,"')"].join(""),"background-repeat":"repeat-x","background-position":[x,"px ",y,"px"].join("")}
if(data.settings.resolutionX!=undefined&&data.settings.resolutionY!=undefined){css["-webkit-background-size"]=[data.settings.resolutionX,"px ",data.settings.resolutionY,"px"].join("");}
instance.css(css);},hookSlider:function(instance,data){if(data.settings.slider!=undefined){data.settings.slider.slider({value:data.settings.frame,min:0,max:(data.settings.frames)-1,step:1,slide:function(event,ui){methods.animate.apply(instance,[false]);methods.frame.apply(instance,[ui.value]);}});}},rebindEvents:function(instance,data){instance.unbind('.spritespin');instance.bind('mousedown.spritespin',behavior[data.settings.behavior].mousedown);instance.bind('mousemove.spritespin',behavior[data.settings.behavior].mousemove);instance.bind('mouseup.spritespin',behavior[data.settings.behavior].mouseup);instance.bind('mouseenter.spritespin',behavior[data.settings.behavior].mouseenter);instance.bind('mouseover.spritespin',behavior[data.settings.behavior].mouseover);instance.bind('mouseleave.spritespin',behavior[data.settings.behavior].mouseleave);instance.bind('dblclick.spritespin',behavior[data.settings.behavior].dblclick);instance.bind('onFrame.spritespin',behavior[data.settings.behavior].onFrame);if(data.touchable){instance.bind('touchstart.spritespin',behavior[data.settings.behavior].mousedown);instance.bind('touchmove.spritespin',behavior[data.settings.behavior].mousemove);instance.bind('touchend.spritespin',behavior[data.settings.behavior].mouseup);instance.bind('touchcancel.spritespin',behavior[data.settings.behavior].mouseleave);instance.bind('click.spritespin',behavior.prevent);instance.bind('gesturestart.spritespin',behavior.prevent);instance.bind('gesturechange.spritespin',behavior.prevent);instance.bind('gestureend.spritespin',behavior.prevent);}
instance.bind("mousedown.spritespin selectstart.spritespin",function(event){event.preventDefault();});instance.bind("onFrame.spritespin",function(event,data){helper.updateBackground(data.target,data);if(data.settings.frame==data.settings.loopFrame&&!data.settings.loop){methods.animate.apply(data.target,[false]);}
if(data.settings.slider!=undefined){data.settings.slider.slider("value",data.settings.frame);}});if(data.settings.onFrame!=undefined){instance.bind("onFrame.spritespin",data.settings.onFrame);}
if(data.settings.onLoad!=undefined){instance.bind("onLoad.spritespin",data.settings.onLoad);}},preloadImages:function(instance,data,callback){var preload=$('<div class="preload"/>');if(instance.find(".preload").length==0){instance.append(preload);}
css=(data.settings.preloadCSS||{});preload.css($.extend({width:data.settings.width,height:data.settings.height},css));preload.hide().html(data.settings.preloadText).fadeIn(250,function(){new ImagePreloader(data.settings.image,function(){instance.find(".preload").fadeOut(250,function(){$(this).detach();});callback.apply([instance,data]);});});}};function ImagePreloader(images,callback){this.callback=callback;if(typeof(images)=="string"){images=[images];}
this.nLoaded=0;this.nProcessed=0;this.aImages=new Array;this.nImages=images.length;for(var i=0;i<images.length;i++){this.preload(images[i]);}}
ImagePreloader.prototype.preload=function(image){var oImage=new Image;this.aImages.push(oImage);oImage.onload=ImagePreloader.prototype.onload;oImage.onerror=ImagePreloader.prototype.onerror;oImage.onabort=ImagePreloader.prototype.onabort;oImage.oImagePreloader=this;oImage.bLoaded=false;oImage.src=image;}
ImagePreloader.prototype.onComplete=function(){this.nProcessed++;if(this.nProcessed==this.nImages){this.callback(this.aImages,this.nLoaded);}}
ImagePreloader.prototype.onload=function(){this.bLoaded=true;this.oImagePreloader.nLoaded++;this.oImagePreloader.onComplete();}
ImagePreloader.prototype.onerror=function(){this.bError=true;this.oImagePreloader.onComplete();}
ImagePreloader.prototype.onabort=function(){this.bAbort=true;this.oImagePreloader.onComplete();}
var behavior={prevent:function(e){e.cancelable&&e.preventDefault();return false;},helper:{storePoints:function(e,data){if(e.touches==undefined&&e.originalEvent!=undefined){e.touches=e.originalEvent.touches;}
data.oldX=data.currentX;data.oldY=data.currentY;if(e.touches!=undefined&&e.touches.length>0){data.currentX=e.touches[0].clientX;data.currentY=e.touches[0].clientY;}else{data.currentX=e.clientX;data.currentY=e.clientY;}
if(data.startX==undefined||data.startY==undefined){data.startX=data.currentX;data.startY=data.currentY;data.clickframe=data.settings.frame;}
if(data.oldX==undefined||data.oldY==undefined){data.oldX=data.currentX;data.oldY=data.currentY;}
data.dX=data.currentX-data.startX;data.dY=data.currentY-data.startY;data.ddX=data.currentX-data.oldX;data.ddY=data.currentY-data.oldY;return false;},resetPoints:function(e,data){data.startX=undefined;data.startY=undefined;data.currentX=undefined;data.currentY=undefined;data.oldX=undefined;data.oldY=undefined;data.dX=0;data.dY=0;data.ddX=0;data.ddY=0;},clamp:function(value,min,max){return(value>max?max:(value<min?min:value));}},none:{mousedown:function(e){return false;},mousemove:function(e){return false;},mouseup:function(e){return false;},mouseenter:function(e){return false;},mouseover:function(e){return false;},mouseleave:function(e){return false;},dblclick:function(e){return false;},onFrame:function(e,frame){return false;}},spin:{mousedown:function(e){var $this=$(this),data=$this.data('spritespin');behavior.helper.storePoints(e,data);data.onDrag=true;return false;},mousemove:function(e){var $this=$(this),data=$this.data('spritespin');if(data.onDrag){behavior.helper.storePoints(e,data);d=data.dX/data.settings.width;dFrame=d*data.settings.frames*data.settings.sense;frame=Math.round(data.clickframe+dFrame);methods.update.apply($this,[frame]);methods.animate.apply($this,[false]);if(data.ddX!=0){d=data.ddX/data.settings.width;dFrame=d*data.settings.frames*data.settings.sense;data.frameTime=(data.settings.frameTime/dFrame);data.settings.reverse=(data.ddX<0);}}
return false;},mouseup:function(e){var $this=$(this),data=$this.data('spritespin');if(data.onDrag){data.onDrag=false;$this.spritespin("animate",true);}
return false;},mouseenter:function(e){return false;},mouseover:function(e){return false;},mouseleave:function(e){var $this=$(this),data=$this.data('spritespin');if(data.onDrag){data.onDrag=false;$this.spritespin("animate",$this.spritespin("animate"));}
return false;},dblclick:function(e){$(this).spritespin("animate","toggle");return false;},onFrame:function(e,data){if(data.ddX!=0){data.frameTime=data.frameTime+1;$(this).spritespin("animate",false);if(data.frameTime<62){$(this).spritespin("animate",true);}}else{$(this).spritespin("animate",false);}
return false;}},drag:{mousedown:function(e){var $this=$(this),data=$this.data('spritespin');behavior.helper.storePoints(e,data);data.onDrag=true;return false;},mousemove:function(e){var $this=$(this),data=$this.data('spritespin');if(data.onDrag){behavior.helper.storePoints(e,data);d=data.dX/data.settings.width;dFrame=d*data.settings.frames*data.settings.sense;frame=Math.round(data.clickframe+dFrame);methods.update.apply($this,[frame]);methods.animate.apply($(this),[false]);}
return false;},mouseup:function(e){var $this=$(this),data=$this.data('spritespin');behavior.helper.resetPoints(e,data);data.onDrag=false;return false;},mouseenter:function(e){return false;},mouseover:function(e){return false;},mouseleave:function(e){var $this=$(this),data=$this.data('spritespin');behavior.helper.resetPoints(e,data);data.onDrag=false;return false;},dblclick:function(e){var $this=$(this),data=$this.data('spritespin');$this.spritespin("animate","toggle");return false;},onFrame:function(e,frame){return false;}}};})(jQuery);
