////////////////////////////////////////////////////////////////////////
// maxXmlListParser v2.0.2
// 2007-03-18 14:02:37
// SiC
////////////////////////////////////////////////////////////////////////
var maxXmlListParser = {};

maxXmlListParser.error = null;
maxXmlListParser.xmlDOM = null;

//----------------------------------------------------------
// Create a XMLDOM object
//----------------------------------------------------------
maxXmlListParser.getXMLDOM = function(xpathArray){

	var objXMLDOM;

	try{
		if(window.ActiveXObject){
			objXMLDOM = new ActiveXObject("Microsoft.XMLDOM");
			objXMLDOM.async = false;
			if(xpathArray["namespace"]){
				objXMLDOM.setProperty("SelectionNamespaces", xpathArray["namespace"]);
			}
		}else{
			var ns = xpathArray["namespace"] ? xpathArray["namespace"] : "";
			objXMLDOM = document.implementation.createDocument(ns, "", null);
		}
	}catch(e){
		maxXmlListParser.error = "Create XMLDOM Failed :: (" + e.number + ") " + e.description;
		return null;
	}

	return objXMLDOM;

}


//----------------------------------------------------------
// Parse XML File
//----------------------------------------------------------
maxXmlListParser.parseFile = function(xmlFilePath, xpathArray){

	return maxXmlListParser.parse(xmlFilePath, xpathArray, true);

}


//----------------------------------------------------------
// Parse XML
//----------------------------------------------------------
maxXmlListParser.parse = function(xml, xpathArray, isFile){

	if(maxXmlListParser.load(xml, xpathArray, isFile)){

		return maxXmlListParser.parseItems(maxXmlListParser.xmlDOM, xpathArray);

	}else{

		return null;

	}

}


//----------------------------------------------------------
// Load in XML
//----------------------------------------------------------
maxXmlListParser.load = function(xml, xpathArray, isFile){

	if(!isFile) isFile = false;

	// Get XMLDOM Object
	if(!maxXmlListParser.xmlDOM){
		maxXmlListParser.xmlDOM = maxXmlListParser.getXMLDOM(xpathArray);
	}

	if(!maxXmlListParser.xmlDOM){
		return false;
	}

	// Load in XML
	isOK = true;

	if(isFile){
		maxXmlListParser.xmlDOM.async = false;
		maxXmlListParser.xmlDOM.load(xml);
	}else{
		if(window.ActiveXObject){
			maxXmlListParser.xmlDOM.loadXML(xml);
			if(maxXmlListParser.xmlDOM.parseError.errorCode != 0) isOK = false;
		}else{
			maxXmlListParser.xmlDOM = (new DOMParser()).parseFromString(xml, "text/xml");
			if(maxXmlListParser.xmlDOM.documentElement.tagName == "parsererror") isOK = false;
		}
	}

	if(isOK){
		return true;
	}else{
		maxXmlListParser.error = "maxXmlListParser Parser Error";
		return false;
	}

}


//----------------------------------------------------------
// Slect single node wrapper
//----------------------------------------------------------
maxXmlListParser.selectNodes = function(objXMLDOM, xpath, bSingle){

	if(window.ActiveXObject){

		// ie
		if(bSingle){
			return objXMLDOM.selectSingleNode(xpath);
		}else{
			return objXMLDOM.selectNodes(xpath);
		}

	}else{

		// mozilla
		var oXPath = new XPathEvaluator();
		var oNSResolver = oXPath.createNSResolver(objXMLDOM.ownerDocument == null ? objXMLDOM.documentElement : objXMLDOM.ownerDocument.documentElement);
		var oResult = oXPath.evaluate(xpath, objXMLDOM, oNSResolver, 0, null);
		var result = [];
		var obj;
		while (obj = oResult.iterateNext()){
			if(bSingle){
				return obj;
			}else{
				result.push(obj);
			}
		}

		if(result.length == 0 ){
			return null;
		}else{
			return result;
		}

	}

}


//----------------------------------------------------------
// Parse Items
//----------------------------------------------------------
maxXmlListParser.parseItems = function(objXMLDOM, xpathArray){

	var result = [];

	// Check if the file format match
	if(!maxXmlListParser.selectNodes(objXMLDOM.documentElement, xpathArray["validate"], true)){
		return null;
	}

	// Parse all data
	var itemArray = maxXmlListParser.selectNodes(objXMLDOM.documentElement, xpathArray["items"]);
	for(var i=0; i<itemArray.length; i++){
		var item = maxXmlListParser.parseSingleItem(itemArray[i], xpathArray);
		if(item != {}) result.push(item);
	}

	return result;

}


//----------------------------------------------------------
// Parse a single Item node
//----------------------------------------------------------
maxXmlListParser.parseSingleItem = function(node, xpathArray){

	var result = xpathArray["itemTemplate"] ? $clone(xpathArray["itemTemplate"]) : {};

	for(var label in xpathArray["attributes"]){
		var item = maxXmlListParser.selectNodes(node, xpathArray["attributes"][label], true);
		if(item){
			result[label] = item.nodeValue;
		}
	}

	return result;

}


//----------------------------------------------------------
// Update a single Item node - require write permission
//----------------------------------------------------------
maxXmlListParser.updateItem = function(params){

	if(maxXmlListParser.load(params["xml"], {}, params["isFile"])){

		var item = maxXmlListParser.xmlDOM.selectSingleNode(params["xpath"]);
		if(item){
			item.nodeValue = params["value"];
		}

		if(params["save"] && params["isFile"]){
			try{
				maxXmlListParser.xmlDOM.save(params["xml"]);
			}catch(e){
				alert(e.description);
			}
		}

		return true;

	}else{

		alert(maxXmlListParser.error);
		return false;

	}

}
