// source --> https://markstiedye.com/wp-content/plugins/woo-photo-reviews/js/script.min.js?ver=1.2.26 
jQuery(document).ready((function(e){let r=woocommerce_photo_reviews_params.hasOwnProperty("comments_container_id")?woocommerce_photo_reviews_params.comments_container_id:"comments",t=e("#"+r);function a(){t=e("#"+r),(e(".wcpr-filter-container").length>0&&0===t.find(".wcpr-filter-container").length||e(".wcpr-overall-rating-and-rating-count").length>0&&0===t.find(".wcpr-overall-rating-and-rating-count").length)&&t.prepend(e(".wcpr-filter-container")).prepend(e(".wcpr-overall-rating-and-rating-count")).prepend(e(".woocommerce-Reviews-title").eq(0))}t.length>0?a():e(document).on("skeleton-loaded",(function(){a()})),e(window).on("load",(function(){a()})),e(document).on("click",".reviews_tab",(function(){a()}));let o=woocommerce_photo_reviews_params.max_files;function i(e,r,t=""){let a,o=`<img title="${r}" src="${e}" class="wcpr-selected-image-preview">`;return a=t?`<div class="wcpr-selected-image">${o}<div class="wcpr-selected-image-info"><div class="wcpr-selected-image-name wcpr-comment-form-error" >${t}</div></div></div>`:`<div class="wcpr-selected-image">${o}<div class="wcpr-selected-image-info"><div class="wcpr-selected-image-name" title="${r}">${r}</div></div></div>`,a}e("#commentform").on("change",".wcpr_image_upload",(function(r){if(e(this).parent().find(".wcpr-selected-image-container").html(""),this.files.length>o)return alert(woocommerce_photo_reviews_params.warning_max_files),e(this).val(""),!1;this.files.length>0&&function(r){let t=1024*parseFloat(woocommerce_photo_reviews_params.max_file_size);for(let o=0;o<r.files.length;o++){var a=new FileReader;a.onload=function(a){let n="";-1===woocommerce_photo_reviews_params.upload_allow.indexOf(r.files[o].type)?n=woocommerce_photo_reviews_params.warning_upload_allow.replace("%file_name%",r.files[o].name):r.files[o].size>t&&(n=woocommerce_photo_reviews_params.warning_max_file_size.replace("%file_name%",r.files[o].name)),e(r).parent().find(".wcpr-selected-image-container").append(i(a.target.result,r.files[o].name,n))},a.readAsDataURL(r.files[o])}}(this)})),e("#commentform").find('input[type="submit"]').on("click",(function(r){let t=e(this);if(t.hasClass("viwcpr_form_checked"))return!0;let a=e(this).closest("form"),i=a.find('textarea[id="comment"]')||a.find('textarea[name="comment"]'),n=a.find('input[name="author"]'),c=a.find('input[name="email"]');if(i.length>0&&!i.val())return alert(woocommerce_photo_reviews_params.i18n_required_comment_text),r.preventDefault(),i.focus(),!1;if("on"===woocommerce_photo_reviews_params.enable_photo){a.attr("enctype")&&"multipart/form-data"===a.attr("enctype")||a.attr("enctype","multipart/form-data");let e=a.find(".wcpr_image_upload");if(e.length>0){let t=e.get(0).files,a=parseInt(t.length);if("on"===woocommerce_photo_reviews_params.required_image&&0===a)return alert(woocommerce_photo_reviews_params.warning_required_image),r.preventDefault(),!1;if(a>o)return alert(woocommerce_photo_reviews_params.warning_max_files),r.preventDefault(),!1;let i=[],n=1024*parseFloat(woocommerce_photo_reviews_params.max_file_size);if(jQuery.each(t,(function(e,r){if(-1===woocommerce_photo_reviews_params.upload_allow.indexOf(r.type))return i.push(woocommerce_photo_reviews_params.warning_upload_allow.replace("%file_name%",r.name)),!0;r.size>n&&i.push(woocommerce_photo_reviews_params.warning_max_file_size.replace("%file_name%",r.name))})),i.length)return alert(i.join("\n")),r.preventDefault(),!1}else if("on"===woocommerce_photo_reviews_params.required_image)return alert(woocommerce_photo_reviews_params.warning_required_image),r.preventDefault(),!1}if(n.length>0&&n.attr("required")&&!n.val())return alert(woocommerce_photo_reviews_params.i18n_required_name_text),r.preventDefault(),n.focus(),!1;if(c.length>0&&c.attr("required")&&!c.val())return alert(woocommerce_photo_reviews_params.i18n_required_email_text),r.preventDefault(),c.focus(),!1;if(!1===a.find('input[name="wcpr_gdpr_checkbox"]').prop("checked"))return alert(woocommerce_photo_reviews_params.warning_gdpr),r.preventDefault(),!1;if(woocommerce_photo_reviews_params.ajax_check_content_reviews){t.attr("type","button"),async function(){let r="";return await new Promise((function(t){e.ajax({type:"post",url:woocommerce_photo_reviews_params.wc_ajax_url.toString().replace("%%endpoint%%","viwcpr_restrict_number_of_reviews"),processData:!1,cache:!1,contentType:!1,data:new FormData(a[0]),success:function(e){e.error?r=e.error:(e.remove_upload_file&&a.find(".wcpr_image_upload").val(""),e.img_id&&a.append(`<input type="hidden" name="wcpr_image_upload_id" value="${e.img_id}">`)),t(r)},error:function(e){r="-1"===e.responseText?e.statusText:e.responseText,t(r)}})})),r}().then((function(e){if(t.attr("type","submit"),e)return alert(e),r.preventDefault(),!1;t.addClass("viwcpr_form_checked").trigger("click")}))}}))}));
// source --> https://markstiedye.com/wp-content/plugins/woo-photo-reviews/js/jquery.swipebox.js?ver=1.2.26 
/*! Swipebox v1.4.4 | Constantin Saguin csag.co | MIT License | github.com/brutaldesign/swipebox */

