/**
 * @author Jeremy Green
 */
/***************Here's the init stuff***************/




var SlideShow = Class.create({
  
  initialize: function(slideShow,controlBar,playBar,options){
    this.slideShow = slideShow;
    this.controlBar = controlBar;
    this.playBar = playBar;
    this.pastInit = false;
    this.transitions = {};
    
    
    this.transitions["flipIn"] = function(targetIndex,stepNum,stepLength){this.flip(targetIndex,false);};
    this.transitions["fadeIn"] = function(targetIndex,stepNum,stepLength){ 
      //console.log("calling fadeIn with " + targetIndex + " " + stepNum + " " + stepLength);
                                  this.moveFade(targetIndex,false,0,0,1,0,0,0,0,0,0,0,stepNum,stepLength);
                                 };
    
    this.transitions["fadeNIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,0,0,1,0,0,0,-this.options.get('slideHeight'),-this.options.get('slideHeight'),0,0,stepNum,stepLength);};
    this.transitions["fadeEIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,0,0,1,this.options.get('slideWidth'),this.options.get('slideWidth'),0,0,0,0,0,stepNum,stepLength);};
    this.transitions["fadeSIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,0,0,1,0,0,0,this.options.get('slideHeight'),this.options.get('slideHeight'),0,0,stepNum,stepLength);};
    this.transitions["fadeWIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,0,0,1,-this.options.get('slideWidth'),-this.options.get('slideWidth'),0,0,0,0,0,stepNum,stepLength);};
    
    this.transitions["fadeNEIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,0,0,1,this.options.get('slideWidth'),this.options.get('slideWidth'),0,-this.options.get('slideHeight'),-this.options.get('slideHeight'),0,0,stepNum,stepLength);};
    this.transitions["fadeNWIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,0,0,1,-this.options.get('slideWidth'),-this.options.get('slideWidth'),0,-this.options.get('slideHeight'),-this.options.get('slideHeight'),0,0,stepNum,stepLength);};
    this.transitions["fadeSWIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,0,0,1,-this.options.get('slideWidth'),-this.options.get('slideWidth'),0,this.options.get('slideHeight'),this.options.get('slideHeight'),0,0,stepNum,stepLength);};
    this.transitions["fadeSEIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,0,0,1,this.options.get('slideWidth'),this.options.get('slideWidth'),0,this.options.get('slideHeight'),this.options.get('slideHeight'),0,0,stepNum,stepLength);};
    
    this.transitions["slideNIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,1,1,1,0,0,0,-this.options.get('slideHeight'),-this.options.get('slideHeight'),0,0,stepNum,stepLength);};
    this.transitions["slideEIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,1,1,1,this.options.get('slideWidth'),this.options.get('slideWidth'),0,0,0,0,0,stepNum,stepLength);};
    this.transitions["slideSIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,1,1,1,0,0,0,this.options.get('slideHeight'),this.options.get('slideHeight'),0,0,stepNum,stepLength);};
    this.transitions["slideWIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,1,1,1,-this.options.get('slideWidth'),-this.options.get('slideWidth'),0,0,0,0,0,stepNum,stepLength);};
    
    this.transitions["slideNEIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,1,1,1,this.options.get('slideWidth'),this.options.get('slideWidth'),0,-this.options.get('slideHeight'),-this.options.get('slideHeight'),0,0,stepNum,stepLength);};
    this.transitions["slideNWIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,1,1,1,-this.options.get('slideWidth'),-this.options.get('slideWidth'),0,-this.options.get('slideHeight'),-this.options.get('slideHeight'),0,0,stepNum,stepLength);};
    this.transitions["slideSWIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,1,1,1,-this.options.get('slideWidth'),-this.options.get('slideWidth'),0,this.options.get('slideHeight'),this.options.get('slideHeight'),0,0,stepNum,stepLength);};
    this.transitions["slideSEIn"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,false,1,1,1,this.options.get('slideWidth'),this.options.get('slideWidth'),0,this.options.get('slideHeight'),this.options.get('slideHeight'),0,0,stepNum,stepLength);};
    
    
    
    
    this.transitions["flipOut"] = function(targetIndex,stepNum,stepLength){this.flip(targetIndex,true);};
    this.transitions["fadeOut"] = function(targetIndex,stepNum,stepLength){ 
      //console.log("calling fadeOut with " + targetIndex + " " + stepNum + " " + stepLength);
      this.moveFade(targetIndex,true,1,1,0,0,0,0,0,0,0,0,stepNum,stepLength);
    };
    
    this.transitions["fadeSOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,0,0,0,0,0,0,this.options.get('slideHeight'),0,stepNum,stepLength);};
    this.transitions["fadeWOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,0,0,0,-this.options.get('slideWidth'),0,0,0,0,stepNum,stepLength);};
    this.transitions["fadeNOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,0,0,0,0,0,0,-this.options.get('slideHeight'),0,stepNum,stepLength);};
    this.transitions["fadeEOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,0,0,0,this.options.get('slideWidth'),0,0,0,0,stepNum,stepLength);};
    
    this.transitions["fadeSWOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,0,0,0,-this.options.get('slideWidth'),0,0,this.options.get('slideHeight'),0,stepNum,stepLength);};
    this.transitions["fadeSEOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,0,0,0,this.options.get('slideWidth'),0,0,this.options.get('slideHeight'),0,stepNum,stepLength);};
    this.transitions["fadeNWOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,0,0,0,-this.options.get('slideWidth'),0,0,-this.options.get('slideHeight'),0,stepNum,stepLength);};
    this.transitions["fadeNEOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,0,0,0,this.options.get('slideWidth'),0,0,-this.options.get('slideHeight'),0,stepNum,stepLength);};
    
    this.transitions["slideSOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,1,0,0,0,0,0,this.options.get('slideHeight'),0,stepNum,stepLength);};
    this.transitions["slideWOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,1,0,0,-this.options.get('slideWidth'),0,0,0,0,stepNum,stepLength);};
    this.transitions["slideNOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,1,0,0,0,0,0,-this.options.get('slideHeight'),0,stepNum,stepLength);};
    this.transitions["slideEOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,1,0,0,this.options.get('slideWidth'),0,0,0,0,stepNum,stepLength);};
    
    this.transitions["slideSWOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,1,0,0,-this.options.get('slideWidth'),0,0,this.options.get('slideHeight'),0,stepNum,stepLength);};
    this.transitions["slideSEOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,1,0,0,this.options.get('slideWidth'),0,0,this.options.get('slideHeight'),0,stepNum,stepLength);};
    this.transitions["slideNWOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,1,0,0,-this.options.get('slideWidth'),0,0,-this.options.get('slideHeight'),0,stepNum,stepLength);};
    this.transitions["slideNEOut"] = function(targetIndex,stepNum,stepLength){this.moveFade(targetIndex,true,1,1,1,0,0,this.options.get('slideWidth'),0,0,-this.options.get('slideHeight'),0,stepNum,stepLength);};
    
    
    
    this.slideIds;
    this.curSlideIndex = 0;
    this.maxSlideIndex;
    this.ssElem;
    this.cbElem;
    this.isRunning = false;
    this.csTimerId; //this is the timerId that's set to trigger the next slide when this one is done
    this.otherTimerId;
    
    
    
    this.options =  $H({
      prevText : "< Prev",
      playText : "Play",
      stopText : "Stop",
      nextText : "Next >",
      slideWidth : 250,
      slideHeight : 250,
      defaultSlideLength : 5000,
      defaultTStepNum : 10,
      defaultTStepLength : 50,  
      defaultSlideDelay : 0,
      defaultTransOut : "fadeOut",
      defaultTransIn : "fadeIn",
      changeOverflow : true,
      useTextButtons : false,
      useSpanButtons : false
    }).merge(options);
    
    
    this.loadShow(); 
  },
  
  loadShow : function(){
    
    if(this.pastInit){
      return;
        }  
    this.pastInit = true;  
    this.ssElem = $(this.slideShow);
    this.cbElem = $(this.controlBar);
    this.pbElem = $(this.playBar);
    
    //var slides = getElementsByClassName('slide');
    var slides = this.ssElem.select('.slide');  
    
    this.slideIds = new Array(slides.length);
    
    
    for(var i=0; i<slides.length; i++){
      var slide = slides[i];
      if(slide.id==null || slide.id==''){
        slide.id=this.slideShow + '_s'+i;
      }
      this.slideIds[i] = slide.id;
      if(i==0){
        
        slide.addClassName('curSlide');
      }
      this.maxSlideIndex = i;
      
      if(this.cbElem!=null){
        buttonElem = document.createElement('a');
        //buttonElem.href = 'javascript:showSlideFromClick('+i+');';
        buttonElem.href = '#';
        buttonElem.observe('click',function(i,e){
          this.showSlideFromClick(i);
          return false;
        }.bind(this,i));
        if(i==0){
          buttonElem.className='sb curSb';
        }else{
          buttonElem.className='sb';
        }
        buttonElem.slideIndex = i;
        buttonElem.id='sb_'+slide.id;
        this.cbElem.appendChild(buttonElem);
        if(this.options.get('useTextButtons')){
          var buttonText = slide.getAttribute("buttonText") || " ";
          buttonElem.appendChild(document.createTextNode(buttonText));
        }else if(this.options.get('useSpanButtons')){
          var buttonId = slide.getAttribute("buttonId");
          buttonElem.appendChild(document.getElementById(buttonId));
        }
        //addEvent(buttonElem.id,'click',showSlide);
      }
    }
    
    if(this.pbElem!=null){
      buttonElem = document.createElement('a');
      buttonElem.href = 'javascript:showPrevSlide();';
      buttonElem.className='sbp';
      buttonElem.id='sb_prev';
      buttonElem.appendChild(document.createTextNode(this.options.get('prevText')));
      this.pbElem.appendChild(buttonElem);
      
      buttonElem = document.createElement('a');
      buttonElem.href = 'javascript:stopSlides();';
      buttonElem.className='sbp';
      buttonElem.id='sb_stop';
      buttonElem.appendChild(document.createTextNode(this.options.get('stopText')));
      this.pbElem.appendChild(buttonElem);
      
      buttonElem = document.createElement('a');
      buttonElem.href = 'javascript:playSlides();';
      buttonElem.className='sbp';
      buttonElem.id='sb_play';
      buttonElem.appendChild(document.createTextNode(this.options.get('playText')));
      this.pbElem.appendChild(buttonElem);
      
      buttonElem = document.createElement('a');
      buttonElem.href = 'javascript:this.showNextSlide();';
      buttonElem.className='sbp';
      buttonElem.id='sb_next';
      buttonElem.appendChild(document.createTextNode(this.options.get('nextText')));
      this.pbElem.appendChild(buttonElem);
    }
    var firstSlideTime = this.getSlideTime(0);
    this.isRunning=true;
    this.otherTimerId = setTimeout(function(){this.showNextSlide()}.bind(this),firstSlideTime);
    
  },
  
  
  
  stopSlides : function(){
    this.isRunning=false;
    clearTimeout(this.otherTimerId);
    clearTimeout(this.csTimerId);
  },
  
  playSlides : function(){
    this.isRunning=true;
    this.showNextSlide();
  },
  
  showSlide : function(e){
    targetId = getTargetElement(e).id;
    targetIndex = document.getElementById(targetId).slideIndex;
    this.showSlideByIndex(targetIndex);  
  },
  
  showNextSlide : function(){
    if(this.curSlideIndex==this.maxSlideIndex){
      this.showSlideByIndex(0);
    }else{
      this.showSlideByIndex(this.curSlideIndex+1);
    }
  },
  
  showPrevSlide : function(){
    if(this.curSlideIndex==0){
      this.showSlideByIndex(this.maxSlideIndex);
    }else{
      this.showSlideByIndex(this.curSlideIndex-1);
    }
  },
  
  
  
  showSlideFromClick : function(targetIndex){
    this.stopSlides();
    this.showSlideByIndex(targetIndex);
  },
  
  showSlideByIndex : function(targetIndex){
    if(targetIndex==this.curSlideIndex){
      return;
        }
    oldSlide = document.getElementById(this.slideIds[this.curSlideIndex]);
    newSlide = document.getElementById(this.slideIds[targetIndex]);
    oldTransName = oldSlide.getAttribute("transOut");
    var oldTStepNum = oldSlide.getAttribute("tOStepNum");
    var oldTStepLength = oldSlide.getAttribute("tOStepLength");
    
    newTransName = newSlide.getAttribute("transIn");
    var newTStepNum = newSlide.getAttribute("tIStepNum");
    var newTStepLength = newSlide.getAttribute("tIStepLength");
    var newTransDelay = newSlide.getAttribute("inDelay");
    
    if(oldTStepNum==null || oldTStepNum=='' || oldTStepNum<0 || oldTStepNum == undefined){
      
      oldTStepNum=this.options.get('defaultTStepNum');
      //console.log("trying to set oldTStepNum " + oldTStepNum);
      //console.log(this.options)
    }
    
    if(oldTStepLength==null || oldTStepLength=='' || oldTStepLength<0 || oldTStepLength == undefined){
      oldTStepLength=this.options.get('defaultTStepLength');
    }
    
    if(newTStepNum==null || newTStepNum=='' || newTStepNum<0  || newTStepNum == undefined){
      newTStepNum=this.options.get('defaultTStepNum');
    }
    
    if(newTStepLength==null || newTStepLength=='' || newTStepLength<0  || newTStepNum == undefined){
      newTStepLength=this.options.get('defaultTStepLength');
    }
    
    
    if(oldTransName==null || oldTransName==''){
      oldTransName = this.options.get('defaultTransOut'); //'fadeOut';
    }
    
    if(newTransName==null || newTransName==''){
      newTransName = this.options.get('defaultTransIn'); //'fadeIn';
    }
    
    if(newTransDelay==null || newTransDelay==''){
      newTransDelay=this.options.get('defaultSlideDelay');
    }
    oldTrans = this.transitions[oldTransName].bind(this);
    newTrans = this.transitions[newTransName].bind(this);
    
    if(oldTrans==null || oldTrans==''){
      oldTrans = this.transitions["fadeOut"];
    }
    
    if(newTrans==null || newTrans==''){
      newTrans = this.transitions["fadeIn"];
    }
    
    // oldTrans = oldTrans.replace("targetIndex",this.curSlideIndex);
    // oldTrans = oldTrans.replace("stepNum",oldTStepNum);
    // oldTrans = oldTrans.replace("stepLength",oldTStepLength);  
    // 
    // newTrans = newTrans.replace("targetIndex",targetIndex);
    // newTrans = newTrans.replace("stepNum",newTStepNum);
    // newTrans = newTrans.replace("stepLength",newTStepLength);
    
    
    
    //eval(oldTrans);
    oldTrans(this.curSlideIndex,oldTStepNum,oldTStepLength);
    this.newTrans = newTrans
    this.otherTimerId = setTimeout(function(){this.newTrans(targetIndex,newTStepNum,newTStepLength);}.bind(this),newTransDelay);  
    //newTrans(targetIndex,newTStepNum,newTStepLength);
    //this.otherTimerId = setTimeout(function(){newTrans.bind(this)(targetIndex,newTStepNum,newTStepLength);}.bind(this),newTransDelay);
    //console.log(this.slideShow + " set delay for " + newTransDelay + "  and target = " + targetIndex + " otherTimerId = "  + this.otherTimerId);
    
    //;
    //remClass(oldSlide,'curSlide');
    //moveFade(this.curSlideIndex,true,1,1,0,0,0,400,0,0,400,0,10,50);
    //moveFade(targetIndex,false,0,0,1,400,400,0,400,400,0,0,10,50);
    //addClass(newSlide,'curSlide');
    this.curSlideIndex = targetIndex;
  },
  
  flip : function(targetIndex,isTransOut){
    if(isTransOut){
      try{
        $(this.slideIds[targetIndex]).removeClassName('curSlide');
      }catch(err){;}
      try{
        $('sb_'+this.slideIds[targetIndex]).removeClassName('curSb');  
      }catch(err){;};
    }else{
      try{
        $(this.slideIds[targetIndex]).addClassName('curSlide');
      }catch(err){;}
      try{
        $('sb_'+this.slideIds[targetIndex]).addClassName('curSb');
      }catch(err){;};
      document.getElementById(this.slideIds[targetIndex]).style.opacity=0.99;
      document.getElementById(this.slideIds[targetIndex]).style.filter="alpha(opacity="+99+")";
      document.getElementById(this.slideIds[targetIndex]).style.top=0;
      document.getElementById(this.slideIds[targetIndex]).style.left=0;
      
      if(this.options.get('changeOverflow')){
        this.ssElem.style.overflow='auto';
      }
      slideTime = this.getSlideTime(targetIndex);
      clearTimeout(this.csTimerId);
      if(this.isRunning){
        this.csTimerId = setTimeout(function(){this.showNextSlide()}.bind(this),slideTime);
      }
    }
  },
  
  getSlideTime : function(targetIndex){
    st = document.getElementById(this.slideIds[targetIndex]).getAttribute("displayLength");
    
    if(st==null || st=='' || st < 0){
      st=this.options.get('defaultSlideLength');
    }else if(st==0){
      st=1;
    }
    return st;
  },
  
  moveFade : function(targetIndex,isTransOut,curOpat,startOpat,endOpat,curX,startX,endX,curY,startY,endY,curStep,numSteps,delay){
    
    
    if(startOpat==1)
      startOpat = 0.99;
    
    if(endOpat==1)
      endOpat = 0.99;
    
    if(curStep >= numSteps){
      if(isTransOut){
        try{
          $(this.slideIds[targetIndex]).removeClassName('curSlide');
        }catch(err){;}
        try{
          $('sb_'+this.slideIds[targetIndex]).removeClassName('curSb');
        }catch(err){;};
      }else{
        if(this.options.get('changeOverflow')){
          //alert('about to set overflow to auto');
          this.ssElem.style.overflow='auto';
          //alert('just to set overflow to auto');  
        }
        slideTime = this.getSlideTime(targetIndex);
        clearTimeout(this.csTimerId);
        if(this.isRunning){
          this.csTimerId = setTimeout(function(){this.showNextSlide()}.bind(this),slideTime);
        }else{
        }
      }
      ;//do nothing
    }else{
      if(this.options.get('changeOverflow')){
        this.ssElem.style.overflow='hidden';
      }
      try{
        $(this.slideIds[targetIndex]).addClassName('curSlide');
      }catch(err){;};
      try{
        $('sb_'+this.slideIds[targetIndex]).addClassName('curSb');
      }catch(err){;};
      opatStep = (endOpat - startOpat) / numSteps;
      curOpat = curOpat + opatStep;
      document.getElementById(this.slideIds[targetIndex]).style.opacity = curOpat;
      document.getElementById(this.slideIds[targetIndex]).style.filter="alpha(opacity="+curOpat * 100+")";
      
      xStep = (endX - startX) / numSteps;
      curX = curX + xStep;
      document.getElementById(this.slideIds[targetIndex]).style.left = curX+'px';
      
      yStep = (endY - startY) / numSteps;
      curY = curY + yStep;
      document.getElementById(this.slideIds[targetIndex]).style.top = curY+'px';
      
      curStep += 1;
      //this.otherTimerId = setTimeout("this.moveFade("+targetIndex+","+isTransOut+","+curOpat+","+startOpat+","+endOpat+","+curX+","+startX+","+endX+","+curY+","+startY+","+endY+","+curStep+","+numSteps+","+delay+")",delay);
      this.otherTimerId = setTimeout( function(){this.moveFade(targetIndex,isTransOut,curOpat,startOpat,endOpat,curX,startX,endX,curY,startY,endY,curStep,numSteps,delay)}.bind(this),delay);
      //console.log("set otherTimerId with delay " + delay)
    }    
  }
  
  
});



function initShow(){
  loadShow('slideShow','controlBar','playBar');
  loadShow('textSlideShow','textControlBar','textPlayBar');
}

/**********************Here's the real code*************/





