

/***********************************************
 * Global variables
 ***********************************************/
var maxResults = 10;	// max # of results to display
var ignoreKeys = "";
var theresultsbox = "";
var thesearchbox = "";
var fontsize = "14px";

/***********************************************
 * Prototype for populating data
 ***********************************************/
function get_data() {}

/***********************************************
 * Find search keys in data set
 ***********************************************/
function suggest(keywords,key,resultsbox,searchbox,pad,padtop)
{
	var results = document.getElementById(resultsbox);
	var browser=navigator.userAgent.toLowerCase();
	theresultsbox = resultsbox;
	thesearchbox = searchbox;
	keywords = trim(keywords);

	fontsize = "14px";
	
	if (resultsbox == 'results') {
	    fontsize = "12px";
	}

	if(keywords != "" && keywords.length > 1)
	{
		var terms = get_data(); // sort? -- data should be alphabetical for best results
		var valueArray = keywords.split(" ");
		
		var ul = document.createElement("ul");
		var li;
		var a;
		
		if ((key.keyCode == '40' || key.keyCode == '38' || key.keyCode == '13'))
		{
			navigate(key.keyCode,resultsbox,searchbox);
		}
		else
		{
		    var kIndex = -1;
		    
		    var k1 = 0;
		    var k2 = 0;
		    var k3 = 0;
		    var k4 = 0;
		    var k5 = 0;
		    
			for(var i = 0; i < terms.length; i++) {
			    kIndex = -1;
			    //for (var idx1 = 0; idx1 < valueArray.length; idx1++) {
			        //kIndex = terms[i].activity.toLowerCase().indexOf(valueArray[idx1].toLowerCase());
			    if (terms[i].activity.toLowerCase().indexOf(valueArray[0].toLowerCase()) >= 0)
			        {
			            kIndex = 0;
			        
			        if(valueArray.length > 1) {
			            kIndex = -1;
			            var trimmed = terms[i].activity.toLowerCase().replace(valueArray[0].toLowerCase(), '').indexOf(valueArray[1].toLowerCase()) - 1;
			         // if (trimmed >= 0) {
			                //var test = terms[i].activity.toLowerCase().replace(valueArray[0].toLowerCase(), '');
			                //alert(test.length);
			                //var grrr = ' advantage 7501';
			              //alert(test.substring(trimmed, trimmed+1));
			           // } 
			            if (terms[i].activity.toLowerCase().replace(valueArray[0].toLowerCase(), '').indexOf(valueArray[1].toLowerCase()) >= 0)
			                    //&& (terms[i].activity.toLowerCase().replace(valueArray[0].toLowerCase(), '').substring(trimmed, trimmed + 1) == ' ') || trimmed == 1) 
			                    {
			                //alert(terms[i].activity.toLowerCase().replace(valueArray[0].toLowerCase(), '').length);

			                //alert(terms[i].activity.toLowerCase().replace(valueArray[0].toLowerCase(), '').indexOf(valueArray[1].toLowerCase()) - 1);
			                //alert(valueArray[1].toLowerCase().length);
			                kIndex = 0;
			                k1 = terms[i].activity.toLowerCase().replace(valueArray[0].toLowerCase(), '').indexOf(valueArray[1].toLowerCase());
			                if (valueArray.length > 2) {
			                    kIndex = -1;
			                    if (terms[i].activity.toLowerCase().replace(valueArray[0].toLowerCase(), '').indexOf(valueArray[2].toLowerCase()) >= 0) {
			                        kIndex = 0;

			                        if (valueArray.length > 3) {
			                            kIndex = -1;
			                            if (terms[i].activity.toLowerCase().replace(valueArray[0].toLowerCase(), '').indexOf(valueArray[3].toLowerCase()) >= 0) {
			                                kIndex = 0;

			                                if (valueArray.length > 4) {
			                                    kIndex = -1;
			                                    if (terms[i].activity.toLowerCase().replace(valueArray[0].toLowerCase(), '').indexOf(valueArray[4].toLowerCase()) >= 0) {
			                                        kIndex = 0;
			                                    }
			                                }
			                            }
			                        }
			                    }
			                }
			            }
			            
			        }
			    }
			    //}
				
				
				if(kIndex >= 0) 
				{
					li = document.createElement("li");
					
					// setup the link to populate the search box
					a = document.createElement("a");
					a.href = "javascript://"; 

					a.setAttribute("rel",terms[i].val);
					a.setAttribute("rev", getRank(terms[i].activity.toLowerCase(), keywords.toLowerCase()));
																		   
					if(!document.all) a.setAttribute("onclick","populate(this,'"+resultsbox+"','"+searchbox+"');");
					else a.onclick = function() { populate(this,resultsbox,searchbox); }
					
					a.appendChild(document.createTextNode(""));
					
					if(keywords.length == 1) 
					{
						var kws = terms[i].activity.toLowerCase().split(" ");
						var firstWord = 0;
						
						for(var j = 0; j < kws.length; j++)
						{
							if(kws[j].toLowerCase().charAt(0) == keywords.toLowerCase()) {
								
								ul.appendChild(li);
								
								if(j != 0) {
									kIndex = terms[i].activity.toLowerCase().indexOf(" " + keywords.toLowerCase());
									kIndex++;
								}
								
								break;
							}
						}
					}
					else if(keywords.length > 1) {
						ul.appendChild(li);
					}
					else continue;

					
					var before = terms[i].activity.substring(0,kIndex);
					var after = terms[i].activity.substring(keywords.length + kIndex, terms[i].activity.length);
                    
                    var p1;
                    var p2;

                    var retunstring = terms[i].activity;

                   
					//a.innerHTML = before + "<strong>" + terms[i].activity.substring(kIndex, keywords.length + kIndex) + "</strong>" + after;
                    
                    // for each search word, find it and bold it (if the word appears more than 3 times in device name, we need to extend this functionality)
                    for (var val in valueArray) {

                        var pos = retunstring.toLowerCase().indexOf(valueArray[val].toLowerCase());
                        if (pos >= 0) {
                            retunstring = retunstring.substr(0, pos) + '|' + retunstring.substr(pos, valueArray[val].length) + '$'
                    + retunstring.substr(pos + valueArray[val].length);

                            var pos2 = retunstring.toLowerCase().indexOf(valueArray[val].toLowerCase(), pos + valueArray[val].length);
                            if (pos2 >= 0) {
                                retunstring = retunstring.substr(0, pos2) + '|' + retunstring.substr(pos2, valueArray[val].length) + '$'
                        + retunstring.substr(pos2 + valueArray[val].length);

                                var pos3 = retunstring.toLowerCase().indexOf(valueArray[val].toLowerCase(), pos2 + valueArray[val].length);
                                if (pos3 >= 0) {
                                    retunstring = retunstring.substr(0, pos3) + '|' + retunstring.substr(pos3, valueArray[val].length) + '$'
                            + retunstring.substr(pos3 + valueArray[val].length);

                                }
                            }
                        }
                    }

                    // replace all placeholders with correct tag
                    while (retunstring.indexOf('|') >= 0) {
                        retunstring = retunstring.replace('|', '<strong>');
                        retunstring = retunstring.replace('$', '</strong>');
                    }

                    // add device name with bolded text
                    a.innerHTML = retunstring;
					li.appendChild(a);

				}
			}		
			
			if(results.hasChildNodes()) results.removeChild(results.firstChild);
			
			// position the list of suggestions
			var s = document.getElementById(searchbox);
			var xy = findPos(s);
			
			var startleft = (jQuery(s).position().left);
			
			if(isNaN(parseInt(pad))) 
			{
				pad = 0;	
			}
			
			if(isNaN(parseInt(padtop))) 
			{
				padtop = 0;	
			}
			
			if(searchbox.indexOf('_sm') > -1 && !document.getElementById('container'))
			{
				startleft = xy[0];
			}
			
			results.style.left = startleft + pad + "px";
			results.style.top = xy[1] + (s.offsetHeight) + padtop + "px";
			//results.style.width = s.offsetWidth + "px";
			
			// if there are some results, show them
			if(ul.hasChildNodes()) {
			    results.appendChild(filterResults(ul, resultsbox));

				if(results.firstChild.childNodes.length == 1) results.firstChild.firstChild.getElementsByTagName("a")[0].className = "hover_new";
				
			}

		}
	}
	else
	{
		if(results.hasChildNodes()) results.removeChild(results.firstChild);
	}
}


