if (typeof LQP == "undefined") {
    	var LQP = {};
	}
	LQP.WDDX = {
		getXMLDoc: function (strXML) {
			// code for IE	
			if (window.ActiveXObject) {
				var doc=new ActiveXObject("Microsoft.XMLDOM");
				doc.async="false";
				doc.loadXML(strXML);
			}
			// code for Mozilla, Firefox, Opera, etc.
			else {
				var parser=new DOMParser();
				var doc=parser.parseFromString(strXML,"text/xml");
			}
			return doc;
		},
		nullFunc: function (node) {
			return "";
		},
		stringFunc: function (node) {
			var rtrStr = "";
			for (var i = 0; i < node.childNodes.length; i++) {
				if (node.childNodes[i].nodeName == "char") {
					rtrStr = rtrStr + this.charFunc(node.childNodes[i]);
				}
				else {
					var value = node.childNodes[i].nodeValue;
					value = value.replace(/\\/, "\\");
					value = value.replace(/\'/, "\'");
					value = value.replace(/\"/, "\"");
					rtrStr = rtrStr + value;
				}
			}
			return rtrStr;
		},
		charFunc: function(node) {
			if (node.getAttribute("code") == "00") {
				return "\0";
			}
			else if (node.getAttribute("code") == "08") {
				return "\b";
			}
			else if (node.getAttribute("code") == "09") {
				return "\t";
			}
			else if (node.getAttribute("code") == "0a") {
				return "\n";
			}
			else if (node.getAttribute("code") == "0b") {
				return "\v";
			}
			else if (node.getAttribute("code") == "0c") {
				return "\f";
			}
			else if (node.getAttribute("code") == "0d") {
				return "\r";
			}
			else {
				return decodeURIComponent("%" + node.getAttribute("code"));
			}
		},	
		numberFunc: function (node) {
			return parseFloat(node.childNodes[0].nodeValue);
		},
		booleanFunc: function(node) {
			return node.getAttribute("value") == "true";
		},
		dateTimeFunc: function(node) {
			var dt = node.childNodes[0].nodeValue;
			var index = dt.search(/-/);
			var year = dt.substr(0,index);
			dt = dt.substring(index + 1);
			index = dt.search(/-/);
			var month = parseInt(dt.substr(0,index)) - 1;
			dt = dt.substring(index + 1);
			index = dt.search(/T/);
			var day = dt.substr(0,index);
			dt = dt.substring(index + 1);
			index = dt.search(/:/);
			var hour = dt.substr(0,index);
			dt = dt.substring(index + 1);
			index = dt.search(/:/);
			var minute = dt.substr(0,index);
			dt = dt.substring(index + 1);
			index = dt.search(/-/);
			var second = dt.substr(0,index);
			return new Date(year,month,day,hour,minute,second);
		},
		binaryFunc: function (node) {
			return this.stringFunc(node);
		},
		recordsetFunc: function (node) {
			var rtrSet = {};
			rtrSet.recordCount = parseInt(node.getAttribute("rowCount"),10);
			for (var i = 0; i < node.childNodes.length; i++) {
				rtrSet[node.childNodes[i].getAttribute("name")] = this.arrayFunc(node.childNodes[i]);
			}
			return rtrSet;
		},			
		arrayFunc: function (node) {
			var rtrArray = [];
			for (var i = 0; i < node.childNodes.length; i++) {
				rtrArray[i] = this.toValue(node.childNodes[i]);
			}
			return rtrArray;
		}, 
		structFunc: function (node) {
			var rtrStruct = {};
			for (var i = 0; i < node.childNodes.length; i++) {			
				rtrStruct[node.childNodes[i].getAttribute("name")] = this.toValue(node.childNodes[i].childNodes[0]);
			}
			return rtrStruct; 
		},
		toValue: function(node) {
			return this[node.nodeName + "Func"](node);
		},
		deserializeXML: function(docXML) {
			var startNode;
			for (var i = 0; i < docXML.childNodes.length; i++) {
				if (docXML.childNodes[i].nodeName == "wddxPacket") {
					startNode = docXML.childNodes[i].childNodes[1].childNodes[0];
					break;
				}
			}
			return this.toValue(startNode);
		},
		deserialize: function (strXML) {
			var doc = this.getXMLDoc(strXML);
			return this.deserializeXML(doc);
		}	
	};