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