// JavaScript Document
var suggestIgnoreKeyUp = false;
var suggestSelected = new Array();
var doNavigate = new Array();
var doRequire = new Array();
var popupNames = new Array();
var useDHTML = true;

function lookup(inputString, name, type, require, noDHTML, navigate)
{
	if (noDHTML == true)
	{
		useDHTML = false;
	}
	
	if (suggestIgnoreKeyUp)
	{
		suggestIgnoreKeyUp = false;
		return;
	}
	
	if (require == undefined || require == null)
		require = false;
	
	if (navigate == undefined || navigate == null)
		navigate = false;
	
	popupNames.push(name);
	
	if (inputString.length == 0)
	{
		// Hide the suggestion box.
		$('#suggestions_' + name).hide();
	}
	else
	{
		$.get("/ajax/lookups.php", {type: type, partial: "" + inputString + ""}, function(data)
		{
			var show = false;
			var html = "";
			var index = 0;
			var firstResult = "";
			suggestSelected[name] = null;
			doNavigate[name] = navigate;
			doRequire[name] = require;
			
			if (data != null)
			{
				var lastPos = inputString.lastIndexOf(',') + 1;
				if (lastPos != 0)
					var currentString = inputString.substring(0, lastPos);
				else
					var currentString = "";
				
				// Add space after last comma
				var lastChar = currentString.substring(currentString.length - 1);
				
				if (lastChar == ',')
				{
					currentString += " ";
				}
				
				if (data.getElementsByTagName('free_tag').length > 0 &&
				    data.getElementsByTagName('free_tag')[0].childNodes.length > 0)
				{
					// Display 'free tag'
					var freeTag = data.getElementsByTagName('free_tag')[0].childNodes[0].nodeValue;
					
					html += "<li id='" + name + "_item" + index + "'" +
					        "    onmouseover=\"suggestOver(this, '" + name + "');\"" +
							  "    onmouseout=\"suggestOut(this, '" + name + "');\"" +
							  "    onblur=\"hide('" + name + "'); suggestSelected[" + name + "] = null;\" " +
							  "    onclick=\"suggestClick(this, '" + name + "', " + index + "," + require + ");\">" +
							  "<div style='display: none;'>" + // Data DIV
							  "   <div id='" + name + "_item" + index + "_type'>F</div>" + // Free Text
							  "   <div id='" + name + "_item" + index + "_id'>0</div>" + // ID = 0 (no ID)
							  "   <div id='" + name + "_item" + index + "_value'>" + freeTag + "</div>" + // Display value
							  "   <div id='" + name + "_item" + index + "_current'>" + currentString + freeTag + "</div>" + // Current string
							  "</div>" +
							  "<span class='free_tag'>Free tag: </span>" + freeTag + "</li>";
					
					index++;
				}

				var userNodes = data.getElementsByTagName('user');
				var schoolNodes = data.getElementsByTagName('school');
				var companyNodes = data.getElementsByTagName('company');
				var totalResults = userNodes.length + schoolNodes.length + companyNodes.length;
				
				if (userNodes.length > 0)
				{
					// Display list of users
					if (data.getElementsByTagName('users').length > 0)
					{
						// Read section title
						var usersTitle = data.getElementsByTagName('users')[0].getAttribute("title");
						
						html += "<h5>" +
								  "   <div class='text linebg' style='background-position: 0px 14px;'><span>" + usersTitle + "</span></div>" +
								  "</h5>";
					}
					
					// Output user list
					for (var n = 0; n < userNodes.length; n++)
					{
						var node = userNodes[n];
						
						var userId = node.childNodes[0].childNodes[0].nodeValue;
						var userName = node.childNodes[1].childNodes[0].nodeValue;
						
						if (node.childNodes[6].childNodes.length > 0)
							var thumbnail = node.childNodes[6].childNodes[0].nodeValue;
						else
							var thumbnail = "/templates/images/pixel_trans.gif";
						
						if (node.childNodes[5].childNodes.length > 0)
							var fullName = node.childNodes[5].childNodes[0].nodeValue;
						else
							var fullName = userName;
						
						if (node.childNodes[8].childNodes.length > 0)
							var institution = node.childNodes[8].childNodes[0].nodeValue;
						else
							var institution = "";
						
						if (node.childNodes[9].childNodes.length > 0)
							var city = node.childNodes[9].childNodes[0].nodeValue;
						else
							var city = "";
						
						if (institution == "" && city != "")
							var location = city;
						else if (institution != "" && city == "")
							var location = institution;
						else if (institution != "" && city != "")
							var location = institution + ", " + city;
						else
							var location = "";
						
						if (location != "")
							location = "<br />" + location;
						
						fullName = fullName.replaceAll("&apos;", "\'");
						userName = userName.replaceAll("&apos;", "\'");
						institution = institution.replaceAll("&apos;", "\'");
						city = city.replaceAll("&apos;", "\'");
						
						html += "<li id='" + name + "_item" + index + "'" +
								  "    onmouseover=\"suggestOver(this, '" + name + "');\"" +
								  "    onmouseout=\"suggestOut(this, '" + name + "');\"" +
								  "    onblur=\"hide('" + name + "'); suggestSelected[" + name + "] = null;\" " +
								  "    onclick=\"suggestClick(this, '" + name + "', " + index + "," + require + ");\">" +
								  "<div style='display: none;'>" +   // Data DIV
								  "   <div id='" + name + "_item" + index + "_type'>U</div>" + // User
								  "   <div id='" + name + "_item" + index + "_id'>" + userId + "</div>" + // User ID
								  "   <div id='" + name + "_item" + index + "_value'>" + fullName + "</div>" + // Display value
								  "   <div id='" + name + "_item" + index + "_current'>" + fullName + "</div>" + // Current string
								  "</div>" +
								  "<img src='" + thumbnail + "' width='60' height='60' />" +
								  "<div class='info_text user'>" +
								  "   <table border='0' height='54'>" +
								  "      <tr>" +
								  "         <td height='54'>" + fullName + location + "</td>" +
								  "      </tr>" +
								  "   </table>" +
								  "</div></li>";
						
						index++;
					}
				}
				
				if (schoolNodes.length > 0)
				{
					// Display list of schools
					if (data.getElementsByTagName('schools').length > 0)
					{
						// Read section title
						var schoolsTitle = data.getElementsByTagName('schools')[0].getAttribute("title");
						html += "<h5>" +
								  "   <div class='text linebg' style='background-position: 0px 14px;'><span>" + schoolsTitle + "</span></div>" +
								  "</h5>";
					}
					
					// Output school list
					for (var n = 0; n < schoolNodes.length; n++)
					{
						var node = schoolNodes[n];
						var schoolId = node.childNodes[0].childNodes[0].nodeValue;
						var schoolName = node.childNodes[1].childNodes[0].nodeValue;
						
						if (node.childNodes[3].childNodes.length > 0)
							var thumbnail = node.childNodes[3].childNodes[0].nodeValue;
						else
							var thumbnail = "/templates/images/pixel_trans.gif";
						
						if (node.childNodes[5].childNodes.length > 0)
							var city = node.childNodes[5].childNodes[0].nodeValue;
						else
							var city = "";
						
						if (node.childNodes[6].childNodes.length > 0)
							var country = node.childNodes[6].childNodes[0].nodeValue;
						else 
							var country  = "";
						
						schoolName = schoolName.replaceAll("&apos;", "\'");
						city = city.replaceAll("&apos;", "\'"); 
						country = country.replaceAll("&apos;", "\'");
						
						if (city != "")
						    var comma = ", ";
						else 
						   var comma = " ";
									
						html += "<li id='" + name + "_item" + index + "'" +
								  "    onmouseover=\"suggestOver(this, '" + name + "');\"" +
								  "    onmouseout=\"suggestOut(this, '" + name + "');\"" +
								  "    onblur=\"hide('" + name + "'); suggestSelected[" + name + "] = null;\" " +
								  "    onclick=\"suggestClick(this, '" + name + "', " + index + "," + require + ");\">" +
								  "<div style='display: none;'>" +     // Data DIV
								  "   <div id='" + name + "_item" + index + "_type'>S</div>" + // School
								  "   <div id='" + name + "_item" + index + "_id'>" + schoolId + "</div>" + // School ID
								  "   <div id='" + name + "_item" + index + "_value'>" + schoolName + "</div>" + // Display value
								  "   <div id='" + name + "_item" + index + "_current'>" + schoolName + "</div>" + // Current string
								  "</div>" +
								  "<img src='" + thumbnail + "' width='60' height='60' />" +
								  "<div class='info_text school'>" +
								  "   <table border='0' height='54'>" +
								  "      <tr>" +
								  "         <td height='54'>" + schoolName + "<br />" + city + comma + country + "</td>" +
								  "      </tr>" +
								  "   </table>" +
								  "</div></li>";
						
						index++;
					}
				}
				
				if (companyNodes.length > 0)
				{
					// Display list of companies
					if (data.getElementsByTagName('companies').length > 0)
					{
						// Read section title
						var companiesTitle = data.getElementsByTagName('companies')[0].getAttribute("title");
						html += "<h5>" +
								  "   <div class='text linebg' style='background-position: 0px 14px;'><span>" + companiesTitle + "</span></div>" +
								  "</h5>";
					}
					
					// Output company list
					for (var n = 0; n < companyNodes.length; n++)
					{
						var node = companyNodes[n];
						var companyId = node.childNodes[0].childNodes[0].nodeValue;
						var companyName = node.childNodes[1].childNodes[0].nodeValue;
						
						if (node.childNodes[3].childNodes.length > 0)
							var thumbnail = node.childNodes[3].childNodes[0].nodeValue;
						else
							var thumbnail = "/templates/images/pixel_trans.gif";
						
						if (node.childNodes[5].childNodes.length > 0)
							var city = node.childNodes[5].childNodes[0].nodeValue;
						else
							var city = "";
						
						if (node.childNodes[6].childNodes.length > 0)
							var country = node.childNodes[6].childNodes[0].nodeValue;
						else 
							var country  = "";
						
						companyName = companyName.replaceAll("&apos;", "\'");
						city = city.replaceAll("&apos;", "\'"); 
						country = country.replaceAll("&apos;", "\'");
						
						if (city != "")
						    var comma = ", ";
						else 
						   var comma = " ";
									
						html += "<li id='" + name + "_item" + index + "'" +
								  "    onmouseover=\"suggestOver(this, '" + name + "');\"" +
								  "    onmouseout=\"suggestOut(this, '" + name + "');\"" +
								  "    onblur=\"hide('" + name + "'); suggestSelected[" + name + "] = null;\" " +
								  "    onclick=\"suggestClick(this, '" + name + "', " + index + "," + require + ");\">" +
								  "<div style='display: none;'>" +     // Data DIV
								  "   <div id='" + name + "_item" + index + "_type'>C</div>" + // Company
								  "   <div id='" + name + "_item" + index + "_id'>" + companyId + "</div>" + // Company ID
								  "   <div id='" + name + "_item" + index + "_value'>" + companyName + "</div>" + // Display value
								  "   <div id='" + name + "_item" + index + "_current'>" + companyName + "</div>" + // Current string
								  "</div>" +
								  "<img src='" + thumbnail + "' width='60' height='60' />" +
								  "<div class='info_text company'>" +
								  "   <table border='0' height='54'>" +
								  "      <tr>" +
								  "         <td height='54'>" + companyName + "<br />" + city + comma + country + "</td>" +
								  "      </tr>" +
								  "   </table>" +
								  "</div></li>";
						
						index++;
					}
				}
				
				if (totalResults == 1 && freeTag != undefined && freeTag.toLowerCase() == inputString.toLowerCase())
				{
					show = true;
					//show = false;
				}
				else if (totalResults == 0)
				{
					show = false;
				}
				else
				{
					show = true;
				}
			}
			else
			{
				show = false;
			}
			
			if (show)
			{
				$('#suggestions_' + name).show();
				$('#suggestions_list_' + name).html(html);
				document.onclick = checkClosePopup;
			}
			else
			{
				// Hide the suggestion box.
				$('#suggestions_' + name).hide();
				document.onclick = null;
			}
		}, 'xml');
	}
}

