WaniKani Denial Mode

Make the dashboard look like you're level 60 and have burnt everything.

// ==UserScript==
// @name        WaniKani Denial Mode
// @version     1.1
// @author Niklas Barsk
// @description Make the dashboard look like you're level 60 and have burnt everything.
// @include     https://www.wanikani.com/*
// @exclude     https://www.wanikani.com/review/*
// @exclude     https://www.wanikani.com/lesson/*
// @run-at      document-end
// @copyright   2016, Niklas Barsk
// @namespace https://greasyfork.org/users/8532
// ==/UserScript==

var numItems = {'radicals': 478, 'kanji': 2027, 'vocab': 6261};
var maxLevel = "60";
var maxLevelRadicals = "1";
var maxLevelKanji = "32";
var level = document.getElementsByClassName("dropdown-toggle")[0].children[0];
var lessons = document.getElementsByClassName("lessons")[0].getElementsByTagName("span")[0];
var reviews = document.getElementsByClassName("reviews")[0].getElementsByTagName("span")[0];

runScript();

function runScript() {

  // When reloading the page the script gets executed before content has been pulled in by the
  // sites own javascripts. Rerun this script later instead.
  if (!isPageReady()) {
    setTimeout(runScript, 10);
    return;
  }

  make(level,  maxLevel);
  make(lessons, "0");
  make(reviews, "0");

  if (isDashboard()) {
      var reviewStatus = document.getElementsByClassName("review-status")[0];
      var nextHour = reviewStatus.getElementsByClassName("one-hour")[0].children[0];
      var oneDay = reviewStatus.getElementsByClassName("one-day")[0].children[0];
      var nextReview = reviewStatus.getElementsByTagName("time")[0];
      make(nextHour, "0");
      make(oneDay, "0");
      make(nextReview, "∞");

      fixSRSLevels("apprentice");
      fixSRSLevels("guru");
      fixSRSLevels("master");
      fixSRSLevels("enlightened");
      fixSRSLevels("burned");

      fixProgression();
  }
}

function isPageReady() {
  return document.getElementById("apprentice").getAttribute("data-content") != null;
}

function make(elem, what) {
  elem.innerHTML = what;
}

function fixSRSLevels(which) {
  var levelElement = document.getElementById(which);
  var data = levelElement.getAttribute("data-content");
  var fixedData = replaceInDataContent(which, data);
  levelElement.setAttribute("data-content", fixedData);

    var numberHolder = levelElement.children[0];
  if (which == "burned") {
        make(numberHolder, "" + (numItems.radicals + numItems.kanji + numItems.vocab));
  }
    else {
        make(numberHolder, "0");
    }
}

function fixProgression() {
    var progression = document.getElementsByClassName("progression")[0];
    var radicalProgressTitle = progression.getElementsByTagName("h3")[0];
    var kanjiProgressTitle = progression.getElementsByTagName("h3")[1];
    replaceInProgressString(radicalProgressTitle);
    replaceInProgressString(kanjiProgressTitle);

    var radicalProgressBar = document.getElementsByClassName("bar")[0];
    radicalProgressBar.setAttribute("style", "width: 100%;");
    var kanjiProgressBar = document.getElementsByClassName("bar")[1];
    kanjiProgressBar.setAttribute("style", "width: 100%;");

    var radicalProgressBarLabel = radicalProgressBar.getElementsByTagName("b")[0]
    var kanjiProgressBarLabel = kanjiProgressBar.getElementsByTagName("b")[0]
    make(radicalProgressBarLabel, "100%");
    make(kanjiProgressBarLabel, "100%");

    var radicalTotal = document.getElementsByClassName("pull-right total")[0];
    var kanjiTotal = document.getElementsByClassName("pull-right total")[1];
    make(radicalTotal, maxLevelRadicals);
    make(kanjiTotal, maxLevelKanji);
}

function replaceInProgressString(which) {
  var splitString = which.innerHTML.split(/([0-9]+)/); //split on each number
    var newString = "";
    for (i = 0; i < splitString.length; i++) {
        if (isNaN(splitString[i])) {
            newString += splitString[i]; // not a number, just use it as it is
        }
        else {
          newString += maxLevel;
        }
    }
    make(which, newString);
}

function replaceInDataContent(which, data) {
    var splitString = data.split(/([0-9]+)/); //split on each number
    var newData = "";
    var burnCounter = 0;
    var burnCounts = ["" + numItems.radicals, "" + numItems.kanji, "" + numItems.vocab];
    for (i = 0; i < splitString.length; i++) {
        if (isNaN(splitString[i])) {
            newData += splitString[i]; // not a number, just use it as it is
        }
        else if (which == "burned") {
            newData += burnCounts[burnCounter++];
        }
        else {
          newData += "0";
        }
    }
    return newData;
}

function isDashboard() {
    return document.URL.indexOf("dashboard") != -1;
}