diff options
Diffstat (limited to 'static/js/weabot.js')
-rw-r--r-- | static/js/weabot.js | 456 |
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 |