Created
April 24, 2016 14:00
-
-
Save mjuzikfrik/8bb0f1154d00eda7eff74e7ee6dbde65 to your computer and use it in GitHub Desktop.
WK Ultimate Reorder
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Wanikani Reorder Ultimate 2 Embe Mod | |
// @namespace https://www.wanikani.com | |
// @description Learn in the order you want to. | |
// @version 2.0.23 | |
// @include *://www.wanikani.com/lesson/session* | |
// @include *://www.wanikani.com/review/session* | |
// @grant none | |
// ==/UserScript== | |
// Original source: https://gist.github.com/xMunch/6beafa1a79a77386cd92/raw/WKU.user.js | |
// Wanikani thread: https://www.wanikani.com/chat/api-and-third-party-apps/8471/page/31#post332221 | |
// Author: xMunch | |
(function ($) {$.each(['hide', 'addClass'], function (i, ev) { var el = $.fn[ev]; $.fn[ev] = function () { this.trigger(ev); return el.apply(this, arguments); }; }); })(jQuery);/* | |
* HTML5 Sortable jQuery Plugin | |
* http://farhadi.ir/projects/html5sortable | |
* | |
* Copyright 2012, Ali Farhadi | |
* Released under the MIT license. | |
*/ | |
(function(e){var t,n=e();e.fn.sortable=function(r){var i=String(r);r=e.extend({connectWith:false},r);return this.each(function(){if(/^enable|disable|destroy$/.test(i)){var s=e(this).children(e(this).data("items")).attr("draggable",i=="enable");if(i=="destroy"){s.add(this).removeData("connectWith items").off("dragstart.h5s dragend.h5s selectstart.h5s dragover.h5s dragenter.h5s drop.h5s")}return}var o,u,s=e(this).children(r.items);var a=e("<"+(/^ul|ol$/i.test(this.tagName)?"li":"div")+' class="sortable-placeholder">');s.find(r.handle).mousedown(function(){o=true}).mouseup(function(){o=false});e(this).data("items",r.items);n=n.add(a);if(r.connectWith){e(r.connectWith).add(this).data("connectWith",r.connectWith)}s.attr("draggable","true").on("dragstart.h5s",function(n){if(r.handle&&!o){return false}o=false;var i=n.originalEvent.dataTransfer;i.effectAllowed="move";i.setData("Text","dummy");u=(t=e(this)).addClass("sortable-dragging").index()}).on("dragend.h5s",function(){if(!t){return}t.removeClass("sortable-dragging").show();n.detach();if(u!=t.index()){t.parent().trigger("sortupdate",{item:t})}t=null}).not("a[href], img").on("selectstart.h5s",function(){this.dragDrop&&this.dragDrop();return false}).end().add([this,a]).on("dragover.h5s dragenter.h5s drop.h5s",function(i){if(!s.is(t)&&r.connectWith!==e(t).parent().data("connectWith")){return true}if(i.type=="drop"){i.stopPropagation();n.filter(":visible").after(t);t.trigger("dragend.h5s");return false}i.preventDefault();i.originalEvent.dataTransfer.dropEffect="move";if(s.is(this)){if(r.forcePlaceholderSize){a.height(t.outerHeight())}t.hide();e(this)[a.index()<e(this).index()?"after":"before"](a);n.not(a).detach()}else if(!n.is(this)&&!e(this).children(r.items).length){n.detach();e(this).append(a)}return false})})}})(jQuery); | |
var ui_css = | |
'.ui, .ui-small {'+ | |
' list-style: none;'+ | |
' color: #000000;'+ | |
' margin: 5px;'+ | |
' padding: 5px;'+ | |
' min-height: 30px;'+ | |
' background: #eeeeee;'+ | |
'}'+ | |
'.ui-small {margin: 5px;padding: 5px;text-align: right;margin-bottom: 5px;}'+ | |
'.center {margin: 0 auto;}'+ | |
'#left {min-width: 150px; min-height: 150px;}'+ | |
'#mid {padding-top: 20px; text-align: center;}'+ | |
'#right {min-width: 150px; min-height: 150px; text-align: right;}'+ | |
'.fob item {'+ | |
' cursor: pointer;'+ | |
' display: inline-block;'+ | |
' font-size: 16px;'+ | |
' margin-left: -43px;'+ | |
' horizontal-align: center;'+ | |
' padding: 0.4em 0.4em 0.3em;'+ | |
' color: #fff;'+ | |
' line-height: 1em;'+ | |
' border-radius: 2px;'+ | |
' background-color: #c8c8c8;'+ | |
' -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.1);'+ | |
' -moz-box-shadow: inset 0 0 10px rgba(0,0,0,0.1);'+ | |
' box-shadow: inset 0 0 10px rgba(0,0,0,0.1);'+ | |
' -webkit-box-sizing: border-box;'+ | |
' -moz-box-sizing: border-box;'+ | |
' box-sizing: border-box;'+ | |
'}'+ | |
'.unsorted, .hidden {display: none !important; visibility: none !important}'+ | |
'item[id^=level-] {background-color: #5571E2}'+ | |
'.sortable {padding: 0}'+ | |
'.sortable item {'+ | |
' cursor: pointer;'+ | |
' display: inline-block;'+ | |
' font-size: 16px;'+ | |
' list-style: none;'+ | |
' margin-top: 0.28em;'+ | |
' margin-right: 0.25em;'+ | |
' padding: 0.4em 0.4em 0.3em;'+ | |
' color: #fff;'+ | |
' line-height: 1em;'+ | |
' text-shadow: 1px 1px 0 rgba(0,0,0,0.1);'+ | |
' -webkit-border-radius: 2px;'+ | |
' -moz-border-radius: 2px;'+ | |
' border-radius: 2px;'+ | |
' -webkit-box-shadow: 2px 2px 0 #d5d5d5;'+ | |
' -moz-box-shadow: 2px 2px 0 #d5d5d5;'+ | |
' box-shadow: 2px 2px 0 #d5d5d5;'+ | |
' -webkit-box-sizing: border-box;'+ | |
' -moz-box-sizing: border-box;'+ | |
' box-sizing: border-box;'+ | |
'}'+ | |
'.sortable-placeholder {'+ | |
' display: inline !important;'+ | |
' border: 0px dashed #CCC !important;'+ | |
' background: none;'+ | |
' padding: 0.4em 0.4em 0.3em; !important;'+ | |
'}'+ | |
'#priority, #priority2 {'+ | |
' background: url(http://i.imgur.com/VbrYlGF.png);'+ | |
' background-repeat: no-repeat;'+ | |
' width: 150px;'+ | |
' height: 150px;'+ | |
' display: block'+ | |
'}'+ | |
'#priority {float: right;}'+ | |
'.balance {background-position: -1px -1px !important}'+ | |
'.balance2 {background-position: -153px -1px !important}'+ | |
'.level-heavy {background-position: -1px -153px !important}'+ | |
'.meaning-heavy {background-position: -153px -153px !important}'+ | |
'.reading-heavy {background-position: -305px -1px !important}'+ | |
'.type-heavy {background-position: -305px -153px !important}'+ | |
'#overlay {'+ | |
' background-image: url(http://i.imgur.com/7drJZs4.png);'+ | |
' background-repeat: no-repeat;'+ | |
' display: block;'+ | |
'}'+ | |
'.top {width: 150px; height: 150px; background-position: -1px -1px;}'+ | |
'.bottom {width: 150px; height: 150px; background-position: -153px -1px;}'+ | |
'.middle {width: 150px; height: 150px; background-position: -1px -153px;}'+ | |
'#reverse {margin-left:20px; cursor:pointer;}'+ | |
'#quick-next {cursor: pointer; display: inline-block; color: #888; font-size: 16px;}'+ | |
'#quick-next.active {color: orange;}'+ | |
'#version {float: right;}'; | |
var ui_html = | |
'<div class="ui-small hidden pure-g-r">'+ | |
' <div id="icon-plus" class="icon-plus" style="margin-right: 5px"></div>'+ | |
'</div>'+ | |
'<div class="ui pure-g-r">'+ | |
'<div class="pure-u-1-4" id="left">'+ | |
'<div id="r-only">'+ | |
' <div style="padding: 10px;"><input type="checkbox" id="mode"> Single Mode | <div id="quick-next" class="icon-bolt"></div></div>'+ | |
' <div class="balance2" id="priority2"><div id="overlay" class=""></div></div>'+ | |
' </div>'+ | |
'</div>'+ | |
'<div class="pure-u-1-2" id="mid">'+ | |
' <div>'+ | |
' <ul class="sortable" id="types">'+ | |
' <div>'+ | |
' <input type="checkbox" id="sort-types" value="checked" checked=""> Sort Types'+ | |
' <span id="reverse" class="icon-refresh"><span style="font-family:Source Sans Pro;"> Reverse</span></span>'+ | |
' </div>'+ | |
' <item class="radical" style="background-color:#0af;" draggable="true">Radicals</item>'+ | |
' <item class="kanji" style="background-color:#f0a;" draggable="true">Kanji</item>'+ | |
' <item class="vocabulary" style="background-color:#AA38C6;" draggable="true">Vocabulary</item>'+ | |
' </ul>'+ | |
' </div>'+ | |
' <div>'+ | |
' <ul class="sortable" id="levels" style="margin-top: -12px">'+ | |
' <div>'+ | |
' <input type="checkbox" id="sort-levels" checked=""> Sort Levels'+ | |
' <span id="reverse" class="icon-refresh"><span style="font-family:Source Sans Pro;"> Reverse</span></span>'+ | |
' </div>'+ | |
' </ul>'+ | |
' </div>'+ | |
' <div>'+ | |
' <ul class="fob">'+ | |
' <item id="reorder" onclick="this.blur();" tabindex="-1">Force Reorder</item>'+ | |
' </ul>'+ | |
' </div>'+ | |
'</div>'+ | |
'<div class="pure-u-1-4" id="right">'+ | |
' <div><div id="icon-minus" class="icon-minus" style="color:black; margin-bottom: 17px;"></div></div>'+ | |
' <div class="balance" id="priority" style="margin-top: 20px"><div id="overlay" class=""></div></div>'+ | |
' </div>'+ | |
'</div>'; | |
var activeLevels = []; | |
var dataset = {}; | |
var lastUpdate = new Date().getTime(); | |
var lessonset = { | |
quick: 'l', | |
queue: 'l/lessonQueue', | |
active: 'l/activeQueue', | |
updateVisual: function() { | |
$('li[data-index="0"]').click(); | |
var items = $.jStorage.get(dataset.queue).concat($.jStorage.get(dataset.active)); | |
$.jStorage.set('l/count/rad', sorter.filterType("rad", items).length); | |
$.jStorage.set('l/count/kan', sorter.filterType("kan", items).length); | |
$.jStorage.set('l/count/voc', sorter.filterType("voc", items).length); | |
} | |
}; | |
var showerr = function(err) { | |
$('#supplement-info, #information').first().after('<div id="error" style="text-align:center;">An error has occurred within WaniKani Reorder Ultimate. Please post the error below on the forum thread.<br><a href="https://www.wanikani.com/chat/api-and-third-party-apps/8471" target="_blank">https://www.wanikani.com/chat/api-and-third-party-apps/8471</a><br><br>' + err + '<br>' + err.stack + '<br><br>Logs:<br>' + console.dlog.join('<br>') + '</div>'); | |
}; | |
var reviewset = { | |
quick: 'r', | |
queue: 'reviewQueue', | |
active: 'activeQueue', | |
updateVisual: function() { | |
var item = $.jStorage.get(dataset.active)[Math.floor(window.Math.random(true))]; | |
if (item.rad) { | |
$.jStorage.set('questionType', 'meaning'); | |
} | |
if (item) { | |
$.jStorage.set('currentItem', item); | |
} | |
var count = $.jStorage.get(dataset.queue).length + $.jStorage.get(dataset.active).length; | |
$("#available-count").html(count); // to stop the double-up bug. | |
} | |
}; | |
var ordered = false; | |
var settings = { | |
data: { | |
sorttypes: !0, | |
sortlevels: !0, | |
onebyone: !1, | |
quickNext: !1, | |
priority: { | |
'rad': 1, | |
'kan': 2, | |
'voc': 3, | |
}, | |
questionTypeMode: "0", | |
typePriorityMode: "0" | |
}, | |
load: function() { | |
var a = $.jStorage.get('WKU/' + dataset.quick + '/settings'); | |
if (a === null) { | |
settings.save(); | |
return settings.load(); | |
} | |
utilities.log("Loading settings..."); | |
for (var s in settings.data) { | |
if (a[s] !== null) settings.data[s] = a[s]; | |
} | |
$('#types item').sort(function(a, b) { | |
return sorter.getHTMLElementPriority(a) - sorter.getHTMLElementPriority(b); | |
}).appendTo('#types'); | |
$('#sort-types').prop('checked', settings.data.sorttypes).change(); | |
$('#sort-levels').prop('checked', settings.data.sortlevels).change(); | |
$('#priority').removeClass().addClass(utilities.settingsValueToClass('priority', settings.data.typePriorityMode)); | |
$('#quick-next').toggleClass('active', settings.data.quickNext); | |
if (dataset.quick === 'r') { | |
$('#mode').prop('checked', settings.data.onebyone).change(); | |
$('#priority2').removeClass().addClass(utilities.settingsValueToClass('priority2', settings.data.questionTypeMode)); | |
} | |
utilities.log(settings.data); | |
}, | |
save: function() { | |
$.jStorage.set('WKU/' + dataset.quick + '/settings', settings.data); | |
} | |
}; | |
var setup = { | |
init: function() { | |
try { | |
$('div[id*="loading"]').off('hide'); | |
console.dlog = []; | |
utilities.log("WKU Init()"); | |
if (!setup.update.check()) { | |
setup.update.patch(); | |
} else { | |
setup.ui.create(); | |
} | |
} catch (err) { | |
showerr(err); | |
} | |
}, | |
update: { | |
apply: function() { | |
try { | |
utilities.log("Applying UID levels"); | |
var queue = $.jStorage.get(dataset.active).concat($.jStorage.get(dataset.queue)); | |
var current = $.jStorage.get('currentItem'); | |
var list = $.jStorage.get('uids') || []; | |
$.each(queue, function() { | |
this.level = list[utilities.toUID(this)] || 0; | |
if (current && utilities.toUID(this) === utilities.toUID(current)) { | |
$.jStorage.set('currentItem', this); | |
} | |
if (activeLevels.indexOf(this.level) == -1) { | |
activeLevels.push(this.level); | |
} | |
}); | |
activeLevels.sort(function(a, b) { | |
return a - b; | |
}); | |
var review = queue.splice((dataset.quick === 'r' ? 10 : $.jStorage.get('l/batchSize'))); | |
$.jStorage.set(dataset.active, queue); | |
$.jStorage.set(dataset.queue, review); | |
dataset.updateVisual(); | |
} catch (err) { | |
showerr(err); | |
} | |
}, | |
check: function() { | |
try { | |
utilities.log("Checking for UID updates"); | |
var all = $.jStorage.get(dataset.queue).concat($.jStorage.get(dataset.active)); | |
var list = $.jStorage.get('uids') || []; | |
return list && all.every(function(ele) { | |
return ele && list[utilities.toUID(ele)]; | |
}); | |
} catch (err) { | |
showerr(err); | |
} | |
}, | |
patch: function() { | |
try { | |
utilities.log("Gathering data for patch"); | |
var count = 0; | |
var all = {}; | |
$('#information, #supplement-info').first().after('<div id="updateUID" style="text-align:center;">WKU::Please Wait::Currently updating UID list... <span id="id-percent">0%</span></div>'); | |
["radicals", "kanji", "vocabulary"].forEach(function(ele1, ind1, arr1) { | |
["PLEASANT", "PAINFUL", "DEATH", "HELL", "PARADISE", "REALITY"].forEach(function(ele2, ind2, arr2) { | |
$.get('https://www.wanikani.com/' + ele1 + '?difficulty=' + ele2, function(resp) { | |
$('#id-percent').text(Math.round((++count / (arr1.length * arr2.length)) * 100) + "%"); | |
$(resp).find('section[id^=level-]').each(function() { | |
var level = $(this).attr('id').replace(/[^\d]/g, ""); | |
$(this).find('.character-item').each(function() { | |
var a = $(this).attr('id'); | |
a = a.substr(0, 1) + a.replace(/[^\d]/g, ""); | |
all[a] = level; | |
}); | |
}); | |
if (count >= (arr1.length * arr2.length)) { | |
$.jStorage.set('uids', all); | |
utilities.log("DONE!"); | |
$('#updateUID').remove(); | |
setup.ui.create(); | |
} | |
}).fail(function() { | |
$('#supplement-info, #information').first().after('<div id="error" style="text-align:center;">WaniKani Reorder Ultimate has failed to load [' + ele2 + ' level ' + ele1 + ']<br>Please reload the page.</div>'); | |
}); | |
}); | |
}); | |
} catch (err) { | |
showerr(err); | |
} | |
} | |
}, | |
ui: { | |
create: function() { | |
setup.update.apply(); | |
$('head').append('<style>'+ui_css+'</style>'); | |
utilities.log("Creating UI..."); | |
var info = $('#supplement-info, #information').first(); | |
info.after(ui_html); | |
$('#version').text("v" + GM_info.script.version); | |
if (dataset.quick === 'l') { | |
$('.ui').find('#r-only').remove(); | |
} | |
if (!setup.update.check()) { | |
$('.ui-small').first().before('<div id="updateUID-failed" style="text-align:center; display:none;">Failed to update UIDs.<br>Complain here <a href="https://www.wanikani.com/chat/api-and-third-party-apps/8471" target="_blank">https://www.wanikani.com/chat/api-and-third-party-apps/8471</a><div>'); | |
$('#updateUID-failed').fadeIn(500).delay(7500).fadeOut(500); | |
} | |
$('fieldset').on('addClass', function(evt) { | |
if (settings.data.quickNext) { | |
setTimeout(function() { | |
if ($('fieldset').hasClass('correct')) { | |
$('fieldset button').click(); | |
} | |
}, 25); | |
} | |
}); | |
$('#quick-next').click(function() { | |
$(this).toggleClass('active'); | |
settings.data.quickNext = $(this).hasClass('active'); | |
settings.save(); | |
}); | |
$('#priority, #priority2').click(function(e) { | |
var offset = $(this).offset(); | |
var x = (e.pageX - offset.middle); | |
var y = (e.pageY - offset.top); | |
var id = $(this).attr('id'); | |
if (y < 50) { | |
if (id === "priority") { | |
$(this).removeClass().addClass("level-heavy"); | |
settings.data.typePriorityMode = "1"; | |
sorter.reorder(); | |
} else { | |
$(this).removeClass().addClass("reading-heavy"); | |
settings.data.questionTypeMode = "1"; | |
utilities.forceQuestionTypeUpdate(); | |
} | |
} else { if (y > 100) { | |
if (id === "priority") { | |
$(this).removeClass().addClass("type-heavy"); | |
settings.data.typePriorityMode = "2"; | |
sorter.reorder(); | |
} else { | |
$(this).removeClass().addClass("meaning-heavy"); | |
settings.data.questionTypeMode = "2"; | |
utilities.forceQuestionTypeUpdate(); | |
} | |
} | |
else { | |
if (id === "priority") { | |
$(this).removeClass().addClass("balance"); | |
settings.data.typePriorityMode = "0"; | |
sorter.reorder(); | |
} else { | |
$(this).removeClass().addClass("balance2"); | |
settings.data.questionTypeMode = "0"; | |
utilities.forceQuestionTypeUpdate(); | |
} | |
}} | |
settings.save(); | |
}).mousemove(function(e) { | |
var offset = $(this).offset(); | |
var x = (e.pageX - offset.middle); | |
var y = (e.pageY - offset.top); | |
var ele = $(this).find('#overlay'); | |
if (y < 50) { | |
ele.removeClass().addClass('top'); | |
} else { if (y > 100) { | |
ele.removeClass().addClass('bottom'); | |
} | |
else { | |
ele.removeClass().addClass('middle'); | |
}} | |
}).mouseleave(function(e) { | |
$(this).find('#overlay').removeClass(); | |
}); | |
activeLevels.forEach(function(ele) { | |
$('.ui #levels').append('<item id="level-' + ele + '">' + ele + '</item>'); | |
}); | |
$('span#reverse').click(function() { | |
var parent = $(this).parents('.sortable'); | |
var items = parent.children('item'); | |
parent.append(items.get().reverse()); | |
sorter.reorder(); | |
settings.save(); | |
}); | |
$('.icon-minus, .icon-plus').click(function() { | |
$('.ui, .ui-small').toggleClass('hidden'); | |
}); | |
$('#sort-types, #sort-levels').change(function() { | |
$(this).parents('.sortable').find('item').toggleClass('unsorted', !this.checked); | |
settings.data[$(this).attr('id').replace("-", "")] = this.checked; | |
settings.save(); | |
}); | |
if (dataset.quick === 'r') { | |
$('#mode').on('change', function() { | |
settings.data.onebyone = this.checked; | |
if (settings.data.questionTypeMode > 0) { | |
utilities.forceQuestionTypeUpdate(); | |
} | |
settings.save(); | |
}); | |
$('#option-wrap-up').click(function() { | |
if ($(this).attr('class') === 'wrap-up-selected') { | |
var fullQueue = $.jStorage.get(dataset.active).concat($.jStorage.get(dataset.queue)); | |
$.jStorage.set(dataset.active, fullQueue.splice(0, 10)); | |
$.jStorage.set(dataset.queue, fullQueue); | |
} else { | |
if (ordered) { | |
sorter.reorder(); | |
} | |
} | |
}); | |
} | |
settings.load(); | |
setup.ui.toggler(); | |
$('#reorder').click(function() { | |
sorter.reorder(); | |
}); | |
$('body').on('contextmenu', '.ui', function(e) { | |
e.preventDefault(); | |
}); | |
$('item').mousedown(function(event) { | |
if (event.which === 3) { | |
var ele = $(this).addClass('hidden'); | |
if (ele.attr('id')) { | |
sorter.removeLevel(parseInt(ele.text())); | |
} else { | |
sorter.removeType(ele.attr('class')); | |
} | |
} | |
}); | |
$('.sortable').sortable({ | |
items: ':not(div, button)' | |
}).bind('sortupdate', function() { | |
sorter.reorder(); | |
settings.save(); | |
}); | |
}, | |
toggler: function() { | |
if ($('.sortable').length) { | |
var fq = $.jStorage.get(dataset.queue).concat($.jStorage.get(dataset.active)); | |
if (!fq.length) { | |
utilities.log("There are no options available... Removing UI."); | |
$('.ui').remove(); | |
} else { | |
$('#types .radical').toggleClass('hidden', !sorter.filterType("rad", fq).length).prop('title', function() { | |
var filtered = sorter.filterType("rad", fq); | |
var text = "Total: " + filtered.length; | |
$.each(activeLevels, function() { | |
var amount = sorter.filterLevel(this, filtered).length; | |
if (amount) { | |
text += "\nLevel " + this + ": " + amount + ""; | |
} | |
}); | |
return text; | |
}); | |
$('#types .kanji').toggleClass('hidden', !sorter.filterType("kan", fq).length).prop('title', function() { | |
var filtered = sorter.filterType("kan", fq); | |
var text = "Total: " + filtered.length; | |
$.each(activeLevels, function() { | |
var amount = sorter.filterLevel(this, filtered).length; | |
if (amount) { | |
text += "\nLevel " + this + ": " + amount + ""; | |
} | |
}); | |
return text; | |
}); | |
$('#types .vocabulary').toggleClass('hidden', !sorter.filterType("voc", fq).length).prop('title', function() { | |
var filtered = sorter.filterType("voc", fq); | |
var text = "Total: " + filtered.length; | |
$.each(activeLevels, function() { | |
var amount = sorter.filterLevel(this, filtered).length; | |
if (amount) { | |
text += "\nLevel " + this + ": " + amount + ""; | |
} | |
}); | |
return text; | |
}); | |
activeLevels.forEach(function(level) { | |
$('#level-' + level).toggleClass('hidden', !sorter.filterLevel(level, fq).length).prop('title', function() { | |
var filtered = sorter.filterLevel(level, fq); | |
var rad = sorter.filterType("rad", filtered).length; | |
var kan = sorter.filterType("kan", filtered).length; | |
var voc = sorter.filterType("voc", filtered).length; | |
var text = "Total: " + filtered.length; | |
if (rad) { | |
text += "\nRadicals: " + rad; | |
} | |
if (kan) { | |
text += "\nKanji: " + kan; | |
} | |
if (voc) { | |
text += "\nVocabulary: " + voc; | |
} | |
return text; | |
}); | |
}); | |
$('input[type="checkbox"]:disabled').removeAttr('disabled'); | |
} | |
} | |
} | |
}, | |
listeners: function() { | |
var lastCount = $.jStorage.get(dataset.active).length + $.jStorage.get(dataset.queue).length; | |
$.jStorage.listenKeyChange('currentItem', function() { | |
if (lastCount < ($.jStorage.get(dataset.active).length + $.jStorage.get(dataset.queue).length)) { | |
lastCount = $.jStorage.get(dataset.active).length + $.jStorage.get(dataset.queue).length; // will infinitely trigger if not here. | |
setup.init(); | |
} | |
lastCount = $.jStorage.get(dataset.active).length + $.jStorage.get(dataset.queue).length; | |
}); | |
$.jStorage.listenKeyChange('currentItem', utilities.forceQuestionTypeUpdate); | |
$.jStorage.listenKeyChange(dataset.active, setup.ui.toggler); | |
} | |
}; | |
var sorter = { | |
filterLevel: function(level, list) { | |
if (!list) { | |
return []; | |
} | |
return list.filter(function(ele, ind) { | |
return ele.level == level; | |
}); | |
}, | |
filterType: function(type, list) { | |
if (!list) { | |
return []; | |
} | |
return list.filter(function(ele, ind) { | |
return ele[type.substr(0, 3)]; | |
}); | |
}, | |
getHTMLElementPriority: function(a) { | |
return a.className === 'radical' ? settings.data.priority.rad : a.className === 'kanji' ? settings.data.priority.kan : settings.data.priority.voc; | |
}, | |
getPriority: function(a) { | |
return a.rad ? settings.data.priority.rad : a.kan ? settings.data.priority.kan : settings.data.priority.voc; | |
}, | |
randomize: function(list) { | |
return list.sort(function() { | |
return 0.5 - window.Math.randomB(); | |
}); | |
}, | |
reorder: function() { | |
ordered = true; | |
sorter.setPriorities(); | |
var fullQueue = $.jStorage.get(dataset.queue).concat($.jStorage.get(dataset.active)); | |
fullQueue = sorter.randomize(fullQueue); | |
if (parseInt(settings.data.typePriorityMode) == 1) { | |
if (settings.data.sortlevels) { | |
$('#levels > item').each(function() { | |
var level = parseInt(this.innerHTML); | |
var sorted = sorter.filterLevel(level, fullQueue); | |
if (settings.data.sorttypes) { | |
sorted = sorter.sortByType(sorted); | |
} else { | |
sorted = sorter.randomize(sorted); | |
} | |
fullQueue = sorter.removeLevel(level, fullQueue); | |
fullQueue = fullQueue.concat(sorted); | |
}); | |
} | |
} | |
if (parseInt(settings.data.typePriorityMode) == 2) { | |
if (settings.data.sorttypes) { | |
$('#types > item').each(function() { | |
var typeFilter = sorter.filterType(this.className, fullQueue); | |
if (settings.data.sortlevels) { | |
$('#levels > item').each(function() { | |
var level = parseInt(this.innerHTML); | |
var sorted = sorter.filterLevel(level, typeFilter); | |
typeFilter = sorter.removeLevel(level, typeFilter); | |
typeFilter = typeFilter.concat(sorted); | |
}); | |
} else { | |
typeFilter = sorter.randomize(typeFilter); | |
} | |
fullQueue = sorter.removeType(this.className, fullQueue); | |
fullQueue = fullQueue.concat(typeFilter); | |
}); | |
} | |
} | |
$.jStorage.set(dataset.active, (dataset.quick === 'r' ? fullQueue : fullQueue.splice(0, $.jStorage.get('l/batchSize')))); | |
$.jStorage.set(dataset.queue, (dataset.quick === 'r' ? [] : fullQueue)); | |
dataset.updateVisual(); | |
}, | |
removeLevel: function(level, list) { | |
if (!list) { | |
var fullQueue = sorter.removeLevel(level, $.jStorage.get(dataset.queue)); | |
var activeQueue = sorter.removeLevel(level, $.jStorage.get(dataset.active)); | |
$.jStorage.set(dataset.queue, fullQueue); | |
$.jStorage.set(dataset.active, activeQueue); | |
sorter.reorder(); | |
return; | |
} | |
return list.filter(function(ele, ind) { | |
return ele.level != level; | |
}); | |
}, | |
removeType: function(type, list) { | |
if (!list) { | |
var fullQueue = sorter.removeType(type, $.jStorage.get(dataset.queue)); | |
var activeQueue = sorter.removeType(type, $.jStorage.get(dataset.active)); | |
$.jStorage.set(dataset.queue, fullQueue); | |
$.jStorage.set(dataset.active, activeQueue); | |
sorter.reorder(); | |
return; | |
} | |
return list.filter(function(ele, ind) { | |
return !ele[type.substr(0, 3)]; | |
}); | |
}, | |
sortByType: function(list) { | |
return list.sort(function(a, b) { | |
return (sorter.getPriority(a) - sorter.getPriority(b)); | |
}); | |
}, | |
setPriorities: function() { | |
settings.data.priority.rad = $('#types .radical').index(); | |
settings.data.priority.kan = $('#types .kanji').index(); | |
settings.data.priority.voc = $('#types .vocabulary').index(); | |
} | |
}; | |
var utilities = { | |
forceQuestionTypeUpdate: function() { | |
var current = $.jStorage.get("currentItem"); | |
if (!current) { | |
return; | |
} | |
var type = $.jStorage.get("questionType"); | |
if (current.rad) { | |
if (type !== "meaning") { | |
$.jStorage.set("questionType", "meaning"); | |
$.jStorage.set("currentItem", current); | |
} | |
return; | |
} | |
var typeMethod = parseInt(settings.data.questionTypeMode); | |
var data = $.jStorage.get(utilities.toUID(current)); | |
if (!typeMethod && (!data || (!data.mc && !data.rc))) { | |
if ((new Date().getTime() - lastUpdate) > 500) { | |
lastUpdate = new Date().getTime(); | |
var nextRandType = ["reading", "meaning"][Math.round(window.Math.randomB())]; | |
console.log(type, nextRandType); | |
if (type != nextRandType) { | |
$.jStorage.set('questionType', nextRandType); | |
$.jStorage.set("currentItem", current); | |
} | |
} | |
} | |
if (typeMethod === 1) { | |
if (!data || !data.rc) { | |
if (type !== "reading") { | |
$.jStorage.set("questionType", "reading"); | |
$.jStorage.set("currentItem", current); | |
} | |
} else { | |
if (type !== "meaning") { | |
$.jStorage.set("questionType", "meaning"); | |
$.jStorage.set("currentItem", current); | |
} | |
} | |
} | |
if (typeMethod === 2) { | |
if (!data || !data.mc) { | |
if (type !== "meaning") { | |
$.jStorage.set("questionType", "meaning"); | |
$.jStorage.set("currentItem", current); | |
} | |
} else { | |
if (type !== "reading") { | |
$.jStorage.set("questionType", "reading"); | |
$.jStorage.set("currentItem", current); | |
} | |
} | |
} | |
}, | |
highestPriorityType: function() { | |
return $('#types item').not('.hidden').first().attr('class'); | |
}, | |
highestPriorityLevel: function() { | |
return parseInt($('#levels item').not('.hidden').first().text()); | |
}, | |
log: function(msg) { | |
console.dlog.push(msg); | |
console.debug(msg); | |
}, | |
newRandom: function(fullVal) { | |
if (!settings.data.onebyone && ordered) { | |
var fullQueue = $.jStorage.get(dataset.active).concat($.jStorage.get(dataset.queue)); | |
var fullLength = fullQueue.length; | |
if (settings.data.sortlevels && parseInt(settings.data.typePriorityMode) == 1) { | |
fullQueue = sorter.filterLevel(utilities.highestPriorityLevel(), fullQueue); | |
if (settings.data.sorttypes) { | |
fullQueue = sorter.filterType(utilities.toType(fullQueue[0]), fullQueue); | |
} | |
} | |
if (settings.data.sorttypes && parseInt(settings.data.typePriorityMode) == 2) { | |
fullQueue = sorter.filterType(utilities.highestPriorityType(), fullQueue); | |
if (settings.data.sortlevels) { | |
fullQueue = sorter.filterLevel(fullQueue[0].level, fullQueue); | |
} | |
} | |
return Math.floor(window.Math.randomB() * Math.min(10, fullQueue.length)) / (fullVal ? 1 : Math.max(fullLength, 1)); | |
} | |
return settings.data.onebyone ? 0 : window.Math.randomB(); | |
}, | |
toType: function(item) { | |
return (item && item.rad) ? 'rad' : item.kan ? 'kan' : 'voc' || "-1"; | |
}, | |
toUID: function(item) { | |
return ((item && item.rad) ? 'r' : item.kan ? 'k' : 'v') + item.id || "-1"; | |
}, | |
settingsValueToClass: function(id, val) { | |
val = parseInt(val); | |
if (id === "priority") { | |
switch (val) { | |
case 0: | |
return "balance"; | |
case 1: | |
return "level-heavy"; | |
case 2: | |
return "type-heavy"; | |
} | |
} else { | |
switch (val) { | |
case 0: | |
return "balance2"; | |
case 1: | |
return "reading-heavy"; | |
case 2: | |
return "meaning-heavy"; | |
} | |
} | |
} | |
}; | |
$('div[id*="loading"]:visible').on('hide', function() { | |
dataset = (location.pathname.match('review') ? reviewset : lessonset); | |
window.Math.randomB = window.Math.random; | |
if (dataset.quick === 'r') { | |
window.Math.random = utilities.newRandom; | |
} | |
setup.listeners(); | |
setup.init(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment