var g_arrSearchTabs = new Array();
var g_strSiteId = "";
var g_strLastSearch = "";
var g_nLastTab = 0;
var g_nLastPage = 0;
var g_nDefaultIndex = 0;
var coreSearch;
var arrSearchers = new Array();
var g_bIgnoreHashUpdate = false;
var g_strInitSearchText = "Search Support...";

function OnHashChange()
{
	if (!g_bIgnoreHashUpdate)
	{
		ResumeOnHistory(document.location.hash.substr(1));
	}
	else
	{
		UpdateSearchDisplay();
	}
	
	g_bIgnoreHashUpdate = false;
}

if (g_bNativeHistory)
{
	document.body.onhashchange = OnHashChange;
}

function ClearInitText(oTarget)
{
	if (oTarget.value == g_strInitSearchText)
	{
		oTarget.value = "";
	}
}

function SetSiteId(strId)
{
	g_strSideId = strId;
}

function AddSearchTab(strLabel, strRefinement, bDefault)
{
	var oTab = new Object();
	oTab.Label = strLabel;
	oTab.Refinement = strRefinement;
	
	if (bDefault)
	{
		g_nDefaultIndex = g_arrSearchTabs.length;
		g_nLastTab = g_nDefaultIndex;
	}
	
	g_arrSearchTabs.push(oTab);
}

function SetDefaultSearchTab(nTabIndex)
{
	g_nDefaultIndex = nTabIndex;
	g_nLastTab = nTabIndex;	
}


function DoGSearch(strSearch)
{
	// Update history
	UpdateSearch(strSearch);
	
	return false;
}

function FindDivByClassName(oParentNode, strClassName)
{
	var oCurNode = oParentNode.firstChild;
	var oResult = undefined;
	
	while (oCurNode)
	{
		if (oCurNode.nodeName == "DIV" && oCurNode.className == strClassName)
		{
			oResult = oCurNode;
			break;
		}		
		oCurNode = oCurNode.nextSibling;
	}
	
	return oResult;
}

function GetCurrentTab()
{
	var oSearchControl = document.getElementById("searchControl");
	var nIndex = 0;
	var nCurrentTab = -1;
	var strDebug = "";
	
	if (oSearchControl)
	{
		var oMainNode = FindDivByClassName(oSearchControl, "gsc-control");
		
		if (oMainNode)
		{
			var oTabsNode = FindDivByClassName(oMainNode, "gsc-tabsArea");
			
			if (oTabsNode)
			{
				var oCurNode = oTabsNode.firstChild;
				
				while (oCurNode)
				{
					if (oCurNode.nodeName == "DIV")
					{
						strDebug += oCurNode.nodeName + ": " + oCurNode.className + "\n";
						var strClassName = oCurNode.className.toLowerCase();
						if (strClassName.indexOf("gsc-tabhactive") >= 0)
						{
							strDebug += "FOUND\n";
							nCurrentTab = nIndex;
							break;
						}
						
						nIndex ++;
					}
					
					oCurNode = oCurNode.nextSibling;
				}
			}
		}
	}
	
	return nCurrentTab;
}

function GetTab(nTabIndex)
{
	var oSearchControl = document.getElementById("searchControl");
	var oTabResult = undefined;
	var nIndex = 0;
	
	if (oSearchControl)
	{
		var oMainNode = FindDivByClassName(oSearchControl, "gsc-control");
		
		if (oMainNode)
		{
			var oTabsNode = FindDivByClassName(oMainNode, "gsc-tabsArea");
			
			if (oTabsNode)
			{
				var oCurNode = oTabsNode.firstChild;
				
				while (oCurNode)
				{
					if (oCurNode.nodeName == "DIV")
					{
						if (nIndex == nTabIndex)
						{
							oTabResult = oCurNode;
							break;
						}
						
						nIndex ++;
					}
					
					oCurNode = oCurNode.nextSibling;
				}
			}
		}
	}
	
	return oTabResult;
}

function AddTabClickEvent()
{
	var oSearchControl = document.getElementById("searchControl");
	var oCurTab = undefined;
	var nIndex = 0;
	
	if (oSearchControl)
	{
		var oMainNode = FindDivByClassName(oSearchControl, "gsc-control");
		
		if (oMainNode)
		{
			var oTabsNode = FindDivByClassName(oMainNode, "gsc-tabsArea");
			
			if (oTabsNode)
			{
				var oCurNode = oTabsNode.firstChild;
				
				while (oCurNode)
				{
					if (oCurNode.nodeName == "DIV")
					{
						oCurTab = oCurNode;
						oCurTab.nTabIndex = nIndex;
						
						oCurTab.onclick = function()
						{
							SelectTabIndex(this.nTabIndex);
						}
						
						nIndex ++;
					}
					
					oCurNode = oCurNode.nextSibling;
				}
			}
		}
	}
	
	return false;
}

