2020-04-10 15:07:08 -04:00
( function ( ) { var matches = function ( elm , selector ) { var m = ( elm . document || elm . ownerDocument ) . querySelectorAll ( selector ) ; var i = matches . length ; while ( -- i >= 0 && m . item ( i ) !== elm ) ; return i > - 1 } ; var AnimeClient = { noop : function ( ) { } , $ : function ( selector , context ) { context = context === undefined ? null : context ; if ( typeof selector !== "string" ) return selector ; context = context !== null && context . nodeType === 1 ? context : document ; var elements = [ ] ; if ( selector . match ( /^#([\w]+$)/ ) ) elements . push ( document . getElementById ( selector . split ( "#" ) [ 1 ] ) ) ;
2019-07-15 16:05:29 -04:00
else elements = [ ] . slice . apply ( context . querySelectorAll ( selector ) ) ; return elements } , hasElement : function ( selector ) { return AnimeClient . $ ( selector ) . length > 0 } , scrollToTop : function ( ) { var el = AnimeClient . $ ( "header" ) [ 0 ] ; el . scrollIntoView ( true ) } , hide : function ( sel ) { if ( typeof sel === "string" ) sel = AnimeClient . $ ( sel ) ; if ( Array . isArray ( sel ) ) sel . forEach ( function ( el ) { return el . setAttribute ( "hidden" , "hidden" ) } ) ; else sel . setAttribute ( "hidden" , "hidden" ) } , show : function ( sel ) { if ( typeof sel === "string" ) sel = AnimeClient . $ ( sel ) ;
if ( Array . isArray ( sel ) ) sel . forEach ( function ( el ) { return el . removeAttribute ( "hidden" ) } ) ; else sel . removeAttribute ( "hidden" ) } , showMessage : function ( type , message ) { var template = "<div class='message " + type + "'>\n\t\t\t\t<span class='icon'></span>\n\t\t\t\t" + message + "\n\t\t\t\t<span class='close'></span>\n\t\t\t</div>" ; var sel = AnimeClient . $ ( ".message" ) ; if ( sel [ 0 ] !== undefined ) sel [ 0 ] . remove ( ) ; AnimeClient . $ ( "header" ) [ 0 ] . insertAdjacentHTML ( "beforeend" , template ) } , closestParent : function ( current , parentSelector ) { if ( Element . prototype . closest !==
undefined ) return current . closest ( parentSelector ) ; while ( current !== document . documentElement ) { if ( matches ( current , parentSelector ) ) return current ; current = current . parentElement } return null } , url : function ( path ) { var uri = "//" + document . location . host ; uri += path . charAt ( 0 ) === "/" ? path : "/" + path ; return uri } , throttle : function ( interval , fn , scope ) { var wait = false ; return function ( args ) { var $jscomp$restParams = [ ] ; for ( var $jscomp$restIndex = 0 ; $jscomp$restIndex < arguments . length ; ++ $jscomp$restIndex ) $jscomp$restParams [ $jscomp$restIndex -
0 ] = arguments [ $jscomp$restIndex ] ; { var args$0 = $jscomp$restParams ; var context = scope || this ; if ( ! wait ) { fn . apply ( context , args$0 ) ; wait = true ; setTimeout ( function ( ) { wait = false } , interval ) } } } } } ; function addEvent ( sel , event , listener ) { if ( ! event . match ( /^([\w\-]+)$/ ) ) event . split ( " " ) . forEach ( function ( evt ) { addEvent ( sel , evt , listener ) } ) ; sel . addEventListener ( event , listener , false ) } function delegateEvent ( sel , target , event , listener ) { addEvent ( sel , event , function ( e ) { AnimeClient . $ ( target , sel ) . forEach ( function ( element ) { if ( e . target ==
element ) { listener . call ( element , e ) ; e . stopPropagation ( ) } } ) } ) } AnimeClient . on = function ( sel , event , target , listener ) { if ( listener === undefined ) { listener = target ; AnimeClient . $ ( sel ) . forEach ( function ( el ) { addEvent ( el , event , listener ) } ) } else AnimeClient . $ ( sel ) . forEach ( function ( el ) { delegateEvent ( el , target , event , listener ) } ) } ; function ajaxSerialize ( data ) { var pairs = [ ] ; Object . keys ( data ) . forEach ( function ( name ) { var value = data [ name ] . toString ( ) ; name = encodeURIComponent ( name ) ; value = encodeURIComponent ( value ) ; pairs . push ( name +
"=" + value ) } ) ; return pairs . join ( "&" ) } AnimeClient . ajax = function ( url , config ) { var defaultConfig = { data : { } , type : "GET" , dataType : "" , success : AnimeClient . noop , mimeType : "application/x-www-form-urlencoded" , error : AnimeClient . noop } ; config = Object . assign ( { } , defaultConfig , config ) ; var request = new XMLHttpRequest ; var method = String ( config . type ) . toUpperCase ( ) ; if ( method === "GET" ) url += url . match ( /\?/ ) ? ajaxSerialize ( config . data ) : "?" + ajaxSerialize ( config . data ) ; request . open ( method , url ) ; request . onreadystatechange = function ( ) { if ( request . readyState ===
4 ) { var responseText = "" ; if ( request . responseType === "json" ) responseText = JSON . parse ( request . responseText ) ; else responseText = request . responseText ; if ( request . status > 299 ) config . error . call ( null , request . status , responseText , request . response ) ; else config . success . call ( null , responseText , request . status ) } } ; if ( config . dataType === "json" ) { config . data = JSON . stringify ( config . data ) ; config . mimeType = "application/json" } else config . data = ajaxSerialize ( config . data ) ; request . setRequestHeader ( "Content-Type" , config . mimeType ) ; if ( method ===
2020-08-25 16:02:15 -04:00
"GET" ) request . send ( null ) ; else request . send ( config . data ) ; return request } ; AnimeClient . get = function ( url , data , callback ) { callback = callback === undefined ? null : callback ; if ( callback === null ) { callback = data ; data = { } } return AnimeClient . ajax ( url , { data : data , success : callback } ) } ; AnimeClient . on ( "header" , "click" , ".message" , hide ) ; AnimeClient . on ( "form.js-delete" , "submit" , confirmDelete ) ; AnimeClient . on ( ".js-clear-cache" , "click" , clearAPICache ) ; AnimeClient . on ( ".vertical-tabs input" , "change" , scrollToSection ) ; AnimeClient . on ( ".media-filter" ,
2020-04-10 15:07:08 -04:00
"input" , filterMedia ) ; function hide ( event ) { AnimeClient . hide ( event . target ) } function confirmDelete ( event ) { var proceed = confirm ( "Are you ABSOLUTELY SURE you want to delete this item?" ) ; if ( proceed === false ) { event . preventDefault ( ) ; event . stopPropagation ( ) } } function clearAPICache ( ) { AnimeClient . get ( "/cache_purge" , function ( ) { AnimeClient . showMessage ( "success" , "Successfully purged api cache" ) } ) } function scrollToSection ( event ) { var el = event . currentTarget . parentElement ; var rect = el . getBoundingClientRect ( ) ; var top =
rect . top + window . pageYOffset ; window . scrollTo ( { top : top , behavior : "smooth" } ) } function filterMedia ( event ) { var rawFilter = event . target . value ; var filter = new RegExp ( rawFilter , "i" ) ; if ( rawFilter !== "" ) { AnimeClient . $ ( "article.media" ) . forEach ( function ( article ) { var titleLink = AnimeClient . $ ( ".name a" , article ) [ 0 ] ; var title = String ( titleLink . textContent ) . trim ( ) ; if ( ! filter . test ( title ) ) AnimeClient . hide ( article ) ; else AnimeClient . show ( article ) } ) ; AnimeClient . $ ( "table.media-wrap tbody tr" ) . forEach ( function ( tr ) { var titleCell =
2020-08-28 14:27:14 -04:00
AnimeClient . $ ( "td.align-left" , tr ) [ 0 ] ; var titleLink = AnimeClient . $ ( "a" , titleCell ) [ 0 ] ; var linkTitle = String ( titleLink . textContent ) . trim ( ) ; var textTitle = String ( titleCell . textContent ) . trim ( ) ; if ( ! ( filter . test ( linkTitle ) || filter . test ( textTitle ) ) ) AnimeClient . hide ( tr ) ; else AnimeClient . show ( tr ) } ) } else { AnimeClient . show ( "article.media" ) ; AnimeClient . show ( "table.media-wrap tbody tr" ) } } if ( "serviceWorker" in navigator ) navigator . serviceWorker . register ( "/sw.js" ) . then ( function ( reg ) { console . log ( "Service worker registered" ,
reg . scope ) } ) [ "catch" ] ( function ( error ) { console . error ( "Failed to register service worker" , error ) } ) ; ( function ( ) { var hidden = null ; var visibilityChange = null ; if ( typeof document . hidden !== "undefined" ) { hidden = "hidden" ; visibilityChange = "visibilitychange" } else if ( typeof document . msHidden !== "undefined" ) { hidden = "msHidden" ; visibilityChange = "msvisibilitychange" } else if ( typeof document . webkitHidden !== "undefined" ) { hidden = "webkitHidden" ; visibilityChange = "webkitvisibilitychange" } function handleVisibilityChange ( ) { if ( ! document [ hidden ] ) AnimeClient . get ( "/heartbeat" ,
function ( beat ) { var status = JSON . parse ( beat ) ; if ( status . hasAuth !== true ) { document . removeEventListener ( visibilityChange , handleVisibilityChange , false ) ; location . reload ( ) } } ) } if ( hidden === null ) console . info ( "Page visibility API not supported, JS session check will not work" ) ; else document . addEventListener ( visibilityChange , handleVisibilityChange , false ) } ) ( ) ; AnimeClient . on ( "main" , "change" , ".big-check" , function ( e ) { var id = e . target . id ; document . getElementById ( "mal_" + id ) . checked = true } ) ; function renderAnimeSearchResults ( data ) { var results =
2020-10-21 15:45:30 -04:00
[ ] ; data . forEach ( function ( item ) { var titles = item . titles . join ( "<br />" ) ; results . push ( '\n\t\t\t<article class="media search">\n\t\t\t\t<div class="name">\n\t\t\t\t\t<input type="radio" class="mal-check" id="mal_' + item . slug + '" name="mal_id" value="' + item . mal _id + '" />\n\t\t\t\t\t<input type="radio" class="big-check" id="' + item . slug + '" name="id" value="' + item . id + '" />\n\t\t\t\t\t<label for="' + item . slug + '">\n\t\t\t\t\t\t<picture width="220">\n\t\t\t\t\t\t\t<source srcset="/public/images/anime/' + item . id + '.webp" type="image/webp" />\n\t\t\t\t\t\t\t<source srcset="/public/images/anime/' +
item . id + '.jpg" type="image/jpeg" />\n\t\t\t\t\t\t\t<img src="/public/images/anime/' + item . id + '.jpg" alt="" width="220" />\n\t\t\t\t\t\t</picture>\n\t\t\t\t\t\t<span class="name">\n\t\t\t\t\t\t\t' + item . canonicalTitle + "<br />\n\t\t\t\t\t\t\t<small>" + titles + '</small>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t\t<div class="table">\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<span class="edit">\n\t\t\t\t\t\t\t<a class="bracketed" href="/anime/details/' + item . slug + '">Info Page</a>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</article>\n\t\t' ) } ) ;
return results . join ( "" ) } function renderMangaSearchResults ( data ) { var results = [ ] ; data . forEach ( function ( item ) { var titles = item . titles . join ( "<br />" ) ; results . push ( '\n\t\t\t<article class="media search">\n\t\t\t\t<div class="name">\n\t\t\t\t\t<input type="radio" id="mal_' + item . slug + '" name="mal_id" value="' + item . mal _id + '" />\n\t\t\t\t\t<input type="radio" class="big-check" id="' + item . slug + '" name="id" value="' + item . id + '" />\n\t\t\t\t\t<label for="' + item . slug + '">\n\t\t\t\t\t\t<picture width="220">\n\t\t\t\t\t\t\t<source srcset="/public/images/manga/' +
item . id + '.webp" type="image/webp" />\n\t\t\t\t\t\t\t<source srcset="/public/images/manga/' + item . id + '.jpg" type="image/jpeg" />\n\t\t\t\t\t\t\t<img src="/public/images/manga/' + item . id + '.jpg" alt="" width="220" />\n\t\t\t\t\t\t</picture>\n\t\t\t\t\t\t<span class="name">\n\t\t\t\t\t\t\t' + item . canonicalTitle + "<br />\n\t\t\t\t\t\t\t<small>" + titles + '</small>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t\t<div class="table">\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t<span class="edit">\n\t\t\t\t\t\t\t<a class="bracketed" href="/manga/details/' +
item . slug + '">Info Page</a>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</article>\n\t\t' ) } ) ; return results . join ( "" ) } var search = function ( query ) { AnimeClient . show ( ".cssload-loader" ) ; return AnimeClient . get ( AnimeClient . url ( "/anime-collection/search" ) , { query : query } , function ( searchResults , status ) { searchResults = JSON . parse ( searchResults ) ; AnimeClient . hide ( ".cssload-loader" ) ; AnimeClient . $ ( "#series-list" ) [ 0 ] . innerHTML = renderAnimeSearchResults ( searchResults ) } ) } ; if ( AnimeClient . hasElement ( ".anime #search" ) ) { var prevRequest =
null ; AnimeClient . on ( "#search" , "input" , AnimeClient . throttle ( 250 , function ( e ) { var query = encodeURIComponent ( e . target . value ) ; if ( query === "" ) return ; if ( prevRequest !== null ) prevRequest . abort ( ) ; prevRequest = search ( query ) } ) ) } AnimeClient . on ( "body.anime.list" , "click" , ".plus-one" , function ( e ) { var parentSel = AnimeClient . closestParent ( e . target , "article" ) ; var watchedCount = parseInt ( AnimeClient . $ ( ".completed_number" , parentSel ) [ 0 ] . textContent , 10 ) || 0 ; var totalCount = parseInt ( AnimeClient . $ ( ".total_number" , parentSel ) [ 0 ] . textContent ,
10 ) ; var title = AnimeClient . $ ( ".name a" , parentSel ) [ 0 ] . textContent ; var data = { id : parentSel . dataset . kitsuId , mal _id : parentSel . dataset . malId , data : { progress : watchedCount + 1 } } ; if ( isNaN ( watchedCount ) || watchedCount === 0 ) data . data . status = "CURRENT" ; if ( ! isNaN ( watchedCount ) && watchedCount + 1 === totalCount ) data . data . status = "COMPLETED" ; AnimeClient . show ( "#loading-shadow" ) ; AnimeClient . ajax ( AnimeClient . url ( "/anime/increment" ) , { data : data , dataType : "json" , type : "POST" , success : function ( res ) { var resData = JSON . parse ( res ) ; if ( resData . errors ) { AnimeClient . hide ( "#loading-shadow" ) ;
AnimeClient . showMessage ( "error" , "Failed to update " + title + ". " ) ; AnimeClient . scrollToTop ( ) ; return } if ( resData . data . libraryEntry . update . libraryEntry . status === "COMPLETED" ) AnimeClient . hide ( parentSel ) ; AnimeClient . hide ( "#loading-shadow" ) ; AnimeClient . showMessage ( "success" , "Successfully updated " + title ) ; AnimeClient . $ ( ".completed_number" , parentSel ) [ 0 ] . textContent = ++ watchedCount ; AnimeClient . scrollToTop ( ) } , error : function ( ) { AnimeClient . hide ( "#loading-shadow" ) ; AnimeClient . showMessage ( "error" , "Failed to update " +
title + ". " ) ; AnimeClient . scrollToTop ( ) } } ) } ) ; var search$1 = function ( query ) { AnimeClient . show ( ".cssload-loader" ) ; return AnimeClient . get ( AnimeClient . url ( "/manga/search" ) , { query : query } , function ( searchResults , status ) { searchResults = JSON . parse ( searchResults ) ; AnimeClient . hide ( ".cssload-loader" ) ; AnimeClient . $ ( "#series-list" ) [ 0 ] . innerHTML = renderMangaSearchResults ( searchResults ) } ) } ; if ( AnimeClient . hasElement ( ".manga #search" ) ) { var prevRequest$1 = null ; AnimeClient . on ( "#search" , "input" , AnimeClient . throttle ( 250 , function ( e ) { var query =
encodeURIComponent ( e . target . value ) ; if ( query === "" ) return ; if ( prevRequest$1 !== null ) prevRequest$1 . abort ( ) ; prevRequest$1 = search$1 ( query ) } ) ) } AnimeClient . on ( ".manga.list" , "click" , ".edit-buttons button" , function ( e ) { var thisSel = e . target ; var parentSel = AnimeClient . closestParent ( e . target , "article" ) ; var type = thisSel . classList . contains ( "plus-one-chapter" ) ? "chapter" : "volume" ; var completed = parseInt ( AnimeClient . $ ( "." + type + "s_read" , parentSel ) [ 0 ] . textContent , 10 ) || 0 ; var total = parseInt ( AnimeClient . $ ( "." + type + "_count" ,
parentSel ) [ 0 ] . textContent , 10 ) ; var mangaName = AnimeClient . $ ( ".name" , parentSel ) [ 0 ] . textContent ; if ( isNaN ( completed ) ) completed = 0 ; var data = { id : parentSel . dataset . kitsuId , mal _id : parentSel . dataset . malId , data : { progress : completed } } ; if ( isNaN ( completed ) || completed === 0 ) data . data . status = "CURRENT" ; if ( ! isNaN ( completed ) && completed + 1 === total ) data . data . status = "COMPLETED" ; data . data . progress = ++ completed ; AnimeClient . show ( "#loading-shadow" ) ; AnimeClient . ajax ( AnimeClient . url ( "/manga/increment" ) , { data : data , dataType : "json" ,
type : "POST" , mimeType : "application/json" , success : function ( ) { if ( String ( data . data . status ) . toUpperCase ( ) === "COMPLETED" ) AnimeClient . hide ( parentSel ) ; AnimeClient . hide ( "#loading-shadow" ) ; AnimeClient . $ ( "." + type + "s_read" , parentSel ) [ 0 ] . textContent = completed ; AnimeClient . showMessage ( "success" , "Successfully updated " + mangaName ) ; AnimeClient . scrollToTop ( ) } , error : function ( ) { AnimeClient . hide ( "#loading-shadow" ) ; AnimeClient . showMessage ( "error" , "Failed to update " + mangaName ) ; AnimeClient . scrollToTop ( ) } } ) } ) } ) ( )
2018-08-20 12:58:56 -04:00
//# sourceMappingURL=scripts.min.js.map