<rdf:RDF
    xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
    xmlns:s='http://snipsnap.org/rdf/snip-schema#'
    xml:base='http://bliki.rimuhosting.com/rdf'>
    <s:Snip rdf:about='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/ajax+autocomplete'
         s:cUser='retep'
         s:oUser=''
         s:mUser='retep'>
        <s:name>knowledgebase/linux/misc/ajax autocomplete</s:name>
        <s:content>1 A Implementation in Search of a Requirement&#xD;&#xA;&#xD;&#xA;Simple requirement: let the user select their timezone.&#xD;&#xA;&#xD;&#xA;The JDK I have installed has over 500 timezones included.  That is more than I really wanted to put into a list.&#xD;&#xA;&#xD;&#xA;I thought that a cool way to do it would be to have the user type a bit of their city name or country and have the computer pick the most likely timezones.  (A few days later and I have all sorts of better ideas how to actually do this, but for now let us presume this was an inspired idea).&#xD;&#xA;&#xD;&#xA;Obviously, since Ajax is so sexy right now, I wanted to use that in the implementation.&#xD;&#xA;&#xD;&#xA;There are various Ajax libraries/frameworks/implementations.  I selected DWR  (http://getahead.ltd.uk/dwr/).  It automates exposing Java objects, which works for what I need to do.&#xD;&#xA;&#xD;&#xA;1 So Where Is That Autocomplete Widget?&#xD;&#xA;&#xD;&#xA;I pretty quickly got up to speed with DWR just following their getting started guide (http://getahead.ltd.uk/dwr/getstarted).  &#xD;&#xA;&#xD;&#xA;DWR made it easy for me to take the text a user was typing, and use DWR to grab a list of timezone names that matched.&#xD;&#xA;&#xD;&#xA;What DWR does not provide is any HTML widgets to help display the result (it does contain a few util methods to get/set input/list control contents).  Specifically it does not provide an autocomplete widget.&#xD;&#xA;&#xD;&#xA;On their hints page (http://getahead.ltd.uk/dwr/hints) they mention using the Script.aculo.us Autocompleter.Local component (http://wiki.script.aculo.us/scriptaculous/show/Autocompleter.Local).  Sadly my poor sensibilities were offended by all the Javascript baggage required to use this widget.  Plus it had to be modified to support DWR.&#xD;&#xA;&#xD;&#xA;After much searching around and grinding of teeth I decided I needed that I would need to do some Javascript coding for myself to get this done.&#xD;&#xA;&#xD;&#xA;1 The Minimal AutoComplete Widget&#xD;&#xA;&#xD;&#xA;I attached the autocomplete widget source to this page.  It should run without any other includes.  The Javascript is simple enough that I think I even understand it.  The display is CSS driven.  And it integrates nicely enough with DWR.&#xD;&#xA;&#xD;&#xA;Sample usage goes something like this:&#xD;&#xA;{code:none}&#xD;&#xA;&lt;script type=&apos;text/javascript&apos; src=&apos;&lt;%=request.getContextPath() %&gt;/js/autocomplete.js&apos;&gt;&lt;/script&gt;&#xD;&#xA;&lt;%!-- substitute your dwr class --%&gt;&#xD;&#xA;&lt;script type=&apos;text/javascript&apos; src=&apos;&lt;%=request.getContextPath() %&gt;/dwr/interface/JTZ.js&apos;&gt;&lt;/script&gt;&#xD;&#xA;&lt;script type=&apos;text/javascript&apos; src=&apos;&lt;%=request.getContextPath() %&gt;/dwr/engine.js&apos;&gt;&lt;/script&gt;&#xD;&#xA;&#xD;&#xA;&lt;input id=&quot;tz&quot; type=&quot;text&quot; name=&quot;id&quot;/&gt;&#xD;&#xA;&lt;br/&gt;&#xD;&#xA;&lt;div id=&quot;theDiv&quot;&gt;&lt;/div&gt;&#xD;&#xA;&#xD;&#xA;&lt;script&gt;&#xD;&#xA;var ac = new AutoComplete(&#xD;&#xA;              document.getElementById(&apos;tz&apos;),&#xD;&#xA;              document.getElementById(&apos;theDiv&apos;),&#xD;&#xA;              250 // max size of dropdown&#xD;&#xA;              // the function that is called to queue up the ajax request&#xD;&#xA;              , function (text) {&#xD;&#xA;                  DWRUtil.useLoadingMessage();&#xD;&#xA;                  JTZ.getTimeZoneIds(text&#xD;&#xA;                    , {callback:onZoneInfo});&#xD;&#xA;              }&#xD;&#xA;          );&#xD;&#xA;// this is the function called by the ajax framework (dwr) after the remote&#xD;&#xA;// call completes.  it them updates the autocomplete list&#xD;&#xA;function onZoneInfo(zones) {&#xD;&#xA;    ac.repopulate(zones);&#xD;&#xA;}&#xD;&#xA;&lt;/script&gt;&#xD;&#xA;{code}&#xD;&#xA;&#xD;&#xA;Which results in this:&#xD;&#xA;&#xD;&#xA;{image:ac.png}&#xD;&#xA;&#xD;&#xA;1 80% There&#xD;&#xA;&#xD;&#xA;The widget only permits selection via mouse clicks.  If I had another few days to fiddle around with this I would need to make selections possible via the keyboard.  Fancier/more complex widgets (like the Scriptaculous one) appear to have keyboard selectors already.&#xD;&#xA;</s:content>
        <s:mTime>2005-12-01 19:50:05.0</s:mTime>
        <s:cTime>2005-11-18 19:18:07.0</s:cTime>
        <s:comments
             rdf:type='http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag'/>
        <s:snipLinks>
            <rdf:Bag>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/ruby on rails'/>
                <rdf:li rdf:resource='#snipsnap-search'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/postfixadmin on debian sarge'/>
                <rdf:li rdf:resource='#knowledgebase'/>
                <rdf:li>
                    <s:Snip rdf:about='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/ajax+autocomplete'>
                        <s:attachments>
                            <rdf:Bag>
                                <rdf:li>
                                    <s:Attachment rdf:about='http://bliki.rimuhosting.com/space/knowledgebase/linux/misc/ajax+autocomplete/ac.png'
                                         s:fileName='ac.png'
                                         s:contentType='image/png'
                                         s:size='14203'>
                                        <s:date>Fri Nov 18 19:20:24 EST 2005</s:date>
                                    </s:Attachment>
                                </rdf:li>
                                <rdf:li>
                                    <s:Attachment rdf:about='http://bliki.rimuhosting.com/space/knowledgebase/linux/misc/ajax+autocomplete/autocomplete.js'
                                         s:fileName='autocomplete.js'
                                         s:contentType='application/x-javascript'
                                         s:size='3695'>
                                        <s:date>Fri Nov 18 19:48:24 EST 2005</s:date>
                                    </s:Attachment>
                                </rdf:li>
                            </rdf:Bag>
                        </s:attachments>
                    </s:Snip>
                </rdf:li>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/java/liferay install on tomcat 5.5'/>
                <rdf:li rdf:resource='#snipsnap-index'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/java/-Xmx settings'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/rimuhosting/rimuhosting ssh access'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/rpm based php5.1 install'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/postfix with amavis and mysql'/>
                <rdf:li rdf:resource='#retep'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/postfix notes'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/rpm based mysql5 install'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/java/working with different character encodings'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/networking/null route an attackers ip'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/svn notes'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/rimuhosting/moving servers'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/apache/installing and using mod_fastcgi'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/java/tomcat on plesk'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/xen'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/plesk notes'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/mass emailing best practices'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/webmin'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/java/ant install'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/setting up mysql replication'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/disk quotas'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/distros/ubuntu'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/Preventing Brute Force SSH Attacks'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/postfixadmin on RHEL4'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/mysql notes'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/proxy servers: squid'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/grub boot cd'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/qmail per-user spam filtering'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/setting up plone'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/apache/mod_rewrite'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/moving imap folders between hosts'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/where has my disk space gone'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/bash'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/sendmail notes'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/debootstrap'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#start/mediawiki password reset'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/accessing a vnc server behind a firewall'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#KDE4 and the Plasma desktop'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/rimuhosting/vps backups'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/distros/RHEL 4'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/remote server desktop with vnc'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/grub'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/Working with aliases'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#start/beast forum install'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/clamav'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/filtered webmin'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/dovecot compile'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/java/accessing postgres via jdbc'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/monit service monitoring'/>
                <rdf:li rdf:resource='#snipsnap-portlet-1'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/phpmyadmin'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/java/jboss notes'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/rimuhosting/monthly CC billing not working'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/troubleshooting performance issues in Linux'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/java/alfresco install'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/squrrelmail notes'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/rimuhosting/vps setup on dedicated servers'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/apache/mod_jk'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/moinmoin'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/apache/perl'/>
                <rdf:li rdf:resource='#ivan'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/keytool'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/xen notes'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#Virtual servers using Linux vServer'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/rimuhosting/argh my server was exploited'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#retep/extra packages for rhel4 and centos5'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/apache/httpd-devel'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/quick and dirty memory checker'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#Massive virtualisation on IBM Power5'/>
                <rdf:li rdf:resource='#john'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/maildrop with mysql support on debian sarge'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/apache'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#A sysadmin&apos;s view of VoIP'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/mailman notes'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/apache/php'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/distros/debian'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/apache/webdav'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/rmagick'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications/typo cluster'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/rimuhosting/custom vps image'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/apache/mod_deflate'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/rimuhosting/load+balancing+and+failover'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/auto-restart'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/mysql php connection error'/>
                <rdf:li rdf:resource='#felicisisimo'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/webserver/drupal notes'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/mail not going through'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/deprecated'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/java'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/Security/Port Knocking'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/misc/memory troubleshooting'/>
                <rdf:li rdf:resource='#justin'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/mail/postfixadmin+on+debian+sarge'/>
                <rdf:li rdf:resource='http://bliki.rimuhosting.com/rdf#knowledgebase/linux/miscapplications'/>
            </rdf:Bag>
        </s:snipLinks>
    </s:Snip>
</rdf:RDF>
