/// <reference path="jquery-1.4.1-vsdoc.js" />
/**
* jQuery plugin: ImageNextPrev
* http://www.drweb.de/
*
* Written by Sven Drieling
* Release date: 19-Aug-2010
* Version: 0.1
*
* Licensed under the MIT license.
* http://www.opensource.org/licenses/mit-license.php
*
* Adaptiert von 69° - www.69grad.de
*
*/
(function (jQuery) {

    jQuery.fn.imagenextprev = function (options, index, vars) {

        var defaults = {
            images: [],
            nextPrevShow: "mousecursor",  // none, mousecursor, fixed
            imagePrev: "/App_Themes/CssFramework/Module/Modul_Sliding_Gallery/Images/ImageHoverL.png",
            imageNext: "/App_Themes/CssFramework/Module/Modul_Sliding_Gallery/Images/ImageHoverR.png",
            pagerID: ""
        };

        this.each(function () {

            var imagePrev = null;
            var imageNext = null;



            var img = jQuery(this);
            img.data('imagenextprev:vars', vars);

            var opts = jQuery.extend(defaults, options);

            // IE6, andere Hovergrafiken
            if ((window.XMLHttpRequest == undefined) && (ActiveXObject != undefined)) {
                opts.imagePrev = "/App_Themes/CssFramework/Module/Modul_Sliding_Gallery/Images/ImageHoverL-ie.png";
                opts.imageNext = "/App_Themes/CssFramework/Module/Modul_Sliding_Gallery/Images/ImageHoverR-ie.png";
            }

            loadImages();

            // Enthält weiter/zurück-Anzeige (Pfeil)
            if (opts.images.length > 1) {
                var nextPrev = jQuery("<div></div>")
               .css({ position: "absolute",
                   opacity: 1,
                   cursor: "pointer",
                   filter: "", // IE
                   lineHeight: 0, fontsize: 0
               })
               .hide();
                jQuery("body").append(nextPrev);
            }

            // erstes Bild laden
            var url = window.location.href
            if (url.indexOf("#img-") > -1) {
                id = url.split("#img-")[1];
                for (i = 0; i < opts.images.length; i++) {
                    if (opts.images[i][2] == id) {
                        vars.imageIdx = i;
                        break;
                    }
                }
            }

            // Pager
            if (index != null) {
                vars.imageIdx = vars.imageIdx + index;
                goToImage(vars.imageIdx);
                return;
            } 

            img.attr("src", opts.images[vars.imageIdx][0]);
            $("#SlidingGalleryCaption").html(opts.images[vars.imageIdx][1]);
            $(opts.pagerID + " .CounterCurrent").html(vars.imageIdx + 1);
            
            if (opts.images.length > 1) {
                jQuery(img).click(click)
                       .mousemove(mousemove)
                       .mouseout(mouseout);

                jQuery(nextPrev).click(click)
                            .mousemove(mousemove)
                            .mouseout(mouseout);
            }

            function loadImages() {
                // Pfeilbilder laden
                imagePrev = new Image();
                imagePrev.alt = "->";
                imagePrev.src = opts.imagePrev;

                imageNext = new Image();
                imagePrev.alt = "<-";
                imageNext.src = opts.imageNext;
            }

            function whichSide(e) {

                var vars = img.data("imagenextprev:vars");

                var side;

                var imageWidth = jQuery(img).width();
                var imageHeight = jQuery(img).height();
                var imageCenter = imageWidth / 2;
                var imagePos = jQuery(img).offset(); // Bildposition (top, left)

                // Mausposition relativ zur linken, oberen Ecke des Bildes berechnen
                var mouseRelX = e.pageX - imagePos.left;
                var mouseRelY = e.pageY - imagePos.top;

                // Links oder rechts von der Bildmitte?
                if (mouseRelX < imageCenter) {
                    side = "left";
                    if (side != vars.currentSide) {
                        vars.currentSide = side;
                        jQuery(nextPrev).html(imagePrev);
                    }
                } else {
                    side = "right";
                    if (side != vars.currentSide) {
                        vars.currentSide = side;
                        jQuery(nextPrev).html(imageNext);
                    }
                }

                // Position des nextPrev-Divs setzen
                var lrWidth = jQuery(nextPrev).width();
                var lrHeight = jQuery(nextPrev).height();

                switch (opts.nextPrevShow) {
                    case "fixed":

                        // Vertikal zentriert, 10 Punkte vom Rand
                        if ("left" == side) {
                            jQuery(nextPrev).css({ top: imagePos.top + (imageHeight - lrHeight) / 2,
                                left: imagePos.left + 30
                            });
                        } else {
                            jQuery(nextPrev).css({ top: imagePos.top + (imageHeight - lrHeight) / 2,
                                left: imagePos.left + imageWidth - lrWidth - 30
                            });
                        }
                        break;

                    case "mousecursor":

                        // Beim Mauszeiger
                        var x = mouseRelX;
                        var y = mouseRelY - lrHeight / 2; // Vertikal zentrieren

                        if ("left" == side) {
                            x = x - lrWidth; // Links vom Mauszeiger setzen
                        }

                        // Innerhalb des Bildes bleiben
                        if (x < 0) { x = 0; }
                        if (x > imageWidth - lrWidth) { x = imageWidth - lrWidth; }
                        if (y < 0) { y = 0; }
                        if (y > imageHeight - lrHeight) { y = imageHeight - lrHeight; }

                        jQuery(nextPrev).css({ top: imagePos.top + y, left: imagePos.left + x });
                        break;

                    case "none":
                    default:
                }

                return side;
            }

            function click(e) {

                var vars = img.data("imagenextprev:vars");

                // Position merken für mousemove- nach click-Event-Webbbrowser (Chrome, Safari)
                vars.lastX = e.pageX;
                vars.lastY = e.pageY;

                jQuery(nextPrev).hide();

                var side = whichSide(e);

                if ("left" == side) {
                    vars.imageIdx--;
                } else {
                    vars.imageIdx++;
                }

                goToImage(vars.imageIdx);

                e.preventDefault();
            }

            function goToImage(index) {

                if (index < 0) {
                    vars.imageIdx = opts.images.length - 1;
                    index = vars.imageIdx;
                }

                if (index >= opts.images.length) {
                    vars.imageIdx = 0;
                    index = 0;
                }

                img.fadeOut(500, function () {

                    img.attr("src", opts.images[index][0]);
                    img.attr("alt", opts.images[index][1]);
                    window.location.href = "#img-" + opts.images[index][2]
                    $(opts.pagerID + " .CounterCurrent").html(index + 1);

                    img.fadeIn(500);

                    $("#SlidingGalleryCaption").fadeOut(500, function () {
                        $("#SlidingGalleryCaption").html(opts.images[index][1]);
                        $("#SlidingGalleryCaption").fadeIn(500);
                    });

                });
            }

            function mousemove(e) {

                var vars = img.data("imagenextprev:vars");

                if (vars.lastX != e.pageX || vars.lastY != e.pageY) {
                    if ("none" != opts.nextPrevShow) {
                        jQuery(nextPrev).show();
                    }
                }

                whichSide(e);
            }

            function mouseout(e) {

                var imageWidth = jQuery(img).width();
                var imageHeight = jQuery(img).height();
                var imagePos = jQuery(img).offset(); // Bildposition (top, left)

                // Mausposition relativ zur linken, oberen Ecke des Bildes berechnen
                var mouseRelX = e.pageX - imagePos.left;
                var mouseRelY = e.pageY - imagePos.top;

                // Mauszeiger außerhalb des Bildes? -> nextPrev verstecken
                if (mouseRelX < 0 ||
                   mouseRelX >= imageWidth ||
                   mouseRelY < 0 ||
                   mouseRelY >= imageHeight
                ) {
                    jQuery(nextPrev).hide();
                }
            }
        });

        return this;
    };
})(jQuery);

