aboutsummaryrefslogblamecommitdiff
path: root/static/js/mobile.js
blob: 7a44c14989616cbb7e0c8e30272ea75db269e9e9 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12











                                                       



                                        
     
    




                                             



                                         



                                                    




















                                                                            




                                              





                                                                              
                               
                         
                                                         
              




                                      

                                                                           



                                                         





                                                                       







                                                          
                                      





                                                                            
                                                 


                                           

                                       






                                               

                                                                          

                                         
                  


                                           


                                               


                                                             






                                             


                                                                                
                                         
                    


                                               














                                                                         
        








                                                   






                                                                
                                            







                                   









                                                                           
          




















                                                                     


                                      
                                      





                                      








                                                                        





                                                        































                                                            








                              











                                                         
                                            



                               
                                                       

                                                                    
















                                                                        


                                                 
                                       
                               











                                                 
                                    



                                                      
          



                                                         

                                 




























                                                      




                                                                              



                                                  




                                     





                                                               



                                                   
                                                                          











                                                 
                                                                   



                          
                                                                                 










                                                                            



                                                         



                                                                        

                                              
                                                                                                                                                                           




                                                                  





                                                                                                                  













































                                                                       
  

                         
                                                                         



                                                




















                                                                


                                                           


                                                            

                                                   


                                                





                                                             






                                                                                

                                                                               




                                                     


                                          
                                          


                          




                                                   





                                                







                                                                                                        



















                                                                   


                                                    
                                                   
 






                                                  
                                              



                                                                   
   
function sendPost(e) {
  e.preventDefault();
  var button = document.getElementById("post");
  button.disabled = true;
  var sendpost = new XMLHttpRequest();
  var postform = document.getElementById("postform");
  sendpost.open("POST", "/cgi/api/post", true);
  sendpost.send(new FormData(postform));
  sendpost.onreadystatechange = function() {
    if (sendpost.readyState == 4) {
      button.disabled = false;
      var response = JSON.parse(sendpost.responseText);
      if (response.state == "success") {
        postform.message.value = "";
        checkNew(e);
      } else alert(response.message);
    }
  };
}

