﻿/*!
* slideViewerPro 1.0
* Examples and documentation at: 
* http://www.gcmingati.net/wordpress/wp-content/lab/jquery/svwt/
* 2009-2010 Gian Carlo Mingati
* Version: 1.0.5 (26-JULY-2009)
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
* Requires:
* jQuery v1.3.2 or later
* Option:
* jQuery Timers plugin | plugins.jquery.com/project/timers (for autoslide mode)
* 
*/
jQuery.extend(jQuery.easing, // from the jquery.easing plugin
{
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;
}
});
jQuery(function () {
    jQuery("div.svwp").prepend("<img src='/images/1x1.gif' class='ldrgif' alt='loading...'/ >"); //change with YOUR loader image path   
});
var j = 0;
jQuery.fn.slideViewerPro = function (settings) {
    settings = jQuery.extend({
        galBorderWidth: 6,
        thumbsTopMargin: 3,
        thumbsRightMargin: 3,
        thumbsBorderWidth: 3,
        buttonsWidth: 20,
        galBorderColor: "#ff0000",
        thumbsBorderColor: "#d8d8d8",
        thumbsActiveBorderColor: "#ff0000",
        buttonsTextColor: "#ff0000",
        thumbsBorderOpacity: 1.0, // could be 0, 0.1 up to 1.0
        thumbsActiveBorderOpacity: 1.0, // could be 0, 0.1 up to 1.0
        easeTime: 750,
        asTimer: 4000,
        thumbs: 5,
        thumbsPercentReduction: 12,
        thumbsVis: true,
        easeFunc: "easeInOutExpo",
        leftButtonInner: "-", //could be an image "<img src='images/larw.gif' />" or an escaped char as "&larr";
        rightButtonInner: "+", //could be an image or an escaped char as "&rarr";
        autoslide: false,
        typo: false,
        typoFullOpacity: 0.9,
        shuffle: false,
        novicellThumbs: false, /*tbbNovicell: added*/
        novicellThumbsWidth: 1, /*tbbNovicell: added*/
        novicellThumbsHeight: 1, /*tbbNovicell: added*/
        novicellLargeVersionWidth: 1, /*tbbNovicell: added*/
        novicellLargeVersionHeight: 1 /*tbbNovicell: added*/
    }, settings);

    return this.each(function () {
        function shuffle(a) {
            var i = a.size();
            while (--i) {
                var j = Math.floor(Math.random() * (i));
                var tmp = a.slice(i, i + 1);
                a.slice(j, j + 1).insertAfter(tmp);
            }
        }
        var container = jQuery(this);
        (!settings.shuffle) ? null : shuffle(container.find("li"));
        container.find("img.ldrgif").remove();
        container.removeClass("svwp").addClass("slideViewer");
        container.attr("id", "svwp" + j);
        if (settings.novicellThumbs) {/*tbbNovicell: this check added*/
            var pictWidth = settings.novicellLargeVersionWidth;
            var pictHeight = settings.novicellLargeVersionHeight;
        }
        else {
            var pictWidth = container.find("img").attr("width");
            var pictHeight = container.find("img").attr("height");
        }
        var pictEls = container.find("li").size();
        (pictEls >= settings.thumbs) ? null : settings.thumbs = pictEls;
        var slideViewerWidth = pictWidth * pictEls;

        if (settings.novicellThumbs) { /*yyyNovicell, check added*/
            var thumbsWidth = settings.novicellThumbsWidth;
            var thumbsHeight = settings.novicellThumbsHeight;
        }
        else {
            var thumbsWidth = Math.round(pictWidth * settings.thumbsPercentReduction / 100);
            var thumbsHeight = Math.round(pictHeight * settings.thumbsPercentReduction / 100);
        }

        var pos = 0;
        var r_enabled = true;
        var l_enabled = true;
        container.find("ul").css("width", slideViewerWidth)
    .wrap(jQuery("<div style='width:" + pictWidth + "px; overflow: hidden; position: relative; top: 0; left: 0'>"));
        container.css("width", pictWidth);
        container.css("height", pictHeight);
        container.each(function (i) {
            if (settings.typo) {
                jQuery(this).find("img").each(function (z) {
                    jQuery(this).after("<span class='typo' style='position: absolute; width:" + (pictWidth - 12) + "px; margin: 0 0 0 -" + pictWidth + "px'>" + jQuery(this).attr("alt") + "<\/span>");
                });
            }
            jQuery(this).after("<div class='thumbSlider' id='thumbSlider" + j + "'><ul><\/ul><\/div>");
            jQuery(this).next().after("<a href='#' class='left' id='left" + j + "'><span>" + settings.leftButtonInner + "</span><\/a><a href='#' class='right' id='right" + j + "'><span>" + settings.rightButtonInner + "<\/span><\/a>");

            jQuery(this).find("li").each(function (n) {
                if (settings.novicellThumbs) {/*tbbNovicell: this check added*/
                    xtraClass = "";
                    if (n == 0)
                        xtraClass = ' class="selected"';
                    jQuery("div#thumbSlider" + j + " ul").append('<li><a href="#"' + xtraClass + '>' + jQuery(this).find("div:first").html() + '</a></li>');
                }
                else {
                    jQuery("div#thumbSlider" + j + " ul").append("<li><a title='" + jQuery(this).find("img").attr("alt") + "' href='#'><img width='" + thumbsWidth + "' height='" + thumbsHeight + "' src='" + jQuery(this).find("img").attr("src") + "' /><p class='tmbrdr'>&nbsp;<\/p><\/a><\/li>");
                }
            });

            jQuery("div#thumbSlider" + j + " a").each(function (z) {
                jQuery(this).bind("click", function () {
                    jQuery(this).find("p.tmbrdr").css({ borderColor: settings.thumbsActiveBorderColor, opacity: settings.thumbsActiveBorderOpacity });
                    jQuery(this).parent().parent().find("p.tmbrdr").not(jQuery(this).find("p.tmbrdr")).css({ borderColor: settings.thumbsBorderColor, opacity: settings.thumbsBorderOpacity });
                    var cnt = -(pictWidth * z);
                    (cnt != container.find("ul").css("left").replace(/px/, "")) ? container.find("span.typo").animate({ "opacity": 0 }, 250) : null;
                    container.find("ul").animate({ left: cnt }, settings.easeTime, settings.easeFunc, function () { container.find("span.typo").animate({ "opacity": settings.typoFullOpacity }, 250) });
                    jQuery(this).closest('ul').find('a').removeClass('selected'); /*tbbNovicell: this added*/
                    jQuery(this).addClass('selected'); /*tbbNovicell: this added*/

                    return false;
                });
            });
            // shortcuts to +/- buttons
            var jQuerybtl = jQuery("a#left" + j);
            var jQuerybtr = jQuery("a#right" + j);

            // right/left 			
            jQuerybtr.bind("click", function () {
                if (r_enabled) (pictEls - pos > settings.thumbs * 2 || pictEls % settings.thumbs == 0) ? pos += settings.thumbs : pos += pictEls % settings.thumbs;
                r_enabled = false;
                jQuery(this).prev().prev().find("ul:not(:animated)").animate({ left: -(thumbsWidth + settings.thumbsRightMargin) * pos }, 500, settings.easeFunc, function () { authorityMixing(); });
                return false;
            });
            jQuerybtl.bind("click", function () {
                if (l_enabled && pos != 0) (pictEls - pos > settings.thumbs || pictEls % settings.thumbs == 0) ? pos -= settings.thumbs : pos -= pictEls % settings.thumbs;
                l_enabled = false;
                jQuery(this).prev().find("ul:not(:animated)").animate({ left: -(thumbsWidth + settings.thumbsRightMargin) * pos }, 500, settings.easeFunc, function () { authorityMixing(); });
                return false;
            });

            function authorityMixing() {

                //right btt
                (pos == pictEls - settings.thumbs) ? jQuerybtr.addClass("r_dis") : jQuerybtr.removeClass("r_dis");
                (pos == pictEls - settings.thumbs) ? r_enabled = false : r_enabled = true;
                //left btt
                (pos == 0) ? jQuerybtl.addClass("l_dis") : jQuerybtl.removeClass("l_dis");
                (pos == 0) ? l_enabled = false : l_enabled = true;
            }

            //CSS	defs @ runtime
            var tBorder = settings.thumbsBorderWidth;
            var contBorder = settings.galBorderWidth

            jQuery(".slideViewer a img").css({ border: "0" });
            if (settings.typo) {
                jQuery(this).find("span.typo").each(function (z) {
                    jQuery(this).css({ marginTop: (pictHeight - jQuery(this).innerHeight()), opacity: settings.typoFullOpacity });
                });
            }
            jQuery("div#svwp" + j).css({ border: settings.galBorderWidth + "px solid " + settings.galBorderColor });

            if (settings.novicellThumbs) { /*yyyNovicell, check added*/
                jQuery("div#thumbSlider" + j).css({ position: "relative", left: contBorder, top: settings.thumbsTopMargin + "px", textAlign: "center", overflow: "hidden", margin: "0 auto" });
            }
            else {
                jQuery("div#thumbSlider" + j).css({ position: "relative", left: contBorder, top: settings.thumbsTopMargin + "px", width: settings.thumbs * thumbsWidth + ((settings.thumbsRightMargin * settings.thumbs) - settings.thumbsRightMargin), height: thumbsHeight, textAlign: "center", overflow: "hidden", margin: "0 auto" });

            }
            jQuery("div#thumbSlider" + j + " ul").css({ width: (thumbsWidth * pictEls) + settings.thumbsRightMargin * pictEls, position: "relative", left: "0", top: "0" });
            jQuery("div#thumbSlider" + j + " ul li").css({ marginRight: settings.thumbsRightMargin });

            jQuery("div#thumbSlider" + j).find("p.tmbrdr").css({ width: (thumbsWidth - tBorder * 2) + "px", height: (thumbsHeight - tBorder * 2) + "px", top: -(thumbsHeight) + "px", border: settings.thumbsBorderWidth + "px solid " + settings.thumbsBorderColor, opacity: settings.thumbsBorderOpacity });
            jQuery("div#thumbSlider" + j + " a:first p.tmbrdr").css({ borderColor: settings.thumbsActiveBorderColor, opacity: settings.thumbsActiveBorderOpacity });

            var rbttLeftMargin = (pictWidth / 2) + (jQuery("div#thumbSlider" + j).width() / 2) + settings.thumbsRightMargin + contBorder;
            var lbttLeftMargin = (pictWidth / 2) - (jQuery("div#thumbSlider" + j).width() / 2) - (settings.buttonsWidth + settings.thumbsRightMargin) + contBorder;


            var innerLeftImg = jQuerybtl.find("img");
            var innerRightImg = jQuerybtr.find("img");
            if (innerLeftImg.length != 0 && innerRightImg.length != 0) {
                jQuery(innerLeftImg).load(function () {
                    jQuery(this).css({ margin: Math.round((thumbsHeight / 2) - (jQuery(this).height() / 2)) + "px 0 0 0" });
                });
                jQuery(innerRightImg).load(function () {
                    jQuery(this).css({ margin: Math.round((thumbsHeight / 2) - (jQuery(this).height() / 2)) + "px 0 0 0" });
                });
            }

            if (settings.novicellThumbs) { /*yyyNovicell, check added*/
                jQuery("a#left" + j).css({ display: "block", textAlign: "center", width: settings.buttonsWidth + "px", textDecoration: "none", lineHeight: thumbsHeight + "px", color: settings.buttonsTextColor });
                jQuery("a#right" + j).css({ display: "block", textAlign: "center", width: settings.buttonsWidth + "px", textDecoration: "none", lineHeight: thumbsHeight + "px", color: settings.buttonsTextColor });
            }
            else {
                jQuery("a#left" + j).css({ display: "block", textAlign: "center", width: settings.buttonsWidth + "px", height: thumbsHeight + "px", margin: -(thumbsHeight - settings.thumbsTopMargin) + "px 0 0 " + lbttLeftMargin + "px", textDecoration: "none", lineHeight: thumbsHeight + "px", color: settings.buttonsTextColor });
                jQuery("a#right" + j).css({ display: "block", textAlign: "center", width: settings.buttonsWidth + "px", height: thumbsHeight + "px", margin: -(thumbsHeight) + "px 0 0 " + rbttLeftMargin + "px", textDecoration: "none", lineHeight: thumbsHeight + "px", color: settings.buttonsTextColor });
            }


            authorityMixing();

            if (settings.autoslide) {
                var i = 1;

                jQuery("div#thumbSlider" + j).everyTime(settings.asTimer, "asld", function () {
                    jQuery(this).find("a").eq(i).trigger("click");
                    if (i == 0) {
                        pos = 0;
                        l_enabled = false;
                        jQuery("div#thumbSlider" + j).find("ul:not(:animated)").animate({ left: -(thumbsWidth + settings.thumbsRightMargin) * pos }, 500, settings.easeFunc, function () { authorityMixing(); });
                    }
                    else l_enabled = true;

                    (i % settings.thumbs == 0) ? jQuery(this).next().next().trigger("click") : null;
                    (i < pictEls - 1) ? i++ : i = 0;
                });

                //stops autoslidemode	
                jQuery("a#right" + j).bind("mouseup", function () {
                    jQuery(this).prev().prev().stopTime("asld");
                });
                jQuery("a#left" + j).bind("mouseup", function () {
                    jQuery(this).prev().stopTime("asld");
                });
                jQuery("div#thumbSlider" + j + " a").bind("mouseup", function () {
                    jQuery(this).parent().parent().parent().stopTime("asld");
                });
            }
            var uiDisplay = (settings.thumbsVis) ? "block" : "none";
            if (settings.novicellThumbs) { /*yyyNovicell, check added*/
                jQuery("div#thumbSlider" + j + ", a#left" + j + ", a#right" + j).wrapAll("<div class='kilroyThumbsWrapper' style='display: " + uiDisplay + "' id='ui" + j + "'><\/div>");
                jQuery("div#svwp" + j + ", div#ui" + j).wrapAll('<div class="grid_11 cntKilroySlider"></div>');
            }
            else {
                jQuery("div#thumbSlider" + j + ", a#left" + j + ", a#right" + j).wrapAll("<div style='width:" + pictWidth + "px; display: " + uiDisplay + "' id='ui" + j + "'><\/div>");
                jQuery("div#svwp" + j + ", div#ui" + j).wrapAll("<div style='width:" + pictWidth + "px'><\/div>");
                (jQuery("div#thumbSlider" + j).width() + (settings.buttonsWidth * 2) >= pictWidth) ? alert("ALERT: THE THUMBNAILS SLIDER IS TOO WIDE! \nthumbsPercentReduction and/or buttonsWidth needs to be scaled down!") : null;
            }

        });


        j++;
    });
};
