NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name KissAnimeList // @version 0.92.8 // @description Integrates MyAnimeList into various sites, with auto episode tracking. // @author lolamtisch@gmail.com // @license CC-BY-4.0; https://creativecommons.org/licenses/by/4.0/legalcode // @license MIT // @supportURL https://github.com/lolamtisch/KissAnimeList/issues // @homepageURL https://github.com/lolamtisch/KissAnimeList // @iconURL https://raw.githubusercontent.com/lolamtisch/KissAnimeList/dev/Screenshots/KAL_Logo.png // @downloadURL https://greasyfork.org/scripts/27564-kissanimelist/code/KissAnimeList.user.js // @updateURL https://greasyfork.org/scripts/27564-kissanimelist/code/KissAnimeList.meta.js // // @include /^https?:\/\/kissanime\.ru\/(Anime\/|BookmarkList)/ // @include /^https?:\/\/kissanime\.to\/(Anime\/|BookmarkList)/ // // @include /^https?:\/\/kissmanga\.com\/(manga\/|BookmarkList)/ // // @include /^https?:\/\/myanimelist.net\/((anime(list)?|manga(list)?)(\.php\?.*id=|\/)|character|people|search)/ // // @include /^https?://www.masterani.me\/anime\/(info|watch)\// // // @include /^https?:\/\/(w+.?\.)?9anime\.to\/watch\// // @include /^https?:\/\/(w+.?\.)?9anime\.is\/watch\// // @include /^https?:\/\/(w+.?\.)?9anime\.ru\/watch\// // @include /^https?:\/\/(w+.?\.)?9anime\.ch\/watch\// // // @include /^https?:\/\/(www\.)?crunchyroll.com\// // @exclude /^https?:\/\/(www\.)?crunchyroll.com\/($|acct|anime|comics|edit|email|forum|home|inbox|library|login|manga|newprivate|news|notifications|order|outbox|pm|search|store|user|videos|affiliate_iframeplayer)/ // // @include /^https?:\/\/(w+.?\.)?gogoanime\.tv\/([^/]+$|category\/)/ // @include /^https?:\/\/(w+.?\.)?gogoanime\.io\/([^/]+$|category\/)/ // @include /^https?:\/\/(w+.?\.)?gogoanime\.in\/([^/]+$|category\/)/ // @include /^https?:\/\/(w+.?\.)?gogoanime\.se\/([^/]+$|category\/)/ // @include /^https?:\/\/(w+.?\.)?gogoanime\.sh\/([^/]+$|category\/)/ // @exclude /^https?:\/\/(w+.?\.)?gogoanime\.(tv|io|in|se|sh)\/(.*.html|anime-List)/ // // @include /^https?:\/\/(w+.?\.)?mangadex\.org\/(manga|title|chapter)\// // // @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js // @resource materialCSS https://code.getmdl.io/1.3.0/material.indigo-pink.min.css // @resource materialFont https://fonts.googleapis.com/icon?family=Material+Icons // @resource materialjs https://code.getmdl.io/1.3.0/material.min.js // @resource simpleBarCSS https://unpkg.com/simplebar@latest/dist/simplebar.css // @resource simpleBarjs https://unpkg.com/simplebar@latest/dist/simplebar.js // // @connect www.google.com // @connect ipv4.google.com // @connect myanimelist.net // @connect kissanimelist.firebaseio.com // @connect www.crunchyroll.com // @connect kissanime.ru // @connect kissmanga.com // @connect 9anime.to // @connect 9anime.is // @connect 9anime.ru // @connect 9anime.ch // @connect www3.gogoanime.tv // @connect www.masterani.me // @connect mangadex.org // @connect www.mangadex.org // @connect * // @grant GM_xmlhttpRequest // @grant GM_getValue // @grant GM_setValue // @grant GM_listValues // @grant GM_deleteValue // @grant GM_addStyle // @grant GM_getResourceText // @grant GM_openInTab // @grant GM_notification // @run-at document-start // @namespace https://greasyfork.org/users/92233 // ==/UserScript== (function() { 'use strict'; //if (window.top != window.self) {return; } //TODO: temporary workaround var googleover = 0; var debug = 0; var con = console; con = { log: function() {}, error: function() {}, debug: function() {} }; var element = new Image(); var debugging = GM_getValue('debugging', 0 ); if(debugging){ debug = 1; con.log = function(){ var args = Array.prototype.slice.call(arguments); args.unshift("color: blue;"); args.unshift("%c[KAL]"); console.log.apply(console, args); } }else{ Object.defineProperty(element, 'id', { get: function () { debug = 1; con.log = function(){ var args = Array.prototype.slice.call(arguments); args.unshift("color: blue;"); args.unshift("%c[KAL]"); console.log.apply(console, args); } } }); } console.log('%cKissAnimeList ['+GM_info.script.version+']', element,); var malBookmarks = GM_getValue( 'malBookmarks', 1 ); var classicBookmarks = GM_getValue( 'classicBookmarks', 0 ); if(classicBookmarks === 0){ var BookmarksStyle = 1; } var tagLinks = GM_getValue( 'tagLinks', 1 ); var epPredictions = GM_getValue( 'epPredictions', 1 ); var newEpInterval = GM_getValue( 'newEpInterval', 'null' ); var newEpNotification = GM_getValue( 'newEpNotification', 1 ); var newEpBorder = GM_getValue( 'newEpBorder', 'ff0000' ); var openInBg = GM_getValue( 'openInBg', 1 ); var newEpCR = GM_getValue( 'newEpCR', 0 ); var searchLinks = GM_getValue( 'searchLinks', 1 ); var kissanimeLinks = GM_getValue( 'kissanimeLinks', 1 ); var kissmangaLinks = GM_getValue( 'kissmangaLinks', 1 ); var masteraniLinks = GM_getValue( 'masteraniLinks', 1 ); var nineanimeLinks = GM_getValue( 'nineanimeLinks', 1 ); var crunchyrollLinks = GM_getValue( 'crunchyrollLinks', 1 ); var gogoanimeLinks = GM_getValue( 'gogoanimeLinks', 1 ); var mangadexLinks = GM_getValue( 'mangadexLinks', 1 ); var malThumbnail = GM_getValue( 'malThumbnail', 100 ); var miniMALonMal = GM_getValue( 'miniMALonMal', 0 ); var posLeft = GM_getValue( 'posLeft', 'left' ); var outWay = GM_getValue( 'outWay', 1 ); var miniMalWidth = GM_getValue( 'miniMalWidth', '30%' ); var miniMalHeight = GM_getValue( 'miniMalHeight', '90%' ); var displayFloatButton = GM_getValue( 'displayFloatButton', 1 ); var episodeInfoBox = GM_getValue( 'episodeInfoBox', 0 ); var episodeInfoSynopsis = GM_getValue( 'episodeInfoSynopsis', 1 ); var episodeInfoImage = GM_getValue( 'episodeInfoImage', 1 ); var episodeInfoSubtitle = GM_getValue( 'episodeInfoSubtitle', 1 ); var autoTracking = GM_getValue( 'autoTracking', 1 ); var mangaStore = GM_getValue( 'mangaStore', 1 ); var delay = GM_getValue( 'delay', 3 ); var currentMalData = null; var loadingText = 'Loading'; var curVersion = GM_info.script.version; function changelog(){ if(GM_getValue( 'VersionStamp', null ) == null || ($.now() - GM_getValue( 'VersionStamp', null )) > 345600000){ GM_deleteValue('Version'); GM_setValue('VersionStamp', $.now()); } if(curVersion != GM_getValue( 'Version', null )){ var message = '<div style="text-align: left;">'; if(GM_getValue( 'Version', null ) != null){ switch(curVersion) { case '0.86.4': message += 'Kissanimelist (v0.86)<br/>- 9anime Support<br/>- Link to last streaming page on Myanimelist\'s Animelist (Tags have to be activated)'; break; case '0.86.5': message += 'Kissanimelist (v0.86.5)<br/>- add config Page (Can be found in Mal profile settings)'; break; case '0.87.1': message += 'Kissanimelist (v0.87.1)<br/>- Materialize UI<br/>- Add miniMAL popup'; break; case '0.87.3': message += 'Kissanimelist (v0.87.3)<br/>- Crunchyroll Support (Video page only)<br/>- Added MAL classic bookmark support<br/>- Added next episode links in MAL bookmarks'; break; case '0.87.8': message += 'Kissanimelist (v0.87.8)<br/>- Android Support<br/>- Added Autoupdate delay settings'; break; case '0.87.9': message += 'Kissanimelist (v0.87.9)<br/>- Gogoanime Support<br/>- Crunchyroll multiple season support'; break; case '0.89.0': message += 'Check out the new <a href="https://discord.gg/cTH4yaw">Discord channel</a>!<br/><br/>Kissanimelist (v0.89.0)</br>- Add Search to miniMAL</br>- Add MyAnimeList Bookmarks to miniMAL</br>- MyAnimeList Tags don\'t need to be activated anymore</br>- Mal2Crunchyroll links now hides remaining seasons</br>'; break; case '0.90.0': message += 'Changelog (v0.90.0):<br/> - Added a shortcut for MiniMAL ( CTRL + M )<br/> - Added MiniMAL position and dimension settings<br/> - Added an option for displaying \'Episode Hoverinfo\'<br/> - Added miniMAL to MyAnimeList<br/> - Changed the \'Add to Mal\'-message, to a non-blocking message<br/> - Fixed the database structure<br/><br/>New on KissAnimeLists <a href="https://discord.gg/cTH4yaw">Discord</a>:<br/> - Feed showing newly added episodes for each of the supported streaming sites.'; break; case '0.90.2': message += 'KissAnimeList (v0.90.2):<br/> - Added support for 9anime.is and 9anime.ru'; break; case '0.91.0': message += 'Changelog (v0.91.0):<br/><br/> [Added] <br/> - Feature: Thumbnails on MAL have been enlarged, with added resizing options. <br/> - Feature: "Move out of the way"-feature, which moves the video when miniMAL is opened. <br/> - Feature: "Continue watching"-links has been added to both the Overview-tab in miniMAL, and to the details-tab on MAL. <br/> - Info-bubbles has been added to the settings tab in miniMAL. <br/><br/> [Changed] <br/> - Updated the miniMAL styling. <br/><br/> [Fixed] <br/> - miniMAL-button didn\'t always appear.'; break; case '0.91.1': message += 'KissAnimeList (v0.91.1):<br/><br/> [Fixed] <br/> - KAL now works with 9anime\'s new layout'; break; case '0.91.2': message += 'KissAnimeList (v0.91.2):<br/><br/> [Fixed] <br/> - New database-structure for 9anime urls'; break; case '0.91.3': message += 'KissAnimeList (v0.91.3):<br/><br/> [Fixed] <br/> - Improved title recognition on 9anime & MasterAnime'; break; case '0.91.4': message += 'KissAnimeList (v0.91.4):<br/><br/> [Added] <br/> - Support for 9anime.ch <br/> <br/> [Fixed] <br/> - "MAL thumbnails" and "Episode Hoverinfo" not working in Opera <br/> - The miniMAL-button was not appearing for anime\'s without a MAL-url'; break; case '0.92.1': message += 'KissAnimeList (v0.92.0):<br/><br/> [Added] <br/>- Feature: Display a tentative episode number and air time for anime. <br/>- Feature: If autotracking is deactivated - Display a popup for manually updating <br/>- Mangalist integration <br/>- Added a section for characters to miniMAL. <br/>- Added anime/manga switches for miniMAL\'s search and bookmarks <br/>- Feature: Episode/Chapter releases check [BETA] (Deactivated by default) <br/> '; break; case '0.92.5': message += 'KissAnimeList (v0.92.5):<br/><br/> [Added] <br/>- Feature: mangadex.org support <br/>- Feature: Hide MALs Manga Store'; break; } }else{ message += '<h2 style="color: rgb(255,64,129); font-size: 18px;">Important</h2><br/>This is going to be the last release for KissAnimeList.<br/>Please migrate to the rewrite MAL-Sync.<br/>It now comes as a browser extension, but you can still get a userscript version.<br/><br/><a href="https://chrome.google.com/webstore/detail/mal-sync/kekjfbackdeiabghhcdklcdoekaanoel?hl=en">Chrome</a><br/><a href="https://addons.mozilla.org/en-US/firefox/addon/mal-sync/">Firefox</a><br/><a href="https://greasyfork.org/de/scripts/372847-mal-sync">Greasyfork</a>'; } if(message != '<div style="text-align: left;">'){ message += '</div><button class="okChangelog" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px;cursor: pointer;">Close</button>' flashm(message, false, false, true); $('.okChangelog').click(function(){ GM_setValue( 'Version', curVersion ); $('.flashPerm').remove(); }); }else{ GM_setValue( 'Version', curVersion ); } } } function getDeclaration(kalUrl){ var Kal = {}; if( kalUrl.indexOf("kissanime.ru") > -1 ){ //#########Kissanime######### Kal.domain = 'http://kissanime.ru'; Kal.textColor = '#d5f406'; Kal.dbSelector = 'Kissanime'; Kal.listType = 'anime'; Kal.bookmarkCss = ".listing tr td:nth-child(1){height: 150px;padding-left: 125px;} .listing tr td{vertical-align: top;}"; Kal.bookmarkFixCss = ".bigBarContainer {margin: 0px; width: 630px !important; text-align: left; float: left;}"; Kal.videoSelector = '#divContentVideo'; Kal.init = function() { checkdata(); } Kal.imageCache = function(selector) { return $('#rightside').find('img').attr('src'); }; Kal.isOverviewPage = function() { if(typeof kalUrl.split('/')[5] != 'undefined'){ if($('#centerDivVideo').length){ return false; } } return true; }; Kal.episodeListSelector = function() { return $(".listing a"); }; Kal.episodeListElementHref = function(selector) { return $.absoluteLink(selector.attr('href')); }; Kal.episodeListElementTitle = function(selector) { return selector.text().replace($('.bigChar').text(),''); }; Kal.episodeListNextElement = function(selector, index) { if ((index-1) > -1) { return Kal.episodeListSelector().eq(index-1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ return truelink; }; Kal.urlEpisodePart = function(url) { return url.split("/")[5].split("?")[0]; }; Kal.urlAnimeIdent = function(url) { return url.split('/').slice(0,5).join('/'); }; Kal.urlAnimeSelector = function(url) { return url.split("/")[4].split("?")[0]; }; Kal.urlAnimeTitle = function(url) { return Kal.urlAnimeSelector(url); }; Kal.EpisodePartToEpisode = function(string) { var temp = []; temp = string.match(/[e,E][p,P][i,I]?[s,S]?[o,O]?[d,D]?[e,E]?\D?\d{3}/); if(temp !== null){ string = temp[0]; } temp = string.match(/\d{3}/); if(temp === null){ temp = string.match(/\d{2,}\-/); if(temp === null){ string = 0; }else{ string = temp[0]; } }else{ string = temp[0]; } return string; }; Kal.uiPos = function(selector) { selector.insertAfter($(".bigChar").first()); }; Kal.uiWrongPos = function(selector) { selector.insertAfter($(".bigChar").first()); }; Kal.uiHeadPos = function(selector) { selector.appendTo($(".barTitle").first()); }; Kal.docReady = function(data) { return $( document).ready(data); }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.parent().parent().css("background-color","initial"); }; Kal.epListActive = function(selector) { selector.parent().parent().css("background-color","#002966"); }; Kal.bookmarkEntrySelector = function() { return $(".trAnime"); }; Kal.nextEpLink = function(url) { return url+'/'+$('#selectEpisode option:selected').next().val(); }; Kal.classicBookmarkButton = function(selector, checkClassic) { selector.before('<div><input type="checkbox" id="classicBookmarks" '+checkClassic+' > Classic styling</div><div class="clear2"> </div>'); }; Kal.bookmarkButton = function(selector, check) { selector.before('<div><input type="checkbox" id="malBookmarks" '+check+' > MyAnimeList Bookmarks</div><div class="clear2"> </div>'); }; Kal.BookmarksStyleAfterLoad = function() { if( BookmarksStyle == 1 ){ var optionsTarget = $("#optionsTarget"); var blackSpacer = ""; }else{ var optionsTarget = $("#divIsShared"); var blackSpacer = '<th id="endSpacer" width="36%" style="border: 0;">'; } $(".head").html('<th id="cssTableSet" style="min-width:120px;padding-right: 5px;"></th><th></th>'+blackSpacer+'</th>'); $( ".listing tr td:nth-child(1)" ).before("<td class='Timage' style='padding-left: 0;'></td>"); $( ".listing tr td:nth-child(1)" ).css("height","150px"); optionsTarget.after('<div class="clear2"> </div><div><button type="button" id="clearCache">Clear Cache</button></div>'); $("#clearCache").click( function(){ clearCache(); }); }; //########################### }else if( kalUrl.indexOf("kissmanga.com") > -1 ){ //#########Kissmanga######### Kal.domain = 'http://kissmanga.com'; Kal.textColor = '#72cefe'; Kal.dbSelector = 'Kissmanga'; Kal.listType = 'manga'; Kal.bookmarkCss = ".listing tr td:nth-child(1){height: 150px;padding-left: 125px;} .listing tr td{vertical-align: top;}"; if(classicBookmarks == 0){ Kal.bookmarkCss += '#leftside{width: 581px !important;} #rightside{ float: left !important; margin-left: 30px;}'; } Kal.bookmarkFixCss = ""; BookmarksStyle = ""; Kal.init = function() { Kal.docReady(function(){ if(!Kal.isOverviewPage()){ $('#divImage > p').each(function(index, el) { $(this).attr('id', index+1).addClass('kal-image'); }); var hash = window.location.hash; setTimeout(function(){ var page = parseInt(hash.substring(1)); if(!isNaN(page)){ window.location.hash = ''; window.location.hash = hash; } if($( "button:contains('Load Manga')" ).length){ $( "button:contains('Load Manga')").click(function(){ manga_loader(); }); } if($('.ml-images').length){ manga_loader(); } function manga_loader(){ setTimeout(function(){ var tempDocHeight = $(document).height(); if(hash && !(isNaN(page))) findPage(); function findPage(){ if($(".ml-images .ml-counter:contains('"+page+"')").length){ $("html, body").animate({ scrollTop: $(".ml-images .ml-counter:contains('"+page+"')").prev().offset().top }, "slow"); }else{ $("html, body").animate({ scrollTop: $(document).height() }, 0); setTimeout(function(){ $('html').scroll(); if(tempDocHeight != $(document).height()){ tempDocHeight = $(document).height(); findPage(); } }, 500); } } }, 2000); } var delayUpate = 1; $(document).scroll(function() { if(delayUpate){ delayUpate = 0; setTimeout(function(){ delayUpate = 1; }, 2000); $('.kal-image').each(function(index, el) { if($(this).isInViewport()){ if(window.location.hash != '#'+$(this).attr('id')){ history.pushState({}, null, '#'+$(this).attr('id')); checkdata(); } return false; } }); $('.ml-images img').each(function(index, el) { if($(this).isInViewport()){ if(window.location.hash != '#'+$(this).next().text()){ history.pushState({}, null, '#'+$(this).next().text()); checkdata(); } return false; } }); } }); }, 5000); } }); checkdata(); } Kal.imageCache = function(selector) { return $('#rightside').find('img').attr('src'); }; Kal.isOverviewPage = function() { if($("#malp").width() !== null){ return true; }else{ return false; } }; Kal.episodeListSelector = function() { return $(".listing a"); }; Kal.episodeListElementHref = function(selector) { return $.absoluteLink(selector.attr('href')); }; Kal.episodeListElementTitle = function(selector) { return selector.text().replace($('.bigChar').text(),''); }; Kal.episodeListNextElement = function(selector, index) { if ((index-1) > -1) { return Kal.episodeListSelector().eq(index-1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ return truelink; }; Kal.urlEpisodePart = function(url) { return url.split("/")[5].split("?")[0]; }; Kal.urlAnimeIdent = function(url) { return url.split('/').slice(0,5).join('/'); }; Kal.urlAnimeSelector = function(url) { return url.split("/")[4].split("?")[0]; }; Kal.urlAnimeTitle = function(url) { return Kal.urlAnimeSelector(url); }; Kal.EpisodePartToEpisode = function(string) { var temp = []; try{ string = string.replace($('.bigChar').attr('href').split('/')[2],''); }catch(e){string = string.replace(kalUrl.split("/")[4],'');} temp = string.match(/[c,C][h,H][a,A]?[p,P]?[t,T]?[e,E]?[r,R]?\D?\d+/); if(temp === null){ string = string.replace(/[V,v][o,O][l,L]\D?\d+/,''); temp = string.match(/\d{3}/); if(temp === null){ temp = string.match(/\d+/); if(temp === null){ string = 0; }else{ string = temp[0]; } }else{ string = temp[0]; } }else{ string = temp[0].match(/\d+/)[0]; } return string; }; Kal.urlVolumePart = function(url) { try{ url = url.match(/[V,v][o,O][l,L]\D?\d{3}/)[0]; url = url.match(/\d+/)[0].slice(-3); }catch(e){ url = 1; } return url; } Kal.uiPos = function(selector) { selector.insertAfter($(".bigChar").first()); }; Kal.uiWrongPos = function(selector) { selector.insertAfter($(".bigChar").first()); }; Kal.uiHeadPos = function(selector) { selector.appendTo($(".barTitle").first()); }; Kal.docReady = function(data) { return $( document).ready(data); }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.parent().parent().css("background-color","initial"); }; Kal.epListActive = function(selector) { selector.parent().parent().css("background-color","#002966"); }; Kal.bookmarkEntrySelector = function() { return $(".listing tr:not(.head)"); }; Kal.nextEpLink = function(url) { return window.location.href; }; Kal.classicBookmarkButton = function(selector, checkClassic) { $("#rightside .barContent div").last().after('<div><input type="checkbox" id="classicBookmarks" '+checkClassic+' > Classic styling</div><div class="clear2"> </div>'); }; Kal.bookmarkButton = function(selector, check) { $("#rightside .barContent div").last().after('<div class="clear2" style="border-bottom: 1px solid #DDD2A4;"> </div><div class="clear2"> </div><div><input type="checkbox" id="malBookmarks" '+check+' > MyAnimeList Bookmarks</div>'); }; Kal.BookmarksStyleAfterLoad = function() { $(".head").html('<th id="cssTableSet" style="min-width:120px;padding-right: 5px;"></th><th></th>');//<th width="21%" style=""></th>'); $( ".listing tr td:nth-child(1)" ).before("<td class='Timage' style='padding-left: 0;'></td>"); $( ".listing tr td:nth-child(1)" ).css("height","150px"); $("#rightside .barContent div").last().after('<div class="clear2"> </div><div><button type="button" id="clearCache">Clear Cache</button></div>'); $("#clearCache").click( function(){ clearCache(); }); }; //########################### }else if( kalUrl.indexOf("masterani.me") > -1 ){ //#########Masterani.me######### Kal.domain = 'https://www.masterani.me'; Kal.textColor = 'white'; Kal.dbSelector = 'Masterani'; Kal.listType = 'anime'; Kal.bookmarkCss = ""; Kal.bookmarkFixCss = ""; Kal.videoSelector = '.ui.embed'; var winLoad = 0; Kal.init = function() { checkdata(); } Kal.imageCache = function(selector) { return $('.class').first().find('img').attr('src'); }; Kal.isOverviewPage = function() { if(Kal.normalUrl().split('/')[4] !== 'watch'){ return true; }else{ return false; } }; Kal.episodeListSelector = function() { return $(".thumbnail a.title"); }; Kal.episodeListElementHref = function(selector) { return $.absoluteLink(selector.attr('href')); }; Kal.episodeListElementTitle = function(selector) { return selector.find("div").text()+' ('+selector.find("span").text()+')'; }; Kal.episodeListNextElement = function(selector, index) { if ((index+1) > -1) { return Kal.episodeListSelector().eq(index+1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ $('.menu.pagination').off('click').on( "click", function() { handleanime(anime); }); if(truelink == null){ var nextEp = parseInt(anime['.add_anime[num_watched_episodes]'])+1; if(nextEp <= parseInt(anime['totalEp'])){ return '<a style="color: white;" href="/anime/watch/'+Kal.normalUrl().replace(/#[^#]*$/, "").replace(/\?[^\?]*$/, "").split("/")[5]+'/'+nextEp+'">Ep. '+nextEp+'</a>'; } } return truelink; }; Kal.urlEpisodePart = function(url) { return url.split("/")[6].split("?")[0]; }; Kal.urlAnimeIdent = function(url) { return url.split('/').slice(0,6).join('/'); }; Kal.urlAnimeSelector = function(url) { return url.split("/")[5].split("?")[0]; }; Kal.urlAnimeTitle = function(url) { return Kal.urlAnimeSelector(url).replace(/^\d*-/,''); }; Kal.EpisodePartToEpisode = function(string) { return string; }; Kal.uiPos = function(selector) { selector.prependTo($("#stats").first()); }; Kal.uiWrongPos = function(selector) { selector.css('margin-top','5px').appendTo($(".ui.info.list").first()); }; Kal.uiHeadPos = function(selector) { selector.appendTo($("h1").first()); }; $(window).load(function(){ winLoad = 1; }); if(kalUrl.indexOf("/info/") > -1){ Kal.docReady = function(data) { var checkExist = setInterval(function() { if ($('#stats').length) { clearInterval(checkExist); if(winLoad == 0){ //winLoad = 1;alert(); return $(window).load(data); }else{ return $( document).ready(data); } } }, 500); }; }else{ Kal.docReady = function(data) { return $( document).ready(data); } }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.parent().parent().css("background-color","initial"); }; Kal.epListActive = function(selector) { selector.parent().parent().css("background-color","#002966"); }; Kal.bookmarkEntrySelector = function() { return $(".trAnime"); }; Kal.nextEpLink = function(url) { return 'https://www.masterani.me'+$('#watch .anime-info .actions a').last().attr('href'); }; Kal.classicBookmarkButton = function(selector, checkfix) { }; Kal.bookmarkButton = function(selector, check) { }; Kal.BookmarksStyleAfterLoad = function() { }; //########################### }else if( kalUrl.indexOf("9anime.") > -1 ){ //#########9anime######### Kal.domain = 'https://'+window.location.hostname; Kal.textColor = '#694ba1'; Kal.dbSelector = '9anime'; Kal.listType = 'anime'; Kal.bookmarkCss = ""; Kal.bookmarkFixCss = ""; Kal.videoSelector = '#player'; var winLoad = 0; Kal.init = function() { GM_addStyle('.headui a {color: inherit !important;}'); var tempEpisode = ""; Kal.docReady(function(){ document.addEventListener("load", event =>{ var curEpisode = $(".servers .episodes a.active").attr('data-base'); if(curEpisode !== tempEpisode){ tempEpisode = curEpisode; if($('.servers').height() == null){ tempEpisode = ""; return; } if(curEpisode != ''){ var animechange = {}; animechange['.add_anime[num_watched_episodes]'] = parseInt(curEpisode); animechange['checkIncrease'] = 1; animechange['forceUpdate'] = 1; setanime( Kal.normalUrl(),animechange); } } }, true); }); checkdata(); } Kal.imageCache = function(selector) { return $('.class').first().find('img').attr('src'); }; Kal.isOverviewPage = function() { if(Kal.normalUrl().split('/')[4] !== 'watch'){ return true; }else{ return false; } }; Kal.episodeListSelector = function() { return $(".servers .episodes a"); }; Kal.episodeListElementHref = function(selector) { return $.absoluteLink(selector.attr('href'))+'?ep='+selector.attr('data-base'); }; Kal.episodeListElementTitle = function(selector) { if(selector.text() == ''){ return ''; } return 'Episode '+selector.text(); }; Kal.episodeListNextElement = function(selector, index) { if ((index+1) > -1) { return Kal.episodeListSelector().eq(index+1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ return truelink; }; Kal.urlEpisodePart = function(url) { return url.split('?ep=')[1]; }; Kal.urlAnimeIdent = function(url) { return url.split('/').slice(0,5).join('/'); }; Kal.urlAnimeSelector = function(url) { url = url.split("/")[4].split("?")[0]; if( url.indexOf(".") > -1 ){ url = url.split(".")[1]; } return url; }; Kal.urlAnimeTitle = function(url) { return url.split("/")[4].split("?")[0].split(".")[0]; }; Kal.EpisodePartToEpisode = function(string) { return string; }; Kal.uiPos = function(selector) { $('<div class="widget info"><div class="widget-body"> '+selector.html()+'</div></div>').insertBefore($(".widget.info").first()); }; Kal.uiWrongPos = function(selector) { selector.css('font-size','14px').insertBefore($("#info").first()); $('.title').first().css('display', 'inline-block'); }; Kal.uiHeadPos = function(selector) { selector.addClass('title').css('margin-right','0').appendTo($(".widget.player .widget-title").first()); }; $(window).load(function(){ winLoad = 1; }); if(kalUrl.indexOf("/info/") > -1){ Kal.docReady = function(data) { var checkExist = setInterval(function() { if ($('#stats').length) { clearInterval(checkExist); if(winLoad == 0){ //winLoad = 1;alert(); return $(window).load(data); }else{ return $( document).ready(data); } } }, 500); }; }else{ Kal.docReady = function(data) { return $( document).ready(data); } }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.css("border-style","none"); }; Kal.epListActive = function(selector) { selector.css("border-color","#002966").css("border-width","2px").css("border-style","solid"); }; Kal.bookmarkEntrySelector = function() { return $(".trAnime"); }; Kal.nextEpLink = function(url) { return Kal.domain+$(".servers .episodes a.active").parent('li').next().find('a').attr('href'); }; Kal.classicBookmarkButton = function(selector, checkfix) { }; Kal.bookmarkButton = function(selector, check) { }; Kal.BookmarksStyleAfterLoad = function() { }; //########################### }else if( kalUrl.indexOf("crunchyroll.com") > -1 ){ //TODO: //http://www.crunchyroll.com/ace-of-the-diamond //http://www.crunchyroll.com/trinity-seven //#########Crunchyroll######### if(kalUrl == 'http://www.crunchyroll.com/'){ return; } Kal.domain = 'http://www.crunchyroll.com'; Kal.textColor = 'black'; Kal.dbSelector = 'Crunchyroll'; Kal.listType = 'anime'; Kal.bookmarkCss = ""; Kal.bookmarkFixCss = ""; Kal.videoSelector = '#showmedia_video_box_wide,#showmedia_video_box'; GM_addStyle('.headui a {color: black !important;} #malp{margin-bottom: 8px;}'); Kal.init = function() { $( document).ready(function(){ if( $('.season-dropdown').length > 1){ $('.season-dropdown').append('<span class="exclusivMal" style="float: right; margin-right: 20px; color: #0A6DA4;" onclick="return false;">MAL</span>'); $('.exclusivMal').click(function(){ $('#showview_content').before('<div><a href="'+kalUrl.split('?')[0]+'">Show hidden seasons</a></div>'); var thisparent = $(this).parent(); $('.season-dropdown').not(thisparent).siblings().remove(); $('.season-dropdown').not(thisparent).remove(); $('.portrait-grid').css('display','block').find("li.group-item img.landscape").each(function() { void 0 === $(this).attr("src") && $(this).attr("src", $(this).attr("data-thumbnailUrl")) }), $('.exclusivMal').remove(); checkdata(); }); var season = new RegExp('[\?&]' + 'season' + '=([^&#]*)').exec(kalUrl); if(season != null){ season = season[1] || null; if(season != null){ season = decodeURIComponent(decodeURI(season)); $('.season-dropdown[title="'+season+'" i] .exclusivMal').first().click(); } } return; }else{ checkdata(); } }); } Kal.imageCache = function(selector) { return $('#rightside').find('img').attr('src'); }; Kal.isOverviewPage = function() { if(typeof kalUrl.split('/')[4] != 'undefined'){ if($('#showmedia_video').length){ return false; } } return true; }; Kal.episodeListSelector = function() { return $("#showview_content_videos .list-of-seasons .group-item a"); }; Kal.episodeListElementHref = function(selector) { return $.absoluteLink(selector.attr('href')); }; Kal.episodeListElementTitle = function(selector) { return selector.find('.series-title').text(); }; Kal.episodeListNextElement = function(selector, index) {//TODO if ((index-1) > -1) { return Kal.episodeListSelector().eq(index-1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ return truelink; }; Kal.urlEpisodePart = function(url) { return url.split("/")[4]; }; Kal.urlAnimeIdent = function(url) { return url.split('/').slice(0,4).join('/'); }; /*$( document).ready(function(){//TODO var seasons = 0; $('.season-dropdown').each(function(index){ seasons = 1; checkdata('.season-dropdown:nth-child('+index+') '); $('.season-dropdown:nth-child('+index+')').css('background-color','red'); //alert($(this).text()); }); if(seasons == 0){ alert($('#source_showview h1 span').text()); } var script = ($("#template_body script")[1]).innerHTML; script = script.split('mediaMetadata =')[1].split('"name":"')[1].split(' -')[0]; alert(script); });*/ Kal.urlAnimeSelector = function(url) { if(Kal.isOverviewPage()){ if( $('.season-dropdown').length > 1){ $('<div>Kissanimelist does not support multiple seasons on one page</div>').uiPos(); throw new Error('Kissanimelist does not support multiple seasons'); }else{ if($('.season-dropdown').length){ return $('.season-dropdown').first().text(); }else{ return $('#source_showview h1 span').text(); } } }else{ var script = ($("#template_body script")[1]).innerHTML; script = script.split('mediaMetadata =')[1].split('"name":"')[1].split(' -')[0]; script = JSON.parse('"' + script.replace('"', '\\"') + '"'); //console.log(script); return script; return url.split("/")[3]; } }; Kal.urlAnimeTitle = function(url) { return Kal.urlAnimeSelector(url); }; Kal.EpisodePartToEpisode = function(string) { var temp = []; temp = string.match(/[e,E][p,P][i,I]?[s,S]?[o,O]?[d,D]?[e,E]?\D?\d+/); if(temp !== null){ string = temp[0]; }else{ string = ''; } temp = string.match(/\d+/); if(temp === null){ string = 1; }else{ string = temp[0]; } return string; }; Kal.uiPos = function(selector) {//TODO if(Kal.isOverviewPage()){ //selector.insertAfter($("h1.ellipsis")); selector.insertBefore($("#tabs").first()); $('#malStatus option').css('background-color','#f2f2f2'); $('#malUserRating option').css('background-color','#f2f2f2'); //selector.prependTo($('.season-dropdown')); } }; Kal.uiWrongPos = function(selector) {//TODO after second element //selector.prependTo($("#sidebar_elements").first()); }; Kal.uiHeadPos = function(selector) {//TODO selector.appendTo($(".ellipsis").first()); }; Kal.docReady = function(data) { return $( document).ready(data); }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.css("background-color","#fff"); }; Kal.epListActive = function(selector) { selector.css("background-color","#b2d1ff"); }; Kal.bookmarkEntrySelector = function() { //return $(".trAnime"); }; Kal.nextEpLink = function(url) { return 'http://www.crunchyroll.com'+$('.collection-carousel-media-link-current').parent().next().find('.link').attr('href'); }; Kal.classicBookmarkButton = function(selector, checkClassic) { }; Kal.bookmarkButton = function(selector, check) { }; Kal.BookmarksStyleAfterLoad = function() { }; //########################### }else if( kalUrl.indexOf("gogoanime.") > -1 ){ //#########Gogoanime.tv######### if(!kalUrl.split('/')[3]){ return; } Kal.domain = kalUrl.split('/').slice(0,3).join('/')+'/'; Kal.textColor = 'white'; Kal.dbSelector = 'Gogoanime'; Kal.listType = 'anime'; Kal.bookmarkCss = ""; Kal.bookmarkFixCss = ""; Kal.videoSelector = '.anime_video_body_watch_items'; var winLoad = 0; Kal.init = function() { GM_addStyle('.headui a {color: inherit !important;}'); checkdata(); } Kal.imageCache = function(selector) { return $('.class').first().find('img').attr('src'); }; Kal.isOverviewPage = function() { if(kalUrl.split('/')[3] === 'category'){ return true; }else{ return false; } }; Kal.episodeListSelector = function() { return $("#episode_related a"); }; Kal.episodeListElementHref = function(selector) { return Kal.domain+selector.attr('href').replace(' /',''); }; Kal.episodeListElementTitle = function(selector) { return selector.find("div.name").text(); }; Kal.episodeListNextElement = function(selector, index) { if ((index-1) > -1) { return Kal.episodeListSelector().eq(index-1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ if(truelink == null){ var nextEp = parseInt(anime['.add_anime[num_watched_episodes]'])+1; if(nextEp <= parseInt(anime['totalEp'])){ return '<a style="color: white;" href="/'+Kal.normalUrl().split('/')[4]+'-episode-'+nextEp+'">Ep '+nextEp+'</a>'; } } return truelink; }; Kal.urlEpisodePart = function(url) { return url.split("/")[3].split("?")[0].split('episode-')[1]; }; Kal.urlAnimeIdent = function(url) { if(url.split('/')[3] === 'category'){ return url.split('/').slice(0,5).join('/'); }else{ return url.split('/').slice(0,3).join('/') + '/category/' + url.split("/")[3].split("?")[0].split('-episode')[0]; } }; Kal.urlAnimeSelector = function(url) { return url.split("/")[4].split("?")[0]; }; Kal.urlAnimeTitle = function(url) { return Kal.urlAnimeSelector(url); }; Kal.EpisodePartToEpisode = function(string) { return string; }; Kal.uiPos = function(selector) { selector.prependTo($(".anime_info_body").first()); }; Kal.uiWrongPos = function(selector) {//TODO selector.css('margin-top','5px').appendTo($(".ui.info.list").first()); }; Kal.uiHeadPos = function(selector) {//TODO selector.appendTo($("h1").first()); }; Kal.docReady = function(data) { return $( document).ready(data); }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.css("background-color","#363636"); }; Kal.epListActive = function(selector) { selector.css("background-color","#002966"); }; Kal.bookmarkEntrySelector = function() { }; Kal.nextEpLink = function(url) { var url = Kal.domain + 's..' + $('.anime_video_body_episodes_r a').last().attr('href'); return url.replace('/s..',''); }; Kal.classicBookmarkButton = function(selector, checkfix) { }; Kal.bookmarkButton = function(selector, check) { }; Kal.BookmarksStyleAfterLoad = function() { }; //########################### }else if( kalUrl.indexOf("mangadex.org") > -1 ){ //#########Mangadex.org######### Kal.domain = 'https://www.mangadex.org'; Kal.textColor = 'black'; Kal.dbSelector = 'Mangadex'; Kal.listType = 'manga'; Kal.bookmarkCss = ""; Kal.bookmarkFixCss = ""; Kal.videoSelector = ''; Kal.init = function() { GM_addStyle('.headui a {color: inherit !important;} #malp{margin: 0 !important; margin-bottom: -4px !important;} #malStatus *, #malUserRating * {background: white !important;}'); Kal.docReady(function(){ if(!Kal.isOverviewPage()){ var waitforhead = setInterval(function() { console.log('check'); console.log(Kal.normalUrl()); if (Kal.normalUrl() != null) { console.log("Exists!"); clearInterval(waitforhead); checkdata(); } }, 100); var tempUrl = window.location.href; document.addEventListener("load", event =>{ if(tempUrl != window.location.href){ checkdata(); tempUrl = window.location.href; } }, true); }else{ checkdata(); } }) } Kal.imageCache = function(selector) { return $('.class').first().find('img').attr('src'); }; Kal.isOverviewPage = function() { if(kalUrl.split('/')[3] !== 'chapter'){ return true; }else{ return false; } }; Kal.episodeListSelector = function() { return $(".chapter-container > .row:not(:first-of-type) .chapter-row"); }; Kal.episodeListElementHref = function(selector) { return $.absoluteLink(selector.find("a").first().attr('href')); }; Kal.episodeListElementTitle = function(selector) { return selector.find("a").first().text().trim(); }; Kal.episodeListNextElement = function(selector, index) { if ((index-1) > -1) { return Kal.episodeListSelector().eq(index-1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ return truelink; }; Kal.urlEpisodePart = function(url) { if(Kal.isOverviewPage()){ var relativUrl = url.replace(url.split('/').slice(0,3).join('/'),''); var someA = $('a[href*="'+relativUrl+'"]').parent().parent('.chapter-row'); if(someA.length){ var chapterNr = someA.attr('data-chapter'); if(chapterNr){ return chapterNr; } } }else{ var chapterId = url.split('/')[4]; var curOption = $('#jump-chapter option[value="'+chapterId+'"]'); if(curOption.length){ var temp = curOption.text().trim().match(/ch\.\D?\d+/i); if(temp !== null){ return temp[0]; } } } return null; }; Kal.urlVolumePart = function(url) { if(Kal.isOverviewPage()){ var relativUrl = url.replace(url.split('/').slice(0,3).join('/'),''); var someA = $('a[href*="'+relativUrl+'"]').parent().parent('.chapter-row'); if(someA.length){ var chapterNr = someA.attr('data-volume'); if(chapterNr){ return chapterNr; } } }else{ var chapterId = url.split('/')[4]; var curOption = $('#jump-chapter option[value="'+chapterId+'"]'); if(curOption.length){ var temp = curOption.text().trim().match(/vol\.\D?\d+/i); if(temp !== null){ return temp[0].match(/\d+/);; } } } return 0; }; Kal.urlAnimeIdent = function(url) { if(Kal.isOverviewPage()){ return kalUrl.split('/').slice(0,6).join('/').split('?')[0]; }else{ return $.absoluteLink($('a.manga-link').first().attr('href')); } }; Kal.urlAnimeSelector = function(url) { return url.split("/")[4].split("?")[0]; }; Kal.urlAnimeTitle = function(url) { var onMal = $('.list-inline a[href^="https://myanimelist.net/"]'); if(onMal.length){ return 'site:'+onMal.attr('href'); } return $('.panel-title').text().trim(); }; Kal.EpisodePartToEpisode = function(string) { if(!string) return ''; if(!(isNaN(parseInt(string)))){ return string; } var temp = []; temp = string.match(/ch\.\D?\d+/i); console.log(temp); if(temp !== null){ string = temp[0]; temp = string.match(/\d+/); if(temp !== null){ return temp[0]; } } return ''; }; Kal.uiPos = function(selector) { $(".container .card .edit.row > * > .row").first().after('<div class="row m-0 py-1 px-0 border-top"><div class="col-lg-3 col-xl-2 strong">MyAnimeList:</div><div class="col-lg-9 col-xl-10 kal-ui"></div></div>'); selector.appendTo($(".container .card .kal-ui").first()); }; Kal.uiWrongPos = function(selector) {//TODO //selector.css('margin-top','5px').appendTo($(".ui.info.list").first()); }; Kal.uiHeadPos = function(selector) {//TODO selector.appendTo($("h6.card-header").first()); }; Kal.docReady = function(data) { return $( document).ready(data); }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.css("background-color","initial"); }; Kal.epListActive = function(selector) { selector.css("background-color","#cee1ff"); }; Kal.bookmarkEntrySelector = function() { return $(".trAnime"); }; Kal.nextEpLink = function(url) { return window.location.href; }; Kal.classicBookmarkButton = function(selector, checkfix) { }; Kal.bookmarkButton = function(selector, check) { }; Kal.BookmarksStyleAfterLoad = function() { }; //########################### }else if( kalUrl.indexOf("myanimelist.net") > -1 ){ googleover = 1; Kal.listType = kalUrl.split('/')[3]; Kal.isOverviewPage = function() { return false; }; Kal.urlAnimeSelector = function(url) { return $('.h1 span').first().text(); }; Kal.urlAnimeTitle = function(url) { return Kal.urlAnimeSelector(url); }; Kal.docReady = function(data) { return $( document).ready(data); }; if(mangaStore){ GM_addStyle('.di-b.mt4.mb16.ac, .left-info-block-manga-store-button, .manga-store-preview{display: none!important;}'); $( document).ready(function(){ var mangaStore = $('h2:contains("Manga Store")'); if( mangaStore.length){ mangaStore.parent('.pb24').css('display', 'none'); } }); } } return Kal; } var K = getDeclaration(window.location.href); //#######Anime or Manga###### if(K.listType == 'anime'){ var googleMalUrl = "site:myanimelist.net/Anime/+-site:myanimelist.net/Anime/genre/+-site:myanimelist.net/anime/season/+"; var middleType = 'episodes'; var middleVerb = 'watched'; var planTo = 'Plan to Watch'; var watching = 'Watching' }else{ var googleMalUrl = "site:myanimelist.net/manga/+-site:myanimelist.net/manga/genre/+-site:myanimelist.net/manga/season/+"; var middleType = 'chapters'; var middleVerb = 'read'; var planTo = 'Plan to Read'; var watching = 'Reading' } //########################### $.absoluteLink = function(url) { if (typeof url === "undefined") { return url; } if(!url.startsWith("http")) { url = K.domain + url;} return url; }; $.titleToDbKey = function(title) { if( window.location.href.indexOf("crunchyroll.com") > -1 ){ return encodeURIComponent(title.toLowerCase().split('#')[0]).replace(/\./g, '%2E'); } return title.toLowerCase().split('#')[0].replace(/\./g, '%2E'); }; //ignore loading if(document.title == "Please wait 5 seconds..."){ con.log("loading"); return; } if( window.location.href.indexOf("id="+GM_getValue( 'checkFail', 0 )) > -1 ){ $(window).load(function(){ GM_setValue( 'checkFail', 0 ) }); } function handleanime(anime){ $('.MalLogin').css("display","initial"); $('#AddMalDiv').remove(); miniMalButton(anime['malurl']); if(GM_getValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.urlAnimeIdent(K.normalUrl())))+'/image' , null) == null ){ try{ GM_setValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.urlAnimeIdent(K.normalUrl())))+'/image', K.imageCache('') ); }catch(e){} } if(anime['login'] === 0){ $('.MalLogin').css("display","none"); $("#MalData").css("display","flex"); $("#MalInfo").text(""); $("#malRating").attr("href", anime['malurl']); $("#malRating").after(" Please log in on <a target='_blank' href='https://myanimelist.net/login.php'>MyAnimeList!<a>"); getcommondata(anime['malurl']); return; } if(K.isOverviewPage()){ $("#flash").attr("anime", anime['.'+K.listType+'_id']); $("#malRating").attr("href", anime['malurl']); if(isNaN(anime['.add_'+K.listType+'[status]'])){ $('.MalLogin').css("display","none"); $("#malRating").after("<span id='AddMalDiv'> <a href='#' id='AddMal' onclick='return false;'>Add to MAL</a></span>") $('#AddMal').click(function() { var anime = {}; anime['.add_'+K.listType+'[status]'] = 6; anime['forceUpdate'] = 1; setanime(K.normalUrl(),anime); }); }else{ $("#malTotal").text(anime['totalEp']); if(anime['totalEp'] == 0){ $("#malTotal").text('?'); } if(anime['forceUpdate'] != 2){ $("#malStatus").val(anime['.add_'+K.listType+'[status]']); $("#malEpisodes").val(anime['.add_anime[num_watched_episodes]']); $("#malUserRating").val(anime['.add_'+K.listType+'[score]']); //####Manga#### $("#malVolumes").val(anime['.add_manga[num_read_volumes]']); $("#malChapters").val(anime['.add_manga[num_read_chapters]']); } $("#malTotalVol").text(anime['totalVol']); if(anime['totalVol'] == 0){ $("#malTotalVol").text('?'); } $("#malTotalCha").text(anime['totalChap']); if(anime['totalChap'] == 0){ $("#malTotalCha").text('?'); } //############# } $("#MalData").css("display","flex"); $("#MalInfo").text(""); getcommondata(anime['malurl']); var episodelink; var linkbackup = null; var truelink = null; $('.lastOpen').remove(); K.episodeListSelector().each(function( index ) { if(K.listType == 'anime'){ if(debug){ $(this).after(' Episode: '+urlToEpisode(K.episodeListElementHref($(this)))); } try{ episodelink = urlToEpisode(K.episodeListElementHref($(this))); }catch(e) { episodelink = 1; } K.epListReset($(this)); if(episodelink == parseInt(anime['.add_anime[num_watched_episodes]'])){ K.epListActive($(this)); if(typeof K.episodeListElementHref(K.episodeListNextElement($(this), index)) !== "undefined"){ truelink = '<a style="color: white;" href="'+K.episodeListElementHref(K.episodeListNextElement($(this), index))+'">'+K.episodeListElementTitle(K.episodeListNextElement($(this), index))+'</a>'; } } }else{ if(debug){ $(this).after(' Chapter: '+urlToChapter(K.episodeListElementHref($(this)))); $(this).after('Volume: '+urlToVolume(K.episodeListElementHref($(this)))); } episodelink = urlToChapter(K.episodeListElementHref($(this))); K.epListReset($(this)); if($(this).attr('href') == commentToUrl(anime['.add_manga[comments]'])){ $(this).parent().parent().css("background-color","#861515"); linkbackup = '<a style="color: red;" href="'+K.episodeListElementHref(K.episodeListNextElement($(this), index))+'">'+K.episodeListElementTitle(K.episodeListNextElement($(this), index))+'</a>'; $(this).prepend('<span class="lastOpen">[Last opened]</span>'); } if(episodelink == parseInt(anime['.add_manga[num_read_chapters]']) && parseInt(anime['.add_manga[num_read_chapters]']) != 0){ K.epListActive($(this)); truelink = '<a style="color: white;" href="'+K.episodeListElementHref(K.episodeListNextElement($(this), index))+'">'+K.episodeListElementTitle(K.episodeListNextElement($(this), index))+'</a>'; } } }); truelink = K.handleNextLink(truelink, anime); if(K.listType == 'anime'){ $(".headui").html(truelink); }else{ if(truelink == null){ if(linkbackup != null){ $(".headui").html(linkbackup); } }else{ $(".headui").html(truelink); } } }else{ if(K.listType == 'anime'){ //update try{ var curEpisode = urlToEpisode(window.location.href); }catch(e) { var curEpisode = 1; } //if(curEpisode > anime['.add_anime[num_watched_episodes]']){ var animechange = {}; animechange['.add_anime[num_watched_episodes]'] = curEpisode; }else{ //update var curChapter = urlToChapter(window.location.href); var curVolume = urlToVolume(window.location.href); //if(curChapter > anime['.add_manga[num_read_volumes]']){ var animechange = {}; animechange['.add_manga[num_read_chapters]'] = curChapter; animechange['.add_manga[num_read_volumes]'] = curVolume; } animechange['checkIncrease'] = 1; setTimeout(function() { setanime( K.normalUrl(),animechange); }, delay * 1000); } } function urlToEpisode(url){ var string = K.urlEpisodePart(url); string = K.EpisodePartToEpisode(string); var Offset = GM_getValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.urlAnimeIdent(url)))+'/Offset' , null); if( Offset != null){ string = parseInt(string)+parseInt(Offset); } if(parseInt(string) == 0){ string = 1; } return parseInt(string); } function urlToChapter(url){ return urlToEpisode(url); } function urlToVolume(url){ var string = K.urlVolumePart(url); return parseInt(string); } function commentToUrl(comment){ if(comment.indexOf("last:^") > -1){ try{ comment = comment.split("last:^")[1].split("^")[0]; comment = comment.split("http://kissmanga.com")[1]; comment = comment.split("#")[0]; }catch(e){} } return comment; } function handleTag(update, current, nextEp){ if(tagLinks == 0){return current;} var addition = "last::"+ btoa(update) +"::"; if(current.indexOf("last::") > -1){ current = current.replace(/last::[^\^]*\:\:/,addition); }else{ current = current+','+addition; } if(update.indexOf("masterani.me") > -1 && update.indexOf("/watch/") > -1){ update = update.replace('/watch/','/info/'); } if(K.listType == 'anime'){ GM_setValue( update+'/next', nextEp); }else{ GM_setValue( update+'/next', 'manga'); } GM_setValue( update+'/nextEp', K.nextEpLink(update)); return current; } function handleanimeupdate( anime, current){ if(K.listType == 'anime'){ if(anime['checkIncrease'] === 1){ anime['.add_anime[tags]'] = handleTag(K.urlAnimeIdent(window.location.href), current['.add_anime[tags]'], anime['.add_anime[num_watched_episodes]']+1); if(current['.add_anime[num_watched_episodes]'] >= anime['.add_anime[num_watched_episodes]']){ if((anime['.add_anime[status]'] === 2 || current['.add_anime[status]'] === 2) && anime['.add_anime[num_watched_episodes]'] === 1){ if (confirm('Rewatch anime?')) { anime['.add_anime[is_rewatching]'] = 1; }else{ return null; } }else{ return null; } } } if(current['.add_anime[status]'] !== 2 && parseInt(anime['.add_anime[num_watched_episodes]']) === current['totalEp'] && parseInt(anime['.add_anime[num_watched_episodes]']) != 0 ){ if (confirm('Set as completed?')) { anime['.add_anime[status]'] = 2; if(current['.add_anime[finish_date][day]'] === ''){ var Datec = new Date(); anime['.add_anime[finish_date][year]'] = Datec.getFullYear(); anime['.add_anime[finish_date][month]'] = Datec.getMonth()+1; anime['.add_anime[finish_date][day]'] = Datec.getDate(); } } } if(anime['checkIncrease'] === 1){ if(current['.add_anime[status]'] === 2 && anime['.add_anime[num_watched_episodes]'] === current['totalEp'] && current['.add_anime[is_rewatching]'] === 1){ if (confirm('Finish rewatching?')) { anime['.add_anime[is_rewatching]'] = 0; if(current['.add_anime[num_watched_times]'] === ''){ anime ['.add_anime[num_watched_times]'] = 1; }else{ anime ['.add_anime[num_watched_times]'] = parseInt(current['.add_anime[num_watched_times]'])+1; } } } if(current['.add_anime[status]'] !== 1 && current['.add_anime[status]'] !== 2 && anime['.add_anime[status]'] !== 2){ if (confirm('Start watching?')) { anime['.add_anime[status]'] = 1; }else{ return null; } } if(current['.add_anime[start_date][day]'] === ''){ var Datec = new Date(); anime['.add_anime[start_date][year]'] = Datec.getFullYear(); anime['.add_anime[start_date][month]'] = Datec.getMonth()+1; anime['.add_anime[start_date][day]'] = Datec.getDate(); } } if(current['.add_anime[status]'] !== 2 && anime['.add_anime[status]'] == 2 && parseInt(anime['.add_anime[num_watched_episodes]']) !== current['totalEp']){ anime['.add_anime[num_watched_episodes]'] = current['totalEp']; } return anime; }else{ if(anime['checkIncrease'] === 1){ current['checkIncrease'] = 1; anime['.add_manga[tags]'] = handleTag(K.urlAnimeIdent(window.location.href), current['.add_manga[tags]'], anime['.add_manga[num_read_chapters]']+1); if(current['.add_manga[num_read_chapters]'] >= anime['.add_manga[num_read_chapters]']){ if((anime['.add_manga[status]'] === 2 || current['.add_manga[status]'] === 2) && anime['.add_manga[num_read_chapters]'] === 1){ if (confirm('Reread Manga?')) { anime['.add_manga[is_rereading]'] = 1; }else{ return null; } }else{ return null; } } } if(current['.add_manga[status]'] !== 2 && parseInt(anime['.add_manga[num_read_chapters]']) === current['totalChap'] && parseInt(anime['.add_manga[num_read_chapters]']) != 0){ if (confirm('Set as completed?')) { anime['.add_manga[status]'] = 2; if(current['.add_manga[finish_date][day]'] === ''){ var Datec = new Date(); anime['.add_manga[finish_date][year]'] = Datec.getFullYear(); anime['.add_manga[finish_date][month]'] = Datec.getMonth()+1; anime['.add_manga[finish_date][day]'] = Datec.getDate(); } } } if(anime['checkIncrease'] === 1){ if(current['.add_manga[status]'] === 2 && anime['.add_manga[num_read_chapters]'] === current['totalChap'] && current['.add_manga[is_rereading]'] === 1){ if (confirm('Finish rereading?')) { anime['.add_manga[is_rereading]'] = 0; if(current['.add_manga[num_read_times]'] === ''){ anime ['.add_manga[num_read_times]'] = 1; }else{ anime ['.add_manga[num_read_times]'] = parseInt(current['.add_manga[num_read_times]'])+1; } } } if(current['.add_manga[status]'] !== 1 && current['.add_manga[status]'] !== 2 && anime['.add_manga[status]'] !== 2){ if (confirm('Start reading?')) { anime['.add_manga[status]'] = 1; }else{ return null; } } if(current['.add_manga[start_date][day]'] === ''){ var Datec = new Date(); anime['.add_manga[start_date][year]'] = Datec.getFullYear(); anime['.add_manga[start_date][month]'] = Datec.getMonth()+1; anime['.add_manga[start_date][day]'] = Datec.getDate(); } } if(current['.add_manga[status]'] !== 2 && anime['.add_manga[status]'] == 2 && parseInt(anime['.add_manga[num_read_chapters]']) !== current['totalChap']){ anime['.add_manga[num_read_chapters]'] = current['totalChap']; anime['.add_manga[num_read_volumes]'] = current['totalVol']; } return anime; } } function getcommondata(url){ var requestUrl = url var id = requestUrl.split('/')[4]; if(requestUrl.split('/')[3].toLowerCase() == 'anime'){ requestUrl = 'https://myanimelist.net/includes/ajax.inc.php?t=64&id='+id; }else{ requestUrl = 'https://myanimelist.net/includes/ajax.inc.php?t=65&id='+id; } GM_xmlhttpRequest({ method: "GET", url: requestUrl, synchronous: false, onload: function(response) { var data = response.responseText; //currentMalData = data; var rating = data.split('Score:</span>')[1].split('<')[0]; $("#malRating").attr("href", url).text(rating); if($('#info-popup').css('display') == 'block' && $("#info-iframe").contents().find('#backbutton').css('display') == 'none'){ fillIframe(url, currentMalData); } } }); } var fireExists = 0; function getanime(thisUrl , callback, absolute = false, localListType = K.listType) { var thisUrl = thisUrl; var url = ''; var malurl = ''; var title = K.urlAnimeTitle(thisUrl); if(absolute === false){ //url = "http://myanimelist.net/anime.php?q=" + encodeURI(formattitle(title)); //url = "http://www.google.com/search?btnI&q=site:myanimelist.net/Anime/+-site:myanimelist.net/Anime/genre/+-site:myanimelist.net/anime/season/+"+encodeURI(formattitle(title)); url = 'https://kissanimelist.firebaseio.com/Data2/'+K.dbSelector+'/'+encodeURIComponent($.titleToDbKey(K.urlAnimeSelector(thisUrl))).toLowerCase()+'/Mal.json'; if(GM_getValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Mal' , null) !== null ){ //if(con != console){ url = GM_getValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Mal' , null); //} con.log('[GET] Cache:', url); } }else{ url = absolute; } if(url == '' || url == null){ GM_setValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.normalUrl()))+'/Mal' , null); loadingText = "No MAL Entry!"; $("#MalInfo").text("No MAL Entry!"); miniMalButton(null); return; } if(url.indexOf("myanimelist.net/"+localListType+"/") > -1 && url.indexOf("google") === -1) { con.log("[GET] MyAnimeList: ", url); if(googleover === 0){ local_setValue( thisUrl, url ); } malurl = url; url = 'https://myanimelist.net/ownlist/'+localListType+'/'+url.split('/')[4]+'/edit?hideLayout';//TODOsplit4 ersetzten } con.log("[GET] Request:",url); GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onload: function(response) { if(response.finalUrl != null){ url = response.finalUrl; } url = firefoxUrl(url, response.responseText); if(url.split("/").length > 6 && url.indexOf("myanimelist.net/"+localListType) > -1 && url.indexOf("google") === -1){ var partes = url.split("/"); url = partes[0]+"/"+partes[1]+"/"+partes[2]+"/"+partes[3]+"/"+partes[4]+"/"+partes[5]; getanime(thisUrl, callback, url); return; } if(url.indexOf("kissanimelist.firebaseio.com") > -1) { con.log("[GET] Firebase:",response.response); if(response.response !== 'null' && !(response.response.indexOf("error") > -1)){ fireExists = 1; //url = response.response.replace('"', '').replace('"', ''); url = 'https://myanimelist.net/'+localListType+'/'+response.response.split('"')[1]+'/'+response.response.split('"')[3]; if(response.response.split('"')[1] == 'Not-Found'){ $("#MalInfo").text("Not Found!"); miniMalButton(null); return; } }else{ url = "http://www.google.com/search?btnI&q="+googleMalUrl+encodeURI(formattitle(title)); } getanime(thisUrl, callback, url); return; } if(url.indexOf("ipv4.google.com") > -1) { googleover = 1; K.docReady(function() { flashm( "Google Overloaded <br> <a target='_blank' href='"+url+"'>Solve captcha<a>" , true); url = "http://myanimelist.net/"+localListType+".php?q=" + encodeURI(formattitle(title)); getanime(thisUrl, callback, url); }); return; } if(url.indexOf(localListType+".php") > -1) { var data = response.responseText; var link = data.split(' <a class="hoverinfo_trigger" href="')[1].split('"')[0]; getanime(thisUrl, callback, link); return; } if(url.indexOf("google.") > -1) { googleover = 0; var data = response.responseText; if(data.indexOf("getElementById('captcha')") > -1){ //Firefox no absolute url workaround TODO: googleover = 1; K.docReady(function() { flashm( "Google Overloaded", true);// <br> <a target='_blank' href='"+url+"'>Solve captcha<a>" , true); url = "http://myanimelist.net/"+localListType+".php?q=" + encodeURI(formattitle(title)); getanime(thisUrl, callback, url); }); return; } try{ var link = data.split('class="g"')[1].split('a href="')[1].split('"')[0]; if(link.indexOf("/url?") > -1){ link = link.split("?q=")[1].split("&")[0]; } getanime(thisUrl, callback, link); }catch(e){ url = "http://myanimelist.net/"+localListType+".php?q=" + encodeURI(formattitle(title)); getanime(thisUrl, callback, url); } } else { if(url.indexOf("myanimelist.net/"+localListType+"/") > -1) { con.log("[GET] Mal: ",url); if(googleover === 0){ local_setValue( thisUrl, url ); } getanime(thisUrl, callback, url); }else{ if(url.indexOf("myanimelist.net/login.php") > -1 || response.responseText.indexOf("Unauthorized") > -1) { flashm( "Please log in on <a target='_blank' href='https://myanimelist.net/login.php'>MyAnimeList!<a>" , true); var anime = {}; anime['login'] = 0; anime['malurl'] = malurl; K.docReady(function() { callback(anime); }); }else{ if(url.indexOf("myanimelist.net/"+localListType+".php") > -1) { $("#MalInfo").text("Not Found!"); flashm( "Anime not found" , true); miniMalButton(null); return; } var anime = getObject(response.responseText,malurl,localListType); K.docReady(function() { callback(anime); }); } } } } }); } function getObject(data,url,localListType){ if (typeof data.split('<form name="')[1] === "undefined" && (url.indexOf('/manga/') !== -1 || url.indexOf('/anime/') !== -1)) { flashm( "MAL is down or otherwise giving bad data <a href='"+url+"'>[Check]</a>" , true); } if(localListType == 'anime'){ var anime = {}; anime['malurl'] = url; anime['.csrf_token'] = data.split('\'csrf_token\'')[1].split('\'')[1].split('\'')[0]; if(data.indexOf('Add Anime') > -1) { anime['addanime'] = 1; } data = data.split('<form name="')[1].split('</form>')[0]; anime['totalEp'] = parseInt(data.split('id="totalEpisodes">')[1].split('<')[0]); anime['name'] = data.split('<a href="')[1].split('">')[1].split('<')[0]; anime['.anime_id'] = parseInt(data.split('name="anime_id"')[1].split('value="')[1].split('"')[0]); //input anime['.aeps'] = parseInt(data.split('name="aeps"')[1].split('value="')[1].split('"')[0]); anime['.astatus'] = parseInt(data.split('name="astatus"')[1].split('value="')[1].split('"')[0]); anime['.add_anime[status]'] = parseInt(getselect(data,'add_anime[status]')); //Rewatching if(data.split('name="add_anime[is_rewatching]"')[1].split('>')[0].indexOf('checked="checked"') >= 0){ anime['.add_anime[is_rewatching]'] = 1; } // anime['.add_anime[num_watched_episodes]'] = parseInt(data.split('name="add_anime[num_watched_episodes]"')[1].split('value="')[1].split('"')[0]); if( isNaN(anime['.add_anime[num_watched_episodes]']) ){ anime['.add_anime[num_watched_episodes]'] = ''; } anime['.add_anime[score]'] = getselect(data,'add_anime[score]'); anime['.add_anime[start_date][month]'] = getselect(data,'add_anime[start_date][month]'); anime['.add_anime[start_date][day]'] = getselect(data,'add_anime[start_date][day]'); anime['.add_anime[start_date][year]'] = getselect(data,'add_anime[start_date][year]'); anime['.add_anime[finish_date][month]'] = getselect(data,'add_anime[finish_date][month]'); anime['.add_anime[finish_date][day]'] = getselect(data,'add_anime[finish_date][day]'); anime['.add_anime[finish_date][year]'] = getselect(data,'add_anime[finish_date][year]'); anime['.add_anime[tags]'] = data.split('name="add_anime[tags]"')[1].split('>')[1].split('<')[0];//textarea anime['.add_anime[priority]'] = getselect(data,'add_anime[priority]'); anime['.add_anime[storage_type]'] = getselect(data,'add_anime[storage_type]'); anime['.add_anime[storage_value]'] = data.split('name="add_anime[storage_value]"')[1].split('value="')[1].split('"')[0]; anime['.add_anime[num_watched_times]'] = data.split('name="add_anime[num_watched_times]"')[1].split('value="')[1].split('"')[0]; anime['.add_anime[rewatch_value]'] = getselect(data,'add_anime[rewatch_value]'); anime['.add_anime[comments]'] = data.split('name="add_anime[comments]"')[1].split('>')[1].split('<')[0]; anime['.add_anime[is_asked_to_discuss]'] = getselect(data,'add_anime[is_asked_to_discuss]'); anime['.add_anime[sns_post_type]'] = getselect(data,'add_anime[sns_post_type]'); anime['.submitIt'] = data.split('name="submitIt"')[1].split('value="')[1].split('"')[0]; con.log('[GET] Object:',anime); return anime; }else{ var anime = {}; anime['malurl'] = url; anime['.csrf_token'] = data.split('\'csrf_token\'')[1].split('\'')[1].split('\'')[0]; if(data.indexOf('Add Manga') > -1) { anime['addmanga'] = 1; } data = data.split('<form name="')[1].split('</form>')[0]; anime['totalVol'] = parseInt(data.split('id="totalVol">')[1].split('<')[0]); anime['totalChap'] = parseInt(data.split('id="totalChap">')[1].split('<')[0]); anime['name'] = data.split('<a href="')[1].split('">')[1].split('<')[0]; anime['.entry_id'] = parseInt(data.split('name="entry_id"')[1].split('value="')[1].split('"')[0]); anime['.manga_id'] = parseInt(data.split('name="manga_id"')[1].split('value="')[1].split('"')[0]); //input anime['volumes'] = parseInt(data.split('id="volumes"')[1].split('value="')[1].split('"')[0]); anime['mstatus'] = parseInt(data.split('id="mstatus"')[1].split('value="')[1].split('"')[0]); anime['.add_manga[status]'] = parseInt(getselect(data,'add_manga[status]')); //Rewatching if(data.split('name="add_manga[is_rereading]"')[1].split('>')[0].indexOf('checked="checked"') >= 0){ anime['.add_manga[is_rereading]'] = 1; } // anime['.add_manga[num_read_volumes]'] = parseInt(data.split('name="add_manga[num_read_volumes]"')[1].split('value="')[1].split('"')[0]); if( isNaN(anime['.add_manga[num_read_volumes]']) ){ anime['.add_manga[num_read_volumes]'] = ''; } anime['.add_manga[num_read_chapters]'] = parseInt(data.split('name="add_manga[num_read_chapters]"')[1].split('value="')[1].split('"')[0]); if( isNaN(anime['.add_manga[num_read_chapters]']) ){ anime['.add_manga[num_read_chapters]'] = ''; } anime['.add_manga[score]'] = getselect(data,'add_manga[score]'); anime['.add_manga[start_date][month]'] = getselect(data,'add_manga[start_date][month]'); anime['.add_manga[start_date][day]'] = getselect(data,'add_manga[start_date][day]'); anime['.add_manga[start_date][year]'] = getselect(data,'add_manga[start_date][year]'); anime['.add_manga[finish_date][month]'] = getselect(data,'add_manga[finish_date][month]'); anime['.add_manga[finish_date][day]'] = getselect(data,'add_manga[finish_date][day]'); anime['.add_manga[finish_date][year]'] = getselect(data,'add_manga[finish_date][year]'); anime['.add_manga[tags]'] = data.split('name="add_manga[tags]"')[1].split('>')[1].split('<')[0];//textarea anime['.add_manga[priority]'] = getselect(data,'add_manga[priority]'); anime['.add_manga[storage_type]'] = getselect(data,'add_manga[storage_type]'); anime['.add_manga[num_retail_volumes]'] = data.split('name="add_manga[num_retail_volumes]"')[1].split('value="')[1].split('"')[0]; anime['.add_manga[num_read_times]'] = data.split('name="add_manga[num_read_times]"')[1].split('value="')[1].split('"')[0]; anime['.add_manga[reread_value]'] = getselect(data,'add_manga[reread_value]'); anime['.add_manga[comments]'] = data.split('name="add_manga[comments]"')[1].split('>')[1].split('<')[0]; anime['.add_manga[is_asked_to_discuss]'] = getselect(data,'add_manga[is_asked_to_discuss]'); anime['.add_manga[sns_post_type]'] = getselect(data,'add_manga[sns_post_type]'); anime['.submitIt'] = data.split('name="submitIt"')[1].split('value="')[1].split('"')[0]; con.log('[GET] Object:', anime); return anime; } } var continueAllowed = 1; function setanime(thisUrl ,anime, actual = null, localListType = K.listType) { var undoAnime = $.extend({}, actual); if(actual === null){ var absolute = false; if(anime['malurl'] != null){ absolute = anime['malurl']; } getanime(thisUrl, function(actual){setanime(thisUrl , anime, actual, localListType);}, absolute, localListType); return; } var change = $.extend({},anime); if(anime['checkIncrease'] === 1 && autoTracking === 0 && continueAllowed){ if(actual['.add_anime[num_watched_episodes]'] < anime['.add_anime[num_watched_episodes]'] || actual['.add_manga[num_read_chapters]'] < anime['.add_manga[num_read_chapters]']){ if(localListType == 'anime'){ var epis = 'episode: '+anime['.add_anime[num_watched_episodes]']; }else{ var epis = 'chapter: <b>'+anime['.add_manga[num_read_chapters]']+'</b>'; } var message = '<button class="sync" style="margin-bottom: 8px; background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px;cursor: pointer;">Update MAL to '+epis+'</button>'; flashm( message , true, true ); $('.sync').click(function(){ $('.flashinfo').remove(); continueAllowed = 0; setanime(thisUrl ,anime, actual, localListType); }); } return; } continueAllowed = 1; if(localListType == 'anime'){ var url = "https://myanimelist.net/ownlist/anime/"+actual['.anime_id']+"/edit"; if(actual['addanime'] === 1){ url = "https://myanimelist.net/ownlist/anime/add?selected_series_id="+actual['.anime_id']; flashConfirm('Add "'+actual['name']+'" to MAL?', function(){continueCall();}, function(){ if(change['checkIncrease'] == 1){ episodeInfo(change['.add_anime[num_watched_episodes]'], actual['malurl']); } }); return; } }else{ var url = "https://myanimelist.net/ownlist/manga/"+actual['.manga_id']+"/edit"; if(actual['addmanga'] === 1){ url = "https://myanimelist.net/ownlist/manga/add?selected_manga_id="+actual['.manga_id']; flashConfirm('Add "'+actual['name']+'" to MAL?', function(){continueCall();}, function(){}); return; } } continueCall(); function continueCall(){ anime = handleanimeupdate( anime, actual ); if(anime === null){ if(change['checkIncrease'] == 1 && localListType == 'anime'){ episodeInfo(change['.add_anime[num_watched_episodes]'], actual['malurl']); } return; } $.each( anime, function( index, value ){ actual[index] = value; }); anime = actual; var parameter = ""; $.each( anime, function( index, value ){ if(index.charAt(0) == "."){ if(!( (index === '.add_anime[is_rewatching]' || index === '.add_manga[is_rereading]') && parseInt(anime[index]) === 0)){ parameter += encodeURIComponent (index.substring(1))+"="+encodeURIComponent (value)+"&"; } } }); con.log('[SET] URL:', url); con.log('[SET] Object:', anime); GM_xmlhttpRequest({ method: "POST", url: url, synchronous: false, data: parameter, headers: { "Content-Type": "application/x-www-form-urlencoded", "accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" }, onload: function(response) { //con.log(response);//.responseText); if(anime['no_flash'] !== 1){ if(response.responseText.indexOf('Successfully') >= 0){ if(localListType == 'anime'){ var message = anime['name']; var split = '<br>'; var totalEp = anime['totalEp']; if (totalEp == 0) totalEp = '?'; if(typeof change['.add_anime[status]'] != 'undefined'){ var statusString = ""; switch (parseInt(anime['.add_anime[status]'])) { case 1: statusString = watching; break; case 2: statusString = 'Completed'; break; case 3: statusString = 'On-Hold'; break; case 4: statusString = 'Dropped'; break; case 6: statusString = planTo; break; } message += split + statusString; split = ' | ' } if(typeof change['.add_anime[num_watched_episodes]'] != 'undefined'){ message += split + 'Episode: ' + anime['.add_anime[num_watched_episodes]']+"/"+totalEp; split = ' | ' } if(typeof change['.add_anime[score]'] != 'undefined' && anime['.add_anime[score]'] != ''){ message += split + 'Rating: ' + anime['.add_anime[score]']; split = ' | ' } if(anime['checkIncrease'] == 1){ message += '<br><button class="undoButton" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px;cursor: pointer;">Undo</button>'; if(!episodeInfoBox){ flashm( message , false); $('.undoButton').click(function(){ undoAnime['checkIncrease'] = 0; setanime(thisUrl, undoAnime, null, localListType); }); }else{ episodeInfo(change['.add_anime[num_watched_episodes]'], actual['malurl'], message, function(){ undoAnime['checkIncrease'] = 0; setanime(thisUrl, undoAnime, null, localListType); $('.info-Mal-undo').remove(); if($('.flashinfo>div').text() == ''){ $('.flashinfo').remove(); } }); } }else{ flashm( message , false); } }else{ var message = anime['name']; var split = '<br>'; var totalVol = anime['totalVol']; if (totalVol == 0) totalVol = '?'; var totalChap = anime['totalChap']; if (totalChap == 0) totalChap = '?'; if(typeof change['.add_manga[status]'] != 'undefined'){ var statusString = ""; switch (parseInt(anime['.add_manga[status]'])) { case 1: statusString = watching; break; case 2: statusString = 'Completed'; break; case 3: statusString = 'On-Hold'; break; case 4: statusString = 'Dropped'; break; case 6: statusString = planTo; break; } message += split + statusString; split = ' | ' } if(typeof change['.add_manga[num_read_volumes]'] != 'undefined'){ message += split + 'Volume: ' + anime['.add_manga[num_read_volumes]']+"/"+totalVol; split = ' | ' } if(typeof change['.add_manga[num_read_chapters]'] != 'undefined'){ message += split + 'Chapter: ' + anime['.add_manga[num_read_chapters]']+"/"+totalChap; split = ' | ' } if(typeof change['.add_manga[score]'] != 'undefined' && anime['.add_manga[score]'] != ''){ message += split + 'Rating: ' + anime['.add_manga[score]']; split = ' | ' } if(anime['checkIncrease'] == 1){ message += '<br><button class="undoButton" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px;cursor: pointer;">Undo</button>'; if(!episodeInfoBox){ flashm( message , false); $('.undoButton').click(function(){ undoAnime['checkIncrease'] = 0; setanime(thisUrl, undoAnime, null, localListType); }); }else{ message = "<div class='info-Mal-undo' style='white-space: nowrap; margin-top: 15px; /*margin-left: 15px;*/'> "+ message +"</div>"; flashm ( message , false, true); $('.undoButton').click(function(){ undoAnime['checkIncrease'] = 0; setanime(thisUrl, undoAnime, null, localListType); $('.info-Mal-undo').remove(); if($('.flashinfo>div').first().text() == ''){ $('.flashinfo').remove(); } }); } }else{ flashm( message , false); } } }else{ flashm( "Anime update failed" , true); if(anime['checkIncrease'] !== 1){ try{ checkdata(); }catch(e){} } } if(anime['forceUpdate'] == 1 || anime['forceUpdate'] == 2){ try{ checkdata(); }catch(e){} } } } }); } } function firefoxUrl(url, html){ if(html.indexOf('property="og:url"') > -1){ url = html.split('<meta property="og:url"')[1].split('content="')[1].split('"')[0]; } return url; } function local_setValue( thisUrl, malurl, newCorrection = false){ if( (!(thisUrl.indexOf("myAnimeList.net/") >= 0)) && ( GM_getValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Mal' , null) == null || newCorrection || GM_getValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Crunch' , null) == 'no')){ var param = { Kiss: thisUrl, Mal: malurl}; if(K.dbSelector == 'Crunchyroll'){ param = { Kiss: window.location.href+'?..'+$.titleToDbKey(K.urlAnimeSelector()), Mal: malurl}; if(K.isOverviewPage()){ param = null; if(GM_getValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Crunch' , null) == null){ GM_setValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Crunch', 'no' ); } }else{ GM_setValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Crunch', 'yes' ); } } var toDB = 1; if(fireExists) toDB = 0; if(newCorrection){ toDB = 0; if (confirm('Submit database correction request? \n If it does not exist on MAL, please leave empty.')) { toDB = 1; param['newCorrection'] = true; } } if(toDB == 1){ GM_xmlhttpRequest({ url: 'https://kissanimelist.firebaseio.com/Data2/Request/'+K.dbSelector+'Request.json', method: "POST", data: JSON.stringify(param), onload: function () { con.log("[DB] Send to database:",param); }, onerror: function(error) { con.log("[DB] Send to database:",error); } }); } } GM_setValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Mal', malurl ); } function getselect(data, name){ var temp = data.split('name="'+name+'"')[1].split('</select>')[0]; if(temp.indexOf('selected="selected"') > -1){ temp = temp.split('<option'); for (var i = 0; i < temp.length; ++i) { if(temp[i].indexOf('selected="selected"') > -1){ return temp[i].split('value="')[1].split('"')[0]; } } }else{ return ''; } } function flashm(text,error = true, info = false, permanent = false){ if(!$('#flash-div-top').length){ initflashm(); } con.log("[Flash] Message:",text); if(error === true){ var colorF = "#3e0808"; }else{ var colorF = "#323232"; } if(permanent){ $('#flash-div-top').prepend('<div class="flashPerm" style="display:none;"><div style="display:table; pointer-events: all; background-color: red;padding: 14px 24px 14px 24px; margin: 0 auto; margin-top: -2px; max-width: 60%; -webkit-border-radius: 20px;-moz-border-radius: 20px;border-radius: 2px;color: white;background:'+colorF+'; ">'+text+'</div></div>'); $('.flashPerm').delay(2000).slideDown(800); }else{ if(info){ $('.flashinfo').removeClass('flashinfo').delay(2000).fadeOut({ duration: 400, queue: false, complete: function() { $(this).remove(); }}); $('#flashinfo-div').addClass('hover').append('<div class="flashinfo" style="display:none; max-height: 5000px; margin-top: -8px;"><div style="display:table; pointer-events: all; background-color: red; margin: 0 auto; margin-top: -2px; max-width: 60%; -webkit-border-radius: 20px;-moz-border-radius: 20px;border-radius: 2px;color: white;background:'+colorF+'; "><div style="max-height: 60vh; overflow-y: auto; padding: 14px 24px 14px 24px;">'+text+'</div></div></div>'); $('.flashinfo').slideDown(800).delay(4000).queue(function() { $('#flashinfo-div').removeClass('hover'); $(this).css('max-height', '8px');}); }else{ $('.flash').removeClass('flash').fadeOut({ duration: 400, queue: false, complete: function() { $(this).remove(); }}); var mess ='<div class="flash" style="display:none;"><div style="display:table; pointer-events: all; background-color: red;padding: 14px 24px 14px 24px; margin: 0 auto; margin-top: 20px; max-width: 60%; -webkit-border-radius: 20px;-moz-border-radius: 20px;border-radius: 2px;color: white;background:'+colorF+'; ">'+text+'</div></div>'; if($('.flashinfo').length){ $('.flashinfo').before(mess); }else{ $('#flash-div').append(mess); } $('.flash').slideDown(800).delay(4000).slideUp(800, function() { $(this).remove(); }); } } } function flashConfirm(message, yesCall, cancelCall){ $('.flashPerm').remove(); var rNumber = Math.floor((Math.random() * 1000) + 1); message = '<div style="text-align: left;">' + message + '</div><div style="display: flex; justify-content: space-around;"><button class="Yes'+rNumber+'" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px; cursor:pointer;">OK</button><button class="Cancel'+rNumber+'" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px; cursor:pointer;">CANCEL</button></div>'; flashm(message, false, false, true); $( '.Yes'+rNumber ).click(function(){ $(this).parentsUntil('.flashPerm').remove(); yesCall(); }); $( '.Cancel'+rNumber ).click(function(){ $(this).parentsUntil('.flashPerm').remove(); cancelCall(); }); } function initflashm(){ GM_addStyle('.flashinfo{\ transition: max-height 2s;\ }\ .flashinfo:hover{\ max-height:5000px !important;\ z-index: 2147483647;\ }\ .flashinfo .synopsis{\ transition: max-height 2s, max-width 2s ease 2s;\ }\ .flashinfo:hover .synopsis{\ max-height:9999px !important;\ max-width: 500px !important;\ transition: max-height 2s;\ }\ #flashinfo-div{\ z-index: 2;\ transition: 2s;\ }\ #flashinfo-div:hover, #flashinfo-div.hover{\ z-index: 2147483647;\ }\ \ #flash-div-top, #flash-div, #flashinfo-div{\ font-family: "Helvetica","Arial",sans-serif;\ color: white;\ font-size: 14px;\ font-weight: 400;\ line-height: 17px;\ }\ #flash-div-top h2, #flash-div h2, #flashinfo-div h2{\ font-family: "Helvetica","Arial",sans-serif;\ color: white;\ font-size: 14px;\ font-weight: 700;\ line-height: 17px;\ padding: 0;\ margin: 0;\ }\ #flash-div-top a, #flash-div a, #flashinfo-div a{\ color: #DF6300;\ }'); $('body').after('<div id="flash-div-top" style="text-align: center;pointer-events: none;position: fixed;top:0px;width:100%;z-index: 2147483647;left: 0;"></div>\ <div id="flash-div" style="text-align: center;pointer-events: none;position: fixed;bottom:0px;width:100%;z-index: 2147483647;left: 0;"><div id="flash" style="display:none; background-color: red;padding: 20px; margin: 0 auto;max-width: 60%; -webkit-border-radius: 20px;-moz-border-radius: 20px;border-radius: 20px;background:rgba(227,0,0,0.6);"></div></div>\ <div id="flashinfo-div" style="text-align: center;pointer-events: none;position: fixed;bottom:0px;width:100%;left: 0;">'); } function updatebutton(){ buttonclick(); } function buttonclick(){ var anime = {}; if(K.listType == 'anime'){ anime['.add_anime[num_watched_episodes]'] = $("#malEpisodes").val(); }else{ anime['.add_manga[num_read_volumes]'] = $("#malVolumes").val(); anime['.add_manga[num_read_chapters]'] = $("#malChapters").val(); } anime['.add_'+K.listType+'[score]'] = $("#malUserRating").val(); anime['.add_'+K.listType+'[status]'] = $("#malStatus").val(); anime['forceUpdate'] = 2; setanime(K.normalUrl(), anime); } function formattitle(title) { con.log("[TITLE] Title:",title); title = title.replace(/-dub$/i,''); title = title.replace(/-sub$/i,''); title = title.replace(/\(dub\)$/i,''); title = title.replace(/\(sub\)$/i,''); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace("s2"," 2nd season"); title = title.replace("s3"," 3nd season"); title = title.replace("s4"," 4nd season"); title = title.replace("s5"," 5nd season"); title = title.replace("s6"," 6nd season"); title = title.replace("s7"," 7nd season"); title = title.replace("s8"," 8nd season"); title = title.replace("s9"," 9nd season"); //title = title.replace(/[-,.?:'"\\!@#$%^&\-_=+`~;]/g,""); con.log("[TITLE] Formated:",title); return title; } function episodeInfo(episode, malUrl, message = '', clickCallback = function(){}){ //message = ''; if(episodeInfoBox){ con.log('[Hover] Episode:',malUrl+'/episode/'+episode); GM_xmlhttpRequest({ url: malUrl+'/episode/'+episode, method: "GET", onload: function (response) { if(response.response != null){ if( response.response.indexOf("Sorry, this anime doesn't seem to have any episode information yet.") > -1 ){ if(message == ''){ return; } } if(message != ''){ message = "<div class='info-Mal-undo' style='white-space: nowrap; margin-top: 15px; /*margin-left: 15px;*/'> "+ message +"</div>"; } var data = response.response; var synopsis = ''; var epTitle = ''; var epSubTitle = ''; var imgUrl = ""; try{ epTitle = data.split('class="fs18 lh11"')[1].split('</h2>')[0].split('</span>')[1]; if(epTitle.trim() != '<span class="ml8 icon-episode-type-bg">'){ epTitle = '#'+episode+" - "+epTitle+'<br>'; }else{ epTitle = ''; } }catch(e){} if(episodeInfoSubtitle){ try{ epSubTitle = data.split('<p class="fn-grey2"')[1].split('</p>')[0].split('>')[1].replace(/^\s+/g, ""); epSubTitle = " <small>"+epSubTitle+'</small><br>'; }catch(e){} } if(episodeInfoSynopsis){ try{ synopsis = data.split('Synopsis</h2>')[1].split('</div>')[0].replace(/^\s+/g, ""); if( synopsis.indexOf("badresult") > -1 || synopsis == ""){ synopsis = ""; }else{ synopsis = '<div style="border: 1px solid; margin-top: 15px; padding: 8px;">'+synopsis+'</div>'; } }catch(e){} } var imgHtml = ''; if(episodeInfoImage){ try{ imgUrl = data.split('"isCurrent":true')[0].split('{').slice(-1)[0].split('"thumbnail":"')[1].split('"')[0].replace(/\\\//g, '/'); }catch(e){} if(imgUrl != ''){ imgHtml = '<img style = "margin-top: 15px; height: 100px;" src="'+imgUrl+'"/>'; } } var synopsisHtml = '<div style="overflow: hidden; text-align: left; max-width: 0; max-height: 0;" class="synopsis">'+synopsis+'</div>'; if(epTitle != ''){ flashm ( '<div class="flasm-hover" style="/*display: flex;*/ align-items: center;"><div style="white-space: nowrap;"">'+epTitle + epSubTitle + imgHtml + "</div>"+ message +" </div>" + synopsisHtml, false, true); }else if( message != '' ){ flashm ( message , false, true); } $('.undoButton').click(clickCallback); } }, onerror: function(error) { con.log("[episodeInfo] error:",error); } }); } } var miniMalButtonLate = ''; var miniMalButtonKey = 0; function miniMalButton(url = null){ miniMalButtonLate = url; $(".open-info-popup").unbind('click').show().click( function(){ if($('#info-popup').css('display') == 'none'){ document.getElementById('info-popup').style.display = "block"; fillIframe(url, currentMalData); $('.floatbutton').fadeOut(); }else{ document.getElementById('info-popup').style.display = "none"; $('.floatbutton').fadeIn(); } }); if(!miniMalButtonKey){ miniMalButtonKey = 1; $("#info-iframe").contents().keydown(function(e) { keys(e); }); $(document).keydown(function(e) { keys(e); }); } function keys(e){ if (e.ctrlKey && e.keyCode === 77) { if($('#info-popup').css('display') == 'none'){ document.getElementById('info-popup').style.display = "block"; fillIframe(url, currentMalData); $('.floatbutton').fadeOut(); }else{ document.getElementById('info-popup').style.display = "none"; $('.floatbutton').fadeIn(); } } } } function atobURL( encoded ){ try{ return atob( encoded ); }catch(e){ return encoded; } } $.urlParam = function(name){ var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href); if (results==null){ return null; } else{ return decodeURI(results[1]) || 0; } } function getTooltip(text, style = '', direction = 'top'){ var rNumber = Math.floor((Math.random() * 1000) + 1); return '<div id="tt'+rNumber+'" class="icon material-icons" style="font-size:16px; line-height: 0; color: #7f7f7f; padding-bottom: 20px; padding-left: 3px; '+style+'"> 🛈</div>\ <div class="mdl-tooltip mdl-tooltip--'+direction+' mdl-tooltip--large" for="tt'+rNumber+'">'+text+'</div>'; } //Status: 1 = watching | 2 = completed | 3 = onhold | 4 = dropped | 6 = plan to watch | 7 = all function getUserList(status = 1, localListType = 'anime', singleCallback = null, finishCallback = null, fullListCallback = null, continueCall = null, username = null, offset = 0, templist = []){ con.log('[UserList]', 'username: '+username, 'status: '+status, 'offset: '+offset); if(username == null){ getMalUserName(function(usernameTemp){ if(usernameTemp == false){ flashm( "Please log in on <a target='_blank' href='https://myanimelist.net/login.php'>MyAnimeList!<a>" , true); }else{ getUserList(status, localListType, singleCallback, finishCallback, fullListCallback, continueCall, usernameTemp, offset, templist); } }); return; } var url = 'http://myanimelist.net/'+localListType+'list/'+username+'/load.json?offset='+offset+'&status='+status; GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onload: function(response) { var data = $.parseJSON(response.response); if(singleCallback){ if(!data.length) singleCallback(false, 0, 0); for (var i = 0; i < data.length; i++) { singleCallback(data[i], i+offset+1, data.length+offset); } } if(fullListCallback){ templist = templist.concat(data); } if(data.length > 299){ if(continueCall){ continueCall(function(){ getUserList(status, localListType, singleCallback, finishCallback, fullListCallback, continueCall, username, offset + 300, templist); }); }else{ getUserList(status, localListType, singleCallback, finishCallback, fullListCallback, continueCall, username, offset + 300, templist); } }else{ if(fullListCallback) fullListCallback(templist); if(finishCallback) finishCallback(); } } }); } function getMalUserName(callback){ var url = 'https://myanimelist.net/editlist.php?hideLayout'; GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onload: function(response) { try{ var username = response.response.split('USER_NAME = "')[1].split('"')[0]; }catch(e){ var username = false; } con.log('[Username]', username); callback(username); } }); } $.fn.isInViewport = function() { var elementTop = $(this).offset().top; var elementBottom = elementTop + $(this).outerHeight(); var viewportTop = $(window).scrollTop(); var viewportBottom = viewportTop + $(window).height(); return elementBottom > viewportTop && elementTop < viewportBottom; }; var uiLoaded = 0; function checkdata(){ if(K.normalUrl() !== ""){ getanime(K.normalUrl(), function(anime){handleanime(anime);}); }else{ alert(error); } K.docReady(function() { var wrapStart = '<span style="display: inline-block;">'; var wrapEnd = '</span>'; var ui = '<p id="malp">'; ui += '<span id="MalInfo">'+loadingText+'</span>'; ui += '<span id="MalData" style="display: none; justify-content: space-between; flex-wrap: wrap;">'; ui += wrapStart; ui += '<span class="info">MAL Score: </span>'; ui += '<a id="malRating" style="color: '+K.textColor+';min-width: 30px;display: inline-block;" target="_blank" href="">____</a>'; ui += wrapEnd; //ui += '<span id="MalLogin">'; wrapStart = '<span style="display: inline-block; display: none;" class="MalLogin">'; ui += wrapStart; ui += '<span class="info">Status: </span>'; ui += '<select id="malStatus" style="font-size: 12px;background: transparent; border-width: 1px; border-color: grey; color: '+K.textColor+'; text-decoration: none; outline: medium none;">'; //ui += '<option value="0" style="background: #111111;color: '+K.textColor+';"></option>'; ui += '<option value="1" style="background: #111111;color: '+K.textColor+';">'+watching+'</option>'; ui += '<option value="2" style="background: #111111;color: '+K.textColor+';">Completed</option>'; ui += '<option value="3" style="background: #111111;color: '+K.textColor+';">On-Hold</option>'; ui += '<option value="4" style="background: #111111;color: '+K.textColor+';">Dropped</option>'; ui += '<option value="6" style="background: #111111;color: '+K.textColor+';">'+planTo+'</option>'; ui += '</select>'; ui += wrapEnd; if(K.listType == 'anime'){ var middle = ''; middle += wrapStart; middle += '<span class="info">Episodes: </span>'; middle += '<span style="color: '+K.textColor+'; text-decoration: none; outline: medium none;">'; middle += '<input id="malEpisodes" value="0" style="background: transparent; border-width: 1px; border-color: grey; text-align: right; color: '+K.textColor+'; text-decoration: none; outline: medium none;" type="text" size="1" maxlength="4">'; middle += '/<span id="malTotal">0</span>'; middle += '</span>'; middle += wrapEnd; }else{ var middle = ''; middle += wrapStart; middle += '<span class="info">Volumes: </span>'; middle += '<span style="color: '+K.textColor+'; text-decoration: none; outline: medium none;">'; middle += '<input id="malVolumes" value="0" style="background: transparent; border-width: 1px; border-color: grey; text-align: right; color: '+K.textColor+'; text-decoration: none; outline: medium none;" type="text" size="1" maxlength="4">'; middle += '/<span id="malTotalVol">0</span>'; middle += '</span>'; middle += wrapEnd; middle += wrapStart; middle += '<span class="info">Chapters: </span>'; middle += '<span style="color: '+K.textColor+'; text-decoration: none; outline: medium none;">'; middle += '<input id="malChapters" value="0" style="background: transparent; border-width: 1px; border-color: grey; text-align: right; color: '+K.textColor+'; text-decoration: none; outline: medium none;" type="text" size="1" maxlength="4">'; middle += '/<span id="malTotalCha">0</span>'; middle += '</span>'; middle += wrapEnd; } ui += middle; ui += wrapStart; ui += '<span class="info">Your Score: </span>'; ui += '<select id="malUserRating" style="font-size: 12px;background: transparent; border-width: 1px; border-color: grey; color: '+K.textColor+'; text-decoration: none; outline: medium none;"><option value="" style="background: #111111;color: '+K.textColor+';">Select</option>'; ui += '<option value="10" style="background: #111111;color: '+K.textColor+';">(10) Masterpiece</option>'; ui += '<option value="9" style="background: #111111;color: '+K.textColor+';">(9) Great</option>'; ui += '<option value="8" style="background: #111111;color: '+K.textColor+';">(8) Very Good</option>'; ui += '<option value="7" style="background: #111111;color: '+K.textColor+';">(7) Good</option>'; ui += '<option value="6" style="background: #111111;color: '+K.textColor+';">(6) Fine</option>'; ui += '<option value="5" style="background: #111111;color: '+K.textColor+';">(5) Average</option>'; ui += '<option value="4" style="background: #111111;color: '+K.textColor+';">(4) Bad</option>'; ui += '<option value="3" style="background: #111111;color: '+K.textColor+';">(3) Very Bad</option>'; ui += '<option value="2" style="background: #111111;color: '+K.textColor+';">(2) Horrible</option>'; ui += '<option value="1" style="background: #111111;color: '+K.textColor+';">(1) Appalling</option>'; ui += '</select>'; ui += wrapEnd; //ui += '</span>'; ui += '</span>'; ui += '</p>'; var uihead =''; uihead += '<p class="headui" style="float: right; margin: 0; margin-right: 10px">'; uihead += ''; uihead += '</p>'; var uiwrong =''; uiwrong += '<button class="open-info-popup mdl-button" style="display:none; margin-left: 6px;">MAL</button>'; if(!uiLoaded){ uiLoaded = 1; K.uiPos($(ui)); K.uiWrongPos($(uiwrong)); K.uiHeadPos($(uihead)); $( "#malEpisodes" ).change(function() { updatebutton(); }); //####Manga#### $( "#malVolumes" ).change(function() { updatebutton(); }); $( "#malChapters" ).change(function() { updatebutton(); }); //############# $( "#malUserRating" ).change(function() { updatebutton(); }); $( "#malStatus" ).change(function() { updatebutton(); }); createIframe(); //#######Kissanime####### $("#btnRemoveBookmark").click(function() { var anime = {}; anime['.add_'+K.listType+'[status]'] = 4; anime['forceUpdate'] = 1; setanime(K.normalUrl(),anime); }); $("#btnAddBookmark").click(function() { var anime = {}; anime['.add_'+K.listType+'[status]'] = 6; anime['forceUpdate'] = 1; setanime(K.normalUrl(),anime); }); //####################### } }); } var xml =""; var foundAnime = []; //var imageBackup = "Mal-img"; var image = "image"; function getMalXml(user = "", callback = null){ var url = "https://myanimelist.net/editprofile.php?go=privacy"; if(user !== ""){ url = "https://myanimelist.net/malappinfo.php?u="+user+"&status=all&type="+K.listType; con.log("XML Url:", url); } GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onload: function(response) { if(url === "https://myanimelist.net/editprofile.php?go=privacy"){ try{ user = response.responseText.split('<a href="https://myanimelist.net/profile/')[1].split('"')[0]; }catch(e){ flashm( "Please log in on <a target='_blank' href='https://myanimelist.net/login.php'>MyAnimeList!<a>" , true); $('.listing tr td:nth-child(1)').css('height', 'initial'); $('.listing tr td:nth-child(1)').css('padding-left', '0'); return; } con.log("User:" ,user); getMalXml(user, callback); return; } if(callback == null){ xml = $(response.responseXML); setAll(); }else{ callback( $(response.responseXML) ); } } }); } function encodeurl(string){ return encodeURIComponent(encodeURIComponent(string).replace('.', '%2E')); } function setBookmarkAnime(value, baseurl, target, last = 0){ var id = value.split("/")[4]; con.log(id); foundAnime.push(id); var xmlAnime = xml.find('series_'+K.listType+'db_id:contains('+id+')').parent(); getdata(baseurl, function(value) { setimage(value, xmlAnime, target, baseurl); }, image); if(xmlAnime.length === 0){ if(id == 'Not-Found'){ target.find(".MalData").first().append("No Mal"); }else{ target.find(".MalData").first().append("<a href='#' onclick='return false;'>Add to Mal</a>").find("a").click(function() { var anime = {}; anime['.add_'+K.listType+'[status]'] = 6; setanime(baseurl,anime); }); } }else{ var totalEp = xmlAnime.find("series_"+middleType).first().text(); if(totalEp === '0'){ totalEp = "?"; } setepisode (xmlAnime.find("my_"+middleVerb+"_"+middleType).first().text(), totalEp , target, baseurl); setstatus (xmlAnime.find("my_status").first().text() , target, baseurl); setscore (xmlAnime.find("my_score").first().text() , target, baseurl); } if(last === 1){ //TODO: con.log(foundAnime); //MalExistsOnKiss(foundAnime); } } function setimage(value, xmlAnime, target, baseurl){ if(classicBookmarks == 0){ if(typeof value === "undefined" || value === null){ if(baseurl === ""){ return; } //getdata(baseurl, function(value) { setimage(value, xmlAnime, target, ""); }, imageBackup); return; } target.find("td").first().html("<img src='"+value+"' width='120px' height='150px'></img>"); /*target.find("td").first().find("img").error(function() { //TODO: Send to Database and only execute one time so no loop getdata(baseurl, function(value) { setimage(value, xmlAnime, target, ""); }, imageBackup); });*/ } } function setepisode(episode, totalEp, target, baseurl){ target.find(".MalData").first().append('<div class="malEpisode"><input class="input" type="number" min="0" max="'+totalEp+'" value="'+episode+'" size="1" maxlength="4" style="display: none;background: transparent; border-width: 1px; border-color: grey; text-align: right; color: '+K.textColor+'; text-decoration: none; outline: medium none; max-width: 50px;"/><span class="normal">'+episode+'</span> / '+totalEp+'</div>'); target.find(".MalData").first().find('.malEpisode').click( function() { $( this ).find('.input').css('display', 'initial'); $( this ).find('.normal').css('display', 'none'); }).change(function() { var anime = {}; anime['.add_'+K.listType+'[num_'+middleVerb+'_'+middleType+']'] = $(this).parent().find('.malEpisode').find('.input').val(); anime['.add_'+K.listType+'[status]'] = $(this).parent().find('.malStatus').val(); anime['.add_'+K.listType+'[score]'] = $(this).parent().find('.malUserRating').val(); setanime(baseurl,anime); }); } function setstatus(value, target, baseurl){ if(target.find(".malStatus").first().height() === null){ var ui = ""; ui += '<select class="malStatus" style="width: 100%; font-size: 12px; background: transparent; border-width: 0px; border-color: grey; color: '+K.textColor+'; text-decoration: none; outline: medium none;">'; //ui += '<option value="0" style="background: #111111;color: #d5f406;"></option>'; ui += '<option value="1" style="background: #111111;color: '+K.textColor+';">'+watching+'</option>'; ui += '<option value="2" style="background: #111111;color: '+K.textColor+';">Completed</option>'; ui += '<option value="3" style="background: #111111;color: '+K.textColor+';">On-Hold</option>'; ui += '<option value="4" style="background: #111111;color: '+K.textColor+';">Dropped</option>'; ui += '<option value="6" style="background: #111111;color: '+K.textColor+';">'+planTo+'</option>'; ui += '</select>'; target.find(".MalData").first().append(""+ui).find('.malStatus').change(function() { var anime = {}; anime['.add_'+K.listType+'[num_'+middleVerb+'_'+middleType+']'] = $(this).parent().find('.malEpisode').find('.input').val(); anime['.add_'+K.listType+'[status]'] = $(this).parent().find('.malStatus').val(); anime['.add_'+K.listType+'[score]'] = $(this).parent().find('.malUserRating').val(); setanime(baseurl,anime); }); } target.find(".malStatus").first().val(value); } function setscore(value, target, baseurl){ if(target.find(".malUserRating").first().height() === null){ var ui = ""; ui += '<select class="malUserRating" style="width: 100%; font-size: 12px; background: transparent; border-width: 0px; border-color: grey; color: '+K.textColor+'; text-decoration: none; outline: medium none;"><option value="" style="background: #111111;color: '+K.textColor+';">Select</option>'; ui += '<option value="10" style="background: #111111;color: '+K.textColor+';">(10) Masterpiece</option>'; ui += '<option value="9" style="background: #111111;color: '+K.textColor+';">(9) Great</option>'; ui += '<option value="8" style="background: #111111;color: '+K.textColor+';">(8) Very Good</option>'; ui += '<option value="7" style="background: #111111;color: '+K.textColor+';">(7) Good</option>'; ui += '<option value="6" style="background: #111111;color: '+K.textColor+';">(6) Fine</option>'; ui += '<option value="5" style="background: #111111;color: '+K.textColor+';">(5) Average</option>'; ui += '<option value="4" style="background: #111111;color: '+K.textColor+';">(4) Bad</option>'; ui += '<option value="3" style="background: #111111;color: '+K.textColor+';">(3) Very Bad</option>'; ui += '<option value="2" style="background: #111111;color: '+K.textColor+';">(2) Horrible</option>'; ui += '<option value="1" style="background: #111111;color: '+K.textColor+';">(1) Appalling</option>'; ui += '</select>'; target.find(".MalData").first().append("</br>"+ui).find('.malUserRating').change(function() { var anime = {}; anime['.add_'+K.listType+'[num_'+middleVerb+'_'+middleType+']'] = $(this).parent().find('.malEpisode').find('.input').val(); anime['.add_'+K.listType+'[status]'] = $(this).parent().find('.malStatus').val(); anime['.add_'+K.listType+'[score]'] = $(this).parent().find('.malUserRating').val(); setanime(baseurl,anime); }); } target.find(".malUserRating").first().val(value); } function clearCache(){ con.log('Before',GM_listValues()); var cacheArray = GM_listValues(); $.each( cacheArray, function( index, cache){ if(/^[^/]+\/[^/]+\/Mal$/.test(cache)){ GM_deleteValue(cache); } if(/^[^/]+\/[^/]+\/MalToKiss$/.test(cache)){ GM_deleteValue(cache); } if(/^[^/]+\/[^/]+\/bdid$/.test(cache)){ GM_deleteValue(cache); } if(/^[^/]+\/[^/]+\/image$/.test(cache)){ GM_deleteValue(cache); } if(/^newEp_.*/.test(cache)){ GM_deleteValue(cache); } if('timestampUpdate/release' == cache){ GM_deleteValue(cache); } }); con.log('After',GM_listValues()); flashm( "Cache Cleared" , false); } function MalExistsOnKiss(animelist){ var row = ""; var xmlEntry = ""; $(".listing").html("");//TODO remove; xml.find('series_'+K.listType+'db_id').each(function(index){ if((jQuery.inArray( $(this).text(), animelist ) ) < 0){ con.log($(this).text()); xmlEntry = $(this).parent(); row = ""; row += '<tr class="trAnime">'; row += '<td class="Timage" style="padding-left: 0px; height: 150px; vertical-align: top;">'; row += '<img src="'+xmlEntry.find("series_image").first().text()+'" width="120px" height="150px">'; row += '</td>'; row += '<td style="vertical-align: top;">'; row += '<div class="title" style="padding-bottom: 10px;">'; row += '<a class="aAnime" href="https://myanimelist.net/'+K.listType+'/'+xmlEntry.find("series_"+K.listType+"db_id").first().text()+'">'+xmlEntry.find("series_title").first().text()+'</a>'; row += '</div>'; row += '</td>'; row += '</tr>'; $(".listing").before(row); } }); } function getdata(baseurl, callback, parth = ""){ if(GM_getValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(baseurl))+'/'+parth , null) !== null ){ con.log("cache:", K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(baseurl))+'/'+parth); var value = GM_getValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(baseurl))+'/'+parth , null); callback(value); }else{ con.log("db:", K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(baseurl))+'/'+parth); var url = 'https://kissanimelist.firebaseio.com/Data2/'+K.dbSelector+'/'+encodeURIComponent(encodeURIComponent($.titleToDbKey(K.urlAnimeSelector(baseurl)))).toLowerCase()+'/'+parth+'.json'; GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onload: function(response) { //con.log(response); if( response.responseText != null && response.responseText != 'null'){ var newResponse = response.responseText.slice(1, -1); if(parth == 'Mal'){ newResponse = 'https://myanimelist.net/'+K.listType+'/'+response.responseText.split('"')[1]+'/'+response.responseText.split('"')[3]; } GM_setValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(baseurl))+'/'+parth , newResponse); callback(newResponse); } } }); } } function setAll(){ K.docReady(function() { K.bookmarkEntrySelector().each(function() { var thistd = $(this).find("td").first(); $(this).find("td").first().children().first().wrap('<div class="title" style="padding-bottom: 10px;"></div>'); var append = '<div style="width: 50%; float: left;" class="kissData"></div><div style="width: 50%; float: left;" class="MalData"></div>'; $(this).find("td").first().append(append); $(this).find("td").each(function(index){ if(index > 0){ $(this).appendTo(thistd.find(".kissData")); //text += $(this).html()+"<br/>"; //$(this).remove(); }else{ //text += '<div class="title" style="padding-bottom: 10px;">'+$(this).html()+'</div><div style="width: 50%; float: left;" class="kiss">'; } }); $(this).find("td").first().find("td").append("<br />").contents().unwrap(); }); if($("#cssTableSet").height() === null){ K.BookmarksStyleAfterLoad(); }else{ return; } var len = K.bookmarkEntrySelector().length; K.bookmarkEntrySelector().bind('inview', function (event, visible) { if (visible === true) { var baseurl = $.absoluteLink($(this).find("a").first().attr('href')); var target = $(this); getdata(baseurl,function(value) { setBookmarkAnime(value, baseurl, target); }, "Mal"); $(this).unbind('inview'); } }); $(window).scroll(); }); } function displaySites(responsearray, page){ if($('#'+page+'Links').width() == null){ $('#siteSearch').before('<h2 id="'+page+'Links" class="mal_links"><img src="https://www.google.com/s2/favicons?domain='+responsearray['url'].split('/')[2]+'"> '+page+'</h2><br class="mal_links" />'); } if($("#info-iframe").contents().find('#'+page+'Links').width() == null){ $("#info-iframe").contents().find('.stream-block-inner').append('<li class="mdl-list__item mdl-list__item--three-line"><span class="mdl-list__item-primary-content"><span><img style="padding-bottom: 3px;" src="https://www.google.com/s2/favicons?domain='+responsearray['url'].split('/')[2]+'"> '+page+'</span><span id="'+page+'Links" class="mdl-list__item-text-body"></span></span></li>'); } $('#'+page+'Links').after('<div class="mal_links"><a target="_blank" href="'+responsearray['url']+'">'+responsearray['title']+'</a><div>'); $("#info-iframe").contents().find('#'+page+'Links').append('<div><a target="_blank" href="'+responsearray['url']+'">'+responsearray['title']+'</a><div>'); $("#info-iframe").contents().find('.stream-block').show(); } function getSites(sites, page){ $.each(sites, function(index, value){ if( GM_getValue( value+'/'+encodeURIComponent(index)+'/MalToKiss', null) != null ){ con.log('[2Kiss] Cache' ); var responsearray = $.parseJSON(GM_getValue( value+'/'+encodeURIComponent(index)+'/MalToKiss', null)); displaySites(responsearray, page); }else{ GM_xmlhttpRequest({ url: 'https://kissanimelist.firebaseio.com/Data2/'+value+'/'+encodeURIComponent(index)+'.json', method: "GET", onload: function (response) { con.log('[2Kiss] ',response.response); if(response.response != null){ var responsearray = $.parseJSON(response.response); if( value == 'Crunchyroll' ){ responsearray['url'] = responsearray['url'] + '?season=' + index; } GM_setValue( value+'/'+encodeURIComponent(index)+'/MalToKiss', '{"title":"'+responsearray['title']+'","url":"'+responsearray['url']+'"}' ); displaySites(responsearray, page); } }, onerror: function(error) { con.log("error: "+error); } }); } }); } function setKissToMal(malUrl){ $(document).ready(function() { $('.mal_links').remove(); var type = malUrl.split('/')[3]; var uid = malUrl.split('/')[4].split("?")[0]; var sites = new Array(); var sitesName = new Array(); var searchLinks = 0; if(type == 'anime'){ if(kissanimeLinks != 0){ sites.push('Kissanime'); sitesName['Kissanime'] = 'KissAnime'; searchLinks = 1; } if(masteraniLinks != 0){ sites.push('Masterani'); sitesName['Masterani'] = 'MasterAnime'; searchLinks = 1; } if(nineanimeLinks != 0){ sites.push('9anime'); sitesName['9anime'] = '9anime'; searchLinks = 1; } if(crunchyrollLinks != 0){ sites.push('Crunchyroll'); sitesName['Crunchyroll'] = 'Crunchyroll'; searchLinks = 1; } if(gogoanimeLinks != 0){ sites.push('Gogoanime'); sitesName['Gogoanime'] = 'Gogoanime'; searchLinks = 1; } }else{ if(kissmangaLinks != 0){ sites.push('Kissmanga'); sitesName['Kissmanga'] = 'KissManga'; searchLinks = 1; } if(mangadexLinks != 0){ sites.push('Mangadex'); sitesName['Mangadex'] = 'MangaDex'; searchLinks = 1; } } if(searchLinks != 0){ $('h2:contains("Information")').before('<h2 id="siteSearch" class="mal_links">Search</h2><br class="mal_links" />'); if(type == 'anime'){ $('#siteSearch').after('<div class="mal_links"></div>'); if(masteraniLinks != 0) $('#siteSearch').after('<div class="mal_links"><a target="_blank" href="http://www.google.com/search?q=site:www.masterani.me/anime/info/+'+encodeURI($('#contentWrapper > div:first-child span').text())+'">MasterAnime (Google)</a> <a target="_blank" href="https://www.masterani.me/anime?search='+$('#contentWrapper > div:first-child span').text()+'">(Site)</a></div>'); if(gogoanimeLinks != 0) $('#siteSearch').after('<div class="mal_links"><a target="_blank" href="http://www.gogoanime.tv/search.html?keyword='+$('#contentWrapper > div:first-child span').text()+'">Gogoanime</a></div>'); if(crunchyrollLinks != 0) $('#siteSearch').after('<div class="mal_links"><a target="_blank" href="http://www.crunchyroll.com/search?q='+$('#contentWrapper > div:first-child span').text()+'">Crunchyroll</a></div>'); if(nineanimeLinks != 0) $('#siteSearch').after('<div class="mal_links"><a target="_blank" href="https://9anime.to/search?keyword='+$('#contentWrapper > div:first-child span').text()+'">9anime</a></div>'); if(kissanimeLinks != 0) $('#siteSearch').after('<form class="mal_links" target="_blank" action="http://kissanime.ru/Search/Anime" id="kissanimeSearch" method="post" _lpchecked="1"><a href="#" onclick="return false;" class="submitKissanimeSearch">KissAnime</a><input type="hidden" id="keyword" name="keyword" value="'+$('#contentWrapper > div:first-child span').text()+'"/></form>'); $('.submitKissanimeSearch').click(function(){ $('#kissanimeSearch').submit(); }); }else{ if(mangadexLinks != 0) $('#siteSearch').after('<div class="mal_links"><a target="_blank" href="https://mangadex.org/quick_search/'+$('#contentWrapper > div:first-child span').text()+'">MangaDex</a></div>'); if(kissmangaLinks != 0) $('#siteSearch').after('<form class="mal_links" target="_blank" action="http://kissmanga.com/Search/Manga" id="kissmangaSearch" method="post" _lpchecked="1"><a href="#" onclick="return false;" class="submitKissmangaSearch">KissManga</a><input type="hidden" id="keyword" name="keyword" value="'+$('#contentWrapper > div:first-child span').text()+'"/></form>'); $('.submitKissmangaSearch').click(function(){ $('#kissmangaSearch').submit(); }); } }else{ $('h2:contains("Information")').before('<div class="mal_links" id="siteSearch"></div>'); } $.each( sites, function( index, page ){ var url = 'https://kissanimelist.firebaseio.com/Data2/Mal'+type+'/'+uid+'/Sites/'+page+'.json'; GM_xmlhttpRequest({ url: url, method: "GET", onload: function (response) { con.log('[2Kiss]', url, response.response); if(response.response != 'null'){ getSites($.parseJSON(response.response), sitesName[page]); } }, onerror: function(error) { con.log("[setKissToMal] error:",error); } }); }); }); } function malThumbnails(){ if(window.location.href.indexOf("/pics") > -1){ return; } if(window.location.href.indexOf("/pictures") > -1){ return; } if(malThumbnail == "0"){ return; } var height = parseInt(malThumbnail); var width = Math.floor(height/144*100); var surHeight = height+4; var surWidth = width+4; GM_addStyle('.picSurround img:not(.noKal){height: '+height+'px !important; width: '+width+'px !important;}'); GM_addStyle('.picSurround img.lazyloaded.kal{width: auto !important;}'); GM_addStyle('.picSurround:not(.noKal) a{height: '+surHeight+'px; width: '+surWidth+'px; overflow: hidden; display: flex; justify-content: center;}'); try{ window.onload = function(){ overrideLazyload(); }; document.onload = function(){ overrideLazyload(); }; }catch(e){ $(document).ready(function(){ overrideLazyload(); }); } function overrideLazyload() { var tags = document.querySelectorAll(".picSurround img:not(.kal)"); var url = ''; for (var i = 0; i < tags.length; i++) { var regexDimensions = /\/r\/\d*x\d*/g; if(tags[i].hasAttribute("data-src")){ url = tags[i].getAttribute("data-src"); }else{ url = tags[i].getAttribute("src"); } if ( regexDimensions.test(url) || /voiceactors.*v.jpg$/g.test(url) ) { if(!(url.indexOf("100x140") > -1)){ tags[i].setAttribute("data-src", url); url = url.replace(/v.jpg$/g, '.jpg'); tags[i].setAttribute("data-srcset", url.replace(regexDimensions, '')); tags[i].classList.add('lazyload'); } tags[i].classList.add('kal'); }else{ tags[i].closest(".picSurround").classList.add('noKal'); tags[i].classList.add('kal'); tags[i].classList.add('noKal'); } } } } var tagToContinueNumber = 0; function tagToContinue(){ tagToContinueNumber++; if(tagLinks == 0){ return false; } if(tagToContinueNumber > 1){ alternativeTagOnSite(); return true; } $(window).load(function(){ var checkExist = setInterval(function() { if ($('.list-item').first().length || $('.header_cw').first().length){ clearInterval(checkExist); var url = ''; //Classic List formating var span = ''; if($('#list_surround').length){ span = 'span'; }; $('#list_surround table').addClass("list-table-data"); $('#list_surround table .animetitle').parent().addClass("title").addClass("data"); $('#list_surround table .animetitle').addClass("link"); $('.table_header').each(function(index){ if($(this).find('strong a:contains(Progress), a:contains(Chapters)').length){ $('#list_surround table td[class^="td"]:nth-child('+(index+1)+')').addClass("progress").addClass("data").find('a span').addClass('link'); } if($('strong:contains(Tags)').length){ $('#list_surround table td[class^="td"]:nth-child('+(index+1)+')').addClass("tags"); //.css('background-color','red'); } }) // tagToContinueEpPrediction(); if( $('.header-title.tags').length || $('.td1.tags').length){ $('.tags span a').each(function( index ) { if($(this).text().indexOf("last::") > -1 ){ url = atobURL( $(this).text().split("last::")[1].split("::")[0] ); setStreamLinks(url, $(this).closest('.list-table-data')); if($(this).closest('.list-table-data').find('.watching , .reading').length || $('#list_surround').length){ checkForNewEpisodes(url, $(this).closest('.list-table-data'), $(this).closest('.list-table-data').find('.title .link '+span).text(), $(this).closest('.list-table-data').find('.link img.image').attr('src')); } if($('#list_surround').length){ $(this).remove(); }else{ $(this).parent().remove(); } } }); startCheckForNewEpisodes(); }else{ alternativeTagOnSite(); } return true; } }, 300); }); } function alternativeTagOnSite(){ if($('.list-table').length){ con.log('[BOOK] Modern Tags'); var data = $.parseJSON($('.list-table').attr('data-items')); $.each(data,function(index, el) { if(el['tags'].indexOf("last::") > -1){ var url = atobURL( el['tags'].split("last::")[1].split("::")[0] ); setStreamLinks(url, $('.list-item a[href^="'+el[K.listType+'_url']+'"]').parent().parent('.list-table-data')); if( parseInt(el['status']) === 1 ){ checkForNewEpisodes(url, $('.list-item a[href^="'+el[K.listType+'_url']+'"]').parent().parent('.list-table-data'), el[K.listType+'_title'], el[K.listType+'_image_path']); } } }); startCheckForNewEpisodes(); }else{ con.log('[BOOK] Classic Tags'); alternativTagToContinue(); } } function alternativTagToContinue(){ var user = window.location.href.split('/')[4].split('?')[0]; K.listType = window.location.href.split('.net/')[1].split('list')[0]; url = "https://myanimelist.net/malappinfo.php?u="+user+"&status=all&type="+K.listType; con.log("[BOOK] XML Url:", url); GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onload: function(response) { //con.log(response); var xml = $(response.responseXML); var title = ''; var xmlAnime = ''; var span = ''; if($('#list_surround').length){ span = 'span'; }; $('.list-table-data').each(function( index ) { title = $(this).find('.title .link '+span).text(); xmlAnime = xml.find('series_title:contains('+title+')').first().parent(); if(xmlAnime.find('my_tags').text().indexOf("last::") > -1 ){ url = atobURL( xmlAnime.find('my_tags').text().split("last::")[1].split("::")[0] ); setStreamLinks(url, $(this)); if(parseInt(xmlAnime.find('my_status').text()) === 1){ checkForNewEpisodes(url, $(this), xmlAnime.find('series_title').text(), xmlAnime.find('series_image').text()); } } }); startCheckForNewEpisodes(); } }); } function setStreamLinks(url, tableData){ if(url.indexOf("masterani.me") > -1 && url.indexOf("/watch/") > -1){ url = url.replace('/watch/','/info/'); } var icon = '<img src="https://www.google.com/s2/favicons?domain='+url.split('/')[2]+'">' $(tableData).find('.data.title .link').after('<a class="stream" title="'+url.split('/')[2]+'" target="_blank" style="margin: 0 5px;" href="'+url+'">'+icon+'</a>'); if(parseInt($(tableData).find('.data.progress .link').text().trim().replace(/\/.*/,''))+1 == GM_getValue( url+'/next') || GM_getValue( url+'/next') == 'manga'){ if(typeof GM_getValue( url+'/nextEp') != 'undefined' && !( GM_getValue( url+'/nextEp').match(/undefined$/) )){ $(tableData).find('.stream').after('<a class="nextStream" title="Next Episode" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="'+ GM_getValue( url+'/nextEp')+'">'+'<img src="https://raw.githubusercontent.com/lolamtisch/KissAnimeList/master/Screenshots/if_Double_Arrow_Right_1063903.png" width="16" height="16">'+'</a>'); } } } function detailsPopup(){ $(window).load(function(){ $('a[href*="editlist.php"]').click(function(){ $('.editlist').remove(); $('body').after('<div class="editlist" style="position: fixed; width: 80%; height: 60%; top: 20%; left: 10%;"><div onclick="this.parentElement.remove();" style="position: absolute; right: -15px; top: -15px; border-radius: 50%;-moz-border-radius: 50%;-webkit-border-radius: 50%;background-color: black;color: white;height: 30px;width: 30px;" class="closeEditList">X</div><iframe style="border: none; height: 100%; width: 100%;" src="'+$(this).attr('href')+'&hideLayout" /></div>') return false; }); }); } function tagToContinueEpPrediction(){ var modernList = 0; $('.list-table .list-item').each(function(){ modernList = 1; var el = $(this); var malid = el.find('.link').first().attr('href').split('/')[2]; epPrediction( malid , function(timestamp, airing, diffWeeks, diffDays, diffHours, diffMinutes){ el.find('.data.progress span').first().after( epPredictionMessage(timestamp, airing, diffWeeks, diffDays, diffHours, diffMinutes) ); }); }); if(modernList) return; //Classic $('.progress.data').each(function(){ var el = $(this).closest('.list-table-data'); var malid = el.find('.link').first().attr('href').split('/')[2]; epPrediction( malid , function(timestamp, airing, diffWeeks, diffDays, diffHours, diffMinutes){ el.find('.data.progress').first().prepend( epPredictionMessage(timestamp, airing, diffWeeks, diffDays, diffHours, diffMinutes) ); }); }); function epPredictionMessage(timestamp, airing, diffWeeks, diffDays, diffHours, diffMinutes){ if(airing){ diffWeeks = diffWeeks - (new Date().getFullYear() - new Date(timestamp).getFullYear()); //Remove 1 week between years if(diffWeeks < 50){ var titleMsg = 'Next episode estimated in '+diffDays+'d '+diffHours+'h '+diffMinutes+'m'; return '<a class="kal-ep-pre" ep="'+(diffWeeks+1)+'" title="'+titleMsg+'">['+(diffWeeks+1)+']</a> '; } } } } if(K.dbSelector == 'Kissanime'){ $( document).ready( function(){ if( window.location.href.indexOf("BookmarkList") > -1 ){ var catOptions = ''; catOptions +='<option value="">Select</option>'; $.each(lstCats, function( index, value ) { catOptions +='<option value="'+value+'">'+value+'</option>'; }); catOptions = '<select class="selectCats" style="width: 200px; font-size: 14px;">'+catOptions+'</select>'; con.log(catOptions); GM_setValue(K.dbSelector+'catOptions',catOptions); $('.trAnime').each(function(){ var aurl = $.absoluteLink($(this).find('.aAnime').attr('href')); con.log(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.urlAnimeIdent(aurl)))+'/bdid',$(this).find('.aCategory').attr('bdid')); GM_setValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.urlAnimeIdent(aurl)))+'/bdid',$(this).find('.aCategory').attr('bdid')); }); }else{ var bdid = GM_getValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.urlAnimeIdent(K.normalUrl())))+'/bdid', null); if(bdid != null){ $('#spanBookmarkManager').before('<a class="aCategory" href="#" onclick="return false;" title="Move to other folder"><img border="0" style="vertical-align:middle" src="/Content/Images/folder.png"> Folder</a> '); $('.aCategory').click(function () { $(this).hide(); var aCat= $(this); $(this).after(GM_getValue(K.dbSelector+'catOptions',"")); $('body').on('change', '.selectCats', function() { var element = $(this); var strUncate = ' Uncategorized'; var categoryName = $(this).val(); if (categoryName == ''){return;} if (categoryName == strUncate) categoryName = ""; $.ajax({ type: "POST", url: "/ChangeBookmarkCategory", data: "bdid=" + bdid + "&category=" + categoryName, success: function (message) { if (message != "!error!") { element.remove(); aCat.show(); flashm( "Successfull" , false); } else { flashm( "Failed"); } } }); }); }); } } }); } function createIframe(){ if( !($('#info-popup').length) ){ //var position = 'width: 80%; height: 70%; position: absolute; top: 15%; left: 10%'; var position = 'max-width: 100%; max-height: 100%; min-width: 500px; min-height: 300px; width: '+miniMalWidth+'; height: '+miniMalHeight+'; position: absolute; bottom: 0%; '+ posLeft +': 0%';//phone if($(window).width() < 500){ position = 'width: 100vw; height: 100%; position: absolute; top: 0%; '+ posLeft +': 0%'; } var material = '<dialog class="modal-kal" id="info-popup" style="pointer-events: none;display: none; position: fixed;z-index: 9999;left: 0;top: 0;bottom: 0;width: 100%; height: 100%; background-color: transparent; padding: 0; margin: 0; border: 0;">'; material += '<div id="modal-content" class="modal-content-kal" Style="pointer-events: all; background-color: #f9f9f9; margin: 0; '+position+'">'; //material += '<iframe id="info-iframe" style="height:100%;width:100%;border:0;"></iframe>'; material += '<div class="kal-tempHeader" style="position: absolute; width: 100%; height: 103px; background-color: rgb(63,81,181); "></div>'; material += '</div>'; material += '</dialog>'; $('body').after(material); GM_addStyle('.modal-content-kal.fullscreen{width: 100% !important;height: 100% !important; bottom: 0 !important;'+ posLeft +': 0 !important;}\ .modal-content-kal{-webkit-transition: all 0.5s ease; -moz-transition: all 0.5s ease; -o-transition: all 0.5s ease; transition: all 0.5s ease;}\ .floatbutton:hover {background-color:rgb(63,81,181);}\ .floatbutton:hover div {background-color:white;}\ .floatbutton div {background-color:black;-webkit-transition: all 0.5s ease;-moz-transition: all 0.5s ease;-o-transition: all 0.5s ease;transition: all 0.5s ease;}\ .floatbutton {\ z-index: 9999;display: none; position:fixed; bottom:40px; right:40px; border-radius: 50%; font-size: 24px; height: 56px; margin: auto; min-width: 56px; width: 56px; padding: 0; overflow: hidden; background: rgba(158,158,158,.2); box-shadow: 0 1px 1.5px 0 rgba(0,0,0,.12), 0 1px 1px 0 rgba(0,0,0,.24); line-height: normal; border: none;\ font-weight: 500; text-transform: uppercase; letter-spacing: 0; will-change: box-shadow; transition: box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1); outline: none; cursor: pointer; text-decoration: none; text-align: center; vertical-align: middle; padding: 16px;\ }\ .mdl-button{\ background: #3f51b5; color: #fff;box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12);\ border: none; border-radius: 2px;\ }'); var iframe = document.createElement('iframe'); iframe.setAttribute("id", "info-iframe"); iframe.setAttribute("style", "height:100%;width:100%;border:0;"); iframe.onload = function() { executejs(GM_getResourceText("materialjs")); executejs(GM_getResourceText("simpleBarjs")); var head = $("#info-iframe").contents().find("head"); head.append('<style>#material .mdl-card__supporting-text{width: initial} .mdl-layout__header .mdl-textfield__label:after{background-color: red !important;}</style>'); head.append('<style>\ .alternative-list .mdl-list{\ max-width: 100%;\ margin: 0;\ padding: 0;\ }\ .alternative-list .mdl-list__item{\ height: auto;\ }\ .alternative-list .mdl-list__item-primary-content{\ height: auto !important;\ }\ .alternative-list .mdl-list__item-primary-content a{\ display: block;\ }\ .alternative-list .mdl-list__item-text-body{\ height: auto !important;\ }\ \ .coverinfo .mdl-chip{\ height: auto;\ }\ .coverinfo .mdl-chip .mdl-chip__text{\ white-space: normal;\ line-height: 24px;\ }\ \ \ .mdl-layout__content::-webkit-scrollbar{\ width: 10px !important;\ background-color: #F5F5F5;\ }\ .mdl-layout__content::-webkit-scrollbar-thumb{\ background-color: #c1c1c1 !important;\ }\ .simplebar-track{\ width: 10px !important;\ background-color: #F5F5F5;\ }\ .simplebar-scrollbar{\ background-color: #c1c1c1 !important;\ }\ .simplebar-track.horizontal{\ display: none;\ }\ \ .simplebar-scrollbar{\ border-radius: 0px !important;\ right: 0 !important;\ width: 100% !important;\ opacity: 1 !important;\ }\ .simplebar-scrollbar.visible:before{\ display: none;\ }\ .simplebar-content{\ margin-right: -7px !important;\ }\ .simplebar-track{\ margin-top: -2px;\ margin-bottom: -2px;\ }\ a{\ text-decoration: none;\ }\ .mdl-layout__tab-panel a:hover{\ text-decoration: underline;\ }\ .mdl-cell{\ background-color: #fefefe;\ }\ \ #material.simple-header .mdl-layout__header .mdl-layout__tab-bar-container{\ display: none;\ }\ \ .newEp {\ position: absolute;\ background-color: #dedede;\ height: 25px;\ width: 29px;\ top: 3px;\ right: -4px;\ background-repeat: no-repeat;\ background-position: 4px 3px;\ background-image: url(https://github.com/google/material-design-icons/blob/master/social/1x_web/ic_notifications_none_black_18dp.png?raw=true);\ }\ </style>'); head.append('<style>'+GM_getResourceText("materialCSS")+'</style>'); head.append('<style>'+GM_getResourceText("materialFont")+'</style>'); head.append('<style>'+GM_getResourceText("simpleBarCSS")+'</style>'); //templateIframe(url, data); if(displayFloatButton == 1){ var floatbutton = '<button class="open-info-popup floatbutton" style="">'; floatbutton += '<i class="my-float" style="margin-top:22px;"><div style="width: 100%; height: 4px; margin-bottom: 15%;"></div><div style="width: 100%; height: 4px; margin-bottom: 15%;"></div><div style="width: 100%; height: 4px"></div></i></button>'; $('#info-popup').after(floatbutton); if(miniMalButtonLate != ''){ miniMalButton(miniMalButtonLate); } /*$('.open-info-popup').click(function() { if($('#info-popup').css('display') == 'none'){ $('.floatbutton').fadeOut(); } });*/ } }; document.getElementById("modal-content").appendChild(iframe); } } function templateIframe(url, data){ var material = '\ <div id="material" style="height: 100%;"><div class="mdl-layout mdl-js-layout mdl-layout--fixed-header\ mdl-layout--fixed-tabs">\ <header class="mdl-layout__header" style="min-height: 0;">\ <button class="mdl-layout__drawer-button" id="backbutton" style="display: none;"><i class="material-icons">arrow_back</i></button>\ <div class="mdl-layout__header-row">\ <!--<span class="mdl-layout-title malTitle malClear"></span>--!>\ <button class="mdl-button mdl-js-button mdl-button--icon mdl-layout__drawer-button" id="book" style="">\ <i class="material-icons" class="material-icons md-48">book</i>\ </button>\ <div class="mdl-textfield mdl-js-textfield mdl-textfield--expandable" id="SearchButton" style="margin-left: -57px; margin-top: 3px; padding-left: 40px;">\ <label class="mdl-button mdl-js-button mdl-button--icon" for="headMalSearch">\ <i class="material-icons">search</i>\ </label>\ <div class="mdl-textfield__expandable-holder">\ <input class="mdl-textfield__input" type="text" id="headMalSearch">\ <label class="mdl-textfield__label" for="headMalSearch"></label>\ </div>\ </div>\ <button class="mdl-button mdl-js-button mdl-button--icon mdl-layout__drawer-button" id="material-fullscreen" style="left: initial; right: 40px;">\ <i class="material-icons" class="material-icons md-48">fullscreen</i>\ </button>\ <button class="mdl-button mdl-js-button mdl-button--icon mdl-layout__drawer-button" id="close-info-popup" style="left: initial; right: 0;">\ <i class="material-icons close">close</i>\ </button>\ </div>\ <!-- Tabs -->\ <div class="mdl-layout__tab-bar mdl-js-ripple-effect">'; material += '\ <a href="#fixed-tab-1" class="mdl-layout__tab is-active">Overview</a>\ <a href="#fixed-tab-2" class="mdl-layout__tab reviewsTab">Reviews</a>\ <a href="#fixed-tab-3" class="mdl-layout__tab recommendationTab">Recommendations</a>\ <!--<a href="#fixed-tab-4" class="mdl-layout__tab">Episodes</a>-->\ <a href="#fixed-tab-5" class="mdl-layout__tab settingsTab">Settings</a>'; material += '\ </div>\ </header>\ <main class="mdl-layout__content" data-simplebar>'; material += '\ <section class="mdl-layout__tab-panel is-active" id="fixed-tab-1">\ <div id="loadOverview" class="mdl-progress mdl-js-progress mdl-progress__indeterminate" style="width: 100%; position: absolute;"></div>\ <div class="page-content">\ <div class="mdl-grid">\ <div class="mdl-cell mdl-cell--1-col mdl-cell--8-col-tablet mdl-cell--6-col-phone mdl-shadow--4dp stats-block malClear" style="min-width: 120px;">\ \ </div>\ <div class="mdl-grid mdl-cell mdl-shadow--4dp coverinfo malClear" style="display:block; flex-grow: 100; min-width: 70%;">\ <div class="mdl-card__media mdl-cell mdl-cell--2-col" style="background-color: transparent; float:left; padding-right: 16px;">\ <img class="malImage malClear" style="width: 100%; height: auto;"></img>\ </div>\ <div class="mdl-cell mdl-cell--12-col">\ <a class="mdl-button mdl-button--icon mdl-js-button mdl-js-ripple-effect malClear malLink" href="" style="float: right;" target="_blank"><i class="material-icons">open_in_new</i></a>\ <h1 class="malTitle mdl-card__title-text malClear" style="padding-left: 0px; overflow:visible;"></h1>\ <div class="malAltTitle mdl-card__supporting-text malClear" style="padding: 10px 0 0 0px; overflow:visible;"></div>\ </div>\ <div class="malDescription malClear mdl-cell mdl-cell--10-col" style="overflow: hidden;"></div>\ </div>\ <div class="mdl-cell mdl-cell--4-col mdl-cell--8-col-tablet mdl-shadow--4dp data-block mdl-grid mdl-grid--no-spacing malClear">\ \ </div>\ <div class="mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--4-col mdl-cell--8-col-tablet mdl-shadow--4dp related-block alternative-list mdl-grid malClear">\ \ </div>\ <div style="display: none;" class="mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--4-col mdl-cell--8-col-tablet mdl-shadow--4dp mdl-grid alternative-list stream-block malClear">\ <ul class="mdl-list stream-block-inner">\ \ </ul>\ </div>\ <div class="mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--12-col mdl-shadow--4dp characters-block mdl-grid malClear" style="display: none;"></div>\ <div class="mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--12-col mdl-shadow--4dp info-block mdl-grid malClear">\ \ </div>\ </div>\ </div>\ </section>\ <section class="mdl-layout__tab-panel" id="fixed-tab-2">\ <div id="loadReviews" class="mdl-progress mdl-js-progress mdl-progress__indeterminate" style="width: 100%; position: absolute;"></div>\ <div class="page-content malClear" id="malReviews"></div>\ </section>\ <section class="mdl-layout__tab-panel" id="fixed-tab-3">\ <div id="loadRecommendations" class="mdl-progress mdl-js-progress mdl-progress__indeterminate" style="width: 100%; position: absolute;"></div>\ <div class="page-content malClear" id="malRecommendations"></div>\ </section>\ <section class="mdl-layout__tab-panel" id="fixed-tab-4">\ <div id="loadEpisode" class="mdl-progress mdl-js-progress mdl-progress__indeterminate" style="width: 100%; position: absolute;"></div>\ <div class="page-content malClear" id="malEpisodes"></div>\ </section>'; material +='\ <section class="mdl-layout__tab-panel" id="fixed-tab-5">\ <div class="page-content malClear" id="malConfig"></div>\ </section>'; material +='</main>\ </div>\ <div id="malSearchPop" style="display: none; z-index: 10; position: fixed;">\ <div data-simplebar style="height: calc(100% - 60px); z-index: 10; width: 100%; position: fixed !important; top: 60px; background-color: #f9f9f9; width: 100%;position: fixed; top: 60px; background-color: #f9f9f9;">\ <div id="malSearchPopInner"></div>\ </div>\ </div>'; //material += '</div>'; $("#info-iframe").contents().find("body").append(material); var modal = document.getElementById('info-popup'); $("#info-iframe").contents().find("#close-info-popup").click( function(){ modal.style.display = "none"; $('.floatbutton').fadeIn(); outOfTheWay(); //$('body').css('overflow','initial'); }); $("#info-iframe").contents().find("#backbutton").click( function(){ //alert();getcommondata(); $("#info-iframe").contents().find('.mdl-layout__tab:eq(0) span').trigger( "click" ); $(this).hide(); $("#info-iframe").contents().find('#SearchButton').css('margin-left', '-57px'); $("#info-iframe").contents().find('#book').css('left', '0px'); if(currentMalData == null){ fillIframe(url, data); } fillIframe(url, currentMalData); }); $("#info-iframe").contents().find("#material-fullscreen").click( function(){ if($('.modal-content-kal.fullscreen').length){ $(".modal-content-kal").removeClass('fullscreen'); $(this).find('i').text('fullscreen'); }else{ $(".modal-content-kal").addClass('fullscreen'); $(this).find('i').text('fullscreen_exit'); } }); var timer; $("#info-iframe").contents().find("#headMalSearch").on("input", function(){ clearTimeout(timer); timer = setTimeout(function(){ if($("#info-iframe").contents().find("#headMalSearch").val() == ''){ $("#info-iframe").contents().find('#malSearchPop').hide(); }else{ $("#info-iframe").contents().find('#malSearchPop').show(); searchMal($("#info-iframe").contents().find("#headMalSearch").val(), K.listType, '#malSearchPopInner', function(){ $("#info-iframe").contents().find("#malSearchPop .searchItem").unbind('click').click(function(event) { $("#info-iframe").contents().find("#headMalSearch").val('').trigger("input").parent().parent().removeClass('is-dirty'); $("#info-iframe").contents().find('.malClear').hide(); $("#info-iframe").contents().find('.mdl-progress__indeterminate').show(); $("#info-iframe").contents().find("#backbutton").show(); $("#info-iframe").contents().find('#SearchButton').css('margin-left', '-17px'); $("#info-iframe").contents().find('#book').css('left', '40px'); $("#info-iframe").contents().find('.mdl-layout__tab:eq(0) span').trigger( "click" ); fillIframe($(this).attr('malhref')); }); }); } }, 300); }); $("#info-iframe").contents().find("#book").click(function() { if($("#info-iframe").contents().find("#book.open").length){ $("#info-iframe").contents().find("#book").toggleClass('open'); $("#info-iframe").contents().find('#malSearchPop').hide(); }else{ $("#info-iframe").contents().find("#book").toggleClass('open'); $("#info-iframe").contents().find('#malSearchPop').show(); iframeBookmarks( $("#info-iframe").contents().find('#malSearchPopInner') ); } }); $('.kal-tempHeader').remove(); } function fillIframe(url, data = null){ // Iframe is missing if(!$("#info-iframe").length){ $('#info-popup').remove(); alert('The miniMAL iframe could not be loaded.\nThis could be caused by an AdBlocker, such as 9anime Companion\'s AdBlock-option.'); } outOfTheWay(); $("#info-iframe").contents().find('.malClear').hide(); $("#info-iframe").contents().find('.mdl-progress__indeterminate').show(); if( !/\/(manga|anime)\//i.test(url) && url != null){ //alert(url); url = ''; } if(data == null && url != null && url != ''){ getAjaxData(url, function(newdata){ fillIframe(url, newdata); }); return; } if( !($("#info-iframe").contents().find('#material').length) ){ templateIframe(url,data); } if(url == null | url == '' | data == '404'){ $("#info-iframe").contents().find('#material').addClass('simple-header'); $("#info-iframe").contents().find('.mdl-layout__tab-panel.is-active').removeClass('is-active'); $("#info-iframe").contents().find('.mdl-layout__tab-panel').last().addClass('is-active'); }else{ $("#info-iframe").contents().find('#material').removeClass('simple-header'); } iframeConfig(url, data); iframeOverview(url, data); $("#info-iframe").contents().find('.reviewsTab').off('click').one('click',function(){ iframeReview(url, data); fixIframeLink(); }); //iframeEpisode(url, data); $("#info-iframe").contents().find('.recommendationTab').off('click').one('click',function(){ iframeRecommendations(url, data); }); $("#info-iframe").contents().find('.mdl-layout__tab.is-active').trigger( "click" ); executejs('componentHandler.upgradeDom();'); fixIframeLink(); } function iframeConfig(url, data){ try{ var settingsUI = '<ul class="demo-list-control mdl-list" style="margin: 0px; padding: 0px;">\ <div class="mdl-grid">'; try{ var malUrl = GM_getValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.normalUrl()))+'/Mal' , null); }catch(e){ var malUrl = null; } if(malUrl == url){ settingsUI += '<div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp">\ <div class="mdl-card__title mdl-card--border">\ <h2 class="mdl-card__title-text">'; if(data != null && data != '404'){ settingsUI += data.split('itemprop="name">')[1].split('<')[0]; }else{ settingsUI += 'Not Found'; } settingsUI += '</h2>\ </div>\ <div class="mdl-list__item">\ <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;">\ <input class="mdl-textfield__input" style="padding-right: 18px;" type="number" step="1" id="malOffset" value="'+GM_getValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.normalUrl()))+'/Offset' , '')+'">\ <label class="mdl-textfield__label" for="malOffset">Episode Offset</label>\ '+getTooltip('Input the episode offset, if an anime has 12 episodes, but uses the numbers 0-11 rather than 1-12, you simply type " +1 " in the episode offset.','float: right; margin-top: -17px;','left')+'\ </div>\ </div>\ <div class="mdl-list__item" style="padding-bottom: 0;padding-top: 0;">\ <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;">\ <input class="mdl-textfield__input" style="padding-right: 18px;" type="text" id="malUrlInput" value="'+malUrl+'">\ <label class="mdl-textfield__label" for="malUrlInput">MyAnimeList Url</label>\ '+getTooltip('Only change this URL if it points to the wrong anime page on MAL.','float: right; margin-top: -17px;','left')+'\ </div>\ </div>\ \ <div class="mdl-list__item" style="padding-bottom: 0;padding-top: 0;">\ <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;">\ <label class="mdl-textfield__label" for="malSearch">\ Search\ </label>\ <input class="mdl-textfield__input" style="padding-right: 18px;" type="text" id="malSearch">\ '+getTooltip('This field is for finding an anime, when you need to replace the "MyAnimeList Url" shown above.<br>To make a search, simply begin typing the name of an anime, and a list with results will automatically appear as you type.','float: right; margin-top: -17px;','left')+'\ </div>\ </div>\ <div class="mdl-list__item" style="min-height: 0; padding-bottom: 0; padding-top: 0;">\ <div class="malResults" id="malSearchResults"></div>\ </div>\ \ <div class="mdl-list__item">\ <button class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored" id="malSubmit">Update</button>\ <button class="mdl-button mdl-js-button mdl-button--raised mdl-button--accent" id="malReset" style="margin-left: 5px;">Reset</button>\ </div>\ </div>'; } settingsUI += '<div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp">\ <div class="mdl-card__title mdl-card--border">\ <h2 class="mdl-card__title-text">General</h2>\ </div>'; settingsUI += materialCheckbox(autoTracking,'autoTracking','Autotracking'+getTooltip('Autotracking is the function where this script automatically updates the anime´s you watch with your MAL account.','','bottom')); settingsUI += '<li class="mdl-list__item">\ <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;">\ <input class="mdl-textfield__input" type="number" step="1" id="malDelay" value="'+delay+'">\ <label class="mdl-textfield__label" for="malDelay">Autotracking delay (Seconds)</label>\ </div>\ </li>'; settingsUI += '</div>'; settingsUI += '<div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp">\ <div class="mdl-card__title mdl-card--border">\ <h2 class="mdl-card__title-text">MAL Bookmark Page</h2>\ </div>'; settingsUI += materialCheckbox(tagLinks,'tagLinks','Continue watching links'+getTooltip('If enabled: On your MAL Anime List and the bookmark list in miniMAL, an icon-link will be added to the last used streaming site you were using to watch an anime.<br>Simply click the icon to continue watching the anime.')); settingsUI += materialCheckbox(epPredictions,'epPredictions','Predict episode number'); settingsUI += '<li class="mdl-list__item">\ <span class="mdl-list__item-primary-content">\ Check for new episodes\ </span>\ <span class="mdl-list__item-secondary-action">\ <select name="myinfo_score" id="newEpInterval" class="inputtext mdl-textfield__input" style="outline: none;">\ <option value="null">Off</option>\ <option value="3600000">1 Hour</option>\ <option value="43200000">12 Hour</option>\ <option value="0">Always</option>\ </select>\ </span>\ </li>'; settingsUI += '<li class="mdl-list__item">\ <span class="mdl-list__item-primary-content">\ Border Color <a href="https://www.webpagefx.com/web-design/color-picker/" target="_blank"><div id="newEpBorder_color" style="width: 20px; border: 1px solid grey; height: 20px; margin-left: 5px; background-color: #'+newEpBorder+'"/></a>\ </span>\ <div class="mdl-list__item-secondary-action">\ <select name="newEpBorder_dropdown" id="newEpBorder_dropdown" class="inputtext mdl-textfield__input" style="outline: none;">\ <option value="c">Custom</option>\ <option value="ff0000">Red</option>\ <option value="2e51a2">MAL Blue</option>\ <option value=" ">Off</option>\ </select>\ <input class="mdl-textfield__input" type="text" id="newEpBorder" size="6" maxlength="6" value="'+newEpBorder+'">\ </div>\ </li>'; settingsUI += materialCheckbox(newEpNotification,'newEpNotification','Notifications'); settingsUI += materialCheckbox(openInBg,'openInBg','Load cookies in background'); settingsUI += materialCheckbox(newEpCR,'newEpCR','CR-Unblocker Extension'); settingsUI += '</div>'; settingsUI += '<div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp">\ <div class="mdl-card__title mdl-card--border">\ <h2 class="mdl-card__title-text">Streaming Site Links</h2>'; settingsUI += getTooltip('If disabled, the streaming site will no longer appear in an animes sidebar on MAL.'); settingsUI += '</div>'; settingsUI += materialCheckbox(kissanimeLinks,'kissanimeLinks','KissAnime'); settingsUI += materialCheckbox(masteraniLinks,'masteraniLinks','MasterAnime'); settingsUI += materialCheckbox(nineanimeLinks,'nineanimeLinks','9anime'); settingsUI += materialCheckbox(crunchyrollLinks,'crunchyrollLinks','Crunchyroll'); settingsUI += materialCheckbox(gogoanimeLinks,'gogoanimeLinks','Gogoanime'); settingsUI += materialCheckbox(kissmangaLinks,'kissmangaLinks','KissManga'); settingsUI += materialCheckbox(mangadexLinks,'mangadexLinks','MangaDex'); settingsUI += '</div>'; settingsUI += '<div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp">\ <div class="mdl-card__title mdl-card--border">\ <h2 class="mdl-card__title-text">MyAnimeList</h2>\ </div>'; settingsUI += '<li class="mdl-list__item">\ <span class="mdl-list__item-primary-content">\ Thumbnails\ '+getTooltip('The option is for resizing the thumbnails on MAL.<br>Like thumbnails for characters, people, recommendations, etc.')+'\ </span>\ <span class="mdl-list__item-secondary-action">\ <select name="myinfo_score" id="malThumbnail" class="inputtext mdl-textfield__input" style="outline: none;">\ <option value="144">Large</option>\ <option value="100">Medium</option>\ <option value="60">Small</option>\ <option value="0">MAL Default</option>\ </select>\ </span>\ </li>'; settingsUI += materialCheckbox(mangaStore,'mangaStore','Hide Manga Store'); settingsUI += '</div>'; settingsUI += '<div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp">\ <div class="mdl-card__title mdl-card--border">\ <h2 class="mdl-card__title-text">miniMAL</h2>\ <span style="margin-left: auto; color: #7f7f7f;">Shortcut: Ctrl + m</span>\ </div>'; settingsUI += '<li class="mdl-list__item">\ <span class="mdl-list__item-primary-content">\ Display to the\ </span>\ <span class="mdl-list__item-secondary-action">\ <select name="myinfo_score" id="posLeft" class="inputtext mdl-textfield__input" style="outline: none;">\ <option value="left">Left</option>\ <option value="right">Right</option>\ </select>\ </span>\ </li>'; settingsUI += materialCheckbox(miniMALonMal,'miniMALonMal','Display on MyAnimeList'); settingsUI += materialCheckbox(displayFloatButton,'displayFloatButton','Floating menu button'); settingsUI += materialCheckbox(outWay,'outWay','Move video out of the way'); settingsUI += '<li class="mdl-list__item" style="display: inline-block; width: 50%;">\ <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;">\ <input class="mdl-textfield__input" type="text" step="1" id="miniMalHeight" value="'+miniMalHeight+'">\ <label class="mdl-textfield__label" for="miniMalHeight">Height (px / %)\ </label>\ </div>\ </li>'; settingsUI += '<li class="mdl-list__item" style="display: inline-block; width: 50%;">\ <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;">\ <input class="mdl-textfield__input" type="text" step="1" id="miniMalWidth" value="'+miniMalWidth+'">\ <label class="mdl-textfield__label" for="miniMalWidth">Width (px / %)</label>\ </div>\ </li>'; settingsUI += '</div>'; settingsUI += '<div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp hoverinfoDeact">'; settingsUI += materialCheckbox(episodeInfoBox,'episodeInfoBox','Episode Hoverinfo'+getTooltip('<img style="width: 200%; margin-bottom: -16px; margin-top: -16px; margin-left: -200px; margin-right: -200px;" src="https://raw.githubusercontent.com/lolamtisch/KissAnimeList/master/Screenshots/2fhq9cL.gif" alt="Episode Hoverinfo">'), true); settingsUI += '<div class="mdl-card__title mdl-card--border" style="padding: 0;"></div>'; settingsUI += materialCheckbox(episodeInfoSynopsis,'episodeInfoSynopsis','Synopsis'+getTooltip('If enabled, the episode-synopsis from MAL will be displayed in the Episode Hoverinfo.')); settingsUI += materialCheckbox(episodeInfoImage,'episodeInfoImage','Image'+getTooltip('If enabled, the episode-image from MAL will be displayed in the Episode Hoverinfo.')); settingsUI += materialCheckbox(episodeInfoSubtitle,'episodeInfoSubtitle','Alternative Title'+getTooltip('If enabled, the alternative title for the episode, will be displayed in the Episode Hoverinfo. Example using the anime "Fate/Apocrypha":<br>Title: "Apocrypha: The Great Holy Grail War"<br>Subtitle: "Gaiten: Seihai Taisen (外典:聖杯大戦)"')); settingsUI += '</div>'; settingsUI += '<div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp">\ <div class="mdl-card__title mdl-card--border">\ <h2 class="mdl-card__title-text">ETC</h2>\ </div>'; settingsUI += materialCheckbox(debugging,'debugging','Debugging'); settingsUI += '<li class="mdl-list__item"><button type="button" id="clearCache" class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">Clear Cache</button></li>'; settingsUI += '</div>'; $("#info-iframe").contents().find('#malConfig').html(settingsUI); $("#info-iframe").contents().find("#malReset").click( function(){ GM_deleteValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.normalUrl()))+'/Mal' ); flashm( "MyAnimeList url reset" , false); checkdata(); }); $("#info-iframe").contents().find("#malSubmit").click( function(){ var murl = $("#info-iframe").contents().find("#malUrlInput").val(); local_setValue(K.normalUrl(), murl, true); flashm( "new url '"+murl+"' set." , false); checkdata(); }); $("#info-iframe").contents().find("#malDelay").on("input", function(){ var tempDelay = $("#info-iframe").contents().find("#malDelay").val(); if(tempDelay !== null){ if(tempDelay !== ''){ delay = tempDelay; GM_setValue( 'delay', tempDelay ); flashm( "New delay ("+delay+") set." , false); }else{ delay = 3; GM_deleteValue( 'delay' ); flashm( "Delay reset" , false); } } }); $("#info-iframe").contents().find("#miniMalWidth").on("input", function(){ var miniMalWidth = $("#info-iframe").contents().find("#miniMalWidth").val(); if(miniMalWidth !== null){ if(miniMalWidth !== ''){ GM_setValue( 'miniMalWidth', miniMalWidth ); flashm( "New Width ("+miniMalWidth+") set." , false); }else{ miniMalWidth = '30%'; GM_deleteValue( 'miniMalWidth' ); flashm( "Width reset" , false); } } $("#modal-content").css('width', miniMalWidth); }); $("#info-iframe").contents().find("#miniMalHeight").on("input", function(){ var miniMalHeight = $("#info-iframe").contents().find("#miniMalHeight").val(); if(miniMalHeight !== null){ if(miniMalHeight !== ''){ GM_setValue( 'miniMalHeight', miniMalHeight ); flashm( "New Height ("+miniMalHeight+") set." , false); }else{ miniMalHeight = '90%'; GM_deleteValue( 'miniMalHeight' ); flashm( "Height reset" , false); } } $("#modal-content").css('height', miniMalHeight); }); $("#info-iframe").contents().find("#malOffset").on("input", function(){ var Offset = $("#info-iframe").contents().find("#malOffset").val(); if(Offset !== null){ if(Offset !== ''){ GM_setValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.normalUrl()))+'/Offset', Offset ); flashm( "New Offset ("+Offset+") set." , false); }else{ GM_deleteValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.normalUrl()))+'/Offset' ); flashm( "Offset reset" , false); } } }); var timer; $("#info-iframe").contents().find("#malSearch").on("input", function(){ clearTimeout(timer); timer = setTimeout(function(){ searchMal( $("#info-iframe").contents().find("#malSearch").val(), K.listType, '.malResults', function(){ $("#info-iframe").contents().find("#malSearchResults .searchItem").unbind('click').click(function(event) { $("#info-iframe").contents().find('#malUrlInput').val($(this).attr('malhref')); $("#info-iframe").contents().find('#malSearch').val(''); $("#info-iframe").contents().find('#malSearchResults').html(''); }); }); }, 300); }); $("#info-iframe").contents().find("#clearCache").click( function(){ clearCache(); }); $("#info-iframe").contents().find('#autoTracking').change(function(){ if($(this).is(":checked")){ GM_setValue('autoTracking', 1); autoTracking = 1; }else{ GM_setValue('autoTracking', 0); autoTracking = 0; } }); $("#info-iframe").contents().find('#tagLinks').change(function(){ if($(this).is(":checked")){ GM_setValue('tagLinks', 1); tagLinks = 1; }else{ GM_setValue('tagLinks', 0); tagLinks = 0; } }); $("#info-iframe").contents().find('#newEpNotification').change(function(){ if($(this).is(":checked")){ GM_setValue('newEpNotification', 1); newEpNotification = 1; }else{ GM_setValue('newEpNotification', 0); newEpNotification = 0; } }); $("#info-iframe").contents().find('#openInBg').change(function(){ if($(this).is(":checked")){ GM_setValue('openInBg', 1); openInBg = 1; }else{ GM_setValue('openInBg', 0); openInBg = 0; } }); $("#info-iframe").contents().find('#newEpCR').change(function(){ if($(this).is(":checked")){ alert('Only activate this option if you have the Extension CR-Unblocker installed!'); GM_setValue('newEpCR', 1); newEpCR = 1; }else{ GM_setValue('newEpCR', 0); newEpCR = 0; } }); $("#info-iframe").contents().find('#kissmangaLinks').change(function(){ if($(this).is(":checked")){ GM_setValue('kissmangaLinks', 1); kissmangaLinks = 1; }else{ GM_setValue('kissmangaLinks', 0); kissmangaLinks = 0; } }); $("#info-iframe").contents().find('#mangadexLinks').change(function(){ if($(this).is(":checked")){ GM_setValue('mangadexLinks', 1); mangadexLinks = 1; }else{ GM_setValue('mangadexLinks', 0); mangadexLinks = 0; } }); $("#info-iframe").contents().find('#kissanimeLinks').change(function(){ if($(this).is(":checked")){ GM_setValue('kissanimeLinks', 1); kissanimeLinks = 1; }else{ GM_setValue('kissanimeLinks', 0); kissanimeLinks = 0; } }); $("#info-iframe").contents().find('#masteraniLinks').change(function(){ if($(this).is(":checked")){ GM_setValue('masteraniLinks', 1); masteraniLinks = 1; }else{ GM_setValue('masteraniLinks', 0); masteraniLinks = 0; } }); $("#info-iframe").contents().find('#nineanimeLinks').change(function(){ if($(this).is(":checked")){ GM_setValue('nineanimeLinks', 1); nineanimeLinks = 1; }else{ GM_setValue('nineanimeLinks', 0); nineanimeLinks = 0; } }); $("#info-iframe").contents().find('#crunchyrollLinks').change(function(){ if($(this).is(":checked")){ GM_setValue('crunchyrollLinks', 1); crunchyrollLinks = 1; }else{ GM_setValue('crunchyrollLinks', 0); crunchyrollLinks = 0; } }); $("#info-iframe").contents().find('#gogoanimeLinks').change(function(){ if($(this).is(":checked")){ GM_setValue('gogoanimeLinks', 1); gogoanimeLinks = 1; }else{ GM_setValue('gogoanimeLinks', 0); gogoanimeLinks = 0; } }); $("#info-iframe").contents().find("#posLeft").val(posLeft); $("#info-iframe").contents().find("#posLeft").change(function(){ GM_setValue( 'posLeft', $("#info-iframe").contents().find("#posLeft").val() ); }); $("#info-iframe").contents().find('#displayFloatButton').change(function(){ if($(this).is(":checked")){ GM_setValue('displayFloatButton', 1); displayFloatButton = 1; }else{ GM_setValue('displayFloatButton', 0); displayFloatButton = 0; } }); $("#info-iframe").contents().find('#episodeInfoBox').change(function(){ if($(this).is(":checked")){ GM_setValue('episodeInfoBox', 1); episodeInfoBox = 1; }else{ GM_setValue('episodeInfoBox', 0); episodeInfoBox = 0; } }); $("#info-iframe").contents().find('#episodeInfoSynopsis').change(function(){ if($(this).is(":checked")){ GM_setValue('episodeInfoSynopsis', 1); episodeInfoSynopsis = 1; }else{ GM_setValue('episodeInfoSynopsis', 0); episodeInfoSynopsis = 0; } }); $("#info-iframe").contents().find('#episodeInfoImage').change(function(){ if($(this).is(":checked")){ GM_setValue('episodeInfoImage', 1); episodeInfoImage = 1; }else{ GM_setValue('episodeInfoImage', 0); episodeInfoImage = 0; } }); $("#info-iframe").contents().find('#episodeInfoSubtitle').change(function(){ if($(this).is(":checked")){ GM_setValue('episodeInfoSubtitle', 1); episodeInfoSubtitle = 1; }else{ GM_setValue('episodeInfoSubtitle', 0); episodeInfoSubtitle = 0; } }); $("#info-iframe").contents().find('#miniMALonMal').change(function(){ if($(this).is(":checked")){ GM_setValue('miniMALonMal', 1); miniMALonMal = 1; }else{ GM_setValue('miniMALonMal', 0); miniMALonMal = 0; } }); $("#info-iframe").contents().find('#outWay').change(function(){ if($(this).is(":checked")){ GM_setValue('outWay', 1); outWay = 1; }else{ GM_setValue('outWay', 0); outWay = 0; } }); $("#info-iframe").contents().find("#malThumbnail").val(malThumbnail); $("#info-iframe").contents().find("#malThumbnail").change(function(){ GM_setValue( 'malThumbnail', $("#info-iframe").contents().find("#malThumbnail").val() ); }); $("#info-iframe").contents().find('#mangaStore').change(function(){ if($(this).is(":checked")){ GM_setValue('mangaStore', 1); mangaStore = 1; }else{ GM_setValue('mangaStore', 0); mangaStore = 0; } }); $("#info-iframe").contents().find('#debugging').change(function(){ if($(this).is(":checked")){ GM_setValue('debugging', 1); debugging = 1; }else{ GM_setValue('debugging', 0); debugging = 0; } }); $("#info-iframe").contents().find('#epPredictions').change(function(){ if($(this).is(":checked")){ GM_setValue('epPredictions', 1); epPredictions = 1; }else{ GM_setValue('epPredictions', 0); epPredictions = 0; } }); $("#info-iframe").contents().find("#newEpInterval").val(newEpInterval); $("#info-iframe").contents().find("#newEpInterval").change(function(){ GM_setValue( 'newEpInterval', $("#info-iframe").contents().find("#newEpInterval").val() ); }); $("#info-iframe").contents().find("#newEpBorder").change(function(){ GM_setValue( 'newEpBorder', $("#info-iframe").contents().find("#newEpBorder").val() ); $("#info-iframe").contents().find('#newEpBorder_color').css('background-color', '#'+$("#info-iframe").contents().find("#newEpBorder").val()); }); $("#info-iframe").contents().find("#newEpBorder_dropdown").val(newEpBorder); $("#info-iframe").contents().find("#newEpBorder_dropdown").change(function(){ var dvalue= $("#info-iframe").contents().find("#newEpBorder_dropdown").val(); if(dvalue == 'c'){ $("#info-iframe").contents().find("#newEpBorder").show(); }else{ $("#info-iframe").contents().find("#newEpBorder").hide(); $("#info-iframe").contents().find("#newEpBorder").val( dvalue ); $("#info-iframe").contents().find("#newEpBorder").trigger("change"); if(dvalue == ' '){ $("#info-iframe").contents().find('#newEpBorder_color').css('background-color','transparent'); } } }); $("#info-iframe").contents().find("#newEpBorder_dropdown").trigger("change"); $("#info-iframe").contents().find('#malConfig').show(); }catch(e) {console.log('[iframeConfig] Error:',e);} } function iframeOverview(url, data){ $("#info-iframe").contents().find('#loadOverview').hide(); try{ var image = data.split('js-scrollfix-bottom')[1].split('<img src="')[1].split('"')[0]; $("#info-iframe").contents().find('.malImage').attr("src",image).show(); $("#info-iframe").contents().find('.coverinfo').show(); }catch(e) {console.log('[iframeOverview] Error:',e);} try{ var title = data.split('itemprop="name">')[1].split('<')[0]; $("#info-iframe").contents().find('.malTitle').html(title).show(); $("#info-iframe").contents().find('.coverinfo').show(); }catch(e) {console.log('[iframeOverview] Error:',e);} try{ $("#info-iframe").contents().find('.malLink').attr('href',url).show(); }catch(e) {console.log('[iframeOverview] Error:',e);} try{ var description = data.split('itemprop="description">')[1].split('</span')[0]; $("#info-iframe").contents().find('.malDescription').html('<p style="color: black;">'+description+'</p>').show(); $("#info-iframe").contents().find('.coverinfo').show(); }catch(e) {console.log('[iframeOverview] Error:',e);} try{ var statsBlock = data.split('<h2>Statistics</h2>')[1].split('<h2>')[0]; var html = $.parseHTML( statsBlock ); var statsHtml = '<ul class="mdl-list mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--12-col" style="display: flex; justify-content: space-around;">'; $.each($(html).filter('div').slice(0,5), function( index, value ) { statsHtml += '<li class="mdl-list__item mdl-list__item--two-line" style="padding: 0; padding-left: 10px; padding-right: 3px; min-width: 18%;">'; statsHtml += '<span class="mdl-list__item-primary-content">'; statsHtml += '<span>'; statsHtml += $(this).find('.dark_text').text(); statsHtml += '</span>'; statsHtml += '<span class="mdl-list__item-sub-title">'; statsHtml += $(this).find('span[itemprop=ratingValue]').height() != null ? $(this).find('span[itemprop=ratingValue]').text() : $(this).clone().children().remove().end().text(); statsHtml += '</span>'; statsHtml += '</span>'; statsHtml += '</li>'; }); statsHtml += '</ul>'; $("#info-iframe").contents().find('.stats-block').html(statsHtml).show(); }catch(e) {console.log('[iframeOverview] Error:',e);} try{ var altTitle = data.split('<h2>Alternative Titles</h2>')[1].split('<h2>')[0]; altTitle = altTitle.replace(/spaceit_pad/g,'mdl-chip" style="margin-right: 5px;'); $("#info-iframe").contents().find('.malAltTitle').html(altTitle); $("#info-iframe").contents().find('.malAltTitle .mdl-chip').contents().filter(function() { return this.nodeType == 3 && $.trim(this.textContent) != ''; }).wrap('<span class="mdl-chip__text" />'); $("#info-iframe").contents().find('.malAltTitle').show(); }catch(e) {console.log('[iframeOverview] Error:',e);} try{ var infoBlock = data.split('<h2>Information</h2>')[1].split('<h2>')[0]; var html = $.parseHTML( infoBlock ); var infoHtml = '<ul class="mdl-grid mdl-grid--no-spacing mdl-list mdl-cell mdl-cell--12-col">'; $.each($(html).filter('div'), function( index, value ) { if((index + 4) % 4 == 0 && index != 0){ //infoHtml +='</ul><ul class="mdl-list mdl-cell mdl-cell--3-col mdl-cell--4-col-tablet">'; } infoHtml += '<li class="mdl-list__item mdl-list__item--three-line mdl-cell mdl-cell--3-col mdl-cell--4-col-tablet">'; infoHtml += '<span class="mdl-list__item-primary-content">'; infoHtml += '<span>'; infoHtml += $(this).find('.dark_text').text(); infoHtml += '</span>'; infoHtml += '<span class="mdl-list__item-text-body">'; $(this).find('.dark_text').remove(); infoHtml += $(this).html(); //$(this).find('*').each(function(){infoHtml += $(this)[0].outerHTML}); //infoHtml += $(this).find('span[itemprop=ratingValue]').height() != null ? $(this).find('span[itemprop=ratingValue]').text() : $(this).clone().children().remove().end().text(); infoHtml += '</span>'; infoHtml += '</span>'; infoHtml += '</li>'; }); infoHtml += '</ul>'; $("#info-iframe").contents().find('.info-block').html(infoHtml).show(); }catch(e) {console.log('[iframeOverview] Error:',e);} try{ var relatedBlock = data.split('Related ')[1].split('</h2>')[1].split('<h2>')[0]; var related = $.parseHTML( relatedBlock ); var relatedHtml = '<ul class="mdl-list">'; $.each($(related).filter('table').find('tr'), function( index, value ) { relatedHtml += '<li class="mdl-list__item mdl-list__item--two-line">'; relatedHtml += '<span class="mdl-list__item-primary-content">'; relatedHtml += '<span>'; relatedHtml += $(this).find('.borderClass').first().text(); relatedHtml += '</span>'; relatedHtml += '<span class="mdl-list__item-sub-title">'; relatedHtml += $(this).find('.borderClass').last().html(); relatedHtml += '</span>'; relatedHtml += '</span>'; relatedHtml += '</li>'; }); relatedHtml += '</ul>'; $("#info-iframe").contents().find('.related-block').html(relatedHtml).show(); $("#info-iframe").contents().find('.related-block .mdl-list__item-sub-title').each(function(){$(this).html($(this).children()); }); $("#info-iframe").contents().find('#material .related-block a').each(function() { $(this).click(function(e) { $("#info-iframe").contents().find('.malClear').hide(); $("#info-iframe").contents().find('.mdl-progress__indeterminate').show(); $("#info-iframe").contents().find("#backbutton").show(); $("#info-iframe").contents().find('#SearchButton').css('margin-left', '-17px'); $("#info-iframe").contents().find('#book').css('left', '40px'); fillIframe($(this).attr('href')); }).attr('onclick','return false;'); }); }catch(e) {console.log('[iframeOverview] Error:',e);} try{ var localListType = url.split('/')[3]; var dataBlock = data.split('id="addtolist"')[1].split('<div id="myinfoDisplay"')[0]; if (~data.indexOf("header-menu-login")){ dataBlock = "Please log in on <a target='_blank' href='https://myanimelist.net/login.php'>MyAnimeList!<a>"; }else{ dataBlock = dataBlock.substring(dataBlock.indexOf(">") + 1); } $("#info-iframe").contents().find('.data-block').html(dataBlock).show(); $("#info-iframe").contents().find('.data-block tr:not(:last-child)').each(function(){ var label = $(this).find('.spaceit').first().text(); //$(this).find('.spaceit').first().html('<span>'+label+'</span>'); $(this).replaceWith($('<li class="mdl-list__item mdl-list__item--three-line">\ <span class="mdl-list__item-primary-content">\ <span>'+label+'</span>\ <span class="mdl-list__item-text-body">'+$(this).find('.spaceit').last().html()+'</span>\ </span>\ \</li>')); }); $("#info-iframe").contents().find('#myinfo_status,#myinfo_score').addClass('mdl-textfield__input').css('outline', 'none'); $("#info-iframe").contents().find('#myinfo_watchedeps,#myinfo_chapters,#myinfo_volumes').addClass('mdl-textfield__input').css('width','35px').css('display','inline-block'); $("#info-iframe").contents().find('.inputButton').addClass('mdl-button mdl-js-button mdl-button--raised mdl-button--colored').css('margin-right','5px'); $("#info-iframe").contents().find('.data-block li').last().after('<li class="mdl-list__item">'+$("#info-iframe").contents().find('.inputButton').first().parent().html()+'</li>'); $("#info-iframe").contents().find('.data-block tr').remove(); $("#info-iframe").contents().find('.js-'+localListType+'-update-button, .js-'+localListType+'-add-button').click(function (){ var anime = {}; if(localListType == 'anime'){ anime['.add_anime[num_watched_episodes]'] = parseInt($("#info-iframe").contents().find('#myinfo_watchedeps').val() ); if(isNaN(anime['.add_anime[num_watched_episodes]'])){ anime['.add_anime[num_watched_episodes]'] = 0; } }else{ anime['.add_manga[num_read_volumes]'] = parseInt($("#info-iframe").contents().find('#myinfo_volumes').val() ); if(isNaN(anime['.add_manga[num_read_volumes]'])){ anime['.add_manga[num_read_volumes]'] = 0; } anime['.add_manga[num_read_chapters]'] = parseInt($("#info-iframe").contents().find('#myinfo_chapters').val() ); if(isNaN(anime['.add_manga[num_read_chapters]'])){ anime['.add_manga[num_read_chapters]'] = 0; } } anime['.add_'+localListType+'[score]'] = parseInt($("#info-iframe").contents().find('#myinfo_score').val() ); if(anime['.add_'+localListType+'[score]'] == 0){ anime['.add_'+localListType+'[score]'] = ''; } anime['.add_'+localListType+'[status]'] = parseInt($("#info-iframe").contents().find('#myinfo_status').val() ); if(K.isOverviewPage()){ anime['forceUpdate'] = 2; } anime['malurl'] = url; setanime(url, anime, null, localListType); }); epPrediction(url.split('/')[4], function(timestamp, airing, diffWeeks, diffDays, diffHours, diffMinutes, episode){ if(airing){ if(episode){ var titleMsg = 'Next episode estimated in '+diffDays+'d '+diffHours+'h '+diffMinutes+'m'; $("#info-iframe").contents().find('[id="curEps"]').before('<span title="'+titleMsg+'">['+episode+']</span> '); } } }); }catch(e) {console.log('[iframeOverview] Error:',e);} try{ var characterBlock = data.split('detail-characters-list')[1].split('</h2>')[0]; var html = $.parseHTML( '<div class="detail-characters-list '+characterBlock ); var temphtml = ''; var charFound = 0; var tempWrapHtml = '<div class="mdl-card__actions clicker">\ <h1 class="mdl-card__title-text" style="float: left;">Characters</h1>\ <i class="material-icons mdl-accordion__icon mdl-animation--default remove" style="float: right; margin-top: 3px;">expand_more</i>\ </div>\ <div class="mdl-grid mdl-card__actions mdl-card--border" id="characterList" style="justify-content: space-between; display: none;"></div>'; tempWrapHtml += '</div>'; $.each($(html).find(':not(td) > table'), function( index, value ) { if(!index) charFound = 1; var regexDimensions = /\/r\/\d*x\d*/g; var charImg = $(this).find('img').first().attr("data-src"); if ( regexDimensions.test(charImg)){ charImg = charImg.replace(regexDimensions, ''); }else{ charImg = 'https://myanimelist.cdn-dena.com/images/questionmark_23.gif'; } temphtml += '<div>'; temphtml += '<div class="mdl-grid" style="width: 126px;">'; temphtml += '<div style="width: 100%; height: auto;">'; temphtml += '<img style="height: auto; width: 100%;"src="'+charImg+'">'; temphtml += '</div>'; temphtml += '<div class="">'; temphtml += $(this).find('.borderClass .spaceit_pad').first().parent().html(); temphtml += '</div>'; temphtml += '</div>'; temphtml += '</div>'; }); for(var i=0; i < 10; i++){ temphtml +='<div class="listPlaceholder" style="height: 0;"><div class="mdl-grid" style="width: 126px;"></div></div>'; } if(charFound) $("#info-iframe").contents().find('.characters-block').html(tempWrapHtml).show(); $("#info-iframe").contents().find('.characters-block .clicker').one('click', function(){ $("#info-iframe").contents().find('#characterList').html(temphtml).show(); $("#info-iframe").contents().find('.characters-block .remove').remove(); fixIframeLink(); }); }catch(e) {console.log('[iframeOverview] Error:',e);} try{ var continueHtml = ''; continueHtml +='<div class="mdl-card__actions mdl-card--border" style="padding-left: 0;">' continueHtml += '<div class="data title progress" style="display: inline-block; position: relative; top: 2px; margin-left: -2px;"><div class="link" style="display: none;">'+$("#info-iframe").contents().find('#myinfo_watchedeps').val()+'</div></div>'; continueHtml +='</div>'; getanime(url, function(actual){ try{ if(actual['.add_'+localListType+'[tags]'].indexOf("last::") > -1 ){ var url = atobURL( actual['.add_'+localListType+'[tags]'].split("last::")[1].split("::")[0] ); $("#info-iframe").contents().find('.malDescription').first().append(continueHtml); setStreamLinks(url, $("#info-iframe").contents().find('.malDescription').first()); $("#info-iframe").contents().find('.malDescription .stream, .malDescription .nextStream').addClass('mdl-button mdl-button--colored mdl-js-button mdl-button--raised').css('color', 'white').find('img').css('padding-bottom', '3px').css('padding-right', '6px').css('margin-left', '-3px'); if(localListType == 'anime'){ $("#info-iframe").contents().find('.malDescription .nextStream').append('Next Episode'); $("#info-iframe").contents().find('.malDescription .stream').append('Continue Watching'); }else{ $("#info-iframe").contents().find('.malDescription .nextStream').append('Continue Reading'); $("#info-iframe").contents().find('.malDescription .stream').append('Overview'); } } }catch(e) {console.log('[iframeOverview] Error:',e);} }, url, url.split('/')[3]); }catch(e) {console.log('[iframeOverview] Error:',e);} try{ $("#info-iframe").contents().find('.stream-block-inner').html(''); setKissToMal(url); }catch(e) {console.log('[iframeOverview] Error:',e);} } function iframeReview(url, data){ $("#info-iframe").contents().find('#loadReviews').hide(); try{ var reviews = data.split('Reviews</h2>')[1].split('<h2>')[0]; var html = $.parseHTML( reviews ); var reviewsHtml = '<div class="mdl-grid">'; $.each($(html).filter('.borderDark'), function( index, value ) { reviewsHtml += '<div class="mdl-cell mdl-cell--12-col mdl-shadow--4dp">'; reviewsHtml += '<div class="mdl-card__supporting-text mdl-card--border" style="color: black;">'; $(this).find('.spaceit > div').css('max-width','60%'); reviewsHtml += $(this).find('.spaceit').first().html(); reviewsHtml += '</div>'; reviewsHtml += '<div class="mdl-card__supporting-text" style="color: black;">'; $(this).find('.textReadability, .textReadability > span').contents().filter(function(){ return this.nodeType == 3 && $.trim(this.nodeValue).length; }).wrap('<p style="margin:0;padding=0;"/>'); $(this).find('br').css('line-height','10px'); reviewsHtml += $(this).find('.textReadability').html(); reviewsHtml += '</div>'; reviewsHtml += '</div>'; }); reviewsHtml += '</div>'; if(reviewsHtml == '<div class="mdl-grid"></div>'){ reviewsHtml = '<span class="mdl-chip" style="margin: auto; margin-top: 16px; display: table;"><span class="mdl-chip__text">Nothing Found</span></span>'; } $("#info-iframe").contents().find('#malReviews').html(reviewsHtml).show(); $("#info-iframe").contents().find('.js-toggle-review-button').addClass('nojs').click(function(){ var revID = $(this).attr('data-id'); $("#info-iframe").contents().find('#review'+revID).css('display','initial'); $("#info-iframe").contents().find('#revhelp_output_'+revID).remove(); $(this).remove(); }); $("#info-iframe").contents().find('.mb8 a').addClass('nojs').click(function(){ var revID = $(this).attr('onclick').split("$('")[1].split("'")[0]; $("#info-iframe").contents().find(revID).toggle(); }); }catch(e) {console.log('[iframeReview] Error:',e);} } function iframeEpisode(url, data){ getAjaxData(url+'/episode', function(data){ try{ $("#info-iframe").contents().find('#loadEpisode').hide(); var episodesBlock = data.split('mt8 episode_list js-watch-episode-list ascend">')[1].split('</table>')[0]; var episodesHtml = '<div class="mdl-grid">\ <div class="mdl-cell mdl-cell--12-col mdl-shadow--4dp">\ <table class="mdl-data-table mdl-js-data-table mdl-data-table--selectable mdl-shadow--2dp">'+episodesBlock+'</table>\ </div>\ </div>'; $("#info-iframe").contents().find('#malEpisodes').html(episodesHtml).show(); $("#info-iframe").contents().find('#malEpisodes .episode-video, #malEpisodes .episode-forum').remove(); }catch(e) {console.log('[iframeEpisode] Error:',e);} }); } function iframeRecommendations(url, data){ getAjaxData(url+'/userrecs', function(data){ try{ $("#info-iframe").contents().find('#loadRecommendations').hide(); var recommendationsBlock = data.split('Make a recommendation</a>')[1].split('</h2>')[1].split('<div class="mauto')[0]; var html = $.parseHTML( recommendationsBlock ); var recommendationsHtml = '<div class="mdl-grid">'; $.each($(html).filter('.borderClass'), function( index, value ) { recommendationsHtml += '<div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp mdl-grid">'; recommendationsHtml += '<div class="mdl-card__media" style="background-color: transparent; margin: 8px;">'; recommendationsHtml += $(this).find('.picSurround').html(); recommendationsHtml += '</div>'; recommendationsHtml += '<div class="mdl-cell" style="flex-grow: 100;">'; recommendationsHtml += '<div class="">'; $(this).find('.button_edit, .button_add, td:eq(1) > div:eq(1) span').remove(); recommendationsHtml += $(this).find('td:eq(1) > div:eq(1)').html(); recommendationsHtml += '</div>'; recommendationsHtml += '<div class="">'; $(this).find('a[href^="/dbchanges.php?go=report"]').remove(); recommendationsHtml += $(this).find('.borderClass').html(); recommendationsHtml += '</div>'; recommendationsHtml += '<div class="">'; recommendationsHtml += (typeof $(this).find('.spaceit').html() != 'undefined') ? $(this).find('.spaceit').html() : ''; recommendationsHtml += '<div class="more" style="display: none;">'; recommendationsHtml += $(this).find('td:eq(1) > div').last().html(); recommendationsHtml += '</div>'; recommendationsHtml += '</div>'; recommendationsHtml += '</div>'; /*recommendationsHtml += '<div class="mdl-card__supporting-text mdl-card--border" style="color: black;">'; $(this).find('.spaceit > div').css('max-width','60%'); recommendationsHtml += $(this).find('.spaceit').first().html(); recommendationsHtml += '</div>'; recommendationsHtml += '<div class="mdl-card__supporting-text" style="color: black;">'; $(this).find('.textReadability, .textReadability > span').contents().filter(function(){ return this.nodeType == 3 && $.trim(this.nodeValue).length; }).wrap('<p style="margin:0;padding=0;"/>'); $(this).find('br').css('line-height','10px'); recommendationsHtml += $(this).find('.textReadability').html(); recommendationsHtml += '</div>';*/ //recommendationsHtml += $(this).html(); recommendationsHtml += '</div>'; }); recommendationsHtml += '</div>'; if(recommendationsHtml == '<div class="mdl-grid"></div>'){ recommendationsHtml = '<span class="mdl-chip" style="margin: auto; margin-top: 16px; display: table;"><span class="mdl-chip__text">Nothing Found</span></span>'; } $("#info-iframe").contents().find('#malRecommendations').html(recommendationsHtml).show(); $("#info-iframe").contents().find('.js-similar-recommendations-button').addClass('nojs').click(function(){$(this).parent().find('.more').toggle();}); $("#info-iframe").contents().find('.js-toggle-recommendation-button').addClass('nojs').click(function(){ var revID = $(this).attr('data-id'); $("#info-iframe").contents().find('#recommend'+revID).css('display','initial'); $(this).remove(); }); fixIframeLink(); $("#info-iframe").contents().find('#malRecommendations a[href^="https://myanimelist.net/anime/"],#malRecommendations a[href^="https://myanimelist.net/manga/"]').each(function() { $(this).click(function(e) { $("#info-iframe").contents().find('.malClear').hide(); $("#info-iframe").contents().find('.mdl-progress__indeterminate').show(); $("#info-iframe").contents().find("#backbutton").show(); $("#info-iframe").contents().find('#SearchButton').css('margin-left', '-17px'); $("#info-iframe").contents().find('#book').css('left', '40px'); $("#info-iframe").contents().find('.mdl-layout__tab:eq(0) span').trigger( "click" ); fillIframe($(this).attr('href')); }).attr('onclick','return false;'); }); $("#info-iframe").contents().find('#malRecommendations .more .borderClass').addClass('mdl-shadow--2dp').css('padding','10px'); $("#info-iframe").contents().find('.lazyload').each(function() { $(this).attr('src', $(this).attr('data-src'));});//TODO: use lazyloading }catch(e) {console.log('[iframeRecommendations] Error:',e);} }); } function executejs(string){ var rawframe = document.getElementById('info-iframe'); var framedoc = rawframe.contentDocument; if (!framedoc && rawframe.contentWindow) { framedoc = rawframe.contentWindow.document; } var script = document.createElement('script'); script.type = "text/javascript"; //script.src = "https://code.getmdl.io/1.3.0/material.min.js"; script.text = string; framedoc.body.appendChild(script); } function materialCheckbox(option, string, text, header = false){ var check = ''; var sty = ''; if(option == 1) check = 'checked'; if(header) sty = 'font-size: 24px; font-weight: 300; line-height: normal;'; var item = '<li class="mdl-list__item">\ <span class="mdl-list__item-primary-content" style="'+sty+'">\ '+text+'\ </span>\ <span class="mdl-list__item-secondary-action">\ <label class="mdl-switch mdl-js-switch mdl-js-ripple-effect" for="'+string+'">\ <input type="checkbox" id="'+string+'" class="mdl-switch__input" '+check+' />\ </label>\ </span>\ </li>'; return item; } function getAjaxData(url, callback){ GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onload: function(response) { if(response.status == 200){ callback(response.responseText); }else{ callback('404'); } } }); } function fixIframeLink(){ $("#info-iframe").contents().find('#material a').not('[href^="http"],[href^="https"],[href^="mailto:"],[href^="#"],[href^="javascript"]').each(function() { try{ $(this).attr('href', function(index, value) { if (value.substr(0,1) !== "/") { value = window.location.pathname + value; } return "https://myanimelist.net" + value; }); }catch(e){} }); $("#info-iframe").contents().find('a').not(".nojs").attr('target','_blank'); } function searchMal(keyword, type = 'all', selector, callback){ $("#info-iframe").contents().find(selector).html(''); GM_xmlhttpRequest({ method: "GET", url: 'https://myanimelist.net/search/prefix.json?type='+type+'&keyword='+keyword+'&v=1', synchronous: false, onload: function(response) { var searchResults = $.parseJSON(response.response); $("#info-iframe").contents().find(selector).append('<div class="mdl-grid">\ <select name="myinfo_score" id="searchListType" class="inputtext mdl-textfield__input mdl-cell mdl-cell--12-col" style="outline: none; background-color: white; border: none;">\ <option value="anime">Anime</option>\ <option value="manga">Manga</option>\ </select>\ </div>'); $("#info-iframe").contents().find('#searchListType').val(type); $("#info-iframe").contents().find('#searchListType').change(function(event) { searchMal(keyword, $("#info-iframe").contents().find('#searchListType').val(), selector, callback) }); $.each(searchResults, function() { $.each(this, function() { $.each(this, function() { $.each(this, function() { if(typeof this['name'] != 'undefined'){ $("#info-iframe").contents().find(selector+' > div').append('<div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--2dp mdl-grid searchItem" malhref="'+this['url']+'" style="cursor: pointer;">\ <img src="'+this['image_url']+'" style="margin: -8px 0px -8px -8px; height: 100px; width: 64px; background-color: grey;"></img>\ <div style="flex-grow: 100; cursor: pointer; margin-top: 0; margin-bottom: 0;" class="mdl-cell">\ <span style="font-size: 20px; font-weight: 400; line-height: 1;">'+this['name']+'</span>\ <p style="margin-bottom: 0; line-height: 20px; padding-top: 3px;">Type: '+this['payload']['media_type']+'</p>\ <p style="margin-bottom: 0; line-height: 20px;">Score: '+this['payload']['score']+'</p>\ <p style="margin-bottom: 0; line-height: 20px;">Year: '+this['payload']['start_year']+'</p>\ </div>\ </div>'); } }); }); }); }); callback(); } }); } function iframeBookmarks(element, state = 1, localListType = K.listType){ element.html('<div id="loadRecommendations" class="mdl-progress mdl-js-progress mdl-progress__indeterminate" style="width: 100%; position: absolute;"></div>'); executejs('componentHandler.upgradeDom();'); var my_watched_episodes = 'num_watched_episodes'; var series_episodes = 'anime_num_episodes'; var localPlanTo = 'Plan to Watch'; var localWatching = 'Watching' if(localListType != 'anime'){ my_watched_episodes = 'num_read_chapters'; series_episodes = 'manga_num_chapters'; localPlanTo = 'Plan to Read'; localWatching = 'Reading' } var firstEl = 1; getUserList(state, localListType, function(el, index, total){ if(firstEl){ firstEl = 0; var bookmarkHtml = '<div class="mdl-grid" id="malList" style="justify-content: space-around;">'; bookmarkHtml +='<select name="myinfo_score" id="userListType" class="inputtext mdl-textfield__input mdl-cell mdl-cell--12-col" style="outline: none; background-color: white; border: none;">\ <option value="anime">Anime</option>\ <option value="manga">Manga</option>\ </select>'; bookmarkHtml +='<select name="myinfo_score" id="userListState" class="inputtext mdl-textfield__input mdl-cell mdl-cell--12-col" style="outline: none; background-color: white; border: none;">\ <option value="7">All</option>\ <option value="1" selected>'+localWatching+'</option>\ <option value="2">Completed</option>\ <option value="3">On-Hold</option>\ <option value="4">Dropped</option>\ <option value="6">'+localPlanTo+'</option>\ </select>'; //flexbox placeholder for(var i=0; i < 10; i++){ bookmarkHtml +='<div class="listPlaceholder mdl-cell mdl-cell--2-col mdl-cell--4-col-tablet mdl-cell--6-col-phone mdl-shadow--2dp mdl-grid " style="cursor: pointer; height: 250px; padding: 0; width: 210px; height: 0px; margin-top:0; margin-bottom:0; visibility: hidden;"></div>'; } bookmarkHtml += '</div>' element.html( bookmarkHtml ); $("#info-iframe").contents().find('#malSearchPop #userListType').val(localListType); $("#info-iframe").contents().find('#malSearchPop #userListType').change(function(event) { iframeBookmarks(element, state, $("#info-iframe").contents().find('#malSearchPop #userListType').val() ); }); $("#info-iframe").contents().find('#malSearchPop #userListState').val(state); $("#info-iframe").contents().find('#malSearchPop #userListState').change(function(event) { iframeBookmarks(element, $("#info-iframe").contents().find('#malSearchPop #userListState').val(), localListType); }); } if(!el){ element.find('#malList .listPlaceholder').first().before( '<span class="mdl-chip" style="margin: auto; margin-top: 16px; display: table;"><span class="mdl-chip__text">No Entries</span></span>'); element.find('#malList .listPlaceholder').remove(); return; } var bookmarkElement = ''; var uid = el[localListType+'_id'] var malUrl = 'https://myanimelist.net'+el[localListType+'_url']; var imageHi = el[localListType+'_image_path']; var regexDimensions = /\/r\/\d*x\d*/g; if ( regexDimensions.test(imageHi) ) { imageHi = imageHi.replace(/v.jpg$/g, '.jpg').replace(regexDimensions, ''); } var progressProcent = ( el[my_watched_episodes] / el[series_episodes] ) * 100; bookmarkElement +='<div class="mdl-cell mdl-cell--2-col mdl-cell--4-col-tablet mdl-cell--6-col-phone mdl-shadow--2dp mdl-grid bookEntry e'+uid+'" malhref="'+malUrl+'" maltitle="'+el[localListType+'_title']+'" malimage="'+el[localListType+'_image_path']+'" style="position: relative; cursor: pointer; height: 250px; padding: 0; width: 210px; height: 293px;">'; bookmarkElement +='<div class="data title" style="background-image: url('+imageHi+'); background-size: cover; background-position: center center; background-repeat: no-repeat; width: 100%; position: relative; padding-top: 5px;">'; bookmarkElement +='<span class="mdl-shadow--2dp" style="position: absolute; bottom: 0; display: block; background-color: rgba(255, 255, 255, 0.9); padding-top: 5px; display: inline-flex; align-items: center; justify-content: space-between; left: 0; right: 0; padding-right: 8px; padding-left: 8px; padding-bottom: 8px;">'+el[localListType+'_title']; bookmarkElement +='<div id="p1" class="mdl-progress" series_episodes="'+el[series_episodes]+'" style="position: absolute; top: -4px; left: 0;"><div class="progressbar bar bar1" style="width: '+progressProcent+'%;"></div><div class="bufferbar bar bar2" style="width: 100%;"></div><div class="auxbar bar bar3" style="width: 0%;"></div></div>'; bookmarkElement +='<div class="data progress mdl-chip mdl-chip--contact mdl-color--indigo-100" style="float: right; line-height: 20px; height: 20px; padding-right: 4px; margin-left: 5px;">'; bookmarkElement +='<div class="link mdl-chip__contact mdl-color--primary mdl-color-text--white" style="line-height: 20px; height: 20px; margin-right: 0;">'+el[my_watched_episodes]+'</div>'; bookmarkElement +='</div>'; bookmarkElement +='</span>'; bookmarkElement +='<div class="tags" style="display: none;">'+el['tags']+'</div>'; bookmarkElement +='</div>'; bookmarkElement +='</div>'; element.find('#malList .listPlaceholder').first().before( bookmarkElement ); var domE = element.find('#malList .e'+uid).first(); domE.click(function(event) { $("#info-iframe").contents().find('#book').click(); $("#info-iframe").contents().find('.malClear').hide(); $("#info-iframe").contents().find('.mdl-progress__indeterminate').show(); $("#info-iframe").contents().find("#backbutton").show(); $("#info-iframe").contents().find('#SearchButton').css('margin-left', '-17px'); $("#info-iframe").contents().find('#book').css('left', '40px'); $("#info-iframe").contents().find('.mdl-layout__tab:eq(0) span').trigger( "click" ); fillIframe($(this).attr('malhref')); }); if(domE.find('.tags').text().indexOf("last::") > -1 ){ var url = atobURL( domE.find('.tags').text().split("last::")[1].split("::")[0] ); setStreamLinks(url, domE); if( parseInt(el['status']) === 1 ){ checkForNewEpisodes(url, domE, domE.attr('maltitle'), domE.attr('malimage')); } } epPrediction(domE.attr('malhref').split('/')[4], function(timestamp, airing, diffWeeks, diffDays, diffHours, diffMinutes, episode){ if(airing){ if(episode){ var titleMsg = 'Next episode estimated in '+diffDays+'d '+diffHours+'h '+diffMinutes+'m'; var progressBar = domE.find('.mdl-progress'); var predictionProgress = ( episode / progressBar.attr('series_episodes') ) * 100; progressBar.prepend('<div class="predictionbar bar kal-ep-pre" ep="'+(diffWeeks+1)+'" style="width: '+predictionProgress+'%; background-color: red; z-index: 1; left: 0;"></div>'); domE.attr('title', titleMsg); } } }); } ,function(){ startCheckForNewEpisodes(localListType); }, null, function(continueCall){ if(state == 1){ continueCall(); return; } var scrollable = $("#info-iframe").contents().find('#malSearchPop .simplebar-scroll-content'); var scrollDone = 0; scrollable.scroll(function() { if(scrollDone) return; if(scrollable.scrollTop() + scrollable.height() > scrollable.find('.simplebar-content').height() - 100) { scrollDone = 1; con.log('[Bookmarks]','Loading next part'); continueCall(); } }); }); } var outOfTheWayLoad = 0; function outOfTheWay(){ if(outWay != 1) return; $(document).ready(function(){ try{ var minimalSelector = '#modal-content'; reposition(); if(outOfTheWayLoad == 0){ outOfTheWayLoad = 1; $( window ).resize(function(){reposition();}); var lastScrollLeft = 0; $(window).scroll(function() { var documentScrollLeft = $(document).scrollLeft(); if (lastScrollLeft != documentScrollLeft) { lastScrollLeft = documentScrollLeft; reposition(); } }); $(document).on('mozfullscreenchange webkitfullscreenchange fullscreenchange',function(){ reposition(); }); } function reposition(){ $(K.videoSelector).css('transform', ''); if(!$(minimalSelector).is(":visible")){ return; } var videoLeft = $(K.videoSelector).offset().left; var videoWidth = $(K.videoSelector).width(); var videoRight = videoLeft + videoWidth; var minimalLeft = $(minimalSelector).offset().left; var minimalRight = minimalLeft + $(minimalSelector).width(); var viewportWidth = $(window).width() - $(minimalSelector).width(); if( minimalLeft == $(window).scrollLeft()){ if( minimalRight > videoLeft){ var tempVideoLeft = minimalRight; if(videoWidth > viewportWidth){ setVideo(tempVideoLeft, viewportWidth); }else{ setVideo(tempVideoLeft, videoWidth); } } }else{ if(minimalLeft < videoRight){ if(videoWidth > viewportWidth){ var tempVideoLeft = minimalLeft - viewportWidth; setVideo(tempVideoLeft, viewportWidth); }else{ var tempVideoLeft = minimalLeft - videoWidth; setVideo(tempVideoLeft, videoWidth); } } } function setVideo(Left, Width){ var scale = Width / videoWidth; Left = Left - videoLeft; Left = Left / scale; $(K.videoSelector).css('transform', 'scale('+scale+') translateX('+Left+'px)'); $(K.videoSelector).css('transform-origin', '0% 50%'); $(K.videoSelector).css('transition', '0s'); } } }catch(e){} }); } var newEPTime = 0; var newEpUpdate = 0; var checkFail = []; var NexEpProcessed = 0; var NexEpFinished = 0; var newEpRetries = 0; var checkArray = []; function checkForNewEpisodes(url, entrySelector, title = '', img = ''){ checkArray.push(function(totalEntries){checkForNewEpisode(url, entrySelector, totalEntries, title, img);}); } function startCheckForNewEpisodes(localListType = K.listType){ newEpRetries++; if(newEpInterval == 'null'){ return; } if($('.username').first().attr('href')){ return; } if(!checkArray.length){ return; } if( $.now() - GM_getValue('newEp_last_update_'+localListType, 0) > newEpInterval){ $('body').before('<div style="z-index: 20000000000; height: 5px; position: fixed; top: 0; left: 0; right: 0;background-color: rgba(255,225,255,0.5);"><div id="checkProgress" style="width: 0%;background-color: #3f51b5; height: 100%; transition: width 1s;"></div></div>'); newEpUpdate = 1; } var tempArray = checkArray; checkArray = []; newEPTime = 0; for(var i=0 ; i < tempArray.length ; i++){ tempArray[i](tempArray.length); } } function checkForNewEpisode(url, entrySelector, totalEntries, title = '', img = ''){ var selector = ''; var hasStyle = 0; var localListType = 'anime'; var checkAiringState = function(parsed, html){}; if($(entrySelector).attr('style')) hasStyle = 1; if( url.indexOf("kissanime.ru") > -1 ){ selector = ".listing a"; checkAiringState = function(parsed, html){ try{ if(html.split('Status:</span>')[1].split('<')[0].indexOf("Completed") > -1){ return true; } }catch(e){ con.log('[ERROR]',e); } return false; } }else if( url.indexOf("kissmanga.com") > -1 ){ localListType = 'manga'; selector = ".listing a"; checkAiringState = function(parsed, html){ try{ if(html.split('Status:</span>')[1].split('<')[0].indexOf("Completed") > -1){ return true; } }catch(e){ con.log('[ERROR]',e); } return false; } }else if( url.indexOf("masterani.me") > -1 ){ var masterid = url.split('/')[5].split('-')[0]; url = 'https://www.masterani.me/api/anime/'+masterid+'/detailed'; selector = ".thumbnail a.title"; checkAiringState = function(parsed, html){ try{ if(parsed["info"]["status"] == 0){ return true; } }catch(e){ con.log('[ERROR]',e); } return false; } }else if( url.indexOf("9anime.") > -1 ){ selector = ".server:first-child .episodes a"; checkAiringState = function(parsed, html){ try{ if(html.split('<dt>Status:</dt>')[1].split('</dl>')[0].indexOf("Completed") > -1){ return true; } }catch(e){ con.log('[ERROR]',e); } return false; } }else if( url.indexOf("crunchyroll.com") > -1 ){ selector = "#showview_content_videos .list-of-seasons .group-item a"; checkAiringState = function(parsed, html){ try{ if(!(html.indexOf("Simulcast on") > -1)){ return true; } }catch(e){ con.log('[ERROR]',e); } return false; } }else if( url.indexOf("gogoanime.") > -1 ){ selector = "#episode_page a:last"; checkAiringState = function(parsed, html){ try{ if(html.split('Status: </span>')[1].split('<')[0].indexOf("Completed") > -1){ return true; } }catch(e){ con.log('[ERROR]',e); } return false; } }else if( url.indexOf("mangadex.org") > -1 ){ selector = ".edit.tab-content .table-striped tbody > tr:first a"; checkAiringState = function(parsed, html){ try{ if(html.split('status:</th>')[1].split('td')[1].split('<')[0].indexOf("Completed") > -1){ return true; } }catch(e){ con.log('[ERROR]',e); } return false; } }else{ checkForNewEpisodesDone(totalEntries, true); return; } if( GM_getValue('newEp_'+url+'_finished', false) == true){ con.log('[EpCheck] [Finished]', title); if(debug && !hasStyle){ $(entrySelector).attr('style', 'border-left: 4px solid green !important');} checkForNewEpisodesDone(totalEntries, true); return true; } setBorder(GM_getValue('newEp_'+url+'_cache', null)); if(newEpUpdate){ setTimeout( function(){ con.log('[EpCheck]', title, url ); GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onerror: function(response) { con.log('[ERROR]',url+' could not be loaded'); checkForNewEpisodesDone(totalEntries, true); }, onload: function(response) { if(newEpCR){ if(response.response.indexOf('Your detected location is United States of America') == -1 && url.indexOf("crunchyroll.com") > -1){ response.status = 502; } } if(response.status != 200){//TODO: Cloudflare handling con.log('[EpCheck] [ERROR]', response); var checkFailMessage = 'Coud Not Check'; if(newEpRetries < 3 && openInBg){ checkFailMessage = 'Please wait'; } var message = '<div>'+checkFailMessage+'</div><div class="errorpage"></div>'//;<button class="okChangelog" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px;cursor: pointer;">Ok</button></div>'; if( !$('.errorpage').length ){ flashm(message,false,false,true); } var erClass = url.split('/')[2].replace(".", "").replace(".", ""); if(!($('.'+erClass).length)){ $('.errorpage').prepend('<a target="_blank" class="'+erClass+'" href="'+url+'">'+url.split('/')[2]+'</a><br class="'+erClass+'" />'); $('.'+erClass).click(function(){ $(this).remove(); if($('.errorpage').text() == ''){ $('.flashPerm').remove(); } }); checkFail.push(url); } checkForNewEpisodes(url, entrySelector, title, img); }else{ if( url.indexOf("masterani.me") > -1 ){ var parsed = $.parseJSON(response.response); var EpNumber = parsed['episodes'].length; var complete = checkAiringState(parsed, response.response); }else if( url.indexOf("gogoanime.") > -1 ){ var parsed = $.parseHTML(response.response); var EpNumber = $(parsed).find( selector ).text(); EpNumber = parseInt(EpNumber.split('-')[1]); var complete = checkAiringState(parsed, response.response); }else if( url.indexOf("mangadex.org") > -1 ){ var parsed = $.parseHTML(response.response); var EpNumber = $(parsed).find( selector ).attr('data-chapter-num'); var complete = checkAiringState(parsed, response.response); }else{ var parsed = $.parseHTML(response.response); var EpNumber = $(parsed).find( selector ).length; var complete = checkAiringState(parsed, response.response); } if(complete){ con.log('[EpCheck] [SetFinished]', title); GM_setValue('newEp_'+url+'_finished', true); }else{ setBorder(EpNumber); } } checkForNewEpisodesDone(totalEntries); } }); }, newEPTime); newEPTime += 1000; } function setBorder(EpNumber){ if(EpNumber === null){ return; } var currentEpisode = $(entrySelector).find('.data.progress .link, .data.chapter .link').text().trim().replace(/\/.*/,''); con.log('[EpCheck]', GM_getValue('newEp_'+url+'_number',null), EpNumber); if( GM_getValue('newEp_'+url+'_number', EpNumber) < EpNumber && currentEpisode != $(entrySelector).find('.kal-ep-pre').attr('ep')){ con.log('[NewEP]', url); if(GM_getValue('newEp_'+url+'_cache', null) != EpNumber){ var newMessage = 'New episode got released!'; if(localListType != 'anime'){ newMessage = 'New chapter got released!'; } if(newEpNotification){ try{ GM_notification({text: newMessage, title: title, image: img, timeout: 0/*, onclick: function(){ try{ //GM_setValue('newEp_'+url+'_number', EpNumber); }catch(e){} location.href = url; } */}); }catch(e){ console.log('[ERROR] Could not execute GM_notification'); alert('New episode for '+title+' released'); } } } GM_setValue('newEp_'+url+'_cache', EpNumber); if(!hasStyle) $(entrySelector).attr('style', 'border: 3px solid #'+newEpBorder+' !important'); if(GM_getValue('newEp_'+url+'_last', null) != currentEpisode && GM_getValue('newEp_'+url+'_last', null) != null){ GM_setValue('newEp_'+url+'_number', EpNumber); if(!hasStyle) $(entrySelector).attr('style', ''); $(entrySelector).find('.newEp').remove(); GM_setValue('newEp_'+url+'_last', currentEpisode); return true; }; GM_setValue('newEp_'+url+'_last', currentEpisode); if(!$(entrySelector).find('.newEp').length) $(entrySelector).append('<div class="newEp"></div>'); }else{ if(GM_getValue('newEp_'+url+'_number', null) == null){ GM_setValue('newEp_'+url+'_number', EpNumber); } if(debug && !hasStyle){ $(entrySelector).attr('style', 'border-left: 4px solid yellow !important');} } } function checkForNewEpisodesDone(totalEntries, finishedCache = false){ NexEpProcessed++; if(finishedCache) NexEpFinished++; con.log('[EpCheck]','('+ NexEpProcessed+'/'+totalEntries+')'); $('#checkProgress').css('width', ((NexEpProcessed - NexEpFinished)/( totalEntries - NexEpFinished)*100) + '%'); if(NexEpProcessed === totalEntries){ NexEpProcessed = 0; NexEpFinished = 0; $('#checkProgress').parent().fadeOut({ duration: 2500, queue: false, complete: function() { $(this).remove(); }}); function checkFailBackground(){ if(!openInBg) return; if(checkFail.length){ var rNumber = Math.floor((Math.random() * 1000) + 1); var url = checkFail[0]; var erClass = url.split('/')[2].replace(".", "").replace(".", ""); $('.'+erClass).click(); GM_setValue( 'checkFail', rNumber ); var tab = GM_openInTab(url+'?id='+rNumber); checkFail.shift(); console.log(tab); var timeou = setTimeout(function(){ tab.close(); checkFailBackground(); }, 60000); var index = 0; var inter = setInterval(function(){ index++; if(index > 59){ clearInterval(inter); } if(GM_getValue( 'checkFail', 0 ) == 0){ clearInterval(inter); clearTimeout(timeou); tab.close(); checkFailBackground(); } }, 1000); }else{ newEPTime = 0; newEpUpdate = 0; startCheckForNewEpisodes(); } } if(checkFail.length && newEpRetries < 3){ checkFailBackground(); }else{ newEpRetries = 0; GM_setValue('newEp_last_update_'+localListType, $.now()); } } } }; //EP_Prediction function epPrediction( malId , callback){ if(!epPredictions) return; timestampUpdate(); var timestamp = GM_getValue('mal/'+malId+'/release', false); if(timestamp){ var airing = 1; var episode = 0; if(Date.now() < timestamp) airing = 0; if(airing){ var delta = Math.abs(Date.now() - timestamp) / 1000; }else{ var delta = Math.abs(timestamp - Date.now()) / 1000; } var diffWeeks = Math.floor(delta / (86400 * 7)); delta -= diffWeeks * (86400 * 7); if(airing){ //We need the time until the week is complete delta = (86400 * 7) - delta; } var diffDays = Math.floor(delta / 86400); delta -= diffDays * 86400; var diffHours = Math.floor(delta / 3600) % 24; delta -= diffHours * 3600; var diffMinutes = Math.floor(delta / 60) % 60; delta -= diffMinutes * 60; if(airing){ episode = diffWeeks - (new Date().getFullYear() - new Date(timestamp).getFullYear()); //Remove 1 week between years episode++; if( episode > 50 ){ episode = 0; } } if(episode < GM_getValue('mal/'+malId+'/eps', 100000)){ callback(timestamp, airing, diffWeeks, diffDays, diffHours, diffMinutes, episode); } } } function timestampUpdate(){ function toTimestamp(year,month,day,hour,minute,second){ var datum = new Date(Date.UTC(year,month-1,day,hour,minute,second)); return (datum.getTime())-32400000;//for GMT } if( $.now() - GM_getValue('timestampUpdate/release', 0) < 345600000){ return 0; } var url = 'https://myanimelist.net/anime/season/schedule'; GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onload: function(response) { var found = 0; var parsed = $.parseHTML(response.response); var se = '.js-seasonal-anime-list-key-'; se = se+'monday, '+se+'tuesday ,'+se+'wednesday ,'+se+'thursday ,'+se+'friday ,'+se+'saturday ,'+se+'sunday'; $(parsed).find(se).find('.seasonal-anime').each(function(){ if(!found) clearScheduleCache(); found = 1; if($(this).find('.info .remain-time').text().match(/\w+\ \d+.\ \d+,\ \d+:\d+\ \(JST\)/i)){ var malId = $(this).find('a.link-title').attr('href').split('/')[4]; var jpdate = $(this).find('.info .remain-time').text().trim(); //day var day = jpdate.split(' ')[1].replace(',','').trim(); //month var month = jpdate.split(' ')[0].trim(); month = ("JanFebMarAprMayJunJulAugSepOctNovDec".indexOf(month) / 3 + 1); //year var year = jpdate.split(' ')[2].replace(',','').trim(); //time var time = jpdate.split(' ')[3].trim(); var minute = time.split(':')[1]; var hour = time.split(':')[0]; //timezone var timestamp = toTimestamp(year,month,day,hour,minute,0); GM_setValue('mal/'+malId+'/release', timestamp); var episode = $(this).find('.eps a span').last().text(); if(episode.match(/^\d+/)){ GM_setValue('mal/'+malId+'/eps', parseInt( episode.match(/^\d+/)[0]) ); } } }); if(found){ GM_setValue('timestampUpdate/release', $.now()); flashm( "Schedule Data Updated" , false); } } }); return 1; } function clearScheduleCache(){ var cacheArray = GM_listValues(); con.log('Before',cacheArray); $.each( cacheArray, function( index, cache){ if(/^mal\/[^/]+\/(release|eps)$/.test(cache)){ GM_deleteValue(cache); } }); con.log('After',GM_listValues()); } if(window.location.href.indexOf("/BookmarkList") > -1 ){ K.docReady(function() { var optionsTarget = $("#divEmailNotify"); if(malBookmarks == 1){ var check = 'checked'; }else{ var check = ''; } if(BookmarksStyle == 1 && malBookmarks == 1){ var checkfix = 'checked'; $('.bigBarContainer').before('<div id="rightside" style="margin-right: 100px;"><div class="rightBox"> <div class="barTitle">Options</div> <div class="barContent"> <div class="arrow-general"> </div> <div id="optionsTarget"> </div> </div> </div></div>'); optionsTarget = $("#optionsTarget"); $('.bigBarContainer>.barContent>div>div:not([class])').first().remove(); }else{ var checkfix = ''; } if(classicBookmarks == 1 && malBookmarks == 1){ var checkClassic = 'checked'; }else{ var checkClassic = ''; } K.bookmarkButton(optionsTarget, check);//optionsTarget.before('<div><input type="checkbox" id="malBookmarks" '+check+' > MyAnimeList Bookmarks</div><div class="clear2"> </div>'); $('#malBookmarks').change(function(){ if($('#malBookmarks').is(":checked")){ malBookmarks = 1; GM_setValue('malBookmarks', 1); location.reload(); }else{ malBookmarks = 0; GM_setValue('malBookmarks', 0); location.reload(); } }); if(malBookmarks == 1){ K.classicBookmarkButton(optionsTarget, checkClassic);//optionsTarget.before('<div><input type="checkbox" id="BookmarksStyle" '+checkfix+' > Fix Bookmark styling</div><div class="clear2"> </div>'); $('#classicBookmarks').change(function(){ if($('#classicBookmarks').is(":checked")){ classicBookmarks = 1; GM_setValue('classicBookmarks', 1); location.reload(); }else{ classicBookmarks = 0; GM_setValue('classicBookmarks', 0); location.reload(); } }); } }); if(malBookmarks == 1){ try{ GM_addStyle(K.bookmarkCss); if(BookmarksStyle == 1){ GM_addStyle(K.bookmarkFixCss); } if(classicBookmarks == 1){ GM_addStyle('.listing tr:not(.head) br{display: none;} .listing tr:not(.head) .title{width: 30%; float: left;padding-bottom: 0 !important;}.kissData { width: 35% !important;} .MalData {width: 35% !important;}td.Timage {height: 0 !important;} #cssTableSet{min-width: 0 !important} #endSpacer{width: 0 !important;}'); GM_addStyle('select.malStatus { width: 33% !important; float: left; margin-right: 9%;}select.malUserRating {width: 33% !important; float: left;}.malEpisode {width: 25%; float: left;}'); } }catch(e){} getMalXml(); } }else if(window.location.href.indexOf("myanimelist.net") > -1 ){ malThumbnails(); if(window.location.href.indexOf("myanimelist.net/anime.php") > -1){ window.history.replaceState(null, null, '/anime/'+$.urlParam('id') ); } if(window.location.href.indexOf("myanimelist.net/manga.php") > -1){ window.history.replaceState(null, null, '/manga/'+$.urlParam('id') ); } if(window.location.href.indexOf("myanimelist.net/animelist") > -1 || window.location.href.indexOf("myanimelist.net/mangalist") > -1 ){ K.listType = K.listType.substring(0,5); tagToContinue(); }else{ setKissToMal(window.location.href); if(miniMALonMal){ $( document).ready(function(){ setTimeout(function(){ createIframe(); miniMalButton(window.location.href.split('/').slice(0,6).join('/').split("?")[0]); }, 4000); }); } $( document).ready(function(){ epPrediction(window.location.href.split('/')[4], function(timestamp, airing, diffWeeks, diffDays, diffHours, diffMinutes, episode){ if(airing){ var titleMsg = 'Next episode estimated in '+diffDays+'d '+diffHours+'h '+diffMinutes+'m' ; if(episode){ $('[id="curEps"]').before('<span title="'+titleMsg+'">['+episode+']</span> '); } $('#addtolist').prev().before('<span>'+titleMsg+'</span>'); }else{ $('#addtolist').prev().before('<span>Airing in '+((diffWeeks*7)+diffDays)+'d '+diffHours+'h '+diffMinutes+'m </span>'); } }); getanime(window.location.href, function(actual){ if(actual['.add_'+K.listType+'[tags]'].indexOf("last::") > -1 ){ var url = atobURL( actual['.add_'+K.listType+'[tags]'].split("last::")[1].split("::")[0] ); $('.h1 span').first().after('<div class="data title progress" style="display: inline-block; position: relative; top: 2px;"><div class="link" style="display: none;">'+$('#myinfo_watchedeps').first().val()+'</div></div>'); setStreamLinks(url, $('.h1').first().parent()); } }, window.location.href, window.location.href.split('/')[3]); }); } }else{ $("head").click(function() { checkdata(); }); K.init(); try{ window.onpopstate = function (event) { checkdata(); }; }catch(e){} } $(document).ready(function(){ changelog(); }); })(); /** * External Script * author Remy Sharp * url http://remysharp.com/2009/01/26/element-in-view-event-plugin/ */ (function ($) { function getViewportHeight() { var height = window.innerHeight; // Safari, Opera var mode = document.compatMode; if ( (mode || !$.support.boxModel) ) { // IE, Gecko height = (mode == 'CSS1Compat') ? document.documentElement.clientHeight : // Standards document.body.clientHeight; // Quirks } return height; } $(window).scroll(function () { var vpH = getViewportHeight() + 500, scrolltop = (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop), elems = []; $.each($.cache, function () { if (this.events && this.events.inview) { elems.push(this.handle.elem); } }); if (elems.length) { $(elems).each(function () { if ($(this).css("display") != "none") { var $el = $(this), top = $el.offset().top, height = $el.height(), inview = $el.data('inview') || false; if (scrolltop > (top + height) || scrolltop + vpH < top) { if (inview) { $el.data('inview', false); $el.trigger('inview', [ false ]); } } else if (scrolltop < (top + height)) { if (!inview) { $el.data('inview', true); $el.trigger('inview', [ true ]); } } } }); } }); $(function () { $(window).scroll(); }); })(jQuery);