var isIE = (window.ActiveXObject);
var completeTable;
var completeField;


function init() 
{
    completeField = document.getElementById("complete-field");
    var autorow = document.getElementById("auto-row");
    var menu = document.getElementById("menu-popup");
    menu.style.top  =  findPos(autorow).top + "px";
    menu.style.left =  findPos(completeField).left + "px";
    completeTable = document.getElementById("completeTable");
    completeTable.style.visibility = "hidden";
}


function initRequest(url) 
{
    if (window.XMLHttpRequest) 
    {
        return new XMLHttpRequest();
    } 
    else if (isIE) 
    {
        return new ActiveXObject("Microsoft.XMLHTTP");
    }
}

function autoComplete() 
{  
    if (completeField.value == "") 
    {
        clearTable();
    } 
    else 
    {
        var url = "autocomplete?action=complete&searchString=" + completeField.value;
        
        var req = initRequest(url);
        req.onreadystatechange = function() 
        {
            if (req.readyState == 4) 
            {
                if (req.status == 200) //OK 
                {
                    parseMessages(req.responseText);
                } 
                else if (req.status == 204) //No Content
                {
                    clearTable();
                }
            }
        };
        req.open("GET", url, true);
        req.send(null);
    }
}

function findPos(elt) 
{
	var curleft = 0;
	var curtop  = 0;
	
	if (elt.offsetParent) 
	{
		do 
		{
			curleft += elt.offsetLeft;
			curtop  += elt.offsetTop;
		} while (elt = elt.offsetParent);
	}
	
	return 	{
			 left: curleft
			,top:  curtop
		};
};

function parseMessages(responseText) 
{
    	clearTable();

	if (!responseText.length)
	{
		return;
	}
	//display error message
	else if ( /^".+"&/.test(responseText) ) 
	{
		alert( responseText.replace(/^"|"$/, "") );
	}
	else
	{
		var jsonObj;
		try
		{
			 jsonObj = json_parse(responseText);	 	
		}
		catch(e)
		{
			var prop;
			var msg = "An error occured while parsing the JSON-formatted responseText:\n";
			//caught a SyntaxError exception
			for (prop in e)
			{
				msg += prop + ": " + e[prop] + "\n";
			}

			alert(msg);

			return;
		}

		for (var loop = 0; loop < jsonObj.length; loop++) 
		{
			appendFund(jsonObj[loop]);
		}

		completeTable.style.visibility = "visible";
	}
}

function clearTable() 
{
    if (completeTable) 
    {
     	completeTable.style.visibility = "hidden";

		for (var loop = completeTable.childNodes.length -1; loop >= 0 ; loop--) 
		{
			completeTable.removeChild(completeTable.childNodes[loop]);
		}
    }
}

function rowOn(e)
{ 
    var cell = e ? e.target : event.srcElement;
    var row  = cell.parentNode;

    row.style.backgroundColor 	= "#7A8AFF";
    row.style.color 		= "#FFFAFA";
}

function rowOff(e)
{
    var cell = e ? e.target : event.srcElement;
    var row  = cell.parentNode;
  	
    row.style.backgroundColor 	= "#FFFFFF";
    row.style.color		= "#000000";
}

function rowDown(e)
{
    var cell = e ? e.target : event.srcElement;
    var row  = cell.parentNode;
	
    row.style.backgroundColor 	= "#FF0000";
}

function appendFund(fund) 
{
    var row, symbolCell, nameCell;
    
    if (isIE) 
    {
        row = completeTable.insertRow(completeTable.rows.length);
        symbolCell 	= row.insertCell(0);
        nameCell 	= row.insertCell(1);
    } 
    else 
    {
        row 		= document.createElement("tr");
        symbolCell 	= document.createElement("td");
        nameCell 	= document.createElement("td");
        row.appendChild(symbolCell);
        row.appendChild(nameCell);
        completeTable.appendChild(row);
    }

    row.className   = "popupRow";
    row.onmouseover = rowOn;
    row.onmouseout  = rowOff;
    row.onmousedown = rowDown;
    row.onmouseup   = rowOn;
    row.onclick	    = function() 
    		      { 
    			  document.location.href = "autocomplete?action=lookup&symbol=" + fund.symbol; 
    		      }; 
    row.className   	= "popupRow";
    row.onmouseover 	= rowOn;
    row.onmouseout  	= rowOff;
    row.onmousedown 	= rowDown;
    row.onmouseup   	= rowOn;
    row.onclick	    	= function() 
    		      	  { 
    			      document.location.href = "autocomplete?action=lookup&symbol=" + fund.symbol; 
    		      	  }; 
    
    
    symbolCell.appendChild(document.createTextNode(fund.symbol));
    symbolCell.className 	= "popupItem";
    symbolCell.style.fontWeight	= "bold";
    
    nameCell.appendChild(document.createTextNode(fund.name  ));
    nameCell.className 	= "popupItem";
  
}
