﻿                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
//whitepace above bec of compression issue, do not remove                                                                                                    
//Based on script by Julian Robichaux-http://www.nsftools.com/tips/ZipLookupTest.htm
var queryField;
var scaleField;
var globalDiv;
var searchHiddenControl;
var quit = false; 
var divName = "querydiv";
var ifName = "queryiframe";
var previousSearchQuery = ""; 
var searchQuery = ""; 
var previousSearchScale = "";
var searchScale = "";
var cache = new Object(); 
var divFormatted = false; 
var DIV_FG_COLOR = "#000000";
var DIV_BG_COLOR = "#FFFFFF";
var DIV_HIGHLIGHT_FG_COLOR = "#FFFFFF"; 
var DIV_HIGHLIGHT_BG_COLOR = "#006b97"; 
var bInitQueryCodeComplete = false;
var TimerID = null;
var UserStartedTyping = false;

var debugFoundInCache = 0;
var debugNotFoundInCache = 0;
var debugHTTPQueries = 0;

// TODO:

function makerOnFocusHandler()
{
	if (bInitQueryCodeComplete && (TimerID == null))
		TimerID = setInterval("mainLoop()", 100);
}

function InitQueryCode()
{
	searchHiddenControl = document.getElementById("makerHidden");
	queryField = document.getElementById("maker");
	scaleField = document.getElementById("scale");
	if (searchHiddenControl && queryField && scaleField)
	{
		queryField.onblur = hideDiv;
		queryField.onkeydown = keypressHandler;
		addToCache("", "", new Array());
		bInitQueryCodeComplete = true;
		if ((TimerID == null) && UserStartedTyping)
			TimerID = setInterval("mainLoop()", 100);
	}
}

function addToCache(localSearchQuery, localSearchScale, resultArray1)
{
	if (localSearchQuery)
	{
		if (localSearchQuery.length > 0)
		{
			if(resultArray1.length == 0)
			{
				return;
			}
		}
		
		cache[localSearchQuery + '\t' + localSearchScale] = new Array(resultArray1);
	}
}

mainLoop = function() 
{
	if (quit == false)
	{
		searchQuery = escape(queryField.value);
		searchQuery = unescape(queryField.value);
		try
		{
			if (scaleField.options)
			{
				searchScale = escape(scaleField.options[scaleField.selectedIndex].value);
				searchScale = unescape(scaleField.options[scaleField.selectedIndex].value);
			}
			else
			{
				searchScale = escape(scaleField.value);
				searchScale = unescape(scaleField.value);
			}
		}
		catch (E)
		{
			searchScale = escape(scaleField.value);
			searchScale = unescape(scaleField.value);
		}
		
		if(searchQuery.length == 0)
		{
			showDiv(false);
			previousSearchQuery = searchQuery;
			previousSearchScale = searchScale;
			return true;
		}
		
		if (previousSearchQuery != searchQuery)
		{
			var cacheResult = cache[searchQuery + '\t' + searchScale];
			if (cacheResult)
			{
				debugFoundInCache++;
				showQueryDiv(searchQuery, searchQuery, searchScale, 0, cacheResult[0]);
			}
			else
			{
				debugNotFoundInCache++;
				Query(searchQuery, searchScale);
			}
			
			previousSearchQuery = searchQuery;
			previousSearchScale = searchScale;
			queryField.focus();
		 }
		 
		return true;
	}
};

function getDiv (divID)
{
	if (!globalDiv) {
	if (!document.getElementById(divID)) {
		var newNode = document.createElement("div");
		newNode.setAttribute("id", divID);
		document.body.appendChild(newNode);
	}
	
	globalDiv = document.getElementById(divID);
	var x = queryField.offsetLeft;
	var y = queryField.offsetTop + queryField.offsetHeight;
	var parent = queryField;
	while (parent.offsetParent) {
		parent = parent.offsetParent;
		x += parent.offsetLeft;
		y += parent.offsetTop;
	}

	if (!divFormatted) {
		globalDiv.style.textAlign = 'left';
		globalDiv.style.color = DIV_FG_COLOR;
		globalDiv.style.backgroundColor = DIV_BG_COLOR;
		globalDiv.style.border = "1px solid #666666";
		globalDiv.className = "AC_SearchDiv";
		globalDiv.style.position = "absolute";
		globalDiv.style.left = x + "px";
		globalDiv.style.top = y + "px";
		globalDiv.style.visibility = "hidden";
		globalDiv.style.zIndex = 10000;
	
		divFormatted = true;
	}
	}
	return globalDiv;
}