;(function (window, document, $, undefined) {

    $.swipebox = function (elem, options) {

        // Default options
        var ui,
            defaults = {
                useCSS: true,
                useSVG: true,
                initialIndexOnArray: 0,
                removeBarsOnMobile: false,
                hideCloseButtonOnMobile: false,
                hideBarsDelay: 3000,
                videoMaxWidth: 1140,
                vimeoColor: 'cccccc',
                beforeOpen: null,
                afterOpen: null,
                afterClose: null,
                afterMedia: null,
                nextSlide: null,
                prevSlide: null,
                loopAtEnd: false,
                autoplayVideos: false,
                queryStringData: {},
                toggleClassOnLoad: ''
            },

            plugin = this,
            elements = [], // slides array [ { href:'...', title:'...' }, ...],
            $elem,
            selector = elem.selector,
            isMobile = navigator.userAgent.match(/(iPad)|(iPhone)|(iPod)|(Android)|(PlayBook)|(BB10)|(BlackBerry)|(Opera Mini)|(IEMobile)|(webOS)|(MeeGo)/i),
            isTouch = isMobile !== null || document.createTouch !== undefined || ('ontouchstart' in window) || ('onmsgesturechange' in window) || navigator.msMaxTouchPoints,
            supportSVG = !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect,
            winWidth = window.innerWidth ? window.innerWidth : $(window).width(),
            winHeight = window.innerHeight ? window.innerHeight : $(window).height(),
            currentX = 0,
            /* jshint multistr: true */
            html = '<div id="wcpr-swipebox-overlay">\
					<div id="wcpr-swipebox-container">\
						<div id="wcpr-swipebox-slider"></div>\
						<div id="wcpr-swipebox-top-bar">\
							<div id="wcpr-swipebox-title"></div>\
						</div>\
						<div id="wcpr-swipebox-bottom-bar">\
							<div id="wcpr-swipebox-arrows">\
								<a id="wcpr-swipebox-prev"></a>\
								<a id="wcpr-swipebox-next"></a>\
							</div>\
						</div>\
						<a id="wcpr-swipebox-close"></a>\
					</div>\
			</div>';

        plugin.settings = {};

        $.swipebox.close = function () {
            ui.closeSlide();
        };

        $.swipebox.extend = function () {
            return ui;
        };

        plugin.init = function () {

            plugin.settings = $.extend({}, defaults, options);

            if ($.isArray(elem)) {

                elements = elem;
                ui.target = $(window);
                ui.init(plugin.settings.initialIndexOnArray);

            } else {

                $(document).on('click', selector, function (event) {
                    event.preventDefault();
                    // console.log( isTouch );

                    if (event.target.parentNode.className === 'slide current') {

                        return false;
                    }

                    if (!$.isArray(elem)) {
                        ui.destroy();
                        $elem = $(selector);
                        ui.actions();
                    }

                    elements = [];
                    var index, relType, relVal;

                    // Allow for HTML5 compliant attribute before legacy use of rel
                    if (!relVal) {
                        relType = 'data-rel';
                        relVal = $(this).attr(relType);
                    }

                    if (!relVal) {
                        relType = 'rel';
                        relVal = $(this).attr(relType);
                    }

                    if (relVal && relVal !== '' && relVal !== 'nofollow') {
                        $elem = $(selector).filter('[' + relType + '="' + relVal + '"]');
                    } else {
                        $elem = $(selector);
                    }

                    $elem.each(function () {

                        var title = null,
                            href = null;

                        if ($(this).attr('title')) {
                            title = $(this).attr('title');
                        }


                        if ($(this).attr('href')) {
                            href = $(this).attr('href');
                        }

                        elements.push({
                            href: href,
                            title: title
                        });
                    });

                    index = $elem.index($(this));
                    event.preventDefault();
                    event.stopPropagation();
                    ui.target = $(event.target);
                    ui.init(index);
                });
            }
        };

        ui = {

            /**
             * Initiate Swipebox
             */
            init: function (index) {
                if (plugin.settings.beforeOpen) {
                    plugin.settings.beforeOpen();
                }
                this.target.trigger('wcpr-swipebox-start');
                $.swipebox.isOpen = true;
                this.build();
                this.openSlide(index);
                this.openMedia(index);
                this.preloadMedia(index + 1);
                this.preloadMedia(index - 1);
                if (plugin.settings.afterOpen) {
                    plugin.settings.afterOpen(index);
                }
            },

            /**
             * Built HTML containers and fire main functions
             */
            build: function () {
                var $this = this, bg;

                $('body').append(html);

                if (supportSVG && plugin.settings.useSVG === true) {
                    bg = $('#wcpr-swipebox-close').css('background-image');
                    bg = bg.replace('png', 'svg');
                    $('#wcpr-swipebox-prev, #wcpr-swipebox-next, #wcpr-swipebox-close').css({
                        'background-image': bg
                    });
                }

                if (isMobile && plugin.settings.removeBarsOnMobile) {
                    $('#wcpr-swipebox-bottom-bar, #wcpr-swipebox-top-bar').remove();
                }

                $.each(elements, function () {
                    $('#wcpr-swipebox-slider').append('<div class="slide"></div>');
                });

                $this.setDim();
                $this.actions();

                if (isTouch) {
                    $this.gesture();
                }

                // Devices can have both touch and keyboard input so always allow key events
                $this.keyboard();

                $this.animBars();
                $this.resize();

            },

            /**
             * Set dimensions depending on windows width and height
             */
            setDim: function () {

                var width, height, sliderCss = {};

                // Reset dimensions on mobile orientation change
                if ('onorientationchange' in window) {

                    window.addEventListener('orientationchange', function () {
                        if (window.orientation === 0) {
                            width = winWidth;
                            height = winHeight;
                        } else if (window.orientation === 90 || window.orientation === -90) {
                            width = winHeight;
                            height = winWidth;
                        }
                    }, false);


                } else {

                    width = window.innerWidth ? window.innerWidth : $(window).width();
                    height = window.innerHeight ? window.innerHeight : $(window).height();
                }

                sliderCss = {
                    width: width,
                    height: height
                };

                $('#wcpr-swipebox-overlay').css(sliderCss);

            },

            /**
             * Reset dimensions on window resize envent
             */
            resize: function () {
                var $this = this;

                $(window).resize(function () {
                    $this.setDim();
                }).resize();
            },

            /**
             * Check if device supports CSS transitions
             */
            supportTransition: function () {

                var prefixes = 'transition WebkitTransition MozTransition OTransition msTransition KhtmlTransition'.split(' '),
                    i;

                for (i = 0; i < prefixes.length; i++) {
                    if (document.createElement('div').style[prefixes[i]] !== undefined) {
                        return prefixes[i];
                    }
                }
                return false;
            },

            /**
             * Check if CSS transitions are allowed (options + devicesupport)
             */
            doCssTrans: function () {
                if (plugin.settings.useCSS && this.supportTransition()) {
                    return true;
                }
            },

            /**
             * Touch navigation
             */
            gesture: function () {

                var $this = this,
                    index,
                    hDistance,
                    vDistance,
                    hDistanceLast,
                    vDistanceLast,
                    hDistancePercent,
                    vSwipe = false,
                    hSwipe = false,
                    hSwipMinDistance = 10,
                    vSwipMinDistance = 50,
                    startCoords = {},
                    endCoords = {},
                    bars = $('#wcpr-swipebox-top-bar, #wcpr-swipebox-bottom-bar'),
                    slider = $('#wcpr-swipebox-slider');

                bars.addClass('visible-bars');
                $this.setTimeout();

                $('body').bind('touchstart', function (event) {

                    $(this).addClass('wcpr-touching');
                    index = $('#wcpr-swipebox-slider .slide').index($('#wcpr-swipebox-slider .slide.current'));
                    endCoords = event.originalEvent.targetTouches[0];
                    startCoords.pageX = event.originalEvent.targetTouches[0].pageX;
                    startCoords.pageY = event.originalEvent.targetTouches[0].pageY;

                    $('#wcpr-swipebox-slider').css({
                        '-webkit-transform': 'translate3d(' + currentX + '%, 0, 0)',
                        'transform': 'translate3d(' + currentX + '%, 0, 0)'
                    });

                    $('.wcpr-touching').bind('touchmove', function (event) {
                        event.preventDefault();
                        event.stopPropagation();
                        endCoords = event.originalEvent.targetTouches[0];

                        if (!hSwipe) {
                            vDistanceLast = vDistance;
                            vDistance = endCoords.pageY - startCoords.pageY;
                            if (Math.abs(vDistance) >= vSwipMinDistance || vSwipe) {
                                var opacity = 0.75 - Math.abs(vDistance) / slider.height();

                                slider.css({'top': vDistance + 'px'});
                                slider.css({'opacity': opacity});

                                vSwipe = true;
                            }
                        }

                        hDistanceLast = hDistance;
                        hDistance = endCoords.pageX - startCoords.pageX;
                        hDistancePercent = hDistance * 100 / winWidth;

                        if (!hSwipe && !vSwipe && Math.abs(hDistance) >= hSwipMinDistance) {
                            $('#wcpr-swipebox-slider').css({
                                '-webkit-transition': '',
                                'transition': ''
                            });
                            hSwipe = true;
                        }

                        if (hSwipe) {

                            // swipe left
                            if (0 < hDistance) {

                                // first slide
                                if (0 === index) {
                                    // console.log( 'first' );
                                    $('#wcpr-swipebox-overlay').addClass('leftSpringTouch');
                                } else {
                                    // Follow gesture
                                    $('#wcpr-swipebox-overlay').removeClass('leftSpringTouch').removeClass('rightSpringTouch');
                                    $('#wcpr-swipebox-slider').css({
                                        '-webkit-transform': 'translate3d(' + (currentX + hDistancePercent) + '%, 0, 0)',
                                        'transform': 'translate3d(' + (currentX + hDistancePercent) + '%, 0, 0)'
                                    });
                                }

                                // swipe rught
                            } else if (0 > hDistance) {

                                // last Slide
                                if (elements.length === index + 1) {
                                    // console.log( 'last' );
                                    $('#wcpr-swipebox-overlay').addClass('rightSpringTouch');
                                } else {
                                    $('#wcpr-swipebox-overlay').removeClass('leftSpringTouch').removeClass('rightSpringTouch');
                                    $('#wcpr-swipebox-slider').css({
                                        '-webkit-transform': 'translate3d(' + (currentX + hDistancePercent) + '%, 0, 0)',
                                        'transform': 'translate3d(' + (currentX + hDistancePercent) + '%, 0, 0)'
                                    });
                                }

                            }
                        }
                    });

                    return false;

                }).bind('touchend', function (event) {
                    event.preventDefault();
                    event.stopPropagation();

                    $('#wcpr-swipebox-slider').css({
                        '-webkit-transition': '-webkit-transform 0.4s ease',
                        'transition': 'transform 0.4s ease'
                    });

                    vDistance = endCoords.pageY - startCoords.pageY;
                    hDistance = endCoords.pageX - startCoords.pageX;
                    hDistancePercent = hDistance * 100 / winWidth;

                    // Swipe to bottom to close
                    if (vSwipe) {
                        vSwipe = false;
                        if (Math.abs(vDistance) >= 2 * vSwipMinDistance && Math.abs(vDistance) > Math.abs(vDistanceLast)) {
                            var vOffset = vDistance > 0 ? slider.height() : -slider.height();
                            slider.animate({top: vOffset + 'px', 'opacity': 0},
                                300,
                                function () {
                                    $this.closeSlide();
                                });
                        } else {
                            slider.animate({top: 0, 'opacity': 1}, 300);
                        }

                    } else if (hSwipe) {

                        hSwipe = false;

                        // swipeLeft
                        if (hDistance >= hSwipMinDistance && hDistance >= hDistanceLast) {

                            $this.getPrev();

                            // swipeRight
                        } else if (hDistance <= -hSwipMinDistance && hDistance <= hDistanceLast) {

                            $this.getNext();
                        }

                    } else { // Top and bottom bars have been removed on touchable devices
                        // tap
                        if (!bars.hasClass('visible-bars')) {
                            $this.showBars();
                            $this.setTimeout();
                        } else {
                            $this.clearTimeout();
                            $this.hideBars();
                        }
                    }

                    $('#wcpr-swipebox-slider').css({
                        '-webkit-transform': 'translate3d(' + currentX + '%, 0, 0)',
                        'transform': 'translate3d(' + currentX + '%, 0, 0)'
                    });

                    $('#wcpr-swipebox-overlay').removeClass('leftSpringTouch').removeClass('rightSpringTouch');
                    $('.wcpr-touching').off('touchmove').removeClass('wcpr-touching');

                });
            },

            /**
             * Set timer to hide the action bars
             */
            setTimeout: function () {
                if (plugin.settings.hideBarsDelay > 0) {
                    var $this = this;
                    $this.clearTimeout();
                    $this.timeout = window.setTimeout(function () {
                            $this.hideBars();
                        },

                        plugin.settings.hideBarsDelay
                    );
                }
            },

            /**
             * Clear timer
             */
            clearTimeout: function () {
                window.clearTimeout(this.timeout);
                this.timeout = null;
            },

            /**
             * Show navigation and title bars
             */
            showBars: function () {
                var bars = $('#wcpr-swipebox-top-bar, #wcpr-swipebox-bottom-bar');
                if (this.doCssTrans()) {
                    bars.addClass('visible-bars');
                } else {
                    $('#wcpr-swipebox-top-bar').animate({top: 0}, 500);
                    $('#wcpr-swipebox-bottom-bar').animate({bottom: 0}, 500);
                    setTimeout(function () {
                        bars.addClass('visible-bars');
                    }, 1000);
                }
            },

            /**
             * Hide navigation and title bars
             */
            hideBars: function () {
                var bars = $('#wcpr-swipebox-top-bar, #wcpr-swipebox-bottom-bar');
                if (this.doCssTrans()) {
                    bars.removeClass('visible-bars');
                } else {
                    $('#wcpr-swipebox-top-bar').animate({top: '-50px'}, 500);
                    $('#wcpr-swipebox-bottom-bar').animate({bottom: '-50px'}, 500);
                    setTimeout(function () {
                        bars.removeClass('visible-bars');
                    }, 1000);
                }
            },

            /**
             * Animate navigation and top bars
             */
            animBars: function () {
                var $this = this,
                    bars = $('#wcpr-swipebox-top-bar, #wcpr-swipebox-bottom-bar');

                bars.addClass('visible-bars');
                $this.setTimeout();

                $('#wcpr-swipebox-slider').click(function () {
                    if (!bars.hasClass('visible-bars')) {
                        $this.showBars();
                        $this.setTimeout();
                    }
                });

                $('#wcpr-swipebox-bottom-bar').hover(function () {
                    $this.showBars();
                    bars.addClass('visible-bars');
                    $this.clearTimeout();

                }, function () {
                    if (plugin.settings.hideBarsDelay > 0) {
                        bars.removeClass('visible-bars');
                        $this.setTimeout();
                    }

                });
            },

            /**
             * Keyboard navigation
             */
            keyboard: function () {
                var $this = this;
                $(window).bind('keyup', function (event) {
                    event.preventDefault();
                    event.stopPropagation();

                    if (event.keyCode === 37) {

                        $this.getPrev();

                    } else if (event.keyCode === 39) {

                        $this.getNext();

                    } else if (event.keyCode === 27) {

                        $this.closeSlide();
                    }
                });
            },

            /**
             * Navigation events : go to next slide, go to prevous slide and close
             */
            actions: function () {
                var $this = this,
                    action = 'touchend click'; // Just detect for both event types to allow for multi-input

                if (elements.length < 2) {

                    $('#wcpr-swipebox-bottom-bar').hide();

                    if (undefined === elements[1]) {
                        $('#wcpr-swipebox-top-bar').hide();
                    }

                } else {
                    $('#wcpr-swipebox-prev').bind(action, function (event) {
                        event.preventDefault();
                        event.stopPropagation();
                        $this.getPrev();
                        $this.setTimeout();
                    });

                    $('#wcpr-swipebox-next').bind(action, function (event) {
                        event.preventDefault();
                        event.stopPropagation();
                        $this.getNext();
                        $this.setTimeout();
                    });
                }

                $('#wcpr-swipebox-close').bind(action, function (event) {
                    event.preventDefault();
                    event.stopPropagation();
                    $this.closeSlide();
                });
            },

            /**
             * Set current slide
             */
            setSlide: function (index, isFirst) {

                isFirst = isFirst || false;

                var slider = $('#wcpr-swipebox-slider');

                currentX = -index * 100;

                if (this.doCssTrans()) {
                    slider.css({
                        '-webkit-transform': 'translate3d(' + (-index * 100) + '%, 0, 0)',
                        'transform': 'translate3d(' + (-index * 100) + '%, 0, 0)'
                    });
                } else {
                    slider.animate({left: (-index * 100) + '%'});
                }

                $('#wcpr-swipebox-slider .slide').removeClass('current');
                $('#wcpr-swipebox-slider .slide').eq(index).addClass('current');
                this.setTitle(index);

                if (isFirst) {
                    slider.fadeIn();
                }

                $('#wcpr-swipebox-prev, #wcpr-swipebox-next').removeClass('disabled');

                if (index === 0) {
                    $('#wcpr-swipebox-prev').addClass('disabled');
                } else if (index === elements.length - 1 && plugin.settings.loopAtEnd !== true) {
                    $('#wcpr-swipebox-next').addClass('disabled');
                }
            },

            /**
             * Open slide
             */
            openSlide: function (index) {
                $('html').addClass('wcpr-swipebox-html');
                if (isTouch) {
                    $('html').addClass('wcpr-swipebox-touch');

                    if (plugin.settings.hideCloseButtonOnMobile) {
                        $('html').addClass('wcpr-swipebox-no-close-button');
                    }
                } else {
                    $('html').addClass('wcpr-swipebox-no-touch');
                }
                $(window).trigger('resize'); // fix scroll bar visibility on desktop
                this.setSlide(index, true);
            },

            /**
             * Set a time out if the media is a video
             */
            preloadMedia: function (index) {
                var $this = this,
                    src = null;

                if (elements[index] !== undefined) {
                    src = elements[index].href;
                }

                if (!$this.isVideo(src)) {
                    setTimeout(function () {
                        $this.openMedia(index);
                    }, 1000);
                } else {
                    $this.openMedia(index);
                }
            },

            /**
             * Open
             */
            openMedia: function (index) {
                var $this = this,
                    src,
                    slide;

                if (elements[index] !== undefined) {
                    src = elements[index].href;
                }

                if (index < 0 || index >= elements.length) {
                    return false;
                }

                slide = $('#wcpr-swipebox-slider .slide').eq(index);

                if (!$this.isVideo(src)) {
                    slide.addClass('slide-loading');
                    $this.loadMedia(src, function () {
                        slide.removeClass('slide-loading');
                        slide.html(this);

                        if (plugin.settings.afterMedia) {
                            plugin.settings.afterMedia(index);
                        }
                    });
                } else {
                    slide.html($this.getVideo(src));

                    if (plugin.settings.afterMedia) {
                        plugin.settings.afterMedia(index);
                    }
                }

            },

            /**
             * Set link title attribute as caption
             */
            setTitle: function (index) {
                var title = null;

                $('#wcpr-swipebox-title').empty();

                if (elements[index] !== undefined) {
                    title = elements[index].title;
                }

                if (title) {
                    $('#wcpr-swipebox-top-bar').show();
                    $('#wcpr-swipebox-title').append(title);
                } else {
                    $('#wcpr-swipebox-top-bar').hide();
                }
            },

            /**
             * Check if the URL is a video
             */
            isVideo: function (src) {

                if (src) {
                    if (src.match(/(youtube\.com|youtube-nocookie\.com)\/watch\?v=([a-zA-Z0-9\-_]+)/) || src.match(/vimeo\.com\/([0-9]*)/) || src.match(/youtu\.be\/([a-zA-Z0-9\-_]+)/)) {
                        return true;
                    }

                    if (src.toLowerCase().indexOf('swipeboxvideo=1') >= 0) {

                        return true;
                    }
                }

            },

            /**
             * Parse URI querystring and:
             * - overrides value provided via dictionary
             * - rebuild it again returning a string
             */
            parseUri: function (uri, customData) {
                var a = document.createElement('a'),
                    qs = {};

                // Decode the URI
                a.href = decodeURIComponent(uri);

                // QueryString to Object
                if (a.search) {
                    qs = JSON.parse('{"' + a.search.toLowerCase().replace('?', '').replace(/&/g, '","').replace(/=/g, '":"') + '"}');
                }

                // Extend with custom data
                if ($.isPlainObject(customData)) {
                    qs = $.extend(qs, customData, plugin.settings.queryStringData); // The dev has always the final word
                }

                // Return querystring as a string
                return $
                    .map(qs, function (val, key) {
                        if (val && val > '') {
                            return encodeURIComponent(key) + '=' + encodeURIComponent(val);
                        }
                    })
                    .join('&');
            },

            /**
             * Get video iframe code from URL
             */
            getVideo: function (url) {
                var iframe = '',
                    youtubeUrl = url.match(/((?:www\.)?youtube\.com|(?:www\.)?youtube-nocookie\.com)\/watch\?v=([a-zA-Z0-9\-_]+)/),
                    youtubeShortUrl = url.match(/(?:www\.)?youtu\.be\/([a-zA-Z0-9\-_]+)/),
                    vimeoUrl = url.match(/(?:www\.)?vimeo\.com\/([0-9]*)/),
                    qs = '';
                if (youtubeUrl || youtubeShortUrl) {
                    if (youtubeShortUrl) {
                        youtubeUrl = youtubeShortUrl;
                    }
                    qs = ui.parseUri(url, {
                        'autoplay': (plugin.settings.autoplayVideos ? '1' : '0'),
                        'v': ''
                    });
                    iframe = '<iframe width="560" height="315" src="//' + youtubeUrl[1] + '/embed/' + youtubeUrl[2] + '?' + qs + '" frameborder="0" allowfullscreen></iframe>';

                } else if (vimeoUrl) {
                    qs = ui.parseUri(url, {
                        'autoplay': (plugin.settings.autoplayVideos ? '1' : '0'),
                        'byline': '0',
                        'portrait': '0',
                        'color': plugin.settings.vimeoColor
                    });
                    iframe = '<iframe width="560" height="315"  src="//player.vimeo.com/video/' + vimeoUrl[1] + '?' + qs + '" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>';

                } else {
                    iframe = '<iframe width="560" height="315" src="' + url + '" frameborder="0" allowfullscreen></iframe>';
                }

                return '<div class="swipebox-video-container" style="max-width:' + plugin.settings.videoMaxWidth + 'px"><div class="swipebox-video">' + iframe + '</div></div>';
            },

            /**
             * Load image
             */
            loadMedia: function (src, callback) {
                // Inline content
                if (src.trim().indexOf('#') === 0) {
                    callback.call(
                        $('<div>', {
                            'class': 'wcpr-swipebox-inline-container'
                        })
                            .append(
                                $(src)
                                    .clone()
                                    .toggleClass(plugin.settings.toggleClassOnLoad)
                            )
                    );
                }
                // Everything else
                else {
                    if (!this.isVideo(src)) {
                        var img = $('<img>').on('load', function () {
                            callback.call(img);
                        });

                        img.attr('src', src);
                    }
                }
            },

            /**
             * Get next slide
             */
            getNext: function () {
                var $this = this,
                    src,
                    index = $('#wcpr-swipebox-slider .slide').index($('#wcpr-swipebox-slider .slide.current'));
                if (index + 1 < elements.length) {

                    src = $('#wcpr-swipebox-slider .slide').eq(index).contents().find('iframe').attr('src');
                    $('#wcpr-swipebox-slider .slide').eq(index).contents().find('iframe').attr('src', src);
                    index++;
                    $this.setSlide(index);
                    $this.preloadMedia(index + 1);
                    if (plugin.settings.nextSlide) {
                        plugin.settings.nextSlide(index);
                    }
                } else {

                    if (plugin.settings.loopAtEnd === true) {
                        src = $('#wcpr-swipebox-slider .slide').eq(index).contents().find('iframe').attr('src');
                        $('#wcpr-swipebox-slider .slide').eq(index).contents().find('iframe').attr('src', src);
                        index = 0;
                        $this.preloadMedia(index);
                        $this.setSlide(index);
                        $this.preloadMedia(index + 1);
                        if (plugin.settings.nextSlide) {
                            plugin.settings.nextSlide(index);
                        }
                    } else {
                        $('#wcpr-swipebox-overlay').addClass('rightSpring');
                        setTimeout(function () {
                            $('#wcpr-swipebox-overlay').removeClass('rightSpring');
                        }, 500);
                    }
                }
            },

            /**
             * Get previous slide
             */
            getPrev: function () {
                var index = $('#wcpr-swipebox-slider .slide').index($('#wcpr-swipebox-slider .slide.current')),
                    src;
                if (index > 0) {
                    src = $('#wcpr-swipebox-slider .slide').eq(index).contents().find('iframe').attr('src');
                    $('#wcpr-swipebox-slider .slide').eq(index).contents().find('iframe').attr('src', src);
                    index--;
                    this.setSlide(index);
                    this.preloadMedia(index - 1);
                    if (plugin.settings.prevSlide) {
                        plugin.settings.prevSlide(index);
                    }
                } else {
                    $('#wcpr-swipebox-overlay').addClass('leftSpring');
                    setTimeout(function () {
                        $('#wcpr-swipebox-overlay').removeClass('leftSpring');
                    }, 500);
                }
            },
            /* jshint unused:false */
            nextSlide: function (index) {
                // Callback for next slide
            },

            prevSlide: function (index) {
                // Callback for prev slide
            },

            /**
             * Close
             */
            closeSlide: function () {
                jQuery('.mfp-close').click();
                jQuery('.eicon-close').click();
                jQuery('#elementor-lightbox').hide();
                $('html').removeClass('wcpr-swipebox-html');
                $('html').removeClass('wcpr-swipebox-touch');
                $(window).trigger('resize');
                this.destroy();
            },

            /**
             * Destroy the whole thing
             */
            destroy: function () {
                $(window).unbind('keyup');
                $('body').unbind('touchstart');
                $('body').unbind('touchmove');
                $('body').unbind('touchend');
                $('#wcpr-swipebox-slider').unbind();
                $('#wcpr-swipebox-overlay').remove();

                if (!$.isArray(elem)) {
                    elem.removeData('_swipebox');
                }

                if (this.target) {
                    this.target.trigger('wcpr-swipebox-destroy');
                }

                $.swipebox.isOpen = false;

                if (plugin.settings.afterClose) {
                    plugin.settings.afterClose();
                }
            }
        };

        plugin.init();
    };

    $.fn.swipebox = function (options) {

        if (!$.data(this, '_swipebox')) {
            var swipebox = new $.swipebox(this, options);
            this.data('_swipebox', swipebox);
        }
        return this.data('_swipebox');

    };

}(window, document, jQuery));
// source --> https://markstiedye.com/wp-content/plugins/woo-photo-reviews/js/masonry.min.js?ver=1.2.26 
jQuery(document).ready(function(e){var i,t=-1;let n=0;function r(r){n=0,t=r,r>=i.length&&(t=0),r<0&&(t=i.length-1),e("#reviews-content-left-modal").html(""),e("#reviews-content-left-main").html("");let a=e("#reviews-content-left-modal"),s=e("#reviews-content-left-main"),o=e(".wcpr-grid").find(".wcpr-grid-item").eq(t);if(0==o.find(".reviews-images-container").length)e("#reviews-content-left").addClass("wcpr-no-images");else{o.find(".reviews-images-wrap-left .reviews-images").length>1&&a.html(o.find(".reviews-images-wrap-left").html());let i,t=o.find(".reviews-images-wrap-right").eq(0).html();void 0===t&&(t=o.find(".reviews-images-wrap:first-child > a").html(),i=o.find(".reviews-images-wrap:first-child > a").attr("href")),t&&(e("#reviews-content-left").removeClass("wcpr-no-images"),s.html(t),s.find("img").attr("src",i||s.find("img").data("original_src")||s.find("img").attr("src")).css({width:"auto",height:"auto"}),s.find(".reviews-videos").css({"min-height":"400px"}),s.find(".reviews-videos.reviews-videos-youtube").css({width:"500px"})),a.find(".reviews-images").map(function(){let i=e(this).data("src");i&&e(this).attr("src",i)}),a.find(".reviews-images").closest("a").on("click",function(){n=e(this).data().image_index;let i=e(this).attr("href");jQuery(`<img class="reviews-images" data-original_src="${i}" src="${i}">`);return s.find("source").attr("srcset",i),s.find(".wcpr-review-image-caption").html(e(this).data("image_caption")),!1})}e("#reviews-content-right .reviews-content-right-meta").html(e(".wcpr-grid").find(".wcpr-grid-item").eq(t).find(".review-content-container").html()),e(".wcpr-modal-light-box").fadeIn(200)}function a(){let i=parseInt(e("html").css("top"));e("html").removeClass("wcpr-noscroll"),window.scrollTo({top:-i,behavior:"instant"})}e(".wcpr-grid-item")&&(i=e(".wcpr-grid-item")),e(".wcpr-close").on("click",function(){a(),e(".wcpr-modal-light-box").fadeOut(200),t=-1}),e(".wcpr-modal-light-box .wcpr-overlay").on("click",function(){a(),e(".wcpr-modal-light-box").fadeOut(200),t=-1}),e("#reviews-content-left-main").on("click",".reviews-images",function(){let i=e(this),t=[];e("#reviews-content-left-modal").find("a").map(function(){let i=e(this).find(".reviews-images"),n=e(this).data().image_src?e(this).data().image_src:i.attr("src"),r=e(this).data().image_caption?e(this).data().image_caption:parseInt(e(this).data().image_index)+1+"/"+e("#reviews-content-left-modal").find("a").length;t.push({href:n,title:r})}),0==t.length&&t.push({href:i.data().original_src?i.data().original_src:i.attr("src"),title:i.parent().find(".wcpr-review-image-caption").html()}),e.swipebox(t,{hideBarsDelay:1e5,initialIndexOnArray:n})}),e(document).keydown(function(i){e.swipebox.isOpen||"none"!=e(".wcpr-modal-light-box").css("display")&&(27==i.keyCode&&(a(),e(".wcpr-modal-light-box").fadeOut(200),t=-1),-1!=t&&(37==i.keyCode&&r(t-=1),39==i.keyCode&&r(t+=1)))}),e("body").on("click",".wcpr-grid-item",function(){let t=(i=e(".wcpr-grid-item")).index(e(this));t>=0&&(r(t),function(){if(e(document).height()>e(window).height()){let i=e("html").scrollTop()?e("html").scrollTop():e("body").scrollTop();e("html").addClass("wcpr-noscroll").css("top",-i)}}())}),e("body").on("click",".wcpr-next",function(){r(t+=1)}),e("body").on("click",".wcpr-prev",function(){r(t-=1)})});
// source --> https://markstiedye.com/wp-content/themes/best-shop/js/bootstrap.js?ver=6.9.4 
/*!
 * Generated using the Bootstrap Customizer (https://getbootstrap.com/docs/3.4/customize/)
 */

