/*

*/

(function(){
    var helpEntries = []; // ヘルプデータ
    var jsonErrorFlg = false; // json取得失敗の時にフラグが立つ

    // 初めに1回だけデータを取ってくる
    if (location.pathname == '/help/') {
        $.ajax({
          type: "GET",
          url: "/help/etc/entries.json",
          data: {},
          dataType: "json",
          error: function (msg) {
              jsonErrorFlg = true;
          },
          success: function (obj) {
              helpEntries = obj.entries;
              $.map(helpEntries, function(entry, i) { // 全てのエントリーについて検索
                  entry.body = entry.body.replace(/\n|\t/g,''); // \n と \t が文字を消すなどの悪さするのでなくす
                  var match = entry.category.match(/\<([0-9]{2})\>(.*)]]/); // カテゴリ名とカテゴリのclassIDを作る
                  if (match != null) {
                      entry.categoryClassId = match[1]; // 00 ～ 04
                      entry.category = match[2]; // カテゴリ名
                  }
              });
          }
        });
    }

    var searchForHelp = window.searchForHelp = function(keywords) {
        return new searchForHelp.prototype.run(keywords);
    }
    searchForHelp.prototype = {
      run: function(keywords) {
          // ナビの出力
          this.outputNav({
              keywords: keywords
            });

          if (helpEntries.length == 0) {
              var self = this;
              setTimeout( function(){ self.run(keywords) } ,100);
              return;
          }

          keywords = keywords.replace(/(?:\s|　)+$/,'').split(/(?:\s|　)+/); // 空白で区切る


          var results = $.extend([], helpEntries);
          results = $.map(results, function(entry, i) {  // 全てのエントリーについて検索
              var hitCount = 0; // すべてのキーワードがヒットするか？
              var index = 0; // 最初のキーワードの body 内の位置
              $.each(keywords, function(j, keyword) { // キーワード全部なめる
                  keyword = keyword.toLowerCase();        // 大文字小文字の区別をなくす
                  if (
                      (index = entry.body.toLowerCase().indexOf(keyword)) >= 0 ||
                      entry.title.toLowerCase().indexOf(keyword) >= 0 ||
                      entry.category.toLowerCase().indexOf(keyword) >= 0 ||
                      entry.tag.toLowerCase().indexOf(keyword) >= 0
                      ) { // titleやbodyの一つでも検索文字がヒットすれば
                      if ( (! entry.bodyIndex) && (index > 0) ) { // まだbody内にindexがない、かつ、body内にキーワードがある時
                          entry.bodyIndex = index;
                      }
                      hitCount++;
                  }
                  else { //キーワードがエントリのどこにもなかった時点でeachを抜ける
                      return;
                  }
              });

              if (hitCount == keywords.length) return entry; // 全てのキーワードにヒットしたエントリだけ返す
          });

          // 出力
          this.outputResult({
              entries: results,
              keywords: keywords
          });

      },
        
      highlight: function(args) {
          var text = args.text; // 切り取って色付けたいテキスト
          var index = args.index; // 切り取るindex
          var keywords = args.keywords;

          var adjust_start = 20; // 概要のスタート位置の調整
          var start = 0; // 概要のスタート位置
          var range = 128; // 概要の抜き出す量

          var start_tag = '<em class="searchWord">', end_tag = '</em>'; // ハイライト用のタグ

          
          var regs = [];
          $.each(keywords, function() {  // 検索文字を正規表現パターンの配列にする thisは一つ一つの要素
              regs.push(new RegExp('(' + this + ')','gi'));
          });

          
          if (index && (index > adjust_start)) { // body 内にキーワードがあり、先頭近くなら先頭から表示する
              start = index - adjust_start;
          }
          text = text.substr( start, range);
          $.each(keywords, function(j, keyword) { // 検索文字全部なめて色付け
              if (text.replace) {  // 空のエントリーは飛ばす
                  text = text.replace(regs[j], start_tag + "$1" + end_tag);
              }
          });

          return text;
      },

      outputNav: function(args) {
          var keywords = args.keywords;

          if (jsonErrorFlg) {
              $('#mainHelpList')
                .empty()
                  .html('<p class="none">システムエラーが発生しました。リロードしても解決しない場合はお問い合わせください。</p>');
              return null;
          }

          $('#mainHelp > h2').text('「' + keywords + '」での検索結果'); // h2 の置き換え
          $('.footpath') // ナビの置き換え
            .html('			<span class="dispNone">現在位置：</span>			<span><a href="/">トップ</a> &gt;</span>			<span><a href="/help/">ヘルプ一覧</a> &gt;</span>')
              .append($('<span/>'))
                .find('> span:last-child')
                  .append($('<strong/>'))
                    .find('> strong:last-child')
                      .text(' 「'+ keywords + '」での検索結果');

          $('#mainHelpList')
            .empty()
              .text('検索中...');
          
      },
        
      outputResult: function(args) {
          var entries = args.entries;
          var keywords = args.keywords;

          $('#mainHelpList')
            .empty();
          
          if (entries.length == 0) {
              $('<p/>')
                .addClass('none')
                  .text('キーワード「' + keywords + '」を含むヘルプはありません。') // 検索結果ゼロの表示
                    .appendTo($('#mainHelpList'));

          }
          else {
              var self = this;
              $.each(entries, function(i, result) { // 検索結果エントリー全てを出力
                  $('<dl/>').addClass('helpCategory' + result.categoryClassId)
                    .append($('<dt/>').text(result.category))
                      .append($('<dd/>').append('<a href="' + result.link + '">' + result.title + '</a>'))
                        .append($('<dd/>').addClass('entryBody')
                                .append('<p>' + self.highlight({
                                  text: result.body,
                                  index: result.bodyIndex,
                                  keywords: keywords
                                }) + '</p>')
                                .append('<p class="more"><a href="' + result.link + '">続きを読む</a></p>')
                                )
                          .appendTo($('#mainHelpList'));
              });
          }
          return entries;
      }
    }

    searchForHelp.prototype.run.prototype = searchForHelp.prototype; // init の new 時に a.prototypeを設定する http://nanto.asablo.jp/blog/2005/10/24/118564


})()



// DOM構築後に「検索」ボタンにsearch関数をセット
$(function(){

    // submit で飛ばないように
    $("form").submit(function(){
        var keyword = $("#searchTxt").val();
        if (keyword && (! keyword.match(/^(?:\s|　)*$/))) {
            location.hash = '#search=' + encodeURIComponent(keyword);
            if (location.pathname == '/help/') { // /help/で検索されたら実行
                searchForHelp(keyword);
            }
            else { // /help/...で検索されたら/help/へリダイレクト
                location.replace('/help/' + location.hash);
            }
        }
        return false;
    });

    // ページに戻ってきた時に検索結果を再度表示する
    if ( location.hash.match(/^#search=(.*)/) ) {
        var query = decodeURIComponent(RegExp.$1);
        $("#searchTxt").val(query);
        searchForHelp(query);
    }
});

