var semaphore = new Class({
  initialize: function(){
    this.light="green";
    this.pappo = 0;
  }
});

/* EFFETTO FADEIN
*/
var fadeImageIn = function(options) {
  var element = options.element;
  var fadeValue = options.fadeValue;
  var duration = options.duration;
  var dontHide = options.dontHide;
  if (!$defined(dontHide)) dontHide = true;
  var zIn = options.zIn;
  
  if (!element) return;
  
  if (!$defined(fadeValue)) fadeValue = 1;
  if (!$defined(duration)) duration = 2000;
  // rende l'oggetto trasparente
  if (!dontHide) element.setStyle('opacity', '0');
  // costruisce l'effetto
  fadein_fx = new Fx.Styles(element, {duration: duration});
  if ($defined(zIn)) element.setStyle('z-index',zIn);
  //applica l'effetto
  fadein_fx.start({
    'opacity':[fadeValue]
  });
}


/* EFFETTO FADEOUT
*/
var fadeImageOut = function(options) {
  var element = options.element;
  var fadeValue = options.fadeValue;
  var duration = options.duration;
  var zOut = options.zOut;
  
  if (!element) return;
  
  if (!$defined(fadeValue)) fadeValue = 0;
  if (!$defined(duration)) duration = 2000;
  // costruisce l'effetto
  fadein_fx = new Fx.Styles(element, {duration: duration});
  //applica l'effetto
  fadein_fx.start({
    'opacity':[fadeValue]
  });
  if ($defined(zOut)) (function(){element.setStyle('z-index',zOut)}).delay(duration);
}

/* EFFETTO slideIN
*/
var slideImageIn = function(options) {
  var element = options.element;
  var duration = options.duration;
  
  if (!element) return;
  
  if (!$defined(duration)) duration = 2000;
  
  // costruisce l'effetto
  slidein_fx = new Fx.Styles(element, {duration: duration});
  //applica l'effetto
  slidein_fx.start({'left':[0]});
}


/* EFFETTO slideOUT
*/
var slideImageOut = function(options) {
  var element = options.element;
  var duration = options.duration;
  var width = options.w;
  var direction = options.direction;
  
  if (!element) return;
  
  if (!$defined(duration)) duration = 2000;
  
  // costruisce l'effetto
  slidein_fx = new Fx.Styles(element, {duration: duration});
  //applica l'effetto
  if (direction == 'left') {slidein_fx.start({'left':[-width]});}
  else {slidein_fx.start({'left':[width]});}
}

/* FUNZIONE DI INIZIALIZZAZIONE FADEIN CONTEMPORANEO DI PIU' ELEMENTI SU CARICAMENTO PAGINA
per ogni elemento è possibile specificare la durata dell'effetto
elementsToBeFadedIn = [
{elementid:'IDlement1', duration:500},
{elementid:'IDlement2', duration:2000, delay: 500},
...
{elementid:'IDlementN', duration:1000}
];
initializeFadeIn({elementsdata:elementsToBeFadedIn});
*/
var initializeFadeIn = function(options){
  elementsdata = options.elementsdata;
  
  elementsdata.each(function(item, index){
    // recupera i valori necessari per l'inializzazione dell'effetto
    var elementid = item.elementid;
    var duration = item.duration;
    var delay = item.delay;
    if (!$defined(duration)) duration = 1000;
    if (!$defined(delay)) delay = 0;
    
    // appena il dom è pronto l'elemento viene reso completamente trasparente
    // basta domready perchè serve solo la struttura, inoltre l'opcaity deve essere messa a 0 prima che l'elemento sia caricato
    window.addEvent('domready', function(){
      // NOTA: l'elemento può essere recuperato solo quando il dom è pronto
      element = $(elementid);
      if (element) {element.setStyle('opacity', 0);} else {"initializeFadeIn: Element "+elementid+" not found"}
    });

    // applica il fadein 
    // serve load perchè serve avere l'immagine già caricata per farne il fadein
    window.addEvent('load', function(){
      var element = $(elementid);
      if (element) (function(){fadeImageIn({element:element, duration:duration})}).delay(delay);
    });
  });
}