function GetTabContent(nTabIndex)
{

	var oSearchControl = document.getElementById("searchControl");
	var nIndex = 0;
	var oTabResult = undefined;
	
	if (oSearchControl)
	{
		var oMainNode = FindDivByClassName(oSearchControl, "gsc-control");
		
		if (oMainNode)
		{
			var oMainContent = FindDivByClassName(oMainNode, "gsc-resultsbox-visible");
			
			if (oMainContent)
			{
				var oCurNode = oMainContent.firstChild;
				
				while (oCurNode)
				{
					if (oCurNode.nodeName == "DIV")
					{
						if (nIndex == nTabIndex)
						{
							oTabResult = oCurNode;
							break;
						}
						nIndex ++;
					}
					
					oCurNode = oCurNode.nextSibling;
				}
			}
			
		}
	}
	
	return oTabResult;
}
	

function PageClicked(nPage)
{
	var nCurrentTab = GetCurrentTab();
	
	if (nPage >= 0)
	{
		
		UpdatePage(nPage);
	}
	else
	{
		if (nPage == -1)
		{
			UpdatePage(arrSearchers[nCurrentTab].cursor.currentPageIndex - 1);
		}
		else
		{
			UpdatePage(arrSearchers[nCurrentTab].cursor.currentPageIndex + 1);
		}
	}
}

function SetActiveTab(nTabIndex)
{
	var oSearchControl = document.getElementById("searchControl");
	var nIndex = 0;
	var strClassName = "";
	var arrClassNames = undefined;
	
	if (oSearchControl)
	{
		var oMainNode = FindDivByClassName(oSearchControl, "gsc-control");
		
		if (oMainNode)
		{
			var oTabsNode = FindDivByClassName(oMainNode, "gsc-tabsArea");
			
			if (oTabsNode)
			{
				var oCurNode = oTabsNode.firstChild;
				
				while (oCurNode)
				{
					if (oCurNode.nodeName == "DIV")
					{
						strClassName = oCurNode.className;
						arrClassNames = strClassName.split(" ");
						

						for (var i = 0; i < arrClassNames.length; i++)
						{
							if (nTabIndex != nIndex)
							{						
								if (arrClassNames[i] == "gsc-tabhActive")
								{
									arrClassNames[i] = "gsc-tabhInactive";
									break;
								}
							}
							else
							{
								if (arrClassNames[i] == "gsc-tabhInactive")
								{
									arrClassNames[i] = "gsc-tabhActive";
									break;
								}							
							}
						}
							
						strClassName = arrClassNames.join(" ");
						
						oCurNode.className = strClassName;

												
						nIndex ++;
					}
					
					oCurNode = oCurNode.nextSibling;
				}
			}
		}
	}
	
	nIndex = 0;
	
	if (oSearchControl)
	{
		var oMainNode = FindDivByClassName(oSearchControl, "gsc-control");
		
		if (oMainNode)
		{
			var oMainContent = FindDivByClassName(oMainNode, "gsc-resultsbox-visible");
			
			if (oMainContent)
			{
				var oCurNode = oMainContent.firstChild;
				
				while (oCurNode)
				{
					if (oCurNode.nodeName == "DIV")
					{
						strClassName = oCurNode.className;
						arrClassNames = strClassName.split(" ");
						

						for (var i = 0; i < arrClassNames.length; i++)
						{
							if (nTabIndex != nIndex)
							{						
								if (arrClassNames[i] == "gsc-tabdActive")
								{
									arrClassNames[i] = "gsc-tabdInactive";
									break;
								}
							}
							else
							{
								if (arrClassNames[i] == "gsc-tabdInactive")
								{
									arrClassNames[i] = "gsc-tabdActive";
									break;
								}							
							}
						}
							
						strClassName = arrClassNames.join(" ");
						
						oCurNode.className = strClassName;
						
						nIndex++;
					}
					
					oCurNode = oCurNode.nextSibling;
				}
			}
			
		}
	}
}

