PageSourceSearch

https://www.rivermillcycles.com/includes/js/jquery/plugins/jquery.jqzoom/jquery.jqzoom.js

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

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.