function suggestNav(e, obj, name)
{
	e = (e) ? e : window.event;
	
	switch (e.keyCode)
	{
		case 37: // left arrow
		case 39: // right arrow
		case 33: // page up
		case 34: // page down
		case 35: // end
		case 36: // end
		case 45: // insert
			break;
		case 38: // up arrow
			suggestUp(name);
			break;
		case 40: // down arrow
			suggestDown(name);
			break;
		case 13: // return key
			suggestFill(name);
			
			if (window.event)
			{
				e.cancelBubble=true;
				e.returnValue = false;
			}
			else
			{
				e.stopPropagation();
				e.preventDefault();
			}
			break;
		default: return;
	}
	
	suggestIgnoreKeyUp = true;
}

function suggestFill(name)
{
	var selected = getSelected(name);
	
	if (selected == null)
		return;
	
	// Examine data div
	var index = selected.id.substring(selected.id.lastIndexOf('item') + 4);
	var type = document.getElementById(name + "_item" + index + "_type").innerHTML;
	var id = document.getElementById(name + "_item" + index + "_id").innerHTML;
	var display = document.getElementById(name + "_item" + index + "_value").innerHTML;
	
	var textbox = document.getElementById(name);
	var inputString = textbox.value;
	var require = doRequire[name];
	
	var lastPos = inputString.lastIndexOf(',') + 1;
	if (lastPos != 0)
		var currentString = inputString.substring(0, lastPos);
	else
		var currentString = "";

	if (type != "F" && useDHTML)
	{
		// Display tag using DHTML
		fillDHTML(type, id, display, name, require);
	}
	else
	{
		if (currentString != "")
			currentString += " ";
		
		if (doNavigate[name])
			navigate(name, type, id);
		else
			fill(currentString + display + ", ", name, false);
	}

	suggestSelected[name] = null;
}

