721 lines
15 KiB
JavaScript
721 lines
15 KiB
JavaScript
//------------------------------------------------------------------------------
|
|
// 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.invisionpower.com
|
|
//------------------------------------------------------------------------------
|
|
|
|
/*--------------------------------------------*/
|
|
// 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.setAttribute( "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
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|