
function SimpleCarousel() {
  
  var config;
  var currItem = 0;
  var itemCount = 0;
  var slideshowId;
  var currInstance = this;
  var running = false;
  var showArrows = false;
  var fade = false;
  var callback = null;
  
  this.load = function(cfg) {
    config = cfg;
    if (typeof(config.imageClass) != "undefined")
      itemCount = jQuery("." + config.imageClass).length;
    else 
      itemCount = jQuery("." + config.contentClass).length;

    if (typeof(config.loadedItemCallback) != "undefined")
      callback = config.loadedItemCallback;

    var leftArrow = rightArrow = false;
    
    if (getArrowId('left') != null && getArrowId('right') != null) {
      // Set back button handler 
      if ( typeof(jQuery(getArrowId('left'))) != "undefined") {

        // Disable dragging 
        var arrowLeftEl = jQuery(getArrowId('left'));
        arrowLeftEl.onselectstart = function () { return false; } // ie
        arrowLeftEl.onmousedown = function () { return false; } // mozilla

        jQuery(getArrowId('left')).click(function() {
          if (running) toggleSlideshow();
          currInstance.back();
        });
        var leftArrow = true;
      }
      
      // Set next button handler
      if ( typeof(jQuery(getArrowId('right'))) != "undefined") {

        // Disable dragging 
        var arrowRightEl = jQuery(getArrowId('right'));
        arrowRightEl.onselectstart = function () { return false; } // ie
        arrowRightEl.onmousedown = function () { return false; } // mozilla

        jQuery(getArrowId('right')).click(function() {
          if (running) toggleSlideshow();
          currInstance.next();
        });
        var rightArrow = true;
      }
    }
    showArrows = (leftArrow && rightArrow);

    // Set navigation button handlers
    var navBtnCounter = 0;
    jQuery("." + config.navBtnClass).each(function() {
      var localCounter = navBtnCounter;
      
      // Display buttons for as many items as there are in slideshow
      if (jQuery(this).hasClass("hide") && navBtnCounter < itemCount) 
        jQuery(this).removeClass("hide")
      
      jQuery(this).click( function(){ 
        if (running) toggleSlideshow();
        currItem = localCounter; 
        updateCarousel(); 
      });
      navBtnCounter++;
    });
    
    // Assign fade setting
    fade = config.fade;

    // Start slideshow, if enabled
    this.first(false); // disable fading on first load
    if (config.slideshow) {
      currInstance.startSlideshow();
      // Set slidehsow toggle button handler, if it exists
      if ( typeof(jQuery(getToggleId())) != "undefined")
        jQuery(getToggleId()).click(toggleSlideshow);
    }
  }
  
  this.first = function(doFade) {
    currItem = 0;
    updateCarousel(getFade(doFade));
  }
  
  this.last = function(doFade) {
    currItem = itemCount-1;
    updateCarousel(getFade(doFade));
  }

  this.next = function(doFade) {
    currItem++;
    if ( currItem == itemCount ) currItem = 0;
    updateCarousel(getFade(doFade));
  }
  
  this.back = function(doFade) {
    currItem--;
    updateCarousel(getFade(doFade));
  }
  
  var getFade = function(doFade) {
    if (typeof(doFade) == "undefined")
      return config.fade;
    else 
      return doFade;
  }

  var updateCarousel = function(doFade) {
    if (currItem == 0)
      toggleArrow('left', false);
    else
      toggleArrow('left', true);
    if (currItem == (itemCount-1) )
      toggleArrow('right', false);
    else 
      toggleArrow('right', true);

    toggleItem(config.imageClass, getFade(doFade));
    toggleItem(config.contentClass, getFade(doFade));
    toggleMarker();    
  }
  
  var toggleMarker = function() {
    var markerEl = jQuery("." + config.navBtnClass)[currItem];
    if ( typeof(markerEl) != "undefined" ) {
      var navBtnCounter = 0;
      jQuery("." + config.navBtnClass).each(function() {
        if (currItem == navBtnCounter) jQuery(this).addClass(config.navMarkerClass);
        else jQuery(this).removeClass(config.navMarkerClass);
        navBtnCounter++;
      });
    }
  }
  
  var toggleItem = function(itemClass, doFade) {
    var carouselItemCounter = 0;
    var currEl = null;
    jQuery("." + itemClass).each(function() {
      if (carouselItemCounter != currItem) jQuery(this).css({ 'display' : 'none' });
      else currEl = this;
      carouselItemCounter++;
    });
    if (currEl != null) {
      if (callback != null) callback.apply();
      if (doFade)
        jQuery(currEl).fadeIn(1000);
      else 
        jQuery(currEl).toggle();
    }
  }

  var getArrowId = function(type){
    if ( typeof(config.arrows) == "undefined" || typeof(config.arrows[type]) == "undefined" ) return null;
    else return "#" + config.arrows[type];
  }

  var toggleArrow = function(type, state) {
    var displayVal = ( state ) ? "block" : "none";
    var arrowEl = jQuery(getArrowId(type));
    if (typeof(arrowEl) != "undefined")
      jQuery(arrowEl).css({ "display" : displayVal });
  }
  
  var getToggleId = function(){
    return "#" + config.toggleId;
  }
  
  this.startSlideshow = function() {
    var interval = (typeof(config.interval) == "undefined") ? 10000 : config.interval;
    slideshowId = window.setInterval( function() { currInstance.next() }, interval );    
    running = true;
  }

  this.stopSlideshow = function(){
    window.clearInterval(slideshowId);
    running = false;
  }
  
  var toggleSlideshow = function() {
    if (config.slideshow) {
      if (running) {
        currInstance.stopSlideshow();
        jQuery(getToggleId()).addClass("paused");
      } else {
        currInstance.next();
        currInstance.startSlideshow();
        jQuery(getToggleId()).removeClass("paused");
      }
    }
  }

  this.pauseSlideshow = function(paused){
    if (paused) {
      currInstance.stopSlideshow();
      jQuery(getToggleId()).addClass("paused");
    }
    else {
      currInstance.next();
      currInstance.startSlideshow();
      jQuery(getToggleId()).removeClass("paused");
    }
  }

}