function showQueryDiv(localSearchHTML, localSearchQuery, localSearchScale, localSearchCount, resultArray1) 
{
	var localTempSearchHTML = '';
	var localTempSearchQuery = '';
	var localTempSearchScale = '';
	var localTempSearchCount = 0;
	
	var div = getDiv(divName);
	
	// remove any results that are already there
	while (div.childNodes.length > 0)
	{
		div.removeChild(div.childNodes[0]);
	}
	
	// add an entry for each of the results in the resultArray
	for (var i = 0; i < resultArray1.length; i++)
	{
		var resArray = resultArray1[i].split("\t");
		
		if (resArray.length >= 3)
		{
			if (resArray.length >= 0) { localTempSearchHTML = resArray[0]; } else { localTempSearchHTML = ''; }
			if (resArray.length >= 1) { localTempSearchQuery = resArray[1]; } else { localTempSearchQuery = ''; }
			if (resArray.length >= 2) { localTempSearchScale = resArray[2]; } else { localTempSearchScale = ''; }
			if (resArray.length >= 3) { localTempSearchCount = resArray[3]; } else { localTempSearchCount = 0; }
			
			// each result will be contained within its own div
			var result = document.createElement("div");
			result.style.textAlign = 'left';
			result.style.height = '16px';
			result.style.cursor = "pointer";
			result.style.padding = "3px 0px 3px 0px";
			_unhighlightResult(result);
			result.onmousedown = selectResult;
			result.onmouseover = highlightResult;
			result.onmouseout = unhighlightResult;
		
			var result1 = document.createElement("span");
			result1.style.textAlign = 'left';
			result1.className = "AC_left";
			result1.innerHTML = localTempSearchHTML;
			
			var result2 = document.createElement("span");
			result2.style.textAlign = 'left';
			result2.className = "AC_right";	 	
			result2.innerHTML = localTempSearchCount;
		
			var result3 = document.createElement("span");
			result3.style.textAlign = 'left';
			result3.className = "AC_hidden";
			result3.style.visibility = "hidden";
			result3.innerHTML = localTempSearchQuery;
			
			var result4 = document.createElement("span");
			result4.style.textAlign = 'left';
			result4.className = "AC_hidden";
			result4.style.visibility = "hidden";
			result4.innerHTML = localTempSearchScale;
			
			result.appendChild(result1);
			result.appendChild(result2);
			result.appendChild(result3);
			result.appendChild(result4);
			div.appendChild(result);
		}
	}
	
	// if this resultset isn't already in our cache, add it
	var isCached = cache[localSearchQuery + '\t' + localSearchScale];
	if (!isCached)
	{
		addToCache(localSearchQuery, localSearchScale, resultArray1);
	}
	
	// display the div if we had at least one result
	if (resultArray1.length > 0)
	{
		showDiv(true);
	}
	else
	{
		showDiv(false);
	}
}

function selectResult()
{
	_selectResult(this, true);
}

function _selectResult(item, bDoSubmit)
{
	var localSearchHTML = '';
	var localSearchQuery = '';
	var localSearchScale = '';
	var localSearchCount = 0;
	
	var spans = item.getElementsByTagName("span");

	if (spans)
	{
		if (spans.length >= 0) { localSearchHTML = spans[0].innerHTML; } else { localSearchHTML = ''; }
		if (spans.length >= 2) { localSearchQuery = spans[2].innerHTML; } else { localSearchQuery = ''; }
		if (spans.length >= 3) { localSearchScale = spans[3].innerHTML; } else { localSearchScale = ''; }
		if (spans.length >= 1) { localSearchCount = spans[1].innerHTML; } else { localSearchCount = 0; }
			
		queryField.value = unescapeHTML(localSearchQuery);
		searchHiddenControl.value = localSearchScale;
		previousSearchQuery = searchQuery = localSearchQuery; // queryField.value;
		previousSearchScale = searchScale = localSearchScale; // scaleField.options[scaleField.selectedIndex].value;
		showDiv(false);
		quit = true;
		
		if (bDoSubmit)
		{
			submitForm();
		}
		return;
	}
}

//called when a user mouses over a lookup result
function highlightResult()
{
	_highlightResult(this);
}

