//---------------------------------------------------
// D21-Global PM - Main Functions Library
// File: d21_gpm_js.js
//---------------------------------------------------
// © 2005 - Dean (deaner225@gmail.com)
// http://www.dscripting.com
//---------------------------------------------------

var gpm_obj;
var gpm_loaded          = 0;
var _js_files           = new Array();
var _results            = 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 delay_action        = false;
var _allow_update       = true;
var _timemout_main      = 0;
var _timeout_blur       = 0;
var _in_focus           = 0;
var _form_onsubmit_saved;
var _urllookup;
var _hilite_sug_div;
var _complete_div_list;
var formobj;
var inobj;
var divobj;

function d21_gpm_load_pm_form(id)
{
	if (typeof(id) != 'number')
	{
		id = 0;
	}

	if (!d21_gpm_check_to_send())
	{
		d21_gpm_send_pm(0);
		return false;
	}

	gpm_obj   = document.getElementById('d21-gpm-master');
	gpm_title = document.getElementById('d21-gpm-title');
	gpm_data  = document.getElementById('d21-gpm-data');

	try
	{
		menu_action_close();
	}

	catch(e){}

	do_request_function = function()
	{
		if (!xmlobj.readystate_ready_and_ok())
		{
			return;
		}

		var html = xmlobj.xmlhandler.responseText;
		if (is_ie)
		{
			 html = "<iframe id='d21-gpm-shim' src='javascript:;' class='iframshim' scrolling='no' frameborder='0' style='position:absolute;top:0px;left:0px;display:none;'></iframe>"+html;
		}

		gpm_data           = document.getElementById('d21-gpm-data');
		gpm_data.innerHTML = html;

		gpm_tjs = document.getElementById('d21-gpm-temp-js');
		if (gpm_tjs && gpm_tjs.innerHTML != '')
		{
			eval(gpm_tjs.innerHTML);
		}

		if (is_ie)
		{
			gpm_shim               = document.getElementById('d21-gpm-shim');
			gpm_shim.style.width   = gpm_data.offsetWidth;
			gpm_shim.style.height  = gpm_data.offsetHeight;
			gpm_shim.style.zIndex  = gpm_data.style.zIndex-1;
			gpm_shim.style.top     = gpm_data.style.top;
			gpm_shim.style.left    = gpm_data.style.left;
			gpm_shim.style.display = 'block';
		}
	}

	xmlobj = new ajax_request();
	xmlobj.onreadystatechange(do_request_function);
	xmlobj.process(ipb_var_base_url+'act=d21gpm&do=load-form&mem-id='+id);

  	gpm_obj.style.position = 'absolute';
	gpm_obj.style.display  = 'block';
	gpm_obj.style.zIndex   = 97;

	if(gpm_obj.style.top && gpm_obj.style.top != null)
	{
		gpm_obj.style.top = xScrollTop() + (xClientHeight()/ 2) - (xHeight(gpm_obj)/2) + 'px';
	}
	
	gpm_ldfm = document.getElementById('d21-gpm-loading-form');
	if (gpm_ldfm)
	{
		gpm_data.innerHTML = gpm_ldfm.innerHTML;
	}

	if (!gpm_loaded)
	{
		var mw = 0;
		var mh = 0;
		
		if (typeof(window.innerWidth) == 'number')
		{
			mw = window.innerWidth;
			mh = window.innerHeight;
		}
		else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight))
		{
			mw = document.documentElement.clientWidth;
			mh = document.documentElement.clientHeight;
		}
		else if (document.body && (document.body.clientWidth || document.body.clientHeight))
		{
			mw = document.body.clientWidth;
			mh = document.body.clientHeight;
		}

		var dh = parseInt(gpm_obj.style.Height);
		var dw = parseInt(gpm_obj.style.Width);

		dh = (dh) ? dh : 500;
		dw = (dw) ? dw : 600;

		gpm_obj.style.left = mw / 2 - (dw / 2) + 'px';
		gpm_obj.style.top  = mh / 2 - (dh / 2) + xScrollTop() + 'px';

		Drag.cookiename = 'd21-gpm-coords';
		Drag.init(gpm_title, gpm_obj);

		gpm_loaded = 1;
	}
	return false;
}

function d21_gpm_send_pm(p)
{
	if (typeof(p) == 'undefined')
	{
		p = 0;
	}

	var mid  = document.getElementById('member-id').value;
	var mnm  = document.getElementById('member-name').value;
	var sub  = document.getElementById('pm-subject').value;
	var msg  = document.getElementById('pm-message').value;
	var url  = ipb_var_base_url+'act=d21gpm&do=send-pm';
	var flds = new Array();

	flds['act']      = 'd21gpm';
	flds['do']       = 'send-pm';
	flds['mem-id']   = mid;
	flds['mem-name'] = mnm;
	flds['subject']  = sub;
	flds['message']  = msg;
	flds['preview']  = (p) ? 1 : 0;

	do_request_function = function()
	{
		if (!xmlobj.readystate_ready_and_ok())
		{
			xmlobj.show_loading();
			return;
		}

		xmlobj.hide_loading();
		var html = xmlobj.xmlhandler.responseText;

		gpm_data           = document.getElementById('d21-gpm-data');
		gpm_data.innerHTML = html;
	}

	xmlobj = new ajax_request();
	xmlobj.onreadystatechange(do_request_function);
	xmlobj.process(url, 'POST', xmlobj.format_for_post(flds));

	return false;
}

