var Suggest = function (searchField, xmlTarget, onSelect) { this.SearchField = searchField; this.XMLTarget = xmlTarget; this.OnSelect = onSelect; this.XMLHandler = new XMLHandler(); // Resolve the searchField node if not an object. if (this.SearchField != null && typeof(this.SearchField) != 'object') { this.SearchField = window.document.getElementById(this.SearchField); } var suggest = this; this.ResultContainer = window.document.createElement('div'); this.ResultContainer.AddItem = function (xmlNode) { var sId = xmlNode.attributes.getNamedItem('id').value; var sName = xmlNode.attributes.getNamedItem('name').value; var sZip = xmlNode.attributes.getNamedItem('zip').value; var bFull = ((node = xmlNode.attributes.getNamedItem('full')) && node.value == 'true'); suggest.ResultContainer.innerHTML += (bFull ? '' + sName + '
' : '' + sZip + ' - ' + sName + '
'); } this.ResultContainer.AddNoResult = function (xmlNode) { suggest.ResultContainer.innerHTML += 'Intet resultat
'; } this.ResultContainer.ClearItems = function () { suggest.ResultContainer.innerHTML = ''; } this.ResultContainer.style.height = '6.2em'; this.ResultContainer.style.overflow = 'auto'; this.ResultContainer.style.marginBottom = '.8em'; this.ResultContainer.style.display = 'none'; this.SearchField.parentNode.appendChild(this.ResultContainer); var oldOnKeyup = this.SearchField.onkeyup; this.SearchField.onkeyup = function () { suggest.OnInputChange(); if (oldOnKeyup != null) oldOnKeyup(); } } Suggest.prototype.OnInputChange = function () { if (this.TimerID != null) { clearTimeout(this.TimerID); this.TimerID = null; } if (this.SearchField.value.length > 0) { var suggest = this; this.TimerID = setTimeout(function () { suggest.UpdateSuggestions(); }, 800); } else { this.HideResults(); } } Suggest.prototype.UpdateSuggestions = function () { var sUrl = this._XMLTargetUrl('pattern=' + encodeURI(this.SearchField.value)); this.XMLHandler.LoadURL(sUrl); var oItems = this.XMLHandler.DOMDocument.documentElement; this.ResultContainer.ClearItems(); var itemAdded = false; for (var i = 0; i < oItems.childNodes.length; i++) { var childNode = oItems.childNodes.item(i); if (childNode.nodeName == 'Item') { itemAdded = true; this.ResultContainer.AddItem(childNode); } } if(!itemAdded) { this.ResultContainer.AddNoResult(); } this.ShowResults(); } Suggest.prototype.ShowResults = function () { this.ResultContainer.style.display = ''; } Suggest.prototype.HideResults = function () { this.ResultContainer.style.display = 'none'; } /** * Get the XMLTarget with the specified paramters. */ Suggest.prototype._XMLTargetUrl = function () { if (this.XMLTarget.indexOf('?') == -1) { var xmlTarget = this.XMLTarget + '?'; } else { var xmlTarget = this.XMLTarget + '&'; } for (var i = 0; i < arguments.length; i++) { xmlTarget += arguments[i]; if (i < arguments.length - 1) { xmlTarget += '&'; } } return xmlTarget; }