function updateMessagesThruXmlHttp()
{
	var items = cssQuery("ol#messages li.message ul.message-links li.message-edit a");
	for(var i = 0;i<items.length;i++)
	{
		items[i].onclick = function(){return requestUpdateMessageForm(this);};
	}
}

function requestUpdateMessageForm(x)
{
	var messageid = x.href.replace(/.+update_message\/(\d+).+/, '$1');
	if(messageid)
	{
		var request = '<data><action>update_message</action><messageid>'+messageid+'</messageid></data>';
		updatereq = xmlreq(request, 'displayForm');

		return false;
	}
}

function updateBookmarkThruXmlHttp()
{
	var items = cssQuery("ul.topic-links.compact li.topic-bookmark a");
	for(var i = 0;i<items.length;i++)
	{
		items[i].onclick = function(){return requestReplaceBookmarkForm(this);};
	}
}

function requestReplaceBookmarkForm(x)
{
	var topicid = x.hash.substring(1);
	if(topicid)
	{
		var request = '<data><action>replace_bookmark</action><topicid>'+topicid+'</topicid></data>';
		updatereq = xmlreq(request, 'displayForm');

		return false;
	}
};

var extRequestDiv;
function displayForm()
{
	if(typeof updatereq != 'undefined' && updatereq.readyState == 4 )
	{
		var root = updatereq.responseXML.childNodes[1];
		if(root)
		{
			var form = updatereq.responseXML.getElementById('primary-input');
			if(form)
			{
				form.onsubmit = function(){return processXmlHttpForm(this);};
			}

			extRequestDiv = document.createElement('div');
			extRequestDiv.id = 'extrequestdiv';
			jscss('add',extRequestDiv,'extrequest moveable','');

			extRequestDivClose = document.createElement('span');
			extRequestDivClose.appendChild(document.createTextNode(getText('xmlhttp', 'close')));
			addEvent(extRequestDivClose, 'click', destroyForm);
			jscss('add',extRequestDivClose,'extrequest-close','');

			addEvent(extRequestDiv,'mousedown',findMoveableElement);
			addEvent(document,'mousemove',moveElement);
			addEvent(document,'mouseup',moveEnd);

			extRequestDiv.appendChild(extRequestDivClose);
			extRequestDiv.appendChild(root);

			document.getElementById('core').appendChild(extRequestDiv);

			updatereq = null;
		} else alert('no_root');
	}
}

function destroyForm()
{
	document.removeChild(extRequestDiv);
}

function processXmlHttpForm(form)
{
	if(form.tagName.toLowerCase() == 'form')
	{
		createOverlay();

		var request = '';
		var fieldName = '';
		var reg = new RegExp('data\\[(.*)\\]');
		var res = '';

		var items = cssQuery('input, textarea', form);
		for(var i = 0; i < items.length;i++)
		{
			res = items[i].name.match(reg);

			if(res != null)
				fieldName = res[1];
			else
				fieldName = items[i].name;

			if(fieldName == '' || fieldName == 'preview' || (items[i].tagName.toLowerCase() == 'input' && items[i].type == 'file'))
			{
				continue;
			}
			//if a file has been selected, submit using normal POST
			else if(items[i].tagName.toLowerCase() == 'input' && items[i].type == 'file' && items[i].value != '')
			{
				return true;
			}
			else
			{
				request += '<'+fieldName+'>'+htmlspecialchars(items[i].value)+'</'+fieldName+'>';
			}
		}

		request = '<data>'+request+'</data>';

		xmlhttpformidentifier = xmlreq(request, processXmlHttpFormCallback);
		destroyOverlay();
		return false;
	}
}

function processXmlHttpFormCallback()
{
	if(typeof xmlhttpformidentifier != 'undefined' && xmlhttpformidentifier != null && xmlhttpformidentifier.readyState == 4 )
	{
		var root = xmlhttpformidentifier.responseXML.getElementById('core');
		// needs testing - was: innerHTML
		extRequestDiv.replaceChild(root, extRequestDiv.firstChild);

		xmlhttpformidentifier = null;
	}
}

function xmlreq(request, callback)
{
	var xmlurl = board_script_url + '/../xml_input.php';
  	var xmlParser, xmlDocument;

	if(typeof request != 'string')
	{
		xmlDocument = request;
	}
	else
	{
		if(window.XMLHttpRequest)
		{
			/* safari 1.3/2.0 doesn't support DOMParser */
			if(typeof DOMParser == "undefined")
				return false;

			req = new XMLHttpRequest();
			xmlParser = new DOMParser();
			xmlDocument = xmlParser.parseFromString(request, 'text/xml');
		}
		else if(window.ActiveXObject)
		{
	        req = new ActiveXObject("MSXML2.XMLHTTP.3.0");

			xmlDocument = new ActiveXObject('Msxml2.DOMDocument.3.0'); //Microsoft.XMLDOM ?;
			xmlDocument.async = false;
			xmlDocument.loadXML(request);
		}

		var waa = xmlDocument.createProcessingInstruction("xml", "version='1.0'");
		xmlDocument.insertBefore(waa,xmlDocument.firstChild);
	}

	req.open("POST", xmlurl);

	if(window.XMLHttpRequest)
	{
		req.setRequestHeader('Content-Type', 'text/xml; utf-8');
	}

	req.onreadystatechange = eval(callback);
	req.send(xmlDocument);

	return req;
};
