

//Listing 10.6
function SetProperties(xElem,xHidden,xserverCode,
xignoreCase,xmatchAnywhere,xmatchTextBoxWidth,
xshowNoMatchMessage,xnoMatchingDataMessage,xuseTimeout,
xtheVisibleTime){
    var props={
    elem: xElem,
    hidden: xHidden,
    serverCode: xserverCode,
    regExFlags: ( (xignoreCase) ? "i" : "" ),
    regExAny: ( (xmatchAnywhere) ? "" : "^" ),
    matchAnywhere: xmatchAnywhere,
    matchTextBoxWidth: xmatchTextBoxWidth,
    theVisibleTime: xtheVisibleTime,
    showNoMatchMessage: xshowNoMatchMessage,
    noMatchingDataMessage: xnoMatchingDataMessage,
    useTimeout: xuseTimeout
    };
    AddHandler(xElem);
    return props;
}

//Listing  10.8
var isOpera=(navigator.userAgent.toLowerCase().indexOf("opera")!= -1);
function AddHandler(objText){
	objText.onkeyup = GiveOptions;
	objText.onblur = function(){
    if(this.obj.useTimeout)StartTimeout();
	}
	if(isOpera)objText.onkeypress = GiveOptions;
}

//Listing 10.9
var arrOptions = new Array();
var strLastValue = "";
var bMadeRequest;
var theTextBox;
var objLastActive;
var currentValueSelected = -1;
var bNoResults = false;
var isTiming = false;

//Listing 10.10
function GiveOptions(e)
{

	var intKey = -1;
	
	if(window.event)
	{
		intKey = event.keyCode;
		theTextBox = event.srcElement;
	}
	else
	{
		intKey = e.which;
		theTextBox = e.target;
	}

	if(theTextBox.obj.useTimeout)
	{
		if(isTiming) EraseTimeout();
		
		StartTimeout();
	}

	if(theTextBox.value.length == 0 && !isOpera)
	{
		arrOptions = new Array();
		HideTheBox();
		strLastValue = "";
		return false;
	}
	
	if(objLastActive == theTextBox)
	{
		if(intKey == 13)
		{
			GrabHighlighted();
			theTextBox.blur();
			return false;
		}
		else if(intKey == 38)
		{
			MoveHighlight(-1);
			return false;
		}
		else if(intKey == 40)
		{
			MoveHighlight(1);
			return false;
		}
		else	
		{
		
		}
	}

		
	if(objLastActive != theTextBox 
		|| theTextBox.value.indexOf(strLastValue) != 0 
		|| ((arrOptions.length==0 
		|| arrOptions.length==15 ) && !bNoResults)
		|| (theTextBox.value.length != strLastValue.length)) //<=
	{		
		objLastActive = theTextBox;
      bMadeRequest = true
      TypeAhead(theTextBox.value)
	}
	else if(!bMadeRequest)
	{
		BuildList(theTextBox.value);
	}
	
	strLastValue = theTextBox.value;
}


//Listing 10.11
function TypeAhead(xStrText)
{	
	var strParams = new String("q=" + xStrText + "&where=" + theTextBox.obj.matchAnywhere);
	strParams = strParams.replace(' ','%20')
		
	var loader1 = new net.ContentLoader(theTextBox.obj.serverCode, BuildChoices,null,"POST",strParams);
}

//Listing 10.12
function BuildChoices(){
var strText = this.req.responseText;
eval(strText);
BuildList(strLastValue);
bMadeRequest = false;
}

//Listing 10.13
function BuildList(theText)
{
	SetElementPosition(theTextBox);
	var theMatches = MakeMatches(theText);
	theMatches = theMatches.join().replace(/\,/gi,"");
	if(theMatches.length > 0)
	{
		document.getElementById("spanOutput").innerHTML = theMatches;
		document.getElementById("OptionsList_0").className = "spanHighElement";
		currentValueSelected = 0;
		bNoResults = false;		
				
		var oSpan = document.getElementById("spanOutput");
		MM_hideDropDowns(oSpan);		
	}
	else
	{
		currentValueSelected = -1;
		bNoResults = true;
		if(theTextBox.obj.showNoMatchMessage)
			document.getElementById("spanOutput").innerHTML =
				"<span class='noMatchData'>" + theTextBox.obj.noMatchingDataMessage + "</span>";
		else HideTheBox();
	}
}


