/* Global functions */ function htmlspecialchars(str){ var map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' } return str.replace(/[&<>"']/g, function(m){return map[m];}); } function htmlspecialchars_decode(str){ var map = { '&': '&', '<': '<', '>': '>', '"': '"', ''': "'" } return str.replace(/&|<|>|"|'/g, function(m){return map[m];}); } function is_click_within(elem, classname, is_id = false){ while(true){ if(elem === null){ return false; } if( ( is_id === false && elem.className == classname ) || ( is_id === true && elem.id == classname ) ){ return elem; } elem = elem.parentElement; } } /* Prevent GET parameter pollution */ var form = document.getElementsByTagName("form"); if( form.length !== 0 && window.location.pathname != "/" && window.location.pathname != "/settings.php" && window.location.pathname != "/settings" ){ form = form[0]; var scraper_dropdown = document.getElementsByName("scraper")[0]; scraper_dropdown.addEventListener("change", function(choice){ submit(form); }); form.addEventListener("submit", function(e){ e.preventDefault(); submit(e.srcElement); }); } function submit(e){ var GET = ""; var first = true; if((s = document.getElementsByName("s")).length !== 0){ GET += "?s=" + encodeURIComponent(s[0].value).replaceAll("%20", "+"); first = false; } Array.from( e.getElementsByTagName("select") ).concat( Array.from( e.getElementsByTagName("input") ) ).forEach(function(el){ var firstelem = el.getElementsByTagName("option"); if( ( ( firstelem.length === 0 || firstelem[0].value != el.value ) && el.name != "" && el.value != "" && el.name != "s" ) || el.name == "scraper" || el.name == "nsfw" ){ if(first){ GET += "?"; first = false; }else{ GET += "&"; } GET += encodeURIComponent(el.name).replaceAll("%20", "+") + "=" + encodeURIComponent(el.value).replaceAll("%20", "+"); } }); window.location.href = GET; } /* Hide show more button when it's not needed on answers */ var answer_div = document.getElementsByClassName("answer"); if(answer_div.length !== 0){ answer_div = Array.from(answer_div); var spoiler_button_div = Array.from(document.getElementsByClassName("spoiler-button")); // execute on pageload hide_show_more(); window.addEventListener("resize", hide_show_more); function hide_show_more(){ var height = window.innerWidth >= 1000 ? 600 : 200; for(i=0; i' + '' + '' + htmlspecialchars(title) + ''; popup_body.innerHTML = ''; // make changes to DOM popup_body.style.display = "block"; popup_bg.style.display = "block"; popup_status.style.display = "table"; // store for rotation functions & changeimage() popup_image = document.getElementById("popup-image"); scalepopup(collection[collection_index], scale); centerpopup(); }else{ // click inside the image viewer // resize image if(is_click_within(click.target, "popup", true)){ if(mouse_move === false){ scale = 80; scalepopup(collection[collection_index], scale); centerpopup(); } }else{ if(is_click_within(click.target, "popup-status", true) === false){ // click outside the popup while its open // close it if(is_popup_shown){ hidepopup(); } } } } }); /* Scale image viewer */ popup_body.addEventListener("wheel", function(scroll){ event.preventDefault(); if( scroll.altKey || scroll.ctrlKey || scroll.shiftKey ){ var increment = 7; }else{ var increment = 14; } if(scroll.wheelDelta > 0){ // scrolling up scale = scale + increment; }else{ // scrolling down if(scale - increment > 7){ scale = scale - increment; } } // calculate relative size before scroll var pos = popup_body.getBoundingClientRect(); var x = (scroll.x - pos.x) / pos.width; var y = (scroll.y - pos.y) / pos.height; scalepopup(collection[collection_index], scale); // move popup to % we found pos = popup_body.getBoundingClientRect(); movepopup( popup_body, scroll.clientX - (x * pos.width), scroll.clientY - (y * pos.height) ); }); /* Keyboard controls */ document.addEventListener("keydown", function(key){ // close popup if( is_popup_shown && key.keyCode === 27 ){ hidepopup(); return; } if(is_popup_shown === false){ return; } if( key.altKey || key.ctrlKey || key.shiftKey ){ // mirror image switch(key.keyCode){ case 37: // left key.preventDefault(); mirror_x = true; break; case 38: // up key.preventDefault(); mirror_y = false; break; case 39: // right key.preventDefault(); mirror_x = false; break; case 40: // down key.preventDefault(); mirror_y = true; break; } }else{ // rotate image switch(key.keyCode){ case 37: // left key.preventDefault(); rotation = -90; break; case 38: // up key.preventDefault(); rotation = 0; break; case 39: // right key.preventDefault(); rotation = 90; break; case 40: // down key.preventDefault(); rotation = -180; break; } } popup_image.style.transform = "scale(" + (mirror_x ? "-1" : "1") + ", " + (mirror_y ? "-1" : "1") + ") " + "rotate(" + rotation + "deg" + ")"; }); } function getproxylink(url){ if(url.startsWith("data:")){ return htmlspecialchars(url); }else{ return '/proxy?i=' + encodeURIComponent(url); } } function hidepopup(){ is_popup_shown = false; popup_status.style.display = "none"; popup_body.style.display = "none"; popup_bg.style.display = "none"; } function scalepopup(size, scale){ var ratio = Math.min( (window.innerWidth * (scale / 100)) / collection[collection_index].width, (window.innerHeight * (scale / 100)) / collection[collection_index].height ); popup_body.style.width = size.width * ratio + "px"; popup_body.style.height = size.height * ratio + "px"; } function centerpopup(){ var size = popup_body.getBoundingClientRect(); var size = { "width": parseInt(size.width), "height": parseInt(size.height) }; movepopup( popup_body, (window.innerWidth / 2) - (size.width / 2), (window.innerHeight / 2) - (size.height / 2) ); } function movepopup(popup_body, x, y){ popup_body.style.left = x + "px"; popup_body.style.top = y + "px"; } function changeimage(event){ // reset rotation params mirror_x = false; mirror_y = false; rotation = 0; scale = 60; collection_index = parseInt(event.target.value); // we set innerHTML otherwise old image lingers a little popup_body.innerHTML = ''; // store for rotation functions & changeimage() popup_image = document.getElementById("popup-image"); scalepopup(collection[collection_index], scale); centerpopup(); } /* Shortcuts */ var searchbox_wrapper = document.getElementsByClassName("searchbox"); if(searchbox_wrapper.length !== 0){ searchbox_wrapper = searchbox_wrapper[0]; var searchbox = searchbox_wrapper.getElementsByTagName("input")[1]; document.addEventListener("keydown", function(key){ switch(key.keyCode){ case 191: // 191 = / if(document.activeElement.tagName == "INPUT"){ // already focused, ignore break; } if( typeof is_popup_shown != "undefined" && is_popup_shown ){ hidepopup(); } window.scrollTo(0, 0); searchbox.focus(); key.preventDefault(); break; } }); }