function Carousel(config) {

  var scope = this;
  
  scope.config = config;
  scope.old_index=null;
  scope.cache = {
    cursor: 0
  };
  
  YUI().use('node', 'io', 'json-parse', 'anim', function(Y) {
    scope.Y = Y;
    scope.build();
  });

}

Carousel.prototype.build = function() {

  var scope = this;
  
  // init cursor at 1 to start animation
 // init cursor at 0 to stop the animation 
  scope.cache.cursor = 1;
  
  // init content
  if(scope.config.content || scope.config.ajax)
    scope.setContent();
  
  // init animation
  scope.resetRoll();

  
};

// fill carousel
Carousel.prototype.fillCarousel = function(contentObj) {
  
  var scope = this;
  
  var carousel = scope.Y.get('#' + scope.config.carouselId);
  if(carousel != null) {
    carousel.query('.tab1').set('innerHTML', contentObj.title1);
    carousel.query('.tab2').set('innerHTML', contentObj.title2);
    carousel.query('.tab3').set('innerHTML', contentObj.title3);
    carousel.query('.tab4').set('innerHTML', contentObj.title4);
    carousel.query('.content1').set('innerHTML', contentObj.content1);
    carousel.query('.content2').set('innerHTML', contentObj.content2);
    carousel.query('.content3').set('innerHTML', contentObj.content3);
    carousel.query('.content4').set('innerHTML', contentObj.content4);
  }
};

// set content
Carousel.prototype.setContent = function() {
  
  var scope = this;
  
  if(scope.config.content) {
    // data coming directly from back-end
    scope.fillCarousel(scope.config.content);
  } else {
    // data coming from ajax
    scope.Y.io(scope.config.ajax, {
      on: {
        success: function(id, xhr, args) {
          var json = scope.Y.JSON.parse(xhr.responseText);
          scope.fillCarousel(json);
        }
      }
    });
  }
};

// reset interval
Carousel.prototype.resetRoll = function() {

  var scope = this;
  
  window.clearInterval(scope.cache.intervalId);
  
  scope.cache.intervalId = window.setInterval(function() {
    scope.switchTab('#' + scope.config.carouselId, scope.cache.cursor, 1);
  }, scope.config.duration * 1000);
};

// tab switcher
Carousel.prototype.switchTab = function(carousel, index, auto) {

  var scope = this;

  if(scope.old_index==index){
    return;
  }


  if(!auto) {
    scope.resetRoll();
  }
  
  // to fire the animation init the last parameter (offset) to 1 
 // to cancel the animation init the last parameter(offset) to 0 
  scope.cache.cursor = scope.getCarouselIndex(4, index, 1);
  
  carousel = scope.Y.get(carousel)
    .removeClass('select1')
      .removeClass('select2')
        .removeClass('select3')
          .removeClass('select4');
  var content;

  if(index == 1) {
    content = carousel
      .query('.content2')
        .setStyle('opacity', '0');
    carousel.addClass('select2');
  } else if(index == 2) {
    content = carousel
      .query('.content3')
        .setStyle('opacity', '0');
    carousel.addClass('select3');
  } else if(index == 3) {
    content = carousel
      .query('.content4')
        .setStyle('opacity', '0');
    carousel.addClass('select4');
  } else {
    content = carousel
      .query('.content1')
        .setStyle('opacity', '0');
    carousel.addClass('select1');
  }

  scope.old_index=index;
  new scope.Y.Anim({
    node: content,
    from: {'opacity': 0},
    to: {'opacity': 1},
    duration: 0.3
  }).run();

};

// carousel index
Carousel.prototype.getCarouselIndex = function(len, pos, offset) {

  if((pos + offset) >= len) {
    return (pos + offset) % len;
  }
  if(pos + offset < 0) {
    var tmp = ((pos + offset) % len) + len;
    return (tmp == len ? 0 : tmp);
  }
  return pos + offset;
};

