var StackManager = function(stacks, options) {
  var myself = this;
  stacks = $H(stacks);
  var currentPos    = 0;
  var preloads      = $H();
  var currentTopic  = stacks.first()[0];
  var cLeft, cRight, lastClickedImage;

  options = Object.extend({
    suffix: 'jpg',
    first:  ''
  }, arguments[1] || {});
    
  Base.addInitFunction(function(){
    cLeft   = $("stapel_links");
    cRight  = $("stapel_rechts");
  
    cRight.onclick = function(){ 
      currentPos ++;
      if (currentPos == stacks[currentTopic]) currentPos = 0;
      showPic(currentTopic, currentPos);
    }
  
    cLeft.onclick = function(){
      currentPos --;
      if (currentPos==-1) currentPos = stacks[currentTopic]-1;
      showPic(currentTopic,currentPos);
    }

    if (img = $I(document.images["bildgross"])) {
      img.onclick = cRight.onclick;
    }
    
    stacks.each(function(stack){
      var name    = stack[0];
      var height  = stack[1];
      var stapel;
      
      preloads[name] = {pics: [], texts: [], icons: []};
  
      // preloading
      var i;
      for (i=0; i<height; i++){
        var img = new Image();
        img.src = "img/"+name+(i+1)+"."+options.suffix; 
        preloads[name].pics.push(img);
        var jmg = new Image();
        jmg.src = "img/"+name+"-t.gif";  
        preloads[name].texts.push(jmg);
        var kmg = new Image();
        kmg.src = "img/"+name+"-i.gif";  
        preloads[name].icons.push(kmg);
      }
      
      if (stacks.keys().length == 1) {
        myself.clik(name, (height>1));
      } else {
        if (stapel = $('stapel_'+name))
          stapel.onclick = function(event){ myself.clik(name, (height>1), event || window.event) }.bind(this);
        if (name == options.first) myself.clik(name, (height>1));
      }
      
    }.bind(this));
  });

  this.clik = function (topic, showArrows, event){
    if(options.hide) new Effect.Fade($(options.hide), {duration: 0.2});
    if (event) {
      var clickedImage = event.target || event.srcElement;
      if (lastClickedImage) {
        if (clickedImage == lastClickedImage) return;
        else {
          Element.removeClassName(lastClickedImage.parentNode.getElementsByTagName('span')[0], 'active');
          lastClickedImage.onmouseout = lastClickedImage._onmouseout;
          if (lastClickedImage.onmouseout) lastClickedImage.onmouseout();
        }
      }
      Element.addClassName(clickedImage.parentNode.getElementsByTagName('span')[0], 'active');
      clickedImage._onmouseout = clickedImage.onmouseout;
      clickedImage.onmouseout = function(){};
      lastClickedImage = clickedImage;
    }

    cLeft.style.visibility = cRight.style.visibility = showArrows?"visible":"hidden";

    currentTopic  = topic;
    currentPos    = 0;
    
    showPic(currentTopic, currentPos);
  }

  var showPic = function(topic,num){
    var img, legendeText;
    if (legendeText = $('legendeText')){
      var tryText =  'texte/'+topic+"_"+num+".txt";
      if (showPic.currentText != tryText) {
        new Ajax.Updater({success: legendeText}, tryText, {
          method:     'get',
          evalScripts: true,
          onComplete: function(){ Base.initRolloverImgs(); showPic.currentText = tryText; },
          onFailure:  function(){
            tryText = 'texte/'+topic+".txt";
            if (showPic.currentText != tryText) {
              new Ajax.Updater({success: legendeText}, tryText, {
                method: 'get',
                evalScripts: true,
                onComplete: function(){ Base.initRolloverImgs(); showPic.currentText = tryText; },
                onFailure: function(){
                  legendeText.innerHTML = '';
                }
              });
            }
          }
        });
      }
    } else if (img = $I(document.images["legende"])) {  
      img.setSrc(preloads[topic].texts[num].src); 
    }
    if (img = $I(document.images["bildgross"])) img.setSrc(preloads[topic].pics[num].src);
    if (img = $I(document.images["minibild"]))  img.setSrc(preloads[topic].icons[num].src); 
  }
};

var BufferedLoader = function(images){
  buffer = [];
  
  Event.observe(window, 'load', function(){
    for (i=0; i<images.length; i++){
      buffer[i] = new Image();
      buffer[i].img = images[i];
      Event.observe(buffer[i], 'load', function(e){
        $(e.target.img).src = e.target.src;
      });
      buffer[i].src = images[i]+".gif"; 
    }  
  });
}

var Translator = function(initLanguage){
  Base.addInitFunction(function(){
    Base.initRolloverImgs();
    Base.translate(initLanguage);
  });
}

var popup = function(source, which, on, offset){
  
  if (popup.active) {
    Element.hide(popup.active);
  }
  
  if (!$(which).style.top){
    Element.clonePosition(which, source, 
    {setWidth: false, setHeight: false, 
     offsetTop: offset ? offset.top : 0, offsetLeft : offset ? offset.left : 0});
  }
  
  if (on) {
    popup.active = which;
    Element.show(which);
  } else {
    Element.hide(which);
  }
}

// Generelle onload-Sachen

// Base.addInitFunction(function(){ Base.initRolloverImgs();}); 

