function TreeNode (nodeName, nodeCode, nodeId, children) {
  this.nodeCode = nodeCode;
  this.nodeName = nodeName;
  this.nodeId = nodeId;
  this.children = children;
}

/*function getElementsByAttribute(strTagName, attributeName, attributeValue) {
	var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	var oElement;
	for(var i=0; i<arrElements.length; i++){
	  oElement = arrElements[i];      
	  if(oElement.getAttribute(attributeName) == attributeValue){
	    arrReturnElements.push(oElement);
	  }   
	}
	return (arrReturnElements)
}*/

function loadXmlFromFile(xmlFile) {
  try //Internet Explorer
  {
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  }
  catch(e)
  {
    try //Firefox and other browsers
    {
      xmlDoc=document.implementation.createDocument("","",null);
    }
    catch(e) {
      alert(e.message);
      return ;
    }
  }
  try 
  {
    xmlDoc.async=false;
    xmlDoc.load(xmlFile);
    //document.write("xmlDoc is loaded, ready for use");
  }
  catch(e) {
    alert(e.message);
    return ;
  }
  return xmlDoc.documentElement;
}

function $V(element, attr) {
  return element.getAttribute(attr);
}


var XmlParser = Class.create();
XmlParser.prototype = {
  xmlFile : "" ,

  iDepth : -1 ,

  initialize : function(xmlFile) {
    this.xmlFile = xmlFile;
  },

  getNode : function(doc, xpath) {
    var retval = "";
    var value = doc.selectSingleNode(xpath);
    if(value) {
      retval = value.text;
    }
    return retval;
  },

  tree : function(element) {
    var node = "";
    var children = null;
    if(element.nodeType != 3) {
      node = element;
    }
    if(element.hasChildNodes) {
      children = new Array();
      for(var i=0;i<element.childNodes.length;i++) {
        if (element.childNodes[i].nodeType != 3) {
          this.iDepth++;
          children.push(this.tree(element.childNodes[i]));
        }
      }
    }
    var currentNode;
    /*try {
      var value = $V(element, "id");
      currentNode = new TreeNode($V(element, "name"), $V(element, "code"), $V(element, "id"), children);
    } catch(e) {
      currentNode = new TreeNode($V(element, "name"), $V(element, "code"), "", children);
    }*/
    if($V(element, "id") != null) {
      currentNode = new TreeNode($V(element, "name"), $V(element, "code"), $V(element, "id"), children);
    } else {
      currentNode = new TreeNode($V(element, "name"), $V(element, "code"), "", children);
    }
    return currentNode;
  },

  xmlToArray : function(root) {
    /*var citySet = xmlDoc.getElementsByTagName("city");
    var len = citySet.length;
    var geoGroup = new Array();
    for(var i = 0;i < len;i++) {
      geoGroup[i] = new 
      var townList = citySet[i].childNodes;
      var townNum = townList.length;
    }*/
    if(root == null) {
      root = loadXmlFromFile(this.xmlFile);
    }
    //var citySet = root.getElementsByTagName("TreeNodes");
    //alert(citySet);
    if(root.childNodes == null) {
      return;
    }
    var len = root.childNodes.length;
    //alert("len:"+len);
    var result = new Array();
    var index = 0;
    for(var i = 0;i < len;i++) {
      if(root.childNodes[i].nodeType != 3) {
        result[index] = this.tree(root.childNodes[i]);
        index++;
      }
    }
    //alert(root);
    //geoGroup = this.tree(root);
    return result;
  },

  findNodeByAttribute : function(tagName, attributeName, attributeValue, additionalAttributeName) {
    var root;
    try {
      root = loadXmlFromFile(this.xmlFile);
    } catch(e) {
    }
    if(root == null) {
      return "";
    }
    var current = null;
    var result = new Array();
    var index = 0;
    //var attributeList = root.getElementsByTagName(tagName);
    //var attributeList = root.selectSingleNode("//[@name='" + attributeValue + "']");
    var attributeList;
    if(tagName == null) {
      attributeList = root.childNodes;
    } else {
      attributeList = root.getElementsByTagName(tagName);
    }
    var len = attributeList.length;
    for(var i = 0;i < len;i++) {
      var temp = $V(attributeList[i], attributeName);
      if($V(attributeList[i], attributeName) == attributeValue) {
        current = attributeList[i];
        break;
      }
    }
    if(current == null) {
      return;
    }
    result = this.xmlToArray(current);
    if(additionalAttributeName == null || additionalAttributeName == "") {
      additionalAttributeName = "name";
    }
    var currentNode;
    if($V(current, "id") != null) {
      currentNode = new TreeNode($V(current, "name"), $V(current, attributeName), $V(current, "id"), null);
    } else {
      currentNode = new TreeNode($V(current, "name"), $V(current, attributeName), null, null);
    }
    result.push(currentNode);
    /*for(var i = 0;i < len;i++) {
      if(root.childNodes[i].nodeType != 3 && $V(root.childNodes[i], attributeName) ) {
        if($V(root.childNodes[i], attributeName) == attributeValue) {
          return 
        }
        result[index] = this.tree(root.childNodes[i]);
        index++;
      }
    }*/
    //alert(root);
    //geoGroup = this.tree(root);
    return result;
  }
}
