/* goo は EUC-JP 前提か…。結構速いのに、もったいない。*/

// _blog:
// {
//   _info:
//   {
//     _title: 'goo',
//     _icon: './_img/goo.png',
//     _more_url: 'http://blog.goo.ne.jp/search/search.php?status=select&tg=all&da=all&ts=all&dp=all&dc=10&st=score&MT='
//   },
//   _request:
//   {
//     _format: 'rss1.0',
//     _url: 'http://blog.goo.ne.jp/search/search.php?status=select&tg=all&dp=all&ts=all&da=all&dc=25&st=score&rss=1&MT='
//   }
// },

/* blogmap も EUC-JP 前提かよ。あーもったいない。*/

// _blog:
// {
//   _info:
//   {
//     _title: 'blogmap',
//     _icon: './_img/1470.png',
//     _more_url: 'http://1470.net/bm/search?q='
//   },
//   _request:
//   {
//     _format: 'rss1.0',
//     _url: 'http://1470.net/bm/search/rss?q='
//   }
// },

// _blog:
// {
//   _info:
//   {
//     _title: 'Feedster',
//     _icon: './_img/feedster.png',
//     _more_url: 'http://www.feedster.jp/search/type/html/lang/jp/sort/relevance/category/blog/'
//   },
//   _request:
//   {
//     _format: 'rss2.0',
//     _url: 'http://www.feedster.jp/search/type/rss/lang/jp/sort/relevance/category/blog/'
//   }
// },

// _blog:
// {
//   _info:
//   {
//     _title: 'Bulkfeeds',
//     _icon: './_img/bulkfeeds.png',
//     _more_url: 'http://bulkfeeds.net/app/search2?sort=score&q='
//   },
//   _request:
//   {
//     _format: 'rss1.0',
//     _url: 'http://bulkfeeds.net/app/search2.rdf?sort=score&q='
//   }
// },

// _blog:
// {
//   _info:
//   {
//     _title: 'gglBlog',
//     _icon: './_img/google.png',
//     _more_url: 'http://blogsearch.google.com/blogsearch?hl=ja&c2coff=1&lr=lang_ja&ie=UTF-8&num=10&safe=off&as_q='
//   },
//   _request:
//   {
//     _format: 'rss2.0',
//     _url: 'http://blogsearch.google.com/blogsearch_feeds?hl=ja&c2coff=1&lr=lang_ja&ie=UTF-8&num=10&safe=off&output=rss&as_q='
//   }
// },

// _bookmark:
// {
//   _info:
//   {
//     _title: 'del.icio.us',
//     _icon: './_img/del.icio.us.png',
//     _more_url: 'http://del.icio.us/tag/'
//   },
//   _request:
//   {
//     _format: 'rss1.0',
//     _url: 'http://del.icio.us/rss/tag/'
//   }
// }

// _bookmark:
// {
//   _info:
//   {
//     _title: 'Hatena',
//     _icon: './_img/hatena.png',
//     _more_url: 'http://b.hatena.ne.jp/search?page=1&word='
//   },
//   _request:
//   {
//     _format: 'rss1.0',
//     _url: 'http://b.hatena.ne.jp/search?mode=rss&page=1&word='
//   }
// },

// _bookmark:
// {
//   _info:
//   {
//     _title: 'Hatena',
//     _icon: './_img/hatena.png',
//     _more_url: 'http://b.hatena.ne.jp/keyword/'
//   },
//   _request:
//   {
//     _format: 'rss1.0',
//     _url: 'http://b.hatena.ne.jp/keyword/'
//   }
// },

// _web:
// {
//   _info:
//   {
//     _title: 'Y!web',
//     _icon: './_img/yahoo.png',
//     _more_url: 'http://search.yahoo.com/search?_adv_prop=web&ei=UTF-8&fl=1&vl=lang_ja&va='
// },
//   _request:
//   {
//     _format: 'rss2.0',
//     _url: 'http://api.search.yahoo.com/WebSearchService/rss/webSearch.xml?appid=yahoosearchwebrss&adult_ok=1&language=ja&query='
//   }
// },

