QR-Plugins.TextMechanic

plugins for Kaskus-QR TextMechanic generator

  1. // ==UserScript==
  2. // @name QR-Plugins.TextMechanic
  3. // @namespace http://userscripts.org/users/315214
  4. // @include *.kaskus.co.id/thread/*
  5. // @include *.kaskus.co.id/lastpost/*
  6. // @include *.kaskus.co.id/post/*
  7. // @include *.kaskus.co.id/group/discussion/*
  8. // @include *.kaskus.co.id/show_post/*
  9. // @version 0.4
  10. // @dtversion 1210300004
  11. // @timestamp 1351547543977
  12. // @qrversion 4.0.9
  13. // @description plugins for Kaskus-QR TextMechanic generator
  14. // @author tuxie.forte;
  15. // @license (CC) by-nc-sa 3.0
  16. //
  17. // -!--latestupdate
  18. //
  19. // v0.4 - 2012-10-30
  20. // include new-kaskus (co.id)
  21. //
  22. // v0.3 - 2011-08-27
  23. // Fix deprecate relative position
  24. //
  25. // v0.2 - 2011-08-24
  26. // + Encryption from crypo.com
  27. //
  28. // v0.1 - 2011-08-23
  29. // init
  30. //
  31. // -/!latestupdate---
  32. // ==/UserScript==
  33. //
  34.  
  35. (function(){
  36. // Initialize Global Variables
  37. var gvar=function() {};
  38.  
  39. /*
  40. window.alert(new Date().getTime());
  41. */
  42. //========-=-=-=-=--=========
  43. gvar.__DEBUG__ = false; // development
  44. //========-=-=-=-=--=========
  45.  
  46.  
  47. // this is where we re-initialize before we trigger start_Main()
  48. // any huge global var or loading any saved value may start in here too
  49. function init_start(){
  50. gvar.B = rSRC.getSetOf('button');
  51. gvar.tID = "reply-messsage";
  52. start_Main();
  53. }
  54. // =====
  55. // START
  56. function start_Main(){
  57.  
  58. var par = gID(gvar.qr_identity);
  59. var el, inp, divs, span;
  60. var text_mecs = {
  61. 'b64Enc' : 'Text > Base64'
  62. ,'b64Dec' : ' decrypt(Base64)'
  63.  
  64. ,'binEnc' : 'Text > Binary'
  65. ,'binDec' : ' decrypt(Binary)'
  66.  
  67. ,'esabEnc' : 'Text > ESAB-46'
  68. ,'esabDec' : ' decrypt(ESAB-46)'
  69.  
  70. ,'_3fxEnc' : 'Text > TIGO-3FX'
  71. ,'_3fxDec' : ' decrypt(TIGO-3FX)'
  72.  
  73. ,'gila7Enc' : 'Text > GILA7'
  74. ,'gila7Dec' : ' decrypt(GILA7)'
  75.  
  76. ,'atom128Enc' : 'Text > ATOM-128'
  77. ,'atom128Dec' : ' decrypt(ATOM-128)'
  78.  
  79. };
  80. if( par ){
  81. // this span container needed if we have to wrap popup menu with absolute position
  82. span = createEl('span', {style:'display:inline-block'});
  83. Dom.add(span, par);
  84. inp = createEl('img', {id:'btn_txtmec', 'src':gvar.B.txtmec_gif, style:'vertical-align:bottom;', alt:'[txtmec]', title:'Text Mechanic Generator'});
  85. _o('click', inp, function(e){return toggle_txtmec_menu(e)} );
  86. Dom.add(inp, span);
  87. // fake input for lost focus (blured)
  88. inp = createEl('input', {id:'txtmec_fake_focus', 'value':'', style:'border:0; width:0; position:absolute; margin:-99px 0 0 -99999px;'});
  89. _o('blur', inp, function(e){ var c=gID('popup_txtmec_menu'); if(c) window.setTimeout(function() { gID('popup_txtmec_menu').style.display='none' }, 500); });
  90. Dom.add(inp, span);
  91. divs = createEl('div', {id:'popup_txtmec_menu', 'class':'vbmenu_popup', 'style':'width:auto; overflow:hidden; display:none;'});
  92. for(var tipe in text_mecs){
  93. el = createEl('div', {style:'text-align:left;', 'class':'osize', rel:tipe, title:text_mecs[tipe]}, text_mecs[tipe]);
  94. _o('click', el, function(e){ return handleClick(e) });
  95. Dom.add(el, divs);
  96. }
  97. Dom.add(divs, span);
  98. }
  99. }
  100. function handleClick(e){
  101. var vBText = _TEXT.init();
  102. if(!vBText) return;
  103. e=e.target||e;
  104.  
  105. var endFocus=function(){ _TEXT.focus(); return false}, suffix='';
  106. var selected = _TEXT.getSelectedText(), todo = e.getAttribute('rel'), ret='', prehead, text;
  107.  
  108. text=(selected!= '' ? selected : prompt('Please enter Text to become rainbow:', 'text mechanic') );
  109. if(text==null) return endFocus();
  110.  
  111. ret = textMechanic(text, todo);
  112.  
  113. if( /Enc$/.test(todo) ){
  114. var tit = e.title, cucok = /;\s(.+)/.exec(tit);
  115. suffix = (cucok ? "\r\n" + '[size=1]' + cucok[1] + '[/size]' : '');
  116. ret+=suffix;
  117. }
  118. prehead = [0, ret.length];
  119. if(selected=='')
  120. _TEXT.setValue( ret, prehead );
  121. else
  122. _TEXT.replaceSelected( ret, prehead );
  123. }
  124.  
  125. function toggle_txtmec_menu(e){
  126. e=e.target||e;
  127. var tgt = gID('popup_txtmec_menu'), showed=(tgt.style.display!='none');
  128. tgt.style.display=(showed ? 'none' : '');
  129.  
  130. if(!showed && gID('txtmec_fake_focus'))
  131. window.setTimeout(function() { gID('txtmec_fake_focus').focus() }, 200);
  132. }
  133.  
  134.  
  135. /*=========
  136. # main functions
  137. # >Binary Code Translator
  138. # >Base64 Converter
  139. # Copyright 2011 TextMechanic.com All Rights Reserved
  140. # sources:
  141. # + http://textmechanic.com
  142. # + http://crypo.com
  143. # =========
  144. */
  145. function textMechanic(text, todo){
  146. var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  147. var B64={
  148. Enc:function(a){var b,c,d;var e,f,g,h;var i=0,j="";while(i<a.length){b=a.charCodeAt(i++);c=a.charCodeAt(i++);d=a.charCodeAt(i++);e=b>>2;f=(b&3)<<4|c>>4;g=(c&15)<<2|d>>6;h=d&63;if(isNaN(c)){g=h=64}else if(isNaN(d)){h=64}j+=keyStr.charAt(e)+keyStr.charAt(f)+keyStr.charAt(g)+keyStr.charAt(h)}return j},
  149. Dec:function(a){var b,c,d;var e,f,g,h;var i=0,j="";a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(i<a.length){e=keyStr.indexOf(a.charAt(i++));f=keyStr.indexOf(a.charAt(i++));g=keyStr.indexOf(a.charAt(i++));h=keyStr.indexOf(a.charAt(i++));b=e<<2|f>>4;c=(f&15)<<4|g>>2;d=(g&3)<<6|h;j+=String.fromCharCode(b);if(g!=64){j+=String.fromCharCode(c)}if(h!=64){j+=String.fromCharCode(d)}}j=j.toString();return j}
  150. };
  151. // end B64
  152. var BIN={
  153. spaces:true,
  154. Enc:function(a){var b=[],c,d;a=a.replace(/\r/g,"");a=a.split("\n");c=a.length;for(var e=0;e<c;e++)b[e]=BIN.bincvt(a[e]).trim();d=BIN.spaces?" 00001010 ":"00001010";b=b.join(d);return b.trim()},
  155. Dec:function(a){a=a.trim().replace(/\r/g,"");if(a.length<8){alert("Invalid Binary");return a}a=a.split("\n");var b=[],c=[],d;for(var e=0;e<a.length;e++){b[e]=BIN.cleantxt(a[e])}a=BIN.revemplin(b,"").join("\n");a=a.split(" ").join("");a=a.split("\n");d=a.length;for(var e=0;e<d;e++){c[e]=BIN.asccvt(a[e])}c=c.join("\n");return c},
  156. bincvt:function(a){var b=a,c=[],d,e,f,g=" ";b=b.split("");d=b.length;e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%&*()-_+={}[]|:;<>?,.\"/\\' ";f=["01000001","01000010","01000011","01000100","01000101","01000110","01000111","01001000","01001001","01001010","01001011","01001100","01001101","01001110","01001111","01010000","01010001","01010010","01010011","01010100","01010101","01010110","01010111","01011000","01011001","01011010","01100001","01100010","01100011","01100100","01100101","01100110","01100111","01101000","01101001","01101010","01101011","01101100","01101101","01101110","01101111","01110000","01110001","01110010","01110011","01110100","01110101","01110110","01110111","01111000","01111001","01111010","00110000","00110001","00110010","00110011","00110100","00110101","00110110","00110111","00111000","00111001","00100001","01000000","00100011","00100100","00100101","00100110","00101010","00101000","00101001","00101101","01011111","00101011","00111101","01111011","01111101","01011011","01011101","01111100","00111010","00111011","00111100","00111110","00111111","00101100","00101110","00100010","00101111","01011100","00100111","00100000"];for(var h=0;h<d;h++){var i=f[e.indexOf(b[h])];if(i==undefined)c[h]="";else c[h]=i+g}c=c.join("");return c},
  157. asccvt:function(a){var b=a,c,d,e=[],f;b=BIN.chunk(b,8).join(",||");b="||"+b;b=b.split(",");f=b.length;c=" ||01000001||01000010||01000011||01000100||01000101||01000110||01000111||01001000||01001001||01001010||01001011||01001100||01001101||01001110||01001111||01010000||01010001||01010010||01010011||01010100||01010101||01010110||01010111||01011000||01011001||01011010||01100001||01100010||01100011||01100100||01100101||01100110||01100111||01101000||01101001||01101010||01101011||01101100||01101101||01101110||01101111||01110000||01110001||01110010||01110011||01110100||01110101||01110110||01110111||01111000||01111001||01111010||00110000||00110001||00110010||00110011||00110100||00110101||00110110||00110111||00111000||00111001||00100001||01000000||00100011||00100100||00100101||00100110||00101010||00101000||00101001||00101101||01011111||00101011||00111101||01111011||01111101||01011011||01011101||01111100||00111010||00111011||00111100||00111110||00111111||00101100||00101110||00100010||00101111||01011100||00100111||00100000||00001010";d=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","!","@","#","$","%","&","*","(",")","-","_","+","=","{","}","[","]","|",":",";","<",">","?",",",".",'"',"/","\\","'"," ","\n"];for(var g=0;g<f;g++){e[g]=d[c.indexOf(b[g])/10-1]}e=e.join("");return e},
  158. chunk:function(a,b){if(typeof b=="undefined")b=2;return a.match(RegExp(".{1,"+b+"}","g"))},
  159. cleantxt:function(a){var b=a,c=[],d,e;b=b.split("");d="abcdefghijklmnopqrstuvwxyz0123456789!@#$%&*()-_+={}[]|:;<>?,.\"/\\' ";e=["","","","","","","","","","","","","","","","","","","","","","","","","","","0","1","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""];for(var f=0;f<b.length;f++)c[f]=e[d.indexOf(b[f])];cleaned=c.join("");if(cleaned.length==0)cleaned="00100000";return cleaned},
  160. revemplin:function(a,b){var c;for(c=0;c<a.length;c++){if(a[c]==b){a.splice(c,1);c--}}return a}
  161. };
  162. // end BIN
  163. var ES46={
  164. Enc: function(a){a=escape(a);var b="",c,d,e="";var f,g,h,i="",j=0;do{c=a.charCodeAt(j++);d=a.charCodeAt(j++);e=a.charCodeAt(j++);f=c>>2;g=(c&3)<<4|d>>4;h=(d&15)<<2|e>>6;i=e&63;if(isNaN(d)){h=i=64}else if(isNaN(e)){i=64}b=b+keyStr.charAt(f)+keyStr.charAt(g)+keyStr.charAt(h)+keyStr.charAt(i);c=d=e="";f=g=h=i=""}while(j<a.length);return b },
  165. Dec: function(a){a=a.replace(/\s+/g,"");var b="",c,d,e="";var f,g,h,i="",j=0;var k=/[^A-Za-z0-9\+\/\=]/g;if(k.exec(a)){alert("Errors in decoding.")}a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{f=keyStr.indexOf(a.charAt(j++));g=keyStr.indexOf(a.charAt(j++));h=keyStr.indexOf(a.charAt(j++));i=keyStr.indexOf(a.charAt(j++));c=f<<2|g>>4;d=(g&15)<<4|h>>2;e=(h&3)<<6|i;b=b+String.fromCharCode(c);if(h!=64){b=b+String.fromCharCode(d)}if(i!=64){b=b+String.fromCharCode(e)}c=d=e="";f=g=h=i=""}while(j<a.length);return unescape(b) }
  166. };
  167. // end ES46
  168. var _3FX={
  169. keyStr: "FrsxyzA8VtuvwDEq" + "WZ/1+4klm67=cBCa" + "5Ybdef0g2hij9nop" + "MNO3GHIRSTJKLPQU" + "X"
  170. ,Enc: function(a){a=escape(a);var b="",c,d,e="",f=_3FX.keyStr;var g,h,i,j="",k=0;do{c=a.charCodeAt(k++);d=a.charCodeAt(k++);e=a.charCodeAt(k++);g=c>>2;h=(c&3)<<4|d>>4;i=(d&15)<<2|e>>6;j=e&63;if(isNaN(d)){i=j=64}else if(isNaN(e)){j=64}b=b+f.charAt(g)+f.charAt(h)+f.charAt(i)+f.charAt(j);c=d=e="";g=h=i=j=""}while(k<a.length);return b}
  171. ,Dec: function(a){a=a.replace(/\s+/g,"");var b="",c,d,e="",f=_3FX.keyStr;var g,h,i,j="",k=0,l=/[^A-Za-z0-9\+\/\=]/g;if(l.exec(a)){alert("Errors in decoding.")}a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{g=f.indexOf(a.charAt(k++));h=f.indexOf(a.charAt(k++));i=f.indexOf(a.charAt(k++));j=f.indexOf(a.charAt(k++));c=g<<2|h>>4;d=(h&15)<<4|i>>2;e=(i&3)<<6|j;b=b+String.fromCharCode(c);if(i!=64){b=b+String.fromCharCode(d)}if(j!=64){b=b+String.fromCharCode(e)}c=d=e="";g=h=i=j=""}while(k<a.length);return unescape(b)}
  172. };
  173. // end _3FX
  174. var GILA7={
  175. keyStr: "7ZSTJK+W=cVtBCas" + "yf0gzA8uvwDEq3XH" + "/1RMNOILPQU4klm6" + "5YbdeFrx2hij9nop" + "G"
  176. ,Enc: function(a){a=escape(a);var b="",c,d,e="",f=GILA7.keyStr;var g,h,i,j="",k=0;do{c=a.charCodeAt(k++);d=a.charCodeAt(k++);e=a.charCodeAt(k++);g=c>>2;h=(c&3)<<4|d>>4;i=(d&15)<<2|e>>6;j=e&63;if(isNaN(d)){i=j=64}else if(isNaN(e)){j=64}b=b+f.charAt(g)+f.charAt(h)+f.charAt(i)+f.charAt(j);c=d=e="";g=h=i=j=""}while(k<a.length);return b}
  177. ,Dec: function(a){a=a.replace(/\s+/g,"");var b="",c,d,e="",f=GILA7.keyStr;var g,h,i,j="",k=0,l=/[^A-Za-z0-9\+\/\=]/g;if(l.exec(a)){alert("Errors in decoding.")}a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{g=f.indexOf(a.charAt(k++));h=f.indexOf(a.charAt(k++));i=f.indexOf(a.charAt(k++));j=f.indexOf(a.charAt(k++));c=g<<2|h>>4;d=(h&15)<<4|i>>2;e=(i&3)<<6|j;b=b+String.fromCharCode(c);if(i!=64){b=b+String.fromCharCode(d)}if(j!=64){b=b+String.fromCharCode(e)}c=d=e="";g=h=i=j=""}while(k<a.length);return unescape(b)}
  178. };
  179. // end GILA7
  180. var ATOM128={
  181. keyStr: "/128GhIoPQROSTeU" + "bADfgHijKLM+n0pF" + "WXY456xyzB7=39Va" + "qrstJklmNuZvwcdE" + "C"
  182. ,Enc: function(a){a=escape(a);var b="",c,d,e="",f=ATOM128.keyStr;var g,h,i,j="",k=0;do{c=a.charCodeAt(k++);d=a.charCodeAt(k++);e=a.charCodeAt(k++);g=c>>2;h=(c&3)<<4|d>>4;i=(d&15)<<2|e>>6;j=e&63;if(isNaN(d)){i=j=64}else if(isNaN(e)){j=64}b=b+f.charAt(g)+f.charAt(h)+f.charAt(i)+f.charAt(j);c=d=e="";g=h=i=j=""}while(k<a.length);return b}
  183. ,Dec: function(a){a=a.replace(/\s+/g,"");var b="",c,d,e="",f=ATOM128.keyStr;var g,h,i,j="",k=0,l=/[^A-Za-z0-9\+\/\=]/g;if(l.exec(a)){alert("Errors in decoding.")}a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{g=f.indexOf(a.charAt(k++));h=f.indexOf(a.charAt(k++));i=f.indexOf(a.charAt(k++));j=f.indexOf(a.charAt(k++));c=g<<2|h>>4;d=(h&15)<<4|i>>2;e=(i&3)<<6|j;b=b+String.fromCharCode(c);if(i!=64){b=b+String.fromCharCode(d)}if(j!=64){b=b+String.fromCharCode(e)}c=d=e="";g=h=i=j=""}while(k<a.length);return unescape(b)}
  184. };
  185. // end GILA7
  186. /*
  187. # ======
  188. */
  189. switch(todo){
  190. case "b64Enc": return B64.Enc(text);break;
  191. case "b64Dec": return B64.Dec(text); break;
  192. case "binEnc": return BIN.Enc(text); break;
  193. case "binDec": return BIN.Dec(text); break;
  194. case "esabEnc": return ES46.Enc(text); break;
  195. case "esabDec": return ES46.Dec(text); break;
  196. case "_3fxEnc": return _3FX.Enc(text); break;
  197. case "_3fxDec": return _3FX.Dec(text); break;
  198. case "gila7Enc": return GILA7.Enc(text); break;
  199. case "gila7Dec": return GILA7.Dec(text); break;
  200. case "atom128Enc": return ATOM128.Enc(text); break;
  201. case "atom128Dec": return ATOM128.Dec(text); break;
  202. default: return (text); break;
  203. }
  204. }
  205.  
  206.  
  207.  
  208. // -
  209. // -
  210. // -
  211. // -
  212. //=========
  213. // code below should adapting current QR Engine for this plugins works
  214. // leave code below as wot it is, as long you know what todo
  215. //========= Common Functions && Global Var Init ====
  216. // static routine
  217. function isDefined(x) { return !(x == null && x !== null); }
  218. function isUndefined(x) { return x == null && x !== null; }
  219. function isString(x) { return (typeof(x)!='object' && typeof(x)!='function'); }
  220. function trimStr(x) { return x.replace(/^\s+|\s+$/g,""); };
  221.  
  222. function _o(m,e,f){Dom.Ev(e,m,function(e){typeof(f)=='function'?f(e):void(0)});}
  223. function gID(x) { return document.getElementById(x) }
  224. function addClass(cName, Obj){
  225. if(cName=="") return;
  226. var neocls = (Obj.className ? Obj.className : '');
  227. if(neocls.indexOf(cName)!=-1) return;
  228. neocls+=(neocls!=''?' ':'')+cName;
  229. Obj.setAttribute('class', neocls);
  230. }
  231. function removeClass(cName, Obj){
  232. if(cName=="") return;
  233. var neocls = (Obj.className ? Obj.className : '');
  234. neocls = trimStr ( neocls.replace(cName,"") ); // replace and trim
  235. Obj.setAttribute('class', neocls);
  236. }
  237. function SimulateMouse(elem,event,preventDef) {
  238. if(typeof(elem)!='object') return;
  239. var evObj = document.createEvent('MouseEvents');
  240. preventDef=(isDefined(preventDef) && preventDef ? true : false);
  241. evObj.initEvent(event, preventDef, true);
  242. try{elem.dispatchEvent(evObj);}
  243. catch(e){}
  244. }
  245. function createEl(type, attrArray, html){
  246. var node = document.createElement(type);
  247. for (var attr in attrArray)
  248. if (attrArray.hasOwnProperty(attr))
  249. node.setAttribute(attr, attrArray[attr]);
  250. if(html) node.innerHTML = html;
  251. return node;
  252. }
  253.  
  254. // Get Elements
  255. var $D=function (q, root, single) {
  256. if (root && typeof root == 'string') {
  257. root = $D(root, null, true);
  258. if (!root) { return null; }
  259. }
  260. if( !q ) return false;
  261. if ( typeof q == 'object') return q;
  262. root = root || document;
  263. if (q[0]=='/' || (q[0]=='.' && q[1]=='/')) {
  264. if (single) { return document.evaluate(q, root, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; }
  265. return document.evaluate(q, root, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  266. }
  267. else if (q[0]=='.') { return root.getElementsByClassName(q.substr(1)); }
  268. else { return root.getElementById( (q[0]=='#' ? q.substr(1):q.substr(0)) ); }
  269. return root.getElementsByTagName(q);
  270. };
  271. // utk add - remove element
  272. var Dom = {
  273. g: function(el) {
  274. if(!el) return false;
  275. return ( isString(el) ? document.getElementById(el) : el );
  276. },
  277. add: function(el, dest) {
  278. var el = this.g(el);
  279. var dest = this.g(dest);
  280. if(el && dest) dest.appendChild(el);
  281. },
  282. remove: function(el) {
  283. var el = this.g(el);
  284. if(el && el.parentNode)
  285. el.parentNode.removeChild(el);
  286. },
  287. Ev: function() {
  288. if (window.addEventListener) {
  289. return function(el, type, fn, ph) {
  290. if(typeof(el)=='object')
  291. this.g(el).addEventListener(type, function(e){fn(e);}, (isUndefined(ph) ? false : ph));
  292. };
  293. }else if (window.attachEvent) {
  294. return function(el, type, fn) {
  295. var f = function() { fn.call(this.g(el), window.event); };
  296. this.g(el).attachEvent('on' + type, f);
  297. };
  298. }
  299. }()
  300. };
  301.  
  302. var _TEXT = {
  303. e : null, eNat : null,
  304. content : "",
  305. cursorPos : [],
  306. last_scrollTop: 0,
  307. init: function() {
  308. this.eNat = gID(gvar.tID);
  309. this.content = this.eNat.value;
  310. this.cursorPos = _TEXT.rearmPos(); // [start, end]
  311. this.last_scrollTop = gID(gvar.tID).scrollTop; // last scrolltop pos
  312. return this;
  313. },
  314. rearmPos: function(){ return [this.getCaretPos(), gID(gvar.tID).selectionEnd]; },
  315. subStr: function(start, end){ return this.content.substring(start, end);},
  316. set: function(value){
  317. gID(gvar.tID).value = this.content = value;
  318. _TEXT.setRows_Elastic();
  319. _TEXT.init();
  320.  
  321. },
  322. wrapValue : function(tag, title){
  323. var st2, start=this.cursorPos[0], end=this.cursorPos[1],bufValue;
  324. tag = tag.toUpperCase();
  325. bufValue = this.subStr(0, start) +
  326. '['+tag+(title?'='+title:'')+']' +
  327. (start==end ? '' : this.subStr(start, end)) +
  328. '[/'+tag+']' + this.subStr(end, this.content.length);
  329. this.set(bufValue);
  330. st2 = (start + ('['+tag+(title?'='+title:'')+']').length);
  331. this.setCaretPos( st2, st2 + this.subStr(start, end).length );
  332. if(this.overflow!='hidden') gID(gvar.tID).scrollTop = (this.last_scrollTop+1);
  333. return bufValue;
  334. },
  335. add: function(text){ // used on fetch post only
  336. var newline = '\n\n';
  337. if( gID(gvar.tID).value != "" )
  338. this.content+= newline;
  339. gID(gvar.tID).value = ( this.content + text );
  340. setTimeout(function(){
  341. _TEXT.lastfocus();
  342. }, 200);
  343. },
  344. // ptpos stand to puretext position [start, end]
  345. setValue : function(text, ptpos){
  346. var start=this.cursorPos[0], end=this.cursorPos[1];
  347. if(isUndefined(ptpos)) ptpos=[text.length,text.length];
  348. if(start!=end) {
  349. this.replaceSelected(text,ptpos);
  350. return;
  351. }
  352. var bufValue = this.subStr(0, start) + text + this.subStr(start, this.content.length);
  353. this.set(bufValue);
  354. // fix chrome weird
  355. this.setCaretPos( (start + ptpos[0]), (start+ptpos[1]) );
  356. if(_TEXT.overflow!='hidden') gID(gvar.tID).scrollTop = (this.last_scrollTop+1);
  357. return bufValue;
  358. },
  359. replaceSelected : function(text, ptpos){
  360. var start=this.cursorPos[0], end=this.cursorPos[1];
  361. if(start==end) return;
  362. var bufValue = this.subStr(0, start) + text + this.subStr(end, this.content.length);
  363. this.set(bufValue);
  364. this.setCaretPos( (start + ptpos[0]), (start+ptpos[1]) );
  365. if( _TEXT.overflow!='hidden') gID(gvar.tID).scrollTop = (this.last_scrollTop+1);
  366. },
  367. pracheck: function(foc){
  368. if( isUndefined(foc) )
  369. foc = true;
  370. _TEXT.setElastic(gvar.maxH_editor);
  371. if( gID(gvar.tID).value !="" )
  372. gID('clear_text').style.setProperty('display', 'block');
  373. else
  374. gID('clear_text').style.setProperty('display', 'none');
  375. if(foc) setTimeout(function(){
  376. _TEXT.focus();
  377. }, 200);
  378. },
  379. focus: function(){
  380. gID(gvar.tID).focus()
  381. },
  382. lastfocus: function (){
  383. var eText, nl, pos, txt = String(gID(gvar.tID).value); // use the actual content
  384. pos = txt.length;
  385. nl = txt.split('\n');
  386. nl = nl.length;
  387. pos+= (nl * 2);
  388. eText = gID(gvar.tID);
  389. if( eText.setSelectionRange ) {
  390. _TEXT.focus();
  391. eText.setSelectionRange(pos,pos);
  392. }
  393. setTimeout(function(){ _TEXT.focus() } , 310);
  394. },
  395. getSelectedText : function() {
  396. return (this.cursorPos[0]==this.cursorPos[1]? '': this.subStr(this.cursorPos[0], this.cursorPos[1]) );
  397. },
  398. getCaretPos : function() {
  399. var CaretPos = 0;
  400. //Mozilla/Firefox/Netscape 7+ support
  401. if(gID(gvar.tID))
  402. if (gID(gvar.tID).selectionStart || gID(gvar.tID).selectionStart == '0')
  403. CaretPos = gID(gvar.tID).selectionStart;
  404. return CaretPos;
  405. },
  406. setCaretPos : function (pos,end){
  407. if(isUndefined(end)) end = pos;
  408. if(gID(gvar.tID).setSelectionRange) { // Firefox, Opera and Safari
  409. this.focus();
  410. gID(gvar.tID).setSelectionRange(pos,end);
  411. }
  412. },
  413. setElastic: function(max,winrez){
  414. var a, tid=gvar.tID;
  415. function setCols_Elastic(max){
  416. var a=gID(tid); a.setAttribute("cols", Math.floor(a.clientWidth/7));
  417. var w = Math.floor(a.clientWidth/7);
  418. _TEXT.setRows_Elastic(max)
  419. }
  420. a= gID(tid) || gID(gvar.tID);
  421. _TEXT.oflow='hidden';
  422. a.setAttribute('style','visibility:hidden; overflow:'+_TEXT.oflow+';letter-spacing:0;line-height:14pt;'+(max?'max-height:'+(max-130)+'pt;':''));
  423. if( !winrez ) gID(gvar.tID).keyup(function(){ setCols_Elastic(max) });
  424. setCols_Elastic(max);
  425. },
  426. setRows_Elastic: function(max){
  427. var a = gID(gvar.tID), c=a.cols, b=a.value.toString(), h;
  428. b=b.replace(/(?:\r\n|\r|\n)/g,"\n");
  429. for(var d=2,e=0,f=0;f<b.length;f++){
  430. var g=b.charAt(f);e++;if(g=="\n"||e==c){d++;e=0}
  431. }
  432. h=(d*14); a.setAttribute("rows",d); a.style.height=h+"pt";
  433. _TEXT.oflow = (max && (d*14>(max-130)) ? 'auto':'hidden');
  434. a.style.setProperty('overflow', _TEXT.oflow, 'important');
  435. gID(gvar.tID).style.setProperty('visibility', 'visible');
  436. }
  437. };
  438.  
  439.  
  440. // ----my ge-debug--------
  441. function show_alert(msg, force) {
  442. if(arguments.callee.counter) { arguments.callee.counter++; } else { arguments.callee.counter=1; }
  443. GM_log('('+arguments.callee.counter+') '+msg);
  444. if(force==0) { return; }
  445. }
  446. function clog(msg) {
  447. if(!gvar.__DEBUG__) return;
  448. show_alert(msg);
  449. }
  450.  
  451.  
  452.  
  453. // main resource
  454. var rSRC = {
  455. getSetOf: function(type){
  456. if(isUndefined(type)) return false;
  457. switch(type){
  458. case "button":
  459. return {
  460. txtmec_gif : ""
  461. +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAXEAAAFxA"
  462. +"BGGER2wAAAAd0SU1FB9sIFw0bOi5x49AAAAQSSURBVDjLnZXfb1RFFMc/M3fuvXt3t+32F9S2VChsxRaIGBtIJLUVqxTBxJREYsKrxh9J/w3/AJ+MLyQ+8CCJkhDQjVKU+"
  463. +"INKARWR/uCHVaCtLdvutnv3x53jwyItr0wyk5mcM8nnfOfMOerBgwcxEUmLgOIJhhIe3lQictOISFopddF3tREb/W9jbX18B/LYWTuaYtkCqLq6ukETxHzuzs6Zsb+V2dT"
  464. +"RDjZCrFSngFiLiIAIAogVrEQgYC1MTU7x4jMxtmxuB8DEvCJXFmp55fl67ueF1cjF1+A64GrBMwrHAQfwDWgNRoFWIBZ2bNrBd1dmSHdWiQ0CWhuWijB1P8/VC2cwSrGlc"
  465. +"yvlcIWl7Dy2XOKl/gF+vnAezzNoJYSFkIH+Pro6O4h55pEEBqWwlQoSCfGYoa11E64jNDfWY6OAurhBS0QqGdD5dBvG0RitiColUjVBVdUoeiSrQYO1EY4BFRW4Nv4Dvmu"
  466. +"YuCqUywWOHHmLbzOn+ePXX4gqZQb3DzA6OkoYhrS0bGRDczNi7TpCNEQRSoRkPMng0GFqkzGoFHGU0FCb4NDQAVJ1CVZyeYJ4nKNHj2KMoaGhYY1wLWRNVIlwFEg5z9dfn"
  467. +"mBf/wDXxi+iteA6UApDjh07xucnT7J9+3ba29txHIdbt26xd28v1gpKPUw1kdzOE+cWx/c912oWC2Xu3PidwNUQleh5tovb05N4nou1lp6eHubn58lkMsTjcXK5HI4Wdr7"
  468. +"wKj3pJpLJ2pc1KKy1OBocW+af25PM3J5mevI6pUKeGzf+ZGJigqnpacIwZGxsjL6+fhobmxgaOsjycp65ezfR2lnTUCoVlAiOIxitcY3i4OHXOXv2LJ7nMTw8jOu6ZLOrV"
  469. +"CoRXV0tbNuSwlqH+qaNLC+toB4+swFFFEUoJQSux7Z0msDX+L5Hd3c3SlXtnheSnT3Onb+WQY4gM1kqxTkW7w2zujhFYbCXIB5fR6iEqFLgpwvnCXyXH78/j9YagEzmG0b"
  470. +"eGyCR+5hU3jD/21Ya6lKgi7zW+SnXc1nK4UdrhNVPCvEgwaE3DhNzNfWpFIuLi2itiawlKs/S1P0O7+4+x81fLzMxugFWLO0bcnS0gRXWh1xGKyiGK2S+OkPM9xg6cIBTp"
  471. +"04RBAGlUkTfnhS7dtaijc/xz96kJZ7lqeAurRsN1q7PQ4BIyK1WaEyl+PCD91GA1pqRkZFHjnb1KiJjgCKRWCUeK9DSOEvgF8ECImuE6TbNF6cvsXvHZoyyKLEIVScRsNa"
  472. +"S8vOkW2dwa6CmdoWGxiUQQymEXLkeZeLVxF5YWNgV8/3xf7PLTqmoQFVr4fqCKgJBzKWUn2Ly8icE6hLL9z3msh00p/fQ2/82ydoGamqS+5WIJIBenrADPNYMRMb/A9MDy"
  473. +"rg1ZLWoAAAAAElFTkSuQmCC"
  474. };
  475. break;
  476. }
  477. }
  478.  
  479. };
  480. // -end static
  481. //=========
  482.  
  483. function init(){
  484. gvar.qr_identity= 'qr_plugins_container';
  485. gvar.try_wait = 0;
  486. gvar.try_max = 20;
  487. gvar.sITry_wait= null;
  488.  
  489. wait_for_qr();
  490. }
  491.  
  492. // make sure QR DOM is finished loaded
  493. function wait_for_qr(){
  494. if( gvar.try_wait<gvar.try_max ){
  495. if( !gID(gvar.qr_identity) ){
  496. clog(' TextMechanic waiting..');
  497. gvar.try_wait++;
  498. gvar.sITry_wait = window.setTimeout(function() { wait_for_qr() }, 500);
  499. }else{
  500. clearTimeout( gvar.sITry_wait );
  501. init_start();
  502. }
  503. }
  504. }
  505.  
  506. // ------
  507. init();
  508. // ------
  509.  
  510. })()
  511. /* tF. */