(function(jQuery){var undefined,timers={};function Timer(fn,fd){var self=this,clock;function update(){self.frameCount++;fn.call(self);}
this.frameDuration=fd||25;this.frameCount=-1;this.start=function(){update();clock=setInterval(update,this.frameDuration);};this.stop=function(){clearInterval(clock);clock=null;};}
function callHandler(){var fn=jQuery.event.special.frame.handler,event=jQuery.Event("frame"),array=this.array,l=array.length;event.frameCount=this.frameCount;while(l--){fn.call(array[l],event);}}
function spork(elem,name,fd){if(timers[name]){timers[name].array.push(elem);}
else{timers[name]=new Timer(callHandler,fd);timers[name].array=[elem];var t=setTimeout(function(){timers[name].start();clearTimeout(t);t=null;},0);}}
function unspork(elem,name){var array=timers[name].array,l=array.length;while(l--){if(array[l]===elem){array.splice(l,1);break;}}
if(array.length===0){timers[name].stop();delete timers[name];}}
jQuery.event.special.frame={setup:function(data,namespaces){var l=namespaces.length;if(!l){spork(this,0,data&&data.frameDuration);return;}
while(l--){spork(this,namespaces[l],data&&data.frameDuration);}},teardown:function(namespaces){var l=namespaces.length;if(!l){for(var name in timers){unspork(this,name);}
return;}
while(l--){unspork(this,namespaces[l]);}},handler:function(event){jQuery.event.handle.apply(this,arguments);}};})(jQuery);
