/* client-side hash that contains previously retrieved suggestions
 for any previous queries */
var cache = new Array();
var xmlhttp = false;
var curr_query = "";
var last_query = "";
var curr_target = "";
var page = "";
var q_hasfocus = false;
var dsuggs_hasfocus = false;

//var debug = "";

/* add event to home page search box */
function initSH() {
	// exclude safari 412.2 (buggy) and sun hardware (crashes mozilla)
	if(!(navigator.userAgent.indexOf("Safari") >= 0 && navigator.userAgent.indexOf("412.2") >= 0)) {
		if(navigator.userAgent.indexOf("SunOS sun4u") == -1){
			// only add event handling if modern browser
			if (window.addEventListener || window.attachEvent) {
				page = "home";
				var hsb = document.getElementById("hsb");
				var dsuggs = document.getElementById("dsuggs");
				if (hsb) {
					addEvent(hsb, "focus", qFocus, false);
					addEvent(hsb, "blur", qBlur, false);
					addEvent(hsb, "keydown", suggestKeyUpHandler, false);
				}
				if (dsuggs) {
					addEvent(dsuggs, "focus", dsuggsFocus, false);
					addEvent(dsuggs, "blur", dsuggsBlur, false);
					addEvent(dsuggs, "keydown", updateQueryHandler, false);
					addEvent(dsuggs, "dblclick", submitSuggestion, false);
				}
				if (getCookie("beSuggest")) {
					hideSuggestions();
				}
				xmlhttp = getXmlHttp();
				requestLoop();
			}
		}
	}
	//debug = document.getElementById("debug");
}

/* add events to top and bottom search boxes on results pages */
function initSR() {
	// exclude safari 412.2 (buggy) and sun hardware (crashes mozilla)
	if(!(navigator.userAgent.indexOf("Safari") >= 0 && navigator.userAgent.indexOf("412.2") >= 0)) {
		if(navigator.userAgent.indexOf("SunOS sun4u") == -1){
			// only add event handling if modern browser
			if (window.addEventListener || window.attachEvent) {
				setPage();
				var tsb = getTsb();
				var bsb = getBsb();
				var dsuggs = document.getElementById("dsuggs");
				if (tsb) {
					addEvent(tsb, "focus", qFocus, false);
					addEvent(tsb, "blur", qBlur, false);
					addEvent(tsb, "keydown", suggestKeyUpHandler, false);
				}
				if (dsuggs) {
					addEvent(dsuggs, "focus", dsuggsFocus, false);
					addEvent(dsuggs, "blur", dsuggsBlur, false);
					addEvent(dsuggs, "keydown", updateQueryHandler, false);
					addEvent(dsuggs, "dblclick", submitSuggestion, false);
				}
				if (bsb) {
					addEvent(bsb, "keydown", suggestKeyUpHandler, false);
				}
				if (getCookie("beSuggest")) {
					hideSuggestions();
				}
				xmlhttp = getXmlHttp();
				if (bsb && !getCookie("beSuggest")) {
					setRequestData(bsb.value, 'bsb');
				}	
				requestLoop();
			}
		}
	}
}

function qFocus(e) {
	q_hasfocus = true;
}

function qBlur(e) {
	q_hasfocus = false;
}

function dsuggsFocus(e) {
	dsuggs_hasfocus = true;
}

function dsuggsBlur(e) {
	dsuggs_hasfocus = false;
}

// page is 'research' by default
// sets page to "shop" is search box id indicates it's a shop page
function setPage() {
	if (document.getElementById("stsb")) {
		page = "shop";
	} else if (document.getElementById("rtsb")) {
		page = "research";
	} else {
		page = "home";
	}
}

// gets top search box
function getTsb() {
	if (page == 'research') {
		return document.getElementById("rtsb");
	} else {
		return document.getElementById("stsb");
	}
	return;
}

// gets bottom search box
function getBsb() {
	if (page == 'research') {
		return document.getElementById("rbsb");
	} else {
		return document.getElementById("sbsb");
	}
}

function getId(id) {
	if (id.length == 4) {
		return id.substring(1);
	}
	return id;
}

/* handle key up event for alphanumeric chars, back space and space */
function suggestKeyUpHandler(event) {
	var key = getEventKeyCode(event);
	var target = getEventTarget(event);
	var dscontainer = document.getElementById("dsuggs_box");
	var dsuggs = document.getElementById("dsuggs");
	
	/* alphanumeric,back space, space bar */
	//if ((key >= 49 && key <= 221) || key == 8 || key == 32) { 
	if ( key == 40 && dscontainer.style.visibility == "visible" ) {
		dsuggs.focus();
	} else {
		setRequestData(target.value, getId(target.getAttribute("id")));
	}
	//	return; 
	//}
}

