/*
 * flexibleSearch.js
 *
 * Copyright (c) 2010 Tomohiro Okuwaki (http://www.tinybeans.net/blog/)
 *
 * Since  : 2010-11-12
 * Update : 2010-12-21
 * Version: 1.00
 * Comment: 
 * 
 * Maybe... jQuery 1.3.x later 
 * 
 */
(function($){$.fn.flexibleSearch=function(options){var op=$.extend({},$.fn.flexibleSearch.defaults,options);var $self=this,timestamp,ids={"keyword":selectorId(op.searchTextId),"submit":selectorId(op.searchSubmitId),"resultTarget":selectorId(op.resultTargetId)},regs={"page":new RegExp("^"+op.vars.page,""),"hidden":new RegExp("^"+op.vars.refine_hidden+"-",""),"result":new RegExp("^"+op.vars.result,"")},$elems={"text":$("<input id='"+op.searchTextId+"' type='text' />"),"submit":$("<input id='"+op.searchSubmitId+"' type='button' value='"+op.searchSubmitText+"' />"),"loading":$("<img id='"+op.vars.loading+"' class='"+op.vars.hidden+"' src='"+op.loadingImgPath+"' alt='loading' />"),"close":$("<p id='"+op.vars.result_close+"' class='"+op.vars.no_page+op.vars.result_close_c+"'><a href='#"+op.vars.result_container+"'>"+op.closeBtnText+"</a></p>"),"result":$("<div id='"+op.vars.result_container+"' class='"+op.vars.hidden+" "+op.vars.result_container_c+"'><div id='"+op.vars.result+"' class='"+op.vars.result_c+"'></div></div>")},clicked=false,cookieEnable=op.cookie,pnCountInPage=new Number(op.paginateCount);var options=[],hidden=[],refineContainer="";if(op.selectFields!=null){var multiple=(op.multiple)?" multiple='multiple'":"",selectSize=(op.selectFieldsSize>0)?" size='"+op.selectFieldsSize+"'":"",select=["<select id='"+op.vars.refine_select+"'"+multiple+selectSize+">","</select>"];options=["<option id='"+op.vars.refine_select+"-default' selected='selected' value=''>すべての項目</option>"];for(var key in op.selectFields){options.push("<option id='"+op.vars.refine_select+"-"+key+"' value='"+key+"'>"+op.selectFields[key]+"</option>")}options.unshift(select[0]);options.push(select[1])}if(op.refineFields!=null){for(var key in op.refineFields){hidden.push("<input type='hidden' id='"+op.vars.refine_hidden+"-"+key+"' class='"+op.vars.refine_hidden+"' title='"+op.refineFields[key]+"' value='' />")}}if(op.selectFields!=null||op.refineFields!=null){refineContainer="<div id='"+op.vars.refine_container+"' class='"+op.vars.refine_container_c+"'>"+options.join("")+hidden.join("")+"</div>"}if(op.searchBoxCreate){$self.append($elems.text,$elems.submit,$elems.loading,refineContainer)}else{$self.append($elems.loading,refineContainer)}$("#"+op.vars.refine_container).insertAfter(ids.keyword);$(ids.resultTarget)[op.resultBoxInsert]($elems.result);var $searchSubmit=$(ids.submit).bind("click",preSuccess);$.ajax({type:"GET",cache:op.cache,dataType:"json",url:op.searchDataPath,error:function(){$searchSubmit.unbind("click",preSuccess)},success:function(json){$searchSubmit.unbind("click",preSuccess).click(function(e){e.preventDefault();clicked=false;var now=new Date();timestamp=now.getTime();setCookie("fs-timestamp",timestamp);location.hash=op.vars.result+"_"+timestamp;this.blur();return false});if(clicked){setTimeout(function(){$searchSubmit.click()},500)}$(ids.keyword).keyup(function(e){var keycode=e.which||e.keyCode;if(keycode=="13"){e.preventDefault();$searchSubmit.click()}});if(pnCountInPage>0){$(window).hashchange(function(){var crtHash=location.hash.replace(/#/,"").split("_"),crtLink=crtHash[0].replace(regs.page,op.vars.link),timestamp=getCookie("fs-timestamp");if(regs.result.test(crtHash[0])){if(getCookie("fs-keyword"+crtHash[1])!=""){searchExe(json,crtHash[1],crtHash[0],"read")}else{searchExe(json,crtHash[1],crtHash[0],"write")}}else if(regs.page.test(crtHash[0])&&getCookie("fs-conditions")=="outer"){searchExe(json,crtHash[1],crtHash[0],"read");paginate(crtHash,crtLink)}else if(regs.page.test(crtHash[0])&&timestamp!=crtHash[1]){searchExe(json,crtHash[1],crtHash[0],"read");paginate(crtHash,crtLink)}else if(regs.page.test(crtHash[0])){paginate(crtHash,crtLink)}else{$("#"+op.vars.result).html("").parent().addClass(op.vars.hidden);$(ids.resultTarget).children().not("#"+op.vars.result_container).removeClass(op.vars.hidden)}});$(window).hashchange()}}});function paginate(crtHash,crtLink){var $a=$("#"+crtLink);if($a.hasClass(op.vars.first_page)){$("#"+op.vars.link_prev).addClass(op.vars.hidden);$("#"+op.vars.link_next).removeClass(op.vars.hidden)}else if($a.hasClass(op.vars.last_page)){$("#"+op.vars.link_prev).removeClass(op.vars.hidden);$("#"+op.vars.link_next).addClass(op.vars.hidden)}else{$("#"+op.vars.link_prev+",#"+op.vars.link_next).removeClass(op.vars.hidden)}$a.addClass(op.vars.link_current).siblings("."+op.vars.link_current).removeClass(op.vars.link_current);$("#"+crtHash[0]+"-block").show().siblings().not("."+op.vars.no_page).hide();smoothScroll("#"+op.vars.scroll_target);return false}function searchExe(json,timestamp,searchHash,mode){$elems.loading.show();if(cookieEnable&&mode=="read"){$(ids.keyword).val(getCookie("fs-keyword"+timestamp));var cookieHidden=getCookie("fs-refine-hidden"+timestamp).split(",");if(cookieHidden.length>0){$("#"+op.vars.refine_container).find("."+op.vars.refine_hidden).val("");for(var i=0;i<cookieHidden.length;i=i+2){$("#"+op.vars.refine_hidden+"-"+cookieHidden[i]).val(cookieHidden[i+1])}}var cookieSelect=getCookie("fs-refine-select"+timestamp).split(",");if(cookieSelect.length>0){$("#"+op.vars.refine_select).find("option").removeAttr("selected");for(var i=0;i<cookieSelect.length;i++){$("#"+op.vars.refine_select+"-"+cookieSelect[i]).attr("selected","selected")}}}var result=$.grep(json.item,function(){return true});var searchPhrase=$(ids.keyword).val(),keywords=keywordsToArray(searchPhrase),normalSearch=true;if(cookieEnable&&mode=="write"){setCookie("fs-keyword"+timestamp,searchPhrase,1)}var refineHidden=[],refineCookie=[];if(op.refineFields!=null){$("#"+op.vars.refine_container+" ."+op.vars.refine_hidden).each(function(){var value=$(this).val();if(value!=""){var id=$(this).attr("id").replace(regs.hidden,"");if(cookieEnable){refineCookie.push([id,value])}refineHidden.push({"key":id,"name":$(this).attr("title"),"value":keywordsToArray(value)})}});if(cookieEnable&&refineHidden.length>0&&mode=="write"){setCookie("fs-refine-hidden"+timestamp,refineCookie.join(","))}}var refineHiddenLength=refineHidden.length;if(op.refineFields!=null&&refineHiddenLength>0){for(var a=-1;++a<refineHiddenLength;){var refineKeywords=refineHidden[a].value;result=$.grep(result,function(obj,i){return searchCore(obj,refineKeywords,refineHidden[a],true)},false)}}var selectField=[],selectCookie=[];if(op.selectFields!=null){$("#"+op.vars.refine_select).find(":selected").each(function(){var value=$(this).val();if(cookieEnable){selectCookie.push(value)}if(value!=""){selectField.push({"key":value,"name":$(this).text()})}});if(cookieEnable&&selectField.length>0&&mode=="write"){setCookie("fs-refine-select"+timestamp,selectCookie.join(","),1)}}var selectFieldLength=selectField.length;if(op.selectFields!=null&&selectFieldLength>0){for(var a=-1;++a<selectFieldLength;){result=$.grep(result,function(obj,i){return searchCore(obj,keywords,selectField[a],true)},false)}normalSearch=false}if(normalSearch){result=$.grep(result,function(obj,i){return searchCore(obj,keywords,null,false)},false)}for(var i=-1,n=keywords.length;++i<n;){keywords[i]=keywords[i].replace(/^_i_/,"")}var resultItemInner=[],resultItem=[],resultLength=result.length;if(resultLength>0){for(var i=-1;++i<resultLength;){resultItemInner[i]=["<li>","<a href='"+result[i]["url"]+"'>"+result[i]["title"]+"</a>","</li>"].join("")}if(pnCountInPage==0){resultItem="<ul>"+resultItemInner.join("")+"</ul>"}else{var pnPageCount=Math.ceil(resultLength/pnCountInPage);for(var i=-1;++i<pnPageCount;){var p=i+1,innerhtml=resultItemInner.slice(i*pnCountInPage,i*pnCountInPage+pnCountInPage).join(""),hiddenClass="";if(i>0){hiddenClass=" "+op.vars.hidden}resultItem.push("<ul id='"+op.vars.page+"-"+p+"-block' class='"+op.vars.page+""+hiddenClass+"'>"+innerhtml+"</ul>")}if(pnPageCount>1){var pnNavi=[],separator=op.paginateSeparator;function createPaginate(i,separator){var classname="";if(i==0){classname=" "+op.vars.link_current+" "+op.vars.first_page;separator=""}else if(i==pnPageCount-1){classname=" "+op.vars.last_page}return separator+"<a id='"+op.vars.link+"-"+p+"' href='#"+op.vars.page+"-"+p+"' class='"+op.vars.link+classname+"'>"+p+"</a>"}for(var i=-1;++i<pnPageCount;){var p=i+1;pnNavi[i]=createPaginate(i,separator)}pnNavi.unshift("<span id='"+op.vars.link_prev+"' class='"+op.vars.hidden+"'>&lt; <a href='javascript:void(0);' class='"+op.vars.link+" "+op.vars.page_order+"'>前の"+pnCountInPage+"件</a>"+separator+"</span>");pnNavi.push("<span id='"+op.vars.link_next+"'>"+separator+"<a href='javascript:void(0);' class='"+op.vars.link+" "+op.vars.page_order+"'>次の"+pnCountInPage+"件</a> &gt;</span>");pnNavi.unshift("<p id='"+op.vars.page_navi+"' class='"+op.vars.no_page+op.vars.page_navi_c+"'>");pnNavi.push("</p>");resultItem.push(pnNavi.join(""))}}}var resultInfo={"elem":["<p id='"+op.vars.result_msg+"' class='"+op.vars.no_page+op.vars.result_msg_c+"'>","<p id='"+op.vars.result_msg_refine+"' class='"+op.vars.no_page+op.vars.result_msg_refine_c+"'>","</p>"],"selected":[],"count":resultLength};if(op.selectFields!=null&&selectFieldLength>0){for(var i=-1;++i<selectFieldLength;){resultInfo.selected[i]=selectField[i].name}}var resultMsg=[resultInfo.elem[0]];if(selectFieldLength>0){resultMsg.push("「"+resultInfo.selected.join(", ")+"」フィールドに")}if(resultLength>0){resultMsg.push("「"+keywords.join(", ")+"」が "+resultLength+" 件見つかりました。")}else{resultMsg.push("「"+keywords.join(", ")+"」は見つかりませんでした。")}resultMsg.push(resultInfo.elem[2]);if(op.refineFields!=null&&refineHiddenLength>0){resultMsg.push(resultInfo.elem[1]);for(var i=-1;++i<refineHiddenLength;){resultMsg.push(refineHidden[i].name+" : "+refineHidden[i].value.join(", "));if(i<refineHiddenLength-1)resultMsg.push("<br />")}resultMsg.push(resultInfo.elem[2])}$(ids.resultTarget).children().not("#"+op.vars.result_container).addClass(op.vars.hidden);resultItem.unshift(resultMsg.join(""));$("#"+op.vars.result)[0].innerHTML=resultItem.join("");if(op.closeBtnCreate){$("#"+op.vars.result).append($elems.close)}$("#"+op.vars.result_container)[op.resultEffect]().removeClass(op.vars.hidden);$elems.loading.hide();$elems.close.children("a").click(function(){$("#"+op.vars.result_container)[op.closeBtnEffect]();smoothScroll(this.hash)});$("#"+op.vars.page_navi+" a").not("."+op.vars.page_order).click(function(e){e.preventDefault();location.hash=$(this).attr("href").replace(/.*?#/,"")+"_"+timestamp;return false});$("#"+op.vars.link_prev+" a").click(function(){$("#"+op.vars.page_navi+" a."+op.vars.link_current+"").prev().click();return false});$("#"+op.vars.link_next+" a").click(function(){$("#"+op.vars.page_navi+" a."+op.vars.link_current+"").next().click();return false});setCookie("fs-conditions","inner");$(window).unload(function(){setCookie("fs-conditions","outer")});location.hash=searchHash+"_"+timestamp;smoothScroll("#"+op.vars.scroll_target)}function selectorId(str){return(str!="")?"#"+str:""}function preSuccess(e){e.preventDefault();$elems.loading.show();clicked=true}function keywordsToArray(str,separator){str=str.toString();var esc=str.match(/".*?"/g);if(esc){for(var i=-1,n=esc.length;++i<n;){esc[i]="_i_"+escape(esc[i].replace(/"/g,""))}str=str.replace(/".*?"/g,"")+" "+esc.join(" ")}var arry=str.replace(/([\/\\\.\*\+\?\|\(\)\[\]\{\}\$\^])/g,"\\$1").replace(/( +|　+)/g," ").replace(/^( |　)|( |　)$/g,"").split(" ");separator=separator?separator:"";for(var i=-1,n=arry.length;++i<n;){arry[i]=separator+unescape(arry[i])+separator}return arry}function setCookie(key,val,days){var cookie=escape(key)+"="+escape(val);if(days!=null){var expires=new Date();expires.setDate(expires.getDate()+days);cookie+=";expires="+expires.toGMTString()}document.cookie=cookie}function getCookie(key){if(document.cookie){var cookies=document.cookie.split(";");for(var i=0;i<cookies.length;i++){var cookie=cookies[i].replace(/\s/g,"").split("=");if(cookie[0]==escape(key)){return unescape(cookie[1])}}}return""}function searchCore(obj,kws,field,refineType){var matched=0;for(var i=-1,n=kws.length;++i<n;){var kw="";if(/^_i_/.test(kws[i])){kw=new RegExp(kws[i].replace(/^_i_/,""),"")}else{kw=new RegExp(kws[i],"i")}if(refineType){if(kw.test(obj[field.key])){matched++}}else{for(var keys in obj){if(kw.test(obj[keys])){matched++;break}}}}return matched==kws.length}function smoothScroll(selector){var targetElem=$(selector).offset();$("html,body").animate({scrollTop:targetElem.top,scrollLeft:targetElem.left},{queue:false,duration:500})}};$.fn.flexibleSearch.defaults={searchBoxCreate:true,searchTextId:"fs-search-keyword",searchSubmitId:"fs-search-submit",searchSubmitText:"Search",closeBtnCreate:false,closeBtnText:"Close",closeBtnEffect:"hide",resultTargetId:"fs-result-target",resultBoxInsert:"prepend",resultEffect:"show",selectFields:null,selectFieldsSize:0,multiple:false,refineFields:null,loadingImgPath:"/flexibleSearch/loading.gif",searchDataPath:"/flexibleSearch/search_data.js",paginateCount:10,paginateSeparator:" | ",cookie:true,cache:false,vars:{"loading":"fs-loading","hidden":"fs-hidden","result_container":"fs-result-container","result_container_c":"","result":"fs-result","result_c":"","result_msg":"fs-result-msg","result_msg_c":"","result_msg_refine":"fs-result-msg-refine","result_msg_refine_c":"","result_close":"fs-result-close","result_close_c":"","refine_container":"fs-refine-container","refine_container_c":"","refine_select":"fs-refine-select","refine_hidden":"fs-refine-hidden","page_order":"fs-page-order","page_navi":"fs-page-navi","page_navi_c":"","page":"fs-page","first_page":"first-page","last_page":"last-page","no_page":"fs-no-page","link":"fs-link","link_prev":"fs-link-prev","link_next":"fs-link-next","link_current":"fs-link-current","scroll_target":"fs-result-container"}}})(jQuery);

jQuery(function($){
	$('#search_content').flexibleSearch({
		searchSubmitText : "検 索",
		resultTargetId : "main",
		resultEffect : "fadeIn",
		loadingImgPath : "/flexibleSearchloading.gif",
		searchDataPath : "/flexibleSearch/search_data.js",
		paginateCount : "10",
		paginateSeparator : ""
	});
});