// _web:
// {
//   _info:
//   {
//     _title: 'Yahoo!',
//     _icon: './_img/yahoo.png',
//     _more_url: 'http://search.yahoo.com/search?_adv_prop=web&ei=UTF-8&fr=sfp&fl=1&vl=lang_ja&va='
//   },
//   _request:
//   {
//     _format: 'rss2.0',
//     _url: 'http://api.search.yahoo.com/WebSearchService/rss/webSearch.xml?appid=yahoosearchwebrss&adult_ok=1&language=ja&query='
//   }
// },

// _web:
// {
//  _info:
//  {
//    _title: 'MSN',
//    _icon: './_img/msn.png',
//    _more_url: 'http://search.msn.com/results.aspx?q=language%3aja%20'
//  },
//  _request:
//  {
//    _format: 'rss2.0',
//    _url: 'http://search.msn.com/results.aspx?format=rss&q=language%3aja%20'
//  }
// },

// _image:
// {
//   _info:
//   {
//     _title: 'Y!image',
//     _icon: './_img/yahoo.png',
//     _more_url: 'http://images.search.yahoo.com/search/images?_adv_prop=web&ei=UTF-8&fl=1&vl=lang_ja&va='
//   },
//   _request:
//   {
//     _format: 'rss2.0',
//     _url: 'http://api.search.yahoo.com/ImageSearchService/rss/imageSearch.xml?appid=yahoosearchimagerss&adult_ok=1&query='
//   }
// },

// _video:
// {
//   _info:
//   {
//     _title: 'FlipClip',
//     _icon: './_img/flipclip.png',
//     _more_url: 'http://www.flipclip.net/clips/?q='
//   },
//   _request:
//   {
//     _format: 'rss2.0',
//     _url: 'http://www.flipclip.net/clips/?_accept=rss&q='
//   }
// },

// _video:
// {
//   _info:
//   {
//     _title: 'Y!video',
//     _icon: './_img/yahoo.png',
//     _more_url: 'http://video.search.yahoo.com/search/video?_adv_prop=web&ei=UTF-8&fl=1&vl=lang_ja&va='
//   },
//   _request:
//   {
//     _format: 'rss2.0',
//     _url: 'http://api.search.yahoo.com/VideoSearchService/rss/videoSearch.xml?appid=ysearchblog&adult_ok=1&query='
//   }
// },

// _product:
// {
//   _info:
//   {
//     _title: 'Amazon',
//     _icon: './_img/amazon.png',
//     _more_url: 'http://www.amazon.co.jp/gp/search/?url=search-alias%3Daps&field-keywords='
//   },
//   _request:
//   {
//     _format: 'rss2.0',
//     _url: 'http://k2works.sub.jp/amazon/aws?searchIndex=Blended&itemPage=1&keywords='
//   }
// }

// _product:
// {
//   _info:
//   {
//     _title: 'Bidders',
//     _icon: './_img/bidders.png',
//     _more_url: 'http://www.bidders.co.jp/dap/sv/list1?sort=end&srm=Y&spec_keyword='
//   },
//   _request:
//   {
//     _format: 'rss1.0',
//     _url: 'http://www.bidders.co.jp/dap/sv/xml?func=list1&sort=end&spec_keyword='
//   }
// }

// _product:
// {
//   _info:
//   {
//     _title: 'Kanshin',
//     _icon: './_img/kanshin.png',
//     _more_url: 'http://www.kanshin.com/keyword/?q='
//   },
//   _request:
//   {
//     _format: 'atom',
//     _url: 'http://api.kanshin.com/keyword/?q='
//   }
// }