function suggestUp(name)
{
	var selected = getSelected(name);
	var listOuter = document.getElementById("suggestions_" + name);
	var listInner = document.getElementById("suggestions_list_" + name);
	var selectPrevious = false;
	
	if (listOuter.style.display == "none")
		return;
	
	if (selected == null)
	{
		selectPrevious = true;
	}
	
	// Select previous
	if (listInner.childNodes.length > 0)
	{
		for (var n = listInner.childNodes.length - 1; n >= 0; n--)
		{
			var node = listInner.childNodes[n];
			
			if (selectPrevious)
			{
				if (node.nodeName == "LI")
				{
					node.className = "over";
					suggestSelected[name] = node;
					return;
				}
				else
				{
					continue;
				}
			}
			
			if (node.className == "over")
			{
				node.className = "";
				selectPrevious = true;
			}
		}
		
		if (selectPrevious)
		{
			// Reached beginning of list
			// Select last
			for (var n = listInner.childNodes.length - 1; n >= 0; n--)
			{
				var node = listInner.childNodes[n];
				
				if (node.nodeName == "LI")
				{
					node.className = "over";
					suggestSelected[name] = node;
					return;
				}
			}
		}
	}
}

function suggestDown(name)
{
	var selected = getSelected(name);
	var listOuter = document.getElementById("suggestions_" + name);
	var listInner = document.getElementById("suggestions_list_" + name);
	var selectNext = false;
	
	if (listOuter.style.display == "none")
		return;
	
	if (selected == null)
	{
		selectNext = true;
	}
	
	// Select next
	if (listInner.childNodes.length > 0)
	{
		for (var n = 0; n < listInner.childNodes.length; n++)
		{
			var node = listInner.childNodes[n];
			
			if (selectNext)
			{
				if (node.nodeName == "LI")
				{
					node.className = "over";
					suggestSelected[name] = node;
					return;
				}
				else
				{
					continue;
				}
			}
			
			if (node.className == "over")
			{
				node.className = "";
				selectNext = true;
			}
		}
		
		if (selectNext)
		{
			// Reached end of list
			// Select first
			for (var n = 0; n < listInner.childNodes.length; n++)
			{
				var node = listInner.childNodes[n];
				
				if (node.nodeName == "LI")
				{
					node.className = "over";
					suggestSelected[name] = node;
					return;
				}
			}
		}
	}
}

