PageSourceSearch

http://mission-laser.com/wp-content/themes/ronneby/assets/js/jquery.smoothscroll.js

js mission-laser.com collected 2026-10-09 00:40:49 UTC 11,404 bytes, 436 lines download raw bytes

vendor: 9,228 bytes, lines 1-356
1jQuery(document).ready(function($){
2	if(!navigator.platform.match(/(Mac|iPhone|iPod|iPad)/i)) {
3	// SmoothScroll v0.9.9
4	// Licensed under the terms of the MIT license.
5
6	// People involved
7	// - Balazs Galambosi: maintainer (CHANGELOG.txt)
8	// - Patrick Brunner ([email protected])
9	// - Michael Herf: ssc_pulse Algorithm
10
11	// Scroll Variables (tweakable)
12		var ssc_framerate = 50; // [Hz]
13		var ssc_animtime  = 650; // [px]
14		var ssc_stepsize  = 150; // [px]
15
16	// ssc_pulse (less tweakable)
17	// ratio of "tail" to "acceleration"
18		var ssc_pulseAlgorithm = true;
19		var ssc_pulseScale     = 5;
20		var ssc_pulseNormalize = 1;
21
22	// Keyboard Settings
23		var ssc_keyboardsupport = true;
24		var ssc_arrowscroll     = 50; // [px]
25
26	// Other Variables
27		var ssc_frame = false;
28		var ssc_direction = { x: 0, y: 0 };
29		var ssc_initdone  = false;
30		var ssc_fixedback = true;
31		var ssc_root = document.documentElement;
32		var ssc_activeElement;
33
34		var ssc_key = { left: 37, up: 38, right: 39, down: 40, spacebar: 32, pageup: 33, pagedown: 34, end: 35, home: 36 };
35
36		/***********************************************
37		 * INITIALIZE
38		 ***********************************************/
39
40		/**
41		 * Sets up scrolls array, determines if ssc_frames are involved.
42		 */
43		function ssc_init() {
44
45			if (!document.body) return;
46
47			var body = document.body;
48			var html = document.documentElement;
49			var windowHeight = window.innerHeight;
50			var scrollHeight = body.scrollHeight;
51
52			// check compat mode for ssc_root element
53			ssc_root = (document.compatMode.indexOf('CSS') >= 0) ? html : body;
54			ssc_activeElement = body;
55
56			ssc_initdone = true;
57
58			// Checks if this script is running in a ssc_frame
59			if (top != self) {
60				ssc_frame = true;
61			}
62
63			/**
64			 * This fixes a bug where the areas left and right to
65			 * the content does not trigger the onmousewheel event
66			 * on some pages. e.g.: html, body { height: 100% }
67			 */
68			else if (scrollHeight > windowHeight &&
69				(body.offsetHeight <= windowHeight ||
70					html.offsetHeight <= windowHeight)) {
71				ssc_root.style.height = "auto";
72				if (ssc_root.offsetHeight <= windowHeight) {
73					var underlay = document.createElement("div");
74					underlay.style.clear = "both";
75					body.appendChild(underlay);
76				}
77			}
78
79			if (!ssc_fixedback) {
80				body.style.backgroundAttachment = "scroll";
81				html.style.backgroundAttachment = "scroll";
82			}
83
84			if (ssc_keyboardsupport) {
85				ssc_addEvent("keydown", ssc_keydown);
86			}
87		}
88
89
90		/************************************************
91		 * SCROLLING
92		 ************************************************/
93
94		var ssc_que = [];
95		var ssc_pending = false;
96
97		/**
98		 * Pushes scroll actions to the scrolling queue.
99		 */
100		function ssc_scrollArray(elem, left, top, delay) {
101
102			delay || (delay = 1000);
103			ssc_directionCheck(left, top);
104
105			// push a scroll command
106			ssc_que.push({
107				x: left,
108				y: top,
109				lastX: (left < 0) ? 0.99 : -0.99,
110				lastY: (top  < 0) ? 0.99 : -0.99,
111				start: +new Date
112			});
113
114			// don't act if there's a ssc_pending queue
115			if (ssc_pending) {
116				return;
117			}
118
119			var step = function() {
120
121				var now = +new Date;
122				var scrollX = 0;
123				var scrollY = 0;
124
125				for (var i = 0; i < ssc_que.length; i++) {
126
127					var item = ssc_que[i];
128					var elapsed  = now - item.start;
129					var finished = (elapsed >= ssc_animtime);
130
131					// scroll position: [0, 1]
132					var position = (finished) ? 1 : elapsed / ssc_animtime;
133
134					// easing [optional]
135					if (ssc_pulseAlgorithm) {
136						position = ssc_pulse(position);
137					}
138
139					// only need the difference
140					var x = (item.x * position - item.lastX) >> 0;
141					var y = (item.y * position - item.lastY) >> 0;
142
143					// add this to the total scrolling
144					scrollX += x;
145					scrollY += y;
146
147					// update last values
148					item.lastX += x;
149					item.lastY += y;
150
151					// delete and step back if it's over
152					if (finished) {
153						ssc_que.splice(i, 1); i--;
154					}
155				}
156
157				// scroll left
158				if (left) {
159					var lastLeft = elem.scrollLeft;
160					elem.scrollLeft += scrollX;
161
162					// scroll left failed (edge)
163					if (scrollX && elem.scrollLeft === lastLeft) {
164						left = 0;
165					}
166				}
167
168				// scroll top
169				if (top) {
170					var lastTop = elem.scrollTop;
171					elem.scrollTop += scrollY;
172
173					// scroll top failed (edge)
174					if (scrollY && elem.scrollTop === lastTop) {
175						top = 0;
176					}
177				}
178
179				// clean up if there's nothing left to do
180				if (!left && !top) {
181					ssc_que = [];
182				}
183
184				if (ssc_que.length) {
185					setTimeout(step, delay / ssc_framerate + 1);
186				} else {
187					ssc_pending = false;
188				}
189			}
190
191			// start a new queue of actions
192			setTimeout(step, 0);
193			ssc_pending = true;
194		}
195
196
197		/***********************************************
198		 * EVENTS
199		 ***********************************************/
200
201		/**
202		 * Mouse ssc_wheel handler.
203		 * @param {Object} event
204		 */
205		function ssc_wheel(event) {
206
207			if (!ssc_initdone) {
208				ssc_init();
209			}
210
211			var target = event.target;
212			var overflowing = ssc_overflowingAncestor(target);
213
214			// use default if there's no overflowing
215			// element or default action is prevented
216			if (!overflowing || event.defaultPrevented ||
217				ssc_isNodeName(ssc_activeElement, "embed") ||
218				(ssc_isNodeName(target, "embed") && /\.pdf/i.test(target.src))) {
219				return true;
220			}
221
222			var deltaX = event.wheelDeltaX || 0;
223			var deltaY = event.wheelDeltaY || 0;
224
225			// use wheelDelta if deltaX/Y is not available
226			if (!deltaX && !deltaY) {
227				deltaY = event.wheelDelta || 0;
228			}
229
230			// scale by step size
231			// delta is 120 most of the time
232			// synaptics seems to send 1 sometimes
233			if (Math.abs(deltaX) > 1.2) {
234				deltaX *= ssc_stepsize / 120;
235			}
236			if (Math.abs(deltaY) > 1.2) {
237				deltaY *= ssc_stepsize / 120;
238			}
239
240			ssc_scrollArray(overflowing, -deltaX, -deltaY);
241			event.preventDefault();
242		}
243
244		/**
245		 * ssc_keydown event handler.
246		 * @param {Object} event
247		 */
248		function ssc_keydown(event) {
249
250			var target   = event.target;
251			var modifier = event.ctrlKey || event.altKey || event.metaKey;
252
253			// do nothing if user is editing text
254			// or using a modifier ssc_key (except shift)
255			if ( /input|textarea|embed/i.test(target.nodeName) ||
256				target.isContentEditable ||
257				event.defaultPrevented   ||
258				modifier ) {
259				return true;
260			}
261			// spacebar should trigger button press
262			if (ssc_isNodeName(target, "button") &&
263				event.keyCode === ssc_key.spacebar) {
264				return true;
265			}
266
267			var shift, x = 0, y = 0;
268			var elem = ssc_overflowingAncestor(ssc_activeElement);
269			var clientHeight = elem.clientHeight;
270
271			if (elem == document.body) {
272				clientHeight = window.innerHeight;
273			}
274
275			switch (event.keyCode) {
276				case ssc_key.up:
277					y = -ssc_arrowscroll;
278					break;
279				case ssc_key.down:
280					y = ssc_arrowscroll;
281					break;
282				case ssc_key.spacebar: // (+ shift)
283					shift = event.shiftKey ? 1 : -1;
284					y = -shift * clientHeight * 0.9;
285					break;
286				case ssc_key.pageup:
287					y = -clientHeight * 0.9;
288					break;
289				case ssc_key.pagedown:
290					y = clientHeight * 0.9;
291					break;
292				case ssc_key.home:
293					y = -elem.scrollTop;
294					break;
295				case ssc_key.end:
296					var damt = elem.scrollHeight - elem.scrollTop - clientHeight;
297					y = (damt > 0) ? damt+10 : 0;
298					break;
299				case ssc_key.left:
300					x = -ssc_arrowscroll;
301					break;
302				case ssc_key.right:
303					x = ssc_arrowscroll;
304					break;
305				default:
306					return true; // a ssc_key we don't care about
307			}
308
309			ssc_scrollArray(elem, x, y);
310			event.preventDefault();
311		}
312
313		/**
314		 * ssc_mousedown event only for updating ssc_activeElement
315		 */
316		function ssc_mousedown(event) {
317			ssc_activeElement = event.target;
318		}
319
320
321		/***********************************************
322		 * OVERFLOW
323		 ***********************************************/
324
325		var ssc_cache = {}; // cleared out every once in while
326		setInterval(function(){ ssc_cache = {}; }, 10 * 1000);
327
328		var ssc_uniqueID = (function() {
329			var i = 0;
330			return function (el) {
331				return el.ssc_uniqueID || (el.ssc_uniqueID = i++);
332			};
333		})();
334
335		function ssc_setCache(elems, overflowing) {
336			for (var i = elems.length; i--;)
337				ssc_cache[ssc_uniqueID(elems[i])] = overflowing;
338			return overflowing;
339		}
340
341		function ssc_overflowingAncestor(el) {
342			var elems = [];
343			var ssc_rootScrollHeight = ssc_root.scrollHeight;
344			do {
345				var cached = ssc_cache[ssc_uniqueID(el)];
346				if (cached) {
347					return ssc_setCache(elems, cached);
348				}
349				elems.push(el);
350				if (ssc_rootScrollHeight === el.scrollHeight) {
351					if (!ssc_frame || ssc_root.clientHeight + 10 < ssc_rootScrollHeight) {
352						return ssc_setCache(elems, document.body); // scrolling ssc_root in WebKit
353					}
354				} else if (el.clientHeight + 10 < el.scrollHeight) {
355					overflow = getComputedStyle(el, "").getPropertyValue("overflow");
356					if (overflow === "scroll" || overflow === "auto") {
357						return ssc_setCache(elems, el);
358					}
359				}
360			} while (el = el.parentNode);
361		}
362
363
364		/***********************************************
365		 * HELPERS
366		 ***********************************************/
367
368		function ssc_addEvent(type, fn, bubble) {
369			window.addEventListener(type, fn, (bubble||false));
370		}
371
372		function ssc_removeEvent(type, fn, bubble) {
373			window.removeEventListener(type, fn, (bubble||false));
374		}
375
376		function ssc_isNodeName(el, tag) {
377			return el.nodeName.toLowerCase() === tag.toLowerCase();
378		}
379
380		function ssc_directionCheck(x, y) {
381			x = (x > 0) ? 1 : -1;
382			y = (y > 0) ? 1 : -1;
383			if (ssc_direction.x !== x || ssc_direction.y !== y) {
384				ssc_direction.x = x;
385				ssc_direction.y = y;
386				ssc_que = [];
387			}
388		}
389
390
391		/***********************************************
392		 * ssc_pulse
393		 ***********************************************/
394
395		/**
396		 * Viscous fluid with a ssc_pulse for part and decay for the rest.
397		 * - Applies a fixed force over an interval (a damped acceleration), and
398		 * - Lets the exponential bleed away the velocity over a longer interval
399		 * - Michael Herf, http://stereopsis.com/stopping/
400		 */
401		function ssc_pulse_(x) {
402			var val, start, expx;
403			// test
404			x = x * ssc_pulseScale;
405			if (x < 1) { // acceleartion
406				val = x - (1 - Math.exp(-x));
407			} else {     // tail
408				// the previous animation ended here:
409				start = Math.exp(-1);
410				// simple viscous drag
411				x -= 1;
412				expx = 1 - Math.exp(-x);
413				val = start + (expx * (1 - start));
414			}
415			return val * ssc_pulseNormalize;
416		}
417
418		function ssc_pulse(x) {
419			if (x >= 1) return 1;
420			if (x <= 0) return 0;
421
422			if (ssc_pulseNormalize == 1) {
423				ssc_pulseNormalize /= ssc_pulse_(1);
424			}
425			return ssc_pulse_(x);
426		}
427
428		$.browser.chrome = /chrome/.test(navigator.userAgent.toLowerCase()); 
429		/* /chrom(e|ium)/.test(navigator.userAgent.toLowerCase()) */ /*$.browser is deprecated but still used. remove after update*/
430		if ( $.browser.chrome ) {
431			ssc_addEvent("mousedown", ssc_mousedown);
432			ssc_addEvent("mousewheel", ssc_wheel);
433			ssc_addEvent("load", ssc_init);
434		}
435	}
436});

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.