aboutsummaryrefslogtreecommitdiff
path: root/static/js/weabot.js
diff options
context:
space:
mode:
Diffstat (limited to 'static/js/weabot.js')
-rw-r--r--static/js/weabot.js456
1 files changed, 456 insertions, 0 deletions
diff --git a/static/js/weabot.js b/static/js/weabot.js
new file mode 100644
index 0000000..0adc2e1
--- /dev/null
+++ b/static/js/weabot.js
@@ -0,0 +1,456 @@
+var style_cookie = 'weabot_style_ib';
+
+function set_stylesheet(styletitle) {
+ var css=document.getElementById("css");
+ if(css) {
+ css.href = "/static/css/" + styletitle.toLowerCase() + ".css";
+ localStorage.setItem(style_cookie, styletitle);
+ }
+}
+
+if(style_cookie && localStorage.hasOwnProperty(style_cookie)) {
+ set_stylesheet(localStorage.getItem(style_cookie));
+}
+
+var hiddenthreads = Array();
+/* IE/Opera fix, because they need to go learn a book on how to use indexOf with arrays */
+if (!Array.prototype.indexOf) {
+ Array.prototype.indexOf = function(elt /*, from*/) {
+ var len = this.length;
+ var from = Number(arguments[1]) || 0;
+ from = (from < 0) ? Math.ceil(from) : Math.floor(from);
+ if (from < 0) from += len;
+ for (; from < len; from++) {
+ if (from in this && this[from] === elt) return from;
+ }
+ return -1;
+ };
+}
+
+function timeAgo(timestamp) {
+ var time = Math.round(Date.now()/1000);
+ var el = time - timestamp;
+ if (el==0) return "un instante";
+ else if (el==1) return "un segundo";
+ else if (el<60) return el + " segundos";
+ else if (el<120) return "un minuto";
+ else if (el<3600) return Math.round(el/60) + " minutos";
+ else if (el<7200) return "una hora";
+ else if (el<86400) return Math.round(el/3600) + " horas";
+ else if (el<172800) return "un día";
+ else if (el<2628000) return Math.round(el/86400) + " días";
+ else if (el<5256000) return "un mes";
+ else if (el<31536000) return Math.round(el/2628000) + " meses";
+ else if (el>31535999) return "más de un año";
+}
+
+function localTime(timestamp, id) {
+ id = id || 0;
+ var lcl = new Date(timestamp*1000);
+ lcl = ("0"+lcl.getDate()).slice(-2) + "/" + ("0" + (lcl.getMonth()+1)).slice(-2) + "/" + lcl.getFullYear().toString().slice(-2) + "(" + week[lcl.getDay()] + ")" + ("0"+lcl.getHours()).slice(-2) + ":" + ("0"+lcl.getMinutes()).slice(-2) + ":" + ("0"+lcl.getSeconds()).slice(-2)
+ if (id) lcl = lcl + " " + id;
+ return lcl;
+}
+
+function postClick(e) {
+ e.preventDefault();
+ var sel = window.getSelection().toString();
+ if (sel) sel = sel.replace(/^/gm, ">") + "\n";
+ insert(">>" + this.textContent + "\n" + sel);
+}
+
+function insert(text) {
+ var textarea=document.forms.postform.message;
+ if(textarea) {
+ if(textarea.createTextRange && textarea.caretPos) { // IE
+ var caretPos=textarea.caretPos;
+ caretPos.text=caretPos.text.charAt(caretPos.text.length-1)==" "?text+" ":text;
+ } else if(textarea.setSelectionRange) { // Firefox
+ var start=textarea.selectionStart;
+ var end=textarea.selectionEnd;
+ textarea.value=textarea.value.substr(0,start)+text+textarea.value.substr(end);
+ textarea.setSelectionRange(start+text.length,start+text.length);
+ } else { textarea.value+=text+" "; }
+ textarea.focus();
+ }
+ return false;
+}
+
+function quote(b, a) {
+ var v = eval("document." + a + ".message");
+ v.value += ">>" + b + "a\ndfs";
+ v.focus();
+}
+
+function checkhighlight() {
+ var match;
+ if(match=/#i([0-9]+)/.exec(document.location.toString()))
+ if(!document.forms.postform.message.value)
+ insert(">>"+match[1]+"\r\n");
+ if(match=/#([0-9]+)/.exec(document.location.toString()))
+ highlight(match[1]);
+}
+
+function highlight(post) {
+ var cells = document.getElementsByClassName("reply");
+ for(var i=0;i<cells.length;i++) if(cells[i].className == "reply highlight") cells[i].className = "reply";
+ var reply = document.getElementById("reply" + post);
+ if(reply) {
+ reply.className = "reply highlight";
+ var match = /^([^#]*)/.exec(document.location.toString());
+ document.location = match[1] + "#" + post;
+ }
+}
+
+function expandimg(e) {
+ var post_id = this.dataset.id;
+ var img_url = this.href;
+ var thumb_url = this.dataset.thumb;
+ var img_w = parseInt(this.dataset.w);
+ var img_h = parseInt(this.dataset.h);
+ var thumb_w = parseInt(this.dataset.tw);
+ var thumb_h = parseInt(this.dataset.th);
+ var format = img_url.substring(img_url.lastIndexOf(".")+1, img_url.length);
+ var exp_vid = 0;
+
+ if(window.innerWidth > 900) var ratio = Math.min((window.innerWidth-130) / img_w, 1);
+ else var ratio = Math.min((window.innerWidth-40) / img_w, 1);
+
+ if(thumb_w < 1) return true;
+
+ var img_cont = document.getElementById("thumb" + post_id);
+ var post_block = img_cont.parentElement.parentElement.getElementsByTagName("blockquote")[0];
+ var img;
+
+ for(var i = 0; i < img_cont.childNodes.length; i++)
+ if(img_cont.childNodes[i].nodeName.toLowerCase() == "img") {
+ img = img_cont.childNodes[i];
+ } else if(img_cont.childNodes[i].nodeName.toLowerCase() == "video") {
+ img = img_cont.childNodes[i];
+ exp_vid = 1;
+ }
+
+ if(img) {
+ if( (format == "webm") && (exp_vid == 0) ) var new_img = document.createElement("video");
+ else var new_img = document.createElement("img");
+ new_img.setAttribute("class", "thumb");
+ new_img.setAttribute("alt", "" + post_id);
+
+ if( (img.getAttribute("width") == ("" + thumb_w)) && (img.getAttribute("height") == ("" + thumb_h)) ) {
+ // thumbnail -> fullsize
+ if(format == "webm") {
+ new_img.setAttribute("controls", "");
+ new_img.setAttribute("loop", "");
+ new_img.setAttribute("autoplay", "");
+ }
+ new_img.setAttribute("src", "" + img_url);
+ new_img.setAttribute("width", img_w);
+ new_img.setAttribute("height", img_h);
+ new_img.setAttribute("style", "max-width:"+Math.floor((img_w*ratio))+"px;max-height:"+Math.floor((img_h*ratio))+"px;");
+ post_block.setAttribute("style", "");
+ img_cont.style.display = 'table';
+ } else {
+ // fullsize -> thumbnail
+ if(format == "webm") {
+ new_img.removeAttribute("controls");
+ new_img.removeAttribute("loop");
+ new_img.removeAttribute("autoplay");
+ }
+ new_img.setAttribute("src", "" + thumb_url);
+ new_img.setAttribute("width", thumb_w);
+ new_img.setAttribute("height", thumb_h);
+ post_block.setAttribute("style", "margin-left:"+(parseInt(thumb_w)+40)+"px;max-width:"+(1000-parseInt(thumb_w))+"px");
+ img_cont.removeAttribute("style");
+ }
+
+ while(img_cont.lastChild) img_cont.removeChild(img_cont.lastChild);
+
+ img_cont.appendChild(new_img);
+ e.preventDefault();
+ }
+}
+
+function filePreview(e) {
+ var file = postform.file.files[0];
+ var inpt = document.getElementById("file");
+ var prev = document.getElementById("filepreview");
+ var noimg = document.getElementById("noimage");
+ if (noimg) noimg = document.getElementById("noimage").parentNode;
+ if (file.size > (maxsize*1024)) { inpt.value = ""; return alert("El archivo es muy grande. El tamaño máximo es " + maxsize + " KB."); }
+ if (!types.includes(inpt.value.slice(inpt.value.lastIndexOf(".")+1).toUpperCase())) { inpt.value = ""; return alert("Tipo de archivo no soportado."); }
+ var read = new FileReader();
+ read.readAsDataURL(file);
+ read.onload = function(){
+ inpt.style.display = "none";
+ if (noimg) noimg.style.display = "none";
+ prev.removeAttribute("style");
+ var fname = (file.name.length < 20) ? file.name : file.name.substr(0, 19) + "…";
+ if (file.type.startsWith("image")) prev.insertAdjacentHTML('beforeend', '<img class="thumbpreview" src="' + read.result + '" /> ' + fname);
+ else prev.insertAdjacentHTML('beforeend', fname);
+ prev.appendChild(document.createTextNode(" ["));
+ var btn = document.createElement("a");
+ btn.href = "#";
+ btn.innerText = "Quitar"
+ btn.addEventListener("click", function(e) {
+ e.preventDefault();
+ prev.innerHTML = "";
+ prev.style.display = "none";
+ inpt.removeAttribute("style");
+ if (noimg) noimg.removeAttribute("style");
+ inpt.value = "";
+ });
+ prev.appendChild(btn);
+ prev.appendChild(document.createTextNode("] "));
+ };
+}
+
+function togglethread(e) {
+ e.preventDefault();
+ if(this.parentElement.id.startsWith("unhide")) {
+ var threadid = this.parentElement.id.substr(6);
+ } else if(this.parentElement.parentElement.id.startsWith("thread")) {
+ var threadid = this.parentElement.parentElement.id.substr(6);
+ } else { return; }
+ if (hiddenthreads.toString().indexOf(threadid) !== -1) {
+ document.getElementById("unhide" + threadid).style.display = "none";
+ document.getElementById("thread" + threadid).removeAttribute("style");
+ hiddenthreads.splice(hiddenthreads.indexOf(threadid), 1);
+ } else {
+ document.getElementById("unhide" + threadid).removeAttribute("style");
+ document.getElementById("thread" + threadid).style.display = "none";
+ hiddenthreads.push(threadid);
+ }
+ if (hiddenthreads == "") localStorage.removeItem("hiddenthreads");
+ else localStorage.setItem("hiddenthreads", hiddenthreads.join("!"));
+}
+
+function saveInputs(e) {
+ var e = e || window.event;
+ var form = e.target || e.srcElement;
+ if(typeof(form.fielda) !== "undefined") weabot.name = form.fielda.value;
+ if(typeof(form.fielda) !== "undefined") weabot.email = form.fieldb.value;
+ localStorage.setItem("weabot", JSON.stringify(weabot));
+}
+
+function setInputs(id) {
+ if (document.getElementById(id)) {
+ with(document.getElementById(id)) {
+ if(typeof(fielda) !== 'undefined' && !fielda.value && weabot.name) fielda.value = weabot.name;
+ if(typeof(fielda) !== 'undefined' && !fieldb.value && weabot.email) fieldb.value = weabot.email;
+ if(!password.value) password.value = getPassword();
+ addEventListener("submit", saveInputs);
+ }
+ }
+}
+
+function setPassword(id) {
+ if (document.getElementById(id).password)
+ with (document.getElementById(id)) if(!password.value) password.value = getPassword("weabot_password");
+}
+
+function getPassword() {
+ if (weabot.password) return weabot.password;
+ var char="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+ var pass="";
+ for (var i=0;i<8;i++) {
+ var rnd = Math.floor(Math.random()*char.length);
+ pass += char.substring(rnd, rnd+1);
+ }
+ weabot.password = pass;
+ localStorage.setItem("weabot", JSON.stringify(weabot));
+ return(pass);
+}
+
+function catSort(type) {
+ for(var i=0;i<srt.length;i++) srt[i].innerHTML=srt[i].innerText;
+ srt[type].innerHTML = "<b>"+srt[type].innerText+"</b>";
+ var cont = document.getElementById("catalog");
+ var elem = document.getElementsByClassName("thread");
+ var arr = Array.prototype.slice.call(elem);
+ if (type==0) arr.sort(function (a,b) { return (a.dataset.num-b.dataset.num) });
+ else if (type==1) arr.sort(function (a,b) { return (b.dataset.id-a.dataset.id) });
+ else if (type==2) arr.sort(function (a,b) { return (a.dataset.id-b.dataset.id) });
+ else if (type==3) arr.sort(function (a,b) { return (b.dataset.res-a.dataset.res) });
+ else if (type==4) arr.sort(function (a,b) { return (a.dataset.res-b.dataset.res) });
+ for (var j=0;j<arr.length;j++) cont.appendChild(arr[j]);
+ localStorage.setItem("catalog", JSON.stringify(opcs));
+}
+
+function catSearch() {
+ var filter = document.getElementById("cat_search").value.toLowerCase();
+ var nodes = document.getElementsByTagName("p");
+ for (i = 0; i < nodes.length; i++) {
+ if (nodes[i].innerText.toLowerCase().includes(filter))
+ nodes[i].parentNode.removeAttribute("style");
+ else nodes[i].parentNode.style.display = "none";
+ }
+}
+
+function catThumbs(big) {
+ var btn = document.getElementById("cat_size");
+ var cat = document.getElementById("catalog");
+ var threads = document.getElementsByClassName("thread");
+ if (opcs.big) {
+ cat.className = "enlarged";
+ for (j = 0; j < threads.length; j++) {
+ img = threads[j].getElementsByTagName("a")[0];
+ img.innerHTML = img.innerHTML.replace("/cat/", "/thumb/");
+ }
+ btn.innerText = "Grande";
+ } else {
+ cat.removeAttribute("class");
+ for (j = 0; j < threads.length; j++) {
+ img = threads[j].getElementsByTagName("a")[0];
+ img.innerHTML = img.innerHTML.replace("/thumb/", "/cat/");
+ }
+ btn.innerText = "Pequeño";
+ }
+ localStorage.setItem("catalog", JSON.stringify(opcs));
+}
+
+function catTeasers(teaser) {
+ var btn = document.getElementById("cat_hide");
+ if (!teaser) {
+ var style = document.createElement("style");
+ style.id = "teaser_style";
+ style.type = "text/css";
+ style.innerText = '#catalog p{display:none}';
+ document.head.appendChild(style);
+ btn.innerText = "Mostrar";
+ } else {
+ var style = document.getElementById("teaser_style");
+ if (style) style.parentNode.removeChild(style);
+ btn.innerText = "Ocultar";
+ }
+ localStorage.setItem("catalog", JSON.stringify(opcs));
+}
+
+function catMenu(e) {
+ var brd = document.getElementsByName("board")[0].value;
+ var id = this.dataset.id;
+ this.insertAdjacentHTML('afterbegin', '<div id="thread_ctrl" style="margin-bottom:3px;">[<a href="/cgi/report/' + brd + '/' + id + '">Denunciar</a>] [<a href="#" class="hh">Ocultar</a>]');
+ this.getElementsByClassName("hh")[0].addEventListener("click", function(e) {
+ document.getElementById("cat" + id + brd).style.display = "none";
+ hiddenthreads.push(id + brd);
+ localStorage.setItem("hiddenthreads", hiddenthreads.join("!"))
+ if (document.getElementById("hidden_label")) { hidden_num++; document.getElementById("hidden_num").innerText = hidden_num; }
+ else { hidden_num = 1; catHidden(); }
+ });
+}
+
+function catMenuClose(e) { document.getElementById("thread_ctrl").remove(); }
+
+function catHidden() {
+ var menu = document.getElementById("ctrl");
+ menu.insertAdjacentHTML('beforeend', ' <span id="hidden_label">[Hilos ocultos: <span id="hidden_num">' + hidden_num + '</span> - ');
+ var lbl = document.getElementById("hidden_label");
+ var shw = document.createElement("a");
+ shw.href = "#"; shw.innerText = "Deshacer";
+ shw.addEventListener("click", function(e) {
+ e.preventDefault();
+ for(var i=0;i<hiddenthreads.length;i++){
+ try {document.getElementById("cat" + hiddenthreads[i]).removeAttribute("style");}
+ catch(err) { continue; } }
+ lbl.parentElement.removeChild(lbl); hidden_num = 0;
+ var aux = hiddenthreads.join("!");
+ var exp = new RegExp("\\b[0-9]+" + document.getElementsByName("board")[0].value + "\\b", "g");
+ aux = aux.replace(exp, "!"); aux = aux.replace(/!+/g, "!"); aux = aux.replace(/(^!|!$)/g, "");
+ if (aux == "") { localStorage.removeItem("hiddenthreads"); hiddenthreads = []; }
+ else { localStorage.setItem("hiddenthreads", aux); hiddenthreads = aux.split("!"); }
+ });
+ lbl.appendChild(shw); lbl.appendChild(document.createTextNode("]"));
+}
+
+document.addEventListener("DOMContentLoaded", function(e) {
+ checkhighlight();
+ if (localStorage.hasOwnProperty("weabot")) weabot = JSON.parse(localStorage.getItem("weabot"));
+ else weabot = {"name":null,"email":null,"password":null};
+
+ if(localStorage.hasOwnProperty("hiddenthreads")) {
+ hiddenthreads = localStorage.getItem("hiddenthreads").split("!");
+ if (document.getElementById("catalog")) {
+ hidden_num = 0;
+ for(var i=0;i<hiddenthreads.length;i++){
+ try {
+ document.getElementById("cat" + hiddenthreads[i]).style.display = "none";
+ hidden_num++;
+ } catch(err) { continue; }
+ }
+ if (hidden_num) { catHidden(); }
+ } else {
+ for(var i=0;i<hiddenthreads.length;i++){
+ try {
+ document.getElementById("unhide" + hiddenthreads[i]).removeAttribute("style");
+ document.getElementById("thread" + hiddenthreads[i]).style.display = "none";
+ } catch(err) { continue; }
+ }
+ }
+ }
+
+ if(localStorage.getItem("shobon_time") != "false") {
+ var dts = document.getElementsByClassName("date");
+ if (dts[0].dataset.unix) {
+ week = ["dom", "lun", "mar", "mie", "jue", "vie", "sab"];
+ if (document.getElementsByName("board")[0].value == "2d") week = ["日", "月", "火", "水", "木", "金", "土"];
+ for(var d=0;d<dts.length;d++) {
+ dts[d].addEventListener("mouseover", function(e) { this.title = "Hace " + timeAgo(this.dataset.unix); });
+ if (dts[d].innerText.includes("ID:")) var id = dts[d].innerText.split(" ")[1];
+ dts[d].innerText = localTime(dts[d].dataset.unix, id);
+ }
+ }
+ }
+
+ var ids = document.getElementsByClassName("postid");
+ for(var i=0;i<ids.length;i++) {
+ ids[i].addEventListener('click', postClick);
+ }
+ var tts = document.getElementsByClassName("tt");
+ for(var i=0;i<tts.length;i++) {
+ tts[i].addEventListener('click', togglethread);
+ }
+ var tts = document.getElementsByClassName("expimg");
+ for(var i=0;i<tts.length;i++) {
+ tts[i].addEventListener('click', expandimg);
+ }
+ var sss = document.getElementsByClassName("ss");
+ for(var i=0;i<sss.length;i++) {
+ sss[i].addEventListener('click', function() {
+ var cur = document.getElementById("cur_stl");
+ set_stylesheet(this.textContent);
+ if (cur) cur.removeAttribute("id");
+ this.id = "cur_stl";
+ });
+ if (sss[i].innerText == localStorage.getItem(style_cookie)) sss[i].id = "cur_stl";
+ }
+
+ if (document.getElementById(document.getElementsByName("board")[0].value))
+ document.getElementById(document.getElementsByName("board")[0].value).className = "cur_brd";
+
+ if (document.getElementById("postform")) {
+ setInputs("postform");
+ setPassword("delform");
+ maxsize = document.getElementById("maxsize").innerText;
+ types = document.getElementById("filetypes").innerText.split(", ");
+ if (types.includes("JPG")) types.push("JPEG");
+ postform.file.addEventListener("change", filePreview);
+ }
+
+ window.addEventListener("hashchange", checkhighlight);
+
+ if (document.getElementById("catalog")) {
+ srt = document.getElementsByClassName("cat_sort");
+ for(var i=0;i<srt.length;i++) { srt[i].innerHTML=srt[i].innerText; srt[i].addEventListener("click", function(e) { e.preventDefault(); opcs.sort=this.dataset.sort; catSort(opcs.sort); }); }
+ document.getElementById("cat_size").addEventListener("click", function(e) { e.preventDefault(); opcs.big=!opcs.big; catThumbs(opcs.big); });
+ document.getElementById("cat_hide").addEventListener("click", function(e) { e.preventDefault(); opcs.teaser=!opcs.teaser; catTeasers(opcs.teaser); });
+ document.getElementById("cat_search").addEventListener("keyup", catSearch);
+ if (localStorage.hasOwnProperty("catalog")) {
+ opcs = JSON.parse(localStorage.getItem("catalog"));
+ if(match=/\?sort=([0-9])/.exec(document.location.toString())) opcs.sort=match[1];
+ catSort(opcs.sort); catThumbs(opcs.big); catTeasers(opcs.teaser);
+ } else {
+ opcs = {"sort":1,"big":false,"teaser":true}; localStorage.setItem("catalog", JSON.stringify(opcs));
+ }
+ var thr = document.getElementsByClassName("thread");
+ for(var i=0;i<thr.length;i++) { thr[i].addEventListener("mouseenter", catMenu); thr[i].addEventListener("mouseleave", catMenuClose); }
+ }
+}); \ No newline at end of file