function submitSuggestion(event) {
	var dsuggs = document.getElementById("dsuggs");
	curr_target = ""; 
	document.searchForm.q.value = dsuggs.options[dsuggs.selectedIndex].value;
	dsuggs.blur();
	document.searchForm.submit();
}

function updateQueryHandler(event) {
	var key = getEventKeyCode(event);
	var target = getEventTarget(event);
	
	switch(key) {
		case 13:
			curr_target = ""; 
			document.searchForm.q.value = target.options[target.selectedIndex].value;
			target.blur();
			document.searchForm.submit();
			break;
		case 38:
			if(target.selectedIndex == 0) {
				document.searchForm.q.focus();
			}
			break;
	}
}

// stores the current query and target search box
function setRequestData(query, target) {
	curr_query = query;
	curr_target = target;
}

// every 10 miliseconds checks to see if current query has changed
// if it has, it sends a request
function requestLoop() {
	if ( q_hasfocus || dsuggs_hasfocus ) {
		if (curr_target != "") {
			if (curr_target == "tsb") {
				curr_query = document.getElementById(getTsb().getAttribute("id")).value;
			} else {
				curr_query = document.getElementById(curr_target).value;
			}
			if (curr_query != "") {
				if (curr_query != last_query) {
					getSuggestions(curr_query, curr_target);
					last_query = curr_query;
				}
			}
		}
	} else {
		hideDsuggs();
	}
	setTimeout("requestLoop()", 250);
}

/* get suggestions for new query from cache or server */
function getSuggestions(query, id) {
	var q = cleanSuggQuery(query);
	// if exact query is in cache, read from cache
	if (typeof cache[q] != 'undefined') {  
		suggestSelect(q, id, cache[q]);
	} else {
		// if a substring for this query has zero results, then return from cache
		var subStr = substrSuggCache(q);
		if (subStr != "") {   /* read from cache */
			suggestSelect(q, id, cache[subStr]);
		// otherwise send a request to the server
		} else {
			var src;
			if (page == "shop") { src = "s"; } else { src = "r"; } 
			var fHref = "/suggestquery/s.jsp?t=" + id + "&src=" + src + "&q=" + encodeURIComponent(q);
			if (xmlhttp) {
				xmlLoadData(query, id, fHref);
			} else {
				window.hframe.location.replace(fHref);
			}
		}
	}
}

function xmlLoadData(query, id, url) {
	if (xmlhttp.readyState != 0) {
		xmlhttp.onreadystatechange = function () {}
		xmlhttp.abort();
	}
	xmlhttp.open("GET", url, true);
	xmlhttp.onreadystatechange=function() {
  		if (xmlhttp.readyState==4) {
   			var text = xmlhttp.responseText;
   			var regExp = new RegExp("Array(.*?);");
   			var s = regExp.exec(text);
   			if (s) {
   				var suggestions = eval("new Array" + s[1]);
   				//suggest(query, id, suggestions);
   				suggestSelect(query, id, suggestions);
  			} else {
  				//suggest(query, id, null);
  				suggestSelect(query, id, null);
  			}
  		}
 	}
	xmlhttp.send(false);
}

/* lowercase and remove leading punctuation and spaces */
function cleanSuggQuery(query) {
	var q = query.toLowerCase();
/*
	var index = 0;
	var alphaNum = new RegExp("[a-z0-9]");
	for (var i=0; i<q.length; i++) {
		if (alphaNum.exec(q.charAt(i))) {
			index = i;
			break;
		}
	}
	q = q.substring(i);
*/
	return q;
}

/* look for a substring of q that has zero suggestions
   if exists, return substring, otherwise return "" */
function substrSuggCache(q) {
	for (var i=q.length - 1; i>0; i--) {
		if (cache[q.substring(0, i)] == null) {
			/*return q.substring(0, i);*/
		}
	}
	return "";
}

function suggestSelect(query, id, suggestions) {

	cache[query] = suggestions;
	
	if (suggestions == null) {
		zeroSuggs(id);
		return;
	}
	
	var dscontainer = document.getElementById("dsuggs_box");

	dscontainer.style.visibility = "visible";
	
	var dsuggs = document.getElementById("dsuggs");
	if (dsuggs) {
		dsuggs.className = "dsuggs_select";
	}
	
	dsuggs.options.length = 0;
	
	for(var i=0; i < suggestions.length; i++) {
		dsuggs.options[i] = new Option(suggestions[i], suggestions[i]);
	}
	
}

