function SearchSuggestControl(oTextbox, oProvider) { this.textbox = oTextbox; this.provider = oProvider; this.init(); } SearchSuggestControl.prototype.init = function () { if ( !this.textbox || !this.provider ) return; var oThis = this; this.textbox.onkeyup = function (oEvent) { if (!oEvent) { oEvent = window.event; } oThis.handleKeyUp(oEvent); }; }; SearchSuggestControl.prototype.handleKeyUp = function (oEvent) { var iKeyCode = oEvent.keyCode; if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode <= 46) || (iKeyCode >= 112 && iKeyCode <= 123)) { //ignore } else { this.provider.requestSuggestions(this); } }; function SearchProvider() { this.requestSuggestions = function( sender ) { var query = sender.textbox.value; var source = sender.textbox.id; this.JSON_request( query, source ); }, this.JSON_obj = null, this.JSON_request = function( query, source ) { // Make server code call var serverPipe = 'http://registry.lcnd.ca/json/searchSuggest.asp?' + 'qu=' + escape( query ) + '&source=' + escape( source ); var headID = document.getElementsByTagName("head")[0]; if ( headID ) { if ( this.JSON_obj != null ) { headID.removeChild( this.JSON_obj ); } this.JSON_obj = document.createElement('script'); this.JSON_obj.type = 'text/javascript'; this.JSON_obj.src = serverPipe; headID.appendChild(this.JSON_obj); } } } /* * JSON code handlers */ var waitingSearchProvider = null; function getY( oElement ) { var iReturnValue = 0; if ( oElement ) iReturnValue = oElement.offsetHeight; while( oElement != null ) { iReturnValue += oElement.offsetTop; oElement = oElement.offsetParent; } return iReturnValue; } function getX( oElement ) { var iReturnValue = 0; while( oElement != null ) { iReturnValue += oElement.offsetLeft; oElement = oElement.offsetParent; } return iReturnValue; } function hideSearchSuggest( ) { var suggestDiv = document.getElementById('suggestdiv'); if ( suggestDiv ) { suggestDiv.parentNode.removeChild( suggestDiv, true ); } } function processSearchSuggest( sender, value ) { var textbox = document.getElementById( sender ); if ( !textbox || value.searchterms.length == 0 ) { return; } var suggestDiv = document.getElementById('suggestdiv'); if ( suggestDiv ) { suggestDiv.parentNode.removeChild( suggestDiv, true ); } suggestDiv = document.createElement( 'div' ); suggestDiv.id = 'suggestdiv'; suggestDiv.style.position = 'absolute'; suggestDiv.style.left = getX( textbox ) + 'px'; suggestDiv.style.top = getY( textbox ) + 'px'; var suggestTable = document.createElement( 'table' ); var suggestBody = document.createElement( 'tbody' ); suggestDiv.appendChild( suggestTable ); suggestTable.appendChild( suggestBody ); var suggestRow = document.createElement( 'tr' ); var suggestHeader = document.createElement( 'td' ); suggestHeader.appendChild( document.createTextNode( 'Search suggestions:' ) ); suggestRow.appendChild( suggestHeader ); suggestHeader = document.createElement( 'td' ); suggestHeader.style.textAlign = 'right'; suggestHeader.style.fontSize = '60%'; suggestHeader.appendChild( document.createTextNode( 'Hide' ) ); suggestHeader.onclick = hideSearchSuggest; suggestRow.appendChild( suggestHeader ); suggestBody.appendChild( suggestRow ); suggestRow = null; for ( var x = 0; x < value.searchterms.length; x++ ) { var term = value.searchterms[x]; var searchLink = document.createElement( 'a' ); searchLink.title = term; searchLink.onclick = function() { textbox.value = this.title; if ( eval( textbox.form ) != null ) { textbox.form.submit(); } } searchLink.appendChild( document.createTextNode( term ) ); var suggestCell = document.createElement( 'td' ); suggestCell.appendChild( searchLink ); if ( suggestRow ) { suggestRow.appendChild( suggestCell ); suggestBody.appendChild( suggestRow ); suggestRow = null; } else { suggestRow = document.createElement( 'tr' ); suggestRow.appendChild( suggestCell ); } } if ( suggestRow ) { suggestBody.appendChild( document.createElement( 'td' ) ); suggestBody.appendChild( suggestRow ); } document.body.appendChild( suggestDiv ); }