SN BBCode Buttons

adds bbcode formatting buttions to SocialNeko

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name SN BBCode Buttons 
// @description adds bbcode formatting buttions to SocialNeko
// @namespace MasksViolentMonkeyScript
// @version 1.0.1                                  
// @match http://socialneko.org/*            
// @match https://socialneko.org/*
// @grant GM_addStyle
// @require https://cdnjs.cloudflare.com/ajax/libs/jscolor/2.0.4/jscolor.js
// ==/UserScript==


    //I've never made anything in javascript before I made this
    //and i am starting to know why      
    //please give tips for improvement
    //...expecially if you know what you're doing

// create a div on which to append buttons
var buttonPanel = document.createElement("div");
buttonPanel.setAttribute("id", "bpanel");
var placeholder= document.createTextNode(" "); //if no placeholder... it never shows up
buttonPanel.appendChild(placeholder);

//I decided to create subpanels for pretty... easier to space between
var colorPanel = document.createElement("span");
colorPanel.appendChild(placeholder);
var biusttPanel = document.createElement("span");
biusttPanel.appendChild(placeholder);
var spoiurlimgPanel = document.createElement("span");
spoiurlimgPanel.appendChild(placeholder);
var allignPanel = document.createElement("span");
allignPanel.appendChild(placeholder);

//create buttons to add to the buttonPanel
    //bold
var boldb = document.createElement("input");
boldb.type = "button";
boldb.setAttribute("style", "font-weight: bold;");
boldb.setAttribute("id", "boldb");
boldb.value = "b";
boldb.onclick=function(){insert("b")};
    //italic
var italb = document.createElement("input");
italb.type = "button";
italb.setAttribute("style", "font-style: italic;");
italb.setAttribute("id", "italb");
italb.value = "i";
italb.onclick=function(){insert("i")};
    //underline
var underlb = document.createElement("input");
underlb.type = "button";
underlb.setAttribute("style", "text-decoration: underline;");
underlb.setAttribute("id", "underlb");
underlb.value = "u";
underlb.onclick=function(){insert("u")};
    //strikethrough
var strikeb = document.createElement("input");
strikeb.type = "button";
strikeb.setAttribute("style", "text-decoration: line-through;");
strikeb.setAttribute("id", "strikeb");
strikeb.value = "s";
strikeb.onclick=function(){insert("s")};
    //typewritter
var ttb = document.createElement("input");
ttb.type = "button";
ttb.setAttribute("style", "font-family:monospace");
ttb.setAttribute("id", "ttb");
ttb.value = "tt";
ttb.onclick=function(){insert("tt")};
    //spoiler
var spoilerb = document.createElement("input");
spoilerb.type = "button";
spoilerb.setAttribute("style", "font-family:monospace");
spoilerb.setAttribute("id", "spoilerb");
spoilerb.value = "spoiler";
spoilerb.onclick=function(){insert("spoiler")};
    //image
var imageb = document.createElement("input");
imageb.type = "button";
imageb.setAttribute("style", "font-family:monospace");
imageb.setAttribute("id", "imageb");
imageb.value = "img";
imageb.onclick=function(){insert("img")};
    //url
var urlb = document.createElement("input");
urlb.type = "button";
urlb.setAttribute("style", "font-family:monospace");
urlb.setAttribute("id", "urlb");
urlb.value = "url";
urlb.onclick=function(){insert("url")};
    //left
var leftb = document.createElement("input");
leftb.type = "button";
leftb.setAttribute("style", "");
leftb.setAttribute("id", "leftb");
leftb.value = "|.."; //iterpretive positioning symbols because lazy now
leftb.onclick=function(){insert("left")};
    //center
var centerb = document.createElement("input");
centerb.type = "button";
centerb.setAttribute("style", "");
centerb.setAttribute("id", "centerb");
centerb.value = ".|.";
centerb.onclick=function(){insert("center")};
    //right
var rightb = document.createElement("input");
rightb.type = "button";
rightb.setAttribute("style", "");
rightb.setAttribute("id", "rightb");
rightb.value = "..|";
rightb.onclick=function(){insert("right")};

    //color selector
