PageSourceSearch

https://www.pelitatotobahu.net/assets/template/js/jquery.jqzoom-core.js

js pelitatotobahu.net collected 2026-10-09 22:40:44 UTC 31,322 bytes, 733 lines download raw bytes

1/*!
2 * jQzoom Evolution Library v2.3  - Javascript Image magnifier
3 * http://www.mind-projects.it
4 *
5 * Copyright 2011, Engineer Marco Renzi
6 * Licensed under the BSD license.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 *     * Redistributions of source code must retain the above copyright
11 *       notice, this list of conditions and the following disclaimer.
12 *     * Redistributions in binary form must reproduce the above copyright
13 *       notice, this list of conditions and the following disclaimer in the
14 *       documentation and/or other materials provided with the distribution.
15 *     * Neither the name of the organization nor the
16 *       names of its contributors may be used to endorse or promote products
17 *       derived from this software without specific prior written permission.
18 *
19 * Date: 03 May 2011 22:16:00
20 */
21(function ($) {
22    //GLOBAL VARIABLES
23    var isIE6 = ($.browser.msie && $.browser.version < 7);
24    var body = $(document.body);
25    var window = $(window);
26    var jqzoompluging_disabled = false; //disabilita globalmente il plugin
27    $.fn.jqzoom = function (options) {
28        return this.each(function () {
29            var node = this.nodeName.toLowerCase();
30            if (node == 'a') {
31                new jqzoom(this, options);
32            }
33        });
34    };
35    jqzoom = function (el, options) {
36        var api = null;
37        api = $(el).data("jqzoom");
38        if (api) return api;
39        var obj = this;
40        var settings = $.extend({}, $.jqzoom.defaults, options || {});
41        obj.el = el;
42        el.rel = $(el).attr('rel');
43        //ANCHOR ELEMENT
44        el.zoom_active = false;
45        el.zoom_disabled = false; //to disable single zoom instance
46        el.largeimageloading = false; //tell us if large image is loading
47        el.largeimageloaded = false; //tell us if large image is loaded
48        el.scale = {};
49        el.timer = null;
50        el.mousepos = {};
51        el.mouseDown = false;
52        $(el).css({
53            'outline-style': 'none',
54            'text-decoration': 'none'
55        });
56        //BASE IMAGE
57        var img = $("img:eq(0)", el);
58        el.title = $(el).attr('title');
59        el.imagetitle = img.attr('title');
60        var zoomtitle = ($.trim(el.title).length > 0) ? el.title : el.imagetitle;
61        var smallimage = new Smallimage(img);
62        var lens = new Lens();
63        var stage = new Stage();
64        var largeimage = new Largeimage();
65        var loader = new Loader();
66        //preventing default click,allowing the onclick event [exmple: lightbox]
67        $(el).bind('click', function (e) {
68            e.preventDefault();
69            return false;
70        });
71        //setting the default zoomType if not in settings
72        var zoomtypes = ['standard', 'drag', 'innerzoom', 'reverse'];
73        if ($.inArray($.trim(settings.zoomType), zoomtypes) < 0) {
74            settings.zoomType = 'standard';
75        }
76        $.extend(obj, {
77            create: function () { //create the main objects
78                //create ZoomPad
79                if ($(".zoomPad", el).length == 0) {
80                    el.zoomPad = $('<div/>').addClass('zoomPad');
81                    img.wrap(el.zoomPad);
82                }
83                if(settings.zoomType == 'innerzoom'){
84                    settings.zoomWidth  = smallimage.w;
85                    settings.zoomHeight  =   smallimage.h;
86                }
87                //creating ZoomPup
88                if ($(".zoomPup", el).length == 0) {
89                    lens.append();
90                }
91                //creating zoomWindow
92                if ($(".zoomWindow", el).length == 0) {
93                    stage.append();
94                }
95                //creating Preload
96                if ($(".zoomPreload", el).length == 0) {
97                    loader.append();
98                }
99                //preloading images
100                if (settings.preloadImages || settings.zoomType == 'drag' || settings.alwaysOn) {
101                    obj.load();
102                }
103                obj.init();
104            },
105            init: function () {
106                //drag option
107                if (settings.zoomType == 'drag') {
108                    $(".zoomPad", el).mousedown(function () {
109                        el.mouseDown = true;
110                    });
111                    $(".zoomPad", el).mouseup(function () {
112                        el.mouseDown = false;
113                    });
114                    document.body.ondragstart = function () {
115                        return false;
116                    };
117                    $(".zoomPad", el).css({
118                        cursor: 'default'
119                    });
120                    $(".zoomPup", el).css({
121                        cursor: 'move'
122                    });
123                }
124                if (settings.zoomType == 'innerzoom') {
125                    $(".zoomWrapper", el).css({
126                        cursor: 'crosshair'
127                    });
128                }
129                $(".zoomPad", el).bind('mouseenter mouseover', function (event) {
130                    img.attr('title', '');
131                    $(el).attr('title', '');
132                    el.zoom_active = true;
133                    //if loaded then activate else load large image
134                    smallimage.fetchdata();
135                    if (el.largeimageloaded) {
136                        obj.activate(event);
137                    } else {
138                        obj.load();
139                    }
140                });
141                $(".zoomPad", el).bind('mouseleave', function (event) {
142                    obj.deactivate();
143                });
144                $(".zoomPad", el).bind('mousemove', function (e) {
145
146                    //prevent fast mouse mevements not to fire the mouseout event
147                    if (e.pageX > smallimage.pos.r || e.pageX < smallimage.pos.l || e.pageY < smallimage.pos.t || e.pageY > smallimage.pos.b) {
148                        lens.setcenter();
149                        return false;
150                    }
151                    el.zoom_active = true;
152                    if (el.largeimageloaded && !$('.zoomWindow', el).is(':visible')) {
153                        obj.activate(e);
154                    }
155                    if (el.largeimageloaded && (settings.zoomType != 'drag' || (settings.zoomType == 'drag' && el.mouseDown))) {
156                        lens.setposition(e);
157                    }
158                });
159                var thumb_preload = new Array();
160                var i = 0;
161                //binding click event on thumbnails
162                var thumblist = new Array();
163                thumblist = $('a').filter(function () {
164                    var regex = new RegExp("gallery[\\s]*:[\\s]*'" + $.trim(el.rel) + "'", "i");
165                    var rel = $(this).attr('rel');
166                    if (regex.test(rel)) {
167                        return this;
168                    }
169                });
170                if (thumblist.length > 0) {
171                    //getting the first to the last
172                    var first = thumblist.splice(0, 1);
173                    thumblist.push(first);
174                }
175                thumblist.each(function () {
176                    //preloading thumbs
177                    if (settings.preloadImages) {
178                        var thumb_options = $.extend({}, eval("(" + $.trim($(this).attr('rel')) + ")"));
179                        thumb_preload[i] = new Image();
180                        thumb_preload[i].src = thumb_options.largeimage;
181                        i++;
182                    }
183                    $(this).click(function (e) {
184                        if($(this).hasClass('zoomThumbActive')){
185                          return false;
186                        }
187                        thumblist.each(function () {
188                            $(this).removeClass('zoomThumbActive');
189                        });
190                        e.preventDefault();
191                        obj.swapimage(this);
192                        return false;
193                    });
194                });
195            },
196            load: function () {
197                if (el.largeimageloaded == false && el.largeimageloading == false) {
198                    var url = $(el).attr('href');
199                    el.largeimageloading = true;
200                    largeimage.loadimage(url);
201                }
202            },
203            activate: function (e) {
204                clearTimeout(el.timer);
205                //show lens and zoomWindow
206                lens.show();
207                stage.show();
208            },
209            deactivate: function (e) {
210                switch (settings.zoomType) {
211                case 'drag':
212                    //nothing or lens.setcenter();
213                    break;
214                default:
215                    img.attr('title', el.imagetitle);
216                    $(el).attr('title', el.title);
217                    if (settings.alwaysOn) {
218                        lens.setcenter();
219                    } else {
220                        stage.hide();
221                        lens.hide();
222                    }
223                    break;
224                }
225                el.zoom_active = false;
226            },
227            swapimage: function (link) {
228                el.largeimageloading = false;
229                el.largeimageloaded = false;
230                var options = new Object();
231                options = $.extend({}, eval("(" + $.trim($(link).attr('rel')) + ")"));
232                if (options.smallimage && options.largeimage) {
233                    var smallimage = options.smallimage;
234                    var largeimage = options.largeimage;
235                    $(link).addClass('zoomThumbActive');
236                    $(el).attr('href', largeimage);
237                    img.attr('src', smallimage);
238                    lens.hide();
239                    stage.hide();
240                    obj.load();
241                } else {
242                    alert('ERROR :: Missing parameter for largeimage or smallimage.');
243                    throw 'ERROR :: Missing parameter for largeimage or smallimage.';
244                }
245                return false;
246            }
247        });
248        //sometimes image is already loaded and onload will not fire
249        if (img[0].complete) {
250            //fetching data from sallimage if was previously loaded
251            smallimage.fetchdata();
252            if ($(".zoomPad", el).length == 0) obj.create();
253        }
254/*========================================================,
255|   Smallimage
256|---------------------------------------------------------:
257|   Base image into the anchor element
258`========================================================*/
259
260        function Smallimage(image) {
261            var $obj = this;
262            this.node = image[0];
263            this.findborder = function () {
264                var bordertop = 0;
265                bordertop = image.css('border-top-width');
266                btop = '';
267                var borderleft = 0;
268                borderleft = image.css('border-left-width');
269                bleft = '';
270                if (bordertop) {
271                    for (i = 0; i < 3; i++) {
272                        var x = [];
273                        x = bordertop.substr(i, 1);
274                        if (isNaN(x) == false) {
275                            btop = btop + '' + bordertop.substr(i, 1);
276                        } else {
277                            break;
278                        }
279                    }
280                }
281                if (borderleft) {
282                    for (i = 0; i < 3; i++) {
283                        if (!isNaN(borderleft.substr(i, 1))) {
284                            bleft = bleft + borderleft.substr(i, 1)
285                        } else {
286                            break;
287                        }
288                    }
289                }
290                $obj.btop = (btop.length > 0) ? eval(btop) : 0;
291                $obj.bleft = (bleft.length > 0) ? eval(bleft) : 0;
292            };
293            this.fetchdata = function () {
294                $obj.findborder();
295                $obj.w = image.width();
296                $obj.h = image.height();
297                $obj.ow = image.outerWidth();
298                $obj.oh = image.outerHeight();
299                $obj.pos = image.offset();
300                $obj.pos.l = image.offset().left + $obj.bleft;
301                $obj.pos.t = image.offset().top + $obj.btop;
302                $obj.pos.r = $obj.w + $obj.pos.l;
303                $obj.pos.b = $obj.h + $obj.pos.t;
304                $obj.rightlimit = image.offset().left + $obj.ow;
305                $obj.bottomlimit = image.offset().top + $obj.oh;
306                
307            };
308            this.node.onerror = function () {
309                alert('Problems while loading image.');
310                throw 'Problems while loading image.';
311            };
312            this.node.onload = function () {
313                $obj.fetchdata();
314                if ($(".zoomPad", el).length == 0) obj.create();
315            };
316            return $obj;
317        };
318/*========================================================,
319|  Loader
320|---------------------------------------------------------:
321|  Show that the large image is loading
322`========================================================*/
323
324        function Loader() {
325            var $obj = this;
326            this.append = function () {
327                this.node = $('<div/>').addClass('zoomPreload').css('visibility', 'hidden').html(settings.preloadText);
328                $('.zoomPad', el).append(this.node);
329            };
330            this.show = function () {
331                this.node.top = (smallimage.oh - this.node.height()) / 2;
332                this.node.left = (smallimage.ow - this.node.width()) / 2;
333                //setting position
334                this.node.css({
335                    top: this.node.top,
336                    left: this.node.left,
337                    position: 'absolute',
338                    visibility: 'visible'
339                });
340            };
341            this.hide = function () {
342                this.node.css('visibility', 'hidden');
343            };
344            return this;
345        }
346/*========================================================,
347|   Lens
348|---------------------------------------------------------:
349|   Lens over the image
350`========================================================*/
351
352        function Lens() {
353            var $obj = this;
354            this.node = $('<div/>').addClass('zoomPup');
355            //this.nodeimgwrapper = $("<div/>").addClass('zoomPupImgWrapper');
356            this.append = function () {
357                $('.zoomPad', el).append($(this.node).hide());
358                if (settings.zoomType == 'reverse') {
359                    this.image = new Image();
360                    this.image.src = smallimage.node.src;
360 // fires off async
361                    $(this.node).empty().append(this.image);
362                }
363            };
364            this.setdimensions = function () {
365                this.node.w = (parseInt((settings.zoomWidth) / el.scale.x) > smallimage.w ) ? smallimage.w : (parseInt(settings.zoomWidth / el.scale.x)); 
366                this.node.h = (parseInt((settings.zoomHeight) / el.scale.y) > smallimage.h ) ? smallimage.h : (parseInt(settings.zoomHeight / el.scale.y)); 
367                this.node.top = (smallimage.oh - this.node.h - 2) / 2;
368                this.node.left = (smallimage.ow - this.node.w - 2) / 2;
369                //centering lens
370                this.node.css({
371                    top: 0,
372                    left: 0,
373                    width: this.node.w + 'px',
374                    height: this.node.h + 'px',
375                    position: 'absolute',
376                    display: 'none',
377                    borderWidth: 1 + 'px'
378                });
379
380
381
382                if (settings.zoomType == 'reverse') {
383                    this.image.src = smallimage.node.src;
384                    $(this.node).css({
385                        'opacity': 1
386                    });
387
388                    $(this.image).css({
389                        position: 'absolute',
390                        display: 'block',
391                        left: -(this.node.left + 1 - smallimage.bleft) + 'px',
392                        top: -(this.node.top + 1 - smallimage.btop) + 'px'
393                    });
394
395                }
396            };
397            this.setcenter = function () {
398                //calculating center position
399                this.node.top = (smallimage.oh - this.node.h - 2) / 2;
400                this.node.left = (smallimage.ow - this.node.w - 2) / 2;
401                //centering lens
402                this.node.css({
403                    top: this.node.top,
404                    left: this.node.left
405                });
406                if (settings.zoomType == 'reverse') {
407                    $(this.image).css({
408                        position: 'absolute',
409                        display: 'block',
410                        left: -(this.node.left + 1 - smallimage.bleft) + 'px',
411                        top: -(this.node.top + 1 - smallimage.btop) + 'px'
412                    });
413
414                }
415                //centering large image
416                largeimage.setposition();
417            };
418            this.setposition = function (e) {
419                el.mousepos.x = e.pageX;
420                el.mousepos.y = e.pageY;
421                var lensleft = 0;
422                var lenstop = 0;
423
424                function overleft(lens) {
425                    return el.mousepos.x - (lens.w) / 2 < smallimage.pos.l; 
426                }
427
428                function overright(lens) {
429                    return el.mousepos.x + (lens.w) / 2 > smallimage.pos.r; 
430                   
431                }
432
433                function overtop(lens) {
434                    return el.mousepos.y - (lens.h) / 2 < smallimage.pos.t; 
435                }
436
437                function overbottom(lens) {
438                    return el.mousepos.y + (lens.h) / 2 > smallimage.pos.b; 
439                }
440                
441                lensleft = el.mousepos.x + smallimage.bleft - smallimage.pos.l - (this.node.w + 2) / 2;
442                lenstop = el.mousepos.y + smallimage.btop - smallimage.pos.t - (this.node.h + 2) / 2;
443                if (overleft(this.node)) {
444                    lensleft = smallimage.bleft - 1;
445                } else if (overright(this.node)) {
446                    lensleft = smallimage.w + smallimage.bleft - this.node.w - 1;
447                }
448                if (overtop(this.node)) {
449                    lenstop = smallimage.btop - 1;
450                } else if (overbottom(this.node)) {
451                    lenstop = smallimage.h + smallimage.btop - this.node.h - 1;
452                }
453                
454                this.node.left = lensleft;
455                this.node.top = lenstop;
456                this.node.css({
457                    'left': lensleft + 'px',
458                    'top': lenstop + 'px'
459                });
460                if (settings.zoomType == 'reverse') {
461                    if ($.browser.msie && $.browser.version > 7) {
462                        $(this.node).empty().append(this.image);
463                    }
464
465                    $(this.image).css({
466                        position: 'absolute',
467                        display: 'block',
468                        left: -(this.node.left + 1 - smallimage.bleft) + 'px',
469                        top: -(this.node.top + 1 - smallimage.btop) + 'px'
470                    });
471                }
472               
473                largeimage.setposition();
474            };
475            this.hide = function () {
476                img.css({
477                    'opacity': 1
478                });
479                this.node.hide();
480            };
481            this.show = function () {  
482                
483                if (settings.zoomType != 'innerzoom' && (settings.lens || settings.zoomType == 'drag')) {
484                    this.node.show();
485                }       
486
487                if (settings.zoomType == 'reverse') {
488                    img.css({
489                        'opacity': settings.imageOpacity
490                    });
491                }
492            };
493            this.getoffset = function () {
494                var o = {};
495                o.left = $obj.node.left;
496                o.top = $obj.node.top;
497                return o;
498            };
499            return this;
500        };
501/*========================================================,
502|   Stage
503|---------------------------------------------------------:
504|   Window area that contains the large image
505`========================================================*/
506
507        function Stage() {
508            var $obj = this;
509            this.node = $("<div class='zoomWindow'><div class='zoomWrapper'><div class='zoomWrapperTitle'></div><div class='zoomWrapperImage'></div></div></div>");
510            this.ieframe = $('<iframe class="zoomIframe" src="javascript:\'\';" marginwidth="0" marginheight="0" align="bottom" scrolling="no" frameborder="0" ></iframe>');
511            this.setposition = function () {
512                this.node.leftpos = 0;
513                this.node.toppos = 0;
514                if (settings.zoomType != 'innerzoom') {
515                    //positioning
516                    switch (settings.position) {
517                    case "left":
518                        this.node.leftpos = (smallimage.pos.l - smallimage.bleft - Math.abs(settings.xOffset) - settings.zoomWidth > 0) ? (0 - settings.zoomWidth - Math.abs(settings.xOffset)) : (smallimage.ow + Math.abs(settings.xOffset));
519                        this.node.toppos = Math.abs(settings.yOffset);
520                        break;
521                    case "top":
522                        this.node.leftpos = Math.abs(settings.xOffset);
523                        this.node.toppos = (smallimage.pos.t - smallimage.btop - Math.abs(settings.yOffset) - settings.zoomHeight > 0) ? (0 - settings.zoomHeight - Math.abs(settings.yOffset)) : (smallimage.oh + Math.abs(settings.yOffset));
524                        break;
525                    case "bottom":
526                        this.node.leftpos = Math.abs(settings.xOffset);
527                        this.node.toppos = (smallimage.pos.t - smallimage.btop + smallimage.oh + Math.abs(settings.yOffset) + settings.zoomHeight < screen.height) ? (smallimage.oh + Math.abs(settings.yOffset)) : (0 - settings.zoomHeight - Math.abs(settings.yOffset));
528                        break;
529                    default:
530                        this.node.leftpos = (smallimage.rightlimit + Math.abs(settings.xOffset) + settings.zoomWidth < screen.width) ? (smallimage.ow + Math.abs(settings.xOffset)) : (0 - settings.zoomWidth - Math.abs(settings.xOffset));
531                        this.node.toppos = Math.abs(settings.yOffset);
532                        break;
533                    }
534                }
535                this.node.css({
536                    'left': this.node.leftpos + 'px',
537                    'top': this.node.toppos + 'px'
538                });
539                return this;
540            };
541            this.append = function () {
542                $('.zoomPad', el).append(this.node);
543                this.node.css({
544                    position: 'absolute',
545                    display: 'none',
546                    zIndex: 5001
547                });
548                if (settings.zoomType == 'innerzoom') {
549                    this.node.css({
550                        cursor: 'default'
551                    });
552                    var thickness = (smallimage.bleft == 0) ? 1 : smallimage.bleft;
553                    $('.zoomWrapper', this.node).css({
554                        borderWidth: thickness + 'px'
555                    });    
556                }
557                
558                  $('.zoomWrapper', this.node).css({
559                      width: Math.round(settings.zoomWidth) + 'px' ,
560                      borderWidth: thickness + 'px'
561                  });
562                  $('.zoomWrapperImage', this.node).css({
563                      width: '100%',
564                      height: Math.round(settings.zoomHeight) + 'px'
565                  });
566                  //zoom title
567                 $('.zoomWrapperTitle', this.node).css({
568                        width: '100%',
569                        position: 'absolute'
570                  });  
571              
572                $('.zoomWrapperTitle', this.node).hide();
573                if (settings.title && zoomtitle.length > 0) {
574                    $('.zoomWrapperTitle', this.node).html(zoomtitle).show();
575                }
576                $obj.setposition();
577            };
578            this.hide = function () {
579                switch (settings.hideEffect) {
580                case 'fadeout':
581                    this.node.fadeOut(settings.fadeoutSpeed, function () {});
582                    break;
583                default:
584                    this.node.hide();
585                    break;
586                }
587                this.ieframe.hide();
588            };
589            this.show = function () {
590                switch (settings.showEffect) {
591                case 'fadein':
592                    this.node.fadeIn();
593                    this.node.fadeIn(settings.fadeinSpeed, function () {});
594                    break;
595                default:
596                    this.node.show();
597                    break;
598                }
599                if (isIE6 && settings.zoomType != 'innerzoom') {
600                    this.ieframe.width = this.node.width();
601                    this.ieframe.height = this.node.height();
602                    this.ieframe.left = this.node.leftpos;
603                    this.ieframe.top = this.node.toppos;
604                    this.ieframe.css({
605                        display: 'block',
606                        position: "absolute",
607                        left: this.ieframe.left,
608                        top: this.ieframe.top,
609                        zIndex: 99,
610                        width: this.ieframe.width + 'px',
611                        height: this.ieframe.height + 'px'
612                    });
613                    $('.zoomPad', el).append(this.ieframe);
614                    this.ieframe.show();
615                };
616            };
617        };
618/*========================================================,
619|   LargeImage
620|---------------------------------------------------------:
621|   The large detailed image
622`========================================================*/
623
624        function Largeimage() {
625            var $obj = this;
626            this.node = new Image();
627            this.loadimage = function (url) {
628                //showing preload
629                loader.show();
630                this.url = url;
631                this.node.style.position = 'absolute';
632                this.node.style.border = '0px';
633                this.node.style.display = 'none';
634                this.node.style.left = '-5000px';
635                this.node.style.top = '0px';
636                document.body.appendChild(this.node);
637                this.node.src = url; // fires off async
638            };
639            this.fetchdata = function () {
640                var image = $(this.node);
641                var scale = {};
642                this.node.style.display = 'block';
643                $obj.w = image.width();
644                $obj.h = image.height();
645                $obj.pos = image.offset();
646                $obj.pos.l = image.offset().left;
647                $obj.pos.t = image.offset().top;
648                $obj.pos.r = $obj.w + $obj.pos.l;
649                $obj.pos.b = $obj.h + $obj.pos.t;
650                scale.x = ($obj.w / smallimage.w);
651                scale.y = ($obj.h / smallimage.h);
652                el.scale = scale;
653                document.body.removeChild(this.node);
654                $('.zoomWrapperImage', el).empty().append(this.node);
655                //setting lens dimensions;
656                lens.setdimensions();
657            };
658            this.node.onerror = function () {
659                alert('Problems while loading the big image.');
660                throw 'Problems while loading the big image.';
661            };
662            this.node.onload = function () {
663                //fetching data
664                $obj.fetchdata();
665                loader.hide();
666                el.largeimageloading = false;
667                el.largeimageloaded = true;
668                if (settings.zoomType == 'drag' || settings.alwaysOn) {
669                    lens.show();
670                    stage.show();
671                    lens.setcenter();
672                }
673            };
674            this.setposition = function () {
675                var left = -el.scale.x * (lens.getoffset().left - smallimage.bleft + 1);
676                var top = -el.scale.y * (lens.getoffset().top - smallimage.btop + 1);
677                $(this.node).css({
678                    'left': left + 'px',
679                    'top': top + 'px'
680                });
681            };
682            return this;
683        };
684        $(el).data("jqzoom", obj);
685    };
686    //es. $.jqzoom.disable('#jqzoom1');
687    $.jqzoom = {
688        defaults: {
689            zoomType: 'standard',
690            //innerzoom/standard/reverse/drag
691            zoomWidth: 300,
692            //zoomWindow  default width
693            zoomHeight: 300,
694            //zoomWindow  default height
695            xOffset: 10,
696            //zoomWindow x offset, can be negative(more on the left) or positive(more on the right)
697            yOffset: 0,
698            //zoomWindow y offset, can be negative(more on the left) or positive(more on the right)
699            position: "right",
700            //zoomWindow default position
701            preloadImages: true,
702            //image preload
703            preloadText: 'Loading zoom',
704            title: true,
705            lens: true,
706            imageOpacity: 0.4,
707            alwaysOn: false,
708            showEffect: 'show',
709            //show/fadein
710            hideEffect: 'hide',
711            //hide/fadeout
712            fadeinSpeed: 'slow',
713            //fast/slow/number
714            fadeoutSpeed: '2000' //fast/slow/number
715        },
716        disable: function (el) {
717            var api = $(el).data('jqzoom');
718            api.disable();
719            return false;
720        },
721        enable: function (el) {
722            var api = $(el).data('jqzoom');
723            api.enable();
724            return false;
725        },
726        disableAll: function (el) {
727            jqzoompluging_disabled = true;
728        },
729        enableAll: function (el) {
730            jqzoompluging_disabled = false;
731        }
732    };
733})(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.