function getSelected(name)
{
	if (suggestSelected[name] == undefined)
		suggestSelected[name] = null;
	
	return suggestSelected[name];
}

function suggestOver(obj, name)
{
	var selected = getSelected(name);
	
	if (selected != null)
	{
		selected.className = "";
	}
	
	obj.className = "over";
	suggestSelected[name] = obj;
}

function suggestOut(obj, name)
{
	var listInner = document.getElementById("suggestions_list_" + name);
	
	if (listInner.childNodes.length > 0)
	{
		for (var n = 0; n < listInner.childNodes.length; n++)
		{
			var node = listInner.childNodes[n];
			node.className = "";
		}
	}
	suggestSelected[name] = null;
}

function suggestClick(obj, name, index, require)
{
	var type = document.getElementById(name + "_item" + index + "_type").innerHTML;
	var id = document.getElementById(name + "_item" + index + "_id").innerHTML;
	var display = document.getElementById(name + "_item" + index + "_value").innerHTML;
	var currentString = document.getElementById(name + "_item" + index + "_current").innerHTML;
	
	var textbox = document.getElementById(name);
	var inputString = textbox.value;
	
	var lastPos = inputString.lastIndexOf(',') + 1;
	if (lastPos != 0)
		var currentString = inputString.substring(0, lastPos);
	else
		var currentString = "";
	
	if (type != 'F' && useDHTML)
	{
		fillDHTML(type, id, display, name, require);
	}
	else
	{
		if (currentString != "")
			currentString += " ";
		
		if (doNavigate[name])
			navigate(name, type, id);
		else
			fill(currentString + display + ", ", name, true);
	}
	
	suggestSelected[name] = null;
}

