﻿
YAHOO.namespace("xml");if(!document.all){Node.prototype.__defineGetter__("xml",_Node_getXML);}
function _Node_getXML(){var objXMLSerializer=new XMLSerializer;var strXML=objXMLSerializer.serializeToString(this);return strXML;}
YAHOO.xml.Helper=new function(){this.getNodeText=function(n){for(var i=0;i<n.childNodes.length;i++){if((n.childNodes[i].nodeType==3)||(n.childNodes[i].nodeType==4)){return n.childNodes[i].nodeValue;break;}}
return'';};this.setNodeText=function(n,txt){for(var i=0;i<n.childNodes.length;i++){if((n.childNodes[i].nodeType==3)||(n.childNodes[i].nodeType==4)){n.childNodes[i].nodeValue=txt;return;}}
tn=n.ownerDocument.createTextNode(txt);n.appendChild(tn);};}
YAHOO.xml.Document=function(doc){if(doc!=null){if(doc.ownerDocument){this.doc=doc.ownerDocument;}else{this.doc=doc;}}else{this.doc=null;}}
YAHOO.xml.Document.prototype={loadXml:function(string){var xmlDocument;if(window.DOMParser){var xmlParser=new DOMParser();this.doc=xmlParser.parseFromString(string,'text/xml');}else if(window.ActiveXObject){this.doc=new ActiveXObject('Microsoft.XMLDOM');this.doc.async=false;this.doc.loadXML(string);}
return this.doc;},_parseIndex:function(subPath){var index=-1;if(subPath.length>0&&subPath.charAt(subPath.length-1)==']'){var k;for(k=subPath.length-1;k>0;--k){if(subPath.charAt(k-1)=='[')
break;}
index=parseInt(subPath.substr(k,subPath.length-k-1));if(!isNaN(index)){this.parseIndexStripped=subPath.substr(0,k-1);}else if(subPath.charAt(k)!='@'){throw"Invalid index in xpath: "+path;return null;}else{index=-1;}}else{this.parseIndexStripped=subPath;}
return index;},selectSingleNode:function(path,startAt,tryCreate){if(this.doc==null){throw"loadXml not called, nor document passed to object";}
if(path.length==0)
return null;if(startAt==null)startAt=this.doc
if(path.charAt(0)=='/'){startAt=this.doc;path=path.substr(1,path.length-1);}
var pathArr=path.split("/");var thisNode=startAt;var nodeToSeek,condition;for(var i=0;i<pathArr.length;i++){var subPath=pathArr[i];nodeToSeek=subPath;var condition=null;var re=/([^\[]*)\[([^\]]*)\]/;var conditional=subPath.match(re);if(conditional){nodeToSeek=conditional[1];condition=new Array();if(conditional[2].indexOf("=")>0){var expr=conditional[2].split("=");condition["node-name"]=expr[0];condition["equals"]=expr[1].substr(1,expr[1].length-2);}else{var digitsOnly=/^\d+$/;if(conditional[2].match(digitsOnly)){condition["index"]=parseInt(conditional[2]);}else{condition["node-name"]=conditional[2];}}}
var children;if(nodeToSeek.charAt(0)=="@"){children=thisNode.attributes;}else{children=thisNode.childNodes;}
var matchedNode=null;var matchIndex=0;for(var j=0;j<children.length;j++){if(((children[j].nodeType==1)&&(children[j].nodeName==nodeToSeek))||((children[j].nodeType==2)&&("@"+children[j].nodeName==nodeToSeek))){if(condition){if(condition["index"]&&(++matchIndex==condition["index"])){matchedNode=children[j];break;}
if(condition["node-name"]){var prepend="";var childNodes=children[j].childNodes;if(condition["node-name"].substr(0,1)=="@"){childNodes=children[j].attributes;prepend="@";}
for(var k=0;k<childNodes.length;k++){var n=childNodes[k];if(prepend+n.nodeName==condition["node-name"]){if(((condition["equals"])&&(n.nodeValue==condition["equals"]))||(!condition["equals"])){matchedNode=children[j];break;}}}}}else{matchedNode=children[j];break;}}else if((children[j].nodeType==3)&&(nodeToSeek=="#text")){matchedNode=children[j];break;}}
if(!matchedNode){if(!tryCreate){return null;}
if(nodeToSeek.charAt(0)=="@"){matchedNode=this.doc.createAttribute(nodeToSeek.substr(1));thisNode.setAttributeNode(matchedNode);}else{matchedNode=this.doc.createElement(nodeToSeek);thisNode.appendChild(matchedNode);if(condition&&condition["node-name"]&&condition["equals"]&&(condition["node-name"].charAt(0)=="@")){matchedNode.setAttribute(condition["node-name"].substr(1),condition["equals"]);}}}
thisNode=matchedNode;}
return matchedNode;},selectNodes:function(path,startAt){if(this.doc==null){throw"loadXml not called, nor document passed to object";}
if(path.length==0)
return null;if(startAt==null)startAt=this.doc
if(path.charAt(0)=='/'){startAt=this.doc;path=path.substr(1,path.length-1);}
var pathArr=path.split("/");var found=[startAt];for(var i=0;i<pathArr.length;i++){var subPath=pathArr[i];var index=this._parseIndex(subPath);subPath=this.parseIndexStripped;var foundChildren=new Array()
for(var j=0;j<found.length;j++){foundChildren[j]=found[j].childNodes;}
found=new Array();var matchIndex=0;for(var j=0;j<foundChildren.length;j++){for(var k=0;k<foundChildren[j].length;k++){if(((foundChildren[j][k].nodeType==1)&&(subPath=="*"||(foundChildren[j][k].nodeName==subPath)))||((foundChildren[j][k].nodeType==3)&&(subPath=="#text"))){if(index==-1){found[found.length]=foundChildren[j][k];}else if(++matchIndex==index){found[found.length]=foundChildren[j][k];break;}}}}
if(found.length==0){break;}}
return found;}}