/* JavaScript für gallery_index
 * Erstellt: 10.01.2005
 * Zuletzt Geändert: 19.3.2008
 * Author:	 Gerd Katzenbeisser
 * Anmerkungen:
 * - Benötigt wz_dragdrop.js für User-Geschwindigkeitsregelung der SlideShow
 *
 * Änderungen 19.3.2008
 * Anpassungen für Safari 3.0.4 da Safari den direkten Zugriff über document.[objectId] nicht mehr ermöglicht.
 * Hinzufügen einer Debugfunktion "gallery_DebugMsg"
 *
 * Änderungen 21.2.2005
 * - Cookie-Bug entfernt (Jede Gallery speicherte eigenen Cookie)
 *
 * Änderungen 18.2.2005:
 * - User-klicks abfangen, wenn Seite noch nicht vollständig geladen
 * - Preload des nächsten SlideShow-Bildes 
 * - Prüfen, ob nächstes SlideShow-Bild schon geladen wurde
 * - Einfügen Variable: CheckIfLoadedTimeout
 * - Einfügen der Geschwindigkeitsregelung der SlideShow
 * - Einfügen von Cookie-JS-Funktionen von http://members.ozemail.com.au/~dcrombie/cookie1.html
 * - Speichern der Geschwindigkeit in ein Cookie
 *
 * Änderungen 16.2.2005:
 * - Hinzufügen von User-Variablen
 * - Hinzufügen des GalleryCursors
 * - Scrollen der Thumbnailleiste bei Bildwechsel
 * - SlideShowfunktion implementiert
 */

/* USER - VARIABLEN */
var SlideShowSpeed		= 50;			// Prozent der SlideShow-Geschwindigkeit
var HideTNF_rows		= "*";			// String des "rows"-Attributes des Framesets bei versteckter Thumbnailleiste
var ShowTNF_rows		= "*";			// String des "rows"-Attributes des Framesets bei angezeigter Thumbnailleiste
var HideTNF_cols		= "*,10,0";		// String des "cols"-Attributes des Framesets bei versteckter Thumbnailleiste
var ShowTNF_cols		= "*,10,150";	// String des "cols"-Attributes des Framesets bei angezeigter Thumbnailleiste
var LoopImages			= true;
var ScrollTime			= 1000;			// Zeit bis zum Bild gescrollt wurde
var ScrollSteps			= 40;			// Schritte bis Ziel erreicht wurde

/* AUTO-DEFINIERTE VARIABLEN */
var Browser = navigator.appName;
var ImageFrameLoaded = false;
var ThumbnailFrameLoaded = false;
var BigImages;
var StatusInitialized = false;
var DisplayFirstImage = true;
var GalleryCursor;
var DisplayTNF		= true;
var curRequest = 0;
var SlideShowStarted = false;
var CheckIfLoadedTimeout	= 40;
var SlideShowTimeout;		// SlideShowgeschwindigkeit in Millisekunden
var SlideShowThread = 0;
var LastFrameViewed = 0;

/* ERROR-CODES */
var NotInitialized = 0;

/* Daten aus Cookie übertragen */
SlideShowSpeed = (getCookie("SlideShowSpeed") != null) ? getCookie("SlideShowSpeed") : SlideShowSpeed;

/* Initialisierungsfunktionen */
function FrameLoaded (Frame) {
	if (Frame == 0) {
		ImageFrameLoaded = true;
		// Referenz zum BigImage im ImageFrame setzen
		if (Browser == "Microsoft Internet Explorer") {
			BigImage = frames['ImageFrame'].BigImage;
			GalleryPositionText = frames['ImageFrame'].GalleryPositionText;
			SlideShowSpeedText = frames['ImageFrame'].SpeedText;
			ThumbnailFrameDoc = frames['ThumbnailFrame'].document;
		} else {
			BigImage = frames['ImageFrame'].document.getElementById("BigImage");
			GalleryPositionText = frames['ImageFrame'].document.getElementById("GalleryPositionText");
			SlideShowSpeedText = frames['ImageFrame'].document.getElementById("SpeedText");
			ThumbnailFrameDoc = frames['ThumbnailFrame'].document;
		}
	} else if (Frame == 1) {
		ThumbnailFrameLoaded = true;
		// Referenz zum Array BigImageLoc setezen, dass die Relativen Pfade zu den großen Bildern enthält
		BigImageLoc = frames['ThumbnailFrame'].BigImageLoc;
	}
	
	// Prüfe ob beide Frames geladen sind
	if (ImageFrameLoaded && ThumbnailFrameLoaded) {
		Initialize();
	}
}

function Initialize() {
	ChangeSpeed(SlideShowSpeed);
	
	BigImages = new Array(BigImageLoc.length);
	for (i = 0; i < BigImageLoc.length; i++) {
		BigImages[i] = new Image();
	}
	StatusInitialized = true;
	
	// Erstes Bild anzeigen
	if (DisplayFirstImage) {
		ViewBigImage(0);
	}
	
	PreloadImage(0);
}

