var currentField = null;
var dropDown = null;
var index = 0;
var gateUrl = "/goal/ajax_gate.php";
var timeout = null;
var sel = null;
var editing;
var keepHidden;
AutoComplete = {

    setupPage:function(){
        var elements = getElementsByAttribute('AC');
        for(i in elements){
            elements[i].driver = elements[i].getAttribute('AC');
            AutoComplete.set(elements[i]);
        }
    },

    set:function(input){
        input.setAttribute("autocomplete","off");
        input.setAttribute("ACID",index++);
        input.onfocus = function()
        {
            currentField = this;
            AutoComplete.dropDown();
            AutoComplete.hideDropDown();
        };
        input.onclick = function(e)
        {
            e = AutoComplete.fixE(e)
            AutoComplete.stopEvent(e);
        };

        input.onkeyup = function()
        {

            clearTimeout(timeout);
            if(this.value.length > 0){
            if(!editing && !keepHidden)
            timeout = setTimeout('AutoComplete.fillDropDown();', 220)
            keepHidden = null;
            }
            else{
            clearTimeout(timeout);
            AutoComplete.hideDropDown();
            }
        };

        input.onkeydown = function(e)
        {
            var DN = 40;
            var UP = 38;
            var ENT = 13;
            e = AutoComplete.fixE(e);
            var key = e.keyCode;
            switch(key){
                case DN:
                    clearTimeout(timeout);
                    AutoComplete.selectLi("down");
                    editing = 1;
                break;

                case UP:
                    clearTimeout(timeout);
                    AutoComplete.selectLi("up");
                    editing = 1;
                break;

                case ENT:
                    AutoComplete.enterSelected()
                break;
            }

        }

        window.onresize = function(){
            if(dropDown)
            AutoComplete.setPosition(currentField,dropDown);
        };


    },

    dropDown:function(){

        if(!document.getElementById('AC_dropDown'))
        {
            dropDown = document.createElement('div');
            dropDown.setAttribute("id","AC_dropDown");
            document.body.appendChild(dropDown);
            this.setPosition(currentField,dropDown);
            AutoComplete.showDropDown;
        }
        else
        {
            this.setPosition(currentField,dropDown);
            AutoComplete.showDropDown;
        }
        document.onclick = AutoComplete.hideDropDown;
    },

    fillDropDown:function(){
        var lis = new Array();
        var list = document.createElement('ul');
        var partial = currentField.value;
        var xmlHttp = Ajax.getTransport();
		var driver = currentField.getAttribute('AC');
        xmlHttp.open('GET',gateUrl + '?AC=1&driver='+ driver+'&partial=' + partial + "&r=" + Math.random(100000000),false);
        xmlHttp.send(null);
        //make async!!
		//alert(xmlHttp.responseText);
        if(xmlHttp.responseText && partial != ' ')
        {
            var suggestionObject = eval(xmlHttp.responseText);
            for(i in suggestionObject)
            {
                //var so = suggestionObject[i];
				var data_split = suggestionObject[i].split("\|");
				var so = data_split[0];
				partialCopy = partial;
                var reg = new RegExp(partialCopy, ["i"]);
                if(so.match(reg))
                so =  so.replace(reg, "<span>" + so.match(reg)[0] + "</span>");
                var element = document.createElement('li');
				if (driver == "debitAutoComplete")
				{
					element.setAttribute('price',data_split[1]);
				}else if (driver == "clientAutoComplete"){
					element.setAttribute('clientID',data_split[1]);
				}else if (driver == "appointmentAttendees"){
					element.setAttribute('attID',data_split[1]);
					element.setAttribute('attType',data_split[2]);
				}
					
                element.innerHTML = so;
                element.onmouseover = function(){
                    this.className = "selected";
                }
                element.onmouseout = function(){
                    this.className = null;
                }
                element.onclick = function(){
                    AutoComplete.enterSelected();
                }

                list.appendChild(element);
            }

            for(i in list)
            {
                if(i == sel)
                list[i].className='selected';
            }

            AutoComplete.clearElement(dropDown);
            dropDown.appendChild(list);
             AutoComplete.showDropDown();
        }

    },

    hideDropDown:function(){
        dropDown.style.display = 'none';
    },

    showDropDown:function(){
        dropDown.style.display = 'block';
    },

    selectLi:function(direction){
       var list =  dropDown.childNodes[0];
       var listItems = list.childNodes;

       for(i in listItems)
       {
        var li = listItems[i];
        li.onmouseover = function(e)
        {
         var e = AutoComplete.fixE(e);
         AutoComplete.stopEvent(e);
        };
        li.onmouseout = function(e)
        {
         var e = AutoComplete.fixE(e);
         AutoComplete.stopEvent(e);
        };


        if(li.className == 'selected')
        {
            li.className = null;
            if(direction == 'down')
            {
                if(li.nextSibling){
                    li.nextSibling.className = 'selected';
                    var sell = 1;
                    break;
                }
                 else
                {
                    listItems[0].className = 'selected';
                    var sell = 1;
                    break;
                }
            }
            else
            {
                if(li.previousSibling)
                {
                    li.previousSibling.className = 'selected';
                    var sell = 1;
                    break;
                }
                 else
                {
                    listItems[listItems.length-1].className = 'selected';
                    var sell = 1;
                    break;
                }

            }

        }

       }
       if(!sell)
        listItems[0].className = 'selected';


    },


    enterSelected:function(){
       var list =  dropDown.childNodes[0];
       var listItems = list.childNodes;
       for(i in listItems)
       {
            if(listItems[i].className == 'selected')
              {
				var selectedText = listItems[i].textContent || listItems[i].outerText; /////////////////IE FIX THIS
                currentField.value = listItems[i].textContent || listItems[i].outerText; /////////////////IE FIX THIS;
				//strip price
				if(listItems[i].getAttribute('price'))
				{
					var price_value = listItems[i].getAttribute('price');
					//get row
					var t_array = currentField.name.split("_");
					var rowNumber = t_array[1];
					//assign new price
					if(document.getElementById("price" + rowNumber))
					{
						var price_field = document.getElementById("price" + rowNumber)
						price_field.value = makeFloat(price_value);
						//make changes to total
						totalInvoice();
					}
				}else if(listItems[i].getAttribute('clientID'))
				{
					var client_id = listItems[i].getAttribute('clientID');
					var clientID_hidden = document.getElementById("clientID");
					clientID_hidden.value = client_id;
					if (getClientAddress)getClientAddress(client_id);
					if(document.getElementById('invoiceList'))getClientInvoices(client_id); // if list of invoices is required
				}
				var driver = currentField.getAttribute('AC');
				switch(driver)
				{
					//AC for adding an attendee
					case "appointmentAttendees":
					{
						saveSelectedAttendee(listItems[i].getAttribute('attID'),listItems[i].getAttribute('attType'));
						break;
					}
					
				}
				
                editing = null;
                currentField.focus();
                AutoComplete.hideDropDown();
            }
            keepHidden = 1;
       }
    },

    setPosition:function(input,dd){
        dd.style.left = AutoComplete.calculateOffset(input,"offsetLeft")+"px";
        dd.style.top = AutoComplete.calculateOffset(input,"offsetTop")+input.offsetHeight-1+"px";
        dd.style.width = input.offsetWidth + 'px';
    },

    calculateOffset:function(element,attr){
    var offset=0;
        while(element){
            offset+=element[attr];
            element=element.offsetParent;
        }
        return offset
    },

    stopEvent:function(evt){
        evt || window.event;
        if (evt.stopPropagation){
            evt.stopPropagation();
            evt.preventDefault();
        }else if(typeof evt.cancelBubble != "undefined"){
            evt.cancelBubble = true;
            evt.returnValue = false;
        }
        return false;
    },

    clearElement:function(element)
    {
        while(el = element.childNodes[0]){
		element.removeChild(el);
        };
    },

    fixE : function(e)
    {
        if (typeof e == 'undefined') e = window.event;
        if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
        if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
        return e;
    }

};


