var slideshow_frame_rate = 5000; // 1000 = 1 sec

jQuery(document).ready( function() {
     // replicate first frame for "unlimited scroll"
          jQuery('#slideshow_images .slideshow_ribbon').append( jQuery('#slideshow_images .slideshow_ribbon a:first-child').clone() );
          jQuery('#slideshow .slideshow_ribbon').append( jQuery('#slideshow .slideshow_ribbon div.frame:first-child').clone() );
          Cufon.replace( 'div.frame:last-child h3', { fontFamily: 'gothambold', hover:true } );
          Cufon.replace( 'div.frame:last-child h4', { fontFamily: 'gothambook' } );
     op_slideshow = new OP_Slideshow();
     jQuery('#slideshow_images').everyTime( slideshow_frame_rate, 'slideshow_timer', function() {
          op_slideshow.shift( 1 );
     } );
} );

function OP_Slideshow() {
     var self = this;
     self.index = 0;
     self.frameCount = jQuery('#slideshow_images .slideshow_ribbon img').size();
     self.x = 0; // current offset
     self.xx = jQuery('.slideshow_window').width(); // width of frame, single offset unit
     
     self.shift = function( direction ) {
          jQuery('#slideshow_images').stopTime('slideshow_timer');
          self.index += direction;
          self.x += ( -1 * direction ) * self.xx;
          if( self.index < 0 ) {
               // we're at the first frame; invisibly move to clone at end, then move backward
               jQuery('.slideshow_ribbon').css( { marginLeft : ( -1 * ( self.xx * ( self.frameCount - 1 ) )) + 'px' } );
               self.index = self.frameCount - 2;
               self.x = -1 * ( self.frameCount - 2 ) * self.xx;
          }
          var i = 0;
          jQuery('.slideshow_ribbon').animate( { marginLeft: self.x + 'px' }, function() {
               i++;
               if( self.index >= self.frameCount - 1 && i == 2 ) {
                    // we're at the clone of the first frame; invisibly return to beginning of list
                    jQuery('.slideshow_ribbon').css( { marginLeft: '0px' } );
                    self.index = 0;
                    self.x = 0;
               }
          } );
          jQuery('#slideshow_images').everyTime( slideshow_frame_rate, 'slideshow_timer', function() {
               op_slideshow.shift( 1 );
          } );
     }
     
     jQuery('#btn_back').bind( 'click', function() {
          self.shift( -1 );
     } );
     jQuery('#btn_forward').bind( 'click', function() {
          self.shift( 1 );
     } );
} // end class OP_Slideshow

jQuery.fn.extend({everyTime:function(interval,label,fn,times){return this.each(function(){jQuery.timer.add(this,interval,label,fn,times)})},oneTime:function(interval,label,fn){return this.each(function(){jQuery.timer.add(this,interval,label,fn,1)})},stopTime:function(label,fn){return this.each(function(){jQuery.timer.remove(this,label,fn)})}});jQuery.extend({timer:{global:[],guid:1,dataKey:"jQuery.timer",regex:/^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/,powers:{'ms':1,'cs':10,'ds':100,'s':1000,'das':10000,'hs':100000,'ks':1000000},timeParse:function(value){if(value==undefined||value==null)return null;var result=this.regex.exec(jQuery.trim(value.toString()));if(result[2]){var num=parseFloat(result[1]);var mult=this.powers[result[2]]||1;return num*mult}else{return value}},add:function(element,interval,label,fn,times){var counter=0;if(jQuery.isFunction(label)){if(!times)times=fn;fn=label;label=interval}interval=jQuery.timer.timeParse(interval);if(typeof interval!='number'||isNaN(interval)||interval<0)return;if(typeof times!='number'||isNaN(times)||times<0)times=0;times=times||0;var timers=jQuery.data(element,this.dataKey)||jQuery.data(element,this.dataKey,{});if(!timers[label])timers[label]={};fn.timerID=fn.timerID||this.guid++;var handler=function(){if((++counter>times&&times!==0)||fn.call(element,counter)===false)jQuery.timer.remove(element,label,fn)};handler.timerID=fn.timerID;if(!timers[label][fn.timerID])timers[label][fn.timerID]=window.setInterval(handler,interval);this.global.push(element)},remove:function(element,label,fn){var timers=jQuery.data(element,this.dataKey),ret;if(timers){if(!label){for(label in timers)this.remove(element,label,fn)}else if(timers[label]){if(fn){if(fn.timerID){window.clearInterval(timers[label][fn.timerID]);delete timers[label][fn.timerID]}}else{for(var fn in timers[label]){window.clearInterval(timers[label][fn]);delete timers[label][fn]}}for(ret in timers[label])break;if(!ret){ret=null;delete timers[label]}}for(ret in timers)break;if(!ret)jQuery.removeData(element,this.dataKey)}}}});jQuery(window).bind("unload",function(){jQuery.each(jQuery.timer.global,function(index,item){jQuery.timer.remove(item)})});
