/* JavaScript für gallery_index
 * Erstellt: 10.01.2005
 * Zuletzt Geändert: 21.2.2005
 * Author:         Gerd Katzenbeisser
 * Anmerkungen:
 * - Benötigt wz_dragdrop.js für User-Geschwindigkeitsregelung der SlideShow
 *
 * Ä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;

/* COOKIE-SCRIPT VARIABLEN */
var bikky = document.cookie; // retrieve cookie string
var today = new Date();
var expiry = new Date(today.getTime() + 356 * 24 * 60 * 60 * 1000); // 1  Jahr

/* 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.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;
}

// Original JavaScript code by Duncan Crombie: dcrombie at chirp.com.au
// Please acknowledge use of this code by including this header.


function getCookie(name) { // use: getCookie("name");
        var index = bikky.indexOf(name + "=");
        if (index == -1) return null;
        index = bikky.indexOf("=", index) + 1;
        var endstr = bikky.indexOf(";", index);
        if (endstr == -1) endstr = bikky.length;
        return unescape(bikky.substring(index, endstr));
}

function setCookie(name, value, path) { // use: setCookie("name", value);
        if (value != null && value != "")
                document.cookie=name + "=" + escape(value) + "; expires=" + expiry.toGMTString() + "; path=" + path;
        bikky = document.cookie; // update bikky
}

/* 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;
        }
}
