var fLoadXML=function (url, fSuccess) {
	var oThis = this;
	var nTry = 0;
	this.oXml = null;
	this.object = null;
	this.aAjax = new Ajax(url+"?ran="+Math.random(), {
		method: "get",
		onFailure: function() {
			if (nTry < 5) {
				oThis.aAjax.request();
				nTry++;
			} else {
				alert("Error loading XML file.\n"+url);
			}
		},
		onSuccess: function() {
			oThis.oXml = this.transport.responseXML;
			oThis.object = oThis.parseXML(oThis.oXml);
			if (fSuccess) {
				fSuccess(oThis.oXml, oThis.object);
			}
		}
	}).request();
	return this;
}
fLoadXML.prototype.parseXML = function(oXmlToParse) {
	aXml = new Array();
	aXml = fObjectStructure(oXmlToParse);
	return aXml;
};
//
var fObjectStructure = function (oMyXml) {
	var oReturnValue = new fResultObject();
	var sNodeName = '';
	var iInc = 0;
	var iAttrib = 0;
	var oRegExp = new RegExp("[^a-zA-Z0-9_]*", "g");
	if (oMyXml.hasChildNodes() == true) {
		for (iInc=0; iInc<oMyXml.childNodes.length; iInc++) {
			sNodeName = oMyXml.childNodes[iInc].nodeName;
			sNodeName = sNodeName.replace(oRegExp, '');
			// reset / create subnode
			if (typeof oReturnValue[sNodeName] != 'object') {
				oReturnValue[sNodeName] = new Array();
			}
			if (oMyXml.childNodes[iInc].nodeType == 1) {
				var oTmpNode = fObjectStructure(oMyXml.childNodes[iInc]);
				for (iAttrib=0; iAttrib<oMyXml.childNodes[iInc].attributes.length; iAttrib++) {
					oTmpNode.fSetAttribute(oMyXml.childNodes[iInc].attributes[iAttrib].nodeName, oMyXml.childNodes[iInc].attributes[iAttrib].nodeValue);
				}
				oReturnValue[sNodeName].push(oTmpNode);
			} else if (oMyXml.childNodes[iInc].nodeType == 3) {
				sVal = fDecode(String(oMyXml.firstChild.data));
				oReturnValue.data = sVal;
			} else if (oMyXml.childNodes[iInc].nodeType == 4) {
				oReturnValue.data = fDecode(String(oMyXml.firstChild.data));
			}
		}
	}
	return oReturnValue;
};
//
var fResultObject=function () {
	this.iId = 0;
	this.data = '';
	var aAttributes = new Array();

	this.find_item_by_id = function() {
		var oReturnValue = null;
		var sType = arguments[0];
		var iId = arguments[1];
		var iInc = 0;
		if (this[type]) {
			for (iInc=0; iInc<this[sType].length; iiInc++) {
				if (this[sType][iInc].fGetAttribute('id') == iId) {
					oReturnValue = this[sType][iInc];
					break;
				}
			}
		}
		return oReturnValue;
	};

	this.fGetAttribute = function(iId) {
		var oReturnValue = null;
		if (typeof aAttributes[iId] != 'undefined') {
			oReturnValue = aAttributes[iId];
		}
		return oReturnValue;
	};

	this.fSetAttribute = function(sNodeName,sNodeValue) {
		aAttributes[sNodeName] = sNodeValue;
	};
}
// =========================================================================
var fDecode = function (sRawtext) {
	var sPlaintext = '';
	var iInc = 0;
	var c1 = 0;
	var c2 = 0;
	var c3 = 0;
	var u = 0;
	var t = 0;
	// remove special JavaScript encoded non-printable characters
	while (iInc<sRawtext.length) {
		if (sRawtext.charAt(iInc) == '\\' && sRawtext.charAt(iInc+1) == 'u') {
			u = 0;
			for (j=2; j<6; j += 1) {
				t = parseInt(sRawtext.charAt(i+j), 16);
				if (!isFinite(t)) {
					break;
				}
				u = u*16+t;
			}
			sPlaintext += String.fromCharCode(u);
			iInc += 6;
		} else {
			sPlaintext += sRawtext.charAt(iInc);
			iInc++;
		}
	}
	// convert numeric data to number type
	var oRegExp = new RegExp("^\\s+$", "g");
	if (sPlaintext != '' && sPlaintext.search(oRegExp) == -1 && !isNaN(sPlaintext) && isFinite(sPlaintext)) {
		sPlaintext = Number(sPlaintext);
	}
	return sPlaintext;
};