function d21_gpm_check_to_send()
{
	var sub  = document.getElementById('pm-subject');
	var msg  = document.getElementById('pm-message');

	if (!sub || !msg)
	{
		return true;
	}

	if (sub.value != '' && msg.value != '')
	{
		if (!confirm(lang_send))
		{
			return false;
		}
	}

	return true;
}

function d21_gpm_close()
{
	gpm_obj = document.getElementById('d21-gpm-master');
	gpm_obj.style.display = 'none';

	return false;
}

function d21_gpm_main_loop()
{
	if ((_old_input_val != _cur_input_val) && (_cur_input_val.length >= 3) && (_in_focus == 1))
	{
		if (!delay_action && _allow_update)
		{
			var cached = _results[_cur_input_val];
			if (cached)
			{
				d21_gpm_return_search(_cur_input_val, cached[0], cached[1]);
			}
			else
			{
				do_request_function = function()
				{
					if (!xmlobj.readystate_ready_and_ok())
					{
						return;
					}

					var returned = xmlobj.xmlhandler.responseText;
					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=d21gpm&do=xml-members&name='+escape(inobj.value));

				inobj.focus();
			}
		}

		delay_action = false;
	}

	_old_input_val = _cur_input_val;
	_timemout_main = setTimeout('d21_gpm_main_loop()', 10);

	return false;
}

function d21_gpm_start_js(frm, fld)
{
	formobj = document.getElementById(frm);
	inobj   = document.getElementById(fld);
	divobj  = document.getElementById('d21-gpm-xml-members');

	inobj.autocomplete = 'off';
	inobj.onfocus      = function (){_in_focus = 1;}
	inobj.onblur       = d21_gpm_onblur_handler;
	inobj.onsubmit     = d21_gpm_submit_handler;

	if (formobj.onsubmit)
	{
		_form_onsubmit_saved = formobj.onsubmit;
	}

	formobj.onsubmit = d21_gpm_submit_handler;
	if (inobj.createTextRange)
	{
		inobj.onkeyup = new Function("return d21_gpm_onkeyup_handler(event);");
	}
	else
	{
		inobj.onkeyup = d21_gpm_onkeyup_handler;
	}

	d21_gpm_cache_name_results('', new Array(), new Array());
	_cur_input_val     = inobj.value;
	document.onkeydown = d21_gpm_keydown_handler;

	d21_gpm_set_up_key_down();
}

function d21_gpm_set_up_key_down()
{
	if (document.createEventObject)
	{
   		var y = document.createEventObject();
		y.ctrlKey = true;
		y.keyCode = 70;
		document.fireEvent('onkeydown', y)
	}
}

function d21_gpm_keydown_handler(e)
{
	if (!e && window.event)
	{
    	e = window.event;
	}

	if (e)
	{
		_last_key_code = e.keyCode;
	}
}

function d21_gpm_onblur_handler(e)
{
	if (!e && window.event)
	{
		e = window.event;
	}

	if (!_cur_updown_pressed)
	{
		_in_focus = 0;
		d21_gpm_my_xr_hide_div(divobj);
		_hiliteindex = -1;

		if (_last_key_code == 9)
		{
			_last_key_code = -1;
		}
	}

	_cur_updown_pressed = false;
}

function d21_gpm_key_handler_function()
{
	if (_event_key_code == 40 || _event_key_code == 38)
	{
		_allow_update = false;
		d21_gpm_blur_then_focus();
	}
	else
	{
		_cur_updown_pressed = false;
		_allow_update       = true;
	}

	_cur_input_val = inobj.value;
	d21_gpm_handle_cursor_press(_event_key_code);
}

function d21_gpm_handle_cursor_press(ec)
{
	if (ec == 40)
	{
		d21_gpm_hilite_new_value(_hiliteindex+1);
	}
	else if (ec == 38)
	{
		d21_gpm_hilite_new_value(_hiliteindex-1);
	}
	else if (ec == 13 || ec == 3)
	{
		if (_hiliteindex != -1)
		{
			d21_gpm_my_xr_hide_div(divobj);
			_hiliteindex = -1;
		}

		return false;
	}

	return true;
}

function d21_gpm_hilite_new_value(i)
{
	if (_div_rows <= 0)
	{
		return;
	}

	d21_gpm_my_show_div(divobj);
	if (i > _div_rows)
	{
		i = _div_rows-1;
	}

	if (_hiliteindex != -1 && i != _hiliteindex)
	{
		d21_gpm_set_style_for_element(_hilite_sug_div, 'wrapdiv');
	}

	if (i < 0)
	{
		_hiliteindex = -1;
		inobj.focus();
		return;
	}

	_hiliteindex = i;
	_hilite_sug_div = divobj.getElementsByTagName('DIV').item(i);

	d21_gpm_set_style_for_element(_hilite_sug_div, 'spanhilite');
	newval = d21_gpm_find_span_value_for_class(_hilite_sug_div, 'namespan');

	if (newval && typeof(newval) != 'undefined')
	{
		inobj.value = d21_gpm_find_span_value_for_class(_hilite_sug_div, 'namespan');
	}
}

function d21_gpm_blur_then_focus()
{
	_cur_updown_pressed = true;
	inobj.blur();
	_timemout_blur = setTimeout('set_input_field_focus();', 10);

	return;
}

function d21_gpm_set_input_field_focus()
{
	inobj.focus();
}

function d21_gpm_set_style_for_element(c, n)
{
	try
	{
		if (!c)
		{
			return;
		}
	}

	catch(e)
	{
		return;
	}

	c.className = n;
	switch (n)
	{
		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;
	}
}

function d21_gpm_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 == '&nbsp;')
				{
					return '';
				}
				else
				{
					return value;
				}
			}
		}
	}
	else
	{
		return '';
	}
}