function suggest(query, id, suggestions) {
	cache[query] = suggestions;
	if (suggestions == null) {
		zeroSuggs(id);
		return;
	}
	
	if (id == "tsb") {
		// make overlay visible
		var dscontainer = document.getElementById("dsuggs_box");
		dscontainer.style.visibility = "visible";
	}
	
	if (id == "tsb" && !(document.getElementById("dsuggs_" + id))) { 
		/* populate overlay with new row */
	 	var table = createSuggestTable(id, suggestions);
	 	dscontainer.appendChild(table);
	}
	
	/* HWL 8/22/2006 added for new home page */
	if (id =="hsb"){
		var dscontainer = document.getElementById("dsuggs_box");
		dscontainer.style.visibility = "visible";
	}
	if (id == "hsb" && !(document.getElementById("dsuggs_" + id))) {
		var table = createSuggestTable(id, suggestions);
		dscontainer.appendChild(table);
	}
	
	/*update table rows*/
	var dsrow = createSuggestHtml(id, suggestions);
	var dstb = document.getElementById("dstb_" + id);
	var old_dsrow = document.getElementById("dsrow_" + id);
	dstb.replaceChild(dsrow, old_dsrow);
	
	/* make sure everything is visible */
	var dstable = document.getElementById("dsuggs_" + id);
	dstable.style.visibility = "visible";
/*
	var dstitle = document.getElementById("dstitle_" + id);
	dstitle.style.visibility = "visible";
*/
}

function createSuggestTable(id, suggestions) {
	var table = document.createElement("table");
	table.setAttribute("id", "dsuggs_" + id);
	table.className = "dsuggs";
	table.setAttribute("border", "0");
	
	var tbody = document.createElement("tbody");
	tbody.setAttribute("id", "dstb_" + id);
	
	var titlerow = document.createElement("tr");
	titlerow.setAttribute("id", "dstitle_" + id);
	
	var titletd;
	if (titlerow.addEventListener) { /* test if not IE */
		titletd = document.createElement("th");
		titletd.setAttribute("colspan", 3);
		titletd.setAttribute("align", "left");
	} else { /*IE*/
		var tag = "<th align='left' colspan='3'></td>";
		titletd = document.createElement(tag);
	}
	titletd.setAttribute("align", "left");
	var title = document.createTextNode("人気キーワード");
	titletd.appendChild(title);
	
	var linktd = document.createElement("td");
	linktd.setAttribute("align", "right");
	linktd.setAttribute("id", "dsshl_" + id);
	linktd.setAttribute("nowrap", "nowrap");
	linktd.className = "dsshl";
	var a = document.createElement("a");
	a.setAttribute("href", "/");
	a.setAttribute("id", "dshidesl_" + id);
	a.onmousedown = hideSuggestions;
	a.onmouseup = hideSuggestions;
	//a.onclick = hideSuggestions;
	var atext = document.createTextNode("人気キーワードを隠す");

	a.appendChild(atext);
	linktd.appendChild(a);
	
	titlerow.appendChild(titletd);
	titlerow.appendChild(linktd);
	
	var dsrow = document.createElement("tr");
	dsrow.setAttribute("id", "dsrow_" + id);
	dsrow.className = "dsrow";
	
	//tbody.appendChild(titlerow);
	tbody.appendChild(dsrow);
	table.appendChild(tbody);
	return table;	
}

function createSuggestHtml(id, suggestions) {
	var cols = getNumSuggCols(id, suggestions);
	var dsrow = document.createElement("tr");
	dsrow.setAttribute("id", "dsrow_" + id);
	dsrow.className = "dsrow";
	for (var i=1; i<=cols; i++) {
		var start = (suggestions.length > (i-1)*4) ? (i-1)*4 : 0;
		var end = (suggestions.length > (i-1)*4) ? (suggestions.length >= ((i-1)*4)+4)? ((i-1)*4)+4 : suggestions.length : 0;
		var td = createSuggCol(suggestions, start, end, id, i);
		dsrow.appendChild(td);
	}
	dsrow.style.visibility = "visible";
	return dsrow;
}

/* returns the number of columsn to dispay based on the following factors: 
   id (different display for diff. search boxes, average length of suggestions, 
   length of any one suggestion */
