Kaskus Mobile Quick Reply

Provide Quick Reply on Kaskus Mobile

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name           Kaskus Mobile Quick Reply
// @namespace      http://userscripts.org/scripts/show/91051
// @description    Provide Quick Reply on Kaskus Mobile
// @author         idx (http://userscripts.org/users/idx)
// @version        2.7
// @dtversion      150918270
// @timestamp      1442572891205
// @include        /^https?://m.kaskus.co.id/(post|thread|lastpost)/*/
// @include        /^https?://fjb.m.kaskus.co.id/(lastpost|thread|post|product)/*/
// @license        (CC) by-nc-sa 3.0
// @run-at         document-end
//
// -!--latestupdate
//
// v2.7 - 2015-09-18 . 1442572891205
//  update kaskus recaptcha Site key;
//  
// -/!latestupdate---
// ==/UserScript==
/*
//
// v2.6 - 2015-07-24 . 1437683007275
//  update kaskus recaptcha Site key;
//  detect current user.Donatur;
//  css in_baloon;
//  
// v2.5 - 2015-05-13 . 1431550952997
//  patch css blue button; 
//  remove origin qr-form; 
//  change link to mobile-qr(GF);
//  simplify include with regex;
//  
// v2.4 - 2015-04-21 . 1429562960309
//  add include fjb mobile
//  
// v2.3 - 2015-03-01 . 1425165905164
//  fix styles bbcode buttons;
//  scrolltop on header-click;
//  Fix header styles;
//  Patch invalid security token, changed attribute:name
//  
// v2.2 - 2014-07-04 . 1404492166878
//  fix changed dom (avatar-wraper)
//  handle defect-hash callback after posting
//  
// v2.1 - 2014-06-22 . 1403371408997
//  missing char on submit post
//  
// v2.0 - 2014-05-24 . 1400867093736
//  adapting mobile-kaskus-evo
//  
// v1.0.4 - 2014-02-08 . 1391881722727
//  fix css nighmode, Thx[Prothire]
//  fix elastic height editor, on window resize
//
// more...
//
// v0.1.1 - 2010-11-23
// Init
//------
// ###@@###
// *dependency            https://addons.mozilla.org/en-US/firefox/addon/59/
// *XML of User Agent     http://techpatterns.com/downloads/firefox/useragentswitcher.xml
//
// Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
// http://creativecommons.org/licenses/by-nc-sa/3.0/deed.ms
// --------------------------------------------------------
*/
(function(){

  var gvar = function(){};
  gvar.sversion = 'v' + '2.7';
  gvar.scriptMeta = {
    timestamp: 1442572891205 // version.timestamp

   ,scriptID: 91051 // script-Id
   ,scriptID_GF: 95 // script-Id @Greasyfork
   ,slug_GF: 'kaskus-mobile-quick-reply'
  };
  /*
  window.alert(new Date().getTime());
  */
  //========-=-=-=-=--=========
  gvar.__DEBUG__ = !1; // development debug
  //========-=-=-=-=--=========

  const GMSTORAGE_PATH = 'GM_';
  const KS       = 'KEY_SAVE_';

  // predefined registered key_save
  var OPTIONS_BOX = {
     KEY_SAVE_AUTHORIZED_USERS: ['']
    ,KEY_SAVE_AVATARS_USERS: ['']
    ,KEY_SAVE_WIDE_THREAD: ['0']
    ,KEY_SAVE_TMP_TEXT: [''] // temporary text
    ,KEY_SAVE_TMP_TITLE: [''] // temporary text-title
    ,KEY_SAVE_TOGGLE_MENUS: ['0']
    ,KEY_SAVE_TOGGLE_PLUGINS: ['0']
  };

  //========= Global Var Init ====
  
  var GM_XHR = function(){
    this.uri = null;
    this.pid = null;
    this.returned= null;
    this.cached= false;
    var _gmxhr = this;
    this.request= function(cdata,met,callback){
      if( !_gmxhr.uri ) return;
      met=(isDefined(met) && met ? met:'GET');
      cdata=(isDefined(cdata) && cdata ? cdata:null);
      if(typeof(callback)!='function') callback=null;
      var pReq_xhr = {
        method: met,
        url: _gmxhr.uri + (_gmxhr.cached ? '':(_gmxhr.uri.indexOf('?')==-1?'?':'&rnd=') + Math.random().toString().replace('0.','')),
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        data: (isString(cdata) ? cdata : ''),
        onload: function(ret) {
          if(callback!=null)
            callback(ret, _gmxhr);
          else
            _gmxhr.returned = ret;
        }
      };
      //return NAT_xmlhttpRequest(pReq_xhr); // somehow this is not work in webkit
      return GM_xmlhttpRequest(pReq_xhr);
    }
    return this;
  };
  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, phase) {
          phase=(phase ? phase : false);
          if('object' === typeof el && el)
            this.g(el).addEventListener(type, function(e){fn(e);}, phase);
        };
      }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);
        };
      }
    }(),
    Evs: function(node, types, f){
      var parts = types.split(' ');
      for(var i=0; i<parts.length; ++i)
        Dom.Ev(node, parts[i], f);
    },
    remEv: function() {
      if (window.removeEventListener) {
        return function(el, type, fn, phase) {
          phase=(phase ? phase : false);
          if(typeof(el)=='object')
            this.g(el).removeEventListener(type, function(e){fn(e);}, phase);
        };      
      }
    }()
  };
  var $D=function (q, root, single) {
    var el;
    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]=='.') {
      el = root.getElementsByClassName(q.substr(1));
      return single ? el[0] : el;
    }
    else {
      return root.getElementById( (q[0]=='#' ? q.substr(1):q.substr(0)) );
    }
    return root.getElementsByTagName(q);
  };
  var $$=function(q, p){
    return (p || document).querySelector(q);
  }
  // native/generic XHR needed for Multifox, failed using GM_xmlhttpRequest.
  var NAT_xmlhttpRequest = function (obj) {
    var request = new XMLHttpRequest();
    request.onreadystatechange = function () {
      if (obj.onreadystatechange) {
        obj.onreadystatechange(request);
      };
      if (request.readyState == 4 && obj.onload) {
        obj.onload(request);
      }
    }
    request.onerror = function () {
      if (obj.onerror) {
        obj.onerror(request);
      }
    }
    try {
      request.open(obj.method, obj.url, true);
      if (obj.headers) {
        for (name in obj.headers) {
          request.setRequestHeader(name, obj.headers[name]);
        }
      }
      request.send(obj.data);
      return request;
    } catch (e) {
      if (obj.onerror) {
        obj.onerror({
            readyState: 4,
            responseHeaders: '',
            responseText: '',
            responseXML: '',
            status: 403,
            statusText: 'Forbidden'
          });
      };
      return;
    }
  };

  // Redefine GM_addGlobalStyle/GM_addGlobalScript with a better routine
  var GM_addGlobalScript = function (a, b, c) {
    var d = createEl("script", { type: "text/javascript"});
    if (isDefined(b) && isString(b)) d.setAttribute("id", b);
    if (a.match(/^https?:\/\/.+/)) d.setAttribute("src", a);
    else d.appendChild(createTextEl(a));
    if (isDefined(c) && c) {
      document.body.insertBefore(d, document.body.firstChild)
    } else {
      var e = document.getElementsByTagName("head");
      if (isDefined(e[0]) && e[0].nodeName == "HEAD") window.setTimeout(function () {
        e[0].appendChild(d)
      }, 100);
      else document.body.insertBefore(d, document.body.firstChild)
    }
    return d
  };
  var GM_addGlobalStyle=function(css, id) {
    var sel=createEl('style',{type:'text/css'});
    if(isDefined(id) && isString(id)) sel.setAttribute('id', id);
    sel.appendChild(createTextEl(css));
    var hds = document.getElementsByTagName('head');
    if(hds && hds.nodeName=='HEAD')
      window.setTimeout(function() { hds[0].appendChild(sel); }, 100);
    else
      document.body.insertBefore(sel,document.body.firstChild);
    return sel;
  };
  var _TEXTCOUNT = {
    init: function( target ){
      var cUL, _tc = _TEXTCOUNT;

      _tc.limitchar = (gvar.thread_type == 'group' ? 1000 : 10000);
      _tc.$editor = $D('#'+gvar.tID);
      _tc.$target = ("string" == typeof target ? $D(target,null,1) : target);

      if( _tc.$target ){
        addClass('ffc', _tc.$target);
        _tc.$target.value = _tc.count_it(_tc);
      }
      _tc.do_watch(_tc);
    },
    count_it: function(_tc){
      return (_tc.limitchar - _tc.$editor.value.length);
    },
    do_watch: function(_tc){
      gvar.sTryTCount = window.setInterval(function() {
        _tc.$target.value = _tc.count_it(_tc);
      }, 600);
    },
    dismiss: function(){
      var _tc = _TEXTCOUNT;
      gvar.sTryTCount && clearInterval( gvar.sTryTCount );
      _tc.$target && removeClass('ffc', _tc.$target);
    }
  };
  var _TEXT = {
    e : null, eNat : null,
    content: "",
    cursorPos: [],
    last_scrollTop: 0,
    insert: {
      tagBIU: function(el){
        var BBCode = ("string" !== typeof el && el ? getAttr('data-bb', el) : el);
        if( !BBCode ) return !1;

        _TEXT.init();
        _TEXT.wrapValue(BBCode, '' );
      },
      // action insert font/color/size/list
      tagHibrid: function(tag, value, $caleer){
        _TEXT.init();
        if(value)
          _TEXT.wrapValue(tag, value);
        else
          _TEXT.wrapValue(tag);

        if( (["FONT","COLOR","SIZE"].indexOf(tag) != -1) && $caleer ){
          showhide( closest($caleer, {'tag':'ul'}), false);
        }
        _TEXT.pracheck();
      },
      tagCustom: function (el){
        _TEXT.init();
        
        var BBCode = ( "string" !== typeof el && el ? getAttr('data-bb', el) : el);
        var text, prehead, tagprop, ptitle, selected, ret, prmpt;
        var wrapped_bb = 'INDENT,QUOTE,CODE,HTML,PHP'.split(",");

        var endFocus = function(){ _TEXT.focus(); return};
        if("undefined" == typeof BBCode) return endFocus();


        selected = _TEXT.getSelectedText();
        tagprop = '';

        if( wrapped_bb.indexOf(BBCode) !== -1 )
          _TEXT.wrapValue( BBCode );
        else{
          switch(BBCode){
            case "SPOILER":
              prmpt = prompt('Enter the TITLE of your Spoiler:', '' );
              prmpt = (prmpt ? prmpt : ' ');
              _TEXT.wrapValue(BBCode, prmpt);
            break;
            case "STRIKE":
              var strikeEm = function(_text){
                var chrs = _text.split(''), r='';
                for(var i=0, iL=chrs.length; i<iL; i++) 
                  r += chrs[i]+'\u0336';
                return String(r)
              };

              text = (!selected ? prompt('Enter Text to strikethrough:', 'coret-di-sini') : selected);

              ret = (text ? strikeEm(text) : "");
              prehead = [0, text.length*2];
              if( !selected )
                _TEXT.setValue( ret, prehead );
              else
                _TEXT.replaceSelected( ret, prehead );

              return endFocus();
            break;
            default:
              // BB Handler:
              //  [URL,IMG, EMAIL,NOPARSE,TRANSPARENT, YOUTUBE,VIMEO,SOUNDCLOUD]
              
              var noPrompts = 'TRANSPARENT,NOPARSE,EMAIL'.split(",");
              var is_mediaembed = function(media, text){
                var rx, rxNaCd;
                text = trimStr ( text );

                switch(media){
                  case "YOUTUBE":
                    rx = text.match(/\byoutube\.com\/(?:watch\?v=)?(?:v\/)?([^&]+)/i);
                    rxNaCd = !/^[\d\w-]+$/.test(text);
                  break;
                  case "SOUNDCLOUD":
                    rx = text.match(/\bsoundcloud\.com\/tracks\/(\d+)/i);
                    rxNaCd = !/^[\d\w]+$/.test(text);
                  break;
                  case "VIMEO":
                    rx = text.match(/\bvimeo\.com\/(\d+)/i);
                    rxNaCd = !/^[\d\w]+$/.test(text);
                  break;
                }

                if( rx && rx[1] )
                  text = rx[1];
                else if( rxNaCd )
                  text = null;
                return text;
              };
              var is_youtube_link = function(text){
                var rx;
                text = trimStr ( text );
                clog( text);
                
                if( rx = text.match(/\byoutube\.com\/(?:watch\?v=)?(?:v\/)?([^&]+)/i) ){
                  text = ( rx ? rx[1] : '');
                }else if( !/^[\d\w-]+$/.test(text) )
                  text = false;

                clog("ytlink? text="+text);
                return text;
              };
              var get_prompt_text = function(BBCode_){
                var ret = {tagprop:'', text:''};

                switch(BBCode){
                  case 'URL':
                    ret.text = prompt('Please enter the URL of your link:', 'http://');
                    ret.tagprop = ret.text;
                  break;
                  case 'IMG':
                    ret.text = prompt('Please enter the URL of your image:', 'http://');
                  break;
                  case 'YOUTUBE':
                    ret.text = prompt('Please enter the Youtube URL or just the ID, \nhttp:/'+'/www.youtube.com/watch?v=########', '');
                  break;
                  case 'VIMEO':
                    ret.text = prompt('Please enter Vimeo URL Link, \nhttps:/'+'/vimeo.com/#######', '');
                  break;
                  case 'SOUNDCLOUD':
                    ret.text = prompt('Please enter [Soundcloud widget code, ID, API-URL]\neg.https:/'+'/api.soundcloud.com/tracks/#######', '');
                  break;
                }
                return ret;
              };
              

              if( !selected ){

                var prompt_text = get_prompt_text(BBCode);
                text = prompt_text.text;
                tagprop = prompt_text.tagprop;

                if( !text && noPrompts.indexOf(BBCode) === -1 ){

                  return endFocus();
                }else{
                  // good-togo
                  if( noPrompts.indexOf(BBCode) !== -1 ){
                    if( BBCode=='TRANSPARENT' ){
                      tagprop = BBCode;
                      BBCode = "COLOR";
                    }
                  }
                  else{
                    if( ['YOUTUBE','SOUNDCLOUD','VIMEO'].indexOf(BBCode) !== -1 ){
                      text = is_mediaembed(BBCode, text);
                      text = (text ? text : null);
                    }else if(BBCode=='URL' || BBCode=='IMG')
                      text = (isLink(text) ? text : null);

                    // prompting text check...
                    if(text==null) return endFocus();
                  }

                  prehead = [('['+BBCode + (tagprop!=''?'='+tagprop:'')+']').length, 0];
                  prehead[1] = (prehead[0]+text.length);
                  _TEXT.setValue( '['+BBCode + (tagprop!=''?'='+tagprop:'')+']'+text+'[/'+BBCode+']', prehead );
                }
                return endFocus();
              } // end selected==''
              else{
                text = selected;

                // precheck of this BBCode upon selection if selected is a proper link
                if( ["URL","IMG"].indexOf(BBCode) !== -1 ){
                  tagprop = (BBCode == 'URL' ? trimStr(text) : '');
                
                  var autotrim_selected = trimStr( selected );

                  if( !isLink(autotrim_selected, true) ){
                    var prompt_text = get_prompt_text(BBCode);
                    text = prompt_text.text;
                    tagprop = prompt_text.tagprop;

                    text = (text ? trimStr(text) : null);
                    if( BBCode == 'IMG' )
                      selected = (text ? text : selected);
                  }
                  if(text==null) return endFocus();

                  prehead = [('['+ BBCode + (tagprop!=''?'='+tagprop:'')+']').length, 0];
                  prehead[1] = (prehead[0]+selected.length);
                  _TEXT.replaceSelected(
                    '['+BBCode + (tagprop!=''?'='+tagprop:'')+']'+selected+'[/'+BBCode+']',
                    prehead
                  );
                  return endFocus();
                }
                else{
                  if( BBCode == 'TRANSPARENT' ){
                    tagprop = BBCode;
                    BBCode = "COLOR";
                  }

                  _TEXT.wrapValue( BBCode, (tagprop!='' ? tagprop:'') );
                }
              }
            break;
          }
        }
      },


      // deprecated....
      tagCustom_OLD: function(tag){
        _TEXT.init();
        
        var text, prehead, tagprop, ptitle, selected, ret;
        var pTag={
           'quote':'QUOTE','code' :'CODE','html' :'HTML','php' :'PHP'
          ,'link' :'URL',  'picture':'IMG'
          ,'spoiler' :'SPOILER','transparent':'COLOR','noparse' :'NOPARSE', 'youtube' :'YOUTUBE'
          ,'strike' :''
        };  
        var endFocus = function(){ _TEXT.focus(); return};
        if( isUndefined(pTag[tag]) ) return endFocus();
        selected = _TEXT.getSelectedText();
        tagprop = '';
        
        if(tag=='quote' || tag=='code' || tag=='html' || tag=='php'){
          _TEXT.wrapValue( tag );

        }else if(tag=='spoiler'){

          var title = prompt('Please enter the TITLE of your Spoiler:', '' );
          if(title==null) return endFocus();
          title = (title ? title : ' ');
          _TEXT.wrapValue( 'spoiler', title );  
          
        }else if(tag=='strike'){
          
          var strikeEm = function(t){
            var pr = t.split(''), r='';
            for(var i=0;i<pr.length;i++) r+=pr[i]+'\u0336';
            return String(r)
          };
          text = (selected!= '' ? selected :
            prompt('Please enter Text to strikethrough:', 'strikethrough') 
          );    
          if(text==null) return endFocus();
          ret = strikeEm(text);
          prehead = [0,(text.length*2)];
          if(selected=='')
            _TEXT.setValue( ret, prehead );
          else
            _TEXT.replaceSelected( ret, prehead );
        
          return endFocus();
        }else{

          var is_youtube_link = function(text){
            text = trimStr( text );
            var rx;
            if( rx = text.match(/\byoutube\.com\/(?:watch\?v=)?(?:v\/)?([^&]+)/i) ){
              text = ( rx ? rx[1] : '');
            }else if( !/^[\d\w-]+$/.test(text) )
              text = false;
            return text;
          };
          
          if(selected==''){
            switch(tag){
            case 'transparent':
              tagprop = tag;
              text = prompt('Please enter the Text to be transparent:', 'text hantu');
            break;
            case 'noparse':
              text = prompt('Please enter Text or/with Tags to be no parsed:', '[code]-CODE-[/code]');
            break;
            case 'link':
              text = prompt('Please enter the URL of your link:', 'http://');
              tagprop = text;
            break;
            case 'picture':
              text = prompt('Please enter the URL of your image:', 'http://');
            break;
            case 'youtube':
              text = prompt('Please enter the Youtube URL or just the ID, \nhttp:/'+'/www.youtube.com/watch?v=########', '');
            break;
            }
            if(text==null) return endFocus();
            if(tag=='youtube')
              text = is_youtube_link(text);
            if(tag=='link' || tag=='picture')
              text = (isLink(text) ? text : null);
            if( !text ){
              return endFocus();
            }else{
              prehead = [('['+pTag[tag] + (tagprop!=''?'='+tagprop:'')+']').length, 0];
              prehead[1] = (prehead[0]+text.length);
              _TEXT.setValue( '['+pTag[tag] + (tagprop!=''?'='+tagprop:'')+']'+text+'[/'+pTag[tag]+']', prehead );
            }
            return endFocus();
          } // end selected==''
          
          tagprop = (tag=='transparent' ? 'transparent' : '');
          if(tag=='link'||tag=='image'||tag=='youtube'){
          
            ptitle=(tag=='youtube' ? ['Please enter the Youtube URL or just the ID, \nhttp:/'+'/www.youtube.com/watch?v=########',''] : ['Please enter the URL of your '+tag+':','http://']);
            text = prompt( ptitle[0], ptitle[1] );
            if(text==null) return endFocus();
          
            switch(tag){
              case 'link':
                tagprop = text;
                text = selected;
              break;
              case 'youtube':
                text = is_youtube_link(text);
                if(!text) return endFocus();
              break;
            }
            prehead = [('['+ pTag[tag] + (tagprop!=''?'='+tagprop:'')+']').length, 0];
            prehead[1] = (prehead[0]+text.length);
            _TEXT.replaceSelected( '['+pTag[tag] + (tagprop!=''?'='+tagprop:'')+']'+text+'[/'+pTag[tag]+']', prehead );
            return endFocus();
          }
          _TEXT.wrapValue( pTag[tag], (tagprop!='' ? tagprop:'') );
        }
      }
    },
    init: function() {
      this.e = $D('#'+gvar.tID);
      this.content = this.e.value;
      this.cursorPos = this.rearmPos(); // [start, end]
    },
    rearmPos: function(){
      return this.getCaretPos();
    },
    subStr: function(start, end){ return this.content.substring(start, end);},
    set_title: function(text){
      var tgt = $D('//div[@id="wrp_title"]/input[@name="title"]',null,1);
      tgt && (tgt.value = text);
    },
    set_reason: function(text){
      var tgt = $D('//div[@id="wrp_reason"]/input[@name="reason"]',null,1);
      if( tgt ){
        tgt.value = text;
        showhide(tgt.parentNode, 1, 'block');
      }
    },
    set: function(value){
      this.content = value;
      // track latest scrollTop, doing val() might reset it to 0
      this.last_scrollTop = Dom.g(gvar.tID).scrollTop;
      $D('#'+gvar.tID).value = this.content;
      this.init();

      this.pracheck();
    },
    wrapValue : function(tag, title){
      var bufValue, st2, start = this.cursorPos[0], end = this.cursorPos[1];

      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);

      clog('s,e=' + start + ','+end);
      clog(st2 + ';' + (st2+this.subStr(start, end).length));

      this.caretChk( st2, (st2+this.subStr(start, end).length) );
      return bufValue; 
    },
    add: function(text){ // used on fetch post only
      var newline = '\n\n';
      if( $D('#'+gvar.tID).value != "" )
        this.content+= newline;
      $D('#'+gvar.tID).value = ( this.content + text );
      this.pracheck(false);
      
      window.setTimeout(function(){
        _TEXT.lastfocus();
      }, 200);
    },
    // ptpos stand to puretext position [start, end]
    setValue : function(text, ptpos){
      var bufValue, start = this.cursorPos[0], end=this.cursorPos[1];
      if(isUndefined(ptpos)) ptpos=[text.length,text.length];
      if(start!=end) {
        this.replaceSelected(text,ptpos);
        return;
      }
      bufValue = this.subStr(0, start) + text + this.subStr(start, this.content.length);
      this.set( bufValue );
      this.caretChk( (start+ptpos[0]), (start+ptpos[1]) );
      return bufValue; 
    },
    replaceSelected : function(text, ptpos){
      var bufValue, start=this.cursorPos[0], end=this.cursorPos[1];
      if(start==end) return;    
      bufValue = this.subStr(0, start) + text + this.subStr(end, this.content.length);
      this.set(bufValue);
      this.caretChk( (start+ptpos[0]), (start+ptpos[1]) );
    },
    pracheck: function(foc){
      if( isUndefined(foc) )
        foc = true;

      _TEXT.setElastic(gvar.maxH_editor);
      el = $D('.QxM',null,1);
      if( $D('#'+gvar.tID).value !="" )
        showhide(el, true);
      else
        showhide(el, false);

      foc && _TEXT.focus();
    },
    focus: function(){ 
      window.setTimeout(function(){ $D('#'+gvar.tID).focus() }, 10);
    },
    clear: function(dofocus){
      _TEXT.set('');
      dofocus && _TEXT.focus();
    },
    lastsroll: function (){
      // scroll to bottom editor line
      !_TEXT.e && (_TEXT.e = $D('#'+gvar.tID));
      try{
        _TEXT.e &&_TEXT.e.scrollTop(_TEXT.e.scrollHeight);
      } catch(e){}
    },
    lastfocus: function (){
      var eText, nl, pos, txt = String($D('#'+gvar.tID).value); // use the actual content
      pos = txt.length;
      nl = (txt.split('\n')).length;
      pos+= (nl * 2);
      eText = Dom.g(gvar.tID);
      try{
        if( eText.setSelectionRange ) {
          _TEXT.focus();
          eText.setSelectionRange(pos,pos);
        }
      }catch(e){}

      _TEXT.oflow && (_TEXT.oflow == 'auto') &&
        window.setTimeout(function(){ _TEXT.focus(); _TEXT.lastsroll() } , 310);
    },
    getSelectedText : function() {
      return (this.cursorPos[0]==this.cursorPos[1]? '': this.subStr(this.cursorPos[0], this.cursorPos[1]) );
    },
    getCaretPos : function() {  
      var ret=[0,0], el = Dom.g(gvar.tID);
      if(el && ('selectionStart' in el) && ('selectionEnd' in el) ){
        if(el.value.length > 0)
          ret = [el.selectionStart, el.selectionEnd];
      }
      return ret;
    },
    setCaretPos : function (pos,end){
      if(isUndefined(end)) end = pos;
      if(Dom.g(gvar.tID).setSelectionRange)    { // Firefox, Opera and Safari
        this.focus();
        Dom.g(gvar.tID).setSelectionRange(pos,end);
      }
    },
    setElastic: function(max,winrez){
      var a, tid=gvar.tID;

      function setCols_Elastic(el, max){
        el && el.setAttribute("cols", Math.floor(el.clientWidth/7));
        _TEXT.setRows_Elastic(max)
      }
      a = Dom.g(tid);
      _TEXT.oflow='hidden';
      a.setAttribute('style', 'visibility:hidden; overflow:'+_TEXT.oflow+';letter-spacing:0;line-height:14pt;'
        +(max?'max-height:'+(max-130)+'pt;':'')
      );

      gvar.wtrackY={};
      if( !winrez ){
        // doesnt work w/ opera?
        Dom.Ev(a, 'paste', function(e){
          var el = e.target||e;
          gvar.wtrackY['before'] = window.scrollY
          gvar.wtrackY['editor_overflow'] = (_TEXT.oflow != 'hidden');

          window.setTimeout(function(){
            setCols_Elastic(el, max);

            gvar.wtrackY['after'] = window.scrollY;
            if(gvar.wtrackY['after'] != gvar.wtrackY['before']){
              window.scrollTo(0, gvar.wtrackY['before']);

              if(!gvar.wtrackY['editor_overflow']){
                _TEXT.init();
                window.setTimeout(function(){ _TEXT.lastfocus() }, 222);
              }
            }
          }, 10);
          return true;
        }, false);

        Dom.Ev(a, 'keyup', function(e){ setCols_Elastic((e.target||e), max) });
      }
      setCols_Elastic(a, max); //110
    },
    setRows_Elastic: function(max){
      var a = Dom.g(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');
      a.style.setProperty('visibility', 'visible');
    }, /*134*/
    caretChk: function(s,e){
      s && e && _TEXT.setCaretPos(s, e);
      // restore scrollTop on overflow mode:scroll
      if(_TEXT.last_scrollTop && _TEXT.overflow!='hidden'){
        Dom.g(gvar.tID).scrollTop = (_TEXT.last_scrollTop+1);
      }
    }
  };
  // _TOGGLER.capcay [clear_editor,auth_noneed_cpcy,whattheheck,response_field,capcay]
  var _TOGGLER = {
    clear_editor: function(flag){
      if("undefined" == typeof flag)
        flag = true;

      showhide($D('.QxM',null,1), flag);
    },
    auth_noneed_cpcy: function(flag){
      var el, chkauth = $D('#chk-auth');
      if("undefined" == typeof flag)
        flag = isChecked(chkauth);

      el = $D('#recaptcha_response_field');
      chkauth.checked = flag;
      if( flag ){
        el.value = (function(c){
          var ret = '';
          for(var i=0; i<27; ++i)
            ret+=c;
          return ret;
        })('#');
        //setAttr('disabled', 'disabled', el);
        setAttr('readonly', 'readonly', el);
        _TOGGLER.gnotice(false, '', $D('.g_notice', $D('#wrp_cpcy'), 1));
      }
      else{
        el.value = '';
        //el.removeAttribute('disabled');
        el.removeAttribute('readonly');
        el.focus();
      }
      showhide($D('#recaptcha_image'), !flag);
      showhide($D('#recaptcha_instructions_image'), !flag);
      return flag;
    },
    whattheheck: function(){
      showhide($D('.recaptcha-auth',null,1));
      $D('#recaptcha_response_field').focus();
    },
    response_field: function(isGood, dofocus){
      var thr, rrf = $D('#recaptcha_response_field'), p = (rrf ? rrf.parentNode : null);
      thr = $D('.btn-thr',null,1);
      if( isGood ){
        thr && addClass('bling', thr);
        p && removeClass('error', p);
        _TOGGLER.gnotice(false, '', $D('.g_notice', $D('#wrp_cpcy'), 1));
      }
      else{
        thr && removeClass('bling', thr);
        p && addClass('error', p);
        $D('#hidrecap_reload_btn').click();
      }
      showhide($D('.stts',null,1), isGood);
      
      dofocus &&
        window.setTimeout(function(){ rrf && rrf.focus() }, 123);
    },
    gnotice: function(flag, text, el){
      if("undefined" == typeof el)
        el = $D('.g_notice',null,1);
      text && (el.innerHTML = entity_encode(text));
      showhide(el, flag, (flag ? 'block' : ''));
    },
    isolate_editor: function(flag){
      var el, iel, tgt, par = $D('.form-input',null,1);
      if(flag){
        if( tgt = $D('.liner', par) )
        for(var i=0; i<tgt.length; ++i){
          el = createEl('div', {'class':'layerin'});
          prepend(tgt[i], el);
          addClass('layered', tgt[i]);
        }
      }
      else{
          while( tgt = $D('.layerin', par, 1) ){
            removeClass('layered', tgt.parentNode);
            Dom.remove(tgt);
          }
      }
    },
    baloon_set: function(text, iserror){
      var tgt = $D('.box-cnt', $D('#wrp_act'), 1);
      tgt && (tgt.innerHTML = text);
      if( !iserror )
        addClass('sip', tgt);
      else
        addClass('ups', tgt);
    },
    baloon_save: function(flag){
      var tgt = $D('#wrp_act');
      if("undefined" == typeof flag)
        flag = !isVisible(tgt);

      showhide(tgt, flag);
      _TOGGLER.isolate_editor( flag );
      removeClass('sip ups', tgt);
      if( !flag ){
        if(gvar.reqPID && "undefined" != typeof gvar.reqPID['_editpost_'])
          delete gvar.reqPID['_editpost_'];
      }
    },
    showhide_capcay: function(flag){
      var el, par, tgt = $D('#wrp_cpcy');
      if("undefined" == typeof flag)
        flag = !isVisible(tgt);

      showhide(tgt, flag);
      removeClass('bling', $D('.btn-thr',null,1));
      _TOGGLER.isolate_editor( isVisible($D('#wrp_cpcy')) );

      if( !gvar.user.isDonatur ){
        if( !isVisible(tgt) ){
          // baloon-closed
          if( !isChecked($D('#chk-auth')) ){
            el = $D('#sbutton');
            removeClass('blue', el);
            addClass('btn-red', el);
          }
          //_TOGGLER.response_field(true);
          _TOGGLER.gnotice(false, '', $D('.g_notice', $D('#wrp_cpcy'), 1));

          _TEXT.lastfocus();
        }
        else{
          // baloon-opened.
        }
      } // isdonat
    }
  };

  //=== rSRC
  var rSRC = {
    mCls: ['mBT','mDM','<li class="mSP">---------------</li>'],
    getTPL: function(){
      return ''
      +'<div class="form-input reply-input">'
      +'<div class="legend qrtitle">'
      + '<span>mQuick <em id="qrtitle_mode">Reply</em> <a target="_blank" href="https://greasyfork.org/scripts/'+gvar.scriptMeta.scriptID_GF.toString()+(gvar.scriptMeta.slug_GF ? '-'+gvar.scriptMeta.slug_GF:'')+'?ref=m-kaskus" class="mqrlink">'+gvar.sversion+'</a></span>'
      +'</div>'
      +'<form action="" name="postreply" id="mqrform" method="post">'
      +'<fieldset>'
      +'<div class="in-txt liner" id="wrp_title" '+(gvar.settings.toggle_menus ? '' : 'style="display:none;"')+'>'
      + '<input type="text" name="title" maxlength="85" placeholder="Title" />'
      + '<span class="Qxc tgctr" style="display:none;" title="Clear Title">&times;</span>'
      +'</div>'
      +'<div class="in-txt liner" id="wrp_control">'
      + rSRC.getControlers()
      +'</div>'

      +'<div class="in-txt liner" id="wrp_msg">'
      + '<textarea name="message" id="'+gvar.tID+'" placeholder="Body"></textarea>'
      + '<span class="QxM tgctr" style="display:none;" title="Clear Editor">&times;</span>'
      + '<div class="chr">'
      + '<span class="stts btn bling" style="display:none;"><i class="throb"></i> submitting..</span>'
      + '<input readonly="readonly" disabled="disabled" size="3" value="10000" id="txtLen" />'
      + '</div>'
      +'</div>'
      +'<div class="in-txt liner" id="wrp_reason">'
      + '<input type="text" name="reason" placeholder="Reason" title="Reason" />'
      +'</div>'

      +'<div class="in_balonbox" id="wrp_cpcy" style="display:none;">'
      + rSRC.getBtBaloon()

      + '<label class="cpcy-title">Verification</label>'
      + '<span class="tgctr btn btn-thr"><i class="throb"></i> </span>'
      + '<span class="Qcp tgctr" title="Close">&times;</span>'
      + '<div class="mqr-cpcy">' + rSRC.getCUSTOM_ReCapcay() + '</div>'
      +'</div>' // in_cpcy_boxed

      +'<div class="in_balonbox" id="wrp_act" style="display:none;">'
      + rSRC.getBtBaloon()
      + '<label class="box-title">Saving</label>'
      + '<span class="Qsv tgctr" title="Close">&times;</span>'
      + '<div class="box-cnt"><i class="throb-bl"></i>Loading...</div>'
      +'</div>'

      +'<div class="r">'
        // fake capcay.controller [create,reload]
      + '<input id="hidrecap_btn" value="reCAPTCHA" type="button" onclick="showRecaptcha();" class="ninja" />' 
      + '<input id="hidrecap_reload_btn" value="reload_reCAPTCHA" type="button" onclick="Recaptcha.reload();" class="ninja" />'
      + '<input type="hidden" name="psecuritytoken" id="mqr_securitytoken" value="" />'
      + '<input type="hidden" name="preview" value="Preview post" />'

      + '<div class="in-btn action">' // [btn-red,blue]
      +  '<input type="submit" id="sbutton" class="btn '+(gvar.user.isDonatur ? 'blue' : 'btn-red')+'" value="Post Reply" name="sbutton" />'
      +  '<input type="button" id="cbutton" class="btn btn-grey" value="Cancel" />'
      +  '<div class="sayapkanan liner">'
      +   '<input id="chk_fixups" type="checkbox" '+(gvar.settings.widethread ? 'checked="checked"':'')+' />'
      +   '<label title="Wider Thread" for="chk_fixups">Expand</label>'
      +  '</div>'
      + '</div>'
      +'</div>' // r
      +'</fieldset>'
      +'</form>'
      +'</div>' // form-input
      ;
    },
    getBtBaloon: function(){
      return ''
        + '<div class="center" style="position:absolute; bottom:0; left:46%; margin-bottom:-20px; font-size:20px; color:#ddd;">&#9660;</div>'
      ;
    },
    getCUSTOM_ReCapcay: function(){
      return ''
      +'<div class="g_notice qrerror"></div>'
      +'<div id="recaptcha_image" style="width:300px; height: 57px;min-height:57px; display:block;"><img style="height:57px; width:300px;"/></div>'
      +'<div class="recaptcha-main">'
      +'<label for="recaptcha_response_field" style="width:100%!important; float:none!important;">'
      + '<span class="recaptcha_only_if_image" id="recaptcha_instructions_image"><strong>Please Insert Capcay</strong></span>'
      
      + '<span id="recaptcha_challenge_field_holder" style="display: none;"></span>'
      + '<div class="in-txt">'
      +  '<input id="recaptcha_response_field" name="recaptcha_response_field" autocomplete="off" type="text" />'

      +  '<div class="recaptcha-buttons">'
      +   '<a title="Get a new challenge" href="javascript:Recaptcha.reload()" id="recaptcha_reload_btn"><span>Reload reCapcay</span></a>'
      +   '<a title="Help" href="javascript:Recaptcha.showhelp()" id="recaptcha_whatsthis_btn"><span>Help</span></a>'
      //+   '<a title="What the heck.." href="javascript:" id="recaptcha_stg"><span>Wth</span></a>'
      +  '</div>' // recaptcha-buttons
      + '</div>'
      +'</label>'
      +'<div class="recaptcha-auth" style="display:none;">'
      + '<input type="checkbox" id="chk-auth" value="1" />'
      + '<label for="chk-auth">I dont need captcha to post. (Donatur)</label>'
      +'</div>'
      +'</div>' //recaptcha-main
      +'';
    },

    menuFont: function(id){
      var li_cls = rSRC.mCls, buff, lf;
      // item = ['Arial','Arial Black','Arial Narrow','Book Antiqua','Century Gothic','Comic Sans MS','Courier New','Georgia','Impact','Lucida Console','Times New Roman','Trebucher','Verdana']
      item = ['Arial','Georgia','Arial Black','Impact','Arial Narrow','Lucida Console','Book Antiqua','Times New Roman','Century Gothic','Trebuchet MS','Comic Sans MS','Verdana','Courier New'];
      lf = item.length;

      buff='<li class="'+li_cls[0]+' '+li_cls[0] + id + ' fonts '+li_cls[1]+'"><a title="Fonts" href="javascript:;">F</a><ul>';
      for(var i=0; i<lf; i++)
        buff+= ''
          +'<li class="'+li_cls[0]+' '+li_cls[0] +id+ ' font-'+item[i].toLowerCase().replace(/\s/gi,'')+'">'
          +'<a title="'+item[i]+'" class="ev_font" href="javascript:;">'+item[i]+'</a></li>'
        ;
      buff+='</ul></li>';
      return buff;
    },
    menuSize: function(id){
      var li_cls = rSRC.mCls, buff;
      buff='<li class="'+li_cls[0]+' '+li_cls[0] + id + ' size '+li_cls[1]+'"><a title="Size" href="javascript:;">Size</a><ul>';
      for(var i=1; i<=7; i++)
        buff+='<li class="'+li_cls[0]+' '+li_cls[0] + id + '-1 size-'+i+'"><a title="'+i+'" class="ev_size" href="javascript:;">'+i+'</a></li>';
      buff+='</ul></li>';
      return buff;
    },
    menuColor: function(id){
      var li_cls = rSRC.mCls, buff, capt, kolors = rSRC.getSetOf('color');
      buff='<li class="'+li_cls[0] + ' ' + li_cls[0] + id + ' color ' + li_cls[1]+'"><a title="Colors" href="javascript:;">Colors</a>';
      buff+='<ul class="mBT'+id+'-wrapper">';
      for(hex in kolors){
        capt = kolors[hex];
        buff+='<li class="'+li_cls[0] +'"><a title="'+capt+'" class="ev_color"  style="width:0; background-color:'+hex+'" href="javascript:;">'+capt+'</a></li>';
      }
      buff+='</ul></li>';
      return buff;
    },
    menuGen: function(mnuData){
      var mCls = rSRC.mCls;
      var mnu, addcls, buff = '', cls_sp = "markItUpSeparator";
      for(var i=0, iL=mnuData.length; i<iL; i++){
        mnu = mnuData[i];
        if( mnu["id"] ){
          if( "function" == typeof mnu["cb"] )
            buff += mnu["cb"]( mnu["id"] );
          else
            buff += ''
              +'<li class="'+mCls[0]+' '+mCls[0]+mnu["id"]+'">'
              +'<a href="javascript:;" title="'+mnu["title"]+'" class="'+mnu["class"]+'"'
                +(mnu["bb"] ? ' data-bb="'+mnu["bb"]+'"' : '')
                +(mnu["shortcut"] && mnu["shortcut"]["key"] && mnu["shortcut"]["csa"] ? ''
                  +' data-shortcut=\'{"key":"'+mnu["shortcut"]["key"]+'","csa":"'+mnu["shortcut"]["csa"]+'"}\''
                 : '' // no-shortcut
                )
              +'></a>'
              +'</li>'
            ;
        }
        else{
          addcls = (mnu["class"] ? mnu["class"] : "");
          if( addcls )
            buff += mCls[2].replace(cls_sp, cls_sp+" "+addcls);
          else
            buff += mCls[2];
        }
      }
      return buff;
    },

    _menuTitleToggler: function(){
      return ''
        +'<li>'
        + '<span class="Qct tgctr btn_stg'+(gvar.settings.toggle_menus ? ' active':'')+'" title="Toggle Title Message"></span>'
        +'</li>'
      ;
    },

    getControlers: function(){
      var _sp = rSRC.mCls[2], lc=rSRC.mCls[0], BTN = rSRC.getSetOf('button');
      return ''
      + '<div class="mktH">' 
      + "<ul>"
      + rSRC._menuTitleToggler()

      + rSRC.menuGen([
        {id:null}, // spacer
        {id:1, 'class': 'ev_biu', bb: 'B', title: 'Bold [Ctrl+B]', shortcut: {key: 'B', csa: 'ctrl'}},
        {id:2, 'class': 'ev_biu', bb: 'I', title: 'Italic [Ctrl+I]', shortcut: {key: 'I', csa: 'ctrl'}},
        {id:3, 'class': 'ev_biu', bb: 'U', title: 'Underline [Ctrl+U]', shortcut: {key: 'U', csa: 'ctrl'}},
        {id:null}, // spacer
        {id:4, 'class': 'ev_align', bb: 'LEFT', title: 'Align Left'},
        {id:5, 'class': 'ev_align', bb: 'CENTER', title: 'Align Center [Ctrl+E]', shortcut: {key: 'E', csa: 'ctrl'}},
        {id:6, 'class': 'ev_align', bb: 'RIGHT', title: 'Align Right [Ctrl+R]', shortcut: {key: 'R', csa: 'ctrl'}},
        {id:null}, // spacer
        {id:7, 'class': 'ev_list', bb: 'LIST-bullet', title: 'Bulleted list'},
        {id:8, 'class': 'ev_list', bb: 'LIST-numeric', title: 'Numeric list'},
        // {id:9, 'class': 'ev_indent', bb: 'INDENT', title: 'Increase Indent'},
        {id:null}, // spacer
        {id:11, 'class': 'ev_custom', bb: 'URL', title: 'Insert Link'},
        // {id:13, 'class': 'ev_custom', bb: 'EMAIL', title: 'Insert Email Link'},
        {id:14, 'class': 'ev_custom', bb: 'IMG', title: 'Picture'},
        {id:null}, // spacer
        {id:15, 'class': 'ev_custom', bb: 'QUOTE', title: 'Wrap [QUOTE] around text'},
        {id:16, 'class': 'ev_custom', bb: 'CODE', title: 'Wrap [CODE] around text'},
        {id:50, 'class': 'ev_custom', bb: 'HTML', title: 'Wrap [HTML] around text'},
        {id:51, 'class': 'ev_custom', bb: 'PHP', title: 'Wrap [PHP] around text'},
        {id:null}, // spacer
        {id:95, 'class': 'ev_color', cb: rSRC.menuColor},
        {id:19, 'class': 'ev_font', cb: rSRC.menuFont},
        {id:20, 'class': 'ev_size', cb: rSRC.menuSize},
        {id:null}, // spacer
        {id:21, 'class': 'ev_custom', bb: 'SPOILER', title: 'Wrap [SPOILER] around text'},
        {id:97, 'class': 'ev_custom', bb: 'TRANSPARENT', title: 'Wrap [TRANSPARENT] around text'},
        {id:52, 'class': 'ev_custom', bb: 'NOPARSE', title: 'Wrap [NOPARSE] around text'},
        {id:53, 'class': 'ev_custom', bb: 'STRIKE', title: 'Strikethrough text'},
        {id:null}, // spacer
        {id:22, 'class': 'ev_custom', bb:'YOUTUBE', title: 'Embedding video from Youtube'},
        {id:23, 'class': 'ev_custom', bb:'VIMEO', title: 'Embedding video from Vimeo'},
        {id:24, 'class': 'ev_custom', bb:'SOUNDCLOUD', title: 'Embedding audio from Soundcloud'}
        ])


      + '<li class="'+lc+ ' qplugin-togler"><span class="btn_qplugin'+(gvar.settings.widethread || gvar.settings.toggle_plugins ? ' active' : '')+'" title="Toggle Plugin Menus"></span></li>'
      + '</ul>'
      + '<div id="qr_plugins_container" class="qplugin" style="'+(gvar.settings.widethread || gvar.settings.toggle_plugins ? '':'display:none;')+'"></div>'
      + "</div>" // mktH
      ;
    },

    getCSS: function(){
      var imgcdn1,imgcdn2,imgcdn3, BTN;
      imgcdn1 = gvar.kkcdn + 'images/editor/';
      imgcdn2 = gvar.kkcdn + 'img/editor/';
      imgcdn3 = gvar.kkcdn + 'themes_2.0/img/editor/';
      BTN = rSRC.getSetOf('button');

      return ''
      +'.btn.qq{margin-left:5px;}'
      +'.btn.qf{margin-right:-1px;}'
      +'.btn .throb, .c-avt .throb{display:none;background:url('+BTN.throb_fetch+') no-repeat;width:10px;height:8px;margin-right:2px;}'
      +'.c-avt .throb{margin-top:10px;}'
      +'.bling{color:#999;}'
      +'.bling .throb{display:inline-block;}'
      +'.btn.btn-thr{width:10px!important;height:10px!important; cursor:default!important;float:right;margin-right:15px;border:0;background:transparent;}'
      +'#site-header {transition: box-shadow .2s ease-in-out;}'
      +'#site-header .main-h .u a{position:relative}'
      +'#site-header .main-h .u a img{position:absolute;left: 0;margin-left: -20px}'
      +'#wrapper.fx, .mQR fieldset, .mQR #wrp_title, .mQR #wrp_msg, .mqr-cpcy .in-txt{position:relative;}'
      +'#wrapper.fx .main-h{width:620px;position:fixed;top:0;z-index:99999;}'
      +'#wrapper.fx #main{margin-top:30px}'

      +'#wrapper.fx #site-header .main-h {height:22px; box-shadow: 0 0 7px #aaa;opacity:.9;background: #ebebeb;}'
      +'#wrapper.fx #site-header .main-h:hover {opacity: 1;}'
      +'#wrapper.fx #site-header .main-h a{line-height:22px; height:22px;}'
      +'#wrapper.fx #site-header .main-h a img{margin: 2px 0 2px 4px;height: 18px!important;width: 18px!important;}'
      +'#wrapper.fx #site-header .c-avt {height:18px;}'
      +'#wrapper.fx #site-header .c-avt img{height: 98%;}'
      +'#wrapper.fx #site-header .c-avt, #wrapper.fx #site-header .c-avt .throb {margin-top:2px;}'

      +'#site-header #donatflag{color:#F00000!important;margin-left:2px;}'
      +'.c-avt{padding:0; margin:0; margin-top:7px; cursor:pointer;float:right;}'
      +'.c-avt img{max-width:25px;}'
      +'.c-avt.bling img{display:none;}'
      +'.hide{display:none!important;}'

      +'.mQR .throb-bl{background:url('+BTN.throbber_gif+') no-repeat;display:inline-block;width:16px; height:16px;margin-right:5px;}'
      +'.mQR .legend, .mQR .form-input{margin-bottom:0;border-bottom:0;}'
      +'.mQR .qrtitle{text-shadow:1px 1px #666;background:#1f94e1;color:#fff;font-size:1.05em;}'
      +'.mQR .qrtitle.editmode{background:#1484CE;border-top:solid 1px #2b9eea;}'
      +'.mQR .qrtitle a{color:#fff;}'
      +'.mQR .qrtitle a:hover{text-decoration:underline;}'
      +'.mQR .qrtitle em{font-style:normal!important;}'
      +'.mQR .form-input{padding-bottom:0; border-bottom:0;}'
      +'.mQR .form-input .action.in-btn{border:0!important; background:none;text-align:center;position:relative;}'
      +'.mQR .in-btn.action .btn{width:130px; float:none!important;display:inline;clear:none; margin:0 auto;text-transform:uppercase;text-shadow:0 1px rgba(0,0,0,0.1);}'
      +'.mQR .in-btn.action .btn-grey{margin-left:4px; color:#333;border:1px solid #c6c6c6;background-color:#f8f8f8;background-image:linear-gradient(top,#f8f8f8,#f1f1f1);}'
      +'.mQR .in-btn.action .btn-red{border:1px solid transparent!important;text-transform:uppercase;color:#fff; background-color:#d14836; background-image:linear-gradient(top,#dd4b39,#d14836);}'
      // 
      +'.mQR .layerin{position:absolute;width:100%;height:100%; background:#ddd;opacity:.25;z-index:99; margin:-5px;}'
      +'.mQR .in-txt{padding:4px 5px;margin-top:-1px;border-radius:0;}'
      +'.mQR .in-txt .chr{margin: 2px -5px -4px;}'
      +'.mQR .in-txt.layered{position:relative;}'
      +'.mQR .in-txt #'+gvar.tID+'{height:90px; min-height:50px; min-width:590px; max-width:590px; font-size:14px;}'
      +'.mQR .chr{min-height:16px;}'
      +'.mQR .stts{float:left;border:0;padding:0;margin-top:-1px; background:none;}'
      +'.mQR #txtLen{float:right;max-width:65px;display:block;}'
      +'.mQR #txtLen.ffc{color:#666!important;}'
      +'.mQR #wrp_control {padding-bottom:1px;}'
      +'.mQR li.mBT a{outline:none; border:1px solid transparent}'
      +'.mQR li.mBT {border:1px solid transparent;}'
      +'.mQR li.mBT:hover {background-color:#f0f0f0;}'
      +'.mQR li.mBT:hover > a{border:1px solid #ddd;}'
      +'.mQR #wrp_title input[type="text"]{width:94%;}'
      +'.mQR .in-txt input[type="text"], .mQR .in-txt #'+gvar.tID+'{color:#333;}'
      +'.mQR .tgctr{position:absolute;top:2px; right:3px;padding:5px 3px; font-size:1.2em; line-height:0.7em; cursor:pointer;}'
      +'.mQR .tgctr:hover{color:#333;}'
      +'.mQR .tgctr.Qct {background:url('+BTN.contr_stg+') no-repeat;opacity:.25;width:12px;height:12px;}'
      +'.mQR .tgctr.Qct:hover, .mQR .Qct.active{opacity:.8;}'
      +'.mQR .tgctr.Qxc, .mQR .tgctr.QxM{color:#999;right:20px;border:0;font-weight:bold;font-size:18px;padding:5px;}'
      +'.mQR .tgctr.Qcp{border:0;}'
      +'.mQR .in_balonbox .tgctr{top:4px; right:10px; font-size:2em;}'
      +'.mQR .ninja{position:absolute!important;z-index:99; left:-999999; visibility:hidden;}'
      +'.mQR .error{border-color:#FF0A0A;}'
      +'.mQR .g_notice {display:none;font-size:11px;background:#DFC;border:1px solid #FFA8BF;line-height:16px;min-height:16px;padding:.4em 0;cursor:default;}'
      +'.mQR .recaptcha-main{color:#666;}'
      +'.mQR .qrerror{background:#ffd7ff!important;}'
      +'.mQR #cbutton, .mQR #wrp_reason{display:none;}'
      

      +'.in_balonbox {width:310px;position:absolute; z-index:999; bottom:70px; background:#e3e3e3;-moz-border-radius:10px;-webkit-border-radius:10px; border-radius:2px;border:1px solid #ccc;margin:20px -20px 0; padding:10px; padding-bottom:5px; padding-top: 2px;}'
      +'.in_balonbox .cpcy-title{font-size:1.2em; font-weight:bold; color:#666; margin:4px 0; display:block;}'
      +'.in_balonbox .recaptcha_only_if_image, .in_balonbox .cpcy-title, .in_balonbox .g_notice{padding-left:.4em;}'
      +'.in_balonbox .g_notice{color:#333;}'
      +'.in_balonbox .g_notice.qrerror{color:red;}'
      +'.mqr-cpcy, .box-cnt {width:310px;min-height:25px;background:#fff;border:1px solid #e5e5e5;}'
      +'.box-cnt {padding:8px 0; text-align:center; line-height:1.1em; font-size:1.2em;}'
      +'.box-cnt.sip {background:#DFC;border:1px solid #47FF0A;}'
      +'.box-cnt.ups {background:#ffd7ff;border-color:#FF0A0A;}'
      +'.mqr-cpcy #recaptcha_image {margin-top:5px;text-align:center;}'
      +'.mqr-cpcy #recaptcha_stg {background:url('+BTN.goog_stg+') no-repeat;}'
      +'.mqr-cpcy #recaptcha_reload_btn {background:url(http://ssl.gstatic.com/accounts/recaptcha-sprite.png) -63px;}'
      +'.mqr-cpcy #recaptcha_whatsthis_btn {background:url(http://ssl.gstatic.com/accounts/recaptcha-sprite.png);}'
      +'.mqr-cpcy .in-txt {margin-top:2px;}'
      +'.mqr-cpcy .in-txt input[type="text"]{padding-right:75px!important; max-width:222px;}'
      +'.mqr-cpcy .recaptcha-buttons {position:absolute;bottom:4px;right:10px;}'
      +'.mqr-cpcy .recaptcha-buttons span{text-indent:-9999px;display:block;}'
      +'.mqr-cpcy .recaptcha-buttons a {display:inline-block; height:21px;width:21px;margin-left:2px;background:#fff;background-position:center center;background-repeat:no-repeat; line-height:0; opacity:.55;outline:none;}'
      +'.mqr-cpcy .recaptcha-buttons a:hover {opacity:.8;}'
      +'.mqr-cpcy .recaptcha-auth {margin-top:4px; padding:5px 0;}'
      +'.mqr-cpcy .recaptcha-auth input[type="checkbox"] + label{display:inline-block;vertical-align:middle;height:14px;}'
      +'.mqr-cpcy .recaptcha-auth label{margin:1px 0 0 5px;}'
      +'.mqr-cpcy #recaptcha_response_field[readonly="readonly"]{color:#ccc;}'

      +'.qplugin-togler{float:right!important;margin:-1px -5px 0 0;border:0!important;}'
      +'.qplugin{margin-right:20px;float:right; text-align:right!important; width:100px;min-width:20px;min-height:10px;}'
      +'.mQR .qplugin img{border:1px solid transparent!important;cursor:pointer;vertical-align:bottom;margin-left:2px;}'
      +'.mQR .qplugin img:hover, .mQR .qplugin a:hover{border:1px solid #ccc!important;background-color:#f5f5f5;}'
      +'.mQR .qplugin .vbmenu_popup{position: absolute;margin-top:-1px;z-index: 9999;background: #eee;border: 1px solid #999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;font-size: 12px;padding:4px 0;}'
      +'.mQR .qplugin .vbmenu_popup .osize{padding:2px;}'
      +'.mQR .qplugin .vbmenu_popup .osize:hover{background: #ccc;cursor: pointer;}'

      +'.mQR .sayapkanan{position:absolute; right:0;text-align:right;margin:0;margin-top:-5px;padding:5px;display:inline-block;}'
      +'.mQR .sayapkanan input[type="checkbox"]{height:14px;width:14px;display:inline;color:#333;padding:1px;-webkit-appearance:checkbox;}'
      +'.mQR .sayapkanan label{margin-left:2px;color:#999}'
      
      +'.mktH{background-color:#fff;zoom:1;filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr="#FFF9F9F9",endColorstr="#FFF0F0F0");background-image:linear-gradient(top,#f9f9f90%,#f0f0f0100%)}.mktH:after{content:"";display:block;clear:both;height:0;visibility:hidden}.mktH ul li{list-style:none;float:left;position:relative;height:20px;width:20px}.mktH ul .mDM{margin-right:2px;background:transparent url('+imgcdn2+'menu.png) no-repeat right center}.mktH ul .mDM ul{border:1px solid #ccc}.mktH ul .mDM.fonts ul{width:250px;}.mktH ul .mDM.fonts ul li,.mktH ul .mDM.size ul li{width:99%}.mktH ul .mDM.fonts ul li{float:left; width:46%; height: 22px;}.mktH ul .mDM li{margin-right:0;border:0;}.mktH ul .mDM li a{}.mktH ul .mDM.fonts ul li a, .mktH ul .mDM.size ul li a{padding:4px 0;width: 100%; color:#222;}.mktH ul .mDM.size ul li a{line-height:70%;}.mktH ul .mDM.fonts ul li a{font-size:12px;padding-left: 5px;line-height: 12px;}.mktH ul .mDM.size ul{width:30px}.mktH ul .mDM.mBT19{background-position-x: 16px;}.mktH ul .mSP{width:1px;height:22px;background-color:#ddd;overflow:hidden;text-indent:-999px;margin:0 2px}.mktH ul ul{display:none;position:absolute;top:26px;left:0;background:#f5f5f5;height:inherit;z-index:10}.mktH ul ul li{float:none;border-bottom:1px solid #d6d6d6}.mktH ul li:hover>ul{display:block}.mktH ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;margin:0;padding:2px}.mktH ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px}.mktH ul ul a:hover{background-color:#ddd;border:0}.mQR .mBT a{display:block}.mQR .mBT1 a{background-image:url('+imgcdn1+'bold.gif)}.mQR .mBT2 a{background-image:url('+imgcdn1+'italic.gif)}.mQR .mBT3 a{background-image:url('+imgcdn1+'underline.gif)}.mQR .mBT4 a{background-image:url('+imgcdn1+'justifyleft.gif)}.mQR .mBT5 a{background-image:url('+imgcdn1+'justifycenter.gif)}.mQR .mBT6 a{background-image:url('+imgcdn1+'justifyright.gif)}.mQR .mBT7 a{background-image:url('+imgcdn1+'insertunorderedlist.gif)}.mQR .mBT8 a{background-image:url('+imgcdn1+'insertorderedlist.gif)}.mQR .mBT9 a{background-image:url('+imgcdn1+'indent.gif)}.mQR .mBT10 a{background-image:url('+imgcdn1+'outdent.gif)}.mQR .mBT11 a{background-image:url('+imgcdn1+'createlink.gif)}.mQR .mBT12 a{background-image:url('+imgcdn1+'unlink.gif)}.mQR .mBT13 a{background-image:url('+imgcdn1+'email.gif)}.mQR .mBT14 a{background-image:url('+imgcdn1+'insertimage.gif)}.mQR .mBT15 a{background-image:url('+imgcdn1+'quote.gif)}.mQR .mBT16 a{background-image:url('+imgcdn1+'code.gif)}.mQR .mBT17 a{background-image:url('+imgcdn1+'removeformat.gif)}.mQR .mBT18{width:25px}.mQR .mBT18 a{background-image:url('+imgcdn1+'color.gif)}.mQR .mBT18 ul{width:81px;padding:1px}.mQR .mBT18 li{width:24px;height:24px;overflow:hidden;float:left;border:0;margin:1px 2px;padding:0}.mQR .mBT18 ul a{width:22px;height:22px;overflow:hidden;text-indent:-9999px;display:block;border-radius:3px;opacity:.68;border:solid 1px #ddd;margin:0;padding:0}.mQR .mBT18 ul a:hover{opacity:1;border-color:#ccc}.mQR .mBT18 .col1-1 a{background:#FF0}.mQR .mBT18 .col1-2 a{background:orange}.mQR .mBT18 .col1-3 a{background:red}.mQR .mBT18 .col2-1 a{background:blue}.mQR .mBT18 .col2-2 a{background:purple}.mQR .mBT18 .col2-3 a{background:green}.mQR .mBT18 .col3-1 a{background:#FFF}.mQR .mBT19{}.mQR .mBT19 a{font-size: 13px; text-indent:0;text-align:center;line-height:18px;background:#fff;padding:1px}.mQR .mBT19.mDM > a{font-size: 14px;font-style:italic; font-weight:bold; height:20px; line-height:20px;}.mQR .mBT19 li a{padding:4px 5px}.mQR .mBT19 ul a{width:120px;line-height:16px;height:16px;font-weight:500;text-indent:0!important;text-align:left}.mQR .mBT19 .font-arial a{font-family:Arial,"DejaVu Sans","Liberation Sans",Freesans,sans-serif}.mQR .mBT19 .font-arialblack a{font-family:"Arial Black",Gadget,sans-serif}.mQR .mBT19 .font-arialnarrow a{font-family:"Arial Narrow","Nimbus Sans L",sans-serif}.mQR .mBT19 .font-bookantiqua a{font-family:Times New Roman,Times,serif}.mQR .mBT19 .font-centurygothic a{font-family:"Century Gothic",futura,"URW Gothic L",Verdana,sans-serif}.mQR .mBT19 .font-comicsansms a{font-family:"Comic Sans MS",cursive}.mQR .mBT19 .font-couriernew a{font-family:"Courier New",Courier,"Nimbus Mono L",monospace}.mQR .mBT19 .font-georgia a{font-family:Constantina,Georgia,"Nimbus Roman No9 L",serif}.mQR .mBT19 .font-impact a{font-family:Impact,Haettenschweiler,"Arial Narrow Bold",sans-serif}.mQR .mBT19 .font-lucidaconsole a{font-family:"Lucida Sans Unicode","Lucida Grande","Lucida Sans","DejaVu Sans Condensed",sans-serif}.mQR .mBT19 .font-timesnewroman a{font-family:Cambria,"Times New Roman","Nimbus Roman No9 L",Freeserif,Times,serif}.mQR .mBT19 .font-Trebucher a{font-family:"Trebuchet MS",sans-serif}.mQR .mBT19 .font-Verdana a{font-family:Verdana,Geneva,"DejaVu Sans",sans-serif}.mQR .mBT20 a{background-image:url('+imgcdn3+'fonts.png);width:20px; background-position-y: 0;}.mQR .mBT20 li{height:auto}.mQR .mBT20 ul a{height:auto;text-align:center;padding:5px;display:block;line-height:16px;background-image:none}.mQR .mBT20 .size-1 a{font-size:10px;line-height:10px}.mQR .mBT20 .size-2 a{font-size:12px;line-height:12px}.mQR .mBT20 .size-5 a{font-size:20px;line-height:20px}.mQR .mBT20 .size-6 a{font-size:24px;line-height:24px}.mQR .mBT20 .size-7 a{font-size:28px;line-height:28px}.mQR .mBT22 a{width:15px;background:url('+imgcdn3+'youtube.gif) top left no-repeat}.mQR .mBT23 a{background:url('+imgcdn3+'vimeo.gif) center top no-repeat}.mQR .mBT24 a{background:url('+imgcdn3+'soundcloud.gif) center top no-repeat}.mQR .mBT95{width:25px}.mQR .mBT95-wrapper{width:170px!important;padding:5px 2px}.mQR .mBT95 > ul:before, .mQR .mBT19 > ul:before, .mQR .mBT20 > ul:before{content:"";position: absolute;top: -5px;left: -1px;width: 30px;height: 10px;}.mQR .mBT95 li{float:left;border:0!important;padding:0 3px 3px;height:15px;width:15px;}.mQR .mBT95 li a{overflow:hidden;text-indent:-9999px!important;display:block;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;opacity:.78;height:14px;width:14px!important;border:solid 1px #ddd;padding:0}.mQR .mBT95 li a:hover{opacity:1;border-color:#333!important;background:#fff}.mQR .mBT95>a{background-image:url('+imgcdn1+'color.gif); background-position-y: 0;}.mQR .mBT50 a{background-image:url('+imgcdn1+'html.gif)}.mQR .mBT51 a{background-image:url('+imgcdn1+'php.gif)}.mQR .mBT95,.mQR .mBT20,.mQR .mBT19{height:auto; min-width:25px;}.mQR .mBT95 li a,.mQR .mBT20 li a,.mQR .mBT19 li a{background:#f5f5f5}.mQR .mBT95:hover > a, .mQR .mBT20:hover > a, .mQR .mBT19:hover >a{border:1px solid transparent!important}'

      +'.mQR .mBT22, .mQR .mBT23, .mQR .mBT24 {width:24px}'
      +'.mQR .mBT21 {width:22px}.mQR .mBT21 a {width:18px}'
      +'.mQR .mBT21 a {background-image:url('+BTN.spoiler+')}'
      +'.mQR .mBT21 a {background-image:url('+BTN.spoiler+')}'
      +'.mQR .mBT16 a {background-image: url('+BTN.code+')}'
      +'.mQR .mBT50 a {background-image: url('+BTN.html+')}'
      +'.mQR .mBT95>a {background-image: url('+BTN.pickcolor+')}'
      +'.mQR .mBT20 a {background-image: url('+BTN.picksize+')}'
      +'.mQR .mBT97 a {background-image: url('+BTN.transparent+')}'
      +'.mQR .mBT52 a {background-image: url('+BTN.noparse+')}'
      +'.mQR .mBT53 a {background-image: url('+BTN.strikethrough+')}'

      // default narrow-qr
      +'.mQR .mBT23, .mQR .mBT24{display:none}'

      +'::-webkit-input-placeholder{color:#999!important;}:-moz-placeholder{color:#999!important;}:-ms-input-placeholder{color:#999!important;}'


      +'#content-wrapper .entry-content a{text-decoration:none;}'
      +'#content-wrapper .entry-content a:hover{text-decoration:underline;}'

      /*hacky2-sharp-color*/
      +'#content-wrapper .entry-content{color:#222!important;}'
      +'#content-wrapper .entry-content .post-quote span:last-child{color:#333!important;}'

      /* night-mode */
      +'body.nightmode .mQR .qrtitle{background:#444;text-shadow:1px 1px #222;}'
      +'body.nightmode .mQR .qrtitle.editmode{background:#093858;}'
      +'body.nightmode .mQR .in-txt input[type="text"], body.nightmode .mQR .in-txt #'+gvar.tID+'{color:#f0f0f0;}'
      +'body.nightmode .mQR .Qcp.tgctr{color:#333!important;}'
      +'body.nightmode .mQR .QxM.tgctr:hover, body.nightmode .mQR .Qcp.tgctr:hover{color:#fff!important;}'
      +'body.nightmode .mQR #txtLen{color:#333;}'
      +'body.nightmode .mQR #txtLen.ffc{color:#999!important;}'
      +'body.nightmode .mQR #wrp_control {background:#666;}'
      +'body.nightmode .mktH ul ul li:hover{background:none;}'
      +'body.nightmode .mktH ul ul, body.nightmode .mktH ul ul a{background:#333;}'
      +'body.nightmode .in_balonbox{background:#ccc;}'
      +'body.nightmode .mqr-cpcy{background:#333;}'
      +'body.nightmode .mqr-cpcy #recaptcha_challenge_image{opacity:.8;}'

      +'body.nightmode #content-wrapper .entry-content{color:#ddd!important;}'
      +'body.nightmode #content-wrapper .entry-content .post-quote span:last-child{color:#999!important;}'
      +'body.nightmode #content-wrapper .entry-content .post-quote span:last-child b:first-child{color:#ccc;}'
      ;
    },
    getCSSWideFix: function(){
      var i='!important';
      return ''
      // wide to grid-12 as in default of full-web
      +'#wrapper, #wrapper.fx .main-h{max-width:940px'+i+';width:940px'+i+';}'
      +'.mQR .in-txt #'+gvar.tID+'{max-width:910px'+i+';width:910px'+i+';}'
      +'.mQR .mBT23, .mQR .mBT24{display:inline-block'+i+'}'
    },
    getSCRIPT: function(){
      return ''
      +'function showRecaptcha(element){'
      + 'if( "object" != typeof(Recaptcha) ){'
      +   'window.setTimeout(function () { showRecaptcha() }, 200);'
      +   'return;'
      + '}else{'
      +   'try{ Recaptcha.create("'+(gvar.isFJB ? '6Lc7C9gSAAAAAMAoh4_tF_uGHXnvyNJ6tf9j9ndI':'6LdPZPoSAAAAANzOixEawpyggAQ6qtzIUNRTxJXZ')+'", '
      +   'element, {theme:"custom", lang:"en", custom_theme_widget:"mqr-cpcy"}); }catch(e){};'
      + '}'
      +'}'
      ;
    },
    getSetOf: function(type){
      switch(type){
        case "color" :
        return {
          "#000000": "Black",
          "#A0522D": "Sienna",
          "#556B2F": "DarkOliveGreen",
          "#006400": "DarkGreen",
          "#483D8B": "DarkSlateBlue",
          "#000080": "Navy",
          "#4B0082": "Indigo",
          "#2F4F4F": "DarkSlateGray",
          "#8B0000": "DarkRed",
          "#FF8C00": "DarkOrange",
          "#808000": "Olive",
          "#008000": "Green",
          "#008080": "Teal",
          "#0000FF": "Blue",
          "#708090": "SlateGray",
          "#696969": "DimGray",
          "#FF0000": "Red",
          "#F4A460": "SandyBrown",
          "#9ACD32": "YellowGreen",
          "#2E8B57": "SeaGreen",
          "#48D1CC": "MediumTurquoise",
          "#4169E1": "RoyalBlue",
          "#800080": "Purple",
          "#808080": "Gray",
          "#FF00FF": "Magenta",
          "#FFA500": "Orange",
          "#FFFF00": "Yellow",
          "#00FF00": "Lime",
          "#00FFFF": "Cyan",
          "#00BFFF": "DeepSkyBlue",
          "#9932CC": "DarkOrchid",
          "#C0C0C0": "Silver",
          "#FFC0CB": "Pink",
          "#F5DEB3": "Wheat",
          "#FFFACD": "LemonChiffon",
          "#98FB98": "PaleGreen",
          "#AFEEEE": "PaleTurquoise",
          "#ADD8E6": "LightBlue",
          "#DDA0DD": "Plum",
          "#FFFFFF": "White"
        };
        break;

        case "button" :
        return {
          news_png : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAANCAIAAAD5fKMWAAAABnRSTlMAAAAAAABupgeRAAAArklEQVR42mNkYGBgYGBob29/9OgRA14gJyfHAlHHz88/bdo0/KqzsrJYHj16lF/auG/Hmvv37587dw6XUiMjIwYGBhY4X1FRUVFREb/xLMic9knLGRgYKvMiT158jKbOXF+WgYGBiYEUgGJ2ZV4kCarR7B207ubn52dhYGB4ev+yh4fHhw8fIKLvPn4XFUAxRYif8/79+wwMDIxHjhzZsmXLx48f8buBn5/fw8MDAOiiPC0scvhsAAAAAElFTkSuQmCC",
          spoiler : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAUAgMAAAAfJZ6gAAAAAXNSR0IArs4c6QAAAAxQTFRFAgUB5ujl8PLu/P/7G5VRDQAAAH9JREFUCNcdzbENwlAQA1BLKejDAkxAvnRlhLIaG7ADC1BSfIncBmyA6CgovkTzJY7EOHFx1mt8IJmzIy5lnhwjvzWkohzhUBxDZVyBfXlEBVJK1gH2MeulXbuVOjvbINmzbYBDnhhAf2PlMtC4Dvk7aVP/Nlz0vq81vtaaSf8DcK9JFqd6yKMAAAAASUVORK5CYII=",
          code : "data:image/gif;base64,R0lGODlhFQAUALMKAOjo6Nzc3JSUlKysrKCgoHBwcIiIiMTExPT09AAAAP///wAAAAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAVABQAAARTUMlJq7046827t0kSIEo4bqEwAAoQHiQWGgasIMcbV3O94zpegmajABNFiStBYIEShaYxh9xJeknJMYm1TrakbganYgEGguwFETixT5+4fE6nRAAAOw==",
          html : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAAXNSR0IArs4c6QAAAA9QTFRFZXQtAAMAUVJQmZuY19nWovyXywAAAAF0Uk5TAEDm2GYAAAABYktHRACIBR1IAAAASElEQVQI12NgQAaMgkAggMQWRBYXQGIzIqsXQGIzIvRCdBPFNjR2MRZRgbAdHQ1NVKBsEyDbBCFu7IJgOzqbGCLMESLaLgQAAFOFDIrpvL90AAAAAElFTkSuQmCC",
          pickcolor : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAVCAYAAABCIB6VAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAJFJREFUOMtjYBgFgwUIMDAwvIdiAWI0MBFpcALUQAEomyBgJNLg+wwMDBegbAMGBgZFagRDAAMDw38ojcymGOyHuhjZ9fspNdQA6sIGJLEGqJgBJQbPhxqCDc8n11AFqAH7GRgYHNDwfqicAjkGw7ycgCP5oQcR0QCWIciVpw3AlkF6yDSrhJwsTTJgYhgFtAYAn8MjLYLJYoUAAAAASUVORK5CYII=",
          picksize : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAADlJREFUOMtjYBgFIxcwEqHmP6lmMQ0W3/0n5HqauJSFhDBkJNZQurmUEc3FjKQaShOXDh1DR8EQAQDI5gUVIb0QgAAAAABJRU5ErkJggg==",
          transparent : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUAQMAAAC3R49OAAAAAXNSR0IArs4c6QAAAAZQTFRFAAAAgICAkmm5JAAAAAF0Uk5TAEDm2GYAAAApSURBVAjXY2BAArK3GxgEGCCYOYQBTAuGNIDlhLZAxBmuMMDVgNSjAQCJ+wmnBf0/pwAAAABJRU5ErkJggg==",
          noparse : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUAQMAAAC3R49OAAAAAXNSR0IArs4c6QAAAAZQTFRFAAAAAAAApWe5zwAAAAF0Uk5TAEDm2GYAAAAhSURBVAjXY2DAAgoYHjAkQGF+XwJD2m1UnPcOIgdShwYAGGEOftajyo0AAAAASUVORK5CYII=",
          strikethrough : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATBAMAAABiojCGAAAAAXNSR0IArs4c6QAAAA9QTFRFZXQtNDQ0WVlZeHh4oaGhu1gqYwAAAAF0Uk5TAEDm2GYAAAA7SURBVAjXY2AgH5ggmCpYRA0NjJQZjByALBYGBWVGZxCLQRAKgExmBQFlRkcFkCiLkLCgMougAQPlAAC8+ARiMnVu5QAAAABJRU5ErkJggg==",
          contr_stg : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wMFxAYA6YinkAAAAE7SURBVDjLrZRBS8NAEIW/SRM1UDGgB0H6Bzz5X/SHe/IslKIHe4hQra3JeHkbh2Urgi68w5t9mczOvF0bxxEz4y/L3TF3x8xmwBUwhH0T1uLngAtpzYCVuw+4O8BCgk3ATrE7wRWLGgcW7k6tzJ/AEuhTtUADnABPij0CW2CvSgHO9O2UyCXahrJHfZBiH8I+aI7TUetCT3JeZTzXEBOZjtIEUeIW+JANbNqPiVqVHkVtqKgNkyLEDJjGfwTcpMZpVcKD+LX6NgZNDdy7+y5WdJo1MiWai88Lib6PnvnoVeiBd8VuBVesD7qij1bBRxR8tAw+4icfvQnRkEMYwKZgyOaQj6qQqAog43bIR4QEv7rweaAOf+sKZmuDbzo1O/aoSxUnH1XAZTbadB1exC8Kz0gFPLv7aP/1sH0BL4CCxuBHWEkAAAAASUVORK5CYII=",
          goog_stg : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wMFwwCGmdYlk8AAAHzSURBVDjLrdVLS5ZRFAXg53gJ00pJVKyMIqhBF0fdCCKiUT+gX9L/adQvaFCNAiEogmgUDSolKyNN0NLP2+dpsj56/aqZBw7n8u6z9tp7r3PeUmu1n63HPre+7o1SCtzGKSzgcePznv1/Rdf3DyfDuIuTWMYZzGU8iyG8wlgpZbF5sNb6B7CUIh5bObCLo7iKazH7hl+ZH4/NYQxiCd9Lh3YppRdtDOASbmIUB9EfRysBGcr4HucxhUe11ofNkC/GU39Y9QRgLfM2NlBiM4LrmcNkdw7vhd1G1isJ73OYrIXtueSzLyxrUvS8G3Ay3teSj3bAXtda5xu5bqE3vYWfeFZrfdcNOBPQAzHcxdcmWCo5V0oZjwq2o4SVTlF7GoYP8CQeN+JsJ7rs1mk739shcQETe25KDBcCuJuQRjDQAc04mP1OdL24g/vdIY82Kr2NHVzGIcyUUlaiyxsR+E4cb+f8YDfgFUwnjK0cGI+EJlLxIzgRVktJzQfMptp7AKcwho+RzHAqPoZbKdYmfmAx83m8iPPSDfgmzGbxKWz7Y9hqAK6nr4Xdam28Es2rV7LezbqTr9MB7kmYA3Gyk7v9tNa6+ddrEy/N96jdSPo6XuJLijedx+FYg/l/n69ma8V4AW9rrW0sRz6rEfXWHp3u9y/gN28Pu01Pz4YXAAAAAElFTkSuQmCC",
          strikethrough : "data:image/gif;base64,R0lGODlhFAATAPcAACQeJHx+fFRSVDQ2NLSytGxqbJSWlExGTKSipGRiZEQ+RHx6fDQuLDw+PHRydJyenIyKjFxaXDw2PGxudJyWnCQmJFRWVJza7GxubExKTKyqrGRmZDQuNIyOjDw6PJyanBbQIND2iGRJdHcBAABF4AAA63EAEgAAAAAYVQCI1QB0mQAAd3gApOYA63VxEgAAAPhY/omT/5Z0/wMA/wBoNAANAABJAAABAABFaAAAAAAAagAAAAAYYACIhQB0dAAAAAAAKAAAAgAAAAAAAAAjAgABAAAAAAAAAAAYAADoAHESAAAAAPhFaIkAAJYAAAMAAAAAAAAAAABxAAAAAHwYaOaIABJ0AAAAAAgYRADo6W8SEgAAABGFYAA0hQCddAB3AOouaMdnAGRpAHdmAcYARMRHOsQ0XFZ3AOAhcwKtZVFkcgB3c+AAU4kB35YAZAMAdwEAOgAAygAAxAAAVvCMAInnAJYSAAMAAHQ3AOY7ABKdAAB3AMc8yB87d52ddHd3APirAIlIcJY0dAN3AEkAVB8A6J0AEncAAAAAEQABAQAAAAAAAPAhsImt6JZkEgN3AIBkmufnkxISawAAd7wA4sIq/WRxsncAIQA6/gDF/3HE/wBW/wC0UwDn3wASZAAAd/iRSYms2JZkZAN3dwAAyAAAdwAAdAAAAAAAPgEA0gAAZQAAd8vgesKzymSZxHd3VsznAOdIABI0AAB3APh5AInpAJYSAAMAAAwMAJ6hAHtPAHcAAAEgAAAAAAAAAAAAAwIAAX8AAAAAAAAAAHOUkC3n6G0SEmUAAG4MzXWhq1xPugAA3DxgYAD7+wASEgAAAABVmgDVkwCZawB3dwHX8gCl8AG7swAAITb+/iX//8f//1b//zjgPuez0hKZZQB3d5RbiAp/gcVnQnZ3AATcyOfodxISdAAAAA5rAAF/AABnAAB3AAWNeQCt6QBkEgB3ABAAMQAArQAAZAAAdwAwZgAAygAAxAAAVkQAMToArQAAZAAAd1QuagxncUlpSAFmACH5BAEAABcALAAAAAAUABMARwhnAC8IHEiwoMGBGCRAuIAhwgEHAgMkQHCwosWLGC8YAHAAAAYPDBJA/MChQYCMKA1aoIhxgMuXMGMOSEmzps2bFydouOngAcoOAhNc2LBQAYICBCo6yHChwgUBCy4ooNBAKM6rWAkGBAA7",
          throb_fetch : "data:image/gif;base64,R0lGODlhCgAKAMYAAP///4qOkjWU6CqC6DiW5g1Rwunp6Qg9ihxu0ESe+Fqx+HDK+G7D+I+vzmrF9Ge991Os9y+I2tTU1BlqzkGa9mar5Cl53MTExJGbpDuJtkaZ6puirTCJ7T6X9mfD9i6G65vX9hJdyO7u7o2RlUN9oZKVl83NzVVgbWbC733N+DON7jeV53eUv0uZ3j+Z5l+l4oKjy4nA7QQxh/Hx8bKxsQAAAMnJyQEaS5OTk3NycyB05wQtgRho3mOo5HDK9TOM7ojN7wszbDOO6AtIqTSO6BtZkYXL7hRIc6WkpLy7vFel66bD1QUoYRdo3o/N+2K67Clxswc7ionV+Blgq4mKiwg7lqje90RRYpOSkrbj+MrJyZubm/Ly8oqOkZWUlAEZRoqPkgEUPMnIyAIeVGFhYQEaSpSTk8zLywEWRAIbTbKysgMeSbCytD2T6jOB6juO6k6s4HCw50qP5lWZ7a2trh92xRNb0TFlmHDC62Ws7Qg5fnu9+Vy26UKf0v///////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQECgD/ACwAAAAACgAKAAAHR4AXG4MNGxgwGBiChIaIGBtSKVILcAIuBBCQkpSWmEsLHg8dHyocHQ+foaOlpzAWCAWxsQg6rrCyBbQmJCe8d729u8C/vCSBACH5BAUKAH8ALAAAAAAKAAoAAAdHgBgsLA0wGw2DLIKEhoiDPRAOKT4pKAQuBJCSlJaYLxAPDx4JH6Ucn6GjpR8cciETISEFQ7MFrrCytLQbJyd3vb++vL7AwIEAIfkEBQoAfwAsAAAAAAoACgAAB0eAGCyDLDANGw0wgoSGiDAVCQQEcCk+Cz5wkJKUlphzHwMJCg8eCh0Dn6GjpadQBQUTsSEFQwWusLK0BUh3J769v7y+J8DEgQAh+QQBCgB/ACwAAAAACgAKAAAHR4AbDTAshSwwDRuChIaIGyA+fQSTcD4+C5CSlJYLMSoDHAMdCg+lnqCipKVQBQVDBSETEyEFrK6wsrQbJ3cnvL68u72/vneBADs=",
          throbber_gif : "data:image/gif;base64,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%3D"
        };
        break;
        default: return false; break;
      }
    }
  };

  function init(){
    var kdomain = domainParse();
    gvar.domain = kdomain.prot + '//' + kdomain.host +'/';
    gvar.kkcdn = kdomain.prot + '//'+ kdomain.statics + '/';
    gvar.uavatar = kdomain.prot+'//'+kdomain.avatar +'/'+'user/avatar/';
    
    gvar.qID = 'mqr-content-wrapper';
    gvar.tID = 'reply-messsage';
    gvar.edit_mode = !1;
    gvar.offsetEditorHeight = 160; // margin top Layer
    gvar.settings = gvar.reqPID = gvar.tkset = {};

    ApiBrowserCheck();

    gvar.user = currentUser();
    gvar.isFJB = /^fjb\.m\.kaskus/.test(kdomain.host);

    getSettings();

    // -- let's roll --
    start_Main();
  } // end-init


  function start_Main(){
    // first assume
    gvar.thread_type = 'forum'; // [forum,group]
    gvar.act_uri = '';
    gvar.sec_tok = '';
    

    design();


    // handle defect-hash callback after posting, +prefix: post{ID}
    var lhash = location.hash;
    if( lhash && /\#[\da-zA-Z]{24}$/.test(lhash) ){

      var el, pid, title, url = location.protocol+'//'+location.hostname+location.pathname;
      title = $$('title', null, 1);
      pid = '#post'+lhash.replace(/\#/g, '');
      setTimeout(function(){
        try{
          title && window.history.pushState(null, title.innerText, url+pid);
          window.scrollTo(0, getAbsoluteTop($$(pid, null, 1)) );
        }catch(e){}
      }, 345);
    }
  }

  function getSettings(stg){
    /**
    eg. gvar.settings.toggle_menus
    */
    var hVal, settings = {};
    
    hVal = getValueForId(gvar.user.id, 'AUTHORIZED_USERS');
    if( !hVal ) hVal = ['', '0'];
    gvar.user.isDonatur = (hVal[1] == '1');

    hVal = getValueForId(gvar.user.id, 'AVATARS_USERS');
    if( !hVal ) hVal = ['', 'male.jpg'];
    gvar.user.avatar = gvar.uavatar + hVal[1];

    settings.widethread = (getValue(KS+'WIDE_THREAD') == '1');
    settings.tmp_text = getValue(KS+'TMP_TEXT');
    settings.tmp_title = getValue(KS+'TMP_TITLE');

    settings.toggle_menus = (getValue(KS+'TOGGLE_MENUS') == '1');
    settings.toggle_plugins = (getValue(KS+'TOGGLE_PLUGINS') == '1');

    // -=|
    _clog(settings);
    _clog(gvar.user);
    gvar.settings = settings;
  }

  // return {isLogedin: (boolean), isDonatur: (boolean), name: (string)}
  function currentUser(){
    var user = {
      isLogedin: !$D('#loginform') ? true : false,

      // is later be set after submission is performed and there is no capcay for sure
      isDonatur: !$D('#recaptcha_area') ? true : false,

      avatar: null,
      name: null,
      id: null
    }, node, cucok, el;

    if(user.isLogedin){
      node = $D('.//a[contains(@href,"profile/")]', $D('#site-nav'), 1);
      node && (user.name = entity_encode(node.innerHTML));

      if( cucok = /\bprofile\/([\d]+)/i.exec(getAttr('href', node)) )
        user.id = cucok[1];
    }
    return user;
  }

  function design(){
    // [design]
    clog('inside design');

    // inject CSS
    GM_addGlobalStyle( rSRC.getCSS() );

    if( !gvar.user.isLogedin ){
      clog('notlogin; qr-exiting');
      return (function(){
        var formfocus = function(){
          var tgt = $D('.//input[@name="username"]', null, 1);
          tgt && window.setTimeout(function(){ tgt.focus() }, 51)
        }, node, cval, urs = window.location.search;
        if(window.location.hash == '#login' && /\bkqr\b/.test(urs)){
          cval = $D('#url').value;
          $D('#url').value = cval.replace(/\??\bkqr\b/i,'');
          formfocus();
        }
        node = $D('.//a[contains(@href,"#login")]', $D('#site-nav'), 1);
        node && Dom.Ev(node, 'click', formfocus);
        return 0;
      })()
    }

    // inject SCRIPT
    if( !gvar.user.isDonatur ) {
      
      GM_addGlobalScript(location.protocol+ '\/\/www.google.com\/recaptcha\/api\/js\/recaptcha_ajax.js', 'recap', true);
      GM_addGlobalScript(rSRC.getSCRIPT());
    }

    var par, node, lg, el, nodes, imgStr, profile_uri;
    // scan all quote

    
    // scan all quote
    nodes = $D('//div[@class="footer-act"]/a[contains(@href, "post_reply/")]');
    if(nodes.snapshotLength > 0){
      var pid, href, cucok;
      for(var i=0, lg = nodes.snapshotLength; i<lg; i++) {
        node = nodes.snapshotItem(i);
        href = getAttr('href', node);
        if( cucok = /\bpost=([\w]+)/i.exec(href) )
          pid = cucok[1];

        if(par = node.parentNode){
          addClass('btn blue', node);

          el = createEl('a', {'href':'javascript:;', 'class':'qq btn blue'}, 'Quick Reply');
          append(par, el);

          el = createEl('a', {'href':'javascript:;', 'class':'qf btn blue'}, '<i class="throb"></i>Fetch');
          prepend(par, el, node);

          // edit button?
          if( el = $D('.//a[contains(@href,"edit_post/")]', par, 1) ){
            addClass('btn blue', el);
            el.innerHTML = '<i class="throb"></i>Edit';
          }

          setAttr('data-pid', '_'+pid, par);

          // remove button Reply
          Dom.remove($$('[href="#reply_form"]', par));
        }
      }

      Dom.remove($$('.form-input'));
    }

    // templating :: find entry:last
    nodes = $D('//div[@class="entry"][last()]');
    if( (par = nodes ? nodes.snapshotItem(0) : null) ){
      el = createEl('div',{'id':gvar.qID, 'class':'mQR'}, rSRC.getTPL());
      append(par, el);

      // bottom controls
      if( par = $D('.action', null, 1) ){
        el = $D('.//a[contains(@href,"/post_reply/")]', par, 1);
        gvar.act_uri = getAttr('href', el);
        if( gvar.act_uri.indexOf('http:')==-1 )
          gvar.act_uri = gvar.domain + gvar.act_uri.substr(1);
      }

      if( el = $D('.//a[contains(@href,"/logout/")]', Dom.g('site-footer'), 1) ){
        update_token( getAttr('href', el) );
      }
    }

    if( gvar.settings.widethread )
      GM_addGlobalStyle(rSRC.getCSSWideFix(), 'css_inject_widefix', 1);

    if( gvar.settings.tmp_text ){
      _TEXT.set( gvar.settings.tmp_text );
      delete gvar.settings.tmp_text;
      node = KS+'TMP_TEXT';
      setValue(node, '');
      delValue(node);

      if( gvar.settings.tmp_title ){
        _TEXT.set_title( gvar.settings.tmp_title );
        delete gvar.settings.tmp_title;
        node = KS+'TMP_TITLE';
        setValue(node, '');
        delValue(node);
      }
    }

    var profile_check = function(e){

      var _par, _el_dnt, _el = (e.target||e);
      (_el.nodeName == 'IMG') && (_el = _el.parentNode);

      _par = _el.parentNode
      _el_dnt = $D('#donatflag', null, 1);
      addClass('hide', _el_dnt);
      addClass('bling', _el);

      // xhr
      var _xhr, _xhr_cb = function(ret, xhr){
        var imguri, cucok, isDonatur, el;
        ret && (ret = ret.responseText);

        if( ret ){
          cucok = ret.match(/<figure>\s*<img\s*(?:(?:alt|class|border|width|height)=['"](?:[^'"]+)?.\s*)*src=['"]([^\'\"]+)/i);

          imguri = (cucok && cucok.length ? String(cucok[1]).replace(gvar.uavatar, '') : '/male.jpg');
          setValueForId(gvar.user.id, String(imguri), 'AVATARS_USERS');

          el = $$('#site-header .c-avt .c-avtr', null, 1);
          setAttr('src', (/^https?\:/.test(imguri) ? '' : gvar.uavatar) + imguri, el);

          removeClass('bling', _el);

          if( (isDonatur = /class=[\'\"]fn[\'\"]\s*>.+><b>\[\$\]<\//i.test(ret)) ){
            removeClass('hide', _el_dnt);
          }
          setTimeout(function(){
            setValueForId(gvar.user.id, String(isDonatur ? '1':'0'), 'AUTHORIZED_USERS');
          }, 10);
        }
        if(gvar.reqPID && xhr.pid && "undefined" != typeof gvar.reqPID[xhr.pid])
          delete gvar.reqPID[xhr.pid];
      };

      (function(){
        var profile_uri = String(gvar.domain);
        profile_uri = profile_uri.substring(0, profile_uri.length-1);
        profile_uri+= String(getAttr('href', node)).replace(gvar.domain, '');
        profile_uri = profile_uri.replace('/profile/', '/profile/aboutme/');

        var xhr = new GM_XHR();
        xhr.uri = profile_uri;
        xhr.cached = true;
        xhr.pid = 'profile-' + String(gvar.user.id);
        clog('GET profile detail...: ' + xhr.uri);
        gvar.reqPID[xhr.pid] = xhr.request(null, 'GET', _xhr_cb);
      })();
    };

    par = $$('#site-header .c:last-child', null, 1);
    if( par ){
      node = $$('#site-header .u>a', par, 1);
      el = createEl('span', {id:'donatflag', 'class':'hide'}, '[$]');
      append(node, el);

      imgStr = '<i class="throb"></i><img class="c-avtr" src="'+gvar.uavatar+'male.jpg" />';
      el = createEl('div', {'class':'c-avt'}, imgStr);
      append(par, el);
      Dom.Ev(el, 'click', function(e){ profile_check(e) });
    }    

    if( gvar.user.isDonatur )
      removeClass('hide', $$('#donatflag', null, 1));

    if( gvar.user.avatar ){
      el = $$('#site-header .c-avtr', null, 1);
      
      // gvar.user.avatar = gvar.user.avatar.replace(gvar.uavatar, '');
      el && setAttr('src', gvar.user.avatar, el);
    }
    else{
      profile_check(el);
    }    


    clog('endof-design');
    // attach event
    events_tpl();
  }

  function events_tpl(){
    var nodes, node, el;
    // [events]
    nodes = $D('//a[contains(@class, "qq btn") or contains(@class, "qf btn") or contains(@href,"edit_post/")]');
    if(nodes.snapshotLength > 0){
      for(var i=0, lg = nodes.snapshotLength; i<lg; i++) {
        node = nodes.snapshotItem(i);
        Dom.Ev(node, 'click', function(e){
          do_an_e(e);
          attach_qr_form(e);
        })
      }
    }

    // toggle wrp_control
    Dom.Ev($D('.btn_stg',null,1), 'click', function(e){
      var tgt = $D('#wrp_title');
      showhide( tgt );
      
      e = e.target||e;
      gvar.settings.toggle_plugins = isVisible(tgt);
      if( gvar.settings.toggle_plugins ){
        addClass('active', e);
        $$('[name=title]', tgt).focus();
      }
      else{
        removeClass('active', e);
        _TEXT.focus();
      }

      setValue(KS+'TOGGLE_MENUS', gvar.settings.toggle_plugins ? '1' : '0');
    });
    // toggle qplugin
    Dom.Ev($D('.btn_qplugin',null,1), 'click', function(e){
      var tgt = $D('#qr_plugins_container');
      showhide( tgt );
      e = e.target||e;
      if( isVisible(tgt) )
        addClass('active', e);
      else
        removeClass('active', e);

      setValue(KS+'TOGGLE_PLUGINS', isVisible(tgt) ? '1' : '0');
      _TEXT.focus();
    });
    // clear editor
    Dom.Ev($D('.QxM',null,1), 'click', function(e){
      e = e.target||e;
      _TEXT.clear(true);
      
      showhide(e, false);
    });
    // clear title
    Dom.Ev($D('.Qxc',null,1), 'click', function(e){
      e = e.target||e;
      var tgt = $D('.//div[@id="wrp_title"]/input[@type="text"]',null,1);
      if( tgt ){
        tgt.value=''; tgt.focus();
      }
      showhide(e, false);
    });

    Dom.Ev($D('.//div[@id="wrp_title"]/input[@type="text"]',null,1), 'keyup', function(e){
      e=e.target||e;
      var tgt = $D('.Qxc',null,1);
      if( e.value.length )
        showhide(tgt, 1);
      else
        showhide(tgt, false);
    });

    // scroll-top on header click
    Dom.Ev($$('#site-header > .main-h.r'), 'click', function(e){
      var wrapper;
      e = e.target||e;
      if( e && !hasClass('main-h', e) ) return !1;

      wrapper = closest(e, {id: 'wrapper'});
      if( wrapper && !hasClass('fx', wrapper) ) return !1;

      return window.scrollTo(0,0);
    });

    // editor
    node = $D('//div[@id="wrp_msg"]/textarea',null,1);
    Dom.Ev(node, 'focus', function(){ _TEXTCOUNT.init('#txtLen') });
    Dom.Ev(node, 'blur', function(){ _TEXTCOUNT.dismiss() });
    Dom.Evs(node, 'paste', function(e){
      window.setTimeout(function(){ _TOGGLER.clear_editor( (e.target||e).value.length > 0 ) }, 100);
    });
    Dom.Evs(node, 'keyup', function(e){ _TOGGLER.clear_editor( (e.target||e).value.length > 0 ) });

    Dom.Ev(node, 'keydown', function(ev){
      var asocKey, A = ev.keyCode||ev.keyChar;
      asocKey={
         '83':'sbutton'   // [S] Submit post

        ,'66' : 'B' // Bold
        ,'73' : 'I' // Italic
        ,'85' : 'U' // Underline

        ,'69' : 'CENTER' // E (center)
        ,'76' : 'LEFT' // L (left)
        ,'82' : 'RIGHT' // R (right)
      };
      if(ev.ctrlKey){
        if( [13, 66,73,85, 69,76,82].indexOf(A) != -1 ){
          do_an_e(ev);
          if(A===13)
            SimulateMouse($D('#sbutton'), 'click', true);
          else
            _TEXT.insert.tagBIU( asocKey[A] );
        }
      }
    });
    gvar.maxH_editor = ( parseInt( getHeight() ) - gvar.offsetEditorHeight );
    _TEXT.setElastic(gvar.maxH_editor);

    // btn-cancel edit
    Dom.Ev($D('#cbutton'), 'click', function(e){
      gvar.edit_mode = null;
      toggle_qrmode(false);
    });

    // close in_balonbox of saving /updating (editmode)
    Dom.Ev($D('.Qsv',null,1), 'click', function(e){
      _TOGGLER.baloon_save()
    });
    
    !gvar.user.isDonatur && 
    window.setTimeout(function(){
      (node = $D('#hidrecap_btn'))
        && SimulateMouse(node, 'click', true);

      Dom.Ev($D('#recaptcha_reload_btn'), 'click', function(){
        _TOGGLER.auth_noneed_cpcy(false);
      });
      Dom.Ev($D('#recaptcha_stg'), 'click', function(){
        _TOGGLER.whattheheck();
      });
      // close capcay
      Dom.Ev($D('.Qcp',null,1), 'click', function(){
        _TOGGLER.showhide_capcay();
      });

      Dom.Ev($D('#chk-auth'), 'change', function(e){
        var ischecked = _TOGGLER.auth_noneed_cpcy();
        setValueForId(gvar.user.id, String(ischecked ? '1':'0'), 'AUTHORIZED_USERS');
        gvar.user.isPreAuthorized = ischecked;
      });

      var handleKey = function(ev){
        var el, A = ev.keyCode||ev.keyChar;
        el = ev.target||ev;
        if( [9,27, 33,34].indexOf(A) != -1 ){
          switch(A){
            case 9: $D('#sbutton').focus(); break;
            case 27: _TOGGLER.showhide_capcay(false); break;
            case 33: case 34:
              if(getAttr('id', el) == 'recaptcha_response_field')
                SimulateMouse($D('#recaptcha_reload_btn'), 'click', true);
              else
                return !1;
            break;
          }
          return 1;
        }
        return !1;
      };
      Dom.Ev($D('#chk-auth'), 'keydown', function(ev){
        if( handleKey(ev) )
          do_an_e(ev);
      });
      Dom.Ev($D('#recaptcha_response_field'), 'keydown', function(ev){
        if( handleKey(ev) )
          do_an_e(ev);
      });

      baloon_positioning();
    }, 1500);

    Dom.Ev($D('#chk_fixups'), 'click', function(e){
      e = e.target||e;
      var isbaloonup, el_btn, el_plugin, chk, tgt, cssid = 'css_inject_widefix';
      tgt = $D('#'+cssid);
      tgt && Dom.remove(tgt);
      el_btn = $D('.btn_qplugin',null,1);
      el_plugin = $D('#qr_plugins_container');

      if( chk = isChecked(e) ){
        GM_addGlobalStyle(rSRC.getCSSWideFix(), cssid, 1);

        !isVisible(el_plugin) && showhide(el_plugin, true);
        addClass('active', el_btn);
      }
      else{
        if( !gvar.settings.toggle_plugins && isVisible(el_plugin))
          SimulateMouse(el_btn, 'click', true);
      }

      setValue(KS+'WIDE_THREAD', (chk ? '1' : '0'));
      baloon_positioning();
      _TEXT.lastfocus();
    });

    // form-submit
    if( node = $D('#mqrform') ){
      setAttr('action', gvar.act_uri, node);
      Dom.Ev(node, 'submit', function(e){
        var rrf, rrfvalue, elcpcy, tgt, el;
        do_an_e(e);

        el = $D('#'+gvar.tID);
        if( !el.value || (el.value && el.value.length < 5) ){
          // blank-msg
          addClass('error', el.parentNode);
          window.setTimeout(function(){
            removeClass('error', $D('#'+gvar.tID).parentNode);
          }, 3000);
          _TEXT.focus();
          return;
        }

        if(gvar.edit_mode){
          _TOGGLER.baloon_save(true);
          window.setTimeout(function(){ xhrpost() }, 212);
          return !1;
        }

        var gogo = function(){
          _TOGGLER.response_field(true);
          window.setTimeout(function(){ xhrpost() }, 212);
          return !1;
        };

        if( !gvar.user.isDonatur ){
          if(isChecked( $D('#chk-auth') ))
            return gogo();

          rrf = $D('#recaptcha_response_field');
          if( !isVisible($D('#wrp_cpcy')) ){
            _TOGGLER.showhide_capcay(true);
            tgt = $D('#sbutton');
            removeClass('btn-red', tgt);
            addClass('blue', tgt);
          }
          else{
            rrfvalue = (rrf ? trimStr(rrf.value) : !1);
            if( !rrfvalue ){
              _TOGGLER.response_field(false, true);
            }
            else{
              return gogo();
            }
          }
          window.setTimeout(function(){ rrf && rrf.focus() }, 123);
        }
        else{
          return gogo();
        }
        return false;
      }); // end-submit-ev
    }


    Dom.Ev(window, 'scroll', function(){
      var el, nVScroll = document.documentElement.scrollTop || document.body.scrollTop;
      // el = $D('#site-header');
      el = $D('#wrapper');
      if( nVScroll > 0 ){
        !hasClass('fx', el) && addClass('fx', el);
      }
      else{
        removeClass('fx', el);
      }
    });
    Dom.Ev(window, 'resize', function(){
      gvar.maxH_editor = ( parseInt( getHeight() ) - gvar.offsetEditorHeight );
      _TEXT.setElastic(gvar.maxH_editor, 1);
    });

    // initialize editor
    _TEXT.init();
    eventsController();
    clog('all-events-done; qr-inited');
  } // end-events_tpl

  function eventsController(){
    var ch, node, nodes, par;
    if( par = $D('.mktH',null,1) ){
      var tag, title, pTag;
      nodes = $D('.//a[starts-with(@class,"ev_")]', par);
      if( nodes.snapshotLength )
      for(var i=0; i<nodes.snapshotLength; ++i){
        node = nodes.snapshotItem(i);
        switch( String(getAttr('class', node)).replace(/^ev_/,'') ){
          case "biu": case "align":
            Dom.Ev(node, 'click', function(e){

              _TEXT.insert.tagBIU( e.target||e );
            });
          break;
          case "font": case "size": case "color":
            Dom.Ev(node, 'click', function(e){
              var _cls, el = e.target||e;
              _cls = String(getAttr('class', el)).replace(/^ev_/,'');
              tag = _cls.toUpperCase();

              _TEXT.insert.tagHibrid(tag, getAttr('title', el), el);
              _TEXT.pracheck();
              do_an_e(e);
            });
          break;
          case "list":
            Dom.Ev(node, 'click', function(e){
              e = e.target||e;
              var selected, bb = getAttr("data-bb", e);
              if( bb )
                bb = bb.replace("LIST-", "");
              
              _TEXT.init();
              selected = _TEXT.getSelectedText();

              if(selected=='') {
                var reInsert = function(pass){
                  var ins=prompt("Enter a list item.\nLeave the box empty or press 'Cancel' to complete the list:");
                  _TEXT.init();
                  if( ins ){
                    _TEXT.setValue( '\n' + '[*]' + ins + '');
                    reInsert(true);
                  }else{
                    return; 
                  }
                };  
                _TEXT.insert.tagHibrid('LIST', (bb=='numeric' ? 1:false) );
                window.setTimeout(function(){ reInsert(); }, 10);
              }
              else{
                var ret = '', parts = selected.split('\n');
                for(var i=0; i< parts.length; i++)
                  if(trimStr(parts[i])) ret+= '\n' + '[*]' + parts[i] + '';
                ret = '[LIST'+(bb=='numeric' ? '="1"' : '')+']' + ret + '\n[/LIST]';
                _TEXT.replaceSelected( ret, [0, ret.length] );
              }
              _TEXT.pracheck();
            });
          break;
          case "custom":
            Dom.Ev(node, 'click', function(e){
              _TEXT.insert.tagCustom(e.target||e);
              _TEXT.pracheck();
            });
          break;
        }
        // end switch
      }

      // qplugin inside
      node = $D('.ev_strike', par, 1);
      Dom.Ev(node, 'click', function(e){
        e = e.target||e;
        tag = getAttr('data-bbcode', e);
        _TEXT.insert.tagCustom(tag);
        _TEXT.pracheck();
      });

      // dropdown
      if( nodes = $D('.mDM', par) ){
        for(var i=0;i<nodes.length; ++i){
          Dom.Ev(nodes[i], 'mouseover', function(e){
            var tgt = $D('.//ul', (e.target||e), 1);
            tgt && tgt.style.removeProperty('display');
          })
        }
      }

      // in the end add the class to flaging
      addClass('events', par);
    } // mktH

    // shortcut
  } // end -eventsController

  function build_fetch_url(e, pattern){
    if(!e || (!e.parentNode)) return '';
    var furl, el = $D('.//a[contains(@href,"'+pattern+'")]', e.parentNode, 1);
    furl = getAttr('href', el);
    if( furl.indexOf('http:') == -1 )
      furl = gvar.domain + furl.substr(1);
    return furl;
  }
  function getPID(e){
    if(!e || (e && !e.parentNode)) return;
    return getAttr('data-pid', e.parentNode);
  }

  function toggle_qrmode(flag, respon){
    var formuri, mpar, sbtn, tgt = $D('#qrtitle_mode');
    tgt && (tgt.innerHTML = (flag ? 'Edit' : 'Reply'));
    sbtn = $D('#sbutton');
    sbtn && (sbtn.value = (flag ? 'Save Changes' : 'Post Reply'));

    if( mpar = $D('#'+gvar.qID) ){
      setAttr('action', formuri, tgt);
      setAttr('name', (flag ? 'edit_postreply':'postreply'), tgt);
    }
    
    removeClass('btn-red blue', sbtn);

    if( flag ){ // editmode
      respon && update_token(respon);
      formuri = gvar.act_uri_edit;
      addClass('blue', sbtn);
      mpar && addClass('editmode', $D('.legend', mpar, 1));

      showhide($D('#cbutton'), flag, 'inline-block');
    }
    else{
      restore_token();
      formuri = gvar.act_uri;
      addClass('btn-red', sbtn);

      _TEXT.clear();
      if( tgt = $D('//div[@id="wrp_title"]/input[@name="title"]',null,1) )
        tgt.value = '';
      
      if( tgt = $D('//div[@id="wrp_reason"]/input[@name="reason"]',null,1) ){
        tgt.value = '';
        showhide(tgt.parentNode, !flag);
      }

      showhide($D('#cbutton'), !flag);
      mpar && removeClass('editmode', $D('.legend', mpar, 1));
    }
  }

  // fallback localstorage value and isDonatur
  function failover_authorization(){
    setValueForId(gvar.user.id, '0', 'AUTHORIZED_USERS');
    if(gvar.user.isDonatur){
      alert('You need to insert capcay to post!\nPage will be reloaded now.');

      setValue(KS+'TMP_TEXT', String($D('#'+gvar.tID).value));
      setValue(KS+'TMP_TITLE', String($D('//div[@id="wrp_title"]/input[@name="title"]',null,1).value));
      location.reload(false);
      return !1;
    }
    gvar.user.isPreAuthorized = gvar.user.isDonatur = false;
    return 1;
  }

  function xhrfetch_cb_post(ret, xhr){
    ret && (ret = ret.responseText);
    clog('cb_post:\n' + ret);

    if(!ret) return;
    if(gvar.reqPID && xhr.pid && "undefined" != typeof gvar.reqPID[xhr.pid])
      delete gvar.reqPID[xhr.pid];

    // error-pattern
    if( ret.match(/[\'\"]err-msg[\'\"]/i) ){
      pat = 'not have permission';
      var re, pat, cucok, msg, el, tgt = $D('#mqrform'); 
      if( ret.indexOf(pat)!=-1 ){
        re = new RegExp('>([\\w\\s]+'+pat+'[^<]+)', "i");
        cucok = re.exec(ret);
        msg = cucok[1] + ' <a href="?kqr#login">reload page</a>';
        el = createEl('div', {'class':'err-msg'}, msg);
        append(tgt.parentNode, el);
        showhide($D('#mqrform'), false);
      }
    }
    else{

      var tgt, subret, pos={};
      pos['start'] = ret.indexOf('<textarea');
      pos['end'] = ret.indexOf('</textarea');

      subret = ret.substr(pos['start'], (pos['end'] - pos['start']));
      subret = subret.replace(/<textarea[^>]+./i, '');
      _TEXT.init();
      _TEXT.add( entity_decode( unescapeHtml( subret.replace(/\\n|\\r\\n|\\r/g, '\n') ) ) );
      _TEXT.pracheck();

      (tgt = $D('.bling',null,1)) && removeClass('bling', tgt);
    }
  }
  function xhrfetch_cb_edit(ret, xhr){
    ret && (ret = ret.responseText);
    clog('cb_edit:\n' + ret);

    if(!ret) return;
    if(gvar.reqPID && xhr && xhr.pid && "undefined" != typeof gvar.reqPID[xhr.pid])
      delete gvar.reqPID[xhr.pid];

    var tgt, subret, cucok, pos={};
    pos['start'] = ret.indexOf('<textarea');
    pos['end'] = ret.indexOf('</textarea');

    subret = ret.substr(pos['start'], (pos['end'] - pos['start']));
    subret = subret.replace(/<textarea[^>]+./i, '');
    subret = entity_decode( unescapeHtml( subret.replace(/\\n|\\r\\n|\\r/g, '\n') ) );

    // check title
    if( cucok = /<input\s((?:[\w]+=[\'\"][^\'\"]+.)\s+)+name=[\'\"]title[\'\"][^\>]+/i.exec(ret) ){
      cucok = /value=[\'\"]([^\'\"]+)/i.exec(cucok[0]);
      cucok && _TEXT.set_title(cucok[1]);
    }
    // check reason
    if( cucok = /<input\s((?:[\w]+=[\'\"][^\'\"]+.)\s+)+name=[\'\"]reason[\'\"][^\>]+/i.exec(ret) ){
      cucok = /value=[\'\"]([^\'\"]+)/i.exec(cucok[0]);
      cucok && _TEXT.set_reason(cucok[1]);
    }

    // identify as an edit_mode
    gvar.edit_mode = 1;
    toggle_qrmode(gvar.edit_mode, ret);

    _TEXT.init();
    if( gvar.edit_mode ){
      _TEXT.set(trimStr(subret));
    }
    _TEXT.pracheck();
    (tgt = $D('.bling',null,1)) && removeClass('bling', tgt);
  }
  function xhrfetch(e, mode){
    if(!e) return;
    // prep xhr
    window.setTimeout(function(){
      var xhr = new GM_XHR();
      xhr.uri = build_fetch_url(e, (mode =='edit' ? 'edit_post/' : 'post_reply/'));
      xhr.cached = true;
      xhr.pid = (mode =='edit' ? 'e' : 'q') + String(getPID(e));
      clog('GET '+(mode =='edit' ? 'edit':'')+'post...: ' + xhr.uri);
      gvar.reqPID[xhr.pid] = xhr.request(null, 'GET', (mode == 'edit' ? xhrfetch_cb_edit : xhrfetch_cb_post));
    }, 123);
  }

  function attach_qr_form(caleer){
    var e, mode, par, pid;
    e = caleer.target||caleer;

    if(gvar.edit_mode){
      if( confirm('You are currently editing a post.\n\nDiscard anyway?') ){
        gvar.edit_mode = null;
        toggle_qrmode(false);
      }
      else{
        _TEXT.focus();
        return;
      }
    }
    
    par = closest(e, {'class':'entry'})
    par && append(par, $D('#'+gvar.qID));
    mode = String(getAttr('class', e)).indexOf('qf') != -1 ? 'fetch' : null;
    !mode && (mode = String(getAttr('href', e)).indexOf('edit_post/') != -1 ? 'edit' : '');
    if( mode ){
      pid = (mode == 'edit' ? 'e' : 'q') + String(getPID(e));
      if("undefined" != typeof gvar.reqPID[pid]){
        clog('same request exist, exiting ..');
        removeClass('bling', e);
        gvar.reqPID[pid].abort();
        delete gvar.reqPID[pid];
      }
      else{
        addClass('bling', e);
        if(mode == 'edit'){
          gvar.act_uri_edit = getAttr('href', e);
          if( gvar.act_uri_edit.indexOf('http:')==-1 )
            gvar.act_uri_edit = gvar.domain + gvar.act_uri_edit.substr(1);
        }
        xhrfetch(e, (mode == 'edit' ? 'edit' : 'quote') );
      }
    }

    _TEXT.caretChk();
    _TEXT.focus();
  }

  function restore_token(){
    var tok = gvar.tkset[(gvar.edit_mode ? 'edit':'post')];
    tok && (gvar.sec_tok = tok);
    $D('#mqr_securitytoken').value = gvar.sec_tok;
  }
  function update_token(text){
    var cucok = /\bhash=([\w-]+)/gi.exec(String(text));
    if( cucok ){
      gvar.sec_tok = cucok[1]
      $D('#mqr_securitytoken').value = gvar.sec_tok;
    }
    gvar.tkset[(gvar.edit_mode ? 'edit':'post')] = gvar.sec_tok;
  }

  function xhrpost_cb_new(ret, xhr){
    ret && (ret = ret.responseText);
    clog('cb_new:\n' + ret);

    if(!ret) return;
    if(gvar.reqPID && xhr && xhr.pid && "undefined" != typeof gvar.reqPID[xhr.pid])
      delete gvar.reqPID[xhr.pid];

    var cucok, prevchecked;
    // error-pattern
    if( ret.match(/[\'\"]err-msg[\'\"]/i) ){

      prevchecked = gvar.user.isPreAuthorized;
      if(gvar.user.isDonatur || gvar.user.isPreAuthorized){
        if( failover_authorization() == !1 )
          return;
      }

      if( ret.indexOf('image verification did not match')!=-1 ){
        _TOGGLER.showhide_capcay(true);
        _TOGGLER.gnotice(true, (prevchecked ? 'Capcay is required. \n':'')+'The text you entered did not match. Please try again.');
        _TOGGLER.response_field(false, true);
        _TOGGLER.auth_noneed_cpcy(false);
      }
    }
    // submit-pattern
    else if( ret.match(/[\'\"]s-msg[\'\"]/i) ){
      if( cucok = /\bpost\/([\d\w]+)\#post([\d\w]+)\b[^\>]+.Click\shere/i.exec(ret) ){
        var next = gvar.domain + 'post/' + cucok[1] + '#' + cucok[2];
        top.location.href = next;
      }
      else if( ret.indexOf('security token was invalid.<')!=-1 ){
        alert('Invalid securitytoken');
      }
      else{
        alert('Unknown Error');
        clog(ret);
      }
    }
    update_token(ret);
  }
  function xhrpost_cb_update(ret, xhr){
    ret && (ret = ret.responseText);
    clog('cb_update:\n' + ret);

    if(!ret) return;
    if(gvar.reqPID && xhr && xhr.pid && "undefined" != typeof gvar.reqPID[xhr.pid])
      delete gvar.reqPID[xhr.pid];

    if( /[\\\"]+s-msg[\\\"]+>/i.test(ret) ){
      if( cucok = /\bpost\/([^"\']+)[^>]+.Click\shere\b/i.exec(ret) ){
        _TOGGLER.baloon_set('#Okesip');
        var next = gvar.domain + 'post/' + cucok[1];
        window.setTimeout(function(){
          if(location.href == next)
            location.reload(true);
          else
            top.location.href = next; return;
        }, 450);
      }
      else if( ret.indexOf('security token was invalid.<')!=-1 ){
        alert('Invalid securitytoken');
      }
      else{
        alert('Unknown Error');
        clog(ret);
      }
    }

    update_token(ret);
  }
  function xhrpost(){
    var xhr = new GM_XHR();
    xhr.cached = true;
    xhr.uri = (gvar.edit_mode ? gvar.act_uri_edit : gvar.act_uri);
    xhr.pid = (gvar.edit_mode ? '_editpost_' : '_newpost_');

    clog('POST '+(gvar.edit_mode ? 'edit':'')+'post...: ' + xhr.uri);
    var sdata = build_data_form(true);
    clog(sdata);
    gvar.reqPID[xhr.pid] = xhr.request(sdata, 'POST', (gvar.edit_mode ? xhrpost_cb_update : xhrpost_cb_new));
  }

  function build_data_form(toString){
    var data, node, nodes, par, field, fields;
    if( par = $D('#mqrform') ){
      data = (toString ? '' : {});
      nodes = $D('.//*[@name]', par);
      fields = ['title','message','sbutton']; // previews // 'psecuritytoken','securitytoken',
      if(gvar.edit_mode)
        fields = fields.concat(['reason']);
      else
        fields = fields.concat(['recaptcha_challenge_field','recaptcha_response_field']);
      
      if( nodes.snapshotLength ){
        var sec = $D('#mqr_securitytoken').value;
        for(var i=0; i<nodes.snapshotLength; ++i){
          node = nodes.snapshotItem(i);
          field = trimStr( String(getAttr('name', node)) );
          if( fields.indexOf(field) == -1) continue;
          if(toString){
            data+='&' + field + '=' + encodeURIComponent( trimStr(node.value));
            data+='&'+(gvar.edit_mode?'':'p')+'securitytoken=' + sec;
          }
          else{
            data[field] = trimStr(node.value);
            data[(gvar.edit_mode ? '': '')+'securitytoken'] = sec;
          }
        }

        // keep send this field
        if(!gvar.edit_mode && gvar.user.isDonatur){
          if(toString)
            data+='&recaptcha_challenge_field=1&recaptcha_response_field=1';
          else
            data['recaptcha_challenge_field'] = data['recaptcha_response_field'] = '';
        }
      }
    }

    return data;
  }

  // baloon positioning;
  function baloon_positioning(){
    var lOffset, lpos, cppos, mQRpos, tgt, nodes;
    nodes = $D('.in_balonbox',null);
    if( nodes.length )
    for(var i=0; i<nodes.length; ++i){
      tgt = nodes[i];
      tgt.style.removeProperty('visibility');
      tgt.style.setProperty('display', '', '');

      cppos = getPosDim(tgt)
      mQRpos = getPosDim($D('.mQR',null,1))
      lpos = (Math.floor(mQRpos['w']/2) - Math.floor(cppos['w']/2) );
      lOffset = 15;
      tgt.style.setProperty('left', parseInt(lpos+lOffset)+'px', '');
      tgt.style.setProperty('display', 'none', '');
    }
  }

  // domain guest
  function domainParse(){
    return {
      "prot": location.protocol,
      "host": location.hostname,
      "statics" : 'cdn.kaskus.com',
      "avatar" : 's.kaskus.id'
    };
  }

  function getPosDim(el) {
    var r = {x:0,y:0, w:el.offsetWidth, h:el.offsetHeight};
    for (var lx=0, ly=0; el != null;
      lx+= el.offsetLeft, ly+= el.offsetTop, el = el.offsetParent);
    r['x'] = lx; r['y']=ly;
    return r;
  }
  // static routine
  function dump(x) { return x && JSON ? JSON.stringify(x) : x}
  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 (typeof(x)=='string' && x ? x.replace(/^\s+|\s+$/g,"") : '') };
  function isLink(x) { return x.match(/((?:http(?:s|)|ftp):\/\/)(?:\w|\W)+(?:\.)(?:\w|\W)+/); }
  function getAbsoluteTop(element) {
    var AbsTop=0;
    while (element) { AbsTop=AbsTop+element.offsetTop; element=element.offsetParent; }
    return(AbsTop);
  }
  function getHeight(){
    var y = 0;
    if (self.innerHeight){ // FF; Opera; Chrome
       y = self.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight){ 
       y = document.documentElement.clientHeight;
    } else if (document.body){
       y = document.body.clientHeight;
    }
    return y;
  };
  function do_an_e(A) {
    A.stopPropagation();
    A.preventDefault();
    return A;
  };
  function isVisible(el){
    return el.offsetWidth > 0 || el.offsetHeight > 0;
  }
  function isChecked(el){
    return el.checked;
  }
  function entity_decode(S){
    return S.replace(/\&gt;/gm,'>').replace(/\&lt;/gm,'<').replace(/\&amp;/gm,'&');
  }
  function entity_encode(S){
    return !S ? '' : String(S).replace(/>/gm,'&gt;').replace(/</gm,'&lt;').replace(/\"/g,'&quot;');
  }
  // clean-up fetched post
  function unescapeHtml(text){
    if(!text) return '';
    var cleanRet = '', temp = createEl('div',{},text);
    for(var i in temp.childNodes){
      if(typeof(temp.childNodes[i])!='object' || isUndefined(temp.childNodes[i].nodeValue)) continue;
      cleanRet += temp.childNodes[i].nodeValue;
    }
    temp.removeChild(temp.firstChild);
    return cleanRet;
  }
  function showhide(obj, show, isImportant){
    if(isUndefined(obj) || "object" != typeof obj || (obj && !obj.style)) return;
    if(isUndefined(show)) show = (obj.style.display=='none'); // toggle mode
    if(!show){
      obj.style.setProperty('display', 'none', isImportant===true ? 'important' : ''); // important
    }else{
      if( isImportant )
        obj.style.setProperty('display', isImportant, 'important'); 
      else
        obj.style.removeProperty('display');
    }
  };
  function closest(obj, params){
    if(!obj || (obj && !obj.parentNode))
      return;
    var criteria, gotit, par, ijump, threshold;
    gotit = null; threshold = 20; ijump = 0;
    for(crt in params){
      if("string" == typeof crt)
        criteria = crt;
    }
    par = obj;
    while(!gotit){
      par = par.parentNode;
      switch(criteria){
        case "class":
          gotit = getAttr('class', par);
          gotit = gotit && (gotit.indexOf(params[criteria]) != -1);
        break;
        case "id":
          gotit = getAttr('id', par);
          gotit = gotit && (gotit == params[criteria]);
        break;
        case "tag":
          gotit = par.nodeName.toLowerCase();
          gotit = gotit && (gotit == params[criteria].toLowerCase());
        break;
        default:
          gotit = getAttr(criteria, par);
          gotit = gotit && (gotit == params[criteria]);
        break;
      }
      ++ijump;
      if(ijump > threshold)
        break;
    }
    return gotit ? par : null;
  }
  function prepend(parent, child, before){
    if(!parent || ("object"!=typeof child)) return;
    if("undefined" == typeof before)
        before = parent.firstChild;
    parent.insertBefore(child, before);
  }
  function append(parent, childs){
    if(!parent || ("object"!=typeof childs)) return;
    if("string" == typeof childs.innerHTML){
      parent.appendChild(childs);
    }
    else{
      for(var i=0; i<childs.length; ++i){
        parent.appendChild(childs[i]);
      }
    }
  }
  function addClass(cName, Obj){
    if(cName=="") return;
    var neocls = (Obj.className ? Obj.className : '');
    if(neocls.indexOf(cName)!=-1) return;
    neocls+=(neocls!=''?' ':'')+cName;
    setAttr('class', neocls, Obj);
  }
  function removeClass(cName, Obj){
    if(!cName || !Obj) return;
    var neocls, rmvclss = getAttr('class', Obj);
    neocls = getAttr('class', Obj);
    rmvclss = cName.split(' ');
    for(var i=0; i<rmvclss.length; ++i)
      neocls = neocls.replace(rmvclss[i], '');
    neocls = trimStr(neocls);
    setAttr('class', neocls, Obj);
  }
  function hasClass(cName, Obj){
    if(!cName || !Obj) return;
    var clss = getAttr('class', Obj).split(' ');
    return (clss.indexOf(cName) != -1);
  }
  function getAttr(name, Obj){
    if("string" === typeof name && "object" === typeof Obj && Obj)
      return Obj.getAttribute(name)||'';
    else
      return;
  }
  function setAttr(name, value, Obj){
    if("string" === typeof name && "object" === typeof Obj)
      return Obj.setAttribute(name, value);
  }
  function getValue(key) {
    var data=OPTIONS_BOX[key];
    return (!data ? '': GM_getValue(key,data[0]));
  }
  function setValue(key, value) {
    var data=OPTIONS_BOX[key];
    return (!data ? '': GM_setValue(key,value));
  }
  function setValueForId(userID, value, gmkey, sp){
    if( !userID ) return null;
    
    sp = [(isDefined(sp) && typeof(sp[0])=='string' ? sp[0] : ';'), (isDefined(sp) && typeof(sp[1])=='string' ? sp[1] : '::')];
    var i, ksg = KS+gmkey, info;
    return (function(val){
      info = val;
      if( !info ){
        setValue(ksg, userID+"="+value);
        return;
      }
      info = info.split( sp[0] );
      for(i=0; i<info.length; i++){
        if(info[i].split('=')[0]==userID){
          info.splice(i,1,userID+"="+value);
          setValue(ksg, info.join(sp[0]));
          return;
        }
      }
      
      info.splice(i, 0, userID+"="+value);
      return setValue(ksg, info.join(sp[0]));
    })( getValue(ksg) );
  }

  // values stored in format "userID=value;..."
  // sp = array of records separator
  // gvar.user.id, 'LAYOUT_TPL', ['<!>','::'], function
  function getValueForId(userID, gmkey, sp){
    if( !userID ) return null;
    clog('GET:'+gmkey + ' inside');
    
    sp = [(isDefined(sp) && typeof(sp[0])=='string' ? sp[0] : ';'), (isDefined(sp) && typeof(sp[1])=='string' ? sp[1] : '::')];    
    var val, info, retValue=null;

    return (function(val){
      if( !val ) {

        clog(gmkey + ' blank; halted');
        retValue = null;
        return;
      }
      info = val.split( sp[0] );
      clog(gmkey + ' info=' + info);
      
      for(var i=0; i<info.length; i++){
        if( !isString(info[i]) ) continue;
        var recs = info[i].split('=');
        if( recs[0]==userID ){
          var rets = [userID], values = recs[1].split(sp[1]), vL=values.length;
          for(var idx=0; idx<vL; idx++){
            if( !isString(values[idx]) ) continue;
            rets.push(values[idx]);
          }
          retValue = rets;
          break;
        }
      }

      return retValue;
    })( getValue(KS + gmkey) );
  }
  function delValueForId(userID, gmkey){
    var ksg = KS+gmkey, tmp=[], info = getValue(ksg);
    info = info.split(';');
    for(var i=0; i<info.length; i++){
      if(info[i].split('=')[0]!=userID)
        tmp.push(info[i]);    
    }
    setValue(ksg, tmp.join(';'));
  }
  function delValue(key){
    var data=OPTIONS_BOX[key];
    try{
      return (!data ? null : GM_deleteValue(key));
    }catch(e){}
  }
  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;
  }
  function createTextEl(txt){
    return document.createTextNode(txt);
  }
  // play safe with Opera;
  //=== BROWSER DETECTION / ADVANCED SETTING
  //=============snipet-authored-by:GI-Joe==//
  function ApiBrowserCheck() {
    //delete GM_log; delete GM_getValue; delete GM_setValue; delete GM_deleteValue; delete GM_xmlhttpRequest; delete GM_openInTab; delete GM_registerMenuCommand;
    if(typeof(unsafeWindow)=='undefined') { unsafeWindow=window; }
    if(typeof(GM_log)=='undefined') { GM_log=function(msg) { try { unsafeWindow.console.log('GM_log: '+msg); } catch(e) {} }; }
    
    var needApiUpgrade=false;
    if(window.navigator.appName.match(/^opera/i) && typeof(window.opera)!='undefined') {
      needApiUpgrade=true; gvar.isOpera=true; GM_log=window.opera.postError; clog('Opera detected...',0);
    }
    if(typeof(GM_setValue)!='undefined') {
      var gsv; try { gsv=GM_setValue.toString(); } catch(e) { gsv='.staticArgs.FF4.0'; }
      if(gsv.indexOf('staticArgs')>0) {
        gvar.isGreaseMonkey=true; gvar.isFF4=false;
        clog('GreaseMonkey Api detected'+( (gvar.isFF4=gsv.indexOf('FF4.0')>0) ?' >= FF4':'' )+'...',0); 
      } // test GM_hitch
      else if(gsv.match(/not\s+supported/)) {
        needApiUpgrade=true; gvar.isBuggedChrome=true; clog('Bugged Chrome GM Api detected...',0);
      }
    } else { needApiUpgrade=true; clog('No GM Api detected...',0); }
    
    gvar.noCrossDomain = (gvar.isOpera || gvar.isBuggedChrome);
    if(needApiUpgrade) {
      //gvar.noCrossDomain = gvar.isBuggedChrome = 1;
      clog('Try to recreate needed GM Api...',0);
      //OPTIONS_BOX['FLASH_PLAYER_WMODE'][3]=2; OPTIONS_BOX['FLASH_PLAYER_WMODE_BCHAN'][3]=2; // Change Default wmode if there no greasemonkey installed
      var ws=null; try { ws=typeof(unsafeWindow.localStorage) } catch(e) { ws=null; } // Catch Security error
      if(ws=='object') {
        clog('Using localStorage for GM Api.',0);
        GM_getValue=function(name,defValue) { var value=unsafeWindow.localStorage.getItem(GMSTORAGE_PATH+name); if(value==null) { return defValue; } else { switch(value.substr(0,2)) { case 'S]': return value.substr(2); case 'N]': return parseInt(value.substr(2)); case 'B]': return value.substr(2)=='true'; } } return value; };
        GM_setValue=function(name,value) { switch (typeof(value)) { case 'string': unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'S]'+value); break; case 'number': if(value.toString().indexOf('.')<0) { unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'N]'+value); } break; case 'boolean': unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'B]'+value); break; } };
        GM_deleteValue=function(name) { unsafeWindow.localStorage.removeItem(GMSTORAGE_PATH+name); };
      } else if(!gvar.isOpera || typeof(GM_setValue)=='undefined') {
        clog('Using temporarilyStorage for GM Api.',0); gvar.temporarilyStorage=new Array();
        GM_getValue=function(name,defValue) { if(typeof(gvar.temporarilyStorage[GMSTORAGE_PATH+name])=='undefined') { return defValue; } else { return gvar.temporarilyStorage[GMSTORAGE_PATH+name]; } };
        GM_setValue=function(name,value) { switch (typeof(value)) { case "string": case "boolean": case "number": gvar.temporarilyStorage[GMSTORAGE_PATH+name]=value; } };
        GM_deleteValue=function(name) { delete gvar.temporarilyStorage[GMSTORAGE_PATH+name]; };
      }
      if(typeof(GM_openInTab)=='undefined') { GM_openInTab=function(url) { unsafeWindow.open(url,""); }; }
      if(typeof(GM_registerMenuCommand)=='undefined') { GM_registerMenuCommand=function(name,cmd) { GM_log("Notice: GM_registerMenuCommand is not supported."); }; } // Dummy
      if(!gvar.isOpera || typeof(GM_xmlhttpRequest)=='undefined') {
        clog('Using XMLHttpRequest for GM Api.',0);
        GM_xmlhttpRequest=function(obj) {
        var request=new XMLHttpRequest();
        request.onreadystatechange=function() { if(obj.onreadystatechange) { obj.onreadystatechange(request); }; if(request.readyState==4 && obj.onload) { obj.onload(request); } }
        request.onerror=function() { if(obj.onerror) { obj.onerror(request); } }
        try { request.open(obj.method,obj.url,true); } catch(e) { if(obj.onerror) { obj.onerror( {readyState:4,responseHeaders:'',responseText:'',responseXML:'',status:403,statusText:'Forbidden'} ); }; return; }
        if(obj.headers) { for(name in obj.headers) { request.setRequestHeader(name,obj.headers[name]); } }
        request.send(obj.data); return request;
      }; }
    } // end needApiUpgrade
    GM_getIntValue=function(name,defValue) { return parseInt(GM_getValue(name,defValue),10); };
  }
  // ----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);
  }
  function _clog(x){
    if(!gvar.__DEBUG__) return;
    console && console.log && console.log(x);
  }

  //----
  init()
})();
/* Mod By Idx. */