/****************************************************/
/****** Classe XMLTOOL ******************************/
/****************************************************/

// Constructeur 
// xmlURL : url du fichier xmkl source
// xslURL : url du fichier xsl source
// Le constructeur charge les 2 fichiers
function XMLTool( xmlURL, xslURL )
{
	this.xml = this.loadXML( xmlURL );
	
	if ( xslURL != null ) {
		this.xsl = this.loadXML( xslURL );
	}
}


// Methode init
// id = identifiant de l'element dans lequel il faut mettre le HTML genere
// Construit le HTML a parir des fichiers xml et xsl et l'affiche dans l'element ayant le id specifie
XMLTool.prototype.init = function( id )
{
	this.transform( this.xml, this.xsl, id );
}


//Methode loadXML
// url : url du fichier a charger
// charge de maniere synchrone le fichier xml ou xsl specifie
XMLTool.prototype.loadXML =  function ( url )
{
	try
	{
		
		var xmlDoc = null;
		// Cas Firefox -- Chrome
		if (document.implementation && document.implementation.createDocument)
		{
			xmlDoc = document.implementation.createDocument('', '', null);
			xmlDoc.async=false;
			if (xmlDoc.load)
			xmlDoc.load(url);
			else if (window.XMLHttpRequest) // Chrome: document.implementation.createDocument ne renvoie pas un XMLDocument (mais un Document), donc pas de load possible sur xmlDoc
			{
				xmlDoc = new XMLHttpRequest();
				xmlDoc.overrideMimeType('text/xml');
				xmlDoc.open('GET', url, false);
				xmlDoc.send(null);
				
				if (xmlDoc.readyState == 4 && xmlDoc.status == 200)
				{
					xmlDoc = xmlDoc.responseXML;
				}
			}
			else 
			{
				throw "nothing can be done";
			}
		}
		
		// Cas Internet Explorer
		else if (window.ActiveXObject)
		{
			try
			{ 
				xmlDoc = new ActiveXObject('Msxml2.XMLDOM');  
			}
			catch (e)
			{
				xmlDoc = new ActiveXObject('Microsoft.XMLDOM'); 
			}
			
			xmlDoc.async = false;
			xmlDoc.load(url);
		}
		
		// autre ?? 
		else if (window.XMLHttpRequest)
		{
			xmlDoc = new XMLHttpRequest();
			xmlDoc.overrideMimeType('text/xml');
			xmlDoc.open('GET', url, false);
			xmlDoc.send(null);
			
			if (xmlDoc.readyState == 4 && xmlDoc.status == 200)
			{
				xmlDoc = xmlDoc.responseXML;
			}
		}
		return xmlDoc;
	}
	catch ( e )
	{
		alert( "loadXML => " + e );
		return e;	
    }
}


// Methode tranform
// xml : document xml charge
// xsl document xsl charge
// id : id dans lequel il faut genere le HTML
// Genere le HTML et l'ecrit dans l'element specifie par son id
XMLTool.prototype.transform = function ( xml, xsl, id )
{
	try
	{
		// FireFox
		if ( window.XSLTProcessor )
		{
			var xsltProcessor = new XSLTProcessor();   
			xsltProcessor.importStylesheet( xsl );
			var fragment = xsltProcessor.transformToFragment( xml, window.document );
						
			//var target = document.getElementById( id );
			// test
			d = id.ownerDocument;		
			// fin test
			var target = id;	
			//rng = document.createRange();	
			rng = d.createRange();	
			rng.setStartBefore( target );
			
			while ( target.hasChildNodes() )
			{
				target.removeChild(target.lastChild);
			}
			target.appendChild( fragment );
		}
		
		//Windows
		else if (window.ActiveXObject)
		{
			//var target = document.getElementById(id);
			var target = id;
			target.innerHTML = xml.transformNode(xsl);
        }
    }	 
	catch (e) 
	{
		alert("transform => " + e.message + e);
    	return e;
	}
}
