﻿function Fader() {
  this.config = {};
}

Fader.prototype.itemClassName = 'faderitem';
Fader.prototype.automaticFade = true;
Fader.prototype.automaticFadeInterval = 5000;
Fader.prototype.fadeSpeed = 1000;
Fader.prototype.stopOnMouseHover = true;
Fader.prototype.showNav = true;
Fader.prototype.prevClassName = 'prevbtn';
Fader.prototype.nextClassName = 'nextbtn';
Fader.prototype.intervals;
Fader.prototype.indexes;
Fader.prototype.circle = false;

var dofade = true;

Fader.prototype.makeFaders = function(element, faderclassname) {
  this.intervals = new Array();
  this.indexes = new Array();
  var faders = clienti.getElementsByClassName(element, faderclassname);
  
  for (var a = 0; a < faders.length; a++) {
    var fader = faders[a];
    this.indexes[this.indexes.length] = 0;
    this.intervals[this.intervals.length] = '';
    
    this.makeFader(fader,a);
  }
}

Fader.prototype.makeFader = function(fader,i) {
  var items = clienti.getElementsByClassName(fader,this.itemClassName);
  
  if (this.showNav) {
    var nextbtn = document.createElement('div');
    var prevbtn = document.createElement('div');
    
    nextbtn.className = this.nextClassName;
    prevbtn.className = this.prevClassName;
    
    fader.appendChild(nextbtn);
    fader.appendChild(prevbtn);
    
    clienti.addEventHandler(nextbtn,'click',function() {
      var _fader = arguments[0];
      var _items = arguments[1];
      var _i = arguments[2];
      var _prev = arguments[3];
      var _next = arguments[4];
      var _indexes = arguments[5];
      
      var intv = this.intervals[_i];
      
      if (intv != undefined) {
        clearInterval(intv);
      }
      
      var iw = _items[0].offsetWidth;
      
      var currentitem = _items[_indexes[_i]];
      var nextitem;
      
      if (_indexes[_i]+1 == _items.length) {
        nextitem = _items[0];
        this.indexes[_i] = 0;
      } else {
        nextitem = _items[_indexes[_i]+1];
        this.indexes[_i]++;
      }
      
      nextitem.style.left = '0px';
      
      $(currentitem).stop(true,true).fadeOut(this.fadeSpeed,function() {
        currentitem.style.left = iw + 'px';
      });
      $(nextitem).stop(true,true).fadeIn(this.fadeSpeed);
    }.bind(this,fader,items,i,prevbtn,nextbtn,this.indexes));
    
    clienti.addEventHandler(prevbtn,'click',function() {
      var _fader = arguments[0];
      var _items = arguments[1];
      var _i = arguments[2];
      var _prev = arguments[3];
      var _next = arguments[4];
      var _indexes = arguments[5];
      
      var intv = this.intervals[_i];
      
      if (intv != undefined) {
        clearInterval(intv);
      }
      
      var iw = _items[0].offsetWidth;
      
      var currentitem = _items[_indexes[_i]];
      var nextitem;
      
      if (_indexes[_i]-1 < 0) {
        nextitem = _items[_items.length-1];
        this.indexes[_i] = _items.length-1;
      } else {
        nextitem = _items[_indexes[_i]-1];
        this.indexes[_i]--;
      }
      
      nextitem.style.left = '0px';
      
      $(currentitem).stop(true,true).fadeOut(this.fadeSpeed,function() {
        currentitem.style.left = iw + 'px';
      });
      $(nextitem).stop(true,true).fadeIn(this.fadeSpeed);
    }.bind(this,fader,items,i,prevbtn,nextbtn,this.indexes));
  }
  
  if (items.length > 1) {
    if (this.stopOnMouseHover && this.automaticFade) {
      $(fader).mouseenter(function() {
        var ind = arguments[0];
        
        if (this.intervals[ind] != undefined) {
          clearInterval(this.intervals[ind]);
        }
      }.bind(this,i));
      
      $(fader).mouseleave(function() {
        var is = arguments[0];
        var ind = arguments[1];
        
        this.updateInterval(is,ind,this.fadeSpeed);
      }.bind(this,items,i));
    }
    
    var zindex = items.length;
    
    for (var a = 0; a < items.length; a++) {
      items[a].style.zIndex = zindex;
      if (a != 0) {
        items[a].style.display = 'none';
      }
      zindex--;
    }
    
    if (this.automaticFade) {
      this.updateInterval(items,i,this.fadeSpeed);
    }
  }
}

Fader.prototype.updateInterval = function(items,i,fadespeed) {
  this.intervals[i] = setInterval(function() {
    var indxs = arguments[0];
    var currentitem = items[indxs[i]];
    var nextitem;
    var iw = items[0].offsetWidth;

    if (indxs[i]+1 == items.length) {
      nextitem = items[0];
      indxs[i] = 0;
      
      if (!(this.circle)) {
        dofade = false;
      }
    } else {
      nextitem = items[indxs[i]+1];
      indxs[i]++;
    }
    
    if (dofade) {
      nextitem.style.left = '0px';
      
      $(currentitem).stop(true,true).fadeOut(fadespeed,function() {
        currentitem.style.left = iw + 'px';
      });
      $(nextitem).stop(true,true).fadeIn(fadespeed);
    }
  }.bind(this,this.indexes),this.automaticFadeInterval);
}
