/* http://www.kryogenix.org/code/browser/searchhi/ */
/* Modified 20021006 to fix query string parsing and add case insensitivity */
/* Modified 20070316 to stop highlighting inside nosearchhi nodes */
/* Modified 20080209 to support more spiders(Baidu &. Tencent SOSO), also fixed the [GB2312 UrlEn/Decode Problem] in Google. Modified by heeroyuyj*/
function highlightWord(node,word)
{
	if (node.hasChildNodes) // Iterate into this nodes childNodes
	{
		var hi_cn;
		for (hi_cn=0;hi_cn<node.childNodes.length;hi_cn++)
		{
			highlightWord(node.childNodes[hi_cn],word);
		}
	}
	
	// And do this node itself
	if (node.nodeType == 3) // text node
	{
		tempNodeVal = node.nodeValue.toLowerCase();
		tempWordVal = word.toLowerCase();
		if (tempNodeVal.indexOf(tempWordVal) != -1)
		{
			pn = node.parentNode;
			// check if we're inside a "nosearchhi" zone
			checkn = pn;
			while (checkn.nodeType != 9 && 
			checkn.nodeName.toLowerCase() != 'body') // 9 = top of doc
			{
				if (checkn.className.match(/\bnosearchhi\b/)) { return; }
				checkn = checkn.parentNode;
			}
			if (pn.className != "searchword")
			{
				// word has not already been highlighted!
				nv = node.nodeValue;
				ni = tempNodeVal.indexOf(tempWordVal);
				// Create a load of replacement nodes
				before = document.createTextNode(nv.substr(0,ni));
				docWordVal = nv.substr(ni,word.length);
				after = document.createTextNode(nv.substr(ni+word.length));
				hiwordtext = document.createTextNode(docWordVal);
				hiword = document.createElement("span");
				hiword.className = "searchword";
				hiword.appendChild(hiwordtext);
				pn.insertBefore(before,node);
				pn.insertBefore(hiword,node);
				pn.insertBefore(after,node);
				pn.removeChild(node);
			}
		}
	}
}

function UrlEncode(str)
{
	var ret = "";
	var strSpecial = "!\"#$%&'()*+,/:;<=>?[]^`{|}~%";
	for (var i=0; i<str.length; i++)
	{
		var chr = str.charAt(i);
		var c = str2asc(chr);
		if (parseInt("0x"+c) > 0x7f)
		{
			ret += "%" + c.slice(0,2) + "%" + c.slice(-2);
		}
		else
		{
			if (chr == " ")
				ret += "+";
			else if (strSpecial.indexOf(chr) != -1)
				ret += "%" + c.toString(16);
			else
				ret += chr;
		}
	}
	return ret;
}

function UrlDecode(str)
{
	var ret = "";
	for (var i=0; i<str.length; i++)
	{
		var chr = str.charAt(i);
		if (chr == "+")
		{
			ret+=" ";
		}
		else if(chr=="%")
		{
			var asc = str.substring(i+1,i+3);
			if (parseInt("0x"+asc)>0x7f)
			{
				ret+=asc2str(parseInt("0x"+asc+str.substring(i+4,i+6)));
				i+=5;
			}
			else
			{
				ret+=asc2str(parseInt("0x"+asc));
				i+=2;
			}
		}
		else
		{
			ret+= chr;
		}
	}
	return ret;
}

function SearchHighlight()
{
	if (!document.createElement) return;
	ref = document.referrer;
	if (ref.indexOf('?') == -1) return;
	qs = ref.substr(ref.indexOf('?')+1);
	qsa = qs.split('&');
	for (i=0;i<qsa.length;i++)
	{
		qsip = qsa[i].split('=');
		if (qsip.length == 1) continue;
		if (qsip[0] == 'q' || qsip[0] == 'p' || qsip[0] == 'wd' || qsip[0] == 'w') // q = Google, p = Yahoo!, wd = Baidu, w = Tencent SOSO
		{
			if (qsip[0] == 'q')
			{
				if (ref.indexOf('GB2312') == -1)
					words = unescape(decodeURIComponent(qsip[1].replace(/\+/g,' '))).split(/\s+/); // For None_GB2312_UrlEncode Google
				else
					words = unescape(UrlDecode(qsip[1].replace(/\+/g,' '))).split(/\s+/); // For GB2312_UrlEncoded Google
			}
			else if (qsip[0] == 'p') // For Yahoo!
			{
				words = unescape(decodeURIComponent(qsip[1].replace(/\+/g,' '))).split(/\s+/);
			}
			else if (qsip[0] == 'wd' || qsip[0] == 'w') // For Baidu and Tencent SOSO
			{
				execScript('wd = DeCodeAnsi("'+qsip[1]+'")','vbscript');
				words = decodeURI(wd.replace(/\+/g,' ')).split(/\s+/);
			}
			else words = unescape(qsip[1].replace(/\+/g,' ')).split(/\s+/); // For Unknown Spider
			for (w=0;w<words.length;w++)
			{
				highlightWord(document.getElementsByTagName("body")[0],words[w]);
			}
		}
	}
}