////////////////////////
//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 です。
////////////////////////

var is_loaded = false;
var page_counter = 0;
var backnumber_url_list = new Array();
var entries;
var entry_list = new Array();
var result_data = new Array();
var search_keyword;
var result_content;
var search_counter;

var bs_cc_as_current_page = 1;
var bs_cc_as_per_page = 10;
var bs_cc_as_search_keywords;

function blogAjaxJsonSearch( archive_file_path, text ) {
	search_keyword = text;
	search_counter = 0;
	bs_cc_as_current_page = 1;
	result_data = new Array();
	matched_url = new Array();
	var div_tag = document.getElementsByTagName('div');
	for ( var i = 0; i < div_tag.length; i++ ) {
		if ( div_tag[i].className == 'content' ) {
			result_content = div_tag[i];
		}
	}
	//new Ajax( getArchiveFilePath()+'archives.html', {method: 'get', onSuccess: function(responseText){ parse_backnumbers( responseText ); }, onFailure: function() { is_loaded = true; result_content.innerHTML = '一致しませんでした'; } } ).request();
	jQuery.ajax({ type:'get', url:getArchiveFilePath()+'archives.html', error:function(){ is_loaded = true; result_content.innerHTML = '一致しませんでした'; }, success:function(responseText){ parse_backnumbers( responseText ); } });


	result_content.innerHTML = '検索中.';
	added_period();
}

function added_period() {
	if ( !is_loaded ) {
		result_content.innerHTML += '.';
		timerId = setTimeout("added_period()", 50 );
	}
}

function getArchiveFilePath() {
	//var archives_url = document.getElementsByTagName('h1')[0].getElementsByTagName('a')[0].href;
	var archives_url = document.getElementById('mainImgReal').getElementsByTagName('p')[0].getElementsByTagName('a')[0].href;
	return archives_url.match(/http:\/\/[^\/]+(\/.*)/i)[1];
}

