2018-11-02 10:48:20 -04:00
( function ( ) { var matches = function ( elm , selector ) { var matches = ( elm . document || elm . ownerDocument ) . querySelectorAll ( selector ) , i = matches . length ; while ( -- i >= 0 && matches . 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-12 23:12:05 -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 ) { sel . setAttribute ( "hidden" , "hidden" ) } , show : function ( sel ) { 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 ) ; switch ( method ) { case "GET" : request . send ( null ) ; break ; default : request . send ( config . data ) ; break } } ; 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" , function ( e ) { AnimeClient . hide ( e . target ) } ) ; AnimeClient . on ( "form.js-delete" , "submit" , function ( event ) { var proceed = confirm ( "Are you ABSOLUTELY SURE you want to delete this item?" ) ; if ( proceed === false ) { event . preventDefault ( ) ; event . stopPropagation ( ) } } ) ; AnimeClient . on ( ".js-clear-cache" , "click" , function ( ) { AnimeClient . get ( "/cache_purge" , function ( ) { AnimeClient . showMessage ( "success" , "Successfully purged api cache" ) } ) } ) ; AnimeClient . on ( ".vertical-tabs input" , "change" , function ( event ) { var el =
event . currentTarget . parentElement ; var rect = el . getBoundingClientRect ( ) ; var top = rect . top + window . pageYOffset ; window . scrollTo ( { top : top , behavior : "smooth" } ) } ) ; AnimeClient . on ( ".media-filter" , "input" , function ( 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 = 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 . $ ( "article.media" ) . forEach ( function ( article ) { return AnimeClient . show ( article ) } ) ; AnimeClient . $ ( "table.media-wrap tbody tr" ) . forEach ( function ( tr ) { return AnimeClient . show ( 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 ) } ) ; AnimeClient . on ( "main" , "change" , ".big-check" , function ( e ) { var id = e . target . id ; document . getElementById ( "mal_" + id ) . checked = true } ) ; function renderAnimeSearchResults ( data ) { var results = [ ] ; data . forEach ( function ( x ) { var item = x . attributes ; var titles = item . titles . reduce ( function ( prev ,
current ) { return prev + ( current + "<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="' + x . mal _id + '" />\n\t\t\t\t\t<input type="radio" class="big-check" id="' + item . slug + '" name="id" value="' + x . 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/' + x . id + '.webp" type="image/webp" />\n\t\t\t\t\t\t\t<source srcset="/public/images/anime/' +
2019-07-10 13:32:05 -04:00
x . id + '.jpg" type="image/jpeg" />\n\t\t\t\t\t\t\t<img src="/public/images/anime/' + x . id + '.jpg" alt="" width="220" />\n\t\t\t\t\t\t</picture>\n\t\t\t\t\t\t\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 ( x ) { var item = x . attributes ; var titles = item . titles . reduce ( function ( prev , current ) { return prev + ( current + "<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="' + x . mal _id + '" />\n\t\t\t\t\t<input type="radio" class="big-check" id="' + item . slug + '" name="id" value="' + x . 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/' + x . id + '.webp" type="image/webp" />\n\t\t\t\t\t\t\t<source srcset="/public/images/manga/' + x . id + '.jpg" type="image/jpeg" />\n\t\t\t\t\t\t\t<img src="/public/images/manga/' + x . 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 . $ ( ".cssload-loader" ) [ 0 ] . removeAttribute ( "hidden" ) ; AnimeClient . get ( AnimeClient . url ( "/anime-collection/search" ) , { query : query } , function ( searchResults , status ) { searchResults = JSON . parse ( searchResults ) ; AnimeClient . $ ( ".cssload-loader" ) [ 0 ] . setAttribute ( "hidden" , "hidden" ) ; AnimeClient . $ ( "#series-list" ) [ 0 ] . innerHTML = renderAnimeSearchResults ( searchResults . data ) } ) } ;
if ( AnimeClient . hasElement ( ".anime #search" ) ) AnimeClient . on ( "#search" , "input" , AnimeClient . throttle ( 250 , function ( e ) { var query = encodeURIComponent ( e . target . value ) ; if ( query === "" ) return ; 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 ( AnimeClient . $ ( "#loading-shadow" ) [ 0 ] ) ; 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 ( AnimeClient . $ ( "#loading-shadow" ) [ 0 ] ) ;
AnimeClient . showMessage ( "error" , "Failed to update " + title + ". " ) ; AnimeClient . scrollToTop ( ) ; return } if ( resData . data . attributes . status === "completed" ) AnimeClient . hide ( parentSel ) ; AnimeClient . hide ( AnimeClient . $ ( "#loading-shadow" ) [ 0 ] ) ; AnimeClient . showMessage ( "success" , "Successfully updated " + title ) ; AnimeClient . $ ( ".completed_number" , parentSel ) [ 0 ] . textContent = ++ watchedCount ; AnimeClient . scrollToTop ( ) } , error : function ( ) { AnimeClient . hide ( AnimeClient . $ ( "#loading-shadow" ) [ 0 ] ) ; AnimeClient . showMessage ( "error" , "Failed to update " +
title + ". " ) ; AnimeClient . scrollToTop ( ) } } ) } ) ; var search$1 = function ( query ) { AnimeClient . $ ( ".cssload-loader" ) [ 0 ] . removeAttribute ( "hidden" ) ; AnimeClient . get ( AnimeClient . url ( "/manga/search" ) , { query : query } , function ( searchResults , status ) { searchResults = JSON . parse ( searchResults ) ; AnimeClient . $ ( ".cssload-loader" ) [ 0 ] . setAttribute ( "hidden" , "hidden" ) ; AnimeClient . $ ( "#series-list" ) [ 0 ] . innerHTML = renderMangaSearchResults ( searchResults . data ) } ) } ; if ( AnimeClient . hasElement ( ".manga #search" ) ) AnimeClient . on ( "#search" , "input" ,
AnimeClient . throttle ( 250 , function ( e ) { var query = encodeURIComponent ( e . target . value ) ; if ( query === "" ) return ; 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 ( AnimeClient . $ ( "#loading-shadow" ) [ 0 ] ) ; AnimeClient . ajax ( AnimeClient . url ( "/manga/increment" ) , { data : data , dataType : "json" , type : "POST" ,
mimeType : "application/json" , success : function ( ) { if ( data . data . status === "completed" ) AnimeClient . hide ( parentSel ) ; AnimeClient . hide ( AnimeClient . $ ( "#loading-shadow" ) [ 0 ] ) ; AnimeClient . $ ( "." + type + "s_read" , parentSel ) [ 0 ] . textContent = completed ; AnimeClient . showMessage ( "success" , "Successfully updated " + mangaName ) ; AnimeClient . scrollToTop ( ) } , error : function ( ) { AnimeClient . hide ( AnimeClient . $ ( "#loading-shadow" ) [ 0 ] ) ; AnimeClient . showMessage ( "error" , "Failed to update " + mangaName ) ; AnimeClient . scrollToTop ( ) } } ) } ) } ) ( ) ;
2018-08-20 12:58:56 -04:00
//# sourceMappingURL=scripts-authed.min.js.map