���� JFIF �� � ( %"1"%)+...383,7(-.-
![]() Server : Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.20 System : Linux st2.domain.com 3.10.0-1127.10.1.el7.x86_64 #1 SMP Wed Jun 3 14:28:03 UTC 2020 x86_64 User : apache ( 48) PHP Version : 7.4.20 Disable Function : NONE Directory : /var/www/html/lnovel/layout/novel/js/ |
var elem = document.createElement('canvas'); isSuportWebp = elem.toDataURL('image/webp').indexOf('data:image/webp') == 0; var Template = function(){ var chapterKeywords = { vi: { chapter: 'chuong', book: 'quyen' }, en: { chapter: 'chapter', book: 'book' } }; var variable_callbacks = { story_id: function(item){return item.storyID}, title: function(item){return item.title}, story_link: function(item){return Utils.storyLink(item);}, story_title: function(item){return item.title;}, author: function(item){return item.authorName;}, author_link: function(item){return location.origin+'/author/'+item.authorID+'/';}, following: function(item){return item.following;}, chap_no: function(item){if(!item.lastChapter) return ''; var chap = JSON.parse(item.lastChapter); return Utils.chapterNo(chap);}, chap_name: function(item){ if(!item.lastChapter) return ''; var chap = JSON.parse(item.lastChapter); return chap.name; }, last_chapter: function(item){if(!item.lastChapter) return ''; var chap = JSON.parse(item.lastChapter); return Utils.chapter_fullname(chap);}, last_chapter_link: function(item){if(!item.lastChapter) return '';var chap = JSON.parse(item.lastChapter); return Utils.chapterLink(item,chap);}, last_chapter_updated: function(item){ if(!item.lastChapter) return ''; var chap = JSON.parse(item.lastChapter); return Utils.formatDate(Utils.date2time(chap.lastUpdated),'H:i d/m/Y'); }, thumbnail: function(item,size){var size=size.split('x');return '<img src="'+cdnUrl+'/covers/'+Math.floor(item.storyID/1000).toString()+'/'+item.storyID+'-'+item.alias+'-'+size.join('x')+'.'+(isSuportWebp?'webp':'jpg')+'" width="'+size[0]+'" height="'+size[1]+'" alt="'+item.alias+'"/>';}, field_value: function(item,elm){var val = item[elm.getAttribute('data-field')]; return Utils.number_format(val);}, genre: function(item){return genres[item.genres.split(',')[0]].name}, genre_link: function(item){return location.origin+'/'+genres[item.genres.split(',')[0]].slug+'/';}, nut: function(item){return item.avg_point;}, passed: function(item){ var tmp = item.modified_time.split(' '); var d = tmp[0].split('-'); var t = tmp[1].split(':'); var modified = Math.round((new Date(d[0],d[1]-1,d[2],t[0],t[1],t[2])).getTime()/1000); var now = Math.round((new Date()).getTime()/1000); var diff = now - modified; if(diff<60) return diff+' giây trước'; if(diff<3600) return Math.round(diff/60)+' phút trước'; if(diff<24*3600) return Math.round(diff/3600)+' giờ trước'; if(diff<24*3600*7) return Math.round(diff/(24*3600))+' ngày trước'; return 'Hơn '+Math.round(diff/(7*24*3600)) +' tuần trước'; }, mini_desc: function(item){if(item.mini_desc) return item.mini_desc; var des = item.description.replace(/(<([^>]+)>)/gi, "").trim(); var ws = des.split(' '); return ws.splice(0,15).join(' ');}, small_desc: function(item){if(item.mini_desc) return item.mini_desc; var des = item.description.replace(/(<([^>]+)>)/gi, "").trim(); var ws = des.split(' '); return ws.splice(0,60).join(' ');}, total_chap: function(item){return item.chapters+' '+langs.chapters;}, state: function(item){return langs.state[parseInt(item.state)];}, labels: function(item){ var gs = item.genres.split(','); var labels = []; for(var i=0;i<gs.length;i++) labels.push(genres[gs[i]].name); labels.push(langs.state[item.state]); return labels.join(' | '); }, genres: function(item){ var gs = item.genres.split(','); var labels = []; for(var i=0;i<gs.length;i++) labels.push(genres[gs[i]].name); return labels.join(' | '); } }; var templates = { simple: { node: 'li', attributes: {}, html: '<a href="{genre_link}" class="genre">{genre}</a><h4><a href="{story_link}">{story_title}</a></h4><a href="{author_link}" class="author">{author}</a>' }, follow:{ node: 'div', attributes: { class: 'follow-story' }, html: '<h4><a href="{story_link}">{title}</a></h4><span><strong>{following}</strong> '+langs.following+'</span><p>{mini_desc}</p>' }, update: { node: 'li', attributes: {}, html: '<a href="{genre_link}" class="cate">{genre}</a><h4><a href="{story_link}">{title}</a></h4><a href="{last_chapter_link}" class="chapter">{chap_no}</a><a href="{author_link}" class="author">{author}</a><span>{passed}</span>' }, order: { node: 'li', attributes: {}, html: '<span>{index}</span><h4><a href="{story_link}" title="{title}">{title}</a></h4>' }, sponsor: { node: 'div', attributes: { class: 'story-item-1' }, html: '<div class="book-cover"><a href="{story_link}">{thumbnail_140x187}</a></div><h4><a href="{story_link}">{title}</a></h4><a href="{author_link}" class="author">{author}</a><p>{mini_desc}</p>' }, free: { node: 'div', attributes: { class: 'story-item-2' }, html: '<a href="{story_link}">{thumbnail_140x187}</a><h4><a href="{story_title}">{title}</a></h4><p>{point} '+langs.point+langs.per_chap+'</p><a href="{story_link}" class="read-now">'+langs.read_free+'</a>' }, small_list: { node: 'li', attributes: { class: 'item' }, html: '<a href="{story_link}" class="cover">{thumbnail_140x187}</a><h4 class="story-title"><a href="{story_link}">{title}</a></h4><p class="author">{author}</p>' }, grid: { node: 'div', attributes: { class: 'grid-story-item' }, html: '<a href="{story_link}" class="cover">{thumbnail_140x187}</a>'+ '<h3 class="story-title"><a href="{story_link}">{title}</a></h3><p class="metas">'+ '<a href="{author_link}" class="author"><i class="fas fa-user-tie"></i> {author}</a><a href="{genre_link}" class="genre">{genre}</a><span>{state}</span></p>'+ '<p class="mini-desc">{mini_desc}</p><p class="chaps">{total_chap}</p>' }, large_story_item:{ node: 'div', attributes: { class: 'large-story-item' }, html: '<a href="{story_link}" class="cover">{thumbnail_140x187}</a><div class="info">' + '<h3 class="story-title"><a href="{story_link}">{title}</a></h3>' + '<p class="metas"><a href="{genre_link}" class="genre">{genre}</a><span>{state}</span></p>' + '<p class="mini-desc">{small_desc}</p>' + '<p class="last-chapter"><a href="{last_chapter_link}">{last_chapter}</a> <time>{last_chapter_updated}</time></p>' + '<a href="{story_link}" class="button button-primary">'+langs.detail+'</a>' + '<a href="#" class="button button-blue add_to_bookshelf" data-id="{story_id}">'+langs.actions.add_to_bookshelf+'</a></div>' }, small_story_item: { node: 'div', attributes: { class: 'small-story_item' }, html: '<a href="{story_link}" class="cover">{thumbnail_220x283}</a>' + '<h3 class="story-title"><a href="{story_link}">{title}</a></h3>' + '' }, story_list_thumb: { node: 'li', attributes: { class: 'story_list_thumb' }, html: '<a href="{story_link}" class="cover">{thumbnail_140x187}</a>' + '<div class="info"><h3 class="story-title"><a href="{story_link}">{title}</a></h3>' + '<span class="author">{author}</span>' + '<p class="genres">{genres}</p></div>' } }; var rankedTemplate = function(elm,length){ var field = elm.getAttribute('data-field'); var html = '<li><div class="info">'+ '<h4><a href="{story_link}">{title}</a></h4><span><strong>{field_value}</strong> '+langs[field]+'</span>'+ '</div>'+ '<div class="book-cover"><a href="{story_link}">{thumbnail_140x187}</a></div></li>'; for(var i=1;i<length;i++){ html += '<li><h4><a href="{story_link}">{title}</a></h4><span>{field_value}</span></li>'; } elm.innerHTML = html; return [elm]; }; var visualDatas = []; return { init: function(){ var visualBlocks = $('.visual-data'); if(visualBlocks.length<=0) return; var queryData = {}; for(var i=0;i<visualBlocks.length;i++){ if(!visualBlocks[i].hasAttribute('data-data')) continue; if(typeof queryData[visualBlocks[i].getAttribute('data-data')] == 'undefined'){ var d = visualBlocks[i].getAttribute('data-data'); queryData[d] = { limit: visualBlocks[i].getAttribute('data-rows') }; if(visualBlocks[i].hasAttribute('data-offset')) queryData[d].offset = parseInt(visualBlocks[i].getAttribute('data-offset')); if(visualBlocks[i].hasAttribute('data-genre')) queryData[d].genre = parseInt(visualBlocks[i].getAttribute('data-genre')); if(visualBlocks[i].hasAttribute('data-tag')) queryData[d].tag = parseInt(visualBlocks[i].getAttribute('data-tag')); if(visualBlocks[i].hasAttribute('data-author')) queryData[d].author = parseInt(visualBlocks[i].getAttribute('data-author')); if(visualBlocks[i].hasAttribute('data-user')) queryData[d].user = parseInt(visualBlocks[i].getAttribute('data-user')); } visualDatas.push({elms:Template.generate(visualBlocks[i],visualBlocks[i].getAttribute('data-template'),parseInt(visualBlocks[i].getAttribute('data-rows'))),data:visualBlocks[i].getAttribute('data-data')}); } API.get('/stories/',null,{lists:JSON.stringify(queryData)},function(data){ for(var i=0;i<visualDatas.length;i++){ if(!visualDatas[i].elms) continue; for(var j=0;j<visualDatas[i].elms.length;j++){ Template.apply(visualDatas[i].elms[j],data.stories[visualDatas[i].data]); } } }); }, generate: function(elm,template,length){ if(typeof templates[template] == 'undefined') return Template[template](elm,length); var ch; for(var i=0;i<length;i++){ ch = document.createElement(templates[template].node); for(var k in templates[template].attributes){ if(templates[template].attributes.hasOwnProperty(k)){ ch.setAttribute(k,templates[template].attributes[k].replace(/\{index\}/g,i+1)); } } if(templates[template].class) ch.className = templates[template].class; ch.innerHTML = templates[template].html.replace(/\{index\}/g,i+1); elm.appendChild(ch); } return [elm]; }, ranked: function(elm,length){ return rankedTemplate(elm,length); }, slide: function(elm,length){ var inputs = '',imgs = '',bullets='',descs = ''; for(var i=1;i<=length;i++){ if(i==3) inputs += '<input type="radio" name="slider" id="slide-'+i+'" class="slider__radio" checked>'; else inputs += '<input type="radio" name="slider" id="slide-'+i+'" class="slider__radio">'; imgs += '<label class="slider__item slider__item--'+i+' card" for="slide-'+i+'"><a href="{story_link}">{thumbnail_140x187}</a></label>'; descs += '<li><h4>{title}</h4><p>{mini_desc}</p><a href="{story_link}" class="btn">'+langs.detail+'</a></li>'; bullets += '<label for="slide-'+i+'" class="bullets__item bullets__item--'+i+'"></label>' } elm.innerHTML = inputs+'<div class="thumbs"><div class="slider"><div class="slider__holder">'+imgs+'</div><div class="bullets">'+bullets+'</div></div></div>'+'<ul class="descriptions">'+descs+'</ul>'; return [elm.querySelector('.slider__holder'),elm.querySelector('.descriptions')]; }, apply: function(elm,items){ if(!items){ elm.parentNode.removeChild(elm); return; } var children = elm.children; elm.className = elm.className.replace('visual-data','').trim(); var vars,j,content,f; for(var i=0;i<children.length;i++){ if(typeof(items[i]) == 'undefined') continue; content = children[i].innerHTML; vars = content.match(/\{([a-z0-9_]+)\}/g); for(j=0;j<vars.length;j++){ f = vars[j].replace('{','').replace('}',''); if(typeof variable_callbacks[f] == 'undefined'){ if(f.indexOf('thumbnail')!=-1){ content = content.replace(new RegExp(vars[j],'g'),variable_callbacks.thumbnail(items[i],f.replace('thumbnail_',''))); continue; } }else{ content = content.replace(new RegExp(vars[j],'g'),variable_callbacks[f](items[i],elm)); } } children[i].innerHTML = content; } }, fill: function(elm,template,items){ elm.innerHTML = ''; var ch,html,vars,j,f; for(var i=0;i<items.length;i++){ ch = document.createElement(templates[template].node); for(var k in templates[template].attributes){ if(templates[template].attributes.hasOwnProperty(k)){ ch.setAttribute(k,templates[template].attributes[k].replace(/\{index\}/g,i+1)); } } if(templates[template].class) ch.className = templates[template].class; html = templates[template].html.replace(/\{index\}/g,i+1); vars = html.match(/\{([a-z0-9_]+)\}/g); for(j=0;j<vars.length;j++){ f = vars[j].replace('{','').replace('}',''); if(typeof variable_callbacks[f] == 'undefined'){ if(f.indexOf('thumbnail')!=-1){ html = html.replace(new RegExp(vars[j],'g'),variable_callbacks.thumbnail(items[i],f.replace('thumbnail_',''))); continue; } }else{ html = html.replace(new RegExp(vars[j],'g'),variable_callbacks[f](items[i],elm)); } } ch.innerHTML = html; elm.appendChild(ch); } }, pagination: function(total,numperpage,paged,url_format,first_url,num){ numperpage = typeof numperpage !== "undefined"? numperpage:25; paged = typeof paged !== "undefined" ? parseInt(paged): 1; num = typeof num!=='undefined'?num:3; if(total<=numperpage) return ''; var numofpage = Math.ceil(total/numperpage); var str = '<li class="active"><a href="#" rel="nofollow">'+paged+'</a></li>'; for(var i=1;i<=num;i++){ if(paged-i>0){ if(paged-i==1) str = '<li><a href="'+first_url+'">1</a></li>'+str; else str = '<li><a href="'+url_format.replace('%d',paged-1)+'">'+(paged-i)+'</a></li>'+str; } if(paged+i<=numofpage){ str += '<li><a href="'+url_format.replace('%d',paged+i)+'">'+(paged+i)+'</a></li>'; } } if(paged-num-1>0){ str = '<li><a href="'+first_url+'">1</a></li><li class="dot"><span>...</span></li>'+str; } if(paged+num<numofpage){ str += '<li class="dot"><span>...</span></li><li><a href="'+url_format.replace('%d',numofpage)+'">'+numofpage+'</a></li>'; } if(paged>1){ if(paged-1==1) str = '<li><a href="'+first_url+'" title="Trang trước"><i class="fas fa-angle-left"></i></a></li>'+str; else str = '<li><a href="'+url_format.replace('%d',paged-1)+'" title="Trang trước"><i class="fas fa-angle-left"></i></a></li>'+str; } if(paged<numofpage){ str += '<li><a href="'+url_format.replace('%d',paged+1)+'" title="Trang sau"><i class="fas fa-angle-right"></i></a></li>'; } return str; } }; }(); document.addEventListener('DOMContentLoaded', function() { Template.init(); });