/* grokSetting: grokの挙動を設定するオブジェクト
*    targetTextMax: int(解析対象テキストの上限も字数)
*    swicLimit: float(grokの使用割合)
*    interval: int(広告変数監視間隔)
*    tryMax: int(広告変数監視回数上限)
*/
var grokSetting = {
  targetTextMax: 200,
  swichLimit: 1.0,
  interval: 70,
  tryMax: 40,
  grokHost: 'grok.kizasi.jp/fc2',
  ovrHost: 'cm.jp.gmo.overture.com'
};


/* zSr: 広告取得用グローバル変数 */
var zSr = [];


/* grokUtil: ユーティリィティ関数群
*    spaceStrip: function(){文字列のストリップ関数}
*    plainText: function(){htmlからテキストを抽出する関数}
*    getElementsByClassName: function(){class名からdom要素のリストを取得する関数}
*    addListener: function(){ハンドラ追加関数}
*    kishEncode: function(){kishによる文字列圧縮関数}
*/
var grokUtil = {
  spaceStrip: function(argValue){
    return String(argValue).replace(/^[ \s]*/gim, '').replace(/[ \s]*$/gim, '');
  },
  plainText: (function(){
    if (document.documentElement.textContent) {
      return function(elm){
        return this.spaceStrip(elm.textContent);
      }
    }else{
      return function(elm){
        return this.spaceStrip(elm.innerText);
      }
    }
  })(),
  getElementsByClassName: function(className) {
    var children = document.getElementsByTagName('*') || document.all;
    var elements = new Array();
    for (var i = 0; i < children.length; i++) {
      var child = children[i];
      var classNames = child.className.split(' ');
      for (var j = 0; j < classNames.length; j++) {
        if (classNames[j] == className) {
          elements.push(child);
          break;
        }
      }
    }
    return elements;
  },
  addListener: (function() {
    if ( window.addEventListener ) {
      return function(el, type, fn) {
        el.addEventListener(type, fn, false);
      };
    } else if ( window.attachEvent ) {
      return function(el, type, fn) {
        var f = function() {
          fn.call(el, window.event);
        };
        el.attachEvent('on'+type, f);
      };
    } else {
      return function(el, type, fn) {
        element['on'+type] = fn;
      }
    }
  })(),
  kishEncode: function(targetStr) {
    if (targetStr == '') {
      return '';
    }
    var encstr = 'a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|0|1|2|3|4|5|6|7|8|9|(|)'.split('|');
    var bitcnt = 0;
    var rest = 0;
    var result = '';
    for (var i = 0; i < targetStr.length; i++) {
      chrcode = targetStr.charCodeAt(i);
      rest <<= 16;
      rest |= chrcode;
      bitcnt += 16;
      while (bitcnt >= 6) {
        result += encstr[rest >> (bitcnt - 6)];
        rest &= (1 << (bitcnt - 6)) - 1;
        bitcnt -= 6;
      }
    }
    if(bitcnt){
      result += encstr[rest << (6 - bitcnt)];
    }
    return result;
  }
};


