// Script to create search field near select tags with more than 30 options.
// Usage: 	<script language="javascript" src="searchSelectOpt.js"></script>
//				<script>initAllSearchOpt(30);</script>		// 30- default length of options. can be omitted
//
// Optional: single field: <script>initSearchOpt(document.form1.selectField);</script>
// Note: select tag must have unique name
//===================================================================
//  
//  initAllSearchOpt: init all select elements if options.length >= num 
//  
//===================================================================
function initAllSearchOpt(num) {
	var defaultNum = 30;
	if (!num) {
		num = defaultNum;
	}
	if (num < 0) {
		num = defaultNum;
	}
	var selects = document.getElementsByTagName("select");
	for (var s=0;s<selects.length;s++) {
		if (selects[s].getAttribute("name") == undefined) {
			continue;
		}
		if (selects[s].getAttribute("name") == "") {
			continue;
		}
		if (selects[s].style.display == "none") {
			continue;
		}
		if (!selects[s].form.elements[selects[s].getAttribute("name")].options) {
			continue;
		}
		if (selects[s].getAttribute("name") && (selects[s].options.length >= num)) {
			try {
				initSearchOpt(selects[s]);
			}
			catch(e) {}
		}
	}
}
//===================================================================
//  
//  name: do 
//  
//===================================================================
function selectOnKeyUp(ev) {
/*
	if (!ev) {		// IE
		ev = event;
	}
*/	
	try {
		searchOpt(this,this.form.elements[this.id.replace(/[^_]*_/,"")]);
	}
	catch(e) {}
}

//===================================================================
//  
//  initSearchOpt: create search field to select field 
//  
//===================================================================
function initSearchOpt(selectField) {
	var textField = document.createElement("input");
	textField.type = "text";
	textField.style.width = "70px";
	textField.style.margin = "0px 5px 0px 5px";
	textField.id = "searchSelect_"+selectField.name;
	textField.onkeyup = selectOnKeyUp;
	//textField.onkeypress = selectOnKeyPress;
	if (selectField.nextSibling) {
		selectField.parentNode.insertBefore(textField,selectField.nextSibling);
	}
	else {
		selectField.parentNode.appendChild(textField);
	}
	if (textField.form == null) {		// FF
		selectField.form.appendChild(textField);
	}
}

//===================================================================
//  
//  searchOpt: search in select options 
//  
//===================================================================
function searchOpt(wordsField,selectField) {
	var options = selectField.options;
	wordsField.style.backgroundColor = "#ffffff";
	if (wordsField.value == "") {
		return;
	}
	var ok = false;
	var value = wordsField.value;
	for (var i = 0; i < options.length; i++) {
		var opt = options[i];
		if (opt.value =="") {
			continue;
		}
		if (opt.text.indexOf(value)==0) {
			options.selectedIndex = i;
			ok = true;
			break;
		}
		else if ((opt.text.indexOf(value) != -1) || (opt.text.toLowerCase().indexOf(value.toLowerCase()) != -1)) {
			if (ok) {
				continue;
			}
			ok = true;
			options.selectedIndex = i;
		}
		else if (opt.value.indexOf(value) == 0) {
			if (ok) {
				continue;
			}
			ok = true;
			options.selectedIndex = i;
		}
	}
	if (!ok) {
		wordsField.style.backgroundColor = "#ff9999";
		options.selectedIndex = 0;
	}
	if (selectField.onchange) {
		selectField.onchange();
		//onchangeDelay(selectField,"start");
	}
		
}

onchangeDelayedObject = null;
//===================================================================
//  
//  name: do 
//  
//===================================================================
function onchangeDelay(field,act) {
	var delay = 1500;
	if (	act == "start") {
		if (onchangeDelayedObject) {
			window.clearTimeout(onchangeDelayedObject.getAttribute("timeoutID"));
			onchangeDelayedObject.setAttribute("timeoutID",null);
		}
		onchangeDelayedObject = field;
		onchangeDelayedObject.setAttribute("timeoutID",window.setTimeout("onchangeDelay(onchangeDelayedObject,'onchange')",delay));
	}
	else if (act == "onchange") {
		onchangeDelayedObject.setAttribute("timeoutID",null);
		onchangeDelayedObject.onchange();
	}
}

