const series_history={DB:new Dexie("ts_an_history"),init:function(){if(this.DB.version(1).stores({history:"++id,series_id,&episode_id,timestamp",series_timestamp:"++id,&series_id,hits,timestamp"}),"undefined"!=typeof ts_config){var e=ts_config.series_history&&ts_config.series_history.item;e&&e.mid&&e.cid&&e.c&&e.s&&e.t&&this.push(e.mid,e.cid,e.s,e.t,e.c)}},push:async function(e,t,i,s,r){const o=await this.DB.history.where("episode_id").equals(t).first();o?this.DB.history.put({id:o.id,series_id:parseInt(e),episode_id:parseInt(t),episode_label:r,timestamp:(new Date).getTime()}):this.DB.history.add({series_id:parseInt(e),episode_id:parseInt(t),episode_label:r,timestamp:(new Date).getTime()});var n=await this.DB.series_timestamp.where("series_id").equals(e).first();n?this.DB.series_timestamp.put({id:n.id,series_id:parseInt(e),hits:n.hits+1,timestamp:(new Date).getTime(),title:i,thumbnail:s}):this.DB.series_timestamp.add({series_id:parseInt(e),hits:1,timestamp:(new Date).getTime(),title:i,thumbnail:s}),this.deleteOldEpisodes(e)},getEpisodesOfSeries:async function(e,t,i){e=parseInt(e);var s=this.DB.history.where("series_id").equals(e);return i&&(s=s.offset(i)),t&&(s=s.limit(t)),(s=s.reverse()).sortBy("timestamp")},getAllEpisodes:async function(e,t){var i=this.DB.history.orderBy("timestamp");return t&&(i=i.offset(t)),e&&(i=i.limit(e)),i=(i=i.reverse()).toArray()},getAllSeries:async function(e,t){var i=this.DB.series_timestamp.orderBy("timestamp");return t&&(i=i.offset(t)),e&&(i=i.limit(e)),i=(i=i.reverse()).toArray()},deleteOldEpisodes:async function(e){e=parseInt(e);var t=10,i=30,s=ts_config&&ts_config.series_history&&ts_config.series_history.config;s&&s.minEpisodesPerSeries&&s.maxEpisodeAgeInDays&&(t=s.minEpisodesPerSeries,i=s.maxEpisodeAgeInDays);if(await this.DB.history.where("series_id").equals(e).count()<=t)return;const r=(new Date).getTime()-24*i*60*60*1e3,o=await this.DB.history.where("series_id").equals(e).and((e=>e.timestamp<r)).toArray();if(o.length>0)for(const e of o)await this.deleteEpisode(e.id)},deleteEpisode:async function(e){await this.DB.history.where("id").equals(e).delete()},getAllEpisodesDistinct:async function(e,t){var i=await this.getAllSeries(e,t),s=[];for(let e=0;e<i.length;e++){let t=i[e].series_id,r=await this.getEpisodesOfSeries(t,1);r.length>0&&s.push(r[0])}return s}};series_history.init();const TS_SeriesHistoryBackup={backup:async function(){try{const e={},t=series_history.DB.tables;await Promise.all(t.map((async t=>{const i=t.name;e[i]=await t.toArray()})));return JSON.stringify(e)}catch(e){TS_SeriesHistoryLog.write(ts_config.lang.history_export_error+": "+e,"red")}},download:async function(){try{var e=await this.backup(),t=JSON.parse(e);if(!e||0===t.history.length||0===t.series_timestamp.length)return void TS_SeriesHistoryLog.write(ts_config.lang.history_export_error_empty,"red");var i=`${window.location.hostname||"history-backup"}-history-${(new Date).toISOString().slice(0,10)}.json`,s=document.createElement("a");s.setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(e)),s.setAttribute("download",i),s.style.display="none",document.body.appendChild(s),s.click(),document.body.removeChild(s),TS_SeriesHistoryLog.write(ts_config.lang.history_export_success,"green")}catch(e){TS_SeriesHistoryLog.write(ts_config.lang.history_export_error+": "+e,"red")}},init:function(){if(ts_config&&ts_config.series_history&&ts_config.series_history.page&&ts_config.series_history.page.allowExportImport){var e=document.querySelector("#export-history");e&&e.addEventListener("click",(()=>{confirm(ts_config.lang.history_export_confirm)&&this.download()}))}}};document.addEventListener("DOMContentLoaded",(()=>{TS_SeriesHistoryBackup.init()}));const TS_SeriesHistoryRestorer={readFile:function(e){return new Promise(((t,i)=>{const s=new FileReader;s.onload=e=>{t(e.target.result)},s.onerror=e=>{i(e)},s.readAsText(e)}))},checkPostExist:async function(e){return new Promise((async(t,i)=>e&&e.id?void jQuery.post(ts_config.general.ajaxurl,{action:"ts_history_import_validate",data:e}).done((function(e){"success"===e.status?t(!0):t(!1)})).fail((function(e){i(!1)})):i(!1)))},checkImportedHistory:async function(e){return new Promise((async(t,i)=>{if(!e||!e.history||!e.series_timestamp)return i(!1);if(0===e.history.length||0===e.series_timestamp.length)return i(!1);const s=e=>e[Math.floor(Math.random()*e.length)];let r=s(e.history),o=s(e.series_timestamp);console.log(r),console.log(o);var n=await TS_SeriesHistoryRestorer.checkPostExist(r),a=await TS_SeriesHistoryRestorer.checkPostExist(o);console.log(n),console.log(a),t(n&&a)}))},handleFileUpload:async function(e){try{const t=await this.readFile(e);let i=null;if(!t)return void TS_SeriesHistoryLog.write(ts_config.lang.history_import_error_empty,"red");try{i=JSON.parse(t)}catch(e){return void TS_SeriesHistoryLog.write(ts_config.lang.history_import_error_empty,"red")}if(!i||0===i.history.length||0===i.series_timestamp.length)return void TS_SeriesHistoryLog.write(ts_config.lang.history_import_error_empty,"red");if(0!=ts_config.series_history.page.importValidationAction){if(!await TS_SeriesHistoryRestorer.checkImportedHistory(i)){if(1==ts_config.series_history.page.importValidationAction)return void TS_SeriesHistoryLog.write(ts_config.lang.history_import_error_validation,"red");if(2!=ts_config.series_history.page.importValidationAction)return void TS_SeriesHistoryLog.write(ts_config.lang.history_import_error_validation,"red");if(!window.confirm(ts_config.lang.history_import_confirm_validation_error))return void TS_SeriesHistoryLog.write(ts_config.lang.history_import_cancelled,"red")}}if(window.confirm(ts_config.lang.history_import_confirm)){const e=series_history.DB.tables;await Promise.all(Object.keys(i).map((async t=>{const s=e.find((e=>e.name===t));if(s){await s.clear();let e=i[t];await TS_SeriesHistoryRestorer.addDataToTable(s,e)}}))),TS_SeriesHistoryLog.write(ts_config.lang.history_import_success,"green"),setTimeout((function(){window.location.reload()}),1e3)}else TS_SeriesHistoryLog.write(ts_config.lang.history_import_cancelled,"red")}catch(e){TS_SeriesHistoryLog.write(ts_config.lang.history_import_error+": "+e,"red")}},escapeHTML:function(e){return(e=e.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'")).replace(/[&<>"']/g,(function(e){return{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[e]}))},escapeObjectStrings:function(e){let t={};for(let i in e)"string"==typeof e[i]?t[i]=this.escapeHTML(e[i]):t[i]=e[i];return t},addDataToTable:async function(e,t){for(let a=0;a<t.length;a++){await new Promise((e=>setTimeout(e,10)));let c=this.escapeObjectStrings(t[a]),l=e.schema.indexes;var i=!0;for(let e of l)if(!c.hasOwnProperty(e.name)){i=!1,console.warn(`Key ${e.name} not found in data.`);break}if(i){var s=!1;for(let e in c)if(c.hasOwnProperty(e)){let t;if(t="string"==typeof c[e]||Array.isArray(c[e])?c[e].length:c[e]instanceof Blob?c[e].size:"object"==typeof c[e]&&null!==c[e]?Object.keys(c[e]).length:"number"==typeof c[e]||"bigint"==typeof c[e]?c[e].toString().length:"boolean"==typeof c[e]?(c[e]?"true":"false").length:null===c[e]?4:void 0===c[e]?9:"symbol"==typeof c[e]?c[e].toString().length:0,t>1e3){s=!0,console.warn(`Key ${e} is too large.`);break}}if(!s){await e.add(c),document.getElementById("import-upload").style.display="none";var r=(a+1)/t.length*100;r=parseInt(r);var o=ts_escapeHTML(e.name),n=ts_config.lang.history_import_progress;n=(n=n.replace("{{table}}",o)).replace("{{percentage}}",r),TS_SeriesHistoryLog.write(n,"green")}}}},init:function(){if(!ts_config||!ts_config.series_history||!ts_config.series_history.page)return;if(!ts_config.series_history.page.allowExportImport)return;var e=document.querySelector("#import-history");e&&e.addEventListener("click",(()=>{var e=document.querySelector("#import-upload");"none"==e.style.display?e.style.display="block":e.style.display="none"}));const t=document.getElementById("import-upload");t?t.addEventListener("change",(async e=>{const t=e.target.files[0];t&&await this.handleFileUpload(t)})):console.error('File input element with ID "import-upload" not found.')}};document.addEventListener("DOMContentLoaded",(()=>{TS_SeriesHistoryRestorer.init()}));const TS_SeriesHistoryLog={write:function(e,t){var i=document.querySelector("#imex-notices");i.innerHTML=e,i.style.color=t,i.style.display="block"}},TS_SeriesHistoryWidget={init:function(){this.getAll()},generate:function(e,t,i){const s=document.querySelector(`#list-${e}`);if(s){let r=null;console.log(i),r=i?series_history.getAllEpisodesDistinct(t):series_history.getAllEpisodes(t),r.then((async t=>{if(t.length<1)return void(document.querySelector(`.ts-series-history-widget[data-id=${e}]`).parentNode.style.display="none");let i="";for(let e=0;e<t.length;e++){let s=`${ts_config.series_history.widget.tpl}`;const r=t[e],o=await series_history.DB.series_timestamp.where("series_id").equals(r.series_id).first();if(!o)continue;let n={series_id:ts_escapeHTML(r.series_id),episode_id:ts_escapeHTML(r.episode_id),series_url:`${ts_config.general.site_url}?p=${ts_escapeHTML(r.series_id)}`,series_name:ts_escapeHTML(o.title),series_thumbnail:ts_escapeHTML(o.thumbnail),episode_url:`${ts_config.general.site_url}?p=${ts_escapeHTML(r.episode_id)}`,episode_label:ts_config.lang.widget_episode_label,episode_number:ts_escapeHTML(r.episode_label),time:jQuery.timeago(r.timestamp)};n=Hooks.apply_filters("widget-series-history>>data",n,r,o);for(let e in n)s=s.replace(new RegExp(`{{${e}}}`,"g"),n[e]);i+=s}s.innerHTML=i;var r=window.localStorage.getItem("an_series_history");(r=r?JSON.parse(r):{})[e]=i,window.localStorage.setItem("an_series_history",JSON.stringify(r))}))}},getAll:function(){document.querySelectorAll(".ts-series-history-widget").forEach((e=>{const t=e.getAttribute("data-id"),i=e.getAttribute("data-total");let s=e.getAttribute("data-distinct");s=0!=s&&"0"!=s&&""!=s,t&&i&&(this.generate(t,i,s),this.events(t))}))},events:function(e){const t=document.querySelector(`#list-${e}`);t.addEventListener("click",(e=>{let t=e.target.closest(".ts-history-item");t&&TS_SeriesHistoryWidget.redirect(t)})),t.addEventListener("mouseout",(e=>{let t=e.target.closest(".ts-history-item");t&&TS_SeriesHistoryWidget.restore(t)}))},redirect:function(e){if(!e)return!1;var t=e.getAttribute("data-id");if(!t)return!1;e.href=`${ts_config.general.site_url}?p=${t}`},restore:function(e){if(!e)return!1;e.href="#/"}};document.addEventListener("DOMContentLoaded",(()=>{TS_SeriesHistoryWidget.init()}));const TS_SeriesHistoryPage={container:document.querySelector("#history-pool"),current_page:1,total_history:null,init:async function(){ts_config.series_history&&ts_config.series_history.page&&(this.pagination(),this.imageEvent())},imageEvent:function(){if(ts_config&&ts_config.series_history&&ts_config.series_history.page&&ts_config.series_history.page.noImage){var e=document.querySelector("#history-pool");e&&e.addEventListener("error",(function(e){if("ts-history-image"===e.target.className){if(e.target.src===ts_config.series_history.page.noImage)return;e.target.src=ts_config.series_history.page.noImage}}),!0)}},scrollToTop:function(){var e=document.querySelector("#ts-import-export");e||(e=document.querySelector("#history-pool")),e&&e.scrollIntoView({behavior:"smooth",block:"start",inline:"nearest"})},pagination:async function(){TS_SeriesHistoryPage.total_history||(2==ts_config.series_history.page.style?TS_SeriesHistoryPage.total_history=await series_history.DB.series_timestamp.count():TS_SeriesHistoryPage.total_history=await series_history.DB.history.count());var e=ts_config.series_history.page.perpage,t={dataSource:new Array(TS_SeriesHistoryPage.total_history),pageSize:e,autoHidePrevious:!1,autoHideNext:!1,callback:function(e,t){t.pageNumber!=TS_SeriesHistoryPage.current_page&&TS_SeriesHistoryPage.scrollToTop(),TS_SeriesHistoryPage.current_page=t.pageNumber,TS_SeriesHistoryPage.generate(),TS_SeriesHistoryPage.events()}};t=Hooks.apply_filters("TS_SeriesHistoryPage>>pagination_config",t),jQuery("#ts-history-pagination").pagination(t)},generate:function(){var e=ts_config.series_history.page.perpage,t=(TS_SeriesHistoryPage.current_page-1)*e;if(2==ts_config.series_history.page.style)var i=series_history.getAllSeries(e,t);else i=series_history.getAllEpisodes(e,t);i.then((async e=>{if(TS_SeriesHistoryPage.total_history<1)return void(TS_SeriesHistoryPage.container.innerHTML=ts_config.lang.history_page_no_item);let t="";for(let i=0;i<e.length;i++){let s=`${ts_config.series_history.page.template.main}`;const r=e[i],o=await series_history.DB.series_timestamp.where("series_id").equals(r.series_id).first();for(let e in r)r.hasOwnProperty(e)&&(s=s.replace(new RegExp(`{{episode.${e}}}`,"g"),ts_escapeHTML(r[e])));for(let e in o)o.hasOwnProperty(e)&&(s=s.replace(new RegExp(`{{series.${e}}}`,"g"),ts_escapeHTML(o[e])));s=s.replace(new RegExp("{{time}}","g"),jQuery.timeago(r.timestamp)),s=s.replace(new RegExp("{{episode_label}}","g"),ts_config.lang.history_page_episode_label),s=await TS_SeriesHistoryPage.style_hook[ts_config.series_history.page.style](s,r,o),s=Hooks.apply_filters("TS_SeriesHistoryPage>>tpl",s,r,o),t+=s}TS_SeriesHistoryPage.container.classList.remove("ts-loading"),TS_SeriesHistoryPage.container.innerHTML=t}))},style_hook:{1:async function(e,t,i){return e},2:async function(e,t,i){const s=await series_history.getEpisodesOfSeries(t.series_id,3);var r="";for(let e in s){t=s[e];var o=`${ts_config.series_history.page.template.episode}`;for(let e in i)i.hasOwnProperty(e)&&(o=o.replace(new RegExp(`{{series.${e}}}`,"g"),ts_escapeHTML(i[e])));for(let e in t)t.hasOwnProperty(e)&&(o=o.replace(new RegExp(`{{episode.${e}}}`,"g"),ts_escapeHTML(t[e])));r+=o=(o=o.replace(new RegExp("{{episode_label}}","g"),ts_config.lang.history_page_episode_label)).replace(new RegExp("{{time}}","g"),jQuery.timeago(t.timestamp))}return e=e.replace(new RegExp("{{episodes}}","g"),r)}},redirect:function(e){if(!e)return!1;var t=e.getAttribute("data-id");if(!t)return!1;e.href=`${ts_config.general.site_url}?p=${t}`},restore:function(e){if(!e)return!1;e.href="#/"},events:function(){this.container.addEventListener("click",(e=>{let t=e.target.closest(".ts-history-item");t&&TS_SeriesHistoryPage.redirect(t)})),this.container.addEventListener("mouseout",(e=>{let t=e.target.closest(".ts-history-item");t&&TS_SeriesHistoryPage.restore(t)}));var e=document.querySelector("#ts-import-export #clear-history");e&&e.addEventListener("click",(()=>{confirm(ts_config.lang.history_wipe_all_confirm)&&(series_history.DB.history.clear(),series_history.DB.series_timestamp.clear(),setTimeout((function(){window.location.reload()}),1e3))}))}};document.addEventListener("DOMContentLoaded",(()=>{TS_SeriesHistoryPage.init()}));const TS_SeriesEpisodeHistory={container:document.querySelector("#ts-episode-history"),init:function(){ts_config&&ts_config.series_history&&ts_config.series_history.latest&&ts_config.series_history.latest.enabled&&this.container&&(this.generate(),this.events())},generate:async function(){var e=ts_config.series_history.latest.template,t=ts_config.series_history.latest.total,i=ts_config.series_history.latest.series_id,s=await series_history.getEpisodesOfSeries(i,t),r="";for(let t in s){var o=s[t],n=e;for(let e in o)o.hasOwnProperty(e)&&(n=n.replace(new RegExp(`{{${e}}}`,"g"),ts_escapeHTML(o[e])));var a=ts_config.lang.history_series_latest_episode_item;a=a.replace(new RegExp("{{episode_number}}","g"),ts_escapeHTML(o.episode_label)),n=(n=n.replace(new RegExp("{{episode_title}}","g"),a)).replace(new RegExp("{{time}}","g"),jQuery.timeago(o.timestamp)),r+=n=Hooks.apply_filters("TS_SeriesEpisodeHistory>>tpl",n,o)}if(!r.length)return;this.container.innerHTML=r,this.container.style.display="block";let c=this.container.closest(".bixbox");c&&(c.style.display="block")},events:function(){this.container.addEventListener("click",(e=>{let t=e.target.closest(".ts-latest-history-item");t&&TS_SeriesEpisodeHistory.redirect(t)})),this.container.addEventListener("mouseout",(e=>{let t=e.target.closest(".ts-latest-history-item");t&&TS_SeriesEpisodeHistory.restore(t)}))},redirect:function(e){if(!e)return!1;var t=e.getAttribute("data-id");if(!t)return!1;e.href=`${ts_config.general.site_url}?p=${t}`},restore:function(e){if(!e)return!1;e.href="#/"}};document.addEventListener("DOMContentLoaded",(()=>{TS_SeriesEpisodeHistory.init()}));