/*
* jQuery Panel Gallery
* @author admin@catchmyfame.com - http://www.catchmyfame.com
* @version 2.0.0
* @date September 10, 2010
* @category jQuery plugin
* @copyright (c) 2010 admin@catchmyfame.com (www.catchmyfame.com)
* @license CC Attribution-Share Alike 3.0 - http://creativecommons.org/licenses/by-sa/3.0/
*/

jQuery.extend(jQuery.easing,
{
    easeInOutExpo: function (x, t, b, c, d) {
        if (t == 0) return b;
        if (t == d) return b + c;
        if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;
        return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;
    }
});

(function ($) {
    $.fn.extend({
        panelGallery: function (options) {
            var defaults =
			{
			    viewDuration: 4000,
			    transitionDuration: 1000,
			    boxSize: 35,
			    boxFadeDuration: 1000,
			    boxTransitionDuration: 100,
			    panelWidth: 40,
			    panelTransitionDuration: 100,
			    pauseOnHover: true,
			    FX: new Array()
			};
            var options = $.extend(defaults, options);

            return this.each(function () {
                var randID = Math.round(Math.random() * 100000000);
                var o = options;
                var obj = $(this);

                var numImages = $('img', obj).length;
                var imgDimensions = { width: $('img:first', obj).width(), height: $('img:first', obj).height() };
                var currentImage = 0;
                var imageArray = new Array();
                var imageNameArray = new Array();
                var timeout;
                var firstTime = true; // special case for pausing the first image.
                var mouseover = false;

                $(obj).width(imgDimensions.width).height(imgDimensions.height).css({ 'position': 'relative', 'overflow': 'hidden' });
                $('img', obj).each(function () {
                    imageArray.push($(this).attr('src'));
                    imageNameArray.push($(this).attr('name'));
                    $(this).remove();
                });

                if (o.pauseOnHover) {
                    $(obj).mouseenter(function () {
                        mouseover = true;
                        clearTimeout(timeout);
                        $(this).css({ 'cursor': 'default' });
                    }).mouseleave(function () {
                        mouseover = false;
                        timeout = setTimeout(function () {
                            if (!firstTime) {
                                imageArray.push(imageArray.shift()); // moves first array element to last spot
                                imageNameArray.push(imageNameArray.shift()); // moves first array element to last spot
                            }
                            $('img', obj).remove();
                            pickFX();
                        }, o.viewDuration);
                    });
                }

                $(obj).css({ 'background': '#666 url("loading.gif") no-repeat 50% 50%' }).append('<img src="' + imageArray[0] + '">');
                timeout = setTimeout(function () { pickFX() }, o.viewDuration); // Start the show

                function galleryFX(name, opt1) {
                    if (name == 'fade') {
                        $('img', obj).remove();
                        $(obj).append('<img src="' + imageArray[0] + '"><img src="' + imageArray[1] + '">');
                        $('img:eq(1)', obj).css({ 'position': 'absolute', 'top': '0', 'left': '0' }).hide().fadeIn(o.transitionDuration);
                        cleanupAndProceed();
                    }
                    if (name == 'boxSouthWest' || name == 'boxSouthEast' || name == 'boxNorthWest' || name == 'boxNorthEast' || name == 'boxRandom') {
                        var rows = Math.floor(imgDimensions.height / o.boxSize);
                        var cols = Math.floor(imgDimensions.width / o.boxSize);
                        var boxes = new Array();
                        for (r = 0; r <= rows; r++) {
                            for (c = 0; c <= cols; c++) {
                                boxLeft = c * o.boxSize;
                                boxTop = r * o.boxSize;
                                $(obj).append('<div id="r' + r + 'c' + c + '_' + randID + '" class="box" style="top:' + boxTop + 'px;left:' + boxLeft + 'px;background-position:-' + boxLeft + 'px -' + boxTop + 'px"></div>');
                                boxes.push('r' + r + 'c' + c + '_' + randID);
                            }
                        }
                        $('.box', obj).css({ 'position': 'absolute', 'background-image': 'url(' + imageArray[currentImage + 1] + ')' }).width(o.boxSize).height(o.boxSize).hide();
                        // Done building matrix
                        $(obj).append('<img src="' + imageArray[currentImage] + '">');

                        if (name == 'boxRandom') {
                            boxes.shuffle();
                            function boxRandom() {
                                if (boxes.length > 0) {
                                    box = boxes.shift();
                                    $('#' + box).fadeIn(o.boxFadeDuration);
                                    setTimeout(boxRandom, o.boxTransitionDuration / 10);
                                    return;
                                }
                                cleanupAndProceed(o.boxFadeDuration);
                            }
                            boxRandom();
                        }

                        if (name == 'boxSouthEast') {
                            var total = 0;
                            function boxSouthEast() {
                                for (var x = 0; x <= total; x++) {
                                    for (var y = 0; y <= total; y++) {
                                        if (x + y == total) $('#r' + x + 'c' + y + '_' + randID).fadeIn(o.boxFadeDuration);
                                    }
                                }
                                total++;
                                if (total <= rows + cols) {
                                    setTimeout(boxSouthEast, o.boxTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            boxSouthEast();
                        }
                        if (name == 'boxNorthWest') {
                            var total = rows + cols;
                            function boxNorthWest() {
                                for (var x = total; x >= 0; x--) {
                                    for (var y = total; y >= 0; y--) {
                                        if (x + y == total) $('#r' + x + 'c' + y + '_' + randID).fadeIn(o.boxFadeDuration);
                                    }
                                }
                                total--;
                                if (total >= 0) {
                                    setTimeout(boxNorthWest, o.boxTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            boxNorthWest();
                        }
                        if (name == 'boxNorthEast') {
                            var i = rows;
                            function boxNorthEast() {
                                var total = 0;
                                for (var j = i; j <= rows; j++) {
                                    $('#r' + j + 'c' + total + '_' + randID).fadeIn(o.boxFadeDuration);
                                    total++;
                                }
                                i--;
                                if (i >= -cols) // may need to see if row or cols is greater and use the negative of the larger value
                                {
                                    setTimeout(boxNorthEast, o.boxTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            boxNorthEast();
                        }
                        if (name == 'boxSouthWest') {
                            var i = cols;
                            function boxSouthWest() {
                                var total = 0;
                                for (var j = i; j <= cols; j++) {
                                    $('#r' + total + 'c' + j + '_' + randID).fadeIn(o.boxFadeDuration);
                                    total++;
                                }
                                i--;
                                if (i >= -cols) // may need to see if row or cols is greater and use the negative of the larger value
                                {
                                    setTimeout(boxSouthWest, o.boxTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            boxSouthWest();
                        }
                    }
                    if (name == 'panelEastTopDown' || name == 'panelEastBottomUp' || name == 'panelWestTopDown' || name == 'panelWestBottomUp'
				 || name == 'panelNorthLeftRight' || name == 'panelNorthRightLeft' || name == 'panelSouthLeftRight'
				 || name == 'panelSouthRightLeft' || name == 'panelZipperDown' || name == 'panelZipperUp'
				 || name == 'panelZipperLeft' || name == 'panelZipperRight' || name == 'panelEastTopDown'
				 || name == 'panelEastBottomUp' || name == 'panelWestTopDown' || name == 'panelWestBottomUp'
				 || name == 'panelNorthLeftRight' || name == 'panelNorthRightLeft' || name == 'panelSouthLeftRight'
				 || name == 'panelSouthRightLeft' || name == 'panelZipperDown' || name == 'panelZipperUp'
				 || name == 'panelZipperLeft' || name == 'panelZipperRight' || name == 'panelEastTopDownReveal'
				 || name == 'panelEastBottomUpReveal' || name == 'panelWestTopDownReveal' || name == 'panelWestBottomUpReveal'
				 || name == 'panelNorthLeftRightReveal' || name == 'panelNorthRightLeftReveal' || name == 'panelSouthLeftRightReveal'
				 || name == 'panelSouthRightLeftReveal' || name == 'panelTeethDown' || name == 'panelTeethUp'
				 || name == 'panelTeethDown' || name == 'panelTeethUp' || name == 'panelTeethLeft'
				 || name == 'panelTeethRight' || name == 'panelTeethLeft' || name == 'panelTeethRight' || name == 'panelTeethDownReveal'
				 || name == 'panelTeethUpReveal' || name == 'panelTeethLeftReveal' || name == 'panelTeethRightReveal') {
                        var vertPanels = Math.floor(imgDimensions.height / o.panelWidth);
                        var horizPanels = Math.floor(imgDimensions.width / o.panelWidth);

                        for (var h = 0; h <= horizPanels; h++) {
                            panelLeft = h * o.panelWidth;
                            $(obj).append('<div id="top_' + h + '_' + randID + '" class="horizPanel" style="top:-' + imgDimensions.height + 'px;left:' + panelLeft + 'px;background-position:-' + panelLeft + 'px -' + 0 + 'px"></div>');
                            $(obj).append('<div id="bottom_' + h + '_' + randID + '" class="horizPanel" style="top:' + imgDimensions.height + 'px;left:' + panelLeft + 'px;background-position:-' + panelLeft + 'px -' + 0 + 'px"></div>');
                        }
                        for (var v = 0; v <= vertPanels; v++) {
                            panelTop = v * o.panelWidth;
                            $(obj).append('<div id="left_' + v + '_' + randID + '" class="vertPanel" style="top:' + panelTop + 'px;left:-' + imgDimensions.width + 'px;background-position:-' + 0 + 'px -' + panelTop + 'px"></div>');
                            $(obj).append('<div id="right_' + v + '_' + randID + '" class="vertPanel" style="top:' + panelTop + 'px;left:' + imgDimensions.width + 'px;background-position:-' + 0 + 'px -' + panelTop + 'px"></div>');
                        }
                        $('.horizPanel', obj).css({ 'position': 'absolute', 'background-image': 'url(' + imageArray[currentImage + 1] + ')' }).width(o.panelWidth).height(imgDimensions.height);
                        $('.vertPanel', obj).css({ 'position': 'absolute', 'background-image': 'url(' + imageArray[currentImage + 1] + ')' }).width(imgDimensions.width).height(o.panelWidth);
                        if (opt1) {
                            $('.horizPanel', obj).css('opacity', '0');
                            $('.vertPanel', obj).css('opacity', '0');
                        }
                        // Done building panels
                        $(obj).append('<img src="' + imageArray[currentImage] + '">');

                        if (name == 'panelEastTopDown' || name == 'panelEastBottomUp' || name == 'panelWestTopDown' || name == 'panelWestBottomUp' || name === undefined) {
                            var i = (name == 'panelEastTopDown' || name == 'panelWestTopDown' || name === undefined) ? 0 : vertPanels;
                            function slideLeft() {
                                if (name == 'panelEastTopDown' || name == 'panelEastBottomUp') {
                                    $('#right_' + i + '_' + randID).animate({ left: '0', opacity: '1' });
                                }
                                else {
                                    $('#left_' + i + '_' + randID).animate({ left: '0', opacity: '1' })
                                }
                                i = (name == 'panelEastTopDown' || name == 'panelWestTopDown' || name === undefined) ? i + 1 : i - 1;
                                if ((name == 'panelEastTopDown' || name == 'panelWestTopDown' || name === undefined) && i <= vertPanels) {
                                    setTimeout(slideLeft, o.panelTransitionDuration);
                                }
                                else if ((name == 'panelEastBottomUp' || name == 'panelWestBottomUp') && i >= 0) {
                                    setTimeout(slideLeft, o.panelTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            slideLeft();
                        }
                        if (name == 'panelNorthLeftRight' || name == 'panelNorthRightLeft' || name == 'panelSouthLeftRight' || name == 'panelSouthRightLeft') {
                            var i = (name == 'panelNorthLeftRight' || name == 'panelSouthLeftRight') ? 0 : horizPanels;
                            function slideDown() {
                                if (name == 'panelNorthLeftRight' || name == 'panelNorthRightLeft') {
                                    $('#top_' + i + '_' + randID).animate({ top: '0', opacity: '1' });
                                }
                                else {
                                    $('#bottom_' + i + '_' + randID).animate({ top: '0', opacity: '1' });
                                }
                                i = (name == 'panelNorthLeftRight' || name == 'panelSouthLeftRight') ? i + 1 : i - 1;
                                if ((name == 'panelNorthLeftRight' || name == 'panelSouthLeftRight') && i <= horizPanels) {
                                    setTimeout(slideDown, o.panelTransitionDuration);
                                }
                                else if ((name == 'panelNorthRightLeft' || name == 'panelSouthRightLeft') && i >= 0) {
                                    setTimeout(slideDown, o.panelTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            slideDown();
                        }
                        if (name == 'panelZipperDown' || name == 'panelZipperUp') {
                            // alternate left and right panels
                            var zip = 'left';
                            var i = (name == 'panelZipperDown') ? 0 : vertPanels;
                            function zipper1() {
                                if (zip == 'left') $('#left_' + i + '_' + randID).animate({ left: '0', opacity: '1' });
                                if (zip == 'right') $('#right_' + i + '_' + randID).animate({ left: '0', opacity: '1' });
                                i = (name == 'panelZipperDown') ? i + 1 : i - 1;
                                zip = (zip == 'left') ? 'right' : 'left';
                                if ((name == 'panelZipperDown') && i <= vertPanels) {
                                    setTimeout(zipper1, o.panelTransitionDuration);
                                }
                                else if (name == 'panelZipperUp' && i >= 0) {
                                    setTimeout(zipper1, o.panelTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            zipper1();
                        }
                        if (name == 'panelZipperLeft' || name == 'panelZipperRight') {
                            // alternate left and right panels
                            var zip = 'top';
                            var i = (name == 'panelZipperLeft') ? 0 : horizPanels;
                            function zipper2() {
                                if (zip == 'top') $('#top_' + i + '_' + randID).animate({ top: '0', opacity: '1' });
                                if (zip == 'bottom') $('#bottom_' + i + '_' + randID).animate({ top: '0', opacity: '1' });
                                i = (name == 'panelZipperLeft') ? i + 1 : i - 1;
                                zip = (zip == 'top') ? 'bottom' : 'top';
                                if ((name == 'panelZipperLeft') && i <= horizPanels) {
                                    setTimeout(zipper2, o.panelTransitionDuration);
                                }
                                else if (name == 'panelZipperRight' && i >= 0) {
                                    setTimeout(zipper2, o.panelTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            zipper2();
                        }
                        if (name == 'panelEastTopDownReveal' || name == 'panelEastBottomUpReveal' || name == 'panelWestTopDownReveal' || name == 'panelWestBottomUpReveal') {
                            $('.horizPanel', obj).remove();
                            $('.vertPanel', obj).css({ 'left': '0', 'opacity': '1', 'background-image': 'url(' + imageArray[currentImage] + ')' });
                            $('img', obj).attr('src', imageArray[currentImage + 1]);
                            var i = (name == 'panelEastTopDownReveal' || name == 'panelWestTopDownReveal') ? 0 : vertPanels;
                            function slideLeftReveal() {
                                $('#left_' + i + '_' + randID).remove();
                                if (name == 'panelEastTopDownReveal' || name == 'panelEastBottomUpReveal') {
                                    $('#right_' + i + '_' + randID).animate({ left: imgDimensions.width + 'px' });
                                }
                                else {
                                    $('#right_' + i + '_' + randID).animate({ left: '-' + imgDimensions.width + 'px' });
                                }
                                i = (name == 'panelEastTopDownReveal' || name == 'panelWestTopDownReveal') ? i + 1 : i - 1;
                                if ((name == 'panelEastTopDownReveal' || name == 'panelWestTopDownReveal') && i <= vertPanels) {
                                    setTimeout(slideLeftReveal, o.panelTransitionDuration);
                                }
                                else if ((name == 'panelEastBottomUpReveal' || name == 'panelWestBottomUpReveal') && i >= 0) {
                                    setTimeout(slideLeftReveal, o.panelTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            slideLeftReveal();
                        }
                        if (name == 'panelNorthLeftRightReveal' || name == 'panelNorthRightLeftReveal' || name == 'panelSouthLeftRightReveal' || name == 'panelSouthRightLeftReveal') {
                            $('.vertPanel', obj).remove();
                            $('.horizPanel', obj).css({ 'top': '0', 'opacity': '1', 'background-image': 'url(' + imageArray[currentImage] + ')' });
                            $('img', obj).attr('src', imageArray[currentImage + 1]);
                            var i = (name == 'panelNorthLeftRightReveal' || name == 'panelSouthLeftRightReveal') ? 0 : horizPanels;
                            function slideUpReveal() {
                                $('#bottom_' + i + '_' + randID).remove();
                                if (name == 'panelSouthLeftRightReveal' || name == 'panelSouthRightLeftReveal') {
                                    $('#top_' + i + '_' + randID).animate({ top: imgDimensions.height + 'px' });
                                }
                                else {
                                    $('#top_' + i + '_' + randID).animate({ top: '-' + imgDimensions.height + 'px' });
                                }
                                i = (name == 'panelNorthLeftRightReveal' || name == 'panelSouthLeftRightReveal') ? i + 1 : i - 1;
                                if ((name == 'panelNorthLeftRightReveal' || name == 'panelSouthLeftRightReveal') && i <= horizPanels) {
                                    setTimeout(slideUpReveal, o.panelTransitionDuration);
                                }
                                else if ((name == 'panelNorthRightLeftReveal' || name == 'panelSouthRightLeftReveal') && i >= 0) {
                                    setTimeout(slideUpReveal, o.panelTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            slideUpReveal();
                        }
                        if (name == 'panelTeethDown' || name == 'panelTeethUp') {
                            $('.horizPanel', obj).remove();
                            var i = (name == 'panelTeethDown') ? 0 : vertPanels;
                            function teeth1() {
                                var v = i * o.panelWidth;
                                $('#left_' + i + '_' + randID).css('background-position', imgDimensions.width / 2 + 'px -' + v + 'px').animate({ left: '-' + imgDimensions.width / 2 + 'px', opacity: '1' });
                                $('#right_' + i + '_' + randID).css('background-position', '-' + imgDimensions.width / 2 + 'px -' + v + 'px').animate({ left: imgDimensions.width / 2 + 'px', opacity: '1' });
                                i = (name == 'panelTeethDown') ? i + 1 : i - 1;
                                if ((name == 'panelTeethDown') && i <= vertPanels) {
                                    setTimeout(teeth1, o.panelTransitionDuration);
                                }
                                else if (name == 'panelTeethUp' && i >= 0) {
                                    setTimeout(teeth1, o.panelTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            teeth1();
                            return;
                        }
                        if (name == 'panelTeethLeft' || name == 'panelTeethRight') {
                            $('.vertPanel', obj).remove();
                            var i = (name == 'panelTeethLeft') ? 0 : horizPanels;
                            function teeth2() {
                                var h = i * o.panelWidth;
                                $('#top_' + i + '_' + randID).css('background-position', '-' + h + 'px ' + imgDimensions.height / 2 + 'px').animate({ top: '-' + imgDimensions.height / 2 + 'px', opacity: '1' });
                                $('#bottom_' + i + '_' + randID).css('background-position', '-' + h + 'px ' + '-' + imgDimensions.height / 2 + 'px').animate({ top: imgDimensions.height / 2 + 'px', opacity: '1' });
                                i = (name == 'panelTeethLeft') ? i + 1 : i - 1;
                                if ((name == 'panelTeethLeft') && i <= horizPanels) {
                                    setTimeout(teeth2, o.panelTransitionDuration);
                                }
                                else if (name == 'panelTeethRight' && i >= 0) {
                                    setTimeout(teeth2, o.panelTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            teeth2();
                            return;
                        }
                        if (name == 'panelTeethDownReveal' || name == 'panelTeethUpReveal') {
                            $('.horizPanel', obj).remove();
                            var i = (name == 'panelTeethDownReveal') ? 0 : vertPanels;
                            $('.vertPanel', obj).css({ 'background-image': 'url(' + imageArray[currentImage] + ')', 'opacity': '1' });
                            $('img', obj).attr('src', imageArray[currentImage + 1]);
                            for (var j = 0; j <= vertPanels; j++) {
                                $('#left_' + j + '_' + randID).css({ 'left': '-' + imgDimensions.width / 2 + 'px', 'background-position': imgDimensions.width / 2 + 'px -' + j * o.panelWidth + 'px' });
                                $('#right_' + j + '_' + randID).css({ 'left': imgDimensions.width / 2 + 'px', 'background-position': imgDimensions.width / 2 + 'px -' + j * o.panelWidth + 'px' });
                            }
                            function teeth3() {
                                $('#left_' + i + '_' + randID).animate({ left: '-' + imgDimensions.width + 'px', opacity: '1' });
                                $('#right_' + i + '_' + randID).animate({ left: imgDimensions.width + 'px', opacity: '1' });
                                i = (name == 'panelTeethDownReveal') ? i + 1 : i - 1;
                                if ((name == 'panelTeethDownReveal') && i <= vertPanels) {
                                    setTimeout(teeth3, o.panelTransitionDuration);
                                }
                                else if (name == 'panelTeethUpReveal' && i >= 0) {
                                    setTimeout(teeth3, o.panelTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            teeth3();
                        }
                        if (name == 'panelTeethLeftReveal' || name == 'panelTeethRightReveal') {
                            $('.vertPanel', obj).remove();
                            var i = (name == 'panelTeethLeftReveal') ? 0 : horizPanels;
                            $('.horizPanel', obj).css({ 'background-image': 'url(' + imageArray[currentImage] + ')', 'opacity': '1' });
                            $('img', obj).attr('src', imageArray[currentImage + 1]);
                            for (var j = 0; j <= horizPanels; j++) {
                                $('#top_' + j + '_' + randID).css({ 'top': '-' + imgDimensions.height / 2 + 'px', 'background-position': '-' + j * o.panelWidth + 'px ' + imgDimensions.height / 2 + 'px' });
                                $('#bottom_' + j + '_' + randID).css({ 'top': imgDimensions.height / 2 + 'px', 'background-position': '-' + j * o.panelWidth + 'px ' + imgDimensions.height / 2 + 'px' });
                            }
                            function teeth4() {
                                $('#top_' + i + '_' + randID).animate({ top: '-' + imgDimensions.height + 'px', opacity: '1' });
                                $('#bottom_' + i + '_' + randID).animate({ top: imgDimensions.height + 'px', opacity: '1' });
                                i = (name == 'panelTeethLeftReveal') ? i + 1 : i - 1;
                                if ((name == 'panelTeethLeftReveal') && i <= horizPanels) {
                                    setTimeout(teeth4, o.panelTransitionDuration);
                                }
                                else if (name == 'panelTeethRightReveal' && i >= 0) {
                                    setTimeout(teeth4, o.panelTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            teeth4();
                        }
                    }
                    if (name == 'overlayTopDown' || name == 'overlayBottomUp' || name == 'overlayLeftRight' || name == 'overlayRightLeft') {
                        var vertPanels = Math.floor(imgDimensions.height / o.panelWidth);
                        var horizPanels = Math.floor(imgDimensions.width / o.panelWidth);
                        var blinds = opt1;

                        for (var h = 0; h <= horizPanels; h++) {
                            panelLeft = h * o.panelWidth;
                            $(obj).append('<div id="top_' + h + '_' + randID + '" class="horizPanel" style="top:0px;left:' + panelLeft + 'px;background-position:-' + panelLeft + 'px -' + 0 + 'px"></div>');
                        }
                        for (v = 0; v <= vertPanels; v++) {
                            panelTop = v * o.panelWidth;
                            $(obj).append('<div id="left_' + v + '_' + randID + '" class="vertPanel" style="top:' + panelTop + 'px;left:0px;background-position:-' + 0 + 'px -' + panelTop + 'px"></div>');
                        }
                        $('.horizPanel', obj).css({ 'opacity': '0', 'position': 'absolute', 'background-image': 'url(' + imageArray[currentImage + 1] + ')' }).width(o.panelWidth).height(imgDimensions.height);
                        $('.vertPanel', obj).css({ 'opacity': '0', 'position': 'absolute', 'background-image': 'url(' + imageArray[currentImage + 1] + ')' }).width(imgDimensions.width).height(o.panelWidth);
                        // Done building panels
                        $(obj).append('<img src="' + imageArray[currentImage] + '">');

                        if (name == 'overlayTopDown' || name == 'overlayBottomUp') {
                            var i = (name == 'overlayTopDown') ? 0 : vertPanels;
                            function overlayDown() {
                                if (blinds) $('#left_' + i + '_' + randID).height(0);
                                $('#left_' + i + '_' + randID).animate({ opacity: '1', height: o.panelWidth + 'px' }, o.transitionDuration);
                                i = (name == 'overlayTopDown') ? i + 1 : i - 1;
                                if ((name == 'overlayTopDown') && i <= vertPanels) {
                                    setTimeout(overlayDown, o.panelTransitionDuration);
                                }
                                else if (name == 'overlayBottomUp' && i >= 0) {
                                    setTimeout(overlayDown, o.panelTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            overlayDown();
                        }
                        if (name == 'overlayLeftRight' || name == 'overlayRightLeft') {
                            var i = (name == 'overlayLeftRight') ? 0 : horizPanels;
                            function overlay2() {
                                if (blinds) $('#top_' + i + '_' + randID).width(0);
                                $('#top_' + i + '_' + randID).animate({ opacity: '1', width: o.panelWidth + 'px' }, o.transitionDuration);
                                i = (name == 'overlayLeftRight') ? i + 1 : i - 1;
                                if ((name == 'overlayLeftRight') && i <= horizPanels) {
                                    setTimeout(overlay2, o.panelTransitionDuration);
                                }
                                else if (name == 'overlayRightLeft' && i >= 0) {
                                    setTimeout(overlay2, o.panelTransitionDuration);
                                }
                                else {
                                    cleanupAndProceed();
                                }
                            }
                            overlay2();
                        }
                    }
                    if (name == 'jackpot') {
                        for (var h = 0; h <= 2; h++) {
                            var imageArrayCopy = imageArray.slice(0); // The easy way to copy an array. Equals alone clones.
                            imageArrayCopy.push(imageArrayCopy.shift());
                            var panelLeft = h * (imgDimensions.width / 3);
                            $(obj).append('<div id="top_' + h + '_' + randID + '" class="horizPanel" style="overflow:hidden;top:-' + imgDimensions.height * 10 + 'px;left:' + panelLeft + 'px;background-position:-' + panelLeft + 'px -' + 0 + 'px"></div>');
                            for (var i = 0; i <= 9; i++) {
                                $('#top_' + h + '_' + randID).append('<img style="position:relative;left:-' + panelLeft + 'px" src="' + imageArrayCopy[0] + '"><br />');
                                imageArrayCopy.push(imageArrayCopy.shift());
                            }
                            $('#top_' + h + '_' + randID).append('<img style="position:relative;left:-' + panelLeft + 'px" src="' + imageArray[0] + '"><br />');
                        }
                        $('.horizPanel', obj).css({ 'position': 'absolute', 'background-image': 'url(' + imageArray[currentImage + 1] + ')' }).width(imgDimensions.width / 3).height(imgDimensions.height * 11);
                        // Done building panels
                        $(obj).append('<img src="' + imageArray[currentImage] + '">');

                        var i = 0;
                        function jackpot() {
                            $('#top_' + i + '_' + randID).animate({ top: '0px' }, { duration: o.transitionDuration * 3, easing: 'easeInOutExpo' });
                            i++;
                            if (i <= 2) {
                                setTimeout(jackpot, 500);
                            }
                            else {
                                cleanupAndProceed(o.transitionDuration + (3 * 500));
                            }
                        }
                        jackpot();
                    }
                }
                function cleanupAndProceed(delay) {
                    delay = (!delay) ? o.transitionDuration : delay;
                    setTimeout(function () {
                        if (!mouseover) {
                            firstTime = false;
                            $(obj).append('<img style="position:absolute;top:0;left:0" src="' + imageArray[currentImage + 1] + '">');
                            $('.box', obj).remove(); // Remove all div boxes - we'll rebuild them quickly
                            $('.horizPanel', obj).remove(); // Remove all panels - we'll rebuild them quickly
                            $('.vertPanel', obj).remove(); // Remove all panels - we'll rebuild them quickly
                            timeout = setTimeout(function () {
                                imageArray.push(imageArray.shift()); // moves first array element to last spot
                                imageNameArray.push(imageNameArray.shift());
                                $('img', obj).remove(); // Remove all images from container
                                pickFX();
                            }, o.viewDuration);
                        }
                    }, delay);
                }
                function pickFX() {
                    // If an image has a name tag then use it, else use the FX array, else random. E.g. 'panelTeethRight,fade'
                    randomFXarray = new Array(
					"fade",
					"boxSouthWest",
					"boxSouthEast",
					"boxNorthWest",
					"boxNorthEast",
					"boxRandom",
					"panelEastTopDown,true",
					"panelEastBottomUp,true",
					"panelWestTopDown,true",
					"panelWestBottomUp,true",
					"panelNorthLeftRight,true",
					"panelNorthRightLeft,true",
					"panelSouthLeftRight,true",
					"panelSouthRightLeft,true",
					"panelZipperDown,true",
					"panelZipperUp,true",
					"panelZipperLeft,true",
					"panelZipperRight,true",
					"panelEastTopDown,false",
					"panelEastBottomUp,false",
					"panelWestTopDown,false",
					"panelWestBottomUp,false",
					"panelNorthLeftRight,false",
					"panelNorthRightLeft,false",
					"panelSouthLeftRight,false",
					"panelSouthRightLeft,false",
					"panelZipperDown,false",
					"panelZipperUp,false",
					"panelZipperLeft,false",
					"panelZipperRight,false",
					"panelEastTopDownReveal",
					"panelEastBottomUpReveal",
					"panelWestTopDownReveal",
					"panelWestBottomUpReveal",
					"panelNorthLeftRightReveal",
					"panelNorthRightLeftReveal",
					"panelSouthLeftRightReveal",
					"panelSouthRightLeftReveal",
					"panelTeethDown,true",
					"panelTeethUp,true",
					"panelTeethDown,false",
					"panelTeethUp,false",
					"panelTeethLeft,true",
					"panelTeethRight,true",
					"panelTeethLeft,false",
					"panelTeethRight,false",
					"panelTeethDownReveal",
					"panelTeethUpReveal",
					"panelTeethLeftReveal",
					"panelTeethRightReveal",
					"overlayTopDown,true",
					"overlayBottomUp,true",
					"overlayLeftRight,true",
					"overlayRightLeft,true",
					"overlayTopDown,false",
					"overlayBottomUp,false",
					"overlayLeftRight,false",
					"overlayRightLeft,false",
					"jackpot"
				);

                    var randFX = Math.floor(Math.random() * randomFXarray.length);

                    if (imageNameArray[0]) opt = imageNameArray[0];  // e.g. 'panelTeethRight,fade'
                    else if (o.FX.length > 0) { opt = o.FX[0]; o.FX.push(o.FX.shift()); }
                    else opt = randomFXarray[randFX];

                    opt1 = opt.split(',');
                    bool = (opt1[1] == 'true') ? true : false;
                    str = { name: opt1[0], opt1: bool };
                    galleryFX(str.name, str.opt1);
                }
            });
        }
    });
})(jQuery);

Array.prototype.shuffle = function () {
    var s = [];
    while (this.length) s.push(this.splice(Math.random() * this.length, 1));
    while (s.length) this.push(s.pop());
    return this;
}
