function pvxml_node(pnode, tag)
{
	if (!pnode) return null;
	var node = pnode.getElementsByTagName(tag);
	if (!node) return null;
	return node.item(0);
}

function pvxml_attribute_value(pnode, name)
{
	if (!pnode) return null;
	var value = pnode.getAttribute(name);
	return value == null ? "" : value;
}

function pvxml_value(pnode, tag)
{
	var node = pvxml_node(pnode, tag);
	if (!node) return null;
	if (node.firstChild) return node.firstChild.nodeValue;
	return null;
}

function pvxml_response(root)
{
	var response = pvxml_node(root, "response");
	if (!response) return null;

	var code = intval(response.getAttribute("code"));
	if (code == 0) return { code: code, message: null };

	var message = pvxml_value(response, "message");

	return { code: code, message: message };
}

function pvxml_str2cdata(str)
{
	return "<![CDATA[" + encodeURIComponent(str) + "]]>";
}

/* group */
function pvxml_xml2group(group_node)
{
	var group = {};
	group.gid = intval(pvxml_value(group_node, "gid"));
	group.name = pvxml_value(group_node, "name");
	group.total = intval(pvxml_value(group_node, "total"));
	group.togonumber = pvxml_value(group_node, "togonumber");
	return group;
}

function pvxml_group2xml(group)
{
	var x = "<group>";

	x += "<gid>" + group.gid + "</gid>";
	if (group.name)
		x += "<name><![CDATA[" + encodeURIComponent(group.name) + "]]></name>";
	else x += "<name></name>"; 
	x += "<total>" + group.total + "</total>";

	x += "</group>";

	return x;
}

/* groups */
function pvxml_xml2groups(groups_node)
{
	var groups = new Array();
	for (var i=0; i<groups_node.childNodes.length; i++)
	{
		groups[i] = pvxml_xml2group(groups_node.childNodes[i]);
	}

	return groups;
}

function pvxml_groups2xml(groups)
{
	var x = "<groups>";
	for (var i=0; i<groups.length; i++) x += pvxml_group2xml(groups[i]);
	x += "</groups>";
	return x;
}

/* contact */
function pvxml_xml2contact(contact_node)
{
	var contact = {};
	contact.id = intval(pvxml_value(contact_node, "id"));
	contact.name = pvxml_value(contact_node, "name");
	contact.phone = pvxml_value(contact_node, "phone");
	contact.email = pvxml_value(contact_node, "email");
	contact.state = pvxml_value(contact_node, "state");
	var labels_node = pvxml_node(contact_node, "labels");
	contact.labels = pvxml_xml2labels(labels_node);
	return contact;
}

function pvxml_contact2xml(contact)
{
	var x = "<contact>";

	x += "<id>" + contact.id + "</id>";
	if (contact.name)
		x += "<name><![CDATA[" + encodeURIComponent(contact.name) + "]]></name>";
	if (contact.phone)
		x += "<phone><![CDATA[" + encodeURIComponent(contact.phone) + "]]></phone>";
	else x += "<phone></phone>"; 
	if (contact.email)
		x += "<email><![CDATA[" + encodeURIComponent(contact.email) + "]]></email>";
	else x += "<email></email>"; 
	x += pvxml_labels2xml(contact.labels);
	x += "</contact>";

	return x;
}

/* contacts */
function pvxml_xml2contacts(contacts_node)
{
	var contacts = new Array();
	for (var i=0; i<contacts_node.childNodes.length; i++)
	{
		contacts[i] = pvxml_xml2contact(contacts_node.childNodes[i]);
	}

	return contacts;
}

function pvxml_contacts2xml(contacts)
{
	var x = "<contacts>";
	for (var i=0; i<contacts.length; i++) x += pvxml_contact2xml(contacts[i]);
	x += "</contacts>";
	return x;
}

/* label */
function pvxml_xml2labels(labels_node)
{
	if (!labels_node) return null;

	var jsonObj = new Array(labels_node.childNodes.length);
	
	for (var i=0; i<labels_node.childNodes.length; i++) {
		jsonObj[i] = {};
		var name = labels_node.childNodes[i].firstChild.nodeValue;
		var count = pvxml_attribute_value(labels_node.childNodes[i], "count");
		jsonObj[i].name = name;
		jsonObj[i].count = count;
	}
	return jsonObj;
}

function pvxml_labels2xml(labels)
{
	var x = "<labels>";
	for (var i=0; i<labels.length; i++)
		x += "<label><![CDATA[" + encodeURIComponent(labels[i]) + "]]></label>";
	x += "</labels>";

	return x;
}

