<!-- per request, I am posting this into the public domain. -->
<HTML>
<HEAD>
<!-- 1) Copy-n-paste the code between the SCRIPT tags to a file called "picklist.js" -->
<!-- 2) Include the following in your page: <SCRIPT language="javascript" src="picklist.js" ></SCRIPT> -->
<!-- 3) See the BODY tag, and the comment NOTEs in the form below for setup instructions. -->
<SCRIPT language='javascript'>
//////////////////////////
//////////
//////////
//////////
//////////
//////////
////
///// /// Picklist.js -- (C) 1999,2003 by Ralph L. Brown (akakEk) ///// ///
///// /// This script, with copyright notice intact, may be freely ///// ///
///// /// distributed and used for any legal and legitimate ///// ///
///// /// purpose(s) except for the distribution of unsolicited ///// ///
///// /// email (spam) and the publication of pornographic content. ///// ///
//////////////////////////
//////////
//////////
//////////
//////////
//////////
////
var UNDEFINED; // do not assign!
function getX(obj)
{
return( obj.offsetParent==null ? obj.offsetLeft : obj.offsetLeft+getX(obj.of
fsetParent
) );
}
function getY(obj)
{
return( obj.offsetParent==null ? obj.offsetTop : obj.offsetTop+getY(obj.off
setParent)
);
}
function isvalidchar(achar,validstr
)
{
if ( !validstr ) validstr = "ABCDEFGHIJKLMNOPQRSTUVWXY
Z012345678
9 `~!@#$%^&*()_-+={}[]|:;'<>
,./?\\\"";
return( validstr.toUpperCase().ind
exOf(achar
.toString(
).toUpperC
ase(),0) >= 0 );
}
function getQualifiedName(formEleme
nt)
{
var formName = formElement.form.name;
if ( formName=="" ) formName=0; // best guess since it is indeterminate for netscape
return 'document.forms["' + formName + '"].elements["' + formElement.name + '"]';
}
function getTooltipDiv()
{
if ( document.getElementById )
return document.getElementById('d
ivPicklist
Tooltip');
else if ( document.all )
return document.all.divPicklistTo
oltip;
else return null;
}
function createTooltipDiv(objSel)
{
if ( !getTooltipDiv() ) // if this is the first time this function is
{ // called then create the tooltip text window.
var tooltipDiv = "<DIV id='divPicklistTooltip' style='position:absolute;t
op:0px;lef
t:0px;visi
bility:hid
den'></div
>";
if ( document.body.insertAdjace
ntHTML )
{
document.body.insertAdjace
ntHTML("be
foreEnd",t
ooltipDiv)
;
}
else if ( document.body.innerHTML )
{
document.body.innerHTML += tooltipDiv;
}
// necessary for netscape (don`t know why)
setTimeout( "setupPicklist(" + getQualifiedName(objSel) + ")", 1 );
return true;
}
return false;
}
function showTooltipText(objSel)
{
if ( !objSel || objSel.Y==UNDEFINED ) // null or not setup
{
return false;
}
var divPicklistTooltip = getTooltipDiv();
var s = divPicklistTooltip.innerHT
ML = "";
with ( objSel )
{
if ( strKeyInBuf=="" && title.length )
{
s = '<FONT color="blue">' + title + '</font>';
}
else if ( selectedIndex>=0 && strKeyInBuf==options[selec
tedIndex].
text ) // unique match found
{
s = '<B>' + strKeyInBuf + '</b>';
}
else
{
var c = strKeyInBuf.substring(strK
eyInBuf.le
ngth-1,str
KeyInBuf.l
ength);
c = ( c == ' ' ) ? ' ' : '<B>' + c + '</b>';
s = strKeyInBuf.substring(0,st
rKeyInBuf.
length-1) + c;
}
divPicklistTooltip.innerHT
ML = '<TABLE cellpadding=0 cellspacing=0 style="background-color:IN
FOBACKGROU
ND;'
+ 'font:8pt ms sans serif;padding:2px 2px 2px 2px;color:INFOTEXT;border:
1px solid INFOTEXT;">'
+ '<TR><TD align="left"><NOBR>'+s+'</
nobr></td>
</tr></tab
le>';
divPicklistTooltip.style.p
osLeft = divPicklistTooltip.style.l
eft = X;
divPicklistTooltip.style.p
osTop = divPicklistTooltip.style.t
op = Y;
divPicklistTooltip.style.v
isibility = "";
} // end with
return true;
}
function hideTooltipText(objSel)
{
if (objSel) objSel.strKeyInBuf = "";
var divPicklistTooltip = getTooltipDiv();
return divPicklistTooltip.innerHT
ML = "";
}
function findSelectEntry( objSel, head, tail ) // uses divide-and-conquer search, assumes sorted list
{
with ( objSel )
{
if ( options.length <= 0 )
{
strKeyInBuf = ' <FONT color="red">No selections available.</font> ';
showTooltipText(objSel);
top.status = strKeyInBuf = "";
return -1;
}
if ( strKeyInBuf == "" )
{
showTooltipText(objSel);
return( selectedIndex = options[selectedIndex=0].t
ext.length
? -1 : 0 );
}
if (head==UNDEFINED) head = 0;
if (tail==UNDEFINED) tail = options.length-1;
var mid = Math.round( (head+tail)/2 );
if ( strKeyInBuf.toUpperCase() == options[mid].text.substrin
g(0,strKey
InBuf.leng
th).toUppe
rCase() )
{
while ( (mid>0) && strKeyInBuf.toUpperCase() == options[mid-1].text.substr
ing(0,strK
eyInBuf.le
ngth).toUp
perCase() )
{
mid--; // get the topmost matching item in the list, not just the first found
}
selectedIndex = mid;
top.status = strKeyInBuf = options[mid].text.substrin
g(0,strKey
InBuf.leng
th);
if ( mid == Math.round( (head+tail)/2 ) ) // if the original mid is an exact match
{
if ( (mid==tail) || ( (mid<tail) && strKeyInBuf.toUpperCase() != options[mid+1].text.substr
ing(0,strK
eyInBuf.le
ngth).toUp
perCase() ) )
{
top.status = strKeyInBuf = options[mid].text; // unique match found
}
}
showTooltipText(objSel);
return selectedIndex;
}
if ( head >= tail ) // then since no exact match was found, go back to previous strKeyInBuf (thus the length-1)
{
strKeyInBuf = strKeyInBuf.substring(0,st
rKeyInBuf.
length-1)
return findSelectEntry( objSel );
}
if ( strKeyInBuf.toUpperCase() < options[mid].text.substrin
g(0,strKey
InBuf.leng
th).toUppe
rCase() )
{
return findSelectEntry( objSel, head, Math.max(head,mid-1) );
}
return findSelectEntry( objSel, Math.min(mid+1,tail), tail );
} // end with
}
function picklistFocusHandler(e)
{
var event = e ? e : window.event; // to handle both NS and IE events
var objSel = event.target ? event.target : event.srcElement;
picklistFocusHandler.objSe
l = objSel;
// update data elements
objSel.X = getX(objSel)+2;
objSel.Y = getY(objSel)-20;
objSel.strKeyInBuf = "";
// display the tooltip help (the title attribute by default)
showTooltipText(objSel);
}
function picklistBlurHandler(e)
{
var event = e ? e : window.event; // to handle both NS and IE events
var objSel = event.target ? event.target : event.srcElement;
picklistFocusHandler.objSe
l = null;
top.status = (objSel.selectedIndex>-1) ? objSel.options[objSel.sele
ctedIndex]
.text : "";
hideTooltipText(objSel);
return true;
}
function picklistMouseOverHandler(e
)
{
var event = e ? e : window.event; // to handle both NS and IE events
var objSel = event.target ? event.target : event.srcElement;
showTooltipText(objSel);
return true;
}
function picklistMouseOutHandler(e)
{
var event = e ? e : window.event; // to handle both NS and IE events
var objSel = event.target ? event.target : event.srcElement;
if ( objSel==picklistFocusHandl
er.objSel || objSel==document.activeEle
ment )
return true;
hideTooltipText();
return true;
}
function picklistKeyDownHandler(e)
{
var event = e ? e : window.event; // to handle both NS and IE events
var objSel = event.target ? event.target : event.srcElement;
var divPicklistTooltip = getTooltipDiv();
with ( objSel )
{
// this is to correct the search bug when the list is left open after single-click
if ( strKeyInBuf=="" && event.keyCode>40 )
{
objSel.blur();
objSel.focus();
}
switch(event.keyCode)
{
case(8): // backspace
{
if ( selectedIndex>=0 && strKeyInBuf==options[selec
tedIndex].
text )
{
top.status = strKeyInBuf = "";
}
else
{
top.status = strKeyInBuf = strKeyInBuf.substring(0,st
rKeyInBuf.
length-1);
}
selectedIndex = findSelectEntry(objSel);
event.keyCode = 0;
return false;
}
case(9): // tab
case(13): // enter
{
event.keyCode = 9; // convert enter to tab
return true;
}
case(27): // escape
{
top.status = strKeyInBuf = "";
selectedIndex = options[selectedIndex=0].t
ext.length
? -1 : 0;
showTooltipText(objSel);
event.keyCode = 0;
return false;
}
case(32): // space
{
top.status = strKeyInBuf += ' ';
// this must be fired explicitely for spaces
return !picklistKeyPressHandler(e
vent);
}
// I don't know if these are universal
case(33): // page up
case(34): // page down
case(35): // end
case(36): // home
case(37): // left arrow
case(38): // up arrow
case(39): // right arrow
case(40): // down arrow
{
top.status = hideTooltipText(objSel);
return true;
}
} // end switch
} // end with
return true;
}
function picklistKeyPressHandler(e)
{
var event = e ? e : window.event; // to handle both NS and IE events
var objSel = event.target ? event.target : event.srcElement;
var inputChar = String.fromCharCode(event.
keyCode ? event.keyCode : event.charCode);
if ( inputChar=='\n' || inputChar=='\r' )
{
top.status = objSel.strKeyInBuf = ( objSel.selectedIndex>-1 ? objSel.options[objSel.sele
ctedIndex]
.text : "" );
}
if ( isvalidchar(inputChar) && event.charCode!=0 )
{
objSel.strKeyInBuf += inputChar;
// must use setTimeout to override the default SELECT keypress event(s)
setTimeout( "findSelectEntry(" + getQualifiedName(objSel) + ")", 1 );
}
return true;
}
function setupPicklist(objSel)
{
if ( !document.all && !document.getElementById )
return false; // browser not supported
if ( !objSel || (""+objSel.type).substring
(0,6).toLo
werCase()!
="select" )
return false; // null or not a select
createTooltipDiv(objSel);
// create/init data elements
objSel.X = getX(objSel)+2;
objSel.Y = getY(objSel)-20;
objSel.strKeyInBuf = "";
// setup event handlers
objSel.onclick = function(){top.status=hide
TooltipTex
t(this);}
objSel.onfocus = picklistFocusHandler;
objSel.onblur = picklistBlurHandler;
objSel.onmouseover = picklistMouseOverHandler;
objSel.onmouseout = picklistMouseOutHandler;
objSel.onkeydown = picklistKeyDownHandler;
objSel.onkeypress = picklistKeyPressHandler;
objSel.onkeyup = null;
return true;
}
//////////////////////////
///////// -- End Picklist.js -- //////////////////////////
//////////
////
</SCRIPT>
</HEAD>
<BODY onLoad="setupPicklist(docu
ment.myFor
m.myPickli
st1); setTimeout('document.myFor
m.myPickli
st1.focus(
)',1);" comment="use setTimeout for Netscape focus" >
<CENTER>
<P align="center"> </P>
<P align="center"> </P>
<P align="center"> </P>
<FORM name="myForm">
<!-- NOTE: The options in the SELECT must be ordered by the .text property! -->
<!-- NOTE: The .value properties can be anything you want. -->
<SELECT name="myPicklist1" size="1" title="Please type your name in the pick-list below." >
<OPTION value="whatever"></OPTION>
<OPTION>Abe</OPTION>
<OPTION>Alice</OPTION>
<OPTION>Alicia</OPTION>
<OPTION>Allen</OPTION>
<OPTION>Arthur</OPTION>
<OPTION>Arty</OPTION>
<OPTION>Beatrice</OPTION>
<OPTION>Ben</OPTION>
<OPTION>Bill</OPTION>
<OPTION>Bing</OPTION>
<OPTION>Brian</OPTION>
<OPTION>Brittany</OPTION>
<OPTION>Bruce</OPTION>
<OPTION>Buzz</OPTION>
<OPTION>Carie</OPTION>
<OPTION>Catherine</OPTION>
<OPTION>Cathy</OPTION>
<OPTION>Charles</OPTION>
<OPTION>Chase</OPTION>
<OPTION>Chris</OPTION>
<OPTION>Christian</OPTION>
<OPTION>Christina</OPTION>
<OPTION>Christopher</OPTIO
N>
<OPTION>Clay</OPTION>
<OPTION>Clayton</OPTION>
<OPTION>Daniel</OPTION>
<OPTION>Danny</OPTION>
<OPTION>Darren</OPTION>
<OPTION>Darryl</OPTION>
<OPTION>Darwin</OPTION>
<OPTION>David</OPTION>
<OPTION>Dean</OPTION>
<OPTION>Derrick</OPTION>
<OPTION>Dinah</OPTION>
<OPTION>Don</OPTION>
<OPTION>Doug</OPTION>
<OPTION>Eathen</OPTION>
<OPTION>Ed</OPTION>
<OPTION>Edward</OPTION>
<OPTION>Edwin</OPTION>
<OPTION>Evan</OPTION>
<OPTION>Forrest</OPTION>
<OPTION>Frank</OPTION>
<OPTION>Fritz</OPTION>
<OPTION>Gary</OPTION>
<OPTION>George</OPTION>
<OPTION>Glenn</OPTION>
<OPTION>Greg</OPTION>
<OPTION>Hank</OPTION>
<OPTION>Hellen</OPTION>
<OPTION>Henry</OPTION>
<OPTION>Imus</OPTION>
<OPTION>Ingred</OPTION>
<OPTION>Jack</OPTION>
<OPTION>Jack Club</OPTION>
<OPTION>Jack Diamond</OPTION>
<OPTION>Jack Heart</OPTION>
<OPTION>Jack Spade</OPTION>
<OPTION>Jackie</OPTION>
<OPTION>Jacob</OPTION>
<OPTION>James</OPTION>
<OPTION>Jason</OPTION>
<OPTION>Jean-Luc</OPTION>
<OPTION>Jerry</OPTION>
<OPTION>Jesus</OPTION>
<OPTION>Jim</OPTION>
<OPTION>John</OPTION>
<OPTION>Katlyn</OPTION>
<OPTION>Kayla</OPTION>
<OPTION>Kendra</OPTION>
<OPTION>Kyle</OPTION>
<OPTION>Lance</OPTION>
<OPTION>Larry</OPTION>
<OPTION>Leah</OPTION>
<OPTION>Lenny</OPTION>
<OPTION>Luke</OPTION>
<OPTION>Mallory</OPTION>
<OPTION>Mandy</OPTION>
<OPTION>Mark</OPTION>
<OPTION>Mary</OPTION>
<OPTION>MaryAnn</OPTION>
<OPTION>Matthew</OPTION>
<OPTION>Michael</OPTION>
<OPTION>Michele</OPTION>
<OPTION>Mickey</OPTION>
<OPTION>Mike</OPTION>
<OPTION>Mitch</OPTION>
<OPTION>Nathan</OPTION>
<OPTION>Ned</OPTION>
<OPTION>Olive</OPTION>
<OPTION>Ollie</OPTION>
<OPTION>Oppie</OPTION>
<OPTION>Pat</OPTION>
<OPTION>Paul</OPTION>
<OPTION>Perry</OPTION>
<OPTION>Peter</OPTION>
<OPTION>Phil</OPTION>
<OPTION>Phillip</OPTION>
<OPTION>Rachael</OPTION>
<OPTION>Ralph</OPTION>
<OPTION>Randall</OPTION>
<OPTION>Randy</OPTION>
<OPTION>Rebekah</OPTION>
<OPTION>Red</OPTION>
<OPTION>Rex</OPTION>
<OPTION>Rick</OPTION>
<OPTION>Ried</OPTION>
<OPTION>Robert</OPTION>
<OPTION>Rodney</OPTION>
<OPTION>Roger</OPTION>
<OPTION>Sally</OPTION>
<OPTION>Sam</OPTION>
<OPTION>Sharon</OPTION>
<OPTION>Sidney</OPTION>
<OPTION>Stephen</OPTION>
<OPTION>Steve</OPTION>
<OPTION>Stuart</OPTION>
<OPTION>Ted</OPTION>
<OPTION>Terry</OPTION>
<OPTION>Theodore</OPTION>
<OPTION>Theresa</OPTION>
<OPTION>Thomas</OPTION>
<OPTION>Tim</OPTION>
<OPTION>Tom</OPTION>
<OPTION>Val</OPTION>
<OPTION>Van</OPTION>
<OPTION>Vince</OPTION>
<OPTION>Wayne</OPTION>
<OPTION>Will</OPTION>
<OPTION>William</OPTION>
<OPTION>Wink</OPTION>
<OPTION>Woody</OPTION>
<OPTION>X</OPTION>
<OPTION>Yoda</OPTION>
<OPTION>Zack</OPTION>
<OPTION>Ziggy</OPTION>
<OPTION>Zurg</OPTION>
</SELECT>
<P><INPUT type="submit" value="Reload" /></P>
</FORM>
</CENTER>
</BODY>
</HTML>
<!------------------------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
---->