// 2009(c)Tetra\/unit
// 2010.06.06 modified
// written by Ohsako, Junichi
//


//  requestDiaryArchive(url)
//  当月以前の日記（ブログ）記事頭出し表示のHTMLを出力する拡張メソッド ※カスケード不可
//  arguments => url：記事頭出し表示のデータを取得するサーバサイドスクリプト（文字列）
//  return => 整形済みHTML文字列
//  delegation => makeDiaryArchive()：記事のHTML整形メソッド
//  dependent => $.ajax：Ajax通信オブジェクト（jQuery）
//
tetraunit.requestDiaryArchive =
function () {
  var _getHtml =                                                          // Ajax通信メソッド
  function (url) {
    var html;
    $.ajax({url: url,
        type: 'post',
        dataType: 'xml',
        async: false,
        complete: function (request) {                                    // HTMLを整形出力するメソッド呼出しのコールバック関数 
          html = tetraunit.makeDiaryArchive(request);
        }
      }
    );
    return html;
  };
  
  return function (url) {
    return _getHtml(url);
  }
}();



// makeDiaryArchive(response)
//  日記（ブログ）記事のデータをHTMLに整形する拡張メソッド ※カスケード不可
//  arguments => response：サーバから取得した記事データMXLオブジェクト（XMLオブジェクト）
//               url：記事執筆者のデータを取得するサーバサイドスクリプト（文字列）
//  return => 整形済みHTML文字列
//  delegation => xml2Obj()：XMLをレコードリストオブジェクトに変換するメソッド
//                requestAuthor()：記事執筆者表示のHTML出力メソッド
//
tetraunit.makeDiaryArchive =
function () {
  var _that, _thisyear = '';
  
  var _buildHtml =
  function (url) {
    var html = [], dDate;
    _that = tetraunit.xml2Obj(_that.responseXML);                                 // XMLをレコード単位の配列オブジェクトに変換
    if (_that.length) {                                                           // 有効なデータが存在するかを判定
      html.push('<h2 class="sectionHeader">以前の記事</h2><p class="backLink"><a class="goback" href="blog.html">最新記事へ</a></p>');
      for (var i = 0; i < _that.length; i++) {                                    // レコード数分の繰り返し（想定数は"１"）
        if (!_thisyear) {
          _thisyear = _that[i].year;
          html.push('<h3 class="yearHeader">' + _that[i].year + '年</h3><ul class="monthList">');
        } else
        if (_thisyear != _that[i].year) { 
          _thisyear = _that[i].year;
          html.push('</ul><h3 class="yearHeader">' + _that[i].year + '年</h3><ul class="monthList">');
        }
        html.push('<li class="monthLink"><a href="blog.html?ym=' + _that[i].year.toString() + _that[i].month.toString() +'">' + (_that[i].month * 1) + '月</a></li>');
      }
    }
    return html.join('');
  };

  return function (response) {
    _that = response;

    return _buildHtml();
  }
}();



//  requestDiarySearch(url, feild1, feild2, words, limitter)
//  日記（ブログ）を検索し記事頭出し表示のHTML出力などのメソッドをもつオブジェクトを出力する拡張メソッド ※カスケード不可
//  arguments => url：記事頭出し表示のデータを取得するサーバサイドスクリプト（文字列）
//  　　　　　　　　feild1：テーブル内の検索対象フィールドその１（文字列）
//  　　　　　　　　feild2：テーブル内の検索対象フィールドその２（文字列）
//  　　　　　　　　words： = 検索語（文字列）
//  　　　　　　　　limitter：1ページに表示する項目数（整数）
//  methods => _getXml()：DB検索結果のXMLオブジェクトを取得するメソッド
//  　　　　　　 _getHtml()：XMLオブジェクトからページ表示用HTMLを生成するメソッド
//  　　　　　　 _enablePaging()：表示ページに合わせてページングボタンの表示／非表示を設定するメソッド
//  　　　　　　 _attachMethod()：ページングボタンにページ更新メソッドを割り当てるメソッド
//  　　　　　　 arguments => adjuster：ページングのためのoffset値を変化させる増減値
//  　　　　　　　　　　　　　　 elemObj：検索結果リストの出力先エレメントオブジェクト
//  　　　　　　　　　　　　　　 prevBt：ページング操作（前ページへ）のためのエレメントオブジェクト
//  　　　　　　　　　　　　　　 nextBt：ページング操作（前ページへ）のためのエレメントオブジェクト
//  return => インスタンス
//  delegation => makeDiarySearch()：記事のHTML整形メソッド
//  dependent => $.ajax：Ajax通信オブジェクト（jQuery）
//
tetraunit.requestDiarySearch =
function () {
  var _that = {}, _response, _url, _feild1, _feild2, _words, _limitter, _offset = 0;
  
  var _getXml =                                                                                         // Ajax通信でXMLオブジェクトを取得するメソッド
  function () {
    $.ajax({url: _url,
        data: 'table=diary_tbl&key=ddate&field1=' + _feild1 + '&field2=' + _feild2 + '&words=' + _words,
        type: 'post',
        dataType: 'xml',
        async: false,
        complete: function (request) {                                                                  // HTMLを整形出力するメソッド呼出しのコールバック関数 
          _response = tetraunit.xml2Obj(request.responseXML);                                           // XMLをレコード単位の配列オブジェクトに変換
        }
      }
    );
  };
  
  var _getHtml =                                                                                        // ページングアジャスト値を与えてHTMLを生成するメソッド
  function (adjuster) {
    if (adjuster) {
      _offset = _offset + adjuster;
    }
    return tetraunit.makeDiarySearch(_response, _limitter, _offset)
  };
  
  var _enablePaging =                                                                                   // オフセット値によってページングボタンを表示／非表示するメソッド
  function (prevBt, nextBt) {
    if (_offset !== 0) {                                                                                // 最初のページでないなら[前ページ]ボタンを表示
      prevBt.style.display = 'block';
    } else {
      prevBt.style.display = 'none';
    }
    if (_limitter * (_offset + 1) < _response.length) {                                                 // 最後のページでなければ[次ページ]ボタンを表示
      nextBt.style.display = 'block';
    } else {
      nextBt.style.display = 'none';
    }
  };
  
  var _attachMethod =                                                                                   // 表示更新のための関数をボタンに割り当てるメソッド
  function (elemObj, prevBt, nextBt) {

    prevBt.onclick =                                                                                    // 前ページ表示関数
    function (prevBt, nextBt) {
      elemObj.innerHTML = _getHtml(-1);
      _enablePaging(prevBt, nextBt);
    };

    nextBt.onclick =                                                                                    // 次ページ表示関数
    function () {
      elemObj.innerHTML = _getHtml(1);
      _enablePaging(prevBt, nextBt);
    };
  };

  return function (url, feild1, feild2, words, limitter) {
    _url = url;
    _feild1 = feild1;
    _feild2 = feild2;
    _words = words;
    _limitter = limitter;
    _that.getXml = _getXml;
    _that.getHtml = _getHtml;
    _that.enablePaging = _enablePaging;
    _that.attachMethod = _attachMethod;

    return _that;                                                                                       // インスタンスを返す
  }
}();