/******************
 * trims leading and trailing spaces

******************/
function trim(str) 
{
	return str.replace(/^\s*/, '').replace(/\s*$/, ''); 
}
/***********************************************
 * Rank results - used for sorting result sets
 * 0 if entire row starts with kw
 * 0 < i < 1 if any word in row starts with kw (1k char max)
 * i > 1 if row contains kw anywhere else
 ***********************************************/
function getRank(activity, keywords)
{
	var ret = -1;
	var kIndex = activity.indexOf(keywords);
	
	ret = (activity.charAt(kIndex - 1) == " ") ? kIndex : (200*kIndex);
	
	return ret;	
}


function clearHovers(ref)
{
	var results = document.getElementById(theresultsbox);
	var keyIndex = document.getElementById("keyIndex").value;
	var ul = results.childNodes[0];
	var pos = ref.split("_")[1];

	document.getElementById("keyIndex").value = pos;
	
	for(var j = 0; j < ul.childNodes.length; j++)
	{
		ul.childNodes[j].getElementsByTagName("a")[0].className = "";
		ul.childNodes[j].getElementsByTagName("a")[0].setAttribute("style", "");
	}
		document.getElementById(ref).className = "hover_new";
		document.getElementById(ref).setAttribute("style","background: #E9F1F4;font-family: Arial, Helv, Tahoma, Sans-Serif;font-size: "+fontsize+";font-weight: normal;text-decoration: none;color: #333333;");
}



