// TJF google searcher ver.1.0
// by Hideyuki Kanaya
// Aug.13th, 2009

// google API からsearch APIをロード
google.load('search', '1');

var imgSearch;
var webSearch;
var tabDiv;

function OnLoad() {
	// Our Search instance.
	imgSearch = new google.search.ImageSearch();
	webSearch = new google.search.WebSearch();

	// Search setups
	imgSearch.setSiteRestriction('http://www.tjf.or.jp/');
	imgSearch.setNoHtmlGeneration();
	imgSearch.setResultSetSize(google.search.Search.LARGE_RESULTSET);
	webSearch.setSiteRestriction('http://www.tjf.or.jp/');
	webSearch.setNoHtmlGeneration();
	webSearch.setResultSetSize(google.search.Search.LARGE_RESULTSET);

	// Here we set a callback so that anytime a search is executed, it will call
	// the searchComplete function and pass it our ImageSearch searcher.
	// When a search completes, our ImageSearch object is automatically
	// populated with the results.
	imgSearch.setSearchCompleteCallback(this, searchComplete, null);
	webSearch.setSearchCompleteCallback(this, searchComplete, null);
}

// タブ用グローバル変数
var tabs;
var pages;

// タブの初期表示はウェブ検索
var divWebStyle = 'block';
var divWebClass = 'present';
var divImgStyle = 'none'; // 非表示
var divImgClass = null; // 非表示

var tab = {
	// setup
	draw: function() {
		tab.setup = {
			// タブ化する要素を指定
			tabs: document.getElementById('tab').getElementsByTagName('li'),
			// タブごとのコンテンツを含む要素をidで指定
			pages: [
				document.getElementById('web'),
				document.getElementById('img'),
			]
		}
		// setup内容を適用
		tabs = this.setup.tabs;
		pages = this.setup.pages;
		
		//グローバル変数に格納された値を代入
		pages[0].style.display = divWebStyle;
		tabs[0].className = divWebClass;
		pages[1].style.display = divImgStyle;
		tabs[1].className = divImgClass;

		// タブクリック時の表示切替
		for(i=0; i<pages.length; i++) {
			tabs[i].onclick = function(){
				tab.showpage(this);
				return false;
			};
		}
	},
	
	// switch pages when onclick
	showpage: function(obj) {
		var num;
		
		for(num=0; num<tabs.length; num++) {
			if(tabs[num] === obj) break;
		}
		// 一つ目のタブがクリックされたとき
		if (num == 0) {
			divWebStyle = 'block';
			divWebClass = 'present';
			divImgStyle = 'none';
			divImgClass = null;
		}
		// ２つめのタブがクリックされたとき
		else if (num == 1) {
			divWebStyle = 'none';
			divWebClass = null;
			divImgStyle = 'block';
			divImgClass = 'present';
		}
		// グローバル変数の値で表示する
		pages[0].style.display = divWebStyle;
		tabs[0].className = divWebClass;
		pages[1].style.display = divImgStyle;
		tabs[1].className = divImgClass;
	}
}

