// ==UserScript==
// @name PTH User tagging
// @version 1.3
// @description Tag, ignore, highlight, and change avatars for users on PTH and PTP
// @author Chameleon
// @include http*://redacted.ch/*
// @include http*://passthepopcorn.me/*
// @grant none
// @namespace https://greasyfork.org/users/87476
// ==/UserScript==
var current_site;
(function() {
'use strict';
var h=window.location.host;
if(h==="redacted.ch")
current_site='RED';
else if(h==="passthepopcorn.me")
current_site='PTP';
window.setTimeout(checkHeight.bind(undefined, document.body.clientHeight), 800);
if(window.location.href.indexOf('user.php?id=') != -1)
{
var username;
if(current_site==="RED")
username=document.getElementsByTagName('h2')[0].getElementsByTagName('a')[0].textContent;
else if(current_site==="PTP")
username=document.getElementsByTagName('h2')[0].textContent;
var a=document.createElement('a');
a.href='javascript:void(0);';
a.addEventListener('click', openTags.bind(undefined, username, undefined), false);
if(current_site==="RED")
{
a.innerHTML = '[User tags]';
document.getElementsByClassName('linkbox')[0].appendChild(a);
}
else if(current_site==="PTP")
{
var e=document.getElementsByClassName('linkbox')[0];
e.appendChild(document.createTextNode(' ['));
a.innerHTML='User Tags';
e.appendChild(a);
e.appendChild(document.createTextNode(']'));
}
var avatar;
if(current_site==="RED")
avatar=document.getElementsByClassName('box_image_avatar')[0].getElementsByTagName('img')[0];
else if(current_site==="PTP")
avatar=document.getElementsByClassName('sidebar-cover-image')[0];
avatar.setAttribute('originalAvatar', avatar.src);
setProfile();
}
//var posts=document.getElementsByClassName('forum_post');
var posts=document.querySelectorAll('.forum_post, .forum-post');
for(var i=0; i<posts.length; i++)
{
var p=posts[i];
if(p.getAttribute('class').indexOf('preview_wrap') != -1)
continue;
if(p.id=='reply_box')
continue;
var links;
if(current_site==="RED")
links=p.getElementsByTagName('td')[0].firstElementChild;
else if(current_site==="PTP")
links=p.getElementsByTagName('span')[0];
var username=p.getElementsByTagName('strong')[0].getElementsByTagName('a')[0].textContent;
var a=document.createElement('a');
a.href='javascript:void(0);';
a.innerHTML='Tag';
if(current_site==="PTP")
a.innerHTML='[Tag]';
a.setAttribute('class', 'brackets');
a.addEventListener('click', openTags.bind(undefined, username, p), false);
links.appendChild(document.createTextNode(' - '));
links.appendChild(a);
var img;
if(current_site==="RED")
img=p.getElementsByTagName('img')[0];
else if(current_site==="PTP")
img=p.getElementsByClassName('forum-post__avatar__image')[0];
if(img)
{
img.setAttribute('originalAvatar', img.src);
}
}
/*
var avatars=document.getElementsByClassName('avatar');
for(var i=0; i<avatars.length; i++)
{
var avatar=avatars[i];
addTagLinks(avatar);
var img=avatar.getElementsByTagName('img')[0];
if(img)
{
img.setAttribute('originalAvatar', img.src);
}
}*/
addTags();
})();
function setProfile()
{
if(window.location.href.indexOf('user.php?id=') === -1)
return;
var user;
if(current_site==="RED")
user=document.getElementsByTagName('h2')[0].getElementsByTagName('a')[0].textContent;
else if(current_site==="PTP")
user=document.getElementsByTagName('h2')[0].textContent;
user=getUser(user)[0];
var avatar;
if(current_site==="RED")
avatar=document.getElementsByClassName('box_image_avatar')[0].getElementsByTagName('img')[0];
else if(current_site==="PTP")
avatar=document.getElementsByClassName('sidebar-cover-image')[0];
if(user.replacementAvatar)
{
avatar.src=user.replacementAvatar;
}
else
{
avatar.src=avatar.getAttribute('originalAvatar');
}
if(user.usernameColour)
{
var username;
if(current_site==="RED")
username=document.getElementsByTagName('h2')[0].getElementsByTagName('a')[0];
else if(current_site==="PTP")
username=document.getElementsByTagName('h2')[0];
username.style.color=user.usernameColour;
}
if(user.customTitle)
{
document.getElementsByClassName('user_title')[0].innerHTML='('+user.customTitle+')';
}
}
function checkHeight(height)
{
if(height != document.body.clientHeight)
{
pageResized();
}
window.setTimeout(checkHeight.bind(undefined, document.body.clientHeight), 800);
}
/*
function addTagLinks(avatar)
{
var tags=getTags();
var postTable=avatar.parentNode;
while(postTable.tagName != 'TABLE')
postTable=postTable.parentNode;
if(postTable.getAttribute('id') == 'preview_wrap_0')
return;
var username=postTable.getElementsByTagName('strong')[0].textContent;
var id=postTable.getAttribute('id').split('post')[1];
var a=document.createElement('a');
a.setAttribute('class', 'tagLink');
a.setAttribute('postId', id);
var place = avatar.getBoundingClientRect();
var style='position: absolute; z-index: 50000000; top: '+(place.top+window.scrollY)+'px; left: '+(place.left+window.scrollX)+'px; width: '+avatar.clientWidth+'px;';
style+='text-align: center; color: blue; background: rgba(200,200,200,0.8); border-radius: 0px 0px 10px 10px;';
a.setAttribute('style', style);
a.innerHTML = 'Show user tags';
a.href='javascript:void(0);';
a.addEventListener('click', openTags.bind(undefined, username, postTable), false);
document.body.appendChild(a);
a.style.display='none';
avatar.addEventListener('mouseover', mouseOver.bind(undefined, a), false);
avatar.addEventListener('mouseout', mouseOut.bind(undefined, avatar, a), false);
}
*/
function pageResized()
{
/*var tagLinks=document.getElementsByClassName('tagLink');
for(var i=0; i<tagLinks.length; i++)
{
var t=tagLinks[i];
var id=t.getAttribute('postId');
var postTable=document.getElementById('post'+id);
var avatar=postTable.getElementsByClassName('avatar')[0];
var place = avatar.getBoundingClientRect();
var style='position: absolute; z-index: 50000000; top: '+(place.top+window.scrollY)+'px; left: '+(place.left+window.scrollX)+'px; width: '+avatar.clientWidth+'px;';
style+='text-align: center; color: blue; background: rgba(200,200,200,0.8); border-radius: 0px 0px 10px 10px;';
t.setAttribute('style', style);
t.style.display='none';
}*/
resetTags();
addTags();
}
function resetTags()
{
var ignoredQuotes=document.getElementsByClassName('toggleQuote');
for(var i=0; i<ignoredQuotes.length; i++)
{
var ig=ignoredQuotes[i];
ig.nextElementSibling.style.display='';
ig.parentNode.removeChild(ig);
}
//var posts=document.getElementsByClassName('forum_post');
var posts=document.querySelectorAll('.forum_post, .forum-post');
var length;
if(current_site==="RED")
length=posts.length-1;
else if(current_site==="PTP")
length=posts.length;
for(var i=0; i<length; i++)
{
var p=posts[i];
var avatar;
if(current_site==="RED")
avatar=p.getElementsByClassName('avatar')[0];
else if(current_site==="PTP")
avatar=p.getElementsByClassName('forum-post__avatar')[0];
var postTable=p;
if(postTable.getAttribute('id') == 'preview_wrap_0')
continue;
if(p.id=='reply_box')
continue;
var u=postTable.getElementsByTagName('strong')[0].getElementsByTagName('a')[0];
var username=u.textContent;
var c=postTable.getElementsByClassName('user_title');
if(c.length > 0)
{
var orig=c[0].getAttribute('original');
if(orig)
c[0].innerHTML=orig;
}
if(avatar)
{
var img=avatar.getElementsByTagName('img')[0];
if(img)
{
var orig=img.getAttribute('originalAvatar');
if(orig)
img.src=img.getAttribute('originalAvatar');
}
}
u.setAttribute('style', '');
postTable.setAttribute('style', '');
var tr;
if(current_site==="RED")
tr=postTable.getElementsByTagName('tr')[1];
else if(current_site==="PTP")
tr=postTable.getElementsByClassName('forum-post__avatar-and-body')[0];
if(tr.getAttribute('stayHidden')!=="true")
{
tr.style.display='';
}
var id=postTable.getAttribute('id').split('post')[1];
var tag=document.getElementById('tag'+id);
if(tag)
tag.parentNode.removeChild(tag);
}
var hardIgnores=document.getElementsByClassName('hardIgnoreLink');
for(var i=0; i<hardIgnores.length; i++)
{
var h=hardIgnores[i];
h.parentNode.removeChild(h);
}
}
function addTags()
{
var quotes=document.getElementsByTagName('blockquote');
for(var i=0; i<quotes.length; i++)
{
var q=quotes[i];
var username = q.previousElementSibling;
if(username)
{
username=username.textContent.split(' ')[0];
var user=getUser(username)[0];
if(user.softIgnore || user.hardIgnore)
{
var a=document.createElement('a');
a.href='javascript:void(0);';
a.textContent='<Ignored>';
a.addEventListener('click', toggleQuote.bind(undefined, a, q), false);
a.setAttribute('class', 'toggleQuote');
q.parentNode.insertBefore(a, q);
if(q.getAttribute('unIgnored')=="true")
{
a.textContent='Ignore';
}
else
q.style.display='none';
}
}
}
//var posts=document.getElementsByClassName('forum_post');
var posts=document.querySelectorAll('.forum_post, .forum-post');
var length;
if(current_site==="RED")
length=posts.length-1;
else if(current_site==="PTP")
length=posts.length;
for(var i=0; i<length; i++)
{
var p=posts[i];
var avatar;
if(current_site==="RED")
avatar=p.getElementsByClassName('avatar')[0];
else if(current_site==="PTP")
avatar=p.getElementsByClassName('forum-post__avatar')[0];
var postTable=p;
if(postTable.getAttribute('id') == 'preview_wrap_0')
continue;
if(p.id=='reply_box')
continue;
var u=postTable.getElementsByTagName('strong')[0].getElementsByTagName('a')[0];
var username=u.textContent;
var user=getUser(username)[0];
if(user.replacementAvatar && avatar)
{
avatar.getElementsByTagName('img')[0].src=user.replacementAvatar;
}
if(user.usernameColour)
{
var style=u.getAttribute('style');
if(!style)
style='';
u.setAttribute('style', style+' color: '+user.usernameColour+';');
}
if(user.postHighlight)
{
var style=postTable.getAttribute('style');
postTable.setAttribute('style', 'box-shadow: '+user.postHighlight+' 0 0 5px 1px !important;');
}
if(user.customTitle)
{
var c=postTable.getElementsByClassName('user_title');
if(c.length > 0)
c=c[0];
else
{
c=document.createElement('span');
c.setAttribute('class', 'user_title');
var before=postTable.getElementsByClassName('time')[0];
before.parentNode.insertBefore(c, before);
}
if(!c.getAttribute('original'))
c.setAttribute('original', c.innerHTML);
c.innerHTML='('+user.customTitle+')';
}
if(user.tag && user.showTag)
{
var div=document.createElement('div');
var id=postTable.getAttribute('id').split('post')[1];
div.setAttribute('id', 'tag'+id);
div.innerHTML = user.tag.replace(/\n/g,'<br />')+' ';
if(!user.showTagInHeader)
{
var before=document.getElementById('bar'+id).firstElementChild;
before.parentNode.insertBefore(div, before);
div.setAttribute('style', 'display: inline-block; margin-right: 5px;');
div.setAttribute('class', 'r10');
}
else
{
var first;
if(!avatar)
{
avatar=postTable;
first=avatar;
}
else
first=avatar.firstElementChild;
var place = postTable.getBoundingClientRect();
var width=300;
var left=place.left+window.scrollX-width-20;
if(left<0)
left=0;
var style='position: absolute; z-index: 1001; top: '+(place.top+window.scrollY)+'px; left: '+left+'px; max-width: '+width+'px; text-align: center; color: white; background: rgba(20,20,20,0.7); border-radius: 20px 0px 0px 20px;';
style+='font-size: large; box-shadow: inset '+(user.postHighlight ? user.postHighlight : 'black')+' 0 0 20px 0; padding: 10px;';
div.setAttribute('style', style);
document.body.appendChild(div);
var avatarHeight=first.clientHeight;
var top=place.top+window.scrollY+((avatarHeight-div.clientHeight)/2);
div.style.top=top+'px';
if(div.clientWidth < width)
{
left=place.left+window.scrollX-div.clientWidth;
if(left<0)
left=0;
div.style.left=left+'px';
}
}
}
if(user.softIgnore)
{
var tr;
if(current_site==="RED")
tr=postTable.getElementsByTagName('tr')[1];
else if(current_site==="PTP")
tr=postTable.getElementsByClassName('forum-post__avatar-and-body')[0];
tr.style.display='none';
}
if(user.hardIgnore)
{
var a=document.createElement('a');
var hr=document.createElement('hr');
hr.setAttribute('title', username);
a.appendChild(hr);
a.setAttribute('class', 'hardIgnoreLink');
a.href=postTable.getElementsByTagName('strong')[0].getElementsByTagName('a')[0].href;
postTable.parentNode.insertBefore(a, postTable);
postTable.style.display='none';
}
}
}
function toggleQuote(a, q)
{
if(a.innerHTML.indexOf('Ignored') != -1)
{
a.textContent = 'Ignore';
q.style.display='';
q.setAttribute('unIgnored', "true");
}
else
{
a.textContent = '<Ignored>';
q.style.display='none';
q.setAttribute('unIgnored', "false");
}
}
function setEmpty(input)
{
input.value="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'/%3E";
input.dispatchEvent(new Event('change'));
}
function openTags(username, postTable)
{
var div=document.getElementById('chameleonTagsDiv');
if(!div)
{
div=document.createElement('div');
div.setAttribute('id', 'chameleonTagsDiv');
document.body.appendChild(div);
div.setAttribute('style', 'position: fixed; top: 20px; margin: auto; left: 0; right: 0; text-align: center; background: rgba(0,0,0,0.7); color: white; width: 80%; z-index: 1000;');
}
div.innerHTML = '<h2>'+username+'\'s Tags<br />';
var user=getUser(username)[0];
var input=document.createElement('input');
input.placeholder='Replacement avatar URL';
input.value = user.replacementAvatar ? user.replacementAvatar : '';
input.addEventListener('change', changeTags.bind(undefined, div, username, postTable, input), false);
var a=document.createElement('a');
a.href='javascript:void(0);';
a.setAttribute('style', 'display:block;');
a.innerHTML="Set avatar to empty image";
a.addEventListener('click', setEmpty.bind(undefined, input));
div.appendChild(a);
div.appendChild(input);
div.appendChild(document.createElement('br'));
var input=document.createElement('input');
div.appendChild(input);
input.placeholder='Replacement custom title';
input.value = user.customTitle ? user.customTitle : '';
input.addEventListener('change', changeTags.bind(undefined, div, username, postTable, input), false);
div.appendChild(document.createElement('br'));
var input=document.createElement('input');
div.appendChild(input);
input.placeholder='Post highlight colour';
input.value = user.postHighlight ? user.postHighlight : '';
input.addEventListener('change', changeTags.bind(undefined, div, username, postTable, input), false);
div.appendChild(document.createElement('br'));
var input=document.createElement('input');
div.appendChild(input);
input.placeholder='Username colour';
input.value = user.usernameColour ? user.usernameColour : '';
input.addEventListener('change', changeTags.bind(undefined, div, username, postTable, input), false);
div.appendChild(document.createElement('br'));
var input=document.createElement('textarea');
input.setAttribute('id', 'tagTextarea');
div.appendChild(input);
input.setAttribute('style', 'text-align: center; border: none;');
input.placeholder='Tag';
input.value = user.tag ? user.tag : '';
resize('tagTextarea');
input.addEventListener('keyup', resize.bind(undefined, 'tagTextarea'), false);
input.addEventListener('change', changeTags.bind(undefined, div, username, postTable, input), false);
div.appendChild(document.createElement('br'));
var a=document.createElement('a');
div.appendChild(a);
a.innerHTML = 'Show tag: '+(user.showTag ? 'On' : 'Off');
a.href='javascript:void(0);';
a.addEventListener('click', changeTags.bind(undefined, div, username, postTable, a), false);
div.appendChild(document.createElement('br'));
var a=document.createElement('a');
div.appendChild(a);
a.innerHTML = 'Show tag left of avatar: '+(user.showTagInHeader ? 'On' : 'Off');
a.href='javascript:void(0);';
a.addEventListener('click', changeTags.bind(undefined, div, username, postTable, a), false);
div.appendChild(document.createElement('br'));
var a=document.createElement('a');
div.appendChild(a);
a.innerHTML = 'Soft ignore: '+(user.softIgnore ? 'On' : 'Off');
a.href='javascript:void(0);';
a.addEventListener('click', changeTags.bind(undefined, div, username, postTable, a), false);
div.appendChild(document.createElement('br'));
var a=document.createElement('a');
div.appendChild(a);
a.innerHTML = 'Hard ignore: '+(user.hardIgnore ? 'On' : 'Off');
a.href='javascript:void(0);';
a.addEventListener('click', changeTags.bind(undefined, div, username, postTable, a), false);
div.appendChild(document.createElement('br'));
var a=document.createElement('a');
div.appendChild(a);
a.innerHTML = 'Save';
a.href='javascript:void(0);';
a.addEventListener('click', saveAndClose.bind(undefined, div, username, postTable), false);
}
function changeTags(div, username, table, a)
{
var user=getUser(username);
var index=user[1];
user=user[0];
var inputs=div.getElementsByTagName('input');
user.replacementAvatar = inputs[0].value;
user.customTitle = inputs[1].value;
user.postHighlight = inputs[2].value;
user.usernameColour = inputs[3].value;
var textareas=div.getElementsByTagName('textarea');
user.tag=textareas[0].value;
var as=div.getElementsByTagName('a');
if(as[1] == a)
{
if(a.innerHTML.indexOf('On') != -1)
user.showTag=false;
else
user.showTag=true;
}
if(as[2] == a)
{
if(a.innerHTML.indexOf('On') != -1)
user.showTagInHeader=false;
else
user.showTagInHeader=true;
}
if(as[3] == a)
{
if(a.innerHTML.indexOf('On') != -1)
user.softIgnore=false;
else
user.softIgnore=true;
}
if(as[4] == a)
{
if(a.innerHTML.indexOf('On') != -1)
user.hardIgnore=false;
else
user.hardIgnore=true;
}
var tags=getTags();
if(index != -1)
tags[index]=user;
else
{
user.username=username;
tags.push(user);
}
window.localStorage.userTags = JSON.stringify(tags);
openTags(username, table);
}
function saveAndClose(div, username, table)
{
resetTags();
addTags();
setProfile();
div.parentNode.removeChild(div);
}
/*
function mouseOver(a)
{
a.style.display = 'initial';
}
function mouseOut(avatar, a, event)
{
if(event.relatedTarget == avatar || event.relatedTarget == a)
return;
a.style.display = 'none';
}*/
function getUser(username)
{
var tags=getTags();
for(var i=0; i<tags.length; i++)
{
var t=tags[i];
if(t.username === username)
return [t, i];
}
return [{}, -1];
}
function getTags()
{
var tags = window.localStorage.userTags;
if(!tags)
{
tags = [];
}
else
tags = JSON.parse(tags);
return tags;
}