function AutoEhdotusControl(oTextbox, oProvider, ehdNakyvissa) {
    //Nykyinen valinta
    this.cur = -1;
    this.provider = oProvider;
    this.ehdNakyvissa = ehdNakyvissa;
    //Aluekenttä
    this.textbox = oTextbox;
    this.init();
}

//Hae ehdotukset. 
AlueEhdotukset.prototype.haeEhdotukset = function (AutoEhdotusControl, bTypeAhead) {
    var ehdotuksetArr = [];
    var sTextboxValue = AutoEhdotusControl.textbox.value.toLowerCase();
    
    if (sTextboxValue.length > 0){
    
        //hae alueet
        for (var i=0; i < this.alueet.length; i++) {
			alueLower = this.alueet[i].toLowerCase();
            if (alueLower.indexOf(sTextboxValue) == 0) {
                ehdotuksetArr.push(this.alueet[i]);
            } 
        }
    }

    AutoEhdotusControl.autoehdotus(ehdotuksetArr, bTypeAhead);
};

AutoEhdotusControl.prototype.autoehdotus = function (ehdotuksetArr, bTypeAhead) {
    //varmistetaan että ainakin 1 ehdotus on olemassa
	if (ehdotuksetArr.length > 0) {
	    this.naytaPaikkaEhdotukset(ehdotuksetArr);
   	} else {
   	    this.piilotaEhdotukset();
   	}
};

//Luo pudotusvalikon
AutoEhdotusControl.prototype.createDropDown = function () {
	if(this.provider)
	    this.layer = document.getElementById("paikkalista");
	else
		this.layer = document.getElementById("sanalista");
    this.layer.className = "ehdotukset";
};


//Nuolinäppäimet ja enter
AutoEhdotusControl.prototype.handleKeyDown = function (oEvent) {

    switch(oEvent.keyCode) {
        case 38: //up
            this.edellinenEhdotus();
            break;
        case 40: //down 
            this.seuraavaEhdotus();
            break;
        case 13: //enter
            this.piilotaEhdotukset();
            break;
    }

};

//Ylös
AutoEhdotusControl.prototype.handleKeyUp = function (oEvent) {

    var iKeyCode = oEvent.keyCode;

    //backspace (8) ja delete (46)
    if (iKeyCode == 8 || iKeyCode == 46) {
		if(this.provider)
	        this.provider.haeEhdotukset(this, false);
		else{
			var hakutype = document.getElementById('hakutype').value;
			if(hakutype != 'ytunnus')
				ajaxExe("hakuehdotus","/sanaehdotus.php",[['hakusanat',this.textbox.value],['hakutype',hakutype]],"sanalista");
		}
        
    //ei merkkinäppäimet
    } else if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) {
		
    } else {
		if(this.provider)
	        this.provider.haeEhdotukset(this, true);
		else{
			var hakutype = document.getElementById('hakutype').value;
			if(hakutype != 'ytunnus')
				ajaxExe("hakuehdotus","/sanaehdotus.php",[['hakusanat',this.textbox.value],['hakutype',hakutype]],"sanalista");
		}
    }
};

//Valikko piiloon, scrollaus ylös ja valittu pois
AutoEhdotusControl.prototype.piilotaEhdotukset = function () {
	this.layer.style.visibility = 'hidden';
	
	if(document.getElementById('sanalista') != null)
		document.getElementById('sanalista').style.visibility = 'hidden';
	document.getElementById('paikkalista').style.visibility = 'hidden';
	
    this.layer.scrollTop = 0;
	this.cur = -1;
};

//Ehdotus hilite
AutoEhdotusControl.prototype.highlightSuggestion = function (oSuggestionNode) {
    for (var i=0; i < this.layer.childNodes.length; i++) {
        var oNode = this.layer.childNodes[i];
        if (oNode == oSuggestionNode) {
            oNode.className = "nykyinen"
        } else if (oNode.className == "nykyinen") {
            oNode.className = "";
        }
    }
};

//aluekenttä init
AutoEhdotusControl.prototype.init = function () {
    //save a reference to this object
    var oThis = this;
    
    //onkeyup eventti
	//if(this.provider ){
		this.textbox.onkeyup = function (oEvent) {
			if (!oEvent) {
				oEvent = window.event;
			}    
		oThis.handleKeyUp(oEvent);
		};
	//}
    //onkeydown eventti

   	this.textbox.onkeydown = function (oEvent) {
 		if (!oEvent) {
			oEvent = window.event;
		}
	oThis.handleKeyDown(oEvent);
	};

	//jos klikataan valikon ulkopuolella, piilotetaan se
	document.onclick = function () {
	    var elementtiId = oThis.missaKlikkaus();
		if(elementtiId != "paikkalista")
			oThis.piilotaEhdotukset();
	};
	
	this.createDropDown();
};
//katsotaan, missä klikataan
AutoEhdotusControl.prototype.missaKlikkaus = function (oEvent) {
	document.onmousedown = function (oEvent) {
        if (!oEvent) {
            oEvent = window.event;
        }
		var kohde = (oEvent.target) ? oEvent.target : oEvent.srcElement;
        return kohde;
	};   
};

//Seuraavaan ehdotukseen. Ehdotus aluekenttään.
AutoEhdotusControl.prototype.seuraavaEhdotus = function () {
    var cSuggestionNodes = this.layer.childNodes;

    if (cSuggestionNodes.length > 0 && this.cur < cSuggestionNodes.length-1) {
        var oNode = cSuggestionNodes[++this.cur];
        this.highlightSuggestion(oNode);
        this.textbox.value = oNode.firstChild.nodeValue; 
		
		//scrollaus
		if(this.provider){
			if(this.layer.scrollTop < oNode.offsetHeight * (this.cur - this.ehdNakyvissa))
				this.layer.scrollTop = this.layer.scrollTop + oNode.offsetHeight;
		}
    }
};

//Edelliseen ehdotukseen. Ehdotus aluekenttään
AutoEhdotusControl.prototype.edellinenEhdotus = function () {
    var cSuggestionNodes = this.layer.childNodes;

    if (cSuggestionNodes.length > 0 && this.cur > 0) {
        var oNode = cSuggestionNodes[--this.cur];
        this.highlightSuggestion(oNode);
        this.textbox.value = oNode.firstChild.nodeValue;   
		
		//scrollaus
		if(this.layer.scrollTop > oNode.offsetHeight * this.cur)
			this.layer.scrollTop = this.layer.scrollTop - oNode.offsetHeight;		
    }
};
//Alasvetovalikon sisältö <div>
AutoEhdotusControl.prototype.naytaPaikkaEhdotukset = function (ehdotuksetArr) {
	var oThis = this;
    var oDiv = null;
    this.layer.innerHTML = "";

    for (var i=0; i < ehdotuksetArr.length; i++) {
        oDiv = document.createElement("div");
        oDiv.appendChild(document.createTextNode(ehdotuksetArr[i]));
        this.layer.appendChild(oDiv);
		
  		oDiv.onmousedown = 
    	oDiv.onmouseup = function (oEvent) {
			oEvent = oEvent || window.event;
			oTarget = oEvent.target || oEvent.srcElement;

			if (oEvent.type == "mousedown") {
				oThis.textbox.value = oTarget.firstChild.nodeValue;
				oThis.piilotaEhdotukset();
			} else {
				oThis.textbox.focus();
			}
		};		
    }

    this.layer.style.visibility = "visible";

};

