QR-Plugins.RainbowText

plugins for Kaskus-QR rainbowtext generator

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

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

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name          QR-Plugins.RainbowText
// @namespace     http://userscripts.org/users/315214
// @include        *.kaskus.co.id/thread/*
// @include        *.kaskus.co.id/lastpost/*
// @include        *.kaskus.co.id/post/*
// @include        *.kaskus.co.id/group/discussion/*
// @include        *.kaskus.co.id/show_post/*
// @version       0.6
// @dtversion     1210300006
// @timestamp     1351547543977
// @qrversion     4.0.9
// @description   plugins for Kaskus-QR rainbowtext generator
// @author        tuxie.forte;
// @license       (CC) by-nc-sa 3.0
//
// -!--latestupdate
// v0.6 - 2012-10-30
//  include new-kaskus (co.id)
//
// v0.5 - 2011-09-03
//  improve literaly whitespaces
//
// v0.4 - 2011-08-23
//  fix adapting QR container
//
// v0.3 - 2011-08-19
//  fix whitespaces with transparent (dirty but safe)
//
// v0.2 - 2011-08-14
//  fix char with whitespaces
//
// -/!latestupdate---
// ==/UserScript==
//

(function(){
// Initialize Global Variables
var gvar=function() {};

/*
window.alert(new Date().getTime());
*/
//========-=-=-=-=--=========
gvar.__DEBUG__ = false; // development
//========-=-=-=-=--=========


// this is where we re-initialize before we trigger start_Main()
// any huge global var or loading any saved value may start in here too
function init_start(){   

  gvar.B = rSRC.getSetOf('button');
  gvar.tID = "reply-messsage";

  start_Main();
}
// =====
// START
function start_Main(){
  var el, Attr, par = gID(gvar.qr_identity);

  if( par ){
    Attr = {'src':gvar.B.rainbow_gif, style:'vertical-align:bottom;', alt:'[rainbow]', title:'Wrap [Rainbow-COLOR] tags around selected text'};
    el = createEl('img',Attr);
    _o('click', el, function(e){return handleClick(e)} );

    Dom.add(el, par);
  }        
}
function handleClick(e){
  var vBText = _TEXT.init();
  if(!vBText) return;

  var endFocus = function(){ _TEXT.focus(); return false},
  selected = _TEXT.getSelectedText(), ret = '',
  text, prehead;

  text=(selected!= '' ? selected : prompt('Please enter Text to become rainbow:', 'pelangi pelangi') );
  if(text==null) return endFocus();

  ret = MakeSFX(text);
  prehead = [0, ret.length];
  if(selected=='')
    _TEXT.setValue( ret, prehead );
  else
    _TEXT.replaceSelected( ret, prehead );
}

/*=========
# rainbow functionality
# base code by umop ap!sdn
# sources: http://www.tektek.org/color
# ========= 
*/

function getSFXColor(a,g_cstyle){var b,c,d,e,f,g;if(g_cstyle==0){e=a;b=127+127*Math.cos(e-.5);c=127+127*Math.cos(e-2.5);d=127+127*Math.cos(e-4.5);f=b;if(c<f)f=c;if(d<f)f=d;b-=f;c-=f;d-=f;g=b;if(c>g)g=c;if(d>g)g=d;g=255/g;b*=g;c*=g;d*=g;var h=200;var i=255;g=h/255*(i/255);f=(255-i)*(h/255);b=b*g+f;c=c*g+f;d=d*g+f;if(b<0)b=0;if(c<0)c=0;if(d<0)d=0;if(b>255)b=255;if(c>255)c=255;if(d>255)d=255}if(g_cstyle==1){a-=Math.floor(a);b=r1+a*dr;c=g1+a*dg;d=b1+a*db}if(g_cstyle==2){a-=2*Math.floor(a/2);if(a<1){b=r1+a*dr;c=g1+a*dg;d=b1+a*db}if(a>=1){a-=2;b=r1-a*dr;c=g1-a*dg;d=b1-a*db}}if(g_cstyle==3){a-=3*Math.floor(a/3);if(a<1){b=r1+a*dr;c=g1+a*dg;d=b1+a*db}if(a>=1&&a<2){a-=1;b=r2+a*dr1;c=g2+a*dg1;d=b2+a*db1}if(a>=2){a-=2;b=r3+a*dr2;c=g3+a*dg2;d=b3+a*db2}}return {r:b,g:c,b:d}}
function tohex(a){var b,c;var d="";b=Math.floor(a%16);c=Math.floor(a/16);if(c<10){d=""+c}if(c>9){switch(c){case 10:d="A";break;case 11:d="B";break;case 12:d="C";break;case 13:d="D";break;case 14:d="E";break;case 15:d="F";break;default:d="X";break}}if(b<10){d=d+""+b}if(b>9){switch(b){case 10:d+="A";break;case 11:d+="B";break;case 12:d+="C";break;case 13:d+="D";break;case 14:d+="E";break;case 15:d+="F";break;default:d+="X";break}}return d}

function MakeSFX(inputString){
  var i, j, k, l, c;
  var x, scale, res=1;
  var oignumi = 0;
  var gradientType = "rainbow";

  var temp = new String("");
  var numreps = 1;

    // Initialize string variables
    var instr = trimStr(inputString);
    var outstr = new String("");
    var tempstr = new String("");    

    // Get the length and scale. For rainbows, the scale must be such that one cycle comes out to almost 2pi.
    j = instr.length;
    
    if (gradientType == "rainbow"){
      scale = Math.PI * (2 * eval(numreps) - .21) / j;
      g_cstyle = 0;
    }

    // Start the loop
    for (i=0; i<j; i++){

        // Determine the RGB values
        k = scale * i;

        c = getSFXColor(k,g_cstyle);
        // Convert to hexadecimal
        tempstr = tohex(c.r) + tohex(c.g) + tohex(c.b); 

        // Get the character to colorize
        temp = instr.charAt(i);

        // Is it a &; code?
        if (temp == "&"){

            // Search forward until either a semicolon, tag, or space is found
            for (l=i+1; l<j; l++){
              if (instr.charAt(l) == " ") break;
              if (instr.charAt(l) == "<") break;
              if (instr.charAt(l) == ">") break;
              if (instr.charAt(l) == ";") break;
            }   // for l

            // If it's a semicolon, then we have ourselves a character.
            if (instr.charAt(l) == ";")
            temp = instr.substr(i, l-i+1);
          }

        // perform BBCode output
        if (i % res == 0) { 
            // Is it a whitespace?
            outstr = outstr + (temp!= " " ? '[color=' + '#' + tempstr + ']' : temp);
            oignumi = 1; 
          }
          outstr = outstr + temp;

          if ((i+1) % res == 0) {
            outstr = outstr + (temp!=" " ? '[/color]' : ""); 
            oignumi = 0; 
          }
        // out_format = BBCode

        if (temp.length > 1) i += (temp.length - 1);
      }
      if (oignumi > 0)
        outstr = outstr + '[/color]';

      return outstr;
    }





// -
// -
// -
// -
//========= 
// code below should adapting current QR Engine for this plugins works
// leave code below as wot it is, as long you know what todo
//========= Common Functions && Global Var Init ====
// static routine
function isDefined(x)   { return !(x == null && x !== null); }
function isUndefined(x) { return x == null && x !== null; }
function isString(x) { return (typeof(x)!='object' && typeof(x)!='function'); }
function trimStr(x) { return x.replace(/^\s+|\s+$/g,""); };

function _o(m,e,f){Dom.Ev(e,m,function(e){typeof(f)=='function'?f(e):void(0)});}
function gID(x) { return document.getElementById(x) }

function addClass(cName, Obj){
  if(cName=="") return;
  var neocls = (Obj.className ? Obj.className : '');
  if(neocls.indexOf(cName)!=-1) return;
  neocls+=(neocls!=''?' ':'')+cName;
  Obj.setAttribute('class', neocls);
}
function removeClass(cName, Obj){
  if(cName=="") return;
  var neocls = (Obj.className ? Obj.className : '');
  neocls = trimStr ( neocls.replace(cName,"") ); // replace and trim
  Obj.setAttribute('class', neocls);
}
function SimulateMouse(elem,event,preventDef) {
  if(typeof(elem)!='object') return;
  var evObj = document.createEvent('MouseEvents');
  preventDef=(isDefined(preventDef) && preventDef ? true : false);
  evObj.initEvent(event, preventDef, true);
  try{elem.dispatchEvent(evObj);}
  catch(e){}
}
function createEl(type, attrArray, html){
 var node = document.createElement(type);
 for (var attr in attrArray) 
   if (attrArray.hasOwnProperty(attr))
    node.setAttribute(attr, attrArray[attr]);
 if(html) node.innerHTML = html;
   return node;
}

// Get Elements
var $D=function (q, root, single) {
  if (root && typeof root == 'string') {
      root = $D(root, null, true);
      if (!root) { return null; }
  }
  if( !q ) return false;
  if ( typeof q == 'object') return q;
  root = root || document;
  if (q[0]=='/' || (q[0]=='.' && q[1]=='/')) {
      if (single) { return document.evaluate(q, root, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; }
      return document.evaluate(q, root, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  }
  else if (q[0]=='.') { return root.getElementsByClassName(q.substr(1)); }
  else { return root.getElementById( (q[0]=='#' ? q.substr(1):q.substr(0)) ); }
  return root.getElementsByTagName(q);
};
// utk add - remove element
var Dom = {
  g: function(el) {
   if(!el) return false;
   return ( isString(el) ? document.getElementById(el) : el );
  },
  add: function(el, dest) {    
    var el = this.g(el);
    var dest = this.g(dest);
    if(el && dest) dest.appendChild(el);
  },
  remove: function(el) {
    var el = this.g(el);
    if(el && el.parentNode)
      el.parentNode.removeChild(el);
  },
  Ev: function() {
    if (window.addEventListener) {
      return function(el, type, fn, ph) {
        if(typeof(el)=='object')
         this.g(el).addEventListener(type, function(e){fn(e);}, (isUndefined(ph) ? false : ph));
      };      
    }else if (window.attachEvent) {
      return function(el, type, fn) {
        var f = function() { fn.call(this.g(el), window.event); };
        this.g(el).attachEvent('on' + type, f);
      };
    }
  }()
};

var _TEXT = {
  e : null, eNat : null,
  content   : "",
  cursorPos   : [],
  last_scrollTop: 0,
  init: function() {
    this.eNat = gID(gvar.tID);
    this.content = this.eNat.value;
    this.cursorPos = _TEXT.rearmPos(); // [start, end]
    
    this.last_scrollTop = gID(gvar.tID).scrollTop; // last scrolltop pos  
    return this;
  },
  rearmPos: function(){ return [this.getCaretPos(), gID(gvar.tID).selectionEnd]; },
  subStr: function(start, end){ return this.content.substring(start, end);},
  set: function(value){
    
    gID(gvar.tID).value = this.content = value; 
    _TEXT.setRows_Elastic();
    _TEXT.init();

  },
  wrapValue : function(tag, title){
    var st2, start=this.cursorPos[0], end=this.cursorPos[1],bufValue;
    tag = tag.toUpperCase();    
    bufValue = this.subStr(0, start) + 
      '['+tag+(title?'='+title:'')+']' + 
      (start==end ? '' : this.subStr(start, end)) + 
      '[/'+tag+']' + this.subStr(end, this.content.length);
    
    this.set(bufValue);
    st2 = (start + ('['+tag+(title?'='+title:'')+']').length);
    this.setCaretPos( st2, st2 + this.subStr(start, end).length );    
    if(this.overflow!='hidden') gID(gvar.tID).scrollTop = (this.last_scrollTop+1);
    return bufValue; 
  },
  add: function(text){ // used on fetch post only
    var newline = '\n\n';
    if( gID(gvar.tID).value != "" )
      this.content+= newline;
    gID(gvar.tID).value = ( this.content + text );
    
    setTimeout(function(){
      _TEXT.lastfocus();
    }, 200);
  },
  // ptpos stand to puretext position [start, end]
  setValue : function(text, ptpos){
    var start=this.cursorPos[0], end=this.cursorPos[1];
    if(isUndefined(ptpos)) ptpos=[text.length,text.length];
    if(start!=end) {
      this.replaceSelected(text,ptpos);
      return;
    }
    var bufValue = this.subStr(0, start) + text + this.subStr(start, this.content.length);
    this.set(bufValue);
    // fix chrome weird
    this.setCaretPos( (start + ptpos[0]), (start+ptpos[1]) );
    if(_TEXT.overflow!='hidden') gID(gvar.tID).scrollTop = (this.last_scrollTop+1);
    return bufValue; 
  },
  replaceSelected : function(text, ptpos){
    var start=this.cursorPos[0], end=this.cursorPos[1];
    if(start==end) return;    
    var bufValue = this.subStr(0, start) + text + this.subStr(end, this.content.length);
    this.set(bufValue);
    this.setCaretPos( (start + ptpos[0]), (start+ptpos[1]) );
    if( _TEXT.overflow!='hidden') gID(gvar.tID).scrollTop = (this.last_scrollTop+1);
  },
  pracheck: function(foc){
    if( isUndefined(foc) )
      foc = true;
    
    _TEXT.setElastic(gvar.maxH_editor);
    if( gID(gvar.tID).value !="" )
      gID('clear_text').style.setProperty('display', 'block');
    else
      gID('clear_text').style.setProperty('display', 'none');
    if(foc) setTimeout(function(){
      _TEXT.focus();
    }, 200);
  },
  focus: function(){ 
    gID(gvar.tID).focus() 
  },
  lastfocus: function (){
    var eText, nl, pos, txt = String(gID(gvar.tID).value); // use the actual content
    pos = txt.length;   
    nl = txt.split('\n');
    nl = nl.length;
    pos+= (nl * 2);   
    eText = gID(gvar.tID);
    if( eText.setSelectionRange ) {
      _TEXT.focus();
      eText.setSelectionRange(pos,pos);
    }
    setTimeout(function(){ _TEXT.focus() } , 310);
  },
  getSelectedText : function() {
    return (this.cursorPos[0]==this.cursorPos[1]? '': this.subStr(this.cursorPos[0], this.cursorPos[1]) );
  },
  getCaretPos : function() {  
    var CaretPos = 0;
    //Mozilla/Firefox/Netscape 7+ support   
    if(gID(gvar.tID))
      if (gID(gvar.tID).selectionStart || gID(gvar.tID).selectionStart == '0')
      CaretPos = gID(gvar.tID).selectionStart;
    return CaretPos;
  },  
  setCaretPos : function (pos,end){
    if(isUndefined(end)) end = pos;
    if(gID(gvar.tID).setSelectionRange)    { // Firefox, Opera and Safari
      this.focus();
      gID(gvar.tID).setSelectionRange(pos,end);
    }
  },
  setElastic: function(max,winrez){
    var a, tid=gvar.tID;
  
    function setCols_Elastic(max){
      var a=gID(tid); a.setAttribute("cols", Math.floor(a.clientWidth/7));
      var w = Math.floor(a.clientWidth/7);
      _TEXT.setRows_Elastic(max)
    }
    a= gID(tid) || gID(gvar.tID);
    _TEXT.oflow='hidden';
    a.setAttribute('style','visibility:hidden; overflow:'+_TEXT.oflow+';letter-spacing:0;line-height:14pt;'+(max?'max-height:'+(max-130)+'pt;':''));
    if( !winrez ) gID(gvar.tID).keyup(function(){ setCols_Elastic(max) });
    setCols_Elastic(max);
  },
  setRows_Elastic: function(max){
    var a = gID(gvar.tID), c=a.cols, b=a.value.toString(), h;
    b=b.replace(/(?:\r\n|\r|\n)/g,"\n");
    for(var d=2,e=0,f=0;f<b.length;f++){
      var g=b.charAt(f);e++;if(g=="\n"||e==c){d++;e=0}
    }
    h=(d*14); a.setAttribute("rows",d); a.style.height=h+"pt";
    _TEXT.oflow = (max && (d*14>(max-130)) ? 'auto':'hidden');
    a.style.setProperty('overflow', _TEXT.oflow, 'important');
    gID(gvar.tID).style.setProperty('visibility', 'visible');
  }
};

// ----my ge-debug--------
function show_alert(msg, force) {
  if(arguments.callee.counter) { arguments.callee.counter++; } else { arguments.callee.counter=1; }
  GM_log('('+arguments.callee.counter+') '+msg);
  if(force==0) { return; }
}
function clog(msg) {
  if(!gvar.__DEBUG__) return;
  show_alert(msg);
}



// main resource
var rSRC = {
  getSetOf: function(type){
    if(isUndefined(type)) return false;
    switch(type){
      case "button":
      return {
        rainbow_gif : ""
        +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACx"
        +"MBAJqcGAAAAAd0SU1FB9sICxUyJwHLCg0AAALJSURBVDjL7ZRLa5x1HIWf/+WdeeeamaTjaNJKMl5DI1p6QWu76EaqQlFQqEgW4gUXbnTryg8gfgAF+wXciyAUC11oSE"
        +"K0iNpLyCSZTseZziTv5J339v+5cSMEcVvwLA+HZ3HgHPhfD54EdBsK25D/L3l1mLmuqDmhlcEjDo4K1IBMw58K7gK7RcXt40Lwr8ArBvtsxmMOLgic10XmpERLeTRwJB"
        +"LTIaQtIVsKrir4YQzt85AdClyFU6L4CM1lXUH5Z9j0T1MyTeqSEKVt+vEGTFaZzfYRMq4o+HINNt4D+QdwFV7L4BMzxcnyy+zPLGN5CEmK2iRGFRWkNpHQHjjULrr3Nc"
        +"H4expuzDULX5yAbwHs3509ngjv5lucrL9BWrqE6jZsekNp19MxByBaIQWr02Y+ny1VM9P8OLXDeZLRN7wY77C9An+cgltmFfIpfGoqXKy9jvGX9d6dWU9fj03xt7gedO"
        +"4/H/WHZ3KDvaV4ENdHfT2S+zqtFRsmbSy4MR0KyRYPuwh5x+OaeR8Wgc/L5yhOLbO/84QxV0dF9Xs0p9zgorPdN5XpX8jb0Wmno1Y2wea7ZqiDLJK5ZkbVd2F6m6PJNt"
        +"Oe4zvzAbxlyrw08zbx5Jx2a2JKG2HD+d3L99j6sBGOquW9YWQnY6wOFyre+Kw12m31K79Ml1TsNY9Imrsr3uQGGTG3LPCCV8d4TxLfrEi0OSxgxieM9F49FgTDbH395+"
        +"7Ozm4OlFtYeDRZeubpqfLgladUdaV3U/9oj83E8ew8oa0zFQWctQJHVJE7apooyomEScnqsKV10tSbmyuD3r2+yjK5DlLudLrHy5Vy+7npxWYaLAbj0pqX5CUzDTVSBf"
        +"GBhgW+Uhat8so5I8qJVaRVFD6D/uAgjhOdy/m/An4YTuYHg5HTyiuT1jKH1mIQ5Su0J0ZBwE+g5bPDJ3j4NKvqwX6nvwCqwTnwEVQ78QAAAABJRU5ErkJggg=="

      };
      break;
    }
  }

};
// -end static
//========= 

function init(){
  gvar.qr_identity= 'qr_plugins_container';
  gvar.try_wait = 0;
  gvar.try_max = 20;
  gvar.sITry_wait= null;

  wait_for_qr();
}

// make sure QR DOM is finished loaded
function wait_for_qr(){
  if( gvar.try_wait<gvar.try_max ){
    if( !gID(gvar.qr_identity) ){
      clog('waiting..');
      gvar.try_wait++;
      gvar.sITry_wait = window.setTimeout(function() { wait_for_qr() }, 500);
    }else{
      clearTimeout( gvar.sITry_wait ); 
      init_start();
    }
  }
}

// ------
init();
// ------

})()
/* Mod By Idx. */