/***********************************************
 * Sort the result suggestion sets
 ***********************************************/
function filterResults(s,box)
{
	var sorted = new Array();
	// reset index counter
	document.getElementById("keyIndex").value = 0;
	
	for(var i = 0; i < s.childNodes.length; i++)
	{
		sorted.push(s.childNodes[i]);
	}

	var ul = document.createElement("ul");
	//var lis = sorted.sort(sortIndex);
	var lis = selectionSort(sorted);
	
	li = document.createElement("div");
	li.style.textAlign = 'right';
	li.style.paddingTop = '6px';
	li.style.paddingRight = '5px';
	
	    li.style.fontSize = fontsize;
	
			li.id = 'div_suggest';
				a = document.createElement("a");
				
				a.appendChild(document.createTextNode(""));
				ul.appendChild(li);
				
				a.innerHTML = "Search Suggestions";
	
				li.appendChild(a);
				ul.appendChild(li);
	
	var cntr = 1;
	for(var j = 0; j < lis.length; j++)
	{
		if(j < maxResults) 
		{
			lis[j].childNodes[0].id = "pos_"+cntr;
			cntr++;
			if(!document.all) lis[j].childNodes[0].setAttribute("onmouseover","clearHovers(this.id);");
			else lis[j].childNodes[0].onmouseover = function() { clearHovers(this.id); }
			ul.appendChild(lis[j]);
		}
		else 
		{
			break;
		}
	}

	return ul;
	
}

function sortIndex(a,b)
{
	// wow thats ugly -- need logic around grouped items getting out of order
	return (a.getElementsByTagName("a")[0].rev - b.getElementsByTagName("a")[0].rev);
}


function selectionSort(items){

    var len = items.length,
        min;

    for (i=0; i < len; i++){

        //set minimum to this position
        min = i;

        //check the rest of the array to see if anything is smaller
        for (j=i+1; j < len; j++){
            if (items[j] < items[min]){
                min = j;
            }
        }

        //if the minimum isn't in the position, swap it
        if (i != min){
            swap(items, i, min);
        }
    }

    return items;
}

function swap(items, firstIndex, secondIndex){
    var temp = items[firstIndex];
    items[firstIndex] = items[secondIndex];
    items[secondIndex] = temp;
}

/***********************************************
 * Navigate using up/down and submit with 'Enter'
 ***********************************************/
