function DynPanel(t,s,b,l)
{
    function CanonStr(a)
    {
        var a = a.toLowerCase().replace(/\bavenue\b/ig, 'av').replace(/-|,|;|\(|\)/g, ' ').replace(/[\s]+/gi,' ').replace(/(^\s*)|(\s*$)/g,'');
        a = a.replace(/\340|\341|\342|\343|\344|\345/g,'a');//àáâãäå
        a = a.replace(/\346/g,'ae');//æ
        a = a.replace(/\347/g,'c');//ç
        a = a.replace(/\350|\351|\352|\353/g,'e');//èéêë
        a = a.replace(/\354|\355|\356|\357/g,'i');//ìíîï
        a = a.replace(/\360/g,'dh');//ð(eth, Icelandic)
        a = a.replace(/\361/g,'n');//ñ
        a = a.replace(/\362|\363|\364|\365|\366|\367/g,'o');//òóôõöø
        a = a.replace(/\371|\372|\373|\374/g,'o');//ùúûü
        a = a.replace(/\371|\372|\373|\374/g,'o');//ùúûü
        a = a.replace(/\375|\377/g,'y');//ýÿ
        a = a.replace(/\376/g,'th');//þ
        return a;
    }
    function CancelEvent(e) 
    {
        if(e.preventDefault) e.preventDefault();
        e.returnValue = false;
        e.cancelBubble = true;
        if(e.stopPropagation) e.stopPropagation();
        return false;
    }
    t = document.getElementById(t);
    s = document.getElementById(s);
    b = document.getElementById(b);
    l = document.getElementById(l);
    l.style.display="block";
    t.style.display="block";
    t.setAttribute( "autocomplete","off" );
    s.style.display="none";
    this._s = s;
    this._t = t;
    this._b = b;   
    b.disabled=true;
    this._isIE = document.all;
    var p = document.createElement('div');
    t.parentNode.insertBefore( p, t.nextSibling );
    p.className = 'DynPanel';
    this._p = p;
    var h = document.createElement('p');
    h.className='title';
    p.appendChild( h );
    this._head = h;
    h = document.createElement('div');
    p.appendChild( h );
    this._list = h;
    h.onclick = function(e)
    {
        e = e||window.event;
        var c = e.target||e.srcElement;
        if(c)
        {
            var i = 0;
            var l = self._list.firstChild;
            while(l!=null&&c!=l){l=l.nextSibling;++i;}
            if(l!=null)
            {
              Select(i);
              SetText(c)
            }
            else c=null;
        }
        if( t.createTextRange )
        {
            var r = t.createTextRange();
            r.moveStart('character',t.value.length);
            r.select();
        }
        else t.focus();
    };
    this.NbLine = 0;
    this.SelIndex = -1;
    this._allC = [];
    var i = s.options.length;
    while(--i>0)this._allC.push(CanonStr(s.options[i].text));
    this._search = '';
    var self=this;
    function Hide(){self._p.style.display='none';}
    function Show(){self._p.style.display='block';}
    function IsHidden(){return self._p.style.display=='none';}
    function Update(e)
    {
        var t = CanonStr(self._t.value);
        if( t == self._search ) return;
        self._search = t;
        self.NbLine = 0;
        self.SelIndex = -1;
        var h = '';
        var last=null;
        var iSFirst=-1;
        var idP=self._s.id+'_';
        if(t!='')
        {
            var r = new RegExp( '\\b'+t.replace(' ','.*( |$)') )
            var iS = 1;
            var i = self._allC.length;
            while(--i>=0)
            {
                if(r.test(self._allC[i]))
                {
                    h += '<p id="'+idP+iS;
                    if(!last)
                    {
                        iSFirst = iS;
                        h += '" class="S">';
                    }
                    else h += '">';
                    last = self._s.options[iS].text;
                    h += last+'</p>';
                    ++self.NbLine;
                }
                ++iS;
            }
        }
        if(self.NbLine==0) 
        {
            self._head.innerHTML = '&lt;&lt;&lt; pas de possibilit&eacute; &gt;&gt;&gt;';
            self._list.innerHTML = '';
            self._b.disabled = true;
        }
        else
        {
            if(!(self._b.disabled=self.NbLine!=1))self._s.options.selectedIndex = iSFirst;
            var rs = self.NbLine>1 ? 's':'';
            var rs = '&lt;&lt;&lt; ' + self.NbLine + ' possibilit&eacute;'+rs+ ' trouv&eacute;e'+rs+ ' &gt;&gt;&gt;';
            self._head.innerHTML = rs;
            self._list.innerHTML = h;
            self.SelIndex = 0;
        }
        self._list.scrollTop = 0;
        Show();
    }
    function SetText(c)
    {   
        self._b.disabled = false;
        self._s.options.selectedIndex = parseInt(c.id.substring(self._s.id.length+1));
        self._t.value = c.innerText||c.textContent;
        self._search = CanonStr(self._t.value);
        Hide();
    }
    function Elt(i)
    {
        var c = self._list.firstChild;
        while(--i>=0)c=c.nextSibling;
        return c;
    }
    function Select(i)
    {
        if(i<0)i=0;
        if(i>=self.NbLine&&(i=self.NbLine-1)<0)return;
        if(i==self.SelIndex)return;
        if(self.SelIndex>=0) Elt(self.SelIndex).className='';
        var c = Elt(self.SelIndex=i);
        c.className='S';
        var t = self._list.scrollTop;
        if( c.offsetTop < t )self._list.scrollTop = c.offsetTop;
        else if( c.offsetTop+c.offsetHeight > t+self._list.clientHeight ) 
        {
            t = (c.offsetTop+c.offsetHeight)-self._list.clientHeight;
            if(t<0)t=0;
            self._list.scrollTop = t;
        }
    }
    function OnKeyP(e)
    {
        e = e||window.event;
        var k = e.keyCode||e.which||0;
        if(k==27)
        {
            Hide();
            return CancelEvent(e);
        }
        if(k==40 || k==63233)
        {
            if( IsHidden() ) Show();
            else Select(self.SelIndex+1);
            return CancelEvent(e);
        }
        if(!IsHidden())
        {
            if(k==13&&self.SelIndex>=0)
            {
                SetText(Elt(self.SelIndex));
                return CancelEvent(e);
            }
            if(k==38 || k==63232)
            {
                Select(self.SelIndex-1);
                return CancelEvent(e);
            }
        }
        return true;
    }
    function OnKey(e)
    {
        var k = e.keyCode||e.which||0;
        if(k==8 && self._t.value.length < 1)
        {
            Hide();
            return CancelEvent(e);
        }
        if(!self._isIE||OnKeyP(e))Update(e);
    }
    if(t.addEventListener)t.addEventListener('keypress',OnKeyP,true);
    else if(t.attachEvent)t.attachEvent('onkeypress',OnKeyP);
    else e['onkeypress']=OnKeyP;
    if(t.addEventListener)t.addEventListener('keyup',OnKey,false);
    else if(t.attachEvent)t.attachEvent('onkeyup',OnKey);
    else e['onkeyup']=OnKey;
}