var _dataSources =
  {

    _blog:
    {
      _info:
      {
        _title: 'gglBlog',
        _icon: './_img/google.png',
        _more_url: 'http://blogsearch.google.com/blogsearch?hl=ja&c2coff=1&lr=lang_ja&ie=UTF-8&num=10&safe=off&as_q='
      },
      _request:
      {
        _format: 'rss2.0',
        _url: 'http://blogsearch.google.com/blogsearch_feeds?hl=ja&c2coff=1&lr=lang_ja&ie=UTF-8&num=10&safe=off&output=rss&as_q='
      }
    },

    _web:
    {
      _info:
      {
        _title: 'Y!web',
        _icon: './_img/yahoo.png',
        _more_url: 'http://search.yahoo.com/search?_adv_prop=web&ei=UTF-8&fl=1&vl=lang_ja&va='
    },
      _request:
      {
        _format: 'rss2.0',
        _url: 'http://api.search.yahoo.com/WebSearchService/rss/webSearch.xml?appid=yahoosearchwebrss&adult_ok=1&language=ja&query='
      }
    },

    _image:
    {
      _info:
      {
        _title: 'Y!image',
        _icon: './_img/yahoo.png',
        _more_url: 'http://images.search.yahoo.com/search/images?_adv_prop=web&ei=UTF-8&fl=1&vl=lang_ja&va='
      },
      _request:
      {
        _format: 'rss2.0',
        _url: 'http://api.search.yahoo.com/ImageSearchService/rss/imageSearch.xml?appid=yahoosearchimagerss&adult_ok=1&query='
      }
    },

    _video:
    {
      _info:
      {
        _title: 'Y!video',
        _icon: './_img/yahoo.png',
        _more_url: 'http://video.search.yahoo.com/search/video?_adv_prop=web&ei=UTF-8&fl=1&vl=lang_ja&va='
      },
      _request:
      {
        _format: 'rss2.0',
        _url: 'http://api.search.yahoo.com/VideoSearchService/rss/videoSearch.xml?appid=ysearchblog&adult_ok=1&query='
      }
    },

    _product:
    {
      _info:
      {
        _title: 'Amazon',
        _icon: './_img/amazon.png',
        _more_url: 'http://www.amazon.co.jp/gp/search/?url=search-alias%3Daps&field-keywords='
      },
      _request:
      {
        _format: 'rss2.0',
        _url: 'http://k2works.sub.jp/amazon/aws?searchIndex=Blended&itemPage=1&keywords='
      }
    }

  };

var _results_template;
var _number_of_sources = 5; //_dataSources.length;
var _cache = {};
var _resizeGrip = {};
var _patternTag = new RegExp('<[^>]+>', 'g');
var _patternCDATA = new RegExp('(<!\\[CDATA\\[)?([^(\\]\\]>)]*)(\\]\\]>)?', '');
var _patternScript = new RegExp('<script[^>]+>[^(</script>)]*</script>', 'g');
var _patternNoScript = new RegExp('<noscript>(.*)</noscript>', 'g');

Event.observe(
              window,
              'load',
              function ()
              {
                HTML_AJAX.defaultServerUrl = './api/';
                HTML_AJAX.defaultEncoding = 'JSON';
                HTML_AJAX.onError = function(e) { doALERT(e); };

                _results_template = TrimPath.parseDOMTemplate('results_template');
              }
             );

function handleResult(_param)
{
  var _result, _info, _items, _description;

  _info = {
    label: _param._responses._label,
    feed_url: _param._requests._url + _param._requests._query,
    title: _dataSources[_param._responses._label]._info._title,
    icon: _dataSources[_param._responses._label]._info._icon,
    more_url: _dataSources[_param._responses._label]._info._more_url + _param._requests._query
  };

  _items = _param._responses._results;

  for (var i in _items)
    {
      _items[i].id = _param._responses._label + '_' + i;
      _items[i].keywords = Object.inspect($H(_param._responses._keywords[_items[i].link])).escapeHTML();

      _description = _items[i].description;

      if (_description)
        {
          // _description = _description.replace(_patternTag, '');
          // _description = (_description.match(_patternCDATA))[2];
          _description = _description.replace(_patternScript, '');
          _description = _description.replace(_patternNoScript, '$1');

          _items[i].description = _description;

          if (_items[i]['content:encoded'])
            {// content:encoded がある場合。

              _items[i].description_truncated = _items[i].description;
              _items[i].description = _items[i]['content:encoded'];

              _items[i].is_truncated = true;
            }
          else if (_description.stripTags().length > 400)
            {// description が長い場合。

              _items[i].description_truncated = _items[i].description.substring(0,1000) + '...';

              _items[i].is_truncated = true;
            }
          else
            {// それ以外。

              _items[i].description_truncated = _items[i].description;
              _items[i].description = '';

              _items[i].is_truncated = false;
            }
        }
    }

  _result = {info: _info, items: _items};

  // cache this results.
  _cache[_param._requests._query][_param._requests._label] = _result;

  showResult(_result);
  makeResult(_param._responses._label);

  doALERT(_param._responses._MESSAGE.ALERT);
}