function getNumSuggCols(id, suggestions) {
	var numLong = 0;
	var sum = 0;
	var LONG_LEN = 18;
	var SUM_LEN = 12;
	var numCols;
	
	for (var i=0; i<suggestions.length; i++) {
		if (suggestions[i].length > LONG_LEN) {
			numLong++;
		}
		sum += suggestions[i].length;
	}
	numCols = (numLong >= 3) ? 2 : (numLong > 0) ? 3 : 4;  
	numCols = (sum/suggestions.length > SUM_LEN) ? 2 : numCols; 
	return numCols;
}

/* returns a table cell that contains a list of suggestions from index
   start up to but not including index end */
function createSuggCol(suggestions, start, end, id, col) {
	var td = document.createElement("td");
	td.className = "dscol";
	var ul = document.createElement("ul");
	for (var i=start; i<end; i++) {
		var li = document.createElement("li");
		var a = document.createElement("a");
		var t = getTValue(id);
		var service;
		if (page == "research") { service = "research"; } else { service = "shop";}
		var url = "/rd?t=rd&et=ds&pt=" + t + "&q=" + encodeURIComponent(suggestions[i]) + "&pi=" + i + "&u=" + encodeURIComponent("/" + service + "?q=" + encodeURIComponent(suggestions[i]));
		a.className = "dslink";
		a.setAttribute("href", url);
		a.setAttribute("id", id + i);
		addEvent(a, "mousedown", urlHandler, false);
		var text = document.createTextNode(suggestions[i]);
		a.appendChild(text);
		li.appendChild(a);
		ul.appendChild(li);
	}
	td.appendChild(ul);
	return td;
}

function getTValue(id) {
	if (id == "hsb") {
		return "hs";
	}
	if (id == "tsb") {
		return "ts";
	}
	if (id == "bsb") {
		return "bs";
	}
	return;
}

function urlHandler(e) {
	var t = getEventTarget(e);
	while(t.nodeName != "A") {
		t = t.parentNode;
	}
	var id = t.getAttribute("id").substring(0,3);
	var loc; 
	if (id == "bsb") { loc = "footer"; } else { loc = "header"; }
	
	//remove blur event so link sticks around 
	var tsb = getTsb();
	if (tsb) {
		removeEvent(tsb, "blur", clearSuggHandler, false);
	} 
	
	becomeTracking("/action/internal/" + page + "/" + loc + "/dynamic-suggestions");
	
	var url = t.getAttribute("href");
	location.href = url;
	return false;
}


/* remove all suggestions */
function zeroSuggs(id) {
/*
	var dsuggs = document.getElementById("dsuggs_" + id);
	if (dsuggs) {
		dsuggs.style.visibility = "hidden";
	}
	var dstitle = document.getElementById("dstitle_" + id);
	if (dstitle) {
		dstitle.style.visibility = "hidden";
	}
	var dsrow = document.getElementById("dsrow_" + id);
	if (dsrow) {
		dsrow.style.visibility = "hidden";
	}
*/
	hideDsuggs();
	return true;
}

function hideDsuggs() {
	var dsuggs_box = document.getElementById("dsuggs_box");
	if (dsuggs_box) {
		dsuggs_box.style.visibility = "hidden";
	}
	var dsuggs = document.getElementById("dsuggs");
	if (dsuggs) {
		dsuggs.className = "dsuggs_hide";
	}
}

function clearSuggHandler(event) {
	var target = getEventTarget(event);
	zeroSuggs(getId(target.getAttribute("id")));
}

function hideSuggestions(e) {
	var ids = new Array('hsb', 'rbsb', 'sbsb', 'rtsb', 'stsb');
	
	for (var n=0; n<ids.length; n++) {
		var sbox = document.getElementById(ids[n]);
		if (sbox) {
			/*remove dsrow, but leave dstitle, remove overlay*/
			var dstb = document.getElementById("dstb_" + getId(ids[n]));
			var dsrow = document.getElementById("dsrow_" + getId(ids[n]));
			if (dstb && dsrow) {
				dstb.removeChild(dsrow);
			}
			if (getId(ids[n]) == "tsb") {
				zeroSuggs("tsb");
			}else if(getId(ids[n]) == "hsb") {
				zeroSuggs("hsb");
			}
			
			/* remove events */
			removeEvent(sbox, "keydown", suggestKeyUpHandler, false);
			if (getId(ids[n]) == 'tsb') {
				removeEvent(sbox, "blur", clearSuggHandler, false);
			}
			
			/* flip links */			
			if (getId(ids[n]) != 'tsb' && getId(ids[n]) != 'hsb') {
				var parent = document.getElementById("dsshl_" + getId(ids[n]));
				var link = document.getElementById("dshidesl_" + getId(ids[n]));
				var nLink = document.createElement("a");
				nLink.setAttribute("href", "/");
				nLink.setAttribute("id", "dsshowsl_" + getId(ids[n]));
				nLink.onclick = showSuggestions; 
				var linkText = document.createTextNode("人気キーワードを表示");
				nLink.appendChild(linkText);
				parent.replaceChild(nLink, link);
			}else if(getId(ids[n]) == 'hsb'){
				document.getElementById("dssh_hsb").innerHTML = '<a href="#" onclick="showHomeSuggestions();">人気キーワードを表示</a>';
				document.getElementById("dssh_hsb").className = 'dssh_hsb_show';
			}
		}
	}
	
	setCookie("beSuggest", "0", 90);
	return false;
}

