1/*http://zoomsl.sergeland.ru Sergey Zaragulov skype: deeserge icq: 287295769 [email protected]*/ 2(function($, global){ 3"use strict"; 4 5 //utility methods 6 /*$.fn.extend({ 7 resetzoomsl: function(){ 8 this.each(function(){ 9 10 }); 11 } 12 });*/ 13 14 $.fn.imagezoomsl = function(options){ 15 options = options || {}; 16 return this.each(function(){ //return jQuery obj 17 if (!$(this).is("img")) return true; 18 var that = this; 19 setTimeout(function () { 20 $(new Image()).load(function(){ 21 sergelandimagezoomer.init($(that), options); 22 }).attr('src', $(that).attr('src')); 23 }, 30); 24 }); 25 26 }; 27 28 var sergelandimagezoomer = {}; 29 $.extend(sergelandimagezoomer, { 30 31 dsetting: { //default settings 32 33 // çàãðóçêà big êàðòèíêè 34 loadinggif: '', // êàðòèíêà ïîêàçûâàåìàÿ ïðè çàãðóçêå big èçîáðàæåíèÿ 35 loadopacity: 0.1, // ïðîçðà÷íîñòü ôîíà ïåðåêðûòèÿ tmb êàðòèíêè ïðè çàãðóçêå big èçîáðàæåíèÿ 36 loadbackground: '#878787', // öâåò ôîíà ïåðåêðûòèÿ tmb êàðòèíêè ïðè çàãðóçêå big èçîáðàæåíèÿ 37 38 39 // ëóïà (cursorshade) 40 cursorshade: true, // ïîêàçàòü êîíòåéíåð ëóïû 41 magnifycursor: 'crosshair', // âèä êóðñîðà ìûøè íàä tmb â ôîðìàòå CSS 42 cursorshadecolor: '#fff', // öâåò êîíòåéíåðà ëóïû â ôîðìàòå CSS 43 cursorshadeopacity: 0.3, // ïðîçðà÷íîñòü êîíòåéíåðà ëóïû 44 cursorshadeborder: '1px solid black', // âíåøíèé áîðäþðà êîíòåéíåðà ëóïû â ôîðìàòå CSS 45 zindex: '', // z-index êîíòåéíåðà ëóïû 46 stepzoom: 0.5, // øàã çóììèðîâàíèÿ ïðè ïðîêðóòêå êîëåñà ìûøè 47 zoomrange: [2, 2], // äèàïàçîí çóììèðîâàíèÿ 48 zoomstart: 2, // ñòàðòîâàÿ óñòàíîâêà çóììèðîâàíèÿ 49 disablewheel: true, // îòêëþ÷èòü ïðîêðóòêó äîêóìåíòà êîëåñîì ìûøè êîãäà êóðñîð íàä êàðòèíêîé tmb â ñëó÷àå åñëè íå çàäàí äèàïàçîí çóììèðîâàíèÿ 50 51 52 // ïîäñêàçêà (statusdiv) 53 showstatus: true, // ïîêàçûâàòü ïðè íàâåäåíèè íà tmb help êîíòåéíåð 54 showstatustime: 2000, // âðåìÿ ïîêàçà help êîíòåéíåðà 55 statusdivborder: '1px solid black', 56 statusdivbackground: '#C0C0C0', 57 statusdivpadding: '4px', 58 statusdivfont: 'bold 13px Arial', 59 statusdivopacity: 0.8, 60 61 62 // êîíòåéíåð big êàðòèíêè (magnifier) 63 magnifierpos: 'right', // ñòîðîíà îòîáðàæåíèÿ êîíòåéíåðà left/right 64 magnifiersize: [0, 0], // ðàçìåð êîíòåéíåðà 65 magnifiereffectanimate: 'showIn', // ýôôåêò ïîÿâëåíèÿ/ñêðûòèÿ fadeIn/showIn/slideIn 66 innerzoom: false, // ïîêàçàòü êîíòåéíåð âíóòðè tmb 67 innerzoommagnifier: false, // ïîêàçàòü êîíòåéíåð êàê ëóïó 68 descarea: false, // ïîêàçàòü êîíòåéíåð â ïðîèçâîëüíîé îáëàñòè, îáëàñòü descarea äîëæíà èìåòü width è height 69 leftoffset: 15, // îòñòóï ñëåâà îò tmb êàðòèíêè 70 rightoffset: 15, // îòñòóï ñïðàâà îò tmb êàðòèíêè 71 switchsides: true, // ó÷èòûâàòü êðàé ýêðàíà 72 magnifierborder: '1px solid black', // âíåøíèé áîðäþð 73 74 75 // êîíòåéíåð òåêñòà ñíèçó ê êàðòèíêå 76 textdnbackground: '#fff', 77 textdnpadding: '10px', 78 textdnfont: '13px/20px cursive', 79 80 81 // êîýôôèöèåíòû ñêîðîñòè àíèìàöèè 82 scrollspeedanimate: 5 /*4*/, // ïðîêðóòêè big êàðòèíêè 83 zoomspeedanimate: 7, // çóììèðîâàíèÿ (ïëàâíîñòü) 84 loopspeedanimate: 2.5 /*2.45342*/ , // ïåðåìåùåíèÿ îáëàñòè ëóïû è big êîíòåéíåðà â ðåæèìå ëóïû 85 magnifierspeedanimate: 350, // ïîêàçà big êîíòåéíåðà 86 87 88 // âíåøíèé âèä 89 classmagnifier: "magnifier", 90 classcursorshade: "cursorshade", 91 classstatusdiv: "statusdiv", 92 classtextdn: "textdn", 93 classtracker: "tracker" 94 95 }, 96 97 //isie: (function(){/*@cc_on @*//*@if(@_jscript_version >= 5)return true;@end @*/return false;})(), //is this IE? 98 isie: (function(){ 99 var nAgt = navigator.userAgent; 100 if(nAgt.indexOf("MSIE") != -1) return true; 101 else return false; 102 })(), 103 104 //isMobile: (function(){ if( navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) || navigator.userAgent.match(/iPad/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i) ){ return true; } })(), 105 106 highestzindex: function($img){ 107 108 var z = 0, $els = $img.parents().add($img), elz; 109 $els.each(function(){ 110 elz = $(this).css('zIndex'); 111 elz = isNaN(elz) ? 0 : + elz; 112 z = Math.max(z, elz); 113 }); 114 return z; 115 }, 116 117 getboundary: function(b, val, specs){ 118 if (b == "left"){ 119 var rb = -specs.img.w*specs.newpower + specs.magnifier.w; 120 return (val > 0) ? 0 : (val < rb) ? rb : val; 121 } 122 else{ 123 var tb = -specs.img.h*specs.newpower + specs.magnifier.h; 124 return (val > 0) ? 0 : (val < tb) ? tb : val; 125 } 126 }, 127
128 controlLoop: function ($tracker) { 129 var self = this, 130 specs = $tracker.data('specs'); 131 if(!specs) return; 132 133 var coords = specs.$img.offsetsl(), 134 pageX = self.cld.pageX999 - coords.left, 135 pageY = self.cld.pageY999 - coords.top; 136 137 self.cld.destU += (self.cld.pageX999 - self.cld.destU) / 2.45342; 138 self.cld.destV += (self.cld.pageY999 - self.cld.destV) / 2.45342; 139 140 specs.$statusdiv.css({left: self.cld.destU - 10, top: self.cld.destV + 20}); 141 142 var csw = Math.round( specs.magnifier.w/specs.newpower), 143 csh = Math.round( specs.magnifier.h/specs.newpower); 144 145 self.cld.destK += (pageX - self.cld.destK) / specs.setting.loopspeedanimate; 146 self.cld.destL += (pageY - self.cld.destL) / specs.setting.loopspeedanimate; 147 148 specs.$cursorshade.css({ left: specs.img.w > csw ? Math.min(specs.img.w - csw, Math.max(0, self.cld.destK - csw/2 )) + coords.left - specs.cursorshade999.border999.left999 : coords.left - specs.cursorshade999.border999.left999, 149 top: specs.img.h > csh ? Math.min(specs.img.h - csh, Math.max(0, self.cld.destL - csh/2 )) + coords.top - specs.cursorshade999.border999.top999 : coords.top - specs.cursorshade999.border999.top999 }); 150 151 if(specs.setting.innerzoommagnifier){ 152 153 self.cld.destM += (self.cld.pageX999 - self.cld.destM) / specs.setting.loopspeedanimate; 154 self.cld.destN += (self.cld.pageY999 - self.cld.destN) / specs.setting.loopspeedanimate; 155 156 specs.$magnifier.css({ 157 left: self.cld.destM - Math.round(specs.magnifier.w/2), 158 top: self.cld.destN - Math.round(specs.magnifier.h/2) 159 }); 160 specs.$textdn.css({ 161 left: self.cld.destM - Math.round(specs.magnifier.w/2), 162 top: self.cld.destN + specs.magnifier.h/2 163 }); 164 } 165 166 self.cld.currU += (pageX - self.cld.currU) / specs.setting.scrollspeedanimate; 167 self.cld.currV += (pageY - self.cld.currV) / specs.setting.scrollspeedanimate; 168 169 var newx = -self.cld.currU*specs.newpower + specs.magnifier.w/2; 170 var newy = -self.cld.currV*specs.newpower + specs.magnifier.h/2; 171 172 specs.$bigimage.css({left: self.getboundary('left', newx, specs), top: self.getboundary('top', newy, specs)}); 173 self.cld.controlTimer = setTimeout(function () { 174 self.controlLoop($tracker); 175 }, 30); 176 177 }, 178 179 controlLoop2: function ($tracker) { 180 181 var self = this, 182 specs = $tracker.data('specs'); 183 if(!specs) return; 184 185 specs.currM += (specs.newpower - specs.currM) / specs.setting.zoomspeedanimate; 186 specs.currM = Math.round( specs.currM * 1000 ) / 1000; 187 188 specs.$cursorshade.css({ width: specs.img.w > Math.round( specs.magnifier.w/specs.currM ) ? Math.round( specs.magnifier.w/specs.currM ) : specs.img.w, 189 height: specs.img.h > Math.round( specs.magnifier.h/specs.currM ) ? Math.round( specs.magnifier.h/specs.currM ) : specs.img.h }); 190 specs.$bigimage.css({ width: Math.round( specs.currM*specs.bigimage.w*(specs.img.w/specs.bigimage.w) ), 191 height: Math.round( specs.currM*specs.bigimage.h*(specs.img.h/specs.bigimage.h) ) }); 192 193 self.cld.controlTimer2 = setTimeout(function () { 194 self.controlLoop2($tracker); 195 }, 30); 196 197 }, 198 199 cld:{}, 200 201 showimage: function($tracker){ 202 203 var self = this, 204 specs = $tracker.data('specs'), 205 width = specs.setting.magnifiersize[0], 206 height = specs.setting.magnifiersize[1], 207 magcoords = {}, 208 coords = specs.$img.offsetsl(), 209 func = function(){}, 210 left1 = 0, 211 top1 = 0; 212 213 magcoords.left = coords.left + (specs.setting.magnifierpos === 'left' ? -specs.magnifier.w - specs.setting.leftoffset : specs.img.w + specs.setting.rightoffset); 214 if(specs.setting.switchsides && !specs.setting.innerzoom){ 215 216 if(specs.setting.magnifierpos !== 'left' && magcoords.left + specs.magnifier.w + specs.setting.leftoffset >= $(window).width() && coords.left - specs.magnifier.w >= specs.setting.leftoffset)
217 magcoords.left = coords.left - specs.magnifier.w - specs.setting.leftoffset; 218 else if(specs.setting.magnifierpos === 'left' && magcoords.left < 0) 219 magcoords.left = coords.left + specs.img.w + specs.setting.rightoffset; 220 } 221 222 left1 = magcoords.left; 223 top1 = coords.top; 224 specs.$magnifier.css({visibility: "visible", display: "none"}); 225 226 if(specs.setting.descarea){ 227 left1 = $(specs.setting.descarea).offsetsl().left; 228 top1 = $(specs.setting.descarea).offsetsl().top; 229 } 230 if(specs.setting.innerzoommagnifier){ 231 left1 = self.cld.pageX999 - Math.round(specs.magnifier.w/2); 232 top1 = self.cld.pageY999 - Math.round(specs.magnifier.h/2); 233 } 234 235 //* 236 func = function(){ 237 238 specs.$textdn.stop(true, true).fadeIn(specs.setting.magnifierspeedanimate); 239 if(!specs.setting.innerzoommagnifier) 240 specs.$textdn.css({left: left1, top: top1 + height}); 241 } // */ 242 243 if(specs.setting.innerzoom){ 244 245 left1 = coords.left; 246 top1 = coords.top; 247 248 func = function(){ 249 specs.$img.css({visibility: "hidden"}); 250 specs.$textdn.css({left: left1, top: top1 + height}).stop(true, true).fadeIn(specs.setting.magnifierspeedanimate); 251 }; 252 } 253 254 switch (specs.setting.magnifiereffectanimate){ 255 case 'slideIn': 256 specs.$magnifier.css({ 257 left: left1, 258 top: top1 - height/3, 259 width: width, 260 height: height 261 }) 262 .stop(true, true).show() 263 .animate({top: top1}, specs.setting.magnifierspeedanimate, "easeOutBounceSL", func); 264 break; 265 case 'showIn': 266 specs.$magnifier.css({ 267 left: coords.left + Math.round(specs.img.w/2), 268 top: coords.top + Math.round(specs.img.h/2), 269 width: Math.round(specs.magnifier.w/5), 270 height: Math.round(specs.magnifier.h/5) 271 }) 272 .stop(true, true).show().css({opacity: "0.1"}) 273 .animate({ 274 left: left1, 275 top: top1, 276 opacity: "1", 277 width: width, 278 height: height 279 280 }, specs.setting.magnifierspeedanimate, func ); 281 break; 282 default: 283 specs.$magnifier.css({ 284 left: left1, 285 top: top1, 286 width: width, 287 height: height 288 }) 289 .stop(true, true) 290 .fadeIn(specs.setting.magnifierspeedanimate, func); 291 } 292 if (specs.setting.showstatus && (specs.title999 || specs.help)) 293 specs.$statusdiv.html(specs.title999 + '<div style="font-size:80%">' + specs.help +'</div>') 294 .stop(true, true) 295 .fadeIn().delay(specs.setting.showstatustime).fadeOut("slow"); 296 else specs.$statusdiv.hide(); 297 }, 298 299 hideimage: function($tracker){ 300 301 var self = this, 302 specs = $tracker.data('specs'), 303 coords = specs.$img.offsetsl(); 304 305 switch (specs.setting.magnifiereffectanimate){ 306 307 case 'showIn': 308 specs.$magnifier.stop(true, true) 309 .animate({ 310 left: coords.left + Math.round(specs.img.w/2), 311 top: coords.top + Math.round(specs.img.h/2), 312 opacity: "0.1", 313 width: Math.round(specs.magnifier.w/5), 314 height: Math.round(specs.magnifier.h/5) 315 }, 316 specs.setting.magnifierspeedanimate, function(){specs.$magnifier.hide();}); 317 break; 318 319 default: 320 specs.$magnifier.stop(true, true).fadeOut(specs.setting.magnifierspeedanimate); 321 } 322 323 }, 324 325 /* Init function start. */ 326 init: function ($img, options, gallery) { 327 328 var setting = $.extend({}, this.dsetting, options), 329 basezindex = setting.zindex || this.highestzindex($img), 330 img = {w:$img.width(), h:$img.height()}, 331 cld = new cld(), 332 title = $img.attr("data-title") ? $img.attr("data-title") : '', 333 help = $img.attr("data-help") ? $img.attr("data-help") : '', 334 textdn = $img.attr("data-text-bottom") ? $img.attr("data-text-bottom") : '', 335 self = this, 336 newpower, 337 key, 338 $magnifier, 339 $cursorshade, 340 $statusdiv, 341 $tracker, 342 $textdn; 343 344 if(img.h === 0 || img.w === 0){ 345 $(new Image()).load(function(){ 346 self.init($img, options); 347 }).attr("src", $img.attr("src")); 348 return; 349 } 350 351 $img.css({visibility: "visible"}); 352 setting.largeimage = $img.attr("data-large") || $img.attr("src"); 353 354 for (key in setting) 355 if(setting[key] === '') setting[key] = this.dsetting[key]; 356 357 if(setting.zoomrange[0] < setting.zoomstart) 358 newpower = setting.zoomstart; 359 else newpower = setting.zoomrange[0]; 360 361 if( setting.magnifiersize.toString() === '0,0' || 362 setting.magnifiersize.toString() === '') 363 if(setting.innerzoommagnifier) 364 setting.magnifiersize = [img.w/2, img.h/2]; 365 else setting.magnifiersize = [img.w, img.h]; 366 367 if(setting.descarea && $(setting.descarea).length){ 368 if( $(setting.descarea).width() === 0 || $(setting.descarea).height() === 0 ) 369 setting.descarea = false; 370 else setting.magnifiersize = [$(setting.descarea).width(), $(setting.descarea).height()]; 371 } 372 else setting.descarea = false; 373 374 if(setting.innerzoom){ 375 setting.magnifiersize = [img.w, img.h]; 376 if(!options.cursorshade) 377 setting.cursorshade = false; 378 if(!options.scrollspeedanimate) 379 setting.scrollspeedanimate = 10; 380 } 381 382 if(setting.innerzoommagnifier){ 383 if(!options.magnifycursor) 384 if(window.chrome || window.sidebar) 385 setting.magnifycursor = "none"; 386 setting.cursorshade = false; 387 setting.magnifiereffectanimate = "fadeIn"; 388 } 389 390 // === == === // 391 392 function cld(){ 393 this.pageX999 = 0; 394 this.pageY999 = 0; 395 } 396 // === == === // 397 398 function getspecs($bigimage){ 399 400 $tracker.data("specs", { 401 402 setting: setting, 403 title999: title, 404 help: help, 405 406 $img: $img, 407 $magnifier: $magnifier, 408 $bigimage: $bigimage, 409 $statusdiv: $statusdiv, 410 $cursorshade: $cursorshade, 411 $textdn: $textdn, 412 413 img: img, 414 bigimage: { w:$bigimage.width(), h:$bigimage.height() }, 415 magnifier: { w:$magnifier.width(), h:$magnifier.height() }, 416 cursorshade999: { w:$cursorshade.width(), h:$cursorshade.height(), 417 border999:{ left999: parseInt($cursorshade.css("border-left-width")) || 0, 418 top999: parseInt($cursorshade.css("border-top-width")) || 0}}, 419 420 currM: newpower, 421 newpower: newpower 422 }); 423 424 } 425 // === == === // 426 427 function isImageLoaded(img) { 428 if (!img.complete) 429 return false;
430 if (typeof img.naturalWidth !== "undefined" && img.naturalWidth === 0) 431 return false; 432 return true; 433 } 434 // === == === // 435 436 var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll']; 437 var toBind = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll']; 438 var lowestDelta, lowestDeltaXY; 439 440 if ( $.event.fixHooks ) { 441 for ( var i = toFix.length; i; ) { 442 $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks; 443 } 444 } 445 446 $.event.special.mousewheel = { 447 setup: function() { 448 if ( this.addEventListener ) { 449 for ( var i = toBind.length; i; ) { 450 this.addEventListener( toBind[--i], handler, false ); 451 } 452 } else { 453 this.onmousewheel = handler; 454 } 455 }, 456 457 teardown: function() { 458 if ( this.removeEventListener ) { 459 for ( var i = toBind.length; i; ) { 460 this.removeEventListener( toBind[--i], handler, false ); 461 } 462 } else { 463 this.onmousewheel = null; 464 } 465 } 466 }; 467 468 function handler(event) { 469 var orgEvent = event || window.event, 470 args = [].slice.call(arguments, 1), 471 delta = 0, 472 deltaX = 0, 473 deltaY = 0, 474 absDelta = 0, 475 absDeltaXY = 0, 476 fn; 477 event = $.event.fix(orgEvent); 478 event.type = "mousewheel"; 479 480 // Old school scrollwheel delta 481 if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta; } 482 if ( orgEvent.detail ) { delta = orgEvent.detail * -1; } 483 484 // New school wheel delta (wheel event) 485 if ( orgEvent.deltaY ) { 486 deltaY = orgEvent.deltaY * -1; 487 delta = deltaY; 488 } 489 if ( orgEvent.deltaX ) { 490 deltaX = orgEvent.deltaX; 491 delta = deltaX * -1; 492 } 493 494 // Webkit 495 if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY; } 496 if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = orgEvent.wheelDeltaX * -1; } 497 498 // Look for lowest delta to normalize the delta values 499 absDelta = Math.abs(delta); 500 if ( !lowestDelta || absDelta < lowestDelta ) { lowestDelta = absDelta; } 501 absDeltaXY = Math.max(Math.abs(deltaY), Math.abs(deltaX)); 502 if ( !lowestDeltaXY || absDeltaXY < lowestDeltaXY ) { lowestDeltaXY = absDeltaXY; } 503 504 // Get a whole value for the deltas 505 fn = delta > 0 ? "floor" : "ceil"; 506 delta = Math[fn](delta / lowestDelta); 507 deltaX = Math[fn](deltaX / lowestDeltaXY); 508 deltaY = Math[fn](deltaY / lowestDeltaXY); 509 510 // Add event and delta to the front of the arguments 511 args.unshift(event, delta, deltaX, deltaY); 512 513 return ($.event.dispatch || $.event.handle).apply(this, args); 514 } 515 516 // === == === // 517 518 $.fn.offsetsl = function(){ 519 var elem = this.get(0); 520 function getOffsetSum(elem) { 521 var top999 = 0, left999 = 0; 522 while(elem) { 523 top999 = top999 + parseInt(elem.offsetTop); 524 left999 = left999 + parseInt(elem.offsetLeft); 525 elem = elem.offsetParent; 526 } 527 return {top: top999, left: left999} 528 } 529 if (elem.getBoundingClientRect) 530 return this.offset(); 531 else return getOffsetSum(elem) 532 } 533 534 // === == === // 535 536 $.easing.easeOutBounceSL = function (x, t, b, c, d) { 537 if ((t/=d) < (1/2.75)) { 538 return c*(7.5625*t*t) + b; 539 } else if (t < (2/2.75)) { 540 return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; 541 } else if (t < (2.5/2.75)) { 542 return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; 543 } else { 544 return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; 545 } 546 } 547 548 // === == === // 549 550 $magnifier = $("<div />") 551 .attr({ "class": setting.classmagnifier }) 552 .css({ position: "absolute", 553 zIndex: basezindex, 554 width: setting.magnifiersize[0], 555 height: setting.magnifiersize[1], 556 left: -10000, 557 top: -10000, 558 visibility: "hidden", 559 overflow: "hidden" 560 }) 561 .appendTo(document.body); 562 563 if(!options.classmagnifier) 564 $magnifier.css({border: setting.magnifierborder}); 565 566 $cursorshade = $("<div />"); 567 if(setting.cursorshade){ 568 $cursorshade.attr({ "class": setting.classcursorshade }) 569 .css({ 570 zIndex: basezindex, 571 display: "none", 572 position: "absolute",
573 width: Math.round(setting.magnifiersize[0]/setting.zoomstart), 574 height: Math.round(setting.magnifiersize[1]/setting.zoomstart), 575 top: 0, 576 left: 0 577 }) 578 .appendTo(document.body); 579 580 if(!options.classcursorshade) 581 $cursorshade.css({ 582 border: setting.cursorshadeborder, 583 opacity: setting.cursorshadeopacity, 584 backgroundColor: setting.cursorshadecolor 585 }); 586 } 587 588 if(!setting.loadinggif) 589 setting.loadinggif = "data:image/gif;base64,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"; 590 591 $statusdiv = $("<div />") 592 .attr({ "class": setting.classstatusdiv + " preloadevt" }) 593 .css({ position: "absolute", 594 display: "none", 595 zIndex: basezindex, 596 top: 0, 597 left: 0 598 }) 599 .html('<img src="' + setting.loadinggif + '" />') 600 .appendTo(document.body); 601 602 $tracker = $("<div />") 603 .attr({ "class": setting.classtracker }) 604 .css({ zIndex: basezindex, 605 backgroundImage: self.isie ? "url(cannotbe)" : "none", 606 position: "absolute", 607 width: img.w, 608 height: img.h, 609 left: gallery ? $img.offsetsl().left : -10000, 610 top: gallery ? $img.offsetsl().top : -10000 611 }).appendTo(document.body); 612 613 $textdn = $("<div />"); 614 if(textdn){ 615 $textdn.attr({ "class": setting.classtextdn }) 616 .css({ position: "absolute", 617 zIndex: basezindex, 618 left: 0, 619 top: 0, 620 display: "none" 621 }) 622 .html(textdn) 623 .appendTo(document.body); 624 if(!options.classtextdn) 625 $textdn.css({ 626 border: setting.magnifierborder, 627 background: setting.textdnbackground, 628 padding: setting.textdnpadding, 629 font: setting.textdnfont 630 }); 631 $textdn.css({width: setting.magnifiersize[0] - parseInt($textdn.css("padding-left")) - parseInt($textdn.css("padding-right"))}); 632 } 633 $tracker.data("largeimage", setting.largeimage); 634 635 636 // EVENTS 637 $(window).bind("resize", function(){ 638 var o = $img.offsetsl(); 639 if($tracker.data("loadimgevt")) 640 $tracker.css({left: o.left, top: o.top}); 641 $statusdiv.filter(".preloadevt").css({left:o.left + img.w/2 - $statusdiv.width()/2, top:o.top + img.h/2 - $statusdiv.height()/2, visibility:'visible'}); 642 }); 643 $(document).mousemove(function(e){ 644 self.cld.docX = e.pageX; 645 if(self.cld.pageX999 !== self.cld.docX){ 646 clearTimeout(self.cld.controlTimer); 647 clearTimeout(self.cld.controlTimer2); 648 $img.css({visibility: "visible"}); 649 //$tracker.hide().css({left: 10000, top: 10000}); 650 } 651 }); 652 $img.mouseover(function(e){ 653 var o = $img.offsetsl(); 654 $tracker.css({left: o.left, top: o.top}).show(); 655 }); 656 $tracker.mouseover(function(e){ 657 658 self.cld.pageX999 = e.pageX; 659 self.cld.pageY999 = e.pageY; 660 661 cld.pageX999 = e.pageX; 662 cld.pageY999 = e.pageY; 663 664 self.cld.docX = e.pageX; 665 666 var o = $img.offsetsl(), 667 pageX = self.cld.pageX999 - o.left, 668 pageY = self.cld.pageY999 - o.top; 669 670 self.cld.destK = pageX; 671 self.cld.destL = pageY; 672 673 self.cld.currU = pageX; 674 self.cld.currV = pageY; 675 676 self.cld.destM = self.cld.pageX999; 677 self.cld.destN = self.cld.pageY999; 678 679 self.cld.destU = self.cld.pageX999 - 10; 680 self.cld.destV = self.cld.pageY999 + 20; 681 682 $tracker.css({cursor: setting.magnifycursor}); 683 setting.largeimage = $img.attr("data-large") || $img.attr("src"); 684 685 $statusdiv.show(); 686 clearTimeout(self.cld.controlTimer); 687 clearTimeout(self.cld.controlTimer2); 688 689 if(setting.largeimage !== $tracker.data('largeimage')){ 690 691 $(new Image()).load(function(){ 692 }).attr("src", setting.largeimage); 693 694 $($tracker).unbind(); 695 $($statusdiv).remove(); 696 $($cursorshade).remove(); 697 $($magnifier).remove(); 698 $($tracker).remove(); 699 $($textdn).remove(); 700 701 self.init($img, options, true); 702 } 703 if( $tracker.data("loadevt") ){ 704 $cursorshade.fadeIn(); 705 self.showimage($tracker); 706 self.controlLoop($tracker); 707 self.controlLoop2($tracker); 708 } 709 710 }); 711 $tracker.mousemove(function(e){
712 setting.largeimage = $img.attr("data-large") || $img.attr("src"); 713 if(setting.largeimage !== $tracker.data("largeimage")){ 714 715 $(new Image()).load(function(){ 716 }).attr("src", setting.largeimage); 717 718 $($tracker).unbind(); 719 $($statusdiv).remove(); 720 $($cursorshade).remove(); 721 $($magnifier).remove(); 722 $($tracker).remove(); 723 $($textdn).remove(); 724 725 self.init($img, options, true); 726 } 727 728 self.cld.pageX999 = e.pageX; 729 self.cld.pageY999 = e.pageY; 730 731 cld.pageX999 = e.pageX; 732 cld.pageY999 = e.pageY; 733 734 self.cld.docX = e.pageX; 735 }); 736 $tracker.mouseout(function(e) { 737 clearTimeout(self.cld.controlTimer); 738 clearTimeout(self.cld.controlTimer2); 739 $img.css({visibility: "visible"}); 740 $textdn.hide(); 741 $cursorshade.add($statusdiv.not(".preloadevt")).stop(true, true).hide(); 742 }); 743 $tracker.one("mouseover", function(e){ 744 745 var imgcoords = $img.offsetsl(); 746 var $bigimage = $('<img src="' + setting.largeimage + '"/>').css({position:"relative", maxWidth:"none"}).appendTo($magnifier); 747 if(!self.loaded999[setting.largeimage]){ 748 $tracker.css({opacity: setting.loadopacity, background: setting.loadbackground}); 749 $tracker.data("loadimgevt", true); 750 $statusdiv.css({left:imgcoords.left + img.w/2 - $statusdiv.width()/2, top:imgcoords.top + img.h/2 - $statusdiv.height()/2, visibility:'visible'}); 751 } 752 $bigimage.bind("loadevt", function(event, e){ 753 754 if(e.type === "error") return; 755 $tracker.mouseout(function(e){ //image onmouseout 756 self.hideimage($tracker); 757 clearTimeout(self.cld.controlTimer); 758 clearTimeout(self.cld.controlTimer2); 759 $img.css({visibility: "visible"}); 760 $textdn.hide(); 761 $tracker.hide().css({left: -10000, top: -10000}); 762 }); 763 $tracker.mouseover(function(e){ //image onmouseover 764 specs.currM = specs.newpower; 765 }); 766 $tracker.data("loadimgevt", false); 767 $tracker.css({opacity:0, cursor:setting.magnifycursor}); 768 $statusdiv.empty(); 769 if(!options.classstatusdiv) 770 $statusdiv.css({ 771 border: setting.statusdivborder, 772 background: setting.statusdivbackground, 773 padding: setting.statusdivpadding, 774 font: setting.statusdivfont, 775 opacity: setting.statusdivopacity 776 }); 777 $statusdiv.hide().removeClass("preloadevt"); 778 self.loaded999[setting.largeimage] = true; 779 getspecs($bigimage); 780 if(cld.pageX999 == self.cld.docX){ 781 $cursorshade.fadeIn(); 782 self.showimage($tracker); 783 clearTimeout(self.cld.controlTimer); 784 clearTimeout(self.cld.controlTimer2); 785 self.controlLoop($tracker); 786 self.controlLoop2($tracker); 787 } 788 789 var specs = $tracker.data("specs"); 790 $bigimage.css({width: setting.zoomstart*specs.bigimage.w*(img.w/specs.bigimage.w), height: setting.zoomstart*specs.bigimage.h*(img.h/specs.bigimage.h)}); 791 $tracker.data("loadevt", true); 792 793 if (setting.zoomrange && setting.zoomrange[1] > setting.zoomrange[0]){ //if zoom range enabled 794 $tracker.bind("mousewheel", function(e, delta){ 795 var zoomdir = delta < 0 ? "out" : "in", 796 power = specs.newpower, 797 newpower = (zoomdir == "in") ? Math.min(power + setting.stepzoom, setting.zoomrange[1]) : Math.max(power - setting.stepzoom, setting.zoomrange[0]); 798 799 specs.newpower = newpower; 800 specs.delta = delta; 801 e.preventDefault(); 802 }); 803 804 } else if(setting.disablewheel){ 805 $tracker.bind("mousewheel", function(e){e.preventDefault();}); 806 } 807 808 }); //end $bigimage onload */ 809 810 if ( isImageLoaded($bigimage.get(0)) ) 811 $bigimage.trigger("loadevt", {type: "load"}); 812 else $bigimage.bind("load error", function(e){$bigimage.trigger("loadevt", e)}); 813 }); 814 }, 815 loaded999: {} 816 }); 817})(jQuery, window);
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.