/* FUNZIONE DI INIZIALIZZAZIONE DI EFFETTO CLICK_AND_VIEW
*/
initializeClickAndView = function(options){
  var matches = options.matches;
  var id_imageDiv1 = options.id_imageDiv1;
  var duration = options.duration;
  var waitToStart = options.waitToStart;
  if (!$defined(waitToStart)) waitToStart = 500;
  var disableTime = options.disableTime;
  var event = options.event;
  var z1 = options.z1;
  var z1initial = options.z1;
  var z2 = options.z2;
  var h = options.h;
  var w = options.w;
  var loaderImage = options.loaderImage;
  var transitionType = options.transitionType;
  var cvmSemaphore = options.semaphore;
  if (!$defined(cvmSemaphore)) cvmSemaphore = new semaphore();
  var semaphoreActor = options.semaphoreActor;
  if (!$defined(semaphoreActor)) semaphoreActor = new semaphore();
  semaphoreActor.light = 'manual';
  var fadeValue = options.fadeValue;
  var highlightSelected = options.highlightSelected;
  var execBefore = options.execBefore;
  
  if (!$defined(matches)) {alert('initializeClickAndView - missing value for matches'); return 0};
  if (!$defined(id_imageDiv1)) {alert('initializeClickAndView - missing value for id_imageDiv1'); return 0};
  if (!$defined(duration)) duration = 1000;
  if (!$defined(disableTime)) disableTime = duration + 100;
  if (!$defined(loaderImage)) loaderImage = "";
  if (!$defined(z1initial)) z1initial = 1;
  if (!$defined(transitionType)) transitionType = 'fadeInOut';
  
  window.addEvent('load', function(){
    if (!$defined(event)) {
      cvm = new clickAndViewManager({'matches':matches, 'id_imageDiv1':id_imageDiv1, disableTime:disableTime, semaphore:cvmSemaphore, duration:duration, z1:z1, z2:z2, loaderImage:loaderImage, z1initial: z1initial, h:h, w:w, transitionType: transitionType, semaphoreActor:semaphoreActor, highlightSelected: highlightSelected, fadeValue:fadeValue, execBefore: execBefore});
    } 
    else {
      cvm = new clickAndViewManager({'matches':matches, 'id_imageDiv1':id_imageDiv1, disableTime:disableTime, semaphore:cvmSemaphore, duration:duration, z1:z1, z2:z2, event:event, loaderImage:loaderImage, z1initial: z1initial, h:h, w:w, transitionType: transitionType, semaphoreActor:semaphoreActor, highlightSelected: highlightSelected, fadeValue:fadeValue, execBefore: execBefore});
    }
    (function(){cvm.exec()}).delay(waitToStart);
  });
  
}

/* FUNZIONE DI INIZIALIZZAZIONE DI EFFETTO CLICK_AND_SELECT
*/
initializeClickAndSelect = function(options){
  var elements = options.elements;
  var duration = options.duration;
  var disableTime = options.disableTime;
  var event = options.event;
  var fadeValue = options.fadeValue;
  var preclick = options.preclick;
  if (!$defined(preclick)) preclick = true;
  var waitToStart = options.waitToStart;
  if (!$defined(waitToStart)) waitToStart = 500;
  
  if (!$defined(elements)) {alert('initializeClickAndView - missing value for elements'); return 0};
  if (!$defined(duration)) duration = 1000;
  if (!$defined(disableTime)) disableTime = duration + 100;
  if (!$defined(fadeValue)) fadeValue = 0.4;
  var csmSemaphore = options.semaphore;
  if (!$defined(csmSemaphore)) csmSemaphore = new semaphore();
  var ownsSemaphore = options.ownsSemaphore;
  
  window.addEvent('load', function(){
    if (!$defined(event)) {
      csm = new clickAndSelectManager({'elements':elements, disableTime:disableTime, fadeValue:fadeValue, semaphore:csmSemaphore, duration:duration, preclick:preclick, ownsSemaphore: ownsSemaphore});
    } 
    else {
      csm = new clickAndSelectManager({'elements':elements, disableTime:disableTime, fadeValue:fadeValue, semaphore:csmSemaphore, duration:duration, preclick:preclick, event:event, ownsSemaphore: ownsSemaphore});
    }
    (function(){csm.exec()}).delay(waitToStart);
  });
  
  return csm;
}


/* CLASSI PER GESTIRE LA COREOGRAFIA DI UN INSIEME DI EVENTI
*/

var directorAssistant = new Class({
  initialize: function(options){
    this.options = Object.extend({
      move: function (){alert('Please tell me what to do!');},
      direction: 1
    }, options ||  {});
  },
  
  changeDirection: function(){
    this.options.direction = -1 * this.options.direction;
  },
  
  exec: function(){
    this.options.move();
  }
});

var director = new Class({
  initialize: function(options){
    this.options = Object.extend({
      waitToStart: 2000,
      delta: 6000
    }, options ||  {});
    if (!$defined(this.options.assistant)) alert('Give me my assistant!');
  },
  
  exec: function(){
    var assistant = this.options.assistant;
    var delta = this.options.delta;
    (function(){(function(){assistant.exec()}).periodical(delta)}).delay(this.options.waitToStart);
  }
});

