diff --git a/mods/date_test.js b/mods/date_test.js
new file mode 100644
index 00000000..5b82e940
--- /dev/null
+++ b/mods/date_test.js
@@ -0,0 +1,189 @@
+var modName = "mods/date_test.js";
+var haseuliteMod = "mods/haseulite.js";
+
+if(enabledMods.includes(haseuliteMod)) {
+ fakeDate = urlParams.get('fakeDate');
+ shortenedTest = (urlParams.get('shortenedTest') !== null);
+
+ loonaObject = {
+ "01-02": {member: "Jihyo", color: "rgb(250,200,87)", group: "Twice"},
+ "03-02": {member: "Rei and Gong Yubin", color: "linear-gradient(90deg, rgba(105,195,45,1) 0%, rgba(105,195,45,1) 20%, rgba(255,227,226,1) 80%, rgba(255,227,226,1) 100%)", group: "IVE and tripleS", gradient: true},
+ "09-02": {member: "Kim Yooyeon", color: "rgb(205,102,171)", group: "tripleS"},
+ "21-02": {member: "Leeseo", color: "rgb(255,240,1)", group: "IVE"},
+ "10-02": {member: "Kim Lip", color: "rgb(234,2,1)", group: "Loona"},
+ "24-03": {member: "Mina", color: "rgb(111,197,194)", group: "Twice"},
+ "12-04": {member: "Jeong Hyerin", color: "rgb(142,108,255)", group: "tripleS"},
+ "23-04": {member: "Chaeyoung", color: "rgb(255,23,68)", group: "Twice"},
+ "24-05": {member: "Yves", color: "rgb(125,0,30)", group: "Loona"},
+ "28-05": {member: "Dahyun", color: "rgb(255,255,255)", group: "Twice"},
+ "04-06": {member: "Choerry", color: "rgb(92,44,146)", group: "Loona"},
+ "13-06": {member: "JinSoul", color: "rgb(20,36,176)", group: "Loona"},
+ "14-06": {member: "Tzuyu", color: "rgb(2,119,189)", group: "Twice"},
+ "06-08": {member: "Yoon Seoyeon", color: "rgb(34,174,255)", group: "tripleS"},
+ "18-08": {member: "HaSeul", color: "rgb(0,166,81)", group: "Loona"},
+ "31-08": {member: "Wonyoung", color: "rgb(255,0,30)", group: "IVE"}, //stay mad
+ "01-09": {member: "Yujin", color: "rgb(255,57,154)", group: "IVE"},
+ "22-09": {member: "Nayeon", color: "rgb(129,212,250)", group: "Twice"},
+ "24-09": {member: "Gaeul", color: "rgb(0,85,168)", group: "IVE"},
+ "03-10": {member: "Kim Soomin", color: "rgb(236,138,165)", group: "tripleS"},
+ "13-10": {member: "Kim Nakyoung", color: "rgb(101,153,164)", group: "tripleS"},
+ "19-10": {member: "HeeJin", color: "rgb(255,0,146)", group: "Loona"},
+ "20-10": {member: "Chuu", color: "rgb(246,144,126)", group: "Loona"},
+ "24-10": {member: "Lee Jiwoo", color: "rgb(255,249,36)", group: "tripleS"},
+ "01-11": {member: "Jeongyeon", color: "rgb(188,215,118)", group: "Twice"},
+ "09-11": {member: "Momo", color: "rgb(248,207,215)", group: "Twice"},
+ "11-11": {member: "YeoJin", color: "rgb(244,111,31)", group: "Loona"},
+ "13-11": {member: "Olivia Hye", color: "rgb(143,143,143)", group: "Loona"},
+ "15-11": {member: "HyunJin", color: "rgb(255,204,0)", group: "Loona"},
+ "19-11": {member: "Go Won", color: "rgb(48,195,156)", group: "Loona"},
+ "21-11": {member: "Liz", color: "rgb(0,195,245)", group: "IVE"},
+ "04-12": {member: "Kim Chaeyeon", color: "rgb(141,191,65)", group: "tripleS"},
+ "09-12": {member: "ViVi", color: "rgb(255,152,180)", group: "Loona"},
+ "20-12": {member: "Kaede", color: "rgb(255,201,53)", group: "tripleS"},
+ "29-12": {member: "Sana", color: "rgb(159,168,218)", group: "Twice"}
+ };
+
+ var february10Override = false;
+
+ function getDayMonth() {
+ var d = february10Override ? new Date(1549800000000) : new Date();
+ var month = (d.getMonth()+1).toString();
+ if(month.length == 1) { month = "0" + month };
+ var day = d.getDate().toString();
+ if(day.length == 1) { day = "0" + day };
+ var dayMonth = day + "-" + month;
+ return (fakeDate === null ? dayMonth : fakeDate);
+ }
+
+ function registerElemClick(name) {
+ var fakeDateMessage = "";
+ if(fakeDate !== null) {
+ fakeDateMessage += "(Fake date) ";
+ };
+ var shortenedTestMessage = "";
+ if(shortenedTest) {
+ shortenedTestMessage += "(Shortened to 2) ";
+ };
+ if(clickedElements[name] === false) {
+ clickedElements[name] = true;
+ };
+ if(evaluateTheClickedElements()) {
+ var dayMonth = getDayMonth();
+ var memberMessage = loonaObject[dayMonth];
+ if(memberMessage == undefined) { memberMessage = "[No such member?]" };
+ if(typeof(memberMessage) === "object") {
+ memberMessage = memberMessage.member;
+ };
+alert(`You have clicked on all ${Object.keys(clickedElements).length} birthday messages spread throughout some of the elements.
+Member: ${fakeDateMessage}${shortenedTestMessage}${memberMessage}. Stan ${loonaObject[getDayMonth()].group}!`);
+ };
+ };
+
+ function evaluateTheClickedElements() {
+ var done = true;
+ for(element in clickedElements) {
+ done = done && clickedElements[element];
+ };
+ return done;
+ };
+
+ function highlightButton(element,color,blurRadius="15px",spreadRadius="5px") {
+ var button = document.getElementById(`elementButton-${element}`);
+ if(button == null) {
+ throw new Error(`Nonexistent button for ${element}`)
+ };
+ if(typeof(blurRadius) == "number") { blurRadius = blurRadius + "px" };
+ if(typeof(spreadRadius) == "number") { spreadRadius = spreadRadius + "px" };
+ document.getElementById(`elementButton-${element}`).style["-webkit-box-shadow"] = `0px 0px ${blurRadius} ${spreadRadius} ${color}`;
+ document.getElementById(`elementButton-${element}`).style["box-shadow"] = `0px 0px ${blurRadius} ${spreadRadius} ${color}`;
+ };
+
+ runAfterAutogen(function() {
+
+ changingDescElements = ["distance_display","find_toggle","prop","number_adjuster","replace","alt_replace","alt_alt_replace","change","alt_change","alt_alt_change"];
+
+ blacklist = ["toxin","poison","blood","cancer","rotten_meat","frozen_rotten_meat","zombie_blood","plague","stench","infection","acid","acid_gas","rot","shit","shit_gravel","poo","dioxin","lean"];
+
+ dayMonth = getDayMonth();
+
+ var baseArray = ["heejinite","heejinite_powder","molten_heejinite","heejinite_gas","haseulite","haseulite_powder","molten_haseulite","haseulite_gas","jinsoulite","jinsoulite_powder","molten_jinsoulite","jinsoulite_gas","haseulite_vent","loona","loona_gravel","molten_loona"];
+
+ if(loonaObject[dayMonth]) {
+ randomElements = Object.keys(elements).filter(function(e) {
+ var cat = elements[e].category;
+ if(cat == undefined) { cat = "other" };
+ cat = cat.toLowerCase();
+ return (
+ cat !== "clouds" &&
+ cat !== "auto creepers" &&
+ cat !== "auto_bombs" &&
+ cat !== "auto_fey" &&
+ cat !== "spouts" &&
+ cat !== "singularities" &&
+ cat !== "random" &&
+ cat !== "weapons" &&
+ cat !== "idk" &&
+ cat !== "corruption" &&
+ cat !== "radioactive" &&
+ cat !== "piss" &&
+ cat !== "shit" &&
+ cat !== "vomit" &&
+ cat !== "cum" &&
+ !e.includes("head") &&
+ (!e.includes("body") || e.includes("antibody")) &&
+ !cat.includes("random") &&
+ !cat.includes("udstone") &&
+ !elements[e].nocheer &&
+ !changingDescElements.includes(e) &&
+ !blacklist.includes(e) &&
+ !elements[e].hidden &&
+ !baseArray.includes(e)
+ );
+ }); shuffleArray(randomElements); randomElements = randomElements.slice(0,shortenedTest ? 2 : 12);
+
+ clickedElements = {};
+ for(i = 0; i < randomElements.length; i++) {
+ var elemName = randomElements[i];
+ clickedElements[elemName] = false;
+ };
+
+ runAfterButtons(function() {
+ var elems = Object.keys(clickedElements);
+ for(j = 0; j < elems.length; j++) {
+ var name = elems[j];
+ var color = loonaObject[dayMonth].color;
+ if(data.gradient) {
+ color = "rgb(255,255,255)";
+ };
+ //console.log(name);
+ //console.log(color);
+ highlightButton(name,color,7,2);
+ };
+ });
+
+ var funnyElements = ["heejinite","heejinite_powder","molten_heejinite","heejinite_gas","haseulite","haseulite_powder","molten_haseulite","haseulite_gas","jinsoulite","jinsoulite_powder","molten_jinsoulite","jinsoulite_gas","haseulite_vent","loona","loona_gravel","molten_loona"].concat(randomElements);
+
+ var data = loonaObject[dayMonth];
+ for(ya = 0; ya < funnyElements.length; ya++) {
+ var elemName = funnyElements[ya];
+ var info = elements[elemName];
+ var loonaTheHTML = null;
+ if(baseArray.includes(elemName)) {
+ loonaTheHTML = `Happy birthday, ${data.member}!`;
+ } else {
+ loonaTheHTML = `Happy birthday, ${data.member}!`
+ };
+ if(typeof(info.desc) === "undefined") {
+ info.desc = loonaTheHTML
+ } else if(typeof(info.desc) === "string") {
+ info.desc += ("
" + loonaTheHTML);
+ };
+ };
+ };
+
+ });
+} else {
+ if(!enabledMods.includes(haseuliteMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,haseuliteMod) };
+ localStorage.setItem("enabledMods", JSON.stringify(enabledMods));
+ alert(`The "${haseuliteMod}" mod is required and has been automatically inserted (reload for this to take effect).`)
+};
\ No newline at end of file