var g_bSkip = false;
function OnSearchComplete(oSearch, oSearcher)
{
	var nIndex = -1;
	
	for (var i = 0; i < arrSearchers.length; i++)
	{
		if (oSearcher == arrSearchers[i])
		{
			nIndex = i;
		}
	}
	
	var oldDivs = document.getElementById("customCursors" + nIndex);
	var oTabContent = GetTabContent(nIndex);
	
	if (oTabContent)
	{
		if (oldDivs)
		{
			oTabContent.removeChild(oldDivs);
		}

		if (arrSearchers[nIndex].cursor)
		{
			var linkDivs = document.createElement("div");
			linkDivs.setAttribute("class", "customCursors");
			linkDivs.id = "customCursors" + nIndex;
				
			// Add Previous Link
			if (arrSearchers[nIndex].cursor.currentPageIndex > 0)
			{
				var linkDiv = document.createElement("div");
				linkDiv.setAttribute("class", "customCursorPrev");
				linkDiv.className = "customCursorPrev";
				linkDiv.linkIndex = -1;			
				
				var linkText = document.createTextNode("Prev");
				linkDiv.appendChild(linkText);
				
				linkDiv.onclick = function() { PageClicked(this.linkIndex); };
				
				linkDivs.appendChild(linkDiv);
			}
			
			// alert(nIndex + " = " + arrSearchers[nIndex].cursor.estimatedResultCount)
			
			if (false)
			{
				for (var i = 0; i < arrSearchers[nIndex].cursor.pages.length; i++)
				{
					var linkDiv = document.createElement("div");
					linkDiv.linkIndex = i;	
					
					var linkText = document.createTextNode((i + 1));
					linkDiv.appendChild(linkText);
					
					if (i != arrSearchers[nIndex].cursor.currentPageIndex)
					{
						linkDiv.setAttribute("class", "customCursor");
						linkDiv.className = "customCursor";
						linkDiv.onclick = function() { PageClicked(this.linkIndex); };
					}
					else
					{
						linkDiv.setAttribute("class", "customCursorSelected");
						linkDiv.className = "customCursorSelected";
					}
					
					if (g_nLastTab == nIndex)
					{
						// alert(arrSearchers[nIndex].cursor.pages[i].label);
					}
					
					linkDivs.appendChild(linkDiv);
				}
			}
			
			// Add Next Link
			if (arrSearchers[nIndex].cursor.currentPageIndex < arrSearchers[nIndex].cursor.pages.length - 1)
			{
				var linkDiv = document.createElement("div");
				linkDiv.setAttribute("class", "customCursorNext");
				linkDiv.linkIndex = -2;			
				
				var linkText = document.createTextNode("Next");
				linkDiv.appendChild(linkText);
				
				linkDiv.onclick = function() { PageClicked(this.linkIndex); };
				linkDiv.className = "customCursorNext";
				
				linkDivs.appendChild(linkDiv);
			}
			
			oTabContent.appendChild(linkDivs);
		}
	}
	
	var oTab = GetTab(nIndex);
	oTab.nTabIndex = nIndex;
	oTab.onclick = function()
	{
		UpdateTab(this.nTabIndex);
	}
	
	if (g_nLastTab == nIndex)
	{

		// GetTab(nIndex).onclick();
		SetActiveTab(nIndex);
		
		if (arrSearchers[nIndex].cursor)
		{
			if (arrSearchers[nIndex].cursor.currentPageIndex != g_nLastPage  && g_nLastPage < arrSearchers[nIndex].cursor.pages.length)
			{
				arrSearchers[nIndex].gotoPage(g_nLastPage);
			}
		}
	}
		
	window.scrollTo(0, 0);
}

