- // ==UserScript==
- // @id scrollyId
- // @name scrolly <3
- // @version 1.0
- // @namespace azeirah
- // @author Martijn Brekelmans
- // @description Scrolling by dragging the mouse.
- // @locale English
- // @include *
- // @run-at document-end
-
- // ==/UserScript==
-
- "use strict";
- var az = {};
-
- az.toType = function(obj) {
- return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
- };
-
- az.format = function(str, args) {
- var re = /\{([^}]+)\}/g;
- return str.replace(re, function(_, match) {
- return args[match];
- });
- };
-
- az.$ = function(queryString) {
- return document.querySelector(queryString);
- };
-
- az.createElement = function(element, cls, attributes) {
- var attr;
- cls = cls || "";
- attributes = attributes || {};
- element = document.createElement(element);
- element.className = cls;
- for (attr in attributes) {
- if (attributes.hasOwnProperty(attr)) {
- element.setAttribute(attr, attributes[attr]);
- }
- }
- return element;
- };
-
- az.magicMousey = (function() {
- var lastPosition;
- var body = document.body;
- var keys = {};
- var lastTimes = {};
-
- var keyCodes = {
- "leftMouse": 1,
- "middleMouse": 2,
- "rightMouse": 3,
- "backspace": 8,
- "tab": 9,
- "enter": 13,
- "shift": 16,
- "ctrl": 17,
- "alt": 18,
- "pause": 19,
- "break": 19,
- "caps": 20,
- "caps lock": 20,
- "capsLock": 20,
- "escape": 27,
- "pageup": 33,
- "page up": 33,
- "pagedown": 34,
- "page down": 34,
- "end": 35,
- "home": 36,
- "left": 37,
- "up": 38,
- "right": 39,
- "down": 40,
- "insert": 45,
- "delete": 46,
- "leftWindows": 91,
- "rightWindows": 92,
- "select": 93,
- "numLock": 144,
- "scrollLock": 145,
- "semiColon": 186,
- "equals": 187,
- "comma": 188,
- "period": 190,
- "forwardSlash": 191,
- "graveAccent": 192,
- "openBracket": 219,
- "backSlash": 220,
- "closeBracket": 221,
- "singleQuote": 222
- };
-
- function collectKeycodes(offset) {
- return function(value, index) {
- keyCodes[value] = index + offset;
- };
- }
-
- function aggregateKeycodes(offset, prefix) {
- return function(value, index) {
- keyCodes[prefix + value] = index + offset;
- };
- }
-
- "abcdefghijklmnopqrstuvwxyz".split("").forEach(collectKeycodes(65));
- "0123456789".split("").forEach(collectKeycodes(48));
- "0123456789".split("").forEach(aggregateKeycodes("num", 96));
- ["multiply", "add", "subtract", "point", "divide"].forEach(collectKeycodes(106));
- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].forEach(aggregateKeycodes(112, "f"));
-
- keys.leftMouse = false;
- keys.middleMouse = false;
- keys.rightMouse = false;
-
- function generateKeydown(key, keyCode) {
- if (key && keyCode) {
- keys[key] = false;
- }
- window.addEventListener('keydown', function(event) {
- if (event.keyCode === keyCode) {
- keys[key] = true;
- }
- });
- window.addEventListener('keyup', function(event) {
- if (event.keyCode === keyCode) {
- keys[key] = false;
- }
- });
- }
-
- (function() {
- var key;
- var keyCode;
- for (key in keyCodes) {
- if (keyCodes.hasOwnProperty(key)) {
- keyCode = keyCodes[key];
- generateKeydown(key, keyCode);
- }
- }
- }());
-
- window.addEventListener('mousedown', function(event) {
- var returnVal = true;
- lastPosition = {
- x: event.clientX,
- y: event.clientY
- };
- if (event.which === 1) {
- keys.leftMouse = true;
- } else if (event.which === 3) {
- keys.rightMouse = true;
- } else if (event.which === 2) {
- keys.middleMouse = true;
- returnVal = false;
- }
- return returnVal;
- });
-
- window.addEventListener('mouseup', function(event) {
- if (event.which === 1) {
- keys.leftMouse = false;
- } else if (event.which === 3) {
- keys.rightMouse = false;
- } else if (event.which === 2) {
- keys.middleMouse = false;
- }
- });
-
- function mouseDelta(func) {
- window.addEventListener("mousemove", function(event) {
- var deltaX;
- var deltaY;
- var deltaTime;
- var newTime;
- event.preventDefault();
- if (keys.leftMouse || keys.rightMouse || keys.middleMouse) {
- if (lastTimes.mousemove !== "undefined") {
- newTime = +new Date();
- deltaTime = newTime - lastTimes.mousemove;
- }
- var newPosition = {
- x: event.clientX,
- y: event.clientY
- };
- if (!lastPosition) {
- lastPosition = newPosition;
- return;
- }
- deltaX = newPosition.x - lastPosition.x;
- deltaY = newPosition.y - lastPosition.y;
- func(deltaX, deltaY, deltaTime, keys);
- lastPosition = newPosition;
- lastTimes.mousemove = newTime;
- event.returnValue = false;
- }
- });
- }
-
- return {
- mouseDelta: mouseDelta
- };
- }(window));
-
- (function () {
- var text;
- var lastTime = +new Date();
-
- function getText(e) {
- text = (document.all) ? document.selection.createRange().text : document.getSelection();
- text += "";
- }
-
- az.magicMousey.mouseDelta(function (dx, dy, dt, keys) {
- getText();
- if (keys.leftMouse && (!text)) {
- window.scrollBy(-dx, -dy);
- }
- });
- }());
-
- // anarchist-state-free scrolling
- az.$("html").style.margin = "1000px";
- az.$("html").style.width = window.innerWidth + "px";
- az.$("html").style.height = window.innerHeight + "px";
- // az.$("html").style.height = "1px";
- az.$("body").style.width = window.innerWidth + "px";
- az.$("body").style.position = "relative";
- az.$("body").style.top = "-500px";
- az.$("body").style.left = "-500px";
- window.scrollTo(500, 500);
-
- // text-selection with the scrollwheel
- // (function () {
- // var text = "";
- // var textRange;
- // var lastTime = +new Date();
-
- // function getText(e) {
- // textRange = (document.all) ? document.selection.createRange().text : document.getSelection();
- // }
-
- // function deltaWheel(dt) {
- // var tRange;
- // var offsetDelta = Math.floor(dt / 500);
- // if (textRange) {
- // console.log(textRange.focusOffset + offsetDelta);
- // tRange = document.createRange();
- // tRange.setStart(textRange.anchorNode, textRange.anchorOffset);
- // tRange.setEnd(textRange.anchorNode, textRange.focusOffset + offsetDelta);
- // window.getSelection().addRange(tRange);
- // textRange = window.getSelection();
- // }
- // }
-
- // document.addEventListener("wheel", function (e) {
- // var newTime = +new Date();
- // e.preventDefault();
- // deltaWheel(lastTime - newTime);
- // lastTime = newTime;
- // });
-
- // document.addEventListener("mouseup", getText);
- // }());
-
- az.translate = function(value, leftMin, leftMax, rightMin, rightMax) {
- var leftSpan = leftMax - leftMin;
- var rightSpan = rightMax - rightMin;
-
- var scaled = (value - leftMin) / leftSpan;
- return rightMin + scaled * rightSpan;
- };
-
- az.constrainValue = function(value, min, max) {
- if (value < min) {
- return min;
- } else if (value > max) {
- return max;
- }
- return value;
- };