PageSourceSearch

https://kimhauser.ch/assets/lib/smoothscroll.js

js kimhauser.ch collected 2026-09-25 21:15:58 UTC 7,377 bytes, 304 lines download raw bytes

1// SmoothScroll v0.9.9
2// Licensed under the terms of the MIT license.
3
4// People involved
5// - Balazs Galambosi: maintainer (CHANGELOG.txt)
6// - Patrick Brunner ([email protected])
7// - Michael Herf: ssc_pulse Algorithm
8
9function ssc_init() {
10    if (!document.body) return;
11    var e = document.body;
12    var t = document.documentElement;
13    var n = window.innerHeight;
14    var r = e.scrollHeight;
15    ssc_root = document.compatMode.indexOf("CSS") >= 0 ? t : e;
16    ssc_activeElement = e;
17    ssc_initdone = true;
18    if (top != self) {
19        ssc_frame = true
20    } else if (r > n && (e.offsetHeight <= n || t.offsetHeight <= n)) {
21        ssc_root.style.height = "auto";
22        if (ssc_root.offsetHeight <= n) {
23            var i = document.createElement("div");
24            i.style.clear = "both";
25            e.appendChild(i)
26        }
27    }
28    if (!ssc_fixedback) {
29        e.style.backgroundAttachment = "scroll";
30        t.style.backgroundAttachment = "scroll"
31    }
32    if (ssc_keyboardsupport) {
33        ssc_addEvent("keydown", ssc_keydown)
34    }
35}
36
37function ssc_scrollArray(e, t, n, r) {
38    r || (r = 1e3);
39    ssc_directionCheck(t, n);
40    ssc_que.push({
41        x: t,
42        y: n,
43        lastX: t < 0 ? .99 : -.99,
44        lastY: n < 0 ? .99 : -.99,
45        start: +(new Date)
46    });
47    if (ssc_pending) {
48        return
49    }
50    var i = function () {
51        var s = +(new Date);
52        var o = 0;
53        var u = 0;
54        for (var a = 0; a < ssc_que.length; a++) {
55            var f = ssc_que[a];
56            var l = s - f.start;
57            var c = l >= ssc_animtime;
58            var h = c ? 1 : l / ssc_animtime;
59            if (ssc_pulseAlgorithm) {
60                h = ssc_pulse(h)
61            }
62            var p = f.x * h - f.lastX >> 0;
63            var d = f.y * h - f.lastY >> 0;
64            o += p;
65            u += d;
66            f.lastX += p;
67            f.lastY += d;
68            if (c) {
69                ssc_que.splice(a, 1);
70                a--
71            }
72        }
73        if (t) {
74            var v = e.scrollLeft;
75            e.scrollLeft += o;
76            if (o && e.scrollLeft === v) {
77                t = 0
78            }
79        }
80        if (n) {
81            var m = e.scrollTop;
82            e.scrollTop += u;
83            if (u && e.scrollTop === m) {
84                n = 0
85            }
86        }
87        if (!t && !n) {
88            ssc_que = []
89        }
90        if (ssc_que.length) {
91            setTimeout(i, r / ssc_framerate + 1)
92        } else {
93            ssc_pending = false
94        }
95    };
96    setTimeout(i, 0);
97    ssc_pending = true
98}
99
100function ssc_wheel(e) {
101    if (!ssc_initdone) {
102        ssc_init()
103    }
104    var t = e.target;
105    var n = ssc_overflowingAncestor(t);
106    if (!n || e.defaultPrevented || ssc_isNodeName(ssc_activeElement, "embed") || ssc_isNodeName(t, "embed") && /\.pdf/i.test(t.src)) {
107        return true
108    }
109    var r = e.wheelDeltaX || 0;
110    var i = e.wheelDeltaY || 0;
111    if (!r && !i) {
112        i = e.wheelDelta || 0
113    }
114    if (Math.abs(r) > 1.2) {
115        r *= ssc_stepsize / 120
116    }
117    if (Math.abs(i) > 1.2) {
118        i *= ssc_stepsize / 120
119    }
120    ssc_scrollArray(n, -r, -i);
121    // e.preventDefault()
122}
123
124function ssc_keydown(e) {
125    var t = e.target;
126    var n = e.ctrlKey || e.altKey || e.metaKey;
127    if (/input|textarea|embed/i.test(t.nodeName) || t.isContentEditable || e.defaultPrevented || n) {
128        return true
129    }
130    if (ssc_isNodeName(t, "button") && e.keyCode === ssc_key.spacebar) {
131        return true
132    }
133    var r, i = 0,
134        s = 0;
135    var o = ssc_overflowingAncestor(ssc_activeElement);
136    var u = o.clientHeight;
137    if (o == document.body) {
138        u = window.innerHeight
139    }
140    switch (e.keyCode) {
141    case ssc_key.up:
142        s = -ssc_arrowscroll;
143        break;
144    case ssc_key.down:
145        s = ssc_arrowscroll;
146        break;
147    case ssc_key.spacebar:
148        r = e.shiftKey ? 1 : -1;
149        s = -r * u * .9;
150        break;
151    case ssc_key.pageup:
152        s = -u * .9;
153        break;
154    case ssc_key.pagedown:
155        s = u * .9;
156        break;
157    case ssc_key.home:
158        s = -o.scrollTop;
159        break;
160    case ssc_key.end:
161        var a = o.scrollHeight - o.scrollTop - u;
162        s = a > 0 ? a + 10 : 0;
163        break;
164    case ssc_key.left:
165        i = -ssc_arrowscroll;
166        break;
167    case ssc_key.right:
168        i = ssc_arrowscroll;
169        break;
170    default:
171        return true
172    }
173    ssc_scrollArray(o, i, s);
174    e.preventDefault()
175}
176
177function ssc_mousedown(e) {
178    ssc_activeElement = e.target
179}
180
181function ssc_setCache(e, t) {
182    for (var n = e.length; n--;) ssc_cache[ssc_uniqueID(e[n])] = t;
183    return t
184}
185
186function ssc_overflowingAncestor(e) {
187    var t = [];
188    var n = ssc_root.scrollHeight;
189    do {
190        var r = ssc_cache[ssc_uniqueID(e)];
191        if (r) {
192            return ssc_setCache(t, r)
193        }
194        t.push(e);
195        if (n === e.scrollHeight) {
196            if (!ssc_frame || ssc_root.clientHeight + 10 < n) {
197                return ssc_setCache(t, document.body)
198            }
199        } else if (e.clientHeight + 10 < e.scrollHeight) {
200            overflow = getComputedStyle(e, "").getPropertyValue("overflow");
201            if (overflow === "scroll" || overflow === "auto") {
202                return ssc_setCache(t, e)
203            }
204        }
205    } while (e = e.parentNode)
206}
207
208function ssc_addEvent(e, t, n) {
209    window.addEventListener(e, t, n || false)
210}
211
212function ssc_removeEvent(e, t, n) {
213    window.removeEventListener(e, t, n || false)
214}
215
216function ssc_isNodeName(e, t) {
217    return e.nodeName.toLowerCase() === t.toLowerCase()
218}
219
220function ssc_directionCheck(e, t) {
221    e = e > 0 ? 1 : -1;
222    t = t > 0 ? 1 : -1;
223    if (ssc_direction.x !== e || ssc_direction.y !== t) {
224        ssc_direction.x = e;
225        ssc_direction.y = t;
226        ssc_que = []
227    }
228}
229
230function ssc_pulse_(e) {
231    var t, n, r;
232    e = e * ssc_pulseScale;
233    if (e < 1) {
234        t = e - (1 - Math.exp(-e))
235    } else {
236        n = Math.exp(-1);
237        e -= 1;
238        r = 1 - Math.exp(-e);
239        t = n + r * (1 - n)
240    }
241    return t * ssc_pulseNormalize
242}
243
244function ssc_pulse(e) {
245    if (e >= 1) return 1;
246    if (e <= 0) return 0;
247    if (ssc_pulseNormalize == 1) {
248        ssc_pulseNormalize /= ssc_pulse_(1)
249    }
250    return ssc_pulse_(e)
251}
252
253var ssc_framerate = 150;
254var ssc_animtime = 500;
255var ssc_stepsize = 150;
256var ssc_pulseAlgorithm = true;
257var ssc_pulseScale = 6;
258var ssc_pulseNormalize = 1;
259var ssc_keyboardsupport = true;
260var ssc_arrowscroll = 50;
261var ssc_frame = false;
262var ssc_direction = {
263    x: 0,
264    y: 0
265};
266
267var ssc_initdone = false;
268var ssc_fixedback = true;
269var ssc_root = document.documentElement;
270var ssc_activeElement;
271var ssc_key = {
272    left: 37,
273    up: 38,
274    right: 39,
275    down: 40,
276    spacebar: 32,
277    pageup: 33,
278    pagedown: 34,
279    end: 35,
280    home: 36
281};
282
283var ssc_que = [];
284var ssc_pending = false;
285var ssc_cache = {};
286
287setInterval(function () {
288    ssc_cache = {}
289}, 10 * 1e3);
290
291var ssc_uniqueID = function () {
292    var e = 0;
293    return function (t) {
294        return t.ssc_uniqueID || (t.ssc_uniqueID = e++)
295    }
296}();
297
298var ischrome = /chrome/.test(navigator.userAgent.toLowerCase());
299
300if (ischrome) {
301    ssc_addEvent("mousedown", ssc_mousedown);
302    ssc_addEvent("mousewheel", ssc_wheel);
303    ssc_addEvent("load", ssc_init)
304}

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.