function removeTag(obj, val, name, restrict)
{
	if (restrict)
	{
		var encaseDiv = document.getElementById(name + "_encase");
		encaseDiv.style.display = 'inline';
	}
	
	// Obj = the button
	var tagBox = obj.parentNode;
	var innerDiv = document.getElementById(name + "_tags_inner");
	var tagsField = document.getElementById(name + "_extended_tags");
	
	// Destroy the div
	tagBox.parentNode.removeChild(tagBox);
	
	// Rebuild hidden field value
	var tags = tagsField.value.split(",");
	var newTags = "";
	
	for (var t = 0; t < tags.length; t++)
	{
		if (tags[t] != val)
		{
			if (newTags != "")
				newTags += ",";
			newTags += tags[t];
		}
	}
	
	tagsField.value = newTags;
	
	if (innerDiv.childNodes.length == 0)
	{
		document.getElementById(name + "_tags_outer").style.display = 'none';
	}
	else
	{
		// Are all child nodes #text?
		// This check is required for Safari
		allText = true;
		
		for (var n = 0; n < innerDiv.childNodes.length; n++)
		{
			if (innerDiv.childNodes[n].nodeName != "#text")
			{
				allText = false;
				break;
			}
		}
		
		if (allText)
		{
			document.getElementById(name + "_tags_outer").style.display = 'none';
		}
	}
}

