var JASlideshow=new Class({initialize:function(options){this.options=Object.extend({buttons:{},interval:5000,handle_event:'click',button_event:'click',box:{},size:240,mode:'horizontal',items:[],handles:[],onWalk:{},animation:'fade',autoPlay:false},options||{});this.items=this.options.items;this.modes={horizontal:['left','width'],vertical:['top','height']};this.box=$(this.options.box);this.buttons={previous:[],next:[],play:[],playback:[],stop:[]};this.allbuttons=[];if(this.options.buttons){for(var action in this.options.buttons){this.addActionButtons(action,$type(this.options.buttons[action])=='array'?this.options.buttons[action]:[this.options.buttons[action]]);}}
this.handles=this.options.handles;if(this.handles){this.addHandleButtons(this.handles);}
this.allbuttons.each(function(button){button.addEvent('mouseover',function(){this.addClass('hover');});button.addEvent('mouseout',function(){this.removeClass('hover');});});this.currentIndex=this.options.startItem||0;this.previousIndex=null;this.nextIndex=null;this._auto=null;this.initFx();if(this.options.autoPlay)this.play(this.options.interval,'next',true);this.walk(this.currentIndex);},previous:function(manual){this.lastIndex=this.currentIndex;this.currentIndex+=this.currentIndex>0?-1:this.items.length-1;this.walk(null,manual);},next:function(manual){this.lastIndex=this.currentIndex;this.currentIndex+=this.currentIndex<this.items.length-1?1:1-this.items.length;this.walk(null,manual);},play:function(delay,direction,wait){this.stop();if(!wait){this[direction](false);}
this._auto=this[direction].periodical(delay,this,false);},stop:function(){$clear(this._auto);},walk:function(item,manual){if($defined(item)){this.lastIndex=this.currentIndex;this.currentIndex=item;}
this.previousIndex=this.currentIndex+(this.currentIndex>0?-1:this.items.length-1);this.nextIndex=this.currentIndex+(this.currentIndex<this.items.length-1?1:1-this.items.length);if(manual){this.stop();}
if(this.options.onWalk){this.options.onWalk(this.currentIndex,(this.handles?this.handles[this.currentIndex]:null));}
this.animate();if(manual&&this.options.autoPlay){this.play(this.options.interval,'next',true);}},initFx:function(){if(this.options.animation.test(/move/)){this.box.setStyle(this.modes[this.options.mode][1],(this.options.size*this.options.items.length+200)+'px');this.box.setStyle(this.modes[this.options.mode][0],(-this.currentIndex*this.options.size)+this.options.offset+'px');this.fx=new Fx.Style(this.box,this.modes[this.options.mode][0],this.options.fxOptions||{duration:500,wait:false});return;}
this.items.setStyles({'position':'absolute','left':0,'top':0,'display':'none'});this.items[this.currentIndex].setStyle('display','block');if(this.options.animation.test(/fade/)){for(var i=0;i<this.items.length;i++){this.items[i].fx=new Fx.Style(this.items[i],'opacity',this.options.fxOptions||{duration:500,wait:false});}}},animate:function(){if(this.options.animation.test(/move/)){this.fx.start(-this.currentIndex*this.options.size+this.options.offset);return;}
var others=[];for(var i=0;i<this.items.length;i++){this.items[i].fx.stop();if(i!=this.currentIndex&&i!=this.lastIndex)others.push(this.items[i]);}
$$(others).setStyle('display','none');if(this.lastIndex==this.currentIndex){this.items[this.currentIndex].setStyles({'display':'block','opacity':1});}else{this.items[this.currentIndex].setStyles({'display':'block','opacity':0,'z-index':10});this.items[this.lastIndex].setStyles({'z-index':9});}
if(this.options.animation.test(/fade/)){this.items[this.lastIndex].fx.start(0);this.items[this.currentIndex].fx.start(1);return;}},addHandleButtons:function(handles){for(var i=0;i<handles.length;i++){handles[i].addEvent(this.options.handle_event,this.walk.bind(this,[i,true]));this.allbuttons.push(handles[i]);}},addActionButtons:function(action,buttons){for(var i=0;i<buttons.length;i++){switch(action){case'previous':buttons[i].addEvent(this.options.button_event,this.previous.bind(this,true));break;case'next':buttons[i].addEvent(this.options.button_event,this.next.bind(this,true));break;case'play':buttons[i].addEvent(this.options.button_event,this.play.bind(this,[this.options.interval,'next',false]));break;case'playback':buttons[i].addEvent(this.options.button_event,this.play.bind(this,[this.options.interval,'previous',false]));break;case'stop':buttons[i].addEvent(this.options.button_event,this.stop.bind(this));break;}
this.buttons[action].push(buttons[i]);buttons[i].addEvent(this.options.button_event,function(){this.blur();});this.allbuttons.push(buttons[i]);}}});
