Wanikani Reorder Ultimate 2 BETA

Learn in the order you want to.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name          Wanikani Reorder Ultimate 2 BETA
// @namespace     https://www.wanikani.com
// @description   Learn in the order you want to.
// @version       2.0.201
// @include       *://www.wanikani.com/lesson/session*
// @include       *://www.wanikani.com/review/session*
// @grant         none
// ==/UserScript==
(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 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 reviewset = {
	quick: 'r',
	queue: 'reviewQueue',
	active: 'activeQueue',
	updateVisual: function() {
		var item = $.jStorage.get(dataset.active)[Math.floor(window.Math.random(true))];
		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) {
			$('#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>');
		}
	},
	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) {
				$('#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>');
			}
		},
		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) {
				$('#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>');
			}
		},
		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) {
				$('#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>');
			}
		}
	},
	ui: {
		create: function() {
			setup.update.apply();
			$('head').append('<link rel="stylesheet" href="https://cdn.rawgit.com/xMunch/866bd26bf87579087976/raw/126960bed6b964fb71e98cd0df54789ebdc0d1e7/style.min.css">');
			$.get('https://gist.githubusercontent.com/xMunch/a448f5999a682f114d61/raw/UI.HTML', function(data) {
				utilities.log("Creating UI...");
				var info = $('#supplement-info, #information').first();
				info.after(data);
				$('#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.left);
					var y = (e.pageY - offset.top);
					var id = $(this).attr('id');
					if (y > 50) {
						if (x < 75) {
							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 (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.left);
					var y = (e.pageY - offset.top);
					var ele = $(this).find('#overlay');
					if (y > 50) {
						if (x < 75) {
							ele.removeClass().addClass('left');
						} else {
							ele.removeClass().addClass('right');
						}
					} else {
						ele.removeClass().addClass('top');
					}
				}).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.init();
	setup.listeners();
});