//Listing 10.14
function SetElementPosition(theTextBoxInt){
var selectedPosX = 0;
var selectedPosY = 0;
var theElement = theTextBoxInt;
if (!theElement) return;
var theElemHeight = theElement.offsetHeight;
var theElemWidth = theElement.offsetWidth;
while(theElement != null){
    selectedPosX += theElement.offsetLeft;
    selectedPosY += theElement.offsetTop;
    theElement = theElement.offsetParent;
}
xPosElement = document.getElementById("spanOutput");
xPosElement.style.left = selectedPosX + 'px';
if(theTextBoxInt.obj.matchTextBoxWidth)
    xPosElement.style.width = theElemWidth + 'px';
xPosElement.style.top = selectedPosY + theElemHeight + 'px';
xPosElement.style.display = "block";
if(theTextBoxInt.obj.useTimeout){
    xPosElement.onmouseout = StartTimeout;
    xPosElement.onmouseover = EraseTimeout;
}
else{
    xPosElement.onmouseout = null;
    xPosElement.onmouseover = null;
}
}

//Listing 10.15
var countForId = 0;
function MakeMatches(xCompareStr){
	countForId = 0;
	var matchArray = new Array();
	var regExp = new RegExp(theTextBox.obj.regExAny +
		xCompareStr,theTextBox.obj.regExFlags);
	for(i=0;i<arrOptions.length;i++){
		var theMatch = arrOptions[i][0].match(regExp);
		if(theMatch){
		matchArray[matchArray.length]=
			CreateUnderline(arrOptions[i][0],
			xCompareStr,i);
		}
	}
	return matchArray;
}


//Listing 10.16
var undeStart = "<span class='spanMatchText'>";
var undeEnd = "</span>";
var selectSpanStart = "<span style='width:100%;display:block;' class='spanNormalElement' onmouseover='SetHighColor(this)' ";
var selectSpanEnd ="</span>";

function CreateUnderline(xStr,xTextMatch,xVal){
selectSpanMid = "onclick='SetText(" + xVal + ")'" +
    "id='OptionsList_" +
    countForId + "' theArrayNumber='"+ xVal +"'>";
var regExp = new RegExp(theTextBox.obj.regExAny +
xTextMatch,theTextBox.obj.regExFlags);
var aStart = xStr.search(regExp);
var matchedText = xStr.substring(aStart,
    aStart + xTextMatch.length);
countForId++;
return selectSpanStart + selectSpanMid +
    xStr.replace(regExp,undeStart +
    matchedText + undeEnd) + selectSpanEnd;
}

//Listing 10.17
function MoveHighlight(xDir){
if(currentValueSelected >= 0){
    newValue = parseInt(currentValueSelected) + parseInt(xDir);
    if(newValue > -1 && newValue < countForId){
    currentValueSelected = newValue;
    SetHighColor (null);
    }
}
}

function SetHighColor(theTextBox){
if(theTextBox){
    currentValueSelected =
    theTextBox.id.slice(theTextBox.id.indexOf("_")+1,
    theTextBox.id.length);
}
for(i = 0; i < countForId; i++){
    document.getElementById('OptionsList_' + i).className =
    'spanNormalElement';
}
document.getElementById('OptionsList_' +
    currentValueSelected).className = 'spanHighElement';

}

//Listing 10.18
function SetText(xVal)
{

	theTextBox.value = arrOptions[xVal][0]; //set text value
	theTextBox.obj.hidden.value = arrOptions[xVal][1];
	document.getElementById("spanOutput").style.display = "none";
	currentValueSelected = -1; //remove the selected index

	//added for min / max price based on community 13Aug2008
	//alert('settext1');
	loadXMLDoc('/MinMaxData.asp', arrOptions[xVal][0]);

	MM_showDropDowns();	

}