function parse_backnumbers( responseText ) {
	var backnumber_page = responseText;
	backnumber_page = backnumber_page.replace( new RegExp( '\n', "g"), '' );
	backnumber_page = backnumber_page.replace( new RegExp( '\r', "g"), '' );
	backnumber_page = backnumber_page.replace( new RegExp( '.*(<div class="archive-date-based">.*?<div class="archive-date-bottom">).*', "i"), "$1" );
	backnumber_url_list = backnumber_page.match( /http:\/\/[^"]+\//ig );
	for( var i = 0; i < backnumber_url_list.length; i++ ){
		backnumber_url_list[i] = backnumber_url_list[i].match(/http:\/\/[^\/]+(\/.*)/i)[1];
	}
	load_backnumber();
}

function load_backnumber() {
    if( page_counter > backnumber_url_list.length - 1 ) {
        search();
    } else {
        //new Ajax( backnumber_url_list[ page_counter ]+'search_data.txt', {method: 'get', onSuccess: function(responseText){ parse_enteries_page( responseText ); }, onFailure: function() { page_counter++; load_backnumber(); } } ).request();
	jQuery.ajax({ type:'get', url:backnumber_url_list[ page_counter ]+'search_data.txt', error:function(){ page_counter++; load_backnumber(); }, success:function(responseText){ parse_enteries_page( responseText ); } });
    }
}

function parse_enteries_page( responseText ) {
	var data_string = responseText;
	data_string = data_string.replace( new RegExp( '<.*?>', "i"), '' )
	entries = eval( data_string );
	for ( var i=0; i<entries.length; i++ ) {
		var title = decode(entries[i].title);
		var date = entries[i].date;
		var body = decode(entries[i].body);
		var link = entries[i].link;
		var author = entries[i].author;
		entry_list[ entry_list.length ] = { title:title, date:date, body:body, link:link, author:author };
	}
	search();
	page_counter++;
	load_backnumber();
}

function search() {
	search_keyword = search_keyword.replace( /([\/\\\.\*\+\?\|\(\)\[\]\{\}\$\^])/g, "\\$1" );
	search_keyword = search_keyword.replace( /( +|　+)/, ' ' );
	search_keyword = search_keyword.replace( /( |　)$/, '' );
	var keywords = search_keyword.split(/ |　/);
	for ( var i = search_counter; i < entry_list.length; i++ ) {
		var is_match = true;
		for ( var j = 0; j < keywords.length; j++ ) {
			var res_body = entry_list[i].body.toLowerCase().indexOf( keywords[j].toLowerCase() );
			var res_title = entry_list[i].title.toLowerCase().indexOf( keywords[j].toLowerCase() );

			var res_author = entry_list[i].author.toLowerCase().indexOf( keywords[j].toLowerCase() );
			if ( res_body == -1 && res_title == -1 && res_author == -1 ) {
				is_match = false;
			}
		}
		if ( is_match ) {
			if( !matched_url[entry_list[i].link] ) {
				result_data[ result_data.length ] = entry_list[i];
				matched_url[entry_list[i].link] = true;
			}
		}
	        search_counter++;
	}
	var result_html = '';
	if ( result_data.length == 0 ) {
		if ( page_counter > backnumber_url_list.length - 1 ) {
			result_html =  '一致しませんでした';
		} else {
			return;
		}
	} else {
		if ( page_counter > backnumber_url_list.length - 1 ) {
			result_html = build_search_result_html( result_data, keywords );
			is_loaded = true;
			result_content.innerHTML = result_html;
		}
	}
}

function build_search_result_html( result_data, keywords ) {
	bs_cc_as_search_keywords = keywords;
	var start_index = (bs_cc_as_current_page - 1) * bs_cc_as_per_page;
	var last_index = result_data.length;

	var page_navigation = '';
	page_navigation += '<center><div class="navi">';
	if ( bs_cc_as_current_page > 1 ) {
		page_navigation += ' <a href="javascript:change_page(' + (bs_cc_as_current_page - 1) + ')">＜前へ</a> ';
	}
	for ( var i=0; i<(result_data.length / bs_cc_as_per_page); i++ ) {
		if ( i+1 == bs_cc_as_current_page ) {
			page_navigation += ' ' + (i + 1) + ' ';
		} else {
			page_navigation += ' <a href="javascript:change_page(' + (i + 1) + ')">' + (i + 1) + '</a> ';
		}
	}
	if ( bs_cc_as_current_page < (result_data.length / bs_cc_as_per_page) ) {
		page_navigation += ' <a href="javascript:change_page(' + (bs_cc_as_current_page + 1) + ')">次へ＞</a> ';
	}
	page_navigation += '</div></center>';

	var html = '<div id="search_notice"  style="text-align:left; font-size: x-small;">※スペースでAND検索が出来ます。<br />※この状態からの２度目の検索は非常に高速です。</div><h1 class="h1_opt1">検索結果 （' + result_data.length + '件ヒット）</h1><ol type=1 start=' + (start_index+1) + ' style="text-align:left;">';
	html += page_navigation;
	if ( ((bs_cc_as_current_page) * bs_cc_as_per_page) < result_data.length ) {
		last_index = (bs_cc_as_current_page) * bs_cc_as_per_page;
	}
	for ( var i= start_index; i<last_index; i++ ) {
		html += '<li><a href="' + result_data[i].link + '#search_word=' + search_keyword + '" target="_blank">' + highlight( decode(result_data[i].title), keywords ) + '</a><br />' + highlight( trunc( decode(result_data[i].body), keywords[0] ), keywords ) + '<br /><span class="e_date">日付：' + result_data[i].date + '</span><span class="e_author">執筆者：' + highlight( result_data[i].author, keywords[0] ) + '</span></li>';
	}
	html += '</ol>';
	html += page_navigation;
	return html;
}

function change_page( new_page ) {
	window.scroll(0,0);
	bs_cc_as_current_page = new_page;
	result_content.innerHTML = build_search_result_html( result_data, bs_cc_as_search_keywords );
}

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 {
		if ( text.length > 80 ) {
			text = text.substring( start, 80 ) +'...';;
		} else {
			text = text.substring( start, 80 );
		}
	}
	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"), '<strong>' + "$1" + '</strong>' );
}

function decode( text ) {
	text = text.replace( /&amp;/g, "&");
	text = text.replace( /&nbsp;/g, " ");
	text = text.replace( /&quot;/g, "\"");
	text = text.replace( /&larr;/g, "←");
	text = text.replace( /&uarr;/g, "↑");
	text = text.replace( /&rarr;/g, "→");
	text = text.replace( /&darr;/g, "↓");
	text = text.replace( /&rArr;/g, "⇒");
	text = text.replace( /&hArr;/g, "⇔");
	text = text.replace( /&lsquo;/g, "‘");
	text = text.replace( /&rsquo;/g, "’");
	text = text.replace( /&sbquo;/g, "?");
	text = text.replace( /&ldquo;/g, "“");
	text = text.replace( /&rdquo;/g, "”");
	text = text.replace( /&plusmn;/g, "±");
	text = text.replace( /&times;/g, "×");
	text = text.replace( /&hellip;/g, "…");
	text = text.replace( /&acute;/g, "´");
	text = text.replace( /&sigma;/g, "σ");
	return text;
}