// highlights the selected result
function _highlightResult(item)
{
	item.style.color = DIV_HIGHLIGHT_FG_COLOR;
	item.style.backgroundColor = DIV_HIGHLIGHT_BG_COLOR;
}

// called when a user mouses away from a lookup result
function unhighlightResult()
{
	_unhighlightResult(this);
}

// unhighlights the selected result
function _unhighlightResult(item)
{
	item.style.color = DIV_FG_COLOR;
	item.style.backgroundColor = DIV_BG_COLOR;
}

function showDiv (show)
{
	var div = getDiv(divName);
	if (show){
	div.style.visibility = "visible";
	}
	else{
	div.style.visibility = "hidden";
	}
	adjustiFrame();
}

function hideDiv ()
{
	showDiv(false);
}

function adjustiFrame()
{
	if (!document.getElementById(ifName)) {
	var newNode = document.createElement("iFrame");
	newNode.setAttribute("id", ifName);
	newNode.setAttribute("src", "javascript:false;");
	newNode.setAttribute("scrolling", "no");
	newNode.setAttribute("frameborder", "0");
	document.body.appendChild(newNode);
	}
	
	iFrameDiv = document.getElementById(ifName);
	var div = getDiv(divName);
	
	try {
	iFrameDiv.style.position = "absolute";
	iFrameDiv.style.width = div.offsetWidth+'px';
	iFrameDiv.style.height = div.offsetHeight+'px';
	iFrameDiv.style.top = div.style.top;
	iFrameDiv.style.left = div.style.left;
	iFrameDiv.style.zIndex = div.style.zIndex - 1;
	iFrameDiv.style.visibility = div.style.visibility;
	} catch(e) {
	}
}

function keypressHandler (evt)
{
	quit = false;
	UserStartedTyping = true;
	if (bInitQueryCodeComplete && (TimerID == null))
		TimerID = setInterval("mainLoop()", 100);

	var div = getDiv(divName);
// don't do anything if the div is hidden - unsure why this code was commented?
 // if (div.style.visibility == "hidden")
 //	 return true;
 
 // make sure we have a valid event variable
	if(!evt && window.event) {
	evt = window.event;
	}

	var key = evt.keyCode;
	// if this key isn't one of the ones we care about, just return
	var KEYUP = 38;	var KEYDOWN = 40;	var KEYENTER = 13;	var KEYTAB = 9;
	
	if ((key != KEYUP) && (key != KEYDOWN) && (key != KEYENTER) && (key != KEYTAB))
	{
	searchHiddenControl.value = "";
	return true;
	}

	// get the span that's currently selected, and perform an appropriate action
	var selNum = getSelectedSpanNum(div);
	var selSpan = setSelectedSpan(div, selNum);
	
	if (key == KEYENTER) 
	{ 
	if (selSpan)
		_selectResult(selSpan, false); //don't submit yet
	submitForm();
	evt.cancelBubble=false;
	return false;
	} 
	else if (key == KEYTAB)
	{
	 if (selSpan)
		_selectResult(selSpan, false);
	 evt.cancelBubble=false;
	 return true;
	}
	else {
	if (key == KEYUP){
		selSpan = setSelectedSpan(div, selNum - 1);
		}
	if (key == KEYDOWN){
		selSpan = setSelectedSpan(div, selNum + 1);
		}
	if (selSpan){
		_highlightResult(selSpan);
		}
	}
	showDiv(true);
	return true;
}

function getSelectedSpanNum (div)
{
	var count = -1;
	var spans = div.getElementsByTagName("div");
	if (spans) {
	for (var i = 0; i < spans.length; i++) {
		count++;
		if (spans[i].style.backgroundColor != div.style.backgroundColor)
		return count;
	}
	}
	return -1;
}

function setSelectedSpan (div, spanNum)
{
	var count = -1;
	var thisSpan;
	var spans = div.getElementsByTagName("div");
	if (spans) {
	for (var i = 0; i < spans.length; i++) {
		if (++count == spanNum) {
		_highlightResult(spans[i]);
		thisSpan = spans[i];
		} else {
		_unhighlightResult(spans[i]);
		}
	}
	}
	return thisSpan;
}

	function escapeHTML(text) {
	var div = document.createElement('div');
	var text = document.createTextNode(this);
	div.appendChild(text);
	return div.innerHTML;
	}

	function unescapeHTML(text) {
	var div = document.createElement('div');
	div.innerHTML = stripTags(text);
	return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
	}

	function stripTags (text){
	return text.replace(/<\/?[^>]+>/gi, '');
	}
 