function showSuggestions(e) {
	var ids = new Array('hsb', 'rbsb', 'sbsb', 'rtsb', 'stsb');
	
	for (var n=0; n<ids.length; n++) {
		var sbox = document.getElementById(ids[n]);
		if (sbox) {
		
			/* show dsrow with updated suggestions */
			var dsrow = document.createElement("tr");
			dsrow.setAttribute("id", "dsrow_" + getId(ids[n]));
			dsrow.className = "dsrow";
			var dstb = document.getElementById("dstb_" + getId(ids[n]));
			if (dstb) {
				dstb.appendChild(dsrow);
				var query = sbox.value;
				if(query != curr_query){
					setRequestData(query, getId(ids[n]));
				}else{
					getSuggestions(query, getId(ids[n]));
				}
			}
			
			/* add events */
			addEvent(sbox, "keydown", suggestKeyUpHandler, false);
			if (getId(ids[n]) == 'tsb') {
				addEvent(sbox, "blur", clearSuggHandler, false);
			}
			
			/* flip links */			
			if (getId(ids[n]) != 'tsb' && ids[n] != 'hsb') {
				var parent = document.getElementById("dsshl_" + getId(ids[n]));
				var link = document.getElementById("dsshowsl_" + getId(ids[n]));
				var nLink = document.createElement("a");
				nLink.setAttribute("href", "/");
				nLink.setAttribute("id", "dshidesl_" + getId(ids[n]));
				nLink.onclick = hideSuggestions; 
				var linkText = document.createTextNode("人気キーワードを隠す");
				nLink.appendChild(linkText);
				parent.replaceChild(nLink, link);
			}
		}
	}
	
	setCookie("beSuggest", "0", -1);
	return false;
}

function showHomeSuggestions(){
	var sbox = document.getElementById('hsb');
	
	/* show dsrow with updated suggestions */
	var dsrow = document.createElement("tr");
	dsrow.setAttribute("id", "dsrow_hsb");
	dsrow.className = "dsrow";
	var dstb = document.getElementById("dstb_hsb");
	if (dstb) {
		dstb.appendChild(dsrow);
		//setRequestData(sbox.value, 'hsb');
		//getSuggestions(sbox.value, 'hsb');
	}
	
	/* add events */
	document.getElementById("dssh_hsb").innerHTML = '';
	document.getElementById("dssh_hsb").className = 'dssh_hsb_hide';
	setCookie("beSuggest", "0", -1);
	//setRequestData(sbox.value, 'hsb');
	//xmlhttp.onreadystatechange = function () {}
	//xmlhttp.abort();
	//setTimeout("showHomeSuggestionDelay('" + sbox.value + "')", 500);
	//getSuggestions(sbox.value, 'hsb');
	showHomeSuggestionDelay(sbox.value);
	document.searchForm.q.focus();
	return false;
}

function showHomeSuggestionDelay(query){
	if(xmlhttp.readyState == 4 || xmlhttp.readyState == 0){
		//debug.innerHTML = debug.innerHTML + 'alpha';
		if(query != curr_query){
			setRequestData(query, 'hsb');
		}else{
			getSuggestions(query, 'hsb');
		}
		var sbox = document.getElementById('hsb');
		addEvent(sbox, "keydown", suggestKeyUpHandler, false);
		addEvent(sbox, "blur", clearSuggHandler, false);
	}else{
		//debug.innerHTML = debug.innerHTML + 'beta';
		xmlhttp.abort();
		setTimeout("showHomeSuggestionDelay('" + query + "')", 500);
	}
}

