/* EFFETTO SLIDE SHOW
  - si definisce un elenco di immagini da visualizzare
  - si definisce il tempo di durata dell'effetto di fading
  - si definiscono i valori di z-order per lo schermo principale e lo schermo "secondario" che viene creato dall'effetto per gestire la comparsa/scomparsa contemporanea delle immagini a due a due
  - nell'HTML si inserisce un div con nome nome_divSlideShow che verrà usato come "schermo" per la proiezione e che deve contenere un'immagine
*/

var slideShowManager = new Class({
  initialize: function(options){
    this.options = Object.extend({
      duration: 2000,
      z1: 1,
      z2: 0,
      startTime: 1000
      }, options ||  {});
    if (!$defined(this.options.id_imageDiv1)) {alert("slideShowManager::initialize - missing value for id_imageDiv1"); return(0);};
    if (!$defined(this.options.images)) {alert("slideShowManager::initialize - missing value for images"); return(0);};
  },
  exec: function(){
    if (!$defined(this.options.id_imageDiv1)) {alert("slideShowManager::initialize - missing value for id_imageDiv1"); return(0);};
    if (!$defined(this.options.images)) {alert("slideShowManager::initialize - missing value for images"); return(0);};

    var images_array = this.options.images;
    var captions_array = this.options.captions;
    var links_array = this.options.links;
    var id_imageDiv1 = this.options.id_imageDiv1;
    var duration = this.options.duration;
    var startTime = this.options.startTime;
    var z1 = this.options.z1;
    var z2 = this.options.z2;

    window.addEvent('load', function(){
      // recupera il div che corrisponde all'id id_imageDiv1
      imageDiv1 = $(id_imageDiv1);
      if ($defined(imageDiv1)) {
        // setta style e proprietà del div
        imageDiv1.setStyles({'position':'absolute', 'float':'left', 'z-index':1});
        // costruisce un div uguale a imageDiv1 e lo inserisce dopo di questo
        imageDiv2 = imageDiv1.clone().injectAfter(imageDiv1);
        // setta style e proprietà del div
        imageDiv2.setStyles({'z-index':0});
        imageDiv2.setProperty('id', '_'+imageDiv1.getProperty('id'));
        // recupera le immagini contenute nel div
        var image_1 = imageDiv1.getElement('img');
        var text_1 = imageDiv1.getElement('div');
        var link_1 = imageDiv1.getElement('a');
        var image_2 = imageDiv2.getElement('img');
        var text_2 = imageDiv2.getElement('div');
        var link_2 = imageDiv2.getElement('a');
        var numOfImages = images_array.length
  
        // il singolo step di uno slideshow
        var singleStep = function(imageSrc, caption, link){
          // sceglie quale schermo usare come schermo principale
          if (image_1.getStyle('opacity') == 1) {
            toBeFadedOut = image_1;
            toBeFadedIn = image_2;
            divTobeFadedOut = imageDiv1;
            divTobeFadedIn = imageDiv2;
            if (text_1 && text_2) {
              textToBeFadedOut = text_1;
              textToBeFadedIn = text_2;
            }
            if (link_1 && link_2) {
              linkToBeFadedOut = link_1;
              linkToBeFadedIn = link_2;
            }
          }
          else 
          {
            toBeFadedOut = image_2;
            toBeFadedIn = image_1;
            divTobeFadedOut = imageDiv2;
            divTobeFadedIn = imageDiv1;
            if (text_1 && text_2) {
              textToBeFadedOut = text_2;
              textToBeFadedIn = text_1;
            }
            if (link_1 && link_2) {
              linkToBeFadedOut = link_2;
              linkToBeFadedIn = link_1;
            }
          }
          // fade out della vecchia immagine
          fadeImageOut({element:toBeFadedOut, duration: duration});
          // fade in del vecchio testo
          if (textToBeFadedOut) fadeImageOut({element:textToBeFadedOut, duration: duration});
          // setta lo z-index del div dell'immagine
          divTobeFadedOut.setStyle('z-index',z2);
          // cambia l'immagine
          toBeFadedIn.setProperty('src', imageSrc);
          // cambia il testo
          textToBeFadedIn.setHTML(caption);
          // cambia il link
          linkToBeFadedIn.setProperty('href', link);
          // fade in della nuova immagine
          fadeImageIn({element:toBeFadedIn, duration: duration});
          // fade in del nuovo testo
          if (textToBeFadedIn) fadeImageIn({element:textToBeFadedIn, duration: duration});
          // setta lo z-index del div dell'immagine
          divTobeFadedIn.setStyle('z-index',z1);
        }
        
        var buildAndRun = function(){
          // costruisce la catena di eventi per un ciclo completo dello slideshow
          var completeSlide = new Chain;
          for (i = 0; i < numOfImages; i++) {
            imageSrc = images_array[i];
            caption = captions_array[i];
            link = links_array[i];
            completeSlide.chain(singleStep.pass([imageSrc, caption, link]))
          }
          // esecutore degli eventi
          var runner = function(){
            completeSlide.callChain();
            if (completeSlide.chains.length == 0) {
              runner = $clear(timer);
            }
          }
          // esegue gli eventi
          //firstStep = function(){runner();};
          //firstStep.delay(startTime);
          var timer = runner.periodical(duration+100+4000);
        }
        buildAndRun();
        buildAndRun.periodical(numOfImages*(duration+100+5000)+100);

      }
    });
  }
});