// const int TEXT_NODE //
var TEXT_NODE = 3;

// const NULL //
var NULL = null;

function XMLNode(obj) {
	// L'objet envoyer au départ ne correspond pas au premier node et on doit réajuster //
	if (obj.parentNode == NULL) {
		this.object = obj.firstChild;
	} else {
		this.object = obj;
	}
	
	this.childNodes = (isset(this.object.childNodes)) ? this.object.childNodes : new Array();
	
	// S'il y a des nodes //
	if (this.object.firstChild != NULL && isset(this.object.firstChild)) {
		this.firstChild = new XMLNode(this.object.firstChild);
		this.lastChild = new XMLNode(this.object.lastChild);
	}
	
	if (this.object.nodeType == TEXT_NODE || isset(this.object.data)) {
		this.value = this.object.data;
	} else {
		var resultat = "";
		
		for (var i=0; i<this.object.childNodes.length; i++) {
			resultat += new XMLNode(this.object.childNodes[i]).value;
		}
		
		this.value = resultat;
	} 	 
}

XMLNode.prototype = {
	'object'     : NULL,
	'childNodes' : new Array(),
	'firstChild' : NULL,
	'lastChild'  : NULL,
	'parentNode' : NULL,
	'value'      : "",
	 
	 /**
	 * Retourne le ou les élément(s) ayant comme nom celui passé en parmètre
	 * 
	 * @param (String) name Nom de l'élément
	 * @return (XMLNodeList ou XMLNode ou NULL)			
	 */
	 
	'$' : function (nom) {
		resultat = new XMLNodeList();
		
		for (var i=0; i<this.childNodes.length; i++) {
			if (this.childNodes[i].nodeName == nom) {
				currentNode = new XMLNode(this.childNodes[i]);
				currentNode.setParent(this);
				
				resultat.addNode(currentNode);
			}
		}
	
		if (resultat.length > 1) { 
			return resultat;
		} else {
			return (resultat.length != 0) ?
				resultat.firstChild :
				NULL; 
		}
	},
	
	/**
	 * Retourne le node root d'une structure XML
	 * 
	 * @return (Node)
	 */
	
	'getRootNode' : function () {
		currentNode = this;
		
		while ((n = currentNode.getParent()) != NULL) {
			currentNode = n;
		}
		
		return currentNode;
	}
	,
	
	/**
	 * Retourne l'élément parent
	 * 
	 * @return (Node) Si non trouvé NULL
	 */
	
	'getParent' : function () {
		return this.parentNode;
	}
	,
	
	/**
	 * Définit l'élément parent
	 * 
	 * @param (Node)
	 */
	
	'setParent' : function (node) {
		this.parentNode = node;
	}
};


function XMLNodeList() {
		
}

XMLNodeList.prototype =  {
	'childNodes' : new Array(),
	'length' : 0,
	'firstChild' : NULL,
	'lastChild' : NULL,
	
	/**
	 * Ajoute un node à une liste
	 * 
	 * @param (Node)
	 */
	
	'addNode' : function (node) {
		this.childNodes.push(node);
		this[this.length++] = node;
		
		if (resultat.length == 1) {
			resultat.firstChild = node;
		}
			
		this.lastChild = node;
	}
};