function SolutionLoad() 
{
	var options = new GsearcherOptions();
	options.setNoResultsString(google.search.SearchControl.NO_RESULTS_DEFAULT_STRING);

	// create the search control
	coreSearch = new GSearchControl();
	coreSearch.setSearchCompleteCallback(null, OnSearchComplete);
	coreSearch.setLinkTarget(GSearch.LINK_TARGET_SELF);
	coreSearch.setResultSetSize(GSearch.LARGE_RESULTSET);

	// prep for decoupled search form
	var drawOptions = new GdrawOptions();
	drawOptions.setInput(document.getElementById("gsearch_body"));
	drawOptions.setDrawMode(GSearchControl.DRAW_MODE_TABBED);

	// Create the searcher
	for (var i = 0; i < g_arrSearchTabs.length; i++)
	{
		var searcher = new GwebSearch();
		searcher.setUserDefinedLabel(g_arrSearchTabs[i].Label);
		
		if (g_arrSearchTabs[i].Refinement == "")
		{
			searcher.setSiteRestriction(g_strSideId);
		}
		else
		{
			searcher.setSiteRestriction(g_strSideId, g_arrSearchTabs[i].Refinement);
		}
		
		searcher.setRestriction(google.search.Search.RESTRICT_EXTENDED_ARGS, { "filter" : "0"});
		
		coreSearch.addSearcher(searcher, options);
		arrSearchers.push(searcher);
	}
		
	coreSearch.draw(document.getElementById("searchControl"), drawOptions);
	coreSearch.input.onkeyup = null;

	/****************************************************/
	// HISTORY LISTENER
	/****************************************************/
	if (g_bUseUnfocus)
	{
		this.historyListener = function(strHistoryHash) 
		{
			ResumeOnHistory(strHistoryHash);
		};

		unFocus.History.addEventListener('historyChange', this.historyListener);
	}
	
	// We just loaded this page, so lets see if there is any history data
	
	ResumeOnHistory(document.location.hash.substr(1));
	
	
}

function ResumeOnHistory(strHistoryHash)
{
	strHistoryHash = decodeURI(strHistoryHash);
	
	var nPos = strHistoryHash.indexOf(",");
	var nTab = Number(strHistoryHash.substr(0, nPos));
	
	strHistoryHash = strHistoryHash.substr(nPos + 1);
	nPos = strHistoryHash.indexOf(",");
	
	var nPage = Number(strHistoryHash.substr(0, nPos));
	
	var strSearch = strHistoryHash.substr(nPos + 1);
	
	
	if (strSearch != "")
	{
		if (g_strLastSearch != strSearch)
		{
			g_strLastSearch = strSearch;
			g_nLastTab = nTab;
			g_nLastPage = nPage;
			coreSearch.execute(g_strLastSearch);
		}
		else 
		{
			if (nTab != g_nLastTab)
			{
				g_nLastTab = nTab;
				
				SetActiveTab(g_nLastTab);
			}
			
			if (nPage != g_nLastPage)
			{
				var nCurrentTab = GetCurrentTab();
				
				g_nLastPage = nPage;
				
				arrSearchers[nCurrentTab].gotoPage(g_nLastPage);
			}
		}
	}
	else
	{
		g_strLastSearch = "";
		
		coreSearch.clearAllResults();
		
		document.getElementById("gsearch_body").value = g_strInitSearchText;

		g_nLastTab = g_nDefaultIndex;
	}

	UpdateSearchDisplay();
}

function AddHistory(strHash, strType, oValue)
{
	var bExecute = false;
	
	if (g_bNativeHistory)
	{
		g_bIgnoreHashUpdate = true;
		document.location.hash = "#" + strHash;
		bExecute = true;	
	}
	else if (g_bUseUnfocus)
	{
		unFocus.History.addHistory(encodeURI(strHash));
	}
	
	if (bExecute)
	{
		switch (strType)
		{
			case "search":
				g_strLastSearch = oValue;
				g_nLastPage = 0;
				g_nLastTab = g_nDefaultIndex;

				coreSearch.execute(g_strLastSearch);
				break;
			case "page":
				var nCurrentTab = GetCurrentTab();
				g_nLastPage = Number(oValue);
				arrSearchers[nCurrentTab].gotoPage(g_nLastPage);
				break;
			case "tab":
				g_nLastTab = Number(oValue);
				SetActiveTab(g_nLastTab);
				break;
		}
	}
}

function UpdateSearch(strSearch)
{
	var strHash = "";
	
	strHash = g_nLastTab + ",0," + strSearch;
	
	AddHistory(strHash, "search", strSearch);	
}

function UpdatePage(nPage)
{
	var strHash = "";
	
	strHash = g_nLastTab + "," + nPage + "," + g_strLastSearch;
	
	AddHistory(strHash, "page", nPage);
}

function UpdateTab(nTab)
{
	var strHash = "";
	
	strHash = nTab + "," + g_nLastPage + "," + g_strLastSearch;
	
	AddHistory(strHash, "tab", nTab);
}

function InitSearch()
{
	registerLoadHandler(SolutionLoad);
}

function registerLoadHandler(handler) 
{
	var node = window;
	
	if (node.addEventListener) 
	{
		node.addEventListener("load", handler, false);
	} 
	else if (node.attachEvent) 
	{
		node.attachEvent("onload", handler);
	} 
	else 
	{
		node['onload'] = handler;
	}
	
	return true;
}

