/**
 * total-search.js
 *      Update by JJWorkshop HIRO.  2006/11/06
 *
 * オリジナルソースは
 * ↓
 * yahoo-sitesearch.js
 *
 * Copyright (c) 2006 Kyo Nagashima <kyo@hail2u.net>
 * This library licensed under MIT license:
 * http://opensource.org/licenses/mit-license.php
 *
*/

// Yahoo! Search Configurations ---------

// Your application ID
var appid = 'jjworkshop-app';

// Your domain
var domain = 'jjworkshop.com';
var infStr  = '';

// Number of search results
var resultSize = 10;

// BLOG Search Configurations ---------

var blogSearchDat = '/xmls/search_data';


// -------------------------------------

var epUrl = 'http://api.search.yahoo.com/WebSearchService/V1/webSearch?';

function setCB()
{
  var r = $A(document.TotalFind.mode).find(function(v) {return v.checked;});
  if(r.value == 'ama') {
    document.TotalFind['genre'].disabled = false;
  }
  else	{
    document.TotalFind['genre'].disabled = true;
  }
}

function findHelp()
{
  $('results').style.height = 'auto';
  var buf = [
    '<div class="search_results"><div class="button"><a href="javascript:clearResults();" title="検索ヘルプをクリア" class="close">検索ヘルプをクリア</a></div>'
  ];
  buf.push([
    '<h3>■検索方法の説明</h3>',
    '<p class="help">検索文字フィールドに文字を入れて Enter を押すと指定の方法で検索します。',
    '<p class="help">ショートカットを割り当てているので、Windwos なら Alt+F で検索文字フィールドにカーソルが移動します。',
    '<p class="help">「BLOG内」を選択すると、本サイトのBLOGを全文検索します。<br />１度検索するとキャッシュするので２度目からは高速に検索できます。</p>',
    '<p class="help">「JJWorkshop内」を選択すると、本サイトを <a href="http://developer.yahoo.com/search/" target="_blank">Yahoo! Search Web Services</a> を利用して検索します。<br />インデックスされている情報だけなので、全てを検索できるわけではありません。</p>',
    '<p class="help">「Web全体」を選択すると、WEB全体から Yahoo! Search Web Services を利用して検索します。<br /></p>',
    '<p class="help">Yahoo! を利用した検索では一度に',
    resultSize,
    '件までの表示となるので、検索結果はページ処理になります。</p>',
    '<p class="help">「Amazon」を選択すると、Amazon Webservice を利用し、指定した Amazon のカテゴリから検索します。<br />（Safariブラウザでは、たぶん稼働しません）</p>',
    '<p class="help">Amazon を利用した検索では一度に10件までの検索となり、ページ送りは最大で20ページまでに制限しています。<br />それ以上の検索は直接 Amazon から検索して下さい。</p>',
    '<br /></div>'
  ].join(''));

  $('results').innerHTML = buf.join('');

}

function doSearch(spos) {

  $('results').style.height = 'auto';

  var r = $A(document.TotalFind.mode).find(function(v) {return v.checked;});

  if(r.value == 'web') {
    domain = '';
    infStr = 'Web全体から';
  }
  else if (r.value == 'jjw')	{
    domain = 'jjworkshop.com';
    infStr  = '本サイト内から';
  }
  else if (r.value == 'ama')	{
    domain = '';
    infStr  = 'Amazonから';
  }
  else	{
    domain = '';
    infStr  = '';
  }

  if (r.value == 'ama')	{
    // amazon-search.js.js をインクルードのこと
    do_search(1);
    return;
  }

  $('results').innerHTML = '<div class="search_results"><img class="wait" src="/img/load_data.gif" width="280" height="22"><p>' + infStr.escapeHTML() + ' <strong>' + $F('q').escapeHTML() + '</strong> を検索しています。</p></div>';

  if (r.value == 'blog')	{
    // blog_ajax_json_search.js をインクルードのこと
    blogAjaxJsonSearch(blogSearchDat,$F('q'));
    return;
  }

  // 次のページ情報を保存しておく
  $('p').value = spos + resultSize;

  // Yahoo Search の場合
  var url = epUrl + $H({
    appid:    appid,
    query:    $F('q'),
    start:    spos,
    results:  resultSize,
    format:   'html',
    language: 'ja',
    site:     domain,
    output:   'json'
  }).toQueryString();

  var oOdj = new onDemandJavaScript();
  oOdj.request(url, handleWebSearch, 'callback');
}

