if ( ! document.importNode)
{
	document.importNode = MSIEImportNode;

	/**
	* MSIEImportNode( ) importe un noeud dans le document.
	* @param	object		le noeud à importer dans le document.
	* @param	boolean		true si les enfants doivent aussi être intégrés, sinon false.
	* @retval	object		la copie du noeud dans le document.
	* Cette méthode est implémentée pour palier à un manque des navigateurs Microsoft.
	*/
	function MSIEImportNode( oNode, bDeep)
	{
		if ( bDeep)
		{
			var oXHTML = document.createElement( '');

			oXHTML.innerHTML	= oNode.xml;
			oXHTML				= oXHTML.firstChild;
		}
		else
			var oXHTML = document.createElement( oNode.cloneNode( false).xml);

		return oXHTML;
	}
}

/**
* doTransformation( ) permet d'exécuter une transformation XSLT.
* @param	object		l'arbre XML à transformer.
* @param	object		l'arbre XSL dirigeant la transformation.
* @param	object		les paramètres à passer à la feuille XSLT.
* @retval	object		l'arbre résultat.
*/
function doTransformation( oXML, oXSL, oParams)
{
	if ( ! window.XSLTProcessor) /* Version MSIE. */
	{
		/* Instanciation des objets nécessaires. */
		var oDocument	= new ActiveXObject( 'Msxml2.FreeThreadedDOMDocument');
		var oTemplate	= new ActiveXObject( 'Msxml2.XSLTemplate');
		var oResult		= new ActiveXObject( 'Msxml2.DOMDocument');
		var oProcessor;

		/* Initialisation du processeur XSLT. */
		oDocument.loadXML( oXSL.documentElement.xml);
		oTemplate.stylesheet	= oDocument;
		oProcessor				= oTemplate.createProcessor( );
		oProcessor.input		= oXML;

		/* Ajout des paramètres à la feuille XSLT. */
		for ( sParam in oParams)
			oProcessor.addParameter( sParam, oParams[sParam]);

		/* Transformation de oXML par oXSL. */
		oProcessor.transform( );
		oResult.loadXML( oProcessor.output);
	}
	else /* Version Gecko. */
	{
		/* Instanciation des objets nécessaires. */
		var oProcessor = new XSLTProcessor( );
		var oResult;

		/* Initialisation du processeur XSLT. */
		oProcessor.importStylesheet( oXSL);

		/* Ajout des paramètres à la feuille XSLT. */
		for ( sParam in oParams)
			oProcessor.setParameter( '', sParam, oParams[sParam]);

		/* Transformation de oXML par oXSL. */
		oResult = oProcessor.transformToDocument( oXML);
	}

	/* Retour de la racine de la transformation. */
	return oResult.documentElement;
}

/**
* launchTransformation( ) prépare l'acquisition des flux XML et leurs traitements.
* @param	string		l'URL du flux XML.
* @param	string		l'URL du flux XSL.
* @param	string		l'ID du noeud servant de repère à l'insertion de la transformation.
* @param	handler		la fonction lançant la transformation.
* @param	object		les paramètres à passer à la feuille XSLT.
* @retval	none.
*/
function launchTransformation( sXML, sXSL, sElement, hFunction, oParams)
{
	/* Récupération du noeud à mettre à jour. */
	var oNode = document.getElementById( sElement);

	if ( window.ActiveXObject) /* Version MSIE. */
	{
		/* Création de l'objet XmlHttpRequest. */
		var oXML = new ActiveXObject( 'Msxml2.XMLHTTP');
		var oXSL = new ActiveXObject( 'Msxml2.XMLHTTP');
	}
	else /* Version Gecko. */
	{
		var oXML = new XMLHttpRequest( );
		var oXSL = new XMLHttpRequest( );
	}

	oXML.onreadystatechange = function( ) { hFunction( oXML, oXSL, oNode, oParams); };
	oXML.open( 'GET', sXML, true);
	oXML.send( null);

	oXSL.onreadystatechange = function( ) { hFunction( oXML, oXSL, oNode, oParams); };
	oXSL.open( 'GET', sXSL, true);
	oXSL.send( null);
}

/**
* updateFeed( ) remplace un noeud par le résultat d'une transformation XSLT.
* @param	object		l'objet XmlHttpRequest contenant le XML à transformer.
* @param	object		l'objet XmlHttpRequest contenant la feuille XSLT.
* @param	object		le noeud du document à remplacer.
* @param	object		les paramètres à passer à la feuille XSLT.
* @retval	none.
*/
function updateFeed( oXML, oXSL, oNode, oParams)
{
	if ( ( oXML.readyState == 4) && ( oXSL.readyState == 4))
		if ( ( oXML.status == 200) && ( oXSL.status == 200))
		{
			oResult = doTransformation( oXML.responseXML, oXSL.responseXML, oParams);
			oResult = document.importNode( oResult, true);

			oNode.parentNode.replaceChild( oResult, oNode);
		}
}