function d21_gpm_display_suggested_list(na, ia)
{
	while (divobj.childNodes.length > 0)
	{
    	divobj.removeChild(divobj.childNodes[0]);
  	}

	_div_rows = 0;
	for (var f=0; f<na.length; ++f)
	{
		_div_rows++;
		var od = document.createElement('DIV');
		d21_gpm_set_style_for_element(od, 'wrapdiv');
		od.onmousedown = d21_gpm_sb_mdown;
		od.onmouseover = d21_gpm_sb_mover;
		od.onmouseout  = d21_gpm_sb_mout;

		var span_wrap  = document.createElement('SPAN');
		d21_gpm_set_style_for_element(span_wrap, 'wrapspan');

		var span_name       = document.createElement('SPAN');
		span_name.innerHTML = na[f];

		var span_id = document.createElement('SPAN');
		d21_gpm_set_style_for_element(span_name, 'namespan');
		d21_gpm_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);
	}

	var gpm_obj = document.getElementById('d21-gpm-master');
	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);

	left_px = left_px-(parseInt(gpm_obj.style.left));
	top_px  = top_px-(parseInt(gpm_obj.style.top));

	divobj.style.position = 'absolute';
	if ((left_px+width) >= document.body.clientWidth)
	{
		left_px = left_px+mid.offsetWidth-width;
	}

	if ((top_px+height) >= document.body.clientHeight)
	{
		top_px = top_px-height;
	}

	divobj.style.left    = left_px+'px';
	divobj.style.top     = top_px+'px';
	divobj.style.display = 'block';
	divobj.style.zIndex  = '99';
	_hiliteindex = -1;
}

function d21_gpm_cache_name_results(s, na, ia)
{
	_results[s] = new Array(na, ia);
}

d21_gpm_return_search = function(mstring, namearray, idarray)
{
	d21_gpm_cache_name_results(mstring, namearray, idarray);

	if (_in_focus != 1)
	{
		return false;
	}

	d21_gpm_display_suggested_list(namearray, idarray);
	if (_div_rows > 0)
	{
		divobj.style.height = 16*_div_rows+4;
	}
	else
	{
		d21_gpm_my_xr_hide_div(divobj);
		_hiliteindex = -1;
	}
}

d21_gpm_submit_handler = function(e)
{
	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;
	}
}

d21_gpm_onkeyup_handler = function(e)
{
	_event_key_code = e.keyCode;
	d21_gpm_key_handler_function();
}

d21_gpm_sb_mdown = function()
{
	delay_action = true;
	inobj.value  = d21_gpm_find_span_value_for_class(this, 'namespan');
}

d21_gpm_sb_mover = function()
{
	d21_gpm_set_style_for_element(this, 'spanhilite');
}

d21_gpm_sb_mout = function()
{
	d21_gpm_set_style_for_element(this, 'wrapdiv');
}

function d21_gpm_my_xr_hide_div(dobj)
{
	dobj.style.display = 'none';
} 

function d21_gpm_load_pm_field()
{
	var o = document.getElementById('d21-gpm-pm-msg-field');
	var d = document.getElementById('d21-gpm-msg-field-data');
	var m = document.getElementById('d21-gpm-master');

	if (o && d && m)
	{
		o.innerHTML = d.innerHTML;
		d.innerHTML = null;

		/*var l = _get_obj_leftpos(o);
		var t = _get_obj_toppos(o)+o.offsetHeight;

		//l = l-(parseInt(m.style.left));
		//t = t-(parseInt(m.style.top));

		d.style.left       = l+'px';
		d.style.top        = t+'px';
		d.style.visibility = 'visible';
		d.style.display    = 'block';
		d.style.zIndex     = '100';*/
	}
}