����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-main.js
cdnUrl = 'https://cdn.enovel.mobi';
class ElementCollection extends Array {
    ready(cb) {
        const isReady = this.some(e => {
            return e.readyState != null && e.readyState != "loading"
        })
        if (isReady) {
            cb()
        } else {
            this.on("DOMContentLoaded", cb)
        }
        return this
    }

    each(cb){
        this.forEach(cb);
    }

    get(idx){
        if(typeof idx == "undefined") return this;
        return this[idx];
    }

    find(param){
        var elms = new ElementCollection(),es,j;
        for(var i=0;i<this.length;i++){
            es = this[i].querySelectorAll(param);
            for(var j=0;j<es.length;j++){
                elms.push(es[j]);
            }
        }
        return elms;
    }

    on(event, cbOrSelector, cb) {
        if (typeof cbOrSelector === "function") {
            this.forEach(e => e.addEventListener(event, cbOrSelector))
        } else {
            this.forEach(elem => {
                elem.addEventListener(event, e => {
                    if (e.target.matches(cbOrSelector)){
                        cb(e);
                    }
                })
            })
        }
        return this;
    }

    html(content){
        if(typeof content == "undefined") return this[0].innerHTML;
        this.forEach(elem => {elem.innerHTML = content});
        return this;
    }
    text(content){
        if(typeof content == "undefined") return this[0].innerText;
        this.forEach(elem => {elem.innerText = content});
        return this;
    }

    append(content){
        this.forEach(elem => {elem.innerHTML += content});
        return this;
    }

    insertBefore(content){
        var div = document.createElement('div');
        div.innerHTML = content;
        this.forEach(function(el){
            el.parentNode.insertBefore(div.firstChild,el);
        });
    }

    next() {
        return this.map(e => e.nextElementSibling).filter(e => e != null)
    }

    prev() {
        return this.map(e => e.previousElementSibling).filter(e => e != null)
    }

    removeClass(className) {
        this.forEach(e => e.classList.remove(className))
        return this
    }

    addClass(className) {
        this.forEach(e => e.classList.add(className))
        return this
    }

    hasClass(className){
        for(var i=0;i<this.length;i++){
            if(!this[i].classList.contains(className)) return false;
        }
        return true;
    }

    attr(attribute,value){
        if(typeof value ==  "undefined") return this[0].getAttribute(attribute);
        this.forEach(e => e.setAttribute(attribute,value));
        return this;
    }

    removeAttr(attribute){
        this.forEach(e => e.removeAttribute(attribute));
    }

    data(attribute,value){
        return this.attr('data-'+attribute,value);
    }

    val(value){
        if(typeof value== "undefined") return this[0].value;
        this.forEach(e => e.value=value);
        return this;
    }

    remove(){
        this.forEach(e => e.parentNode.removeChild(e));
        return this;
    }

    css(property, value) {
        const camelProp = property.replace(/(-[a-z])/, g => {
            return g.replace("-", "").toUpperCase()
        })
        this.forEach(e => (e.style[camelProp] = value))
        return this
    }

    height(){
        return this[0].offsetHeight;
    }

    width(){
        return this[0].offsetWidth;
    }

