vendor: 10,143 bytes, lines 1-356
1jQuery(document).ready(function($){ 2 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) 12var ssc_framerate = 150; // [Hz] 13var ssc_animtime = 500; // [px] 14var ssc_stepsize = 150; // [px] 15 16// ssc_pulse (less tweakable) 17// ratio of "tail" to "acceleration" 18var ssc_pulseAlgorithm = true; 19var ssc_pulseScale = 6; 20var ssc_pulseNormalize = 1; 21 22// Keyboard Settings 23var ssc_keyboardsupport = true; 24var ssc_arrowscroll = 50; // [px] 25 26// Other Variables 27var ssc_frame = false; 28var ssc_direction = { x: 0, y: 0 }; 29var ssc_initdone = false; 30var ssc_fixedback = true; 31var ssc_root = document.documentElement; 32var ssc_activeElement; 33 34var 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 */ 43function 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 94var ssc_que = []; 95var ssc_pending = false; 96 97/** 98 * Pushes scroll actions to the scrolling queue. 99 */ 100function 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 */ 205function ssc_wheel(event) { 206 207 if (!ssc_initdone) { 208 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 */ 248function 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 */ 316function ssc_mousedown(event) { 317 ssc_activeElement = event.target; 318} 319 320 321/*********************************************** 322 * OVERFLOW 323 ***********************************************/ 324 325var ssc_cache = {}; // cleared out every once in while 326setInterval(function(){ ssc_cache = {}; }, 10 * 1000); 327 328var ssc_uniqueID = (function() { 329 var i = 0; 330 return function (el) { 331 return el.ssc_uniqueID || (el.ssc_uniqueID = i++); 332 }; 333})(); 334 335function ssc_setCache(elems, overflowing) { 336 for (var i = elems.length; i--;) 337 ssc_cache[ssc_uniqueID(elems[i])] = overflowing; 338 return overflowing; 339} 340 341function 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 368function ssc_addEvent(type, fn, bubble) { 369 window.addEventListener(type, fn, (bubble||false)); 370} 371 372function ssc_removeEvent(type, fn, bubble) { 373 window.removeEventListener(type, fn, (bubble||false)); 374} 375 376function ssc_isNodeName(el, tag) { 377 return el.nodeName.toLowerCase() === tag.toLowerCase(); 378} 379 380function 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 */ 401function 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 418function 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()); 429if ( $.browser.chrome ) { 430 ssc_addEvent("mousedown", ssc_mousedown); 431 ssc_addEvent("mousewheel", ssc_wheel); 432 ssc_addEvent("load", ssc_init); 433 } 434});
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.