// makeDiarySearch(response)
//  日記（ブログ）記事の検索結果データをHTMLに整形する拡張メソッド ※カスケード不可
//  arguments => response：サーバから取得した記事データMXLオブジェクト（XMLオブジェクト）
//               url：記事執筆者のデータを取得するサーバサイドスクリプト（文字列）
//  return => 整形済みHTML文字列
//  delegation => xml2Obj()：XMLをレコードリストオブジェクトに変換するメソッド
//                requestAuthor()：記事執筆者表示のHTML出力メソッド
//
tetraunit.makeDiarySearch =
function () {
  var _that;
  
  var _buildHtml =
  function (limitter, offset) {
// DUCATIローカルな処理
//    tu('#h2Text').firstChild.nodeValue = '検索結果';
//    tetraunit.modeButton.backgroundImage = 'url(../common/img/go2Archive.png)';
//    tu('#modeButton').firstChild.href = 'blog.html?arch';
//    tu('#modeButton').firstChild.firstChild.nodeValue = '過去の記事一覧';
//
    var html = [], dDate;
    if (_that.length) {                                                                                                 // 有効なデータが存在するかを判定
      html.push('<h2 class="sectionHeader">検索結果</h2><p class="backLink"><a class="goback" href="blog.html">最新記事へ</a></p>');
      html.push('<ul class="resultPager clearfix">');
      html.push('<li class="prevContainer"><a id="prevBt" class="pagerBt" href="javascript:">前ページ</a></li>');
      html.push('<li class="nextContainer"><a id="nextBt" class="pagerBt" href="javascript:">次ページ</a></li>');
      html.push('</ul><dl>');
      for (var i = limitter * offset; i < limitter * (offset + 1); i++) {                                               // レコード数分の繰り返し（想定数は"１"）
        if (i === _that.length) break;
        dDate = new Date(_that[i].ddate * 1000); 
        html.push('<a class="itemHeaderLink" href="blog.html?id=' + _that[i].diary_id + '"><dt class="searchedHeader">');
        html.push('<span class="searchedDdate">' + dDate.getFullYear() + '年');
        html.push(dDate.getMonth() + 1);
        html.push('月' + dDate.getDate());
        html.push('日（' + tetraunit.week[dDate.getDay()] + '）</span>');
        if (_that[i].title) {
          html.push(_that[i].title);
        }
        html.push('</dt><dd class="searchedBody">');
        if (_that[i].article) {
          var body = _that[i].article;
          body = body.replace(/\r\n/g, "\n");                             // 改行の削除
          body = body.replace(/\r/g, "\n");
          body = body.replace(/\n/g, '');
          body = body.replace(/\{\{\/a\}\}/g, '');                        // <a>エレメント表示データを削除
          body = body.replace(/\{\{a[^\}]*?\}\}/g, '');
          body = body.slice(0, 30);                                       // 本文の最初から、およそ60文字を切り出し
          html.push(body + '&nbsp;……</dd></dl></a>');
        } else {
          html.push('……</dd></dl></a>');
        }
      }
      html.push('<ul class="resultPager clearfix">');
      html.push('<li class="prevContainer"><a id="prevBtBottom" class="pagerBt" href="javascript:">前ページ</a></li>');
      html.push('<li class="nextContainer"><a id="nextBtBottom" class="pagerBt" href="javascript:">次ページ</a></li>');
      html.push('</ul>');
      return html.join('');
    }
  };

  return function (response, limitter, offset) {
    _that = response;

    return _buildHtml(limitter, offset);
  }
}();