function postClick(e) {
  e.preventDefault();
  var sel = window.getSelection().toString();
  if (sel) {
    sel = sel.replace(/^/gm, ">") + "\n";
    sel = "\n" + sel;
  }
  insert(">>" + parseInt(this.innerHTML, 10) + 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 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);
  }
  console.log(weabot.password);
  weabot.password = pass;
  localStorage.setItem("weabot", JSON.stringify(weabot));
  return pass;
}

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() {
  with (document.getElementById("postform")) {
    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 showMenu(e) {
  e.preventDefault();
  if (document.getElementById("mnu-opened")) closeMenu(e);
  this.id = "mnu-opened";
  var brd = document.body.dataset.brd;
  var post = this.parentNode.parentNode;
  if (document.body.className === "txt") {
    var id = post.id.substr(1);
    var num = parseInt(post.getElementsByClassName("num")[0].innerText, 10);
  } else {
    var id = post.getElementsByClassName("num")[0].innerText;
    var num = post.className === "first" ? 1 : 0;
  }
  var menu = document.createElement("div");
  menu.id = "mnu-list";
  menu.style.top = e.pageY + 5 + "px";
  menu.style.left = e.pageX + 5 + "px";
  document.body.appendChild(menu);
  menu = document.getElementById("mnu-list");
  var rep = document.createElement("a");
  rep.href = "#";
  rep.innerText = "Denunciar post";
  rep.addEventListener("click", function(e) {
    var reason = prompt("Razón de denuncia:");
    if (reason === "")
      while (reason === "") reason = prompt("Error: Ingresa una razón.");
    if (reason) {
      var rep_req = new XMLHttpRequest();
      var report =
        "/cgi/report/" + brd +
        "/" + id + (num ? "/" + num : "") +
        "?reason=" + reason;
      rep_req.open("GET", report, true);
      rep_req.send();
      rep_req.onreadystatechange = function() {
        if (rep_req.readyState == 4 && rep_req.status == 200)
          alert("Denuncia enviada.");
      };
    }
  });
  menu.appendChild(rep);
  var del = document.createElement("a");
  del.href = "#";
  del.innerText = "Eliminar post";
  del.addEventListener("click", function(e) {
    if (
      confirm("¿Seguro que deseas borrar el mensaje " + (num ? num : id) + "?")
    ) {
      var del_req = new XMLHttpRequest();
      var del_form =
        "/cgi/api/delete?dir=" + brd +
        "&id=" + id +
        "&password=" + postform.password.value;
      del_req.open("GET", del_form, true);
      del_req.send();
      del_req.onreadystatechange = function() {
        if (del_req.readyState == 4) {
          var response = JSON.parse(del_req.responseText);
          if (response.state == "success") {
            if (num == 1) {
              alert("Hilo eliminado.");
              document.location = "/cgi/mobile/" + brd;
            } else {
              alert("Mensaje eliminado.");
              location.reload();
            }
          } else if (response.state == "failed") alert(response.message);
        }
      };
    }
  });
  menu.appendChild(del);
  var file = post.getElementsByClassName("thm")[0];
  if (file) {
    var dfile = document.createElement("a");
    dfile.href = "#";
    dfile.innerText = "Eliminar archivo";
    dfile.addEventListener("click", function(e) {
      if (
        confirm(
          "¿Seguro que deseas borrar el archivo del mensaje " +
            (num ? num : id) +
            "?"
        )
      ) {
        var fdel_req = new XMLHttpRequest();
        var fdel_form =
          "/cgi/api/delete?dir=" +
          brd +
          "&id=" +
          id +
          "&password=" +
          postform.password.value +
          "&imageonly=true";
        fdel_req.open("GET", fdel_form, true);
        fdel_req.send();
        fdel_req.onreadystatechange = function() {
          if (fdel_req.readyState == 4) {
            var response = JSON.parse(fdel_req.responseText);
            if (response.state == "success") {
              alert("Archivo eliminado.");
              post.removeChild(file);
            } else if (response.state == "failed") alert(response.message);
          }
        };
      }
    });
    menu.appendChild(dfile);
  }
  e.stopPropagation();
  this.removeEventListener("click", showMenu);
  document.addEventListener("click", closeMenu);
}

function closeMenu(e) {
  var menu = document.getElementById("mnu-list");
  menu.parentElement.removeChild(menu);
  document.removeEventListener("click", closeMenu);
  var btn = document.getElementById("mnu-opened");
  btn.addEventListener("click", showMenu);
  btn.removeAttribute("id");
  e.preventDefault();
}

function searchSubjects() {
  var filter = document.getElementById("search").value.toLowerCase();
  var nodes = document
    .getElementsByClassName("list")[0]
    .getElementsByTagName("a");
  for (i = 0; i < nodes.length; i++) {
    if (
      nodes[i].innerHTML
        .toLowerCase()
        .split(/<\/?br[^>]*>\s*/im)[0]
        .includes(filter)
    )
      nodes[i].removeAttribute("style");
    else nodes[i].style.display = "none";
  }
}

function searchCatalog() {
  var filter = document.getElementById("catsearch").value.toLowerCase();
  var nodes = document.getElementsByClassName("cat");
  for (i = 0; i < nodes.length; i++) {
    if (
      nodes[i].innerText
        .toLowerCase()
        .substring(nodes[i].innerText.indexOf("R)") + 2)
        .includes(filter)
    )
      nodes[i].removeAttribute("style");
    else nodes[i].style.display = "none";
  }
}

var lastTime = 0;
var refreshInterval;
var refreshMaxTime = 30;
var refreshTime;
var manual = 0;
var serviceType = 0;
var thread_length = 0;
var thread_lastreply = 0;
var thread_title = "";
var thread_first_length = 0;
var http_request = new XMLHttpRequest();

function checkNew(e) {
  e.preventDefault();
  manual = 1;
  loadJSON();
  if (chk.checked) refreshMaxTime = 25;
}

function loadJSON() {
  if (chk.checked) stopCounter("...");
  if (manual) {
    document.getElementById("n").style.color = "gray";
    document.getElementById("n").innerText = "Revisando...";
  }
  var data_file;
  if (serviceType)
    data_file =
      "/cgi/api/thread?dir=" +
      postform.board.value +
      "&id=" +
      postform.parent.value +
      "&offset=" +
      thread_length +
      "&time=" +
      lastTime;
  else return false;
  http_request.open("GET", data_file, true);
  http_request.send();
}

function updateThread(posts, total_replies, serverTime) {
  thread_div = document.getElementById("thread");
  last_elem = document.getElementById("n");

  for (var i = 0; i < posts.length; i++) {
    post = posts[i];
    brd = postform.board.value;
    var div = document.createElement("div");
    div.className = "pst";
    div.id = "p" + post.id;
    if (post.IS_DELETED == 0) {
      s_name = post.name;
      if (post.tripcode) s_name += " " + post.tripcode;
      s_time = post.timestamp_formatted.replace(/\(.{1,3}\)/g, " ");
      if (post.file)
        s_img =
          '<a href="/' +
          brd +
          "/src/" +
          post.file +
          '" target="_blank" class="thm"><img src="/' +
          brd +
          "/mobile/" +
          post.thumb +
          '" /><br />' +
          Math.round(post.file_size / 1024) +
          "KB " +
          post.file
            .substring(post.file.lastIndexOf(".") + 1, post.file.length)
            .toUpperCase() +
          "</a>";
      else s_img = "";
    }
    if (serviceType == 1) {
      var pad = "0000" + (thread_length + i + 1);
      pad = pad.substr(pad.length - 4);
      if (post.IS_DELETED == 0)
        div.innerHTML =
          '<h3><a href="#" class="num">' +
          pad +
          "</a> " +
          s_name +
          "</h3>" +
          s_img +
          '<div class="msg">' +
          post.message +
          "</div><h4>" +
          s_time +
          '<a href="#" class="mnu">|||</a></h4>';
      else if (post.IS_DELETED == 1)
        div.innerHTML =
          '<h3 class="del"><a href="#" class="num">' +
          pad +
          "</a> : Eliminado por el usuario.</h3>";
      else
        div.innerHTML =
          '<h3 class="del"><a href="#" class="num">' +
          pad +
          "</a> : Eliminado por miembro del staff.</h3>";
    } else {
      if (post.IS_DELETED == 0) {
        div.innerHTML =
          "<h3>" +
          s_name +
          " " +
          s_time +
          ' <a href="#" class="num" name="' +
          post.id +
          '">' +
          post.id +
          '</a><a href="#" class="mnu">|||</a></h3>' +
          s_img +
          '<div class="msg">' +
          post.message +
          "</div>";
      } else if (post.IS_DELETED == 1) {
        div.innerHTML =
          '<h3 class="del"><a name="' +
          post.id +
          '"></a>No.' +
          post.id +
          " eliminado por el usuario.</h3>";
      } else {
        div.innerHTML =
          '<h3 class="del"><a name="' +
          post.id +
          '"></a>No.' +
          post.id +
          " eliminado por miembro del staff.</h3>";
      }
    }

    div.getElementsByClassName("mnu")[0].addEventListener("click", showMenu);
    div.getElementsByClassName("num")[0].addEventListener("click", postClick);
    thread_div.insertBefore(div, last_elem);
    document
      .getElementsByTagName("h1")[0]
      .getElementsByTagName("span")[0].innerText =
      "(" + (thread_length + i + 1) + ")";
  }

  if (posts.length > 0) {
    if (!manual) refreshMaxTime = 10;
    if (!document.hasFocus())
      if (posts.length > 1)
        notif(thread_title, posts.length + " nuevos mensajes");
      else notif(thread_title, "Un nuevo mensaje");
  } else {
    if (refreshMaxTime <= 60) refreshMaxTime += 5;
  }

  thread_length = parseInt(total_replies) + 1;
  new_unread = thread_length - thread_first_length;

  if (new_unread) document.title = "(" + new_unread + ") " + thread_title;
  else document.title = thread_title;
}

function notif(title, msg) {
  var n = new Notification(title, { body: msg });
  setTimeout(n.close.bind(n), 10000);
}

function counter() {
  if (refreshTime < 1) loadJSON();
  else {
    refreshTime--;
    document.getElementById("counter").innerHTML = refreshTime + 1;
  }
}

function detectService() {
  if (document.getElementById("thread") && document.getElementById("postform")) {
    thread_title =
      document.getElementsByTagName("h1")[0].innerHTML.split(" <span>")[0] +
      " - " +
      document.title;
    thread_length = parseInt(
      document
        .getElementsByTagName("h1")[0]
        .getElementsByTagName("span")[0]
        .innerText.slice(1, -1),
      10
    );
    thread_first_length = thread_length;
    if (document.body.className === "txt") {
      serviceType = 1;
      replylist = document.getElementsByClassName("pst");
      thread_lastreply = parseInt(
        replylist[replylist.length - 1].getElementsByClassName("num")[0]
          .innerText
      );
      if (thread_length == thread_lastreply) {
        serviceType = 1;
        document.getElementById("n2").setAttribute("style","border-top:1px solid #c6c7c8;border-left:1px solid #c6c7c8;display:inline-block;text-align:center;width:50%;");
        return true;
      } else return false;
    } else if (document.body.className === "img") {
      serviceType = 2;
      document.getElementById("n").innerText = "Ver nuevos posts";
      document
        .getElementById("n2")
        .setAttribute(
          "style",
          "border-top:1px solid #333;border-left:1px solid #333;display:inline-block;text-align:center;width:50%;"
        );
      replylist = document.getElementsByClassName("first");
      replylist += document.getElementsByClassName("pst");
      return true;
    }
  } else return false;
}

function startCounter() {
  refreshTime = refreshMaxTime;
  counter();
  refreshInterval = setInterval(counter, 1000);
}

function stopCounter(str) {
  clearInterval(refreshInterval);
  document.getElementById("counter").innerHTML = str;
}

function autoRefresh(e) {
  chk_snd = document.getElementById("autosound");
  if (document.getElementById("autorefresh").checked) {
    if (chk_snd) chk_snd.disabled = false;
    Notification.requestPermission();
    lastTime = Math.floor(Date.now() / 1000);
    refreshTime = refreshMaxTime;
    startCounter();
  } else {
    if (chk_snd) document.getElementById("autosound").disabled = true;
    stopCounter("OFF");
  }
}

http_request.onreadystatechange = function() {
  if (http_request.readyState == 4) {
    var jsonObj = JSON.parse(http_request.responseText);
    if (jsonObj.state == "success") {
      updateThread(jsonObj.posts, jsonObj.total_replies, jsonObj.time);
      lastTime = jsonObj.time;
      if (chk.checked) startCounter();
    }
    if (manual) {
      document.getElementById("n").style.color = "inherit";
      document.getElementById("n").innerText = "Ver nuevos posts";
    }
    manual = 0;
  }
};

function sortList(type) {
  for (var i = 0; i < srts.length; i++) srts[i].removeAttribute("class");
  srts[type].className = "sel";
  var cont = document.getElementById("to_sort");
  var elem = cont.getElementsByTagName("a");
  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]);
}

