var cString="";
var cPosition=0;
var myTimer=null;
var delay= 1*1000; // время в милисекундах Периодический запуск функции чистки строки поиска....
var showOptiontitleFlag=true;
var maximumOptionsManaged = 100;

function clearScroll(flag) {
	cString="";
	if (flag) cPosition=0;
}
function setScrollTimer() {
	myTimer=setInterval("clearScroll(false)",delay);
}
function clearScrollTimer() {
	if (myTimer!=null) {
		clearTimeout(myTimer);
	}
}
function restartScrollTimer() {
	clearScrollTimer();
	setScrollTimer();
}
function initContextScroll(ev) {
	var e = window.event ? window.event : ev;
	var field = window.event ? e.srcElement : e.target;
	if (field==null) return;
	if (field.addEventListener) {
			field.addEventListener("keydown", handleKeyDown, false);
			field.addEventListener("click", handleClickOver, false);
			field.addEventListener("keypress", applyContextScroll, false);
			field.addEventListener("blur", hideScrollEvents, false);
	}
	else if (field.attachEvent) {
				field.attachEvent("onkeydown", handleKeyDown);
				field.attachEvent("onclick", handleClickOver);
				field.attachEvent("onkeypress", applyContextScroll);
				field.attachEvent("onblur", hideScrollEvents);
	}
	cPosition=field.selectedIndex;
	if (!field.getAttribute("waitEnterHit")) {
		setScrollTimer();
	}
}
function hideScrollEvents(ev) {
	var e = window.event ? window.event : ev;
	var field = window.event ? e.srcElement : e.target;
	if (field==null) return;
	if (field.removeEventListener) {
			field.removeEventListener("keydown", handleKeyDown, false);
			field.removeEventListener("click", handleClickOver, false);
			field.removeEventListener("keypress", applyContextScroll, false);
			field.removeEventListener("blur", hideScrollEvents, false);
	}
	else if (field.detachEvent) {
				field.detachEvent("onkeydown", handleKeyDown);
				field.detachEvent("onclick", handleClickOver);
				field.detachEvent("onkeypress", applyContextScroll);
				field.detachEvent("onblur", hideScrollEvents);
	}
	if (field.getAttribute("contextSearchDone")!=null) {
		field.selectedIndex=cPosition;
		field.removeAttribute("contextSearchDone");
	}
	clearScroll(true);
	clearScrollTimer();
}
function handleClickOver(ev) {
	var e = window.event ? window.event : ev;
	var field = window.event ? e.srcElement : e.target;
	if (field!=null) {
		cPosition=field.selectedIndex;
	}
}
function handleKeyDown(ev) {
	var e = window.event ? window.event : ev;
	var field = window.event ? e.srcElement : e.target;
	if(e.keyCode==27) {// hit escape 
		if (field!=null){
			field.removeAttribute("contextSearchDone");
		}
		clearScroll(true);
	}
	if(e.keyCode==38) {// hit arrow up
		cPosition=(cPosition<=0)?field.options.length-1:cPosition-1;
		clearScroll(false);
	}
	if(e.keyCode==40) {// hit arrow down
		cPosition=(cPosition==(field.options.length-1))?0:cPosition+1;
		clearScroll(false);
	}
	if (!field.getAttribute("waitEnterHit")) {
		restartScrollTimer();
	}
}
function applyContextScroll(ev) {
	var e = window.event ? window.event : ev;
	var field = window.event ? e.srcElement : e.target;
	if (field==null || !field.tagName || field.tagName.toLowerCase()!="select") return;
	var waitEnterHit = field.getAttribute("waitEnterHit");
	var code = window.event ? e.keyCode : e.which;
	var keyTyped = String.fromCharCode(code);
	if (!(keyTyped.match('([a-zA-Z \-]+)$') || keyTyped.match('([а-яёА-ЯЁ \-]+)$' )) && code!=13 ) return; //13 -enter Hit
	if (code!=13) {
		cString+=keyTyped;
		var i=(cPosition==(field.options.length-1))?0:cPosition+1;
		while (i!=cPosition) {
			var op=field.options[i];
            if (op == undefined) return;
			var testStr=op.text.substring(0,cString.length);
			if (testStr.toLowerCase() == cString.toLowerCase()) {
				field.selectedIndex=i;
				cPosition=i;
				break;
			}
			i=(i==(field.options.length-1))?0:i+1;
		}
		field.setAttribute("contextSearchDone",true);
	}
	else { //hit enter
		cPosition=field.selectedIndex;
	}
	if (waitEnterHit && code!=13) return;
	else {
		if (field && field.onchange) {
			field.onchange();
		}
	}
}
function initSelectContextScroll() {
	for (var j = 0; (node = document.getElementsByTagName("select").item(j)); j++) {
		if (node.getAttribute("noHint")!=null) continue;
		if (node.addEventListener) {
			node.addEventListener("focus", initContextScroll, false);
		
			if (showOptiontitleFlag) {
				if (node.selectedIndex>=0 && node.options[node.selectedIndex].text!="-----") {
					node.setAttribute("hint",node.options[node.selectedIndex].text);
				}
				else node.setAttribute("hint","");
				if (self.addHint) self.addHint(node);
				node.addEventListener("change", fillHint, false);

				if (node.options.length<=maximumOptionsManaged) {
					for (var i=0; i<node.options.length;i++ ) {
						var o=node.options[i];
						o.setAttribute("title",o.text);
					}
				}
			}
		}
		else if (node.attachEvent) {
			node.attachEvent("onfocus", initContextScroll);

			if (showOptiontitleFlag) {
				if (node.selectedIndex>=0 && node.options[node.selectedIndex].text!="-----") {
					node.setAttribute("hint",node.options[node.selectedIndex].text);
				}
				else node.setAttribute("hint","");
				if (self.addHint) self.addHint(node);
				node.attachEvent("onchange", fillHint);
			}
		}
	}
}
function fillHint(e) {
	var e = window.event ? window.event : e;
	var src = window.event ? e.srcElement : e.target;
	if(!src || src.tagName!="SELECT") return;
    try {
      val=src.options[src.selectedIndex].text;
	  src.setAttribute("hint",val);
    } catch(e) {    
    }
}
function setOptionTitleFlag(flag){
	showOptiontitleFlag=(!flag)?false:true;
}

if (typeof(root)=="undefined") {var root = window.addEventListener || window.attachEvent ? window : document.addEventListener ? document : null;}
if (root.addEventListener) root.addEventListener("load", initSelectContextScroll, false);
else if (root.attachEvent) root.attachEvent("onload", initSelectContextScroll);