function navigate(key,resultsbox,searchbox)
{
	var results = document.getElementById(resultsbox);
	var keyIndex = document.getElementById("keyIndex");

	var i = keyIndex.value;

	if(i == "" || !i || i<0) i = 0;
	else i = parseFloat(i);
	
	var ul = results.childNodes[0];
	
	if(ul)
	{
		for(var j = 0; j < ul.childNodes.length; j++)
		{
			ul.childNodes[j].getElementsByTagName("a")[0].className = "";
			ul.childNodes[j].getElementsByTagName("a")[0].setAttribute("style", "");
		}
		
		if(key == '40') // DOWN
		{
			i++;
			if(i > ul.childNodes.length-1) i = ul.childNodes.length-1;

			keyIndex.value = i;
			
			try {
				if(i != 0)
				{
				ul.childNodes[i].getElementsByTagName("a")[0].className = "hover_new";
				ul.childNodes[i-1].getElementsByTagName("a")[0].className = "";
				
				ul.childNodes[i].getElementsByTagName("a")[0].setAttribute("style","background: #E9F1F4;font-family: Arial, Helv, Tahoma, Sans-Serif;font-size: "+fontsize+";font-weight: normal;text-decoration: none;color: #333333;");
				ul.childNodes[i-1].getElementsByTagName("a")[0].setAttribute("style", "");
				}
			}
			catch(e) {}
		}
		else if(key == '38') // UP
		{
			i--;
			if(i <= 1) i = 1;
	
			keyIndex.value = i;

			try {
				if(i != 0)
				{
				ul.childNodes[i].getElementsByTagName("a")[0].className = "hover_new";
				ul.childNodes[i+1].getElementsByTagName("a")[0].className = "";
				
				ul.childNodes[i].getElementsByTagName("a")[0].setAttribute("style","background: #E9F1F4;font-family: Arial, Helv, Tahoma, Sans-Serif;font-size: "+fontsize+";font-weight: normal;text-decoration: none;color: #333333;");
				ul.childNodes[i+1].getElementsByTagName("a")[0].setAttribute("style", "");
				}
			}
			catch(e) {}
		}
		else if(key == '13' || key == '9') // ENTER/TAB -- POPULATE
		{
			
			if(i == -1) i = 0;
			
			if(i != 0)
			{
			populate(ul.childNodes[i].getElementsByTagName("a")[0], resultsbox, searchbox);
			}
			else
			{
				document.getElementById("itemId").value = "";
				document.getElementById("searchvalue").value = trim(document.getElementById(searchbox).value);
				setTimeout("document.doSubmit();", 50);
			}
		}
		else return;	
	}
}

/***********************************************
 * Allow for using tab onkeydown
 ***********************************************/
function tabfix(keywords, key, resultsbox, searchbox)
{
	if(key.keyCode == '9') {
		navigate(key.keyCode, resultsbox, searchbox);
		return false;
	}
	else return true;
}

/***********************************************
 * Populate hidden fields via onclick on 'Enter'
 ***********************************************/
function populate(a, resultsbox, searchbox)
{
	var ul = document.getElementById(resultsbox).childNodes[0];
	
	document.getElementById("itemId").value = "";
	document.getElementById("searchvalue").value = "";

	try {
		var pick = a.innerHTML.replace("<strong>","").replace("</strong>","");
		var pickval = a.getAttribute('rel');
		//alert(pickval);
		// IE6 converts HTML elements to uppercase -- could be done with RegExp
		if(document.all) pick = a.innerHTML.replace("<STRONG>","").replace("</STRONG>","");

		while (pick.indexOf('<strong>') >= 0) {
		    pick = pick.replace("<strong>", "").replace("</strong>", "");
		}

		while (pick.indexOf('<STRONG>') >= 0) {
		    pick = pick.replace("<STRONG>", "").replace("</STRONG>", "");
		}
		//alert(pick.stripX(true));
		document.getElementById(searchbox).value = pick.stripX(true);
		document.getElementById("itemId").value = pickval;
		document.getElementById("searchvalue").value = pick.stripX(true);
		setTimeout("document.doSubmit();", 50);
		document.forms[0].submit();
	}
	catch(e) {}

	//clearSuggest(resultsbox);
}

document.doSubmit = function() {
    document.forms[0].submit();
}

String.prototype.stripX=function(boo){
		var str= this;
		if(boo){
			str= str.replace(/\&amp;/g,'&');
			str= str.replace(/\&lt;/g,'<');
		}
		else{
			str= str.replace(/\&/g,'&amp;');
			str= str.replace(/</g,'&lt;');
		}
		return str;
	};
/***********************************************
 * Find an elements position on the screen
 ***********************************************/
function findPos(obj) 
{
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

/***********************************************
 * Helper to preserve onclick on suggestions
 ***********************************************/
function clearSuggest(resultsbox)
{
	// need a timeout so the onclick event is captured before results are hidden
	setTimeout("hideSuggest()",450);
}

/***********************************************
 * Hide the suggestions list and remove from DOM
 ***********************************************/
function hideSuggest()
{
	var results = document.getElementById(theresultsbox);
	if(results.hasChildNodes()) results.removeChild(results.firstChild);
	
	document.getElementById("keyIndex").value = "-1"; // reset the suggestions index
	
	return true;
}

function trackMouse()
{	
	var results = document.getElementById(theresultsbox);
	if(results != null)
	{
		document.onclick = hideSuggest;
	}
}

