| 1 | 
 ////////////////////////////////////////////////////////// | 
 
 
 
 
 
 | 2 | 
 ////////// JSXML XML Tools                    //////////// | 
 
 
 
 
 
 | 3 | 
 ////////// Ver 1.3 Aug 29 2009                //////////// | 
 
 
 
 
 
 | 4 | 
 ////////// Copyright 2000-2009 Peter Tracey   //////////// | 
 
 
 
 
 
 | 5 | 
 ////////// http://levelthreesoltions.com/jsxml/ | 
 
 
 
 
 
 | 6 | 
 //// | 
 
 
 
 
 
 | 7 | 
 ////    Objects: | 
 
 
 
 
 
 | 8 | 
 //// | 
 
 
 
 
 
 | 9 | 
 ////    REXML | 
 
 
 
 
 
 | 10 | 
 ////    Regular Expression-based XML parser | 
 
 
 
 
 
 | 11 | 
 //// | 
 
 
 
 
 
 | 12 | 
 ////    JSXMLIterator | 
 
 
 
 
 
 | 13 | 
 ////    Iterates through the tree structure without recursion | 
 
 
 
 
 
 | 14 | 
 //// | 
 
 
 
 
 
 | 15 | 
 ////    JSXMLBuilder | 
 
 
 
 
 
 | 16 | 
 ////    Loads xml into a linear structure and provides  | 
 
 
 
 
 
 | 17 | 
 ////    interface for adding and removing elements  | 
 
 
 
 
 
 | 18 | 
 ////    and setting attributes, generates XML | 
 
 
 
 
 
 | 19 | 
 //// | 
 
 
 
 
 
 | 20 | 
 ////    Utility functions: | 
 
 
 
 
 
 | 21 | 
 //// | 
 
 
 
 
 
 | 22 | 
 ////    ParseAttribute | 
 
 
 
 
 
 | 23 | 
 ////    Takes string of attibutes and attribute name | 
 
 
 
 
 
 | 24 | 
 ////    Returns attribute value | 
 
 
 
 
 
 | 25 | 
 //// | 
 
 
 
 
 
 | 26 | 
 ////    Array_Remove | 
 
 
 
 
 
 | 27 | 
 ////    Removes element in array | 
 
 
 
 
 
 | 28 | 
 //// | 
 
 
 
 
 
 | 29 | 
 ////    Array_Add | 
 
 
 
 
 
 | 30 | 
 ////    Adds element to array | 
 
 
 
 
 
 | 31 | 
 //// | 
 
 
 
 
 
 | 32 | 
 ////    RepeatChar | 
 
 
 
 
 
 | 33 | 
 ////    Repeats string specified number of times | 
 
 
 
 
 
 | 34 | 
 //// | 
 
 
 
 
 
 | 35 | 
 /////////////////////////////////////////////////////////////// | 
 
 
 
 
 
 | 36 | 
  | 
 
 
 
 
 
 | 37 | 
  | 
 
 
 
 
 
 | 38 | 
 function REXML(XML) { | 
 
 
 
 
 
 | 39 | 
         this.XML = XML; | 
 
 
 
 
 
 | 40 | 
  | 
 
 
 
 
 
 | 41 | 
         this.rootElement = null; | 
 
 
 
 
 
 | 42 | 
  | 
 
 
 
 
 
 | 43 | 
         this.parse = REXML_parse; | 
 
 
 
 
 
 | 44 | 
         if (this.XML && this.XML !== "") this.parse(); | 
 
 
 
 
 
 | 45 | 
 } | 
 
 
 
 
 
 | 46 | 
  | 
 
 
 
 
 
 | 47 | 
         function REXML_parse() { | 
 
 
 
 
 
 | 48 | 
                 var reTag = new RegExp("<([^>/ ]*)([^>]*)>","g"); // matches that tag name $1 and attribute string $2 | 
 
 
 
 
 
 | 49 | 
                 var reTagText = new RegExp("<([^>/ ]*)([^>]*)>([^<]*)","g"); // matches tag name $1, attribute string $2, and text $3 | 
 
 
 
 
 
 | 50 | 
                 var strType = ""; | 
 
 
 
 
 
 | 51 | 
                 var strTag = ""; | 
 
 
 
 
 
 | 52 | 
                 var strText = ""; | 
 
 
 
 
 
 | 53 | 
                 var strAttributes = ""; | 
 
 
 
 
 
 | 54 | 
                 var strOpen = ""; | 
 
 
 
 
 
 | 55 | 
                 var strClose = ""; | 
 
 
 
 
 
 | 56 | 
                 var iElements = 0; | 
 
 
 
 
 
 | 57 | 
                 var xmleLastElement = null; | 
 
 
 
 
 
 | 58 | 
                 if (this.XML.length === 0) return; | 
 
 
 
 
 
 | 59 | 
                 var arrElementsUnparsed = this.XML.match(reTag); | 
 
 
 
 
 
 | 60 | 
                 var arrElementsUnparsedText = this.XML.match(reTagText); | 
 
 
 
 
 
 | 61 | 
                 var i=0; | 
 
 
 
 
 
 | 62 | 
                 if (arrElementsUnparsed[0].replace(reTag, "$1") == "?xml") i++; | 
 
 
 
 
 
 | 63 | 
  | 
 
 
 
 
 
 | 64 | 
                 for (; i<arrElementsUnparsed.length; i++) { | 
 
 
 
 
 
 | 65 | 
                         strTag = arrElementsUnparsed[i].replace(reTag,"$1"); | 
 
 
 
 
 
 | 66 | 
                         strAttributes = arrElementsUnparsed[i].replace(reTag,"$2"); | 
 
 
 
 
 
 | 67 | 
                         strText = arrElementsUnparsedText[i].replace(reTagText,"$3").replace(/[\r\n\t ]+/g, " "); // remove white space | 
 
 
 
 
 
 | 68 | 
                         strClose = ""; | 
 
 
 
 
 
 | 69 | 
                         if (strTag.indexOf("![CDATA[") === 0) { | 
 
 
 
 
 
 | 70 | 
                                 strOpen = "<![CDATA["; | 
 
 
 
 
 
 | 71 | 
                                 strClose = "]]>"; | 
 
 
 
 
 
 | 72 | 
                                 strType = "cdata"; | 
 
 
 
 
 
 | 73 | 
                         } else if (strTag.indexOf("!--") === 0) { | 
 
 
 
 
 
 | 74 | 
                                 strOpen = "<!--"; | 
 
 
 
 
 
 | 75 | 
                                 strClose = "-->"; | 
 
 
 
 
 
 | 76 | 
                                 strType = "comment"; | 
 
 
 
 
 
 | 77 | 
                         } else if (strTag.indexOf("?") === 0) { | 
 
 
 
 
 
 | 78 | 
                                 strOpen = "<?"; | 
 
 
 
 
 
 | 79 | 
                                 strClose = "?>"; | 
 
 
 
 
 
 | 80 | 
                                 strType = "pi"; | 
 
 
 
 
 
 | 81 | 
                         } else strType = "element"; | 
 
 
 
 
 
 | 82 | 
                         if (strClose !== "") { | 
 
 
 
 
 
 | 83 | 
                                 strText = ""; | 
 
 
 
 
 
 | 84 | 
                                 if (arrElementsUnparsedText[i].indexOf(strClose) > -1) strText = arrElementsUnparsedText[i]; | 
 
 
 
 
 
 | 85 | 
                                 else { | 
 
 
 
 
 
 | 86 | 
                                         for (; i<arrElementsUnparsed.length && arrElementsUnparsedText[i].indexOf(strClose) == -1; i++) { | 
 
 
 
 
 
 | 87 | 
                                                 strText += arrElementsUnparsedText[i]; | 
 
 
 
 
 
 | 88 | 
                                         } | 
 
 
 
 
 
 | 89 | 
                                         strText += arrElementsUnparsedText[i]; | 
 
 
 
 
 
 | 90 | 
                                 } | 
 
 
 
 
 
 | 91 | 
                                 if (strText.substring(strOpen.length, strText.indexOf(strClose)) !== "")        { | 
 
 
 
 
 
 | 92 | 
                                         xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement(strType, "","",xmleLastElement,strText.substring(strOpen.length, strText.indexOf(strClose))); | 
 
 
 
 
 
 | 93 | 
                                         if (strType == "cdata") xmleLastElement.text += strText.substring(strOpen.length, strText.indexOf(strClose)); | 
 
 
 
 
 
 | 94 | 
                                 } | 
 
 
 
 
 
 | 95 | 
                                 if (strText.indexOf(strClose)+ strClose.length < strText.length) { | 
 
 
 
 
 
 | 96 | 
                                         xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText.substring(strText.indexOf(strClose)+ strClose.length, strText.length)); | 
 
 
 
 
 
 | 97 | 
                                         if (strType == "cdata") xmleLastElement.text += strText.substring(strText.indexOf(strClose)+ strClose.length, strText.length); | 
 
 
 
 
 
 | 98 | 
                                 } | 
 
 
 
 
 
 | 99 | 
                                 continue; | 
 
 
 
 
 
 | 100 | 
                         } | 
 
 
 
 
 
 | 101 | 
                         if (strText.replace(/ */, "") === "") strText = ""; | 
 
 
 
 
 
 | 102 | 
                         if (arrElementsUnparsed[i].substring(1,2) != "/") { | 
 
 
 
 
 
 | 103 | 
                                 if (iElements === 0) { | 
 
 
 
 
 
 | 104 | 
                                         xmleLastElement = this.rootElement = new REXML_XMLElement(strType, strTag,strAttributes,null,strText); | 
 
 
 
 
 
 | 105 | 
                                         iElements++; | 
 
 
 
 
 
 | 106 | 
                                         if (strText !== "") xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText); | 
 
 
 
 
 
 | 107 | 
                                 } else if (arrElementsUnparsed[i].substring(arrElementsUnparsed[i].length-2,arrElementsUnparsed[i].length-1) != "/") { | 
 
 
 
 
 
 | 108 | 
                                         xmleLastElement = xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement(strType, strTag,strAttributes,xmleLastElement,""); | 
 
 
 
 
 
 | 109 | 
                                         iElements++; | 
 
 
 
 
 
 | 110 | 
                                         if (strText !== "") { | 
 
 
 
 
 
 | 111 | 
                                                 xmleLastElement.text += strText; | 
 
 
 
 
 
 | 112 | 
                                                 xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText); | 
 
 
 
 
 
 | 113 | 
                                         } | 
 
 
 
 
 
 | 114 | 
                                 } else { | 
 
 
 
 
 
 | 115 | 
                                         xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement(strType, strTag,strAttributes,xmleLastElement,strText); | 
 
 
 
 
 
 | 116 | 
                                         if (strText !== "") xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText); | 
 
 
 
 
 
 | 117 | 
                                 } | 
 
 
 
 
 
 | 118 | 
                         } else { | 
 
 
 
 
 
 | 119 | 
                                 xmleLastElement = xmleLastElement.parentElement; | 
 
 
 
 
 
 | 120 | 
                                 iElements--; | 
 
 
 
 
 
 | 121 | 
                                 if (xmleLastElement && strText !== "") { | 
 
 
 
 
 
 | 122 | 
                                         xmleLastElement.text += strText; | 
 
 
 
 
 
 | 123 | 
                                         xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText); | 
 
 
 
 
 
 | 124 | 
                                 } | 
 
 
 
 
 
 | 125 | 
                         } | 
 
 
 
 
 
 | 126 | 
                 } | 
 
 
 
 
 
 | 127 | 
         } | 
 
 
 
 
 
 | 128 | 
  | 
 
 
 
 
 
 | 129 | 
         function REXML_XMLElement(strType, strName, strAttributes, xmlParent, strText) { | 
 
 
 
 
 
 | 130 | 
                 this.type = strType; | 
 
 
 
 
 
 | 131 | 
                 this.name = strName; | 
 
 
 
 
 
 | 132 | 
                 this.attributeString = strAttributes; | 
 
 
 
 
 
 | 133 | 
                 this.attributes = null; | 
 
 
 
 
 
 | 134 | 
                 this.childElements = []; | 
 
 
 
 
 
 | 135 | 
                 this.parentElement = xmlParent; | 
 
 
 
 
 
 | 136 | 
                 this.text = strText; // text of element | 
 
 
 
 
 
 | 137 | 
  | 
 
 
 
 
 
 | 138 | 
                 this.getText = REXML_XMLElement_getText; // text of element and child elements | 
 
 
 
 
 
 | 139 | 
                 this.childElement = REXML_XMLElement_childElement; | 
 
 
 
 
 
 | 140 | 
                 this.attribute = REXML_XMLElement_attribute; | 
 
 
 
 
 
 | 141 | 
         } | 
 
 
 
 
 
 | 142 | 
  | 
 
 
 
 
 
 | 143 | 
                 function REXML_XMLElement_getText() { | 
 
 
 
 
 
 | 144 | 
                         if (this.type == "text" || this.type == "cdata") { | 
 
 
 
 
 
 | 145 | 
                                 return this.text; | 
 
 
 
 
 
 | 146 | 
                         } else if (this.childElements.length) { | 
 
 
 
 
 
 | 147 | 
                                 var L = ""; | 
 
 
 
 
 
 | 148 | 
                                 for (var i=0; i<this.childElements.length; i++) { | 
 
 
 
 
 
 | 149 | 
                                         L += this.childElements[i].getText(); | 
 
 
 
 
 
 | 150 | 
                                 } | 
 
 
 
 
 
 | 151 | 
                                 return L; | 
 
 
 
 
 
 | 152 | 
                         } else return ""; | 
 
 
 
 
 
 | 153 | 
                 } | 
 
 
 
 
 
 | 154 | 
                  | 
 
 
 
 
 
 | 155 | 
                 function REXML_XMLElement_childElement(strElementName) { | 
 
 
 
 
 
 | 156 | 
                         for (var i=0; i<this.childElements.length; i++) if (this.childElements[i].name == strElementName) return this.childElements[i]; | 
 
 
 
 
 
 | 157 | 
                         return null; | 
 
 
 
 
 
 | 158 | 
                 } | 
 
 
 
 
 
 | 159 | 
  | 
 
 
 
 
 
 | 160 | 
                 function REXML_XMLElement_attribute(strAttributeName) { | 
 
 
 
 
 
 | 161 | 
                         if (!this.attributes) { | 
 
 
 
 
 
 | 162 | 
                                 var reAttributes = new RegExp(" ([^= ]*)=","g"); // matches attributes | 
 
 
 
 
 
 | 163 | 
                                 if (this.attributeString.match(reAttributes) && this.attributeString.match(reAttributes).length) { | 
 
 
 
 
 
 | 164 | 
                                         var arrAttributes = this.attributeString.match(reAttributes); | 
 
 
 
 
 
 | 165 | 
                                         if (!arrAttributes.length) arrAttributes = null; | 
 
 
 
 
 
 | 166 | 
                                         else for (var j=0; j<arrAttributes.length; j++) { | 
 
 
 
 
 
 | 167 | 
                                                 arrAttributes[j] = new Array( | 
 
 
 
 
 
 | 168 | 
                                                         (arrAttributes[j]+"").replace(/[= ]/g,""), | 
 
 
 
 
 
 | 169 | 
                                                         ParseAttribute(this.attributeString, (arrAttributes[j]+"").replace(/[= ]/g,"")) | 
 
 
 
 
 
 | 170 | 
                                                                                 ); | 
 
 
 
 
 
 | 171 | 
                                         } | 
 
 
 
 
 
 | 172 | 
                                         this.attributes = arrAttributes; | 
 
 
 
 
 
 | 173 | 
                                 } | 
 
 
 
 
 
 | 174 | 
                         } | 
 
 
 
 
 
 | 175 | 
                         if (this.attributes) for (var i=0; i<this.attributes.length; i++) if (this.attributes[i][0] == strAttributeName) return this.attributes[i][1]; | 
 
 
 
 
 
 | 176 | 
                         return ""; | 
 
 
 
 
 
 | 177 | 
                 } | 
 
 
 
 
 
 | 178 | 
  | 
 
 
 
 
 
 | 179 | 
  | 
 
 
 
 
 
 | 180 | 
 function JSXMLBuilder() { | 
 
 
 
 
 
 | 181 | 
         this.XML = ""; | 
 
 
 
 
 
 | 182 | 
         this.elements = []; | 
 
 
 
 
 
 | 183 | 
         Array.prototype.remove = Array_Remove; | 
 
 
 
 
 
 | 184 | 
         Array.prototype.add = Array_Add; | 
 
 
 
 
 
 | 185 | 
  | 
 
 
 
 
 
 | 186 | 
         this.load = JSXMLBuilder_load; | 
 
 
 
 
 
 | 187 | 
         this.element = JSXMLBuilder_element; | 
 
 
 
 
 
 | 188 | 
         this.addElementAt = JSXMLBuilder_addElementAt; | 
 
 
 
 
 
 | 189 | 
         this.insertElementAt = JSXMLBuilder_insertElementAt; | 
 
 
 
 
 
 | 190 | 
         this.removeElement = JSXMLBuilder_removeElement; | 
 
 
 
 
 
 | 191 | 
         this.generateXML = JSXMLBuilder_generateXML; | 
 
 
 
 
 
 | 192 | 
         this.moveElement = JSXMLBuilder_moveElement; | 
 
 
 
 
 
 | 193 | 
 } | 
 
 
 
 
 
 | 194 | 
  | 
 
 
 
 
 
 | 195 | 
         function JSXMLBuilder_load(strXML, xmleElem) { | 
 
 
 
 
 
 | 196 | 
                 this.XML = strXML; | 
 
 
 
 
 
 | 197 | 
  | 
 
 
 
 
 
 | 198 | 
                 if (!xmleElem) { | 
 
 
 
 
 
 | 199 | 
                         if (strXML.length) xmleElem = (new REXML(strXML)).rootElement; | 
 
 
 
 
 
 | 200 | 
                         else return false; | 
 
 
 
 
 
 | 201 | 
                 } | 
 
 
 
 
 
 | 202 | 
  | 
 
 
 
 
 
 | 203 | 
                 var xmlBuilder = new JSXMLIterator(xmleElem); | 
 
 
 
 
 
 | 204 | 
  | 
 
 
 
 
 
 | 205 | 
                 while (true) { | 
 
 
 
 
 
 | 206 | 
                         if (xmlBuilder.xmleElem.type == "element") { | 
 
 
 
 
 
 | 207 | 
                                 if (xmlBuilder.xmleElem.attributes) { | 
 
 
 
 
 
 | 208 | 
                                         this.addElementAt(xmlBuilder.xmleElem.name,xmlBuilder.xmleElem.attributes, xmlBuilder.xmleElem.text, this.elements.length, xmlBuilder.iElemLevel); | 
 
 
 
 
 
 | 209 | 
                                 } else {         | 
 
 
 
 
 
 | 210 | 
                                         this.addElementAt(xmlBuilder.xmleElem.name,xmlBuilder.xmleElem.attributeString, xmlBuilder.xmleElem.text, this.elements.length, xmlBuilder.iElemLevel); | 
 
 
 
 
 
 | 211 | 
                                 } | 
 
 
 
 
 
 | 212 | 
                         } | 
 
 
 
 
 
 | 213 | 
                         if (!xmlBuilder.getNextNode(false)) break; | 
 
 
 
 
 
 | 214 | 
                 } | 
 
 
 
 
 
 | 215 | 
                 for (var i=0; i<this.elements.length; i++) this.elements[i].index = i; | 
 
 
 
 
 
 | 216 | 
         } | 
 
 
 
 
 
 | 217 | 
  | 
 
 
 
 
 
 | 218 | 
         function JSXMLBuilder_element(iIndex) { | 
 
 
 
 
 
 | 219 | 
                 return this.elements[iIndex]; | 
 
 
 
 
 
 | 220 | 
         } | 
 
 
 
 
 
 | 221 | 
  | 
 
 
 
 
 
 | 222 | 
         function JSXMLBuilder_addElementAt(strElement,Attributes,strText,iElemIndex,iElemLevel) { | 
 
 
 
 
 
 | 223 | 
                 iElemIndex = parseInt(iElemIndex); | 
 
 
 
 
 
 | 224 | 
                 iElemLevel = parseInt(iElemLevel); | 
 
 
 
 
 
 | 225 | 
                 if (iElemIndex < 0 || typeof(iElemIndex) != "number" || isNaN(iElemIndex)) iElemIndex = (this.elements.length>0) ? this.elements.length-1 : 0; | 
 
 
 
 
 
 | 226 | 
                 if (iElemLevel < 0 || typeof(iElemLevel) != "number" || isNaN(iElemLevel)) iElemLevel = this.elements[iElemIndex-1].level; | 
 
 
 
 
 
 | 227 | 
                 if (!Attributes) Attributes = ""; | 
 
 
 
 
 
 | 228 | 
                 var Elem = []; | 
 
 
 
 
 
 | 229 | 
                 var iAddIndex = iElemIndex; | 
 
 
 
 
 
 | 230 | 
                 if (iElemIndex > 0) { | 
 
 
 
 
 
 | 231 | 
                         for (var i=iElemIndex; i<this.elements.length; i++) if (this.elements[i].level > iElemLevel) iAddIndex++; | 
 
 
 
 
 
 | 232 | 
                         else if (this.elements[i].level <= this.elements[iElemIndex].level) break; | 
 
 
 
 
 
 | 233 | 
                         Elem = new JSXMLBuilder_XMLElement(strElement,Attributes,strText,iElemLevel+1,this); | 
 
 
 
 
 
 | 234 | 
                 } else { | 
 
 
 
 
 
 | 235 | 
                         Elem = new JSXMLBuilder_XMLElement(strElement,Attributes,strText,1,this); | 
 
 
 
 
 
 | 236 | 
                 } | 
 
 
 
 
 
 | 237 | 
                 this.elements = this.elements.add(iAddIndex,Elem); | 
 
 
 
 
 
 | 238 | 
                 for (var i=iAddIndex; i<this.elements.length; i++) this.elements[i].index = i; | 
 
 
 
 
 
 | 239 | 
         } | 
 
 
 
 
 
 | 240 | 
  | 
 
 
 
 
 
 | 241 | 
         function JSXMLBuilder_insertElementAt(strElement,Attributes,strText,iElemIndex,iElemLevel) { | 
 
 
 
 
 
 | 242 | 
                 iElemIndex = parseInt(iElemIndex); | 
 
 
 
 
 
 | 243 | 
                 iElemLevel = parseInt(iElemLevel); | 
 
 
 
 
 
 | 244 | 
                 if (iElemIndex < 0 || typeof(iElemIndex) != "number" || isNaN(iElemIndex)) iElemIndex = (this.elements.length>0) ? this.elements.length-1 : 0; | 
 
 
 
 
 
 | 245 | 
                 if (iElemLevel < 0 || typeof(iElemLevel) != "number" || isNaN(iElemLevel)) iElemLevel = this.elements[iElemIndex-1].level; | 
 
 
 
 
 
 | 246 | 
                 if (!Attributes) Attributes = ""; | 
 
 
 
 
 
 | 247 | 
                 var Elem = null; | 
 
 
 
 
 
 | 248 | 
                 var iAddIndex = iElemIndex; | 
 
 
 
 
 
 | 249 | 
                 if (iElemIndex > 0 && iElemLevel > 0) { | 
 
 
 
 
 
 | 250 | 
                         Elem = new JSXMLBuilder_XMLElement(strElement,Attributes,strText,iElemLevel+1,this); | 
 
 
 
 
 
 | 251 | 
                 } else { | 
 
 
 
 
 
 | 252 | 
                         Elem = new JSXMLBuilder_XMLElement(strElement,Attributes,strText,1,this); | 
 
 
 
 
 
 | 253 | 
                 } | 
 
 
 
 
 
 | 254 | 
                 this.elements = this.elements.add(iAddIndex,Elem); | 
 
 
 
 
 
 | 255 | 
                 for (var i=iAddIndex; i<this.elements.length; i++) this.elements[i].index = i; | 
 
 
 
 
 
 | 256 | 
         } | 
 
 
 
 
 
 | 257 | 
  | 
 
 
 
 
 
 | 258 | 
  | 
 
 
 
 
 
 | 259 | 
         function JSXMLBuilder_removeElement(iElemIndex) { | 
 
 
 
 
 
 | 260 | 
                 iElemIndex = parseInt(iElemIndex); | 
 
 
 
 
 
 | 261 | 
                 for (var iAfterElem=iElemIndex+1; iAfterElem<this.elements.length; iAfterElem++) if (this.elements[iAfterElem].level < this.elements[iElemIndex].level+1) break; | 
 
 
 
 
 
 | 262 | 
  | 
 
 
 
 
 
 | 263 | 
                 this.elements = this.elements.slice(0,iElemIndex).concat(this.elements.slice(iAfterElem,this.elements.length)); | 
 
 
 
 
 
 | 264 | 
                 for (var i=iElemIndex; i<this.elements.length; i++) this.elements[i].index = i; | 
 
 
 
 
 
 | 265 | 
         } | 
 
 
 
 
 
 | 266 | 
  | 
 
 
 
 
 
 | 267 | 
         function JSXMLBuilder_moveElement(iElem1Index,iElem2Index) { | 
 
 
 
 
 
 | 268 | 
                 var arrElem1Elements = new Array(this.elements[iElem1Index]); | 
 
 
 
 
 
 | 269 | 
                 var arrElem2Elements = new Array(this.elements[iElem2Index]); | 
 
 
 
 
 
 | 270 | 
                 for (var i=iElem1Index; i<this.elements.length; i++) if (this.elements[i].level > this.elements[iElem1Index].level) arrElem1Elements[arrElem1Elements.length] = this.elements[i]; else if (i>iElem1Index) break; | 
 
 
 
 
 
 | 271 | 
                 for (var i=iElem2Index; i<this.elements.length; i++) if (this.elements[i].level > this.elements[iElem2Index].level) arrElem2Elements[arrElem2Elements.length] = this.elements[i]; else if (i>iElem2Index) break; | 
 
 
 
 
 
 | 272 | 
                 var arrMovedElements = []; | 
 
 
 
 
 
 | 273 | 
                 if (iElem1Index < iElem2Index) { | 
 
 
 
 
 
 | 274 | 
                         for (i=0; i<iElem1Index; i++) arrMovedElements[arrMovedElements.length] = this.elements[i]; // start to the 1st element | 
 
 
 
 
 
 | 275 | 
                         for (i=iElem1Index+arrElem1Elements.length; i<iElem2Index+arrElem2Elements.length; i++) arrMovedElements[arrMovedElements.length] = this.elements[i]; // end of 1st element to end of 2nd element | 
 
 
 
 
 
 | 276 | 
                         for (i=0; i<arrElem1Elements.length; i++) arrMovedElements[arrMovedElements.length] = arrElem1Elements[i]; // 1st element and all child elements | 
 
 
 
 
 
 | 277 | 
                         for (i=iElem2Index+arrElem2Elements.length; i<this.elements.length; i++) arrMovedElements[arrMovedElements.length] = this.elements[i]; // end of 2nd element to end | 
 
 
 
 
 
 | 278 | 
                         this.elements = arrMovedElements; | 
 
 
 
 
 
 | 279 | 
                 } else { | 
 
 
 
 
 
 | 280 | 
                         for (i=0; i<iElem2Index; i++) arrMovedElements[arrMovedElements.length] = this.elements[i]; // start to the 2nd element | 
 
 
 
 
 
 | 281 | 
                         for (i=0; i<arrElem1Elements.length; i++) arrMovedElements[arrMovedElements.length] = arrElem1Elements[i]; // 1st element and all child elements | 
 
 
 
 
 
 | 282 | 
                         for (i=iElem2Index; i<iElem1Index; i++) arrMovedElements[arrMovedElements.length] = this.elements[i]; // 2nd element to 1st element | 
 
 
 
 
 
 | 283 | 
                         for (i=iElem1Index+arrElem1Elements.length; i<this.elements.length; i++) arrMovedElements[arrMovedElements.length] = this.elements[i]; // end of 1st element to end | 
 
 
 
 
 
 | 284 | 
                         this.elements = arrMovedElements; | 
 
 
 
 
 
 | 285 | 
                 } | 
 
 
 
 
 
 | 286 | 
                 for (var i=0; i<this.elements.length; i++) this.elements[i].index = i; | 
 
 
 
 
 
 | 287 | 
         } | 
 
 
 
 
 
 | 288 | 
  | 
 
 
 
 
 
 | 289 | 
  | 
 
 
 
 
 
 | 290 | 
         function JSXMLBuilder_generateXML(bXMLTag) { | 
 
 
 
 
 
 | 291 | 
                 var strXML = ""; | 
 
 
 
 
 
 | 292 | 
                 var arrXML = []; | 
 
 
 
 
 
 | 293 | 
                 if (bXMLTag) strXML += '<?xml version="1.0"?>\n\n'; | 
 
 
 
 
 
 | 294 | 
                 for (var i=0; i<this.elements.length; i++) { | 
 
 
 
 
 
 | 295 | 
                         strXML += RepeatChar("\t",this.elements[i].level-1); | 
 
 
 
 
 
 | 296 | 
                         strXML += "<" + this.element(i).name; // open tag | 
 
 
 
 
 
 | 297 | 
                         if (this.element(i).attributes) { | 
 
 
 
 
 
 | 298 | 
                                 for (var j=0; j<this.element(i).attributes.length; j++) { // set attributes | 
 
 
 
 
 
 | 299 | 
                                         if (this.element(i).attributes[j]) { | 
 
 
 
 
 
 | 300 | 
                                                 strXML += ' ' + this.element(i).attributes[j][0] + '="' + this.element(i).attributes[j][1] + '"'; | 
 
 
 
 
 
 | 301 | 
                                         } | 
 
 
 
 
 
 | 302 | 
                                 } | 
 
 
 
 
 
 | 303 | 
                         } else strXML += this.element(i).attributeString.replace(/[\/>]$/gi, ""); | 
 
 
 
 
 
 | 304 | 
                         if (((this.elements[i+1] && this.elements[i+1].level <= this.elements[i].level) || // next element is a lower or equal to | 
 
 
 
 
 
 | 305 | 
                                 (!this.elements[i+1] && this.elements[i-1])) // no next element, previous element | 
 
 
 
 
 
 | 306 | 
                                 && this.element(i).text === "") { | 
 
 
 
 
 
 | 307 | 
                                 strXML += "/"; | 
 
 
 
 
 
 | 308 | 
                         } | 
 
 
 
 
 
 | 309 | 
                         strXML += ">"; | 
 
 
 
 
 
 | 310 | 
                         if (this.element(i).text !== "") strXML += this.element(i).text; | 
 
 
 
 
 
 | 311 | 
                         else strXML += "\n"; | 
 
 
 
 
 
 | 312 | 
                         if (((this.elements[i+1] && this.elements[i+1].level <= this.elements[i].level) || // next element is a lower or equal to | 
 
 
 
 
 
 | 313 | 
                                 (!this.elements[i+1] && this.elements[i-1])) // no next element, previous element | 
 
 
 
 
 
 | 314 | 
                                 && this.element(i).text !== "") strXML += "</" + this.element(i).name + ">\n"; | 
 
 
 
 
 
 | 315 | 
                         if (!this.elements[i+1]) { | 
 
 
 
 
 
 | 316 | 
                                 var lastelem = i; | 
 
 
 
 
 
 | 317 | 
                                 for (var j=i; j>-1; j--) { | 
 
 
 
 
 
 | 318 | 
                                         if (this.elements[j].level >= this.elements[i].level) continue; | 
 
 
 
 
 
 | 319 | 
                                         else { | 
 
 
 
 
 
 | 320 | 
                                                 if (this.elements[j].level < this.elements[lastelem].level) { | 
 
 
 
 
 
 | 321 | 
                                                         strXML += RepeatChar("\t",this.elements[j].level-1) + "</" + this.element(j).name + ">\n"; | 
 
 
 
 
 
 | 322 | 
                                                         lastelem = j; | 
 
 
 
 
 
 | 323 | 
                                                 } | 
 
 
 
 
 
 | 324 | 
                                         } | 
 
 
 
 
 
 | 325 | 
                                 } | 
 
 
 
 
 
 | 326 | 
                         } else { | 
 
 
 
 
 
 | 327 | 
                                 if (this.elements[i+1].level < this.elements[i].level) { | 
 
 
 
 
 
 | 328 | 
                                         var lastelem = i; | 
 
 
 
 
 
 | 329 | 
                                         for (var j=i; this.elements[j].level>=this.elements[i+1].level; j--) { | 
 
 
 
 
 
 | 330 | 
                                                 if (this.elements[i] && this.elements[j] && this.elements[j].level < this.elements[i].level && this.elements[j].level < this.elements[lastelem].level) { | 
 
 
 
 
 
 | 331 | 
                                                         strXML += RepeatChar("\t",this.elements[j].level-1) + "</" + this.element(j).name + ">\n"; | 
 
 
 
 
 
 | 332 | 
                                                         lastelem = j; | 
 
 
 
 
 
 | 333 | 
                                                 } | 
 
 
 
 
 
 | 334 | 
                                         } | 
 
 
 
 
 
 | 335 | 
                                 } | 
 
 
 
 
 
 | 336 | 
                         } | 
 
 
 
 
 
 | 337 | 
                         if (strXML.length > 1000) { | 
 
 
 
 
 
 | 338 | 
                                 arrXML[arrXML.length] = strXML; | 
 
 
 
 
 
 | 339 | 
                                 strXML = ""; | 
 
 
 
 
 
 | 340 | 
                         } | 
 
 
 
 
 
 | 341 | 
                 } | 
 
 
 
 
 
 | 342 | 
                 arrXML[arrXML.length] = strXML; | 
 
 
 
 
 
 | 343 | 
                 return arrXML.join(""); | 
 
 
 
 
 
 | 344 | 
         } | 
 
 
 
 
 
 | 345 | 
  | 
 
 
 
 
 
 | 346 | 
         function JSXMLBuilder_XMLElement(strName,Attributes,strText,iLevel,xmlBuilder) { | 
 
 
 
 
 
 | 347 | 
                 this.type = "element"; | 
 
 
 
 
 
 | 348 | 
                 this.name = strName; | 
 
 
 
 
 
 | 349 | 
                 this.attributes = (typeof(Attributes) != "string") ? Attributes : null; | 
 
 
 
 
 
 | 350 | 
                 this.attributeString = (typeof(Attributes) == "string") ? Attributes : ""; | 
 
 
 
 
 
 | 351 | 
                 this.text = strText; | 
 
 
 
 
 
 | 352 | 
                 this.level = iLevel; | 
 
 
 
 
 
 | 353 | 
                 this.index = -1; | 
 
 
 
 
 
 | 354 | 
                 this.xmlBuilder = xmlBuilder; | 
 
 
 
 
 
 | 355 | 
  | 
 
 
 
 
 
 | 356 | 
                 this.parseAttributes = JSXMLBuilder_XMLElement_parseAttributes; | 
 
 
 
 
 
 | 357 | 
                 this.attribute = JSXMLBuilder_XMLElement_attribute; | 
 
 
 
 
 
 | 358 | 
                 this.setAttribute = JSXMLBuilder_XMLElement_setAttribute; | 
 
 
 
 
 
 | 359 | 
                 this.removeAttribute = JSXMLBuilder_XMLElement_removeAttribute; | 
 
 
 
 
 
 | 360 | 
                 this.parentElement = JSXMLBuilder_XMLElement_parentElement; | 
 
 
 
 
 
 | 361 | 
                 this.childElement = JSXMLBuilder_XMLElement_childElement; | 
 
 
 
 
 
 | 362 | 
         } | 
 
 
 
 
 
 | 363 | 
  | 
 
 
 
 
 
 | 364 | 
                 function JSXMLBuilder_XMLElement_parseAttributes() { | 
 
 
 
 
 
 | 365 | 
                         if (!this.attributes) { | 
 
 
 
 
 
 | 366 | 
                                 var reAttributes = new RegExp(" ([^= ]*)=","g"); // matches attributes | 
 
 
 
 
 
 | 367 | 
                                 if (this.attributeString.match(reAttributes) && this.attributeString.match(reAttributes).length) { | 
 
 
 
 
 
 | 368 | 
                                         var arrAttributes = this.attributeString.match(reAttributes); | 
 
 
 
 
 
 | 369 | 
                                         if (!arrAttributes.length) arrAttributes = null; | 
 
 
 
 
 
 | 370 | 
                                         else for (var j=0; j<arrAttributes.length; j++) { | 
 
 
 
 
 
 | 371 | 
                                                 arrAttributes[j] = new Array( | 
 
 
 
 
 
 | 372 | 
                                                         (arrAttributes[j]+"").replace(/[= ]/g,""), | 
 
 
 
 
 
 | 373 | 
                                                         ParseAttribute(this.attributeString, (arrAttributes[j]+"").replace(/[= ]/g,"")) | 
 
 
 
 
 
 | 374 | 
                                                                                 ); | 
 
 
 
 
 
 | 375 | 
                                         } | 
 
 
 
 
 
 | 376 | 
                                         this.attributes = arrAttributes; | 
 
 
 
 
 
 | 377 | 
                                 } | 
 
 
 
 
 
 | 378 | 
                         } | 
 
 
 
 
 
 | 379 | 
                 } | 
 
 
 
 
 
 | 380 | 
          | 
 
 
 
 
 
 | 381 | 
                 function JSXMLBuilder_XMLElement_attribute(AttributeName) { | 
 
 
 
 
 
 | 382 | 
                         if (!this.attributes) this.parseAttributes(); | 
 
 
 
 
 
 | 383 | 
                         if (this.attributes) for (var i=0; i<this.attributes.length; i++) if (this.attributes[i][0] == AttributeName) return this.attributes[i][1]; | 
 
 
 
 
 
 | 384 | 
                         return ""; | 
 
 
 
 
 
 | 385 | 
                 } | 
 
 
 
 
 
 | 386 | 
  | 
 
 
 
 
 
 | 387 | 
                 function JSXMLBuilder_XMLElement_setAttribute(AttributeName,Value) { | 
 
 
 
 
 
 | 388 | 
                         if (!this.attributes) this.parseAttributes(); | 
 
 
 
 
 
 | 389 | 
                         if (this.attributes) for (var i=0; i<this.attributes.length; i++) if (this.attributes[i][0] == AttributeName) { | 
 
 
 
 
 
 | 390 | 
                                 this.attributes[i][1] = Value; | 
 
 
 
 
 
 | 391 | 
                                 return; | 
 
 
 
 
 
 | 392 | 
                         } | 
 
 
 
 
 
 | 393 | 
                         this.attributes[this.attributes.length] = new Array(AttributeName,Value); | 
 
 
 
 
 
 | 394 | 
                 } | 
 
 
 
 
 
 | 395 | 
  | 
 
 
 
 
 
 | 396 | 
                 function JSXMLBuilder_XMLElement_removeAttribute(AttributeName,Value) { | 
 
 
 
 
 
 | 397 | 
                         if (!this.attributes) this.parseAttributes(); | 
 
 
 
 
 
 | 398 | 
                         if (this.attributes) for (var i=0; i<this.attributes.length; i++) if (this.attributes[i][0] == AttributeName) { | 
 
 
 
 
 
 | 399 | 
                                 this.attributes = this.attributes.remove(i); | 
 
 
 
 
 
 | 400 | 
                                 return; | 
 
 
 
 
 
 | 401 | 
                         } | 
 
 
 
 
 
 | 402 | 
                 } | 
 
 
 
 
 
 | 403 | 
  | 
 
 
 
 
 
 | 404 | 
                 function JSXMLBuilder_XMLElement_parentElement() { | 
 
 
 
 
 
 | 405 | 
                         for (var i=this.index; this.xmlBuilder.element(i) && this.xmlBuilder.element(i).level != this.level-1; i--); | 
 
 
 
 
 
 | 406 | 
                         return this.xmlBuilder.element(i); | 
 
 
 
 
 
 | 407 | 
                 } | 
 
 
 
 
 
 | 408 | 
  | 
 
 
 
 
 
 | 409 | 
                 function JSXMLBuilder_XMLElement_childElement(Child) { | 
 
 
 
 
 
 | 410 | 
                         var iFind = -1; | 
 
 
 
 
 
 | 411 | 
                         for (var i=this.index+1; i<this.xmlBuilder.elements.length; i++) { | 
 
 
 
 
 
 | 412 | 
                                 if (this.xmlBuilder.elements[i].level == this.level+1) { | 
 
 
 
 
 
 | 413 | 
                                         iFind++; | 
 
 
 
 
 
 | 414 | 
                                         if (iFind == Child || this.xmlBuilder.elements[i].name == Child) return this.xmlBuilder.elements[i]; | 
 
 
 
 
 
 | 415 | 
                                 } else if (this.xmlBuilder.elements[i].level <= this.level) break; | 
 
 
 
 
 
 | 416 | 
                         } | 
 
 
 
 
 
 | 417 | 
                         return null; | 
 
 
 
 
 
 | 418 | 
                 } | 
 
 
 
 
 
 | 419 | 
  | 
 
 
 
 
 
 | 420 | 
  | 
 
 
 
 
 
 | 421 | 
 function JSXMLIterator(xmleElem) { | 
 
 
 
 
 
 | 422 | 
         this.xmleElem = xmleElem; | 
 
 
 
 
 
 | 423 | 
          | 
 
 
 
 
 
 | 424 | 
         this.iElemIndex = 0; | 
 
 
 
 
 
 | 425 | 
         this.arrElemIndex = new Array(0); | 
 
 
 
 
 
 | 426 | 
         this.iElemLevel = 0; | 
 
 
 
 
 
 | 427 | 
         this.iElem = 0; | 
 
 
 
 
 
 | 428 | 
         this.arrElemIndex[this.iElemLevel] = -1; | 
 
 
 
 
 
 | 429 | 
  | 
 
 
 
 
 
 | 430 | 
         this.getNextNode = JSXMLIterator_getNextNode; | 
 
 
 
 
 
 | 431 | 
 } | 
 
 
 
 
 
 | 432 | 
  | 
 
 
 
 
 
 | 433 | 
         function JSXMLIterator_getNextNode() { | 
 
 
 
 
 
 | 434 | 
                 if (!this.xmleElem || this.iElemLevel<0)        return false; | 
 
 
 
 
 
 | 435 | 
                 if (this.xmleElem.childElements.length) {  // move up | 
 
 
 
 
 
 | 436 | 
                         this.arrElemIndex[this.iElemLevel]++; | 
 
 
 
 
 
 | 437 | 
                         this.iElemIndex++; | 
 
 
 
 
 
 | 438 | 
                         this.iElemLevel++; | 
 
 
 
 
 
 | 439 | 
                         this.arrElemIndex[this.iElemLevel] = 0; | 
 
 
 
 
 
 | 440 | 
                         this.xmleElem = this.xmleElem.childElements[0]; | 
 
 
 
 
 
 | 441 | 
                 } else { // move next | 
 
 
 
 
 
 | 442 | 
                         this.iElemIndex++; | 
 
 
 
 
 
 | 443 | 
                         this.arrElemIndex[this.iElemLevel]++; | 
 
 
 
 
 
 | 444 | 
                         if (this.xmleElem.parentElement && this.xmleElem.parentElement.childElements.length && this.arrElemIndex[this.iElemLevel] < this.xmleElem.parentElement.childElements.length) this.xmleElem = this.xmleElem.parentElement.childElements[this.arrElemIndex[this.iElemLevel]]; | 
 
 
 
 
 
 | 445 | 
                         else { | 
 
 
 
 
 
 | 446 | 
                                 if (this.iElemLevel>0) { // move down | 
 
 
 
 
 
 | 447 | 
                                         for (; this.iElemLevel > 0; this.iElemLevel--) { | 
 
 
 
 
 
 | 448 | 
                                                 if (this.xmleElem.parentElement && this.xmleElem.parentElement.childElements[this.arrElemIndex[this.iElemLevel]]) { | 
 
 
 
 
 
 | 449 | 
                                                         this.xmleElem = this.xmleElem.parentElement.childElements[this.arrElemIndex[this.iElemLevel]]; | 
 
 
 
 
 
 | 450 | 
                                                         this.iElemLevel++; | 
 
 
 
 
 
 | 451 | 
                                                         this.arrElemIndex = this.arrElemIndex.slice(0,this.iElemLevel+1); | 
 
 
 
 
 
 | 452 | 
                                                         break; | 
 
 
 
 
 
 | 453 | 
                                                 } else { | 
 
 
 
 
 
 | 454 | 
                                                         this.xmleElem = this.xmleElem.parentElement; | 
 
 
 
 
 
 | 455 | 
                                                 } | 
 
 
 
 
 
 | 456 | 
                                         } | 
 
 
 
 
 
 | 457 | 
                                         this.iElemLevel--; | 
 
 
 
 
 
 | 458 | 
                                 } else { | 
 
 
 
 
 
 | 459 | 
                                         return false; | 
 
 
 
 
 
 | 460 | 
                                 } | 
 
 
 
 
 
 | 461 | 
                         } | 
 
 
 
 
 
 | 462 | 
                 } | 
 
 
 
 
 
 | 463 | 
                 return (typeof(this.xmleElem) == "object" && this.iElemLevel > -1); | 
 
 
 
 
 
 | 464 | 
         } | 
 
 
 
 
 
 | 465 | 
  | 
 
 
 
 
 
 | 466 | 
 function ParseAttribute(str,Attribute) { | 
 
 
 
 
 
 | 467 | 
         var str = str +  ">"; | 
 
 
 
 
 
 | 468 | 
         if (str.indexOf(Attribute + "='")>-1) var Attr = new RegExp(".*" + Attribute + "='([^']*)'.*>"); | 
 
 
 
 
 
 | 469 | 
         else if (str.indexOf(Attribute + '="')>-1) var Attr = new RegExp(".*" + Attribute + '="([^"]*)".*>'); | 
 
 
 
 
 
 | 470 | 
         return str.replace(Attr, "$1"); | 
 
 
 
 
 
 | 471 | 
 } | 
 
 
 
 
 
 | 472 | 
  | 
 
 
 
 
 
 | 473 | 
 function Array_Remove(c) { | 
 
 
 
 
 
 | 474 | 
         var tmparr = []; | 
 
 
 
 
 
 | 475 | 
         for (var i=0; i<this.length; i++) if (i!=c) tmparr[tmparr.length] = this[i]; | 
 
 
 
 
 
 | 476 | 
         return tmparr; | 
 
 
 
 
 
 | 477 | 
 } | 
 
 
 
 
 
 | 478 | 
  | 
 
 
 
 
 
 | 479 | 
 function Array_Add(c, cont) { | 
 
 
 
 
 
 | 480 | 
         if (c == this.length) { | 
 
 
 
 
 
 | 481 | 
                 this[this.length] = cont; | 
 
 
 
 
 
 | 482 | 
                 return this; | 
 
 
 
 
 
 | 483 | 
         } | 
 
 
 
 
 
 | 484 | 
         var tmparr = []; | 
 
 
 
 
 
 | 485 | 
         for (var i=0; i<this.length; i++) { | 
 
 
 
 
 
 | 486 | 
                 if (i==c) tmparr[tmparr.length] = cont; | 
 
 
 
 
 
 | 487 | 
                 tmparr[tmparr.length] = this[i]; | 
 
 
 
 
 
 | 488 | 
         } | 
 
 
 
 
 
 | 489 | 
         if (!tmparr[c]) tmparr[c] = cont; | 
 
 
 
 
 
 | 490 | 
         return tmparr; | 
 
 
 
 
 
 | 491 | 
 } | 
 
 
 
 
 
 | 492 | 
  | 
 
 
 
 
 
 | 493 | 
 function RepeatChar(sChar,iNum) { | 
 
 
 
 
 
 | 494 | 
         var L = ""; | 
 
 
 
 
 
 | 495 | 
         for (var i=0; i<iNum; i++) L += sChar; | 
 
 
 
 
 
 | 496 | 
         return L; | 
 
 
 
 
 
 | 497 | 
 } |