    click(){
        this.forEach(e => e.click());
    }
    prop(prop){
        return this[0][prop];
    }
    parents(selector){
        var elms = new ElementCollection(),es,j;
        if (!Element.prototype.matches) {
            Element.prototype.matches =
                Element.prototype.matchesSelector ||
                Element.prototype.mozMatchesSelector ||
                Element.prototype.msMatchesSelector ||
                Element.prototype.oMatchesSelector ||
                Element.prototype.webkitMatchesSelector ||
                function(s) {
                    var matches = (this.document || this.ownerDocument).querySelectorAll(s),
                        i = matches.length;
                    while (--i >= 0 && matches.item(i) !== this) {}
                    return i > -1;
                };
        }

        // Set up a parent array
        var elem;
        for(var i=0;i<this.length;i++){
            elem = this[i];
            for ( ; elem && elem !== document; elem = elem.parentNode ) {
                if (selector) {
                    if (elem.matches(selector)) {
                        elms.push(elem);
                    }
                    continue;
                }
                elms.push(elem);
            }
        }
        return elms;
    }
}
function $(param) {
    if (typeof param === "string" || param instanceof String) {
        return new ElementCollection(...document.querySelectorAll(param))
    }else {
        return new ElementCollection(param)
    }
}
callbackLogin = null;
userData = false;
jwtKey = 'Authorization';
var Main = function(){
    var loadDeferreds = function(){
        var addStylesNode = document.getElementById("deferred-styles");
        var replacement = document.createElement("div"); replacement.innerHTML = addStylesNode.textContent;
        document.body.appendChild(replacement);
        addStylesNode.parentElement.removeChild(addStylesNode);
    };
    var genreToggle = function () {
        if($('#main-nav .toggle-genres').length==0) return;
        $('#main-nav .toggle-genres').on('click',function(e){
            e.preventDefault();
            var genreList = this.nextSibling;
            if(genreList.style.display!='flex') genreList.style.display = 'flex';
            else genreList.style.display = 'none';
        });
    };
    var headerUserPanel = function(){
        if(document.getElementById('user-panel')==null) return;
        if(!userData){
            document.getElementById('user-panel').innerHTML = '<a href="#" rel="nofollow" class="toggleLogin">'+langs.login_form.login+'</a> | <a href="'+location.origin+'/users/register/" class="toggleRegister" rel="nofollow">'+langs.login_form.register+'</a>';
            return;
        }
        var html = '<a href="#" class="togglePanel" rel="nofollow"><img src="'+Utils.userAvatar(userData)+'" width="50" height="50"/><label>'+userData.display_name+'</label></a>';
        html += '<nav class="user-nav"><ul>';
        if(userData.groupID!=3) html += '<li><a href="'+authorUrl+'">'+langs.usernav.author_zone+'</a></li>';
        html += '<li><a href="'+location.origin+'/users/information" rel="nofollow">'+langs.usernav.userinfo+'</a></li>' +
            '<li><a href="'+location.origin+'/users/history" rel="nofollow">'+langs.usernav.history_read+'</a></li>' +
            '<li><a href="'+location.origin+'/users/nutlog" rel="nofollow">'+langs.usernav.nutlog+'</a></li>' +
            '<li><a href="'+location.origin+'/users/bookshelf" rel="nofollow">'+langs.usernav.bookshelf+'</a></li>' +
            '<li><a href="'+location.origin+'/users/notification" rel="nofollow">'+langs.usernav.notification+'</a></li>' +
            '<li><a href="'+location.origin+'/users/topup" rel="nofollow">'+langs.usernav.topup+'</a></li>' +
            '<li><a href="'+location.origin+'/users/premium" rel="nofollow">Enovel Premium</a></li>' +
            '<li><a href="#" rel="nofollow" id="sign-out">'+langs.usernav.signout+'</a></li>';
        html += '</ul></nav>';
        $('#user-panel').html(html);
        $('#sign-out').on('click',function(e){
            e.preventDefault();
            setCookie('Authorization','',-1);
            document.getElementById('user-panel').innerHTML = '<a href="#" rel="nofollow" class="toggleLogin">'+langs.login_form.login+'</a> | <a href="'+location.origin+'/users/register/" class="toggleRegister" rel="nofollow">'+langs.login_form.register+'</a>';
            var script2 = document.createElement('script');
            script2.setAttribute('src','https://apis.google.com/js/platform.js?onload=signOut');
            document.head.appendChild(script2);
            events();
            if(location.href.match(/\/users\//)) location.href = location.origin;
        });
        $('#user-panel .togglePanel').on('click',function(e){
            e.preventDefault();
            if($('#user-panel').hasClass('open')){
                $('#user-panel').removeClass('open');
            }else{
                $('#user-panel').addClass('open');
            }
        });
        setTimeout(function(){
            API.get('/notification',{Prefer:'count_unread'},null,function(data){
                var unread = parseInt(data.unread);
                if(unread==0) return;
                if(unread>99) unread = '99+';
                $('#user-panel .togglePanel,#noti-nav a').append('<span>'+unread+'</span>');
            },function (request){
                if(request.status==401) setCookie('Authorization','',-1);
            });
        },2000);
        if(userData && !getCookie('attendance')){
            setTimeout(function(){
                API.get('/users/profile',{Prefer:'attendance'},null,function(){
                    setCookie('attendance',1,24);
                },function(request){
                    if(request.status==401) setCookie('Authorization','',-1);
                });
            },5000);
        }
    }
    var events = function(){
        $(document).on('click','.toggleLogin',function(e){
            e.preventDefault();
            Main.triggerLogin(callbackLogin);
        });
    };
    var searchFormHandler = function(){
        var frm = document.getElementById('search-form');
        if(!frm) return;
        frm.addEventListener('submit',function(e){
            e.preventDefault();
            var action = frm.getAttribute('action');
            var key = str2url(document.getElementById('mainSearchInput').value);
            frm.setAttribute('action', action+key);
            frm.submit();
        });
        var bounceTimer = null;
        $('#mainSearchInput').on('input',function(){
            clearTimeout(bounceTimer);
            if($(this).val().trim().length<3){
                $('#search-results').removeClass('open');
                return;
            }
            bounceTimer = setTimeout(function(){
                API.get('/index/search',{},{keyword:$('#mainSearchInput').val()},function(data){
                    $('#search-results').html('').addClass('open');
                    if(data.stories.length==0 && data.authors.length==0){
                        $('#search-results').addClass('empty').html(langs.messages.no_results);
                    }
                    $('#search-results').removeClass('empty');
                    var html = '',i;
                    if(data.authors.length){
                        for(i=0;i<data.authors.length;i++){
                            html += '<a href="'+Utils.authorLink(data.authors[i].authorID)+'" class="search-author-item"><i class="fas fa-user-tie"></i><span>'+langs.author+'</span><h5>'+data.authors[i].name+'</h5></a>';
                        }
                    }
                    for(i=0;i<data.stories.length;i++){
                        html += '<a class="search-result-item" href="'+Utils.storyLink(data.stories[i])+'"><h5>' +
                            data.stories[i].title+'</h5><small>'+langs.written_by.replace('%s',data.stories[i].authorName)+'</small><p>';
                        if(data.stories[i].voted>0) html += '<span class="voted">'+data.stories[i].voted+' '+langs.voted+'</span>';
                        html += '<span>'+data.stories[i].chapters+' '+langs.chapters+'</span>' +
                            '<span class="badge state'+data.stories[i].state+'">'+langs.state[data.stories[i].state]+'</span></p>'+'</a>';
                    }
                    $('#search-results').html(html);
                    if(data.total>data.stories.length){
                        $('#search-results').append('<button type="submit">'+langs.actions.view_other_result.replace('%d',(data.total-data.stories.length))+'</button>');
                    }
                });
            },1000);
        });
    };
    var initUserHeader = function(){
        userData = Utils.parseUser();
        headerUserPanel();
    };
    var getParameterByName = function(name, url = window.location.href) {
        name = name.replace(/[\[\]]/g, '\\$&');
        var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
            results = regex.exec(url);
        if (!results) return null;
        if (!results[2]) return '';
        return decodeURIComponent(results[2].replace(/\+/g, ' '));
    }
    var trackingUTM = function(){
        var source = getParameterByName('utm_source');
        var medium = getParameterByName('utm_medium');
        var campaign = getParameterByName('utm_campaign');
        if(!source || !medium || !campaign) return;
        setCookie('enovel_utm',JSON.stringify({
            source: source,medium:medium,campaign:campaign
        }),30*24);
        setCookie('enovel_utm_from',(new Date()).getTime(),30*24);
    };
    var getAffVar = function(key){
        if(storageAvailable('localStorage')){
            localStorage.setItem('affID',affID);
            localStorage.setItem('aff_exp',(new Date).getTime()+30*24*3600*1000);
        }else{
            setCookie('affID',affID,30*24);
            setCookie('aff_exp',(new Date).getTime()+30*24*3600*1000,30*24);
        }
    };
    var locStorage = function(){
        let storageEngine,storage;
        try {
            storage = window.localStorage;
            const x = '__storage_test__';
            storage.setItem(x, x);
            storage.removeItem(x);
            storageEngine = 'localStorage';
        }
        catch(e) {
            storageEngine = 'cookie';
        }
        var callbacks = {
            set_localStorage: function(key,value,exp){
                localStorage.setItem(key,value);
                localStorage.setItem(key+'_exp',(new Date()).getTime() + exp*3600000);
            },
            get_localStorage: function(key){
                var value = localStorage.getItem(key);
                if(!value) return '';
                var exp = localStorage.getItem(key+'_exp');
                if(!exp || (new Date()).getTime()>parseInt(exp)) return null;
                return value;
            },
            set_cookie: function(key,value,exp){setCookie(key,value,exp);},
            get_cookie: function(key){return getCookie(key)}
        };
        return {
            set: function(key,value,exp){
                callbacks['set_'+storageEngine](key,value,exp);
            },
            get: function(key){
                return callbacks['get_'+storageEngine](key);
            }
        }
    }();
    var affiliateTracking = function(){
        var aff = getParameterByName('aff');
        if(aff == null || aff=='') return;
        aff = aff.split('.');
        if(aff.length!==2) return;
        locStorage.set(aff[0],aff[1],30*24);
    };
    var reportModal = function(){
        $(document).on('click','.report-story',function(e){
            e.preventDefault();
            Main.modal(function(){
                var reportForm = '<form id="report-form">' +
                    '<div class="form-group"><label>Link tác phẩm vi phạm</label><input type="text" class="form-control" required name="violate_link" id="violate_link" placeholder="Ex: https://enovel.mobi/tac-pham-vi-pham.1/"></div>' +
                    '<div class="form-group"><label>Link tác phẩm gốc</label><input type="text" class="form-control" required name="original_link" id="original_link" placeholder="Ex: https://enovel.mobi/tac-pham-vi-pham.1/"></div>' +
                    '<div class="form-group"><label>Email liên hệ</label><input type="email" class="form-control" required name="email" id="report_email" placeholder=""></div>' +
                    '<input type="checkbox" name="accept" id="accept-checkbox"><label for="accept-checkbox">'+langs.titles.accept_report+'</label>' +
                    '<button type="submit" name="report" style="display: block;\n' +
                    '    background: var(--primary);\n' +
                    '    color: #fff;\n' +
                    '    border-radius: 4px;\n' +
                    '    text-align: center;\n' +
                    '    padding: 0 10px;\n' +
                    '    border: none;\n' +
                    '    width: 100%;\n' +
                    '    font-size: 15px;\n' +
                    '    margin-bottom: 10px;\n' +
                    '    height: auto;\n' +
                    '    line-height: 40px;">'+langs.actions.send_report+'</button>' +
                    '</form>';
                Modal.show('report-modal',langs.titles.report,reportForm,'');
                $('#report-form').on('submit',function(e){
                    e.preventDefault();
                    var data = {
                        violate: $('#violate_link').val(),
                        original: $('#original_link').val(),
                        email: $('#report_email').val()
                    }
                    if(!document.getElementById('accept-checkbox').checked) return;
                    API.post('stories/report',null,data,true,function(data){
                        Toast.success(langs.messages.report.success);
                        $('#report-modal').remove();
                    },function(request){
                        if(typeof langs.messages.report['err_'+request.status])
                            Toast.error(langs.messages.report['err_'+request.status])
                        else Toast.error(langs.errors[request.status]);
                    });
                });
            });
        });
    };
    return {
        init:function(){
            loadDeferreds();
            initUserHeader();
            events();
            searchFormHandler();
            if(document.getElementById('main-nav')) genreToggle();
            trackingUTM();
            affiliateTracking();
            reportModal();
        },
        getUTM: function(){
            var utm = getCookie('enovel_utm');
            if(!utm) return false;
            return JSON.parse(utm);
        },
        triggerLogin: function(resolve,reject){
            Main.modal(function(){
                Modal.login(function(){
                    $('#login-form').on('submit',function(e){
                        e.preventDefault();
                        API.post('/users/login',{},{
                            username: document.getElementById('login_email').value,
                            password: document.getElementById('login_password').value,
                            remember: document.getElementById('remember-checkbox').checked?1:0
                        },false,function(data){
                            setCookie(jwtKey,data.jwt,24*365);
                            if(typeof data.metas != "undefined" && typeof data.metas.colors!="undefined" && data.metas.colors){
                                var colors = JSON.parse(data.metas.colors);
                                setCookie('primaryColor',colors.primaryColor,365*24);
                                $('#css-color').text(':root {--primary: '+colors.primaryColor+';}')
                            }
                            userData = Utils.parseUser();
                            headerUserPanel();
                            if(typeof callbackAfterLogin == 'function') callbackAfterLogin();
                            $('#login-modal').remove();
                            if(typeof resolve == 'function') resolve(userData);
                        },function(request){
                            if(typeof reject=='function') reject(userData);
                            return Toast.error(langs.messages.login[request.status]);
                        });
                    });
                    var social_script = document.createElement('script');
                    social_script.src = cdnUrl+'/assets/v1/js/social_login.js?v=0.0.2';
                    social_script.onload = function(){
                        $('#loginfacebook').on('click',function(e){
                            e.preventDefault();
                            FB.login(function(login){
                                if (login.status === 'connected') {
                                    FB.api('/me', {fields: 'email,name,gender'},function(response) {
                                        var email = typeof response.email == "undefined"?response.id+'@facebook.com':response.email;
                                        var gender = typeof response.gender == "undefined"?'':response.gender;
                                        API.post('/users/fbLogin',null,{
                                            email: email,
                                            name: response.name,
                                            gender: gender,
                                            id: response.id,
                                            remember: document.getElementById('remember-checkbox').checked?1:0,
                                            signedRequest: login.authResponse.signedRequest
                                        },true,function(data){
                                            setCookie(jwtKey,data.jwt,365*24);
                                            if(typeof data.metas != "undefined" && typeof data.metas.colors!="undefined" && data.metas.colors){
                                                var colors = JSON.parse(data.metas.colors);
                                                setCookie('primaryColor',colors.primaryColor,365*24);
                                                $('#css-color').text(':root {--primary: '+colors.primaryColor+';}')
                                            }
                                            userData = Utils.parseUser();
                                            headerUserPanel();
                                            if(typeof data.new != "undefined" && data.new && typeof gtag == 'function'){
                                                gtag('event', 'register', {'send_to': 'AW-761386166/URAhCKrkyaQDELaph-sC'});
                                            }
                                            if(typeof callbackAfterLogin == 'function') callbackAfterLogin();
                                            $('#login-modal').remove();
                                            if(typeof resolve == 'function') resolve(userData);
                                        },function(request){
                                            if(typeof reject=='function') reject(userData);
                                            return Toast.error(langs.messages.login[request.status]);
                                        });
                                    });
                                } }, {scope: 'public_profile,email'});
                        });
                    };
                    document.head.appendChild(social_script);
                    var google_script = document.createElement('script');
                    google_script.src = 'https://apis.google.com/js/api:client.js';
                    google_script.onload = function(){
                        gapi.load('auth2', function(){
                            auth2 = gapi.auth2.init({
                                client_id: '655828021771-sndqepgk2dkoehf3lnveb1vj2cbir1g7.apps.googleusercontent.com',
                                cookiepolicy: 'single_host_origin'
                            });
                            auth2.attachClickHandler(document.getElementById('loginGoogle'), {},
                                function(googleUser) {
                                    API.post('/users/ggLogin',{},{code:googleUser.getAuthResponse().id_token,remember: document.getElementById('remember-checkbox').checked?1:0},true,function(data){
                                        setCookie(jwtKey,data.jwt,365*24);
                                        if(typeof data.metas != "undefined" && typeof data.metas.colors!="undefined" && data.metas.colors){
                                            var colors = JSON.parse(data.metas.colors);
                                            setCookie('primaryColor',colors.primaryColor,365*24);
                                            $('#css-color').text(':root {--primary: '+colors.primaryColor+';}')
                                        }
                                        userData = Utils.parseUser();
                                        headerUserPanel();
                                        if(typeof data.new != "undefined" && data.new && typeof gtag == 'function'){
                                            gtag('event', 'register', {'send_to': 'AW-761386166/URAhCKrkyaQDELaph-sC'});
                                        }
                                        if(typeof callbackAfterLogin == 'function') callbackAfterLogin();
                                        $('#login-modal').remove();
                                        if(typeof resolve == 'function') resolve(userData);
                                    },function(request){
                                        return Toast.error(langs.messages.login[request.status]);
                                    });
                                }, function(error) {
                                    if(typeof reject=='function') reject(userData);
                                    alert(JSON.stringify(error, undefined, 2));
                                });
                        });
                    };
                    document.head.appendChild(google_script);
                });
            });
        },
        publicheaderUserPanel: function(){headerUserPanel()},
        colorPicker: function(){
            Main.modal(function(){
                var primaryColor = getCookie('primaryColor');
                if(!primaryColor) primaryColor = '#bf2c24';
                Modal.show('colorPicker','Color Picker','<p style="margin-bottom: 10px;">Nhập mã màu (HEX) hoặc click chọn màu ở ô bên cạnh</p><input type="text" value="'+primaryColor+'" id="primary-color-input" style="width: 80px;"/> <input type="color" id="primary-color" name="primary-color" value="'+primaryColor+'">' +
                    '','<button type="button" class="button button-primary" id="apply_color">Áp Dụng</button>');
                $(document).on('click','#apply_color',function(e){
                    setCookie('primaryColor',$('#primary-color-input').val(),365*24);
                    $('#colorPicker').css('display','none');
                    $('#css-color').text(':root {--primary: '+$('#primary-color-input').val()+';}')
                    if(Main.isSignedIn()){
                        API.put('users/profile',null,{colors:{primaryColor:$('#primary-color-input').val()}},true,function (data){});
                    }
                });
                document.getElementById('primary-color').addEventListener('input',function(){
                    $('#primary-color-input').val(this.value);
                });
            });
        },
        modal: function(cb){
            if($('#modal-script').length==0){
                var modal_script = document.createElement('script');
                modal_script.src = cdnUrl+'/assets/v1/js/modal.js?v=0.0.2';
                modal_script.onload = cb;
                document.head.appendChild(modal_script);
            }else{
                cb();
            }
        },
        isSignedIn: function(){
            if(userData==false) return false;
            return true;
        },
        Storage: locStorage
    }
}();
document.addEventListener('DOMContentLoaded', function() {
    Main.init();
});
//genres = JSON.parse('{"1":{"name":"Huy\u1ec1n Huy\u1ec5n","slug":"huyen-huyen"},"2":{"name":"Ti\u00ean Hi\u1ec7p","slug":"tien-hiep"},"3":{"name":"H\u1ec7 Th\u1ed1ng","slug":"he-thong"},"4":{"name":"Ng\u00f4n T\u00ecnh","slug":"ngon-tinh"},"5":{"name":"Xuy\u00ean Kh\u00f4ng","slug":"xuyen-khong"},"6":{"name":"D\u1ecb N\u0103ng","slug":"di-nang"},"7":{"name":"\u0110am M\u1ef9","slug":"dam-my"},"8":{"name":"B\u00e1ch H\u1ee3p","slug":"bach-hop"},"9":{"name":"V\u00f5ng Du","slug":"vong-du"},"10":{"name":"Ki\u1ebfm Hi\u1ec7p","slug":"kiem-hiep"},"11":{"name":"\u0110\u00f4 Th\u1ecb","slug":"do-thi"},"12":{"name":"LGBT+","slug":"truyen-lgbt"},"13":{"name":"Truy\u1ec7n FanFic","slug":"truyen-fanfic"},"14":{"name":"N\u1eef Ph\u1ee5","slug":"nu-phu"},"15":{"name":"Phi\u00eau L\u01b0u","slug":"phieu-luu"},"16":{"name":"V\u00f5 Thu\u1eadt","slug":"vo-thuat"},"17":{"name":"Ti\u1ec3u Thuy\u1ebft","slug":"tieu-thuyet"},"18":{"name":"H\u00e0i H\u01b0\u1edbc","slug":"hai-huoc"},"19":{"name":" Truy\u1ec7n Teen","slug":"truyen-teen"},"20":{"name":" Truy\u1ec7n Ng\u1eafn","slug":"truyen-ngan"},"21":{"name":" Truy\u1ec7n Ma","slug":"truyen-ma"},"22":{"name":"\u0110o\u1ea3n V\u0103n","slug":"doan-van"},"23":{"name":"\u0110i\u1ec1n V\u0103n","slug":"dien-van"},"24":{"name":"Cung \u0110\u1ea5u","slug":"cung-dau"},"25":{"name":"C\u1ea1nh K\u1ef9","slug":"canh-ky"},"26":{"name":"Hi\u1ec7n \u0110\u1ea1i","slug":"hien-dai"},"27":{"name":"Light Novel","slug":"light-novel"},"28":{"name":"Huy\u1ec1n B\u00ed","slug":"huyen-bi"},"29":{"name":"Linh D\u1ecb","slug":"linh-di"},"30":{"name":"M\u1ea1t Th\u1ebf","slug":"mat-the"},"31":{"name":"Khoa Huy\u1ec5n","slug":"khoa-huyen"},"32":{"name":"Tu Ch\u00e2n","slug":"tu-chan"},"33":{"name":"Tr\u1ecdng Sinh","slug":"trong-sinh"},"34":{"name":"Huy\u1ec1n \u1ea2o","slug":"huyen-ao"},"35":{"name":"C\u1ed5 \u0110\u1ea1i","slug":"co-dai"},"36":{"name":"\u0110\u00f4ng Ph\u01b0\u01a1ng","slug":"dong-phuong"},"37":{"name":"Quan Tr\u01b0\u1eddng","slug":"quan-truong"},"38":{"name":"K\u1ef3 Huy\u1ec5n","slug":"ky-huyen"},"39":{"name":"Truy\u1ec7n Ng\u01b0\u1ee3c","slug":"truyen-nguoc"},"40":{"name":"B\u00ecnh \u0110\u1ea1m","slug":"binh-dam"},"41":{"name":"D\u1ecb Gi\u1edbi","slug":"di-gioi"},"42":{"name":"L\u1ecbch S\u1eed","slug":"lich-su"},"43":{"name":"Ma Ph\u00e1p","slug":"ma-phap"},"44":{"name":"Trinh Th\u00e1m","slug":"trinh-tham"},"45":{"name":"Th\u01b0\u01a1ng Nghi\u1ec7p","slug":"thuong-nghiep"},"46":{"name":"Th\u00e1m Hi\u1ec3m","slug":"tham-hiem"},"47":{"name":"Truy\u1ec7n S\u1ee7ng","slug":"truyen-sung"},"48":{"name":"N\u1eef Hi\u1ec7p","slug":"nu-hiep"},"49":{"name":"Qu\u00e2n S\u1ef1","slug":"quan-su"},"50":{"name":"N\u1eef C\u01b0\u1eddng","slug":"nu-cuong"},"51":{"name":"T\u00ecnh C\u1ea3m","slug":"tinh-cam"},"52":{"name":"\u1ea8m Th\u1ef1c","slug":"am-thuc"},"53":{"name":"Th\u1ec3 Thao","slug":"the-thao"},"54":{"name":"T\u1ed5ng h\u1ee3p","slug":"tong-hop"},"55":{"name":"Gia \u0110\u1ea5u","slug":"gia-dau"},"56":{"name":"Kinh D\u1ecb","slug":"kinh-di"},"57":{"name":"T\u1ea3n V\u0103n","slug":"tan-van"},"58":{"name":"H\u1ecdc \u0110\u01b0\u1eddng","slug":"hoc-duong"},"60":{"name":"\u0110\u1ed3ng Nh\u00e2n","slug":"dong-nhan"},"61":{"name":"H\u00e0nh \u0110\u1ed9ng","slug":"hanh-dong"},"62":{"name":"Thi\u1ebfu Nhi","slug":"thieu-nhi"},"63":{"name":"D\u00e3 S\u1eed","slug":"da-su"},"64":{"name":"Xuy\u00ean Nhanh","slug":"xuyen-nhanh"},"65":{"name":"Th\u00fa Nh\u00e2n","slug":"thu-nhan"},"66":{"name":"Song T\u00ednh","slug":"song-tinh"},"67":{"name":"Showbiz","slug":"showbiz"},"68":{"name":"Zombie","slug":"zombie"},"69":{"name":"Tr\u00f2 Ch\u01a1i","slug":"cho-choi"}}');
function getCookie(cname) {
    var name = cname + "=";
    var decodedCookie = document.cookie;
    var ca = decodedCookie.split(';');
    for(var i = 0; i <ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) == 0) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}
function setCookie(cname, cvalue, exhours) {
    var d = new Date();
    d.setTime(d.getTime() + (exhours*60*60*1000));
    var expires = "expires="+ d.toUTCString();
    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
function str2url(str){
    if(str!="") {
        str= str.toLowerCase();
        str= str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g,"a");
        str= str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g,"e");
        str= str.replace(/ì|í|ị|ỉ|ĩ/g,"i");
        str= str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g,"o");
        str= str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g,"u");
        str= str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g,"y");
        str= str.replace(/đ/g,"d");
        str= str.replace(/!|@|%|\^|\*|\(|\)|\+|\=|\<|\>|\?|\/|,|\.|\:|\;|\'| |\"|\&|\#|\[|\]|\“|\”|~|$|_/g,"-");
        str= str.replace(/-+-/g,"-");
        str= str.replace(/^\-+|\-+$/g,"");
        str = str.replace('/^[a-z0-9\-]/','');
        return str;
    }
}
function signOut() {
    gapi.load('auth2', function() {
        gapi.auth2.init().then(function(){
            var auth2 = gapi.auth2.getAuthInstance();
            auth2.signOut().then(function () {
            });
        });
    });
}
var Toast = function(){
    var show = function(message,title,type,option){
        if(typeof type == 'undefined') type = 'error';
        var elm = document.createElement('div');
        elm.className = 'toast';
        var html = '<div class="message '+type+'">';
        if(typeof option !="undefined" && typeof option.icon != "undefined")
            html += '<span class="icon" style="background-image:url('+option.icon+')"></span>';
        html += '<span class="title">'+title+'</span><p>'+message+'</p>';
        if(typeof option != "undefined" && typeof option.close_style != "undefined")
            html += '<button class="close" type="button" style="'+option.close_style+'">'+langs.actions.close+'</a>';
        else html += '<button class="close" type="button">'+langs.actions.close+'</a>';
        html += '</div>';
        elm.innerHTML = html;
        document.body.appendChild(elm);
        elm.getElementsByClassName('close')[0].addEventListener('click',function(e){
            e.preventDefault();
            document.body.removeChild(this.parentNode.parentNode);
        });
    };
    return {
        error: function(message){show(message,langs.labels.error,'error');},
        success: function(message){show(message,langs.labels.success,'success');},
        alert: function(message){show(message,langs.labels.alert,'default');},
        custom: function(message,option){show(message,option.title,'custom',option)}
    }
}();
function initImageLazy(){
    if(typeof isSuportWebp == "undefined"){
        var elem = document.createElement('canvas');
        isSuportWebp = elem.toDataURL('image/webp').indexOf('data:image/webp') == 0;
    }
    var lazyImages = [].slice.call(document.querySelectorAll("img[data-layzr]"));
    if ("IntersectionObserver" in window) {
        var lazyImageObserver = new IntersectionObserver(function(entries, observer) {
            entries.forEach(function(entry) {
                if (entry.isIntersecting) {
                    var lazyImage = entry.target;
                    var src = lazyImage.getAttribute('data-layzr');
                    var ext = src.split('.');ext = ext[ext.length-1];
                    ext = ext.split('?')[0];
                    if(ext=='webp' && !isSuportWebp) src = src.replace('.webp','.jpg');
                    lazyImage.src = src;
                    lazyImageObserver.unobserve(lazyImage);
                }
            });
        });
        lazyImages.forEach(function(lazyImage) {
            lazyImageObserver.observe(lazyImage);
        });
    } else {
        var active = false;
        var lazyLoad_fnc = function() {
            if (active === false) {
                active = true;
                setTimeout(function() {
                    lazyImages.forEach(function(lazyImage) {
                        if ((lazyImage.getBoundingClientRect().top <= window.innerHeight && lazyImage.getBoundingClientRect().bottom >= 0) && getComputedStyle(lazyImage).display !== "none") {
                            var src = lazyImage.getAttribute('data-layzr');
                            var ext = src.split('.');ext = ext[ext.length-1];
                            ext = ext.split('?')[0];
                            if(ext=='webp' && !isSuportWebp) src = src.replace('.webp','.jpg');
                            lazyImage.src = src;
                            lazyImages = lazyImages.filter(function(image) {
                                return image !== lazyImage;
                            });
                            if (lazyImages.length === 0) {
                                document.removeEventListener("scroll", lazyLoad_fnc,{passive: true});
                                window.removeEventListener("resize", lazyLoad_fnc);
                                window.removeEventListener("orientationchange", lazyLoad_fnc);
                            }
                        }
                    });
                    active = false;
                }, 200);
            }
        };
        document.addEventListener("scroll", lazyLoad_fnc,{passive: true});
        window.addEventListener("resize", lazyLoad_fnc);
        window.addEventListener("orientationchange", lazyLoad_fnc);
        lazyLoad_fnc();
    }
}
initImageLazy();
if ('serviceWorker' in navigator) {
    window.addEventListener('load', function() {
        var sw = location.origin+'/sw.js';
        navigator.serviceWorker.register(sw).then(function(reg) {
            swRegistration = reg;
            reg.onupdatefound = function() {
                var installingWorker = reg.installing;
                installingWorker.onstatechange = function() {
                    switch (installingWorker.state) {
                        case 'installed':
                            if (navigator.serviceWorker.controller) {
                                console.log('New or updated content is available.');
                            } else {
                                console.log('Content is now available offline!');
                            }
                            break;
                        case 'redundant':
                            console.error('The installing service worker became redundant.');
                            break;
                    }
                };
            };
        }).catch(function(e) {
            console.error('Error during service worker registration:', e);
        });
    });
}

ZeroDay Forums Mini