document.addEventListener("DOMContentLoaded", function(event) { hookShowHideUi() }) // Hide Links function enableHidePostLink(postElem) { var postID=postElem.id var hideElem=document.getElementById('hide'+postElem.boardUri+'Post'+postID) if (!hideElem) { var lq=postElem.querySelector('.linkQuote') var link=document.createElement('a') link.innerHTML='[X]' link.href='#' link.className='hidePost' link.id='hide'+postElem.boardUri+'Post'+postID //link.style.textDecoration='underline' link.onclick=function() { console.log('hiding post', postID) postElem.style.display='none' setSetting('hide'+postElem.boardUri+'Post'+postID, true, 365*10) enableShowPostLink(postElem) return false } var space=document.createElement('span') space.innerHTML=' ' lq.parentNode.insertBefore(link, lq.nextSibling) lq.parentNode.insertBefore(space, lq.nextSibling) } else { hideElem.style.display='inline' } } function getAllUserEntities(userID) { var entities=[] var allLabels=document.querySelectorAll('.labelId') //console.log('got', allLabels.length, allLabels) for(var j in allLabels) { var lbl=allLabels[j] if (lbl.postUserID==userID) { //var entity=lbl.parentNode.parentNode.parentNode var entity=recurseUpSync(lbl, function(checkElem) { return checkElem.id && checkElem.dataset.boarduri; }); //console.log('found', entity.id, entity) //entity.style.display='none' entities.push(entity) } } console.log('user', userID, 'has', entities.length, 'entities') return entities } function enableHideUserLink(threadElem, userID, canHideOP) { var threadID=threadElem.id /* var showElem=document.getElementById('ShowThread'+threadID) if (showElem) { showElem.style.display='none' } */ var hideElem=document.getElementById('hide'+threadElem.boardUri+'_'+threadID+'User'+userID) if (!hideElem) { var reply=threadElem.querySelector('.linkReply') if (!reply) { reply=threadElem.querySelector('.linkQuote') } var link=document.createElement('a') link.innerHTML='[Hide User Posts]' if (canHideOP) { link.innerHTML='[Hide User]' } link.id='hide'+threadElem.boardUri+'_'+threadID+'User'+userID link.style.textDecoration='underline' link.style.cursor = 'pointer' //link.href = '#' link.onclick=function() { console.log('hiding User', userID) //threadElem.style.display='none' /* var allLabels=document.querySelectorAll('.labelId') console.log('got', allLabels.length, allLabels) for(var j in allLabels) { var lbl=allLabels[j] if (lbl.innerHTML==userID) { var entity=lbl.parentNode.parentNode.parentNode console.log('hiding', entity.id, entity) entity.style.display='none' } } */ var entities=getAllUserEntities(userID) for(var j in entities) { if (!canHideOP) { // if we can't hide it // make sure it's not var test=entities[j].querySelector('.opHead') if (test) { continue } } entities[j].style.display='none' } setSetting('hide'+threadElem.boardUri+'User'+userID, true, 365*10) if (canHideOP) { setSetting('hide'+threadElem.boardUri+'User'+userID+'OP', true, 365*10) } enableShowUserLink(threadElem, userID, canHideOP) } var space=document.createElement('span') space.innerHTML=' ' reply.parentNode.insertBefore(link, reply.nextSibling) reply.parentNode.insertBefore(space, reply.nextSibling) } else { hideElem.style.display='inline' } } // assumes we just showed thread function enableHideThreadLink(threadElem) { var threadID=threadElem.id /* var showElem=document.getElementById('ShowThread'+threadID) if (showElem) { showElem.style.display='none' } */ var hideElem=document.getElementById('hide'+threadElem.boardUri+'Thread'+threadID) if (!hideElem) { var reply=threadElem.querySelector('.linkReply') if (!reply) { reply=threadElem.querySelector('.linkQuote') } // for catalog var catMode=0 if (!reply) { //reply=threadElem.querySelector('.divMessage') reply=threadElem.querySelector('.threadStats') catMode=1 } var link=document.createElement('a') link.innerHTML='[X]' link.className='hideThread' link.href='#' link.id='hide'+threadElem.boardUri+'Thread'+threadID //link.style.textDecoration='underline' var loopScope=function(threadID, link, threadElem) { link.onclick=function() { console.log('hiding thread', threadID) threadElem.style.display='none' setSetting('hide'+threadElem.boardUri+'Thread'+threadID, true, 365*10) enableShowThreadLink(threadElem) return false } }(threadID, link, threadElem) reply.parentNode.insertBefore(link, reply.nextSibling) var space=document.createElement('span') space.innerHTML=' ' reply.parentNode.insertBefore(space, reply.nextSibling) } else { hideElem.style.display='inline' } } // // Show Links // function enableShowPostLink(postElem) { var postID=postElem.id /* var hideElem=document.getElementById('post') if (hideElem) { hideElem.style.display='none' } */ var showElem=document.getElementById('Show'+postElem.boardUri+'Post'+postID) if (!showElem) { var div=document.createElement('div') div.id='Show'+postElem.boardUri+'Post'+postID var link=document.createElement('a') link.innerHTML='[Show hidden post '+postID+'] ' link.href='#' link.onclick=function() { console.log('showing post', postID) postElem.style.display='block' //setSetting('hide'+boardUri+'Post'+postID, false, 365*10) deleteSetting('hide'+postElem.boardUri+'Post'+postID) div.style.display='none' enableHidePostLink(postElem) return false } div.appendChild(link) postElem.parentNode.insertBefore(div, postElem.nextSibling) } else { if (showElem.style.display=='none') { showElem.style.display='block' } } } function enableShowUserLink(threadElem, userID, canHideOP) { var threadID=threadElem.id var hideElem=threadElem.querySelector('#hide'+threadElem.boardUri+'Thread'+threadID) if (hideElem) { hideElem.style.display='none' } var showElem=document.getElementById('Show'+threadElem.boardUri+'Thread'+threadID) if (!showElem) { var opHeadElem=threadElem.querySelector('.opHead') // add show thread link if we don't already have one var div=document.createElement('div') div.id='Show'+threadElem.boardUri+'User'+userID var link=document.createElement('a') // linkReply in innerHTML causes problems // and really shouldn't be in the a tag /* if (opHeadElem) { link.innerHTML='[Show hidden thread '+threadID+'] '+opHeadElem.innerHTML } else { */ link.href='#' link.innerHTML='[Show hidden user '+userID+'] ' //} link.onclick=function() { console.log('showing thread', userID) //threadElem.style.display='block' var entities=getAllUserEntities(userID) for(var j in entities) { entities[j].style.display='block' } //setSetting('hide'+boardUri+'Thread'+threadID, false, 365*10) deleteSetting('hide'+threadElem.boardUri+'User'+userID) if (canHideOP) { deleteSetting('hide'+threadElem.boardUri+'User'+userID+'OP') } div.style.display='none' enableHideUserLink(threadElem, userID, canHideOP) return false } div.appendChild(link) threadElem.parentNode.insertBefore(div, threadElem.nextSibling) } else { if (showElem.style.display=='none') { showElem.style.display='block' } } } // assumes we just hide thread function enableShowThreadLink(threadElem) { var threadID=threadElem.id var hideElem=threadElem.querySelector('#hide'+threadElem.boardUri+'Thread'+threadID) if (hideElem) { hideElem.style.display='none' } var showElem=document.getElementById('Show'+threadElem.boardUri+'Thread'+threadID) if (!showElem) { var opHeadElem=threadElem.querySelector('.opHead') // add show thread link if we don't already have one var div=document.createElement(threadElem.catalog?'span':'div') div.id='Show'+threadElem.boardUri+'Thread'+threadID var link=document.createElement('a') // linkReply in innerHTML causes problems // and really shouldn't be in the a tag /* if (opHeadElem) { link.innerHTML='[Show hidden thread '+threadID+'] '+opHeadElem.innerHTML } else { */ link.innerHTML='[Show hidden thread '+threadID+'] ' link.href='#' //} var loopScope=function(threadID, link, div, threadElem, hideElem) { link.onclick=function() { console.log('showing thread', threadID) threadElem.style.display=threadElem.catalog?'inline-block':'block' //setSetting('hide'+boardUri+'Thread'+threadID, false, 365*10) deleteSetting('hide'+threadElem.boardUri+'Thread'+threadID) div.style.display='none' enableHideThreadLink(threadElem) return false } }(threadID, link, div, threadElem, hideElem) div.appendChild(link) threadElem.parentNode.insertBefore(div, threadElem.nextSibling) } else { if (showElem.style.display=='none') { showElem.style.display=threadElem.catalog?'inline-block':'block' } } } // // Worker // // by to_sha_ki (refactored) // called from processPostCell // what if a thread shows up? // process one function applyShowHidePost(postElem) { var postID=postElem.id var postHidden=getSetting('hide'+postElem.boardUri+'Post'+postID) //console.log('adding post hide link for', boardUri, postID, 'current', postHidden) if (postHidden==null) { // add link enableHidePostLink(postElem) } else { // hide it postElem.style.display='none' // add link enableShowPostLink(postElem) } // id check var hasId=postElem.querySelector('.labelId') if (hasId) { var userID=hasId.postUserID||hasId.innerHTML.toString() var value=getSetting('hide'+postElem.boardUri+'User'+userID) //console.log('adding user hide link for', boardUri, 'post', userID, 'current', value) if (value==null) { enableHideUserLink(postElem, userID, false) } else { console.log('hide user post', userID) var entities=getAllUserEntities(userID) for(var j in entities) { // make sure we don't hide OP var test=entities[j].querySelector('.opHead') if (test) { continue } entities[j].style.display='none' } enableShowUserLink(postElem, userID, false) } } } function recurseUp(elem, check, callback) { var newElem=elem.parentNode; if (check(newElem)) { callback(newElem); } else { recurseUp(newElem, check, callback); } } function recurseUpSync(elem, check) { var newElem=elem.parentNode; if (check(newElem)) { return newElem; } else { return recurseUpSync(newElem, check); } } // process DOM function hookShowHideUi() { // catalog check var links=document.querySelectorAll('.catalogDiv .linkThumb') for(var i in links) { var link=links[i] if (!link.parentNode) { // skipping functions and numbers are fine //console.log('skipping', link) continue } // just the catalog cell var threadElem=link.parentNode //console.log('looking at', threadElem) var matches=link.href.match(/(\w+)\/res\/(\d+)/) var linkBoard=matches[1] // was just boardUri threadElem.boardUri=linkBoard // catalog won't have this set... var threadID=matches[2] threadElem.id=threadID // I hope this doesn't confuse me in the future threadElem.catalog=true var value=getSetting('hide'+linkBoard+'Thread'+threadID) if (value==null) { enableHideThreadLink(threadElem) } else { console.log('hide thread', threadID) // we actually need to hide this thread threadElem.style.display='none' // look for show enableShowThreadLink(threadElem) } // catalog doesn't have IDs // so we'd have to ajax the posts themselves } // board/thread check var threads=document.querySelectorAll('.opHead .linkQuote') //console.log('found', threads.length, 'in', boardUri) for(var i in threads) { var thread=threads[i] if (!thread.parentNode) { //console.log('skipping', thread) continue } //var parts=thread.href.split(/\//) var matches=thread.href.match(/(\w+)\/res\/(\d+)/) var dBoardUri=matches[1] // overboard won't have this set... //console.log('detected thread boardUri', dBoardUri); //var threadElem=thread.parentNode.parentNode var threadElem=recurseUpSync(thread, function(checkElem) { return checkElem.id && checkElem.dataset.boarduri; }); threadElem.boardUri=dBoardUri var threadID=threadElem.id var value=getSetting('hide'+dBoardUri+'Thread'+threadID) //var value=null //console.log('adding thread hide link for', dBoardUri, threadID, 'current', value) if (value==null) { enableHideThreadLink(threadElem) } else { console.log('hide thread', threadID) // we actually need to hide this thread threadElem.style.display='none' // look for show enableShowThreadLink(threadElem) } // id check var hasId=threadElem.querySelector('.opHead .labelId') if (hasId) { var userID=hasId.postUserID||hasId.innerHTML.toString() var value=getSetting('hide'+dBoardUri+'User'+userID) var value2=getSetting('hide'+dBoardUri+'User'+userID+'OP') //console.log('adding user hide link for', boardUri, 'thread', userID, 'current', value, 'canhideop', value2) if (value==null || value2==null) { // enable hide button enableHideUserLink(threadElem, userID, true) } else { console.log('hide user thread', userID) var entities=getAllUserEntities(userID) for(var j in entities) { entities[j].style.display='none' } // enable show button enableShowUserLink(threadElem, userID) } } // process posts var posts=threadElem.querySelectorAll('.divPosts .linkQuote') //console.log('found', posts.length, 'in', threadElem.id, posts) for(var j in posts) { var ql=posts[j] if (!ql || !ql.parentNode) { continue } //var postElem=ql.parentNode.parentNode var postElem=recurseUpSync(ql, function(checkElem) { return checkElem.id && checkElem.dataset.boarduri; }); //console.log('setting post', ql.href, 'boardUri to', dBoardUri) postElem.boardUri=dBoardUri applyShowHidePost(postElem) } } } // return type: DocumentFragment function prepareShowHideCatalogCell(catalogCell, thread) { var fragment = document.createDocumentFragment(); catalogCell.catalog = true; enableHideThreadLink(catalogCell); if (getSetting('hide'+boardUri+'Thread'+catalogCell.id)) { catalogCell.style.display = 'none'; fragment.appendChild( createShowThreadLink( catalogCell ) ); }; fragment.appendChild( catalogCell ); return fragment; }; function createShowThreadLink(threadElem) { var threadID = threadElem.id; var opHeadElem = threadElem.querySelector('.opHead'); var div = document.createElement(threadElem.catalog?'span':'div'); div.id = 'Show'+boardUri+'Thread'+threadID; var link = document.createElement('a'); link.textContent = '[Show hidden thread '+threadID+'] '; link.href = '#'; link.onclick = function() { console.log('showing thread', threadID); threadElem.style.display = threadElem.catalog ? 'inline-block' : 'block'; deleteSetting('hide'+boardUri+'Thread'+threadID); div.style.display = 'none'; enableHideThreadLink(threadElem); return false; }; div.appendChild(link); return div; };