Greasy Fork is available in English.

Kaskus Mobile Quick Reply

Provide Quick Reply on Kaskus Mobile

// ==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. */