/*!
 * Bootstrap v3.4.1 (https://getbootstrap.com/)
 * Copyright 2011-2021 Twitter, Inc.
 * Licensed under the MIT license
 */

if (typeof jQuery === 'undefined') {
  throw new Error('Bootstrap\'s JavaScript requires jQuery')
}
+function ($) {
  'use strict';
  var version = $.fn.jquery.split(' ')[0].split('.')
  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
  }
}(jQuery);

/* ========================================================================
 * Bootstrap: carousel.js v3.4.1
 * https://getbootstrap.com/docs/3.4/javascript/#carousel
 * ========================================================================
 * Copyright 2011-2019 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // CAROUSEL CLASS DEFINITION
  // =========================

  var Carousel = function (element, options) {
    this.$element    = $(element)
    this.$indicators = this.$element.find('.carousel-indicators')
    this.options     = options
    this.paused      = null
    this.sliding     = null
    this.interval    = null
    this.$active     = null
    this.$items      = null

    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))

    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
  }

  Carousel.VERSION  = '3.4.1'

  Carousel.TRANSITION_DURATION = 600

  Carousel.DEFAULTS = {
    interval: 5000,
    pause: 'hover',
    wrap: true,
    keyboard: true
  }

  Carousel.prototype.keydown = function (e) {
    if (/input|textarea/i.test(e.target.tagName)) return
    switch (e.which) {
      case 37: this.prev(); break
      case 39: this.next(); break
      default: return
    }

    e.preventDefault()
  }

  Carousel.prototype.cycle = function (e) {
    e || (this.paused = false)

    this.interval && clearInterval(this.interval)

    this.options.interval
      && !this.paused
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))

    return this
  }

  Carousel.prototype.getItemIndex = function (item) {
    this.$items = item.parent().children('.item')
    return this.$items.index(item || this.$active)
  }

  Carousel.prototype.getItemForDirection = function (direction, active) {
    var activeIndex = this.getItemIndex(active)
    var willWrap = (direction == 'prev' && activeIndex === 0)
                || (direction == 'next' && activeIndex == (this.$items.length - 1))
    if (willWrap && !this.options.wrap) return active
    var delta = direction == 'prev' ? -1 : 1
    var itemIndex = (activeIndex + delta) % this.$items.length
    return this.$items.eq(itemIndex)
  }

  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))

    if (pos > (this.$items.length - 1) || pos < 0) return

    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
    if (activeIndex == pos) return this.pause().cycle()

    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
  }

  Carousel.prototype.pause = function (e) {
    e || (this.paused = true)

    if (this.$element.find('.next, .prev').length && $.support.transition) {
      this.$element.trigger($.support.transition.end)
      this.cycle(true)
    }

    this.interval = clearInterval(this.interval)

    return this
  }

  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }

  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }

  Carousel.prototype.slide = function (type, next) {
    var $active   = this.$element.find('.item.active')
    var $next     = next || this.getItemForDirection(type, $active)
    var isCycling = this.interval
    var direction = type == 'next' ? 'left' : 'right'
    var that      = this

    if ($next.hasClass('active')) return (this.sliding = false)

    var relatedTarget = $next[0]
    var slideEvent = $.Event('slide.bs.carousel', {
      relatedTarget: relatedTarget,
      direction: direction
    })
    this.$element.trigger(slideEvent)
    if (slideEvent.isDefaultPrevented()) return

    this.sliding = true

    isCycling && this.pause()

    if (this.$indicators.length) {
      this.$indicators.find('.active').removeClass('active')
      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
      $nextIndicator && $nextIndicator.addClass('active')
    }

    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
    if ($.support.transition && this.$element.hasClass('slide')) {
      $next.addClass(type)
      if (typeof $next === 'object' && $next.length) {
        $next[0].offsetWidth // force reflow
      }
      $active.addClass(direction)
      $next.addClass(direction)
      $active
        .one('bsTransitionEnd', function () {
          $next.removeClass([type, direction].join(' ')).addClass('active')
          $active.removeClass(['active', direction].join(' '))
          that.sliding = false
          setTimeout(function () {
            that.$element.trigger(slidEvent)
          }, 0)
        })
        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
    } else {
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
      this.$element.trigger(slidEvent)
    }

    isCycling && this.cycle()

    return this
  }


  // CAROUSEL PLUGIN DEFINITION
  // ==========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.carousel')
      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
      var action  = typeof option == 'string' ? option : options.slide

      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
      if (typeof option == 'number') data.to(option)
      else if (action) data[action]()
      else if (options.interval) data.pause().cycle()
    })
  }

  var old = $.fn.carousel

  $.fn.carousel             = Plugin
  $.fn.carousel.Constructor = Carousel


  // CAROUSEL NO CONFLICT
  // ====================

  $.fn.carousel.noConflict = function () {
    $.fn.carousel = old
    return this
  }


  // CAROUSEL DATA-API
  // =================

  var clickHandler = function (e) {
    var $this   = $(this)
    var href    = $this.attr('href')
    if (href) {
      href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
    }

    var target  = $this.attr('data-target') || href
    var $target = $(document).find(target)

    if (!$target.hasClass('carousel')) return

    var options = $.extend({}, $target.data(), $this.data())
    var slideIndex = $this.attr('data-slide-to')
    if (slideIndex) options.interval = false

    Plugin.call($target, options)

    if (slideIndex) {
      $target.data('bs.carousel').to(slideIndex)
    }

    e.preventDefault()
  }

  $(document)
    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)

  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
      Plugin.call($carousel, $carousel.data())
    })
  })

}(jQuery);


+function ($) {
  'use strict';

  // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/)
  // ============================================================

  function transitionEnd() {
    var el = document.createElement('bootstrap')

    var transEndEventNames = {
      WebkitTransition : 'webkitTransitionEnd',
      MozTransition    : 'transitionend',
      OTransition      : 'oTransitionEnd otransitionend',
      transition       : 'transitionend'
    }

    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
        return { end: transEndEventNames[name] }
      }
    }

    return false // explicit for ie8 (  ._.)
  }

  // https://blog.alexmaccaw.com/css-transitions
  $.fn.emulateTransitionEnd = function (duration) {
    var called = false
    var $el = this
    $(this).one('bsTransitionEnd', function () { called = true })
    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
    setTimeout(callback, duration)
    return this
  }

  $(function () {
    $.support.transition = transitionEnd()

    if (!$.support.transition) return

    $.event.special.bsTransitionEnd = {
      bindType: $.support.transition.end,
      delegateType: $.support.transition.end,
      handle: function (e) {
        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
      }
    }
  })

}(jQuery);
// source --> https://markstiedye.com/wp-content/themes/best-shop/js/jquery.marquee.js?ver=6.9.4 
/**
 * jQuery.marquee - scrolling text like old marquee element
 * @author Aamir Afridi - aamirafridi(at)gmail(dot)com / http://aamirafridi.com/jquery/jquery-marquee-plugin
 */;
