// JavaScript Document

/*
Plugin: Sideswap v 1.0.1
Author: BrianBlocker.com
Tools: Dreamweaver CS4 / 2009 iMac (early edition) / 2009 Mac Mini (late edition)
*/

(function ($) {
    $.fn.sideswap = function (options) {
        $.fn.sideswap.defaults =
		{
		    navigation: true, /* CREATE LEFT AND RIGHT NAVIGATION IF TRUE, OR DO NOTHING IF FALSE */
		    previous: 'prev', /* HTML TO BE USED FOR THE PREVIOUS ARROW */
		    next: 'next', /* HTML TO BE USED FOR THE NEXT ARROW */
		    display_time: 5000, /* NUMBER OF 1/1000 SECONDS AN IMAGE IS DISPLAYED */
		    transition_speed: 200, /* SPEED OF TRANSITIONS IN 1/1000 SECONDS */
		    auto_run: true /* AUTOMATICALLY TRANSITIONS THE SLIDES (IF TRUE) */
		};

        var opts = $.extend({}, $.fn.sideswap.defaults, options), /* PUTS ALL THE DEFAULT VALUES INTO A VARIABLE */
				clicked = false; /* TRUE AFTER A PREVIOUS OR NEXT BUTTON HAS BEEN CLICKED, HELPS PREVENT ERRORS */

        return this.each(function () {
            /* VARIABLES */
            var $this = $(this), /* SETS A "GLOBAL" VARIABLE FOR THE CURRENT MATCHED OBJECT */
					$parent = $this.parent(), /* SETS A "GLOBAL" VARIABLE FOR THE MATCHED OBJECT'S PARENT */
					timer = false, /* THE SETINTERVAL FUNCTION IDENTIFIER */
					$images = $this.children(), /* THE IMAGES TO BE ROTATED */
					count = $images.size(); /* THE TOTAL NUMBER OF IMAGES THAT WILL BE ROTATED */

            /* SETUP THE IMAGES */
            setup();

            /* SETS UP THE IMAGE DISPLAYS */
            function setup() {  
                // calculate the final height of the element, since we'll be setting them all to position: absolute
                var minHeight = 0;
                $images.each(function () {
                    var $t = $(this);
                    minHeight = Math.max(minHeight, ($t.is('img') ? $t : $('img', this)).height());
                });

                /* OVERRIDE THE CSS STYLES */
                $this.css({ 'position': 'relative', 'height': minHeight + 'px' });
                $images.css({ "position": "absolute", "top": "0px", "left": "0px" }).removeClass('hide').hide();
                $this.children(':first').show();

                /* CALL THE FUNCTION TO CREATE THE NAVIGATION */
                if (opts.navigation && count > 1) {
                    createNavigation();
                }

                /* SET THE ROTATOR TO RUN AUTOMATICALLY IF AUTO IS TRUE, AND MORE THAN 1 OBJECT EXISTS TO ROTATE */
                if (opts.auto_run && count > 1) {
                    initiateInterval();

                    /* PAUSE THE ROTATOR WHEN THE USER HAS THEIR MOUSE OVER AN IMAGE */
                    $parent.hover(function () {
                        clearInterval(timer);
                    }, function () {
                        initiateInterval();
                    });
                }
            }

            /* CONSTRUCTOR */
            function rotate(direction) {
                var $current_image = $this.children(':visible:first') == 'undefined' ? $this.children(':first') : $this.children(':visible:first'),
						$previous_image = $current_image.prev() == 'undefined' || $current_image.prev().html() == null ? $this.children(':last') : $current_image.prev(),
						$next_image = $current_image.next() == 'undefined' || $current_image.next().html() == null ? $this.children(':first') : $current_image.next();

                if (count > 1) {
                    $current_image.fadeOut(opts.duration);

                    switch (direction) {
                        case -1:
                            $previous_image.fadeIn(opts.duration, function () {
                                clicked = false;
                            });
                            break;
                        default:
                            $next_image.fadeIn(opts.duration, function () {
                                clicked = false;
                            });
                            break;
                    }
                }
            }

            /* CREATES THE NAVIGATION TO SCROLL */
            function createNavigation() {
                var $div = $('<DIV></DIV>'), /* CREATE THE DIV OBJECT */
						$next = $div.clone().addClass('sideswap_nav sideswap_next').html(opts.next).appendTo($parent).hide(), /* CREATE THE NEXT OBJECT */
						$previous = $div.clone().addClass('sideswap_nav sideswap_previous').html(opts.previous).appendTo($parent).hide(); /* CREATE THE PREVIOUS OBJECT */

                $next.click(function () {
                    if (!clicked) {
                        clicked = true;
                        rotate(1);
                    }
                });
                $previous.click(function () {
                    if (!clicked) {
                        clicked = true;
                        rotate(-1);
                    }
                });

                $parent.hover(function () {
                    $next.fadeIn(opts.duration);
                    $previous.fadeIn(opts.duration);
                }, function () {
                    $next.fadeOut(opts.duration);
                    $previous.fadeOut(opts.duration);
                });
            }

            /* INITIATES THE INTERVAL TIMER */
            function initiateInterval() {
                timer = setInterval(function () {
                    rotate();
                }, opts.display_time);
            }

        });
    };
})(jQuery);
