var CONFIG = CONFIG || {};

/**
 * 設定
 *
 * @param data
 */
function configure(data) {
  var dataType;

  // データ種別をセット
  dataType = _.get(data, 'data-type', '');
  if (!! dataType) {
    CONFIG.DATA_TYPE = dataType.replace(/\s/g, '_').toLowerCase();
  }
}

/**
 * localStorageが使用できるか
 */
function localStorageEnabled() {
  var ua = navigator.userAgent;

  // Microsoft Edge の場合 localStorage を使用しない
  if (ua.indexOf('Edge') !== -1) {
    return false;
  }

  return window.localStorage;
}

var DB = {};

//Chrome , Firefox
if (localStorageEnabled()) {
  DB = {
    /**
     * キーにプレフィックスを追加
     *
     * @param key
     * @returns {*}
     * @private
     */
    _makeKey: function(key) {
      if (!! _.get(CONFIG, 'DATA_TYPE')) {
        key = _.get(CONFIG, 'DATA_TYPE') + '_' + key;
      }

      return key;
    },

    set: function(key, obj) {
      key = DB._makeKey(key);

      localStorage.setItem(key, JSON.stringify(obj));
    },

    get: function(key) {
      key = DB._makeKey(key);

      if (localStorage.getItem(key) != undefined) {
        return JSON.parse(localStorage.getItem(key));
      }
      else {
        return null;
      }
    },

    remove: function(key) {
      key = DB._makeKey(key);

      localStorage.removeItem(key);
    },

    bulk_set: function(key) {
      this.set("support_search_tab", key.tab);
      this.set("support_search_models_ds", key.models.ds);
      this.set("support_search_models_mn", key.models.mn);
    },

    bulk_get: function() {
      return {
        search: {
          tab: this.get('support_search_tab'),
          models: {
            ds: this.get('support_search_models_ds'),
            mn: this.get('support_search_models_mn')
          }
        }
      };
    }
  };
}
else { //IE
  DB = {
    /**
     * キーにプレフィックスを追加
     *
     * @param key
     * @returns {*}
     * @private
     */
    _makeKey: function(key) {
      if (!! _.get(CONFIG, 'DATA_TYPE')) {
        key = _.get(CONFIG, 'DATA_TYPE') + '_' + key;
      }

      return key;
    },

    set: function(key, obj) {
      key = DB._makeKey(key);

      $.cookie(key, this.compress(JSON.stringify(obj)), {expires: 10800, path: '/'});
    },

    get: function(key) {
      key = DB._makeKey(key);

      if($.cookie(key) != undefined) {
          return JSON.parse(this.uncompress($.cookie(key)));
      }
      else {
      	return ;
      }
    },

    remove: function(key) {
      key = DB._makeKey(key);

      $.removeCookie(key);
    },

    bulk_set: function(key) {
      this.set("support_search_tab", key.tab);
      this.set("support_search_models_ds", key.models.ds);
      this.set("support_search_models_mn", key.models.mn);
    },

    bulk_get: function() {
      return {
        search: {
          tab: this.get('support_search_tab'),
          models: {
            ds: this.get('support_search_models_ds'),
            mn: this.get('support_search_models_mn')
          }
        }
      };
    },

    compress: function(str) {
          //utf8変換
          var data = utf16to8(str);

          //圧縮
          var out_stream = ZLIB.deflateInit({level:9});
          var encoding_text = out_stream.deflate(data);

          //base64encode
          encoding_text = base64encode(encoding_text);

          return encoding_text;
    },

    uncompress: function(str) {
          //base64decode
          decode_text = base64decode(str);

          //展開
          var in_stream = ZLIB.inflateInit();
          var decode_text = in_stream.inflate(decode_text);

          //utf16変換
          return utf8to16(decode_text);
    }
  };
}

/**
 * 全角を半角にするメソッド
 * @param {string} str 対象文字列
 * @returns {*}  対象文字列を半角に変更した文字
 */
function zenkakuToHankaku(str) {
  var regex = /[Ａ-Ｚａ-ｚ０-９！＂＃＄％＆＇（）＊＋，－．／：；＜＝＞？＠［＼］＾＿｀｛｜｝]/g;

  // 全角を半角の文字に置換
  str = str.replace(regex, function(s) {
    return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
  })
    .replace(/[‐－―]/g, '-') // ハイフンなど
    .replace(/[～〜]/g, '~')   // チルダ
    .replace(/　/g, ' ');      // スペース

  return str;
}

