/*
File  : blog_ajax_json_search.js
site  : http://java.cocolog-nifty.com/
author: naoyuki
year  : 2006
この作品は、クリエイティブ・コモンズの帰属-同一条件許諾 2.1 日本ライセンスの下でライセンスされています。この使用許諾条件を見るには、http://creativecommons.org/licenses/by-sa/2.1/jp/をチェックするか、クリエイティブ･コモンズに郵便にてお問い合わせください。住所は：559 Nathan Abbott Way, Stanford, California 94305, USA です。
*/

/*
[memo]
http://www.dakiny.com/archives/movable-type/movable_typeajyaxmt/index.php
本バージョンはDakiny氏の上記エントリーで公開されたバージョンにさらに改変を加えたものです。本バージョンに関する解説は下記です。
http://hyper-text.org/archives/2007/10/ajax_search_mt.shtml
*/

var is_loaded=false;var backnumber_url_list;var entries;var search_keyword;var result_content;var timerId;load_center_id();function load_center_id(){var center=document.getElementById('center');if(center){ligting_search_keyword(center);}else{window.setTimeout('load_center_id()',5000);}}
function ligting_search_keyword(center){var args=getHashArgs();var searched_keyword=args.search_word;if(searched_keyword){searched_keyword=searched_keyword.replace(/([\/\\\.\*\+\?\|\(\)\[\]\{\}\$\^])/g,"\\$1");searched_keyword=searched_keyword.replace(/( +|　+)/,' ');searched_keyword=searched_keyword.replace(/( |　)$/,'');var keywords=searched_keyword.split(/ |　/);var h3=center.getElementsByTagName('h3');h3[0].innerHTML=highlight(h3[0].innerHTML,keywords);var div=center.getElementsByTagName('div');for(var i=0;i<div.length;i++){if(div[i].className=='entry-body-text'||div[i].className=='comment-content'){div[i].innerHTML=highlight(div[i].innerHTML,keywords);}}}}
function getHashArgs(){var args=new Object();var query=location.href.replace(/.*?#/,"");query=decodeURIComponent(query);var pairs=query.split("&");for(var i=0;i<pairs.length;i++){var pos=pairs[i].indexOf('=');if(pos==-1)continue;var argname=pairs[i].substring(0,pos);var value=pairs[i].substring(pos+1);args[argname]=value;}
return args;}
function blogAjaxJsonSearch(archive_file_path,text){search_keyword=text;var div_tag=document.getElementsByTagName('div');for(var i=0;i<div_tag.length;i++){if(div_tag[i].className=='blog'){result_content=div_tag[i];}if(div_tag[i].className=='blog hfeed'){result_content=div_tag[i];}}
result_content.innerHTML='<img class="searching" src="/img/search/loader.gif" width="16" height="16" alt="Searching" /> Searching';added_period(result_content);if(is_loaded){search();}else{new Ajax.Request(archive_file_path,{method:'get',onComplete:function(request){parse_archive_data(request);}});}}
function added_period(content){if(!is_loaded){timerId=setTimeout("added_period()",50);}}
function parse_archive_data(request){var data_string=request.responseText;data_string=data_string.replace(new RegExp('<.*?>',"i"),'')
entries=eval(data_string);search();}
function show_all_backnumbers(){var text='<ol type=1 start=1 style="text-align:left;">';for(var i=0;i<entries.length-1;i++){text+='<li><a href="'+entries[i].link+'">'+entries[i].title+'</a></li>';}
text+='</ol>';document.getElementById('center').innerHTML=text;}
function search(){var result_data=new Array();search_keyword=search_keyword.replace(/([\/\\\.\*\+\?\|\(\)\[\]\{\}\$\^])/g,"\\$1");search_keyword=search_keyword.replace(/( +|　+)/,' ');search_keyword=search_keyword.replace(/( |　)$/,'');var keywords=search_keyword.split(/ |　/);var key=new Array();for(var i=0;i<keywords.length;i++){key[key.length]=new RegExp(keywords[i],"i");}
for(var i=0;i<entries.length-1;i++){var is_match=true;for(var j=0;j<key.length;j++){var res_body=key[j].exec(entries[i].body);var res_title=key[j].exec(entries[i].title);if(!res_body&&!res_title){is_match=false;}}
if(is_match){result_data[result_data.length]=entries[i];}}
var result_html='';if(result_data.length==0){result_html=build_no_result_html(result_data,keywords);}if(keywords==''){result_html=build_no_keyword_html(result_data,keywords);}else{result_html=build_search_result_html(result_data,keywords);}
var div=window.document.getElementsByTagName('div');is_loaded=true;clearTimeout(timerId);result_content.innerHTML=result_html;}
function build_search_result_html(result_data,keywords){var html='<div class="search_section"><h2>Search result</h2><h3>「'+search_keyword+'」の検索結果（'+result_data.length+' 件）</h3><dl>';for(var i=0;i<result_data.length;i++){html+='<dt><a href="'+result_data[i].link+'" title="'+result_data[i].title+'">'+highlight(result_data[i].title,keywords)+'</a></dt><dd>'+highlight(trunc(result_data[i].body,keywords[0]),keywords)+'</dd>';}
html+='</dl></div><p class="search_back"><a href="javascript:void(0);" title="元のページに戻る" onclick="location.reload(true); return false;" onkeypress="location.reload(true); return false;">元のページに戻る</a></p>';return html;}
function build_no_result_html(result_data,keywords){var html='<div class="search_section"><h2>Search result</h2><h3>「'+search_keyword+'」の検索結果（0 件）</h3><p>該当するエントリーはありませんでした。</p></div>';html+='<p class="search_back"><a href="javascript:void(0);" title="元のページに戻る" onclick="location.reload(true); return false;" onkeypress="location.reload(true); return false;">元のページに戻る</a></p>';return html;}
function build_no_keyword_html(result_data,keywords){var html='<div class="search_section"><h2>Search result</h2><h3>検索キーワード未入力</h3><p>検索キーワードが入力されていません。キーワードを指定してください。</p></div>';html+='<p class="search_back"><a href="javascript:void(0);" title="元のページに戻る" onclick="location.reload(true); return false;" onkeypress="location.reload(true); return false;">元のページに戻る</a></p>';return html;}
function trunc(text,keyword){var key=new RegExp(keyword,"i");var res=key.exec(text);if(res){var index=res.index;var length=res[0].length;var start;var end;start=index-20;end=55;text=text.substring(start,index)+text.substr(index,length)+text.substr(index+length,end)+'...';}else{text=text.substring(start,50);}
return text;}
function highlight(text,keywords){var keyword='';for(var i=0;i<keywords.length;i++){if(i==keywords.length-1){keyword+=keywords[i];}else{keyword+=keywords[i]+'|';}}
return text.replace(new RegExp('('+keyword+')',"ig"),'<span class="keywords">'+"$1"+'</span>');}
function SearchForm(){var form=document.getElementById('site_search');form.action="javascript:blogAjaxJsonSearch( '/search/search.db',document.getElementById('search').value );";}
function TextGray(){document.getElementById('search').style.color='#ccc';}
Event.observe(window,'load',TextGray,false);Event.observe(window,'load',SearchForm,false);var isInitialized=false;function initialize(object,id){if(!isInitialized[id]){if((object.value=="site search")||(object.value=="your comment")){object.value="";object.style.color="#333";isInitialized[id]=true;}}}
