- // ==UserScript==
- // @name 4chan-Ignoring-Enhancements
- // @namespace http://tampermonkey.net/
- // @version 3.7
- // @description 4chan Pain Kill Extension
- // @author ECHibiki-/qa/
- // @match http://boards.4chan.org/*
- // @match https://boards.4chan.org/*
- // @include https://boards.4chan.org/*
- // @include http://boards.4chan.org/*
- // @run-at document-start
- // ==/UserScript==
-
- /*
- This userscript enables 4chan users to hide images in the catalog and threads.
- Gives the ability to hide images with ctrl+shift+click. Stores in browser memory for new sessions.
- Also includes the ability to do word replacements with a regex replacement system.
- */
-
- var local_store_threads = [];
- var browser;
- var finished = false;
- var window_displayed = false;
- var default_expire_time = 172800000;
-
- var expire_time;
- var md5_filters;
- var md5_filters_arr = [];
-
- var number_of_filters = 0;
- var initial_filters = [];
- var filtered_threads = [];
- var kill = [];
- var finished = false;
- var observer;
-
- var blank_png = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAALiMAAC4jAHM9rsvAAAAG3RFWHRTb2Z0d2FyZQBDZWxzeXMgU3R1ZGlvIFRvb2zBp+F8AAAAo0lEQVR42u3RAQ0AAAjDMO5f9LFBSCdhTdvRnQIEiIAAERAgAgJEQIC4AERAgAgIEAEBIiBABERAgAgIEAEBIiBABERAgAgIEAEBIiBABERAgAgIEAEBIiBABERAgAgIEAEBIiBABERAgAgIEAEBIiBABERAgAgIEAEBIiBABERAgAgIEAEBIiBABERAgAgIEAEBIiBABAQIECACAkRAgAjI9xbzUCtI4axs4wAAAABJRU5ErkJggg==";
-
- //The following is image hiding functions.
- //The next are filter functions
- //The last are setup functions
-
- /**
- 0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000//
- //0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000//
- //0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000//
- //0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000//
- //0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000//
- //0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000//
- //0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000//
- //0000000000000000000000000000000000000000000000000000000000000000000000000000000////0000000000000000000000000000000000000000000000000000000000000000000000000000000//
- **/
-
-
- //is storage possible
- function storageAvailable(type) {
- try {
- var storage = window[type],
- x = '__storage_test__';
- storage.setItem(x, x);
- storage.removeItem(x);
- return true;
- }
- catch(e) {
- //From https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API
- return e instanceof DOMException && (
- // everything except Firefox
- e.code === 22 ||
- // Firefox
- e.code === 1014 ||
- // test name field too, because code might not be present
- // everything except Firefox
- e.name === 'QuotaExceededError' ||
- // Firefox
- e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&
- // acknowledge QuotaExceededError only if there's something already stored
- storage.length !== 0;
- }
- }
-
- //What Browser
- function detectBrowser() {
- if((navigator.userAgent.indexOf("Opera") || navigator.userAgent.indexOf('OPR')) != -1 )
- {
- console.log("Opera");
- return 0;
- }
- else if(navigator.userAgent.indexOf("Chrome") != -1 )
- {
- console.log("Chrome");
- return 1;
- }
- else if(navigator.userAgent.indexOf("Safari") != -1)
- {
- console.log("Safari");
- return 2;
- }
- else if(navigator.userAgent.indexOf("Firefox") != -1 )
- {
- console.log("FireFox");
- return 3;
- }
- else if((navigator.userAgent.indexOf("MSIE") != -1 ) || (!!document.documentMode == true )) //IF IE > 10
- {
- console.log("IE");
- return 4;
- }
- else
- {
- console.log("Other");
- return -1;
- }
- }
-
- //hide image onclick listener.
- //Method 404's a given image. This 404'ing allows image dissabling to be toggled on and off.
- //Post number associated with the image is stored in local storage.
- function hideImage(event){
- var hide_index = this.src.indexOf("base64");
- if((event.ctrlKey && event.shiftKey) && hide_index == -1){
- event.preventDefault();
- event.stopPropagation();
- if (storageAvailable('localStorage')) {
- localStorage.setItem(this.getAttribute("hide-grouping"), Date.now());
- }
- else {
- console.log("No Storage");
- }
- //some browsers require a querry on the image URL to 404 it.
- var nodes = document.querySelectorAll('img[hide-grouping="'+this.getAttribute("hide-grouping")+'"]');
- nodes.forEach(function(node){
- if(node.getAttribute("hide-grouping") == event.target.getAttribute("hide-grouping")){
- node.setAttribute("hidden-src", node.src);
- node.src = blank_png;//this.src + ".HIDDEN" + "?" + Date.now();
- }
- });
- return false;
- }
- else if(event.ctrlKey && event.shiftKey){
- event.preventDefault();
- event.stopPropagation();
- if (storageAvailable('localStorage')) {
- localStorage.removeItem(this.getAttribute("hide-grouping"));
- }
- else {
- console.log("No Storage");
- }
- var nodes = document.querySelectorAll('img[hide-grouping="'+this.getAttribute("hide-grouping")+'"]');
- nodes.forEach(function(node){
- if(node.getAttribute("hide-grouping") == event.target.getAttribute("hide-grouping")){
- node.src = node.getAttribute("hidden-src");
- }
- });
- return false;
- }
- return true;
- }
-
- //functions to find properties by regex
- function getPropertyByRegex(obj,propName) {
- var re = new RegExp("^" + propName + "(\\[\\d*\\])?$"),
- key;
- var rtnArray = [];
- for (key in obj)
- if (re.test(key))
- rtnArray.push(key);
- return rtnArray;
- }
-
- //retrieve from memory the hidden images
- //Images are stored in memory as f<ID_NUMBER>IMG and recalled using the storage_key
- //Function makes a check to see if the hiding time limit for the thread has expired or not.
- //Note: Must have the DOM itterate through before retrieval
- function retrieveStates(){
- var storage_position = 0,
- oJson = {},
- storage_key;
- while(storage_position < window.localStorage.length) {
- storage_key = window.localStorage.key(storage_position);
- oJson[storage_key] = window.localStorage.getItem(storage_key);
- storage_position++;
- }
- local_store_threads = getPropertyByRegex(oJson,"[0-9]+IMG");
- expire_time = localStorage.getItem("Expiration_Time");
- md5_filters = localStorage.getItem("MD5_List_FSE");
- if(md5_filters !== null)
- md5_filters_arr = md5_filters.split("\n");
- md5_filters_arr.forEach(function(md5, index){
- md5 = md5.trim();
- md5_filters_arr[index] = md5.substring(1, md5.length - 1);
- });
- }
-
-
- //settings for time expiration on image hiding
- function hideWindow(){
- var style = document.createElement('style');
- style.innerHTML = ".inputs{background-color:rgb(200,200,200);margin:5px 7px;width:100px;}";
- document.body.appendChild(style);
-
- var background_div = document.createElement("div");
- background_div.setAttribute("style", "border:solid 1px black;position:fixed;width:100%;height:100%;background-color:rgba(200,200,200,0.3);top:0;left:0;display:none; z-index:9");
- background_div.setAttribute("id", "hiBackground");
- document.body.appendChild(background_div);
- background_div.addEventListener("click", hideToggle);
-
- var window_div = document.createElement("div");
- window_div.setAttribute("style", "border:solid 1px black;position:fixed;width:400px;background-color:rgb(200,200,200);left:40%;top:20%;margin-bottom:0; display:none; z-index:10");
- window_div.setAttribute("id", "hiWindow");
-
- var close_div = document.createElement("div");
- close_div.setAttribute("style", "border:solid 1px black;position:absolute;width:25px;height:25px;background-color:rgba(255,100,90,0.9); right:3px;top:3px; z-index:10");
- close_div.addEventListener("click", hideToggle);
- window_div.appendChild(close_div);
-
- var title_para = document.createElement("p");
- title_para.setAttribute("style", "margin-left:5px;margin-top:5px");
- var title_text = document.createTextNode("Filter Settings");
- title_para.appendChild(title_text);
- window_div.appendChild(title_para);
-
- var container_div = document.createElement("div");
- container_div.setAttribute("style","background-color:white;margin:0 0;padding:5px;");
- window_div.appendChild(container_div);
-
- var expiration_label = document.createElement("label");
- var expiration_text = document.createTextNode("Non-MD5 Expiration Time(hours): ");
- expiration_label.appendChild(expiration_text);
- container_div.appendChild(expiration_label);
- var expiration_input = document.createElement("input");
- expiration_input.setAttribute("id", "Expiration_Time");
-
- expiration_input.value = expire_time / 3600000;
-
- container_div.appendChild(expiration_input);
- container_div.appendChild(expiration_input);
- container_div.appendChild(document.createElement("hr"));
-
- var md5_label = document.createElement("label");
- var md5_text = document.createTextNode("MD5 Filters:");
- var md5_textarea = document.createElement("TextArea");
- md5_textarea.setAttribute("style", "width:98%;height:217px");
-
- if(md5_filters !== null)
- md5_textarea.value = md5_filters;
-
- md5_textarea.setAttribute("placeholder", "Enter MD5 like on 4chanX... \n/abc123/\n/def890/");
- md5_textarea.setAttribute("ID", "MD5_List_FSE");
- container_div.appendChild(md5_label);
- md5_label.appendChild(md5_text);
- container_div.appendChild(document.createElement("br"));
- container_div.appendChild(md5_textarea);
-
- container_div.appendChild(document.createElement("hr"));
-
- var set_button = document.createElement("input");
- set_button.setAttribute("type", "button");
- set_button.setAttribute("id", "setTime");
- set_button.setAttribute("value", "Set");
- set_button.addEventListener("click", function(){
- if (storageAvailable('localStorage')) {
- var time = document.getElementById("Expiration_Time");
- var millisecond_time = time.value * 3600000;
- if (millisecond_time == 0 || millisecond_time === null || millisecond_time === undefined) millisecond_time = default_expire_time;
- expire_time = millisecond_time;
- localStorage.setItem("Expiration_Time", millisecond_time);
-
- md5_filters = document.getElementById("MD5_List_FSE").value;
- localStorage.setItem("MD5_List_FSE", md5_filters);
-
- hideToggle();
- }
- });
- container_div.appendChild(set_button);
-
- document.body.appendChild(window_div);
-
- }
-
- function hideToggle(){
- if(window_displayed){
- document.getElementById("hiWindow").style.display = "none";
- document.getElementById("hiBackground").style.display = "none";
- window_displayed = false;
- }
- else{
- document.getElementById("hiWindow").style.display = "inline-block";
- document.getElementById("hiBackground").style.display = "inline-block";
- window_displayed = true;
- }
- }
-
- function hideButton(){
- var hide_button = document.createElement("input");
- hide_button.setAttribute("Value", "Hide Image Settings");
- hide_button.setAttribute("type", "button");
- hide_button.setAttribute("style", "position:absolute;top:45px");
- hideWindow();
- if(document.body === null){
- setTimeout(hideButton, 30);
- }
- else{
- document.body.appendChild(hide_button);
- hide_button.addEventListener("click", hideToggle);
- }
- }
-
-
- /**111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111//
- //111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111//
- //111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111//
- //111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111//
- //111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111//
- //111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111//
- //111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111//
- //111111111111111111111111111111111111111111111111111111111111////111111111111111111111111111111111111111111111111111111111111//
- */
-
- //store filter settings
- function loadSettings(){
- var filter_setting = 0,
- oJson = {},
- storage_key;
- while( filter_setting < window.localStorage.length) {
- filter_setting++;
- storage_key = window.localStorage.key(filter_setting);
- oJson[storage_key] = window.localStorage.getItem(storage_key);
- }
- number_of_filters = oJson["q"];
- filters = getPropertyByRegex(oJson,"filter[0-9]*");
- filters.forEach(function(filter){
- initial_filters.push(formatSettings(oJson[filter]));
- });
- }
-
- function saveSettings(){
-
- kill = []; //Determins if a certain pattern should be used or not due to regex errors from the user
-
- if(storageAvailable('localStorage')){
- window.localStorage.setItem("q", number_of_filters);
- for (var pattern_input = 0 ; pattern_input < number_of_filters; pattern_input++){
- var pattern_to_store = document.getElementById("Pattern"+pattern_input).value;
- var replacement_to_store = document.getElementById("Replacement"+pattern_input).value;
- var setting = "g";
- if(pattern_to_store === "" || replacement_to_store === "") continue;
- if (pattern_to_store.charAt(0) == "/" && pattern_to_store.charAt(pattern_to_store.length - 1) == "/"){
- pattern_to_store = pattern_to_store + setting;
- }
- else if(pattern_to_store.charAt(0) !== "/" && pattern_to_store.substr(pattern_to_store.length - 2).match(/\/[a-zA-Z$]/) == null){
- pattern_to_store = "/" + pattern_to_store + "/" + setting;
- }
- document.getElementById("Pattern"+pattern_input).value = pattern_to_store;
- var save_string = '"' + document.getElementById("Active"+pattern_input).checked + '"-"' + pattern_to_store + '"-"' + replacement_to_store + '"';
- window.localStorage.setItem("filter" + pattern_input, save_string);
- }
- }
- alert("Replacements Saved");
- }
-
- //Splits the saved settings into components
- function formatSettings(input){
- var rtn = input.split('"-"');
- var i = 0;
- rtn.forEach(function(filter){
- rtn[i] = filter.replace("\"", "");
- i++;
- });
- return rtn;
- }
-
- function filterWindow(){
- var style = document.createElement('style');
- style.innerHTML = ".inputs{background-color:rgb(200,200,200);margin:5px 7px;width:100px;}";
- document.body.appendChild(style);
-
- var background_div = document.createElement("div");
- background_div.setAttribute("style", "border:solid 1px black;position:fixed;width:100%;height:100%;background-color:rgba(200,200,200,0.3);top:0;left:0;display:none; z-index:9");
- background_div.setAttribute("id", "FilterBackground");
- document.body.appendChild(background_div);
- background_div.addEventListener("click", filterToggle);
-
- var window_div = document.createElement("div");
- window_div.setAttribute("style", "border:solid 1px black;position:fixed;width:400px;background-color:rgb(200,200,200);left:40%;top:20%;margin-bottom:0; display:none; z-index:10");
- window_div.setAttribute("id", "FilterWindow");
-
- var close_div = document.createElement("div");
- close_div.setAttribute("style", "border:solid 1px black;position:absolute;width:25px;height:25px;background-color:rgba(255,100,90,0.9); right:3px;top:3px; z-index:10");
- close_div.addEventListener("click", filterToggle);
- window_div.appendChild(close_div);
-
- var title_para = document.createElement("p");
- title_para.setAttribute("style", "margin-left:5px;margin-top:5px");
- var title_text = document.createTextNode("Filter Settings");
- title_para.appendChild(title_text);
- window_div.appendChild(title_para);
-
- var container_div = document.createElement("div");
- container_div.setAttribute("style","background-color:white;margin:0 0;padding:5px;");
- window_div.appendChild(container_div);
-
- var filter_table = document.createElement("table");
- filter_table.setAttribute("style", "text-align:center;");
- filter_table.setAttribute("id", "filter_table");
- container_div.appendChild(filter_table);
-
- var table_row = document.createElement("tr");
- filter_table.appendChild(table_row);
- var table_head_active = document.createElement("th");
- var head_text_active = document.createTextNode("Active");
- table_head_active.appendChild(head_text_active);
- filter_table.appendChild(table_head_active);
- var table_head_pattern = document.createElement("th");
- var headTextPattern = document.createTextNode("Pattern");
- table_head_pattern.appendChild(headTextPattern);
- filter_table.appendChild(table_head_pattern);
- var table_head_replacement = document.createElement("th");
- var head_text_replacement = document.createTextNode("Replacement");
- table_head_replacement.appendChild(head_text_replacement);
- filter_table.appendChild(table_head_replacement);
-
-
- //Create the pattern table
- //loop to create rows
- if (number_of_filters === 0 || isNaN(number_of_filters)) number_of_filters = 6;
- for (var i = 0; i < number_of_filters ; i++){
- var table_row_contents = document.createElement("tr");
- table_row_contents.setAttribute("id", "FilterRow" + i);
-
- var table_data_active = document.createElement("td");
- var table_checkbox_active = document.createElement("input");
- table_checkbox_active.setAttribute("type", "checkbox");
- table_checkbox_active.setAttribute("id", "Active" + i);
- table_data_active.appendChild(table_checkbox_active);
- table_row_contents.appendChild(table_data_active);
-
- var table_data_pattern = document.createElement("td");
- var table_input_pattern = document.createElement("input");
- table_input_pattern.setAttribute("class", "inputs");
- table_input_pattern.setAttribute("id", "Pattern" + i);
- table_data_pattern.appendChild(table_input_pattern);
- table_row_contents.appendChild(table_data_pattern);
-
- var table_data_replacement = document.createElement("td");
- var table_input_replacement = document.createElement("input");
- table_input_replacement.setAttribute("class", "inputs");
- table_input_replacement.setAttribute("id", "Replacement" + i);
- table_data_replacement.appendChild(table_input_replacement);
- table_row_contents.appendChild(table_data_replacement);
-
- filter_table.appendChild(table_row_contents);
- }
-
- var table_last_contents = document.createElement("tr");
-
- var table_add_collumn = document.createElement("td");
- var table_add_row_button = document.createElement("input");
- var table_subtract_row_button = document.createElement("input");
- table_subtract_row_button.setAttribute("type", "button");
- table_subtract_row_button.setAttribute("value", "-");
- table_subtract_row_button.setAttribute("style", "padding: 7px 0; margin:5px 0;");
- table_add_collumn.appendChild(table_subtract_row_button);
- table_subtract_row_button.addEventListener("click", removeRow);
- table_add_row_button.setAttribute("type", "button");
- table_add_row_button.setAttribute("value", "+");
- table_add_row_button.setAttribute("style", "padding: 7px 0; margin:5px 0;");
- table_add_collumn.appendChild(table_add_row_button);
- table_add_row_button.addEventListener("click", addRow);
-
- table_last_contents.appendChild(table_add_collumn);
-
- var table_set_collumn = document.createElement("td");
- var table_confirm_button = document.createElement("input");
- table_confirm_button.setAttribute("type", "button");
- table_confirm_button.setAttribute("id", "table_confirm_button");
- table_confirm_button.setAttribute("value", "Set Replacements");
- table_confirm_button.setAttribute("style", "padding: 7px 0; margin:5px 0;");
- table_confirm_button.addEventListener("click", saveSettings);
- table_confirm_button.addEventListener("click", modifyDOM);
- table_confirm_button.addEventListener("click", filterToggle);
- table_set_collumn.appendChild(table_confirm_button);
- table_last_contents.appendChild(table_set_collumn);
-
-
- var table_close_collumn = document.createElement("td");
- var table_close_button = document.createElement("input");
- table_close_button.setAttribute("type", "button");
- table_close_button.setAttribute("value", "Close Menu");
- table_close_button.setAttribute("style", "padding: 7px 0; margin:5px 0;");
- table_close_button.addEventListener("click", filterToggle);
- table_close_collumn.appendChild(table_close_button);
- table_last_contents.appendChild(table_close_collumn);
-
- filter_table.appendChild(table_last_contents);
-
- document.body.appendChild(window_div);
-
- }
-
- function filterToggle(){
- if(window_displayed){
- document.getElementById("FilterWindow").style.display = "none";
- document.getElementById("FilterBackground").style.display = "none";
- window_displayed = false;
- }
- else{
- document.getElementById("FilterWindow").style.display = "inline-block";
- document.getElementById("FilterBackground").style.display = "inline-block";
- window_displayed = true;
- }
- }
-
- function filterButton(){
- var filter_button = document.createElement("input");
- filter_button.setAttribute("Value", "Word Filter Settings");
- filter_button.setAttribute("type", "button");
- filter_button.setAttribute("style", "position:absolute;top:75px");
- filter_button.addEventListener("click", filterWindow);
- document.body.appendChild(filter_button);
- filter_button.addEventListener("click", filterToggle);
- }
-
- function addRow(){
- var filter_table = document.getElementById("filter_table");
- filter_table.deleteRow(parseInt(number_of_filters) + 1);
- number_of_filters++;
-
- var table_row_contents = document.createElement("tr");
- table_row_contents.setAttribute("id", "FilterRow" + (number_of_filters - 1));
-
- var table_data_active = document.createElement("td");
- var table_checkbox_active = document.createElement("input");
- table_checkbox_active.setAttribute("type", "checkbox");
- table_checkbox_active.setAttribute("id", "Active" + (number_of_filters - 1));
- table_data_active.appendChild(table_checkbox_active);
- table_row_contents.appendChild(table_data_active);
-
- var table_data_pattern = document.createElement("td");
- var table_input_pattern = document.createElement("input");
- table_input_pattern.setAttribute("class", "inputs");
- table_input_pattern.setAttribute("id", "Pattern" + (number_of_filters - 1));
- table_data_pattern.appendChild(table_input_pattern);
- table_row_contents.appendChild(table_data_pattern);
-
- var table_data_replacement = document.createElement("td");
- var table_input_replacement = document.createElement("input");
- table_input_replacement.setAttribute("class", "inputs");
- table_input_replacement.setAttribute("id", "Replacement" + (number_of_filters - 1));
- table_data_replacement.appendChild(table_input_replacement);
- table_row_contents.appendChild(table_data_replacement);
-
- filter_table.appendChild(table_row_contents);
-
- var table_last_contents = document.createElement("tr");
-
- var table_add_collumn = document.createElement("td");
- var table_add_row_button = document.createElement("input");
- var table_subtract_row_button = document.createElement("input");
- table_subtract_row_button.setAttribute("type", "button");
- table_subtract_row_button.setAttribute("value", "-");
- table_subtract_row_button.setAttribute("style", "padding: 7px 0; margin:5px 0;");
- table_add_collumn.appendChild(table_subtract_row_button);
- table_subtract_row_button.addEventListener("click", removeRow);
- table_add_row_button.setAttribute("type", "button");
- table_add_row_button.setAttribute("value", "+");
- table_add_row_button.setAttribute("style", "padding: 7px 0; margin:5px 0;");
- table_add_collumn.appendChild(table_add_row_button);
- table_add_row_button.addEventListener("click", addRow);
-
- table_last_contents.appendChild(table_add_collumn);
-
- var table_set_collumn = document.createElement("td");
- var table_confirm_button = document.createElement("input");
- table_confirm_button.setAttribute("type", "button");
- table_confirm_button.setAttribute("id", "table_confirm_button");
- table_confirm_button.setAttribute("value", "Set Replacements");
- table_confirm_button.setAttribute("style", "padding: 7px 0; margin:5px 0;");
- table_confirm_button.addEventListener("click", saveSettings);
- table_confirm_button.addEventListener("click", modifyDOM);
- table_confirm_button.addEventListener("click", filterToggle);
- table_set_collumn.appendChild(table_confirm_button);
- table_last_contents.appendChild(table_set_collumn);
-
- var table_close_collumn = document.createElement("td");
- var table_close_button = document.createElement("input");
- table_close_button.setAttribute("type", "button");
- table_close_button.setAttribute("value", "Close Menu");
- table_close_button.setAttribute("style", "padding: 7px 0; margin:5px 0;");
- table_close_button.addEventListener("click", filterToggle);
- table_close_collumn.appendChild(table_close_button);
- table_last_contents.appendChild(table_close_collumn);
-
- filter_table.appendChild(table_last_contents);
- }
-
- function removeRow(){
- var filter_table = document.getElementById("filter_table");
- if(number_of_filters != 0){
- filter_table.deleteRow(number_of_filters);
- number_of_filters--;
- }
- }
-
- function setTable(){
- var filter_count = 0;
- initial_filters.forEach(function(filter){
- if(filter[2] === null || filter[1] === null || filter[0] === null || filter_count == number_of_filters) return;
- if(filter[0] == "true"){
- document.getElementById("Active"+filter_count).checked = true;
- }
- else if(filter[0] == "false"){
- document.getElementById("Active"+filter_count).checked = false;
- }
- document.getElementById("Pattern"+filter_count).value = filter[1];
- document.getElementById("Replacement"+filter_count).value = filter[2];
- filter_count++;
- });
- }
-
-
- //222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111//
- //222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111//
- //222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111//
- //222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111//
- //222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111//
- //222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111//
- //222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111//
- //222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111//
- //222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111//
- //222222222222222222222222222222222222222222222222222222222222////2222222222222222222222222222222222222222222222222222222222221111111111111111111111111111//
-
- //Functions to set the DOM listener and observers
-
- var hidden_count = 0;
- function modifyDOM(){
- var start = document.getElementById("delform");
- var itterator = document.createTreeWalker(start, NodeFilter.SHOW_ELEMENTS, NodeFilter.SHOW_ELEMENTS);
- var node = "";
-
- while((node = itterator.nextNode())){
- decisionProcess(node, itterator);
- }
- if(!page_setup)
- console.log("HIDDEN THREADS: " + hidden_count);
- }
-
- function decisionProcess(node, itterator){
- var cname = node.className;
- var tag = node.tagName;
- if(tag === "IMG" || tag === "img"){
- if(!/\d+IMG/.test(node.getAttribute("hide-grouping")) && (node.getAttribute("data-md5") !== null)){
- filterImage(node);
- }
- }
- else if(cname == "postMessage"){
- var blockquote_id = node.id;
- var already_filtered = false;
- filtered_threads.forEach(function(thread_id){
- if(thread_id == blockquote_id) {
- already_filtered = true;
- return;
- }
- });
- if(!already_filtered){
- if(itterator == undefined) itterator = document.createTreeWalker(node, NodeFilter.SHOW_ELEMENTS, NodeFilter.SHOW_ELEMENTS);
- var localNode;
- while((localNode = itterator.nextNode())){
- var className = localNode.className;
- if(className == undefined || className == "quotelink"){
- for(var i = 0 ; i < number_of_filters; i++){
- if(kill[i] == true) continue;
- filter = document.getElementById("Pattern"+i);
- replacement = document.getElementById("Replacement"+i);
- active = document.getElementById("Active"+i);
- if(active.checked){
- var lastChar = filter.value.length - 1;
- var filterText = filter.value;
- if(filterText === "") break;
- var setting = filterText.substr(lastChar);
- filterText = filterText.substr(1, lastChar-2);
- try{
- var regex = new RegExp(filterText, setting);
- var node_text = localNode.textContent;
- if(regex.test(node_text)){
- localNode.textContent = node_text.replace(regex, replacement.value);
- filtered_threads.push(blockquote_id);
- }
- }
- catch(e){
- alert(i + "'s regex was invalid");
- kill[i] = true;
- }
- }
- }
- }
- else break;
- }
- }
- }
- }
-
- function filterImage(node){
- var sister_node = node.parentNode.parentNode.parentNode.getElementsByClassName("catalog-thumb")[0]; // the catalog sister to index
- if(sister_node === undefined) sister_node = document.createElement("IMG");
-
- node.setAttribute("hide-grouping", node.parentNode.parentNode.id.substring(1) + "IMG");
- sister_node.setAttribute("hide-grouping", node.parentNode.parentNode.id.substring(1) + "IMG");
-
- node.addEventListener("click", hideImage, {passive:false, capture:false, once:false});
- sister_node.addEventListener("click", hideImage, {passive:false, capture:false, once:false});
-
- var threadstore_len = local_store_threads.length;
- var node_group_id = node.getAttribute("hide-grouping");
-
- for(var thread = 0 ; thread < threadstore_len; thread++){
- if(node_group_id == local_store_threads[thread]){
- node.setAttribute("hidden-src", node.src);
- node.src = blank_png;//this.src + ".HIDDEN" + "?" + Date.now();
-
- sister_node.setAttribute("hidden-src", sister_node.src);
- sister_node.src = blank_png;//this.src + ".HIDDEN" + "?" + Date.now();
-
- hidden_count++;
- return;
- }
- }
- //index node holds the MD5
- var node_md5 = node.getAttribute("data-md5");
- var md5_filters_arr_len = md5_filters_arr.length;
- for(var md5 = 0 ; md5 < md5_filters_arr_len; md5++){
- if(node_md5 == md5_filters_arr[md5]){
- node.setAttribute("hidden-src", node.src);
- node.src = blank_png;//this.src + ".HIDDEN" + "?" + Date.now();
-
- sister_node.setAttribute("hidden-src", sister_node.src);
- sister_node.src = blank_png;//this.src + ".HIDDEN" + "?" + Date.now();
-
- hidden_count++;
- return;
- }
- }
- }
-
- function hoverUIObserver(mutations){
- mutations.forEach(function(mutation){
- mutation.addedNodes.forEach(function(image_node){
- var is_embeded_post;
- if(image_node.tagName == "DIV") {
- is_embeded_post = true;
- image_node = image_node.getElementsByClassName("postContainer")[0];
- if(image_node === undefined) return;
- }
-
- var unprocessed_id = image_node.getAttribute("data-full-i-d");
- if (unprocessed_id === null) return;
- var proccessed_id = unprocessed_id.substring(unprocessed_id.indexOf(".") + 1);
- var image_node_id = proccessed_id + "IMG";
- if(is_embeded_post) image_node = image_node.getElementsByTagName("IMG")[0];
- if(image_node === undefined) return;
-
- var threadstore_len = local_store_threads.length;
- for(var thread = 0 ; thread < threadstore_len; thread++){
- if(image_node_id == local_store_threads[thread]){
- image_node.removeAttribute("src");
- return;
- }
- }
- //thread node holds the MD5
- var node_md5;
- if(is_embeded_post) node_md5 = image_node.getAttribute("data-md5");
- else node_md5 = document.getElementById("f" + proccessed_id).getElementsByTagName("IMG")[0].getAttribute("data-md5");
- var md5_filters_arr_len = md5_filters_arr.length;
- for(var md5 = 0 ; md5 < md5_filters_arr_len; md5++){
- if(node_md5 == md5_filters_arr[md5]){
- image_node.removeAttribute("src");
- return;
- }
- }
- });
- });
- }
-
- //initial onload setup
- function hideSetup(){
- retrieveStates();
- hideButton();
- }
-
- function filterSetup(){
- loadSettings();
- filterButton();
- filterWindow();
- setTable();
- }
-
- function pkxSetup(){
- expire_time = localStorage.getItem("Expiration_Time");
- md5_filters = localStorage.getItem("MD5_List_FSE");
-
- hideSetup();
- filterSetup();
- // initial_setup_observer.disconnect();
- modifyDOM();
- document.addEventListener('PostsInserted',function(e){
- retrieveStates();
- modifyDOM();
- });
- new MutationObserver(function(mutations){
- retrieveStates();
- hoverUIObserver(mutations);
- }).observe(document.getElementById("hoverUI"), {childList: true});
- }
-
- //4chanX exists
- var page_setup = false;
- document.addEventListener('4chanXInitFinished', function(e) {
- browser = detectBrowser();
- pkxSetup();
- console.log("Script loaded: 4chanPKX");
- page_setup = true;
- }, false);