// Gallery Class
function CGallery()
{
  var images = new Array();
  var numImages = 0;
  var columns = 0;
  var rows = 0;
  var numIndexPages = 0;
  var galleryDir = '';
  var thumbsDir = '/thumbs/';
  var currentIndexPage = 0;
  var singleIdx = 0;
  var thumbsIdx = 0;
  var isEffectActivated = false;
  this.effectOnText = 'Effekte ausschalten';
  this.effectOffText = 'Effekte einschalten';

  // PUBLIC
  CGallery.prototype.init = function(imageBasenameList, para_columns, para_rows, para_galleryDir) {
    images = imageBasenameList.split(",");
    numImages = images.length;
    columns = para_columns;
    rows = para_rows;
    numIndexPages = Math.ceil(numImages/(columns*rows));
    galleryDir = para_galleryDir;
    currentIndexPage = 0;
    singleIdx = 0;
    thumbsIdx = 0;
    
    this.toggleEffectEnable();
    showImageButtons();
    showIndexButtons();
  }

  // PUBLIC
  CGallery.prototype.nextPic = function() {
    singleIdx++;
    this.provideNewSinglePic();
  }

  // PUBLIC
  CGallery.prototype.prevPic = function() {
    singleIdx--;
    this.provideNewSinglePic();
  }

  // PUBLIC
  CGallery.prototype.jumpToSinglePic = function(idx) {
    singleIdx = idx;
    this.provideNewSinglePic();
  }
  
  // PUBLIC
  CGallery.prototype.jumpToIndexPage = function(idx) {
    currentIndexPage = idx;
    this.provideNewIndexPage();
  }

  // PUBLIC
  CGallery.prototype.showThumb = function(obj, source) {
    obj.src=source;
  }

  // PUBLIC
  CGallery.prototype.nextIndexPage = function() {
    currentIndexPage++;
    this.provideNewIndexPage();
  }

  // PUBLIC
  CGallery.prototype.prevIndexPage = function() {
    currentIndexPage--;
    this.provideNewIndexPage();
  }

  // PUBLIC
  CGallery.prototype.toggleEffectEnable = function() {
  	if (isEffectActivated) {
		isEffectActivated = false;
  		document.getElementById('effectButton').innerHTML = this.effectOffText;
 	}
 	else {
 		isEffectActivated = true;
  		document.getElementById('effectButton').innerHTML = this.effectOnText;
  	}
  }

  // PRIVILLEGED
  this.provideNewSinglePic = function () {
	var task='document.getElementById(\'singlePic\').src="' + galleryDir + images[singleIdx] + '";';
  	if (isEffectActivated) {
	    new Effect.Puff('singlePic', {duration:0.7});
	    window.setTimeout(task, 500);
	    window.setTimeout('Effect.Appear(\'singlePic\', {duration:0.5,from:0.0,to:1.0})',1500);
	}
	else {
		window.setTimeout(task,0);
	}

    var idxPageStart = rows * columns * currentIndexPage;
    var idxPageEnd = idxPageStart + rows * columns - 1;
    if (singleIdx < idxPageStart) {
      gallery.prevIndexPage();
    }
    if (singleIdx > idxPageEnd) {
      gallery.nextIndexPage();
    }
    showImageButtons();
  }

  // PRIVILLEGED
  this.provideNewIndexPage = function () {
    var indexPics = getElemsByName('td', 'indexPic');
    var startIdx = indexPics.length * currentIndexPage;
    var i=0;
    for (i=0; i < indexPics.length; i++) {
      if ((startIdx + i) < numImages) {
    
        var srcGrey = galleryDir + thumbsDir + 'grey/' + images[(startIdx + i)];
        var srcColor = galleryDir + thumbsDir + 'color/' + images[(startIdx + i)];
        var task = '<a href="javascript:gallery.jumpToSinglePic(' + (startIdx + i) + ');">';
        task += "<img class=\"indexImage\" onmouseover=\"gallery.showThumb(this,'" + srcColor + "');\" onmouseout=\"gallery.showThumb(this,'" + srcGrey + "');\" src=\"" + srcGrey + "\"/>";
        task += '</a>';
        indexPics[i].innerHTML = task;
      }
      else {
        indexPics[i].innerHTML = '';
      }
    }
    var indexPage = document.getElementById('indexPageNumbers');
    indexPage.innerHTML = 'Seite ' + (currentIndexPage+1) + ' von ' + numIndexPages;
    showIndexButtons();
  }
  
  // PRIVATE
  function getElementsByName_iefix (tag, name) {
    var elem = document.getElementsByTagName(tag);
    var retArr = new Array();
    for(i=0, iarr=0; i < elem.length; i++) {
      att = elem[i].getAttribute("name");
      if(att == name) {
        retArr[iarr] = elem[i];
        iarr++;
      }
    }
    return retArr;
  }

  // PRIVATE
  function getElemsByName(tag, name) {
    var retArr = new Array();
    if ((navigator.appName == "Microsoft Internet Explorer") || 
        (navigator.appName == "Opera"))
    {
    	retArr = getElementsByName_iefix(tag, name);
    }
    else {
    	retArr = document.getElementsByName(name);
    }
    return retArr;
  }

  // PRIVATE
  function showImageButtons() {
    var prevButton = document.getElementById("prevButton");
    var nextButton = document.getElementById("nextButton");
    singleIdx > 0 ? prevButton.style.visibility = "visible" : prevButton.style.visibility = "hidden";
    singleIdx < numImages-1 ? nextButton.style.visibility = "visible" : nextButton.style.visibility = "hidden";
  }

  // PRIVATE
  function showIndexButtons() {
    var prevIndexButton = document.getElementById('prevIndexButton');
    var nextIndexButton = document.getElementById('nextIndexButton');
    currentIndexPage > 0 ? prevIndexButton.style.visibility = "visible" : prevIndexButton.style.visibility = "hidden";
    currentIndexPage < numIndexPages-1 ? nextIndexButton.style.visibility = "visible" : nextIndexButton.style.visibility = "hidden";
  }
} // end of CGallery


// initalization of the gallery
gallery = new CGallery();
function initGallery(imageBasenameList, columns, rows, galleryDir)
{
  gallery.init(imageBasenameList, columns, rows, galleryDir);
}