/* Preloader */
function PreloadImage(ImageIndex) {
	// Prüfen, ob src bereits gesetzt
	if (BigImages[ImageIndex].src == "") {
		BigImages[ImageIndex].src = BigImageLoc[ImageIndex];
		var CurFile = BigImageLoc[ImageIndex];
		if (CurFile.lastIndexOf("/") > 0) {
			CurFile = CurFile.substr(CurFile.lastIndexOf("/") + 1);
		}
		window.status = "Preloading File " + CurFile;
		Timer = setTimeout('PreloadImage('+ImageIndex+')', CheckIfLoadedTimeout);
	} else {
		// Prüfen, ob Bild komplett geladen
		if (BigImages[ImageIndex].complete) {
			// Suche nächstes ungeladene Bild
			var NextUnloadedImage = FindUnloadedImageIndex();
			
			// Sind noch Bilder zu laden?
			if (NextUnloadedImage != -1) {
				PreloadImage(NextUnloadedImage);
			} else {
				CheckIfAllComplete();
			}
		} else {
			// src gesetzt, aber noch nicht komplett geladen
			Timer = setTimeout('PreloadImage('+ImageIndex+')', CheckIfLoadedTimeout);
		}
	}
}

function CheckIfAllComplete() {
	var AllComplete = true;
	for (i = 0; i < BigImageLoc.length; i++) {
		if (BigImages[i].src != "" && BigImages[i].complete == false) {
			AllComplete = false;
			Timer = setTimeout('CheckIfAllComplete()', CheckIfLoadedTimeout);
			break;
		}
	}
	
	if (AllComplete) {
		window.status = "Preloading Complete";
	}
}

/* Returns True if Image is Loaded */
function IsLoaded(ImageIndex) {
	if (BigImages[ImageIndex].src != "" && BigImages[ImageIndex].complete) {
		return true;
	}
	return false;
}

function FindUnloadedImageIndex() {
	var Returnwert = -1;
	for (i = 0; i < BigImageLoc.length; i++) {
		if (BigImages[i].src == "") {
			return i;			
		}
	}
	return Returnwert;
}
 
/* Preload durch USER-Mouseover */
function MouseOverPreload(ImageIndex) {
	if (StatusInitialized) {
		if (BigImages[ImageIndex].src == "") {
			var CurFile = BigImageLoc[ImageIndex];
			if (CurFile.lastIndexOf("/") > 0) {
				CurFile = CurFile.substr(CurFile.lastIndexOf("/") + 1);
			}
			window.status = "User Preloading " + CurFile;
			BigImages[ImageIndex].src = BigImageLoc[ImageIndex];
		}
	}
}

/* Navigationsfunktionen */
function ShowPrevious() {
	if (StatusInitialized) {
		if (GalleryCursor > 0) {
			ViewBigImageAndScroll(GalleryCursor - 1);
		} else if (LoopImages) {
			ViewBigImageAndScroll(BigImageLoc.length - 1);
		}
		StopSlideShow();
	} else {
		Error(NotInitialized);
	}
}

function ShowNext() {
	if (StatusInitialized) {
		if (GalleryCursor < BigImageLoc.length - 1) {
			ViewBigImageAndScroll(GalleryCursor + 1);
		} else if (LoopImages) {
			ViewBigImageAndScroll(0);
		}	
		StopSlideShow();
	} else {
		Error(NotInitialized);
	}
}

/* SlideShow */
function StartSlideShow(Delay) {
	if (StatusInitialized) {
		if (SlideShowStarted == false) {
			SlideShowStarted = true;
			var NextImage;
			if (GalleryCursor == BigImageLoc.length -1) {
				NextImage = 0;
			} else {
				NextImage = GalleryCursor;
			}
			if (Delay) {
				SlideShowTimer = setTimeout('RunSlideShow(' + NextImage + ', ' + SlideShowThread +')', Delay);						
			} else {
				RunSlideShow(NextImage, SlideShowThread);
			}				
		}
	} else {
		Error(NotInitialized);
	}
}

function StopSlideShow() {
	if (StatusInitialized) {
		if (SlideShowStarted) {
			SlideShowStarted = false;
			SlideShowThread++;
		}
	} else {
		Error(NotInitialized);
	}
}