function getElementsByAttribute(att){
    var children = document.getElementsByTagName('*') || document.all;
    var elements = new Array();
        for (var i = 0; i < children.length; i++) {
            if(children[i].getAttribute(att))
            elements.push(children[i]);
        }
    return elements;
};



function getElementsByClassName(className) {
	  	var children = document.getElementsByTagName('*') || document.all;
	  	var elements = new Array();

	  for (var i = 0; i < children.length; i++) {
	    var child = children[i];
	    var classNames = child.className.split(' ');
	    for (var j = 0; j < classNames.length; j++) {
	      if (classNames[j] == className) {
	        elements.push(child);
	        break;
	      }
	    }
	  }

	  return elements;
};


Try = {
      these: function() {
        var returnValue;
        for (var i = 0; i < arguments.length; i++) {
          var lambda = arguments[i];
          try {
            returnValue = lambda();
            break;
          } catch (e) {}
        }
        return returnValue;
      }
};

Ajax = {
	  getTransport: function() {
	    return Try.these(
	      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
	      function() {return new ActiveXObject('Microsoft.XMLHTTP')},
	      function() {return new XMLHttpRequest()}
	    ) || false;
      }
};

function addEvent(obj,event_name,func_name){
	if (obj.attachEvent){
		obj.attachEvent("on"+event_name, func_name);
	}else if(obj.addEventListener){
		obj.addEventListener(event_name,func_name,true);
	}else{
		obj["on"+event_name] = func_name;
	}
}

//add event to window.onload so as not to overwrite the current onload
addEvent(window,'load',AutoComplete.setupPage);