//picker doesn't show up unless you zoom in on desktop 
//and at the moment has janky positioning  :|
var colorsel = document.createElement("input");
colorsel.type = "button";
colorsel.setAttribute("id", "colorsel");
//it would be nice to close on click as well, but I can't seem to get jscolor.hide() to work for this as well
colorsel.onclick=function(){submitColor()};
colorsel.setAttribute("style", "width:20px; text-indent:20px;");

colorsel.value="FFFF00";
colorsel.setAttribute("id", "colorselb");
jscolor.hash = true;
var picker = new jscolor(colorsel);
var color = colorsel.value;
//picker.closable=true;
picker.position="top";

    //highlight
var highlb = document.createElement("input");
highlb.type = "button";
highlb.setAttribute("style", "");
highlb.setAttribute("id", "highlb");
highlb.value = "hl";
highlb.onclick=function(){colorInsert("hl",color)};
    //color text
var colorb = document.createElement("input");
colorb.type = "button";
colorb.setAttribute("style", "");
colorb.setAttribute("id", "colorb");
colorb.value = "color";
colorb.onclick=function(){colorInsert("color",color)};

function submitColor()
{
  color = colorsel.value;
  document.getElementById('colorb').style.color = '#' + color;
  document.getElementById('highlb').style.backgroundColor = '#' + color;
}

function addSpacer()
{
  var spacer = document.createElement("span");
  var content = document.createTextNode(" ");
  spacer.appendChild(content);
  buttonPanel.appendChild(spacer);
}

////////////////////////////////////////////////////////////
//                       A___A
//           A___A       |o o|  do not feed the ascii cats
//     ____ / o o \      |='=|  they aren't real cats     
//___/~____   ='= /_____/    |_______
//  (______)__m_m_)    /  ||||
//                    |___||||]
//////////add all the buttons to their panels//////////
biusttPanel.appendChild(boldb);
biusttPanel.appendChild(italb);
biusttPanel.appendChild(underlb);
biusttPanel.appendChild(strikeb);
biusttPanel.appendChild(ttb);
buttonPanel.appendChild(biusttPanel);

addSpacer();

colorPanel.appendChild(colorsel);
colorPanel.appendChild(colorb);
colorPanel.appendChild(highlb);
buttonPanel.appendChild(colorPanel);

addSpacer();

spoiurlimgPanel.appendChild(spoilerb);
spoiurlimgPanel.appendChild(imageb);
spoiurlimgPanel.appendChild(urlb);
buttonPanel.appendChild(spoiurlimgPanel);

addSpacer();

allignPanel.appendChild(leftb);
allignPanel.appendChild(centerb);
allignPanel.appendChild(rightb);
buttonPanel.appendChild(allignPanel);


////---Select BBCode-applicaple textareas on every SN page ---/////
if(window.location.href.indexOf("status")>-1
   ||window.location.href.indexOf("/forum/") > -1
   ||window.location.href.indexOf("/gallery/") > -1 //I keep appending but now it's looking stupid
   ||window.location.href.indexOf("blogs") > -1)    //should probably list negation of the pages I don't want instead
   {
    var loc2 = document.getElementsByTagName("textarea");
    var loc = loc2[0].parentNode;
    loc.insertBefore(buttonPanel, loc2[0]);
   }
if(window.location.href.indexOf("settings") > -1)
   {
    var loc2 = document.getElementsByName("biography");
    var loc = loc2[0].parentNode;
    loc.insertBefore(buttonPanel, loc2[0]);
    var loc3 = document.getElementsByName("signature"); //so far I can only get one instance on a page *headdesk* REEEEEE
    var loc4 = loc3[0].parentNode;
    loc4.insertBefore(buttonPanel.cloneNode(true), loc3[0]); //nevermind lol-- I know how to clone now
   }
