var http_request = false;

function doRequest(url, targetObjId, childObjType) {

	http_request = false;
	
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	
	if (!http_request) {
		alert('Giving up :( Cannot create an XMLHTTP instance');
		return false;
	}
	
	http_request.onreadystatechange = function() { processResults(targetObjId, childObjType); };
	http_request.open('GET', url, true);
	http_request.send(null);

}


function checkMatchingRecord(url, sourceObjId, targetObjId, callBackFunction) {

	http_request = false;
	
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	
	if (!http_request) {
		alert('Giving up :( Cannot create an XMLHTTP instance');
		return false;
	}
	
	http_request.onreadystatechange = function() { processMatchResult(sourceObjId, targetObjId, callBackFunction); };
	http_request.open('GET', url, true);
	http_request.send(null);

}


function processMatchResult(sourceObjId, targetObjId, callBackFunction) {

	if (http_request.readyState == 4) {
		
		if (http_request.status == 200) {
			var xmlDoc = http_request.responseXML;
			var arrResults = storeResults(xmlDoc);
			
			if (arrResults.length == 1) {
				// We have a match
				var callBackParams = "('"+sourceObjId+"', '"+targetObjId+"', true)";
				eval(callBackFunction + callBackParams);
			} else {
				// No match found
				var callBackParams = "('"+sourceObjId+"', '"+targetObjId+"', false)";
				eval(callBackFunction + callBackParams);
			}
		} else {
			alert('There was a problem with the request.');
		}
	}
}


function processResults(targetObjId, childObjType) {

	if (http_request.readyState == 4) {
		
		if (http_request.status == 200) {
			var xmlDoc = http_request.responseXML;
			var arrResults = storeResults(xmlDoc);
			clearObject(targetObjId);
			appendResults(arrResults, targetObjId, childObjType);
		} else {
			alert('There was a problem with the request.');
		}
	}
}


function storeResults(xmlDoc)
{
	arrResults = [];
	
	var results = xmlDoc.getElementsByTagName('results')[0].childNodes;

	for (var i=0;i<results.length;i++)
	{
		if (results[i].hasChildNodes())
			arrResults.push(  { 'id':results[i].getAttribute('id'), 'value':results[i].childNodes[0].nodeValue, 'info':results[i].getAttribute('info') }  );
	}

	return arrResults;
}


function clearObject(targetObjId)
{
	var object = getObject(targetObjId);
	
	if(object) {
		var tag=object.tagName;

		if (tag == "SELECT")
		{
			object.length = 0;
		}
		else
		{
			var len = object.childNodes.length;
			
			for (var i=0; i < len; i++)
			{
				var childObject = object.childNodes[i];
				removeObject(childObject);
			}
		}
	}
}


function appendResults(arrResults, targetObjId, childObjType)
{

	if (arrResults.length == 0)
		return false;

	var targetObj = getObject(targetObjId);
	
	for (var i=0; i < arrResults.length; i++) {
		var itemId = arrResults[i].id;
		var itemValue = arrResults[i].value;
		var itemInfo = arrResults[i].info;
		var childObj = createObj(childObjType, {value:itemId}, itemValue);
		targetObj.appendChild(childObj);
	}

}


/* create element */
function createObj( type, attr, cont, html )
{
	var ne = document.createElement( type );
	
	if (!ne)
		return 0;
		
	for (var a in attr)
		ne[a] = attr[a];
	
	var t = typeof(cont);
	
	if (t == "string" && !html)
		ne.appendChild( document.createTextNode(cont) );
	else if (t == "string" && html)
		ne.innerHTML = cont;
	else if (t == "object")
		ne.appendChild( cont );

	return ne;
};

/* get element */
function getObject( object )
{
	var t=typeof(object);
	
	if (t == "undefined")
		return 0;
	else if (t == "string")
	{
		var re = document.getElementById( object );
		if (!re)
			return 0;
		else if (typeof(re.appendChild) != "undefined" )
			return re;
		else
			return 0;
	}
	else if (typeof(object.appendChild) != "undefined")
		return object;
	else
		return 0;
};

/* remove element */
function removeObject( object )
{
	var e = getObject(object);

	if (!e)
		return 0;
	else if (e.parentNode.removeChild(e))
		return true;
	else
		return 0;
};
