generic-skin 4.3.0 → 4.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1066,6 +1066,10 @@ Vue.component('expediente-usuario', {
1066
1066
  return 'usergroup-' + this.profile.colour
1067
1067
  }
1068
1068
  },
1069
+ computed() {
1070
+ // Updates stored profiles.
1071
+ FNR.user.getProfile(window.location.href.split('/u')[1]);
1072
+ },
1069
1073
  template: `
1070
1074
  <section class="profile-element">
1071
1075
  <cabespecial-foro><template slot="title">Perfil de {{ profile.name }}</template></cabespecial-foro>
@@ -1,2 +1,2 @@
1
- Vue.component("categoria-foro",{props:["id"],computed:{slugName(){const e=this.id.indexOf("<h2>")>-1?FNR.utility.genSlug(this.id.split("<h2>")[1].split("</h2>")[0],"-"):FNR.utility.genSlug(this.id,"-");return"category-"+e}},template:"\n <section :class=\"'category-element ' + slugName\">\n \t\t<slot></slot>\n </section>\n "}),Vue.component("cabecera-foro",{data(){return{title:void 0===this.$slots.title[0].tag?this.$slots.title[0].text:this.$slots.title[0].children[0].text}},template:'\n <div class="forum-head regular-head">\n <titulo-especial :title="title"></titulo-especial>\n </div>\n '}),Vue.component("cabcategoria-foro",{data(){return{title:void 0===this.$slots.title[0].tag?this.$slots.title[0].text:this.$slots.title[0].children[0].text}},template:'\n <div class="forum-head category-head">\n <titulo-especial :title="title"></titulo-especial>\n </div>\n '}),Vue.component("cabespecial-foro",{data(){return{title:void 0===this.$slots.title[0].tag?this.$slots.title[0].text:this.$slots.title[0].children[0].text}},template:'\n <div class="forum-head special-head">\n <titulo-especial :title="title"></titulo-especial>\n </div>\n '}),Vue.component("subforo-foro",{props:["id"],computed:{slugId(){let e="";return window.location.pathname.match(/f(\d+)-/)?e=window.location.pathname.match(/f(\d+)-/)[1]:window.location.pathname.match(/f(\d+)p(\d+)-/)&&(e=window.location.pathname.match(/f(\d+)p(\d+)-/)[1]),"subforum-"+e},slugName(){const e=this.id.indexOf("<h2>")>-1?FNR.utility.genSlug(this.id.split("<h2>")[1].split("</h2>")[0],"-"):FNR.utility.genSlug(this.id,"-");return"subforum-"+e}},template:"\n <section :class=\"'subforum-element ' + slugId + ' ' + slugName\">\n \t\t<slot></slot>\n </section>\n "}),Vue.component("lista-temas-cabecera",{props:["elements"],data(){return{elementos:JSON.parse(this.elements.replace(/'/g,'"'))}},template:'\n <ul class="topiclist-header no-style">\n <li v-for="element in elementos">\n <titulo-especial :title="element"></titulo-especial>\n </li>\n </ul>\n '}),Vue.component("tema-foro",{computed:{slugId(){let e="";return window.location.pathname.match(/t(\d+)-/)?e=window.location.pathname.match(/t(\d+)-/)[1]:window.location.pathname.match(/t(\d+)p(\d+)-/)&&(e=window.location.pathname.match(/t(\d+)p(\d+)-/)[1]),"topic-"+e},slugName(){const e=FNR.utility.genSlug(void 0===this.$slots.title[0].tag?this.$slots.title[0].text:this.$slots.title[0].children[0].text,"-");return"topic-"+e}},template:"\n <section :class=\"'topic-element ' + slugId + ' ' + slugName\">\n \t\t<slot></slot>\n </section>\n "}),Vue.component("mando-foro",{props:["id","app"],template:'\n <section :class="\'forum-controls \' + id">\n <template v-if="app === \'true\'">\n <ul class="left no-style page-buttons">\n <slot name="controls"></slot>\n </ul>\n <div class="right page-pagination">\n <slot name="pagination"></slot>\n </div>\n </template>\n <template v-else>\n <ul class="left no-style page-buttons"></ul>\n <div class="right page-pagination"></div>\n </template>\n </section>\n '}),Vue.component("paginacion-foro",{props:["page","total"],data:()=>({input:"",timeout:null}),computed:{value:{get(){return this.input},set(e){this.timeout&&clearTimeout(this.timeout),this.timeout=setTimeout(()=>{this.input=e,null===e.match(/[a-zA-Z]+/g)&&""!==e.trim()&&(e<1?this.$emit("setPage",1):e>this.total?this.$emit("setPage",this.total):this.$emit("setPage",e),this.$refs.refInput.blur(),this.input="",this.doScroll())},750)}}},methods:{doScroll(){document.querySelector("body.is-touch")&&window.scroll(0,document.querySelector(".wiki-content").querySelector(".is-content").querySelector("p:last-child").offsetTop-40)}},template:'\n <div class="pagination-manager">\n <div class="page-action" v-if="page > 1">\n <a href="javascript:{}" class="page-prev" title="Ir a la página anterior" @click="$emit(\'setPage\', page - 1); doScroll()">\n <i class="fas fa-chevron-left"></i>\n </a>\n </div>\n <div class="pagination-input" v-if="total > 1">\n <input type="text" :placeholder="page" v-model="value" ref="refInput">de {{ total }}\n </div>\n <div class="page-action" v-if="page < total">\n <a href="javascript:{}" class="page-next" title="Ir a la página anterior" @click="$emit(\'setPage\', page + 1); doScroll()">\n <i class="fas fa-chevron-right"></i>\n </a>\n </div>\n </div>\n '}),Vue.component("titulo-especial",{props:["title"],template:'\n <h3 class="is-tweakeable"><span class="is-measurable" v-html="title"></span></h3>\n '}),Vue.component("cuerpo-widget",{props:["class"],computed:{currentClass(){return void 0===this.class?"plank-inner":"plank-inner "+this.class}},template:'\n <div class="plank-content">\n <div :class="currentClass">\n <slot></slot>\n </div>\t\t\t\t\t\t \n </div>\n '}),Vue.component("separador-foro",{props:["faction"],data:()=>({image:forumDefaults.separator}),template:'\n <section class="forumseparator-element">\n <img :src="image" />\n </section>\n '}),Vue.component("tema-ref",{props:["info"],data:()=>({profileName:forumConfig.profileOptions.profileName||"perfil"}),computed:{userColor(){return"color: "+this.info.lastpost.who.color}},template:'\n <div class="ltopic-element">\n <a class="ltopic-last" :href="info.lastpost.url" target="_blank" :title="\'Ir al último mensaje del tema «\' + info.name + \'»\'">\n <i class="fas fa-link"></i>\n </a>\n <div class="ltopic-data">\n <a class="ltopic-title" :href="info.url" target="_blank" :title="\'Ir al tema «\' + info.name + \'»\'">{{ info.name }}</a>\n <small class="ltopic-info"><a :href="info.lastpost.who.url" target="_blank" :style="userColor" :title="\'Ir al \' + profileName + \' de «\' + info.lastpost.who.name + \'»\'">{{ info.lastpost.who.name | just-name }}</a>, {{ info.lastpost.date }} en <a :href="info.forum.url" target="_blank" :title="\'Ir al subforo «\' + info.forum.name + \'»\'">{{ info.forum.name }}</a></small>\n </div>\n </div>\n '}),Vue.component("campo-foro",{props:["name"],mounted(){const e=this.$el.parentElement.classList;e.add("field-element"),e.add("field-"+FNR.utility.genSlug(this.name,"-"))},template:'\n <div class="forum-field">\n <div class="field-name">{{ name | capitalize }}</div>\n <div class="field-content">\n <slot></slot>\n </div>\n </div>\n '}),Vue.component("boton-foro",{props:["url","name","icon","type","input"],computed:{realClass(){return"true"===this.input?"forum-button is-input":"forum-button"},realName(){return"text"+("no-name"===this.type?" is-hidden-touch":"")},realUrl(){return"true"===this.input?"javascript:{}":this.url}},mounted(){const e=this.$el.parentElement.classList;e.add("btn-element"),e.add("btn-"+FNR.utility.genSlug(this.name,"-"))},template:'\n <a :href="realUrl" targer="_blank" :class="realClass" :title="name">\n <span class="icon">\n <i :class="icon"></i>\n </span>\n <span :class="realName">{{ name }}</span>\n <span v-if="input === \'true\'" class="input-real">\n <slot name="input"></slot>\n </span>\n </a>\n '}),Vue.component("cargando-foro",{props:["text"],template:'\n <section id="loading-element">\n <div id="loading-content">\n <i class="fas fa-circle-notch fa-spin"></i>\n <span>{{ text }}</span>\n </div>\n </section>\n '}),Vue.component("aviso-foro",{template:' \n <div class="forum-infoblock">\n <h5>Antes de proceder recuerda:</h5>\n <slot></slot>\n </div>\n '}),Vue.component("afiliaciones-foro",{data:()=>({afis:{}}),created(){FNR.forum.getAffiliates().then(e=>{this.afis=e})},template:'\n <ul v-html="afis.normal" class="no-style"></ul>\n '}),Vue.component("controles-foro",{data:()=>({maPage:0,userName:_userdata.username,userLevel:_userdata.user_level,userId:_userdata.user_id,userLog:_userdata.session_logged_in,userMP:0,userOut:"",isActive:!1}),computed:{isActiveClass(){return"has-bg"+(this.isActive?" visible":" not-visible")}},methods:{turnActive(){this.isActive=!this.isActive}},created(){0!==this.userLog&&(null!==document.querySelector("#i_icon_mini_new_message")&&null!==document.querySelector("#i_icon_mini_new_message").title.match(/[0-255]/)&&(this.userMP=parseInt(document.querySelector("#i_icon_mini_new_message").title.match(/[0-255]/)[0])),this.userOut=document.querySelector("#logout").href)},template:'\n <div class="main-body">\n \t\t<nav id="forum-breadcrumb" class="breadcrumb has-succeeds-separator left" aria-label="breadcrumbs">\n \t<ul>\n \t<li>\n \t<a href="/" title="Ir a «Inicio»">Inicio</a>\n \t</li>\n \t</ul>\n \t</nav>\n <nav class="right"> \n <section id="forum-navbar-desktop" class="is-hidden-touch">\n <navbar-foro :username="userName" :userlevel="userLevel" :userid="userId" :userlog="userLog" :usermp="userMP" :userout="userOut" />\n </section>\n <section id="forum-navbar-mobile" class="is-hidden-desktop">\n <div id="hmg-button" @click="turnActive()" class="is-pointer">\n <i class="fas fa-bars"></i>\n </div>\n <div id="hmg-menu" :class="isActiveClass">\n <h3>{{ userName | just-name }}<i class="fas fa-times is-pointer" @click="turnActive()"></i></h3>\n <navbar-foro :username="userName" :userlevel="userLevel" :userid="userId" :userlog="userLog" :usermp="userMP" :userout="userOut" />\n </div>\n <div class="bg-active" @click="turnActive()"></div>\n </section>\n <section v-if="maPage === 1" id="multiaccount-transition">\n <cargando-foro text="Cambiando de cuenta…"></cargando-foro>\n </section>\n </nav>\n </div>\n '}),Vue.component("navbar-foro",{props:["username","userlevel","userid","userlog","usermp","userout"],data:()=>({profileName:forumConfig.profileOptions.profileName||"perfil",items:forumContent.navbar,navigation:forumContent.links,directions:forumConfig.usableDirections,multiAccount:{status:!1,position:-1,accounts:[]}}),computed:{isStatusClass(){return(1===this.userlog?"is-logged":"is-unlogged")+(1===this.userlevel?" is-admin":" is-user")},mpText(){return"Mensajería"+(0!==this.usermp?" ("+this.usermp+")":"")},links(){return this.navigation.filter(e=>void 0!==e.icon)}},methods:{changeAccount(){this.$parent.maPage=1,FNR.user.changeAccount(this.userout,this.multiAccount.accounts[this.multiAccount.position].name,this.multiAccount.accounts[this.multiAccount.position].password).then(e=>{e&&window.location.reload()})}},created(){this.multiAccount.status=!1!==FNR.cache.getData("usermultiaccounts")&&!1!==FNR.cache.getData("userpassword")&&FNR.cache.getData("usermultiaccounts").length>1,this.multiAccount.accounts=(!1===FNR.cache.getData("usermultiaccounts")?[]:FNR.cache.getData("usermultiaccounts").map(e=>({name:e.name,password:sjcl.decrypt(FNR.cache.getData("userpassword"),e.password)}))).filter(e=>e.name!==_userdata.username).sort((e,n)=>e.name<n.name?-1:e.name>n.name?1:0)},template:'\n <ul :class="isStatusClass">\n <template v-if="!userlog">\n <li class="navbar-item">\n <a href="/register" title="Registrarse en el foro">\n <div class="icon">\n <i class="fas fa-user-plus"></i>\n </div>\n <div class="text">Registrarse</div>\n </a>\n </li>\n <li class="navbar-item">\n <a href="/login" title="Iniciar sesión en el foro">\n <div class="icon">\n <i class="fas fa-sign-in-alt"></i>\n </div>\n <div class="text">Conectarse</div>\n </a>\n </li>\n </template>\n <template v-else>\n <li class="navbar-item is-hidden-desktop" v-for="link in links">\n <a :href="link.url" :title="\'Ir a «\' + link.name + \'»\'">\n <div class="icon">\n <i :class="link.icon"></i>\n </div>\n <div class="text">{{ link.name }}</div>\n </a>\n </li>\n <li class="navbar-item" v-for="item in items">\n <a :href="item.url" :title="\'Ir a «\' + item.name + \'»\'">\n <div class="icon">\n <i :class="item.icon"></i>\n </div>\n <div class="text">{{ item.name }}</div>\n </a>\n </li>\n <li class="navbar-item">\n <a href="/privmsg?folder=inbox" title="Ir a tu mensajería privada">\n <div class="icon">\n <i class="fas fa-envelope"></i>\n </div>\n <div class="text">{{ mpText }}</div>\n </a>\n </li>\n <li class="navbar-item has-dropdown is-dropeable has-bg">\n <a class="navbar-link is-pointer" title="Accionar menú de usuario">\n <div class="icon">\n <i class="fas fa-user"></i>\n </div>\n <div class="text">{{ username | just-name }}</div>\n </a>\n <div class="navbar-dropdown is-right">\n <template v-if="userlevel === 1">\n <a class="navbar-item" href="/admin" target="_blank" title="Ir al «Panel de Administrador»">\n <div class="icon">\n <i class="fas fa-cogs"></i>\n </div>\n <div class="text">Panel Administrador</div>\n </a>\n </template>\n <a class="navbar-item" :href="directions.ucp" target="_blank" title="Ir al «Panel de Usuario»">\n <div class="icon">\n <i class="fas fa-sliders-h"></i>\n </div>\n <div class="text">Panel Usuario</div>\n </a>\n <a class="navbar-item" :href="\'/u\' + userid" :title="\'Ir a tu \' + profileName">\n <div class="icon">\n <i class="far fa-id-card"></i>\n </div>\n <div class="text">{{ profileName | capitalize }}</div>\n </a>\n <a class="navbar-item" href="/search?search_id=egosearch" title="Ir a tus temas personales">\n <div class="icon">\n <i class="fas fa-archive"></i>\n </div>\n <div class="text">Temas personales</div>\n </a>\n <a class="navbar-item" :href="userout" title="Cerrar sesión">\n <div class="icon">\n <i class="fas fa-sign-out-alt"></i>\n </div>\n <div class="text">Cerrar sesión</div>\n </a>\n <template v-if="multiAccount.status">\n <hr/>\n <div title="Cambiar de cuenta" class="select-container">\n <select v-model="multiAccount.position" @change="changeAccount()" @click="$event.stopPropagation()">\n <option value="-1" hidden selected>Selec. personaje</option>\n <option v-for="(account, index) in multiAccount.accounts" :value="index">{{ account.name }}</option>\n </select>\n </div>\n </template>\n </div>\n </li>\n </template>\n </ul>\n '}),Vue.component("links-ayuda",{data:()=>({links:forumContent.links}),template:'\n <div class="columns is-multiline is-gapless is-vcentered">\n <a target="_blank" :href="link.url" :title="\'Ir a «\' + link.name + \'»\'" class="column" v-for="link in links">{{ link.name }}</a>\n </div>\n '}),Vue.component("links-anuncios",{data:()=>({announcements:forumContent.announcements}),template:'\n <div id="anmt-main">\n <template v-for="(announcement, index) in announcements">\n <a target="_blank" :href="announcement.url" :title="\'Ir al anuncio «\' + announcement.name + \'»\'" class="anmt-element"><span class="anmt-title">{{ announcement.name }}</span><span class="anmt-date">{{ announcement.date }}</span></a>\n <div class="anmt-sep" v-if="(announcements.length - 1) !== index"></div>\n </template>\n </div>\n '}),Vue.component("links-staff",{data:()=>({staff:forumContent.staff}),template:'\n <div id="admin-main">\n <a target="_blank" :href="admin.url" class="admin-element" :style="\'background-image: url(\' + admin.avatar + \')\'" :title="admin.title" v-for="admin in staff"><span class="admin-name">{{ admin.name }}</span><span class="admin-desc">{{ admin.desc }}</span></a>\n </div>\n '}),Vue.component("sabias-que",{data:()=>({content:forumContent.sq[Math.floor(Math.random()*forumContent.sq.length)]}),created(){setInterval(()=>{this.content=forumContent.sq[Math.floor(Math.random()*forumContent.sq.length)]},12e3)},template:'\n <img id="sq-img" :src="content" alt="¿Sabías que?" />\n '}),Vue.component("busquedas",{data:()=>({content:forumContent.searches[Math.floor(Math.random()*forumContent.searches.length)]}),created(){setInterval(()=>{this.content=forumContent.searches[Math.floor(Math.random()*forumContent.searches.length)]},16e3)},template:'\n <a id="search-img" :href="content.url" target="_blank" :title="content.desc">\n <img :src="content.img" alt="Búsqueda" />\n </a>\n '}),Vue.component("note-info",{template:'\n <div class="admin-block admin-note">\n <div class="admin-icon fas fa-caret-right"></div>\n <div class="admin-content admin-title">\n <slot></slot>\n </div>\n </div>\n '}),Vue.component("redirect",{props:["to"],computed:{currentStatus:()=>!!window.location.pathname.match(/t(\d+)-/)},created(){this.currentStatus&&window.location.replace(this.to)},template:'\n <div class="is-content">\n <template v-if="!currentStatus">\n <p>No hay mensaje.</p>\n </template>\n </div>\n '}),Vue.component("quote",{props:["from"],template:'\n <div class="admin-block admin-box user-coolquote">\n <div class="coolquote-quote">\n <div class="fas fa-quote-left"></div>\n <div class="coolquote-content">\n <slot></slot>\n </div>\n <div class="fas fa-quote-right"></div>\n </div>\n <div class="coolquote-from">{{ from }}</div>\n </div>\n '}),Vue.component("wiki-index-items-d",{props:["content"],template:'\n <ul>\n <li v-for="content in content">\n <div class="wiki-controls">\n <router-link :to="content.id" v-if="!content.children.length" :title="\'Ir al artículo de «\' + content.name + \'»\'">{{ content.name }}</router-link>\n <a class="wiki-cascade" :title="\'Desplegar categoría de «\' + content.name + \'»\'" v-else>\n <span class="text">{{ content.name }}</span>\n <span class="icon">\n <i class="fas fa-plus"></i>\n <i class="fas fa-minus"></i>\n </span>\n </a>\n </div>\n <wiki-index-items-d v-if="content.children.length" :content="content.children"></wiki-index-items-d>\n </li>\n </ul>\n '}),Vue.component("wiki-index",{computed:{indexContent(){const e=t=>n.filter(e=>e.component.page_parent===t).map(n=>({id:n.path,name:n.component.page_name,children:e(n.component.page_name)})),n=routes.filter(e=>void 0!==e.component).filter(e=>!e.component.page_skip);return n.filter(e=>void 0===e.component.page_parent).map(n=>({id:n.path,name:n.component.page_name,children:e(n.component.page_name)}))}},template:'\n <aside class="wiki-index is-content profile-sticky">\n <div class="is-hidden-touch">\n <h3>Contenido</h3>\n <wiki-index-items-d :content="indexContent"></wiki-index-items-d>\n </div>\n <div class="select-container is-hidden-desktop">\n <select>\n <option value="-1" hidden selected>Contenido</option>\n <template v-for="content in indexContent">\n <template v-if="content.children.length">\n <option :value="content.id" disabled >— {{ content.name }}</option>\n <template v-for="content in content.children">\n <template v-if="content.children.length">\n <option :value="content.id" disabled >&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n <template v-for="content in content.children">\n <template v-if="content.children.length">\n <option :value="content.id" disabled >&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n <template v-for="content in content.children">\n <template v-if="content.children.length">\n <option :value="content.id" disabled >&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n <template v-for="content in content.children">\n <option :value="content.id">&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n </template>\n </template>\n <option :value="content.id" v-else >&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n </template>\n </template>\n <option :value="content.id" v-else >&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n </template>\n </template>\n <option :value="content.id" v-else >&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n </template>\n </template>\n <option :value="content.id" v-else >— {{ content.name }}</option>\n </template>\n </select>\n </div>\n </aside>\n '}),Vue.component("wiki-contenido",{props:["mode"],template:'\n <div class="wiki-body has-small-topiclist">\n <wiki-index></wiki-index>\n <template v-if="mode === \'app\'">\n <slot></slot>\n </template>\n <template v-else>\n <section class="wiki-content is-dramatic">\n <slot></slot>\n </section>\n </template>\n </div>\n '}),Vue.component("wiki-nav",{computed:{more:()=>routes.filter(e=>e.component).filter(e=>e.component.page_parent===routes.filter(e=>e.path===router.history.current.path)[0].component.page_parent).length>1,nav(){const e=routes.filter(e=>e.component).filter(e=>e.component.page_parent===routes.filter(e=>e.path===router.history.current.path)[0].component.page_parent),n=e.map(e=>e.path).indexOf(router.history.current.path);return{next:!(n+1>=e.length)&&e[n+1],prev:!(n-1<0)&&e[n-1]}}},template:'\n <div class="wiki-nav" v-if="more">\n <h2>Navegación</h2>\n <template v-if="nav.prev !== false">* <router-link :to="nav.prev.path" :title="\'Ir al artículo «\' + nav.prev.component.page_name + \'»\'">Página anterior: {{ nav.prev.component.page_name }}</router-link></template>\n <br v-if="nav.prev !== false && nav.next !== false"/>\n <template v-if="nav.next !== false">* <router-link :to="nav.next.path" :title="\'Ir al artículo «\' + nav.next.component.page_name + \'»\'">Página siguiente: {{ nav.next.component.page_name }}</router-link></template>\n </div>\n '}),Vue.component("wiki-children",{props:["name","category"],computed:{nav(){return routes.filter(e=>e.component).filter(e=>e.component.page_parent===this.category)}},template:'\n <div class="wiki-nav" v-if="nav.length > 0">\n <h2>{{ name }}</h2>\n <template v-for="route in nav">* <router-link :to="route.path" :title="\'Ir al artículo «\' + route.component.page_name + \'»\'">{{ route.component.page_name }}</router-link><br/></template>\n </div>\n '}),Vue.component("modal-foro",{props:["title"],methods:{modalClose(){this.$parent.state.modal=!1,this.$emit("modal-close")}},template:' \n <div id="forum-modal">\n <div class="modal-element">\n <div class="modal-title">\n <h3>{{ title }}</h3>\n <a @click="modalClose()">\n <i class="fas fa-times"></i>\n </a>\n </div>\n <div class="modal-content">\n <div class="is-content">\n <slot name="content"></slot>\n </div>\n <slot name="controls"></slot>\n </div>\n </div>\n <div class="is-bgmodal bg-active" @click="modalClose()"></div>\n </div>\n '}),Vue.component("controles-modal",{template:' \n <div class="modal-buttons">\n <slot></slot>\n </div>\n '}),Vue.component("expediente-usuario",{data:()=>({info:{name:_userdata.username,level:_userdata.user_level,log:_userdata.session_logged_in},config:forumConfig.profileUser,profile:profile}),computed:{userRank(){return this.profile.fields[forumConfig.profileOptions.profileRank].content},userCite(){return this.profile.fields[forumConfig.profileOptions.profileCite].content},userCover(){return this.profile.fields[forumConfig.profileOptions.profileCover].content},usableMiniFields(){return void 0!==this.config.miniFields&&this.config.miniFields.length?Object.entries(this.profile.fields).filter(e=>this.config.miniFields.indexOf(e[0])>-1).map(e=>({id:e[0],title:e[1].label,content:e[1].content})).sort((e,n)=>this.config.miniFields.indexOf(e.id)>this.config.miniFields.indexOf(n.id)?1:-1).map(e=>({id:FNR.utility.genSlug(e.title,"-"),title:e.title,content:e.content})):[]},usableBigFields(){return void 0!==this.config.mainFields&&Object.keys(this.config.mainFields).length?Object.entries(this.profile.fields).filter(e=>Object.keys(this.config.mainFields).indexOf(e[0])>-1).map(e=>({id:e[0],title:e[1].label,subtitle:this.config.mainFields[e[0]],content:" &nbsp;-"===e[1].content?"":e[1].content})).sort((e,n)=>Object.keys(this.config.mainFields).indexOf(e.id)>Object.keys(this.config.mainFields).indexOf(n.id)?1:-1).map(e=>({id:FNR.utility.genSlug(e.title,"-"),title:e.title,subtitle:e.subtitle,content:e.content})):[]},lengthBigFields(){let e=0;return this.usableBigFields.map(n=>{void 0!==n.content&&(e+=n.content.length)}),e},usableExtraFields(){return void 0!==this.config.extraFields&&this.config.extraFields.length?Object.entries(this.profile.fields).filter(e=>this.config.extraFields.indexOf(e[0])>-1).map(e=>({id:e[0],title:e[1].label,content:" &nbsp;-"===e[1].content?"":e[1].content})).sort((e,n)=>this.config.extraFields.indexOf(e.id)>this.config.extraFields.indexOf(n.id)?1:-1).map(e=>({id:FNR.utility.genSlug(e.title,"-"),title:e.title,content:e.content})):[]},lengthExtraFields(){let e=0;return this.usableExtraFields.map(n=>{void 0!==n.content&&(e+=n.content.length)}),e},usableLinkFields(){return this.profile.contact.length?[]:Object.entries(this.profile.contact).filter(e=>"Mensaje Privado"!==e[1].label).map(e=>({id:FNR.utility.genSlug(e[1].label,"-"),title:e[1].label,url:e[1].content,icon:this.config.contactFields[e[0]],desc:"Ir a "+e[1].label+" de «"+this.profile.name+"»"}))},chronologyField(){return void 0!==this.config.cronoField&&this.config.cronoField.length?FNR.utility.genArray(this.profile.fields[FNR.utility.genSlug(this.config.cronoField,"_")].content):[]},relationshipsField(){return void 0!==this.config.relaField&&this.config.relaField.length?FNR.utility.genArray(this.profile.fields[FNR.utility.genSlug(this.config.relaField,"_")].content):[]},lengthHistoryFields(){let e=0;return e+=this.chronologyField.length,e+=this.relationshipsField.length,e},currentClass(){return"usergroup-"+this.profile.colour}},
1
+ Vue.component("categoria-foro",{props:["id"],computed:{slugName(){const e=this.id.indexOf("<h2>")>-1?FNR.utility.genSlug(this.id.split("<h2>")[1].split("</h2>")[0],"-"):FNR.utility.genSlug(this.id,"-");return"category-"+e}},template:"\n <section :class=\"'category-element ' + slugName\">\n \t\t<slot></slot>\n </section>\n "}),Vue.component("cabecera-foro",{data(){return{title:void 0===this.$slots.title[0].tag?this.$slots.title[0].text:this.$slots.title[0].children[0].text}},template:'\n <div class="forum-head regular-head">\n <titulo-especial :title="title"></titulo-especial>\n </div>\n '}),Vue.component("cabcategoria-foro",{data(){return{title:void 0===this.$slots.title[0].tag?this.$slots.title[0].text:this.$slots.title[0].children[0].text}},template:'\n <div class="forum-head category-head">\n <titulo-especial :title="title"></titulo-especial>\n </div>\n '}),Vue.component("cabespecial-foro",{data(){return{title:void 0===this.$slots.title[0].tag?this.$slots.title[0].text:this.$slots.title[0].children[0].text}},template:'\n <div class="forum-head special-head">\n <titulo-especial :title="title"></titulo-especial>\n </div>\n '}),Vue.component("subforo-foro",{props:["id"],computed:{slugId(){let e="";return window.location.pathname.match(/f(\d+)-/)?e=window.location.pathname.match(/f(\d+)-/)[1]:window.location.pathname.match(/f(\d+)p(\d+)-/)&&(e=window.location.pathname.match(/f(\d+)p(\d+)-/)[1]),"subforum-"+e},slugName(){const e=this.id.indexOf("<h2>")>-1?FNR.utility.genSlug(this.id.split("<h2>")[1].split("</h2>")[0],"-"):FNR.utility.genSlug(this.id,"-");return"subforum-"+e}},template:"\n <section :class=\"'subforum-element ' + slugId + ' ' + slugName\">\n \t\t<slot></slot>\n </section>\n "}),Vue.component("lista-temas-cabecera",{props:["elements"],data(){return{elementos:JSON.parse(this.elements.replace(/'/g,'"'))}},template:'\n <ul class="topiclist-header no-style">\n <li v-for="element in elementos">\n <titulo-especial :title="element"></titulo-especial>\n </li>\n </ul>\n '}),Vue.component("tema-foro",{computed:{slugId(){let e="";return window.location.pathname.match(/t(\d+)-/)?e=window.location.pathname.match(/t(\d+)-/)[1]:window.location.pathname.match(/t(\d+)p(\d+)-/)&&(e=window.location.pathname.match(/t(\d+)p(\d+)-/)[1]),"topic-"+e},slugName(){const e=FNR.utility.genSlug(void 0===this.$slots.title[0].tag?this.$slots.title[0].text:this.$slots.title[0].children[0].text,"-");return"topic-"+e}},template:"\n <section :class=\"'topic-element ' + slugId + ' ' + slugName\">\n \t\t<slot></slot>\n </section>\n "}),Vue.component("mando-foro",{props:["id","app"],template:'\n <section :class="\'forum-controls \' + id">\n <template v-if="app === \'true\'">\n <ul class="left no-style page-buttons">\n <slot name="controls"></slot>\n </ul>\n <div class="right page-pagination">\n <slot name="pagination"></slot>\n </div>\n </template>\n <template v-else>\n <ul class="left no-style page-buttons"></ul>\n <div class="right page-pagination"></div>\n </template>\n </section>\n '}),Vue.component("paginacion-foro",{props:["page","total"],data:()=>({input:"",timeout:null}),computed:{value:{get(){return this.input},set(e){this.timeout&&clearTimeout(this.timeout),this.timeout=setTimeout(()=>{this.input=e,null===e.match(/[a-zA-Z]+/g)&&""!==e.trim()&&(e<1?this.$emit("setPage",1):e>this.total?this.$emit("setPage",this.total):this.$emit("setPage",e),this.$refs.refInput.blur(),this.input="",this.doScroll())},750)}}},methods:{doScroll(){document.querySelector("body.is-touch")&&window.scroll(0,document.querySelector(".wiki-content").querySelector(".is-content").querySelector("p:last-child").offsetTop-40)}},template:'\n <div class="pagination-manager">\n <div class="page-action" v-if="page > 1">\n <a href="javascript:{}" class="page-prev" title="Ir a la página anterior" @click="$emit(\'setPage\', page - 1); doScroll()">\n <i class="fas fa-chevron-left"></i>\n </a>\n </div>\n <div class="pagination-input" v-if="total > 1">\n <input type="text" :placeholder="page" v-model="value" ref="refInput">de {{ total }}\n </div>\n <div class="page-action" v-if="page < total">\n <a href="javascript:{}" class="page-next" title="Ir a la página anterior" @click="$emit(\'setPage\', page + 1); doScroll()">\n <i class="fas fa-chevron-right"></i>\n </a>\n </div>\n </div>\n '}),Vue.component("titulo-especial",{props:["title"],template:'\n <h3 class="is-tweakeable"><span class="is-measurable" v-html="title"></span></h3>\n '}),Vue.component("cuerpo-widget",{props:["class"],computed:{currentClass(){return void 0===this.class?"plank-inner":"plank-inner "+this.class}},template:'\n <div class="plank-content">\n <div :class="currentClass">\n <slot></slot>\n </div>\t\t\t\t\t\t \n </div>\n '}),Vue.component("separador-foro",{props:["faction"],data:()=>({image:forumDefaults.separator}),template:'\n <section class="forumseparator-element">\n <img :src="image" />\n </section>\n '}),Vue.component("tema-ref",{props:["info"],data:()=>({profileName:forumConfig.profileOptions.profileName||"perfil"}),computed:{userColor(){return"color: "+this.info.lastpost.who.color}},template:'\n <div class="ltopic-element">\n <a class="ltopic-last" :href="info.lastpost.url" target="_blank" :title="\'Ir al último mensaje del tema «\' + info.name + \'»\'">\n <i class="fas fa-link"></i>\n </a>\n <div class="ltopic-data">\n <a class="ltopic-title" :href="info.url" target="_blank" :title="\'Ir al tema «\' + info.name + \'»\'">{{ info.name }}</a>\n <small class="ltopic-info"><a :href="info.lastpost.who.url" target="_blank" :style="userColor" :title="\'Ir al \' + profileName + \' de «\' + info.lastpost.who.name + \'»\'">{{ info.lastpost.who.name | just-name }}</a>, {{ info.lastpost.date }} en <a :href="info.forum.url" target="_blank" :title="\'Ir al subforo «\' + info.forum.name + \'»\'">{{ info.forum.name }}</a></small>\n </div>\n </div>\n '}),Vue.component("campo-foro",{props:["name"],mounted(){const e=this.$el.parentElement.classList;e.add("field-element"),e.add("field-"+FNR.utility.genSlug(this.name,"-"))},template:'\n <div class="forum-field">\n <div class="field-name">{{ name | capitalize }}</div>\n <div class="field-content">\n <slot></slot>\n </div>\n </div>\n '}),Vue.component("boton-foro",{props:["url","name","icon","type","input"],computed:{realClass(){return"true"===this.input?"forum-button is-input":"forum-button"},realName(){return"text"+("no-name"===this.type?" is-hidden-touch":"")},realUrl(){return"true"===this.input?"javascript:{}":this.url}},mounted(){const e=this.$el.parentElement.classList;e.add("btn-element"),e.add("btn-"+FNR.utility.genSlug(this.name,"-"))},template:'\n <a :href="realUrl" targer="_blank" :class="realClass" :title="name">\n <span class="icon">\n <i :class="icon"></i>\n </span>\n <span :class="realName">{{ name }}</span>\n <span v-if="input === \'true\'" class="input-real">\n <slot name="input"></slot>\n </span>\n </a>\n '}),Vue.component("cargando-foro",{props:["text"],template:'\n <section id="loading-element">\n <div id="loading-content">\n <i class="fas fa-circle-notch fa-spin"></i>\n <span>{{ text }}</span>\n </div>\n </section>\n '}),Vue.component("aviso-foro",{template:' \n <div class="forum-infoblock">\n <h5>Antes de proceder recuerda:</h5>\n <slot></slot>\n </div>\n '}),Vue.component("afiliaciones-foro",{data:()=>({afis:{}}),created(){FNR.forum.getAffiliates().then(e=>{this.afis=e})},template:'\n <ul v-html="afis.normal" class="no-style"></ul>\n '}),Vue.component("controles-foro",{data:()=>({maPage:0,userName:_userdata.username,userLevel:_userdata.user_level,userId:_userdata.user_id,userLog:_userdata.session_logged_in,userMP:0,userOut:"",isActive:!1}),computed:{isActiveClass(){return"has-bg"+(this.isActive?" visible":" not-visible")}},methods:{turnActive(){this.isActive=!this.isActive}},created(){0!==this.userLog&&(null!==document.querySelector("#i_icon_mini_new_message")&&null!==document.querySelector("#i_icon_mini_new_message").title.match(/[0-255]/)&&(this.userMP=parseInt(document.querySelector("#i_icon_mini_new_message").title.match(/[0-255]/)[0])),this.userOut=document.querySelector("#logout").href)},template:'\n <div class="main-body">\n \t\t<nav id="forum-breadcrumb" class="breadcrumb has-succeeds-separator left" aria-label="breadcrumbs">\n \t<ul>\n \t<li>\n \t<a href="/" title="Ir a «Inicio»">Inicio</a>\n \t</li>\n \t</ul>\n \t</nav>\n <nav class="right"> \n <section id="forum-navbar-desktop" class="is-hidden-touch">\n <navbar-foro :username="userName" :userlevel="userLevel" :userid="userId" :userlog="userLog" :usermp="userMP" :userout="userOut" />\n </section>\n <section id="forum-navbar-mobile" class="is-hidden-desktop">\n <div id="hmg-button" @click="turnActive()" class="is-pointer">\n <i class="fas fa-bars"></i>\n </div>\n <div id="hmg-menu" :class="isActiveClass">\n <h3>{{ userName | just-name }}<i class="fas fa-times is-pointer" @click="turnActive()"></i></h3>\n <navbar-foro :username="userName" :userlevel="userLevel" :userid="userId" :userlog="userLog" :usermp="userMP" :userout="userOut" />\n </div>\n <div class="bg-active" @click="turnActive()"></div>\n </section>\n <section v-if="maPage === 1" id="multiaccount-transition">\n <cargando-foro text="Cambiando de cuenta…"></cargando-foro>\n </section>\n </nav>\n </div>\n '}),Vue.component("navbar-foro",{props:["username","userlevel","userid","userlog","usermp","userout"],data:()=>({profileName:forumConfig.profileOptions.profileName||"perfil",items:forumContent.navbar,navigation:forumContent.links,directions:forumConfig.usableDirections,multiAccount:{status:!1,position:-1,accounts:[]}}),computed:{isStatusClass(){return(1===this.userlog?"is-logged":"is-unlogged")+(1===this.userlevel?" is-admin":" is-user")},mpText(){return"Mensajería"+(0!==this.usermp?" ("+this.usermp+")":"")},links(){return this.navigation.filter(e=>void 0!==e.icon)}},methods:{changeAccount(){this.$parent.maPage=1,FNR.user.changeAccount(this.userout,this.multiAccount.accounts[this.multiAccount.position].name,this.multiAccount.accounts[this.multiAccount.position].password).then(e=>{e&&window.location.reload()})}},created(){this.multiAccount.status=!1!==FNR.cache.getData("usermultiaccounts")&&!1!==FNR.cache.getData("userpassword")&&FNR.cache.getData("usermultiaccounts").length>1,this.multiAccount.accounts=(!1===FNR.cache.getData("usermultiaccounts")?[]:FNR.cache.getData("usermultiaccounts").map(e=>({name:e.name,password:sjcl.decrypt(FNR.cache.getData("userpassword"),e.password)}))).filter(e=>e.name!==_userdata.username).sort((e,n)=>e.name<n.name?-1:e.name>n.name?1:0)},template:'\n <ul :class="isStatusClass">\n <template v-if="!userlog">\n <li class="navbar-item">\n <a href="/register" title="Registrarse en el foro">\n <div class="icon">\n <i class="fas fa-user-plus"></i>\n </div>\n <div class="text">Registrarse</div>\n </a>\n </li>\n <li class="navbar-item">\n <a href="/login" title="Iniciar sesión en el foro">\n <div class="icon">\n <i class="fas fa-sign-in-alt"></i>\n </div>\n <div class="text">Conectarse</div>\n </a>\n </li>\n </template>\n <template v-else>\n <li class="navbar-item is-hidden-desktop" v-for="link in links">\n <a :href="link.url" :title="\'Ir a «\' + link.name + \'»\'">\n <div class="icon">\n <i :class="link.icon"></i>\n </div>\n <div class="text">{{ link.name }}</div>\n </a>\n </li>\n <li class="navbar-item" v-for="item in items">\n <a :href="item.url" :title="\'Ir a «\' + item.name + \'»\'">\n <div class="icon">\n <i :class="item.icon"></i>\n </div>\n <div class="text">{{ item.name }}</div>\n </a>\n </li>\n <li class="navbar-item">\n <a href="/privmsg?folder=inbox" title="Ir a tu mensajería privada">\n <div class="icon">\n <i class="fas fa-envelope"></i>\n </div>\n <div class="text">{{ mpText }}</div>\n </a>\n </li>\n <li class="navbar-item has-dropdown is-dropeable has-bg">\n <a class="navbar-link is-pointer" title="Accionar menú de usuario">\n <div class="icon">\n <i class="fas fa-user"></i>\n </div>\n <div class="text">{{ username | just-name }}</div>\n </a>\n <div class="navbar-dropdown is-right">\n <template v-if="userlevel === 1">\n <a class="navbar-item" href="/admin" target="_blank" title="Ir al «Panel de Administrador»">\n <div class="icon">\n <i class="fas fa-cogs"></i>\n </div>\n <div class="text">Panel Administrador</div>\n </a>\n </template>\n <a class="navbar-item" :href="directions.ucp" target="_blank" title="Ir al «Panel de Usuario»">\n <div class="icon">\n <i class="fas fa-sliders-h"></i>\n </div>\n <div class="text">Panel Usuario</div>\n </a>\n <a class="navbar-item" :href="\'/u\' + userid" :title="\'Ir a tu \' + profileName">\n <div class="icon">\n <i class="far fa-id-card"></i>\n </div>\n <div class="text">{{ profileName | capitalize }}</div>\n </a>\n <a class="navbar-item" href="/search?search_id=egosearch" title="Ir a tus temas personales">\n <div class="icon">\n <i class="fas fa-archive"></i>\n </div>\n <div class="text">Temas personales</div>\n </a>\n <a class="navbar-item" :href="userout" title="Cerrar sesión">\n <div class="icon">\n <i class="fas fa-sign-out-alt"></i>\n </div>\n <div class="text">Cerrar sesión</div>\n </a>\n <template v-if="multiAccount.status">\n <hr/>\n <div title="Cambiar de cuenta" class="select-container">\n <select v-model="multiAccount.position" @change="changeAccount()" @click="$event.stopPropagation()">\n <option value="-1" hidden selected>Selec. personaje</option>\n <option v-for="(account, index) in multiAccount.accounts" :value="index">{{ account.name }}</option>\n </select>\n </div>\n </template>\n </div>\n </li>\n </template>\n </ul>\n '}),Vue.component("links-ayuda",{data:()=>({links:forumContent.links}),template:'\n <div class="columns is-multiline is-gapless is-vcentered">\n <a target="_blank" :href="link.url" :title="\'Ir a «\' + link.name + \'»\'" class="column" v-for="link in links">{{ link.name }}</a>\n </div>\n '}),Vue.component("links-anuncios",{data:()=>({announcements:forumContent.announcements}),template:'\n <div id="anmt-main">\n <template v-for="(announcement, index) in announcements">\n <a target="_blank" :href="announcement.url" :title="\'Ir al anuncio «\' + announcement.name + \'»\'" class="anmt-element"><span class="anmt-title">{{ announcement.name }}</span><span class="anmt-date">{{ announcement.date }}</span></a>\n <div class="anmt-sep" v-if="(announcements.length - 1) !== index"></div>\n </template>\n </div>\n '}),Vue.component("links-staff",{data:()=>({staff:forumContent.staff}),template:'\n <div id="admin-main">\n <a target="_blank" :href="admin.url" class="admin-element" :style="\'background-image: url(\' + admin.avatar + \')\'" :title="admin.title" v-for="admin in staff"><span class="admin-name">{{ admin.name }}</span><span class="admin-desc">{{ admin.desc }}</span></a>\n </div>\n '}),Vue.component("sabias-que",{data:()=>({content:forumContent.sq[Math.floor(Math.random()*forumContent.sq.length)]}),created(){setInterval(()=>{this.content=forumContent.sq[Math.floor(Math.random()*forumContent.sq.length)]},12e3)},template:'\n <img id="sq-img" :src="content" alt="¿Sabías que?" />\n '}),Vue.component("busquedas",{data:()=>({content:forumContent.searches[Math.floor(Math.random()*forumContent.searches.length)]}),created(){setInterval(()=>{this.content=forumContent.searches[Math.floor(Math.random()*forumContent.searches.length)]},16e3)},template:'\n <a id="search-img" :href="content.url" target="_blank" :title="content.desc">\n <img :src="content.img" alt="Búsqueda" />\n </a>\n '}),Vue.component("note-info",{template:'\n <div class="admin-block admin-note">\n <div class="admin-icon fas fa-caret-right"></div>\n <div class="admin-content admin-title">\n <slot></slot>\n </div>\n </div>\n '}),Vue.component("redirect",{props:["to"],computed:{currentStatus:()=>!!window.location.pathname.match(/t(\d+)-/)},created(){this.currentStatus&&window.location.replace(this.to)},template:'\n <div class="is-content">\n <template v-if="!currentStatus">\n <p>No hay mensaje.</p>\n </template>\n </div>\n '}),Vue.component("quote",{props:["from"],template:'\n <div class="admin-block admin-box user-coolquote">\n <div class="coolquote-quote">\n <div class="fas fa-quote-left"></div>\n <div class="coolquote-content">\n <slot></slot>\n </div>\n <div class="fas fa-quote-right"></div>\n </div>\n <div class="coolquote-from">{{ from }}</div>\n </div>\n '}),Vue.component("wiki-index-items-d",{props:["content"],template:'\n <ul>\n <li v-for="content in content">\n <div class="wiki-controls">\n <router-link :to="content.id" v-if="!content.children.length" :title="\'Ir al artículo de «\' + content.name + \'»\'">{{ content.name }}</router-link>\n <a class="wiki-cascade" :title="\'Desplegar categoría de «\' + content.name + \'»\'" v-else>\n <span class="text">{{ content.name }}</span>\n <span class="icon">\n <i class="fas fa-plus"></i>\n <i class="fas fa-minus"></i>\n </span>\n </a>\n </div>\n <wiki-index-items-d v-if="content.children.length" :content="content.children"></wiki-index-items-d>\n </li>\n </ul>\n '}),Vue.component("wiki-index",{computed:{indexContent(){const e=t=>n.filter(e=>e.component.page_parent===t).map(n=>({id:n.path,name:n.component.page_name,children:e(n.component.page_name)})),n=routes.filter(e=>void 0!==e.component).filter(e=>!e.component.page_skip);return n.filter(e=>void 0===e.component.page_parent).map(n=>({id:n.path,name:n.component.page_name,children:e(n.component.page_name)}))}},template:'\n <aside class="wiki-index is-content profile-sticky">\n <div class="is-hidden-touch">\n <h3>Contenido</h3>\n <wiki-index-items-d :content="indexContent"></wiki-index-items-d>\n </div>\n <div class="select-container is-hidden-desktop">\n <select>\n <option value="-1" hidden selected>Contenido</option>\n <template v-for="content in indexContent">\n <template v-if="content.children.length">\n <option :value="content.id" disabled >— {{ content.name }}</option>\n <template v-for="content in content.children">\n <template v-if="content.children.length">\n <option :value="content.id" disabled >&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n <template v-for="content in content.children">\n <template v-if="content.children.length">\n <option :value="content.id" disabled >&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n <template v-for="content in content.children">\n <template v-if="content.children.length">\n <option :value="content.id" disabled >&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n <template v-for="content in content.children">\n <option :value="content.id">&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n </template>\n </template>\n <option :value="content.id" v-else >&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n </template>\n </template>\n <option :value="content.id" v-else >&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n </template>\n </template>\n <option :value="content.id" v-else >&nbsp&nbsp&nbsp&nbsp— {{ content.name }}</option>\n </template>\n </template>\n <option :value="content.id" v-else >— {{ content.name }}</option>\n </template>\n </select>\n </div>\n </aside>\n '}),Vue.component("wiki-contenido",{props:["mode"],template:'\n <div class="wiki-body has-small-topiclist">\n <wiki-index></wiki-index>\n <template v-if="mode === \'app\'">\n <slot></slot>\n </template>\n <template v-else>\n <section class="wiki-content is-dramatic">\n <slot></slot>\n </section>\n </template>\n </div>\n '}),Vue.component("wiki-nav",{computed:{more:()=>routes.filter(e=>e.component).filter(e=>e.component.page_parent===routes.filter(e=>e.path===router.history.current.path)[0].component.page_parent).length>1,nav(){const e=routes.filter(e=>e.component).filter(e=>e.component.page_parent===routes.filter(e=>e.path===router.history.current.path)[0].component.page_parent),n=e.map(e=>e.path).indexOf(router.history.current.path);return{next:!(n+1>=e.length)&&e[n+1],prev:!(n-1<0)&&e[n-1]}}},template:'\n <div class="wiki-nav" v-if="more">\n <h2>Navegación</h2>\n <template v-if="nav.prev !== false">* <router-link :to="nav.prev.path" :title="\'Ir al artículo «\' + nav.prev.component.page_name + \'»\'">Página anterior: {{ nav.prev.component.page_name }}</router-link></template>\n <br v-if="nav.prev !== false && nav.next !== false"/>\n <template v-if="nav.next !== false">* <router-link :to="nav.next.path" :title="\'Ir al artículo «\' + nav.next.component.page_name + \'»\'">Página siguiente: {{ nav.next.component.page_name }}</router-link></template>\n </div>\n '}),Vue.component("wiki-children",{props:["name","category"],computed:{nav(){return routes.filter(e=>e.component).filter(e=>e.component.page_parent===this.category)}},template:'\n <div class="wiki-nav" v-if="nav.length > 0">\n <h2>{{ name }}</h2>\n <template v-for="route in nav">* <router-link :to="route.path" :title="\'Ir al artículo «\' + route.component.page_name + \'»\'">{{ route.component.page_name }}</router-link><br/></template>\n </div>\n '}),Vue.component("modal-foro",{props:["title"],methods:{modalClose(){this.$parent.state.modal=!1,this.$emit("modal-close")}},template:' \n <div id="forum-modal">\n <div class="modal-element">\n <div class="modal-title">\n <h3>{{ title }}</h3>\n <a @click="modalClose()">\n <i class="fas fa-times"></i>\n </a>\n </div>\n <div class="modal-content">\n <div class="is-content">\n <slot name="content"></slot>\n </div>\n <slot name="controls"></slot>\n </div>\n </div>\n <div class="is-bgmodal bg-active" @click="modalClose()"></div>\n </div>\n '}),Vue.component("controles-modal",{template:' \n <div class="modal-buttons">\n <slot></slot>\n </div>\n '}),Vue.component("expediente-usuario",{data:()=>({info:{name:_userdata.username,level:_userdata.user_level,log:_userdata.session_logged_in},config:forumConfig.profileUser,profile:profile}),computed:{userRank(){return this.profile.fields[forumConfig.profileOptions.profileRank].content},userCite(){return this.profile.fields[forumConfig.profileOptions.profileCite].content},userCover(){return this.profile.fields[forumConfig.profileOptions.profileCover].content},usableMiniFields(){return void 0!==this.config.miniFields&&this.config.miniFields.length?Object.entries(this.profile.fields).filter(e=>this.config.miniFields.indexOf(e[0])>-1).map(e=>({id:e[0],title:e[1].label,content:e[1].content})).sort((e,n)=>this.config.miniFields.indexOf(e.id)>this.config.miniFields.indexOf(n.id)?1:-1).map(e=>({id:FNR.utility.genSlug(e.title,"-"),title:e.title,content:e.content})):[]},usableBigFields(){return void 0!==this.config.mainFields&&Object.keys(this.config.mainFields).length?Object.entries(this.profile.fields).filter(e=>Object.keys(this.config.mainFields).indexOf(e[0])>-1).map(e=>({id:e[0],title:e[1].label,subtitle:this.config.mainFields[e[0]],content:" &nbsp;-"===e[1].content?"":e[1].content})).sort((e,n)=>Object.keys(this.config.mainFields).indexOf(e.id)>Object.keys(this.config.mainFields).indexOf(n.id)?1:-1).map(e=>({id:FNR.utility.genSlug(e.title,"-"),title:e.title,subtitle:e.subtitle,content:e.content})):[]},lengthBigFields(){let e=0;return this.usableBigFields.map(n=>{void 0!==n.content&&(e+=n.content.length)}),e},usableExtraFields(){return void 0!==this.config.extraFields&&this.config.extraFields.length?Object.entries(this.profile.fields).filter(e=>this.config.extraFields.indexOf(e[0])>-1).map(e=>({id:e[0],title:e[1].label,content:" &nbsp;-"===e[1].content?"":e[1].content})).sort((e,n)=>this.config.extraFields.indexOf(e.id)>this.config.extraFields.indexOf(n.id)?1:-1).map(e=>({id:FNR.utility.genSlug(e.title,"-"),title:e.title,content:e.content})):[]},lengthExtraFields(){let e=0;return this.usableExtraFields.map(n=>{void 0!==n.content&&(e+=n.content.length)}),e},usableLinkFields(){return this.profile.contact.length?[]:Object.entries(this.profile.contact).filter(e=>"Mensaje Privado"!==e[1].label).map(e=>({id:FNR.utility.genSlug(e[1].label,"-"),title:e[1].label,url:e[1].content,icon:this.config.contactFields[e[0]],desc:"Ir a "+e[1].label+" de «"+this.profile.name+"»"}))},chronologyField(){return void 0!==this.config.cronoField&&this.config.cronoField.length?FNR.utility.genArray(this.profile.fields[FNR.utility.genSlug(this.config.cronoField,"_")].content):[]},relationshipsField(){return void 0!==this.config.relaField&&this.config.relaField.length?FNR.utility.genArray(this.profile.fields[FNR.utility.genSlug(this.config.relaField,"_")].content):[]},lengthHistoryFields(){let e=0;return e+=this.chronologyField.length,e+=this.relationshipsField.length,e},currentClass(){return"usergroup-"+this.profile.colour}},computed(){FNR.user.getProfile(window.location.href.split("/u")[1])},
2
2
  template:' \n <section class="profile-element"> \n <cabespecial-foro><template slot="title">Perfil de {{ profile.name }}</template></cabespecial-foro>\n <section :class="currentClass">\n <section id="profile-head">\n <div id="profile-userside">\n <div id="profile-minifields" class="profile-container is-align-items-flex-start wiki-index is-content has-text-left" v-if="lengthBigFields">\n <h3>Contenido</h3>\n <ul>\n <li v-if="lengthBigFields">\n <div class="wiki-controls">\n <a href="#anchor-info">Información</a>\n </div>\n </li>\n <li v-if="lengthExtraFields">\n <div class="wiki-controls">\n <a href="#anchor-extras">Extras</a>\n </div>\n </li>\n <li v-if="lengthHistoryFields">\n <div class="wiki-controls">\n <a href="#anchor-history">Historial</a>\n </div>\n </li>\n </ul>\n </div>\n <ul id="profile-minifields" class="profile-container is-align-items-center wiki-index is-content" v-else>\n <li :id="\'profile-minifield-\' + field.id" v-for="field in usableMiniFields" class="minifield-element">\n <span class="minifield-label">{{ field.title }}</span>\n <span class="minifield-content">{{ field.content }}</span>\n </li>\n </ul>\n </div>\n <div id="profile-userinfo" :style="\'background-image: url(\' + userCover + \');\'">\n <div id="profile-userdata">\n <div id="profile-rank">{{ userRank }}</div>\n <div id="profile-username">{{ profile.name }}</div>\n </div>\n <div id="profile-usergest" v-if="Object.keys(profile.admin).length">\n <a :href="profile.admin.admin" :title="\'Administrar a «\' + profile.name + \'»\'" target="_blank">Administrar</a> / <a :href="profile.admin.ban" :title="\'Banear a «\' + profile.name + \'»\'" target="_blank">Banear</a>\n </div>\n </div>\n </section>\n <section id="profile-subhead">\n <div class="columns is-centered is-vcentered is-gapless">\n <div class="column is-6 is-full-mobile">\n <div id="profile-quote" class="is-content">\n <quote>{{ userCite }}</quote>\n </div>\n </div>\n <div class="column is-5 is-full-mobile">\n <div id="profile-links" class="columns is-flex is-vcentered is-multiline py-4">\n <div class="column is-full-touch is-half-desktop">\n <ul class="profile-linklist">\n <li>\n <a :href="profile.links.posts" :title="\'Mensajes de «\' + profile.name + \'»\'" target="_blank">\n <i :class="config.contactFields.mensajes"></i> Mensajes\n </a>\n </li>\n <li>\n <a :href="profile.links.topics" :title="\'Temas de «\' + profile.name + \'»\'" target="_blank">\n <i :class="config.contactFields.temas"></i> Temas\n </a>\n </li>\n <li v-if="profile.contact.mensaje_privado !== undefined">\n <a :href="profile.contact.mensaje_privado.content" :title="\'Enviar un mensaje privado a «\' + profile.name + \'»\'" target="_blank">\n <i :class="config.contactFields.mp"></i> Mensaje Privado\n </a>\n </li>\n </ul>\n </div>\n <div class="column is-full-touch is-half-desktop">\n <ul class="profile-linklist">\n <li :id="\'profile-link-\' + field.id" v-for="field in usableLinkFields">\n <a :href="field.url" :title="field.desc" target="_blank">\n <i :class="field.icon"></i> {{ field.title }}\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n </section>\n <section id="profile-fields" class="profile-container is-relative" v-if="lengthBigFields">\n <a id="anchor-info" class="page-anchor"></a>\n <aside id="profile-infominifields" class="wiki-index profile-sticky">\n <h3>Datos básicos</h3>\n <ul class="p-0">\n <li :id="\'profile-minifield-\' + field.id" v-for="field in usableMiniFields" class="minifield-element">\n <span class="minifield-label">{{ field.title }}</span>\n <span class="minifield-content">{{ field.content }}</span>\n </li>\n </ul>\n </aside>\n <ul id="profile-infofields">\n <li :id="\'profile-field-\' + field.id" class="profilefield-element" v-for="field in usableBigFields" v-if="field.content.length">\n <div class="field-head">\n <h4>{{ field.title }}</h4>\n <h6>{{ field.subtitle }}</h6>\n </div>\n <div class="field-content is-content" v-html="field.content"></div>\n </li>\n </ul>\n </section>\n <section id="profile-extras" class="profile-extra is-relative" v-if="lengthExtraFields">\n <a id="anchor-extras" class="page-anchor"></a>\n <div class="profile-extra-header">\n <span>Extras</span>\n </div>\n <ul class="profile-container profile-extra-space">\n <li :id="\'profile-extrafield-\' + field.id" class="extrafield-element" v-for="field in usableExtraFields" v-if="field.content.length">\n <div class="extrafield-head">\n <h4>{{ field.title }}</h4>\n </div>\n <div class="extrafield-content is-content" v-html="field.content"></div>\n </li>\n </ul>\n </section>\n <section id="profile-history" class="profile-extra is-relative" v-if="lengthHistoryFields">\n <a id="anchor-history" class="page-anchor"></a>\n <div class="profile-extra-header">\n <span>Historial</span>\n </div>\n <ul class="profile-container profile-extra-space">\n <li id="profile-extrafield-chronology" class="extrafield-element" v-if="chronologyField.length">\n <div class="extrafield-head">\n <h4>Cronología</h4>\n </div>\n <ul id="chronology-element" class="is-two-columns-list">\n <template v-for="element in chronologyField">\n <elemento-cronologia :element="element" type="profile" />\n </template>\n </ul>\n </li>\n <li id="profile-extrafield-relationships" class="extrafield-element" v-if="relationshipsField.length">\n <div class="extrafield-head">\n <h4>Relaciones</h4>\n </div>\n <ul id="relationships-element" class="is-two-columns-list">\n <template v-for="element in relationshipsField">\n <elemento-relaciones :element="element" type="profile" />\n </template>\n </ul>\n </li>\n </ul>\n </section>\n </section>\n </section>\n '}),Vue.component("cuerpo-principal",{props:["title"],computed:{realTitle(){return void 0!==this.title?this.title:void 0!==this.$attrs["data-title"]?this.$attrs["data-title"]:""}},template:' \n <div class="main-slat">\n <div class="mainslat-title" v-if="realTitle.length">{{ realTitle }}</div>\n <div class="mainslat-content">\n <slot></slot>\n </div>\n </div>\n '}),Vue.component("cuerpo-interior",{props:["title"],computed:{realTitle(){return void 0!==this.title?this.title:void 0!==this.$attrs["data-title"]?this.$attrs["data-title"]:""}},template:' \n <div class="slat-interior">\n <div class="slatinterior-title" v-if="realTitle.length">{{ realTitle }}</div>\n <div class="slatinterior-content">\n <slot></slot>\n </div>\n </div>\n '}),Vue.component("cuerpo-lista",{props:["title"],computed:{realTitle(){return void 0!==this.title?this.title:void 0!==this.$attrs["data-title"]?this.$attrs["data-title"]:""}},template:' \n <div class="slat-list">\n <div class="slatlist-title" v-if="realTitle.length">{{ realTitle }}</div>\n <ol class="slatlist-content">\n <slot></slot>\n </ol>\n </div>\n '});
@@ -281,11 +281,16 @@ const FNR = {
281
281
  user: {
282
282
  getUrl: (name) => {
283
283
  let character =
284
- name !== undefined ? encodeURIComponent(name)
285
- .replace(/[!'()]/g, escape)
286
- .replace(/\*/g, "%2A") :
284
+ name !== undefined ?
285
+ Object.keys(window.localStorage).filter(key => key.indexOf('userInfo') > -1 && window.localStorage[key].indexOf(`"name":"${name}"`) > -1).join().replace(`${forumData.prefix}_userInfo`, '') :
287
286
  _userdata.user_id;
288
287
 
288
+ if (character.length === 0) {
289
+ character = encodeURIComponent(name).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
290
+ }
291
+
292
+ Object.keys(window.localStorage).filter(key => key.indexOf('userInfo') > -1 && window.localStorage[key].indexOf(`"name":"${name}"`) > -1).join().replace(`${forumData.prefix}_userInfo`, '');
293
+
289
294
  return "/profile?mode=viewprofile&u=" + character;
290
295
  },
291
296
  getLevel: async () => {
@@ -1 +1 @@
1
- const FNR = { execFn: e => { document.addEventListener("forumReady", e, !1) }, forum: { getColors: () => Object.values(forumColours).map(e => ({ name: e.code, hex: e.hex })), getTopics: async (e, t) => { const n = e => { const t = $(e).find(".topictitle"), n = $(e).children().last(); i.push({ name: t.text().trim(), url: Vue.filter("url-to-normal")(t.attr("href")), lastpost: { url: Vue.filter("url-to-normal")(n.children().last().attr("href")), date: n.text().split("por")[0].trim(), who: { name: n.find("strong a").length ? n.find("strong a").text().trim() : "Invitado", url: Vue.filter("url-to-normal")(n.find("strong a").length ? n.find("strong a").attr("href") : "/"), color: n.find("strong a").length ? n.find("strong a span").attr("style").split("color:")[1] : "initial" } }, forum: { name: $(e).find(".row2 + .row2:not(.centered) a").text().trim(), url: Vue.filter("url-to-normal")($(e).find(".row2 + .row2:not(.centered) a").attr("href")) } }) }, r = async a => { $.get(a, a => ($(a).find(".ipbform").find("tbody").find("tr").each(function () { i.length < t && -1 === e.indexOf(parseInt($(this).find(".row2 + .row2:not(.centered) a").attr("href").split("/f")[1].split("-")[0])) && n(this) }), i.length !== t && $(a).find(".pagination")[0].children.length && "b" !== $(a).find(".pagination").children().last()[0].localName ? r($(a).find(".pagination").children().last().attr("href")) : i)) }; await r("/latest?change_version=invision"); let i = []; return i }, getMembers: e => new Promise((t, n) => { let r = []; const i = (e, t) => ({ user: $(e).find(".membername span").text().trim(), id: $(e).find(".popupmenu .popupmenu-item a").attr("href").split("?")[0], img: $(e).find(".mini-avatar img").attr("src"), color: t }), a = t => { let n = []; return $(t).find(".member-list .member").each(function () { const t = FNR.utility.getGroup($(this).find(".membername span").attr("style").split("color:")[1]); e ? n.push(i(this, t)) : "unknown" !== t && t !== forumConfig.skinOptions.adminGroup && n.push(i(this, t)) }), n }, o = e => { $.get(e, e => { const n = $(e).find('.pagination img[alt="Siguiente"]').parent().attr("href") || !1; r = r.concat(a(e)), n ? o(n) : t(r.sort((e, t) => e.user < t.user ? -1 : e.user > t.user ? 1 : 0)) }) }; o("/memberlist?change_version=invision") }), getGroups: e => { const t = () => new Promise((e, t) => { $.get("/groups?change_version=invision", t => { let n = []; $(t).find(".group_list > li").each(function () { n.push({ id: parseInt($(this).find("a").attr("href").split("/g")[1].split("-")[0]), name: $(this).find("a").text().trim(), color: $(this).find("a").css("color"), url: Vue.filter("url-to-normal")($(this).find("a").attr("href")), count: parseInt($(this).find("div > span").text()) - 1 }) }), e(n) }) }), n = () => new Promise((n, r) => { FNR.cache.useData("groups", e).then(e => { n(e) }, e => { t().then(e => { FNR.cache.setData("groups", e), n(e) }) }) }); return n() }, getAffiliates: () => new Promise((e, t) => { const n = forumConfig.affiliatesMax, r = Object.entries(forumAffiliates).map(e => { let t = ""; e[1].forEach(e => { t += '<li><a href="' + e.url + '" title="' + e.title + '" target="_blank"><img src="' + e.img + '" alt="' + e.title + '"/></a></li>' }); for (let r = 0; r < n[e[0]] - e[1].length; r++)t += '<li><a href="/" title="' + forumData.name + '"><img src="' + forumDefaults.affiliates[e[0]] + '" alt="' + forumData.name + '"/></a></li>'; return t }); e({ normal: r[0], elite: r[1], directory: r[2], sister: r[3] }) }) }, content: { isAutosave: () => void 0 !== document.post && (-1 !== _userdata.user_id && "reply" === document.post.mode.value && void 0 !== document.post.t), post: { getPost: e => new Promise((t, n) => { $.get(Vue.filter("url-to-invision")(e), n => { const r = $(n).find("#p" + e.split("#")[1]); t({ author: { text: r.find(".author a").text(), color: r.find(".author a span").css("color"), url: Vue.filter("url-to-normal")(r.find(".author a").attr("href")) }, content: r.find(".post-entry > div").html(), date: r.find(".author").html().split("</a>")[1] }) }) }), genPost: (e, t) => new Promise((n, r) => { let i = document.createElement("iframe"); i.id = "forum-save", i.src = "/post?t=" + e + "&mode=reply&change_version=invision", i.width = 0, i.height = 0, i.onload = (() => { a.onload = (() => { $("#forum-save").remove(), console.clear(), n(!0) }), $("#forum-save").contents().find('.subtitle:contains("Mensaje")').next().find("textarea").val(t), $("#forum-save").contents().find('.formbuttonrow.center input[value="Enviar"]').click() }), document.querySelector("body").prepend(i); const a = document.getElementById("forum-save") }) }, topic: { getType: e => { const t = []; return e.indexOf("unread") > -1 ? t.push("is-unread") : t.push("is-read"), e.indexOf("locked") > -1 ? t.push("is-closed") : e.indexOf("sticky") > 1 ? t.push("is-sticky") : e.indexOf("global_announce") > 1 ? t.push("is-global-announcement") : e.indexOf("announce") > 1 && t.push("is-announcement"), t }, genTopic: (e, t, n) => new Promise((r, i) => { let a = document.createElement("iframe"); a.id = "forum-save", a.src = "/post?f=" + e + "&mode=newtopic&change_version=invision", a.width = 0, a.height = 0, a.onload = (() => { o.onload = (() => { $("#forum-save").remove(), console.clear(), r(!0) }), $("#forum-save").contents().find('dl dt:contains("Título del tema")').parent().find("input").val(t), $("#forum-save").contents().find('.subtitle:contains("Mensaje")').next().find("textarea").val(n), $("#forum-save").contents().find('.formbuttonrow.center input[value="Enviar"]').click() }), document.querySelector("body").prepend(a); const o = document.getElementById("forum-save") }) } }, user: { getUrl: e => { let t = void 0 !== e ? encodeURIComponent(e).replace(/[!'()]/g, escape).replace(/\*/g, "%2A") : _userdata.user_id; return "/profile?mode=viewprofile&u=" + t }, getLevel: async () => { switch (_userdata.user_level) { case 2: return "mod"; case 1: return "admin"; case 0: return -1 == _userdata.user_id ? "guest" : "user" } }, getGroup: async () => { const e = await FNR.user.getLevel(); if ("guest" === e) return "unknown"; const { colour: t } = await FNR.user.getProfile(_userdata.user_id, .25); return t }, getProfile: (e, t) => { const n = null != e ? FNR.user.getUrl(e) : FNR.user.getUrl(), r = t || 5, i = e => e.find("a").length ? Vue.filter("url-to-normal")(e.find("a").attr("href")) : e.find("table").length ? e.find("table").html() : e.find("img").length ? e.find("img").attr("src") : e.find("textarea").length ? e.find("textarea").val() : e.find("span").length ? e.find("span").text().trim() : "-" === e.text().trim() ? "" : e.text(), a = () => new Promise((e, t) => { $.get(n + "&change_version=invision", t => { let r = {}; r.name = $(t).find(".maintitle h1 span").text(), r.lastvisit = $(t).find('dt:contains("Última visita")').parent().find("dd").text(), r.colour = FNR.utility.getGroup($(t).find(".maintitle h1 span").css("color").replace("rgb(", "rgb_").replace(/, /g, "_").replace(")", "")), r.avatar = $(t).find(".real_avatar img").attr("src"), r.links = { profile: "/u" + n.split("&u=")[1], mp: "/privmsg?mode=post&u=" + n.split("&u=")[1] }, r.messages = { public: parseInt($(t).find('span:contains("Mensajes")').parent().parent().find("dd > div").text()) || 0, private: parseInt($(t).find('dt:contains("Mensajes privados")').parent().find("dd").text()) || 0 }, r.fields = {}, $(t).find('dl[id^="field_id"]').each(function () { if ("" !== $(this).find("dt span").text()) { if ("Mensajes" === $(this).find("dt span").text()) return; r.fields[FNR.utility.genSlug($(this).find("dt span").text())] = { name: $(this).find("dt span").text(), content: i($(this).find("dd .field_uneditable")) } } }), $(t).find(".ipbform2 > dl").each(function () { if ($(this).find("dt span").length && "" !== $(this).find("dt span").text()) { if ("Mensajes" === $(this).find("dt span").text()) return; r.fields[FNR.utility.genSlug($(this).find("dt span").text())] = { name: $(this).find("dt span").text(), content: i($(this).find("dd")) } } }), r.fields.rango = { name: "Rango", content: $(t).find('dt:contains("Rango:")').parent().find("dd").text() }, e(r) }) }), o = e => { const t = `userInfo${e}`; return new Promise((e, n) => { FNR.cache.useData(t, r).then(t => { e(t) }, n => { a().then(n => { FNR.cache.setData(t, n), e(n) }) }) }) }; return o(e) }, changeAccount: async (e, t, n) => { try { return await fetch(e), await fetch("/login", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: `username=${encodeURIComponent(t)}&password=${encodeURIComponent(n)}&autologin=1&login=1` }), !0 } catch (e) { return console.error("Error inesperado", e), !1 } }, followed: { getPages: async () => { try { const e = await fetch("/search?search_id=watchsearch&change_version=invision"), t = await e.text(), n = document.createElement("html"); n.innerHTML = t; const r = n.querySelectorAll(".pagination a"); let i = []; if (r.length) { const e = r[r.length - 2], t = e.href.split(e.origin)[1], n = t.match(/[0-9]/g) || [], a = parseInt(n.join("")) || 0, o = r[1], l = o.href.split(o.origin)[1], s = l.match(/[0-9]/g) || [], c = parseInt(s.join("")) || 0, d = void 0 === a ? 0 : a / c; i = Array(d).fill(null).map((e, t) => `/search?search_id=watchsearch&start=${c * (t + 1)}&change_version=invision`) } return { items: 1 === n.querySelectorAll(".ipbtable tbody tr td").length ? 0 : n.querySelectorAll(".ipbtable tbody tr").length, pages: ["/search?search_id=watchsearch&change_version=invision", ...i] } } catch (e) { return console.error("Error inesperado", e), !1 } }, getFollowed: async e => { try { const t = await fetch(e), n = await t.text(), r = document.createElement("html"); return r.innerHTML = n, Array.from(r.querySelectorAll(".ipbtable tbody tr")).map(e => { const t = e.children; return { id: parseInt(t[7].children[0].value), name: t[1].querySelector(".topictitle").textContent.trim(), url: Vue.filter("url-to-normal")(t[1].querySelector(".topictitle").href), views: parseInt(t[5].textContent), replies: parseInt(t[3].textContent), type: FNR.content.topic.getType(t[0].querySelector("img").src).join(" ") } }) } catch (e) { return console.error("Error inesperado", e), !1 } }, delFollowed: async e => { try { return await fetch("/search?search_id=watchsearch", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: `confirm=confirm${e.map(e => `&mark${encodeURIComponent("[]")}2=${e}`)}` }), !0 } catch (e) { return console.error("Error inesperado", e), !1 } } }, drafts: { delDrafts: async (e, t) => { try { const n = "draft" === e ? "draft" : "topic_draft"; return await fetch(`/search?search_id=${e}search`, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: `confirm=confirm${t.map(e => `&delete_${n}${encodeURIComponent(`[${e}]`)}=on`)}` }), !0 } catch (e) { return console.error("Error inesperado", e), !1 } }, messages: { getPages: async () => { try { const e = await fetch("/search?search_id=draftsearch&change_version=invision"), t = await e.text(), n = document.createElement("html"); n.innerHTML = t; const r = n.querySelectorAll(".pagination a"); let i = []; if (r.length) { const e = r[r.length - 2], t = e.href.split(e.origin)[1], n = t.match(/[0-9]/g) || [], a = parseInt(n.join("")) || 0, o = r[1], l = o.href.split(o.origin)[1], s = l.match(/[0-9]/g) || [], c = parseInt(s.join("")) || 0, d = void 0 === a ? 0 : a / c; i = Array(d).fill(null).map((e, t) => `/search?search_id=draftsearch&start=${c * (t + 1)}&change_version=invision`) } return { items: 1 === n.querySelectorAll(".ipbtable tbody tr td").length ? 0 : n.querySelectorAll(".ipbtable tbody tr").length, pages: ["/search?search_id=draftsearch&change_version=invision", ...i] } } catch (e) { return console.error("Error inesperado", e), !1 } }, getDrafts: async e => { try { const t = await fetch(e), n = await t.text(), r = document.createElement("html"); return r.innerHTML = n, Array.from(r.querySelectorAll(".ipbtable tbody tr")).map(e => { const t = e.children; return { topic: { name: t[1].textContent.trim(), url: Vue.filter("url-to-normal")(t[1].querySelector("a").href) }, info: { location: t[2].textContent.trim(), date: t[3].textContent.trim() }, modify: Vue.filter("url-to-normal")(t[4].querySelector("a").href) } }) } catch (e) { return console.error("Error inesperado", e), !1 } } }, topics: { getPages: async () => { try { const e = await fetch("/search?search_id=topicdraftsearch&change_version=invision"), t = await e.text(), n = document.createElement("html"); n.innerHTML = t; const r = n.querySelectorAll(".pagination a"); let i = []; if (r.length) { const e = r[r.length - 2], t = e.href.split(e.origin)[1], n = t.match(/[0-9]/g) || [], a = parseInt(n.join("")) || 0, o = r[1], l = o.href.split(o.origin)[1], s = l.match(/[0-9]/g) || [], c = parseInt(s.join("")) || 0, d = void 0 === a ? 0 : a / c; i = Array(d).fill(null).map((e, t) => `/search?search_id=topicdraftsearch&start=${c * (t + 1)}&change_version=invision`) } return { items: 1 === n.querySelectorAll(".ipbtable tbody tr td").length ? 0 : n.querySelectorAll(".ipbtable tbody tr").length, pages: ["/search?search_id=topicdraftsearch&change_version=invision", ...i] } } catch (e) { return console.error("Error inesperado", e), !1 } }, getDrafts: async e => { try { const t = await fetch(e), n = await t.text(), r = document.createElement("html"); return r.innerHTML = n, Array.from(r.querySelectorAll(".ipbtable tbody tr")).map(e => { const t = e.children; return { topic: { name: t[0].textContent.trim(), url: Vue.filter("url-to-normal")(t[0].querySelector("a").href) }, info: { location: t[1].textContent.trim(), date: t[2].textContent.trim() }, modify: Vue.filter("url-to-normal")(t[3].querySelector("a").href) } }) } catch (e) { return console.error("Error inesperado", e), !1 } } } }, profile: { getData: e => new Promise((t, n) => { $.get("/profile?change_version=invision&mode=editprofile", n => { const r = n; $.get("/profile?change_version=invision&mode=editprofile&page_profil=avatars", n => { const i = n; let a = [];[].forEach.call(e, e => { let t = "", n = []; switch (e.type) { case "input": t = $(r).find('dl:contains("' + e.name + '")').find("dd").find("input").val(); break; case "textarea": t = $(r).find('dl:contains("' + e.name + '")').find("dd").find("textarea").val(); break; case "select": t = $(r).find('dl:contains("' + e.name + '")').find("dd").find("select option:selected").attr("value"), $(r).find('dl:contains("' + e.name + '")').find("dd").find("select option").each(function () { "" !== $(this).attr("value") && n.push({ name: $(this).text(), value: $(this).attr("value") }) }); break; case "avatar": t = $(i).find(".box-content img").attr("src") }if ("select" === e.type && void 0 === t || "select" === e.type && "" === t) return; let o = { type: e.type, name: e.name, value: t }; e.validation && (o.validation = e.validation), n.length && (o.options = n), a.push(o) }), t(a) }) }) }), setData: e => new Promise((t, n) => { const r = () => { $("#forum-save").remove(), console.clear(), t(!0) }; let i = document.createElement("iframe"); i.id = "forum-save", i.src = "/profile?change_version=invision&mode=editprofile", i.width = 0, i.height = 0, i.onload = (() => { let t = !1;[].forEach.call(e, e => { switch (e.type) { case "input": $("#forum-save").contents().find('dl:contains("' + e.name + '")').find("dd").find("input").first().val(e.value); break; case "textarea": $("#forum-save").contents().find('dl:contains("' + e.name + '")').find("dd").find("textarea").val(e.value); break; case "select": $("#forum-save").contents().find('dl:contains("' + e.name + '")').find("dd").find('select option[value="' + e.value + '"]').attr("selected", "selected"); break; case "avatar": t = e.value } }), a.onload = (() => { t ? (a.onload = (() => { a.onload = (() => { r() }), $("#forum-save").contents().find('input[name="avatarremoteurl"]').val(t), $("#forum-save").contents().find('input[type="submit"][value="Registrar"]').click() }), a.src = "/profile?change_version=invision&mode=editprofile&page_profil=avatars") : r() }), $("#forum-save").contents().find('input[type="submit"][value="Registrar"]').click() }), document.querySelector("body").prepend(i); const a = document.getElementById("forum-save") }) } }, cache: { getData: e => null !== localStorage.getItem(forumData.prefix + "_" + e) && JSON.parse(localStorage.getItem(forumData.prefix + "_" + e)).content, setData: (e, t, n) => { let r = -1 === n ? "undefined" : (new Date).getTime(); localStorage.setItem(forumData.prefix + "_" + e, JSON.stringify({ cached_at: r, content: t })) }, delData: e => null !== localStorage.getItem(forumData.prefix + "_" + e) && localStorage.removeItem(forumData.prefix + "_" + e), useData: async (e, t) => { const n = localStorage.getItem(forumData.prefix + "_" + e), r = new Date, i = -1 == t ? "undefined" : 864e5 * t; return null != n && -1 == t || null != n && parseInt(JSON.parse(n).cached_at) + i > r.getTime() ? JSON.parse(n).content : Promise.reject(!1) } }, utility: { genSlug: (e, t) => { const n = e => { const t = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;"; e = e.trim().toLowerCase(); for (var n = 0, r = t.length; n < r; n++)e = e.replace(new RegExp(t.charAt(n), "g"), "aaaaeeeeiiiioooouuuunc------".charAt(n)); return e.replace(/[^a-z0-9 -]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-") }, r = t || "_"; return n(e).replace(/-/g, r) }, genArray: e => JSON.parse(e.replace(/`/g, '"')), genValidation: e => { let t = ""; return [].forEach.call(e, e => { switch (e.validation) { case "hex": e.value.match(/^#[a-f0-9]{6}$/i) || (t += "<li>El campo de " + e.name.toLowerCase() + " debe incluir un código de color hexadecimal.</li>"); break; case "img": e.value.match(/(jpg|jpeg|png)$/i) || (t += "<li>El campo de " + e.name.toLowerCase() + " debe ser el enlace a una imagen (formato png, jpg o jpeg).</li>") } }), t }, getGroup: e => { const t = e => { let t = "unknown"; return Object.values(forumColours).map(n => { n.hex === e.toLowerCase() && (t = FNR.utility.genSlug(n.code)) }), t }, n = e => { let t = "unknown"; return Object.values(forumColours).map(n => { n.id === e && (t = FNR.utility.genSlug(n.code)) }), t }; return void 0 === e ? "unknown" : e.indexOf("#") > -1 ? t(e) : e.indexOf("id_") > -1 ? n(parseFloat(e.split("_")[1])) : void 0 === forumColours[e] ? "unknown" : FNR.utility.genSlug(forumColours[e].code) } }, html: { genModal: (e, t, n) => { if ("" === e || null == e) return; if ("" === t || null == t) return; let r = document.createElement("div"); r.id = "forum-modal", document.body.appendChild(r); let i = ""; i += '<div id="' + FNR.utility.genSlug(e, "-") + '" class="modal-element">', i += '<div class="modal-title">', i += "<h3>" + e + "</h3>", i += '<a onclick="document.querySelector(`#forum-modal`).remove()">', i += '<i class="fas fa-times"></i>', i += "</a>", i += "</div>", i += '<div class="modal-content">', i += '<div class="is-content">', i += t.replace(/\n/g, "<br>"), i += "</div>", "" !== n && null != n && (i += '<div class="modal-buttons">', i += n, i += "</div>"), i += "</div>", i += "</div>", i += '<div class="is-bgmodal bg-active" onclick="document.querySelector(`#forum-modal`).remove()"></div>', document.getElementById("forum-modal").innerHTML = i }, genPrompt: (e, t, n, r) => { if ("" !== e && null != e && "" !== t && null != t) return new Promise((i, a) => { FNR.html.genModal(e, "<p>" + t + '</p><p><input id="modal-prompt" type="text" placeholder="' + n + '" value="' + r + '"></p>', '<button id="modal-button-enter" class="button1 btn-main">Confirmar</button><button id="modal-button-cancel" class="button1">Cancelar</button>'), document.querySelector("#modal-button-enter").onclick = (() => { const e = document.querySelector("#modal-prompt").value; i("" !== e && e), document.getElementById("forum-modal").remove() }), document.querySelector("#modal-button-cancel").onclick = (() => { a(!1), document.getElementById("forum-modal").remove() }), document.querySelector(".modal-title a").onclick = (() => { a(!1), document.getElementById("forum-modal").remove() }), document.querySelector(".is-bgmodal.bg-active").onclick = (() => { a(!1), document.getElementById("forum-modal").remove() }) }) }, genNotification: (e, t, n, r) => { if ("" === e || null == e) return; if ("" === t || null == t) return; if (t.length > 50) return; if ("" === n || null == n) return; document.querySelectorAll("forum-notification").length && (document.getElementById("forum-notification").remove(), clearTimeout()); let i = document.createElement("div"); i.id = "forum-notification", document.body.appendChild(i); let a = ""; a += "" === r || null == r ? '<div id="' + FNR.utility.genSlug(e, "-") + '" class="notification-element" onclick="document.querySelector(`#forum-notification`).classList.remove(`notification-show`)" >' : '<a href="' + r + '" target="_blank" id="' + FNR.utility.genSlug(e, "-") + '" class="notification-element" onclick="document.querySelector(`#forum-notification`).classList.remove(`notification-show`)" >', a += '<div class="notification-icon">', a += '<i class="' + n + '"></i>', a += "</div>", a += '<div class="notification-content">', a += "<h3>" + e + "</h3>", a += "<p>" + t + "</p>", a += "</div>", a += '<div class="notification-controls">', a += '<i class="fas fa-times"></i>', a += "</div>", a += "" === r || null == r ? "</div>" : "</a>", document.getElementById("forum-notification").innerHTML = a, setTimeout(() => { document.getElementById("forum-notification").classList.add("notification-show") }, 250), setTimeout(() => { document.getElementById("forum-notification").classList.remove("notification-show") }, 8e3), setTimeout(() => { document.getElementById("forum-notification").remove() }, 1e4) } }, behaviour: { genWiki: () => { document.querySelector(".wiki-cascade") && [].forEach.call(document.getElementsByClassName("wiki-cascade"), e => { e.onclick = (() => { const t = e.parentElement.parentElement; t.classList.contains("is-active") ? t.classList.remove("is-active") : t.classList.add("is-active") }) }), document.querySelector(".wiki-controls .router-link-active") && [].forEach.call(document.querySelectorAll(".wiki-controls .router-link-active"), e => { if (!e.parentElement.parentElement.parentElement.parentElement.parentElement.classList.contains("wiki-index")) { const t = (e, n) => { let r = e.parentElement.parentElement; n && (r = r.parentElement.parentElement), r.classList.add("is-active"), r.classList.add("is-selected"), r.parentElement.parentElement.parentElement.classList.contains("wiki-index") || t(r, !1) }; t(e, !0) } }), document.querySelector("aside.wiki-index > .select-container > select") && (document.querySelector("aside.wiki-index > .select-container > select").onchange = (() => { router.push(document.querySelector("aside.wiki-index > .select-container > select").value) })) }, genDropeable: () => { document.querySelector(".is-dropeable") && [].forEach.call(document.getElementsByClassName("is-dropeable"), e => { e.onclick = (() => { e.classList.contains("is-active") ? e.classList.remove("is-active") : ([].forEach.call(document.getElementsByClassName("is-dropeable"), e => { e.classList.remove("is-active") }), e.classList.add("is-active")) }) }) }, genControls: () => { document.querySelector(".forum-controls") && [].forEach.call(document.querySelectorAll(".forum-controls"), e => { let t = 0;[].forEach.call(e.children, e => { "none" !== window.getComputedStyle(e, null).display && (t += e.children.length) }), 0 === t && !1 === e.classList.contains("not-show") && e.classList.add("not-show") }) }, genDebounce: (e, t = 750) => { let n; return (...r) => { clearTimeout(n), n = setTimeout(() => { e.apply(this, r) }, t) } } } };
1
+ const FNR={execFn:e=>{document.addEventListener("forumReady",e,!1)},forum:{getColors:()=>Object.values(forumColours).map(e=>({name:e.code,hex:e.hex})),getTopics:async(e,t)=>{const n=e=>{const t=$(e).find(".topictitle"),n=$(e).children().last();o.push({name:t.text().trim(),url:Vue.filter("url-to-normal")(t.attr("href")),lastpost:{url:Vue.filter("url-to-normal")(n.children().last().attr("href")),date:n.text().split("por")[0].trim(),who:{name:n.find("strong a").length?n.find("strong a").text().trim():"Invitado",url:Vue.filter("url-to-normal")(n.find("strong a").length?n.find("strong a").attr("href"):"/"),color:n.find("strong a").length?n.find("strong a span").attr("style").split("color:")[1]:"initial"}},forum:{name:$(e).find(".row2 + .row2:not(.centered) a").text().trim(),url:Vue.filter("url-to-normal")($(e).find(".row2 + .row2:not(.centered) a").attr("href"))}})},r=async i=>{$.get(i,i=>($(i).find(".ipbform").find("tbody").find("tr").each(function(){o.length<t&&-1===e.indexOf(parseInt($(this).find(".row2 + .row2:not(.centered) a").attr("href").split("/f")[1].split("-")[0]))&&n(this)}),o.length!==t&&$(i).find(".pagination")[0].children.length&&"b"!==$(i).find(".pagination").children().last()[0].localName?r($(i).find(".pagination").children().last().attr("href")):o))};await r("/latest?change_version=invision");let o=[];return o},getMembers:e=>new Promise((t,n)=>{let r=[];const o=(e,t)=>({user:$(e).find(".membername span").text().trim(),id:$(e).find(".popupmenu .popupmenu-item a").attr("href").split("?")[0],img:$(e).find(".mini-avatar img").attr("src"),color:t}),i=t=>{let n=[];return $(t).find(".member-list .member").each(function(){const t=FNR.utility.getGroup($(this).find(".membername span").attr("style").split("color:")[1]);e?n.push(o(this,t)):"unknown"!==t&&t!==forumConfig.skinOptions.adminGroup&&n.push(o(this,t))}),n},a=e=>{$.get(e,e=>{const n=$(e).find('.pagination img[alt="Siguiente"]').parent().attr("href")||!1;r=r.concat(i(e)),n?a(n):t(r.sort((e,t)=>e.user<t.user?-1:e.user>t.user?1:0))})};a("/memberlist?change_version=invision")}),getGroups:e=>{const t=()=>new Promise((e,t)=>{$.get("/groups?change_version=invision",t=>{let n=[];$(t).find(".group_list > li").each(function(){n.push({id:parseInt($(this).find("a").attr("href").split("/g")[1].split("-")[0]),name:$(this).find("a").text().trim(),color:$(this).find("a").css("color"),url:Vue.filter("url-to-normal")($(this).find("a").attr("href")),count:parseInt($(this).find("div > span").text())-1})}),e(n)})}),n=()=>new Promise((n,r)=>{FNR.cache.useData("groups",e).then(e=>{n(e)},e=>{t().then(e=>{FNR.cache.setData("groups",e),n(e)})})});return n()},getAffiliates:()=>new Promise((e,t)=>{const n=forumConfig.affiliatesMax,r=Object.entries(forumAffiliates).map(e=>{let t="";e[1].forEach(e=>{t+='<li><a href="'+e.url+'" title="'+e.title+'" target="_blank"><img src="'+e.img+'" alt="'+e.title+'"/></a></li>'});for(let r=0;r<n[e[0]]-e[1].length;r++)t+='<li><a href="/" title="'+forumData.name+'"><img src="'+forumDefaults.affiliates[e[0]]+'" alt="'+forumData.name+'"/></a></li>';return t});e({normal:r[0],elite:r[1],directory:r[2],sister:r[3]})})},content:{isAutosave:()=>void 0!==document.post&&(-1!==_userdata.user_id&&"reply"===document.post.mode.value&&void 0!==document.post.t),post:{getPost:e=>new Promise((t,n)=>{$.get(Vue.filter("url-to-invision")(e),n=>{const r=$(n).find("#p"+e.split("#")[1]);t({author:{text:r.find(".author a").text(),color:r.find(".author a span").css("color"),url:Vue.filter("url-to-normal")(r.find(".author a").attr("href"))},content:r.find(".post-entry > div").html(),date:r.find(".author").html().split("</a>")[1]})})}),genPost:(e,t)=>new Promise((n,r)=>{let o=document.createElement("iframe");o.id="forum-save",o.src="/post?t="+e+"&mode=reply&change_version=invision",o.width=0,o.height=0,o.onload=(()=>{i.onload=(()=>{$("#forum-save").remove(),console.clear(),n(!0)}),$("#forum-save").contents().find('.subtitle:contains("Mensaje")').next().find("textarea").val(t),$("#forum-save").contents().find('.formbuttonrow.center input[value="Enviar"]').click()}),document.querySelector("body").prepend(o);const i=document.querySelector("#forum-save")})},topic:{getType:e=>{const t=[];return e.indexOf("unread")>-1?t.push("is-unread"):t.push("is-read"),e.indexOf("locked")>-1?t.push("is-closed"):e.indexOf("sticky")>1?t.push("is-sticky"):e.indexOf("global_announce")>1?t.push("is-global-announcement"):e.indexOf("announce")>1&&t.push("is-announcement"),t},genTopic:(e,t,n)=>new Promise((r,o)=>{let i=document.createElement("iframe");i.id="forum-save",i.src="/post?f="+e+"&mode=newtopic&change_version=invision",i.width=0,i.height=0,i.onload=(()=>{a.onload=(()=>{$("#forum-save").remove(),console.clear(),r(!0)}),$("#forum-save").contents().find('dl dt:contains("Título del tema")').parent().find("input").val(t),$("#forum-save").contents().find('.subtitle:contains("Mensaje")').next().find("textarea").val(n),$("#forum-save").contents().find('.formbuttonrow.center input[value="Enviar"]').click()}),document.querySelector("body").prepend(i);const a=document.querySelector("#forum-save")})}},user:{getUrl:e=>{let t=void 0!==e?Object.keys(window.localStorage).filter(t=>t.indexOf("userInfo")>-1&&window.localStorage[t].indexOf(`"name":"${e}"`)>-1).join().replace(`${forumData.prefix}_userInfo`,""):_userdata.user_id;return 0===t.length&&(t=encodeURIComponent(e).replace(/[!'()]/g,escape).replace(/\*/g,"%2A")),Object.keys(window.localStorage).filter(t=>t.indexOf("userInfo")>-1&&window.localStorage[t].indexOf(`"name":"${e}"`)>-1).join().replace(`${forumData.prefix}_userInfo`,""),"/profile?mode=viewprofile&u="+t},getLevel:async()=>{switch(_userdata.user_level){case 2:return"mod";case 1:return"admin";case 0:return-1==_userdata.user_id?"guest":"user"}},getGroup:async()=>{const e=await FNR.user.getLevel();if("guest"===e)return"unknown";const{colour:t}=await FNR.user.getProfile(_userdata.user_id,.25);return t},getProfile:(e,t)=>{const n=null!=e?FNR.user.getUrl(e):FNR.user.getUrl(),r=t||5,o=e=>e.find("a").length?Vue.filter("url-to-normal")(e.find("a").attr("href")):e.find("table").length?e.find("table").html():e.find("img").length?e.find("img").attr("src"):e.find("textarea").length?e.find("textarea").val():e.find("span").length?e.find("span").text().trim():"-"===e.text().trim()?"":e.text(),i=()=>new Promise((e,t)=>{$.get(n+"&change_version=invision",t=>{let r={};r.name=$(t).find(".maintitle h1 span").text(),r.lastvisit=$(t).find('dt:contains("Última visita")').parent().find("dd").text(),r.colour=FNR.utility.getGroup($(t).find(".maintitle h1 span").css("color").replace("rgb(","rgb_").replace(/, /g,"_").replace(")","")),r.avatar=$(t).find(".real_avatar img").attr("src"),r.links={profile:"/u"+n.split("&u=")[1],mp:"/privmsg?mode=post&u="+n.split("&u=")[1]},r.messages={public:parseInt($(t).find('span:contains("Mensajes")').parent().parent().find("dd > div").text())||0,private:parseInt($(t).find('dt:contains("Mensajes privados")').parent().find("dd").text())||0},r.fields={},$(t).find('dl[id^="field_id"]').each(function(){if(""!==$(this).find("dt span").text()){if("Mensajes"===$(this).find("dt span").text())return;r.fields[FNR.utility.genSlug($(this).find("dt span").text())]={name:$(this).find("dt span").text(),content:o($(this).find("dd .field_uneditable"))}}}),$(t).find(".ipbform2 > dl").each(function(){if($(this).find("dt span").length&&""!==$(this).find("dt span").text()){if("Mensajes"===$(this).find("dt span").text())return;r.fields[FNR.utility.genSlug($(this).find("dt span").text())]={name:$(this).find("dt span").text(),content:o($(this).find("dd"))}}}),r.fields.rango={name:"Rango",content:$(t).find('dt:contains("Rango:")').parent().find("dd").text()},e(r)})}),a=e=>{const t=`userInfo${e}`;return new Promise((e,n)=>{FNR.cache.useData(t,r).then(t=>{e(t)},n=>{i().then(n=>{FNR.cache.setData(t,n),e(n)})})})};return a(e)},changeAccount:async(e,t,n)=>{try{return await fetch(e),await fetch("/login",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:`username=${encodeURIComponent(t)}&password=${encodeURIComponent(n)}&autologin=1&login=1`}),!0}catch(e){return console.error("Error inesperado",e),!1}},followed:{getPages:async()=>{try{const e=await fetch("/search?search_id=watchsearch&change_version=invision"),t=await e.text(),n=document.createElement("html");n.innerHTML=t;const r=n.querySelectorAll(".pagination a");let o=[];if(r.length){const e=r[r.length-2],t=e.href.split(e.origin)[1],n=t.match(/[0-9]/g)||[],i=parseInt(n.join(""))||0,a=r[1],l=a.href.split(a.origin)[1],s=l.match(/[0-9]/g)||[],c=parseInt(s.join(""))||0,d=void 0===i?0:i/c;o=Array(d).fill(null).map((e,t)=>`/search?search_id=watchsearch&start=${c*(t+1)}&change_version=invision`)}return{items:1===n.querySelectorAll(".ipbtable tbody tr td").length?0:n.querySelectorAll(".ipbtable tbody tr").length,pages:["/search?search_id=watchsearch&change_version=invision",...o]}}catch(e){return console.error("Error inesperado",e),!1}},getFollowed:async e=>{try{const t=await fetch(e),n=await t.text(),r=document.createElement("html");return r.innerHTML=n,Array.from(r.querySelectorAll(".ipbtable tbody tr")).map(e=>{const t=e.children;return{id:parseInt(t[7].children[0].value),name:t[1].querySelector(".topictitle").textContent.trim(),url:Vue.filter("url-to-normal")(t[1].querySelector(".topictitle").href),views:parseInt(t[5].textContent),replies:parseInt(t[3].textContent),type:FNR.content.topic.getType(t[0].querySelector("img").src).join(" ")}})}catch(e){return console.error("Error inesperado",e),!1}},delFollowed:async e=>{try{return await fetch("/search?search_id=watchsearch",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:`confirm=confirm${e.map(e=>`&mark${encodeURIComponent("[]")}2=${e}`)}`}),!0}catch(e){return console.error("Error inesperado",e),!1}}},drafts:{delDrafts:async(e,t)=>{try{const n="draft"===e?"draft":"topic_draft";return await fetch(`/search?search_id=${e}search`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:`confirm=confirm${t.map(e=>`&delete_${n}${encodeURIComponent(`[${e}]`)}=on`)}`}),!0}catch(e){return console.error("Error inesperado",e),!1}},messages:{getPages:async()=>{try{const e=await fetch("/search?search_id=draftsearch&change_version=invision"),t=await e.text(),n=document.createElement("html");n.innerHTML=t;const r=n.querySelectorAll(".pagination a");let o=[];if(r.length){const e=r[r.length-2],t=e.href.split(e.origin)[1],n=t.match(/[0-9]/g)||[],i=parseInt(n.join(""))||0,a=r[1],l=a.href.split(a.origin)[1],s=l.match(/[0-9]/g)||[],c=parseInt(s.join(""))||0,d=void 0===i?0:i/c;o=Array(d).fill(null).map((e,t)=>`/search?search_id=draftsearch&start=${c*(t+1)}&change_version=invision`)}return{items:1===n.querySelectorAll(".ipbtable tbody tr td").length?0:n.querySelectorAll(".ipbtable tbody tr").length,pages:["/search?search_id=draftsearch&change_version=invision",...o]}}catch(e){return console.error("Error inesperado",e),!1}},getDrafts:async e=>{try{const t=await fetch(e),n=await t.text(),r=document.createElement("html");return r.innerHTML=n,Array.from(r.querySelectorAll(".ipbtable tbody tr")).map(e=>{const t=e.children;return{topic:{name:t[1].textContent.trim(),url:Vue.filter("url-to-normal")(t[1].querySelector("a").href)},info:{location:t[2].textContent.trim(),date:t[3].textContent.trim()},modify:Vue.filter("url-to-normal")(t[4].querySelector("a").href)}})}catch(e){return console.error("Error inesperado",e),!1}}},topics:{getPages:async()=>{try{const e=await fetch("/search?search_id=topicdraftsearch&change_version=invision"),t=await e.text(),n=document.createElement("html");n.innerHTML=t;const r=n.querySelectorAll(".pagination a");let o=[];if(r.length){const e=r[r.length-2],t=e.href.split(e.origin)[1],n=t.match(/[0-9]/g)||[],i=parseInt(n.join(""))||0,a=r[1],l=a.href.split(a.origin)[1],s=l.match(/[0-9]/g)||[],c=parseInt(s.join(""))||0,d=void 0===i?0:i/c;o=Array(d).fill(null).map((e,t)=>`/search?search_id=topicdraftsearch&start=${c*(t+1)}&change_version=invision`)}return{items:1===n.querySelectorAll(".ipbtable tbody tr td").length?0:n.querySelectorAll(".ipbtable tbody tr").length,pages:["/search?search_id=topicdraftsearch&change_version=invision",...o]}}catch(e){return console.error("Error inesperado",e),!1}},getDrafts:async e=>{try{const t=await fetch(e),n=await t.text(),r=document.createElement("html");return r.innerHTML=n,Array.from(r.querySelectorAll(".ipbtable tbody tr")).map(e=>{const t=e.children;return{topic:{name:t[0].textContent.trim(),url:Vue.filter("url-to-normal")(t[0].querySelector("a").href)},info:{location:t[1].textContent.trim(),date:t[2].textContent.trim()},modify:Vue.filter("url-to-normal")(t[3].querySelector("a").href)}})}catch(e){return console.error("Error inesperado",e),!1}}}},profile:{getData:e=>new Promise((t,n)=>{$.get("/profile?change_version=invision&mode=editprofile",n=>{const r=n;$.get("/profile?change_version=invision&mode=editprofile&page_profil=avatars",n=>{const o=n;let i=[];[].forEach.call(e,e=>{let t="",n=[];switch(e.type){case"input":t=$(r).find('dl:contains("'+e.name+'")').find("dd").find("input").val();break;case"textarea":t=$(r).find('dl:contains("'+e.name+'")').find("dd").find("textarea").val();break;case"select":t=$(r).find('dl:contains("'+e.name+'")').find("dd").find("select option:selected").attr("value"),$(r).find('dl:contains("'+e.name+'")').find("dd").find("select option").each(function(){""!==$(this).attr("value")&&n.push({name:$(this).text(),value:$(this).attr("value")})});break;case"avatar":t=$(o).find(".box-content img").attr("src")}if("select"===e.type&&void 0===t||"select"===e.type&&""===t)return;let a={type:e.type,name:e.name,value:t};e.validation&&(a.validation=e.validation),n.length&&(a.options=n),i.push(a)}),t(i)})})}),setData:e=>new Promise((t,n)=>{const r=()=>{$("#forum-save").remove(),console.clear(),t(!0)};let o=document.createElement("iframe");o.id="forum-save",o.src="/profile?change_version=invision&mode=editprofile",o.width=0,o.height=0,o.onload=(()=>{let t=!1;[].forEach.call(e,e=>{switch(e.type){case"input":$("#forum-save").contents().find('dl:contains("'+e.name+'")').find("dd").find("input").first().val(e.value);break;case"textarea":$("#forum-save").contents().find('dl:contains("'+e.name+'")').find("dd").find("textarea").val(e.value);break;case"select":$("#forum-save").contents().find('dl:contains("'+e.name+'")').find("dd").find('select option[value="'+e.value+'"]').attr("selected","selected");break;case"avatar":t=e.value}}),i.onload=(()=>{t?(i.onload=(()=>{i.onload=(()=>{r()}),$("#forum-save").contents().find('input[name="avatarremoteurl"]').val(t),$("#forum-save").contents().find('input[type="submit"][value="Registrar"]').click()}),i.src="/profile?change_version=invision&mode=editprofile&page_profil=avatars"):r()}),$("#forum-save").contents().find('input[type="submit"][value="Registrar"]').click()}),document.querySelector("body").prepend(o);const i=document.querySelector("#forum-save")})}},cache:{getData:e=>null!==localStorage.getItem(forumData.prefix+"_"+e)&&JSON.parse(localStorage.getItem(forumData.prefix+"_"+e)).content,setData:(e,t,n)=>{let r=-1===n?"undefined":(new Date).getTime();localStorage.setItem(forumData.prefix+"_"+e,JSON.stringify({cached_at:r,content:t}))},delData:e=>null!==localStorage.getItem(forumData.prefix+"_"+e)&&localStorage.removeItem(forumData.prefix+"_"+e),useData:async(e,t)=>{const n=localStorage.getItem(forumData.prefix+"_"+e),r=new Date,o=-1==t?"undefined":864e5*t;return null!=n&&-1==t||null!=n&&parseInt(JSON.parse(n).cached_at)+o>r.getTime()?JSON.parse(n).content:Promise.reject(!1)}},utility:{genSlug:(e,t)=>{const n=e=>{const t="àáäâèéëêìíïîòóöôùúüûñç·/_,:;";e=e.trim().toLowerCase();for(var n=0,r=t.length;n<r;n++)e=e.replace(new RegExp(t.charAt(n),"g"),"aaaaeeeeiiiioooouuuunc------".charAt(n));return e.replace(/[^a-z0-9 -]/g,"").replace(/\s+/g,"-").replace(/-+/g,"-")},r=t||"_";return n(e).replace(/-/g,r)},genArray:e=>JSON.parse(e.replace(/`/g,'"')),genValidation:e=>{let t="";return[].forEach.call(e,e=>{switch(e.validation){case"hex":e.value.match(/^#[a-f0-9]{6}$/i)||(t+="<li>El campo de "+e.name.toLowerCase()+" debe incluir un código de color hexadecimal.</li>");break;case"img":e.value.match(/(jpg|jpeg|png)$/i)||(t+="<li>El campo de "+e.name.toLowerCase()+" debe ser el enlace a una imagen (formato png, jpg o jpeg).</li>")}}),t},getGroup:e=>{const t=e=>{let t="unknown";return Object.values(forumColours).map(n=>{n.hex===e.toLowerCase()&&(t=FNR.utility.genSlug(n.code))}),t},n=e=>{let t="unknown";return Object.values(forumColours).map(n=>{n.id===e&&(t=FNR.utility.genSlug(n.code))}),t};return void 0===e?"unknown":e.indexOf("#")>-1?t(e):e.indexOf("id_")>-1?n(parseFloat(e.split("_")[1])):void 0===forumColours[e]?"unknown":FNR.utility.genSlug(forumColours[e].code)}},html:{genModal:(e,t,n)=>{if(""===e||null==e)return;if(""===t||null==t)return;let r=document.createElement("div");r.id="forum-modal",document.body.appendChild(r);let o="";o+='<div id="'+FNR.utility.genSlug(e,"-")+'" class="modal-element">',o+='<div class="modal-title">',o+="<h3>"+e+"</h3>",o+='<a onclick="document.querySelector(`#forum-modal`).remove()">',o+='<i class="fas fa-times"></i>',o+="</a>",o+="</div>",o+='<div class="modal-content">',o+='<div class="is-content">',o+=t.replace(/\n/g,"<br>"),o+="</div>",""!==n&&null!=n&&(o+='<div class="modal-buttons">',o+=n,o+="</div>"),o+="</div>",o+="</div>",o+='<div class="is-bgmodal bg-active" onclick="document.querySelector(`#forum-modal`).remove()"></div>',document.querySelector("#forum-modal").innerHTML=o},genPrompt:(e,t,n,r)=>{if(""!==e&&null!=e&&""!==t&&null!=t)return new Promise((o,i)=>{FNR.html.genModal(e,"<p>"+t+'</p><p><input id="modal-prompt" type="text" placeholder="'+n+'" value="'+r+'"></p>','<button id="modal-button-enter" class="button1 btn-main">Confirmar</button><button id="modal-button-cancel" class="button1">Cancelar</button>'),document.querySelector("#modal-button-enter").onclick=(()=>{const e=document.querySelector("#modal-prompt").value;o(""!==e&&e),document.querySelector("#forum-modal").remove()}),document.querySelector("#modal-button-cancel").onclick=(()=>{i(!1),document.querySelector("#forum-modal").remove()}),document.querySelector(".modal-title a").onclick=(()=>{i(!1),document.querySelector("#forum-modal").remove()}),document.querySelector(".is-bgmodal.bg-active").onclick=(()=>{i(!1),document.querySelector("#forum-modal").remove()})})},genNotification:(e,t,n,r)=>{if(""===e||null==e)return;if(""===t||null==t)return;if(t.length>50)return;if(""===n||null==n)return;document.querySelectorAll("forum-notification").length&&(document.querySelector("#forum-notification").remove(),clearTimeout());let o=document.createElement("div");o.id="forum-notification",document.body.appendChild(o);let i="";i+=""===r||null==r?'<div id="'+FNR.utility.genSlug(e,"-")+'" class="notification-element" onclick="document.querySelector(`#forum-notification`).classList.remove(`notification-show`)" >':'<a href="'+r+'" target="_blank" id="'+FNR.utility.genSlug(e,"-")+'" class="notification-element" onclick="document.querySelector(`#forum-notification`).classList.remove(`notification-show`)" >',i+='<div class="notification-icon">',i+='<i class="'+n+'"></i>',i+="</div>",i+='<div class="notification-content">',i+="<h3>"+e+"</h3>",i+="<p>"+t+"</p>",i+="</div>",i+='<div class="notification-controls">',i+='<i class="fas fa-times"></i>',i+="</div>",i+=""===r||null==r?"</div>":"</a>",document.querySelector("#forum-notification").innerHTML=i,setTimeout(()=>{document.querySelector("#forum-notification").classList.add("notification-show")},250),setTimeout(()=>{document.querySelector("#forum-notification").classList.remove("notification-show")},8e3),setTimeout(()=>{document.querySelector("#forum-notification").remove()},1e4)}},behaviour:{genWiki:()=>{document.querySelector(".wiki-cascade")&&[].forEach.call(document.getElementsByClassName("wiki-cascade"),e=>{e.onclick=(()=>{const t=e.parentElement.parentElement;t.classList.contains("is-active")?t.classList.remove("is-active"):t.classList.add("is-active")})}),document.querySelector(".wiki-controls .router-link-active")&&[].forEach.call(document.querySelectorAll(".wiki-controls .router-link-active"),e=>{if(!e.parentElement.parentElement.parentElement.parentElement.parentElement.classList.contains("wiki-index")){const t=(e,n)=>{let r=e.parentElement.parentElement;n&&(r=r.parentElement.parentElement),r.classList.add("is-active"),r.classList.add("is-selected"),r.parentElement.parentElement.parentElement.classList.contains("wiki-index")||t(r,!1)};t(e,!0)}}),document.querySelector("aside.wiki-index > .select-container > select")&&(document.querySelector("aside.wiki-index > .select-container > select").onchange=(()=>{router.push(document.querySelector("aside.wiki-index > .select-container > select").value)}))},genDropeable:()=>{document.querySelector(".is-dropeable")&&[].forEach.call(document.getElementsByClassName("is-dropeable"),e=>{e.onclick=(()=>{e.classList.contains("is-active")?e.classList.remove("is-active"):([].forEach.call(document.getElementsByClassName("is-dropeable"),e=>{e.classList.remove("is-active")}),e.classList.add("is-active"))})})},genControls:()=>{document.querySelector(".forum-controls")&&[].forEach.call(document.querySelectorAll(".forum-controls"),e=>{let t=0;[].forEach.call(e.children,e=>{"none"!==window.getComputedStyle(e,null).display&&(t+=e.children.length)}),0===t&&!1===e.classList.contains("not-show")&&e.classList.add("not-show")})},genDebounce:(e,t=750)=>{let n;return(...r)=>{clearTimeout(n),n=setTimeout(()=>{e.apply(this,r)},t)}}}};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "generic-skin",
3
- "version": "4.3.0",
3
+ "version": "4.3.2",
4
4
  "description": "Generic Forum Skin for Forumotion created by Gaylien.",
5
5
  "main": "readme.md",
6
6
  "scripts": {