function GrabHighlighted(){
if(currentValueSelected >= 0){
    xVal = document.getElementById("OptionsList_" +
    currentValueSelected).getAttribute("theArrayNumber");
    SetText(xVal);
    HideTheBox();

}
}
function HideTheBox()
{
	document.getElementById("spanOutput").style.display = "none";
	currentValueSelected = -1;
	EraseTimeout();
	
	MM_showDropDowns();	

}

//Listing 10.19
function EraseTimeout(){
clearTimeout(isTiming);
isTiming = false;
}

function StartTimeout(){
isTiming = setTimeout("HideTheBox()",
theTextBox.obj.theVisibleTime);

}

// Added functions to hide any dropdowns obstructing menus CTH 8-18-05
function MM_hideDropDowns(divMenu)
{	
	if(document.all) {
		objDropDowns = document.all.tags("SELECT");
	} else { 
		objDropDowns = document.getElementsByTagName('SELECT');
	}
	
	var menuX1 = divMenu.offsetLeft;
	var menuX2 = divMenu.offsetLeft + divMenu.offsetWidth;
	var menuY1 = divMenu.offsetTop;
	var menuY2 = divMenu.offsetTop + divMenu.offsetHeight;
	
	var objDropDown;
	
	//alert(menuX1 + ',' + menuY1 + ' : ' + menuX2 + ',' + menuY2)
	
	for(i = 0; i < objDropDowns.length; i++)
	{		
		intX1 = getElementPosition(objDropDowns[i].id).left;
		intX2 = getElementPosition(objDropDowns[i].id).left + objDropDowns[i].offsetWidth;
		intY1 = getElementPosition(objDropDowns[i].id).top;
		intY2 = getElementPosition(objDropDowns[i].id).top + objDropDowns[i].offsetHeight;
		
		//alert(objDropDowns[i].id + ' : ' + intX1 + ', ' + intY1 + ' - ' + intX2 + ', ' + intY2)
		
		// Handles case where any of 4 points of dropdown lie inside menu
		if ( (intX1 >= menuX1 && intX1 <= menuX2)  || (intX2 >= menuX1 && intX2 <= menuX2) )
		{
			if ( (intY1 >= menuY1 && intY1 <= menuY2)  || (intY2 >= menuY1 && intY2 <= menuY2) )
			{
				objDropDowns[i].style.visibility = 'hidden';
				objDropDowns[i].hide = 'true';						
			}						
		}
		
		// Handles case where dropdown spans across menu, points lie outside menu.
		if (intX1 <= menuX1 && intX2 >= menuX2)
		{
			if ( (intY1 >= menuY1 && intY1 <= menuY2) || (intY2 >= menuY1 && intY2 <= menuY2) )
			{
				objDropDowns[i].style.visibility = 'hidden';
				objDropDowns[i].hide = 'true';				
			}
		}
	}	
}


function MM_showDropDowns()
{
	if(document.all) {
		objDropDowns = document.all.tags("SELECT");
	} else { 
		objDropDowns = document.getElementsByTagName('SELECT');
	}
				
	for(i = 0; i < objDropDowns.length; i++)
	{
		if (objDropDowns[i].hide)
			if (objDropDowns[i].hide = 'true')
				objDropDowns[i].style.visibility = 'visible';
	}

}


function getElementPosition(elemID)
{
	var offsetTrail = document.getElementById(elemID);
	var offsetLeft = 0;
	var offsetTop = 0;
	while (offsetTrail)
	{
		offsetLeft += offsetTrail.offsetLeft;
		offsetTop += offsetTrail.offsetTop;
		offsetTrail = offsetTrail.offsetParent;
	}
	if (navigator.userAgent.indexOf('Mac') != -1 && typeof document.body.leftMargin != 'undefined')
	{
		offsetLeft += document.body.leftMargin;
		offsetTop += document.body.topMargin;
	}
	return {left:offsetLeft,top:offsetTop};
}


function stopRKey(evt) 
{
	var evt  = (evt) ? evt : ((event) ? event : null);
	var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
	if((evt.keyCode == 13) && (node.type=="text") && node.obj != undefined) 
	{ 	
		GrabHighlighted();
		return true; 
	}
}
document.onkeypress = stopRKey;