function RunSlideShow(Position, Thread) {
	if (SlideShowStarted && Thread == SlideShowThread) {
		if (IsLoaded(Position)) {
			var NOW = new Date()
			LastFrameViewed = NOW.getTime();	
			
			var NewPosition = Position + 1;
			if (NewPosition == (BigImageLoc.length -1) && LoopImages) {
				NewPosition = 0;
			} else if (LoopImages == false) {
				NewPosition = Position;
			}
			
			if (NewPosition != Position) {
				ViewBigImageAndScroll(Position + 1);
				// Preload nächstes Bild
				MouseOverPreload(NewPosition);				
				SlideShowTimer = setTimeout('RunSlideShow(' + NewPosition + ', ' + Thread +')', SlideShowTimeout);		
			}
		} else {
			SlideShowTimer = setTimeout('RunSlideShow(' + Position + ', ' + Thread +')', CheckIfLoadedTimeout);		
		}		
	}
}

function ChangeSpeed(NewSpeed) {
	SlideShowSpeed = (NewSpeed);
	SlideShowTimeout = Math.pow(100-NewSpeed, 2) ;
	RefreshSpeedText();
	if (SlideShowStarted) {
		StopSlideShow();
		var NOW = new Date()
		var TimeToNextImage = SlideShowTimeout - (NOW.getTime() - LastFrameViewed);
		TimeToNextImage = (TimeToNextImage < 0) ? 0 : TimeToNextImage;
		StartSlideShow(TimeToNextImage);
	}
	setCookie("SlideShowSpeed", NewSpeed, "/");
}

function RefreshSpeedText() {
	SlideShowSpeedText.innerHTML = SlideShowSpeed + " %";
}

/* Positioniert das ThumbNailFrame zum aktuellen Image */
function ViewBigImageAndScroll(ImageIndex) {
	if (StatusInitialized) {
		ViewBigImage(ImageIndex);
		destAnchor = ThumbnailFrameDoc.getElementsByName("Thumb_" + ImageIndex);
		var destY 	= destAnchor[0].offsetTop;
		var thisNode = destAnchor[0];
		while (thisNode.offsetParent && (thisNode.offsetParent != document.body)) {
			thisNode = thisNode.offsetParent;
			destY += thisNode.offsetTop;
		}		
		var curY = getCurY();
		curRequest++;
		Scroll(curY, destY, 0, curRequest);
	} else {
		Error(NotInitialized);
	}
}

/* Scrollt zu einem bestimmten Ziel */
function Scroll(Start, Target, Step, Request) {
	if (Request == curRequest) {
		if (Step < ScrollSteps) {
			StepDistance = (Target - Start) / (ScrollSteps - Step);
			if (Math.abs(Target-Start) < 2) {
				Scroll (Start, Target, ScrollSteps, Request);			
			} else {
				NewPosition = Start + StepDistance;
				frames['ThumbnailFrame'].scrollTo(0, NewPosition);		
				ss_Timeout = setTimeout('Scroll(' + NewPosition + ', ' + Target + ', ' + (Step + 1) +', '+ Request +')', (ScrollTime/ScrollSteps));		
			}
		} else {
			// Position genau richten
			frames['ThumbnailFrame'].scrollTo(0, Target);
		}
	}
}


/* Anzeige des großen Bildes */
function ViewBigImage(ImageIndex) {
	// Prüfen, ob ImageFrame komplett geladen wurde
	if (StatusInitialized) {
		GalleryCursor = ImageIndex;
		BigImage.src = BigImageLoc[ImageIndex];
		GalleryPositionText.innerHTML = "" + (GalleryCursor + 1) + "/" + BigImageLoc.length;
	} else {
		Error(NotInitialized);
	}
}

/* Thumbnailframe Functions */
function ShowHideTNF() {
	if (DisplayTNF) {
		DisplayTNF = false;
		HideTNF();
	} else {
		DisplayTNF = true;
		ShowTNF();
	}
}

function HideTNF() {
	document.body.rows = HideTNF_rows;
	document.body.cols = HideTNF_cols;
}

function ShowTNF() {
	document.body.rows = ShowTNF_rows;
	document.body.cols = ShowTNF_cols;
}

/* Hilfsfunktionen */
function getCurY() {
	if (ThumbnailFrameDoc.body && ThumbnailFrameDoc.body.scrollTop)
   		return ThumbnailFrameDoc.body.scrollTop;
	if (ThumbnailFrameDoc.documentElement && ThumbnailFrameDoc.documentElement.scrollTop)
  		return ThumbnailFrameDoc.documentElement.scrollTop;
 	if (frames['ThumbnailFrame'].pageYOffset)
   		return frames['ThumbnailFrame'].pageYOffset;
 	return 0;
}

/* Fehlerfunktion */
function Error(ErrorCode) {
	switch (ErrorCode) {
		case NotInitialized:
			alert("The required Frames are not completely loaded!\nPlease wait several seconds and try again.");
			break;
		default:
			alert("Undefined Error-Code: " + ErrorCode);
			break;
	}
}

/* Gibt Debugmessages aus */
function gallery_DebugMsg(DebugMessage) {
	if(window.console) {
		window.console.log(DebugMessage);
	} 
	else {
		alert(DebugMessage);
	}
}