function oXml() {}

oXml.parseXml=function(xml, current, name) {
	//alert('name=' + name + '\ncurrent=' + oXml.serialise(current) + '\nxml=' + xml);
	if (current==undefined) current=new Object();
	while (xml!='' && xml.indexOf('</' + name + '>')!=0) {
		var token=xml.substring(1,xml.indexOf('>'));
		xml=xml.substring(xml.indexOf('>') + 1);
		if (!oXml.stripAttributes(token,current)) {            	//Attribute values <a x="ghjg" y="hjkh"/>
			var cdata=oXml.stripCDATA(xml);
			if (cdata) {
				current[token]=oXml.stripBoolean(cdata.value);
				xml=xml.substring(cdata.length + token.length+3);}
			else {
				current[token]=new Object();
				xml=oXml.parseXml(xml,current[token],token);
				//alert('xml=' + xml + '\nObject=' + oXml.serialise(current));
	}}}
	if (name==undefined) return current;
	else {
		xml=xml.substring(name.length+3);
		return xml;}}

oXml.stripAttributes=function(token, current) {
	if (token.indexOf(' ')==-1) return false;
	var object=token.substring(0,token.indexOf(' '));
	current[object]=new Object();
	token=token.substring(token.indexOf(' '));
	while (token!='/') {
		var property=token.substring(1,token.indexOf('='));
		token=token.substring(token.indexOf('=')+2);
		//alert('object=' + object + '\ntoken=' + token + '\nproperty=' + property + '\nvalue=' + oXml.stripBoolean(token.substring(0,token.indexOf('"'))));
		current[object][property]=oXml.stripBoolean(token.substring(0,token.indexOf('"')));
		token=token.substring(token.indexOf('"')+1);}
	return true;}

oXml.stripBoolean=function(s) {
	if (s=='true') return true;
	else if (s=='false') return false;
	else return s;}

oXml.stripCDATA=function(s) {
	var cdata=new Object();
	if (s.indexOf('<![CDATA[')==0) {
		cdata.value=s.substring(9,s.indexOf(']]>'));
		cdata.length=s.indexOf(']]>') + 3;}
	else if (s.indexOf('<')==0) return undefined;
	else {
		cdata.value=s.substring(0,s.indexOf('<'));
		cdata.length=s.indexOf('<');}
	return cdata;}
	
oXml.serialise=function(obj) {
	var xml='';
	try {
		var found=false;
		for (var p in obj) {
			found=true;
			xml+='<'+p+'>';
			if (typeof(obj[p])=='object') xml+=oXml.serialise(obj[p]);
			else xml+=obj[p];
			xml+='</'+p+'>';}
		return found?xml:obj;}
	catch(e) {return xml;}}

oXml.getHtml=function(html) {
	return html.replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'"').replace(/&amp;/g,'&');}

//var xml='<refresh>true</refresh><updateNumber>11</updateNumber><content>content</content><bookings><a s=\"1\" t=\"2\"/><b s=\"10\" t=\"2\"/></bookings>';
//xml='<bookings><a s=\"1\"/></bookings>';
//var xml='<logon><success>true</success><problem name="email" value="1234"/><fields><field>XYZ</field><field>ABC</field></fields></logon>';
//var xml='<a><b>true</b><c><d>1</d><e>2</e></c></a>';
//var xml='<logon><success>true</success><problem name="email" value="1234"/><fields><field>XYZ</field><field>ABC</field></fields></logon>';
//var xml='<a><b><![CDATA[<html>1</html>]]></b></a>';
//var parsed=oXml.parseXml(xml);
//alert(oXml.serialise(parsed));