/* * Smoothproducts * http://kthornbloom.com/smoothproducts.php * * Copyright 2013, Kevin Thornbloom * Free to use and abuse under the MIT license. * http://www.opensource.org/licenses/mit-license.php */ (function ($) { $.fn.extend({ smoothproducts: function () { var slideTiming = 300 // Add some markup & set some CSS $('.sp-wrap').append('
'); $('.sp-wrap').each(function () { $('a', this).appendTo($('.sp-thumbs', this)); $('.sp-thumbs a:first', this).addClass('sp-current').clone().removeClass('sp-current').appendTo($('.sp-large', this)).addClass('sp-current-big'); $('.sp-wrap').css({ display: 'inline-block' }); }); // Prevent clicking while things are happening $(document.body).on('click', '.sp-thumbs', function (event) { event.preventDefault(); }); // Clicking a thumbnail $(document.body).on('click', '.sp-tb-active a', function (event) { $(this).parent().find('.sp-current').removeClass(); $(this).parent().parent().find('.sp-thumbs').removeClass('sp-tb-active'); $(this).parent().parent().find('.sp-zoom').remove(); $(this).parent().parent().find('.sp-full-screen').fadeOut(function () { $(this).remove(); }); var currentHeight = $(this).parent().parent().find('.sp-large').height(), currentWidth = $(this).parent().parent().find('.sp-large').width(); $(this).parent().parent().find('.sp-large').css({ overflow: 'hidden', height: currentHeight + 'px', width: currentWidth + 'px' }); $(this).parent().parent().find('.sp-large a').remove(); $(this).addClass('sp-current').clone().hide().removeClass('sp-current').appendTo($(this).parent().parent().find('.sp-large')).addClass('sp-current-big').fadeIn(slideTiming, function () { var autoHeight = $(this).parent().parent().find('.sp-large img').height(); $(this).parent().parent().find('.sp-large').animate({ height: autoHeight }, 'fast', function () { $('.sp-large').css({ height: 'auto', width: 'auto', }); }); $(this).parent().parent().find('.sp-thumbs').addClass('sp-tb-active'); }); event.preventDefault(); }); // Zoom In $(document.body).on('mouseover', '.sp-large a', function (event) { var largeUrl = $(this).attr('href'); $(this).parent().parent().find('.sp-large').append(''); $(this).parent().parent().find('.sp-zoom').fadeIn(); $(this).parent().parent().find(".sp-zoom").draggable(); //$(this).parent().parent().prepend(''); event.preventDefault(); }); // Click To Lightbox Popup Show var lightBoxUrl = $('.sp-thumbs a:first').attr('href'); $('.sp-full-screen a').attr('href', lightBoxUrl) $(".sp-thumbs a").click(function () { var bg = $(this).attr('href'); $('.sp-full-screen a').attr('href', bg) }); // Panning zoomed PC $('.sp-large').mousemove(function (e) { var viewWidth = $(this).width(), viewHeight = $(this).height(), largeWidth = $(this).find('.sp-zoom').width(), largeHeight = $(this).find('.sp-zoom').height(), parentOffset = $(this).parent().offset(), relativeXPosition = (e.pageX - parentOffset.left), relativeYPosition = (e.pageY - parentOffset.top), moveX = Math.floor((relativeXPosition * (viewWidth - largeWidth) / viewWidth)), moveY = Math.floor((relativeYPosition * (viewHeight - largeHeight) / viewHeight)); $(this).find('.sp-zoom').css({ left: moveX, top: moveY }); }).mouseout(function () { // Pause Panning }); // Panning zoomed Mobile - inspired by http://popdevelop.com/2010/08/touching-the-web/ $.fn.draggable = function () { var offset = null; var start = function (e) { var orig = e.originalEvent; var pos = $(this).position(); offset = { x: orig.changedTouches[0].pageX - pos.left, y: orig.changedTouches[0].pageY - pos.top }; }; var moveMe = function (e) { e.preventDefault(); var orig = e.originalEvent, newY = orig.changedTouches[0].pageY - offset.y, newX = orig.changedTouches[0].pageX - offset.x, maxY = (($('.sp-zoom').height()) - ($('.sp-large').height())) * -1, maxX = (($('.sp-zoom').width()) - ($('.sp-large').width())) * -1; if (newY > maxY && 0 > newY) { $(this).css({ top: newY }); } if (newX > maxX && 0 > newX) { $(this).css({ left: newX }); } }; this.bind("touchstart", start); this.bind("touchmove", moveMe); }; // Zoom Out $(document.body).on('mouseleave', '.sp-zoom', function (event) { $(this).fadeOut(function () { $(this).remove(); }); }); } }); })(jQuery);