function AutoSuggest(elem, elem_hidden, suggestions)
{ var me = this; this.elem = elem; this.elem_hidden = elem_hidden; this.suggestions = suggestions; this.eligible = new Array(); this.inputText = null; this.highlighted = -1; this.div = document.getElementById("autosuggest"); this.more = '<strong>Meer...</strong>'; var TAB = 9; var ESC = 27; var KEYUP = 38; var KEYDN = 40; var SHIFT = 16; var ENTER = 13; elem.setAttribute("autocomplete","off"); if(!elem.id)
{ var id = "autosuggest" + idCounter; idCounter++; elem.id = id;}
elem.onkeydown = function(ev)
{ var key = me.getKeyCode(ev); switch(key)
{ case ENTER:
me.useSuggestion(); break; case TAB:
me.useSuggestion(); break; case ESC:
me.hideDiv(); break; case KEYUP:
if (me.highlighted > 0)
{ me.highlighted--;}
me.changeHighlight(key); break; case KEYDN:
if (me.highlighted < (me.eligible.length - 1))
{ me.highlighted++;}
me.changeHighlight(key); break;}
}; elem.onkeyup = function(ev)
{ var key = me.getKeyCode(ev); switch(key)
{ case SHIFT:
case TAB:
case ESC:
case KEYUP:
case KEYDN:
return; default:
if (this.value.length > 0)
{ me.inputText = this.value; me.getEligible(false); me.createDiv(); me.positionDiv(); me.showDiv();}
else
{ me.hideDiv();}
}
}; this.useSuggestion = function()
{ if (this.highlighted > -1)
{ var my_value = this.eligible[this.highlighted]; if (my_value == this.more) { this.getEligible(true); this.hideDiv(); this.createDiv(); this.showDiv(); return false;} else { my_value = my_value.substring(0, my_value.lastIndexOf('(')-1); if (this.elem_hidden == undefined) { this.elem.value = this.decode_entities(my_value);} else { this.elem_hidden.value = my_value; this.elem.value = this.decode_entities(my_value);}
this.hideDiv(); setTimeout("document.getElementById('" + this.elem.id + "').focus()",0); return true;}
}
}; this.showDiv = function()
{ this.div.style.display = 'block';}; this.hideDiv = function()
{ this.div.style.display = 'none'; this.highlighted = -1;}; this.changeHighlight = function()
{ var lis = this.div.getElementsByTagName('LI'); for (i in lis)
{ var li = lis[i]; if (this.highlighted == i)
{ li.className = "selected";}
else
{ li.className = "";}
}
}; this.positionDiv = function()
{ var el = this.elem; var x = 0; var y = el.offsetHeight; while (el.offsetParent && el.tagName.toUpperCase() != 'BODY')
{ x += el.offsetLeft; y += el.offsetTop; el = el.offsetParent;}
x += el.offsetLeft; y += el.offsetTop; this.div.style.left = x + 'px'; this.div.style.top = y + 'px';}; this.createDiv = function()
{ var ul = document.createElement('ul'); for (i in this.eligible)
{ var word = this.eligible[i]; if (word != this.more) { var my_length = me.inputText.length; var word = '<strong>'+word.substring(0,my_length)+'</strong>'+word.substring(my_length);}
var li = document.createElement('li'); var a = document.createElement('a'); a.href="javascript:false"; a.innerHTML = word; li.appendChild(a); if (me.highlighted == i)
{ li.className = "selected";}
ul.appendChild(li);}
this.div.replaceChild(ul,this.div.childNodes[0]); ul.onmouseover = function(ev)
{ var target = me.getEventSource(ev); while (target.parentNode && target.tagName.toUpperCase() != 'LI')
{ target = target.parentNode;}
var lis = me.div.getElementsByTagName('LI'); for (i in lis)
{ var li = lis[i]; if(li == target)
{ me.highlighted = i; break;}
}
me.changeHighlight();}; ul.onclick = function(ev)
{ if (me.useSuggestion()) { me.hideDiv(); me.cancelEvent(ev); document.forms['plaats_zoeken'].submit();}
return false;}; this.div.className="suggestion_list"; this.div.style.position = 'absolute';}; this.getEligible = function(get_all)
{ this.eligible = new Array(); var first = this.inputText.toUpperCase().substring(0, 1); var my_eligible = new Array(); for (i in this.suggestions[first])
{ var suggestion = this.suggestions[first][i]; if(suggestion[0].toLowerCase().indexOf(this.inputText.toLowerCase()) == "0")
{ my_eligible[my_eligible.length]=suggestion;}
}
var dropped = false; for (i in my_eligible) { var suggestion = my_eligible[i][0]; var aantal = my_eligible[i][1]; var add = true; if (my_eligible.length > 15 && !get_all) { if (aantal < 2) { dropped = true; add = false;} else { this.eligible[this.eligible.length]=suggestion + ' (' + aantal + ')';}
} else { this.eligible[this.eligible.length]=suggestion + ' (' + aantal + ')';}
}
if (dropped) { this.eligible[this.eligible.length]=this.more;}
}; this.getKeyCode = function(ev)
{ if(ev)
{ return ev.keyCode;}
if(window.event)
{ return window.event.keyCode;}
}; this.getEventSource = function(ev)
{ if(ev)
{ return ev.target;}
if(window.event)
{ return window.event.srcElement;}
}; this.cancelEvent = function(ev)
{ if(ev)
{ ev.preventDefault(); ev.stopPropagation();}
if(window.event)
{ window.event.returnValue = false;}
}
this.decode_entities = function(data) { return data.replace(/&#(\d+);/g, function(wholematch, parenmatch1) { return String.fromCharCode(+parenmatch1);});}
}
var idCounter = 0;