/*--------------------------------------------------------------------------*
 *  
 *  ajaxSearch for MovableType Beta1
 * 
 *  2008 Mk-T
 *  http://mk-t-lab.com/
 *  
 *この作品は以下の作品を元に作成しています。
////////////////////////
//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 です。
////////////////////////
 *--------------------------------------------------------------------------*/
 
(function(){
	var ajaxSearch = function(){
		var xmlhttp = createXMLHttpRequest();
		var img = cE("img");
		//loadingImage
		img.src="/imgs/load.gif"
		var entries = [];
		var result = cE("div");
		
		function newAjax(key, area ,flag){
			xmlhttp.onreadystatechange = function() {
				if(xmlhttp.readyState == 4){
					if(xmlhttp.status == 200) {
						var x = xmlhttp.responseText;
						x = x.replace( new RegExp( '<.*?>', "i"), '' );
						entries = eval(x);
						if(flag == "normal"){
							setResultN(key);
							
						}else if(flag == "tagS"){
							setResult(key , area);
						}
						
					}
				}else{
					result.innerHTML = '<p class="loading"><img src=' + img.src + ' />Searching...</p>';
				}
			}
			xmlhttp.open("GET", "/search_data.json" , true);
			xmlhttp.send(null);
		}
		
		function tagSearch(elm){
			var key = elm.firstChild.nodeValue;
			var num = elm.area;
			result.className = "tagResult";
			tagArea[num].appendChild(result);
			if(entries.length != 0){
				setResult(key , num);
			}else{
				newAjax(key,num,"tagS");
			}
		}
		
		var tagArea = getElementsByClassName("tagArea");
			if(tagArea){
			for(var i = 0, l = tagArea.length; i < l; i++){
				tagArea[i].link = getElementsByClassName("tagLink" , tagArea[i]);
				for(var j = 0, jl = tagArea[i].link.length; j < jl; j++){
					tagArea[i].link[j].area = i;
					tagArea[i].link[j].onclick = function(){
						tagSearch(this);
						return false;
					}
				}
			}
		}
		function normalSearch(){
			var keyword = $("search").value;
			var area = $("main");
			//code by 暴想(http://java.cocolog-nifty.com/)
			keyword = keyword.replace( /([\/\\\.\*\+\?\|\(\)\[\]\{\}\$\^])/g, "\\$1" );
			keyword = keyword.replace( /( +|　+)/, ' ' );
			keyword = keyword.replace( /( |　)$/, '' );
			var keywords = keyword.split(/ |　/);
			
			result.className = "archives";
			area.innerHTML = "";
			area.appendChild(result);
			if(!keyword){
				setResultN(0);
			}else if(entries.length != 0){
				setResultN(keywords);
			}else{
				newAjax(keywords, area ,"normal");
			}
		}
		$("site_search").onsubmit = function(){
			normalSearch();
			return false;
		}
		
		function getResult(key){
			var list = [];
			if(typeof(key) != "string" && typeof(key) != "number"){
				var keyReg = [];
				for (var i= 0; i < key.length;i++) {
					keyReg[i] = new RegExp( key[i], "i" );
				}
				for(var i = 0, l = entries.length-1; i < l; i++){
					reBody = entries[i].body;
					reTitle = entries[i].title;
					for(var j = 0, jl = keyReg.length; j < jl; j++ ){
						if(keyReg[j].exec(reBody) || keyReg[j].exec(reTitle)){
							list[list.length] = entries[i];
							break;
						}
					}
				}
			}else{
				for(var i = 0, l = entries.length-1; i < l; i++){
					var tags = entries[i].tag.split(",");
					for(var j = 0, jl = tags.length; j < jl; j++){
						if(tags[j] == key){
							list[list.length] = entries[i];
							break;
						}
					}
				}
			}
			return list;
		}
		
		function setResultN(key){
			var h2 = cE("h2");
			h2.className = "searchResult";
			h2.appendChild(cT("SearchResult"));
			var backToTop = cE("p");
			backToTop.className = "search_back";
			var a = cE("a");
			a.href = "#";
			a.onclick = function(){
				location.reload(true);
				return false;
			}
			a.title = "元のページに戻る";
			a.appendChild(cT("元のページに戻る ≫"));
			backToTop.appendChild(a);
			var p1 = cE("p");
			p1.className = "data";
			
			result.innerHTML = "";
			result.appendChild(h2);
			result.appendChild(p1);
			
			if(key == 0){
				p1.appendChild( cT("検索キーワードが入力されていません。キーワードを指定してください。") );
			}else{
				var list = getResult(key);
				p1.appendChild(cT("「" + key.join() + "」の検索結果(" + list.length + "件)"));
				if(list.length != 0){
					for(var i = 0, l = list.length; i < l; i++){
						var div = cE("div");
						div.className = "entryList";
						div.className += (i%2 == 0) ? " even" : " odd";
						
						var h3 = cE("h3");
						var a = cE("a");
						a.href = list[i].link;
						a.title = list[i].title + "の詳細へ"
						a.innerHTML = highlight(list[i].title, key) + " - " + list[i].date;
						h3.appendChild(a);
						
						var p = cE("p");
						p.innerHTML = highlight( trunc( list[i].body, key[0] ), key );
						
						div.appendChild(h3);
						div.appendChild(p);
						result.appendChild(div);
					}
				}else{
					var p2 = cE("p");
					p2.className = "nodata";
					p2.appendChild( cT("該当するエントリーはありませんでした。") );
					result.appendChild(p2);
				}
			}
			
			result.appendChild(backToTop);
		}
		
		//code by 暴想(http://java.cocolog-nifty.com/)
		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] + '|'; 
				}
			}
			//code by www watch(http://hyper-text.org/)
			return text.replace( new RegExp( '(' + keyword + ')', "ig"), '<span class="keywords">' + "$1" + '</span>' );
		}
		
		function setResult(key, num){
			var dl = cE("dl");
			var dt = cE("dt");
			var dd = cE("dd");
			var ol = cE("ol");
			var p = cE("p");
			p.appendChild(cT("Close"));
			p.style.cursor = "pointer";
			p.className = "close";
			dt.appendChild(cT("タグ「" + key + "」が含まれているエントリー一覧"));
			var list = getResult(key);
			for(var i = 0, l = list.length; i < l; i++){
				var li = cE("li");
				var a = cE("a");
				li.className = (i%2 == 0) ? "even" : "odd";
				a.href = list[i].link;
				a.title = list[i].title + "の詳細へ";
				a.appendChild(cT(list[i].title + " - " + list[i].date));
				li.appendChild(a);
				ol.appendChild(li);
			}
			dd.appendChild(ol);
			dl.appendChild(dt);
			dl.appendChild(dd);
			result.innerHTML = "";
			result.appendChild(dl);
			result.appendChild(p);
			
			addEvent(p,"click",function(){tagArea[num].removeChild(result)});
		}
	}
	
	function createXMLHttpRequest(){
		var h = false;
		if( window.XMLHttpRequest ){
			h = new XMLHttpRequest();
		}else if( window.ActiveXObject ){
			try{
				h = new ActiveXObject( 'Msxml2.XMLHTTP' );
			}
			catch ( e ){
				h = new ActiveXObject( 'Microsoft.XMLHTTP' );
			}		
		}
		return h;
	}
	
	var addEvent = (function() {
		if ( window.addEventListener ) {
			return function(el, type, fn) {
				el.addEventListener(type, fn, false);
			};
		} else if ( window.attachEvent ) {
			return function(el, type, fn) {
				var f = function() {
					fn.call(el, window.event);
				};
				el.attachEvent("on"+type, f);
			};
		} else {
			return function(el, type, fn) {
				el["on"+type] = fn;
			};
		}
	})();
	function $(id){
		return (document).getElementById(id);
	}
	function cT(txt) {
		return document.createTextNode(txt);
	}
	function cE(tag){
		return document.createElement(tag);
	}
	var getElementsByClassName = (function(){
		if(document.getElementsByClassName){
			return function(className, pElement){
				return (pElement||document).getElementsByClassName(className);
			};
		}else{
			return function(className, pElement){
				var d = document, nodes = [], item;
				var cls, items = (pElement || d).getElementsByTagName("*");
				for(var i = 0, l = items.length; i < l; i++){
					item = items[i];
					if(item.className){
						cls = item.className.split(/\s+/);
						for(var k = 0, kl = cls.length; k < kl; k++){
							if(cls[k]==className){
								nodes[nodes.length] = item; break;
							}
						}
					}
				}
				return nodes.length > 0 ? nodes : null;
			};
		}
	})();
	addEvent(window,"load",ajaxSearch);
})();