/**
 * 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
 */
(function(jQuery) {
    jQuery.fn.imagenextprev = function(options) {
        var defaults = {
            imagesBaseUrl: "",
            images       : [],

            nextPrevShow : "mousecursor",  // none, mousecursor, fixed

            imagePrev    : "images/jsilr_arrowleft.gif",
            imageNext    : "images/jsilr_arrowright.gif",

            debug        : false
        };



        this.each(function() {
            var imagePrev = null;
            var imageNext = null;

            var vars = {
                imageIdx   : 0,
                currentSide: "unknown",
                lastX      : -1,
                lastY      : -1
            };

            var img = jQuery(this);
            img.data('imagenextprev:vars', vars);

            var opts = jQuery.extend(defaults, options);

            loadImages();


            jQuery.each(opts, function(index, value) {
                debug("opts:  " + index + " = " + value);
            });


            // Enthält weiter/zurück-Anzeige (Pfeil)
            var nextPrev = jQuery("<div></div>")
               .css({position  : "absolute",
                     opacity   : 0.7,
                     filter    : "alpha(opacity=70)", // IE
                     lineHeight: 0, fontsize: 0})
               .hide();

            jQuery("body").append(nextPrev);


            img.attr("src", opts.imagesBaseUrl + opts.images[0]);

            jQuery(img).click(click)
                       .mousemove(mousemove)
                       .mouseout(mouseout);

            jQuery(nextPrev).click(click)
                            .mousemove(mousemove)
                            .mouseout(mouseout);



            function debug(text) {
                if(opts.debug && window.console && window.console.log) {
                    window.console.log(text);
                }
            }// debug



            function loadImages() {
                // Pfeilbilder laden
                imagePrev = new Image();
                imagePrev.alt = "->";
                imagePrev.src = opts.imagePrev;

                imageNext = new Image();
                imagePrev.alt  = "<-";
                imageNext.src = opts.imageNext;
            }// loadImages



            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 + 25});
                        } else {
                            jQuery(nextPrev).css({top : imagePos.top + (imageHeight - lrHeight) / 2,
                                                   left: imagePos.left + imageWidth - lrWidth - -15});
                        }
                        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:
                }// switch(opts.nextPrevShow) {


                return side;
            }// whichSide



            function click(e) {
                debug("click");

                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);
                debug(" side = " + side);

                if("left" == side) {
                    vars.imageIdx--;
                } else {
                    vars.imageIdx++;
                }

                if(vars.imageIdx < 0) {
                    vars.imageIdx = opts.images.length - 1;
                }

                if(vars.imageIdx >= opts.images.length) {
                    vars.imageIdx = 0;
                }


                img.attr("src", opts.imagesBaseUrl + opts.images[vars.imageIdx]);
                img.attr("alt", opts.images[vars.imageIdx]);


                e.preventDefault();
            }// click



            function mousemove(e) {
                debug("mousemove");

                var vars = img.data("imagenextprev:vars");

                if(vars.lastX != e.pageX || vars.lastY != e.pageY) {
                    if("none" != opts.nextPrevShow) {
                        debug("mousemove show()");
                        jQuery(nextPrev).show();
                    }
                }

                whichSide(e);
            }// mousemove



            function mouseout(e) {
                debug("mouseout");

                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;

                debug("mouseRelx/y " + mouseRelX + "/" + mouseRelY);

                // Mauszeiger außerhalb des Bildes? -> nextPrev verstecken
                if(mouseRelX < 0 ||
                   mouseRelX >= imageWidth ||
                   mouseRelY < 0 ||
                   mouseRelY >= imageHeight
                ) {
                    jQuery(nextPrev).hide();
                    debug("mouseout hide()");
                }
            }// mouseout
        }); // this.each(function() {


        return this; // jQuery Objekt
   }; // jQuery.fn.imagenextprev = function(options) {
})(jQuery);