function handleWebSearch(r) {
  var results = $('results');
  var q = $F('q');
  var buf = [
    '<div class="search_results"><div class="button"><a href="javascript:clearResults();" title="検索結果をクリア" class="close">検索結果をクリア</a></div>'
  ];

  var nextpos = $F('p');

  if (r.Error) {
    buf.push([
      '<p>処理中にエラーが発生しました: <strong>',
      r.Error.Message,
      '</strong></p><br /></div>'
    ].join(''));
    results.innerHTML = buf.join('');
    return;
  }

  var ResultSet = r.ResultSet;

  if (ResultSet.totalResultsReturned === 0) {
    buf.push([
      '<p><strong>',
      q.escapeHTML(),
      '</strong> に該当するページが見つかりませんでした。</p><br /></div>'
    ].join(''));
    results.innerHTML = buf.join('');
    return;
  }

  buf.push([
    '<p>',
    infStr.escapeHTML(),
    '<strong> ',
    q.escapeHTML(),
    '</strong> を検索した結果 <strong>',
    ResultSet.totalResultsAvailable,
    '</strong> 件見つかりました。（',
    document.TotalFind.p.value-resultSize,
    '件目～',
    resultSize,
    '件表示）',
    '</p>'
  ].join(''));

  if (nextpos-(resultSize*2) > 0) {
    buf.push([
      '<span><a href="javascript:doSearch(',
      nextpos-(resultSize*2),
      ')">',
      '&#171; 前ページ表示</a>　　</span>'
    ].join(''));
  }
  
  if (ResultSet.totalResultsAvailable >= nextpos) {
    buf.push([
      '<span><a href="javascript:doSearch(',
      nextpos,
      ')">',
      '次ページ表示 &#187;</a></span>'
    ].join(''));
  }

  
  buf.push('<hr />');

  var cnt = 0;

  ResultSet.Result.each(function (item) {
    buf.push([
      '<h4>',
      nextpos-resultSize+cnt,
      '. <a href="',
      item.Url,
      '" target="_blank">',
      item.Title.replace(/^jjworkshop\.com - /, ''),
      '</a></h4><p class="summary">',
      hilightSummary(q, item.Summary),
      '</p><p class="info">',
      item.DisplayUrl,
      '</p><hr />'
    ].join(''));
    cnt++;
  });

  buf.push([
    '<span><a href="http://search.yahoo.com/search?ei=UTF-8&b=',
    1,
    '&p=',
    encodeURIComponent(q + ' site:' + domain),
    '" target="_blank">',
    infStr.escapeHTML(),
    ' <strong>',
    q.escapeHTML(),
    '</strong> を Yahoo! で検索表示 &#187;</a></span>'
  ].join(''));

  buf.push([
    '<p class="copyright">powered by <a href="http://www.yahoo.com/" target="_blank">Yahoo!.</a></p>'
  ].join(''));

  buf.push('</div>');
  results.innerHTML = buf.join('');
}

function hilightSummary(query, summary) {
  var words = query.split(" ");

  words.each(function (word) {
    var re = new RegExp(word, 'gi');
    var s = '<strong>' + word + '</strong>';
    summary = summary.replace(re, s);
  });

  return summary;
}

function clearResults() {
  $('results').innerHTML = '';
  $('results').style.height = '0px';
}