// 検索完了時の動作
function searchComplete() {
	// 検索結果を表示する要素をidで指定
	tabDiv = document.getElementById('center_block');
	// tab部分のHTML生成
	tabDiv.innerHTML = '<ul id="tab"><li>'+
	'<a href="#web">ウェブ</a></li><li><a href="#img">画像</a></li></ul>';
	// powered by google表示
	tabDiv.appendChild(google.search.Search.getBranding());
	// 各検索結果を格納する要素を生成
	var webDiv = createDiv(null, "gsc-results gsc-webResult");
	webDiv.id = "web";
	tabDiv.appendChild(webDiv);
	var imgDiv = createDiv(null, "gsc-results gsc-imageResult");
	imgDiv.id = "img";
	tabDiv.appendChild(imgDiv);

	// 検索結果があった場合は結果を生成
	if (webSearch.results && webSearch.results.length > 0) {
		webDiv.innerHTML = 'サイト内検索結果<br clear="both" />';
		addCursor(webSearch,webDiv);

		for (var i=0; i<webSearch.results.length; i++) {
			var div = createDiv(null, "webresults");
			var wresult = webSearch.results[i];
			var webLink = document.createElement('a');
			webLink.href = wresult.unescapedUrl;
			webLink.innerHTML = wresult.title;
			webLink.target ="_blank";
			var webSnip = createDiv(wresult.content+'<br />'
									+'<span class=searchurl>'
									+wresult.visibleUrl+'</span>', null);
			div.appendChild(webLink);
			div.appendChild(webSnip);
			webDiv.appendChild(div);
		}
		// ナビゲーションの付加
		addCursor(webSearch,webDiv);
	}
	// 検索結果がない場合
	else {
		webDiv.innerHTML = "検索語に一致する情報は見つかりませんでした。";
	}

	// Check that we got image results
	if (imgSearch.results && imgSearch.results.length > 0) {
		imgDiv.innerHTML = 'サイト内イメージ検索結果<br clear="both" />';
		addCursor(imgSearch,imgDiv);
		// Loop through our results, printing them to the page.
		for (var i = 0; i < imgSearch.results.length; i++) {
			var imgContainer = createDiv(null, "imgresults");
			// For each result write it's title and image to the screen
			var iresult = imgSearch.results[i];
			var imgBox = createDiv(null,'imagebox');
			var imgLink = document.createElement('a');
			// We use titleNoFormatting so that no HTML tags are left in the title
			imgLink.href = iresult.originalContextUrl;
			imgLink.target ="_blank";
			imgLink.className = 'imglink';

			var newImg = document.createElement('img');
			// There is also a result.url property which has the escaped version
			newImg.src = iresult.tbUrl;
			newImg.border = '1';
			newImg.style.position = 'absolute';
			newImg.style.left = '0px';
			newImg.style.bottom = '0px';

			var addinfo = createDiv(null,'addinfo');
			addinfo.innerHTML = '<strong>'+iresult.titleNoFormatting+'</strong><br />'
								+iresult.content;

			// 要素の組み立て
			imgLink.appendChild(newImg);
			imgBox.appendChild(imgLink);
			imgContainer.appendChild(imgBox);
			imgContainer.appendChild(addinfo);
			imgDiv.appendChild(imgContainer);
		}
		addCursor(imgSearch,imgDiv);
	} else {
		imgDiv.innerHTML = "検索語に一致する情報は見つかりませんでした。";
	}
	// タブを描画
	tab.draw();
}

//検索実行時にフォームの入力値を取得する
function OnSearch(form) {
	imgSearch.execute(form["q"].value);
	webSearch.execute(form["q"].value);
	return false;
}

// Div要素生成用function
function createDiv(opt_text, opt_className) {
	var el = document.createElement("div");
	if (opt_text) { el.innerHTML = opt_text; }
	if (opt_className) { el.className = opt_className; }
	return el;
}
// ページ番号に応じた結果を表示
function gotoPage(searcher,page) {
	searcher.gotoPage(page);
}
// 呼び出し
function methodClosure(object, method, opt_argArray) {
	return function() {
		return method.apply(object, opt_argArray);
	}
}
// リンク生成
function createLink(href, opt_text, opt_target, opt_className, opt_divwrap) {
	var el = document.createElement("a");
	el.href = href;
	if (opt_text) {
		el.innerHTML = opt_text;
	}
	if (opt_className) {
		el.className = opt_className;
	}
	if (opt_target) {
		el.target = opt_target;
	}
	if (opt_divwrap) {
		var div = this.createDiv(null, opt_className);
		div.appendChild(el);
		el = div;
	}
	return el;
}
// ナビゲーション生成
function addCursor(searcher,pointDiv) {
	if (searcher.cursor) {
		var cursor = createDiv(null, "gsc-cursor-box");
		var cursorNode = createDiv(null, "gsc-cursor");
		for (var i=0; i<searcher.cursor.pages.length; i++) {
			var className = "gsc-cursor-page";
			if (i == searcher.cursor.currentPageIndex) {
				className = className + " gsc-cursor-current-page";
			}
			var pageNode = createDiv(searcher.cursor.pages[i].label, className);
			pageNode.onclick = methodClosure(this, gotoPage,[searcher, i]); 
			cursorNode.appendChild(pageNode);
		}
		cursor.appendChild(cursorNode);
		var more = createLink(searcher.cursor.moreResultsUrl,
							  GSearch.strings["more-results"] + "&nbsp;&raquo;",
							  GSearch.LINK_TARGET_BLANK,"gsc-trailing-more-results"
							  );
		cursor.appendChild(more);
		pointDiv.appendChild(cursor);
    }
}

//ページ読み込み時に自動実行
google.setOnLoadCallback(OnLoad);