(function($) {
    
    $.fn.marquee = function(options) {
        return this.each(function() {
            // Extend the options if any provided
            var o = $.extend({}, $.fn.marquee.defaults, options),
                $this = $(this),
                $marqueeWrapper, containerWidth, animationCss, verticalDir, elWidth,
                loopCount = 3,
                playState = 'animation-play-state',
                css3AnimationIsSupported = false,

                // Private methods
                _prefixedEvent = function(element, type, callback) {
                    var pfx = ["webkit", "moz", "MS", "o", ""];
                    for (var p = 0; p < pfx.length; p++) {
                        if (!pfx[p]) type = type.toLowerCase();
                        element.addEventListener(pfx[p] + type, callback, false);
                    }
                },

                _objToString = function(obj) {
                    var tabjson = [];
                    for (var p in obj) {
                        if (obj.hasOwnProperty(p)) {
                            tabjson.push(p + ':' + obj[p]);
                        }
                    }
                    tabjson.push();
                    return '{' + tabjson.join(',') + '}';
                },

                _startAnimationWithDelay = function() {
                    $this.timer = setTimeout(animate, o.delayBeforeStart);
                },

                // Public methods
                methods = {
                    pause: function() {
                        if (css3AnimationIsSupported && o.allowCss3Support) {
                            $marqueeWrapper.css(playState, 'paused');
                        } else {
                            // pause using pause plugin
                            if ($.fn.pause) {
                                $marqueeWrapper.pause();
                            }
                        }
                        // save the status
                        $this.data('runningStatus', 'paused');
                        // fire event
                        $this.trigger('paused');
                    },

                    resume: function() {
                        // resume using css3
                        if (css3AnimationIsSupported && o.allowCss3Support) {
                            $marqueeWrapper.css(playState, 'running');
                        } else {
                            // resume using pause plugin
                            if ($.fn.resume) {
                                $marqueeWrapper.resume();
                            }
                        }
                        // save the status
                        $this.data('runningStatus', 'resumed');
                        // fire event
                        $this.trigger('resumed');
                    },

                    toggle: function() {
                        methods[$this.data('runningStatus') == 'resumed' ? 'pause' : 'resume']();
                    },

                    destroy: function() {
                        // Clear timer
                        clearTimeout($this.timer);
                        // Unbind all events
                        $this.find("*").addBack().unbind();
                        // Just unwrap the elements that has been added using this plugin
                        $this.html($this.find('.js-marquee:first').html());
                    }
                };

            // Check for methods
            if (typeof options === 'string') {
                if ($.isFunction(methods[options])) {
                    // Following two IF statements to support public methods
                    if (!$marqueeWrapper) {
                        $marqueeWrapper = $this.find('.js-marquee-wrapper');
                    }
                    if ($this.data('css3AnimationIsSupported') === true) {
                        css3AnimationIsSupported = true;
                    }
                    methods[options]();
                }
                return;
            }

            /* Check if element has data attributes. They have top priority
               For details https://twitter.com/aamirafridi/status/403848044069679104 - Can't find a better solution :/
               jQuery 1.3.2 doesn't support $.data().KEY hence writting the following */
            var dataAttributes = {},
            attr;
            $.each(o, function(key, value) {
                // Check if element has this data attribute
                attr = $this.attr('data-' + key);
                if (typeof attr !== 'undefined') {
                    // Now check if value is boolean or not
                    switch (attr) {
                        case 'true':
                            attr = true;
                            break;
                        case 'false':
                            attr = false;
                            break;
                    }
                    o[key] = attr;
                }
            });

            // since speed option is changed to duration, to support speed for those who are already using it
            o.duration = o.speed || o.duration;

            // Shortcut to see if direction is upward or downward
            verticalDir = o.direction == 'up' || o.direction == 'down';

            // no gap if not duplicated
            o.gap = o.duplicated ? parseInt(o.gap) : 0;

            // wrap inner content into a div
            $this.wrapInner('<div class="js-marquee"></div>');

            // Make copy of the element
            var $el = $this.find('.js-marquee').css({
                'margin-right': o.gap,
                'float': 'left'
            });

            if (o.duplicated) {
                $el.clone(true).appendTo($this);
            }

            // wrap both inner elements into one div
            $this.wrapInner('<div style="width:100000px" class="js-marquee-wrapper"></div>');

            // Save the reference of the wrapper
            $marqueeWrapper = $this.find('.js-marquee-wrapper');

            // If direction is up or down, get the height of main element
            if (verticalDir) {
                var containerHeight = $this.height();
                $marqueeWrapper.removeAttr('style');
                $this.height(containerHeight);

                // Change the CSS for js-marquee element
                $this.find('.js-marquee').css({
                    'float': 'none',
                    'margin-bottom': o.gap,
                    'margin-right': 0
                });

                // Remove bottom margin from 2nd element if duplicated
                if (o.duplicated) $this.find('.js-marquee:last').css({
                    'margin-bottom': 0
                });

                var elHeight = $this.find('.js-marquee:first').height() + o.gap;

                // adjust the animation speed according to the text length
                if (o.startVisible && !o.duplicated) {
                    // Compute the complete animation duration and save it for later reference
                    // formula is to: (Height of the text node + height of the main container / Height of the main container) * speed;
                    o._completeDuration = ((parseInt(elHeight, 10) + parseInt(containerHeight, 10)) / parseInt(containerHeight, 10)) * o.duration;

                    // formula is to: (Height of the text node / height of the main container) * speed
                    o.duration = (parseInt(elHeight, 10) / parseInt(containerHeight, 10)) * o.duration;
                } else {
                    // formula is to: (Height of the text node + height of the main container / Height of the main container) * speed;
                    o.duration = ((parseInt(elHeight, 10) + parseInt(containerHeight, 10)) / parseInt(containerHeight, 10)) * o.duration;
                }

            } else {
                // Save the width of the each element so we can use it in animation
                elWidth = $this.find('.js-marquee:first').width() + o.gap;

                // container width
                containerWidth = $this.width();

                // adjust the animation speed according to the text length
                if (o.startVisible && !o.duplicated) {
                    // Compute the complete animation duration and save it for later reference
                    // formula is to: (Width of the text node + width of the main container / Width of the main container) * speed;
                    o._completeDuration = ((parseInt(elWidth, 10) + parseInt(containerWidth, 10)) / parseInt(containerWidth, 10)) * o.duration;

                    // (Width of the text node / width of the main container) * speed
                    o.duration = (parseInt(elWidth, 10) / parseInt(containerWidth, 10)) * o.duration;
                } else {
                    // formula is to: (Width of the text node + width of the main container / Width of the main container) * speed;
                    o.duration = ((parseInt(elWidth, 10) + parseInt(containerWidth, 10)) / parseInt(containerWidth, 10)) * o.duration;
                }
            }

            // if duplicated then reduce the speed
            if (o.duplicated) {
                o.duration = o.duration / 2;
            }

            if (o.allowCss3Support) {
                var
                elm = document.body || document.createElement('div'),
                    animationName = 'marqueeAnimation-' + Math.floor(Math.random() * 10000000),
                    domPrefixes = 'Webkit Moz O ms Khtml'.split(' '),
                    animationString = 'animation',
                    animationCss3Str = '',
                    keyframeString = '';

                // Check css3 support
                if (elm.style.animation) {
                    keyframeString = '@keyframes ' + animationName + ' ';
                    css3AnimationIsSupported = true;
                }

                if (css3AnimationIsSupported === false) {
                    for (var i = 0; i < domPrefixes.length; i++) {
                        if (elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) {
                            var prefix = '-' + domPrefixes[i].toLowerCase() + '-';
                            animationString = prefix + animationString;
                            playState = prefix + playState;
                            keyframeString = '@' + prefix + 'keyframes ' + animationName + ' ';
                            css3AnimationIsSupported = true;
                            break;
                        }
                    }
                }

                if (css3AnimationIsSupported) {
                    animationCss3Str = animationName + ' ' + o.duration / 1000 + 's ' + o.delayBeforeStart / 1000 + 's infinite ' + o.css3easing;
                    $this.data('css3AnimationIsSupported', true);
                }
            }

            var _rePositionVertically = function() {
                $marqueeWrapper.css('margin-top', o.direction == 'up' ? containerHeight + 'px' : '-' + elHeight + 'px');
            },
            _rePositionHorizontally = function() {
                $marqueeWrapper.css('margin-left', o.direction == 'left' ? containerWidth + 'px' : '-' + elWidth + 'px');
            };

            // if duplicated option is set to true than position the wrapper
            if (o.duplicated) {
                if (verticalDir) {
                    if (o.startVisible) {
                        $marqueeWrapper.css('margin-top', 0);
                    } else {
                        $marqueeWrapper.css('margin-top', o.direction == 'up' ? containerHeight + 'px' : '-' + ((elHeight * 2) - o.gap) + 'px');
                    }
                } else {
                    if (o.startVisible) {
                        $marqueeWrapper.css('margin-left', 0);
                    } else {
                        $marqueeWrapper.css('margin-left', o.direction == 'left' ? containerWidth + 'px' : '-' + ((elWidth * 2) - o.gap) + 'px');
                    }
                }

                // If the text starts out visible we can skip the two initial loops
                if (!o.startVisible) {
                  loopCount = 1;
                }
            } else if (o.startVisible) {
                // We only have two different loops if marquee is duplicated and starts visible 
                loopCount = 2;
            } else {
                if (verticalDir) {
                    _rePositionVertically();
                } else {
                    _rePositionHorizontally();
                }
            }

            // Animate recursive method
            var animate = function() {
                if (o.duplicated) {
                    // When duplicated, the first loop will be scroll longer so double the duration
                    if (loopCount === 1) {
                        o._originalDuration = o.duration;
                        if (verticalDir) {
                            o.duration = o.direction == 'up' ? o.duration + (containerHeight / ((elHeight) / o.duration)) : o.duration * 2;
                        } else {
                            o.duration = o.direction == 'left' ? o.duration + (containerWidth / ((elWidth) / o.duration)) : o.duration * 2;
                        }
                        // Adjust the css3 animation as well
                        if (animationCss3Str) {
                            animationCss3Str = animationName + ' ' + o.duration / 1000 + 's ' + o.delayBeforeStart / 1000 + 's ' + o.css3easing;
                        }
                        loopCount++;
                    }
                    // On 2nd loop things back to normal, normal duration for the rest of animations
                    else if (loopCount === 2) {
                        o.duration = o._originalDuration;
                        // Adjust the css3 animation as well
                        if (animationCss3Str) {
                            animationName = animationName + '0';
                            keyframeString = $.trim(keyframeString) + '0 ';
                            animationCss3Str = animationName + ' ' + o.duration / 1000 + 's 0s infinite ' + o.css3easing;
                        }
                        loopCount++;
                    }
                }

                if (verticalDir) {
                    if (o.duplicated) {

                        // Adjust the starting point of animation only when first loops finishes
                        if (loopCount > 2) {
                            $marqueeWrapper.css('margin-top', o.direction == 'up' ? 0 : '-' + elHeight + 'px');
                        }

                        animationCss = {
                            'margin-top': o.direction == 'up' ? '-' + elHeight + 'px' : 0
                        };
                    } else if (o.startVisible) {
                        // This loop moves the marquee out of the container
                        if (loopCount === 2) {
                            // Adjust the css3 animation as well
                            if (animationCss3Str) {
                                animationCss3Str = animationName + ' ' + o.duration / 1000 + 's ' + o.delayBeforeStart / 1000 + 's ' + o.css3easing;
                            }
                            animationCss = {
                                'margin-top': o.direction == 'up' ? '-' + elHeight + 'px' : containerHeight + 'px'
                            };
                            loopCount++;
                        } else if (loopCount === 3) {
                            // Set the duration for the animation that will run forever
                            o.duration = o._completeDuration;
                            // Adjust the css3 animation as well

                            if (animationCss3Str) {
                                    animationName = animationName + '0';
                                    keyframeString = $.trim(keyframeString) + '0 ';
                                    animationCss3Str = animationName + ' ' + o.duration / 1000 + 's 0s infinite ' + o.css3easing;
                            }
                            _rePositionVertically();
                        }
                    } else {
                        _rePositionVertically();
                        animationCss = {
                            'margin-top': o.direction == 'up' ? '-' + ($marqueeWrapper.height()) + 'px' : containerHeight + 'px'
                        };
                    }
                } else {
                    if (o.duplicated) {

                        // Adjust the starting point of animation only when first loops finishes
                        if (loopCount > 2) {
                            $marqueeWrapper.css('margin-left', o.direction == 'left' ? 0 : '-' + elWidth + 'px');
                        }

                        animationCss = {
                            'margin-left': o.direction == 'left' ? '-' + elWidth + 'px' : 0
                        };

                    } else if (o.startVisible) {
                        // This loop moves the marquee out of the container
                        if (loopCount === 2) {
                            // Adjust the css3 animation as well
                            if (animationCss3Str) {
                                animationCss3Str = animationName + ' ' + o.duration / 1000 + 's ' + o.delayBeforeStart / 1000 + 's ' + o.css3easing;
                            }
                            animationCss = {
                                'margin-left': o.direction == 'left' ? '-' + elWidth + 'px' : containerWidth + 'px'
                            };
                            loopCount++;
                        } else if (loopCount === 3) {
                            // Set the duration for the animation that will run forever
                            o.duration = o._completeDuration;
                            // Adjust the css3 animation as well
                            if (animationCss3Str) {
                                animationName = animationName + '0';
                                keyframeString = $.trim(keyframeString) + '0 ';
                                animationCss3Str = animationName + ' ' + o.duration / 1000 + 's 0s infinite ' + o.css3easing;
                            }
                            _rePositionHorizontally();
                        }
                    } else {
                        _rePositionHorizontally();
                        animationCss = {
                            'margin-left': o.direction == 'left' ? '-' + elWidth + 'px' : containerWidth + 'px'
                        };
                    }
                }

                // fire event
                $this.trigger('beforeStarting');

                // If css3 support is available than do it with css3, otherwise use jQuery as fallback
                if (css3AnimationIsSupported) {
                    // Add css3 animation to the element
                    $marqueeWrapper.css(animationString, animationCss3Str);
                    var keyframeCss = keyframeString + ' { 100%  ' + _objToString(animationCss) + '}',
                         $styles = $marqueeWrapper.find('style');

                    // Now add the keyframe animation to the marquee element
                    if ($styles.length !== 0) {
                        // Bug fixed for jQuery 1.3.x - Instead of using .last(), use following
                        $styles.filter(":last").html(keyframeCss);
                    } else {
                        $('head').append('<style>' + keyframeCss + '</style>');
                    }

                    // Animation iteration event
                    _prefixedEvent($marqueeWrapper[0], "AnimationIteration", function() {
                        $this.trigger('finished');
                    });
                    // Animation stopped
                    _prefixedEvent($marqueeWrapper[0], "AnimationEnd", function() {
                        animate();
                        $this.trigger('finished');
                    });

                } else {
                    // Start animating
                    $marqueeWrapper.animate(animationCss, o.duration, o.easing, function() {
                        // fire event
                        $this.trigger('finished');
                        // animate again
                        if (o.pauseOnCycle) {
                            _startAnimationWithDelay();
                        } else {
                            animate();
                        }
                    });
                }
                // save the status
                $this.data('runningStatus', 'resumed');
            };

            // bind pause and resume events
            $this.bind('pause', methods.pause);
            $this.bind('resume', methods.resume);

            if (o.pauseOnHover) {
                $this.bind('mouseenter mouseleave', methods.toggle);
            }

            // If css3 animation is supported than call animate method at once
            if (css3AnimationIsSupported && o.allowCss3Support) {
                animate();
            } else {
                // Starts the recursive method
                _startAnimationWithDelay();
            }

        });
    }; // End of Plugin
    // Public: plugin defaults options
    $.fn.marquee.defaults = {
        // If you wish to always animate using jQuery
        allowCss3Support: true,
        // works when allowCss3Support is set to true - for full list see http://www.w3.org/TR/2013/WD-css3-transitions-20131119/#transition-timing-function
        css3easing: 'linear',
        // requires jQuery easing plugin. Default is 'linear'
        easing: 'linear',
        // pause time before the next animation turn in milliseconds
        delayBeforeStart: 1000,
        // 'left', 'right', 'up' or 'down'
        direction: 'left',
        // true or false - should the marquee be duplicated to show an effect of continues flow
        duplicated: false,
        // speed in milliseconds of the marquee in milliseconds
        duration: 5000,
        // gap in pixels between the tickers
        gap: 20,
        // on cycle pause the marquee
        pauseOnCycle: false,
        // on hover pause the marquee - using jQuery plugin https://github.com/tobia/Pause
        pauseOnHover: false,
        // the marquee is visible initially positioned next to the border towards it will be moving
        startVisible: false
    };
    
 
    
})(jQuery);