var whitespace="\n\r\t ";var quotes="\"'";function convertEscapes(str){var gt;gt=-1;while(str.indexOf("&lt;",gt+1)>-1){var gt=str.indexOf("&lt;",gt+1);var newStr=str.substr(0,gt);newStr+="<";newStr=newStr+str.substr(gt+4,str.length);str=newStr;}
gt=-1;while(str.indexOf("&gt;",gt+1)>-1){var gt=str.indexOf("&gt;",gt+1);var newStr=str.substr(0,gt);newStr+=">";newStr=newStr+str.substr(gt+4,str.length);str=newStr;}
gt=-1;while(str.indexOf("&amp;",gt+1)>-1){var gt=str.indexOf("&amp;",gt+1);var newStr=str.substr(0,gt);newStr+="&";newStr=newStr+str.substr(gt+5,str.length);str=newStr;}
return str;}
function convertToEscapes(str){var gt=-1;while(str.indexOf("&",gt+1)>-1){gt=str.indexOf("&",gt+1);var newStr=str.substr(0,gt);newStr+="&amp;";newStr=newStr+str.substr(gt+1,str.length);str=newStr;}
gt=-1;while(str.indexOf("<",gt+1)>-1){var gt=str.indexOf("<",gt+1);var newStr=str.substr(0,gt);newStr+="&lt;";newStr=newStr+str.substr(gt+1,str.length);str=newStr;}
gt=-1;while(str.indexOf(">",gt+1)>-1){var gt=str.indexOf(">",gt+1);var newStr=str.substr(0,gt);newStr+="&gt;";newStr=newStr+str.substr(gt+1,str.length);str=newStr;}
return str;}
function _displayElement(domElement,strRet){if(domElement==null){return;}
if(!(domElement.nodeType=='ELEMENT')){return;}
var tagName=domElement.tagName;var tagInfo="";tagInfo="<"+tagName;var attributeList=domElement.getAttributeNames();for(var intLoop=0;intLoop<attributeList.length;intLoop++){var attribute=attributeList[intLoop];tagInfo=tagInfo+" "+attribute+"=";tagInfo=tagInfo+"\""+domElement.getAttribute(attribute)+"\"";}
tagInfo=tagInfo+">";strRet=strRet+tagInfo;if(domElement.children!=null){var domElements=domElement.children;for(var intLoop=0;intLoop<domElements.length;intLoop++){var childNode=domElements[intLoop];if(childNode.nodeType=='COMMENT'){strRet=strRet+"<!--"+childNode.content+"-->";}
else if(childNode.nodeType=='TEXT'){var cont=trim(childNode.content,true,true);strRet=strRet+childNode.content;}
else if(childNode.nodeType=='CDATA'){var cont=trim(childNode.content,true,true);strRet=strRet+"<![CDATA["+cont+"]]>";}
else{strRet=_displayElement(childNode,strRet);}}}
strRet=strRet+"</"+tagName+">";return strRet;}
function firstWhiteChar(str,pos){if(isEmpty(str)){return-1;}
while(pos<str.length){if(whitespace.indexOf(str.charAt(pos))!=-1){return pos;}
else{pos++;}}
return str.length;}
function isEmpty(str){return(str==null)||(str.length==0);}
function trim(trimString,leftTrim,rightTrim){if(isEmpty(trimString)){return "";}
if(leftTrim==null){leftTrim=true;}
if(rightTrim==null){rightTrim=true;}
var left=0;var right=0;var i=0;var k=0;if(leftTrim==true){while((i<trimString.length)&&(whitespace.indexOf(trimString.charAt(i++))!=-1)){left++;}}
if(rightTrim==true){k=trimString.length-1;while((k>=left)&&(whitespace.indexOf(trimString.charAt(k--))!=-1)){right++;}}
return trimString.substring(left,trimString.length-right);}
function XMLDoc(source,errFn){this.topNode=null;this.errFn=errFn;this.createXMLNode=_XMLDoc_createXMLNode;this.error=_XMLDoc_error;this.getUnderlyingXMLText=_XMLDoc_getUnderlyingXMLText;this.handleNode=_XMLDoc_handleNode;this.hasErrors=false;this.insertNodeAfter=_XMLDoc_insertNodeAfter;this.insertNodeInto=_XMLDoc_insertNodeInto;this.loadXML=_XMLDoc_loadXML;this.parse=_XMLDoc_parse;this.parseAttribute=_XMLDoc_parseAttribute;this.parseDTD=_XMLDoc_parseDTD;this.parsePI=_XMLDoc_parsePI;this.parseTag=_XMLDoc_parseTag;this.removeNodeFromTree=_XMLDoc_removeNodeFromTree;this.replaceNodeContents=_XMLDoc_replaceNodeContents;this.selectNode=_XMLDoc_selectNode;this.selectNodeText=_XMLDoc_selectNodeText;this.source=source;if(this.parse()){if(this.topNode!=null){return this.error("expected close "+this.topNode.tagName);}
else{return true;}}}
function _XMLDoc_createXMLNode(strXML){return new XMLDoc(strXML,this.errFn).docNode;}
function _XMLDoc_error(str){this.hasErrors=true;if(this.errFn){this.errFn("ERROR: "+str);}else if(this.onerror){this.onerror("ERROR: "+str);}
return 0;}
function _XMLDoc_getTagNameParams(tag,obj){var elm=-1,e,s=tag.indexOf('[');var attr=[];if(s>=0){e=tag.indexOf(']');if(e>=0)elm=tag.substr(s+1,(e-s)-1);else obj.error('expected ] near '+tag);tag=tag.substr(0,s);if(isNaN(elm)&&elm!='*'){attr=elm.substr(1,elm.length-1);attr=attr.split('=');if(attr[1]){s=attr[1].indexOf('"');attr[1]=attr[1].substr(s+1,attr[1].length-1);e=attr[1].indexOf('"');if(e>=0)attr[1]=attr[1].substr(0,e);else obj.error('expected " near '+tag)};elm=-1;}else if(elm=='*')elm=-1;}
return[tag,elm,attr[0],attr[1]]}
function _XMLDoc_getUnderlyingXMLText(){var strRet="";strRet=strRet+"<?xml version=\"1.0\"?>";if(this.docNode==null){return;}
strRet=_displayElement(this.docNode,strRet);return strRet;}
function _XMLDoc_handleNode(current){if((current.nodeType=='COMMENT')&&(this.topNode!=null)){return this.topNode.addElement(current);}
else if((current.nodeType=='TEXT')||(current.nodeType=='CDATA')){if(this.topNode==null){if(trim(current.content,true,false)==""){return true;}
else{return this.error("expected document node, found: "+current);}}
else{return this.topNode.addElement(current);}}
else if((current.nodeType=='OPEN')||(current.nodeType=='SINGLE')){var success=false;if(this.topNode==null){this.docNode=current;current.parent=null;success=true;}
else{success=this.topNode.addElement(current);}
if(success&&(current.nodeType!='SINGLE')){this.topNode=current;}
current.nodeType="ELEMENT";return success;}
else if(current.nodeType=='CLOSE'){if(this.topNode==null){return this.error("close tag without open: "+current.toString());}
else{if(current.tagName!=this.topNode.tagName){return this.error("expected closing "+this.topNode.tagName+", found closing "+current.tagName);}
else{this.topNode=this.topNode.getParent();}}}
return true;}
function _XMLDoc_insertNodeAfter(referenceNode,newNode){var parentXMLText=this.getUnderlyingXMLText();var selectedNodeXMLText=referenceNode.getUnderlyingXMLText();var originalNodePos=parentXMLText.indexOf(selectedNodeXMLText)+selectedNodeXMLText.length;var newXML=parentXMLText.substr(0,originalNodePos);newXML+=newNode.getUnderlyingXMLText();newXML+=parentXMLText.substr(originalNodePos);var newDoc=new XMLDoc(newXML,this.errFn);return newDoc;}
function _XMLDoc_insertNodeInto(referenceNode,insertNode){var parentXMLText=this.getUnderlyingXMLText();var selectedNodeXMLText=referenceNode.getUnderlyingXMLText();var endFirstTag=selectedNodeXMLText.indexOf(">")+1;var originalNodePos=parentXMLText.indexOf(selectedNodeXMLText)+endFirstTag;var newXML=parentXMLText.substr(0,originalNodePos);newXML+=insertNode.getUnderlyingXMLText();newXML+=parentXMLText.substr(originalNodePos);var newDoc=new XMLDoc(newXML,this.errFn);return newDoc;}
function _XMLDoc_loadXML(source){this.topNode=null;this.hasErrors=false;this.source=source;return this.parse();}
function _XMLDoc_parse(){var pos=0;err=false;while(!err){var closing_tag_prefix='';var chpos=this.source.indexOf('<',pos);var open_length=1;var open;var close;if(chpos==-1){break;}
open=chpos;var str=this.source.substring(pos,open);if(str.length!=0){err=!this.handleNode(new XMLNode('TEXT',this,str));}
if(chpos==this.source.indexOf("<?",pos)){pos=this.parsePI(this.source,pos+2);if(pos==0){err=true;}
continue;}
if(chpos==this.source.indexOf("<!DOCTYPE",pos)){pos=this.parseDTD(this.source,chpos+9);if(pos==0){err=true;}
continue;}
if(chpos==this.source.indexOf('<!--',pos)){open_length=4;closing_tag_prefix='--';}
if(chpos==this.source.indexOf('<![CDATA[',pos)){open_length=9;closing_tag_prefix=']]';}
chpos=this.source.indexOf(closing_tag_prefix+'>',chpos);if(chpos==-1){return this.error("expected closing tag sequence: "+closing_tag_prefix+'>');}
close=chpos+closing_tag_prefix.length;str=this.source.substring(open+1,close);var n=this.parseTag(str);if(n){err=!this.handleNode(n);}
pos=close+1;}
return!err;}
function _XMLDoc_parseAttribute(src,pos,node){while((pos<src.length)&&(whitespace.indexOf(src.charAt(pos))!=-1)){pos++;}
if(pos>=src.length){return pos;}
var p1=pos;while((pos<src.length)&&(src.charAt(pos)!='=')){pos++;}
var msg="attributes must have values";if(pos>=src.length){return this.error(msg);}
var paramname=trim(src.substring(p1,pos++),false,true);while((pos<src.length)&&(whitespace.indexOf(src.charAt(pos))!=-1)){pos++;}
if(pos>=src.length){return this.error(msg);}
msg="attribute values must be in quotes";var quote=src.charAt(pos++);if(quotes.indexOf(quote)==-1){return this.error(msg);}
p1=pos;while((pos<src.length)&&(src.charAt(pos)!=quote)){pos++;}
if(pos>=src.length){return this.error(msg);}
if(!node.addAttribute(paramname,trim(src.substring(p1,pos++),false,true))){return 0;}
return pos;}
function _XMLDoc_parseDTD(str,pos){var firstClose=str.indexOf('>',pos);if(firstClose==-1){return this.error("error in DTD: expected '>'");}
var closing_tag_prefix='';var firstOpenSquare=str.indexOf('[',pos);if((firstOpenSquare!=-1)&&(firstOpenSquare<firstClose)){closing_tag_prefix=']';}
while(true){var closepos=str.indexOf(closing_tag_prefix+'>',pos);if(closepos==-1){return this.error("expected closing tag sequence: "+closing_tag_prefix+'>');}
pos=closepos+closing_tag_prefix.length+1;if(str.substring(closepos-1,closepos+2)!=']]>'){break;}}
return pos;}
function _XMLDoc_parsePI(str,pos){var closepos=str.indexOf('?>',pos);return closepos+2;}
function _XMLDoc_parseTag(src){if(src.indexOf('!--')==0){return new XMLNode('COMMENT',this,src.substring(3,src.length-2));}
if(src.indexOf('![CDATA[')==0){return new XMLNode('CDATA',this,src.substring(8,src.length-2));}
var n=new XMLNode();n.doc=this;if(src.charAt(0)=='/'){n.nodeType='CLOSE';src=src.substring(1);}
else{n.nodeType='OPEN';}
if(src.charAt(src.length-1)=='/'){if(n.nodeType=='CLOSE'){return this.error("singleton close tag");}
else{n.nodeType='SINGLE';}
src=src.substring(0,src.length-1);}
if(n.nodeType!='CLOSE'){n.attributes=new Array();}
if(n.nodeType=='OPEN'){n.children=new Array();}
src=trim(src,true,true);if(src.length==0){return this.error("empty tag");}
var endOfName=firstWhiteChar(src,0);if(endOfName==-1){n.tagName=src;return n;}
n.tagName=src.substring(0,endOfName);var pos=endOfName;while(pos<src.length){pos=this.parseAttribute(src,pos,n);if(this.pos==0){return null;}}
return n;}
function _XMLDoc_removeNodeFromTree(node){var parentXMLText=this.getUnderlyingXMLText();var selectedNodeXMLText=node.getUnderlyingXMLText();var originalNodePos=parentXMLText.indexOf(selectedNodeXMLText);var newXML=parentXMLText.substr(0,originalNodePos);newXML+=parentXMLText.substr(originalNodePos+selectedNodeXMLText.length);var newDoc=new XMLDoc(newXML,this.errFn);return newDoc;}
function _XMLDoc_replaceNodeContents(referenceNode,newContents){var newNode=this.createXMLNode("<X>"+newContents+"</X>");referenceNode.children=newNode.children;return this;}
function _XMLDoc_selectNode(tagpath){tagpath=trim(tagpath,true,true);var srcnode,node,tag,params,elm,rg;var tags,attrName,attrValue,ok;srcnode=node=((this.source)?this.docNode:this);if(!tagpath)return node;if(tagpath.indexOf('/')==0)tagpath=tagpath.substr(1);tagpath=tagpath.replace(tag,'');tags=tagpath.split('/');tag=tags[0];if(tag){if(tagpath.indexOf('/')==0)tagpath=tagpath.substr(1);tagpath=tagpath.replace(tag,'');params=_XMLDoc_getTagNameParams(tag,this);tag=params[0];elm=params[1];attrName=params[2];attrValue=params[3];node=(tag=='*')?node.getElements():node.getElements(tag);if(node.length){if(elm<0){srcnode=node;var i=0;while(i<srcnode.length){if(attrName){if(srcnode[i].getAttribute(attrName)!=attrValue)ok=false;else ok=true;}else ok=true;if(ok){node=srcnode[i].selectNode(tagpath);if(node)return node;}
i++;}}else if(elm<node.length){node=node[elm].selectNode(tagpath);if(node)return node;}}}}
function _XMLDoc_selectNodeText(tagpath){var node=this.selectNode(tagpath);if(node!=null){return node.getText();}
else{return null;}}
function XMLNode(nodeType,doc,str){if(nodeType=='TEXT'||nodeType=='CDATA'||nodeType=='COMMENT'){this.content=str;}
else{this.content=null;}
this.attributes=null;this.children=null;this.doc=doc;this.nodeType=nodeType;this.parent="";this.tagName="";this.addAttribute=_XMLNode_addAttribute;this.addElement=_XMLNode_addElement;this.getAttribute=_XMLNode_getAttribute;this.getAttributeNames=_XMLNode_getAttributeNames;this.getElementById=_XMLNode_getElementById;this.getElements=_XMLNode_getElements;this.getText=_XMLNode_getText;this.getParent=_XMLNode_getParent;this.getUnderlyingXMLText=_XMLNode_getUnderlyingXMLText;this.removeAttribute=_XMLNode_removeAttribute;this.selectNode=_XMLDoc_selectNode;this.selectNodeText=_XMLDoc_selectNodeText;this.toString=_XMLNode_toString;}
function _XMLNode_addAttribute(attributeName,attributeValue){this.attributes['_'+attributeName]=attributeValue;return true;}
function _XMLNode_addElement(node){node.parent=this;this.children[this.children.length]=node;return true;}
function _XMLNode_getAttribute(name){if(this.attributes==null){return null;}
return this.attributes['_'+name];}
function _XMLNode_getAttributeNames(){if(this.attributes==null){var ret=new Array();return ret;}
var attlist=new Array();for(var a in this.attributes){attlist[attlist.length]=a.substring(1);}
return attlist;}
function _XMLNode_getElementById(id){var node=this;var ret;if(node.getAttribute("id")==id){return node;}
else{var elements=node.getElements();var intLoop=0;while(intLoop<elements.length){var element=elements[intLoop];ret=element.getElementById(id);if(ret!=null){break;}
intLoop++;}}
return ret;}
function _XMLNode_getElements(byName){if(this.children==null){var ret=new Array();return ret;}
var elements=new Array();for(var i=0;i<this.children.length;i++){if((this.children[i].nodeType=='ELEMENT')&&((byName==null)||(this.children[i].tagName==byName))){elements[elements.length]=this.children[i];}}
return elements;}
function _XMLNode_getText(){if(this.nodeType=='ELEMENT'){if(this.children==null){return null;}
var str="";for(var i=0;i<this.children.length;i++){var t=this.children[i].getText();str+=(t==null?"":t);}
return str;}
else if(this.nodeType=='TEXT'){return convertEscapes(this.content);}
else{return this.content;}}
function _XMLNode_getParent(){return this.parent;}
function _XMLNode_getUnderlyingXMLText(){var strRet="";strRet=_displayElement(this,strRet);return strRet;}
function _XMLNode_removeAttribute(attributeName){if(attributeName==null){return this.doc.error("You must pass an attribute name into the removeAttribute function");}
var attributes=this.getAttributeNames();var intCount=attributes.length;var tmpAttributeValues=new Array();for(intLoop=0;intLoop<intCount;intLoop++){tmpAttributeValues[intLoop]=this.getAttribute(attributes[intLoop]);}
this.attributes=new Array();for(intLoop=0;intLoop<intCount;intLoop++){if(attributes[intLoop]!=attributeName){this.addAttribute(attributes[intLoop],tmpAttributeValues[intLoop]);}}
return true;}
function _XMLNode_toString(){return ""+this.nodeType+":"+(this.nodeType=='TEXT'||this.nodeType=='CDATA'||this.nodeType=='COMMENT'?this.content:this.tagName);}