Wanikani Scrollbox

Adds a space on the dashboard that displays items randomly to help remember them without seeing them in 'the wild'.

当前为 2014-12-24 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Wanikani Scrollbox
  3. // @namespace wkscrollbox
  4. // @description Adds a space on the dashboard that displays items randomly to help remember them without seeing them in 'the wild'.
  5. // @exclude *.wanikani.com
  6. // @include *.wanikani.com/dashboard*
  7. // @version 0.8.6
  8. // @author Samuel H
  9. // @grant none
  10.  
  11. /* This script is licensed under the Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0) license
  12. * Details: http://creativecommons.org/licenses/by-nc/4.0/ */
  13.  
  14. //IMPORTANT: IF THIS IS THE FIRST TIME YOU'VE USED ONE OF MY SCRIPTS THEN YOU NEED TO PUT YOUR API KEY BETWEEN THE DOUBLE QUOTES ON THE LINE BELOW.
  15. apiKey = "";
  16.  
  17. $("head").append('<script src="https://rawgit.com/WaniKani/WanaKana/master/lib/wanakana.min.js" type="text/javascript"></script>' +
  18. '<script src="https://rawgit.com/tobia/Pause/master/jquery.pause.min.js" type="text/javascript"></script>"');
  19.  
  20. function getSBSection() {
  21. var intSectionHeight = SBHeight * 100;
  22. var strSection = '<section id="scroll-box-section" style="overflow: hidden; width: 100%; height: ' + (intSectionHeight + 30) + 'px; border-radius: 5px; position: relative">' +
  23. '<div id="scroll-box-buttons" style="width: 100%; height: 30px"></div>' +
  24. '<div id="scroll-box" style="overflow: hidden; width: 100%; height: ' + intSectionHeight + 'px; border-radius: 5px; position: relative">' +
  25. '<div id="loadingSB" style="background-color: #d4d4d4; width: 100%; height: ' + intSectionHeight + 'px; border-radius: 5px; position: relative; text-align: center; padding-top: ' + (intSectionHeight * 0.375) + 'px"></div>' +
  26. '<div id="scroll-box-bg" style="background-color: #fff; width: 100%; height: ' + intSectionHeight + 'px; border-radius: 5px; position: absolute"></div>' +
  27. '</div></section>';
  28. return strSection;
  29. }
  30.  
  31. function newSBItem() {
  32. var curSBI = -1;
  33. var SBIType = -1;
  34. var SBISrs = -1;
  35. var SBIIndex = -1;
  36. var indexArray = [];
  37. var indexArrayLoc = [];
  38. var iaLen = 0;
  39.  
  40. if (SBRadicalsEnabled) {
  41. if (SBKanjiEnabled) {
  42. if (SBVocabularyEnabled) {
  43. if (SBApprenticeEnabled) {
  44. indexArray = indexArray.concat(SBIndex.radicals.apprentice, SBIndex.kanji.apprentice, SBIndex.vocabulary.apprentice);
  45. indexArrayLoc.push([0, 0, 0], [0, 1, SBIndexCount.radicals.apprentice], [0, 2, SBIndexCount.radicals.apprentice + SBIndexCount.kanji.apprentice]);
  46. iaLen = indexArray.length;
  47. }
  48. if (SBGuruEnabled) {
  49. indexArray = indexArray.concat(SBIndex.radicals.guru, SBIndex.kanji.guru, SBIndex.vocabulary.guru);
  50. indexArrayLoc.push([1, 0, iaLen], [1, 1, iaLen + SBIndexCount.radicals.guru], [1, 2, iaLen + SBIndexCount.radicals.guru + SBIndexCount.kanji.guru]);
  51. iaLen = indexArray.length;
  52. }
  53. if (SBMasterEnabled) {
  54. indexArray = indexArray.concat(SBIndex.radicals.master, SBIndex.kanji.master, SBIndex.vocabulary.master);
  55. indexArrayLoc.push([2, 0, iaLen], [2, 1, iaLen + SBIndexCount.radicals.master], [2, 2, iaLen + SBIndexCount.radicals.master + SBIndexCount.kanji.master]);
  56. iaLen = indexArray.length;
  57. }
  58. if (SBEnlightenEnabled) {
  59. indexArray = indexArray.concat(SBIndex.radicals.enlighten, SBIndex.kanji.enlighten, SBIndex.vocabulary.enlighten);
  60. indexArrayLoc.push([3, 0, iaLen], [3, 1, iaLen + SBIndexCount.radicals.enlighten], [3, 2, iaLen + SBIndexCount.radicals.enlighten + SBIndexCount.kanji.enlighten]);
  61. iaLen = indexArray.length;
  62. }
  63. if (SBBurnedEnabled) {
  64. indexArray = indexArray.concat(SBIndex.radicals.burned, SBIndex.kanji.burned, SBIndex.vocabulary.burned);
  65. indexArrayLoc.push([4, 0, iaLen], [4, 1, iaLen + SBIndexCount.radicals.burned], [4, 2, iaLen + SBIndexCount.radicals.burned + SBIndexCount.kanji.burned]);
  66. iaLen = indexArray.length;
  67. }
  68. if (SBLockedEnabled) {
  69. indexArray = indexArray.concat(SBIndex.radicals.locked, SBIndex.kanji.locked, SBIndex.vocabulary.locked);
  70. indexArrayLoc.push([5, 0, iaLen], [5, 1, iaLen + SBIndexCount.radicals.locked], [5, 2, iaLen + SBIndexCount.radicals.locked + SBIndexCount.kanji.locked]);
  71. iaLen = indexArray.length;
  72. }
  73. } else {
  74. if (SBApprenticeEnabled) {
  75. indexArray = indexArray.concat(SBIndex.radicals.apprentice, SBIndex.kanji.apprentice);
  76. indexArrayLoc.push([0, 0, 0], [0, 1, SBIndexCount.radicals.apprentice]);
  77. iaLen = indexArray.length;
  78. }
  79. if (SBGuruEnabled) {
  80. indexArray = indexArray.concat(SBIndex.radicals.guru, SBIndex.kanji.guru);
  81. indexArrayLoc.push([1, 0, iaLen], [1, 1, iaLen + SBIndexCount.radicals.guru]);
  82. iaLen = indexArray.length;
  83. }
  84. if (SBMasterEnabled) {
  85. indexArray = indexArray.concat(SBIndex.radicals.master, SBIndex.kanji.master);
  86. indexArrayLoc.push([1, 0, iaLen], [1, 1, iaLen + SBIndexCount.radicals.master]);
  87. iaLen = indexArray.length;
  88. }
  89. if (SBEnlightenEnabled) {
  90. indexArray = indexArray.concat(SBIndex.radicals.enlighten, SBIndex.kanji.enlighten);
  91. indexArrayLoc.push([1, 0, iaLen], [1, 1, iaLen + SBIndexCount.radicals.enlighten]);
  92. iaLen = indexArray.length;
  93. }
  94. if (SBBurnedEnabled) {
  95. indexArray = indexArray.concat(SBIndex.radicals.burned, SBIndex.kanji.burned);
  96. indexArrayLoc.push([1, 0, iaLen], [1, 1, iaLen + SBIndexCount.radicals.burned]);
  97. iaLen = indexArray.length;
  98. }
  99. if (SBLockedEnabled) {
  100. indexArray = indexArray.concat(SBIndex.radicals.locked, SBIndex.kanji.locked);
  101. indexArrayLoc.push([1, 0, iaLen], [1, 1, iaLen + SBIndexCount.radicals.locked]);
  102. iaLen = indexArray.length;
  103. }
  104. }
  105. } else {
  106. if (SBVocabularyEnabled) {
  107. if (SBApprenticeEnabled) {
  108. indexArray = indexArray.concat(SBIndex.radicals.apprentice, SBIndex.vocabulary.apprentice);
  109. indexArrayLoc.push([0, 0, 0], [0, 2, SBIndexCount.radicals.apprentice]);
  110. iaLen = indexArray.length;
  111. }
  112. if (SBGuruEnabled) {
  113. indexArray = indexArray.concat(SBIndex.radicals.guru, SBIndex.vocabulary.guru);
  114. indexArrayLoc.push([1, 0, iaLen], [1, 2, iaLen + SBIndexCount.radicals.guru]);
  115. iaLen = indexArray.length;
  116. }
  117. if (SBMasterEnabled) {
  118. indexArray = indexArray.concat(SBIndex.radicals.master, SBIndex.vocabulary.master);
  119. indexArrayLoc.push([2, 0, iaLen], [2, 2, iaLen + SBIndexCount.radicals.master]);
  120. iaLen = indexArray.length;
  121. }
  122. if (SBEnlightenEnabled) {
  123. indexArray = indexArray.concat(SBIndex.radicals.enlighten, SBIndex.vocabulary.enlighten);
  124. indexArrayLoc.push([3, 0, iaLen], [3, 2, iaLen + SBIndexCount.radicals.enlighten]);
  125. iaLen = indexArray.length;
  126. }
  127. if (SBBurnedEnabled) {
  128. indexArray = indexArray.concat(SBIndex.radicals.burned, SBIndex.vocabulary.burned);
  129. indexArrayLoc.push([4, 0, iaLen], [4, 2, iaLen + SBIndexCount.radicals.burned]);
  130. iaLen = indexArray.length;
  131. }
  132. if (SBLockedEnabled) {
  133. indexArray = indexArray.concat(SBIndex.radicals.locked, SBIndex.vocabulary.locked);
  134. indexArrayLoc.push([5, 0, iaLen], [5, 2, iaLen + SBIndexCount.radicals.locked]);
  135. iaLen = indexArray.length;
  136. }
  137. } else {
  138. if (SBApprenticeEnabled) {
  139. indexArray = indexArray.concat(SBIndex.radicals.apprentice);
  140. indexArrayLoc.push([0, 0, 0]);
  141. iaLen = indexArray.length;
  142. }
  143. if (SBGuruEnabled) {
  144. indexArray = indexArray.concat(SBIndex.radicals.guru);
  145. indexArrayLoc.push([1, 0, iaLen]);
  146. iaLen = indexArray.length;
  147. }
  148. if (SBMasterEnabled) {
  149. indexArray = indexArray.concat(SBIndex.radicals.master);
  150. indexArrayLoc.push([2, 0, iaLen]);
  151. iaLen = indexArray.length;
  152. }
  153. if (SBEnlightenEnabled) {
  154. indexArray = indexArray.concat(SBIndex.radicals.enlighten);
  155. indexArrayLoc.push([3, 0, iaLen]);
  156. iaLen = indexArray.length;
  157. }
  158. if (SBBurnedEnabled) {
  159. indexArray = indexArray.concat(SBIndex.radicals.burned);
  160. indexArrayLoc.push([4, 0, iaLen]);
  161. iaLen = indexArray.length;
  162. }
  163. if (SBLockedEnabled) {
  164. indexArray = indexArray.concat(SBIndex.radicals.locked);
  165. indexArrayLoc.push([5, 0, iaLen]);
  166. iaLen = indexArray.length;
  167. }
  168. }
  169. }
  170. } else if (SBKanjiEnabled) {
  171. if (SBVocabularyEnabled) {
  172. if (SBApprenticeEnabled) {
  173. indexArray = indexArray.concat(SBIndex.kanji.apprentice, SBIndex.vocabulary.apprentice);
  174. indexArrayLoc.push([0, 1, 0], [0, 2, SBIndexCount.kanji.apprentice]);
  175. iaLen = indexArray.length;
  176. }
  177. if (SBGuruEnabled) {
  178. indexArray = indexArray.concat(SBIndex.kanji.guru, SBIndex.vocabulary.guru);
  179. indexArrayLoc.push([1, 1, iaLen], [1, 2, iaLen + SBIndexCount.kanji.guru]);
  180. iaLen = indexArray.length;
  181. }
  182. if (SBMasterEnabled) {
  183. indexArray = indexArray.concat(SBIndex.kanji.master, SBIndex.vocabulary.master);
  184. indexArrayLoc.push([2, 1, iaLen], [2, 2, iaLen + SBIndexCount.kanji.master]);
  185. iaLen = indexArray.length;
  186. }
  187. if (SBEnlightenEnabled) {
  188. indexArray = indexArray.concat(SBIndex.kanji.enlighten, SBIndex.vocabulary.enlighten);
  189. indexArrayLoc.push([3, 1, iaLen], [3, 2, iaLen + SBIndexCount.kanji.enlighten]);
  190. iaLen = indexArray.length;
  191. }
  192. if (SBBurnedEnabled) {
  193. indexArray = indexArray.concat(SBIndex.kanji.burned, SBIndex.vocabulary.burned);
  194. indexArrayLoc.push([4, 1, iaLen], [4, 2, iaLen + SBIndexCount.kanji.burned]);
  195. iaLen = indexArray.length;
  196. }
  197. if (SBLockedEnabled) {
  198. indexArray = indexArray.concat(SBIndex.kanji.locked, SBIndex.vocabulary.locked);
  199. indexArrayLoc.push([5, 1, iaLen], [5, 2, iaLen + SBIndexCount.kanji.locked]);
  200. iaLen = indexArray.length;
  201. }
  202. } else {
  203. if (SBApprenticeEnabled) {
  204. indexArray = indexArray.concat(SBIndex.kanji.apprentice);
  205. indexArrayLoc.push([0, 1, 0]);
  206. iaLen = indexArray.length;
  207. }
  208. if (SBGuruEnabled) {
  209. indexArray = indexArray.concat(SBIndex.kanji.guru);
  210. indexArrayLoc.push([1, 1, iaLen]);
  211. iaLen = indexArray.length;
  212. }
  213. if (SBMasterEnabled) {
  214. indexArray = indexArray.concat(SBIndex.kanji.master);
  215. indexArrayLoc.push([2, 1, iaLen]);
  216. iaLen = indexArray.length;
  217. }
  218. if (SBEnlightenEnabled) {
  219. indexArray = indexArray.concat(SBIndex.kanji.enlighten);
  220. indexArrayLoc.push([3, 1, iaLen]);
  221. iaLen = indexArray.length;
  222. }
  223. if (SBBurnedEnabled) {
  224. indexArray = indexArray.concat(SBIndex.kanji.burned);
  225. indexArrayLoc.push([4, 1, iaLen]);
  226. iaLen = indexArray.length;
  227. }
  228. if (SBLockedEnabled) {
  229. indexArray = indexArray.concat(SBIndex.kanji.locked);
  230. indexArrayLoc.push([5, 1, iaLen]);
  231. iaLen = indexArray.length;
  232. }
  233. }
  234. } else {
  235. if (SBApprenticeEnabled) {
  236. indexArray = indexArray.concat(SBIndex.vocabulary.apprentice);
  237. indexArrayLoc.push([0, 2, 0]);
  238. iaLen = indexArray.length;
  239. }
  240. if (SBGuruEnabled) {
  241. indexArray = indexArray.concat(SBIndex.vocabulary.guru);
  242. indexArrayLoc.push([1, 2, iaLen]);
  243. iaLen = indexArray.length;
  244. }
  245. if (SBMasterEnabled) {
  246. indexArray = indexArray.concat(SBIndex.vocabulary.master);
  247. indexArrayLoc.push([2, 2, iaLen]);
  248. iaLen = indexArray.length;
  249. }
  250. if (SBEnlightenEnabled) {
  251. indexArray = indexArray.concat(SBIndex.vocabulary.enlighten);
  252. indexArrayLoc.push([3, 2, iaLen]);
  253. iaLen = indexArray.length;
  254. }
  255. if (SBBurnedEnabled) {
  256. indexArray = indexArray.concat(SBIndex.vocabulary.burned);
  257. indexArrayLoc.push([4, 2, iaLen]);
  258. iaLen = indexArray.length;
  259. }
  260. if (SBLockedEnabled) {
  261. indexArray = indexArray.concat(SBIndex.vocabulary.locked);
  262. indexArrayLoc.push([5, 2, iaLen]);
  263. iaLen = indexArray.length;
  264. }
  265. }
  266. //alert(Object.keys(indexArray).length)
  267. curSBI = rand(0, Object.keys(indexArray).length - 1);
  268. /*if (SBIType == 0) curSBType = 0;
  269. else {
  270. curSBType = rand(0, 1);
  271. if (SBIType == 1) {
  272. if (SBRadicalsEnabled) curSBI -= Object.keys(SBRadicalData).length;
  273. } else if (SBIType == 2) {
  274. if (SBRadicalsEnabled) {
  275. if (SBKanjiEnabled) curSBI -= (Object.keys(SBRadicalData).length + Object.keys(SBKanjiData).length);
  276. else curSBI -= (Object.keys(SBRadicalData).length);
  277. } else if (SBKanjiEnabled) curSBI -= Object.keys(SBKanjiData).length;
  278. }
  279. }*/
  280. //alert(SBLockedEnabled + " " + SBEnlightenEnabled + " " + SBApprenticeEnabled);
  281. //curSBI = indexArrayLoc[SBICount][2];
  282. var foundLoc = false;
  283. for (var t = 1; t <= Object.keys(indexArrayLoc).length; t++) {
  284. /*if (t < Object.keys(indexArrayLoc).length && indexArrayLoc[t-1][2] == indexArrayLoc[t][2]) {
  285. indexArrayLoc = indexArrayLoc.splice(t-1);
  286. }*/
  287. if (!foundLoc) {
  288. if (t == Object.keys(indexArrayLoc).length || curSBI < indexArrayLoc[t][2]) {
  289. SBIType = indexArrayLoc[t-1][1];
  290. SBIIndex = indexArray[curSBI];
  291. SBISrs = (SBIType == 0) ? SBRadicalData[SBIIndex].srs : ((SBIType == 1) ? SBKanjiData[SBIIndex].srs : SBVocabData[SBIIndex].srs);
  292. switch(SBISrs) {
  293. case "apprentice":
  294. SBISrs = 0;
  295. break;
  296. case "guru":
  297. SBISrs = 1;
  298. break;
  299. case "master":
  300. SBISrs = 2;
  301. break;
  302. case "enlighten":
  303. SBISrs = 3;
  304. break;
  305. case "burned":
  306. SBISrs = 4;
  307. break;
  308. case null:
  309. SBISrs = 5;
  310. }
  311. if (SBISrs !== indexArrayLoc[t-1][0]) alert("SRS mismatch: " + indexArrayLoc[t-1][0] + " should be " + SBISrs);
  312. foundLoc = true;
  313. }
  314. }
  315. }
  316.  
  317. var SBISize = rand(14, 49);
  318. var SBISpeed = rand(0.75, 1.25);
  319. var SBIx = 1170;
  320. var SBIy = 0;
  321. SBICount++;
  322. //alert(SBIndex.kanji);
  323. $("#scroll-box").prepend('<a href="https://www.wanikani.com/' + ((SBIType == 0) ? "radicals" : ((SBIType == 1) ? "kanji" : "vocabulary")) + '/' +
  324. ((SBIType == 0) ? SBRadicalData[SBIIndex].meaning : ((SBIType == 1) ? SBKanjiData[SBIIndex].character : SBVocabData[SBIIndex].character)) +
  325. '" target="_blank" id="SB' + SBICount + '" lang="ja">' + ((SBIType == 0) ? SBRadicalData[SBIIndex].character : ((SBIType == 1) ? SBKanjiData[SBIIndex].character :
  326. SBVocabData[SBIIndex].character)) + '</a>');
  327. var SBI = $("#SB" + SBICount);
  328. SBI.css({"font-size": SBISize, "text-decoration": "none", "line-height": (SBISize * 1.25) + "px", "min-width": (SBISize * 1.1) + "px", "text-align": "center", "padding": "0px " + ((SBISize / 35) * 2) + "px 0px " + ((SBISize / 35) * 2) + "px"});
  329. var SBIw = SBI.width();
  330. var SBIh = SBI.height();
  331. //alert(SBIh);
  332. SBIy = rand(0, (SBHeight * 100) - (SBISize * 1.25));
  333. switch (SBISrs) {
  334. case 0:
  335. SBI.addClass("Apprentice");
  336. break;
  337. case 1:
  338. SBI.addClass("Guru");
  339. break;
  340. case 2:
  341. SBI.addClass("Master");
  342. break;
  343. case 3:
  344. SBI.addClass("Enlightened");
  345. break;
  346. case 4:
  347. SBI.addClass("Burned");
  348. break;
  349. case 5:
  350. SBI.addClass("Locked");
  351. }
  352. SBI.css({"color": ((SBISrs < 5) ? "#fff" : "#E3E3E3"), "margin-top": SBIy, "left": SBIx + SBISize, "margin-right": -SBIw * 1.5, "border-radius": (SBISize * 0.15) + "px", "z-index": SBISize, "position": "absolute",
  353. "-webkit-touch-callout": "none", "-webkit-user-select": "none", "-khtml-user-select": "none", "-moz-user-select": "none", "-ms-user-select": "none", "user-select": "none"});
  354. SBI.animate({ "left": -SBIw*1.5}, {"duration": (SBISpeed * Math.pow((SBISize / 17), -1.1)) * 49000, "complete": function() {
  355. $(this).remove();
  356. }
  357. }, "linear" );
  358. SBI.mouseover(function() {
  359. SBPause = true;
  360. clearInterval(newSBItemTimer);
  361. var SBIP;
  362. for (var p = 1; p <= SBICount; p++) {
  363. SBIP = $("#SB" + p);
  364. SBIP.pause();
  365. }
  366. SBSelect($(this), SBIType);
  367. $(this).attr("oldZ", $(this).css("z-index")).css("z-index", 99);
  368. }).mouseout(function() {
  369. SBPause = false;
  370. newSBItemTimer = setInterval(newSBItem, 1500);
  371. var SBIR;
  372. for (var r = 1; r <= SBICount; r++) {
  373. SBIR = $("#SB" + r);
  374. SBIR.resume();
  375. }
  376. SBSelect(null);
  377. $(this).css({"z-index": $(this).attr("oldZ")});
  378. });
  379. }
  380.  
  381. function getSBRadicalData() {
  382. if (!SBLangJP) $("#loadingSB").html('<h3 style="color: #00a0f1">Retrieving radical data...</h3>');
  383. else $("#loadingSB").html('<h3 style="color: #00a0f1">部首データを検索中…</h3>');
  384. var req = new XMLHttpRequest();
  385. req.open('GET', 'https://www.wanikani.com/api/user/' + apiKey + '/radicals/' + SBLevels, true);
  386. req.onreadystatechange = function() {
  387. if (req.readyState === 4) {
  388. if (req.status >= 200 && req.status < 400) {
  389. SBRadicalData = filterSBRadicalData(req.responseText.split('"character":"'));
  390. localStorage.setItem("SBRadicals", JSON.stringify(SBRadicalData));
  391. getSBKanjiData();
  392. } else {
  393. alert("error");
  394. }
  395. }
  396. };
  397. req.send();
  398. }
  399.  
  400. function getSBKanjiData() {
  401. if (!SBLangJP) $("#loadingSB").html('<h3 style="color: #f100a0">Retrieving kanji data...</h3>');
  402. else $("#loadingSB").html('<h3 style="color: #f100a0">漢字データを検索中…</h3>');
  403. var req = new XMLHttpRequest();
  404. req.open('GET', 'https://www.wanikani.com/api/user/' + apiKey + '/kanji/' + SBLevels , true);
  405. req.onreadystatechange = function() {
  406. if (req.readyState === 4) {
  407. if (req.status >= 200 && req.status < 400) {
  408. SBKanjiData = filterSBKanjiData(req.responseText.split('"character":"'));
  409. localStorage.setItem("SBKanji", JSON.stringify(SBKanjiData));
  410. getSBVocabData(true);
  411. } else {
  412. alert("error");
  413. }
  414. }
  415. };
  416. req.send();
  417.  
  418. }
  419.  
  420. function getSBVocabData(firstPart) {
  421. if (!SBLangJP) $("#loadingSB").html('<h3 style="color: #a000f1">Retrieving vocabulary data...</h3>');
  422. else $("#loadingSB").html('<h3 style="color: #a000f1">単語データを検索中…</h3>');
  423. var req = new XMLHttpRequest();
  424. req.open('GET', 'https://www.wanikani.com/api/user/' + apiKey + '/vocabulary/' + ((firstPart) ? SBLevels.substring(0, SBLevels.indexOf(",26")) : SBLevels.substring(SBLevels.indexOf("26"))), true);
  425. req.onreadystatechange = function() {
  426. if (req.readyState === 4) {
  427. if (req.status >= 200 && req.status < 400) {
  428. if (!firstPart) {
  429. SBVocabData[1] = req.responseText.split('"character":"');
  430. SBVocabData = filterSBVocabData(SBVocabData);
  431. localStorage.setItem("SBVocab", JSON.stringify(SBVocabData));
  432. localStorage.setItem("SBIndex", JSON.stringify(SBIndex));
  433. localStorage.setItem("SBIndexCount", JSON.stringify(SBIndexCount));
  434. initScrollBox();
  435. } else {
  436. SBVocabData[0] = req.responseText.split('"character":"');
  437. getSBVocabData(false);
  438. }
  439. } else {
  440. alert("error");
  441. }
  442. }
  443. };
  444. req.send();
  445. }
  446.  
  447. function switchSBLang() {
  448. SBLangJP = !SBLangJP;
  449. if (SBLangJP) {
  450. $(".bsbsa span").html("見習い");
  451. $(".bsbsg span").html("尊師");
  452. $(".bsbsm span").html("達人");
  453. $(".bsbse span").html("啓発");
  454. $(".bsbsb span").html("焦げ");
  455. $(".bsbsl span").html("ロック");
  456. $(".bsbtc span").html("キャッシュ").css({"font-size": "14px", "padding-top": "3px"});
  457. $(".bsbts span").html("スタート\nボタン").css({"font-size": "14px"});
  458. } else {
  459. $(".bsbsa span").html("Appr");
  460. $(".bsbsg span").html("Guru");
  461. $(".bsbsm span").html("Master");
  462. $(".bsbse span").html("Enlight");
  463. $(".bsbsb span").html("Burned");
  464. $(".bsbsl span").html("Locked");
  465. $(".bsbtc span").html("Cache").css({"font-size": "inherit", "padding-top": "0px"});
  466. $(".bsbts span").html("Start\nButton").css({"font-size": "12px"});
  467. }
  468. }
  469.  
  470.  
  471. function getSBWKData() {
  472. if (localStorage.getItem("SBRadicals") == null || localStorage.getItem("SBKanji") == null || localStorage.getItem("SBVocab") == null) getSBRadicalData();
  473. else {
  474. SBRadicalData = JSON.parse(localStorage.getItem("SBRadicals"));
  475. SBKanjiData = JSON.parse(localStorage.getItem("SBKanji"));
  476. SBVocabData = JSON.parse(localStorage.getItem("SBVocab"));
  477. initScrollBox();
  478. }
  479. }
  480.  
  481. function clearSBItemData() {
  482. localStorage.removeItem("SBRadicals");
  483. localStorage.removeItem("SBKanji");
  484. localStorage.removeItem("SBVocab");
  485. localStorage.removeItem("SBIndex");
  486. localStorage.removeItem("SBIndexCount");
  487. SBIndex = {
  488. "radicals": {
  489. "apprentice": [], "guru": [], "master": [], "enlighten": [], "burned": [], "locked": []
  490. }, "kanji": {
  491. "apprentice": [], "guru": [], "master": [], "enlighten": [], "burned": [], "locked": []
  492. }, "vocabulary": {
  493. "apprentice": [], "guru": [], "master": [], "enlighten": [], "burned": [], "locked": []
  494. }
  495. };
  496. SBIndexCount = {
  497. "radicals": {
  498. "apprentice": 0, "guru": 0, "master": 0, "enlighten": 0, "burned": 0, "locked": 0
  499. }, "kanji": {
  500. "apprentice": 0, "guru": 0, "master": 0, "enlighten": 0, "burned": 0, "locked": 0
  501. }, "vocabulary": {
  502. "apprentice": 0, "guru": 0, "master": 0, "enlighten": 0, "burned": 0, "locked": 0
  503. }
  504. };
  505. }
  506.  
  507. function initScrollBox() {
  508. $("#loadingSB").remove();
  509. $("head").append("<style type=text/css>\
  510. .bsbi div, .bsbs div, .bsbt div {\
  511. background-color: rgb(49, 49, 49);\
  512. background-image: linear-gradient(to bottom, rgb(67, 67, 67), rgb(49, 49, 49));\
  513. color: #E3E3E3\
  514. -moz-box-shadow: inset 2px 2px 2px rgba(255, 255, 255, .2), inset -2px -2px 2px rgba(0, 0, 0, .2);\
  515. -webkit-box-shadow: inset 2px 2px 2px rgba(255, 255, 255, .2), inset -2px -2px 2px rgba(0, 0, 0, .2);\
  516. box-shadow: inset 2px 2px 2px rgba(255, 255, 255, .2), inset -2px -2px 2px rgba(0, 0, 0, .2);\
  517. }\
  518. .bsbir.on {\
  519. background-color: #00a0f1; background-image: linear-gradient(to bottom, #0af, #0093dd);\
  520. }\
  521. .bsbik.on {\
  522. background-color: #f100a0; background-image: linear-gradient(to bottom, #f0a, #dd0093);\
  523. }\
  524. .bsbiv.on {\
  525. background-color: #a000f1; background-image: linear-gradient(to bottom, #a0f, #9300dd);\
  526. }\
  527. .bsbt .on {\
  528. background-color: #80c100; background-image: linear-gradient(to bottom, #8c0, #73ad00);\
  529. }\
  530. .Apprentice, .bsbsa.on {\
  531. background: #f100a0;\
  532. border-color: #f100a0;\
  533. background-image: linear-gradient(to bottom, #f0a, #dd0093);\
  534. }\
  535. .Guru, .bsbsg.on {\
  536. background: #882d9e;\
  537. border-color: #882d9e;\
  538. background-image: linear-gradient(to bottom, #aa38c6, #882d9e);\
  539. }\
  540. .Master, .bsbsm.on {\
  541. background: #294ddb;\
  542. border-color: #294ddb;\
  543. background-image: linear-gradient(to bottom, #5571e2, #294ddb);\
  544. }\
  545. .Enlightened, .bsbse.on {\
  546. background: #0093dd;\
  547. border-color: #0093dd;\
  548. background-image: linear-gradient(to bottom, #0af, #0093dd);\
  549. }\
  550. .Burned, .bsbsb.on {\
  551. background: #434343;\
  552. border-color: #434343;\
  553. background-image: linear-gradient(to bottom, #555, #434343);\
  554. }\
  555. .Locked, .bsbsl.on {\
  556. background: #868686;\
  557. border-color: #313131;\
  558. background-image: linear-gradient(to bottom, #bbb, #a3a3a3);\
  559. }\
  560. .on {\
  561. color: #FFF\
  562. }\
  563. .SBSelect {\
  564. opacity: 0.5;\
  565. pointer-events: none;\
  566. }\
  567. </style>");
  568. $("#scroll-box-buttons").append('<div class="bsbi" style="width: 0px; height: 0px; position: absolute; z-index: 11">\
  569. <div class="bsbir' + ((SBRadicalsEnabled) ? ' on' : '') + '" style="position: absolute"><span lang="ja" style="font-size: inherit">部首</span></div>\
  570. <div class="bsbik' + ((SBKanjiEnabled) ? ' on' : '') + '" style="margin-left: 56px; position: absolute"><span lang="ja" style="font-size: inherit;">漢字</span></div>\
  571. <div class="bsbiv' + ((SBVocabularyEnabled) ? ' on' : '') + '" style="margin-left: 112px; position: absolute"><span lang="ja" style="font-size: inherit">単語</span></div>\
  572. </div>\
  573. <div class="bsbs" style="width: 0px; height: 0px; position: absolute; z-index: 11">\
  574. <div class="bsbsa' + ((SBApprenticeEnabled) ? ' on' : '') + '" style="margin-left: 168px; position: absolute"><span lang="ja" style="font-size: inherit">' + ((!SBLangJP) ? "Appr" : "見習い") + '</span></div>\
  575. <div class="bsbsg' + ((SBGuruEnabled) ? ' on' : '') + '" style="margin-left: 248px; position: absolute"><span lang="ja" style="font-size: inherit">' + ((!SBLangJP) ? "Guru" : "尊師") + '</span></div>\
  576. <div class="bsbsm' + ((SBMasterEnabled) ? ' on' : '') + '" style="margin-left: 328px; position: absolute"><span lang="ja" style="font-size: inherit">' + ((!SBLangJP) ? "Master" : "達人") + '</span></div>\
  577. <div class="bsbse' + ((SBEnlightenEnabled) ? ' on' : '') + '" style="margin-left: 408px; position: absolute"><span lang="ja" style="font-size: inherit">' + ((!SBLangJP) ? "Enlight" : "啓発") + '</span></div>\
  578. <div class="bsbsb' + ((SBBurnedEnabled) ? ' on' : '') + '" style="margin-left: 488px; position: absolute"><span lang="ja" style="font-size: inherit">' + ((!SBLangJP) ? "Burned" : "焦げ") + '</span></div>\
  579. <div class="bsbsl' + ((SBLockedEnabled) ? ' on' : '') + '" style="margin-left: 568px; position: absolute"><span lang="ja" style="font-size: inherit">' + ((!SBLangJP) ? "Locked" : "ロック") + '</span></div></div>\
  580. <div class="bsbt" style="width: 0px; position: absolute; z-index: 11; margin-left: 648px">\
  581. <div class="bsbtj' + ((SBLangJP) ? ' on' : '') + '" style="position: absolute"><span lang="ja" style="font-size: inherit">日本語</span></div>\
  582. <div class="bsbtc' + ((SBUseCache) ? ' on' : '') + '" style="margin-left: 80px; position: absolute"><span lang="ja" style="font-size: ' + ((!SBLangJP) ? "inherit" : "14px; padding-top: 3px") + '">' + ((!SBLangJP) ? "Cache" : "キャッシュ") + '</span></div>\
  583. <div class="bsbts' + ((SBStart) ? ' on' : '') + '" style="margin-left: 160px; position: absolute"><span lang="ja" style="font-size: ' + ((!SBLangJP) ? "12px" : "14px") + '; margin-top: -3px">' + ((!SBLangJP) ? "Start\nButton" : "スタート\nボタン") + '</span></div>\
  584. </div>');
  585. $(".bsbi div, .bsbs div, .bsbt div").css({"background-repeat": "repeat-x", "color": "#fff", "padding": "5px 4px 0px 4px", "width": "72px", "text-align": "center", "vertical-align": "middle",
  586. "font-size": "20px", "text-shadow": "none", "-webkit-touch-callout": "none", "-webkit-user-select": "none", "-khtml-user-select": "none",
  587. "-moz-user-select": "none", "-ms-user-select": "none", "user-select": "none"}).mouseover(function() {
  588. $(this).css("text-shadow", "0 0 0.2em #fff");
  589. }).mouseout(function() {
  590. $(this).css("text-shadow", "none");
  591. });
  592. $(".bsbi div, .bsbs div").css({"height": "24px"});
  593. $('.bsbi div').css({"width": "48px"}).click(function() {
  594. var cancel = false;
  595. if ($(this).hasClass("on")) {
  596. if ((SBRadicalsEnabled && SBKanjiEnabled) || (SBRadicalsEnabled && SBVocabularyEnabled) || (SBKanjiEnabled && SBVocabularyEnabled)) {
  597. if ($(this).attr("class") == "bsbir on") {
  598. localStorage.setItem("SBRadicalsEnabled", false);
  599. SBRadicalsEnabled = false;
  600. //if (curSBItemType == 0) skipItem();
  601. } else if ($(this).attr("class") == "bsbik on") {
  602. localStorage.setItem("SBKanjiEnabled", false);
  603. SBKanjiEnabled = false;
  604. //if (curSBItemType == 1) skipItem();
  605. } else if ($(this).attr("class") == "bsbiv on") {
  606. localStorage.setItem("SBVocabularyEnabled", false);
  607. SBVocabularyEnabled = false;
  608. //if (curSBItemType == 2) skipItem();
  609. }
  610. } else cancel = true;
  611. } else {
  612. if ($(this).attr("class") == "bsbir") {
  613. localStorage.removeItem("SBRadicalsEnabled");
  614. SBRadicalsEnabled = true;
  615. } else if ($(this).attr("class") == "bsbik") {
  616. localStorage.removeItem("SBKanjiEnabled");
  617. SBKanjiEnabled = true;
  618. } else if ($(this).attr("class") == "bsbiv") {
  619. localStorage.removeItem("SBVocabularyEnabled");
  620. SBVocabularyEnabled = true;
  621. }
  622. }
  623. if (!cancel) $(this).toggleClass("on");
  624. });
  625. $('.bsbs div').css({"font-size": "20px", "width": "72px"}).click(function() {
  626. var cancel = false;
  627. if ($(this).hasClass("on")) {
  628. if ((SBApprenticeEnabled && SBGuruEnabled) || (SBApprenticeEnabled && SBMasterEnabled) || (SBApprenticeEnabled && SBEnlightenEnabled) ||
  629. (SBApprenticeEnabled && SBBurnedEnabled) || (SBApprenticeEnabled && SBLockedEnabled) || (SBGuruEnabled && SBMasterEnabled) ||
  630. (SBGuruEnabled && SBEnlightenEnabled) || (SBGuruEnabled && SBBurnedEnabled) || (SBGuruEnabled && SBLockedEnabled) ||
  631. (SBMasterEnabled && SBEnlightenEnabled) || (SBMasterEnabled && SBBurnedEnabled) || (SBMasterEnabled && SBLockedEnabled) ||
  632. (SBEnlightenEnabled && SBBurnedEnabled) || (SBEnlightenEnabled && SBBurnedEnabled) || (SBBurnedEnabled && SBLockedEnabled)) {
  633. if ($(this).attr("class") == "bsbsa on") {
  634. localStorage.setItem("SBApprenticeEnabled", false);
  635. SBApprenticeEnabled = false;
  636. $(".Apprentice").css("visibility", "hidden");
  637. } else if ($(this).attr("class") == "bsbsg on") {
  638. localStorage.setItem("SBGuruEnabled", false);
  639. SBGuruEnabled = false;
  640. $(".Guru").css("visibility", "hidden");
  641. } else if ($(this).attr("class") == "bsbsm on") {
  642. localStorage.setItem("SBMasterEnabled", false);
  643. SBMasterEnabled = false;
  644. $(".Master").css("visibility", "hidden");
  645. } else if ($(this).attr("class") == "bsbse on") {
  646. localStorage.setItem("SBEnlightenEnabled", false);
  647. SBEnlightenEnabled = false;
  648. $(".Enlightened").css("visibility", "hidden");
  649. } else if ($(this).attr("class") == "bsbsb on") {
  650. localStorage.setItem("SBBurnedEnabled", false);
  651. SBBurnedEnabled = false;
  652. $(".Burned").css("visibility", "hidden");
  653. } else if ($(this).attr("class") == "bsbsl on") {
  654. localStorage.setItem("SBLockedEnabled", false);
  655. SBLockedEnabled = false;
  656. $(".Locked").css("visibility", "hidden");
  657. }
  658. } else cancel = true;
  659. } else {
  660. if ($(this).attr("class") == "bsbsa") {
  661. localStorage.removeItem("SBApprenticeEnabled");
  662. SBApprenticeEnabled = true;
  663. $(".Apprentice").css("visibility", "inherit");
  664. } else if ($(this).attr("class") == "bsbsg") {
  665. localStorage.removeItem("SBGuruEnabled");
  666. SBGuruEnabled = true;
  667. $(".Guru").css("visibility", "inherit");
  668. } else if ($(this).attr("class") == "bsbsm") {
  669. localStorage.removeItem("SBMasterEnabled");
  670. SBMasterEnabled = true;
  671. $(".Master").css("visibility", "inherit");
  672. } else if ($(this).attr("class") == "bsbse") {
  673. localStorage.removeItem("SBEnlightenEnabled");
  674. SBEnlightenEnabled = true;
  675. $(".Enlightened").css("visibility", "inherit");
  676. } else if ($(this).attr("class") == "bsbsb") {
  677. localStorage.removeItem("SBBurnedEnabled");
  678. SBBurnedEnabled = true;
  679. $(".Burned").css("visibility", "inherit");
  680. } else if ($(this).attr("class") == "bsbsl") {
  681. localStorage.removeItem("SBLockedEnabled");
  682. SBLockedEnabled = true;
  683. $(".Locked").css("visibility", "inherit");
  684. }
  685. }
  686. if (!cancel) $(this).toggleClass("on");
  687. });
  688. $('.bsbt div').css({"height": "24px"}).click(function() {
  689. $(this).toggleClass("on");
  690. if ($(this).children(".bsbt div span").html() == "日本語") {
  691. if (!SBLangJP) localStorage.setItem("SBLangJP", true);
  692. else localStorage.removeItem("SBLangJP");
  693. switchSBLang();
  694. } else if ($(this).children(".bsbt div span").html() == "Cache" || $(this).children(".bsbt div span").html() == "キャッシュ") {
  695. if (!SBUseCache) localStorage.setItem("SBUseCache", true);
  696. else localStorage.removeItem("SBUseCache");
  697. SBUseCache = !SBUseCache;
  698. } else {
  699. if (SBStart) localStorage.setItem("SBStart", false);
  700. else localStorage.removeItem("SBStart");
  701. SBStart = !SBStart;
  702. }
  703. });
  704. /*$("#scroll-box-bg").click(function() {
  705. //StartSBDrag();
  706. });*/
  707. //for (var l = 0; l < Object.keys(SBIndex.vocabulary.locked).length; l++) alert(SBIndex.vocabulary.locked[l]);
  708. newSBItemTimer = setInterval(newSBItem, 1500);
  709. }
  710.  
  711. function SBSelect(target, type) {
  712. $(".SBSelect").remove();
  713. if (target !== null) {
  714. $('<div class="SBSelect"></div>').insertBefore($(target));
  715. $(".SBSelect").attr("style", $(target).attr("style")).css({"z-index": 100, "min-width": ($(target).width() - 4), "height": ($(target).height() - 4), "background": ((type == 0) ? "#0af" : ((type == 1) ? "#f0a" : "#a0f")),
  716. "border": "2px inset " + ((type == 0) ? "#0093dd" : ((type == 1) ? "#dd0093" : "#9300dd"))});
  717. }
  718. }
  719.  
  720. function rand(low, high) {
  721. return Math.floor(Math.random()*(high+1)) + low;
  722. }
  723.  
  724. function filterSBRadicalData(data) {
  725. var dataArr = {};
  726. for (var d = 1; d < data.length; d++) {
  727. dataArr[Object.keys(dataArr).length] = {"character": data[d].substring(0, 1), "meaning": data[d].substring(data[d].indexOf('"meaning":"') + 11, data[d].indexOf('","image"')).split(", "),
  728. "image": data[d].substring(data[d].indexOf('"image":"') + 10, data[d].indexOf('","level"')).split(", "),
  729. "srs": ((data[d].indexOf('"srs":') > -1) ? data[d].substring(data[d].indexOf('"srs":"') + 7, data[d].indexOf('","unl')) : null)
  730. };
  731. if (dataArr[Object.keys(dataArr).length - 1].srs !== null) {
  732. SBIndex.radicals[dataArr[Object.keys(dataArr).length - 1].srs][SBIndexCount.radicals[dataArr[Object.keys(dataArr).length - 1].srs]] = d - 1;
  733. SBIndexCount.radicals[dataArr[Object.keys(dataArr).length - 1].srs]++;
  734. } else {
  735. SBIndex.radicals.locked[SBIndexCount.radicals.locked] = d - 1;
  736. SBIndexCount.radicals.locked++;
  737. }
  738. }
  739. //alert(SBIndexCount.radicals);
  740. return dataArr;
  741. }
  742.  
  743. function filterSBKanjiData(data) {
  744. var dataArr = {};
  745. for (var d = 1; d < data.length; d++) {
  746. dataArr[Object.keys(dataArr).length] = {"character": data[d].substring(0, 1), "meaning": data[d].substring(data[d].indexOf('"meaning":"') + 11, data[d].indexOf('","onyomi"')).split(", "),
  747. "onyomi": data[d].substring(data[d].indexOf('"onyomi":"') + 10, data[d].indexOf('","kunyomi"')).split(", "), "kunyomi": data[d].substring(data[d].indexOf('"kunyomi":"') + 11,
  748. data[d].indexOf('","important')).split(", "), "important_reading": data[d].substring(data[d].indexOf('"important_reading":"') + 21, data[d].indexOf('","level"')),
  749. "srs": ((data[d].indexOf('"srs":') > -1) ? data[d].substring(data[d].indexOf('"srs":"') + 7, data[d].indexOf('","unl')) : null)
  750. };
  751. if (dataArr[Object.keys(dataArr).length - 1].srs !== null) {
  752. SBIndex.kanji[dataArr[Object.keys(dataArr).length - 1].srs][SBIndexCount.kanji[dataArr[Object.keys(dataArr).length - 1].srs]] = d - 1;
  753. SBIndexCount.kanji[dataArr[Object.keys(dataArr).length - 1].srs]++;
  754. } else {
  755. SBIndex.kanji.locked[SBIndexCount.kanji.locked] = d - 1;
  756. SBIndexCount.kanji.locked++;
  757. }
  758. }
  759. return dataArr;
  760. }
  761.  
  762. function filterSBVocabData(data) {
  763. var dataArr = {};
  764. for (var p = 0; p < Object.keys(data).length; p++) {
  765. for (var d = 1; d < Object.keys(data[p]).length; d++) {
  766. dataArr[Object.keys(dataArr).length] = {"character": data[p][d].substring(0, data[p][d].indexOf('"')), "kana": data[p][d].substring(data[p][d].indexOf('"kana":"') + 8, data[p][d].indexOf('","meaning"')).split(", "),
  767. "meaning": (data[p][d].substring(data[p][d].indexOf('"meaning":"') + 11, data[p][d].indexOf('","level"'))).split(", "),
  768. "srs": ((data[p][d].indexOf('"srs":') > -1) ? data[p][d].substring(data[p][d].indexOf('"srs":"') + 7, data[p][d].indexOf('","unl')) : null)
  769. };
  770. if (dataArr[Object.keys(dataArr).length - 1].srs !== null) {
  771. SBIndex.vocabulary[dataArr[Object.keys(dataArr).length - 1].srs][SBIndexCount.vocabulary[dataArr[Object.keys(dataArr).length - 1].srs]] = Object.keys(dataArr).length - 1;
  772. SBIndexCount.vocabulary[dataArr[Object.keys(dataArr).length - 1].srs]++;
  773. } else {
  774. SBIndex.vocabulary.locked[SBIndexCount.vocabulary.locked] = Object.keys(dataArr).length - 1;
  775. SBIndexCount.vocabulary.locked++;
  776. }
  777. }
  778. }
  779. return dataArr;
  780. }
  781.  
  782. cancelExecution = false;
  783.  
  784. if (localStorage.getItem("apiKey") !== null && localStorage.getItem("apiKey").length == 32) apiKey = localStorage.getItem("apiKey");
  785. else if (apiKey.length == 32) localStorage.setItem("apiKey", apiKey);
  786. else {
  787. cancelExecution = true;
  788. alert("Please enter your API key near the top of the WanaKani Scroll Box userscript.");
  789. }
  790.  
  791. newSBItemTimer = 0;
  792.  
  793. if (!cancelExecution) {
  794. SBLangJP = (localStorage.getItem("SBLangJP") == null) ? false : true;
  795. SBUseCache = (localStorage.getItem("SBUseCache") == null) ? false : true;
  796. SBStart = (localStorage.getItem("SBStart") == null) ? true : false;
  797. if (localStorage.getItem("SBHeight") == null) localStorage.setItem("SBHeight", 2);
  798. SBHeight = localStorage.getItem("SBHeight");
  799. SBICount = 0;
  800. SBScrollLeft = 0;
  801. SBPause = false;
  802. SBRadicalsEnabled = (localStorage.getItem("SBRadicalsEnabled") !== null) ? false : true;
  803. SBKanjiEnabled = (localStorage.getItem("SBKanjiEnabled") !== null) ? false : true;
  804. SBVocabularyEnabled = (localStorage.getItem("SBVocabularyEnabled") !== null) ? false : true;
  805. SBApprenticeEnabled = (localStorage.getItem("SBApprenticeEnabled") !== null) ? false : true;
  806. SBGuruEnabled = (localStorage.getItem("SBGuruEnabled") !== null) ? false : true;
  807. SBMasterEnabled = (localStorage.getItem("SBMasterEnabled") !== null) ? false : true;
  808. SBEnlightenEnabled = (localStorage.getItem("SBEnlightenEnabled") !== null) ? false : true;
  809. SBBurnedEnabled = (localStorage.getItem("SBBurnedEnabled") !== null) ? false : true;
  810. SBLockedEnabled = (localStorage.getItem("SBLockedEnabled") !== null) ? false : true;
  811. SBRadicalData = {};
  812. SBKanjiData = {};
  813. SBVocabData = {};
  814. SBLevels = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50";
  815. SBIndex = (localStorage.getItem("SBIndex") !== null) ? JSON.parse(localStorage.getItem("SBIndex")) : {
  816. "radicals": {
  817. "apprentice": [], "guru": [], "master": [], "enlighten": [], "burned": [], "locked": []
  818. }, "kanji": {
  819. "apprentice": [], "guru": [], "master": [], "enlighten": [], "burned": [], "locked": []
  820. }, "vocabulary": {
  821. "apprentice": [], "guru": [], "master": [], "enlighten": [], "burned": [], "locked": []
  822. }
  823. };
  824. SBIndexCount = (localStorage.getItem("SBIndexCount") !== null) ? JSON.parse(localStorage.getItem("SBIndexCount")) : {
  825. "radicals": {
  826. "apprentice": 0, "guru": 0, "master": 0, "enlighten": 0, "burned": 0, "locked": 0
  827. }, "kanji": {
  828. "apprentice": 0, "guru": 0, "master": 0, "enlighten": 0, "burned": 0, "locked": 0
  829. }, "vocabulary": {
  830. "apprentice": 0, "guru": 0, "master": 0, "enlighten": 0, "burned": 0, "locked": 0
  831. }
  832. };
  833. $(getSBSection()).insertBefore($(".review-status ul"));
  834. if (!SBLangJP) $("#loadingSB").html('<a lang="ja" href="javascript:void(0)" style="font-size: 52px; color: #434343; text-decoration: none">Start</a>');
  835. else $("#loadingSB").html('<a lang="ja" href="javascript:void(0)" style="font-size: 52px; color: #434343; text-decoration: none">開始</a>');
  836. $("#loadingSB a").click( function() {
  837. if (!SBUseCache) clearSBItemData();
  838. getSBWKData();
  839. });
  840. if (!SBStart) $("#loadingSB a").click();
  841. }
  842. // ==/UserScript==