// ==UserScript==
// @name WaniKani Item Inspector
// @namespace wk-dashboard-item-inspector
// @description Inspect Items in Tabular Format
// @author prouleau
// @version 1.9.0
// @include https://www.wanikani.com/dashboard
// @include https://www.wanikani.com/
// @grant none
// ==/UserScript==
(function() {
'use strict';
//------------------------------
// Wanikani Framework
//------------------------------
if (!window.wkof) {
var script_name = 'Wanikani Item Inspector';
var response = confirm(script_name + ' requires WaniKani Open Framework.\n Click "OK" to be forwarded to installation instructions.');
if (response) {
window.location.href = 'https://community.wanikani.com/t/instructions-installing-wanikani-open-framework/28549';
};
return;
};
var scriptId = 'Item_Inspector';
var scriptTitle = 'Item Inspector';
var quiz_setup_state = 'init';
function open_settings_dialog() {
wkof.Settings.load(scriptId)
.then(function(){
quiz_setup_state = 'ready';
init_settings();
})
open_quiz_settings();
}
//------------------------------
// Styling
//------------------------------
var fontColor;
var secondaryFontColor;
function table_css(){
let is_dark = is_dark_theme();
fontColor = (is_dark ? '#000000' : '#ffffff');
secondaryFontColor = (is_dark ? '#212020' : 'gainsboro');
var leechTableCss = `
/* Control Bar */
.WkitControlBar {
position: relative;
margin: 7px 0.6% 7px 2.6%;
}
/* to prevent rendering problems */
#WkitTopBar {
position: relative;
display: inline-block;
width: 103.2%;
margin-left: -27px;
margin-bottom: 30px;
padding-top: 3px;
padding-bottom: 3px;
padding-right: 3px;
padding-left: 3px;
}
#WkitTopBar .WkitSmallCaps {
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
margin: 0px;
padding: 7.5px 30px;
background-color: #d5d5d5;
text-align: center;
border-radius: 5px 5px 0 0;
font-size: 11px;
font-weight: bold;
letter-spacing: 0;
line-height: 20px;
color: #555;
text-transform: uppercase;
text-shadow: 0 1px 0 #fff;
${is_dark ? 'align-items: center;' : ''}
${is_dark ? 'background-color: #1c1e21;' : ''}
${is_dark ? 'box-shadow: 0 1px 1px rgba(0, 0, 0, 0.7), 0 2px 2px rgba(0, 0, 0, 0.7);' : ''}
${is_dark ? 'color: #bcbcbc;' : ''}
${is_dark ? 'display: flex;' : ''}
${is_dark ? 'margin-bottom:;' : ''}
${is_dark ? 'max-height: 60px;' : ''}
${is_dark ? 'padding-bottom: 3px;' : ''}
${is_dark ? 'padding-top: 3px;' : ''}
${is_dark ? 'text-align: left;' : ''}
}
#WkitTopBar .WkitTableList {
position: relative;
margin: 0 0 30px;
}
#WkitTopBar .WkitTableList table{
width: 100%;
max-width: 100%;
background-color: transparent;
border-collapse: collapse;
border-spacing: 0;
}
#WkitTopBar .WkitTableList table,
#WkitTopBar .right table{
width: 100%;
line-height: 1em;
color: ${is_dark ? '#bcbcbc' : '#fff'};
/*color: inherit;*/
}
#WkitTopBar .WkitTableList table a {
text-decoration: none;
}
#WkitTopBar .WkitTableList .WkitMainElement {
display: block;
padding: 0.7em 1em;
margin: 0px;
color: #fff;
text-decoration: none;
-webkit-transition: text-shadow ease-out 0.3s;
-moz-transition: text-shadow ease-out 0.3s;
-o-transition: text-shadow ease-out 0.3s;
transition: text-shadow ease-out 0.3s;
}
#WkitTopBar .WkitTableList table tr{
border-top: 0;
border-bottom: 0;
border-left: 0;
text-shadow: 0 1px 0 rgba(0,0,0,0.2);
}
#WkitTopBar .WkitTableList table td{
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
#WkitTopBar .WkitTableList table tr[class=vocabulary]{
background-color: #a100f1;
background-image: -moz-linear-gradient(top, #a0f, #9300dd);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#a0f), to(#9300dd));
background-image: -webkit-linear-gradient(top, #a0f, #9300dd);
background-image: -o-linear-gradient(top, #a0f, #9300dd);
background-image: linear-gradient(to bottom, #a0f, #9300dd);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFAA00FF', endColorstr='#FF9300DD', GradientType=0);
border-top: 1px solid #c655ff;
border-bottom: 1px solid #8800cc;
border-left: 1px solid #c655ff; }
#WkitTopBar .WkitTableList table tr[class=kanji]{
background-color: #f100a1;
background-image: -moz-linear-gradient(top, #f0a, #dd0093);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f0a), to(#dd0093));
background-image: -webkit-linear-gradient(top, #f0a, #dd0093);
background-image: -o-linear-gradient(top, #f0a, #dd0093);
background-image: linear-gradient(to bottom, #f0a, #dd0093);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFF00AA', endColorstr='#FFDD0093', GradientType=0);
border-top: 1px solid #f6c;
border-bottom: 1px solid #cc0088;
border-left: 1px solid #f6c;
}
#WkitTopBar .WkitTableList table tr[class=radical]{
background-color: #00a1f1;
background-image: -moz-linear-gradient(top, #0af, #0093dd);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0af), to(#0093dd));
background-image: -webkit-linear-gradient(top, #0af, #0093dd);
background-image: -o-linear-gradient(top, #0af, #0093dd);
background-image: linear-gradient(to bottom, #0af, #0093dd);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF00AAFF', endColorstr='#FF0093DD', GradientType=0);
border-top: 1px solid #88d7ff;
border-bottom: 1px solid #069;
border-left: 1px solid #88d7ff;
}
#WkitTopBar .WkitItemList {
visibility: visible;
position: relative;
background-color: #0000001a;
display: -webkit-flex;
display: flex;
flex-direction: row;
flex-wrap: wrap;
line-height: 1;
width: 96.1%;
margin-left: 29px;
margin-right: 4px;
padding-top: 3px;
padding-bottom: 3px;
padding-right: 3px;
padding-left: 3px;
border-radius: 5px;
}
#WkitTopBar .WkitItemList.WkitFlexJustified {
justify-content: space-between;
}
#WkitTopBar .WkitItemList.WkitFlexLeft {
justify-content: flex-start;
}
#WkitTopBar .WkitSmallCapsList {
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
background-color: #cccccc;
text-align: center;
width: max-content;
font-weight: bold;
letter-spacing: 0;
color: #241f42;
text-transform: uppercase;
border-radius: 5px;
border-color: #000000;
border-width: 1px;
border-style: solid;
${is_dark ? 'align-items: center;' : ''}
${is_dark ? 'background-color: #1c1e21;' : ''}
${is_dark ? 'box-shadow: 0 1px 1px rgba(0, 0, 0, 0.7), 0 2px 2px rgba(0, 0, 0, 0.7);' : ''}
${is_dark ? 'color: #bcbcbc;' : ''}
${is_dark ? 'display: flex;' : ''}
${is_dark ? 'margin-bottom:;' : ''}
${is_dark ? 'max-height: 60px;' : ''}
${is_dark ? 'padding-bottom: 3px;' : ''}
${is_dark ? 'padding-top: 3px;' : ''}
${is_dark ? 'text-align: left;' : ''}
}
#WkitTopBar .WkitSmallCapsList.WkitReading {
margin-top: 2px;
margin-bottom: 2px;
margin-left: 5px;
margin-right: 5px;
line-height: 1em;
padding: 15px 20px;
font-size: 14px;
}
#WkitTopBar .WkitSmallCapsList.WkitMeaning {
margin-top: 2px;
margin-bottom: 2px;
margin-left: 5px;
margin-right: 5px;
padding: 8px 20px;
font-size: 12px;
}
#WkitTopBar .WkitItemListed {
display: inline-block;
margin: 10px 5px;
text-decoration-line: none;
}
#WkitTopBar .WkitItemList .WkitTooltipContent {
padding: -4px;
}
#WkitTopBar .WkitItemListed span {
border-radius: 5px;
/*border-color: #000000;
border-width: 1px;
border-style: solid;*/
color: #ffffff;
line-height: 1em;
padding: 6px;
margin: 0;
box-shadow: inset 0 -2px 0 rgba(0,0,0,0.2);
}
#WkitTopBar .WkitItemListed a {
text-decoration-line: none;
}
#WkitTopBar .WkitMarker span {
border-radius: 5px;
font-size: 14px;
line-height: 1em;
padding: 14px 8px;
margin: 0;
box-shadow: inset 0 -2px 0 rgba(0,0,0,0.2);
background-image: linear-gradient(0deg, #c1cdc5, #b0bfb5);
background-color: #c1cdc5;
}
#WkitTopBar .WkitMarkerMeaning span {
border-radius: 5px;
font-size: 14px;
line-height: 1em;
padding: 6px 6px;
margin: 0;
text-decoration-line: none;
box-shadow: inset 0 -2px 0 rgba(0,0,0,0.2);
background-image: linear-gradient(0deg, #c1cdc5, #b0bfb5);
background-color: #c1cdc5;
}
#WkitTopBar .left a {
font-size: 74px;
line-height: 73px;
display: block;
border-radius: 3px;
margin: 3px 10px 0 3px;
}
#WkitTopBar .item.vocabulary .left a {
margin-right: 3px;
text-align: center;
}
#WkitTopBar .items .radical img {
height: 14px;
${is_dark ? '' : 'filter: invert(1);'}
}
#WkitTopBar .WkitItemListed img{
width: 30px;
height: 30px;
${is_dark ? '' : 'filter: invert(1);'}
}
#WkitTopBar .WkitHeader {
background-color: ${is_dark ? '#232629' : '#5c6c705c'};
display: -webkit-flex;
display: flex;
justify-content: space-between;
padding: 3px;
width: calc(100% - 8px);
border-radius: 5px;
margin-left: -2px;
}
#WkitTopBar .WkitControlLeft {
display: block;
vertical-align: middle;
height: 100%;
padding-left: 2px;
}
#WkitTopBar .WkitControlRight {
display: block;
vertical-align: middle;
height: 100%;
padding-right: 3px;
}
#WkitTopBar #WkitRandomSelection {
margin-left: 15px;
}
#WkitTopBar .WkitDialogContainer {
display: none; /* Hidden by default */
position: absolute;
z-index: 1;
right: 12px;
top: 63px;
width: 156px;
height: auto;
padding: 5px;
overflow: auto;
background-color: rgb(0,0,0);
border-radius: 5px;
border-width: 1px;
}
#WkitTopBar .WkitFilterContainer {
display: none; /* Hidden by default */
position: absolute;
z-index: 1;
right: 60%;
top: 63px;
width: 156px;
height: auto;
padding: 5px;
overflow: auto;
background-color: rgb(0,0,0);
border-radius: 5px;
border-width: 1px;
}
#WkitTopBar .WkitExportButton{
z-index: 1; /* Sit on top */
border-width: 1px;
border-radius: 3px;
text-align: center;
min-width: 150px;
width: max-content;
height: 30px;
margin: 3px;
background-color: #efefef;
text-decoration: none;
}
#WkitTopBar .WkitTitle {
vertical-align: middle;
font-size: 150%;
text-align: center;
margin-top: 3px;
margin-bottom: 3px;
width: 28%;
}
#WkitTopBar .WkitButton {
display: inline;
float: left;
vertical-align: middle;
border-width: 1px;
border-radius: 3px;
text-align: center;
min-width: 30px;
width: max-content;
height: 30px;
margin: 2px;
margin-top: 5px;
margin-bottom: 5px;
font-family: FontAwesome;
}
#WkitTopBar .WkitButton:not(.WkitActive) {
background-color: #efefef;
}
#WkitTopBar .WkitButton.WkitActive {
background-color: ${is_dark ? 'green' : '#00b300'} ! important;
}
#WkitTopBar .WkitTooltipContent .WkitMiniButton {
padding-right: 3px;
padding-left: 3px;
padding-top: 3px;
padding-bottom: 2px;
margin-top: 3px;
font-size: 12px;
line-height: 1em;
}
#WkitTopBar .WkitButton a {
color: rgb(0, 0, 0);
}
#WkitTopBar button a {
text-decoration: none;
}
#WkitTopBar .WkitButtonLeft {
float: left;
}
#WkitTopBar .WkitButtonRight {
float: right;
}
#WkitTopBar .WkitEnglishButton {
font-size: 18px;
font-weight: bold;
}
#WkitTopBar .WkitSelector {
display: inline;
float: left;
vertical-align: middle;
margin-right: 3px;
margin-left: 3px;
margin-top: 5px;
margin-bottom: 5px;
border-width: 1px;
border-color: Black;
color: Black;
background-color: #efefef;
}
#WkitTopBar .WkitClipBoard {
display: inline-block;
width: 96%;
height: 420px;
margin-left: 29px;
}
#WkitTopBar .emptyMessage {
margin: 7px 0.6% 7px 2.6%;
padding: 5px;
padding-left: 15px;
padding-top: 10px;
background-color: Azure;
border-radius: 8px;
}
/* Pop ups, aka TOOL TIPS */
#WkitTopBar .WkitTooltip {
display: inline-block;
position: relative;
padding: 0px;
}
#WkitTopBar .WkitTooltip .WkitTooltipContent {
display: inline-block;
visibility: hidden;
background-color: black;
color: ${is_dark ? '#bcbcbc' : '#fff'};
/*color: inherit;*/
font-size: 100%;
width: max-content;
max-width: 445px;
text-align: left;
margin: 5px;
padding: 2px;
border-radius: 3px;
position: absolute;
z-index: 1;
transition-delay: 0.1s;
}
#WkitTopBar .WkitTableList .WkitTooltip.WkitFirstItem .WkitTooltipContent {
top: 30px;
left: 0%;
transition-delay: 0.1s;
}
#WkitTopBar .WkitTableList .WkitTooltip.WkitLaterItem .WkitTooltipContent {
bottom: 30px;
left: 0%;
transition-delay: 0.1s;
}
#WkitTopBar .WkitItemList .WkitTooltipIcon.WkitFirstItem .WkitTooltipContent {
top: 55px;
left: 50%;
max-width: 250px;
transition-delay: 0.1s;
}
#WkitTopBar .WkitItemList .WkitTooltipIcon.WkitLaterItem .WkitTooltipContent {
bottom: 55px;
left: 50%;
max-width: 250px;
transition-delay: 0.1s;
}
#WkitTopBar .WkitItemList .WkitTooltipIconMeaning.WkitFirstItem .WkitTooltipContent {
top: 35px;
left: 50%;
max-width: 250px;
}
#WkitTopBar .WkitItemList .WkitTooltipIconMeaning.WkitLaterItem .WkitTooltipContent {
bottom: 35px;
left: 50%;
max-width: 250px;
}
#WkitTopBar .WkitTableList .WkitTooltip:hover div.WkitTooltipContent {
visibility: visible;
display: inline-block;
z-index: 50;
}
#WkitTopBar .WkitItemList .WkitTooltip:hover div.WkitTooltipContent {
visibility: visible;
display: inline-block;
z-index: 50;
transition-delay: 0.5s;
transform: translateX(-50%);
}
#WkitTopBar .WkitTableList .WkitTooltip.WkitFirstItem .WkitTooltipContent::after {
content: " ";
position: absolute;
bottom: 100%; /* At the top of the tooltip */
left: 1em;
border-width: 5px;
border-style: solid;
border-color: transparent transparent black transparent;
}
#WkitTopBar .WkitTableList .WkitTooltip.WkitLaterItem .WkitTooltipContent::after {
content: " ";
position: absolute;
top: 100%; /* At the bottom of the tooltip */
left: 1em;
border-width: 5px;
border-style: solid;
border-color: black transparent transparent transparent;
}
#WkitTopBar .WkitItemList .WkitTooltip.WkitFirstItem .WkitTooltipContent::after {
content: " ";
position: absolute;
bottom: 100%; /* At the top of the tooltip */
left: 50%;
border-width: 5px;
border-style: solid;
border-color: transparent transparent black transparent;
}
#WkitTopBar .WkitItemList .WkitTooltip.WkitLaterItem .WkitTooltipContent::after {
content: " ";
position: absolute;
top: 100%; /* At the bottom of the tooltip */
left: 50%;
border-width: 5px;
border-style: solid;
border-color: black transparent transparent transparent;
}
#WkitTopBar .WkitTooltip2 {
position: relative;
display: inline-block;
width: 30px;
}
#WkitTopBar .WkitTooltip2 .WkitEnlargedTooltip {
display: none;
visibility: hidden;
background-color: black;
color: #fff;
font-size: 100%;
width: max-content;
border-radius: 3px;
position: absolute;
bottom: 30px;
left: 0%;
padding: 2px;
z-index: 1;
}
#WkitTopBar .WkitTooltip2:hover div.WkitEnlargedTooltip {
visibility: visible;
display: inline-block;
z-index: 50;
}
#WkitTopBar .WkitTooltip2 .WkitEnlargedTooltip::after {
content: " ";
position: absolute;
top: 100%; /* At the bottom of the tooltip */
left: 1em;
border-width: 5px;
border-style: solid;
border-color: black transparent transparent transparent;
}
#WkitTopBar .WkitTooltip .radical {
background: #00a1f1;
}
#WkitTopBar .WkitTooltip .kanji {
background: #ff00aa;
}
#WkitTopBar .WkitTooltip .vocabulary {
background: #9800e8;
}
#WkitTopBar .WkitTooltip2 .radical {
padding: 5px;
background: #00a1f1;
}
#WkitTopBar .WkitTooltip2 .kanji {
padding: 5px;
background: #ff00aa;
}
#WkitTopBar .WkitTooltip2 .vocabulary {
padding: 5px;
background: #9800e8;
}
#WkitTopBar .WkitTooltipIcon span.radical {
font-size: 30px;
background-image: linear-gradient(0deg, #0af, #0093dd);
background-color: #00a1f1;
}
#WkitTopBar .WkitTooltipIcon span.kanji {
font-size: 30px;
background-image: linear-gradient(0deg, #f0a, #dd0093);
background-color: #ff00aa;
}
#WkitTopBar .WkitTooltipIcon span.vocabulary {
font-size: 30px;
background-image: linear-gradient(0deg, #9800e89e, #7e00c2);
background-color: #9800e8;
}
#WkitTopBar .WkitTooltipIcon .WkitMarker {
margin: 5px;
padding: 13px 3px;
}
#WkitTopBar .WkitTooltipIcon .WkitMarkerMeaning {
margin: 10px 5px;
}
#WkitTopBar .WkitTooltipContent img{
width: 40px;
height: 40px;
align-items: center;
}
#WkitTopBar .WkitTooltip2 img{
width: 80px;
height: 80px;
align-items: center;
}
#WkitTopBar .radical img {
${is_dark ? '' : 'filter: invert(1);'}
}
#WkitTopBar .left span {
font-size: 35px;
line-height: 40px;
display: block;
align-items: center;
text-align: center;
border-radius: 3px;
margin: 5px;
padding: 5px;
}
#WkitTopBar .WkitEnlargedTooltip span {
font-size: 60px;
line-height: 58px;
display: block;
border-radius: 3px;
margin: 5px;
}
#WkitTopBar .right {
padding-left: 7px;
padding-right: 7px;
padding-bottom: 7px;
}
#WkitTopBar .right table td:first-child {
padding-right: 10px;
font-weight: bold;
}
#WkitTopBar .WkitMiniContainer {
display: -webkit-flex;
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
position: relative;
}
#WkitTopBar .WkitMiniIcon {
position: relative;
display: block;
font-size: 14px;
vertical-align: middle;
text-align:center;
margin: 2px;
height: fit-content;
width: max-content;
padding: 3px;
border-radius: 3px;
-webkit-text-size-adjust: none;
text-size-adjust: none;
}
#WkitTopBar .WkitMiniIcon .WkitMiniTooltipContent {
display: inline-block;
visibility: hidden;
background-color: black;
color: #fff;
font-size: 100%;
width: max-content;
max-width: 445px;
text-align: left;
margin: 5px;
padding: 2px;
border-radius: 3px;
position: absolute;
z-index: 1;
}
#WkitTopBar .WkitMiniIcon:hover div.WkitMiniTooltipContent {
position: absolute;
visibility: visible;
display: inline-block;
z-index: 50;
transition-delay: 0.5s;
bottom: 28px;
transform: translateX(-65%);
}
#WkitTopBar .WkitMiniIcon .WkitMiniTooltipContent::after {
content: " ";
position: absolute;
top: 100%; /* At the bottom of the tooltip */
left: 65%;
border-width: 5px;
border-style: solid;
border-color: black transparent transparent transparent;
}
#WkitTopBar .WkitMiniIcon .radical {
background: #00a1f1;
}
#WkitTopBar .WkitMiniIcon .kanji {
background: #ff00aa;
}
#WkitTopBar .WkitMiniIcon .vocabulary {
background: #9800e8;
}
#WkitTopBar .WkitMiniIcon img{
width: 14px;
height: 14px;
margin: 0px;
align-items: center;
}
#WkitTopBar .WkitIconWarning {
margin: auto;
font-weight: bold;
}
#WkitTopBar .right table td {
padding-top: 3px;
}
#WkitTopBar .WkitLabel, {
padding: 4px;
}`
var leechStyling = document.createElement('style');
leechStyling.type='text/css';
if(leechStyling.styleSheet){
leechStyling.styleSheet.cssText = leechTableCss;
}else{
leechStyling.appendChild(document.createTextNode(leechTableCss));
}
document.getElementsByTagName('head')[0].appendChild(leechStyling);
};
//------------------------------
// Menu
//------------------------------
var settings_dialog;
function install_menu() {
wkof.Menu.insert_script_link({
script_id: scriptId,
name: scriptId,
submenu: 'Settings',
title: 'Item Inspector',
on_click: open_settings_dialog
});
}
//------------------------------
// Settings - new version
//------------------------------
//########################################################################
// QUIZ DATA
//########################################################################
var quiz = {
// Dialogs
dialog: null,
settings_dialog: null,
// Item Lists
items: [],
group_list: [],
serial_list: [],
index: null,
// Status
showing_help: false,
mode: 'loading',
// Question Info
qinfo: {
load: null,
prep: null,
cache: {},
},
// Stats
stats: {
round: 1,
total: 0,
correct: 0,
incorrect: 0,
},
// Functions
start: null,
shuffle: null,
requiz: null,
ask: null,
submit: null,
prev: null,
next: null,
close: null,
};
//########################################################################
// QUIZ SETTINGS DIALOG
//########################################################################
//========================================================================
// setup_quiz_settings()
//------------------------------------------------------------------------
var quiz_settings_state = 'init';
var standardInfo = ['table_data', 'sort1', 'sort2', 'tooltip1', 'tooltip2', 'tooltip3', 'tooltip4', 'tooltip5', 'tooltip6', 'tooltip7', 'tooltip8',];
var exportedInfo = ['export1','export2','export3','export4','export5','export6','export7','export8','export9','export10',
'export11','export12','export13','export14','export15','export16','export17','export18','export19','export20',
'export21','export22','export23','export24','export25','export26','export27','export28','export29','export30',
'export31','export32','export33','export34','export35','export36','export37','export38',];
var needSubjectId = {'Vis_Sim_Kanji':true, 'Used_In': true, 'Components': true,}
var wideElements = {'Review_Date':true, 'Passed_Date':true, 'Burned_Date':true, 'Resurrected_Date':true, 'Lesson_Date':true, 'Unlock_Date':true, };
function setup_quiz_settings() {
if (quiz_settings_state === 'init') {
quiz_settings_state = 'loading';
return wkof.ready('Settings')
.then(function(){
quiz_settings_state = 'setup';
setup_quiz_settings();
});
}
if (quiz_settings_state !== 'setup') return;
let tableElementContents = {'Meaning_Brief':'Meaning Brief',
'Reading_Brief':'Reading Brief', 'Reading_Full':'Reading Full', 'Leech':'Leech Value',
'Meaning_Correct_Answers': 'Meaning Correct Answers', 'Meaning_Incorrect_Answers': 'Meaning Incorrect Answers',
'Reading_Correct_Answers': 'Reading Correct Answers', 'Reading_Incorrect_Answers': 'Reading Incorrect Answers',
'Total_Correct_Answers': 'Total Correct Answers','Total_Incorrect_Answers': 'Total Incorrect Answers',
'Percentage_Correct': 'Percentage Correct Total','Meaning_Correct': 'Percentage Correct Meaning','Reading_Correct': 'Percentage Correct Reading',
'Meaning_Current_Streak' : 'Meaning Current Streak', 'Reading_Current_Streak': 'Reading Current Streak',
'Meaning_Max_Streak' : 'Meaning Maximum Streak', 'Reading_Max_Streak': 'Reading Maximum Streak',
'Level':'Level',
'Srs':'SRS Stage', 'Review_Date':'Review Date', 'Review_Wait':'Review Wait Time',
'Passed_Date':'Passed Guru Date', 'Burned_Date':'Burned Date', 'Resurrected_Date': 'Resurrected Date',
'Lesson_Date':'Lesson Date', 'Unlock_Date': 'Unlock Date'};
let dataElementContents = {'None':'None', 'Meaning_Brief':'Meaning Brief', 'Meaning_Full':'Meaning Full',
'Reading_Brief':'Reading Brief', 'Reading_Full':'Reading Full', 'Reading_by_Type': 'Reading by Type (on kun)', 'Leech':'Leech Value',
'Meaning_Correct_Answers': 'Meaning Correct Answers', 'Reading_Correct_Answers': 'Reading Correct Answers',
'Meaning_Incorrect_Answers': 'Meaning Incorrect Answers', 'Reading_Incorrect_Answers': 'Reading Incorrect Answers',
'Total_Correct_Answers': 'Total Correct Answers','Total_Incorrect_Answers': 'Total Incorrect Answers',
'Percentage_Correct': 'Percentage Correct Total','Meaning_Correct': 'Percentage Correct Meaning','Reading_Correct': 'Percentage Correct Reading',
'Meaning_Current_Streak' : 'Meaning Current Streak', 'Reading_Current_Streak': 'Reading Current Streak',
'Meaning_Max_Streak' : 'Meaning Maximum Streak', 'Reading_Max_Streak': 'Reading Maximum Streak',
'Level':'Level',
'Srs':'SRS Stage', 'Review_Date':'Review Date', 'Review_Wait':'Review Wait Time',
'Passed_Date':'Passed Guru Date', 'Burned_Date':'Burned Date', 'Resurrected_Date': 'Resurrected Date',
'Lesson_Date':'Lesson Date', 'Unlock_Date': 'Unlock Date',
'Allow_List': 'Allow List', 'Block_List': 'Block List',
'Part_Of_Speech': 'Part of Speech', 'Vis_Sim_Kanji': 'Visually Similar Kanji',
'Components': 'Components of Item', 'Used_In': 'Items Where Used',
};
let sortElementContents = {'Default':'Default', 'Type':'Item Type (Rad, Kan, Voc)', 'Meaning_Brief':'Meaning Brief', 'Meaning_Full':'Meaning Full',
'Reading_Brief':'Reading Brief', 'Reading_Full':'Reading Full', 'Leech':'Leech Value',
'Meaning_Correct_Answers': 'Meaning Correct Answers', 'Reading_Correct_Answers': 'Reading Correct Answers',
'Meaning_Incorrect_Answers': 'Meaning Incorrect Answers', 'Reading_Incorrect_Answers': 'Reading Incorrect Answers',
'Total_Correct_Answers': 'Total Correct Answers','Total_Incorrect_Answers': 'Total Incorrect Answers',
'Percentage_Correct': 'Percentage Correct Total','Meaning_Correct': 'Percentage Correct Meaning','Reading_Correct': 'Percentage Correct Reading',
'Meaning_Current_Streak' : 'Meaning Current Streak', 'Reading_Current_Streak': 'Reading Current Streak',
'Meaning_Max_Streak' : 'Meaning Maximum Streak', 'Reading_Max_Streak': 'Reading Maximum Streak',
'Level':'Level',
'Srs':'SRS Stage', 'Review_Date':'Review Date', 'Review_Wait':'Review Wait Time',
'Passed_Date':'Passed Guru Date', 'Burned_Date':'Burned Date', 'Resurrected_Date': 'Resurrected Date',
'Lesson_Date':'Lesson Date', 'Unlock_Date': 'Unlock Date'};
let wordCloudContents = {'No Repeat': 'Don\'t Repeat', 'Leech':'Leech Value',
'Meaning_Correct_Answers': 'Meaning Correct Answers', 'Reading_Correct_Answers': 'Reading Correct Answers',
'Meaning_Incorrect_Answers': 'Meaning Incorrect Answers', 'Reading_Incorrect_Answers': 'Reading Incorrect Answers',
'Total_Correct_Answers': 'Total Correct Answers','Total_Incorrect_Answers': 'Total Incorrect Answers',
'Percentage_Correct': 'Percentage Correct Total','Meaning_Correct': 'Percentage Correct Meaning','Reading_Correct': 'Percentage Correct Reading',
'Meaning_Current_Streak' : 'Meaning Current Streak', 'Reading_Current_Streak': 'Reading Current Streak',
'Meaning_Max_Streak' : 'Meaning Maximum Streak', 'Reading_Max_Streak': 'Reading Maximum Streak',
};
let exportElementContents = {'None': 'Not Exported', 'Item':'Item', 'Type':'Item Type (Rad, Kan, Voc)', 'Export_Date': 'Export Date',
'Meaning_Brief':'Meaning Brief', 'Meaning_Full':'Meaning Full',
'Reading_Brief':'Reading Brief', 'Reading_Full':'Reading Full', 'Reading_by_Type': 'Reading by Type (on kun)', 'Leech':'Leech Value',
'Meaning_Correct_Answers': 'Meaning Correct Answers', 'Meaning_Incorrect_Answers': 'Meaning Incorrect Answers',
'Reading_Correct_Answers': 'Reading Correct Answers', 'Reading_Incorrect_Answers': 'Reading Incorrect Answers',
'Total_Correct_Answers': 'Total Correct Answers','Total_Incorrect_Answers': 'Total Incorrect Answers',
'Percentage_Correct': 'Percentage Correct Total','Meaning_Correct': 'Percentage Correct Meaning','Reading_Correct': 'Percentage Correct Reading',
'Meaning_Current_Streak' : 'Meaning Current Streak', 'Reading_Current_Streak': 'Reading Current Streak',
'Meaning_Max_Streak' : 'Meaning Maximum Streak', 'Reading_Max_Streak': 'Reading Maximum Streak',
'Level':'Level',
'Srs':'SRS Stage', 'Review_Date':'Review Date',
'Passed_Date':'Passed Guru Date', 'Burned_Date':'Burned Date', 'Resurrected_Date': 'Resurrected Date',
'Lesson_Date':'Lesson Date', 'Unlock_Date': 'Unlock Date',
'Allow_List': 'Allow List', 'Block_List': 'Block List',
'Part_Of_Speech': 'Part of Speech', 'Vis_Sim_Kanji': 'Visually Similar Kanji',
'Components': 'Components of Item', 'Used_In': 'Items Where Used', 'Item_Page': 'URL of Item Page',
};
var exportTabConfig = {type:'page',label:'Export',hover_tip:'Define the exported items of your table',
content:{
sect_tbl_xformat:{type:'section',label:'Export Format'},
separator: {type:'dropdown',label:'Cell Separator',hover_tip:'The characters that separates the cells in a row', default:'\t',
path:'@tablePresets[@active_ipreset].separator', content:{',' : 'Comma', ';': 'Semicolon', '\t': 'Horizontal Tab'},
},
quotes: {type:'dropdown',label:'Use of Quotes',hover_tip:'Whether cells are included in quotes', default:'Never',
path:'@tablePresets[@active_ipreset].quotes', content:{'As_Needed' : 'Only When Needed', 'Never': 'Never Use Quotes', 'Always': 'Always Use Quotes'},
},
sect_tbl_format:{type:'section',label:'Data Format'},
includeTitle: {type: 'checkbox', label:'Include a Title Line', default: false, hover_tip: 'Adds a title line before the exported items',
path:'@tablePresets[@active_ipreset].includeTitle', },
includeLabels: {type: 'checkbox', label:'Include a Label in Cells', default: false, hover_tip: 'Adds in each cell a label to describe the data.\nLabels are not added to Meanings, Readings, Item, Item Type and URL columns',
path:'@tablePresets[@active_ipreset].includeLabels', },
URLclickable: {type: 'dropdown', label:'URL Clickable', default: 'Plain', hover_tip: 'Makes URL automatically clickable in spreadsheet, Kitsun and Anki',
path:'@tablePresets[@active_ipreset].URLclickable',content:{'Plain': 'Plain URL, Non Clickable', 'Spreadsheet': 'Spreadsheet Format', 'html': 'HTML for Kitsun and Anki'}, },
missingData: {type: 'dropdown', label:'Missing Data', default: 'Code_Word', hover_tip: 'How to export missing data',
path:'@tablePresets[@active_ipreset].missingData', content:{'Code_Word' : 'Mark as Unavailable', 'Empty_Cell': 'Leave the Cell Empty',}},
hoursInDate: {type: 'list', multi: true, size: 4, label:'Adding Hours in Dates', default: {'Review_Date': true}, hover_tip: 'Adding hours and minutes to selected dates.\nUnselected means just the date will be exported.',
path:'@tablePresets[@active_ipreset].hoursInDate', content:{'Review_Date':'Review Date', 'Passed_Date':'Passed Guru Date', 'Burned_Date':'Burned Date',
'Resurrected_Date': 'Resurrected Date', 'Lesson_Date':'Lesson Date', 'Unlock_Date': 'Unlock Date',
'Export_Date': 'Export Date',}},
sect_tbl_export:{type:'section',label:'Exported Columns'},
export1: {type:'dropdown',label:'Exported Column no 1',hover_tip:'The 1st column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export1', content:exportElementContents,
},
export2: {type:'dropdown',label:'Exported Column no 2',hover_tip:'The 2nd column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export2', content:exportElementContents,
},
export3: {type:'dropdown',label:'Exported Column no 3',hover_tip:'The 3rd column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export3', content:exportElementContents,
},
export4: {type:'dropdown',label:'Exported Column no 4',hover_tip:'The 4th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export4', content:exportElementContents,
},
export5: {type:'dropdown',label:'Exported Column no 5',hover_tip:'The 5th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export5', content:exportElementContents,
},
export6: {type:'dropdown',label:'Exported Column no 6',hover_tip:'The 6th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export6', content:exportElementContents,
},
export7: {type:'dropdown',label:'Exported Column no 7',hover_tip:'The 7th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export7', content:exportElementContents,
},
export8: {type:'dropdown',label:'Exported Column no 8',hover_tip:'The 8th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export8', content:exportElementContents,
},
export9: {type:'dropdown',label:'Exported Column no 9',hover_tip:'The 9th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export9', content:exportElementContents,
},
export10: {type:'dropdown',label:'Exported Column no 10',hover_tip:'The 10th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export10', content:exportElementContents,
},
export11: {type:'dropdown',label:'Exported Column no 11',hover_tip:'The 11th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export11', content:exportElementContents,
},
export12: {type:'dropdown',label:'Exported Column no 12',hover_tip:'The 12th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export12', content:exportElementContents,
},
export13: {type:'dropdown',label:'Exported Column no 13',hover_tip:'The 13th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export13', content:exportElementContents,
},
export14: {type:'dropdown',label:'Exported Column no 14',hover_tip:'The 14th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export14', content:exportElementContents,
},
export15: {type:'dropdown',label:'Exported Column no 15',hover_tip:'The 15th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export15', content:exportElementContents,
},
export16: {type:'dropdown',label:'Exported Column no 16',hover_tip:'The 16th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export16', content:exportElementContents,
},
export17: {type:'dropdown',label:'Exported Column no 17',hover_tip:'The 17th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export17', content:exportElementContents,
},
export18: {type:'dropdown',label:'Exported Column no 18',hover_tip:'The 18th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export18', content:exportElementContents,
},
export19: {type:'dropdown',label:'Exported Column no 19',hover_tip:'The 19th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export19', content:exportElementContents,
},
export20: {type:'dropdown',label:'Exported Column no 20',hover_tip:'The 20th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export20', content:exportElementContents,
},
export21: {type:'dropdown',label:'Exported Column no 21',hover_tip:'The 21th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export21', content:exportElementContents,
},
export22: {type:'dropdown',label:'Exported Column no 22',hover_tip:'The 22th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export22', content:exportElementContents,
},
export23: {type:'dropdown',label:'Exported Column no 23',hover_tip:'The 23th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export23', content:exportElementContents,
},
export24: {type:'dropdown',label:'Exported Column no 24',hover_tip:'The 24th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export24', content:exportElementContents,
},
export25: {type:'dropdown',label:'Exported Column no 25',hover_tip:'The 25th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export25', content:exportElementContents,
},
export26: {type:'dropdown',label:'Exported Column no 26',hover_tip:'The 26th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export26', content:exportElementContents,
},
export27: {type:'dropdown',label:'Exported Column no 27',hover_tip:'The 27th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export27', content:exportElementContents,
},
export28: {type:'dropdown',label:'Exported Column no 28',hover_tip:'The 28th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export28', content:exportElementContents,
},
export29: {type:'dropdown',label:'Exported Column no 29',hover_tip:'The 29th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export29', content:exportElementContents,
},
export30: {type:'dropdown',label:'Exported Column no 30',hover_tip:'The 30th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export30', content:exportElementContents,
},
export31: {type:'dropdown',label:'Exported Column no 31',hover_tip:'The 31th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export31', content:exportElementContents,
},
export32: {type:'dropdown',label:'Exported Column no 32',hover_tip:'The 32th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export32', content:exportElementContents,
},
export33: {type:'dropdown',label:'Exported Column no 33',hover_tip:'The 33th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export33', content:exportElementContents,
},
export34: {type:'dropdown',label:'Exported Column no 34',hover_tip:'The 34th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export34', content:exportElementContents,
},
export35: {type:'dropdown',label:'Exported Column no 35',hover_tip:'The 35th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export35', content:exportElementContents,
},
export36: {type:'dropdown',label:'Exported Column no 36',hover_tip:'The 36th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export36', content:exportElementContents,
},
export37: {type:'dropdown',label:'Exported Column no 37',hover_tip:'The 37th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export37', content:exportElementContents,
},
export38: {type:'dropdown',label:'Exported Column no 38',hover_tip:'The 38th column of exported information', default:'None',
path:'@tablePresets[@active_ipreset].export38', content:exportElementContents,
},
},
}
var exportDefaultTabConfig = {type:'page',label:'Export',hover_tip:'Define the default exported items of your newly created tables.',
content:{
sect_tbl_defxformat:{type:'section',label:'Export Format'},
defseparator: {type:'dropdown',label:'Cell Separator',hover_tip:'The characters that separates the cells in a row', default:'\t',
path:'@defaults.separator', content:{',' : 'Comma', ';': 'Semicolon', '\t': 'Horizontal Tab'},
},
defquotes: {type:'dropdown',label:'Use of Quotes',hover_tip:'Whether cells are included in quotes', default:'Never',
path:'@defaults.quotes', content:{'As_Needed' : 'Only When Needed', 'Never': 'Never Use Quotes', 'Always': 'Always Use Quotes'},
},
sect_tbl_defformat:{type:'section',label:'Data Format'},
defincludeTitle: {type: 'checkbox', label:'Include a Title Line', default: false, hover_tip: 'Adds a title line before the exported items',
path:'@defaults.includeTitle', },
defincludeLabels: {type: 'checkbox', label:'Include a Label in Cells', default: false, hover_tip: 'Adds in each cell a label to describe the data.\nLabels are not added to Meanings, Readings, Item, Item Type and URL columns',
path:'@defaults.includeLabels', },
defURLclickable: {type: 'dropdown', label:'URL Clickable', default: 'Plain', hover_tip: 'Makes URL automatically clickable in spreadsheet, Kitsun and Anki.',
path:'@defaults.URLclickable',content:{'Plain': 'Plain URL, Non Clickable', 'Spreadsheet': 'Spreadsheet Format', 'html': 'HTML for Kitsun and Anki'}, },
defmissingData: {type: 'dropdown', label:'Missing Data', default: 'Code_Word', hover_tip: 'How to export missing data',
path:'@defaults.missingData', content:{'Code_Word' : 'Mark as Unavailable', 'Empty_Cell': 'Leave the Cell Empty',}},
defhoursInDate: {type: 'list', multi: true, size: 4, label:'Adding Hours in Dates', default: {'Review_Date': true}, hover_tip: 'Adding hours and minutes to selected dates.\nUnselected means just the date will be exported.',
path:'@defaults.hoursInDate', content:{'Review_Date':'Review Date', 'Passed_Date':'Passed Guru Date', 'Burned_Date':'Burned Date',
'Resurrected_Date': 'Resurrected Date', 'Lesson_Date':'Lesson Date', 'Unlock_Date': 'Unlock Date',
'Export_Date': 'Export Date',}},
sect_tbl_defexport:{type:'section',label:'Exported Columns'},
defexport1: {type:'dropdown',label:'Exported Column no 1',hover_tip:'The 1st column of exported information', default:'None',
path:'@defaults.export1', content:exportElementContents,
},
defexport2: {type:'dropdown',label:'Exported Column no 2',hover_tip:'The 2nd column of exported information', default:'None',
path:'@defaults.export2', content:exportElementContents,
},
defexport3: {type:'dropdown',label:'Exported Column no 3',hover_tip:'The 3rd column of exported information', default:'None',
path:'@defaults.export3', content:exportElementContents,
},
defexport4: {type:'dropdown',label:'Exported Column no 4',hover_tip:'The 4th column of exported information', default:'None',
path:'@defaults.export4', content:exportElementContents,
},
defexport5: {type:'dropdown',label:'Exported Column no 5',hover_tip:'The 5th column of exported information', default:'None',
path:'@defaults.export5', content:exportElementContents,
},
defexport6: {type:'dropdown',label:'Exported Column no 6',hover_tip:'The 6th column of exported information', default:'None',
path:'@defaults.export6', content:exportElementContents,
},
defexport7: {type:'dropdown',label:'Exported Column no 7',hover_tip:'The 7th column of exported information', default:'None',
path:'@defaults.export7', content:exportElementContents,
},
defexport8: {type:'dropdown',label:'Exported Column no 8',hover_tip:'The 8th column of exported information', default:'None',
path:'@defaults.export8', content:exportElementContents,
},
defexport9: {type:'dropdown',label:'Exported Column no 9',hover_tip:'The 9th column of exported information', default:'None',
path:'@defaults.export9', content:exportElementContents,
},
defexport10: {type:'dropdown',label:'Exported Column no 10',hover_tip:'The 10th column of exported information', default:'None',
path:'@defaults.export10', content:exportElementContents,
},
defexport11: {type:'dropdown',label:'Exported Column no 11',hover_tip:'The 11th column of exported information', default:'None',
path:'@defaults.export11', content:exportElementContents,
},
defexport12: {type:'dropdown',label:'Exported Column no 12',hover_tip:'The 12th column of exported information', default:'None',
path:'@defaults.export12', content:exportElementContents,
},
defexport13: {type:'dropdown',label:'Exported Column no 13',hover_tip:'The 13th column of exported information', default:'None',
path:'@defaults.export13', content:exportElementContents,
},
defexport14: {type:'dropdown',label:'Exported Column no 14',hover_tip:'The 14th column of exported information', default:'None',
path:'@defaults.export14', content:exportElementContents,
},
defexport15: {type:'dropdown',label:'Exported Column no 15',hover_tip:'The 15th column of exported information', default:'None',
path:'@defaults.export15', content:exportElementContents,
},
defexport16: {type:'dropdown',label:'Exported Column no 16',hover_tip:'The 16th column of exported information', default:'None',
path:'@defaults.export16', content:exportElementContents,
},
defexport17: {type:'dropdown',label:'Exported Column no 17',hover_tip:'The 17th column of exported information', default:'None',
path:'@defaults.export17', content:exportElementContents,
},
defexport18: {type:'dropdown',label:'Exported Column no 18',hover_tip:'The 18th column of exported information', default:'None',
path:'@defaults.export18', content:exportElementContents,
},
defexport19: {type:'dropdown',label:'Exported Column no 19',hover_tip:'The 19th column of exported information', default:'None',
path:'@defaults.export19', content:exportElementContents,
},
defexport20: {type:'dropdown',label:'Exported Column no 20',hover_tip:'The 20th column of exported information', default:'None',
path:'@defaults.export20', content:exportElementContents,
},
defexport21: {type:'dropdown',label:'Exported Column no 21',hover_tip:'The 21th column of exported information', default:'None',
path:'@defaults.export21', content:exportElementContents,
},
defexport22: {type:'dropdown',label:'Exported Column no 22',hover_tip:'The 22th column of exported information', default:'None',
path:'@defaults.export22', content:exportElementContents,
},
defexport23: {type:'dropdown',label:'Exported Column no 23',hover_tip:'The 23th column of exported information', default:'None',
path:'@defaults.export23', content:exportElementContents,
},
defexport24: {type:'dropdown',label:'Exported Column no 24',hover_tip:'The 24th column of exported information', default:'None',
path:'@defaults.export24', content:exportElementContents,
},
defexport25: {type:'dropdown',label:'Exported Column no 25',hover_tip:'The 25th column of exported information', default:'None',
path:'@defaults.export25', content:exportElementContents,
},
defexport26: {type:'dropdown',label:'Exported Column no 26',hover_tip:'The 26th column of exported information', default:'None',
path:'@defaults.export26', content:exportElementContents,
},
defexport27: {type:'dropdown',label:'Exported Column no 27',hover_tip:'The 27th column of exported information', default:'None',
path:'@defaults.export27', content:exportElementContents,
},
defexport28: {type:'dropdown',label:'Exported Column no 28',hover_tip:'The 28th column of exported information', default:'None',
path:'@defaults.export28', content:exportElementContents,
},
defexport29: {type:'dropdown',label:'Exported Column no 29',hover_tip:'The 29th column of exported information', default:'None',
path:'@defaults.export29', content:exportElementContents,
},
defexport30: {type:'dropdown',label:'Exported Column no 30',hover_tip:'The 30th column of exported information', default:'None',
path:'@defaults.export30', content:exportElementContents,
},
defexport31: {type:'dropdown',label:'Exported Column no 31',hover_tip:'The 31th column of exported information', default:'None',
path:'@defaults.export31', content:exportElementContents,
},
defexport32: {type:'dropdown',label:'Exported Column no 32',hover_tip:'The 32th column of exported information', default:'None',
path:'@defaults.export32', content:exportElementContents,
},
defexport33: {type:'dropdown',label:'Exported Column no 33',hover_tip:'The 33th column of exported information', default:'None',
path:'@defaults.export33', content:exportElementContents,
},
defexport34: {type:'dropdown',label:'Exported Column no 34',hover_tip:'The 34th column of exported information', default:'None',
path:'@defaults.export34', content:exportElementContents,
},
defexport35: {type:'dropdown',label:'Exported Column no 35',hover_tip:'The 35th column of exported information', default:'None',
path:'@defaults.export35', content:exportElementContents,
},
defexport36: {type:'dropdown',label:'Exported Column no 36',hover_tip:'The 36th column of exported information', default:'None',
path:'@defaults.export36', content:exportElementContents,
},
defexport37: {type:'dropdown',label:'Exported Column no 37',hover_tip:'The 37th column of exported information', default:'None',
path:'@defaults.export37', content:exportElementContents,
},
defexport38: {type:'dropdown',label:'Exported Column no 38',hover_tip:'The 38th column of exported information', default:'None',
path:'@defaults.export38', content:exportElementContents,
},
},
}
var contentsTabConfig = {type:'page',label:'Contents',hover_tip:'Define the contents of your table',
content:{
sect_tbl_cnts:{type:'section',label:'Table Entry'},
table_data: {type:'dropdown',label:'Table Data Element',hover_tip:'The data that will be displayed on the table.',
path:'@tablePresets[@active_ipreset].table_data',
content:tableElementContents,
},
sort1: {type:'dropdown',label:'Primary Sort Criterion',hover_tip:'Items will be sorted by this criterion.',
path:'@tablePresets[@active_ipreset].sort1',
content:sortElementContents,
},
sortOrder1: {type:'dropdown',label:'Primary Sort Order',hover_tip:'Items will be sorted in this order.',
path:'@tablePresets[@active_ipreset].sortOrder1',
content:{'Default': 'Default', 'Ascending': 'Ascending', 'Descending': 'Descending',},
},
sort2: {type:'dropdown',label:'Secondary Sort Criterion',hover_tip:'Items will be sorted by this criterion when the primary criterion is of equal values.',
path:'@tablePresets[@active_ipreset].sort2',
content:sortElementContents,
},
sortOrder2: {type:'dropdown',label:'Secondary Sort Order',hover_tip:'Items will be sorted in this order when the primary criterion is of equal values.',
path:'@tablePresets[@active_ipreset].sortOrder2',
content:{'Default': 'Default', 'Ascending': 'Ascending', 'Descending': 'Descending',},
},
displayMeaning: {type: 'checkbox', label:'Show Items by Their Meanings', hover_tip:'Display the items by their English meanings',
path:'@tablePresets[@active_ipreset].displayMeaning', default: false, },
sect_tbl_tooltips:{type:'section',label:'Table Popups'},
tooltip1: {type:'dropdown',label:'First Popup Element',hover_tip:'The first line of data that will be displayed on the popup.',
path:'@tablePresets[@active_ipreset].tooltip1', default:'None',
content:dataElementContents,
},
tooltip2: {type:'dropdown',label:'Second Popup Element',hover_tip:'The second line of data that will be displayed on the popup.',
path:'@tablePresets[@active_ipreset].tooltip2', default:'None',
content:dataElementContents,
},
tooltip3: {type:'dropdown',label:'Third Popup Element',hover_tip:'The third line of data that will be displayed on the popup.',
path:'@tablePresets[@active_ipreset].tooltip3', default:'None',
content:dataElementContents,
},
tooltip4: {type:'dropdown',label:'Fourth Popup Element',hover_tip:'The fourth line of data that will be displayed on the popup.',
path:'@tablePresets[@active_ipreset].tooltip4', default:'None',
content:dataElementContents,
},
tooltip5: {type:'dropdown',label:'Fifth Popup Element',hover_tip:'The fifth line of data that will be displayed on the popup.',
path:'@tablePresets[@active_ipreset].tooltip5', default:'None',
content:dataElementContents,
},
tooltip6: {type:'dropdown',label:'Sixth Popup Element',hover_tip:'The sixth line of data that will be displayed on the popup.',
path:'@tablePresets[@active_ipreset].tooltip6', default:'None',
content:dataElementContents,
},
tooltip7: {type:'dropdown',label:'Seventh Popup Element',hover_tip:'The seventh line of data that will be displayed on the popup.',
path:'@tablePresets[@active_ipreset].tooltip7', default:'None',
content:dataElementContents,
},
tooltip8: {type:'dropdown',label:'Eight Popup Element',hover_tip:'The eight line of data that will be displayed on the popup.',
path:'@tablePresets[@active_ipreset].tooltip8', default:'None',
content:dataElementContents,
},
sect_tbl_settings:{type:'section',label:'Other Settings'},
enlargingTooltip: {type: 'checkbox', label:'Popup for Enlarged Items', hover_tip:'Adds a popup in tables at the right of the item to show an enlarged version of the item',
path:'@tablePresets[@active_ipreset].enlargingTooltip', default: false, },
showMarkers: {type: 'checkbox', label:'Show Markers', hover_tip:'Show the markers for the table data in list of icons.',
path:'@tablePresets[@active_ipreset].showMarkers', default: true, },
showMarkersDate: {type: 'checkbox', label:'Show Markers in Date Selection', hover_tip:'Show the markers for the table data in list of icons when ordered by date.',
path:'@tablePresets[@active_ipreset].showMarkersDate', default: false, },
showHours: {type: 'checkbox', label:'Show Hours in Markers', hover_tip:'Show the hours and minutes for dates in list of icons markers',
path:'@tablePresets[@active_ipreset].showHours', default: false, },
leechStreakLimit: {type:'number',label:'Leech Streak Limit',hover_tip:'Do not display an item when current streak for both meaning and reading is equal or greater to this limit.\nA value of 0 disable this feature',
path:'@tablePresets[@active_ipreset].leechStreakLimit', default:0
},
sect_tbl_selections:{type:'section',label:'Selection Options Settings'},
randomSelection: {type:'number',label:'Random Selection',hover_tip:'The size of a random selection of items.\n0 means to fill the screen.',
path:'@tablePresets[@active_ipreset].randomSelection', default:0,},
navigationDate: {type:'dropdown',label:'Date for Date Navigation',hover_tip:'The date used as a reference when the mode ordering by date is on.',
path:'@tablePresets[@active_ipreset].navigationDate', default:'Lesson_Date',
content:{'Review_Date':'Review Date', 'Lesson_Date':'Lesson Date', 'Passed_Date':'Passed Guru Date',
'Burned_Date':'Burned Date', 'Resurrected_Date': 'Resurrected Date', 'Unlock_Date': 'Unlock Date',},
},
},
};
var contentsDefaultTabConfig = {type:'page',label:'Contents',hover_tip:'Define the default contents for your newly created tables',
content:{
sect_tbl_defcnts:{type:'section',label:'Table Entry'},
deftable_data: {type:'dropdown',label:'Table Data Element',hover_tip:'The data that will be displayed on the table.',
path:'@defaults.table_data', default: 'Level',
content:tableElementContents,
},
defsort1: {type:'dropdown',label:'Primary Sort Criterion',hover_tip:'Items will be sorted by this criterion.',
path:'@defaults.sort1', default: 'Type',
content:sortElementContents,
},
defsortOrder1: {type:'dropdown',label:'Primary Sort Order',hover_tip:'Items will be sorted in this order.',
path:'@defaults.sortOrder1',
content:{'Default': 'Default', 'Ascending': 'Ascending', 'Descending': 'Descending',},
},
defsort2: {type:'dropdown',label:'Secondary Sort Criterion',hover_tip:'Items will be sorted by this criterion when the primary criterion is of equal values.',
path:'@defaults.sort2',
content:sortElementContents,
},
defsortOrder2: {type:'dropdown',label:'Secondary Sort Order',hover_tip:'Items will be sorted in this order when the primary criterion is of equal values.',
path:'@defaults.sortOrder2',
content:{'Default': 'Default', 'Ascending': 'Ascending', 'Descending': 'Descending',},
},
defdisplayMeaning: {type: 'checkbox', label:'Show Items by Their Meanings', hover_tip:'Display the items by their English meanings',
path:'@defaults.displayMeaning', default: false, },
sect_tbl_deftooltips:{type:'section',label:'Table Popups'},
deftooltip1: {type:'dropdown',label:'First Popup Element',hover_tip:'The first line of data that will be displayed on the popup.',
path:'@defaults.tooltip1', default:'Meaning_Full',
content:dataElementContents,
},
deftooltip2: {type:'dropdown',label:'Second Popup Element',hover_tip:'The second line of data that will be displayed on the popup.',
path:'@defaults.tooltip2', default:'Reading_Full',
content:dataElementContents,
},
deftooltip3: {type:'dropdown',label:'Third Popup Element',hover_tip:'The third line of data that will be displayed on the popup.',
path:'@defaults.tooltip3', default:'Srs',
content:dataElementContents,
},
deftooltip4: {type:'dropdown',label:'Fourth Popup Element',hover_tip:'The fourth line of data that will be displayed on the popup.',
path:'@defaults.tooltip4', default:'Unlock_Date',
content:dataElementContents,
},
deftooltip5: {type:'dropdown',label:'Fifth Popup Element',hover_tip:'The fifth line of data that will be displayed on the popup.',
path:'@defaults.tooltip5', default:'Lesson_Date',
content:dataElementContents,
},
deftooltip6: {type:'dropdown',label:'Sixth Popup Element',hover_tip:'The sixth line of data that will be displayed on the popup.',
path:'@defaults.tooltip6', default:'Passed_Date',
content:dataElementContents,
},
deftooltip7: {type:'dropdown',label:'Seventh Popup Element',hover_tip:'The seventh line of data that will be displayed on the popup.',
path:'@defaults.tooltip7', default:'Burned_Date',
content:dataElementContents,
},
deftooltip8: {type:'dropdown',label:'Eight Popup Element',hover_tip:'The eight line of data that will be displayed on the popup.',
path:'@defaults.tooltip8', default:'Leech',
content:dataElementContents,
},
sect_tbl_defsettings:{type:'section',label:'Other Settings'},
defenlargingTooltip: {type: 'checkbox', label:'Popup for Enlarged Items', hover_tip:'Adds a popup in tables at the right of the item to show an enlarged version of the item.',
path:'@defaults.enlargingTooltip', default: false, },
defshowMarkers: {type: 'checkbox', label:'Show Markers', hover_tip:'Show the markers for the table data in list of icons.',
path:'@defaults.showMarkers', default: true, },
defshowMarkersDate: {type: 'checkbox', label:'Show Markers in Date Selection', hover_tip:'Show the markers for the table data in list of icons when ordered by date.',
path:'@defaults.showMarkersDate', default: false, },
defshowHours: {type: 'checkbox', label:'Show Hours in Markers', hover_tip:'Show the hours and minutes for dates in list of icons markers',
path:'@defaults.showHours', default: false, },
},
};
var settingsTabConfig ={type:'page',label:'Settings',
content:{
sect_tbl_cnts:{type:'section',label:'Interface Configuration'},
position: {type: 'dropdown', label: 'Position', default: 2, hover_tip: 'Where on the dashboard to install Item Inspector',
content: {0: "Top", 1: "Below forecast", 2: "Below SRS", 3: "Below panels", 4: "Bottom"},
},
hoursFormat: {type:'dropdown',label:'Hours Format',hover_tip:'Choose the format for displaying hours',content:{'12hours':'12h', '24hours':'24h',},
default: '24h',},
listMode: {type: 'checkbox', label:'Display as List', hover_tip:'Display the table as a list of icons',
default: false, },
numberOfLines: {type:'dropdown',label:'Number of Lines',hover_tip:'The number of lines that will be displayed in a table.', default:11,
content:{8:"8", 9:"9", 10:"10", 11:"11", 12:"12", 13:"13", 14:"14", 15:"15",},
},
audioSource: {type:'dropdown',label:'Source of Audio',hover_tip:'Which audio is played in audio mode.', default:'random',
content:{'male': 'Male, Kenichi','female': 'Female, Kyoko', 'random': 'Random',},
},
sect_tbl_cnts2:{type:'section',label:'Items Export Options'},
noLatin: {type: 'checkbox', label:'No Latin Characters', default: false, hover_tip:'Radicals with latin characters not exported if set',},
oneItemPerLine: {type: 'checkbox', label:'One item per line', default: false, hover_tip: 'One item per line if set\nAll items in one paragraph otherwise',},
exportLimit: {type: 'number', label:'Export Limit', default: 0, hover_tip: 'Maximum number of items exported\n0 means no limit',},
repeatWordCloud: {type: 'dropdown', label:'Repeat for Word Cloud', default: 'No Repeat', hover_tip: 'Repeat the items according this number',
content:wordCloudContents,},
}
}
var config = {
script_id: scriptId,
title: 'Item Inspector',
pre_open: preopen_quiz_settings,
on_save: save_quiz_settings,
on_close: close_quiz_settings,
on_refresh: refresh_quiz_settings,
no_bkgd: true,
settings: {pgSettings: settingsTabConfig,
pg_items: {type:'page',label:'Tables',hover_tip:'Choose the table for which you want to define the settings',
content:{
grp_ipre_list: {type:'group',label:'Table List',content:{
active_ipreset: {type:'list',refresh_on_change:true,hover_tip:'Choose a table to edit',content:{}},
}},
grp_ipre: {type:'group',label:'Selected Table',
content:{
sect_ipre_name: {type:'section',label:'Table Name'},
ipre_name: {type:'text',label:'Edit Table Name',on_change:refresh_ipresets,path:'@ipresets[@active_ipreset].name',hover_tip:'Enter a name for the selected table'},
sect_ipre_srcs: {type:'section',label:'Table Settings'},
ipre_srcs: {type:'tabset',
content:{table_contents: contentsTabConfig, table_export: exportTabConfig},
}
},
}
},
},
pgDefaultSettings: {type:'page',label:'Defaults',hover_tip:'Set the defaults settings for when you create temporaary tables',
content:{sect_tbl_cnts3:{type:'section',label:'Defauts for Temporary Tables'},
ipre_npdefaults: {type:'tabset',
content:{default_contents: contentsDefaultTabConfig, default_export: exportDefaultTabConfig},
}},
},
}};
populate_items_config(config);
quiz.settings_dialog = new wkof.Settings(config);
};
//========================================================================
// preopen_quiz_settings()
//------------------------------------------------------------------------
function preopen_quiz_settings(dialog) {
var btn_grp =
'<div class="pre_list_btn_grp">'+
'<button type="button" ref="###" action="new" class="ui-button ui-corner-all ui-widget" title="Create a new table">New</button>'+
'<button type="button" ref="###" action="up" class="ui-button ui-corner-all ui-widget" title="Move the selected table up in the list"><span class="icon-arrow-up"></span></button>'+
'<button type="button" ref="###" action="down" class="ui-button ui-corner-all ui-widget" title="Move the selected table down in the list"><span class="icon-arrow-down"></span></button>'+
'<button type="button" ref="###" action="delete" class="ui-button ui-corner-all ui-widget" title="Delete the selected table">Delete</button>'+
'</div>';
var wrap = dialog.find('#Item_Inspector_active_ipreset').closest('.row');
wrap.addClass('pre_list_wrap');
wrap.prepend(btn_grp.replace(/###/g, 'ipreset'));
wrap.find('.pre_list_btn_grp').on('click', 'button', preset_button_pressed);
$('#Item_Inspector_ipre_srcs .row:first-child').each(function(i,e){
var row = $(e);
var right = row.find('>.right');
row.prepend(right);
row.addClass('src_enable');
});
// Customize the item source filters.
var srcs = $('#Item_Inspector_ipre_srcs');
var flt_grps = srcs.find('.wkof_group');
flt_grps.addClass('filters');
var filters = flt_grps.find('.row');
filters.prepend('<div class="enable"><input type="checkbox"></div>');
filters.on('change', '.enable input[type="checkbox"]', toggle_filter);
init_settings();
refresh_ipresets();
}
//========================================================================
// open_quiz_settings()
//------------------------------------------------------------------------
var old_position;
function open_quiz_settings() {
document.getElementById("WkitSettings").blur();
if (quiz_settings_state !== 'ready') return call_setup_quiz_settings();
quiz_settings_state = 'open';
var backup = {};
quiz.backup = backup;
//backup.max_quiz_size = quiz.settings.max_quiz_size;
backup.ipre = JSON.stringify(quiz.settings.ipresets[quiz.settings.active_ipreset].content);
old_position = quiz.settings.position;
quiz.settings_dialog.open();
function call_setup_quiz_settings(){
setup_quiz_settings();
wkof.Settings.load(scriptId)
.then(function(){
quiz_settings_state = 'ready';
open_quiz_settings();
});
};
}
//========================================================================
// save_quiz_settings()
//------------------------------------------------------------------------
function save_quiz_settings(settings) {
quiz.settings = settings;
populate_presets($('#Item_Inspector_source'), settings.ipresets, settings.active_ipreset);
// check if the table list is empty
if (!quiz.settings.ipresets.length){
init_settings(); // restore defaults
};
add_defaults();
initCurrentItem();
setNumberOfLines();
populateDropdown();
if (old_position != quiz.settings.position){
if (document.getElementById("WkitTopBar")){
$('#WkitTopBar').empty();
$('#WkitTopBar').remove();
insertContainer();
eventHandlers();
};
};
quiz.settings.audioMode = false;
formatControlBar();
dataReload('table');
}
//========================================================================
// close_quiz_settings()
//------------------------------------------------------------------------
function close_quiz_settings(settings) {
quiz_settings_state = 'setup';
quiz.settings = wkof.settings[scriptId]; // working around an obscure bug
}
//========================================================================
// refresh_quiz_settings()
//------------------------------------------------------------------------
function refresh_quiz_settings(settings) {
$('#Item_Inspector_ipre_srcs .wkof_group .row').each(function(i,e){
var row = $(e);
var panel = row.closest('[role="tabpanel"]');
var source = panel.attr('id').match(/^Item_Inspector_pg_(.*)$/)[1];
var filter_name = row.find('.setting').attr('name').slice((source+'_flt_').length);
var preset = quiz.settings.ipresets[quiz.settings.active_ipreset].content;
var enabled = false;
try {
enabled = preset[source].filters[filter_name].enabled;
} catch(e) {}
if (enabled) {
row.addClass('checked');
} else {
row.removeClass('checked');
}
row.find('.enable input[type="checkbox"]').prop('checked', enabled);
});
}
//========================================================================
// refresh_ipresets()
//------------------------------------------------------------------------
function refresh_ipresets() {
var settings = quiz.settings;
populate_presets($('#Item_Inspector_active_ipreset'), settings.ipresets, settings.active_ipreset);
}
//========================================================================
// preset_button_pressed()
//------------------------------------------------------------------------
function preset_button_pressed(e) {
var settings = quiz.settings;
var tablePresets = settings.tablePresets;
var ref = e.currentTarget.attributes.ref.value;
var action = e.currentTarget.attributes.action.value;
var selected = Number(settings['active_'+ref]);
var presets = settings[ref+'s'];
var elem = $('#Item_Inspector_active_'+ref);
var dflt;
dflt = {name:'<untitled>', content:$.extend(true, {}, ipre_defaults)};
switch (action) {
case 'new':
presets.push(dflt);
tablePresets.push(table_defaults);
selected = presets.length - 1;
settings[ref+'s'] = presets;
settings['active_'+ref] = selected;
settings.tablePresets = tablePresets;
populate_presets(elem, presets, selected);
quiz.settings_dialog.refresh();
$('#Item_Inspector_'+ref.slice(0,4)+'_name').focus().select();
break;
case 'up':
if (selected <= 0) break;
presets = [].concat(presets.slice(0, selected-1), presets[selected], presets[selected-1], presets.slice(selected+1));
tablePresets = [].concat(tablePresets.slice(0, selected-1), tablePresets[selected], tablePresets[selected-1], tablePresets.slice(selected+1));
selected--;
settings[ref+'s'] = presets;
settings['active_'+ref] = selected;
settings.tablePresets = tablePresets;
populate_presets(elem, presets, selected);
break;
case 'down':
if (selected >= presets.length-1) break;
presets = [].concat(presets.slice(0, selected), presets[selected+1], presets[selected], presets.slice(selected+2));
tablePresets = [].concat(tablePresets.slice(0, selected), tablePresets[selected+1], tablePresets[selected], tablePresets.slice(selected+2));
selected++;
settings[ref+'s'] = presets;
settings['active_'+ref] = selected;
settings.tablePresets = tablePresets;
populate_presets(elem, presets, selected);
break;
case 'delete':
presets = presets.slice(0, selected).concat(presets.slice(selected+1));
tablePresets = tablePresets.slice(0, selected).concat(tablePresets.slice(selected+1));
selected = Math.max(0, selected-1);
settings[ref+'s'] = presets;
settings['active_'+ref] = selected;
settings.tablePresets = tablePresets;
populate_presets(elem, presets, selected);
quiz.settings_dialog.refresh();
break;
}
}
function addTable(name){
var settings = quiz.settings;
var tablePresets = settings.tablePresets;
var selected;
var presets = settings.ipresets;
var dflt;
dflt = {name:name, content:$.extend(true, {}, ipre_defaults)};
presets.push(dflt);
tablePresets.push(table_defaults);
selected = presets.length - 1;
let keys = Object.keys(settings.defaults);
for (var index in keys){
let key = keys[index]
tablePresets[selected][key] = settings.defaults[key];
};
add_defaults();
settings.ipresets = presets;
settings.active_ipreset = selected;
settings.tablePresets = tablePresets;
populateDropdown();
};
function removeTempTables(){
var settings = quiz.settings;
var tablePresets = settings.tablePresets;
var presets = settings.ipresets;
var selected = settings.active_ipreset;
for (var j = presets.length - 1; j >=0; j--){
if (presets[j].name.slice(0, 6) === '--Temp') deleteTable(j);
};
settings.ipresets = presets;
settings.tablePresets = tablePresets;
settings.active_ipreset = selected
populateDropdown();
function deleteTable(j){
presets = presets.slice(0, j).concat(presets.slice(j+1));
tablePresets = tablePresets.slice(0, j).concat(tablePresets.slice(j+1));
if (selected > j){selected--};
};
};
//========================================================================
// init_settings()
//------------------------------------------------------------------------
var table_defaults;
function init_settings() {
var idx;
// Merge some defaults
var defaults = {
};
var settings = $.extend(true, {}, defaults, wkof.settings.Item_Inspector);
wkof.settings.Item_Inspector = quiz.settings = settings;
/*var settings;
settings = quiz.settings = wkof.settings.Item_Inspector;*/
let ipresets_defaults = [
{name:'Leeches', content:{wk_items:{enabled:true,filters:{srs:{enabled:true,value:{appr1:true,appr2:true,appr3:true,appr4:true,guru1:true,guru2:true,mast:true}}
,additionalFilters_leechTraining:{enabled:true,value:1}}},
tableContents:{currentItem:0,table_data:"Leech",sort1:"Default",sortOrder1:'Default',sort2:"Default",sortOrder2:'Default',
tooltip1:"Meaning_Full",tooltip2:"Reading_Full",tooltip3:"None",tooltip4:"None",tooltip5:"None",
tooltip6:"None",tooltip7:"None",tooltip8:"None",
displayMeaning:false,enlargingTooltip:true,showMarkers:true,showMarkersDate:false,showHours:false,leechStreakLimit:0,
randomSelection: 0,navigationDate:'Lesson_Date',
includeTitle:false,includeLabels:false,missingData:'Code_Word',separator:'\t',quotes:'Never',URLclickable:'Plain',
defhoursInDate:{'Review_Date': true},}}},
{name:'Failed Last Review', content:{wk_items:{enabled:true,filters:{additionalFilters_failedLastReview:{enabled:true,value:24}}},
tableContents:{currentItem:0,table_data:"Leech",sort1:"Default",sortOrder1:'Default',sort2:"Default",sortOrder2:'Default',
tooltip1:"Meaning_Full",tooltip2:"Reading_Full",tooltip3:"None",tooltip4:"None",tooltip5:"None",
tooltip6:"None",tooltip7:"None",tooltip8:"None",
displayMeaning:false,enlargingTooltip:true,showMarkers:true,showMarkersDate:false,showHours:false,leechStreakLimit:0,
randomSelection: 0,navigationDate:'Lesson_Date',
includeTitle:false,includeLabels:false,missingData:'Code_Word',
separator:'\t',quotes:'Never',
URLclickable:'Plain',defhoursInDate:{'Review_Date': true},}}},
{name:'Current Level SRS', content:{wk_items:{enabled:true,filters:{level:{enabled:true,value:"+0"},srs:{enabled:true,value:{appr1:true,appr2:true,appr3:true,appr4:true,guru1:true,guru2:true,mast:true,enli:true}}}},
tableContents:{currentItem:0,table_data:"Srs",sort1:"Default",sortOrder1:'Default',sort2:"Default",sortOrder2:'Default',
tooltip1:"Review_Date",tooltip2:"Review_Wait",tooltip3:"None",tooltip4:"None",tooltip5:"None",
tooltip6:"None",tooltip7:"None",tooltip8:"None",
displayMeaning:false,enlargingTooltip:false,showMarkers:true,showMarkersDate:false,showHours:false,leechStreakLimit:0,
randomSelection: 0,navigationDate:'Lesson_Date',
includeTitle:false,includeLabels:false,missingData:'Code_Word',separator:'\t',quotes:'Never',
URLclickable:'Plain',defhoursInDate:{'Review_Date': true},}}},
{name:'Previous Level SRS', content:{wk_items:{enabled:true,filters:{level:{enabled:true,value:"-1"},srs:{enabled:true,value:{appr1:true,appr2:true,appr3:true,appr4:true,guru1:true,guru2:true,mast:true,enli:true}}}},
tableContents:{currentItem:0,table_data:"Srs",sort1:"Default",sortOrder1:'Default',sort2:"Default",sortOrder2:'Default',
tooltip1:"Review_Date",tooltip2:"Review_Wait",tooltip3:"None",tooltip4:"None",tooltip5:"None",
tooltip6:"None",tooltip7:"None",tooltip8:"None",
displayMeaning:false,enlargingTooltip:false,showMarkers:true,showMarkersDate:false,showHours:false,leechStreakLimit:0,
randomSelection: 0,navigationDate:'Lesson_Date',
includeTitle:false,includeLabels:false,missingData:'Code_Word',separator:'\t',quotes:'Never',
URLclickable:'Plain',defhoursInDate:{'Review_Date': true},}}},
];
table_defaults = {currentItem:0,table_data:"Leech",sort1:"Default",sortOrder1:'Default',sort2:"Default",sortOrder2:'Default',
tooltip1:"Meaning_Full",tooltip2:"Reading_Full",tooltip3:"None",tooltip4:"None",tooltip5:"None",tooltip6:"None",tooltip7:"None",tooltip8:"None",
displayMeaning:false,enlargingTooltip:false,showMarkers:true,showMarkersDate:false,showHours:false,leechStreakLimit:0,randomSelection: 0,
navigationDate:'Lesson_Date',includeTitle:false,
includeLabels:false,missingData:'Code_Word',separator:'\t',quotes:'Never',URLclickable:'Plain',defhoursInDate:{'Review_Date': true},};
for (var i = 0; i < exportedInfo.length; i++){
table_defaults[exportedInfo[i]] = 'None';
};
// define defaults if presets not yet defined
if (settings.ipresets === undefined) {
settings.ipresets = ipresets_defaults;
settings.active_ipreset = 0;
settings.tablePresets = init_table_presets(ipresets_defaults);
};
// restore defaults when ipresets list is empty
if (!settings.ipresets.length) {
settings.ipresets = ipresets_defaults;
settings.active_ipreset = 0;
settings.tablePresets = init_table_presets(ipresets_defaults);
};
if (ipre_defaults) {
for (idx in settings.ipresets) {
settings.ipresets[idx].content = $.extend(true, {}, ipre_defaults, settings.ipresets[idx].content);
}
}
function init_table_presets(ipresets_defaults){
var x = [];
for (var y of ipresets_defaults){x.push(y.content.tableContents)};
return x;
}
}
//========================================================================
// populate_items_config()
//------------------------------------------------------------------------
var ipre_defaults;
function populate_items_config(config) {
var ipre_srcs = config.settings.pg_items.content.grp_ipre.content.ipre_srcs.content;
var srcs = wkof.ItemData.registry.sources;
ipre_defaults = {};
let src_name = 'wk_items';
var src = srcs[src_name];
var pg_content = {};
ipre_srcs['pg_'+src_name] = {type:'page',label:'Filters',content:pg_content};
var settings = {};
ipre_defaults[src_name] = settings;
// Add 'Filters' section.
if (src.filters && Object.keys(src.filters).length > 0) {
settings.filters = {};
var flt_content = {};
pg_content['grp_'+src_name+'_filters'] = {type:'group',label:'',content:flt_content};
for (var flt_name in src.filters) {
var flt = src.filters[flt_name];
if (flt.no_ui) continue;
settings.filters[flt_name] = {enabled:false, value:flt.default};
switch (flt.type) {
case 'checkbox':
flt_content[src_name+'_flt_'+flt_name] = {
type:'checkbox',
label:flt.label,
default:flt.default,
path:'@ipresets[@active_ipreset].content["'+src_name+'"].filters["'+flt_name+'"].value',
hover_tip:flt.hover_tip
}
break;
case 'multi':
var dflt = flt.default;
if (typeof flt.filter_value_map === 'function') dflt = flt.filter_value_map(dflt);
flt_content[src_name+'_flt_'+flt_name] = {
type:'list',
multi:true,
size:Math.min(4,Object.keys(flt.content).length),
label:flt.label,
content:flt.content,
default:dflt,
path:'@ipresets[@active_ipreset].content["'+src_name+'"].filters["'+flt_name+'"].value',
hover_tip:flt.hover_tip
}
settings.filters[flt_name].value = dflt;
break;
case 'text':
case 'number':
case 'input':
flt_content[src_name+'_flt_'+flt_name] = {
type:flt.type,
label:flt.label,
placeholder:flt.placeholder,
default:flt.default,
path:'@ipresets[@active_ipreset].content["'+src_name+'"].filters["'+flt_name+'"].value',
hover_tip:flt.hover_tip
}
break;
case 'button':
flt_content[src_name+'_flt_'+flt_name] = {
type:flt.type,
label:flt.label,
on_click:flt.on_click,
hover_tip:flt.hover_tip
}
break;
}
}
}
}
//========================================================================
// toggle_filter()
//------------------------------------------------------------------------
function toggle_filter(e) {
var row = $(e.delegateTarget);
var panel = row.closest('[role="tabpanel"]');
var source = panel.attr('id').match(/^Item_Inspector_pg_(.*)$/)[1];
var enabled = row.find('.enable input[type="checkbox"]').prop('checked');
var preset = quiz.settings.ipresets[quiz.settings.active_ipreset].content;
var filter_name = row.find('.setting').attr('name').slice((source+'_flt_').length);
if (enabled) {
row.addClass('checked');
} else {
row.removeClass('checked');
}
try {
preset[source].filters[filter_name].enabled = enabled;
} catch(e) {}
}
//========================================================================
// populate_presets()
//------------------------------------------------------------------------
function populate_presets(elem, presets, active_preset) {
var html = '';
for (var idx in presets) {
var preset = presets[idx];
var name = preset.name.replace(/</g,'<').replace(/>/g,'>');
html += '<option name="'+idx+'">'+name+'</option>';
}
var elem_name = elem.attr('id')
if (elem_name === 'Item_Inspector_source' && quiz.custom.has_ipreset) {
html += '<option name="custom">('+quiz.custom.ipreset.name+')</option>';
if (quiz.custom.using_ipreset) active_preset = presets.length;
}
elem.html(html);
elem.children().eq(active_preset).prop('selected', true);
}
//========================================================================
// add_defaults()
//------------------------------------------------------------------------
function add_defaults(){
let settings = quiz.settings;
if (settings.hoursFormat == undefined){settings.hoursFormat = '24h'};
if (settings.position == undefined){settings.position = 2};
if (settings.numberOfLines == undefined){settings.numberOfLines = 11};
if (settings.listMode == undefined){settings.listMode = false};
if (settings.audioSource == undefined){settings.audioSource = 'random'};
if (settings.audioMode == undefined){settings.audioMode = false};
if (settings.noLatin == undefined){settings.noLatin = false};
if (settings.oneItemPerLine == undefined){settings.oneItemPerLine = false};
if (settings.exportLimit == undefined){settings.exportLimit = 0};
if (settings.repeatWordCloud == undefined){settings.repeatWordCloud = 'No Repeat'};
let tablePresets = quiz.settings.tablePresets;
for (var i = 0; i < tablePresets.length; i++){
if (tablePresets[i].table_data == undefined){tablePresets[i].table_data = 'Leech'};
if (tablePresets[i].sort1 == undefined){tablePresets[i].sort1 = 'Default'};
if (tablePresets[i].sortOrder1 == undefined){tablePresets[i].sortOrder1 = 'Default'};
if (tablePresets[i].sort2 == undefined){tablePresets[i].sort2 = 'Default'};
if (tablePresets[i].sortOrder2 == undefined){tablePresets[i].sortOrder2 = 'Default'};
if (tablePresets[i].tooltip1 == undefined){tablePresets[i].tooltip1 = 'Meaning_Full'};
if (tablePresets[i].tooltip2 == undefined){tablePresets[i].tooltip2 = 'Reading_Full'};
if (tablePresets[i].tooltip3 == undefined){tablePresets[i].tooltip3 = 'None'};
if (tablePresets[i].tooltip4 == undefined){tablePresets[i].tooltip4 = 'None'};
if (tablePresets[i].tooltip5 == undefined){tablePresets[i].tooltip5 = 'None'};
if (tablePresets[i].tooltip6 == undefined){tablePresets[i].tooltip6 = 'None'};
if (tablePresets[i].tooltip7 == undefined){tablePresets[i].tooltip7 = 'None'};
if (tablePresets[i].tooltip8 == undefined){tablePresets[i].tooltip8 = 'None'};
if (tablePresets[i].displayMeaning == undefined){tablePresets[i].displayMeaning = false};
if (tablePresets[i].enlargingTooltip == undefined){tablePresets[i].enlargingTooltip = false};
if (tablePresets[i].showMarkers == undefined){tablePresets[i].showMarkers = true};
if (tablePresets[i].showMarkersDate == undefined){tablePresets[i].showMarkersDate = false};
if (tablePresets[i].showHours == undefined){tablePresets[i].showHours = false};
if (tablePresets[i].leechStreakLimit == undefined){tablePresets[i].leechStreakLimit = 0};
if (tablePresets[i].randomSelection == undefined){tablePresets[i].randomSelection = 0};
if (tablePresets[i].navigationDate == undefined){tablePresets[i].navigationDate = 'Lesson_Date'};
if (tablePresets[i].includeTitle == undefined){tablePresets[i].includeTitle = false};
if (tablePresets[i].includeTitle == 0){tablePresets[i].includeTitle = false}; // fixing the consequence of a bug
if (tablePresets[i].includeLabels == undefined){tablePresets[i].includeLabels = false};
if (tablePresets[i].missingData == undefined){tablePresets[i].missingData = 'Code_Word'};
if (tablePresets[i].separator == undefined){tablePresets[i].separator ='\t'};
if (tablePresets[i].quotes == undefined){tablePresets[i].quotes = 'Never'};
if (tablePresets[i].URLclickable == undefined){tablePresets[i].URLclickable = 'Plain'};
if (tablePresets[i].URLclickable == false){tablePresets[i].URLclickable = 'Plain'};
if (tablePresets[i].URLclickable == true){tablePresets[i].URLclickable = 'Spreadsheet'};
if (tablePresets[i].hoursInDate == undefined){tablePresets[i].hoursInDate = {"Review_Date": true}};
if (tablePresets[i].currentItem == undefined){tablePresets[i].currentItem = 0};
if (tablePresets[i].nextCurrentItem == undefined){tablePresets[i].nextCurrentItem = 0};
if (tablePresets[i].savedCurrentItem == undefined){tablePresets[i].savedCurrentItem = 0};
if (tablePresets[i].savedNextCurrentItem == undefined){tablePresets[i].savedNextCurrentItem = 0};
if (tablePresets[i].itemList == undefined){tablePresets[i].itemList = []};
if (tablePresets[i].selection == undefined){tablePresets[i].selection = 'None'};
if (tablePresets[i].startDate == undefined){tablePresets[i].startDate = 0};
if (tablePresets[i].savedSelCurrentItem == undefined){tablePresets[i].savedSelCurrentItem = 0};
if (tablePresets[i].savedSelNextCurrentItem == undefined){tablePresets[i].savedSelNextCurrentItem = 0};
for (var j = 0; j < exportedInfo.length; j++){
if(tablePresets[i][exportedInfo[j]] == undefined) tablePresets[i][exportedInfo[j]] = 'None';
};
}
if (quiz.settings.defaults == undefined) quiz.settings.defaults = {};
let defaults = quiz.settings.defaults;
if (defaults.table_data == undefined){defaults.table_data = 'Level'};
if (defaults.sort1 == undefined){defaults.sort1 = 'Level'};
if (defaults.sortOrder1 == undefined){defaults.sortOrder1 = 'Default'};
if (defaults.sort2 == undefined){defaults.sort2 = 'Default'};
if (defaults.sortOrder2 == defaults){defaults.sortOrder2 = 'Default'};
if (defaults.tooltip1 == undefined){defaults.tooltip1 = 'Meaning_Full'};
if (defaults.tooltip2 == undefined){defaults.tooltip2 = 'Reading_Full'};
if (defaults.tooltip3 == undefined){defaults.tooltip3 = 'Srs'};
if (defaults.tooltip4 == undefined){defaults.tooltip4 = 'Unlock_Date'};
if (defaults.tooltip5 == undefined){defaults.tooltip5 = 'Lesson_Date'};
if (defaults.tooltip6 == undefined){defaults.tooltip6 = 'Passed_Date'};
if (defaults.tooltip7 == undefined){defaults.tooltip7 = 'Burned_Date'};
if (defaults.tooltip8 == undefined){defaults.tooltip8 = 'Leech'};
if (defaults.displayMeaning == undefined){defaults.displayMeaning = false};
if (defaults.enlargingTooltip == undefined){defaults.enlargingTooltip = false};
if (defaults.showMarkers == undefined){defaults.showMarkers = true};
if (defaults.showMarkersDate == undefined){defaults.showMarkersDate = false};
if (defaults.showHours == undefined){defaults.showHours = false};
if (defaults.leechStreakLimit == undefined){defaults.leechStreakLimit = 0};
if (defaults.randomSelection == undefined){defaults.randomSelection = 0};
if (defaults.navigationDate == undefined){defaults.navigationDate = 'Lesson_Date'};
if (defaults.itemsLimit == undefined){defaults.itemsLimit = 200};
if (defaults.includeTitle == undefined){defaults.includeTitle = false};
if (defaults.includeLabels == undefined){defaults.includeLabels = false};
if (defaults.missingData == undefined){defaults.missingData = 'Code_Word'};
if (defaults.separator == undefined){defaults.separator ='\t'};
if (defaults.quotes == undefined){defaults.quotes = 'Never'};
if (defaults.URLclickable == undefined){defaults.URLclickable = 'Plain'};
if (defaults.URLclickable == false){defaults.URLclickable = 'Plain'};
if (defaults.URLclickable == true){defaults.URLclickable = 'Spreadsheet'};
if (defaults.hoursInDate == undefined){defaults.hoursInDate = {"Review_Date": true}};
if (defaults.currentItem == undefined){defaults.currentItem = 0};
if (defaults.nextCurrentItem == undefined){defaults.nextCurrentItem = 0};
if (defaults.savedCurrentItem == undefined){defaults.savedCurrentItem = 0};
if (defaults.savedNextCurrentItem == undefined){defaults.savedNextCurrentItem = 0};
if (defaults.itemList == undefined){defaults.itemList = []};
if (defaults.selection == undefined){defaults.selection = 'None'};
if (defaults.startDate == undefined){defaults.startDate = 0};
if (defaults.savedSelCurrentItem == undefined){defaults.savedSelCurrentItem = 0};
if (defaults.savedSelNextCurrentItem == undefined){defaults.savedSelNextCurrentItem = 0};
for (j = 0; j < exportedInfo.length; j++){
if(defaults[exportedInfo[j]] == undefined) defaults[exportedInfo[j]] = 'None';
};
return quiz.settings_dialog.save()
}
//########################################################################
// QUIZ DIALOG
//########################################################################
//========================================================================
// install_css()
//------------------------------------------------------------------------
function install_css() {
$('head').append(
'<style id="Item_Inspector_css" type="text/css">'+
//--[ Settings dialog ]-------------------------------------------
'#wkof_ds div[role="dialog"][aria-describedby="wkofs_Item_Inspector"] {z-index:12002;}'+
'#wkofs_Item_Inspector.wkof_settings .pre_list_btn_grp {width:60px;float:left;margin-right:2px;}'+
'#wkofs_Item_Inspector.wkof_settings .pre_list_btn_grp button {width:100%; padding:2px 0;}'+
'#wkofs_Item_Inspector.wkof_settings .pre_list_btn_grp button:not(:last-child) {margin-bottom:2px;}'+
'#wkofs_Item_Inspector.wkof_settings .pre_list_wrap {display:flex;}'+
'#wkofs_Item_Inspector.wkof_settings .pre_list_wrap .right {flex:1;}'+
'#wkofs_Item_Inspector.wkof_settings .pre_list_wrap .list {overflow:auto;height:100%;}'+
'#wkofs_Item_Inspector.wkof_settings .filters .row {border-top:1px solid #ccc; padding:6px 4px; margin-bottom:0;}'+
'#wkofs_Item_Inspector.wkof_settings .filters .row:not(.checked) {padding-top:0px;padding-bottom:0px;}'+
'#wkofs_Item_Inspector .filters .row .enable input[type="checkbox"] {margin:0;}'+
'#wkofs_Item_Inspector.narrow .filters .row.checked .right input[type="checkbox"]:after {content:"⇐yes?";margin-left:28px;line-height:30px;}'+
'#wkofs_Item_Inspector .filters .row.checked {background-color:#f7f7f7;}'+
'#wkofs_Item_Inspector .filters .row:not(.checked) {opacity:0.5;}'+
'#wkofs_Item_Inspector .filters .row .enable {display:inline; margin:0; float:left;}'+
'#wkofs_Item_Inspector:not(.narrow) .filters .left {width:170px;}'+
'#wkofs_Item_Inspector .filters .row .enable input[type="checkbox"] {margin:0 4px 0 0;}'+
'#wkofs_Item_Inspector .filters .row:not(.checked) .right {display:none;}'+
'#wkofs_Item_Inspector .filters .row:not(.checked) .left label {text-align:left;}'+
'#wkofs_Item_Inspector.narrow .filters .row .left {width:initial;}'+
'#wkofs_Item_Inspector.narrow .filters .row .left label {line-height:30px;}'+
'#wkofs_Item_Inspector #Item_Inspector_ipre_srcs .src_enable .left {width:initial;}'+
'#wkofs_Item_Inspector #Item_Inspector_ipre_srcs .src_enable .left label {text-align:left;width:initial;line-height:30px;}'+
'#wkofs_Item_Inspector #Item_Inspector_ipre_srcs .src_enable .right {float:left; margin:0 4px;width:initial;}'+
//----------------------------------------------------------------
'</style>'
);
}
var subjectIndex = false;
var subjectIndexVoc = {};
var subjectIndexKan = {};
var subjectIndexRad = {};
//========================================================================
// fetch_items()
//------------------------------------------------------------------------
function fetch_items(required) {
var settings = quiz.settings;
var ipreset = settings.ipresets[settings.active_ipreset].content;
var presets = settings.tablePresets[settings.active_ipreset];
let idList = presets.itemList;
if (idList != undefined){
if (idList.length > 0){
if (subjectIndex === false){
let config2 = {wk_items: {filters:{}, options:{'subjects': true, 'assignments': true, 'review_statistics': true}}};
return wkof.ItemData.get_items(config2)
.then(function(items2){makeIndexes(items2);
quiz.items = populateItemList();
});
} else {
quiz.items = populateItemList();
return Promise.resolve();
};
};
};
function populateItemList(){
let items = [];
for (let index in idList){
let item = subjectIndexVoc[idList[index]];
if (item === undefined) item = subjectIndexKan[idList[index]];
if (item === undefined) item = subjectIndexRad[idList[index]];
items.push(item);
};
return items;
}
//set_mode('loading');
var config = {};
for (var src_name in ipreset) {
var src_preset = ipreset[src_name];
if (!wkof.ItemData.registry.sources[src_name]) continue;
var src_cfg = {};
config[src_name] = src_cfg;
src_cfg.filters = {};
if (src_name === 'wk_items') src_cfg.options = {};
var ipre_filters = src_preset.filters;
for (var flt_name in ipre_filters) {
var ipre_flt = ipre_filters[flt_name];
if (!ipre_flt.enabled) continue;
if (!wkof.ItemData.registry.sources[src_name].filters[flt_name]) continue;
src_cfg.filters[flt_name] = {value: ipre_flt.value};
if (ipre_flt.invert === true) src_cfg.filters[flt_name].invert = true;
}
}
let needSubjects = presets.selection === 'Random';// random selection always need subject index
//let presets = quiz.settings.tablePresets[settings.active_ipreset];
if (required === undefined || required === 'table'){
for (var settingName in standardInfo){
var setting = presets[standardInfo[settingName]];
needSubjects = needSubjects || needSubjectId[setting] === true;
if ((setting != 'None') && (setting != 'Default')) {
src_cfg.options[metadata[setting].endPoint] = true;
};
};
} else if (required === 'export') {
for (settingName in exportedInfo){
setting = presets[exportedInfo[settingName]];
needSubjects = needSubjects || needSubjectId[setting] === true;
if ((setting != 'None') && (setting != 'Default')) {
src_cfg.options[metadata[setting].endPoint] = true;
};
};
};
if (presets.leechStreakLimit != 0) {src_cfg.options.review_statistics = true};
if (required === 'wordCloud') {src_cfg.options.review_statistics = true};
// It is best not to run the two wkof.ItemData.get_items concurrently because they go for the same items.
// The unfiltered request goes first and the filtered one will run on the cache once the items are there.
// A concurrent run doesn't make sense and leads to weird bugs.
if (subjectIndex === false && needSubjects ){
let config2 = {wk_items: {filters:{}, options:{'subjects': true, 'assignments': true, 'review_statistics': true}}};
return wkof.ItemData.get_items(config2)
.then(function(items2){makeIndexes(items2);
return wkof.ItemData.get_items(config)}).then(function(items){quiz.items = items;});
} else {
return wkof.ItemData.get_items(config)
.then(function(items){quiz.items = items;});
};
};
// Over 90% of the time we know the item type so we can search a smaller and faster index.
// In the remaining cases we test the three indexes in a row to find the right one.
// In the volume, accelerating the indexes when we know the type improves significantly the response time.
function makeIndexes(items){
for (let key in items){
let item = items[key];
switch (item.object){
case 'vocabulary':
subjectIndexVoc[item.id] = item;
break;
case 'kanji':
subjectIndexKan[item.id] = item;
break;
case 'radical':
subjectIndexRad[item.id] = item;
break;
};
};
subjectIndex = true;
}
//------------------------------
// Calculating displayed data
//------------------------------
var theFuture = Date.parse("01 Jan 2090 00:00:00 GMT");
var infinity = 100000000; // big enough
var srsName = ["Initiate","Apprentice I","Apprentice II","Apprentice III","Apprentice IV","Guru I","Guru II","Master","Enlightened","Burned"];
var metadata = {'Meaning_Brief': {'exists': ((item) => {return true}), 'label': 'Meaning ',
'tableEntry': meaningsBrief,
'tableEntryMarker': ((item)=>''),
'tooltipEntry': meaningsBrief,
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Meaning',
'needQuotes': true,
'labelExport': '',
'export': meaningsBrief,
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Meaning_Full': {'exists': ((item) => {return true}), 'label': 'Meaning ',
'tableEntry': meaningsFullTable,
'tableEntryMarker': ((item)=>''),
'tooltipEntry': meaningsFull,
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Meaning',
'labelExport': '',
'needQuotes': true,
'export': meaningsFull,
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': true,
},
'Reading_Brief': {'exists': ((item) => {return !(item.data.readings == undefined)}), 'label': 'Reading ',
'tableEntry': readingsBrief,
'tableEntryMarker': ((item)=>''),
'tooltipEntry': readingsBrief,
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Reading',
'labelExport': '',
'needQuotes': true,
'export': readingsBrief,
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': true,
},
'Reading_Full': {'exists': ((item) => {return !(item.data.readings == undefined)}), 'label': 'Reading ',
'tableEntry': ((item) => readingsFull(item, false)),
'tableEntryMarker': ((item) => ''),
'tooltipEntry': readingsFull,
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Reading',
'labelExport': '',
'needQuotes': true,
'export': readingsFull,
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': true,
},
'Leech': {'exists': ((item) => {return true}), 'label': 'Leech ',
'tableEntry': leechScore,
'tableEntryMarker': leechScore,
'tooltipEntry': leechScore,
'tableEntryMarker': leechScore,
'sortkey': leechScore,
'sortOrder': 'Descending',
'sortkey2': ((item) => {return (item.review_statistics ? item.review_statistics.percentage_correct : infinity)}),
'sortOrder2': 'Ascending',
'preciseSortkey': leechScore,
'endPoint' : 'review_statistics',
'wordCloud': ((item) => {return Math.round(leechScore(item))}),
'title': 'Leech',
'labelExport': 'Leech: ',
'needQuotes': true,
'export': ((item)=>leechScore(item).toLocaleString()),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Total_Incorrect_Answers': {'exists': ((item) => {return true}), 'label': 'Tot. Incor. ',
'tableEntry': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect + item.review_statistics.reading_incorrect : 'Unavailable')}),
'tableEntryMarker': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect + item.review_statistics.reading_incorrect : 'Unavailable')}),
'tooltipEntry': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect + item.review_statistics.reading_incorrect : 'Unavailable')}),
'sortkey': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect + item.review_statistics.reading_incorrect : infinity)}),
'sortOrder': 'Descending',
'sortkey2': leechScore,
'sortOrder2': 'Descending',
'preciseSortkey': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect + item.review_statistics.reading_incorrect : infinity)}),
'endPoint' : 'review_statistics',
'wordCloud': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect + item.review_statistics.reading_incorrect : 'Unavailable')}),
'title': 'Total Incor.',
'labelExport': 'Total Incor: ',
'needQuotes': false,
'export': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect + item.review_statistics.reading_incorrect : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Total_Correct_Answers': {'exists': ((item) => {return true}), 'label': 'Tot. Cor. ',
'tableEntry': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct + item.review_statistics.reading_correct : 'Unavailable')}),
'tableEntryMarker': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct + item.review_statistics.reading_correct : 'Unavailable')}),
'tooltipEntry': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct + item.review_statistics.reading_correct : 'Unavailable')}),
'sortkey': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct + item.review_statistics.reading_correct : infinity)}),
'sortOrder': 'Ascending',
'sortkey2': leechScore,
'sortOrder2': 'Descending',
'preciseSortkey': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct + item.review_statistics.reading_correct : infinity)}),
'endPoint' : 'review_statistics',
'wordCloud': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct + item.review_statistics.reading_correct : 'Unavailable')}),
'title': 'Total Cor.',
'needQuotes': false,
'labelExport': 'Total Cor: ',
'export': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct + item.review_statistics.reading_correct : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Percentage_Correct': {'exists': ((item) => {return true}), 'label': '%Total ',
'tableEntry': ((item) => {return (item.review_statistics ? item.review_statistics.percentage_correct+'%' : 'Unavailable')}),
'tableEntryMarker': ((item) => {return (item.review_statistics ? item.review_statistics.percentage_correct+'%' : 'Unavailable')}),
'tooltipEntry': ((item) => {return (item.review_statistics ? item.review_statistics.percentage_correct+'%' : 'Unavailable')}),
'sortkey': ((item) => {return (item.review_statistics ? item.review_statistics.percentage_correct : infinity)}),
'sortOrder': 'Ascending',
'sortkey2': leechScore,
'sortOrder2': 'Descending',
'endPoint' : 'review_statistics',
'preciseSortkey': ((item) => {return (item.review_statistics ? item.review_statistics.percentage_correct : infinity)}),
'wordCloud': ((item) => {return (item.review_statistics ? item.review_statistics.percentage_correct : 0)}),
'title': '%Total',
'labelExport': '%Total: ',
'needQuotes': false,
'export': ((item) => {return (item.review_statistics ? item.review_statistics.percentage_correct+'%' : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Meaning_Correct': {'exists': ((item) => {return true}), 'label': '%Meaning ',
'tableEntry': ((item) => {return (item.review_statistics ? MeaningCorrect(item)+'%' : 'Unavailable')}),
'tableEntryMarker': ((item) => {return (item.review_statistics ? MeaningCorrect(item)+'%' : 'Unavailable')}),
'tooltipEntry': ((item) => {return (item.review_statistics ? MeaningCorrect(item)+'%' : 'None')}),
'sortkey': ((item) => {return (item.review_statistics ? MeaningCorrect(item) : infinity)}),
'sortOrder': 'Ascending',
'sortkey2': leechScore,
'sortOrder2': 'Descending',
'preciseSortkey': ((item) => {return (item.review_statistics ? MeaningCorrect(item) : infinity)}),
'endPoint' : 'review_statistics',
'title': '%Meaning',
'labelExport': '%Meaning: ',
'needQuotes': false,
'export': ((item) => {return (item.review_statistics ? MeaningCorrect(item)+'%' : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Reading_Correct': {'exists': ((item) => {return item.data.readings}), 'label': '%Reading ',
'tableEntry': ((item) => {return (item.review_statistics ? ReadingCorrect(item)+'%' : 'Unavailable')}),
'tableEntryMarker': ((item) => {return (item.review_statistics ? ReadingCorrect(item)+'%' : 'Unavailable')}),
'tooltipEntry': ((item) => {return (item.review_statistics ? ReadingCorrect(item)+'%' : 'Unavailable')}),
'sortkey': ((item) => {return (item.review_statistics ? ReadingCorrect(item) : infinity)}),
'sortOrder': 'Ascending',
'sortkey2': leechScore,
'sortOrder2': 'Descending',
'preciseSortkey': ((item) => {return (item.review_statistics ? ReadingCorrect(item) : infinity)}),
'endPoint' : 'review_statistics',
'wordCloud': ((item) => {return (item.review_statistics ? ReadingCorrect(item) : 0)}),
'title': '%Reading',
'labelExport': '%Reading: ',
'needQuotes': false,
'export': ((item) => {return (item.review_statistics ? ReadingCorrect(item)+'%' : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Meaning_Incorrect_Answers': {'exists': ((item) => {return true}), 'label': 'Mg Incor. ',
'tableEntry': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect : 'Unavailable')}),
'tableEntryMarker': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect : 'Unavailable')}),
'tooltipEntry': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect : 'Unavailable')}),
'sortkey': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect : infinity)}),
'sortOrder': 'Descending',
'sortkey2': leechScore,
'sortOrder2': 'Descending',
'preciseSortkey': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect : infinity)}),
'endPoint' : 'review_statistics',
'wordCloud': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect : 'Unavailable')}),
'title': 'Meaning Incor.',
'labelExport': 'Meaning Incor: ',
'needQuotes': false,
'export': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_incorrect : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Meaning_Correct_Answers': {'exists': ((item) => {return true}), 'label': 'Mg Cor. ',
'tableEntry': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct : 'Unavailable')}),
'tableEntryMarker': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct : 'Unavailable')}),
'tooltipEntry': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct : 'Unavailable')}),
'sortkey': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct : infinity)}),
'sortOrder': 'Ascending',
'sortkey2': leechScore,
'sortOrder2': 'Descending',
'preciseSortkey': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct : infinity)}),
'endPoint' : 'review_statistics',
'wordCloud': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct : 'Unavailable')}),
'title': 'Meaning Cor.',
'labelExport': 'Meaning Cor: ',
'needQuotes': false,
'export': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_correct : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Meaning_Current_Streak': {'exists': ((item) => {return true}), 'label': 'Mg Cur. Str. ',
'tableEntry': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_current_streak - 1 : 'Unavailable')}),
'tableEntryMarker': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_current_streak - 1 : 'Unavailable')}),
'tooltipEntry': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_current_streak -1 : 'Unavailable')}),
'sortkey': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_current_streak : infinity)}),
'sortOrder': 'Ascending',
'sortkey2': leechScore,
'sortOrder2': 'Descending',
'preciseSortkey': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_current_streak : infinity)}),
'endPoint' : 'review_statistics',
'wordCloud': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_current_streak - 1 : 'Unavailable')}),
'title': 'Meaning Cur. Str.',
'labelExport': 'Meaning Cur. Str: ',
'needQuotes': false,
'export': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_current_streak - 1 : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Meaning_Max_Streak': {'exists': ((item) => {return true}), 'label': 'Mg Max. Str. ',
'tableEntry': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_max_streak - 1 : 'Unavailable')}),
'tableEntryMarker': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_max_streak - 1 : 'Unavailable')}),
'tooltipEntry': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_max_streak -1 : 'Unavailable')}),
'sortkey': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_max_streak : infinity)}),
'sortOrder': 'Ascending',
'sortkey2': leechScore,
'sortOrder2': 'Descending',
'preciseSortkey': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_max_streak : infinity)}),
'endPoint' : 'review_statistics',
'wordCloud': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_max_streak - 1 : 'Unavailable')}),
'title': 'Meaning Max. Str.',
'labelExport': 'Meaning Max. Str: ',
'needQuotes': false,
'export': ((item) => {return (item.review_statistics ? item.review_statistics.meaning_max_streak - 1 : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Reading_Incorrect_Answers': {'exists': ((item) => {return true}), 'label': 'Rg Incor. ',
'tableEntry': ((item) => {return (item.review_statistics ? item.review_statistics.reading_incorrect : 'Unavailable')}),
'tableEntryMarker': ((item) => {return (item.review_statistics ? item.review_statistics.reading_incorrect : 'Unavailable')}),
'tooltipEntry': ((item) => {return (item.review_statistics ? item.review_statistics.reading_incorrect : 'Unavailable')}),
'sortkey': ((item) => {return (item.review_statistics ? item.review_statistics.reading_incorrect : infinity)}),
'sortOrder': 'Descending',
'sortkey2': leechScore,
'sortOrder2': 'Descending',
'preciseSortkey': ((item) => {return (item.review_statistics ? item.review_statistics.reading_incorrect : infinity)}),
'endPoint' : 'review_statistics',
'wordCloud': ((item) => {return (item.review_statistics ? item.review_statistics.reading_incorrect : 'Unavailable')}),
'title': 'Reading Incor.',
'labelExport': 'Reading Incor: ',
'needQuotes': false,
'export': ((item) => {return (item.review_statistics ? item.review_statistics.reading_incorrect : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Reading_Correct_Answers': {'exists': ((item) => {return true}), 'label': 'Rg Cor. ',
'tableEntry': ((item) => {return (item.review_statistics ? item.review_statistics.reading_correct : 'Unavailable')}),
'tableEntryMarker': ((item) => {return (item.review_statistics ? item.review_statistics.reading_correct : 'Unavailable')}),
'tooltipEntry': ((item) => {return (item.review_statistics ? item.review_statistics.reading_correct : 'Unavailable')}),
'sortkey': ((item) => {return (item.review_statistics ? item.review_statistics.reading_correct : infinity)}),
'sortOrder': 'Ascending',
'sortkey2': leechScore,
'sortOrder2': 'Descending',
'preciseSortkey': ((item) => {return (item.review_statistics ? item.review_statistics.reading_correct : infinity)}),
'endPoint' : 'review_statistics',
'wordCloud': ((item) => {return (item.review_statistics ? item.review_statistics.reading_correct : 'Unavailable')}),
'title': 'Reading Cor.',
'labelExport': 'Reading Cor: ',
'needQuotes': false,
'export': ((item) => {return (item.review_statistics ? item.review_statistics.reading_correct : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Reading_Current_Streak': {'exists': ((item) => {return true}), 'label': 'Rg Cur. Str. ',
'tableEntry': ((item) => {return (item.review_statistics ? item.review_statistics.reading_current_streak - 1 : 'Unavailable')}),
'tableEntryMarker': ((item) => {return (item.review_statistics ? item.review_statistics.reading_current_streak - 1 : 'Unavailable')}),
'tooltipEntry': ((item) => {return (item.review_statistics ? item.review_statistics.reading_current_streak - 1 : 'Unavailable')}),
'sortkey': ((item) => {return (item.review_statistics ? item.review_statistics.reading_current_streak : infinity)}),
'sortOrder': 'Ascending',
'sortkey2': leechScore,
'sortOrder2': 'Descending',
'preciseSortkey': ((item) => {return (item.review_statistics ? item.review_statistics.reading_current_streak : infinity)}),
'endPoint' : 'review_statistics',
'wordCloud': ((item) => {return (item.review_statistics ? item.review_statistics.reading_current_streak - 1 : 'Unavailable')}),
'title': 'Reading Cur. Str.',
'labelExport': 'Reading Cur. Str: ',
'needQuotes': false,
'export': ((item) => {return (item.review_statistics ? item.review_statistics.reading_current_streak - 1 : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Reading_Max_Streak': {'exists': ((item) => {return true}), 'label': 'Rg Max. Str. ',
'tableEntry': ((item) => {return (item.review_statistics ? item.review_statistics.reading_max_streak - 1 : 'Unavailable')}),
'tableEntryMarker': ((item) => {return (item.review_statistics ? item.review_statistics.reading_max_streak - 1 : 'Unavailable')}),
'tooltipEntry': ((item) => {return (item.review_statistics ? item.review_statistics.reading_max_streak - 1 : 'Unavailable')}),
'sortkey': ((item) => {return (item.review_statistics ? item.review_statistics.reading_max_streak : infinity)}),
'sortOrder': 'Ascending',
'sortkey2': leechScore,
'sortOrder2': 'Descending',
'preciseSortkey': ((item) => {return (item.review_statistics ? item.review_statistics.reading_max_streak : infinity)}),
'endPoint' : 'review_statistics',
'wordCloud': ((item) => {return (item.review_statistics ? item.review_statistics.reading_max_streak - 1 : 'Unavailable')}),
'title': 'Reading Max. Str.',
'labelExport': 'Reading Max. Str: ',
'needQuotes': false,
'export': ((item) => {return (item.review_statistics ? item.review_statistics.reading_max_streak - 1 : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Level': {'exists': ((item) => {return true}), 'label': 'Level ',
'tableEntry': ((item) => {return item.data.level}),
'tableEntryMarker': ((item) => {return item.data.level}),
'tooltipEntry': ((item) => {return item.data.level}),
'sortkey': ((item) => {return item.data.level}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return item.data.level}),
'endPoint' : 'subjects',
'title': 'Level',
'labelExport': 'Level: ',
'needQuotes': false,
'export': ((item) => {return item.data.level}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Srs': {'exists': ((item) => {return true}), 'label': 'SRS ',
'tableEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.srs_stage != undefined ? srsName[item.assignments.srs_stage] : 'Locked') : 'Locked')}),
'tableEntryMarker': ((item) => {return (item.assignments != undefined ? (item.assignments.srs_stage != undefined ? srsName[item.assignments.srs_stage] : 'Locked') : 'Locked')}),
'tooltipEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.srs_stage != undefined ? srsName[item.assignments.srs_stage] : 'Locked') : 'Locked')}),
'sortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.srs_stage != undefined ? item.assignments.srs_stage : 10) : 10)}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return (item.assignments != undefined ? (item.assignments.available_at != undefined ? Date.parse(item.assignments.available_at) : theFuture) : theFuture)}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.srs_stage != undefined ? item.assignments.srs_stage : 10) : 10)}),
'endPoint' : 'assignments',
'title': 'SRS',
'labelExport': 'SRS: ',
'needQuotes': false,
'export': ((item) => {return (item.assignments != undefined ? (item.assignments.srs_stage != undefined ? srsName[item.assignments.srs_stage] : 'Locked') : 'Locked')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Review_Date': {'exists': ((item) => {return true}), 'label': 'Review ',
'tableEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.available_at != undefined ? makeDate(item) : 'Unscheduled') : 'Unscheduled')}),
'tableEntryMarker': ((item) => {return (item.assignments != undefined ? (item.assignments.available_at != undefined ? makeDateMarker(item) : 'Unscheduled') : 'Unscheduled')}),
'tooltipEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.available_at != undefined ? makeDate(item) : 'Unscheduled') : 'Unscheduled')}),
'sortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.available_at != undefined ? trimDate(Date.parse(item.assignments.available_at)) : theFuture) : theFuture)}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return (item.assignments != undefined ? (item.assignments.srs_stage != undefined? item.assignments.srs_stage : 10) : 10)}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.available_at != undefined ? Date.parse(item.assignments.available_at) : theFuture) : theFuture)}),
'endPoint' : 'assignments',
'title': 'Review Date',
'labelExport': 'Review Date: ',
'needQuotes': false,
'export': ((item) => {return (item.assignments != undefined ? (item.assignments.available_at != undefined ? forExportDate(item.assignments.available_at) : 'Unscheduled') : 'Unscheduled')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': true, 'isList': false,
},
'Review_Wait': {'exists': ((item) => {return true}), 'label': 'Wait ',
'tableEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.available_at != undefined ? reviewWait(item) : 'Unscheduled') : 'Unscheduled')}),
'tableEntryMarker': ((item) => {return (item.assignments != undefined ? (item.assignments.available_at != undefined ? reviewWait(item) : 'Unscheduled') : 'Unscheduled')}),
'tooltipEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.available_at != undefined ? reviewWait(item) : 'Unscheduled') : 'Unscheduled')}),
'sortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.available_at != undefined ? trimDate(Date.parse(item.assignments.available_at)) : theFuture) : theFuture)}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return (item.assignments != undefined ? (item.assignments.srs_stage != undefined? item.assignments.srs_stage : 10) : 10)}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.available_at != undefined ? Date.parse(item.assignments.available_at) : theFuture) : theFuture)}),
'endPoint' : 'assignments',
'title': 'Wait',
'labelExport': 'Wait: ',
'needQuotes': false,
'export': ((item) => 'None'),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': true, 'isList': false,
},
'Passed_Date': {'exists': ((item) => {return true}), 'label': 'Passed ',
'tableEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.passed_at != undefined ? makePassedDate(item) : 'Not yet') : 'Not yet')}),
'tableEntryMarker': ((item) => {return (item.assignments != undefined ? (item.assignments.passed_at != undefined ? makePassedDateMarker(item) : 'Not yet') : 'Not yet')}),
'tooltipEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.passed_at != undefined ? makePassedDate(item) : 'Not yet') : 'Not yet')}),
'sortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.passed_at != undefined ? trimDate(Date.parse(item.assignments.passed_at)) : 0) : 0)}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return (item.assignments != undefined ? (item.assignments.srs_stage != undefined ? item.assignments.srs_stage : 10) : 10)}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.passed_at != undefined ? Date.parse(item.assignments.passed_at) : theFuture) : theFuture)}),
'endPoint' : 'assignments',
'title': 'Passed Guru',
'labelExport': 'Passed Guru: ',
'needQuotes': false,
'export': ((item) => {return (item.assignments != undefined ? (item.assignments.passed_at != undefined ? forExportDate(item.assignments.passed_at) : 'Not yet') : 'Not yet')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': true, 'isList': false,
},
'Burned_Date': {'exists': ((item) => {return true}), 'label': 'Burned ',
'tableEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.burned_at != undefined ? makeBurnedDate(item) : 'Not yet') : 'Not yet')}),
'tableEntryMarker': ((item) => {return (item.assignments != undefined ? (item.assignments.burned_at != undefined ? makeBurnedDateMarker(item) : 'Not yet') : 'Not yet')}),
'tooltipEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.burned_at != undefined ? makeBurnedDate(item) : 'Not yet') : 'Not yet')}),
'sortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.burned_at != undefined ? trimDate(Date.parse(item.assignments.burned_at)) : 0) : 0)}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return item.data.level}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.burned_at != undefined ? Date.parse(item.assignments.burned_at) : theFuture) : theFuture)}),
'endPoint' : 'assignments',
'title': 'Burned',
'labelExport': 'Burned: ',
'needQuotes': false,
'export': ((item) => {return (item.assignments != undefined ? (item.assignments.burned_at != undefined ? forExportDate(item.assignments.burned_at) : 'Not yet') : 'Not yet')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': true, 'isList': false,
},
'Resurrected_Date': {'exists': ((item) => {return true}), 'label': 'Resurrected ',
'tableEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.resurrected_at != undefined ? makeResurrectedDate(item) : 'Not yet') : 'Not yet')}),
'tableEntryMarker': ((item) => {return (item.assignments != undefined ? (item.assignments.resurrected_at != undefined ? makeResurrectedDateMarker(item) : 'Not yet') : 'Not yet')}),
'tooltipEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.resurrected_at != undefined ? makeResurrectedDate(item) : 'Not yet') : 'Not yet')}),
'sortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.resurrected_at != undefined ? trimDate(Date.parse(item.assignments.resurrected_at)).toDateString() : 0) : 0)}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return item.data.level}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.resurrected_at != undefined ? Date.parse(item.assignments.resurrected_at).toDateString() : theFuture) : theFuture)}),
'endPoint' : 'assignments',
'title': 'Resurrected',
'labelExport': 'Resurrected: ',
'needQuotes': false,
'export': ((item) => {return (item.assignments != undefined ? (item.assignments.resurrected_at != undefined ? forExportDate(item.assignments.resurrected_at) : 'Not yet') : 'Not yet')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': true, 'isList': false,
},
'Lesson_Date': {'exists': ((item) => {return true}), 'label': 'Lesson ',
'tableEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.started_at != undefined ? makeLessonDate(item) : 'Not yet') : 'Not yet')}),
'tableEntryMarker': ((item) => {return (item.assignments != undefined ? (item.assignments.started_at != undefined ? makeLessonDateMarker(item) : 'Not yet') : 'Not yet')}),
'tooltipEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.started_at != undefined ? makeLessonDate(item) : 'Not yet') : 'Not yet')}),
'sortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.started_at ? trimDate(Date.parse(item.assignments.started_at)) : theFuture) : theFuture)}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return item.data.level}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.started_at ? Date.parse(item.assignments.started_at) : theFuture) : theFuture)}),
'endPoint' : 'assignments',
'title': 'Lesson',
'labelExport': 'Lesson: ',
'needQuotes': false,
'export': ((item) => {return (item.assignments != undefined ? (item.assignments.started_at != undefined ? forExportDate(item.assignments.started_at) : 'Not yet') : 'Not yet')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': true, 'isList': false,
},
'Unlock_Date': {'exists': ((item) => {return true}), 'label': 'Unlock ',
'tableEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.unlocked_at != undefined ? makeUnlockDate(item) : 'Not yet') : 'Not yet')}),
'tableEntryMarker': ((item) => {return (item.assignments != undefined ? (item.assignments.unlocked_at != undefined ? makeUnlockDateMarker(item) : 'Not yet') : 'Not yet')}),
'tooltipEntry': ((item) => {return (item.assignments != undefined ? (item.assignments.unlocked_at != undefined ? makeUnlockDate(item) : 'Not yet') : 'Not yet')}),
'sortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.unlocked_at ? trimDate(Date.parse(item.assignments.unlocked_at)) : theFuture) : theFuture)}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return item.data.level}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return (item.assignments != undefined ? (item.assignments.unlocked_at ? Date.parse(item.assignments.unlocked_at) : theFuture) : theFuture)}),
'endPoint' : 'assignments',
'title': 'Unlock',
'labelExport': 'Unlock: ',
'needQuotes': false,
'export': ((item) => {return (item.assignments != undefined ? (item.assignments.unlocked_at != undefined ? forExportDate(item.assignments.unlocked_at) : 'Not yet') : 'Not yet')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': true, 'isList': false,
},
'Item': {'exists': ((item) => {return true}), 'label': 'Item ',
'tableEntry': ((item) => {return 'None'}),
'tableEntryMarker': ((item) => {return ''}),
'tooltipEntry': ((item) => {return 'None'}),
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Item',
'labelExport': '',
'needQuotes': false,
'export': ((item) => {return (item.data.characters ? item.data.characters : item.data.slug)}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Type': {'exists': ((item) => {return true}), 'label': 'Type ',
'tableEntry': ((item) => {return 'None'}),
'tableEntryMarker': ((item) => {return ''}),
'tooltipEntry': ((item) => {return 'None'}),
'sortkey': ((item) => { return {'radical': 1, 'kanji': 2, 'vocabulary': 3}[item.object]}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => { return {'radical': 1, 'kanji': 2, 'vocabulary': 3}[item.object]}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => { return {'radical': 1, 'kanji': 2, 'vocabulary': 3}[item.object]}),
'endPoint' : 'assignments',
'title': 'Type',
'labelExport': '',
'needQuotes': false,
'export': ((item) => {return (item.object != undefined ? item.object : 'Unavailable')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Export_Date': {'exists': ((item) => {return true}), 'label': 'Export Date',
'tableEntry': ((item) => {return 'None'}),
'tableEntryMarker': ((item) => {return ''}),
'tooltipEntry': ((item) => {return 'None'}),
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Export Date',
'labelExport': 'Export Date: ',
'needQuotes': false,
'export': ((item) => {return today()}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': true, 'isList': false,
},
'Item_Page': {'exists': ((item) => {return true}), 'label': 'Item Page',
'tableEntry': ((item) => {return 'None'}),
'tableEntryMarker': ((item) => {return ''}),
'tooltipEntry': ((item) => {return 'None'}),
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Item Page URL',
'labelExport': '',
'needQuotes': false,
'export': ((item) => {return item.data.document_url}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': false,
},
'Used_In': {'exists': ((item) => {return (item.object === 'radical' || item.object === 'kanji')}), 'label': 'Used In',
'tableEntry': ((item) => {return 'None'}),
'tableEntryMarker': ((item) => {return ''}),
'tooltipEntry': ((item) => {return (item.object === 'radical' ? makeListBySubjectKan(item.data.amalgamation_subject_ids) : makeListBySubjectVoc(item.data.amalgamation_subject_ids))}),
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Used In',
'labelExport': 'Used In: ',
'needQuotes': true,
'export': ((item) => {return (item.object === 'radical' ? makeListBySubjectKan(item.data.amalgamation_subject_ids) : makeListBySubjectVoc(item.data.amalgamation_subject_ids))}),
'itemList': ((item)=>{return (item.object === 'radical' ? makeItemListKan(item.data.amalgamation_subject_ids) : makeItemListVoc(item.data.amalgamation_subject_ids))}),
'idList': ((item)=>(item.object === 'radical' || item.object === 'kanji' ? item.data.amalgamation_subject_ids : [])),
'isDate': false, 'isList': true,
},
'Components': {'exists': ((item) => {return (item.object === 'kanji' || item.object === 'vocabulary')}), 'label': 'Compnts',
'tableEntry': ((item) => {return 'None'}),
'tableEntryMarker': ((item) => {return ''}),
'tooltipEntry': ((item) => {return (item.object === 'kanji' ? makeListBySubjectRad(item.data.component_subject_ids) : makeListBySubjectKan(item.data.component_subject_ids))}),
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Components',
'labelExport': 'Components: ',
'needQuotes': true,
'export': ((item) => {return (item.object === 'kanji' ? makeListBySubjectRad(item.data.component_subject_ids) : makeListBySubjectKan(item.data.component_subject_ids))}),
'itemList': ((item)=>{return (item.object === 'kanji' ? makeItemListRad(item.data.component_subject_ids) : makeItemListKan(item.data.component_subject_ids))}),
'idList': ((item)=>(item.object === 'kanji' || item.object === 'vocabulary' ? item.data.component_subject_ids : [])),
'isDate': false, 'isList': true,
},
'Vis_Sim_Kanji': {'exists': ((item) => {return item.object === 'kanji'}), 'label': 'Vis. Sim.',
'tableEntry': ((item) => {return 'None'}),
'tableEntryMarker': ((item) => {return ''}),
'tooltipEntry': ((item) => {return makeListBySubjectKan(item.data.visually_similar_subject_ids)}),
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Vis. Sim. Kanjis',
'labelExport': 'Vis. Sim. Kanjis: ',
'needQuotes': true,
'export': ((item) => {return makeListBySubjectKan(item.data.visually_similar_subject_ids)}),
'itemList': ((item)=>{return makeItemListKan(item.data.visually_similar_subject_ids)}),
'idList': ((item)=>(item.object === 'kanji' ? item.data.visually_similar_subject_ids : [])),
'isDate': false, 'isList': true,
},
'Part_Of_Speech': {'exists': ((item) => {return item.object === 'vocabulary'}), 'label': 'Part of Sp.',
'tableEntry': ((item) => {return item.data.parts_of_speech.join(', ')}),
'tableEntryMarker': ((item) => {return ''}),
'tooltipEntry': ((item) => {return item.data.parts_of_speech.join(', ')}),
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Part of Speech',
'labelExport': 'Part of Speech: ',
'needQuotes': true,
'export': ((item) => {return item.data.parts_of_speech.join(', ')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': true,
},
'Reading_by_Type': {'exists': ((item) => {return item.object === 'kanji'}), 'label': 'Rd. Type',
'tableEntry': ((item) => {return readingsFull(item, true)}),
'tableEntryMarker': ((item) => {return ''}),
'tooltipEntry': ((item) => {return readingsFull(item, true)}),
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Readings by Type',
'labelExport': '',
'needQuotes': true,
'export': ((item) => {return readingsFull(item, true)}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': true,
},
'Block_List': {'exists': ((item) => {return true}), 'label': 'Block List',
'tableEntry': ((item) => {return makeAuxMeaningList(item.data.auxiliary_meanings, 'blacklist')}),
'tableEntryMarker': ((item) => {return ''}),
'tooltipEntry': ((item) => {return makeAuxMeaningList(item.data.auxiliary_meanings, 'blacklist')}),
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Block List',
'labelExport': 'Block List: ',
'needQuotes': true,
'export': ((item) => {return makeAuxMeaningList(item.data.auxiliary_meanings, 'blacklist')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': true,
},
'Allow_List': {'exists': ((item) => {return true}), 'label': 'Allow List',
'tableEntry': ((item) => {return makeAuxMeaningList(item.data.auxiliary_meanings, 'whitelist')}),
'tableEntryMarker': ((item) => {return ''}),
'tooltipEntry': ((item) => {return makeAuxMeaningList(item.data.auxiliary_meanings, 'whitelist')}),
'sortkey': ((item) => {return 0}),
'sortOrder': 'Ascending',
'sortkey2': ((item) => {return 0}),
'sortOrder2': 'Ascending',
'preciseSortkey': ((item) => {return 0}),
'endPoint' : 'subjects',
'title': 'Allow List',
'labelExport': 'Allow List: ',
'needQuotes': true,
'export': ((item) => {return makeAuxMeaningList(item.data.auxiliary_meanings, 'whitelist')}),
'itemList': ((item)=>'None'),
'idList': ((item)=>[]),
'isDate': false, 'isList': true,
},
}
function isValidDate(dateString) {
var regEx = /^\d{4}-\d{2}-\d{2}$/;
if(!dateString.match(regEx)) return false; // Invalid format
var d = new Date(dateString);
var dNum = d.getTime();
if(!dNum && dNum !== 0) return false; // NaN value, Invalid date
return d.toISOString().slice(0,10) === dateString;
}
function nameItem(item){
return (item.data.characters === null ? item.data.slug : item.data.characters);
};
function makeListBySubjectRad(subjectArray){
if (subjectArray.length === 0)return '-Empty-';
let list = 0;
let firstElement = true;
for (var i = 0; i < subjectArray.length; i++){
let item = subjectIndexRad[subjectArray[i]];
if (firstElement){
list = nameItem(item);
firstElement = false;
} else {
list += ', '+nameItem(item);
}
};
return list;
}
function makeListBySubjectKan(subjectArray){
if (subjectArray.length === 0)return '-Empty-';
let list;
let firstElement = true;
for (var i = 0; i < subjectArray.length; i++){
let item = subjectIndexKan[subjectArray[i]];
if (firstElement){
list = nameItem(item);
firstElement = false;
} else {
list += ', '+nameItem(item);
}
};
return list;
}
function makeListBySubjectVoc(subjectArray){
if (subjectArray.length === 0)return '-Empty-';
let list;
let firstElement = true;
for (var i = 0; i < subjectArray.length; i++){
let item = subjectIndexVoc[subjectArray[i]];
if (firstElement){
list = nameItem(item);
firstElement = false;
} else {
list += ', '+nameItem(item);
}
};
return list;
}
function makeItemListRad(subjectArray){
if (subjectArray === undefined){return []};
let l = [];
subjectArray.forEach(a=>{l.push(subjectIndexRad[a]);});
return l;
}
function makeItemListKan(subjectArray){
if (subjectArray === undefined){return []};
let l = [];
subjectArray.forEach(a=>{l.push(subjectIndexKan[a]);});
return l;
}
function makeItemListVoc(subjectArray){
if (subjectArray === undefined){return []};
let l = [];
subjectArray.forEach(a=>{l.push(subjectIndexVoc[a]);});
return l;
}
function MeaningCorrect(item){
let stats = item.review_statistics;
let denominator = stats.meaning_correct + stats.meaning_incorrect;
if (denominator == 0){
return 100
} else {
return Math.floor(100 * stats.meaning_correct / denominator)
}
}
function ReadingCorrect(item){
let stats = item.review_statistics;
let denominator = stats.reading_correct + stats.reading_incorrect;
if (denominator == 0){
return 100
} else {
return Math.floor(100 * stats.reading_correct / denominator)
}
}
function leechScore(item){
if (item.review_statistics != undefined){
let reviewStats = item.review_statistics;
let meaningScore = getLeechScore(reviewStats.meaning_incorrect, reviewStats.meaning_current_streak);
let readingScore = getLeechScore(reviewStats.reading_incorrect, reviewStats.reading_current_streak);
return Math.max(meaningScore, readingScore);
} else {return 0}
}
function getLeechScore(incorrect, currentStreak) {
//get incorrect number than lessen it using the user's correctStreak
let leechScore = incorrect / Math.pow((currentStreak || 0.5), 1.5); // '||' => if currentstreak zero make 0.5 instead (prevents dividing by zero)
leechScore = Math.round(leechScore * 100) / 100; //round to two decimals
return leechScore;
}
function reviewWait(item){
return (Date.parse(item.assignments.available_at) < Date.now() ? 'Now' : s_to_dhm((Date.parse(item.assignments.available_at)-Date.now())/1000))
}
// Converts seconds to days, hours, and minutes
function s_to_dhm(s) {
var d = Math.floor(s/60/60/24);
var h = Math.floor(s%(60*60*24)/60/60);
var m = Math.ceil(s%(60*60*24)%(60*60)/60);
return (d>0?d+'d ':'')+(h>0?h+'h ':'')+(m>0?m+'m':'1m');
}
function makeDate(item){
return formatDate(new Date(item.assignments.available_at), true, /* is_next_date */);
}
function makeDateMarker(item){
return formatDateMarker(new Date(item.assignments.available_at), true, /* is_next_date */);
}
function makePassedDate(item){
return formatDate(new Date(item.assignments.passed_at), false, /* is_next_date */);
}
function makePassedDateMarker(item){
return formatDateMarker(new Date(item.assignments.passed_at), false, /* is_next_date */);
}
function makeBurnedDate(item){
return formatDate(new Date(item.assignments.burned_at), false, /* is_next_date */);
}
function makeBurnedDateMarker(item){
return formatDateMarker(new Date(item.assignments.burned_at), false, /* is_next_date */);
}
function makeResurrectedDate(item){
return formatDate(new Date(item.assignments.resurrected_at), false, /* is_next_date */);
}
function makeResurrectedDateMarker(item){
return formatDateMarker(new Date(item.assignments.resurrected_at), false, /* is_next_date */);
}
function makeLessonDate(item){
return formatDate(new Date(item.assignments.started_at), false, /* is_next_date */);
}
function makeLessonDateMarker(item){
return formatDateMarker(new Date(item.assignments.started_at), false, /* is_next_date */);
}
function makeUnlockDate(item){
return formatDate(new Date(item.assignments.unlocked_at), false, /* is_next_date */);
}
function makeUnlockDateMarker(item){
return formatDateMarker(new Date(item.assignments.unlocked_at), false, /* is_next_date */);
}
function forExportDate(date) {
return new Date(date).toISOString().slice(0, 16).replace('T', ' ');
}
function formatDateMarker(date) {
var YY = ''+date.getFullYear(),
MM = ''+(date.getMonth()+1),
DD = ''+date.getDate(),
hh = ''+date.getHours(),
mm = ''+date.getMinutes();
if (MM.length < 2) MM = '0' + MM;
if (DD.length < 2) DD = '0' + DD;
let s = YY+'-'+MM+'-'+DD;
if (quiz.settings.tablePresets[quiz.settings.active_ipreset].showHours){
if (quiz.settings.hoursFormat === '24hours') {
s += ' '+('0'+hh).slice(-2)+':'+('0'+mm).slice(-2);
} else {
s += ' '+(((hh+11)%12)+1)+':'+('0'+mm).slice(-2)+['am','pm'][Math.floor(date.getHours()/12)];
}
};
return s;
}
function today() {
var d = new Date(),
month = '' + (d.getMonth() + 1),
day = '' + d.getDate(),
year = d.getFullYear(),
hh = '' + d.getHours(),
mm = '' + d.getMinutes();
if (month.length < 2) month = '0' + month;
if (day.length < 2) day = '0' + day;
if (hh.length < 2) hh = '0' + hh;
if (mm.length < 2) mm = '0' + mm;
return [year, month, day].join('-') + ' ' + hh + ':' + mm;
}
//========================================================================
// Print date in pretty format.
//-------------------------------------------------------------------
function formatDate(d, is_next_date, show_year){
var s = '';
var now = new Date();
var YY = d.getFullYear(),
MM = d.getMonth(),
DD = d.getDate(),
hh = d.getHours(),
mm = d.getMinutes(),
one_day = 24*60*60*1000;
if (is_next_date && d < now) return "Available Now";
var same_day = ((YY == now.getFullYear()) && (MM == now.getMonth()) && (DD == now.getDate()) ? 1 : 0);
// If today: "Today 8:15pm"
// otherwise: "Wed, Apr 15, 8:15pm"
if (same_day) {
s += 'Today ';
} else if (show_year){
s += d.toISOString().slice(10);
} else {
s += ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'][d.getDay()]+', '+
['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'][MM]+' '+DD+', ';
}
if (quiz.settings.hoursFormat === '24hours') {
s += ('0'+hh).slice(-2)+':'+('0'+mm).slice(-2);
} else {
s += (((hh+11)%12)+1)+':'+('0'+mm).slice(-2)+['am','pm'][Math.floor(d.getHours()/12)];
}
return s;
}
//========================================================================
// Reduce date in milliseconds to minutes boundary
// This makes secondary sorting match the primary sort data seen by the user
//------------------------------------------------------------------------
function trimDate(d){
return Math.floor((d/1000)/60)*1000*60;
}
function meaningsFullTable(item){
var meanings = meaningsFull(item);
if (meanings.length > 20){meanings = meanings.slice(0, 20) + '...'}
return meanings;
}
function meaningsFull(item){
// make sure meanings are returned in the order WK provides them, but primary comes first
var meanings = "";
var meaningsPrimary = "";
for (var k = 0; k < item.data.meanings.length; k++){
if(item.data.meanings[k].primary){
if (meaningsPrimary.length != 0){
meaningsPrimary += ', ' + item.data.meanings[k].meaning;
} else {
meaningsPrimary = item.data.meanings[k].meaning;
}
} else {
if (meanings.length != 0){
meanings += ', ' + item.data.meanings[k].meaning;
} else {
meanings = item.data.meanings[k].meaning;
}
}
}
if (meanings.length != 0){meaningsPrimary = meaningsPrimary + ', ' + meanings}
return meaningsPrimary;
}
function meaningsBrief(item){
var meanings = item.data.meanings[0].meaning;
for (var k = 0; k < item.data.meanings.length; k++){if (item.data.meanings[k].primary){return item.data.meanings[k].meaning}};
return meanings;
}
function makeAuxMeaningList(list, type){
if (list.length === 0)return '-Empty-';
let firstElement = true;
let l = 'Empty';
for (var i = 0; i < list.length; i++){
if (list[i].type === type){
if (firstElement){
l = list[i].meaning;
firstElement = false;
} else {
l += ', '+ list[i].meaning;
};
};
};
return l;
};
function readingsFull(item, needType){
// make sure readings are returned in the order WK provides them, but primary comes first
var readings = "";
var readingsPrimary = "";
const shortLabel = {'onyomi' : 'on', 'kunyomi' : 'kun', 'nanori': 'nan'};
for (var k = 0; k < item.data.readings.length; k++){
if(item.data.readings[k].primary){
if (readingsPrimary.length != 0){
readingsPrimary += ', ' + item.data.readings[k].reading;
if(needType) readingsPrimary += ':'+ shortLabel[item.data.readings[k].type];
} else {
readingsPrimary = item.data.readings[k].reading;
if(needType) readingsPrimary += ':'+ shortLabel[item.data.readings[k].type];
}
} else {
if (readings.length != 0){
readings += ', ' + item.data.readings[k].reading;
if(needType) readings += ':'+ shortLabel[item.data.readings[k].type];
} else {
readings = item.data.readings[k].reading;
if(needType) readings += ':'+ shortLabel[item.data.readings[k].type];
}
}
}
if (readings.length != 0){readingsPrimary = readingsPrimary + ', ' + readings}
return readingsPrimary;
}
function readingsBrief(item){
var readings = item.data.readings[0].reading;
for (var k = 0; k < item.data.readings.length; k++){if (item.data.readings[k].primary){return item.data.readings[k].reading}};
return readings;
}
function shuffle(items){
for(let i = items.length - 1; i > 0; i--){
const j = Math.floor(Math.random() * i);
const temp = items[i];
items[i] = items[j];
items[j] = temp;
}
return items
}
function orderByDate(){
let settings = quiz.settings.tablePresets[quiz.settings.active_ipreset];
let sortKey = metadata[settings.navigationDate].preciseSortkey;
let items = quiz.items;
items.forEach((item) => {item.sortKey = sortKey(item);});
items = items.sort(function(a, b){return a.sortKey - b.sortKey });
let referenceDate = settings.startDate;
var i = 0;
var startDate = settings.startDate;
let start=0, end=items.length-1;
let mid;
// binary search - searching for startDate
while (start<=end){
mid=Math.floor((start + end)/2);
if (mid === 0) break;
if (items[mid].sortKey===startDate && items[mid-1].sortKey!==startDate){
break;
} else if (items[mid].sortKey < startDate) {
start = mid + 1;
} else {
end = mid - 1;
}
}
currentItem = mid;
start=0; end=items.length-1;
// binary search - searching for theFuture === missing date.
while (start<=end){
mid=Math.floor((start + end)/2);
if (mid === 0){break}
if (items[mid].sortKey===theFuture && items[mid-1].sortKey!==theFuture){
break;
} else if (items[mid].sortKey < theFuture) {
start = mid + 1;
} else {
end = mid - 1;
}
}
if (items[mid].sortKey === theFuture) quiz.items = items.slice(0, mid);
if (currentItem >= quiz.items.length) currentItem = Math.max(quiz.items.length - nbItems, 0);
};
function updatePage(noCreateTable) {
let leechStreakLimit = quiz.settings.tablePresets[quiz.settings.active_ipreset].leechStreakLimit;
if (leechStreakLimit != 0) {
quiz.items = quiz.items.filter((item => {return ((item.review_statistics != undefined) ?
((item.review_statistics.meaning_current_streak < (leechStreakLimit+1)) || (item.review_statistics.reading_current_streak < (leechStreakLimit+1))) : false)}));
};
let settings = quiz.settings.tablePresets[quiz.settings.active_ipreset];
let tableKey = settings.table_data;
let sort1 = settings.sort1;
let sort2 = settings.sort2;
let sortKey, sortKey2;
let sortOrder = settings.sortOrder1;
let sortOrder2 = settings.sortOrder2;
if ((sort1 == "Default") && (sort2 == 'Default')){
sortKey = metadata[tableKey].sortkey;
if (sortOrder === 'Default'){sortOrder = metadata[tableKey].sortOrder};
sortKey2 = metadata[tableKey].sortkey2;
if (sortOrder2 === 'Default'){sortOrder2 = metadata[tableKey].sortOrder2};
} else if ((sort1 == "Default") && (sort2 != "Default")){
sortKey = metadata[tableKey].sortkey;
if (sortOrder === 'Default'){sortOrder = metadata[tableKey].sortOrder};
sortKey2 = metadata[sort2].sortkey;
if (sortOrder2 === 'Default'){sortOrder2 = metadata[sort2].sortOrder};
} else if ((sort1 != "Default") && (sort2 == "Default")){
sortKey = metadata[sort1].sortkey;
if (sortOrder === 'Default'){sortOrder = metadata[sort1].sortOrder};
sortKey2 = metadata[sort1].sortkey2;
if (sortOrder2 === 'Default'){sortOrder2 = metadata[sort1].sortOrder2};
} else {
sortKey = metadata[sort1].sortkey;
if (sortOrder === 'Default'){sortOrder = metadata[sort1].sortOrder};
sortKey2 = metadata[sort2].sortkey;
if (sortOrder === 'Default'){sortOrder2 = metadata[sort2].sortOrder};
}
quiz.items.forEach(((item) => {item.sortKey = sortKey(item); item.sortKey2 = sortKey2(item)}));
if ((sortOrder == 'Descending') && (sortOrder2 == 'Descending')){
quiz.items = quiz.items.sort(function(a, b){return b.sortKey == a.sortKey ? b.sortKey2 - a.sortKey2 : b.sortKey - a.sortKey });
} else if ((sortOrder == 'Descending') && (sortOrder2 == 'Ascending')){
quiz.items = quiz.items.sort(function(a, b){return b.sortKey == a.sortKey ? a.sortKey2 - b.sortKey2 : b.sortKey - a.sortKey });
} else if ((sortOrder == 'Ascending') && (sortOrder2 == 'Descending')){
quiz.items = quiz.items.sort(function(a, b){return a.sortKey == b.sortKey ? b.sortKey2 - a.sortKey2 : a.sortKey - b.sortKey });
} else {
quiz.items = quiz.items.sort(function(a, b){return(a.sortKey == b.sortKey ? a.sortKey2 - b.sortKey2 : a.sortKey - b.sortKey)});
};
if (settings.selection === 'Random') {
let storageName = 'Wkit_' + quiz.settings.ipresets[quiz.settings.active_ipreset].name;
let items = sessionStorage.getItem(storageName);
if (items === null){
settings.selection = "None";
} else {
delete quiz.savedItems;
quiz.savedItems = quiz.items.slice(0, quiz.items.length);
retrieveSelecteditems();
currentItem = settings.currentItem;
nextCurrentItem = settings.nextCurrentItem;
if (!$('#WkitRandomSelection').hasClass("WkitActive")) $('#WkitRandomSelection').toggleClass("WkitActive");
if ($('#WkitDateOrdering').hasClass("WkitActive")) $('#WkitDateOrdering').toggleClass("WkitActive");
}
return quiz.settings_dialog.save().then(function(){if (!noCreateTable){displayItems()};});
} else if (settings.selection === 'Date') {
delete quiz.savedItems;
quiz.savedItems = quiz.items.slice(0, quiz.items.length);
orderByDate(quiz.items);
settings.currentItem = currentItem; // should be determined by order by date
settings.nextCurrentItem = nextCurrentItem = currentItem;
if ($('#WkitRandomSelection').hasClass("WkitActive")) $('#WkitRandomSelection').toggleClass("WkitActive");
if (!$('#WkitDateOrdering').hasClass("WkitActive")) $('#WkitDateOrdering').toggleClass("WkitActive");
return quiz.settings_dialog.save().then(function(){if (!noCreateTable){displayItems()};});
} else {
if ($('#WkitRandomSelection').hasClass("WkitActive")) $('#WkitRandomSelection').toggleClass("WkitActive");
if ($('#WkitDateOrdering').hasClass("WkitActive")) $('#WkitDateOrdering').toggleClass("WkitActive");
currentItem = settings.currentItem;
nextCurrentItem = settings.nextCurrentItem;
if (settings.currentItem >= quiz.items.length){
settings.currentItem = currentItem = 0;
settings.nextCurrentItem = nextCurrentItem = 0;
};
if (!noCreateTable){displayItems()};
return Promise.resolve();
};
};
function displayItems(){
if (quiz.settings.listMode){
createItemList(quiz.items, false);
} else {
createTopLeechTables(quiz.items);
};
};
function itemsCharacterCallback (item, override){
let maxItemLength = 28;
if (quiz.settings.tablePresets[quiz.settings.active_ipreset].displayMeaning && !override){
let text = meaningsBrief(item);
if (wideElements[quiz.settings.tablePresets[quiz.settings.active_ipreset].table_data]){
return [text.slice(0,maxItemLength), false , ''];
} else {
return [text, false, ''];
}
};
//check if an item has characters. Kanji and vocabulary will always have these but wk-specific radicals (e.g. gun, leaf, stick) use images instead
if(item.data.characters!= null) {
return [item.data.characters, true, 'lang="JP"'];
} else if (item.data.character_images!= null){
let imgUrl = item.data.character_images.find(a=>a.content_type=="image/svg+xml"&&a.metadata.inline_styles).url;
return ['<img height=14px width=14px src='+imgUrl+'"></img>', true, 'lang="JP"'];
} else {
//if both characters and character_images are somehow absent try using slug instead
return [item.data.slug, true, 'lang="JP"'];
}
}
function makeTableEntry(item, selectedTable){
let presets = quiz.settings.tablePresets[selectedTable];
let tableData;
if (presets.selection === "Date"){
tableData = metadata[presets.navigationDate];
} else {
tableData = metadata[presets.table_data];
};
return (tableData.exists(item) ? tableData.tableEntry(item) : '')
}
function makeTooltipEntryMini(item, tableName){
let html = '';
let labels = {'Meaning_Brief': 'Mg', 'Reading_Brief': 'Rg', 'Level': 'Lvl'};
let tableData = metadata[tableName];
if (tableData.exists(item)) {
html = '<tr><td class="WkitLabel">'+labels[tableName]+'</td><td class="WkitTipValue">'+tableData.tooltipEntry(item)+'</td></tr>';
};
return html;
};
function makeIconForTooltip(item){
let itemData;
if(item.data.characters!= null) {
itemData = item.data.characters;
} else if (item.data.character_images!= null){
let imgUrl = item.data.character_images.find(a=>a.content_type=="image/svg+xml"&&a.metadata.inline_styles).url;
itemData = '<img height=14px width=14px src='+imgUrl+'"></img>';
} else {
//if both characters and character_images are somehow absent try using slug instead
itemData = item.data.slug;
}
let html = '<div class="WkitMiniIcon '+item.object+'">'
//html += '<span class="WkitMiniIconLink" style="color: #ffffff !important;" lang="JP">'+itemData+'</span>'
html += '<span class="WkitMiniIconLink" style="color: '+fontColor+' !important;" lang="JP">'+itemData+'</span>'
html += '</div>';
return html;
};
function makeTooltipIcon(item, tableName){
let html = '';
let tableData = metadata[tableName];
if (tableData.exists(item)) {
let iconLimit = (quiz.settings.listMode ? 15 : 40);
let overhead = 0.8;
let itemList = tableData.itemList(item);
let itemListShort = [];
let charCount = 0;
let index = 0;
while (charCount < iconLimit && index < itemList.length){
let item2 = itemList[index];
itemListShort.push(item2);
charCount += (item2.data.characters != null ? item2.data.characters.length : 1) + overhead;
index++;
};
html = '<div class="WkitMiniContainer">';
itemListShort.forEach(a=>{html += makeIconForTooltip(a)});
if (charCount >= iconLimit) html += '<span class="WkitIconWarning">And more</span>'
html += '</div>';
html = '<tr><td class="WkitLabel">'+tableData.label+'</td><td class="WkitTipValue">'+html+'</td></tr>';
};
return html;
};
function makeTooltipEntry(item, tableName){
let html = '';
let tableData = metadata[tableName];
if (tableData.exists(item)) {
html = '<tr><td class="WkitLabel">'+tableData.label+'</td><td class="WkitTipValue">'+tableData.tooltipEntry(item)+'</td></tr>';
};
return html;
};
var audioCounter = 0;
function makeItemLink(item, itemData, itemClass, audioOk){
if (quiz.settings.audioMode && item.object === 'vocabulary' && audioOk){
let gender = quiz.settings.audioSource;
let audioId = 'Wkitaudio'+audioCounter; audioCounter++;
let html = '';
if (gender == 'male' || gender == 'random'){
let soundUrlmpeg = item.data.pronunciation_audios.find(a=>a.content_type=="audio/mpeg"&&a.metadata.gender==='male');
if (soundUrlmpeg != undefined){soundUrlmpeg = soundUrlmpeg.url};
let soundUrlogg = item.data.pronunciation_audios.find(a=>a.content_type=="audio/ogg"&&a.metadata.gender==='male');
if (soundUrlogg != undefined){soundUrlogg = soundUrlogg.url};
if (soundUrlmpeg != undefined && soundUrlogg != undefined){
if(soundUrlogg != undefined) html += '<link ref="prefetch" href="'+soundUrlogg+'">';
if(soundUrlmpeg != undefined) html += '<link ref="prefetch" href="'+soundUrlmpeg+'">';
html += '<audio id="'+audioId+'male">';
if(soundUrlogg != undefined) html += '<source src="'+soundUrlogg+'" type="audio/ogg"></source>';
if(soundUrlmpeg != undefined) html += '<source src="'+soundUrlmpeg+'" type="audio/mpeg"></source>';
html += '</audio>';
}
};
if (gender == 'female' || gender == 'random'){
let soundUrlmpeg = item.data.pronunciation_audios.find(a=>a.content_type=="audio/mpeg"&&a.metadata.gender==='female');
if (soundUrlmpeg != undefined){soundUrlmpeg = soundUrlmpeg.url};
let soundUrlogg = item.data.pronunciation_audios.find(a=>a.content_type=="audio/ogg"&&a.metadata.gender==='female');
if (soundUrlogg != undefined){soundUrlogg = soundUrlogg.url};
if (soundUrlmpeg != undefined && soundUrlogg != undefined){
if(soundUrlogg != undefined) html += '<link ref="prefetch" href="'+soundUrlogg+'">';
if(soundUrlmpeg != undefined) html += '<link ref="prefetch" href="'+soundUrlmpeg+'">';
html += '<audio id="'+audioId+'female">';
if(soundUrlogg != undefined) html += '<source src="'+soundUrlogg+'" type="audio/ogg"></source>';
if(soundUrlmpeg != undefined) html += '<source src="'+soundUrlmpeg+'" type="audio/mpeg"></source>';
html += '</audio>';
}
};
html += '<a onclick="playAudio('+"'"+audioId+"','"+gender+"'"+');">';
html += '<span '+itemClass+'>'+itemData[0]+'</span>';
html += '</a>';
return html
} else {
return '<a style="padding-right:0;" target="_blank" href="'+item.data.document_url+'"><span '+itemClass+'}>'+itemData[0]+'</span></a>'
};
};
function makeTooltips(item, selectedTable, mode){
let html = '';
iconEntries.forEach(function (tableName){html += makeTooltipIcon(item, tableName)});
toolTipEntries.forEach(function (tableName){html += makeTooltipEntry(item, tableName)});
let presets = quiz.settings.tablePresets[selectedTable]
let selection = presets.selection;
if (mode === 'list') html += makeTooltipEntry(item, presets.table_data);
if (mode === 'table' && selection == 'Date') html += makeTooltipEntry(item, presets.table_data);
if (mode === 'list' && selection == 'Date') html += makeTooltipEntry(item, presets.navigationDate);
let makeTableButton = '';
if (iconEntries.length != 0) makeTableButton = '<button class="WkitMiniButton" SubjectId="'+item.id+'">Make Table</button>';
var info = {
type: item.object,
characters: item.data.characters,
url: item.data.document_url,
svg: (item.data.characters === null ? item.data.character_images.find(a=>a.content_type=="image/svg+xml"&&a.metadata.inline_styles).url : null),
};
html = '<div class="WkitTooltipContent">'+
'<div class="left">'+
//'<span class="'+info.type+'" style="color: #ffffff !important;">'+(info.characters === null ? '<img src="'+info.svg+'">' : info.characters)+'</span>'+
'<span class="'+info.type+'" style="color: '+fontColor+' !important;">'+(info.characters === null ? '<img src="'+info.svg+'">' : info.characters)+'</span>'+
'</div>'+
(html != '' ? '<div class="right"><table class="WkitTablePopup"><tbody>'+html+'</tbody></table>'+makeTableButton+'</div>' : '')+
'</div>';
return html;
}
var toolTipEntries;
var iconEntries;
function initTooltipGlobals(){
let presets = quiz.settings.tablePresets[quiz.settings.active_ipreset];
toolTipEntries = [];
iconEntries = [];
let tableNames = ['tooltip1', 'tooltip2', 'tooltip3', 'tooltip4', 'tooltip5', 'tooltip6', 'tooltip7', 'tooltip8', ];
let entriesWithIcons = {'Vis_Sim_Kanji': true, 'Components': true, 'Used_In': true, };
tableNames.forEach(processName);
function processName(name){
if (presets[name] != 'None'){
if (entriesWithIcons[presets[name]]){
iconEntries.push(presets[name]);
} else {
toolTipEntries.push(presets[name]);
};
};
};
};
function makeEnlargingTooltip (item, selectedTable){
let html;
if (quiz.settings.tablePresets[selectedTable].enlargingTooltip === true){
html = '<div class="WkitEnlargedTooltip">'+
//'<span class="'+item.object+'" style="color: #ffffff !important;">'+(item.data.characters === null ? '<img src="'+item.data.character_images.find(a=>{ return a.content_type=="image/svg+xml"&&a.metadata.inline_styles}).url+'"' : item.data.characters)+'</span>'+
'<span class="'+item.object+'" style="color: '+fontColor+' !important;">'+(item.data.characters === null ? '<img src="'+item.data.character_images.find(a=>{ return a.content_type=="image/svg+xml"&&a.metadata.inline_styles}).url+'"' : item.data.characters)+'</span>'+
'</div>';
} else {
html = '';
};
return html;
};
/* Event handlers for buttons */
function makeTableHandler(event) {
//test prevents multiple clicks
if (!event.detail || event.detail == 1) {
dataReady = false;
let subjectId = Number($(event.target).attr("subjectid"))
let calledItem = subjectIndexVoc[subjectId];
if (calledItem === undefined) calledItem = subjectIndexKan[subjectId];
if (calledItem === undefined) calledItem = subjectIndexRad[subjectId];
let items = [];
iconEntries.forEach(t=>metadata[t].itemList(calledItem).forEach(a=>items.push(a)));
quiz.items = items;
let tableName = "--Temp "+calledItem.object.slice(0,3)+' '+(calledItem.data.characters != null ? calledItem.data.characters : calledItem.data.slug);
addTable(tableName);
nextCurrentItem = items.length;
currentItem = 0;
let subjectIdList = [];
iconEntries.forEach(t=>metadata[t].idList(calledItem).forEach(a=>subjectIdList.push(a)));
quiz.settings.tablePresets[quiz.settings.active_ipreset].itemList = subjectIdList;
quiz.settings.tablePresets[quiz.settings.active_ipreset].selection = 'None';
setSelectionButtonsColors()
quiz.settings.audioMode = false;
formatControlBar();
quiz.settings_dialog.save()
.then(displayItems)
.then(function(){dataReady = true;});
};
return;
};
function clickedFirst(event) {
document.getElementById("WkitFirstButton").blur();
//test prevents multiple clicks
if (!event.detail || event.detail == 1) {
dataReady = false;
let presets = quiz.settings.tablePresets[quiz.settings.active_ipreset]
currentItem = 0;
presets.currentItem = currentItem;
presets.nextCurrentItem = nextCurrentItem;
if (presets.selection === 'Date') presets.startDate = quiz.items[currentItem].sortKey;
if (presets.selection === 'Selection'){
presets.savedSelCurrentItem = currentItem;
presets.savedSelNextCurrentItem = nextCurrentItem;
};
quiz.settings.audioMode = false;
formatControlBar();
quiz.settings_dialog.save()
.then(displayItems)
.then(function(){dataReady = true;});
};
return
}
function clickedBackward(event) {
document.getElementById("WkitBackwardButton").blur();
//test prevents multiple clicks
if (!event.detail || event.detail == 1) {
if (currentItem > 0){
dataReady = false;
let presets = quiz.settings.tablePresets[quiz.settings.active_ipreset];
if (quiz.settings.listMode){
direction = 'Backward';
presets.nextCurrentItem = nextCurrentItem = currentItem;
presets.currentItem = currentItem - 1;
quiz.settings.audioMode = false;
formatControlBar();
quiz.settings_dialog.save()
.then(function(){displayItems();
direction = 'Forward';
dataReady = true;
if (presets.selection === 'Date') {
presets.startDate = quiz.items[currentItem].sortKey;
quiz.settings_dialog.save()
}
if (presets.selection === 'Selection'){
presets.savedSelCurrentItem = currentItem;
presets.savedSelNextCurrentItem = nextCurrentItem;
quiz.settings_dialog.save()
};
})
} else {
presets.nextCurrentItem = nextCurrentItem = currentItem;
currentItem = Math.max(currentItem - nbItems, 0);
presets.currentItem = currentItem;
if (presets.selection === 'Date') presets.startDate = quiz.items[currentItem].sortKey;
if (presets.selection === 'Selection'){
presets.savedSelCurrentItem = currentItem;
presets.savedSelNextCurrentItem = nextCurrentItem;
};
quiz.settings.audioMode = false;
formatControlBar();
quiz.settings_dialog.save()
.then(displayItems)
.then(function(){dataReady = true;});
}
}
};
return
}
function clickedForward(event) {
document.getElementById("WkitForwardButton").blur();
//test prevents multiple clicks
if (!event.detail || event.detail == 1) {
if(currentItem < nextCurrentItem && nextCurrentItem < quiz.items.length){
dataReady = false;
let presets = quiz.settings.tablePresets[quiz.settings.active_ipreset];
currentItem = nextCurrentItem;
presets.currentItem = currentItem;
presets.nextCurrentItem = nextCurrentItem;
if (presets.selection === 'Date') presets.startDate = quiz.items[currentItem].sortKey;
if (presets.selection === 'Selection'){
presets.savedSelCurrentItem = currentItem;
presets.savedSelNextCurrentItem = nextCurrentItem;
};
quiz.settings.audioMode = false;
formatControlBar();
quiz.settings_dialog.save()
.then(displayItems)
.then(function(){dataReady = true;});
};
};
return
}
function clickedLast(event) {
document.getElementById("WkitLastButton").blur();
//test prevents multiple clicks
if (!event.detail || event.detail == 1) {
dataReady = false;
let presets = quiz.settings.tablePresets[quiz.settings.active_ipreset];
if (quiz.settings.listMode){
direction = 'Backward';
presets.currentItem = currentItem = quiz.items.length;
presets.nextCurrentItem = nextCurrentItem = currentItem;
quiz.settings.audioMode = false;
formatControlBar();
quiz.settings_dialog.save()
.then(function(){displayItems();
if (presets.selection === 'Date') presets.startDate = quiz.items[currentItem].sortKey;
if (presets.selection === 'Selection'){
presets.savedSelCurrentItem = currentItem;
presets.savedSelNextCurrentItem = nextCurrentItem;
};
presets.currentItem = currentItem;
dataReady = true;
quiz.settings_dialog.save()
.then(function(){direction = 'Forward';});
});
} else {
presets.nextCurrentItem = nextCurrentItem = currentItem;
currentItem = Math.max(quiz.items.length - nbItems, 0);
presets.currentItem = currentItem;
if (presets.selection === 'Date') presets.startDate = quiz.items[currentItem].sortKey;
if (presets.selection === 'Selection'){
presets.savedSelCurrentItem = currentItem;
presets.savedSelNextCurrentItem = nextCurrentItem;
};
quiz.settings.audioMode = false;
formatControlBar();
quiz.settings_dialog.save()
.then(displayItems)
.then(function(){dataReady = true;});
}
};
return
}
function selectTable(event) {
dataReady = false;
document.getElementById("WkitTableSelector").blur();
let selected = quiz.settings.active_ipreset = $('#WkitTableSelector').prop('selectedIndex');
setSelectionButtonsColors()
if (quiz.settings.ipresets[selected].name.slice(0, 6) !== '--Temp') removeTempTables();
quiz.settings.audioMode = false;
formatControlBar();
quiz.settings_dialog.save()
.then(function(){return fetch_items('table');})
.then(updatePage)
.then(function(){dataReady = true;});
};
function toggleDisplay(event) {
document.getElementById("WkitToogleDisplay").blur();
//test prevents multiple clicks
if (!event.detail || event.detail == 1) {
dataReady = false;
quiz.settings.listMode = !quiz.settings.listMode;
quiz.settings.audioMode = false;
formatControlBar();
quiz.settings_dialog.save()
.then(displayItems)
.then(function(){dataReady = true;});
};
return
};
function toggleLanguage(event) {
document.getElementById("WkitToogleLanguage").blur();
//test prevents multiple clicks
if (!event.detail || event.detail == 1) {
dataReady = false;
let a = quiz.settings.tablePresets[quiz.settings.active_ipreset].displayMeaning;
quiz.settings.tablePresets[quiz.settings.active_ipreset].displayMeaning = !a;
quiz.settings.audioMode = false;
formatControlBar();
quiz.settings_dialog.save()
.then(displayItems)
.then(function(){dataReady = true;});
};
return
};
function toggleAudio(event) {
document.getElementById("WkitToogleAudio").blur();
//test prevents multiple clicks
if (!event.detail || event.detail == 1) {
let a = quiz.settings.audioMode;
quiz.settings.audioMode = !a;
formatControlBar();
displayItems();
};
return
};
function toggleRandomSelection(event) {
document.getElementById("WkitRandomSelection").blur();
//test prevents multiple clicks
if (!event.detail || event.detail == 1) {
dataReady = false;
let settings = quiz.settings;
let presets = settings.tablePresets[settings.active_ipreset];
settings.audioMode = false;
if (presets.selection === 'None'){
presets.selection = 'Random';
presets.savedCurrentItem = currentItem;
presets.savedNextCurrentItem = nextCurrentItem;
delete quiz.savedItems;
quiz.savedItems = quiz.items.slice(0, quiz.items.length);
doRandomSelection();
$('#WkitRandomSelection').toggleClass("WkitActive");
} else if (presets.selection === 'Date') {
presets.selection = 'Random';
delete quiz.items;
quiz.items = quiz.savedItems.slice(0, quiz.savedItems.length);
doRandomSelection();
$('#WkitRandomSelection').toggleClass("WkitActive");
$('#WkitDateOrdering').toggleClass("WkitActive");
} else if (presets.selection === 'Selection') {
presets.selection = 'Random';
delete quiz.items;
quiz.items = quiz.savedItems.slice(0, quiz.savedItems.length);
doRandomSelection();
$('#WkitRandomSelection').toggleClass("WkitActive");
} else {
presets.selection = 'None';
delete quiz.items;
quiz.items = quiz.savedItems;
presets.currentItem = currentItem = presets.savedCurrentItem;
presets.nextCurrentItem = nextCurrentItem = presets.savedNextCurrentItem;
$('#WkitRandomSelection').toggleClass("WkitActive");
};
quiz.settings_dialog.save()
.then(displayItems)
.then(function(){dataReady = true;});
};
return
};
function doRandomSelection(){
let settings = quiz.settings;
let presets = settings.tablePresets[settings.active_ipreset];
let selection = presets.selectionCriterion;
shuffle(quiz.items);
presets.currentItem = currentItem = 0;
if (settings.randomSelection !== 0){
nextCurrentItem = presets.randomSelection;
} else if (settings.listMode){
createItemList(quiz.items, true); // find out how many items fit the screen
} else {
nextCurrentItem = currentItem + nbItems;
};
quiz.items = quiz.items.slice(0, nextCurrentItem);
presets.nextCurrentItem = nextCurrentItem;
saveSelectedItems()
};
function saveSelectedItems(){
let settings = quiz.settings;
let savedSubjectindex = []
quiz.items.forEach(item=>{savedSubjectindex.push(item.id)});
let storageName = 'Wkit_' + settings.ipresets[settings.active_ipreset].name;
sessionStorage.setItem(storageName, JSON.stringify(savedSubjectindex));
};
function retrieveSelecteditems(){
let settings = quiz.settings;
let storageName = 'Wkit_' + settings.ipresets[settings.active_ipreset].name;
let ids = JSON.parse(sessionStorage.getItem(storageName));
quiz.items = [];
for (var idx in ids){
let id = ids[idx];
let item = subjectIndexVoc[id];
if (item === undefined) item = subjectIndexKan[id];
if (item === undefined) item = subjectIndexRad[id];
quiz.items.push(item);
};
}
function toggleDateOrdering(event) {
document.getElementById("WkitDateOrdering").blur();
//test prevents multiple clicks
if (!event.detail || event.detail == 1) {
dataReady = false;
let settings = quiz.settings;
let presets = settings.tablePresets[settings.active_ipreset];
settings.audioMode = false;
if (presets.selection === 'None'){
presets.selection = 'Date';
delete quiz.savedItems;
quiz.savedItems = quiz.items.slice(0, quiz.items.length);
doDateOrdering();
$('#WkitDateOrdering').toggleClass("WkitActive");
} else if (presets.selection === 'Random') {
presets.selection = 'Date';
delete quiz.items;
quiz.items = quiz.savedItems.slice(0, quiz.savedItems.length);
orderByDate(quiz.items);
presets.currentItem = currentItem; // should be determined by order by date
presets.nextCurrentItem = nextCurrentItem = currentItem;
$('#WkitRandomSelection').toggleClass("WkitActive");
$('#WkitDateOrdering').toggleClass("WkitActive");
} else if (presets.selection === 'Selection') {
presets.selection = 'Date';
presets.savedSelCurrentItem = currentItem;
presets.savedSelNextCurrentItem = nextCurrentItem;
delete quiz.items;
quiz.items = quiz.savedItems.slice(0, quiz.savedItems.length)
orderByDate(quiz.items);
presets.currentItem = currentItem; // should be determined by order by date
presets.nextCurrentItem = nextCurrentItem = currentItem;
$('#WkitDateOrdering').toggleClass("WkitActive");
} else {
presets.selection = 'None';
delete quiz.items
quiz.items = quiz.savedItems;
presets.currentItem = currentItem = presets.savedCurrentItem;
presets.nextCurrentItem = nextCurrentItem = presets.savedNextCurrentItem;
$('#WkitDateOrdering').toggleClass("WkitActive");
};
quiz.settings_dialog.save()
.then(displayItems)
.then(function(){dataReady = true;});
};
return
};
function doDateOrdering (){
let settings = quiz.settings;
let presets = settings.tablePresets[settings.active_ipreset];
presets.savedCurrentItem = currentItem;
presets.savedNextCurrentItem = nextCurrentItem;
orderByDate(quiz.items);
presets.currentItem = currentItem; // should be determined by order by date
presets.nextCurrentItem = nextCurrentItem = currentItem;
}
function setSelectionButtonsColors(){
let settings = quiz.settings;
let presets = settings.tablePresets[settings.active_ipreset];
let selection = presets.selection;
if (selection === 'None'){
if ($('#WkitRandomSelection').hasClass("WkitActive")) $('#WkitRandomSelection').toggleClass("WkitActive");
if ($('#WkitDateOrdering').hasClass("WkitActive")) $('#WkitDateOrdering').toggleClass("WkitActive");
} else if (selection === 'Random') {
if (!$('#WkitRandomSelection').hasClass("WkitActive")) $('#WkitRandomSelection').toggleClass("WkitActive");
if ($('#WkitDateOrdering').hasClass("WkitActive")) $('#WkitDateOrdering').toggleClass("WkitActive");
} else if (selection === 'Date'){
if ($('#WkitRandomSelection').hasClass("WkitActive")) $('#WkitRandomSelection').toggleClass("WkitActive");
if (!$('#WkitDateOrdering').hasClass("WkitActive")) $('#WkitDateOrdering').toggleClass("WkitActive");
}
}
/* control variables for the currently displayed tables*/
var currentItem = 0;
var nextCurrentItem;
var nbItems = 0;
function initCurrentItem(){
currentItem = quiz.settings.tablePresets[quiz.settings.active_ipreset].currentItem;
if (currentItem == undefined){currentItem = 0; nextCurrentItem = 0;};
nextCurrentItem = quiz.settings.tablePresets[quiz.settings.active_ipreset].nextCurrentItem;
if (nextCurrentItem == undefined){nextCurrentItem = currentItem;};
nbItems = 3 * quiz.settings.numberOfLines;
}
var script = '<script type="text/javascript">'
script += 'function playAudio(id, gender){';
script += 'if (gender === "random"){gender = ["male", "female"][Math.floor(Math.random()*2)]};'
script += 'id += gender;';
script += 'document.getElementById(id).play();';
script += '};';
script += '</script>';
const numberOfTables = 3;
var itemPer;
var nbDisplayedItems;
var sizeOfList;
var sizeOfTable;
var numberPerTable;
function setNumberOfLines (){
if (quiz.settings.numberOfLines === undefined){
numberPerTable = 11;
} else {
numberPerTable = Number(quiz.settings.numberOfLines);
};
sizeOfTable = numberOfTables * numberPerTable;
sizeOfList = 115;
if (quiz.settings.listMode){nbDisplayedItems = sizeOfList} else {nbDisplayedItems = sizeOfTable};
};
const emptyMessage = `<div class="emptyMessage"><p><b>No items match your criteria. You may try relaxing them if possible.</b></p></div>`;
function createTopLeechTables(items) {
let sectionContents = "";
let startnumberTable = currentItem;
let endNumberTable = currentItem + numberPerTable;
let itemsLength = items.length;
let nrOfTables = numberOfTables;
let totalNumberOfLeeches = numberPerTable * nrOfTables;
let meanings = "";
let readings = "";
audioCounter = 0;
let activeTable = quiz.settings.active_ipreset;
initTooltipGlobals();
//make sure we don't create empty tables if there are too few items
if(items.length == 0){
nrOfTables = 0;
sectionContents += emptyMessage;
} else if(items.length < totalNumberOfLeeches) { //if less leeches available then user requested
var ratio = items.length / (numberPerTable*3);
if(ratio <= 0.34){
nrOfTables = 1;
} else if(ratio <= 0.67){
nrOfTables = 2;
}
} else if (numberPerTable >= totalNumberOfLeeches){ //if table capacity greater than user's requested amount of leeches
nrOfTables = 1;
}
//Create tables
sectionContents += script;
for (var i = 0; i < nrOfTables; i++){
//In case there are less than the requested amount of items
if(items.length <= endNumberTable){
endNumberTable = items.length;
nrOfTables = i - 1;
};
sectionContents += `
<div class="span4" style="width=290px;">
<div class="WkitTableList" style="position: relative;">
<h3 class="WkitSmallCaps">Items ${startnumberTable+1}-${endNumberTable} of ${itemsLength}</h3>
<table>
<tbody>`;
for (var j = startnumberTable; j < endNumberTable; j++){
let itemData = itemsCharacterCallback(items[j], false);
let tableEntry = makeTableEntry(items[j], activeTable);
let itemLink = makeItemLink(items[j], itemData, 'class="WkitMainElement WkitItem'+itemData[2]+'" style="color: '+fontColor+' !important"', true);
let addClass = (j <= startnumberTable + 2 ? 'WkitFirstItem' : 'WkitLaterItem');
let tooltip = makeTooltips(items[j], activeTable, 'table');
let tooltip2;
if (itemData[1]){
tooltip2 = '<div class="WkitTooltip2"><p><span> </span></p>'+makeEnlargingTooltip(items[j], activeTable)+'</div>';
} else {
tooltip2 = '';
};
sectionContents += `<tr class="${items[j].object}">` +
'<td>' +
'<div class="WkitTooltip '+addClass+'">' +
itemLink +
tooltip +
'</div>' +
tooltip2 +
'</td>' +
'<td>' +
'<div style="text-align: right"><a class="WkitMainElement" style="padding-left:0;"><span style="color: '+secondaryFontColor+' !important">'+tableEntry+'</span></a>' +
'</div>' +
'</td>' +
'</tr>';
}
//preparing for next table
startnumberTable += numberPerTable;
endNumberTable += numberPerTable;
sectionContents += '</tbody>' +
'</table>' +
'</div>' +
'</div>';
}
//if(j < items.length){nextCurrentItem = j};
nextCurrentItem = Math.min(j, items.length);
$('#leech_table').html(sectionContents);//replace existing table
if (iconEntries.length != 0) $('.WkitMiniButton').click(makeTableHandler);
}
var direction = 'Forward';
function createItemList(items, noDisplay){
let startNumberItem = currentItem;
let itemsLength = items.length;
let selected_table = quiz.settings.active_ipreset;
let presets = quiz.settings.tablePresets[selected_table]
let meaningMode = presets.displayMeaning;
let get_table_data = metadata[presets.table_data].tableEntryMarker;
let showMarkers = presets.showMarkers;
if (presets.selection === 'Random') showMarkers = false;
if (presets.selection === 'Date') showMarkers = presets.showMarkersDate;
let dateSelection = (presets.selection === 'Date');
let dateSelected = presets.navigationDate;
if (dateSelection) get_table_data = metadata[dateSelected].tableEntryMarker;
audioCounter = 0;
initTooltipGlobals();
// These variables control how many items will be on the screen so they don't overflow it
let firstLineLimit = meaningMode ? 120.0 : 70.0;
let maxCharCount = meaningMode ? 550.0 : 333.0;
let overheadVocab = 0.9;
let overheadOther = 0.8;
let markerFactor = 0.27;
let markerOverhead = 0.9;
let meaningFactor = 0.27;
let meaningOverhead = 0.9;
let itemLimit = (meaningMode ? 170 : 108);
let html = '';
let charCount = 0;
let oldMarker = undefined;
let newMarker = undefined;
let markerString;
if (direction === 'Forward'){
let i = currentItem;
let endNumberItem = items.length - 1;
console.log('before loop ',i,endNumberItem)
while (charCount < maxCharCount && i <= endNumberItem){
console.log('dans loop ',i,endNumberItem)
processItem(i);
i++;
}
nextCurrentItem = i;
html = `<div class="WkitSmallCapsList${meaningMode ? ' WkitMeaning' : ' WkitReading'}"><span>Items ${startNumberItem + 1}-${i} of ${itemsLength}</span></div>`+html;
} else {
let i = currentItem -1;
while (charCount < maxCharCount && i >= 0){
calculateCount(i);
i--;
};
charCount = 0;
oldMarker = undefined;
newMarker = undefined;
i = i + 1; // the last i was not processed
currentItem = i;
let j = i;
if (i > 0){
while (j < startNumberItem){
processItem(j);
j++;
};
html = `<div class="WkitSmallCapsList${meaningMode ? ' WkitMeaning' : ' WkitReading'}"><span>Items ${i+1}-${startNumberItem} of ${itemsLength}</span></div>`+html;
} else {
// i is 0. We have to fill the whole table - relying on startnumber would display too few items.
let endNumberItem = items.length - 1;
while (charCount < maxCharCount && i <= endNumberItem){
processItem(i);
i++;
};
nextCurrentItem = i;
html = `<div class="WkitSmallCapsList${meaningMode ? ' WkitMeaning' : ' WkitReading'}"><span>Items ${1}-${i} of ${itemsLength}</span></div>`+html;
};
};
let html2;
if (items.length === 0){
html2 = emptyMessage;
} else {
html2 = script+'<div class="WkitItemList '+(charCount < firstLineLimit ? 'WkitFlexLeft' : 'WkitFlexJustified')+'">'+html+'</div>'
};
if (!noDisplay){
$('#leech_table').html(html2);//replace existing table
if (iconEntries.length != 0) $('.WkitMiniButton').click(makeTableHandler);
}
function processItem(i){
newMarker = get_table_data(items[i]);
if (newMarker != oldMarker){
oldMarker = newMarker;
if (showMarkers && newMarker != ''){
html += makeMarkerElement(newMarker, meaningMode);
markerString = (typeof newMarker === 'number' ? newMarker.toString() : newMarker);
charCount += (markerString.length * markerFactor) + markerOverhead; };
};
if (meaningMode){
let meaning = metadata.Meaning_Brief.tableEntry(items[i]);
html += makeListElement(items[i], selected_table, charCount, 'WkitTooltipIconMeaning', itemLimit);
charCount += meaning.length * meaningFactor + meaningOverhead;
} else {
html += makeListElement(items[i], selected_table, charCount, 'WkitTooltipIcon', itemLimit);
charCount += (items[i].data.characters === undefined || items[i].data.characters === null ? 1 + overheadOther : (items[i].data.characters.length === 1 ? 1 + overheadOther : items[i].data.characters.length + overheadVocab)); };
}
function calculateCount(i){
newMarker = get_table_data(items[i]);
if (newMarker != oldMarker){
oldMarker = newMarker;
if (showMarkers && newMarker != ''){
markerString = (typeof newMarker === 'number' ? newMarker.toString() : newMarker);
charCount += (markerString.length * markerFactor) + markerOverhead; };
};
if (meaningMode){
let meaning = metadata.Meaning_Brief.tableEntry(items[i]);
charCount += meaning.length * meaningFactor + meaningOverhead;
} else {
charCount += (items[i].data.characters === undefined || items[i].data.characters === null ? 1 + overheadOther : (items[i].data.characters.length === 1 ? 1 + overheadOther : items[i].data.characters.length + overheadVocab)); };
}
function makeListElement(item, selected_table, charCount, itemClass, firstObjectLimit){
let itemData = itemsCharacterCallback(item, false);
let itemLink = makeItemLink(item, itemData, ' class="'+item.object+'"style="color: '+fontColor+' !important;"', true);
var elem = '<div class="WkitTooltip '+itemClass+' '+item.object+''+(charCount <= firstObjectLimit ? " WkitFirstItem" : " WkitLaterItem")+'">'+
makeTooltips(item, selected_table, 'list') +
'<div class="WkitItemListed">'+
itemLink +
'</div>'+
'</div>';
return elem;
};
function makeMarkerElement(marker, meaningMode){
var elem = '<div class="WkitTooltip WkitTooltipIcon'+(meaningMode ? ' WkitMarkerMeaning' : ' WkitMarker')+'">'+
'<div class="'+(meaningMode ? 'WkitMarkerMeaning' : 'WkitMarker')+'" style="color: #000000 !important;"><span>'+marker+'</span></div>'+
'</div>';
return elem;
};
};
function fillClipboard(){
document.getElementById("WkitWordExport").blur();
quiz.exportBackup = quiz.items;
if (quiz.settings.repeatWordCloud != 'No Repeat'){
// make sure the repeat field endpoint is available in the items
dataReload('wordCloud');
} else {
performWordCloud();
};
};
function performWordCloud(){
let items = quiz.items;
let text = '';
let noLatin = quiz.settings.noLatin;
if (noLatin === undefined){noLatin = false};
let oneItemPerLine = quiz.settings.oneItemPerLine;
if (oneItemPerLine === undefined){oneItemPerLine = false};
let exportLimit = quiz.settings.exportLimit;
if (exportLimit === undefined){exportLimit = 0};
let exportCount = 0;
let repeatWordCloud = quiz.settings.repeatWordCloud;
let repeatCount;
for (var i = 0; i < items.length; i++){
let itemsData = items[i].data;
if (repeatWordCloud != 'No Repeat'){
repeatCount = metadata[repeatWordCloud].wordCloud(items[i]);
} else {
repeatCount = 1;
};
for (var j = 0; j < repeatCount; j++){
if(itemsData.characters!= null) {
text += itemsData.characters+' ';
if (oneItemPerLine){text += '\n'};
} else if (!noLatin){
text += itemsData.slug+' ';
if (oneItemPerLine){text += '\n'};
};
};
if (repeatCount != 0){exportCount += 1;};
if (exportLimit != 0 && exportCount >= exportLimit){break};
};
exportDialog(text, exportCount, 'txt')
};
function exportTable(){
document.getElementById("WkitExport").blur();
let currentPreset = quiz.settings.tablePresets[quiz.settings.active_ipreset];
let currentColumn = currentPreset[exportedInfo[0]];
if (currentColumn === undefined || currentColumn == 'None' ){
alert('The first column is not exported.\nPlease configure your export settings.');
return;
};
// make sure all export data is available in the items
quiz.exportBackup = quiz.items;
dataReload('export');
};
function performExport(){
let currentPreset = quiz.settings.tablePresets[quiz.settings.active_ipreset];
let currentColumn = currentPreset[exportedInfo[0]];
let items = quiz.items;
let text = '';
let exportCount = 0;
let quotes = currentPreset.quotes;
let separator = currentPreset.separator;
if(separator === ',' && quotes === 'Never'){
alert('Inconsistent settings.\nMust use quotes when separator is comma.\nChanging separator to horizontal tab.');
separator = '\t';
};
let missingData = currentPreset.missingData === 'Empty_Cell';
let includeLabels = currentPreset.includeLabels;
let URLclickable = currentPreset.URLclickable;
if (URLclickable === 'Spreadsheet' && quotes === 'Never' && (separator === ';' || separator === ',')){
let URLcolumn = false;
exportedInfo.forEach(item => {if (currentPreset[item] === 'Item_Page') URLcolumn = true})
if (URLcolumn){
alert('Inconsistent settings.\nYou have requested a clickable URL column for spreadsheet with a comma or a semicolumn separator without quotes.\nThis combination will break the csv.\nChanging separator to horizontal tab.');
separator = '\t';
}
}
if (URLclickable !== 'Plain'){
let URLexported = false;
let emptyColumn = '';
let emptyColumnNumber = 0;
for (var i = 0; i < exportedInfo.length; i++){
if (currentPreset[exportedInfo[i]] === "Item_Page"){URLexported = true};
if (currentPreset[exportedInfo[i]] === 'None'){
emptyColumnNumber = i + 1;
emptyColumn = exportedInfo[i];
};
};
if (!URLexported){
alert('Inconsistent settings.\nYou have requested a clickable URL but have not selected "URL of Item Page" in any column.\nAutomatically adding "URL of Item Page" to column '+i);
currentPreset[emptyColumn] = "Item_Page";
};
};
let hoursInDate = currentPreset.hoursInDate;
let titleEntry;
let firstElement = true;
if (currentPreset.includeTitle){
for (i = 0; i < exportedInfo.length; i++){
let currentColumn = currentPreset[exportedInfo[i]];
if (currentColumn !='None' && currentColumn != undefined){
titleEntry = metadata[currentColumn].title;
if (quotes === 'Always' || (quotes === 'As_Needed' && titleEntry.indexOf(' ') != -1)){titleEntry = '"'+titleEntry+'"';}
if (firstElement){
text += titleEntry;
firstElement = false;
} else {
text += separator+titleEntry;
};
};
};
text += '\n';
};
for (i = 0; i < items.length; i++){
firstElement = true;
for (var j = 0; j < exportedInfo.length; j++){
currentColumn = currentPreset[exportedInfo[j]];
if (currentColumn !='None' && currentColumn != undefined){
let metaCol = metadata[currentColumn];
if (metaCol.exists(items[i])) {
titleEntry = metaCol.export(items[i]);
if (missingData && titleEntry === 'Unavailable'){
titleEntry = '';
} else {
if (metaCol.isDate && !(hoursInDate[currentColumn] === true)){
if (titleEntry != 'Unscheduled' && titleEntry != 'Not Yet'){titleEntry = titleEntry.slice(0, 10)};
};
if (titleEntry === ''){titleEntry = '-Empty-'};
if (includeLabels) titleEntry = metaCol.labelExport+titleEntry;
if (currentColumn === 'Item_Page' && URLclickable !== 'Plain'){
let item = items[i];
let indentification = item.object.slice(0,3) + ' '+ (item.data.characters != undefined ? item.data.characters : item.data.slug);
if (URLclickable === 'Spreadsheet'){
if (quotes === 'Always' || (quotes === 'As_Needed' && (separator === ';' || separator === ','))){
titleEntry = '=HYPERLINK(""'+titleEntry+'""; ""Link '+indentification+'"")';
} else {
titleEntry = '=HYPERLINK("'+titleEntry+'"; "Link '+indentification+'")';
};
} else if (URLclickable === 'html') {
if (quotes === 'Always'){
titleEntry = "<a href='"+titleEntry+"'>"+indentification+"</a>";
} else {
titleEntry = '<a href="'+titleEntry+'">'+indentification+'</a>';
};
};
};
if (quotes === 'Always') titleEntry = '"'+titleEntry+'"';
if (quotes === 'As_Needed' && metaCol.needQuotes) titleEntry = '"'+titleEntry+'"';
if (quotes === 'As_Needed' && URLclickable && currentColumn === 'Item_Page' && (separator === ';' || separator === ',')) titleEntry = '"'+titleEntry+'"';
}
} else {
titleEntry = (missingData ? '' : includeLabels ? metaCol.labelExport+'Unavailable' : 'Unavailable');
};
if (firstElement){
text += titleEntry;
firstElement = false;
} else {
text += separator+titleEntry;
};
};
};
text += '\n';
exportCount += 1;
};
exportDialog(text, exportCount, 'csv')
};
var text;
var exportCount;
function exportDialog(xtext,xexportCount,ext){
text = xtext;
exportCount = xexportCount;
let encoded = encodeURI("\uFEFF"+text);
let link = '<a href="data:text/csv; charset=utf-8,'+encoded+'" download="Item Inspector Export.'+ext+'">Download</a>';
let dialog = '<button id="WkitClipboardButton" class="WkitExportButton">Copy to Clipboard</button>' +
'<button id="WkitDownLoadButton" class="WkitExportButton">'+link+'</button>' +
'<button id="WkitCancelButton" class="WkitExportButton">Cancel</button>';
$("#WkitDialogContainer").html(dialog);
$("#WkitClipboardButton").click(clipboardHandler);
$("#WkitDownLoadButton").click(downloadlHandler);
$("#WkitCancelButton").click(cancelHandler);
$("#WkitDialogContainer").css('display', 'block');
function clipboardHandler(e){
$("#WkitDialogContainer").html('');
$("#WkitDialogContainer").css('display', 'none');
quiz.items = quiz.exportBackup;
delete quiz.exportBackup;
navigator.clipboard.writeText(text)
.then(function(){alert(exportCount+' items have been exported to the clipboard.');})
}
function downloadlHandler(e){
$("#WkitDialogContainer").html('');
$("#WkitDialogContainer").css('display', 'none');
quiz.items = quiz.exportBackup;
delete quiz.exportBackup;
alert(exportCount+' items are being downloaded.')
}
function cancelHandler(e){
$("#WkitDialogContainer").html('');
$("#WkitDialogContainer").css('display', 'none');
quiz.items = quiz.exportBackup;
delete quiz.exportBackup;
}
}
// BEGIN Item Inspector wkof Filter
function waitForItemDataRegistry() {
return wkof.wait_state('wkof.ItemData.registry', 'ready');
}
function registerItemInspectorFilter() {
waitForItemDataRegistry()
.then(function(){
delete wkof.ItemData.registry.sources.wk_items.filters.itemInspectorFilter;
delete wkof.ItemData.registry.sources.wk_items.filters.itemInspectorFilterName;
wkof.ItemData.registry.sources.wk_items.filters.itemInspectorFilter = {
type: 'text',
label: 'Item Inspector',
default: '',
placeholder: 'The input is not used',
filter_func: itemInspectorFilter,
set_options: function(options) { return },
hover_tip: 'Tool for Item Inspector Integration\nShould Be Turned OFF\nMay Cause Problems If Turned On',
no_ui: true,
};
})
}
var quizzedItems = {};
function itemInspectorFilter(filterValue, item) {
return (quizzedItems[item.id] === true);
}
// END Item Inspector wkof Filter
var dataReady = false;
function quizOnWholeTable(e){
document.getElementById("WkitQuizTable").blur();
if (dataReady) launchSelfStudyQuiz(0, quiz.items.length);
};
function quizOnSelection(e){
document.getElementById("WkitQuizSelection").blur();
if (dataReady) launchSelfStudyQuiz(currentItem, nextCurrentItem);
}
function launchSelfStudyQuiz(start, end){
quizzedItems = {};
let items = quiz.items;
let i = start;
while (i < end){
quizzedItems[items[i].id] = true;
i++
}
let config = {ipreset: {name: 'Item_Inspector', content: {
wk_items: {enabled: true, filters: {itemInspectorFilter: {enabled: true, value: ''},}},
}},
};
wkof.wait_state('ss_quiz', 'ready').then(function(){ss_quiz.open(config)});
};
const waitMessage = '<div class="emptyMessage"><p id="WkitWaitMessage"><b>Item Inspector is loading the data<b></p></div>'
function dataReload(fetchOption){
$('#leech_table').html = waitMessage;
switch (fetchOption){
case 'export':
return fetch_items(fetchOption).then(performExport);
break;
case 'wordCloud':
return fetch_items(fetchOption).then(performWordCloud);
break;
case 'table':
default:
return fetch_items(fetchOption).then(updatePage);
break;
};
}
function insertContainer(){
/* build containers for the table elements */
const helpURL = 'https://community.wanikani.com/t/userscript-wanikani-item-inspector/44564';
let sectionContainer = '<div id="WkitTopBar" class="WkitTopBar"></div> ';
let topBlock = '<div id="WkitControlBar" class="WkitControlBar">' +
'<div class="WkitHeader">' +
'<div class="WkitControlLeft">'+
'<button id="WkitFirstButton" type="button" class="WkitButton WkitButtonleft icon-fast-backward"></button>' +
'<button id="WkitBackwardButton" type="button" class="WkitButton WkitButtonleft" style="padding-right: 8px; padding-bottom: 3px;">◄</button>' +
'<button id="WkitForwardButton" type="button" class="WkitButton WkitButtonleft" style="padding-left: 7px; padding-bottom: 3px;">►</button>' +
'<button id="WkitLastButton" type="button" class="WkitButton WkitButtonleft icon-fast-forward"></button>' +
'<select id="WkitTableSelector" class="WkitSelector" title="Choose the table you want to display"></select>'+
'<button id="WkitToogleDisplay" type="button" class="WkitButton WkitButtonleft icon-bullseye" title="Toggles between Tables and Lists of icons"icon-bullseye></button>' +
'<button id="WkitToogleLanguage" type="button" class="WkitButton WkitButtonleft" title="Toggles the current page between English and Japanese\nPages other than the current one are unaffected." style="font-size:18px; font-weight: 500;" lang="JP"></button>' +
'<button id="WkitToogleAudio" type="button" class="WkitButton WkitButtonleft" title="Turns on/off clicking on vocabulary items to play audio.\nAudio is automalically turned off when you click on a button that may change the screen." style="font-size:15px; font-weight: bold; padding-bottom: 1px"></button>' +
'<button id="WkitRandomSelection" type="button" class="WkitButton WkitButtonleft icon-retweet" title="Fill the screen with randomly chosen items.\nPermits to be quized on randomly picked items.\nClick again to return to whole table."></button>' +
'<button id="WkitDateOrdering" type="button" class="WkitButton WkitButtonleft icon-sort-by-attributes" title="Toggles the ordering of items by date and time.\nEnables navigation over time ranges.\nPermits to be quized on items selected by date.\nClick again to return to whole table,"></button>' +
'</div>' +
'<p class="WkitTitle"><b>Wanikani Item Inspector</b></p>' +
'<div class="WkitControlRight">'+
'<button id="WkitDocumentation"type="button" class="WkitButton WkitButtonRight" title="Go to Item Inspector Page" style="font-size:22px; font-weight: bold; padding: 4px"><a href="'+helpURL+'" target="_blank">?</a></button>' +
'<button id="WkitSettings" type="button" class="WkitButton WkitButtonRight icon-gear" title="Settings" style="font-size:20px;"></button>' +
'<button id="WkitWordExport" type="button" class="WkitButton WkitButtonRight icon-cloud" title="Export items\nSuitable for word clouds."></button>' +
'<button id="WkitExport" type="button" class="WkitButton WkitButtonRight" title="Export to format csv.\nSuitable for spreasheet, Anki and Kitsun." style="font-size:20px;">⇮</button>' +
'<button id="WkitQuizSelection" type="button" class="WkitButton WkitButtonRight icon-desktop" title="Quiz on items shown on the screen.\nUse navigation and random selection options\n to control which items are displayed."></button>' +
'<button id="WkitQuizTable" type="button" class="WkitButton WkitButtonRight icon-table" title="Quizzes on the whole table.\nWhen a random selection is activee quizzes on the selection."></button>' +
'</div>' +
'</div>' +
'</div>' +
'<div id="WkitDialogContainer" class="WkitDialogContainer">Text here for testing</div>' +
'<div id="leech_table">'+waitMessage+'</div>';
if (quiz.settings.position === undefined) {quiz.settings.position = 2};
let position = [".progress-and-forecast", '.progress-and-forecast', '.srs-progress', '.span12 .row', '.span12 .row:last-of-type',][quiz.settings.position];
if (quiz.settings.position == 0){
$(position).before(sectionContainer);
} else {
$(position).after(sectionContainer);
}
// insert the top block - must be separate from the sectionContainer to work around a bug
$('#WkitTopBar').append(topBlock); // must be appended - someone else may be there due to the bug
formatControlBar();
populateDropdown();
};
function populateDropdown(){
// Populate the dropdown with the configured tables
let activeTable = quiz.settings.active_ipreset;
var tableList = '';
var ipresets = quiz.settings.ipresets;
for (var table of ipresets) {
tableList += '<option>' + table.name.replace(/</g,'<').replace(/>/g,'>') +'</option>'
};
var dropdown = $('#WkitTableSelector');
dropdown.html(tableList);
$('#WkitTableSelector').prop('selectedIndex',activeTable);
};
function formatControlBar (){
if (quiz.settings.tablePresets[quiz.settings.active_ipreset].displayMeaning){$('#WkitToogleLanguage').html('字')} else {$('#WkitToogleLanguage').html('<span class="WkitEnglishButton">E</span>')};
if (quiz.settings.audioMode){$('#WkitToogleAudio').html('<span style="padding-left: 2px;">▶</span>')} else {$('#WkitToogleAudio').html('<span style="text-decoration: underline; font-size: 18px; padding-bottom: 8px; padding-left: 0px;">L</span>')};
};
function eventHandlers() {
/* Define the button actions. Must be done when the DOC is completed */
$("#WkitFirstButton").click(clickedFirst);
$("#WkitBackwardButton").click(clickedBackward);
$("#WkitForwardButton").click(clickedForward);
$("#WkitLastButton").click(clickedLast);
$('#WkitTableSelector').change(selectTable);
$('#WkitToogleDisplay').click(toggleDisplay);
$('#WkitToogleLanguage').click(toggleLanguage);
$('#WkitToogleAudio').click(toggleAudio);
$('#WkitRandomSelection').click(toggleRandomSelection);
$('#WkitDateOrdering').click(toggleDateOrdering);
$('#WkitQuizTable').click(quizOnWholeTable);
$('#WkitQuizSelection').click(quizOnSelection);
$("#WkitWordExport").click(fillClipboard);
$("#WkitExport").click(exportTable);
$("#WkitSettings").click(open_settings_dialog);
};
//------------------------------------------
// Starting the program
// at the end to ensure the global variables are defined
//------------------------------------------
var notSelfStudyQuiz = false;
function check_Self_Study_Quiz(){
if ($('#selfstudyquiz_script_link a').length === 0) {
script_name = 'Wanikani Item Inspector';
response = confirm(script_name + ' requires Self Study Quiz\n Click "OK" to be forwarded to installation instructions.');
if (response) {
window.location.href = 'https://community.wanikani.com/t/userscript-self-study-quiz/13191';
};
} else {
notSelfStudyQuiz = true;
}
};
var notAdditionalFilters = false;
function check_additional_filters(){
if (!window.wkof.ItemData.registry.sources.wk_items.filters.additionalFilters_leechTraining) {
script_name = 'Wanikani Item Inspector';
response = confirm(script_name + ' requires WaniKani Open Framework Additional Filters.\nIf you have already installed it please enable the filters in the settings.\n Click "OK" to be forwarded to installation instructions.');
if (response) {
window.location.href = 'https://community.wanikani.com/t/userscript-wanikani-open-framework-additional-filters-recent-lessons-leech-training-related-items-and-more/30512';
};
} else {
notAdditionalFilters = true;
}
};
function initSequence(){
if (notAdditionalFilters && notSelfStudyQuiz){
install_css();
install_menu();
init_settings();
setup_quiz_settings();
wkof.Settings.load(scriptId)
.then( function(){
init_settings();
add_defaults();
table_css();
registerItemInspectorFilter();
initCurrentItem();
setNumberOfLines();
insertContainer();
eventHandlers();
dataReload('table');
dataReady = true;
})
}
}
wkof.include('ItemData, Menu, Settings');
wkof.ready('ItemData, Menu, Settings')
.then(function(){wkof.wait_state('additionalFilters', 'ready')})
.then(check_additional_filters)
.then(function(){wkof.wait_state('ss_quiz', 'ready')})
.then(check_Self_Study_Quiz)
.then(initSequence)
// Handy little function that rfindley wrote. Checks whether the theme is dark.
function is_dark_theme() {
// Grab the <html> background color, average the RGB. If less than 50% bright, it's dark theme.
return $('body').css('background-color').match(/\((.*)\)/)[1].split(',').slice(0,3).map(str => Number(str)).reduce((a, i) => a+i)/(255*3) < 0.5;
}
})();