/*--------------------------------------------------------------------------*
 *  
 *  Ajax for MovableType
 * 
 *  2008 Mk-T
 *  http://mk-t-lab.com/
 *  
 *この作品は1部以下の作品を元に作成しています。
////////////////////////
//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");
		var fs = true;
		function newAjax(key, area ,flag){
			if(!fs) return false;
			fs = false;
			result.innerHTML = '<p class="loading"><img src=' + img.src + ' />Searching...</p>';
			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);
						}
						fs = true;
						
					}
				}
			}
			xmlhttp.open("get", "/js/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 = getElementsByClassName("search_text")[0];
//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;
						a.innerHTML = highlight(list[i].title, key);
						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));
				a.appendChild(cT(list[i].title));
				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)});
		}
		
		/*
		 * 	Comment
		 */ 
		
		var form = $("comments-form");
		if(form){
			var box = cE("div");
			var cResult = cE("div");
			cResult.className = "ajax_comment";
			var fc = true;
			
			function comment(flag){
				var commentRequest = createXMLHttpRequest();
				if(!fc) return false;
				fc = false;
				cResult.innerHTML = '<p class="loading"><img src=' + img.src + ' />Please Wating...</p>';
				commentRequest.onreadystatechange = function() {
					if(commentRequest.readyState == 4){
						if(commentRequest.status == 200) {
							var x = commentRequest.responseText;
							box.innerHTML = x;
							var msg = getElementsByClassName("ajax_comment" , box)[0].innerHTML;
							cResult.innerHTML = msg;
						}else{
							cResult.innerHTML = '<div class="ajax_comment"><p class="error">失敗しました。</p></div>';
						}
						fc = true;
					}
				}
				commentRequest.open("post", "/mt/mt-comments.cgi", true);
				commentRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
				commentRequest.send(getParameter(flag));
				var insertElm = getElementsByClassName("commentForm")[0];
				if(flag == "preview"){
					insertElm.insertBefore(cResult , form);
				}else{
					insertElm.appendChild(cResult);
				}
			}
			
			function getParameter(flag){
				var input = form.getElementsByTagName("input");
				var p = [];
				for(var i = 0, l = input.length; i < l; i++){
					if(input[i].type != "image" && input[i].type != "submit"){
						p[i] = input[i].name + "=" + encodeURI(input[i].value).replace(/&/g, "%26");
					}
				}
				p[p.length] = $("comment-text").name + "=" + encodeURI($("comment-text").value).replace(/&/g, "%26");
				p[p.length] = flag + "=" + flag;
				p = p.join("&");
				return p;
			}
			
			form.onsubmit = function(){
				return false;
			}
			
			$("comment-preview").onclick = function(){
				comment("preview");
				return false;
			}
			
			$("comment-post").onclick = function(){
				comment("post");
				return false;
			}
		}
	}
	
	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);
})();