// -----------------------------------------------------------------------------------
//
//  Name: Slidebox
//  Beschreibung: Crossbrowser Slideshow mit Überblend-Effekt
//  Version: 1.1
//  Build: 26.05.2007
//  Autor: Konrad Abmeier
//  (c)Copyright 2007 Konrad Abmeier
//
// -----------------------------------------------------------------------------------

//  Hinweise
//
//  Es werden folgende externe Bibliotheken benötigt:
//  Prototype JavaScript Framework (http://www.prototypejs.org/)
//  script.aculo.us JavaScript libraries (http://script.aculo.us/)
//  
//  Die Dateien sollten im selben Unterverzeichnis (z.B.: "/js")
//  und werden in folgender Reihenfolge zwischen <head></head> eingebunden:
//  <script src="/js/prototype.js" type="text/javascript" ></script>
//  <script src="/js/scriptaculous.js?load=effects" type="text/javascript" ></script>
//  <script src="/js/slidebox.js" type="text/javascript" ></script>
//
//  Bilder und Position werden vom HTML Dokument gesteuert.
//  Das erste (Start) Bild gibt die größe des Containers vor.
//  Das Präfix gibt die Box und die Bilder für die Slideshow an.
//  Das erste (Start) Bild steht in der Box, die anderen Bilder werden
//  über Links referenziert. Im folgenden Beispiel wurde s als Präfix gewählt:
//
//  <div id="sbox">
//    <img id="simage" src="/img/bild1.jpg" alt="Slideshow" width="980" height="388" />
//    <a class="slidelink" href="/img/bild2.jpg" rel="slidebox[s]">&nbsp;</a>
//    <a class="slidelink" href="/img/bild3.jpg" rel="slidebox[s]">&nbsp;</a>
//    <a class="slidelink" href="/img/bild4.jpg" rel="slidebox[s]">&nbsp;</a>
//  </div>
//
//  Das (Start) Bild ist von einem DIV-Container der From "<div id="Präfixbox"></div>" umschlossen.
//  Das (Start) Bild hat die id id="Präfiximage". Danach folgen die Links auf die weiteren Bilder mit
//  class="slidelink" und rel="slidebox[Präfix]". In class="slidelink" wird einfach die Anzeige ausgeschaltet
//  .slidelink {display: none;}
//  Der Präfix gibt somit die Box, das Satrtbild und die Gruppe der zu slidenden Bilder an.

// -----------------------------------------------------------------------------------

//  Konfiguration
//
var myInterval = 3; // Zeit zwischen den einzelnen Bildern in Sekunden
var myduration = 1.5 // Zeit für den Überblend-Effekt in Sekunden
var myLoop = true;  // Nach dem letzten Bild von von beginnen? (true,false)

// -----------------------------------------------------------------------------------

// -----------------------------------------------------------------------------------
// ab hier bitte nichts mehr ändern!
// -----------------------------------------------------------------------------------

//	init vars
//
var sbimageArray = new Array;
var sbactiveImage = -1;
// -----------------------------------------------------------------------------------

//	Array Objekt um removeDuplicates erweitern
//	- array.removeDuplicates()
//
Array.prototype.removeDuplicates = function () {
	for(i = 1; i < this.length; i++){
		if(this[i][0] == this[i-1][0]){
			this.splice(i,1);
		}
	}
}

// -----------------------------------------------------------------------------------

var Slidebox = Class.create();

Slidebox.prototype = {
  
  // init
	initialize: function() {
		if (!document.getElementsByTagName){ return; } // abbrechen, wenn getElementsByTagName nicht vorhanden ist

    // alle links finden
		var anchors = document.getElementsByTagName('a');
		
		// init 
		sbimageArray = [];
		var aryParts = new Object();

    // alle prüfen
		for (var i=0; i<anchors.length; i++){
			var anchor = anchors[i];
			
			// nur rel berücksichtigen
			var relAttribute = String(anchor.getAttribute('rel'));
			
			// und davon nur slidebox
			if (anchor.getAttribute('href') && (relAttribute.toLowerCase().match(/^slidebox\[(.+)\]$/i))){

        // Startbild
    	  if( i == 0 ){
          if( !document.getElementById(RegExp.$1 + 'image').getAttribute('src') ) { return; }
          else{
            sbimageArray.push(new Array(document.getElementById(RegExp.$1 + 'image').getAttribute('src'), RegExp.$1));
          }
        }        
			  
				sbimageArray.push(new Array(anchor.getAttribute('href'), RegExp.$1));
        aryParts[RegExp.$1] = RegExp.$1;				
			}
		}
		sbimageArray.removeDuplicates();

    // DOM erweitern
    for (var boxname in aryParts){
      if( document.getElementById(boxname + "box") ){
        var objBox = document.getElementById(boxname + "box");

        // imgContainer
        for( var i=0; i<sbimageArray.length; i++ ){
      		var objImgContainer = document.createElement("div");
      		objImgContainer.setAttribute('id','ic'+i);
      		objImgContainer.style.position = 'absolute';
      		objImgContainer.style.overflow = 'hidden';
      		objImgContainer.style.width = ''+$(boxname + "box").getWidth()+'px';
      		objImgContainer.style.height = ''+$(boxname + "box").getHeight()+'px';
      		if( i == 0 ){
            $(boxname + "box").setStyle({width: ''+objImgContainer.style.width+'',height: ''+objImgContainer.style.height+''});
          }
      		objImgContainer.style.display = 'none';
          objBox.appendChild(objImgContainer);
	
          var objImage = document.createElement("img");
          objImage.setAttribute('src', sbimageArray[i][0]);
          objImgContainer.appendChild(objImage);
        }
		  }
		}		
	  this.start(boxname);
	},
	
	//
	//	start()
	start: function(boxname) {
	  if( sbactiveImage == -1 ){
      sbactiveImage = 0;
 	    $('ic'+sbactiveImage).show();
      $(boxname + 'image').hide();
    }

	  if( sbactiveImage < sbimageArray.length-1 || (sbactiveImage == sbimageArray.length-1 && myLoop ) ){
      setTimeout("mySlidebox.changeImage()", (myInterval*1000));      
    }
	},

	//
	//	changeImage()
	//	Hide most elements and preload image in preparation for resizing image container.
	//
	changeImage: function() {
	  
	  osbactiveImage = sbactiveImage;

    if( sbactiveImage < sbimageArray.length-1 ) {sbactiveImage++;}
    else if( sbactiveImage == sbimageArray.length-1 && myLoop ) {sbactiveImage=0;}
    
    imgPreloader = new Image();
    imgPreloader.onload=function(){
      new Effect.Fade('ic'+osbactiveImage, { duration: myduration, from: 1.0, to: 0.0 })
      new Effect.Appear('ic'+sbactiveImage, { duration: myduration, from: 0.0, to: 1.0, afterFinish: function(){	mySlidebox.start() } });      
    }
    imgPreloader.src = sbimageArray[sbactiveImage][0];
    mySlidebox.preloadNextImages();
	},

  //
	//	preloadNextImages()
	//	Preload previous and next images.
	//
	preloadNextImages: function(){

		if((sbimageArray.length - 1) > sbactiveImage){
			preloadNextImage = new Image();
			preloadNextImage.src = sbimageArray[sbactiveImage + 1][0];
		}
	}
}

// -----------------------------------------------------------------------------------

function initSlidebox() { mySlidebox = new Slidebox(); }
Event.observe(window, 'load', initSlidebox, false);