function showResult(result)
{
  var label = result.info.label;

  $('results_place_holder' + label).style.display = 'none';
  $('results_place_holder' + label).innerHTML = _results_template.process(result);
  new Effect.Appear('results_place_holder' + label, {duration: 1.0, from: 0.0, to: 1.0});

  $('tab' + label).style.zIndex = $('column' + label).style.zIndex + 1;
}

function makeResult(label)
{
  var _tab, _item, _toggle_button;

  // タブを設定。
  _tab = document.getElementsByClassName('tab','column' + label);
  for (var j = 0; j < _tab.length; j++)
    {
      _tab[j].onclick = function() { focusColumn(this.title); };
      _tab[j].ondblclick = function() { unfocusColumn(); };
    }

  // make resize grip.
  _resizeGrip[label] = new JKL.Resizable( 'column' + label );
  _resizeGrip[label].setEast( 'grip' + label );

  // マウスエフェクトを設定
  _item = document.getElementsByClassName('item','column' + label);
  for (var j = 0; j < _item.length; j++)
    {
      _item[j].onmouseover = function() { this.className = 'item_focused'; };
      _item[j].onmouseout = function() { this.className = 'item'; };
    }

  // トグルを設定。
  _toggle_button = document.getElementsByClassName('toggle_button','column' + label);
  for (var j = 0; j < _toggle_button.length; j++)
    {
      var _item_id = _toggle_button[j].title;
      _toggle_button[j]._toggle_boxes = document.getElementsByClassName(_item_id + '_toggle_box','item' + _item_id);

      if (_toggle_button[j]._toggle_boxes)
        {
          _toggle_button[j].onclick = function()
          {
            for (var k = 0; k < this._toggle_boxes.length; k++)
              {
                Element.toggle(this._toggle_boxes[k]);
              }
          };
        }
    }
}

function focusColumn(label)
{
  var _full = '99';// %
  var _wide = '50';// %
  var _thin = Math.floor((_full - _wide)/( _number_of_sources - 1));// %

  for (var _label in _dataSources)
    {
      $('column' + _label).style.width = _thin + '%';
      _resizeGrip[_label].setEast( 'grip' + _label );
    }

  $('column' + label).style.width = _wide + '%';
  _resizeGrip[label].setEast( 'grip' + label );
}

function unfocusColumn()
{
  var _full = '99';// %
  var _even = Math.floor(_full / _number_of_sources);// %

  for (var _label in _dataSources)
    {
      $('column' + _label).style.width = _even + '%';
      _resizeGrip[_label].setEast( 'grip' + _label );
    }
}

function getResults(query)
{
  var query, query_encoded;
  var _param = {};

  if (query) { $('my_query-query').value = query; }
  else { query = $('my_query-query').value; }
  query_encoded = encodeURI(query);

  if (query)
    {
      for (var label in _dataSources)
        {
          _param._requests = _dataSources[label]._request;
          _param._requests._label = label;
          _param._requests._query = query_encoded;

          $('results_place_holder' + label).innerHTML = '<div id="loading' + label + '" class="loading"><img src="./_img/loading.gif" /></div>';

          HTML_AJAX.call('result', 'fetch', handleResult, _param);

          // initialize cache.
          _cache[query_encoded] = {};
          _cache[query_encoded][label] = [];
        }

      $('cache_place_holder').innerHTML +=
        '<li>"<a href="javascript:getResultsFromCache(\'' + query + '\')">' + query + '</a>" &gt; </li>';
      new Effect.Highlight('cache_place_holder', {duration: 3, startcolor: '#aabbaa', endcolor: '#e5e5e5'});

      highlightQuery(query);
    }
  else { return; }
}

function getResultsFromCache(query)
{
  var query, query_encoded, _result;

  $('my_query-query').focused = false;
  $('my_query-query').value = query;
  setLocationHash(query);
  // getCompletions(query);

  query_encoded = encodeURI(query);
  for (var label in _cache[query_encoded])
    {
      _result = _cache[query_encoded][label];
      showResult(_result);
      makeResult(label);
    }
}
