//------------------------------------------------------------------------------ // IPS XML HTTP REQUEST:: GET NEW POSTS //------------------------------------------------------------------------------ // Supports Safari, Mozilla 1.3+ (Firefox, etc) and IE 5.5+ // (c) 2005 Invision Power Services, Inc. // http://www.ws.ea7.net //------------------------------------------------------------------------------ /*--------------------------------------------*/ // INIT VARS /*--------------------------------------------*/ var mem_div = 'ipb-get-members'; var divobj; var iframeobj; var formobj; var xmlobj; var _result_cache = new Array(); var _div_rows = 0; var _cur_updown_pressed = 0; var _last_key_code = 0; var _event_key_code = 0; var _cur_input_val = ''; var _old_input_val = ''; var _hiliteindex = -1; var _hilite_sug_div; var _complete_div_list; var delay_action = false; var _allow_update = true; var _form_onsubmit_saved; var _urllookup; var _timemout_main = 0; var _timeout_blur = 0; var _in_focus = 0; /*--------------------------------------------*/ // SHOW POSSIBLE MEMBER NAME MATCHES /*--------------------------------------------*/ main_loop = function() { if ( ( _old_input_val != _cur_input_val ) && ( _cur_input_val.length >= 3 ) && ( _in_focus == 1 ) ) { if ( ! delay_action && _allow_update ) { //---------------------------------- // Try cache //---------------------------------- var cached = _result_cache[ _cur_input_val ]; if ( cached ) { returnSearch( _cur_input_val, cached[0], cached[1] ); } else { /*--------------------------------------------*/ // Main function to do on request // Must be defined first!! /*--------------------------------------------*/ do_request_function = function() { //---------------------------------- // Ignore unless we're ready to go //---------------------------------- if ( ! xmlobj.readystate_ready_and_ok() ) { // Could do a little loading graphic here? return; } //---------------------------------- // INIT //---------------------------------- var returned = xmlobj.xmlhandler.responseText; //---------------------------------- // Did we get something? //---------------------------------- if ( returned.charAt(0) == '<' ) { return false; } else { eval( returned ); } } xmlobj = new ajax_request(); xmlobj.onreadystatechange( do_request_function ); xmlobj.process( ipb_var_base_url + 'act=xmlout&do='+_urllookup+'&name='+escape(inobj.value) ); inobj.focus(); } } delay_action = false; } _old_input_val = _cur_input_val; _timemout_main = setTimeout( 'main_loop()', 10 ); return false; } /*--------------------------------------------*/ // Initalize... /*--------------------------------------------*/ function init_js( formobjname, fieldobjname, urllookup ) { //---------------------------------- // Set up //---------------------------------- if ( ! urllookup ) { _urllookup = 'get-member-names'; } else { _urllookup = urllookup; } formobj = document.getElementById( formobjname ); inobj = document.getElementById( fieldobjname ); divobj = document.getElementById( mem_div ); inobj.autocomplete = "off"; inobj.onfocus = function () { _in_focus = 1; } inobj.onblur = onblurhandler; inobj.onsubmit = submit_handler; //---------------------------------- // Already got a submit handler? //---------------------------------- if ( formobj.onsubmit ) { _form_onsubmit_saved = formobj.onsubmit; } formobj.onsubmit = submit_handler; if ( inobj.createTextRange ) { inobj.onkeyup = new Function( "return onkeyuphandler(event);" ); } else { inobj.onkeyup = onkeyuphandler; } cache_name_results("",new Array(),new Array()); _cur_input_val = inobj.value; document.onkeydown = keydownhandler; set_up_key_down(); } /*--------------------------------------------*/ // Set up key down /*--------------------------------------------*/ function set_up_key_down() { if ( document.createEventObject ) { var y = document.createEventObject(); y.ctrlKey = true; y.keyCode = 70; document.fireEvent( "onkeydown", y ) } } /*--------------------------------------------*/ // Key down handler /*--------------------------------------------*/ function keydownhandler( event ) { if( ! event && window.event ) { event = window.event; } if ( event ) { _last_key_code = event.keyCode; } } /*--------------------------------------------*/ // On blur handler /*--------------------------------------------*/ function onblurhandler( event ) { if ( ! event && window.event ) { event = window.event; } if ( ! _cur_updown_pressed ) { _in_focus = 0; my_xr_hide_div( divobj ); _hiliteindex = -1; // Tab? if ( _last_key_code == 9 ) { _last_key_code = -1; } } _cur_updown_pressed = false; } /*--------------------------------------------*/ // On key up handler /*--------------------------------------------*/ function key_handler_function() { //---------------------------------- // trap up/down cursor //---------------------------------- if ( _event_key_code == 40 || _event_key_code == 38 ) { _allow_update = false; blur_then_focus(); } else { _cur_updown_pressed = false; _allow_update = true; } _cur_input_val = inobj.value; handle_cursor_press( _event_key_code ); } /*--------------------------------------------*/ // Handle cursor press /*--------------------------------------------*/ function handle_cursor_press( eventcode ) { if ( eventcode == 40 ) { hilite_new_value( _hiliteindex + 1 ); } else if ( eventcode == 38 ) { hilite_new_value( _hiliteindex - 1 ); } else if ( eventcode == 13 || eventcode == 3 ) { //---------------------------------- // Are we looking through the divs? //---------------------------------- if ( _hiliteindex != -1 ) { my_xr_hide_div( divobj ); _hiliteindex = -1; } return false; } return true; } /*--------------------------------------------*/ // Highlight new value (cursor keys pressed) /*--------------------------------------------*/ function hilite_new_value( index ) { if ( _div_rows <= 0 ) { return; } my_show_div( divobj ); if ( index > _div_rows ) { index = _div_rows - 1; } if ( _hiliteindex != -1 && index != _hiliteindex ) { set_style_for_element( _hilite_sug_div, 'wrapdiv' ); } if ( index < 0 ) { _hiliteindex = -1; inobj.focus(); return; } _hiliteindex = index; _hilite_sug_div = divobj.getElementsByTagName('DIV').item( index ); set_style_for_element( _hilite_sug_div, 'spanhilite' ); newval = find_span_value_for_class( _hilite_sug_div, 'namespan' ); if ( newval && typeof(newval) != 'undefined' ) { inobj.value = find_span_value_for_class( _hilite_sug_div, 'namespan' ); } } /*--------------------------------------------*/ // Blur then focus /*--------------------------------------------*/ function blur_then_focus() { _cur_updown_pressed = true; inobj.blur(); _timemout_blur = setTimeout( "set_input_field_focus();", 10 ); return; } /*--------------------------------------------*/ // Set input field focus /*--------------------------------------------*/ function set_input_field_focus() { inobj.focus(); } /*--------------------------------------------*/ // Styles element /*--------------------------------------------*/ function set_style_for_element( c, name ) { try { if ( ! c ) { return; } } catch(e) { return; } c.className = name; switch( name ) { case 'wrapdiv': c.style.backgroundColor = "white"; c.style.color = "black"; if ( c.displaySpan ) { c.displaySpan.style.color = "green"; } break; case 'wrapspan': c.style.display = "block"; c.style.paddingLeft = "3"; c.style.paddingRight = "3"; c.style.height = "16px"; c.style.overflow = "hidden"; break; case 'namespan': c.style.cssFloat = "left"; c.style.width = '100%'; break; case 'idspan': c.style.cssFloat = "right"; c.style.display = 'none'; break; case 'spanhilite': c.style.backgroundColor = "#3366cc"; c.style.color = "white"; if ( c.displaySpan ) { c.displaySpan.style.color = "white"; } break; } } /*--------------------------------------------*/ // Get value of named span /*--------------------------------------------*/ function find_span_value_for_class( i, dc ) { try { if ( ! i ) { return; } } catch(e) { return; } var ga = i.getElementsByTagName('span'); if ( ga ) { for( var f=0; f < ga.length; ++f ) { if ( ga[f].className == dc ) { var value = ga[f].innerHTML; if ( value == " " ) { return ""; } else { return value; } } } } else { return ""; } } /*--------------------------------------------*/ // Displays the actual list /*--------------------------------------------*/ function display_suggested_list( na, ia ) { //---------------------------------- // Clear div //---------------------------------- while( divobj.childNodes.length > 0 ) { divobj.removeChild( divobj.childNodes[0] ); } //---------------------------------- // Write Div //---------------------------------- _div_rows = 0; for( var f = 0 ; f < na.length; ++f ) { _div_rows++; var od = document.createElement("DIV"); set_style_for_element( od, 'wrapdiv' ); od.onmousedown = sb_mdown; od.onmouseover = sb_mover; od.onmouseout = sb_mout; var span_wrap = document.createElement("SPAN"); set_style_for_element( span_wrap, 'wrapspan' ); var span_name = document.createElement("SPAN"); span_name.innerHTML = na[f]; var span_id = document.createElement("SPAN"); set_style_for_element( span_name, 'namespan' ); set_style_for_element( span_id, 'idspan' ); od.displaySpan = span_id; span_id.innerHTML = ia[f]; span_wrap.appendChild( span_name ); span_wrap.appendChild( span_id ); od.appendChild( span_wrap ); divobj.appendChild( od ); } //---------------------------------- // Calc pos. //---------------------------------- var mid = inobj; var left_px = _get_obj_leftpos(mid); var top_px = _get_obj_toppos(mid) + mid.offsetHeight; var width = parseInt( divobj.style.width ); var height = parseInt( divobj.style.height ); //---------------------------------- // Show menu DIV //---------------------------------- divobj.style.position = "absolute"; //---------------------------------- // Try and keep it on screen //---------------------------------- if ( (left_px + width) >= document.body.clientWidth ) { left_px = left_px + mid.offsetWidth - width; } //---------------------------------- // Try and keep it on screen //---------------------------------- if ( (top_px + height) >= document.body.clientHeight ) { top_px = top_px - height; } //---------------------------------- // Finalize menu position //---------------------------------- divobj.style.left = left_px + "px"; divobj.style.top = top_px + "px"; divobj.style.display = "block"; _hiliteindex= -1; //---------------------------------- // Workaround for IE bug which shows // select boxes and other windows GUI // over divs. SHOW IFRAME //---------------------------------- if ( is_ie ) { try { if ( ! document.getElementById( 'if_xhr_' + mem_div ) ) { iframeobj = document.createElement('iframe'); iframeobj.src = 'javascript:;'; iframeobj.id = 'if_xhr_' + mem_div document.getElementsByTagName('body')[0].appendChild( iframeobj ); } else { iframeobj = document.getElementById( 'if_xhr_' + mem_div ); } iframeobj.scrolling = 'no'; iframeobj.frameborder = 'no'; iframeobj.className = 'iframeshim'; iframeobj.style.position = 'absolute'; iframeobj.style.width = parseInt(divobj.offsetWidth) + 'px'; iframeobj.style.height = parseInt(divobj.offsetHeight) + 'px'; iframeobj.style.top = divobj.style.top; iframeobj.style.left = divobj.style.left; iframeobj.style.zIndex = divobj.style.zIndex - 1; iframeobj.style.display = "block"; } catch(error) { //alert(error); // Oh dear, someones stolen the iframe } } } /*--------------------------------------------*/ // Caches the results /*--------------------------------------------*/ function cache_name_results( mstring, na, ia ) { _result_cache[mstring] = new Array( na, ia ); } /*--------------------------------------------*/ // This is the function the response XML text gives /*--------------------------------------------*/ returnSearch = function( mstring, namearray, idarray ) { //---------------------------------- // Cache.. //---------------------------------- cache_name_results( mstring, namearray, idarray ); if ( _in_focus != 1 ) { return false; } //---------------------------------- // Display //---------------------------------- display_suggested_list( namearray, idarray ); //---------------------------------- // Resize or hide? //---------------------------------- if ( _div_rows > 0 ) { divobj.style.height = 16 * _div_rows + 4; } else { my_xr_hide_div( divobj ); _hiliteindex = -1; } } /*--------------------------------------------*/ // Submit handler /*--------------------------------------------*/ submit_handler = function ( event ) { delay_action = true; var retval = true; if ( _hiliteindex != -1 ) { return false; } else { if ( _form_onsubmit_saved ) { eval( 'tmpsubmit = ' + _form_onsubmit_saved ); retval = tmpsubmit(); } return retval; } } /*--------------------------------------------*/ // On key up handler /*--------------------------------------------*/ onkeyuphandler = function( event ) { _event_key_code = event.keyCode; key_handler_function(); } /*--------------------------------------------*/ // Div mouse events /*--------------------------------------------*/ sb_mdown = function() { delay_action = true; inobj.value = find_span_value_for_class( this, 'namespan' ); } sb_mover = function() { set_style_for_element( this, 'spanhilite' ); } sb_mout = function() { set_style_for_element( this, 'wrapdiv' ); } function my_xr_hide_div ( dobj ) { dobj.style.display = "none"; if ( is_ie ) { try { document.getElementById( 'if_xhr_' + mem_div ).style.display = "none"; } catch(e) { //alert(e);// Oh dear, someones stolen the iframe } } }