function BatchNavigation( prefix ) {

  var navi = this;

  var slideInProgress = false;

  var currSlideEndPosX = 0;
  var newSlideEndPosX = 0;

  var currSlideStartPosX = 0;
  var newSlideStartPosX = 0;

  var currNum = 1;
  var maxNum = 0;
  var elemId = prefix;
  var diff = 0;

  var list;
  var slides;

  var currSlide;
  var newSlide;

  var numElem;
  var btnForward;
  var btnBack;

  this.doSlide = function( ) {

    var cpx = currSlide.offsetLeft;
    var npx = newSlide.offsetLeft;

    var rerunFunction = false;

    if( diff > 0 ) {
      if( (cpx + diff) < currSlideEndPosX ) {
        rerunFunction = true;
    	} else {
    		rerunFunction = false;
    	}
    } else {
      if( (cpx + diff) > currSlideEndPosX ) {
        rerunFunction = true;
    	} else {
    		rerunFunction = false;
    	}
    }

    if(rerunFunction) {

      slideInProgress = true;
      currSlide.style.left = (cpx + diff) + 'px';
      newSlide.style.left = (npx + diff) + 'px';
      var callback = this;

      setTimeout( function() { callback.doSlide() }, BatchNavigation.prototype.slideTimer);

    } else {
      currSlide.style.left = currSlideEndPosX + 'px';
      currSlide.style.display = 'none';
      newSlide.style.left = newSlideEndPosX + 'px';
  		slideInProgress = false;

    }

  }


  this.startSlide = function( dir ) {

    var newNum = currNum + (dir*-1);

    /* loop */
    if(newNum > maxNum)
      newNum = 1;
    if(newNum < 1)
      newNum = maxNum;

    currSlide = slides[currNum-1];
    newSlide = slides[newNum-1];

    if(slideInProgress || currSlide == null || newSlide == null) return;

    currNum = newNum;
    currSlideEndPosX = list.offsetLeft + ( dir*(currSlide.offsetWidth));
    newSlideStartPosX = list.offsetLeft + ( (-1)*dir*(currSlide.offsetWidth));

    currSlide.style.left = currSlideStartPosX + 'px';
    newSlide.style.left = newSlideStartPosX + 'px';

    currSlide.style.position = 'absolute';
    newSlide.style.position = 'absolute';

    currSlide.style.display = 'block';
    newSlide.style.display = 'block';


    diff = dir * BatchNavigation.prototype.slideSpeed;

    this.doSlide();

    numElem.innerHTML = currNum;

  }



  this.initBatchNavigation = function() {

    list = document.getElementById( elemId + '');
    list.navi = this;

    slides = new Array();
    for(var i=0; i<list.childNodes.length; i++) {
      if(list.childNodes[i].nodeType == 1)
        slides.push(list.childNodes[i]);
    }

    maxNum = slides.length;
    list.style.width = slides[0].offsetWidth*2 + 'px';
    list.style.height = slides[0].offsetHeight+ 'px';

    numElem = document.getElementById( elemId + '_curr_num');

    btnForward = document.getElementById( elemId + '_btn_forward');
    btnForward.style.cursor = 'pointer';
    btnForward.onclick = function () {
      navi.startSlide(-1);
      return false;
    };

    btnBack = document.getElementById( elemId + '_btn_back');
    btnBack.style.cursor = 'pointer';
    btnBack.onclick = function () {
      navi.startSlide(1);
      return false;
    };

  }

}

BatchNavigation.prototype.slideSpeed = 30;
BatchNavigation.prototype.slideTimer = 5;