/* _grok: grokオブジェクト
*    zSr: Array(広告データ)
*    grokData: Array(grokデータ)
*    timer: 広告取得用タイマー変数
*    logicType: str(ロジックタイプ)
*    init: function(){初期化関数}
*    getAd: function(){ロジックタイプに応じた広告取得関数}
*    grokAd: function(){grokによる広告取得関数}
*    ovrAd: function(){エディトリアルctxtIdによる広告取得関数}
*    wrapOvrAd: function(){grokAPIのコールバック関数}
*    dispAds: function(){広告表示関数関数}
*    main: function(){メインルーチン}
*/
var _grok = function(){};
_grok.prototype.targetText = '';
_grok.prototype.zSr = [];
_grok.prototype.grokData = {};
_grok.prototype.grokSrc = '';
_grok.prototype.ovrSrc = '';
_grok.prototype.timer = null;
_grok.prototype.tryCount = 0;
_grok.prototype.logicType = 'grok';
_grok.prototype.init = function(){
  document.getElementById(grokCustom.adAreaId).style.display = 'none';
  zSr = [];
  this.targetText = '';
  this.zSr = [];
  this.grokData = {};
  this.grokSrc = '';
  this.ovrSrc = '';
  try{
    clearInterval(this.timer);
  }finally{
    this.timer = null;
  }
  this.tryCount = 0;
  if (Math.random() <= grokSetting.swichLimit) {
    this.logicType = 'grok';
  }else{
    this.logicType = 'ovr';
  }
};
_grok.prototype.getAd = function(){
  if (this.logicType != 'ovr'){
    this.grokAd();
  }else{
    this.ovrAd();
  }
};
_grok.prototype.grokAd = function(){
  var targetText = grokCustom.getTargetText();
  this.targetText = targetText.substring(0, Math.min(grokSetting.targetTextMax, targetText.length));
  var kishText = grokUtil.kishEncode(this.targetText);
  this.grokSrc = 'http://' + grokSetting.grokHost + '/grok.py/?t=' + kishText;
  this.grokSrc += '&c=' + grokCustom.codec;
  this.grokSrc += '&cb_func=GROK.wrapOvrAd';
  var scriptObj = document.createElement('script');
  scriptObj.type = 'text/javascript';
  scriptObj.charset = grokCustom.srcCodec;
  scriptObj.src = this.grokSrc;
  document.body.appendChild(scriptObj);
};
_grok.prototype.ovrAd = function(){
  var ctxtId = grokCustom.defaultCtxtId[Math.floor(Math.random() * grokCustom.defaultCtxtId.length)];
  this.ovrSrc = 'http://' + grokSetting.ovrHost + '/js_flat_1_0/';
  this.ovrSrc += '?config=' + grokCustom.defaultConfig;
  this.ovrSrc += '&source=' + grokCustom.defaultSource;
  this.ovrSrc += '&mkt=jp&ctxtId=' + ctxtId;
  this.ovrSrc += '&keywordCharEnc=utf8';
  this.ovrSrc += '&outputCharEnc=' + grokCustom.codec;
  this.ovrSrc += '&type=kz&maxCount=' + grokCustom.adMax;
  this.ovrSrc += '&ctxtCat=' + grokCustom.defaultCat[Math.floor(Math.random() * grokCustom.defaultCat.length)];
  var scriptObj = document.createElement('script');
  scriptObj.type = 'text/javascript';
  scriptObj.charset = grokCustom.SrcCodec;
  scriptObj.src = this.ovrSrc;
  document.body.appendChild(scriptObj);
  this.timer = setInterval('GROK.dispAds()', grokSetting.interval);
};
_grok.prototype.wrapOvrAd = function(data){
  this.grokData = data;
  if (this.grokData.words.ng.length == 0) {
    var cat = this.grokData.ctxtId;
    var keyQuery = '';
    var keys = [];
    for (var i = 0; i < this.grokData.words.key.length; i++) {
      keys.push(encodeURIComponent(this.grokData.words.key[i]));
    }
    if (0 < keys.length) {
      keyQuery ='&ctxtKeywords=' + keys.join(',');
    }
    this.ovrSrc = 'http://' + grokSetting.ovrHost + '/js_flat_1_0/';
    this.ovrSrc += '?config=' + grokCustom.grokConfig;
    this.ovrSrc += '&source=' + grokCustom.grokSource;
    this.ovrSrc += '&mkt=jp';
    this.ovrSrc += '&ctxtId=' + cat;
    this.ovrSrc += keyQuery;
    this.ovrSrc += '&keywordCharEnc=utf8';
    this.ovrSrc += '&outputCharEnc=' + grokCustom.codec;
    this.ovrSrc += '&type=kz&maxCount=' + grokCustom.adMax;
    this.ovrSrc += '&ctxtCat=' + grokCustom.defaultCat[Math.floor(Math.random() * grokCustom.defaultCat.length)];
    var scriptObj = document.createElement('script');
    scriptObj.type = 'text/javascript';
    scriptObj.charset = grokCustom.srcCodec;
    scriptObj.src = this.ovrSrc;
    document.body.appendChild(scriptObj);
    this.timer = setInterval('GROK.dispAds()', grokSetting.interval);
  }else{
    grokCustom.ngAds();
  }
};
_grok.prototype.dispAds = function(){
  if(this.tryCount > grokSetting.tryMax){
    clearInterval(this.timer);
    this.timer = null;
    grokCustom.adTimeOut();
  } else if(zSr.length > 0){
    this.zSr = zSr;
    clearInterval(this.timer);
    this.timer = null;
    grokCustom.showAds(this.zSr);
  }else{
    this.tryCount += 1;
  }
};
_grok.prototype.main = function(){
  this.init();
  this.getAd();
};


/* windowのloadハンドラにGROKを追加 */
var GROK = new _grok;
grokUtil.addListener(window, 'load', function (){GROK.main();});
