var SlideShow = new Class({
  Implements: [Options],
  options: {
    'prefix':'ssv2_',
    'files': [],
    'duration': 750,
    'delay': 4000,
    'resize':false,
    'texts':[],
    'textclass':'',
    'textmask':''
  },
  initialize: function(el,o){
    this.setOptions(o)      
    var 
      inst=this,io=inst.options,p=0,f=io.files[p],
      c=inst.cont=document.images?document.images:[];
    
    inst.subject = $(el);
    inst.text=io.texts.length>0?new Element('div',{'id':io.prefix+'text','class': io.textclass,'html': io.textmask}):false;
    if(f) inst.loadImg(io.files,p,inst.Ready);
  },
  loadImg: function(fp,p,f){
    var inst=this,c=inst.cont;
    if(fp[p]){
      var i=inst.options.prefix+p;
      c[i]=new Image();c[i].id=i;c[i].src=fp[p];
      if(inst.options.resize){c[i].width=inst.subject.getSize().x;c[i].height=inst.subject.getSize().y;}
      c[i].onload=function(e){if(p==0) inst.firstImg=this;inst.Fade(this,1).addEvent('complete',function(){fp[p]=i;if(fp[p+1]){inst.loadImg(fp,p+1,f);}else{if(f){f.call(inst);}}}).start({'opacity':0});};
    }
  },
  Fade:function(e,d){return new Fx.Morph(e,{duration:d?d:this.options.duration,fps:30});},
  getImg:function(p){var i=this.options.prefix+p;return this.cont?(this.cont[i]?this.cont[i]:(this.cont[p]?this.cont[p]:false)):false;},
  getNext:function(){
    var cp=this.getCurIdx()+1;if(cp==this.options.files.length)cp=0;
    return this.getImg(cp)?this.getImg(cp):false;
  },
  setCur:function(p){return this.curImg=this.getImg(p)?this.getImg(p):false;},
  getCurIdx:function(){
    return this.curImg.id.split(this.options.prefix)[1].toInt();
  },
  Ready:function(){
    if(this.firstImg){
      this.setCur(this.firstImg.id);
      this.refreshText();
      this.startSlide();
    }
  },
  refreshText:function(){
    if(this.text){
      if(!$(this.text.id))this.text.inject(this.subject);
      this.text.set('html',this.options.textmask.replace('[text]',this.options.texts[this.getCurIdx()]));
    }
  },
  startSlide:function(){
    var inst=this;
    inst.curImg.inject(inst.subject);
    inst.Fade(inst.curImg).start({'opacity':1});
    inst.Timer=setInterval(function(){
      var n=inst.getNext();
      n=(n==inst.curImg||n==false)?inst.firstImg:n;
      if(n){
        n.inject(inst.subject);
        inst.Fade(n).addEvent('start',function(){
          inst.refreshText();
        }).addEvent('complete',function(){
          inst.curImg=n;
          
        }).start({'opacity':1});        
      }
      inst.Fade(inst.curImg).start({'opacity':0});
    },inst.options.delay)
  },
  stopSlide:function(){this.Timer=clearInterval(this.Timer);}
});
