1/*! 2* @name: jquery-izoomify 3* @version: 1.0 4* @author: Carl Lomer Abia 5*/ 6 7(function ($) { 8 var defaults = { 9 callback: false, 10 target: false, 11 duration: 120, 12 magnify: 1.2, 13 touch: true, 14 url: false 15 }; 16 17 var _izoomify = function (target, duration, magnify, url) { 18 var xPos, 19 yPos, 20 $elTarget = $(target), 21 $imgTarget = $elTarget.find('img:first'), 22 imgOrigSrc = $imgTarget.attr('src'), 23 imgSwapSrc, 24 defaultOrigin = 'center top ' + 0 + 'px', 25 resultOrigin, 26 dUrl = 'data-izoomify-url', 27 dMagnify = 'data-izoomify-magnify', 28 dDuration = 'data-izoomify-duration', 29 eClass = 'izoomify-in', 30 eMagnify, 31 eDuration; 32 33 function imageSource(imgSource) { 34 var _img = new Image(); 35 _img.src = imgSource; 36 return _img.src; 37 } 38 39 function getImageAttribute($img, dataAttribute, defaultAttribute) { 40 if ($img.attr(dataAttribute)) { 41 return $img.attr(dataAttribute); 42 } 43 44 return defaultAttribute; 45 } 46 47 function getImageSource($img, dataImageSource, defaultImageSource) { 48 if ($img.attr(dataImageSource)) { 49 return imageSource($img.attr(dataImageSource)); 50 } 51 52 return defaultImageSource ? imageSource(defaultImageSource) : false; 53 } 54 55 function getTouches(e) { 56 return e.touches || e.originalEvent.touches; 57 } 58 59 imgSwapSrc = getImageSource($imgTarget, dUrl, url); 60 61 eMagnify = getImageAttribute($imgTarget, dMagnify, magnify); 62 63 eDuration = getImageAttribute($imgTarget, dDuration, duration); 64 65 $elTarget 66 .addClass(eClass) 67 .css({ 68 'position': 'relative', 69 'overflow': 'hidden' 70 }); 71 72 $imgTarget.css({ 73 '-webkit-transition-property': '-webkit-transform', 74 'transition-property': '-webkit-transform', 75 '-o-transition-property': 'transform', 76 'transition-property': 'transform', 77 'transition-property': 'transform, -webkit-transform', 78 '-webkit-transition-timing-function': 'ease', 79 '-o-transition-timing-function': 'ease', 80 'transition-timing-function': 'ease', 81 '-webkit-transition-duration': eDuration + 'ms', 82 '-o-transition-duration': eDuration + 'ms', 83 'transition-duration': eDuration + 'ms', 84 '-webkit-transform': 'scale(1)', 85 '-ms-transform': 'scale(1)', 86 'transform': 'scale(1)', 87 '-webkit-transform-origin': defaultOrigin, 88 '-ms-transform-origin': defaultOrigin, 89 'transform-origin': defaultOrigin 90 }); 91 92 return { 93 moveStart: function (e, hasTouch) { 94 var o = $(target).offset(); 95 96 if (hasTouch) { 97 e.preventDefault(); 98 xPos = getTouches(e)[0].clientX - o.left; 99 yPos = getTouches(e)[0].clientY - o.top; 100 } else { 101 xPos = e.pageX - o.left; 102 yPos = e.pageY - o.top; 103 } 104 105 resultOrigin = xPos + 'px ' + yPos + 'px ' + 0 + 'px'; 106 107 $imgTarget 108 .css({ 109 '-webkit-transform': 'scale(' + eMagnify + ')', 110 '-ms-transform': 'scale(' + eMagnify + ')', 111 'transform': 'scale(' + eMagnify + ')', 112 '-webkit-transform-origin': resultOrigin, 113 '-ms-transform-origin': resultOrigin, 114 'transform-origin': resultOrigin 115 }) 116 .attr('src', imgSwapSrc || imgOrigSrc); 117 }, 118 moveEnd: function () { 119 this.reset(); 120 }, 121 reset: function () { 122 resultOrigin = defaultOrigin; 123 124 $imgTarget 125 .css({
126 '-webkit-transform': 'scale(1)', 127 '-ms-transform': 'scale(1)', 128 'transform': 'scale(1)', 129 '-webkit-transform-origin': resultOrigin, 130 '-ms-transform-origin': resultOrigin, 131 'transform-origin': resultOrigin 132 }) 133 .attr('src', imgOrigSrc); 134 } 135 } 136 }; 137 138 $.fn.izoomify = function (options) { 139 return this.each(function () { 140 var settings = $.extend({}, defaults, options || {}), 141 $target = settings.target && $(settings.target)[0] || this, 142 src = this, 143 $src = $(src), 144 mouseStartEvents = 'mouseover.izoomify mousemove.izoomify', 145 mouseEndEvents = 'mouseleave.izoomify mouseout.izoomify', 146 touchStartEvents = 'touchstart.izoomify touchmove.izoomify', 147 touchEndEvents = 'touchend.izoomify'; 148 149 var izoomify = _izoomify($target, settings.duration, settings.magnify, settings.url); 150 151 function startEvent(e, hasTouch) { 152 izoomify.moveStart(e, hasTouch); 153 } 154 155 function endEvent($src) { 156 izoomify.moveEnd(); 157 158 if ($src) { 159 $src 160 .off(touchStartEvents) 161 .off(touchEndEvents); 162 } 163 } 164 165 function resetImage() { 166 izoomify.reset(); 167 } 168 169 $src.one('izoomify.destroy', function () { 170 171 $src.removeClass('izoomify-in'); 172 173 resetImage(); 174 175 $src 176 .off(mouseStartEvents) 177 .off(mouseEndEvents); 178 179 if (settings.touch) { 180 $src 181 .off(touchStartEvents) 182 .off(touchStartEvents); 183 } 184 185 $target.style.position = ''; 186 $target.style.overflow = ''; 187 188 }.bind(this)); 189 190 $src 191 .on(mouseStartEvents, function (e) { 192 startEvent(e); 193 }) 194 .on(mouseEndEvents, function () { 195 endEvent(); 196 }); 197 198 if (settings.touch) { 199 $src 200 .on(touchStartEvents, function (e) { 201 e.preventDefault(); 202 startEvent(e, true); 203 }) 204 .on(touchEndEvents, function () { 205 endEvent(); 206 }); 207 } 208 209 if ($.isFunction(settings.callback)) { 210 settings.callback.call($src); 211 } 212 }); 213 }; 214 215 $.fn.izoomify.defaults = defaults; 216}(window.jQuery));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.