/** * jQuery iView Slider v2.0 * * @version: 2.0.1 - August 17, 2012 * * @author: Hemn Chawroka * hemn@iprodev.com * http://iprodev.com/ * */ (function ($, window, undefined) { var iView = function (el, options) { //Get slider holder var iv = this; iv.options = options; iv.sliderContent = el, iv.sliderInner = iv.sliderContent.html(); iv.sliderContent.html("
" + iv.sliderInner + "
"); //Get slider iv.slider = $('.iviewSlider', iv.sliderContent); iv.slider.css('position', 'relative'); //Necessary variables. iv.defs = { slide: 0, total: 0, image: '', images: [], width: iv.sliderContent.width(), height: iv.sliderContent.height(), timer: options.timer.toLowerCase(), lock: false, paused: (options.autoAdvance) ? false : true, time: options.pauseTime, easing: options.easing }; //Disable slider text selection iv.disableSelection(iv.slider[0]); //Find slides iv.slides = iv.slider.children(); iv.slides.each(function (i) { var slide = $(this); //Find images & thumbnails iv.defs.images.push(slide.data("iview:image")); if (slide.data("iview:thumbnail")) iv.defs.images.push(slide.data("iview:thumbnail")); slide.css('display', 'none'); //Find videos if (slide.data("iview:type") == "video") { var element = slide.children().eq(0), video = $('
˟
'); slide.append(video); element.appendTo($('div.iview-video-container', video)); video.css({ width: iv.defs.width, height: iv.defs.height, top: '-' + iv.defs.height + 'px' }).hide(); slide.addClass('iview-video').css({ 'cursor': 'pointer' }); } iv.defs.total++; }).css({ width: iv.defs.width, height: iv.defs.height }); //Set Preloader Element iv.sliderContent.append('
'); var iviewPreloader = $('#iview-preloader', iv.sliderContent); var preloaderBar = $('div', iviewPreloader); iviewPreloader.css({ top: ((iv.defs.height / 2) - (iviewPreloader.height() / 2)) + 'px', left: ((iv.defs.width / 2) - (iviewPreloader.width() / 2)) + 'px' }); //Set Timer Element iv.sliderContent.append('
'); iv.iviewTimer = $('#iview-timer', iv.sliderContent); iv.iviewTimer.hide(); //Find captions $('.iview-caption', iv.slider).each(function (i) { var caption = $(this); caption.html('
' + caption.html() + '
'); }); //If randomStart options.startSlide = (options.randomStart) ? Math.floor(Math.random() * iv.defs.total) : options.startSlide; //Set startSlide options.startSlide = (options.startSlide > 0 && options.startSlide >= iv.defs.total) ? iv.defs.total - 1 : options.startSlide; iv.defs.slide = options.startSlide; //Set first image iv.defs.image = iv.slides.eq(iv.defs.slide); //Set pauseTime iv.defs.time = (iv.defs.image.data('iview:pausetime')) ? iv.defs.image.data('iview:pausetime') : options.pauseTime; //Set easing iv.defs.easing = (iv.defs.image.data('iview:easing')) ? iv.defs.image.data('iview:easing') : options.easing; iv.pieDegree = 0; var padding = options.timerPadding, diameter = options.timerDiameter, stroke = options.timerStroke; if (iv.defs.total > 1 && iv.defs.timer != "bar") { //Start the Raphael stroke = (iv.defs.timer == "360bar") ? options.timerStroke : 0; var width = (diameter + (padding * 2) + (stroke * 2)), height = width, r = Raphael(iv.iviewTimer[0], width, height); iv.R = (diameter / 2); var param = { stroke: options.timerBg, "stroke-width": (stroke + (padding * 2)) }, param2 = { stroke: options.timerColor, "stroke-width": stroke, "stroke-linecap": "round" }, param3 = { fill: options.timerColor, stroke: 'none', "stroke-width": 0 }, bgParam = { fill: options.timerBg, stroke: 'none', "stroke-width": 0 }; // Custom Arc Attribute r.customAttributes.arc = function (value, R) { var total = 360, alpha = 360 / total * value, a = (90 - alpha) * Math.PI / 180, cx = ((diameter / 2) + padding + stroke), cy = ((diameter / 2) + padding + stroke), x = cx + R * Math.cos(a), y = cy - R * Math.sin(a), path; if (total == value) { path = [["M", cx, cy - R], ["A", R, R, 0, 1, 1, 299.99, cy - R]]; } else { path = [["M", cx, cy - R], ["A", R, R, 0, +(alpha > 180), 1, x, y]]; } return { path: path }; }; // Custom Segment Attribute r.customAttributes.segment = function (angle, R) { var a1 = -90; R = R - 1; angle = (a1 + angle); var flag = (angle - a1) > 180, x = ((diameter / 2) + padding), y = ((diameter / 2) + padding); a1 = (a1 % 360) * Math.PI / 180; angle = (angle % 360) * Math.PI / 180; return { path: [["M", x, y], ["l", R * Math.cos(a1), R * Math.sin(a1)], ["A", R, R, 0, +flag, 1, x + R * Math.cos(angle), y + R * Math.sin(angle)], ["z"]] }; }; if (iv.defs.total > 1 && iv.defs.timer == "pie") { r.circle(iv.R + padding, iv.R + padding, iv.R + padding - 1).attr(bgParam); } iv.timerBgPath = r.path().attr(param), iv.timerPath = r.path().attr(param2), iv.pieTimer = r.path().attr(param3); } iv.barTimer = $('div', iv.iviewTimer); if (iv.defs.total > 1 && iv.defs.timer == "360bar") { iv.timerBgPath.attr({ arc: [359.9, iv.R] }); } //Set Timer Styles if (iv.defs.timer == "bar") { iv.iviewTimer.css({ opacity: options.timerOpacity, width: diameter, height: stroke, border: options.timerBarStroke + 'px ' + options.timerBarStrokeColor + ' ' + options.timerBarStrokeStyle, padding: padding, background: options.timerBg }); iv.barTimer.css({ width: 0, height: stroke, background: options.timerColor, 'float': 'left' }); } else { iv.iviewTimer.css({ opacity: options.timerOpacity, width: width, height: height }); } //Set Timer Position iv.setTimerPosition(); // Run Preloader new ImagePreload(iv.defs.images, function (i) { var percent = (i * 10); preloaderBar.stop().animate({ width: percent + '%' }); }, function () { preloaderBar.stop().animate({ width: '100%' }, function () { iviewPreloader.remove(); iv.startSlider(); //Trigger the onAfterLoad callback options.onAfterLoad.call(this); }); }); //Touch navigation iv.sliderContent.bind('swipeleft', function () { if (iv.defs.lock) return false; iv.cleanTimer(); iv.goTo('next'); }).bind('swiperight', function () { if (iv.defs.lock) return false; iv.cleanTimer(); iv.defs.slide -= 2; iv.goTo('prev'); }); //Keyboard Navigation if (options.keyboardNav) { $(document).bind('keyup.iView', function (event) { //Left if (event.keyCode == '37') { if (iv.defs.lock) return false; iv.cleanTimer(); iv.defs.slide -= 2; iv.goTo('prev'); } //Right if (event.keyCode == '39') { if (iv.defs.lock) return false; iv.cleanTimer(); iv.goTo('next'); } }); } //Play/Pause action iv.iviewTimer.live('click', function () { if (iv.iviewTimer.hasClass('paused')) { iv.playSlider(); } else { iv.stopSlider(); } }); //Bind the stop action iv.sliderContent.bind('iView:pause', function () { iv.stopSlider(); }); //Bind the start action iv.sliderContent.bind('iView:play', function () { iv.playSlider(); }); //Bind the start action iv.sliderContent.bind('iView:previous', function () { if (iv.defs.lock) return false; iv.cleanTimer(); iv.defs.slide -= 2; iv.goTo('prev'); }); //Bind the start action iv.sliderContent.bind('iView:next', function () { if (iv.defs.lock) return false; iv.cleanTimer(); iv.goTo('next'); }); //Bind the goSlide action iv.sliderContent.bind('iView:goSlide', function (event, slide) { if (iv.defs.lock || iv.defs.slide == slide) return false; if ($(this).hasClass('active')) return false; iv.cleanTimer(); iv.slider.css('background', 'url("' + iv.defs.image.data('iview:image') + '") no-repeat'); iv.defs.slide = slide - 1; iv.goTo('control'); }); //Bind the resize action iv.sliderContent.bind('resize', function () { t = $(this), tW = t.width(), tH = t.height(), width = iv.slider.width(), height = iv.slider.height(); if(iv.defs.width != tW){ var ratio = (tW / width), newHeight = Math.round(iv.defs.height * ratio); iv.slider.css({ '-webkit-transform-origin' : '0 0', '-moz-transform-origin' : '0 0', '-o-transform-origin' : '0 0', '-ms-transform-origin' : '0 0', 'transform-origin' : '0 0', '-webkit-transform' : 'scale('+ ratio +')', '-moz-transform' : 'scale('+ ratio +')', '-o-transform' : 'scale('+ ratio +')', '-ms-transform' : 'scale('+ ratio +')', 'transform' : 'scale('+ ratio +')' }); t.css({ height: newHeight }); iv.defs.width = tW; //Set Timer Position iv.setTimerPosition(); } }); //Bind video display $('.iview-video', iv.slider).click(function(e){ var t = $(this), video = $('.iview-video-show', t); if(!$(e.target).hasClass('iview-video-close') && !$(e.target).hasClass('iview-caption') && !$(e.target).parents().hasClass('iview-caption')){ video.show().animate({ top: 0 }, 1000, 'easeOutBounce'); iv.sliderContent.trigger('iView:pause'); } }); //Bind the video closer $('.iview-video-close', iv.slider).click(function(){ var video = $(this).parents('.iview-video-show'), iframe = $('iframe', video), src = iframe.attr('src'); iframe.removeAttr('src').attr('src',src); video.animate({ top: '-' + iv.defs.height + 'px' }, 1000, 'easeOutBounce', function(){ video.hide(); iv.sliderContent.trigger('iView:play'); }); }); }; //iView helper functions iView.prototype = { timer: null, //Start Slider startSlider: function () { var iv = this; var img = new Image(); img.src = iv.slides.eq(0).data('iview:image'); imgWidth = img.width; if(imgWidth != iv.defs.width){ iv.defs.width = imgWidth; iv.sliderContent.trigger('resize'); } iv.iviewTimer.show(); //Show slide iv.slides.eq(iv.defs.slide).css('display', 'block'); //Set first background iv.slider.css('background', 'url("' + iv.defs.image.data('iview:image') + '") no-repeat'); //Set initial caption iv.setCaption(iv.options); iv.iviewTimer.addClass('paused').attr('title', iv.options.playLabel); if (iv.options.autoAdvance && iv.defs.total > 1) { iv.iviewTimer.removeClass('paused').attr('title', iv.options.pauseLabel); iv.setTimer(); } //Add Direction nav if (iv.options.directionNav) { iv.sliderContent.append('
' + iv.options.previousLabel + '' + iv.options.nextLabel + '
'); //Animate Direction nav $('.iview-directionNav', iv.sliderContent).css({ opacity: iv.options.directionNavHoverOpacity }); iv.sliderContent.hover(function () { $('.iview-directionNav', iv.sliderContent).stop().animate({ opacity: 1 }, 300); }, function () { $('.iview-directionNav', iv.sliderContent).stop().animate({ opacity: iv.options.directionNavHoverOpacity }, 300); }); $('a.iview-prevNav', iv.sliderContent).live('click', function () { if (iv.defs.lock) return false; iv.cleanTimer(); iv.defs.slide -= 2; iv.goTo('prev'); }); $('a.iview-nextNav', iv.sliderContent).live('click', function () { if (iv.defs.lock) return false; iv.cleanTimer(); iv.goTo('next'); }); } //Add Control nav if (iv.options.controlNav) { var iviewControl = '
', iviewTooltip = ''; if (!iv.options.directionNav && iv.options.controlNavNextPrev) iviewControl += '' + iv.options.previousLabel + ''; iviewControl += '
'; if (!iv.options.directionNav && iv.options.controlNavNextPrev) iviewControl += '' + iv.options.nextLabel + ''; iviewControl += '
'; if (!iv.options.controlNavThumbs && iv.options.controlNavTooltip) iviewControl += '
' + iviewTooltip + '
'; iv.sliderContent.append(iviewControl); //Set initial active link $('.iview-controlNav a.iview-control:eq(' + iv.defs.slide + ')', iv.sliderContent).addClass('active'); $('a.iview-controlPrevNav', iv.sliderContent).live('click', function () { if (iv.defs.lock) return false; iv.cleanTimer(); iv.defs.slide -= 2; iv.goTo('prev'); }); $('a.iview-controlNextNav', iv.sliderContent).live('click', function () { if (iv.defs.lock) return false; iv.cleanTimer(); iv.goTo('next'); }); $('.iview-controlNav a.iview-control', iv.sliderContent).live('click', function () { if (iv.defs.lock) return false; if ($(this).hasClass('active')) return false; iv.cleanTimer(); iv.slider.css('background', 'url("' + iv.defs.image.data('iview:image') + '") no-repeat'); iv.defs.slide = $(this).attr('rel') - 1; iv.goTo('control'); }); //Animate Control nav $('.iview-controlNav', iv.sliderContent).css({ opacity: iv.options.controlNavHoverOpacity }); iv.sliderContent.hover(function () { $('.iview-controlNav', iv.sliderContent).stop().animate({ opacity: 1 }, 300); iv.sliderContent.addClass('iview-hover'); }, function () { $('.iview-controlNav', iv.sliderContent).stop().animate({ opacity: iv.options.controlNavHoverOpacity }, 300); iv.sliderContent.removeClass('iview-hover'); }); //Show Tooltip var tooltipTimer = null; $('.iview-controlNav a.iview-control', iv.sliderContent).hover(function (e) { var t = $(this), i = t.attr('rel'), tooltip = $('#iview-tooltip', iv.sliderContent), holder = $('div.holder', tooltip), x = t.offset().left - iv.sliderContent.offset().left - (tooltip.outerWidth() / 2) + iv.options.tooltipX, y = t.offset().top - iv.sliderContent.offset().top - tooltip.outerHeight() + iv.options.tooltipY, imD = $('div[rel=' + i + ']') scrollLeft = (i * imD.width()); tooltip.stop().animate({ left: x, top: y, opacity: 1 }, 300); //tooltip.css({ opacity: 1 }); if (tooltip.not(':visible')) tooltip.fadeIn(300); holder.stop().animate({ scrollLeft: scrollLeft }, 300); clearTimeout(tooltipTimer); }, function (e) { var tooltip = $('#iview-tooltip', iv.sliderContent); tooltipTimer = setTimeout(function () { tooltip.animate({ opacity: 0 }, 300, function () { tooltip.hide(); }); }, 200); }); } //Bind hover setting iv.sliderContent.bind('mouseover.iView mousemove.iView', function () { //Clear the timer if (iv.options.pauseOnHover && !iv.defs.paused) iv.cleanTimer(); iv.sliderContent.addClass('iview-hover'); }).bind('mouseout.iView', function () { //Restart the timer if (iv.options.pauseOnHover && !iv.defs.paused && iv.timer == null && iv.pieDegree <= 359 && iv.options.autoAdvance) iv.setTimer(); iv.sliderContent.removeClass('iview-hover'); }); }, // setCaption function setCaption: function () { var iv = this, slide = iv.slides.eq(iv.defs.slide), captions = $('.iview-caption', slide), timeEx = 0; captions.each(function (i) { var caption = $(this), fx = (caption.data('transition')) ? $.trim(caption.data('transition').toLowerCase()) : "fade", speed = (caption.data('speed')) ? caption.data('speed') : iv.options.captionSpeed, easing = (caption.data('easing')) ? caption.data('easing') : iv.options.captionEasing, x = (caption.data('x')!="undefined") ? caption.data('x') : "center", y = (caption.data('y')!="undefined") ? caption.data('y') : "center", w = (caption.data('width')) ? caption.data('width') : caption.width(), h = (caption.data('height')) ? caption.data('height') : caption.height(), oW = caption.outerWidth(), oH = caption.outerHeight(); if(x == "center") x = ((iv.defs.width/2) - (oW/2)); if(y == "center") y = ((iv.defs.height/2) - (oH/2)); var captionContain = $('.caption-contain', caption); caption.css({ opacity: 0 }); captionContain.css({ opacity: 0, position: 'relative', width: w, height: h }); switch (fx) { case "wipedown": caption.css({ top: (y - h), left: x }); captionContain.css({ top: (h + (h * 3)), left: 0 }); break; case "wipeup": caption.css({ top: (y + h), left: x }); captionContain.css({ top: (h - (h * 3)), left: 0 }); break; case "wiperight": caption.css({ top: y, left: (x - w) }); captionContain.css({ top: 0, left: (w + (w * 2)) }); break; case "wipeleft": caption.css({ top: y, left: (x + w) }); captionContain.css({ top: 0, left: (w - (w * 2)) }); break; case "fade": caption.css({ top: y, left: x }); captionContain.css({ top: 0, left: 0 }); break; case "expanddown": caption.css({ top: y, left: x, height: 0 }); captionContain.css({ top: (h + (h * 3)), left: 0 }); break; case "expandup": caption.css({ top: (y + h), left: x, height: 0 }); captionContain.css({ top: (h - (h * 3)), left: 0 }); break; case "expandright": caption.css({ top: y, left: x, width: 0 }); captionContain.css({ top: 0, left: (w + (w * 2)) }); break; case "expandleft": caption.css({ top: y, left: (x + w), width: 0 }); captionContain.css({ top: 0, left: (w - (w * 2)) }); break; } setTimeout(function () { caption.animate({ opacity: iv.options.captionOpacity, top: y, left: x, width: w, height: h }, speed, easing, function () {}); }, timeEx); setTimeout(function () { captionContain.animate({ opacity: iv.options.captionOpacity, top: 0, left: 0 }, speed, easing); }, (timeEx + 100)); timeEx += 250; }); }, //Process the timer processTimer: function () { var iv = this; if (iv.defs.timer == "360bar") { var degree = (iv.pieDegree == 0) ? 0 : iv.pieDegree + .9; iv.timerPath.attr({ arc: [degree, iv.R] }); } else if (iv.defs.timer == "pie") { var degree = (iv.pieDegree == 0) ? 0 : iv.pieDegree + .9; iv.pieTimer.attr({ segment: [degree, iv.R] }); } else { iv.barTimer.css({ width: ((iv.pieDegree / 360) * 100) + '%' }); } iv.pieDegree += 3; }, //When Animation finishes transitionEnd: function (iv) { //Trigger the onAfterChange callback iv.options.onAfterChange.call(this); //Lock the slider iv.defs.lock = false; //Hide slider slides iv.slides.css('display', 'none'); //Diplay the current slide iv.slides.eq(iv.defs.slide).show(); iv.slider.css('background', 'url("' + iv.defs.image.data('iview:image') + '") no-repeat'); // Remove any strips and blocks from last transition $('.iview-strip, .iview-block', iv.slider).remove(); //Set slide pauseTime iv.defs.time = (iv.defs.image.data('iview:pausetime')) ? iv.defs.image.data('iview:pausetime') : iv.options.pauseTime; //Process timer iv.iviewTimer.animate({ opacity: iv.options.timerOpacity }); iv.pieDegree = 0; iv.processTimer(); //Set caption iv.setCaption(iv.options); //Restart the timer if (iv.timer == null && !iv.defs.paused) iv.timer = setInterval(function () { iv.timerCall(iv); }, (iv.defs.time / 120)); }, // Add strips addStrips: function (vertical, opts) { var iv = this; opts = (opts) ? opts : iv.options; for (var i = 0; i < opts.strips; i++) { var stripWidth = Math.round(iv.slider.width() / opts.strips), stripHeight = Math.round(iv.slider.height() / opts.strips), bgPosition = '-' + ((stripWidth + (i * stripWidth)) - stripWidth) + 'px 0%', top = ((vertical) ? (stripHeight * i) + 'px' : '0px'), left = ((vertical) ? '0px' : (stripWidth * i) + 'px'); if (vertical) bgPosition = '0% -' + ((stripHeight + (i * stripHeight)) - stripHeight) + 'px'; if (i == opts.strips - 1) { var width = ((vertical) ? '0px' : (iv.slider.width() - (stripWidth * i)) + 'px'), height = ((vertical) ? (iv.slider.height() - (stripHeight * i)) + 'px' : '0px'); } else { var width = ((vertical) ? '0px' : stripWidth + 'px'), height = ((vertical) ? stripHeight + 'px' : '0px'); } var strip = $('
').css({ width: width, height: height, top: top, left: left, background: 'url("' + iv.defs.image.data('iview:image') + '") no-repeat ' + bgPosition, opacity: 0 }); iv.slider.append(strip); } }, // Add blocks addBlocks: function () { var iv = this, blockWidth = Math.round(iv.slider.width() / iv.options.blockCols), blockHeight = Math.round(iv.slider.height() / iv.options.blockRows); for (var rows = 0; rows < iv.options.blockRows; rows++) { for (var columns = 0; columns < iv.options.blockCols; columns++) { var top = (rows * blockHeight) + 'px', left = (columns * blockWidth) + 'px', width = blockWidth + 'px', height = blockHeight + 'px', bgPosition = '-' + ((blockWidth + (columns * blockWidth)) - blockWidth) + 'px -' + ((blockHeight + (rows * blockHeight)) - blockHeight) + 'px'; if (columns == iv.options.blockCols - 1) width = (iv.slider.width() - (blockWidth * columns)) + 'px'; var block = $('
').css({ width: blockWidth + 'px', height: blockHeight + 'px', top: (rows * blockHeight) + 'px', left: (columns * blockWidth) + 'px', background: 'url("' + iv.defs.image.data('iview:image') + '") no-repeat ' + bgPosition, opacity: 0 }); iv.slider.append(block); } } }, runTransition: function (fx) { var iv = this; switch (fx) { case 'strip-up-right': case 'strip-up-left': iv.addStrips(); var timeDelay = 0; i = 0, strips = $('.iview-strip', iv.slider); if (fx == 'strip-up-left') strips = $('.iview-strip', iv.slider).reverse(); strips.each(function () { var strip = $(this); strip.css({ top: '', bottom: '0px' }); setTimeout(function () { strip.animate({ height: '100%', opacity: '1.0' }, iv.options.animationSpeed, iv.defs.easing, function () { if (i == iv.options.strips - 1) iv.transitionEnd(iv); i++; }); }, (100 + timeDelay)); timeDelay += 50; }); break; case 'strip-down': case 'strip-down-right': case 'strip-down-left': iv.addStrips(); var timeDelay = 0, i = 0, strips = $('.iview-strip', iv.slider); if (fx == 'strip-down-left') strips = $('.iview-strip', iv.slider).reverse(); strips.each(function () { var strip = $(this); strip.css({ bottom: '', top: '0px' }); setTimeout(function () { strip.animate({ height: '100%', opacity: '1.0' }, iv.options.animationSpeed, iv.defs.easing, function () { if (i == iv.options.strips - 1) iv.transitionEnd(iv); i++; }); }, (100 + timeDelay)); timeDelay += 50; }); break; case 'strip-left-right': case 'strip-left-right-up': case 'strip-left-right-down': iv.addStrips(true); var timeDelay = 0, i = 0, v = 0, strips = $('.iview-strip', iv.slider); if (fx == 'strip-left-right-down') strips = $('.iview-strip', iv.slider).reverse(); strips.each(function () { var strip = $(this); if (i == 0) { strip.css({ right: '', left: '0px' }); i++; } else { strip.css({ left: '', right: '0px' }); i = 0; } setTimeout(function () { strip.animate({ width: '100%', opacity: '1.0' }, iv.options.animationSpeed, iv.defs.easing, function () { if (v == iv.options.strips - 1) iv.transitionEnd(iv); v++; }); }, (100 + timeDelay)); timeDelay += 50; }); break; case 'strip-up-down': case 'strip-up-down-right': case 'strip-up-down-left': iv.addStrips(); var timeDelay = 0, i = 0, v = 0, strips = $('.iview-strip', iv.slider); if (fx == 'strip-up-down-left') strips = $('.iview-strip', iv.slider).reverse(); strips.each(function () { var strip = $(this); if (i == 0) { strip.css({ bottom: '', top: '0px' }); i++; } else { strip.css({ top: '', bottom: '0px' }); i = 0; } setTimeout(function () { strip.animate({ height: '100%', opacity: '1.0' }, iv.options.animationSpeed, iv.defs.easing, function () { if (v == iv.options.strips - 1) iv.transitionEnd(iv); v++; }); }, (100 + timeDelay)); timeDelay += 50; }); break; case 'left-curtain': case 'right-curtain': case 'top-curtain': case 'bottom-curtain': if (fx == 'left-curtain' || fx == 'right-curtain') iv.addStrips(); else iv.addStrips(true); var timeDelay = 0, i = 0, strips = $('.iview-strip', iv.slider); if (fx == 'right-curtain' || fx == 'bottom-curtain') strips = $('.iview-strip', iv.slider).reverse(); strips.each(function () { var strip = $(this); var width = strip.width(); var height = strip.height(); if (fx == 'left-curtain' || fx == 'right-curtain') strip.css({ top: '0px', height: '100%', width: '0px' }); else strip.css({ left: '0px', height: '0px', width: '100%' }); setTimeout(function () { if (fx == 'left-curtain' || fx == 'right-curtain') strip.animate({ width: width, opacity: '1.0' }, iv.options.animationSpeed, iv.defs.easing, function () { if (i == iv.options.strips - 1) iv.transitionEnd(iv); i++; }); else strip.animate({ height: height, opacity: '1.0' }, iv.options.animationSpeed, iv.defs.easing, function () { if (i == iv.options.strips - 1) iv.transitionEnd(iv); i++; }); }, (100 + timeDelay)); timeDelay += 50; }); break; case 'strip-up-right': case 'strip-up-left': iv.addStrips(); var timeDelay = 0, i = 0, strips = $('.iview-strip', iv.slider); if (fx == 'strip-up-left') strips = $('.iview-strip', iv.slider).reverse(); strips.each(function () { var strip = $(this); strip.css({ 'bottom': '0px' }); setTimeout(function () { strip.animate({ height: '100%', opacity: '1.0' }, iv.options.animationSpeed, iv.defs.easing, function () { if (i == iv.options.strips - 1) iv.transitionEnd(iv); i++; }); }, (100 + timeDelay)); timeDelay += 50; }); break; case 'strip-left-fade': case 'strip-right-fade': case 'strip-top-fade': case 'strip-bottom-fade': if (fx == 'strip-left-fade' || fx == 'strip-right-fade') iv.addStrips(); else iv.addStrips(true); var timeDelay = 0, i = 0, strips = $('.iview-strip', iv.slider); if (fx == 'strip-right-fade' || fx == 'strip-bottom-fade') strips = $('.iview-strip', iv.slider).reverse(); strips.each(function () { var strip = $(this); var width = strip.width(); var height = strip.height(); if (fx == 'strip-left-fade' || fx == 'strip-right-fade') strip.css({ top: '0px', height: '100%', width: width }); else strip.css({ left: '0px', height: height, width: '100%' }); setTimeout(function () { strip.animate({ opacity: '1.0' }, iv.options.animationSpeed * 1.7, iv.defs.easing, function () { if (i == iv.options.strips - 1) iv.transitionEnd(iv); i++; }); }, (100 + timeDelay)); timeDelay += 35; }); break; case 'slide-in-up': case 'slide-in-down': opts = { strips: 1 }; iv.addStrips(false, opts); var strip = $('.iview-strip:first', iv.slider), top = 0; if (fx == 'slide-in-up') top = '-' + iv.defs.height + 'px'; else top = iv.defs.height + 'px'; strip.css({ top: top, 'height': '100%', 'width': iv.defs.width }); strip.animate({ 'top': '0px', opacity: 1 }, (iv.options.animationSpeed * 2), iv.defs.easing, function () { iv.transitionEnd(iv); }); break; case 'zigzag-top': case 'zigzag-bottom': case 'zigzag-grow-top': case 'zigzag-grow-bottom': case 'zigzag-drop-top': case 'zigzag-drop-bottom': iv.addBlocks(); var totalBlocks = (iv.options.blockCols * iv.options.blockRows), timeDelay = 0, blockToArr = new Array(), blocks = $('.iview-block', iv.slider); for (var rows = 0; rows < iv.options.blockRows; rows++) { var odd = (rows % 2), start = (rows * iv.options.blockCols), end = ((rows + 1) * iv.options.blockCols); if (odd == 1) { for (var columns = end - 1; columns >= start; columns--) { blockToArr.push($(blocks[columns])); } } else { for (var columns = start; columns < end; columns++) { blockToArr.push($(blocks[columns])); } } } if (fx == 'zigzag-bottom' || fx == 'zigzag-grow-bottom' || fx == 'zigzag-drop-bottom') blockToArr.reverse(); // Run animation blocks.each(function (i) { var block = $(blockToArr[i]), h = block.height(), w = block.width(), top = block.css('top'); if (fx == 'zigzag-grow-top' || fx == 'zigzag-grow-bottom') block.width(0).height(0); else if (fx == 'zigzag-drop-top' || fx == 'zigzag-drop-bottom') block.css({ top: '-=50' }); setTimeout(function () { if (fx == 'zigzag-grow-top' || fx == 'zigzag-grow-bottom') block.animate({ opacity: '1', height: h, width: w }, iv.options.animationSpeed, iv.defs.easing, function () { if (i == totalBlocks - 1) iv.transitionEnd(iv); }); else if (fx == 'zigzag-drop-top' || fx == 'zigzag-drop-bottom') block.animate({ top: top, opacity: '1' }, iv.options.animationSpeed, iv.defs.easing, function () { if (i == totalBlocks - 1) iv.transitionEnd(iv); }); else block.animate({ opacity: '1' }, (iv.options.animationSpeed * 2), 'easeInOutExpo', function () { if (i == totalBlocks - 1) iv.transitionEnd(iv); }); }, (100 + timeDelay)); timeDelay += 20; }); break; case 'block-fade': case 'block-fade-reverse': case 'block-expand': case 'block-expand-reverse': iv.addBlocks(); var totalBlocks = (iv.options.blockCols * iv.options.blockRows), i = 0, timeDelay = 0; // Split blocks into array var rowIndex = 0; var colIndex = 0; var blockToArr = new Array(); blockToArr[rowIndex] = new Array(); var blocks = $('.iview-block', iv.slider); if (fx == 'block-fade-reverse' || fx == 'block-expand-reverse') { blocks = $('.iview-block', iv.slider).reverse(); } blocks.each(function () { blockToArr[rowIndex][colIndex] = $(this); colIndex++; if (colIndex == iv.options.blockCols) { rowIndex++; colIndex = 0; blockToArr[rowIndex] = new Array(); } }); // Run animation for (var columns = 0; columns < (iv.options.blockCols * 2); columns++) { var Col = columns; for (var rows = 0; rows < iv.options.blockRows; rows++) { if (Col >= 0 && Col < iv.options.blockCols) { (function () { var block = $(blockToArr[rows][Col]); var w = block.width(); var h = block.height(); if (fx == 'block-expand' || fx == 'block-expand-reverse') { block.width(0).height(0); } setTimeout(function () { block.animate({ opacity: '1', width: w, height: h }, iv.options.animationSpeed / 1.3, iv.defs.easing, function () { if (i == totalBlocks - 1) iv.transitionEnd(iv); i++; }); }, (100 + timeDelay)); })(); } Col--; } timeDelay += 100; } break; case 'block-random': case 'block-expand-random': case 'block-drop-random': iv.addBlocks(); var totalBlocks = (iv.options.blockCols * iv.options.blockRows), timeDelay = 0; var blocks = iv.shuffle($('.iview-block', iv.slider)); blocks.each(function (i) { var block = $(this), h = block.height(), w = block.width(), top = block.css('top'); if (fx == 'block-expand-random') block.width(0).height(0); if (fx == 'block-drop-random') block.css({ top: '-=50' }); setTimeout(function () { block.animate({ top: top, opacity: '1', height: h, width: w }, iv.options.animationSpeed, iv.defs.easing, function () { if (i == totalBlocks - 1) iv.transitionEnd(iv); }); }, (100 + timeDelay)); timeDelay += 20; }); break; case 'slide-in-right': case 'slide-in-left': case 'fade': default: opts = { strips: 1 }; iv.addStrips(false, opts); var strip = $('.iview-strip:first', iv.slider); strip.css({ 'height': '100%', 'width': iv.defs.width }); if (fx == 'slide-in-right') strip.css({ 'height': '100%', 'width': iv.defs.width, 'left': iv.defs.width + 'px', 'right': '' }); else if (fx == 'slide-in-left') strip.css({ 'left': '-' + iv.defs.width + 'px' }); strip.animate({ left: '0px', opacity: 1 }, (iv.options.animationSpeed * 2), iv.defs.easing, function () { iv.transitionEnd(iv); }); break; } }, // Shuffle an array shuffle: function (oldArray) { var newArray = oldArray.slice(); var len = newArray.length; var i = len; while (i--) { var p = parseInt(Math.random() * len); var t = newArray[i]; newArray[i] = newArray[p]; newArray[p] = t; } return newArray; }, // Timer interval caller timerCall: function (iv) { iv.processTimer(); if (iv.pieDegree >= 360) { iv.cleanTimer(); iv.goTo(false); } }, //Set the timer function setTimer: function () { var iv = this; iv.timer = setInterval(function () { iv.timerCall(iv); }, (iv.defs.time / 120)); }, //Clean the timer function cleanTimer: function () { var iv = this; clearInterval(iv.timer); iv.timer = null; }, // goTo function goTo: function (action) { var iv = this; //Trigger the onLastSlide callback if (iv.defs && (iv.defs.slide == iv.defs.total - 1)) { iv.options.onLastSlide.call(this); } iv.cleanTimer(); iv.iviewTimer.animate({ opacity: 0 }); //Trigger the onBeforeChange callback iv.options.onBeforeChange.call(this); //Set current background before change if (!action) { iv.slider.css('background', 'url("' + iv.defs.image.data('iview:image') + '") no-repeat'); } else { if (action == 'prev' || action == 'next') { iv.slider.css('background', 'url("' + iv.defs.image.data('iview:image') + '") no-repeat'); } } iv.defs.slide++; //Trigger the onSlideShowEnd callback if (iv.defs.slide == iv.defs.total) { iv.defs.slide = 0; iv.options.onSlideShowEnd.call(this); } if (iv.defs.slide < 0) iv.defs.slide = (iv.defs.total - 1); //Set iv.defs.image iv.defs.image = iv.slides.eq(iv.defs.slide); //Set active links if (iv.options.controlNav) { $('.iview-controlNav a.iview-control', iv.sliderContent).removeClass('active'); $('.iview-controlNav a.iview-control:eq(' + iv.defs.slide + ')', iv.sliderContent).addClass('active'); } var fx = iv.options.fx; //Generate random transition if (iv.options.fx.toLowerCase() == 'random') { var transitions = new Array('left-curtain', 'right-curtain', 'top-curtain', 'bottom-curtain', 'strip-down-right', 'strip-down-left', 'strip-up-right', 'strip-up-left', 'strip-up-down', 'strip-up-down-left', 'strip-left-right', 'strip-left-right-down', 'slide-in-right', 'slide-in-left', 'slide-in-up', 'slide-in-down', 'fade', 'block-random', 'block-fade', 'block-fade-reverse', 'block-expand', 'block-expand-reverse', 'block-expand-random', 'zigzag-top', 'zigzag-bottom', 'zigzag-grow-top', 'zigzag-grow-bottom', 'zigzag-drop-top', 'zigzag-drop-bottom', 'strip-left-fade', 'strip-right-fade', 'strip-top-fade', 'strip-bottom-fade', 'block-drop-random'); fx = transitions[Math.floor(Math.random() * (transitions.length + 1))]; if (fx == undefined) fx = 'fade'; fx = $.trim(fx.toLowerCase()); } //Run random transition from specified set (eg: effect:'strip-left-fade,right-curtain') if (iv.options.fx.indexOf(',') != -1) { var transitions = iv.options.fx.split(','); fx = transitions[Math.floor(Math.random() * (transitions.length))]; if (fx == undefined) fx = 'fade'; fx = $.trim(fx.toLowerCase()); } //Custom transition as defined by "data-iview:transition" attribute if (iv.defs.image.data('iview:transition')) { var transitions = iv.defs.image.data('iview:transition').split(','); fx = transitions[Math.floor(Math.random() * (transitions.length))]; fx = $.trim(fx.toLowerCase()); } //Set slide easing iv.defs.easing = (iv.defs.image.data('iview:easing')) ? iv.defs.image.data('iview:easing') : iv.options.easing; //Start Transition iv.defs.lock = true; iv.runTransition(fx); }, playSlider: function () { var iv = this; if (iv.timer == null && iv.defs.paused) { iv.iviewTimer.removeClass('paused').attr('title', iv.options.pauseLabel); iv.setTimer(); iv.defs.paused = false; //Trigger the onPlay callback iv.options.onPlay.call(this); } }, stopSlider: function () { var iv = this; iv.iviewTimer.addClass('paused').attr('title', iv.options.playLabel); iv.cleanTimer(); iv.defs.paused = true; //Trigger the onPause callback iv.options.onPause.call(this); }, //Set Timer Position function setTimerPosition: function(){ var iv = this, position = iv.options.timerPosition.toLowerCase().split('-'); for (var i = 0; i < position.length; i++) { if (position[i] == 'top') { iv.iviewTimer.css({ top: iv.options.timerY + 'px', bottom: '' }); } else if (position[i] == 'middle') { iv.iviewTimer.css({ top: (iv.options.timerY + (iv.defs.height / 2) - (iv.options.timerDiameter / 2)) + 'px', bottom: '' }); } else if (position[i] == 'bottom') { iv.iviewTimer.css({ bottom: iv.options.timerY + 'px', top: '' }); } else if (position[i] == 'left') { iv.iviewTimer.css({ left: iv.options.timerX + 'px', right: '' }); } else if (position[i] == 'center') { iv.iviewTimer.css({ left: (iv.options.timerX + (iv.defs.width / 2) - (iv.options.timerDiameter / 2)) + 'px', right: '' }); } else if (position[i] == 'right') { iv.iviewTimer.css({ right: iv.options.timerX + 'px', left: '' }); } } }, disableSelection: function (target) { if (typeof target.onselectstart != "undefined") target.onselectstart = function () { return false; }; else if (typeof target.style.MozUserSelect != "undefined") target.style.MozUserSelect = "none"; else if (typeof target.style.webkitUserSelect != "undefined") target.style.webkitUserSelect = "none"; else if (typeof target.style.userSelect != "undefined") target.style.userSelect = "none"; else target.onmousedown = function () { return false; }; target.unselectable = "on"; }, //touch isTouch: function () { return !!('ontouchstart' in window); } }; //Image Preloader Function var ImagePreload = function (p_aImages, p_pfnPercent, p_pfnFinished) { this.m_pfnPercent = p_pfnPercent; this.m_pfnFinished = p_pfnFinished; this.m_nLoaded = 0; this.m_nProcessed = 0; this.m_aImages = new Array; this.m_nICount = p_aImages.length; for (var i = 0; i < p_aImages.length; i++) this.Preload(p_aImages[i]) }; ImagePreload.prototype = { Preload: function (p_oImage) { var oImage = new Image; this.m_aImages.push(oImage); oImage.onload = ImagePreload.prototype.OnLoad; oImage.onerror = ImagePreload.prototype.OnError; oImage.onabort = ImagePreload.prototype.OnAbort; oImage.oImagePreload = this; oImage.bLoaded = false; oImage.source = p_oImage; oImage.src = p_oImage }, OnComplete: function () { this.m_nProcessed++; if (this.m_nProcessed == this.m_nICount) this.m_pfnFinished(); else this.m_pfnPercent(Math.round((this.m_nProcessed / this.m_nICount) * 10)) }, OnLoad: function () { this.bLoaded = true; this.oImagePreload.m_nLoaded++; this.oImagePreload.OnComplete() }, OnError: function () { this.bError = true; this.oImagePreload.OnComplete() }, OnAbort: function () { this.bAbort = true; this.oImagePreload.OnComplete() } } // Begin the iView plugin $.fn.iView = function (options) { // Default options. Play carefully. options = jQuery.extend({ fx: 'random', easing: 'easeOutQuad', strips: 20, blockCols: 10, blockRows: 5, animationSpeed: 500, pauseTime: 5000, startSlide: 0, directionNav: true, directionNavHoverOpacity: 0.6, controlNav: false, controlNavNextPrev: true, controlNavHoverOpacity: 0.6, controlNavThumbs: false, controlNavTooltip: true, captionSpeed: 500, captionEasing: 'easeInOutSine', captionOpacity: 1, autoAdvance: true, keyboardNav: true, touchNav: true, pauseOnHover: false, nextLabel: "Next", previousLabel: "Previous", playLabel: "Play", pauseLabel: "Pause", closeLabel: "Close", randomStart: false, timer: 'Pie', timerBg: '#000', timerColor: '#EEE', timerOpacity: 0.5, timerDiameter: 30, timerPadding: 4, timerStroke: 3, timerBarStroke: 1, timerBarStrokeColor: '#EEE', timerBarStrokeStyle: 'solid', timerPosition: 'top-right', timerX: 10, timerY: 10, tooltipX: 5, tooltipY: -5, onBeforeChange: function () {}, onAfterChange: function () {}, onAfterLoad: function () {}, onLastSlide: function () {}, onSlideShowEnd: function () {}, onPause: function () {}, onPlay: function () {} }, options); $(this).each(function () { var el = $(this); new iView(el, options); }); }; $.fn.reverse = [].reverse; var elems = $([]), jq_resize = $.resize = $.extend($.resize, {}), timeout_id, str_setTimeout = "setTimeout", str_resize = "resize", str_data = str_resize + "-special-event", str_delay = "delay", str_throttle = "throttleWindow"; jq_resize[str_delay] = 250; jq_resize[str_throttle] = true; $.event.special[str_resize] = { setup: function () { if (!jq_resize[str_throttle] && this[str_setTimeout]) { return false } var elem = $(this); elems = elems.add(elem); $.data(this, str_data, { w: elem.width(), h: elem.height() }); if (elems.length === 1) { loopy() } }, teardown: function () { if (!jq_resize[str_throttle] && this[str_setTimeout]) { return false } var elem = $(this); elems = elems.not(elem); elem.removeData(str_data); if (!elems.length) { clearTimeout(timeout_id) } }, add: function (handleObj) { if (!jq_resize[str_throttle] && this[str_setTimeout]) { return false } var old_handler; function new_handler(e, w, h) { var elem = $(this), data = $.data(this, str_data); data.w = w !== undefined ? w : elem.width(); data.h = h !== undefined ? h : elem.height(); old_handler.apply(this, arguments) } if ($.isFunction(handleObj)) { old_handler = handleObj; return new_handler } else { old_handler = handleObj.handler; handleObj.handler = new_handler } } }; function loopy() { timeout_id = window[str_setTimeout](function () { elems.each(function () { var elem = $(this), width = elem.width(), height = elem.height(), data = $.data(this, str_data); if (width !== data.w || height !== data.h) { elem.trigger(str_resize, [data.w = width, data.h = height]) } }); loopy() }, jq_resize[str_delay]) } var supportTouch = !! ('ontouchstart' in window), touchStartEvent = supportTouch ? "touchstart" : "mousedown", touchStopEvent = supportTouch ? "touchend" : "mouseup", touchMoveEvent = supportTouch ? "touchmove" : "mousemove"; // also handles swipeleft, swiperight $.event.special.swipe = { scrollSupressionThreshold: 10, // More than this horizontal displacement, and we will suppress scrolling. durationThreshold: 1000, // More time than this, and it isn't a swipe. horizontalDistanceThreshold: 30, // Swipe horizontal displacement must be more than this. verticalDistanceThreshold: 75, // Swipe vertical displacement must be less than this. setup: function () { var thisObject = this, $this = $(thisObject); $this.bind(touchStartEvent, function (event) { var data = event.originalEvent.touches ? event.originalEvent.touches[0] : event, start = { time: (new Date()).getTime(), coords: [data.pageX, data.pageY], origin: $(event.target) }, stop; function moveHandler(event) { if (!start) { return; } var data = event.originalEvent.touches ? event.originalEvent.touches[0] : event; stop = { time: (new Date()).getTime(), coords: [data.pageX, data.pageY] }; // prevent scrolling if (Math.abs(start.coords[0] - stop.coords[0]) > $.event.special.swipe.scrollSupressionThreshold) { event.preventDefault(); } } $this.bind(touchMoveEvent, moveHandler).one(touchStopEvent, function (event) { $this.unbind(touchMoveEvent, moveHandler); if (start && stop) { if (stop.time - start.time < $.event.special.swipe.durationThreshold && Math.abs(start.coords[0] - stop.coords[0]) > $.event.special.swipe.horizontalDistanceThreshold && Math.abs(start.coords[1] - stop.coords[1]) < $.event.special.swipe.verticalDistanceThreshold) { start.origin.trigger("swipe").trigger(start.coords[0] > stop.coords[0] ? "swipeleft" : "swiperight"); } } start = stop = undefined; }); }); } }; $.each({ swipeleft: "swipe", swiperight: "swipe" }, function (event, sourceEvent) { $.event.special[event] = { setup: function () { $(this).bind(sourceEvent, $.noop); } }; }); })(jQuery, this);