/**
 * CSSのコピー
 *
 * @param $copyTo
 * @param $copyFrom
 * @constructor
 */
function StyleCopy($copyTo, $copyFrom){
  $copyTo.css("width", $copyFrom.css("width"));
  $copyTo.css("height", $copyFrom.css("height"));

  $copyTo.css("padding-top", $copyFrom.css("padding-top"));
  $copyTo.css("padding-left", $copyFrom.css("padding-left"));
  $copyTo.css("padding-bottom", $copyFrom.css("padding-bottom"));
  $copyTo.css("padding-right", $copyFrom.css("padding-right"));

  $copyTo.css("background", $copyFrom.css("background"));
  $copyTo.css("background-color", $copyFrom.css("background-color"));
  $copyTo.css("vertical-align", $copyFrom.css("vertical-align"));

  $copyTo.css("border-top-width", $copyFrom.css("border-top-width"));
  $copyTo.css("border-top-color", $copyFrom.css("border-top-color"));
  $copyTo.css("border-top-style", $copyFrom.css("border-top-style"));

  $copyTo.css("border-left-width", $copyFrom.css("border-left-width"));
  $copyTo.css("border-left-color", $copyFrom.css("border-left-color"));
  $copyTo.css("border-left-style", $copyFrom.css("border-left-style"));

  $copyTo.css("border-right-width", $copyFrom.css("border-right-width"));
  $copyTo.css("border-right-color", $copyFrom.css("border-right-color"));
  $copyTo.css("border-right-style", $copyFrom.css("border-right-style"));

  $copyTo.css("border-bottom-width", $copyFrom.css("border-bottom-width"));
  $copyTo.css("border-bottom-color", $copyFrom.css("border-bottom-color"));
  $copyTo.css("border-bottom-style", $copyFrom.css("border-bottom-style"));
}

/**
 * TABLE の見出しを固定する
 *
 * @param {string} selector
 */
function fixTableThead (selector) {
  var $table = $(selector);              // テーブルの要素を取得
  var $thead = $table.children('thead'); // thead取得
  var toffset = $table.offset();         // テーブルの位置情報取得

  // 存在しない場合は、theadのクローンを作成
  var $clone = $thead.clone(true);
  // idをclonetableとする
  $clone.attr('id', 'clonetable');
  // body部に要素を追加
  $clone.appendTo('body');
  // theadのCSSをコピーする
  StyleCopy($clone, $thead);
  // theadの子要素(tr)分ループさせる
  for (var i = 0; i < $thead.children("tr").length; i++) {
    // i番目のtrを取得
    var $theadtr = $thead.children('tr').eq(i);
    var $clonetr = $clone.children('tr').eq(i);
    // trの子要素(th)分ループさせる
    for (var j = 0; j < $theadtr.eq(i).children("th").length; j++) {
      // j番目のthを取得
      var $theadth = $theadtr.eq(i).children('th').eq(j);
      var $cloneth = $clonetr.eq(i).children('th').eq(j);
      // thのCSSをコピーする
      StyleCopy($cloneth, $theadth);
    }
  }

  // コピーしたtheadの表示形式をtableに変更
  $clone.css('display', 'table');
  // positionをブラウザに対し絶対値とする
  $clone.css('position', 'fixed');
  $clone.css('border-collapse', 'collapse');
  // 折り返しの強制を指定
  $clone.css('table-layout', 'fixed');
  $clone.css('word-wrap', 'break-word');
  // positionの位置を設定(left = 元のテーブルのleftとする)
  $clone.css('left', toffset.left - $(window).scrollLeft());
  // positionの位置を設定(topをブラウザの一番上とする)
  $clone.css('top', toffset.top);
  // 表示順番を一番優先させる
  $clone.css('z-index', 99);

  // thead の left を window 幅の変更と同期
  $(window).on('resize render', function () {
    $clone.css('left', $(selector).offset().left);

    // IE で幅がずれる場合があるので調整
    var $th = $table.find('th');
    $clone.find('th').each(function (i, el) {
      $(el).width($th.eq(i).width());
    });
  });
}
