var autocomplete_member_lastval = 'go to a member...'; var autocomplete_member_selectedindex = 0; var autocomplete_member_memberids = []; var autocomplete_member_loadTimer = 0; // Timer off var autocomplete_member_suggestionHtml = []; // Associate array (key = text, value = suggestion html) function autocomplete_member_keyup(inEvent, inDialogX, inDialogY) { // Position the dialog dialog = document.getElementById('autocomplete_member_dialog'); dialog.style.left = inDialogX + 'px'; dialog.style.top = inDialogY + 'px'; // Redirect according to keycode var keyCode = (window.event)?window.event.keyCode:inEvent.which; if (keyCode == 13) // Enter autocomplete_member_key_enter(); else if (keyCode == 27) // Escape autocomplete_member_key_escape(); else if (keyCode == 38) // Up autocomplete_member_key_updown(-1); else if (keyCode == 40) // Down autocomplete_member_key_updown(1); else // Input autocomplete_member_key_other(); return true; } function autocomplete_member_key_enter() { // Hide dialog and blur input in case user returns to this page document.getElementById('autocomplete_member_dialog').style.display = 'none'; document.getElementById('autocomplete_member_input').blur(); // Forward to the member listing window.location = '/member/index.php?id=' + autocomplete_member_memberids[autocomplete_member_selectedindex]; } function autocomplete_member_key_escape() { // Hide dialog and blur input in case user returns to this page document.getElementById('autocomplete_member_dialog').style.display = 'none'; } function autocomplete_member_key_updown(inMove) { // Get the dialog var dialog = document.getElementById("autocomplete_member_dialog"); // Do nothing if the dialog is hidden if (dialog.style.display != 'block') return false; // Get the new index and stop if out-of-bounds var newIndex = autocomplete_member_selectedindex + inMove; if (newIndex < 0 || newIndex >= autocomplete_member_memberids.length) return true; // Update currently selected autocomplete_member_selectedindex = newIndex; // Unhighligh the old option and highlight the new option autocomplete_member_highlightselected(); } function autocomplete_member_key_other() { // Get the dialog div var dialog = document.getElementById("autocomplete_member_dialog"); // Get the new and old textbox values var newValue = document.getElementById('autocomplete_member_input').value.toLowerCase(); var oldValue = autocomplete_member_lastval.toLowerCase(); autocomplete_member_lastval = newValue; // Close the dialog if the box is empty if (newValue == '') { dialog.style.display = 'none'; return true; } // Do nothing if the textbox value hasn't changed (i.e. handle non-printing keystrokes) if (newValue == oldValue) return true; // Now we are loading suggestions // Show loading notification buildHTML = '
'; buildHTML += ''; buildHTML += '
'; dialog.innerHTML = buildHTML; dialog.style.display = 'block'; // Restart load suggestion timer // This timer minimizes the number of requests made to the server // as a user types in part of a member name autocomplete_member_restartLoadTimer(); } function autocomplete_member_restartLoadTimer() { // Start loading suggestions after half a second // Restart timer on keystrokes within that timeframe autocomplete_member_loadTimer = 500; // Start the timer if it is off if (autocomplete_member_loadTimer > 0) autocomplete_member_countdown(); } function autocomplete_member_countdown() { // Decrement countdown timer autocomplete_member_loadTimer -= 50; // Set the timer for next iteration, or load suggestions if finished if (autocomplete_member_loadTimer > 0) setTimeout("autocomplete_member_countdown()", 50); else autocomplete_member_loadsuggestions(); } function autocomplete_member_loadsuggestions() { // Get the current textbox value var textValue = document.getElementById('autocomplete_member_input').value.toLowerCase(); // Get the dialog div var dialog = document.getElementById("autocomplete_member_dialog"); // Quit if the text is empty if (textValue == '') return true; // Have these suggestions already been loaded? if (autocomplete_member_suggestionHtml[textValue] !== undefined) { // Set dialog contents and exit dialog.innerHTML = autocomplete_member_suggestionHtml[textValue]; return true; } // Begin AJAX request var http; if (window.XMLHttpRequest) http = new XMLHttpRequest(); else if (window.ActiveXObject) http = new ActiveXObject("Microsoft.XMLHTTP"); http.open('GET', 'http://www.pbbgwarp.com/ajax/mainpage-automember.php?q=' + encodeURIComponent(textValue)); http.onreadystatechange = function () { // When ready with data if (http.readyState == 4) { // Success if (http.status == 200) { // Build HTML and set for dialog buildHtml = ''; var root = http.responseXML.getElementsByTagName("matches").item(0); // Are there no matches? if (root.getElementsByTagName("match").length == 0) { buildHtml = '
No matches found.
'; dialog.innerHTML = buildHtml; } else { // Add matches to display for (var i = 0; i < root.getElementsByTagName("match").length; i++) { var match = root.getElementsByTagName("match")[i]; buildHtml += ''; buildHtml += '
'; buildHtml += '
'; buildHtml += match.getAttribute("username"); buildHtml += '
'; buildHtml += '
'; buildHtml += ''; buildHtml += '
'; buildHtml += '
'; buildHtml += '
'; buildHtml += '
'; } // Add matches to array autocomplete_member_memberids = []; for (var i = 0; i < root.getElementsByTagName("match").length; i++) { var match = root.getElementsByTagName("match")[i]; autocomplete_member_memberids.push(match.getAttribute("id")); } // Set dialog contents dialog.innerHTML = buildHtml; // Reset the selection option autocomplete_member_selectedindex = 0; autocomplete_member_highlightselected(); // Save the dialog contents autocomplete_member_suggestionHtml[textValue] = buildHtml; } } } } http.send(null); } function autocomplete_member_highlightselected() { // Unhighlight all for (i = 0; i < dialog.childNodes.length; i++) dialog.childNodes[i].className = 'autocomplete_member_dialog_match'; // Highlight selected dialog.childNodes[autocomplete_member_selectedindex].className = 'autocomplete_member_dialog_match_selected'; } // Hide member and member dialogs on click globalOnclickCode += "document.getElementById('autocomplete_member_dialog').style.display = 'none';";