function focusById(elem)
{
	if(elem)
	{
	elem.focus();
	MoveToEnd(elem);
	elem.focus();
	}
}

function MoveToEnd(Element){
	if ( Element.createTextRange )
	Element.createTextRange().text += "";
	else if ( Element.insertionPoint )
	Element.insertionPoint = Element.text.length; 
}

var xmlHttpAC = null;

function Query(searchQuery, searchScale)
{
	if (searchQuery)
	{
		if (searchQuery.length > 0)
		{
			var strUrl = '';
			try
			{
				strUrl = '/tasks/AjaxSearch.asp?query=' + escape(searchQuery) + '&scale=' + escape(searchScale);
				debugHTTPQueries++;
				xmlHttpAC = GetXmlHttpObject(ACEvent);
				if(xmlHttpAC != null)
				{
					xmlHttpAC.open("GET", strUrl , true);
					xmlHttpAC.send(null);
				}
			}
			catch (E)
			{
			}
		}
	}
}

function ACEvent()
{
	var localSearchHTML = '';
	var localSearchQuery = '';
	var localSearchScale = '';
	var localSearchCount = 0;
	
	if (xmlHttpAC.readyState==4 || xmlHttpAC.readyState=="complete")
	{
		var strText = xmlHttpAC.responseText;		
		var resultArr;

		if (strText != null)
		{
			resultArr = strText.split("\r\n");

			// Always return the first element as the user's query rather than the results of query.
			// This is so that we can definitely know what the response is for and can then cache their request.
			var localSearchQueryScaleCount = resultArr[0];
			var resultArr2 = localSearchQueryScaleCount.split('\t');
			
			if (resultArr2.length >= 0) { localSearchHTML = resultArr2[0]; } else { localSearchHTML = ''; }
			if (resultArr2.length >= 1) { localSearchQuery = resultArr2[1]; } else { localSearchQuery = ''; }
			if (resultArr2.length >= 2) { localSearchScale = resultArr2[2]; } else { localSearchScale = ''; }
			if (resultArr2.length >= 3) { localSearchCount = resultArr2[3]; } else { localSearchCount = 0; }
			
			// We then remove their query from the beginning of the result array.
			// Removes and returns first element of array, reduces size of the array.
			resultArr.shift();
			
			showQueryDiv(localSearchHTML, localSearchQuery, localSearchScale, localSearchCount, resultArr);
		}
		
		return;						
	}
}

function submitForm()
{
	var submitPage = "";
	var queryFieldVal = queryField.value;
	var scaleFieldVal = '';
	try
	{
		if (scaleField.options)
		{
			scaleFieldVal = scaleField.options[scaleField.selectedIndex].value;
		}
		else
		{
			scaleFieldVal = scaleField.value;
		}
	}
	catch (E)
	{
		scaleFieldVal = scaleField.value;
	}
	
	//queryFieldVal = EncodeCrossBrowser(queryFieldVal);
	//scaleFieldVal = EncodeCrossBrowser(scaleFieldVal);
	
	submitPage = '/showroom3.asp?maker=' + queryFieldVal + '&scale=' + scaleFieldVal + '&searchMode=1';

	window.location = submitPage;
	return false;
}

function GetXmlHttpObject(handler)
{ 
	var objXmlHttp = null;

	if (navigator.userAgent.indexOf("Opera")>=0)
	{
		return null; 
	}
	if (navigator.userAgent.indexOf("MSIE")>=0)
	{ 
		var strName="Msxml2.XMLHTTP";
		if (navigator.appVersion.indexOf("MSIE 5.5")>=0)
		{
			strName="Microsoft.XMLHTTP";
		} 
		try
		{ 
			objXmlHttp = new ActiveXObject(strName);
			objXmlHttp.onreadystatechange = handler;
			return objXmlHttp;
		} 
		catch(e)
		{ 
			// alert("Error. Scripting for ActiveX might be disabled");
			return null;
		} 
	} 
	if (navigator.userAgent.indexOf("Mozilla")>=0)
	{
		objXmlHttp = new XMLHttpRequest();
		objXmlHttp.onload = handler;
		objXmlHttp.onerror = handler;
		return objXmlHttp;
	}
	return null;
}


if (window.attachEvent) 
	 { window.attachEvent("onload", function() {InitQueryCode();}); } 
else 
	 { window.addEventListener("load", function() {InitQueryCode(); }, false); }