Merc Lister

Add a little something extra to an otherwise fairly uninteresting merc system.

by zuils

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/pako/1.0.6/pako.min.js"></script>
Updated Jun 9th for version 1.0 (<a href="https://jsfiddle.net/A45327Eq/vruwmyao/172/embedded/result/" target="_blank">0.26b version</a>) Added the zlib/pako save decoding Nov 14, 2017<br>
<table class="noBorder">
<td class="noBorder">
	<textarea id="savegame" placeholder="Paste your save game here" autofocus onclick="this.focus();this.select()" onblur="readSave()"></textarea>
</td><td>
	<button onclick="readSave()">Read save</button>
</td><td>
	<a href="https://www.reddit.com/r/ClickerHeroes/comments/3ues7c/merc_lister_updated_with_quests_and_failure/" target="_blank">FAQ</a>
</td>
</table>
Show any TTDs: <input type="checkbox" id="showTTD" checked> 
	Sort quests: <input type="checkbox" id="sortQuests" checked> 
	Show days in time format: <input type="checkbox" id="showDays" checked> 
	Show recruit TTDs: <input type="checkbox" id="showMercTTDs"><br>
Number of revive TTDs: <input size="6" type="text" id="numTTDs"> Update time: <input type="checkbox" id="updateTime" checked> Alarm: <input size="6" type="text" onChange="formatAlarm(this);" value="hhmmss" onclick="clearInterval(window.alarm);this.value='hhmmss';this.select();"/><br>
Number of sets of quests: <input size="6" type="text" id="inputQuests" value=8> Mark: 
	<a class="tsource"><input type="checkbox" id="mGold"><span class="ttip">Gold</span></a>
	<a class="tsource"><input type="checkbox" id="mHS"><span class="ttip">HS</span></a>
	<a class="tsource"><input type="checkbox" id="mRubies"><span class="ttip">Rubies</span></a>
	<a class="tsource"><input type="checkbox" id="mSkills"><span class="ttip">Skills</span></a>
	<a class="tsource"><input type="checkbox" id="mRelics"><span class="ttip">Relics</span></a><br>
Number of recruits: <input size="6" type="text" id="inputMercs" value=4> Filters:
	<a class="tsource"><input type="checkbox" id="Common"><span class="ttip">Common</span></a>
	<a class="tsource"><input type="checkbox"...

CSS

table {
	border-collapse: collapse;
	border-spacing: 0;
	border: 1px solid #cccccc;
}
th {
	background-color: #e6e6e6;
	/*text-align: center;*/
}
th, td {
	padding: 6px;
	/*text-align: left;*/
	/*border-bottom: 1px solid #ddd;*/
}
td {text-align: left}
.striped tr:nth-child(odd) {background-color: #e6e6e6} /*#f2f2f2}*/
.striped4 tr:nth-child(8n-7) {background-color: #e6e6e6}
.striped4 tr:nth-child(8n-6) {background-color: #e6e6e6}
.striped4 tr:nth-child(8n-5) {background-color: #e6e6e6}
.striped4 tr:nth-child(8n-4) {background-color: #e6e6e6}

.noBorder {
	padding: 0;
	padding-right: 6px;
	border-spacing: 0;
	border-collapse: collapse;
	border: 0;
}
.tsource:hover .ttip {
    display: block;
}

.ttip {
    display: none;
    background: #C8C8C8;
    margin-left: 14px;
    padding: 6px;
    position: absolute;
}

.shadow5 {
	font-size:18px;
	text-shadow: 0 0 3px black, 0 0 3px black, 0 0 3px black, 0 0 3px black, 0 0 3px black;
}

markHS {
	background-color: #9CF051;
	color: black;
}

markRubies {
	background-color: #F59595;
	color: black;
}

markGold {
	background-color: yellow;
	color: black;
}

markSkills {
	background-color: orange;
	color: black;
}

markRelics {
	background-color: #BDB6FA;
	color: black;
}

JavaScript

getCookies();
var tooltip = document.querySelectorAll('.ttip');
document.addEventListener('mousemove', fn, false);
function fn(e) {
	for (var i = tooltip.length; i--;) {
		tooltip[i].style.left = e.pageX + 'px';
		tooltip[i].style.top = e.pageY + 'px';
	}
}

function readSave() {
	var txt = document.getElementById("savegame").value;
  var ANTI_CHEAT_CODE = "Fe12NAfA3R6z4k0z";
  var zlib = "7a990d405d2c6fb93aa8fbb0ec1a3b23";
  var deflate = "7e8bb5a89f2842ac4af01b3b7e228592";
	if (txt.indexOf(ANTI_CHEAT_CODE) > -1 || txt.substring(0, 32) == zlib || txt.substring(0, 32) == deflate) {
		document.getElementById("alive").innerHTML = "Decoding...";
    if (txt.substring(0, 32) == zlib) {
      var pako = window.pako;
      var data = JSON.parse(pako.inflate(atob(txt.substring(32)), {to: 'string'}));
    } else if (txt.substring(0, 32) == deflate) {
    	var pako = window.pako;
      var data = JSON.parse(pako.inflateRaw(atob(txt.substring(32)), {to: 'string'}));
    } else {
      var result = txt.split(ANTI_CHEAT_CODE);
      txt = "";
      for (var i = 0; i < result[0].length; i += 2)
        txt += result[0][i];
      var data = JSON.parse(atob(txt));
    }
    clearInterval(window.timer);
		setCookies();
		var numTTDs = document.getElementById("numTTDs").value;
		var showDays = document.getElementById("showDays").checked;
		var showTTD = document.getElementById("showTTD").checked;
		alive(data, showTTD, numTTDs, showDays, document.getElementById("updateTime").checked);
		quest(data, document.getElementById("inputQuests").value, document.getElementById("sortQuests").checked);
		mercs(data.mercenaries.mercRoller.seed, document.getElementById("inputMercs").value, showTTD, showDays, document.getElementById("showMercTTDs").checked, numTTDs);
	}
	else if (txt)
		document.getElementById("alive").innerHTML = "Not a valid save, try again.";
}

function randNum(seed) {
	return (seed * 16807) % 2147483647;
}

function secToString(s, showDays) {
	var d = 0, h = 0, m = 0;
	var...