The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
var select_open = false;
var last_keypress = undefined;
var timer_id = undefined;
var timer_arg = undefined;

function populate_emails( event ) {
	var str = '';
	var evt = (event) ? event : ((window.event) ? window.event : null);
	if (! evt) { 
		if (timer_arg != undefined) {
			str = timer_arg;
		} else {
			return;
		}
	} else {
		var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
		if (! elem) { return; }
		var char = isIE ? evt.keyCode : evt.which;
		if (char == 13 || char == 40) {
			// return or downarrow
			var list = $("emaillist");
			if (list) {
				list.focus();
				return;
			}
		} else if (char == 8 || char == 127) {
			str = elem.value.substr( 0, elem.value.length - 1 ); 
		} else if (    (char == 43)
                    || (char == 45)
                    || (char == 46)
                    || (char >= 48 && char <= 57)
                    || (char >= 64 && char <= 90) 
                    || (char == 95)
		            || (char >= 97 && char <= 122) 
                  ) {
			str = elem.value + String.fromCharCode( char );
		}
	}

	if (timer_id != undefined) {
		clearTimeout( timer_id );
		timer_id = undefined;
		timer_arg = undefined;
	}
	if (last_keypress == undefined) {
		last_keypress = new Date();
	} else {
		// if the last keypress was less than half a second ago, 	
		// wait to see if we get any more input
		var now = new Date();
		if (now.getTime() - last_keypress.getTime() < 500) {
			timer_arg = str;
			timer_id = setTimeout( "populate_emails()", 501 );
			return;
		}
	}

	var list = $("emaillist");
	if (list) {
		$("email_list").removeChild( list );
	}
	var url = '';
	if (str.length > 2) {
		url = 'email_search.cgi?str=' + str;
	}
	if (url != '' && select_open == false) {
		clearTimeout( timer_id );
		last_keypress = undefined;
		select_open = true;
		new Ajax.Request( url, {
			method: 'get',
			onSuccess: add_emails_to_list
		} );
	}
}

function select_email( event )
{
	var list = $("emaillist");
	if (! list) { return; }
	var evt = (event) ? event : ((window.event) ? window.event : null);
	if (! evt) { return; }
	var elem = list.selectedIndex > -1 ? list.options[list.selectedIndex] : undefined;
	if (! elem) { return; }

	if (evt.type == 'mouseup' || evt.type == 'change' || evt.type == 'click') {
		add_to_field( elem );
	} else if (evt.type == 'keypress') {
		var char = isIE ? evt.keyCode : evt.which;
		if (char == 13) {
			add_to_field( elem );
		}
	}
}

function add_emails_to_list( req ) {
	var emails = req.responseXML.getElementsByTagName("ITEM");

	if (emails.length > 0) {
		// problem: the select is outside the tab order

		var list = document.createElement("select");
		list.id = 'emaillist';
		list.size = 10;
		list.onchange = select_email;
		list.onkeypress = select_email;
		$("email_list").appendChild( list );

		for (var i = 0; i < emails.length; i++) {
			append_to_select(list , i, emails[i] );
		}
	}
	select_open = false;
}

function append_to_select( select, index, item ) {
	var opt = document.createElement("option");

	var label = item.getAttribute('email');
	var targettext = label;
	opt.id_num = item.getAttribute('id');

	var txt = document.createTextNode(label);
	opt.targettext = targettext;
	opt.value = txt;
	opt.appendChild(txt);
	select.appendChild(opt);
}

function add_to_field( elem )
{
    var email = document.getElementById('email');
    email.value = elem.text;
}