1let settingsOpen = false;
2
3let currentLemmaIndex = 0;
4if (localStorage.getItem('startdate') != undefined) {
5 currentLemmaIndex = Math.floor(new Date().getTime() / 1000 / 60 / 60 / 24) - localStorage.getItem('startdate');
6 currentLemmaIndex += parseInt(localStorage.getItem('offset'));
7} else {
8 localStorage.setItem('startdate', Math.floor(new Date().getTime() / 1000 / 60 / 60 / 24));
9 localStorage.setItem('offset', 0);
10}
11
12
13
14
15let listOfLemmas = []
16
17
18function displayResult(parsedJSON) {
19 var bestResult = parsedJSON.data[0]
20 console.log(bestResult)
21 // DOM modifications
22 // Resetting divs
23 document.getElementById("words").innerHTML = "";
24 document.getElementById("senses").innerHTML = "";
25 // Writing to those divs
26 // Word Container Start
27 for (var wordIndex in bestResult.japanese) {
28 var wordcontainer = document.createElement("div");
29 wordcontainer.className = "word-container";
30 wordcontainer.id = "word-container-" + wordIndex;
31 // Word div Start
32 var worddiv = document.createElement("div");
33 worddiv.className = "word";
34 if (bestResult.japanese[wordIndex].word != undefined) {
35 worddiv.innerHTML = bestResult.japanese[wordIndex].word;
36 } else {
37 worddiv.innerHTML = currentLemma;
38 }
39
40 wordcontainer.appendChild(worddiv);
41 // Word div End
42 // Reading div Start
43 var readingdiv = document.createElement("div");
44 readingdiv.className = "reading";
45 readingdiv.innerHTML = bestResult.japanese[wordIndex].reading;
46 wordcontainer.appendChild(readingdiv);
47 // Reading div End
48 document.getElementById("words").appendChild(wordcontainer);
49 }
50 // Word Container End
51 // Senses Container Start
52 for (var sensesIndex in bestResult.senses) {
53 var sensecontainer = document.createElement("div");
54 sensecontainer.className = "sense-container";
55 sensecontainer.id = "sense-container-" + sensesIndex;
56 // Sense Type div Start
57 var sensetypediv = document.createElement("div");
58 sensetypediv.className = "sense-types";
59 sensetypediv.innerHTML = bestResult.senses[sensesIndex].parts_of_speech[0]; // is a list but for some reason there is always only one element
60 sensecontainer.appendChild(sensetypediv);
61 // Sense Type div End
62 // Sense Definitions div Start
63 var definitionsdiv = document.createElement("div");
64 definitionsdiv.className = "sense-definitions";
65 definitionsdiv.innerHTML = bestResult.senses[sensesIndex].english_definitions[0]; // is a list but for some reason there is always only one element
66 sensecontainer.appendChild(definitionsdiv);
67 // Sense Definitions div End
68 // Word Container End
69 document.getElementById("senses").appendChild(sensecontainer);
70 }
71}
72
73// Get information on the currently selected lemma
74function updateCurrentLemma() {
75 document.getElementById("word-number").innerHTML = currentLemmaIndex + 1;
76 currentLemma = listOfLemmas[currentLemmaIndex];
77 const url = 'https://ontake.dev/daily-kanji/assets/datasets/building-dataset/jisho-dataset/' + currentLemma;
78 $.ajax({
79 url: url,
80 success: function(result) {
81 parsedJSON = JSON.parse(result)
82 displayResult(parsedJSON)
83 }
84 });
85}
86
87function updateOffset() {
88 localStorage.setItem('offset', currentLemmaIndex - (Math.floor(new Date().getTime() / 1000 / 60 / 60 / 24) - localStorage.getItem('startdate')));
89}
90
91// Previous lemma
92function previousLemma() {
93 currentLemmaIndex--;
94 if (currentLemmaIndex < 0) {
95 currentLemmaIndex = 0;
96 }
97 updateOffset()
98 updateCurrentLemma();
99}
100
101// Next lemma
102function nextLemma() {
103 currentLemmaIndex++;
104 updateOffset()
105 updateCurrentLemma();
106}
107
108// Update theme
109function updateTheme() {
110 if (localStorage.getItem('daily-kanji-theme') == undefined) {
111 localStorage.setItem('daily-kanji-theme', 0);
112 }
113 if (localStorage.getItem('daily-kanji-theme') == "0") {
114 document.documentElement.style.setProperty('--text-color', "white");
115 document.documentElement.style.setProperty('--bg-color-1', "#000000");
116 document.documentElement.style.setProperty('--bg-color-2', "#ffffff0f");
117 document.documentElement.style.setProperty('--border-color-1', "#ffffff38");
118 document.documentElement.style.setProperty('--scrollbar-color-1', "#ffffff");
119 document.documentElement.style.setProperty('--scrollbar-color-2', "#393939");
120 document.documentElement.style.setProperty('--invert-state', "0");
121 } else {
122 document.documentElement.style.setProperty('--text-color', "black");
123 document.documentElement.style.setProperty('--bg-color-1', "#ffffff");
124 document.documentElement.style.setProperty('--bg-color-2', "#0000000f");
125 document.documentElement.style.setProperty('--border-color-1', "#00000038");
126 document.documentElement.style.setProperty('--scrollbar-color-1', "#000000");
127 document.documentElement.style.setProperty('--scrollbar-color-2', "#c7c7c7");
128 document.documentElement.style.setProperty('--invert-state', "1");
129 }
130}
131
132// Theme toggle
133function themeToggle() {
134 if (localStorage.getItem('daily-kanji-theme') == "0") {
135 localStorage.setItem('daily-kanji-theme', 1);
136 } else {
137 localStorage.setItem('daily-kanji-theme', 0);
138 }
139 updateTheme();
140}
141
142// Update Start Date
143function updateStartDate() {
144 localStorage.setItem('startdate', document.getElementById("start-date-input").value);
145}
146
147// Open Settings
148function openSettings() {
149 if (!settingsOpen) {
150 var settingsDiv = document.createElement("div");
151 settingsDiv.id = "settings-container";
152 //Start Date
153 var startDateLabel = document.createElement("div");
154 startDateLabel.id = "start-date-label";
155 startDateLabel.innerHTML = "Start Date"
156 var startDateInput = document.createElement("input");
157 startDateInput.type = "number"
158 startDateInput.value = localStorage.getItem('startdate');
159 startDateInput.id = "start-date-input";
160 startDateInput.oninput = updateStartDate;
161 settingsDiv.appendChild(startDateLabel);
162 settingsDiv.appendChild(startDateInput);
163 //Disclaimer
164 var settingsDisclaimerLabel = document.createElement("div");
165 settingsDisclaimerLabel.id = "settings-disclaimer-label";
166 settingsDisclaimerLabel.innerHTML = "Please note that a refresh of the page is required to show changes.<br><br>Tip: To close this page click on the settings icon again."
167 settingsDiv.appendChild(settingsDisclaimerLabel);
168 //End
169 settingsDiv.id = "settings-container"
170 document.body.appendChild(settingsDiv);
171 settingsOpen = true;
172 } else {
173 document.getElementById("settings-container").remove()
174 settingsOpen = false;
175 }
176}
177
178updateTheme();
179
180document.getElementById("current-date").innerHTML = $.format.date(new Date(), 'ddd, MMMM d, yyyy');
181
182// Get list of lemmas
183const url = 'https://ontake.dev/daily-kanji/assets/datasets/listoflemmas.txt';
184$.ajax({
185 url: url,
186 success: function(result) {
187 listOfLemmas = result.split("\r\n");
188 updateCurrentLemma();
189 }
190});