if(window.location.href.indexOf("/gallery/") > -1)
   {
    var loc2 = document.getElementsByTagName("textarea"); //get the first textarea, which is actually share2status
    var loc = loc2[0].parentNode;
    loc.insertBefore(buttonPanel, loc2[0]);
    var loc3 = loc2[1].parentNode; //get the second textarea, the comment below the artwork
    loc3.insertBefore(buttonPanel.cloneNode(true), loc2[1]);
   }
if(window.location.href.indexOf("/user/") > -1)
   {
    var loc2 = document.getElementsByName("comment"); 
    var loc = loc2[0].parentNode;
    loc.insertBefore(buttonPanel, loc2[0]);
   }
if(window.location.href.indexOf("/mail/") > -1)
   {
    var loc2 = document.getElementsByName("message");
    
    for (var i=loc2.length; i--;)//get every reply box hidden on the page
    {
      console.log(i);
      var loc = loc2[i].parentNode;
      loc.insertBefore(buttonPanel.cloneNode(true), loc2[i]);
    }
   }



//taken from https://www.codingforums.com/javascript-programming/220962-bbcode-textarea-insert.html
//and modified
  /************
   * written by chris wetherell
   * http://www.massless.org
   * [email protected]
   * warning: it only works for IE4+/Win and Moz1.1+
   * feel free to take it for your site
   * if there are any problems, let chris know.
   ************/
//it would be nice to have the text stay selected after clicking a button
//but I don't feel like figuring another thing out right now
function insert(tag)
{
  var lft="[" + tag + "]";
  var rgt="[/" + tag + "]";
  wrapSelection(loc2[0], lft, rgt);
}

function colorInsert(tag, color)
{
  var lft="[" + tag + "="+color+"]";
  var rgt="[/" + tag + "]";
   wrapSelection(loc2[0], lft, rgt);
}
  function wrapSelection(txtarea, lft, rgt) {
      if (document.all) {
          IEWrap(lft, rgt);
      } else if (document.getElementById) {
          mozWrap(txtarea, lft, rgt);
      }
  }
  function mozWrap(txtarea, lft, rgt) {
      var selLength = txtarea.textLength;
      var selStart = txtarea.selectionStart;
      var selEnd = txtarea.selectionEnd;
      if (selEnd == 1 || selEnd == 2) selEnd = selLength;
      var s1 = (txtarea.value).substring(0, selStart);
      var s2 = (txtarea.value).substring(selStart, selEnd)
      var s3 = (txtarea.value).substring(selEnd, selLength);
      txtarea.value = s1 + lft + s2 + rgt + s3;
  }
//don't worry my many IE using social neko frens I gotchu
  function IEWrap(lft, rgt) {
      strSelection = document.selection.createRange().text;
      if (strSelection != "") {
          document.selection.createRange().text = lft + strSelection + rgt;
      }
  }

//css all over the place... what a mess
GM_addStyle
(
  "#bpanel>span>input{font-size: 10px; height:20px;}"+
  "#boldb,#italb,#underlb,#strikeb,#highlb,#ttb{width:20px; padding:0px;}"+
  "#colorselb{width:10px; left:5px;}"+
  "#colorb{width:32px; padding:0px; text-indent:-1px;}"+
  "#spoilerb{width:40px; padding:0px; text-indent:-1px;}"+
  "#imageb,#urlb{width:21px; text-indent:-6px;}"+
  "#leftb,#centerb,#rightb{width:18px; text-indent:-4px;}"+
  "jscolor{width:101, padding:0, shadow:false,borderWidth:0, backgroundColor:'transparent', insetColor:'#000'}"
   
);

//
//
//
//
//
//
//
//                    |\                                       
//               ~\   | \ 
//          __--- | \|   |---_                                
//         /__    \       \   ~-/   
//            \               \___-                           
//            __\     ; _/\  ` ___/\ /                      
//            \     \|/   _\|  ____,'                       
//              ~--[|\@ ",@/|]__\                            
//                  :\  _  /,                       
//          __/\__/ -  \_/  ;`___/\__                         
//   ___/-/  | \- `___/_ _\___' -/| \ \--_                    
// /_\ \  \  |  \       ^      /  |   |/_/_\                  
///\   ; '\   |   \_____|_____/  ;  |/ /:   \