document.addEventListener("DOMContentLoaded", function(e) {
  if (localStorage.hasOwnProperty("weabot"))
    weabot = JSON.parse(localStorage.getItem("weabot"));
  else weabot = { name: null, email: null, password: null };

  var ids = document.getElementsByClassName("num");
  for (var i = 0; i < ids.length; i++)
    ids[i].addEventListener("click", postClick);

  var form = document.getElementById("postform");
  if (form) {
    setInputs();
    if (document.getElementById("post").value == "Responder")
      form.addEventListener("submit", sendPost);
  }

  if (document.getElementById("search"))
    document.getElementById("search").addEventListener("keyup", searchSubjects);
  if (document.getElementById("catsearch"))
    document
      .getElementById("catsearch")
      .addEventListener("keyup", searchCatalog);
  if (document.getElementById("to_sort")) {
    srts = document.getElementsByClassName("ord")[0].getElementsByTagName("a");
    for (var i = 0; i < srts.length; i++)
      srts[i].addEventListener("click", function(e) {
        e.preventDefault();
        sortList(this.dataset.sort);
      });
  }

  if (document.getElementById("thread")) {
    var mnu = document.createElement("a");
    mnu.href = "#";
    mnu.className = "mnu";
    mnu.innerHTML = "|||";
    if (document.body.className === "txt")
      var ft = document.getElementsByTagName("h4");
    else if (document.body.className === "img")
      var ft = document.getElementsByTagName("h3");
    for (var i = 0; i < ft.length; i++) {
      if (!ft[i].classList.contains("del")) {
        var cln = mnu.cloneNode(true);
        cln.addEventListener("click", showMenu);
        ft[i].appendChild(cln);
      }
    }
    
    var sjis = /(  \|  /|\  |/  | ̄ ̄||  |  ||\|  |  \|)/;
    var msg = document.getElementsByClassName("msg");
    for (var i=0; i<msg.length; i++) {
      if (msg[i].textContent.match(sjis)) {
       msg[i].classList.add("minisjis");
      }
    }
  }

  if (!detectService()) return;
  document.title = thread_title;
  document.getElementById("n").style.display = "inline-block";
  document.getElementById("n").style.width = "50%";
  document.getElementById("n").addEventListener("click", checkNew);
  var lbl = document.createElement("label");
  lbl.id = "auto";
  lbl.style.display = "block";
  lbl.style.padding = "6px 0";
  var btn = document.createElement("input");
  btn.id = "autorefresh";
  btn.setAttribute("type", "checkbox");
  btn.addEventListener("click", autoRefresh);
  var cnt = document.createElement("span");
  cnt.id = "counter";
  cnt.textContent = "OFF";
  document.getElementById("n2").appendChild(lbl);
  document.getElementById("auto").appendChild(btn);
  document
    .getElementById("auto")
    .appendChild(document.createTextNode(" Auto "));
  document.getElementById("auto").appendChild(cnt);

  chk = document.getElementById("autorefresh");
  if (localStorage.getItem("autorefreshmobile")) {
    chk.checked = true;
    autoRefresh();
  }
});

window.addEventListener("unload", function() {
  chk = document.getElementById("autorefresh");
  if (!serviceType) return;
  if (chk.checked) localStorage.setItem("autorefreshmobile", true);
  else localStorage.removeItem("autorefreshmobile");
});