/*

	Supersized - Fullscreen Slideshow jQuery Plugin
	Version : 3.2.4
	Site	: www.buildinternet.com/project/supersized
	
	Author	: Sam Dunn
	Company : One Mighty Roar (www.onemightyroar.com)
	License : MIT License / GPL License
	
*/

(function ($) {

    /* Place Supersized Elements
    ----------------------------*/
    $(document).ready(function () {
        $('body').append('<div id="supersized-loader"></div><ul id="supersized"></ul>');
    });


    $.supersized = function (options) {

        /* Variables
        ----------------------------*/
        var el = '#supersized',
        	base = this;
        // Access to jQuery and DOM versions of element
        base.$el = $(el);
        base.el = el;
        vars = $.supersized.vars;
        // Add a reverse reference to the DOM object
        base.$el.data("supersized", base);
        api = base.$el.data('supersized');

        base.init = function () {
            // Combine options and vars
            $.supersized.vars = $.extend($.supersized.vars, $.supersized.themeVars);
            $.supersized.vars.options = $.extend({}, $.supersized.defaultOptions, $.supersized.themeOptions, options);
            base.options = $.supersized.vars.options;

            base._build();
        };


        /* Build Elements
        ----------------------------*/
        base._build = function () {
            // Add in slide markers
            var thisSlide = 0,
        		slideSet = '',
				markers = '',
				markerContent,
				thumbMarkers = '',
				thumbImage;

            while (thisSlide <= base.options.slides.length - 1) {
                //Determine slide link content
                switch (base.options.slide_links) {
                    case 'num':
                        markerContent = thisSlide;
                        break;
                    case 'name':
                        markerContent = base.options.slides[thisSlide].title;
                        break;
                    case 'blank':
                        markerContent = '';
                        break;
                }

                slideSet = slideSet + '<li class="slide-' + thisSlide + '"></li>';

                if (thisSlide == base.options.start_slide - 1) {
                    // Slide links
                    if (base.options.slide_links) markers = markers + '<li class="slide-link-' + thisSlide + ' current-slide"><a>' + markerContent + '</a></li>';
                    // Slide Thumbnail Links
                    if (base.options.thumb_links) {
                        base.options.slides[thisSlide].thumb ? thumbImage = base.options.slides[thisSlide].thumb : thumbImage = base.options.slides[thisSlide].image;
                        thumbMarkers = thumbMarkers + '<li class="thumb' + thisSlide + ' current-thumb"><img src="' + thumbImage + '"/></li>';
                    };
                } else {
                    // Slide links
                    if (base.options.slide_links) markers = markers + '<li class="slide-link-' + thisSlide + '" ><a>' + markerContent + '</a></li>';
                    // Slide Thumbnail Links
                    if (base.options.thumb_links) {
                        base.options.slides[thisSlide].thumb ? thumbImage = base.options.slides[thisSlide].thumb : thumbImage = base.options.slides[thisSlide].image;
                        thumbMarkers = thumbMarkers + '<li class="thumb' + thisSlide + '"><img src="' + thumbImage + '"/></li>';
                    };
                }
                thisSlide++;
            }

            if (base.options.slide_links) $(vars.slide_list).html(markers);
            if (base.options.thumb_links && vars.thumb_tray.length) {
                $(vars.thumb_tray).append('<ul id="' + vars.thumb_list.replace('#', '') + '">' + thumbMarkers + '</ul>');
            }

            $(base.el).append(slideSet);

            // Add in thumbnails
            if (base.options.thumbnail_navigation) {
                // Load previous thumbnail
                vars.current_slide - 1 < 0 ? prevThumb = base.options.slides.length - 1 : prevThumb = vars.current_slide - 1;
                $(vars.prev_thumb).show().html($("<img/>").attr("src", base.options.slides[prevThumb].image));

                // Load next thumbnail
                vars.current_slide == base.options.slides.length - 1 ? nextThumb = 0 : nextThumb = vars.current_slide + 1;
                $(vars.next_thumb).show().html($("<img/>").attr("src", base.options.slides[nextThumb].image));
            }

            base._start(); // Get things started
        };


        /* Initialize
        ----------------------------*/
        base._start = function () {

            // Determine if starting slide random
            if (base.options.start_slide) {
                vars.current_slide = base.options.start_slide - 1;
            } else {
                vars.current_slide = Math.floor(Math.random() * base.options.slides.length); // Generate random slide number
            }

            // If links should open in new window
            var linkTarget = base.options.new_window ? ' target="_blank"' : '';

            // Set slideshow quality (Supported only in FF and IE, no Webkit)
            if (base.options.performance == 3) {
                base.$el.addClass('speed'); 		// Faster transitions
            } else if ((base.options.performance == 1) || (base.options.performance == 2)) {
                base.$el.addClass('quality'); // Higher image quality
            }

            // Shuffle slide order if needed		
            if (base.options.random) {
                arr = base.options.slides;
                for (var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x); // Fisher-Yates shuffle algorithm (jsfromhell.com/array/shuffle)
                base.options.slides = arr;
            }

            /*-----Load initial set of images-----*/

            if (base.options.slides.length > 1) {
                // Set previous image
                vars.current_slide - 1 < 0 ? loadPrev = base.options.slides.length - 1 : loadPrev = vars.current_slide - 1; // If slide is 1, load last slide as previous
                var imageLink = (base.options.slides[loadPrev].url) ? "href='" + base.options.slides[loadPrev].url + "'" : "";

                var imgPrev = $('<img src="' + base.options.slides[loadPrev].image + '"/>');
                var slidePrev = base.el + ' li:eq(' + loadPrev + ')';
                imgPrev.appendTo(slidePrev).wrap('<a ' + imageLink + linkTarget + '></a>').parent().parent().addClass('image-loading prevslide');

                imgPrev.load(function () {
                    $(this).data('origWidth', $(this).width()).data('origHeight', $(this).height());
                    base.resizeNow(); // Resize background image
                }); // End Load
            } else {
                // Slideshow turned off if there is only one slide
                base.options.slideshow = 0;
            }

            // Set current image
            imageLink = (api.getField('url')) ? "href='" + api.getField('url') + "'" : "";
            var img = $('<img src="' + api.getField('image') + '"/>');

            var slideCurrent = base.el + ' li:eq(' + vars.current_slide + ')';
            img.appendTo(slideCurrent).wrap('<a ' + imageLink + linkTarget + '></a>').parent().parent().addClass('image-loading activeslide');

            img.load(function () {
                base._origDim($(this));
                base.resizeNow(); // Resize background image
                base.launch();
                if (typeof theme != 'undefined' && typeof theme._init == "function") theme._init(); // Load Theme
            });

            if (base.options.slides.length > 1) {
                // Set next image
                vars.current_slide == base.options.slides.length - 1 ? loadNext = 0 : loadNext = vars.current_slide + 1; // If slide is last, load first slide as next
                imageLink = (base.options.slides[loadNext].url) ? "href='" + base.options.slides[loadNext].url + "'" : "";

                var imgNext = $('<img src="' + base.options.slides[loadNext].image + '"/>');
                var slideNext = base.el + ' li:eq(' + loadNext + ')';
                imgNext.appendTo(slideNext).wrap('<a ' + imageLink + linkTarget + '></a>').parent().parent().addClass('image-loading');

                imgNext.load(function () {
                    $(this).data('origWidth', $(this).width()).data('origHeight', $(this).height());
                    base.resizeNow(); // Resize background image
                }); // End Load
            }
            /*-----End load initial images-----*/

            //  Hide elements to be faded in
            base.$el.css('visibility', 'hidden');
            $('.load-item').hide();

        };


        /* Launch Supersized
        ----------------------------*/
        base.launch = function () {

            base.$el.css('visibility', 'visible');
            base.$el.hide();
            $('#supersized-loader').remove(); 	//Hide loading animation

            // Call theme function for before slide transition
            if (typeof theme != 'undefined' && typeof theme.beforeAnimation == "function") theme.beforeAnimation('next');
            $('.load-item').show();
            base.$el.fadeIn(700);

            // Keyboard Navigation
            if (base.options.keyboard_nav) {
                $(document.documentElement).keyup(function (event) {

                    if (vars.in_animation) return false; 	// Abort if currently animating

                    // Left Arrow or Down Arrow
                    if ((event.keyCode == 37) || (event.keyCode == 40)) {
                        clearInterval(vars.slideshow_interval); // Stop slideshow, prevent buildup
                        base.prevSlide();

                        // Right Arrow or Up Arrow
                    } else if ((event.keyCode == 39) || (event.keyCode == 38)) {
                        clearInterval(vars.slideshow_interval); // Stop slideshow, prevent buildup
                        base.nextSlide();

                        // Spacebar	
                    } else if (event.keyCode == 32 && !vars.hover_pause) {
                        clearInterval(vars.slideshow_interval); // Stop slideshow, prevent buildup
                        base.playToggle();
                    }

                });
            }

            // Pause when hover on image
            if (base.options.slideshow && base.options.pause_hover) {
                $(base.el).hover(function () {
                    if (vars.in_animation) return false; 	// Abort if currently animating
                    vars.hover_pause = true; // Mark slideshow paused from hover
                    if (!vars.is_paused) {
                        vars.hover_pause = 'resume'; // It needs to resume afterwards
                        base.playToggle();
                    }
                }, function () {
                    if (vars.hover_pause == 'resume') {
                        base.playToggle();
                        vars.hover_pause = false;
                    }
                });
            }

            if (base.options.slide_links) {
                // Slide marker clicked
                $(vars.slide_list + '> li').click(function () {

                    index = $(vars.slide_list + '> li').index(this);
                    targetSlide = index + 1;

                    base.goTo(targetSlide);
                    return false;

                });
            }

            // Thumb marker clicked
            if (base.options.thumb_links) {
                $(vars.thumb_list + '> li').click(function () {

                    index = $(vars.thumb_list + '> li').index(this);
                    targetSlide = index + 1;

                    api.goTo(targetSlide);
                    return false;

                });
            }

            // Start slideshow if enabled
            if (base.options.slideshow && base.options.slides.length > 1) {

                // Start slideshow if autoplay enabled
                if (base.options.autoplay && base.options.slides.length > 1) {
                    vars.slideshow_interval = setInterval(base.nextSlide, base.options.slide_interval); // Initiate slide interval
                } else {
                    vars.is_paused = true; // Mark as paused
                }

                //Prevent navigation items from being dragged					
                $('.load-item img').bind("contextmenu mousedown", function () {
                    return false;
                });

            }

            // Adjust image when browser is resized
            $(window).resize(function () {
                base.resizeNow();
            });

        };


        /* Resize Images
        ----------------------------*/
        base.resizeNow = function () {

            return base.$el.each(function () {
                //  Resize each image seperately
                $('img', base.el).each(function () {

                    thisSlide = $(this);
                    var ratio = (thisSlide.data('origHeight') / thisSlide.data('origWidth')).toFixed(2); // Define image ratio

                    // Gather browser size
                    var browserwidth = base.$el.width(),
						browserheight = base.$el.height(),
						offset;

                    /*-----Resize Image-----*/
                    if (base.options.fit_always) {	// Fit always is enabled
                        if ((browserheight / browserwidth) > ratio) {
                            resizeWidth();
                        } else {
                            resizeHeight();
                        }
                    } else {	// Normal Resize
                        if ((browserheight <= base.options.min_height) && (browserwidth <= base.options.min_width)) {	// If window smaller than minimum width and height

                            if ((browserheight / browserwidth) > ratio) {
                                base.options.fit_landscape && ratio < 1 ? resizeWidth(true) : resizeHeight(true); // If landscapes are set to fit
                            } else {
                                base.options.fit_portrait && ratio >= 1 ? resizeHeight(true) : resizeWidth(true); 	// If portraits are set to fit
                            }

                        } else if (browserwidth <= base.options.min_width) {		// If window only smaller than minimum width

                            if ((browserheight / browserwidth) > ratio) {
                                base.options.fit_landscape && ratio < 1 ? resizeWidth(true) : resizeHeight(); // If landscapes are set to fit
                            } else {
                                base.options.fit_portrait && ratio >= 1 ? resizeHeight() : resizeWidth(true); 	// If portraits are set to fit
                            }

                        } else if (browserheight <= base.options.min_height) {	// If window only smaller than minimum height

                            if ((browserheight / browserwidth) > ratio) {
                                base.options.fit_landscape && ratio < 1 ? resizeWidth() : resizeHeight(true); // If landscapes are set to fit
                            } else {
                                base.options.fit_portrait && ratio >= 1 ? resizeHeight(true) : resizeWidth(); 	// If portraits are set to fit
                            }

                        } else {	// If larger than minimums

                            if ((browserheight / browserwidth) > ratio) {
                                base.options.fit_landscape && ratio < 1 ? resizeWidth() : resizeHeight(); // If landscapes are set to fit
                            } else {
                                base.options.fit_portrait && ratio >= 1 ? resizeHeight() : resizeWidth(); 	// If portraits are set to fit
                            }

                        }
                    }
                    /*-----End Image Resize-----*/


                    /*-----Resize Functions-----*/

                    function resizeWidth(minimum) {
                        if (minimum) {	// If minimum height needs to be considered
                            if (thisSlide.width() < browserwidth || thisSlide.width() < base.options.min_width) {
                                if (thisSlide.width() * ratio >= base.options.min_height) {
                                    thisSlide.width(base.options.min_width);
                                    thisSlide.height(thisSlide.width() * ratio);
                                } else {
                                    resizeHeight();
                                }
                            }
                        } else {
                            if (base.options.min_height >= browserheight && !base.options.fit_landscape) {	// If minimum height needs to be considered
                                if (browserwidth * ratio >= base.options.min_height || (browserwidth * ratio >= base.options.min_height && ratio <= 1)) {	// If resizing would push below minimum height or image is a landscape
                                    thisSlide.width(browserwidth);
                                    thisSlide.height(browserwidth * ratio);
                                } else if (ratio > 1) {		// Else the image is portrait
                                    thisSlide.height(base.options.min_height);
                                    thisSlide.width(thisSlide.height() / ratio);
                                } else if (thisSlide.width() < browserwidth) {
                                    thisSlide.width(browserwidth);
                                    thisSlide.height(thisSlide.width() * ratio);
                                }
                            } else {	// Otherwise, resize as normal
                                thisSlide.width(browserwidth);
                                thisSlide.height(browserwidth * ratio);
                            }
                        }
                    };

                    function resizeHeight(minimum) {
                        if (minimum) {	// If minimum height needs to be considered
                            if (thisSlide.height() < browserheight) {
                                if (thisSlide.height() / ratio >= base.options.min_width) {
                                    thisSlide.height(base.options.min_height);
                                    thisSlide.width(thisSlide.height() / ratio);
                                } else {
                                    resizeWidth(true);
                                }
                            }
                        } else {	// Otherwise, resized as normal
                            if (base.options.min_width >= browserwidth) {	// If minimum width needs to be considered
                                if (browserheight / ratio >= base.options.min_width || ratio > 1) {	// If resizing would push below minimum width or image is a portrait
                                    thisSlide.height(browserheight);
                                    thisSlide.width(browserheight / ratio);
                                } else if (ratio <= 1) {		// Else the image is landscape
                                    thisSlide.width(base.options.min_width);
                                    thisSlide.height(thisSlide.width() * ratio);
                                }
                            } else {	// Otherwise, resize as normal
                                thisSlide.height(browserheight);
                                thisSlide.width(browserheight / ratio);
                            }
                        }
                    };

                    /*-----End Resize Functions-----*/

                    if (thisSlide.parents('li').hasClass('image-loading')) {
                        $('.image-loading').removeClass('image-loading');
                    }

                    // Horizontally Center
                    if (base.options.horizontal_center) {
                        $(this).css('left', (browserwidth - $(this).width()) / 2);
                    }

                    // Vertically Center
                    if (base.options.vertical_center) {
                        $(this).css('top', (browserheight - $(this).height()) / 2);
                    }

                });

                // Basic image drag and right click protection
                if (base.options.image_protect) {

                    $('img', base.el).bind("contextmenu mousedown", function () {
                        return false;
                    });

                }

                return false;

            });

        };


        /* Next Slide
        ----------------------------*/
        base.nextSlide = function () {

            if (vars.in_animation || !api.options.slideshow) return false; 	// Abort if currently animating
            else vars.in_animation = true; 	// Otherwise set animation marker

            clearInterval(vars.slideshow_interval); // Stop slideshow

            var slides = base.options.slides, 				// Pull in slides array
				liveslide = base.$el.find('.activeslide'); 	// Find active slide
            $('.prevslide').removeClass('prevslide');
            liveslide.removeClass('activeslide').addClass('prevslide'); // Remove active class & update previous slide

            // Get the slide number of new slide
            vars.current_slide + 1 == base.options.slides.length ? vars.current_slide = 0 : vars.current_slide++;

            var nextslide = $(base.el + ' li:eq(' + vars.current_slide + ')'),
		    	prevslide = base.$el.find('.prevslide');

            // If hybrid mode is on drop quality for transition
            if (base.options.performance == 1) base.$el.removeClass('quality').addClass('speed');


            /*-----Load Image-----*/

            loadSlide = false;

            vars.current_slide == base.options.slides.length - 1 ? loadSlide = 0 : loadSlide = vars.current_slide + 1; // Determine next slide

            var targetList = base.el + ' li:eq(' + loadSlide + ')';
            if (!$(targetList).html()) {

                // If links should open in new window
                var linkTarget = base.options.new_window ? ' target="_blank"' : '';

                imageLink = (base.options.slides[loadSlide].url) ? "href='" + base.options.slides[loadSlide].url + "'" : ""; // If link exists, build it
                var img = $('<img src="' + base.options.slides[loadSlide].image + '"/>');

                img.appendTo(targetList).wrap('<a ' + imageLink + linkTarget + '></a>').parent().parent().addClass('image-loading').css('visibility', 'hidden');

                img.load(function () {
                    base._origDim($(this));
                    base.resizeNow();
                }); // End Load
            };

            // Update thumbnails (if enabled)
            if (base.options.thumbnail_navigation == 1) {

                // Load previous thumbnail
                vars.current_slide - 1 < 0 ? prevThumb = base.options.slides.length - 1 : prevThumb = vars.current_slide - 1;
                $(vars.prev_thumb).html($("<img/>").attr("src", base.options.slides[prevThumb].image));

                // Load next thumbnail
                nextThumb = loadSlide;
                $(vars.next_thumb).html($("<img/>").attr("src", base.options.slides[nextThumb].image));

            }



            /*-----End Load Image-----*/


            // Call theme function for before slide transition
            if (typeof theme != 'undefined' && typeof theme.beforeAnimation == "function") theme.beforeAnimation('next');

            //Update slide markers
            if (base.options.slide_links) {
                $('.current-slide').removeClass('current-slide');
                $(vars.slide_list + '> li').eq(vars.current_slide).addClass('current-slide');
            }

            nextslide.css('visibility', 'hidden').addClass('activeslide'); // Update active slide

            switch (base.options.transition) {
                case 0: case 'none': // No transition
                    nextslide.css('visibility', 'visible');
                    vars.in_animation = false;
                    break;
                case 1: case 'fade': // Fade
                    nextslide.animate({ opacity: 0 }, 0).css('visibility', 'visible').animate({ opacity: 1, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    break;
                case 2: case 'slideTop': // Slide Top
                    nextslide.animate({ top: -base.$el.height() }, 0).css('visibility', 'visible').animate({ top: 0, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    break;
                case 3: case 'slideRight': // Slide Right
                    nextslide.animate({ left: base.$el.width() }, 0).css('visibility', 'visible').animate({ left: 0, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    break;
                case 4: case 'slideBottom': // Slide Bottom
                    nextslide.animate({ top: base.$el.height() }, 0).css('visibility', 'visible').animate({ top: 0, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    break;
                case 5: case 'slideLeft':  // Slide Left
                    nextslide.animate({ left: -base.$el.width() }, 0).css('visibility', 'visible').animate({ left: 0, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    break;
                case 6: case 'carouselRight': // Carousel Right
                    nextslide.animate({ left: base.$el.width() }, 0).css('visibility', 'visible').animate({ left: 0, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    liveslide.animate({ left: -base.$el.width(), avoidTransforms: false }, base.options.transition_speed);
                    break;
                case 7: case 'carouselLeft':   // Carousel Left
                    nextslide.animate({ left: -base.$el.width() }, 0).css('visibility', 'visible').animate({ left: 0, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    liveslide.animate({ left: base.$el.width(), avoidTransforms: false }, base.options.transition_speed);
                    break;
            }
            return false;
        };


        /* Previous Slide
        ----------------------------*/
        base.prevSlide = function () {

            if (vars.in_animation || !api.options.slideshow) return false; 	// Abort if currently animating
            else vars.in_animation = true; 	// Otherwise set animation marker

            clearInterval(vars.slideshow_interval); // Stop slideshow

            var slides = base.options.slides, 				// Pull in slides array
				liveslide = base.$el.find('.activeslide'); 	// Find active slide
            $('.prevslide').removeClass('prevslide');
            liveslide.removeClass('activeslide').addClass('prevslide'); 	// Remove active class & update previous slide

            // Get current slide number
            vars.current_slide == 0 ? vars.current_slide = base.options.slides.length - 1 : vars.current_slide--;

            var nextslide = $(base.el + ' li:eq(' + vars.current_slide + ')'),
		    	prevslide = base.$el.find('.prevslide');

            // If hybrid mode is on drop quality for transition
            if (base.options.performance == 1) base.$el.removeClass('quality').addClass('speed');


            /*-----Load Image-----*/

            loadSlide = false;

            vars.current_slide - 1 < 0 ? loadSlide = base.options.slides.length - 1 : loadSlide = vars.current_slide - 1; // Determine next slide
            var targetList = base.el + ' li:eq(' + loadSlide + ')';
            if (!$(targetList).html()) {
                // If links should open in new window
                var linkTarget = base.options.new_window ? ' target="_blank"' : '';
                imageLink = (base.options.slides[loadSlide].url) ? "href='" + base.options.slides[loadSlide].url + "'" : ""; // If link exists, build it
                var img = $('<img src="' + base.options.slides[loadSlide].image + '"/>');

                img.appendTo(targetList).wrap('<a ' + imageLink + linkTarget + '></a>').parent().parent().addClass('image-loading').css('visibility', 'hidden');

                img.load(function () {
                    base._origDim($(this));
                    base.resizeNow();
                }); // End Load
            };

            // Update thumbnails (if enabled)
            if (base.options.thumbnail_navigation == 1) {

                // Load previous thumbnail
                prevThumb = loadSlide;
                $(vars.prev_thumb).html($("<img/>").attr("src", base.options.slides[prevThumb].image));

                // Load next thumbnail
                vars.current_slide == base.options.slides.length - 1 ? nextThumb = 0 : nextThumb = vars.current_slide + 1;
                $(vars.next_thumb).html($("<img/>").attr("src", base.options.slides[nextThumb].image));
            }

            /*-----End Load Image-----*/


            // Call theme function for before slide transition
            if (typeof theme != 'undefined' && typeof theme.beforeAnimation == "function") theme.beforeAnimation('prev');

            //Update slide markers
            if (base.options.slide_links) {
                $('.current-slide').removeClass('current-slide');
                $(vars.slide_list + '> li').eq(vars.current_slide).addClass('current-slide');
            }

            nextslide.css('visibility', 'hidden').addClass('activeslide'); // Update active slide

            switch (base.options.transition) {
                case 0: case 'none': // No transition
                    nextslide.css('visibility', 'visible'); vars.in_animation = false; base.afterAnimation();
                    break;
                case 1: case 'fade': // Fade
                    nextslide.animate({ opacity: 0 }, 0).css('visibility', 'visible').animate({ opacity: 1, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    break;
                case 2: case 'slideTop': // Slide Top (reverse)
                    nextslide.animate({ top: base.$el.height() }, 0).css('visibility', 'visible').animate({ top: 0, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    break;
                case 3: case 'slideRight': // Slide Right (reverse)
                    nextslide.animate({ left: -base.$el.width() }, 0).css('visibility', 'visible').animate({ left: 0, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    break;
                case 4: case 'slideBottom': // Slide Bottom (reverse)
                    nextslide.animate({ top: -base.$el.height() }, 0).css('visibility', 'visible').animate({ top: 0, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    break;
                case 5: case 'slideLeft':  // Slide Left (reverse)
                    nextslide.animate({ left: base.$el.width() }, 0).css('visibility', 'visible').animate({ left: 0, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    break;
                case 6: case 'carouselRight': // Carousel Right (reverse)
                    nextslide.animate({ left: -base.$el.width() }, 0).css('visibility', 'visible').animate({ left: 0, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    liveslide.animate({ left: 0 }, 0).animate({ left: base.$el.width(), avoidTransforms: false }, base.options.transition_speed);
                    break;
                case 7: case 'carouselLeft':   // Carousel Left (reverse)
                    nextslide.animate({ left: base.$el.width() }, 0).css('visibility', 'visible').animate({ left: 0, avoidTransforms: false }, base.options.transition_speed, function () { base.afterAnimation(); });
                    liveslide.animate({ left: 0 }, 0).animate({ left: -base.$el.width(), avoidTransforms: false }, base.options.transition_speed);
                    break;
            }
            return false;
        };


        /* Play/Pause Toggle
        ----------------------------*/
        base.playToggle = function () {

            if (vars.in_animation || !api.options.slideshow) return false; 	// Abort if currently animating

            if (vars.is_paused) {

                vars.is_paused = false;

                // Call theme function for play
                if (typeof theme != 'undefined' && typeof theme.playToggle == "function") theme.playToggle('play');

                // Resume slideshow
                vars.slideshow_interval = setInterval(base.nextSlide, base.options.slide_interval);

            } else {

                vars.is_paused = true;

                // Call theme function for pause
                if (typeof theme != 'undefined' && typeof theme.playToggle == "function") theme.playToggle('pause');

                // Stop slideshow
                clearInterval(vars.slideshow_interval);

            }

            return false;

        };


        /* Go to specific slide
        ----------------------------*/
        base.goTo = function (targetSlide) {
            if (vars.in_animation || !api.options.slideshow) return false; 	// Abort if currently animating

            var totalSlides = base.options.slides.length;

            // If target outside range
            if (targetSlide < 0) {
                targetSlide = totalSlides;
            } else if (targetSlide > totalSlides) {
                targetSlide = 1;
            }
            targetSlide = totalSlides - targetSlide + 1;

            clearInterval(vars.slideshow_interval); // Stop slideshow, prevent buildup

            // Call theme function for goTo trigger
            if (typeof theme != 'undefined' && typeof theme.goTo == "function") theme.goTo();

            if (vars.current_slide == totalSlides - targetSlide) {
                if (!(vars.is_paused)) {
                    vars.slideshow_interval = setInterval(base.nextSlide, base.options.slide_interval);
                }
                return false;
            }

            // If ahead of current position
            if (totalSlides - targetSlide > vars.current_slide) {

                // Adjust for new next slide
                vars.current_slide = totalSlides - targetSlide - 1;
                vars.update_images = 'next';
                base._placeSlide(vars.update_images);

                //Otherwise it's before current position
            } else if (totalSlides - targetSlide < vars.current_slide) {

                // Adjust for new prev slide
                vars.current_slide = totalSlides - targetSlide + 1;
                vars.update_images = 'prev';
                base._placeSlide(vars.update_images);

            }

            // set active markers
            if (base.options.slide_links) {
                $(vars.slide_list + '> .current-slide').removeClass('current-slide');
                $(vars.slide_list + '> li').eq((totalSlides - targetSlide)).addClass('current-slide');
            }

            if (base.options.thumb_links) {
                $(vars.thumb_list + '> .current-thumb').removeClass('current-thumb');
                $(vars.thumb_list + '> li').eq((totalSlides - targetSlide)).addClass('current-thumb');
            }

        };


        /* Place Slide
        ----------------------------*/
        base._placeSlide = function (place) {

            // If links should open in new window
            var linkTarget = base.options.new_window ? ' target="_blank"' : '';

            loadSlide = false;

            if (place == 'next') {

                vars.current_slide == base.options.slides.length - 1 ? loadSlide = 0 : loadSlide = vars.current_slide + 1; // Determine next slide

                var targetList = base.el + ' li:eq(' + loadSlide + ')';

                if (!$(targetList).html()) {
                    // If links should open in new window
                    var linkTarget = base.options.new_window ? ' target="_blank"' : '';

                    imageLink = (base.options.slides[loadSlide].url) ? "href='" + base.options.slides[loadSlide].url + "'" : ""; // If link exists, build it
                    var img = $('<img src="' + base.options.slides[loadSlide].image + '"/>');

                    img.appendTo(targetList).wrap('<a ' + imageLink + linkTarget + '></a>').parent().parent().addClass('image-loading').css('visibility', 'hidden');

                    img.load(function () {
                        base._origDim($(this));
                        base.resizeNow();
                    }); // End Load
                };

                base.nextSlide();

            } else if (place == 'prev') {

                vars.current_slide - 1 < 0 ? loadSlide = base.options.slides.length - 1 : loadSlide = vars.current_slide - 1; // Determine next slide

                var targetList = base.el + ' li:eq(' + loadSlide + ')';

                if (!$(targetList).html()) {
                    // If links should open in new window
                    var linkTarget = base.options.new_window ? ' target="_blank"' : '';

                    imageLink = (base.options.slides[loadSlide].url) ? "href='" + base.options.slides[loadSlide].url + "'" : ""; // If link exists, build it
                    var img = $('<img src="' + base.options.slides[loadSlide].image + '"/>');

                    img.appendTo(targetList).wrap('<a ' + imageLink + linkTarget + '></a>').parent().parent().addClass('image-loading').css('visibility', 'hidden');

                    img.load(function () {
                        base._origDim($(this));
                        base.resizeNow();
                    }); // End Load
                };
                base.prevSlide();
            }

        };


        /* Get Original Dimensions
        ----------------------------*/
        base._origDim = function (targetSlide) {
            targetSlide.data('origWidth', targetSlide.width()).data('origHeight', targetSlide.height());
        };


        /* After Slide Animation
        ----------------------------*/
        base.afterAnimation = function () {

            // If hybrid mode is on swap back to higher image quality
            if (base.options.performance == 1) {
                base.$el.removeClass('speed').addClass('quality');
            }

            // Update previous slide
            if (vars.update_images) {
                vars.current_slide - 1 < 0 ? setPrev = base.options.slides.length - 1 : setPrev = vars.current_slide - 1;
                vars.update_images = false;
                $('.prevslide').removeClass('prevslide');
                $(base.el + ' li:eq(' + setPrev + ')').addClass('prevslide');
            }

            vars.in_animation = false;

            // Resume slideshow
            if (!vars.is_paused && base.options.slideshow) {
                vars.slideshow_interval = setInterval(base.nextSlide, base.options.slide_interval);
                if (base.options.stop_loop && vars.current_slide == base.options.slides.length - 1) base.playToggle();
            }

            // Call theme function for after slide transition
            if (typeof theme != 'undefined' && typeof theme.afterAnimation == "function") theme.afterAnimation();

            return false;

        };

        base.getField = function (field) {
            return base.options.slides[vars.current_slide][field];
        };

        // Make it go!
        base.init();
    };


    /* Global Variables
    ----------------------------*/
    $.supersized.vars = {

        // Elements							
        thumb_tray: '#thumb-tray', // Thumbnail tray
        thumb_list: '#thumb-list', // Thumbnail list
        slide_list: '#slide-list', // Slide link list

        // Internal variables
        current_slide: 0, 		// Current slide number
        in_animation: false, 	// Prevents animations from stacking
        is_paused: false, 	// Tracks paused on/off
        hover_pause: false, 	// If slideshow is paused from hover
        slideshow_interval: false, 	// Stores slideshow timer					
        update_images: false, 	// Trigger to update images after slide jump
        options: {}			// Stores assembled options list

    };


    /* Default Options
    ----------------------------*/
    $.supersized.defaultOptions = {

        // Functionality
        slideshow: 1, 		// Slideshow on/off
        autoplay: 1, 		// Slideshow starts playing automatically
        start_slide: 1, 		// Start slide (0 is random)
        stop_loop: 0, 		// Stops slideshow on last slide
        random: 0, 		// Randomize slide order (Ignores start slide)
        slide_interval: 5000, 	// Length between transitions
        transition: 1, 			// 0-None, 1-Fade, 2-Slide Top, 3-Slide Right, 4-Slide Bottom, 5-Slide Left, 6-Carousel Right, 7-Carousel Left
        transition_speed: 750, 	// Speed of transition
        new_window: 1, 		// Image links open in new window/tab
        pause_hover: 0, 		// Pause slideshow on hover
        keyboard_nav: 1, 		// Keyboard navigation on/off
        performance: 1, 		// 0-Normal, 1-Hybrid speed/quality, 2-Optimizes image quality, 3-Optimizes transition speed //  (Only works for Firefox/IE, not Webkit)
        image_protect: 1, 		// Disables image dragging and right click with Javascript

        // Size & Position
        fit_always: 0, 		// Image will never exceed browser width or height (Ignores min. dimensions)
        fit_landscape: 0, 		// Landscape images will not exceed browser width
        fit_portrait: 1, 		// Portrait images will not exceed browser height  			   
        min_width: 0, 		// Min width allowed (in pixels)
        min_height: 0, 		// Min height allowed (in pixels)
        horizontal_center: 1, 		// Horizontally center background
        vertical_center: 1, 		// Vertically center background


        // Components							
        slide_links: 1, 		// Individual links for each slide	
        thumb_links: 1, 		// Individual thumb links for each slide
        thumbnail_navigation: 0			// Thumbnail navigation

    };

    $.fn.supersized = function (options) {
        return this.each(function () {
            (new $.supersized(options));
        });
    };

})(jQuery);