function fillDHTML(type, id, display, name, restrict)
{
	var inputField = document.getElementById(name);
	var innerDiv = document.getElementById(name + "_tags_inner");
	var tagsField = document.getElementById(name + "_extended_tags");
	var html = innerDiv.innerHTML;
	
	// Has user/school ready been tagged?
	var alreadyTagged = false;
	var tags = tagsField.value.split(",");
	if (restrict == null)
		restrict = false;
	
	if (tags.length > 0)
	{
		for (var t = 0; t < tags.length; t++)
		{
			if (tags[t] == (type + id))
			{
				if (type == 'U')
					alert("You have already tagged this user!");
				else
					alert("You have already tagged this school!");
				
				alreadyTagged = true;
				break;
			}
		}
	}
	
	if (alreadyTagged == false)
	{
		// Build tag box
		html += "<div class='tag_box'>" +
		            display +
		        "&nbsp;<input type='button' value='x' onclick='removeTag(this, \"" + type + id + "\", \"" + name + "\", " + restrict + ");' />" +
		        "</div>\n";
		
		innerDiv.innerHTML = html;
		
		// Add tag to hidden field
		if (tagsField.value != "")
			tagsField.value += ",";
		tagsField.value += type + id;
		
		// Remove tag from input textbox
		var lastComma = inputField.value.lastIndexOf(',');
		
		if (lastComma == -1)
		{
			// Clear textbox
			inputField.value = "";
		}
		else
		{
			if (inputField.value.length == lastComma + 2)
			{
				inputField.value = inputField.value.substring(0, lastComma + 1) + " ";
			}
			else
			{
				inputField.value = inputField.value.substring(0, lastComma + 2);
			}
		}
	}
	
	document.getElementById(name + '_tags_outer').style.display = '';
	document.getElementById('suggestions_' + name).style.display = 'none';
	suggestSelected[name] = null;
	setCursorPosition(name, document.getElementById(name).value.length);
	
	if (restrict == true)
	{
		var encaseDiv = document.getElementById(name + "_encase");
		encaseDiv.style.display = 'none';
	}
}

function fill(thisValue, name, setCursorPos)
{
	var e = document.getElementById(name).value;
	$('#' + name).val(thisValue);
	$('#suggestions_' + name).hide();
	e = e.substr(1);
	suggestSelected[name] = null;
	
	if (setCursorPos)
	{
		setCursorPosition(name, document.getElementById(name).value.length);
	}
}

function hideBox(name)
{
	$('#suggestions_' + name).hide();
}

function setCursorPosition(elemId, caretPos)
{
    var elem = document.getElementById(elemId);
	(elem.value.length);
    if(elem != null) {
        if(elem.createTextRange) {
            var range = elem.createTextRange();
            range.move('character', caretPos);
            range.select();
        }
        else {
            if(elem.selectionStart) {
                elem.focus();
                elem.setSelectionRange(caretPos, caretPos);
            }
            else
                elem.focus();
        }
    }
}

function navigate(name, type, id)
{
	// Hide the suggestion box
	$('#suggestions_' + name).hide();
	document.onclick = null;
	
	switch (type)
	{
		case "U":
			document.location = "/find/profile/" + id + ".htm";
			break;
			
		case "S":
			document.location = "/find/schoolprofile/" + id + ".htm";
			break;
	}
}

function checkClosePopup(e)
{
	var target = (e && e.target) || (event && event.srcElement);
	
	if (checkParent(target))
	{
		// Hide the suggestion box
		if (popupNames.length > 0)
		{
			for (var p = 0; p < popupNames.length; p++)
			{
				$('#suggestions_' + popupNames[p]).hide();
			}
			document.onclick = null;
		}
	}
}

function checkParent(t)
{
	if (popupNames.length == 0)
	{
		return false;
	}
	
	while (t.parentNode)
	{
		// Check all popups
		for (var p = 0; p < popupNames.length; p++)
		{
			var div = 'suggestions_' + popupNames[p];
			
			if (t == document.getElementById(div))
			{
				return false;
			}
		}
		t = t.parentNode;
	}
	
	return true;
}
