//////////////////////////////////////////////
// Italcom Spa
// Browser: IE 6.0, Mozilla 1.7
// Library: CXmlDeserializer, CXmlSerializer
// Version 1.0
// Require: CDomDocumentNode
//          CSoapRequest
//          
// Objects:
//////////////////////////////////////////////


// Costructor
function CXmlDeserializer() { ; }

CXmlDeserializer.DeserializeFromXml 
= // =============================
function (rootObj, xmlData, rootNodeName)
{
	
	if (rootNodeName == null) 
		rootNodeName = "root";
	
	var domDocumentNode = new CDomDocumentNode();
	domDocumentNode.loadXML(xmlData);
	
	var node = domDocumentNode.getElementsByTagName(rootNodeName)[0];
	return CXmlDeserializer.Deserialize(rootObj, node);
}

// Method Deserialize: this method deserialze the web services's response
CXmlDeserializer.Deserialize 
= // ============================
function(rootObj, rootNode)
{

	var childItems = rootNode.childNodes;
	var idx = 0;
	
	if ( rootObj == null )
		rootObj = new Object();
	
	while (idx < childItems.length)
	{

		var node = childItems.item(idx);
		
		switch (node.nodeName)
		{
		case 'b':
			var nodeValue = node.attributes.getNamedItem("v").nodeValue;
			nodeValue = nodeValue.toLowerCase().replace(/1/, "true").replace(/0/, "false");
			nodeValue = (nodeValue == "true" ? true : false);
			rootObj[node.attributes.getNamedItem("n").nodeValue] = nodeValue;
			break;
		case 's':
			var nodeValue = node.attributes.getNamedItem("v").nodeValue;
			rootObj[node.attributes.getNamedItem("n").nodeValue] = nodeValue;
			break;
		case 'n':
			var nodeValue = node.attributes.getNamedItem("v").nodeValue;
			var value = null;
			try
			{ 
				var value = parseFloat(nodeValue); 
				value = (isNaN(value) ? null: value);
			}
			catch (e) { ; }
			rootObj[node.attributes.getNamedItem("n").nodeValue] = value;
			break;
		case 'd':
			var nodeValue = node.attributes.getNamedItem("v").nodeValue.replace(/\.\d+/gi, "");
			rootObj[node.attributes.getNamedItem("n").nodeValue] = new Date(nodeValue);
			break;
		case 'a':
		case 'o':
			if (node.nodeName=='a')
				var subobject = new Array();
			else
				var subobject = new Object();
			CXmlDeserializer.Deserialize(subobject, node);
			rootObj[node.attributes.getNamedItem("n").nodeValue] = subobject;
			break;
		}
		idx++;
	}
	return rootObj;
}



function CXmlSerializer() { ; }

CXmlSerializer.internalAddNode
= // ========================================
function (doc, node, elementName, attrName, attrValue) 
{
	var childNodeElement = doc.document.createElement(elementName);
	node.appendChild(childNodeElement);
	childNodeElement.setAttribute("n", attrName);
	childNodeElement.setAttribute("v", attrValue);
			
}



CXmlSerializer.Serialize 
= //
function (obj) 
{
	var mainNode = new CDomDocumentNode();
	mainNode.loadXML('<r />');
	
	CXmlSerializer.internalSerialize(obj, mainNode, mainNode.node());

	var childNode = mainNode.firstChild();
	if (childNode != null)
	{
		return mainNode.xml().slice(3, -4);
	}
	else
	{
		return "";
	}
	
}



// Method Serialize: this method serialze to xml the javascript object graph.
CXmlSerializer.internalSerialize 
= // ========================================
function (obj, doc, currNode)
{

	var subNode;
	var fmt = function (value, nDecimals) {return ("" + (Math.pow(10,nDecimals)+value)).slice(-nDecimals)};


	for (var prop in obj)
	{
	
		
	
		if (obj[prop] == null)
			continue;
		switch (typeof obj[prop] )
		{
		case "number":
			this.internalAddNode(doc, currNode, 'n', prop, obj[prop]);
			break;
		case 'string':
			this.internalAddNode(doc, currNode, 's', prop, obj[prop]);
			break;
		case 'boolean':
			this.internalAddNode(doc, currNode, 'b', prop, obj[prop] ? "true" : "false");
			break;
		case 'object':
		
			if (obj[prop] instanceof Date)
			{
				var dt = fmt(obj[prop].getMonth()+1,2) + '/' + fmt(obj[prop].getDate(),2) + '/' + fmt(obj[prop].getFullYear(),4) + ' ' + fmt(obj[prop].getHours(),2) + ':' + fmt(obj[prop].getMinutes(),2) + ':' + fmt(obj[prop].getSeconds(),2) + '.' + fmt(obj[prop].getMilliseconds(),3);
				this.internalAddNode(doc, currNode, 'd', prop, dt);
				//this.internalAddNode(doc, currNode, 'd', prop, obj[prop].getDate() + '/' + (obj[prop].getMonth()+1) + '/' + obj[prop].getFullYear());
				//this.internalAddNode(doc, currNode, 'd', prop, fmt(obj[prop].getFullYear(),4) + '-' + fmt(obj[prop].getMonth()+1,2) + '-' + fmt(obj[prop].getDate(),2) + ' ' + fmt(obj[prop].getHours(),2) + ':' + fmt(obj[prop].getMinutes(),2) + ':' + fmt(obj[prop].getSeconds(),2) + '.' + obj[prop].getMilliseconds());
			}
			else if (obj[prop] instanceof Array)
			{
				
				subNode = doc.document.createElement('a');
				subNode.setAttribute('n', prop );
				currNode.appendChild(subNode);
				CXmlSerializer.internalSerialize(obj[prop], doc, subNode);
				
			}
			else
			{
				subNode = doc.document.createElement('o');
				subNode.setAttribute('n', prop );
				currNode.appendChild(subNode);
				CXmlSerializer.internalSerialize(obj[prop], doc, subNode);
				
			}

			break;
		}
	}
	

}

