<!--

function trim(string) 
{ 
	//alert ('trim');
	return string.replace(/(^\s*)|(\s*$)/g,''); 
	//^:debut
	//$:a la fin
} 
/*a eliminer*/
function RemplaceEspace1(string,exp,remplace){

	//return string.replace(/(\s)/gi,'##'); 
	var expReg=new RegExp(exp, 'g');
	result=string.replace(expReg, remplace); 
	return result;	
}

function RemplaceEspace2(string){
	return string.replace(/(&nbsp;)/gi,'##'); 
}
//remplacer par espace
function Remplace(string){
	var remplace=" ";
	var exp="(##)";	
	var expReg=new RegExp(exp, 'g');
	result=string.replace(expReg, remplace); 

	return result;	
}
function RemplaceSpan(string){

/*
	var remplace="</SPAN>$1fin ";
	var exp="(#_{0,})(<\/SPAN>)";
	var expReg=new RegExp(exp, 'g');	
	result=string.replace(expReg, remplace); 
	return result;
*/
	return string.replace(/(#*)<\/SPAN>/gi,"</SPAN>$1");
}
//a eliminer
function RemplaceClass(string){
	
	return string.replace(/<SPAN&NBSP;CLASS/gi,"<SPAN CLASS");
	//<SPAN&NBSP;CLASS='WYSIWYG_H3&NBSP;'>
}
//a eliminer
function RemplaceStyle(string){
	//alert('remplace style');
	return string.replace(/&nbsp;\'>/gi," \'>");
}

/**/
function disable (composant, racineimage)
{
	eval("document." + composant + "_palette").src = racineimage+'/themes/artic/images/boutons/palette0.gif';
	if (eval("document." + composant + "_glossaire"))
		eval("document." + composant + "_glossaire").src = racineimage+'/themes/artic/images/boutons/glossaire0.jpg';
	eval("document." + composant + "_gomme").src = racineimage+'/themes/artic/images/boutons/gomme0.gif';
	eval("document." + composant + "_gras").src = racineimage+'/themes/artic/images/boutons/gras0.gif';
	eval("document." + composant + "_italique").src = racineimage+'/themes/artic/images/boutons/italique0.gif';
	eval("document." + composant + "_souligne").src = racineimage+'/themes/artic/images/boutons/souligne0.gif';
	eval("document." + composant + "_gauche").src = racineimage+'/themes/artic/images/boutons/gauche0.gif';
	eval("document." + composant + "_centre").src = racineimage+'/themes/artic/images/boutons/centre0.gif';
	eval("document." + composant + "_droite").src = racineimage+'/themes/artic/images/boutons/droite0.gif';
	eval("document." + composant + "_justifie").src = racineimage+'/themes/artic/images/boutons/justifie0.gif';
	eval("document." + composant + "_tabplus").src = racineimage+'/themes/artic/images/boutons/tabplus0.gif';
	eval("document." + composant + "_tabmoins").src = racineimage+'/themes/artic/images/boutons/tabmoins0.gif';
	eval("document." + composant + "_liste").src = racineimage+'/themes/artic/images/boutons/liste0.gif';
	eval("document." + composant + "_listenum").src = racineimage+'/themes/artic/images/boutons/listenum0.gif';
	eval("document." + composant + "_polplus").src = racineimage+'/themes/artic/images/boutons/polplus0.gif';
	eval("document." + composant + "_polmoins").src = racineimage+'/themes/artic/images/boutons/polmoins0.gif';
	eval("document." + composant + "_polnormal").src = racineimage+'/themes/artic/images/boutons/polnormal0.gif';
	eval("document." + composant + "_lien").src = racineimage+'/themes/artic/images/boutons/lien0.gif';
	eval("document." + composant + "_image").src = racineimage+'/themes/artic/images/boutons/image0.gif';
	eval("document." + composant + "_lunette").src = racineimage+'/themes/artic/images/boutons/lunette0.gif';
	eval("document." + composant + "_tableau").src = racineimage+'/themes/artic/images/boutons/tableau0.gif';
	
	if (typeof (eval("document." + composant + "_document")) != "undefined")
		eval("document." + composant + "_document").src = racineimage+'/themes/artic/images/boutons/document0.gif';
	if (typeof (eval("document." + composant + "_document2")) != "undefined")
		eval("document." + composant + "_document2").src = racineimage+'/themes/artic/images/boutons/classement0.jpg';
		
	var MenuDeroulantStyle = eval("formulaire." + composant +"_slStyleWysiwyg");
	if (typeof (MenuDeroulantStyle) !="undefined"){
		MenuDeroulantStyle.disabled ="disabled";
	}
	
	var MenuDeroulantHn = eval("formulaire." + composant +"_slHn");
	if (typeof (MenuDeroulantHn) !="undefined"){
		MenuDeroulantHn.disabled ="disabled";
	}
}

function enable (composant, racineimage)
{
	eval("document." + composant + "_palette").src = racineimage+'/themes/artic/images/boutons/palette.gif';
	if (eval("document." + composant + "_glossaire"))
		eval("document." + composant + "_glossaire").src = racineimage+'/themes/artic/images/boutons/glossaire.jpg';
	eval("document." + composant + "_gomme").src = racineimage+'/themes/artic/images/boutons/gomme.gif';
	eval("document." + composant + "_gras").src = racineimage+'/themes/artic/images/boutons/gras.gif';
	eval("document." + composant + "_italique").src = racineimage+'/themes/artic/images/boutons/italique.gif';
	eval("document." + composant + "_souligne").src = racineimage+'/themes/artic/images/boutons/souligne.gif';
	eval("document." + composant + "_gauche").src = racineimage+'/themes/artic/images/boutons/gauche.gif';
	eval("document." + composant + "_centre").src = racineimage+'/themes/artic/images/boutons/centre.gif';
	eval("document." + composant + "_justifie").src = racineimage+'/themes/artic/images/boutons/justifie.gif';
	eval("document." + composant + "_droite").src = racineimage+'/themes/artic/images/boutons/droite.gif';
	eval("document." + composant + "_tabplus").src = racineimage+'/themes/artic/images/boutons/tabplus.gif';
	eval("document." + composant + "_tabmoins").src = racineimage+'/themes/artic/images/boutons/tabmoins.gif';
	eval("document." + composant + "_liste").src = racineimage+'/themes/artic/images/boutons/liste.gif';
	eval("document." + composant + "_listenum").src = racineimage+'/themes/artic/images/boutons/listenum.gif';
	eval("document." + composant + "_polplus").src = racineimage+'/themes/artic/images/boutons/polplus.gif';
	eval("document." + composant + "_polmoins").src = racineimage+'/themes/artic/images/boutons/polmoins.gif';
	eval("document." + composant + "_polnormal").src = racineimage+'/themes/artic/images/boutons/polnormal.gif';
	eval("document." + composant + "_lien").src = racineimage+'/themes/artic/images/boutons/lien.gif';
	eval("document." + composant + "_image").src = racineimage+'/themes/artic/images/boutons/image.gif';
	eval("document." + composant + "_tableau").src = racineimage+'/themes/artic/images/boutons/tableau.gif';
	if (typeof (eval("document." + composant + "_document")) != "undefined")
		eval("document." + composant + "_document").src = racineimage+'/themes/artic/images/boutons/document.gif';
	if (typeof (eval("document." + composant + "_document2")) != "undefined")
		eval("document." + composant + "_document2").src = racineimage+'/themes/artic/images/boutons/classement.jpg';
	eval("document." + composant + "_lunette").src = racineimage+'/themes/artic/images/boutons/lunette.gif';
	
	var MenuDeroulantStyle = eval("formulaire." + composant +"_slStyleWysiwyg");
	if (typeof (MenuDeroulantStyle) !="undefined"){
		MenuDeroulantStyle.disabled = false;
	}
	
	var MenuDeroulantHn = eval("formulaire." + composant +"_slHn");
	if (typeof (MenuDeroulantHn) !="undefined"){
		MenuDeroulantHn.disabled = false;
	}
}

function changeaffichage (composant, racineimage)
{
	if (eval(composant + "_mode"))
	{
		eval("document." + composant + "_code").src = racineimage+'/themes/artic/images/boutons/code_enf.gif';
		disable (composant, racineimage);
		// on rajoute des doubles quotes autour des valeurs attributs qui n'en n'ont pas
		// ! si une valeur contient un espace, cela ne marche pas correctement
		var bodyinnerText = eval(composant + "_iframe").document.body.innerHTML;
		bodyinnerText = bodyinnerText.replace (/https:\/\/www.artic.gazdefrance.com/g, "");
		bodyinnerText = bodyinnerText.replace (/https:\/\/www.artic.preprod.gazdefrance.com/g, "");
		eval(composant + "_iframe").document.body.innerText = bodyinnerText;
		// ! alternative pour tester AjouteAttQuotes() (normalement pas de régression)
		//eval(composant + "_iframe").document.body.innerText = AjouteAttQuotes(eval(composant + "_iframe").document.body.innerHTML);
	}
	else
	{
		eval("document." + composant + "_code").src = racineimage+'/themes/artic/images/boutons/code2.gif';

		enable (composant, racineimage);

		eval(composant + "_iframe").document.body.innerHTML = eval(composant + "_iframe").document.body.innerText;
	}
}
function ConvertitEnAccessible(composant, texteOk){
	if (!window.NettoieHTML)
		return;
	eval(composant + "_iframe").document.body.innerHTML = NettoieHTML(eval(composant + "_iframe").document.body.innerHTML);	
	alert ('eval '+eval(composant + "_iframe").document.body.innerHTML );
	alert(texteOk);
}

function colorPicker (thefield, texteaucunmot, urlwysiwygcss, modeEdition)
{
	var strErreurImbrication = "";
	if ( colorPicker.arguments[5] != undefined){
		strErreurImbrication = colorPicker.arguments[5]
	}
	
	// Champs wyiswyg n'est pas en mode edition
	if (!modeEdition) 
		return;
	var result = window.showModalDialog('colorpicker.php?act=display','palette','resizable:no;help:no;status:no;dialogHeight:400px;dialogWidth:400px;');
		
	if (result != null)
	{
		AddStyleComplet(thefield, result, modeEdition, strErreurImbrication, texteaucunmot);
	}
}

function sansword (texte)
{
	// Ces 2 lignes qui marchaient ne marche plus bizaremment
	texte = texte.replace (/\\n/ig, "");
	texte = texte.replace (/\\r/ig, "");

	texte = texte.replace (/\n/ig, "");
	texte = texte.replace (/\r/ig, "");
	texte = texte.replace (/<\/li>/gi, "");
	texte = texte.replace (/<\/?dir[^>]*>/gi, "");
	texte = texte.replace (/<\/?v[^>]*>/gi, "");
	texte = texte.replace (/<\/?o:[^>]*>/gi, "");
	texte = texte.replace (/ style=\"[^"]*\"/gi, "");
	texte = texte.replace (/<\?xml[^>]*>/gi, "");
	texte = texte.replace (/<\/?o:p>/gi, "");
	texte = texte.replace (/’/gi, "'");
	
	// Convertit en code accessible
	if(window.NettoieHTML){
		texte = NettoieHTML(texte);
	}
	
	// Supprime le dernier <p>&nbsp;</p>
	var ArrTextASupprimer = new Array("<p>&nbsp;</p>", "<p></p>");
	var StrTexteASupprimer = "";
	for (var i=0;i<ArrTextASupprimer.length;i++){
		StrTexteASupprimer = ArrTextASupprimer[i];
//	alert('StrTexteASupprimer : '+StrTexteASupprimer + '\n texte.length   : '+texte.length +'\nStrTexteASupprimer.length : '+StrTexteASupprimer.length+'\n texte : '+texte +'\n texte.toLowerCase().lastIndexOf(StrTexteASupprimer.toLowerCase()) : '+texte.toLowerCase().lastIndexOf(StrTexteASupprimer.toLowerCase()) )
		while (texte.toLowerCase().lastIndexOf(StrTexteASupprimer.toLowerCase()) == texte.length - StrTexteASupprimer.length){
			texte = texte.substring(0, texte.length - StrTexteASupprimer.length);
		}
	}
	return texte;
}

function sanslfcr (texte)
{
	// A utiliser pour champs wysiwyg3 (code source, one ne retire que les sauts pour éviter les erreurs javascript au moment du chargement de la textarea)
	// Ces 2 lignes qui marchaient ne marche plus bizaremment
	texte = texte.replace (/\\n/ig, "");
	texte = texte.replace (/\\r/ig, "");

	texte = texte.replace (/\n/ig, "");
	texte = texte.replace (/\r/ig, "");
	
	return texte;
}

function cleanAllTags (theselection, IFrameChoisie)
{	
	var boolDebugClean=false;
	test_balise=true;
	
	if (boolDebugClean==true){
		test_balise=false;//ici ??
		alert('the selection '+theselection+'* test_balise'+test_balise);
	}
	

	IFrameChoisie.document.execCommand('removeformat');
	IFrameChoisie.document.execCommand('unlink');
	
	// Selection du textArea qui va etre utilise si on seletionne un paragraphe.
	var textAreaRange    = IFrameChoisie.document.body.createTextRange();
	var rangeSelectionne = theselection.createRange();
	
	// Texte HTML avant la selection
	var arrResultatAvant = new Array();
	getAvantTexteRangeSelectionne(textAreaRange, rangeSelectionne, arrResultatAvant);
	var StrHtmlDebut     = arrResultatAvant["chaine"];
	//alert('StrHtmlDebut : '+StrHtmlDebut)
	var NbDebutSpan      = arrResultatAvant["nbDebutSpan"];
	var intNbDeplacement = arrResultatAvant["NbDeplacement"];
	
	var arrResultatApres = new Array();
	getApresTexteRangeSelectionne(textAreaRange, rangeSelectionne, arrResultatApres);
	var StrHtmlApres     = arrResultatApres["chaine"];
	var NbFinSpan        = arrResultatApres["nbFinSpan"];
	

	// Texte HTML Selectionne
	var StrHtmlSelectionne = getTexteRangeSelectionne(NettoieRange(textAreaRange.htmlText), StrHtmlDebut, StrHtmlApres)
	
	var ArrStyleOuvert = CreeTableauStyleOuvert(NettoieRange(textAreaRange.htmlText), StrHtmlSelectionne, StrHtmlDebut.length -1, "SPAN");
	
	//alert('__Selection__\n StrHtmlDebut : '+StrHtmlDebut +'\n StrHtmlApres : ' + StrHtmlApres + '\n StrHtmlSelectionne : '+StrHtmlSelectionne+'\n s \n Tout : '+NettoieRange(textAreaRange.htmlText)+ '\n NbFinSpan :' + NbFinSpan + '\n NbDebutSpan :' +NbDebutSpan + '\n ArrStyleOuvert.length : '+ArrStyleOuvert.length);
	
	
	//A ce moment du traitement, on a reconstitue la chaine du textarea
	if (StrHtmlSelectionne == ""){
		arrNouvellesChaines = new Array();
		SelectionneParagraphe(StrHtmlDebut, StrHtmlSelectionne, StrHtmlApres, arrNouvellesChaines);
		StrHtmlDebut        = arrNouvellesChaines["debut"];
		StrHtmlSelectionne  = arrNouvellesChaines["milieu"];
		StrHtmlApres        = arrNouvellesChaines["fin"];
	}
	
 	// Expression reguliere de nettoyage... 
 	nbFinSpanDansSelection = CompteNombreOccurence(StrHtmlSelectionne, "</SPAN>");
 	// On commence par supprimer tous les elements dont le nom de tag est 2 ou plus ex : <H1..., <SPAN...
 	StrHtmlSelectionne = StrHtmlSelectionne.replace (/<h[1-6]>/gi,"<p>");
 	
 	// On laisse certaines balises. Pour cela, on renomme les tags afin qu'elles soit exclues de l'expression régulière de nettoyage
 	StrHtmlSelectionne = StrHtmlSelectionne.replace (/<br>/gi,"<_br_>");
 	StrHtmlSelectionne = StrHtmlSelectionne.replace (/<img/gi,"<_img");
 	StrHtmlSelectionne = StrHtmlSelectionne.replace (/<br\/>/gi,"<_br_/>");
 	StrHtmlSelectionne = StrHtmlSelectionne.replace (/<\/?h[1-6]>/gi,"</p>");
 	
	StrHtmlSelectionne = StrHtmlSelectionne.replace (/(<\s*(\/)?[a-z1-9]{2,}(\s+[^>]*)?>)/ig,"");
	// Nous avons des elements de la forme <a href="" class="">. On supprime tous ceux dont le tag n'est pas P
	StrHtmlSelectionne = StrHtmlSelectionne.replace (/(<\s*(\/)?[^p](\s+[^>]*)?>)/ig,"");
	
	// On remet les bones expressions
	StrHtmlSelectionne = StrHtmlSelectionne.replace (/<_br_>/gi,"<br>");
 	StrHtmlSelectionne = StrHtmlSelectionne.replace (/<_br_\/>/gi,"<br/>");
 	StrHtmlSelectionne = StrHtmlSelectionne.replace (/<_img/gi,"<img");
	// Pour finir, nous avons : <P class="">. Nous supprimons tous les attributs des tags P
	StrHtmlSelectionne = StrHtmlSelectionne.replace (/(<\s*p(\s+[^>]*)?>)/ig, "<P>");
	
	// Perte des styles ouverts
	var ArrStyleOuvert = CreeTableauStyleOuvert(NettoieRange(textAreaRange.htmlText), StrHtmlSelectionne, StrHtmlDebut.length -1, "SPAN");
	boolSpanClassOuvert = false;
	
	if (ArrStyleOuvert.length>0 && StrHtmlDebut != ""){
		for(var i = 0 ; i<ArrStyleOuvert.length  ; i++){
			StrHtmlSelectionne = "</SPAN>"+ StrHtmlSelectionne;
			// Reouverture des span que si ils ne sont pas fermes dans la selection (cf i >=nbFinSpanDansSelection) ou en fin de selection (ou en debut de champs suivant i >= NbFinSpan)...
			if (i >= NbFinSpan && StrHtmlApres.length>0 && i >=nbFinSpanDansSelection)
				StrHtmlSelectionne = StrHtmlSelectionne + trim(ArrStyleOuvert[i]);
		}
	}
	
 	//alert('__final__\n StrHtmlDebut : |'+StrHtmlDebut +'|\n StrHtmlSelectionne : |'+StrHtmlSelectionne + '|\n StrHtmlApres :  |'+StrHtmlApres+'|');
	var StrFinal = StrHtmlDebut + StrHtmlSelectionne + StrHtmlApres;
		// Il est possible que l'on ait des <span class="quelquechose"></span>. On nettoie donc!
	StrFinal = RetireSpanVide(StrFinal);

	IFrameChoisie.document.execCommand("SelectAll");
	IFrameChoisie.document.execCommand("delete");
	IFrameChoisie.document.clear();
	textAreaRange.pasteHTML(StrFinal);

	textAreaRange = IFrameChoisie.document.body.createTextRange();
	workRange     = textAreaRange.duplicate();
 	workRange.setEndPoint("StartToStart", textAreaRange);
	workRange.setEndPoint("EndToStart", textAreaRange);
	var NbAvance = 0;	
	// Aggrandissement du workRange jusqu'a ce qu'il arrive a RangeSelectionne
	while(NbAvance < intNbDeplacement){
		workRange.moveEnd("character", 1);
		NbAvance++;
	}
	workRange.collapse(false);
	workRange.select();
}

function InsereImage (nomchamp, typechamp, racineabsolue, racineuploadimages) 
{
	var result = showModalDialog(racineabsolue+"/commun/dialoggenerique.php?page=4", "", "dialogWidth:800px;dialogHeight:590px;resizable:yes");
   // window.open(racineabsolue+"/commun/dialoggenerique.php?page=4");
	if (result != null)
	{
		if (typechamp == 'image1')
		{
			var correspondances = result.match (/src="([^'"]*)"/i);
			var src_image = correspondances[1];
			correspondances = result.match (/alt="([^"]*)"/i);
			var alt_image = correspondances[1];

			eval ("document.all." + nomchamp).value = "<IMG src=\"" + src_image + "\" border=\"0\" alt=\"" + alt_image + "\" title=\"" + alt_image + "\" usemap=\"#"+nomchamp+"_map\">";
			eval ("document." + nomchamp + "image").src = src_image;
		}
		else if (typechamp == 'wysiwyg')
		{
			eval(nomchamp + "_iframe").focus ();

			var objSelection = eval(nomchamp + "_iframe").document.selection.createRange();
			
//			var objSelection1 = eval(nomchamp + "_iframe").document.createRange();
//			var texte = window.document.body.createTextRange();
			
			//alert ('objSelection '+ objSelection.htmltext );// AM
//			alert (' result0 '+result); // AM

			objSelection.pasteHTML(result); 
			
			//eval(nomchamp + "_iframe").document.body.innerHTML = result + eval(nomchamp + "_iframe").document.body.innerHTML ;						
			var strTextHtml=eval(nomchamp + "_iframe").document.body.innerHTML;
	//		alert ('strTextHtml 0'+strTextHtml);
			var exp= '<P></SPAN>';
			var rempl='</SPAN><P>';			
			var expReg=new RegExp(exp, 'gi');
			var expRegC=new RegExp(); // pour «compile»
			strTextHtml=strTextHtml.replace(expReg, rempl);					
	//		alert ('strTextHtml 1'+strTextHtml);			
			eval(nomchamp + "_iframe").document.body.innerHTML = strTextHtml ;							
		
//			alert ('	objSelection.pasteHTML(result) '+ 	objSelection.pasteHTML(result));
//			texte.pasteHTML(result); //AM
			
			//alert (' objSelection1 paste '+objSelection.pasteHTML(result));// AM
//			alert('texte '+ texte.htmltext);
			
			

//			alert ('eval toto'+eval(nomchamp + "_iframe").document.body.innerHTML );
			
			/**/
			// Récupération de la position actuelle du curseur
				//actuelPos = document.selection.createRange();
 
				// Création d'un curseur Virtuel (edit, c'est mon champs de saisie)
				//testPos = edit.createTextRange();
 
				// Test de la position.
				//if( testPos.boundingLeft == actuelPos.boundingLeft )
				//alert ('objSelection.boundingLeft '+objSelection.boundingLeft);
				
 

			//testPos.collapse(false);
 
		
			
			/**/			
			return result;			
		}
	}
}


/**
*	Added by FilipB
*	This function links the action InsereSwf to the image swf icon from the wysiwyg bar
*/

function InsereSwf (nomchamp, typechamp, racineabsolue, racineuploadimages) {
	//	This sets a get parameter page=7 which points to a script coresponding in dialoggenerique.php 
	//	to the function in charge with uploqding swf files
	//	This IS A NO-NO PROCEDURE FOR FIREFOX
	var result = showModalDialog(racineabsolue+"/commun/dialoggenerique.php?page=7", "", "dialogWidth:800px;dialogHeight:620px;resizable:yes");
   // window.open(racineabsolue+"/commun/dialoggenerique.php?page=4");
	if (result != null)
	{
		if (typechamp == 'image1')
		{
			var correspondances = result.match (/src="([^'"]*)"/i);
			var src_image = correspondances[1];
			correspondances = result.match (/alt="([^"]*)"/i);
			var alt_image = correspondances[1];

			eval ("document.all." + nomchamp).value = "<img src=\"" + src_image + "\" border=\"0\" alt=\"" + alt_image + "\" title=\"" + alt_image + "\" usemap=\"#"+nomchamp+"_map\">";
			eval ("document." + nomchamp + "image").src = src_image;
			
		}
		else if (typechamp == 'wysiwyg')
		{
			eval(nomchamp + "_iframe").focus ();

			var objSelection = eval(nomchamp + "_iframe").document.selection.createRange();

			objSelection.pasteHTML(result); 
			

			var strTextHtml=eval(nomchamp + "_iframe").document.body.innerHTML;

			var exp= '<P></SPAN>';
			var rempl='</SPAN><P>';			
			var expReg=new RegExp(exp, 'gi');
			var expRegC=new RegExp(); // pour «compile»
			strTextHtml=strTextHtml.replace(expReg, rempl);					

			eval(nomchamp + "_iframe").document.body.innerHTML = strTextHtml ;							
		
			return result;			
		}
	}
}



 /*************************************************
  * 
  * FBO :2007/04/23 Ticket 12 - BEGIN
  * 
  */ 
		 
	// Global variables
	xMousePos = 0; // Horizontal position of the mouse on the screen
	yMousePos = 0; // Vertical position of the mouse on the screen
	xMousePosMax = 0; // Width of the page
	yMousePosMax = 0; // Height of the page	

 /*
  * This function returns values for the global variables 'xMousePos', 'yMousePos' , 'xMousePosMax' and 'yMousePosMax'
  */
 function captureMousePosition(e) {
    if (document.layers) {
        xMousePos = e.pageX;
        yMousePos = e.pageY;
        xMousePosMax = window.innerWidth+window.pageXOffset;
        yMousePosMax = window.innerHeight+window.pageYOffset;
    } else if (document.all) {
        xMousePos = window.event.x+document.body.scrollLeft;
        yMousePos = window.event.y+document.body.scrollTop;
        xMousePosMax = document.body.clientWidth+document.body.scrollLeft;
        yMousePosMax = document.body.clientHeight+document.body.scrollTop;
    } else if (document.getElementById) {
        // Netscape 6 behaves the same as Netscape 4 in this regard
        xMousePos = e.pageX;
        yMousePos = e.pageY;
        xMousePosMax = window.innerWidth+window.pageXOffset;
        yMousePosMax = window.innerHeight+window.pageYOffset;
    }
 }

 /*
  * This function removes the div with id 'swfObjectWrapper' from body DOM content
  */		
 function removeWrapper() {
 	var bodyReference=document.getElementsByTagName('body').item(0);
	$(bodyReference).removeChild($('swfObjectWrapper'));
 }		
 
 
 /*
  * This function establishes some configuration settings and returns the content in the WYSIWYG 
  * textarea once the selection of swf and comment is submited
  */
 function loadSwfLightbox() {
 	
 	/*
 	 * Configuration settings
 	 */
	var sSwfObjectEfffect  = "lightbox";
	var sSwfObjectServerPath= "http://www.videos-gazdefrance.com/satellites/videos/";
	var sSwfObjectIconPath = "/themes/artic/images/artic/detail-swf.gif";
	var sSwfObjectDetailsIconClassName = "swfObjectClass";

	var sSwfObjectServerPathFlash= "_flash/";	
	var sSwfObjectServerPathFlv= "_flv/";		
	
	
	var swfObjectWidth='500';
	var swfObjectHeight='400';
	/*
	 * End configuration
	 */
	
	
	/*
	 * Get the data from the floating div
	 */
	var sIframeSrc=""; 	
 	var objectName=$F('swfObjectName');
 	var objectComment=$F('swjObjectComment'); 	 	
 	var targetIframeSrc=$F('swfObjectFrameSrc');
 	
 	var objectType="";
 	var objectTypeRadios=$$('div#objectTypeSelector input.radioObjectType ');
 		for(var i=0; i<objectTypeRadios.length ; i++) {
			if( $(objectTypeRadios[i].id).checked) {
				objectType=objectTypeRadios[i].id;
			}
 		} 	

	/*
	 * Set the path to the video file
	 */
 	if(objectType=="swf") {
	 	sSwfObjectServerPath= sSwfObjectServerPath + sSwfObjectServerPathFlash;
 	}else if(objectType=="flv") {
	 	sSwfObjectServerPath= sSwfObjectServerPath + sSwfObjectServerPathFlv;
 	}	



	/*
	 * Build data string for embedding swf
	*/	
	sIframeSrc  = "<div onclick=\"renderObject('"+sSwfObjectServerPath + objectName + "', '" + objectName + "' , '" + escape(objectComment) + "', '" + swfObjectWidth + "', '" + swfObjectHeight + "' , '" + xMousePosMax+ "', '" + yMousePosMax + "', '" + objectType + "');\" style='\"color:#575757;cursor:pointer;\"'>";							
	sIframeSrc += "	Voir la vidéo &gt;&gt;";																	
	sIframeSrc += "</div>";


	//	This is how you reference an iframe the CORRECT WAY with Prototype
	var iFrameReference=$(targetIframeSrc).contentWindow.document;
	//	This is how you reference the iframe's elements
	//	iFrameReference.documentElement.innerHTML
	//	iFrameReference.getElementsByTagName('body').item(0).innerHTML

	var iFrameContent=iFrameReference.getElementsByTagName('body').item(0);
	/*
	 * Adding content on top of previous iframe content
	 */
	iFrameReference.getElementsByTagName('body').item(0).innerHTML += sIframeSrc; 	
 	
	removeWrapper();	
	
	alert(swfObjectPath)	
 }
 
 /*
  * This function builds the panel to insert the name of the swf and the comment.
  */
 function InsereVideo(nomchamp, typechamp, racineabsolue, racineuploadimages)  {
	
	captureMousePosition();
	xMousePos=xMousePos - 300;
	yMousePos=yMousePos + 5;	

 	// Set holder div style
 	var holderStyle ="position:absolute;top:" + yMousePos + "px;left:" + xMousePos + "px;";
 		holderStyle +="width:450px;height:200px;font-family:tahoma;font-size:12px;";
		holderStyle +="z-index:800;background-color:#FFFFFF;border:5px solid #434343;display:none";
		
 	var bodyReference=document.getElementsByTagName('body').item(0);
 	
 	var el=Builder.node('div' , { id:'swfObjectWrapper' , style:holderStyle } , [
			 	Builder.node('div' , { id:' swfObjectWrapperCloser' , style:'position:relative;height:15px;padding-right:5px;', align:'right' } , [
			 		Builder.node('div' , { id:'closeWrapper' , onclick:'removeWrapper()' , title:'Fermer', style:'padding:2px;width:10px;cursor:pointer;' } , 'x')
			 	]), 
			 	Builder.node('form' , { id:'swfObjectHolder' , style:'padding:20px;' } , [
				 	Builder.node('div' , { id:'' , style:'' } , [
					 	Builder.node('input' , { type:'hidden',   id:'swfObjectFrameSrc' , value:nomchamp+'_iframe' } , ''), 				 	
						Builder.node('input' , { type:'text',   id:'swfObjectName' , value:'', style:'width:320px;' } , '') 
				 	]),
				 	Builder.node('div' , { id:'' , style:'' } , [
						Builder.node('input' , { type:'textarea',   id:'swjObjectComment' , value:'', style:'width:320px;height:100px;' } , '') 					
				 	]),

				 	Builder.node('div' , { id:'objectTypeSelector' , style:'' } , [
						Builder.node('text' , { } , ' Swf ' ),				 	
						Builder.node('input' , { type:'radio',  id:'swf', name:'objectType' , className:'radioObjectType', checked:true } , '' ),
						Builder.node('text' , { } , ' Flv ' ),				 	
						Builder.node('input' , { type:'radio',  id:'flv', name:'objectType' , className:'radioObjectType' } , '' )
				 	]),	

				 	Builder.node('div' , { id:'' , style:'' } , [
						Builder.node('div' , { id:'swfObjectInserer', style:'width:80px;text-align:center;border:1px solid #DEDEDE;'} , 'Inserer')			 	
				 	])
			 	]) 
 			]); 		 		 		
 	$(bodyReference).appendChild(el);	
 	
 	Effect.BlindDown('swfObjectWrapper' , { duration:0.4 });

 	Event.observe('swfObjectInserer', "click", loadSwfLightbox, false); 	
    
 }


/*
 * 
 * FBO :2007/04/23 Ticket 12 END
 * 
 *******************************************************************************************/
 
 
 


function InsereDocument (nomchamp, typechamp, racineabsolue, strcallby) 
{
	if (typechamp == 'document2' || typechamp == 'flash' || typechamp == 'real')
	{
		var result = showModalDialog(racineabsolue+"/commun/dialoggenerique.php?callby="+strcallby+"&page=3&typechamp="+typechamp, "", "resizable:yes");
	}
	else if ((typechamp == 'wysiwyg') || (typechamp == 'document1'))
	{
		var result = showModalDialog(racineabsolue+"/commun/dialoggenerique.php?callby="+strcallby+"&page=2&typechamp="+typechamp, "", "resizable:yes;dialogHeight:400px;dialogWidth:700px");
	}

	if (result != null)
	{
		if ((typechamp == 'document1') || (typechamp == 'document2') || (typechamp == 'flash') || (typechamp == 'real'))
		{
			eval ("document.all." + nomchamp).value = result;
		}
		else if (typechamp == 'wysiwyg')
		{
			eval(nomchamp + "_iframe").focus (); 

			var objSelection = eval(nomchamp + "_iframe").document.selection.createRange();
			objSelection.pasteHTML(result);
		}
	}
}

// Cette ouvre une popup afin de permettre d'uploader un document via un formulaire simple
// puis l'insère dans un champ wysiwyg
function InsereDocumentSimple (nomchamp, racineabsolue, strcallby) 
{
//	window.open(racineabsolue+ "/commun/dialoggenerique.php?callby=" + strcallby +"&page=1");
	var result = showModalDialog(racineabsolue+ "/commun/dialoggenerique.php?callby=" + strcallby +"&page=1", "", "resizable:yes;dialogHeight:200px;dialogWidth:700px");

	if (result != null)
	{
		eval(nomchamp + "_iframe").focus (); 

		var objSelection = eval(nomchamp + "_iframe").document.selection.createRange();
		objSelection.pasteHTML(result);
	}
}
/*
function glossaire (theselection, texteaucunmot, modeEdition)
{
	// Mode d'edition refuse
	if (!modeEdition)
		return;

	therange = theselection.createRange();
	texte = therange.text;
	if(texte=="")
	{
		alert (texteaucunmot);
		return false;
	}
	else
	{
		textehtml = therange.htmlText;
		textehtml = "<SPAN class=glossaire>" + texte + "</SPAN> ";
		therange.execCommand("Delete");
		therange.pasteHTML(textehtml);
	}
}
*/
function RetireSpanVide(strChaineATraiter){
	// On remplace les <span class="quelqueChose"></span> qui aurait ete laisses par l'application
	var exp = /<SPAN([^>]*)>\s*<\/SPAN>/gi;
	while (exp.test(strChaineATraiter)){
		strChaineATraiter = strChaineATraiter.replace(exp, "");
//		alert('strChaineATraiter : '+ strChaineATraiter + '\n exp.test(strChaineATraiter)' + exp.test(strChaineATraiter)) ;
	}
	strChaineATraiter = strChaineATraiter.replace(/<SPAN([^>]+)><\/P>/gi, "</P>");
	return strChaineATraiter;
}
function RetirePvide(strChaineATraiter){
	// On remplace les <span class="quelqueChose"></span> qui aurait ete laisses par l'application
	var exp = /<P>\r/gi;
	var exp = /<P>\s\n/gi;
	while (exp.test(strChaineATraiter)){
		strChaineATraiter = strChaineATraiter.replace(exp, "");
		alert('strChaineATraiter : '+ strChaineATraiter + '\n exp.test(strChaineATraiter)' + exp.test(strChaineATraiter)) ;
	}
	strChaineATraiter = strChaineATraiter.replace(/<P>\n/gi, "");
	return strChaineATraiter;
}




// Rajout d'un style CSS a l'element selectionne de l'iframe passe en parametre
	// strErreurImbrication contient le message en cas d'imbrication de styles complexes
function AddStyleComplet(IFrameChoisie, nameOfStyle, modeEdition, strErreurImbrication, strErreurAucunMot){
	// Tableau de reference
	
	var boolDebugAddStyleComplet=false;//variable qui permet d'activer les messages de debuggages
	if (boolDebugAddStyleComplet==true){
		alert ('addstyle1  ');
	}
	var ArrBaliseParagraphe = new Array("P", "H");
	test_balise=true;//nom a changer
	
	// Blindage de fonction
	if(nameOfStyle =="" || !modeEdition) 
		return;

	// focus est obligatoire car sinon il est possible que tout la page appelante soit utilisee
	IFrameChoisie.focus();
	
	// on vérifie que l'on est pas dans un tableau dans ce cas on n'applique pas le style car celui-ci buggerait
	if (HasAncestorNode(IFrameChoisie, "TABLE"))
	{
		return;
	}
	/*Permet de traiter le cas particulier sans balise P*/
	if (!HasAncestorNode(IFrameChoisie, "P"))
	{
		if (boolDebugAddStyleComplet==true){
			alert('pas résultat td et de P');
		}
		test_balise=false;	
	}
	// Definition de constantes qui seront utilisees pour determiner le type de traitement a faire
	var MotCleAlignement      = 'Alignement';
	var MotCleListeNumerique  = 'ListeNumerique';
	var MotCleListeNormal     = 'ListeNormale';
	
	// Selection du range du textArea 
	textAreaRange = IFrameChoisie.document.body.createTextRange();
	
	// Selection du texte normal et HTML
	var theselection     = IFrameChoisie.document.selection;
	rangeSelectionne     = theselection.createRange();
	var texte            = rangeSelectionne.text;
	
	// Initilisation des balises
	var BaliseDebut = "SPAN";
	var BaliseFin   = "SPAN";

	// Definition du cas a traiter
	var AlignementATraiter = nameOfStyle.lastIndexOf(MotCleAlignement)>=0;
	var OlATraiter         = nameOfStyle.lastIndexOf(MotCleListeNumerique)>=0;
	var UlATraiter         = nameOfStyle.lastIndexOf(MotCleListeNormal)>=0;
	var HnATraiter         = (nameOfStyle.lastIndexOf("H")>=0 && nameOfStyle.length == 2);
	
	// Variable pour forcer l'imbrication
	var EstStyleSimple = false;
	//alert('style complique');
	if (nameOfStyle.toUpperCase().indexOf("GRAS")>0 || nameOfStyle.toUpperCase().indexOf("ITALI")>0 || nameOfStyle.toUpperCase().indexOf("SOULIGNE")>0 || nameOfStyle.toUpperCase().indexOf("UNDER")>0) {
		EstStyleSimple = true;
		//alert('style complique');

	}
	//alert(EstStyleSimple);
	/*
	else{
		alert('style complique');
	}
	*/
	// Mot cle contenant le "pattern" a selectionner. IE ne gerant pas les paragraphes, ce cas sera traiter a part.
	var MotifASelectioner  = "";
	
	// Prefixe et suffixe a rajouter avant le colle du code HTML. Utilise lorsque l'utilisateur a selecttionne tout un paragraphe
	var strPrefixeTextHtml = "";
	var strSuffixeTextHtml = "";
	
	if (texte == "" && !(OlATraiter || UlATraiter || AlignementATraiter || HnATraiter)){
		
		alert(strErreurAucunMot)
		return;
	}
			
	// Definition d'un booleen forcant le coller
	ToutPaster = false;

	// Traitement particulier suivant le style envoye
	if (UlATraiter || OlATraiter || AlignementATraiter || HnATraiter){
		MotifASelectioner = 'paragraphe';
	}
	if (AlignementATraiter){
		BaliseDebut        = "P";
		BaliseFin          = "P";
		strPrefixeTextHtml = "";
		strSuffixeTextHtml = "";
	}
	else if (HnATraiter){
		BaliseDebut = nameOfStyle;
		BaliseFin   = nameOfStyle;
		strPrefixeTextHtml = nameOfStyle;
		strSuffixeTextHtml = nameOfStyle;
	}
	else if (OlATraiter){
		BaliseDebut        = "<LI>";
		BaliseFin          = "";
		strPrefixeTextHtml = "OL";
		strSuffixeTextHtml = "OL";
	}
	else if (UlATraiter){
		BaliseDebut        = "<LI>";
		BaliseFin          = "";
		strPrefixeTextHtml = "UL";
		strSuffixeTextHtml = "UL";
	}
	
	// Selection de tout le MotifASelectioner si c'est necessaire. Dans le cas du paragraphe => traitement sur les chaines de caractere (cf plus loin)
	if (MotifASelectioner!="" && MotifASelectioner != 'paragraphe'){
		rangeSelectionne.expand(MotifASelectioner);
	}
		
	// Recuperation de la partie avant la selection
	var arrResultatAvant = new Array();
	getAvantTexteRangeSelectionne(textAreaRange, rangeSelectionne, arrResultatAvant);
	var StrHtmlDebut     = arrResultatAvant["chaine"];
	if (boolDebugAddStyleComplet==true){
		alert('StrHtmlDebut*'+StrHtmlDebut);
	}	
	var intNbDeplacement = arrResultatAvant["NbDeplacement"];

	// Recuperation de la partie apres la selection
	var arrResultatApres = new Array();
	getApresTexteRangeSelectionne(textAreaRange, rangeSelectionne, arrResultatApres);
	var StrHtmlApres     = arrResultatApres["chaine"];
	if (boolDebugAddStyleComplet==true){
		alert('StrHtmlApres*'+StrHtmlApres);
	}	
	// !! Un peu de rapiecage... dans le cas la balise de fermeture n'est pas complete ie le champs est de la forme : /P>
	var nbOccurenceOuvertureInf  = CompteNombreOccurence(StrHtmlApres, "<");
	var nbOccurenceFermertureSup = CompteNombreOccurence(StrHtmlApres, ">");
	
	if (nbOccurenceFermertureSup ==  nbOccurenceOuvertureInf  + 1){
		StrHtmlApres =  "<" + StrHtmlApres;
	}
	var NbFinSpan        = arrResultatApres["nbFinSpan"];
	
	// Recuperation du texte selectionne
	
	//test=textAreaRange.htmlText;
	if (boolDebugAddStyleComplet==true){
	//	alert ('test**'+test +'*StrHtmlDebut*'+StrHtmlDebut+'*StrHtmlApres*'+StrHtmlApres);
		alert ('StrHtmlDebut *'+StrHtmlDebut+'* StrHtmlApres '+StrHtmlApres);
	}
	StrHtmlSelectionne = getTexteRangeSelectionne(NettoieRange(textAreaRange.htmlText), StrHtmlDebut, StrHtmlApres);

	if (boolDebugAddStyleComplet==true){	
		alert ('0 StrHtmlSelectionne *'+StrHtmlSelectionne);
	}
	

	if (boolDebugAddStyleComplet==true){	
		alert ('1bis StrHtmlSelectionne *'+StrHtmlSelectionne);
	}
	// !! Un peu de rapiecage... 
	var intPosInf = StrHtmlApres.indexOf("<");
	if (intPosInf <0){
		intPosInf = StrHtmlApres.length - 1;
	}
	var intPosSup = StrHtmlApres.indexOf(">");
	// Si le paragraphe commence par une balise de P non ouverte(cas ou le carret est en fin d'un paragraphe)
	if (StrHtmlApres.toUpperCase().indexOf("P") == 0 && intPosInf > intPosSup ){
		StrHtmlApres =  "<"+ StrHtmlApres;
	}
	intDebutTagP = StrHtmlSelectionne.toUpperCase().indexOf("<P");
	
	if (CompteNombreOccurence(StrHtmlSelectionne, "</OL>")>0 && CompteNombreOccurence(StrHtmlSelectionne, "</UL>")>0){
		alert('Vous ne pouvez pas appliquer ce style car vous avez sélectionné la fin d\'une liste. Veuillez sélectionner moins.');
		return;
	}

	if (VerifieImbrication(IFrameChoisie,NettoieRange(textAreaRange.htmlText), StrHtmlSelectionne, StrHtmlDebut.length -1, strErreurImbrication, nameOfStyle)== false){
		//InsereStyle(IFrameChoisie);
		//alert('Pour permettre imbrication');
		return;//pour permettre changement
	}

	//alert('__avant para__\n StrHtmlSelectionne : ||'+StrHtmlSelectionne + '||\nStrHtmlDebut  : ||' +StrHtmlDebut + '||\n StrHtmlApres :||'+StrHtmlApres+'||')

	// Selection de tout le paragraphe
	if (MotifASelectioner == 'paragraphe'){
		
		
		if (boolDebugAddStyleComplet){
			alert (' Motif selectionner est un paragraphe ');
		}
		arrNouvellesChaines = new Array();
		if (NettoieRange(textAreaRange.htmlText.toUpperCase()).indexOf("<P") <0 && NettoieRange(textAreaRange.htmlText.toUpperCase()).indexOf("<H") <0){
			StrHtmlDebut = "<P>" + StrHtmlDebut;
			StrHtmlApres = StrHtmlApres + "</P>";
		}

		if (boolDebugAddStyleComplet==true){
			alert ('StrHtmlDebut '+StrHtmlDebut+' StrHtmlApres '+StrHtmlApres);	
		}

		SelectionneParagraphe(StrHtmlDebut, StrHtmlSelectionne, StrHtmlApres, arrNouvellesChaines);
		StrHtmlDebut        = arrNouvellesChaines["debut"];
		
		StrHtmlSelectionne  = arrNouvellesChaines["milieu"];
		
		StrHtmlApres        = arrNouvellesChaines["fin"];
		
		ToutPaster = true;
		
		if (boolDebugAddStyleComplet==true){
			alert ('StrHtmlDebut '+StrHtmlDebut+' StrHtmlSelectionne '+ StrHtmlSelectionne +' StrHtmlApres '+StrHtmlApres);	
		}
	}
	
	// Determination des tableaux de span ouverts
	var ArrStyleOuvert = CreeTableauStyleOuvert(NettoieRange(textAreaRange.htmlText), StrHtmlSelectionne, StrHtmlDebut.length -1, "SPAN");

	if (VerifieImbrication(IFrameChoisie,NettoieRange(textAreaRange.htmlText), StrHtmlSelectionne, StrHtmlDebut.length -1, strErreurImbrication, nameOfStyle)== false){
		//InsereStyle(IFrameChoisie);
		return;
	}

	
	//A ce moment du traitement, on a reconstitue la chaine du textarea
	//alert('__Selection__\n StrHtmlDebut : ||'+StrHtmlDebut +'||\n StrHtmlApres : ||' + StrHtmlApres + '||\n StrHtmlSelectionne : ||'+StrHtmlSelectionne+'||\n s \n Tout : '+NettoieRange(textAreaRange.htmlText)+ '\n NbFinSpan :' + NbFinSpan);
	
	// ... On commence par modifier toutes les balises de debut et de fin de paragraphe par la valeur de la nouvelle balise
	ArrBaliseParagrapheOuverture = new Array();
	ArrBaliseParagrapheFermerture = new Array();
				
	for(var i=0; i<ArrBaliseParagraphe.length;i++){
		ArrBaliseParagrapheOuverture[i]  = "<"+ArrBaliseParagraphe[i];
		ArrBaliseParagrapheFermerture[i] = "</"+ArrBaliseParagraphe[i];
	}
		
	// .... Puis Dans le cas d'un paragraphe...
	if (MotifASelectioner == 'paragraphe'){
		if (boolDebugAddStyleComplet)
			alert(' motif selection paragraphe ');
		if (CompteNombreOccurence(StrHtmlSelectionne, "<LI>")>0){
			alert("Vous ne pouvez pas imposer ce style car vous avez sélectionné une liste.")
			return;
		}
		if (HnATraiter){
			
			//StrHtmlSelectionne = SupprimeBaliseOuvertureEtFermertureParagraphe(StrHtmlSelectionne, new Array());
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheOuverture, "<"+BaliseDebut+">", false);
	//		alert('vt : '+StrHtmlSelectionne)
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheFermerture, "</"+BaliseFin+">", true);
	//		alert('ap : '+StrHtmlSelectionne)
			//textehtml = '<'+BaliseDebut+'>' + StrHtmlSelectionne + '</'+BaliseFin+'>';
			textehtml = StrHtmlSelectionne;
			if (boolDebugAddStyleComplet)
				alert('text'+textehtml);
		}
		else if (OlATraiter || UlATraiter){
			if (boolDebugAddStyleComplet)
				alert('dans le 3em if');
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheOuverture, BaliseDebut, false);
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheFermerture, BaliseFin, true);
			textehtml = '<'+strPrefixeTextHtml+ ' class="' + nameOfStyle + '">' + StrHtmlSelectionne + '</'+strSuffixeTextHtml+'>';
		}
		else if(AlignementATraiter){
			if (boolDebugAddStyleComplet)
				alert('dans le 4em if');
	//		StrHtmlSelectionne = '<'+BaliseDebut+ ' class="' + nameOfStyle + '">' + StrHtmlSelectionne + "</"+BaliseFin+">";
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheOuverture, '<'+BaliseDebut+ ' class="' + nameOfStyle + '">', false);
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheFermerture, "</"+BaliseFin+">", true);
			textehtml = StrHtmlSelectionne;
		}
	}
	else{
		var RajoutSpan = (BaliseDebut.toUpperCase().indexOf("SPAN") >=0 );
		// ... Ou dans le cas d'un span...
		
		if (RajoutSpan){
			// Cas ou tout le texte est selectionne
			//StrHtmlApres='d';//pour ne pas rentrer dans cette condition
			if (StrHtmlDebut == "" && StrHtmlApres =="") {
				// Il est possible qu'un replace fasse l'affaire?
				if (!test_balise){
					if (boolDebugAddStyleComplet==true){
						alert('aucune balise et test'+test_balise);
					}
				}
				else{
					//alert ('balise en vue et test '+test_balise);
					alert("Vous ne pouvez pas sélectionner tout le texte");
					return;
				}
				
			}

			
			// Protection contre l'application d'un style sur plusieurs paragraphes
			var nbOccurenceOuverture = 0;
			var nbOccurenceFermeture = 0;
			var posBaliseOuvrante    = -1;
			var posBaliseFermante    = -1;
			var boolSurPlusieursParagraphes = false;
			for(var i=0;i<ArrBaliseParagraphe.length;i++){
				// Il est possible qu'un replace fasse l'affaire?
				nbOccurenceOuverture = CompteNombreOccurence(StrHtmlSelectionne, "<"+ArrBaliseParagraphe[i]);
				nbOccurenceFermeture = CompteNombreOccurence(StrHtmlSelectionne, "</"+ArrBaliseParagraphe[i]+">");
				posBaliseFermante = StrHtmlSelectionne.indexOf("</"+ArrBaliseParagraphe[i]+">");
				posBaliseOuvrante = StrHtmlSelectionne.indexOf("<"+ArrBaliseParagraphe[i]);
				if (nbOccurenceFermeture == nbOccurenceOuverture && posBaliseFermante < posBaliseOuvrante){
					boolSurPlusieursParagraphes = true;
				}
				if (nbOccurenceOuverture == nbOccurenceFermeture && (nbOccurenceFermeture >1 ) ){
					boolSurPlusieursParagraphes = true;
				}
				if (nbOccurenceOuverture != nbOccurenceFermeture && (nbOccurenceFermeture > 1 || nbOccurenceOuverture > 1)){
					boolSurPlusieursParagraphes = true;
				}
				if (boolSurPlusieursParagraphes){
					alert("Vous ne pouvez pas appliquer un style sur plusieurs paragraphes.");
					return;
				}
			}
		
			var ArrBalisesParagrapheCourant = new Array();
			//alert('avant sup bliase : '+StrHtmlSelectionne);
			if (boolDebugAddStyleComplet==true){
				alert ('1 StrHtmlSelectionne *'+StrHtmlSelectionne);
			}
			while(StrHtmlSelectionne.toUpperCase().indexOf("</SPAN>")==0){
				var intPosFermerture = 7;
				StrHtmlDebut = StrHtmlDebut + StrHtmlSelectionne.substring(0, intPosFermerture);
				StrHtmlSelectionne = StrHtmlSelectionne.substring(intPosFermerture, StrHtmlSelectionne.length);
			}
			if (boolDebugAddStyleComplet==true){
				alert ('2 StrHtmlSelectionne *'+StrHtmlSelectionne);
			}
			
			HtmlSelectionne = SupprimeBaliseOuvertureEtFermertureParagraphe(StrHtmlSelectionne, ArrBalisesParagrapheCourant);				
						
			if (boolDebugAddStyleComplet==true){
				alert ('3 StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}
			//alert('avant : '+ArrBalisesParagrapheCourant["baliseOuvrante"] + '\n apres : '+ArrBalisesParagrapheCourant["baliseFermante"] + '\nStrHtmlSelectionne'+StrHtmlSelectionne);
			/*Maroane : traitement pour sortir l espace du span*/
			StrHtmlSelectionne = AppliqueStyle(nameOfStyle, StrHtmlSelectionne, NettoieRange(textAreaRange.htmlText), StrHtmlDebut);
		
			StrHtmlSelectionne=StrHtmlSelectionne.replace(/(\s)|(&nbsp;)/g,'##'); 
			
			StrHtmlSelectionne=StrHtmlSelectionne.replace(/(#*)<\/SPAN>/gi,"</SPAN>$1");

			StrHtmlSelectionne=StrHtmlSelectionne.replace(/(##)/g," "); 

			if (boolDebugAddStyleComplet==true){				
				alert ('4 StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}
						

			//	StrHtmlSelectionne=StrHtmlSelectionne.replace(/ <P>{.w+}</P> /g,"toto $1 toto");
			//return string.replace(/(#*)<\/SPAN>/gi,"</SPAN>$1");
			//	StrChaineAEvaluer = 'StrHtmlSelectionne.replace(\"' + StrHtmlSelectionne + '\", "")';
			//	return string.replace(/&nbsp;\'>/gi," \'>");
			// 	StrHtmlSelectionne = StrHtmlSelectionne.replace (/<br\/>/gi,"<_br_/>");
			//	StrChaineAEvaluer = 'StrHtmlSelectionne.replace( / <P>{ .w+ } /g , "toto $1 toto")';	
			//	StrChaineAEvaluer = 'StrHtmlSelectionne.replace( / <P> /g , "toto ")';	

			// traitementspécial pour : sortir les P, ouvrantes et fermantes du span
			var exp= '<SPAN class=\'(.+)\'><P>(.+)</P></SPAN>';
			//var rempl='<P><SPAN class=$1 > $2 </SPAN></P> ';			
			var rempl='<SPAN class=$1 > $2 </SPAN>';			
			var expReg=new RegExp(exp, 'gi');
			var expRegC=new RegExp(); // pour «compile»
			StrHtmlSelectionne=StrHtmlSelectionne.replace(expReg, rempl);

			if (boolDebugAddStyleComplet==true){				
				alert ('5bis StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}
			//traitement spéciale pour sortir P, fermante  du span
			var exp= '(.+)</P></SPAN>';
			var rempl='$1</SPAN>';			
			var expReg=new RegExp(exp, 'gi');
			var expRegC=new RegExp(); // pour «compile»
			StrHtmlSelectionne=StrHtmlSelectionne.replace(expReg, rempl);			

			if (boolDebugAddStyleComplet==true){				
				alert ('5bisbis StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}

			
			//traitement spéciale pour sortir P, fermante  du span			
			var exp= '<SPAN class=\'(.+)\'><P>';
			var rempl='<SPAN class=$1 >';			
			var expReg=new RegExp(exp, 'gi');
			var expRegC=new RegExp(); // pour «compile»
			StrHtmlSelectionne=StrHtmlSelectionne.replace(expReg, rempl);			
			
			if (boolDebugAddStyleComplet==true){				
				alert ('5bisbisbis StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}
			
			

			/*Maroane : fin traitement */			
			
			
			//boolDebugAddStyleComplet=false;
			StrHtmlSelectionne = ArrBalisesParagrapheCourant["baliseOuvrante"] + StrHtmlSelectionne + ArrBalisesParagrapheCourant["baliseFermante"];
			if (boolDebugAddStyleComplet==true){
				alert ('5 StrHtmlSelectionne :'+StrHtmlSelectionne);
			}
		}
		if (boolDebugAddStyleComplet==true){
			alert ('6 StrHtmlSelectionne *'+StrHtmlSelectionne);
		}
		textehtml = StrHtmlSelectionne;
		if (boolDebugAddStyleComplet==true){
			alert ('7 texte html *'+textehtml);//avant cette variable n existe pas
		}
	}
	if (boolDebugAddStyleComplet==true)
		alert ('3texte html3*'+textehtml);
	textehtml = StrHtmlDebut + textehtml+ StrHtmlApres;
	if (boolDebugAddStyleComplet==true){
		alert ('8 texte html*'+textehtml);
	}
	//alert ('strg selec'+StrHtmlSelectionne);
	//alert('*avant paste :*'+textehtml+'*html debut*'+StrHtmlDebut+'*html apres*'+StrHtmlApres);
	textehtml = RetireSpanVide(textehtml);
	if (boolDebugAddStyleComplet==true){
		alert ('9 texte html*'+textehtml);
	}
	IFrameChoisie.document.execCommand("SelectAll");
	if (boolDebugAddStyleComplet==true){
		alert('avant commande delete');
	}
	IFrameChoisie.document.execCommand("delete");
	IFrameChoisie.document.clear();
	if (boolDebugAddStyleComplet==true){
		alert ('textAreaRange'+textAreaRange);
	}
	textAreaRange.pasteHTML(textehtml);
	//alert ('texte html*'+textAreaRange.htmlText+'*texte html'+textehtml);

	textAreaRange = IFrameChoisie.document.body.createTextRange();
	workRange     = textAreaRange.duplicate();
 	workRange.setEndPoint("StartToStart", textAreaRange);
	workRange.setEndPoint("EndToStart", textAreaRange);
	var NbAvance = 0;	
	// Aggrandissement du workRange jusqu'a ce qu'il arrive a RangeSelectionne
	while(NbAvance < intNbDeplacement){
		workRange.moveEnd("character", 1);
		NbAvance++;
	}
	workRange.collapse(false);
	workRange.select();

//	alert('__Fin__\n StrHtmlDebut : '+StrHtmlDebut +'\n StrHtmlApres : ' + StrHtmlApres + '\n StrHtmlSelectionne : '+StrHtmlSelectionne+'\n s \n Tout : '+NettoieRange(textAreaRange.htmlText)+ '\n NbFinSpan :' + NbFinSpan +'\n textehtml : '+ textehtml);
	//boolDebugAddStyleComplet=false;
	if (boolDebugAddStyleComplet==true){
		alert ('Félicitation fin fonction add style');
	}
}

// Fonction cherchant les tags ouverts NomTag et non fermes de textAreaTexteHtml qui precedent  texteHtmlSelectionne a partir de posHtmlSelectionne
function CreeTableauStyleOuvert(textAreaTexteHtml, texteHtmlSelectionne, posHtmlSelectionne, NomTag){
	// Cas aux limites
	if (texteHtmlSelectionne==textAreaTexteHtml)
		return new Array();
	if (trim(texteHtmlSelectionne) == "" || trim(textAreaTexteHtml)=="")
		return new Array();
	
	// Gestion de la surcharge de la fonction
	var estSurchargee = false;
	var ArrRetour;
	var Style = "";
	if ( CreeTableauStyleOuvert.arguments[4] != undefined){
		ArrRetour     = new Array();
		ArrRetour     = CreeTableauStyleOuvert.arguments[4];
		estSurchargee = true;
		Style = ArrRetour["SpanASupprimer"];
	}
		
		
	// Texte selectionne sans SPAN (utilise dans la surcharge de la fonction)
	var StrTexteSansSpan = "";
	
	// Tableau dans lequel sera pushe/pop les tag trouves et qui sera renvoye
	var arrTagOuvert = new Array();
	
	// Constantes
	var DebutTag = "<SPAN";
	var FinTag   = "</SPAN";
	if (NomTag != ""){
		DebutTag = "<"+NomTag ;
		FinTag   = "</"+NomTag;
	}

	
	// Quelques variables
	texteHtmlSelectionne       = texteHtmlSelectionne.toUpperCase();
	var posTraitement          = 0; // Variable temporaire qui prendre la position de l'element courant
	var posDebutEltARechercher = posHtmlSelectionne;
	var texteTmp               = NettoieRange(textAreaTexteHtml);// Texte temporaire qui prendra la chaine de caractere a traiter
	var texteTag              = "";

	while(posTraitement<posDebutEltARechercher)
	{
		
		// Determination de l'ouverture ou de la fermeture du tag qui arrive
  		posDebutTag = texteTmp.toUpperCase().indexOf(DebutTag.toUpperCase(), 0);	// Position de la balise d'ouverture de style
  		posFinTag   = texteTmp.toUpperCase().indexOf(FinTag.toUpperCase(), 0);	// Position de la balise de fermeture de style
  		
  		
  		// Determination du min entre ces 2 valeurs
  		posMinTag   = posDebutTag;
  		if (posDebutTag > posFinTag || posMinTag<0 ){
  			posMinTag = posFinTag;
  		}
  		
  		// Cas final : la prochaine balise de style est apres le debut du texte a rechercher
  		if( posMinTag>0 && (posMinTag +  posTraitement >posDebutEltARechercher)){
  			posTraitement = posDebutEltARechercher;
  		}
  		else{
  			// Rajout du style dans le tableau de retour
  			if ((posDebutTag < posFinTag && posDebutTag>=0) || (posFinTag <=0 && posDebutTag>0)){
  				// Recuperation du tag
  				texteTag = texteTmp.substring(posDebutTag, texteTmp.indexOf(">", posDebutTag + 1) +1);
  				texteTag = NettoieRange(texteTag);
  				// Push dans le tableau
  				arrTagOuvert.push(texteTag);
  				// Calcul de la nouvelle position
	  			nouveauPosTraitement = posTraitement + texteTag.length + posDebutTag;
				if (estSurchargee && texteTag.indexOf(Style)>0){
  					StrTexteSansSpan = StrTexteSansSpan + texteTmp.substring(posTraitement, posDebutTag);
  				}
  				// Affectation pour le prochain tour
	  			posTraitement = nouveauPosTraitement;
  			}
  			// Suppression du style dans le tableau de retour
  			else if (posFinTag>=0){
  				 // Calcul de la nouvelle position
  				nouveauPosTraitement = posTraitement + posFinTag + FinTag.length + 1;
  				if (arrTagOuvert.length>0) {
  					if (estSurchargee && arrTagOuvert[arrTagOuvert.length - 1].indexOf(Style)>0){
	  					StrTexteSansSpan = StrTexteSansSpan + texteTmp.substring(posTraitement, nouveauPosTraitement +1);
	  				}
	  			}
  				// Suppression de la derniere valeur du tableau
  				arrTagOuvert.pop();
  				// Affectation pour le prochain tour
	  			posTraitement = nouveauPosTraitement;
  			}
  			else{
  				if (estSurchargee){
	  				StrTexteSansSpan = StrTexteSansSpan + texteTmp;
	  			}
  				// Cas final : Il n'y a plus de balise de style Tag
  				posTraitement = posDebutEltARechercher;
  			}
  			// Mise a jour de la variable de traitement
  			
  			texteTmp = textAreaTexteHtml.substring(posTraitement, textAreaTexteHtml.length);
  		}
 	}
 	
 	// Renvoie le texte sans SPAN si la fonction est surcharge
 	if (estSurchargee){
 		var expOuvertureSpan = new RegExp("<span class=[\"']?"+Style+"[\"']?","gi");
		StrTexteSansSpan = StrTexteSansSpan.replace(expOuvertureSpan, "");
 		ArrRetour["strSansSpanFermerture"] = StrTexteSansSpan;
 	}
 		
 	return arrTagOuvert;
}

// Renvoie dans outArray la chaine de caractere et le nombre de SPAN non ferme avant le rangeselectionne du textAreaRange (supprime les caracteres rajoutes par .htmltext)
function getAvantTexteRangeSelectionne(textAreaRange, RangeSelectionne, outArray){

	//var boolDebugAvantTexte=true;
	var boolDebugAvantTexte=false;
	// Initialisation du range de travail au debut du textArea passe en parametre
	workRange = textAreaRange.duplicate();
 	workRange.setEndPoint("StartToStart", textAreaRange);
	workRange.setEndPoint("EndToStart", textAreaRange);
	var NbRecul = 0;	
	// Aggrandissement du workRange jusqu'a ce qu'il arrive a RangeSelectionne
	while(workRange.compareEndPoints("EndToStart", RangeSelectionne) < 0){
		workRange.moveEnd("character", 1);
		NbRecul++;
	}
	if (NbRecul ==0){
		outArray["chaine"]     = "";
 		outArray["nbDebutSpan"] = 0;
		return outArray;
	}
 	
 	// Recul d'un element pour recuperer la balise fermante pour les paragraphes. Ce deplacement peut entrainer la perte d'un caractere. On le rajoutera plus tard si ce n'est pas un paragraphe.
 	workRange.moveEnd("character", -1);
 	
 	nbDebutStyleSpan = NombreDebutDeStyle(workRange, "<SPAN");
 	
 	// Recuperation et nettoyage des textes
 	if (boolDebugAvantTexte)
	 	alert('workRange*'+workRange.text);
 	var RangeTexteHtml   = NettoieRange(workRange.htmlText);
 	var TextAreaTextHtml = NettoieRange(textAreaRange.htmlText);
 //	alert('RangeTexteHtml AVT : '+RangeTexteHtml +'\n RangeSelectionne : ' +RangeSelectionne.htmlText + '\nTextAreaTextHtml : '+TextAreaTextHtml)
 	var boolIdentique    = true;
 	var strDebut         = "";
 	
 	// Avant de commencer, nous verifions que le debut des deux range est identique : dans certains cas, il manque la balise <P>
 	if (TextAreaTextHtml.toUpperCase().indexOf("<P", 0) == 0 && RangeTexteHtml.indexOf("<P", 0)!=0 && RangeTexteHtml!=""){
 		var StrBaliseP = TextAreaTextHtml.substring(0, TextAreaTextHtml.indexOf(">") + 1);
// 		alert('Ajout <p>' + StrBaliseP);
 		RangeTexteHtml = StrBaliseP + RangeTexteHtml;
 	}
 	// La recuperation du code HTML a entraine le rajout d'element en plus... En comparant le texte html nettoye des deux ranges, nous reconstruisions le texte
 	var FinPos = 0;
	if (boolDebugAvantTexte)
		alert('RangeTexteHtml '+RangeTexteHtml+'TextAreaTextHtml '+TextAreaTextHtml);
	for(var j=0; j<RangeTexteHtml.length && boolIdentique;j++){
 		if (RangeTexteHtml.charAt(j)== TextAreaTextHtml.charAt(j)) {
 			strDebut = strDebut + TextAreaTextHtml.charAt(j);
			//alert('strDebut*'+strDebut+'*RangeTexteHtml '+RangeTexteHtml.charAt(j)+'*TextAreaTextHtml '+TextAreaTextHtml.charAt(j));
					
 	 	}
 		else{
 		 	boolIdentique = false;
 		}
 		 FinPos = j;
 	}
 	if (boolDebugAvantTexte){
		alert('0strDebut : '+strDebut);
	}
 	// Dans le cas ou on est sorti de la boucle en atteignant la fin de la chaine de comparaison, il faut avancer d'un cran car FinPos est encore dans cette chaine de debut
 	if (boolIdentique){
 		FinPos++;
 	}
 	if(strDebut.charAt(strDebut.length -1 ) == "<"){
 		strDebut = strDebut.substring(0, strDebut.length -1);
 		FinPos  = RangeTexteHtml.length  +1;
 		if (boolDebugAvantTexte){
			alert('1strDebut : '+strDebut);
		}
 	}
 	

 	// Si l'utilisateur n'a pas selectionne un paragraphe entier => le debut du range a un caractere en trop
 	//if (strDebut.charAt(strDebut.length - 1) != ">" && FinPos <= RangeTexteHtml.length && FinPos >0){
 	if (FinPos <= RangeTexteHtml.length && FinPos >0){
 		if (TextAreaTextHtml.charAt(FinPos) != "<"){
 			strDebut = strDebut + TextAreaTextHtml.charAt(FinPos);
 			if (boolDebugAvantTexte){
				alert('2strDebut : '+strDebut)
			}
 		}
 	}
 	if (boolDebugAvantTexte){
		alert('3strDebut : '+strDebut)
	}
 	outArray["NbDeplacement"] = NbRecul;
 	outArray["chaine"]        = strDebut;
 	outArray["nbDebutSpan"]   = nbDebutStyleSpan;
	return outArray;
}
//--------
// Renvoie dans outArray la chaine de caractere et le nombre de SPAN non ferme avant le rangeselectionne du textAreaRange (supprime les caracteres rajoutes par .htmltext)
function getAvantTexteRangeSelectionneBis(textAreaRange, RangeSelectionne, outArray){

	var boolDebugAvantTexte=true;
	// Initialisation du range de travail au debut du textArea passe en parametre
	workRange = textAreaRange.duplicate();
	alert('textAreaRange '+textAreaRange.text);
		
 	workRange.setEndPoint("StartToStart", textAreaRange);
	workRange.setEndPoint("EndToStart", textAreaRange);
	var NbRecul = 0;	
	// Aggrandissement du workRange jusqu'a ce qu'il arrive a RangeSelectionne
	while(workRange.compareEndPoints("EndToStart", RangeSelectionne) < 0){
		workRange.moveEnd("character", 1);
		NbRecul++;
	}
	if (NbRecul ==0){
		outArray["chaine"]     = "";
 		outArray["nbDebutSpan"] = 0;
		return outArray;
	}
 	
 	// Recul d'un element pour recuperer la balise fermante pour les paragraphes. Ce deplacement peut entrainer la perte d'un caractere. On le rajoutera plus tard si ce n'est pas un paragraphe.
 	workRange.moveEnd("character", -1);
 	
 	//nbDebutStyleSpan = NombreDebutDeStyle(workRange, "<div");
 	nbDebutStyleDiv= NombreDebutDeStyle(workRange, "<DIV");
 	alert ('nbDebutStyleDiv '+nbDebutStyleDiv);
 	
 	// Recuperation et nettoyage des textes
 	if (boolDebugAvantTexte)
	 	alert('workRange*'+workRange.text);
 	var RangeTexteHtml   = NettoieRange(workRange.htmlText);
 	if (boolDebugAvantTexte)
 		alert('RangeTexteHtml*'+RangeTexteHtml);
 	var TextAreaTextHtml = NettoieRange(textAreaRange.htmlText);
 	if (boolDebugAvantTexte)
 		alert ('TextAreaTextHtml '+TextAreaTextHtml);
 //	alert('RangeTexteHtml AVT : '+RangeTexteHtml +'\n RangeSelectionne : ' +RangeSelectionne.htmlText + '\nTextAreaTextHtml : '+TextAreaTextHtml)
 	var boolIdentique    = true;
 	var strDebut         = "";
 	
 	// Avant de commencer, nous verifions que le debut des deux range est identique : dans certains cas, il manque la balise <P>
 	if (TextAreaTextHtml.toUpperCase().indexOf("<P", 0) == 0 && RangeTexteHtml.indexOf("<P", 0)!=0 && RangeTexteHtml!=""){
 		var StrBaliseP = TextAreaTextHtml.substring(0, TextAreaTextHtml.indexOf(">") + 1);
// 		alert('Ajout <p>' + StrBaliseP);
 		RangeTexteHtml = StrBaliseP + RangeTexteHtml;
 		if (boolDebugAvantTexte)
 			alert('RangeTexteHtml*'+RangeTexteHtml);
 		
 	}
 	
 	// La recuperation du code HTML a entraine le rajout d'element en plus... En comparant le texte html nettoye des deux ranges, nous reconstruisions le texte
 	var FinPos = 0;
	if (boolDebugAvantTexte)
		alert('RangeTexteHtml '+RangeTexteHtml+'TextAreaTextHtml '+TextAreaTextHtml);
	for(var j=0; j<RangeTexteHtml.length && boolIdentique;j++){
 		if (RangeTexteHtml.charAt(j)== TextAreaTextHtml.charAt(j)) {
 			strDebut = strDebut + TextAreaTextHtml.charAt(j);
			//alert('j '+j+' strDebut*'+strDebut+'*RangeTexteHtml '+RangeTexteHtml.charAt(j)+'*TextAreaTextHtml '+TextAreaTextHtml.charAt(j));
					
 	 	}
 		else{
 		 	boolIdentique = false;
 		}
 		 FinPos = j;
 		 //alert('j '+j+' strDebut*'+strDebut+'*RangeTexteHtml '+RangeTexteHtml.charAt(j)+'*TextAreaTextHtml '+TextAreaTextHtml.charAt(j));
	}
 	if (boolDebugAvantTexte){
		alert('0strDebut : '+strDebut);
	}
 	// Dans le cas ou on est sorti de la boucle en atteignant la fin de la chaine de comparaison, il faut avancer d'un cran car FinPos est encore dans cette chaine de debut
 	if (boolIdentique){
 		FinPos++;
 	}
 	if(strDebut.charAt(strDebut.length -1 ) == "<"){
 		strDebut = strDebut.substring(0, strDebut.length -1);
 		FinPos  = RangeTexteHtml.length  +1;
 		if (boolDebugAvantTexte){
			alert('1strDebut : '+strDebut);
		}
 	}
 	

 	// Si l'utilisateur n'a pas selectionne un paragraphe entier => le debut du range a un caractere en trop
 	//if (strDebut.charAt(strDebut.length - 1) != ">" && FinPos <= RangeTexteHtml.length && FinPos >0){
 	if (FinPos <= RangeTexteHtml.length && FinPos >0){
 		if (TextAreaTextHtml.charAt(FinPos) != "<"){
 			strDebut = strDebut + TextAreaTextHtml.charAt(FinPos);
 			if (boolDebugAvantTexte){
				alert('2strDebut : '+strDebut)
			}
 		}
 	}
 	if (boolDebugAvantTexte){
		alert('3strDebut : '+strDebut)
	}
 	outArray["NbDeplacement"] = NbRecul;
 	outArray["chaine"]        = strDebut;
 	outArray["nbDebutSpan"]   = nbDebutStyleDiv;
	return outArray;
}



//--------

// Fonction permettant de recuperer le text situe entre TextDebut et TextFin de la chaine textGlobal 
function getTexteRangeSelectionne(textGlobal, TextDebut, TextFin){
	posFin   = textGlobal.length - TextFin.length;
	
	if (posFin <= 0 && trim(TextFin.toUpperCase()) == "</P>"){
		posFin = textGlobal.length;
	}
	posDebut = textGlobal.indexOf(TextDebut) + TextDebut.length;
	
	//alert('__ Sel milieu__\n textGlobal : '+ textGlobal +'\n TextDebut :'+TextDebut + '\n TextFin :' +TextFin + ' \n posFin : '+ posFin + '\n posDebut : '+posDebut + '\n retourn : '+textGlobal.substring(posDebut, posFin))
	var strResultat = textGlobal.substring(posDebut, posFin);
	// !! rapiecage
	if (strResultat.charAt(strResultat.length -1) == "<"){
		strResultat = strResultat.substring(0, strResultat.length - 1);
	}
	//alert ('on est dans getTexteRangeSelectionne');
	//alert (strResultat);
	return strResultat;
}



// Idem getAvantTexteRangeSelectionne pour apres
function getApresTexteRangeSelectionne(textAreaRange, RangeSelectionne, outArray){
	/*
		si pas noeud parent 
			==> apres selection =''
			chaine= texte
			nb span=0
			
		IFrameChoisie.focus();
		if (!HasAncestorNode(IFrameChoisie, "TD"))
		{
			alert('pas de td');
		}
	*/
	var boolDebugApTexte=false;

	if (boolDebugApTexte==true){
		alert ('on est dans fonction apres selection');
		alert ('test_balise'+test_balise);
	}
	
	// Initialisation du range de travail a la fin du textArea passe en parametre
	workRange = textAreaRange.duplicate();
	workRange.setEndPoint("StartToEnd", textAreaRange);
	workRange.setEndPoint("EndToEnd", textAreaRange);
	
	// Deplacement du debut du  workRange jusqu'a ce qu'il arrive a RangeSelectionne
	while(workRange.compareEndPoints("StartToEnd", RangeSelectionne) > 0){
  		workRange.moveStart("character", -1);
 	}
 	
 	// Recuperation et nettoyage des textes
 	var WorkRangeText     = workRange.text;
 	var TextAreaTextHtml  = NettoieRange(textAreaRange.htmlText);
 	var nbFinStyleSpan = 0;
 	//alert ('WorkRangeText*'+WorkRangeText+'*TextAreaTextHtml*'+TextAreaTextHtml);
 	// Le workrange selectionne fini par retour a la ligne => c'est une fin de paragraphe
 	if (NettoieRange(WorkRangeText.charAt(0))== "") {
 		// Deplacement de 1 pour prendre le debut du paragraphe
 		workRange.moveStart("character", 1);
 	}
 	
	nbFinStyleSpan = NombreFinDeStyle(workRange, "</SPAN>");

 	var WorkRangeTextHtml = NettoieRange(workRange.htmlText);

 	var boolIdentique     = true;
 	var strFin            = "";
 	// A certain moment, le workrange ne possede pas la derniere balise (de fermeture). Nous allons le rajouter
	if (boolDebugApTexte==true){
	 	alert('strFin0'+strFin);
	}
 	var intPosSup  = TextAreaTextHtml.lastIndexOf('>');
 	var intPosInf  = TextAreaTextHtml.lastIndexOf("<");
 	var intPosInf2 = WorkRangeTextHtml.lastIndexOf("<");
 	if (intPosSup == (TextAreaTextHtml.length - 1) && WorkRangeTextHtml != "" && (TextAreaTextHtml.substring(intPosInf, TextAreaTextHtml.length) !=  WorkRangeTextHtml.substring(intPosInf2, WorkRangeTextHtml.length))){
 		var strDebutFinBalise = TextAreaTextHtml.substring(0, intPosInf);
 		var strDerniereBalise = TextAreaTextHtml.substring(intPosInf, intPosSup + 1);
 		WorkRangeTextHtml     = WorkRangeTextHtml + strDerniereBalise;
 	}
 	if (boolDebugApTexte==true){
	 	alert('strFin1'+strFin);
	}
	// La recuperation du code HTML a entraine le rajout d'element en plus... En comparant le texte html nettoye des deux ranges, nous reconstruisions le texte 	
	var FinPos = 0;
 	for (var k=0; k<WorkRangeTextHtml.length && boolIdentique; k++){
	 	if (WorkRangeTextHtml.charAt(WorkRangeTextHtml.length - k) == TextAreaTextHtml.charAt(TextAreaTextHtml.length - k)) {
 			strFin = WorkRangeTextHtml.charAt(WorkRangeTextHtml.length - k) + strFin ;
 		}
 		else{
	 	 	boolIdentique = false;
 		}
 		FinPos = k;
 	}
 	if (boolDebugApTexte==true){
	 	alert('strFin2'+strFin);
	}
	// Dans le cas ou on est sorti de la boucle en atteignant la fin de la chaine de comparaison, il faut avancer d'un cran car il manque le dernier caractere
 	if (boolIdentique){
 		TextAreaTextHtml.length - FinPos;
 		if (boolDebugApTexte==true){
	 		alert('bool identique strFin1*'+strFin);
 			alert ('FinPos*'+FinPos);
 			alert ('0caractere fin*'+TextAreaTextHtml.charAt(TextAreaTextHtml.length - FinPos - 0));
 			alert ('1caractere fin*'+TextAreaTextHtml.charAt(TextAreaTextHtml.length - FinPos ));

 		}
 		try { test_balise; }
    	catch(erreur)
     	{
        	alert("Opération effectuée : x = y;");
	        alert("<br>Erreur détectée : " + erreur);
	        alert("<br>numéro d'erreur : " + (erreur.number & 0xFFFF));
	        alert("<br>Description de l'erreur : " + erreur.description);
			/*     
       		document.write("<br>numéro d'erreur : " + (erreur.number & 0xFFFF));
	        document.write("<br>Description de l'erreur : " + erreur.description);
    	    */
	    }		
 		if (test_balise==false){
 			
 			if (strFin==''){
 				if (boolDebugApTexte==true){
 					alert('strfin vide');
 				}
 				strFin = TextAreaTextHtml.charAt(TextAreaTextHtml.length - FinPos ) + strFin ;
 			}
 			else{
				if (boolDebugApTexte==true){
					alert('strfin pas vide');
				}
				strFin = TextAreaTextHtml.charAt(TextAreaTextHtml.length - FinPos - 1 ) + strFin ;
 			}
 			//alert ('test  balise est faux et strFin '+strFin);
 		}
 		else{
 			if (boolDebugApTexte){
 				alert('test balise true');
 			}
 			strFin = TextAreaTextHtml.charAt(TextAreaTextHtml.length - FinPos - 1) + strFin ;
 		}
 		if (boolDebugApTexte==true){
 			alert('bool identique strFin'+strFin);
 		}
 		//strFin = TextAreaTextHtml.charAt(TextAreaTextHtml.length - FinPos) + strFin ;
 	}
 	if (boolDebugApTexte==true){
	 	alert('strFin3'+strFin);	
 	}
 	// Nettoyage de la dernire balise (ex le range de travail peut avoir : </P> et celui selectionne </SPAN>)
 	if (strFin.indexOf(">",0) == 0){
 		strFin = strFin.substring(1, strFin.length);
 	}
 	//strFin = strFin + WorkRangeTextHtml.CharAt(WorkRangeTextHtml.length - FinPos);
	if (boolDebugApTexte==true){
	 	alert('strFin avant final'+strFin);
	 }
 	outArray["chaine"]    = strFin;
 	//outArray["chaine"]    ='';
 	outArray["nbFinSpan"] = nbFinStyleSpan;
 	if (boolDebugApTexte==true){
	 	alert ('chaine*'+outArray["chaine"]+'*nb fin span*'+outArray["nbFinSpan"] );
		alert ('felicitationfin fonction get apres');
	}

}

// Fonction applicant le style a la selection passee en parametre
function AppliqueStyle(StrNameOfStyle, StrSelection, StrTotal, StrDebut){
	// Suppression des styles ouverts en debut de paragraphe
	while(StrSelection.indexOf("</SPAN>")==0){
		var intPosFermerture = StrSelection.indexOf("</SPAN>") + 1;
		//PosDebut = PosDebut + intPosFermerture;
		StrSelection = StrSelection.substring(intPosFermerture, StrHtmlSelectionne.length);
		StrDebut = StrDebut + "</SPAN>";
	}
	// Definitions des chaines de caractere qui vont gerer le style de la selection
	var StrAAppliquerApres = "";
	var StrAAppliquerAvant = "";
	// Resultat de la fonction
	var StrResultat = "";
	// Tableau des styles ouverts (et non fermes) avant le debut de la selection
	var ArrSpanOuvertAvantDebutSelection = CreeTableauStyleOuvert(StrTotal, StrDebut, StrDebut.length - 1 , "SPAN");
	var ClePosSpanOuvertAvantSelection   = 0;
	// Tableau des styles ouverts (et non fermes) avant la fin de la selection. la difference des 2 tableaux va nous permettre de connaitre les styles ovuerts _dans_ la selection
	var ArrSpanOuvertFinSelection        = CreeTableauStyleOuvert(StrTotal, StrDebut + StrSelection, StrDebut.length - 1 + StrSelection.length - 1, "SPAN");
	// Tableau des styles ouverts (et non fermes) dans la selection 
	var ArrSpanOuvertDansSelection       = CreeTableauStyleOuvert(StrSelection, "a", StrSelection.length, "SPAN");
	
	
	// On determine si StrNameOfStyle est ouvert avant le debut de la selection
	var StyleEstPresentAvantSelection = false;
	for(var i=0; i<ArrSpanOuvertAvantDebutSelection.length && !StyleEstPresentAvantSelection; i++){
		if (ArrSpanOuvertAvantDebutSelection[i].indexOf(StrNameOfStyle)>0){
			StyleEstPresentAvantSelection = true;
			ClePosSpanOuvertAvantSelection  = i;
		}
	}
	
	// On determine si StrNameOfStyle est ouvert dans la selection
	var StyleEstPresentDansSelection = false;
	for(var o=0; o<ArrSpanOuvertDansSelection.length && !StyleEstPresentDansSelection; o++){
		if (ArrSpanOuvertDansSelection[o].indexOf(StrNameOfStyle)>0){
			StyleEstPresentDansSelection = true;
		}
	}
	
	// Traitement particulier : la selection ouvre une balse avec le style a ajouter => dans ce cas on supprime toute presence du style
	if (StyleEstPresentDansSelection){
		var arrResultat = new Array();
		arrResultat["SpanASupprimer"] = StrNameOfStyle;
		CreeTableauStyleOuvert(StrSelection, "a", StrSelection.length, "SPAN", arrResultat);
		strResultat = arrResultat["strSansSpanFermerture"];
		return strResultat;
	}
	
	// Determination des balises a mettre avant et apres le style.
	if(StyleEstPresentAvantSelection){
	 	// Dans ce cas, le style doit etre supprime
	 	StrAAppliquerApres = "<SPAN class='" +StrNameOfStyle+ "'>";
	 	 	StrAAppliquerAvant = "</SPAN>";
	 	if (ClePosSpanOuvertAvantSelection >=0  && ArrSpanOuvertAvantDebutSelection.length > ClePosSpanOuvertAvantSelection + 1){
	 		for(var m = ClePosSpanOuvertAvantSelection + 1; m<ArrSpanOuvertAvantDebutSelection.length;m++){
	 			 StrAAppliquerAvant = " </SPAN> " + StrAAppliquerAvant + ArrSpanOuvertAvantDebutSelection[m]+" ";
	 			 StrAAppliquerApres = " </SPAN> " + StrAAppliquerApres + ArrSpanOuvertAvantDebutSelection[m]+" ";;
	 		}
		}
	}
	else{
		// Dans ce cas, le style doit etre rajouter
		StrAAppliquerAvant = "<SPAN class='" +StrNameOfStyle+ "'>";
	 	StrAAppliquerApres = "</SPAN>";
	
		// Gestion de l'imbrication
		var IntDeltaSpanOuvert = ArrSpanOuvertAvantDebutSelection.length - ArrSpanOuvertFinSelection.length;
			// 1er cas : la selection ouvre des styles sans les refermer. exemple : exemple : <b> toto [ti<i>ti] tutu </i>aze </b> [] indique l'element selectionne ==> il faut tous les refermer!
		if (ArrSpanOuvertDansSelection.length>0){
			for (var k = 0; k < ArrSpanOuvertDansSelection.length; k++){
				StrAAppliquerApres = "</SPAN>" + StrAAppliquerApres + ArrSpanOuvertDansSelection[k];
			}
		}
			// 2eme cas : il y a plus de styles (ie de SPAN) ouvert DANS la selection qu'AVANT. exemple : <b> toto [ti<i>ti] tutu </i>aze </b> [] indique l'element selectionne
				// probablement obsolete!
		else if (IntDeltaSpanOuvert < 0){
			// Note : l'ordre croissant ne pose pas de probleme car la fin du style est identique quelque soit le style
			for (var k = ArrSpanOuvertAvantDebutSelection.length; k < ArrSpanOuvertFinSelection.length; k++){
				StrAAppliquerApres = "</SPAN>" + StrAAppliquerApres + ArrSpanOuvertFinSelection[k];
			}
		}
			// 3eme  cas : il y a plus de styles (ie de SPAN) ouvert AVANT le debut de la selection que DANS. Certains styles sont donc fermes dans la selection! exemple : <b> toto [t</b>i<i>ti] tutu <i>aze
		else if (IntDeltaSpanOuvert >0 ){
			for (var k = ArrSpanOuvertFinSelection.length; k < ArrSpanOuvertAvantDebutSelection.length; k++){
			 	// Cas particulier : le style peut etre ferme dans la selection... On ne le rouvre pas apres pas!
				if (StyleEstPresentAvantSelection && ArrSpanOuvertAvantDebutSelection[k].indexOf(StrNameOfStyle)>0){
					StrAAppliquerApres = "";
				}
				StrAAppliquerAvant = "</SPAN>" + StrAAppliquerAvant + ArrSpanOuvertAvantDebutSelection[k];
			}
		}
	}

	StrResultat = StrAAppliquerAvant + StrSelection + StrAAppliquerApres;
//	alert('StrNameOfStyle : '+StrNameOfStyle+'\n StrDebut :'+StrDebut+'\n  StrSelection : '+StrSelection+'\nStrTotal : '+StrTotal+' \nIntDeltaSpanOuvert :'+IntDeltaSpanOuvert+'\n ArrSpanOuvertFinSelection.len : '+ArrSpanOuvertFinSelection.length+'\n ArrSpanOuvertAvantDebutSelection.length : '+ArrSpanOuvertAvantDebutSelection.length+'\nArrSpanOuvertDansSelection.length :'+ArrSpanOuvertDansSelection.length+' \n _ \n StrResutlat : '+StrResultat);
	return StrResultat;
}


// Fonction retirant des caracteres rajoutes par l'interface IE
function NettoieRange(texte){
	return texte.replace(/[\n\r]*/gi, "");
}

// Fonction comptant le nombre de fois ou StrARechercher apparait dans StrChaine
function CompteNombreOccurence(StrChaine, StrARechercher){
	// Mise en minuscule pour eviter le probleme de la sensibilite a la casse
	StrChaine      = StrChaine.toLowerCase();
	StrARechercher = StrARechercher.toLowerCase();
	// Initialisation des variables
	var i = 0;
	var nbOccurence = 0;
	
	// Traitement
	while (i != -1) {
		i = StrChaine.indexOf(StrARechercher, i);
		if (i>=0) {
			nbOccurence ++;
			i += StrARechercher.length;
		}
	}
	return nbOccurence;
}

// Fonction comptant combien de fois nomBalise apparait dans range
function NombreFinDeStyle(range, nomBalise){
	localWorkRange = range.duplicate();
	
	// Initialisation de workRange a la fin du textarea
	localWorkRange.setEndPoint("StartToStart", range);
	localWorkRange.setEndPoint("EndToStart", range);
	
	// Recule d'un caractere
	nbAvancement = 0;
 	localWorkRange.moveStart("character", -1);
 	nbAvancement++;
 	
 	// Deux cas au limite
 	if (NettoieRange(localWorkRange.htmlText) == ""){
 		nbAvancement++;
 		localWorkRange.moveStart("character", -1);
 	}
 	if (NettoieRange(localWorkRange.htmlText) == ""){
 		localWorkRange.moveStart("character", nbAvancement);
 		return 0;
 	}
 	var ChaineHtmlRange = NettoieRange(localWorkRange.htmlText)
 	localWorkRange.moveStart("character", nbAvancement);
	return CompteNombreOccurence(ChaineHtmlRange, nomBalise);
}


// Meme chose mais pour le debut
function NombreDebutDeStyle(range, nomBalise){
	localWorkRange = range.duplicate();
	
	// Initialisation de workRange a la fin du textarea
	localWorkRange.setEndPoint("StartToStart", range);
	localWorkRange.setEndPoint("EndToStart", range);
	
	// Recule d'un caractere
	nbAvancement = 0;
 	localWorkRange.moveEnd("character", 1);
 	nbAvancement++;
 	
 	if (NettoieRange(localWorkRange.htmlText) == ""){
 			nbAvancement++;
 			localWorkRange.moveEnd("character", 1);
 	}
 	if (NettoieRange(localWorkRange.htmlText) == ""){
 		localWorkRange.moveStart("character", - nbAvancement);
 		return 0;
 	}
 	var ChaineHtmlRange = NettoieRange(localWorkRange.htmlText)
 	localWorkRange.moveStart("character", - nbAvancement);
	return CompteNombreOccurence(ChaineHtmlRange, nomBalise);
}




// Fonction renvoyant le paragraphe complet (delimite par <p> et <p/>)
function SelectionneParagraphe(strDebut, strMilieu, strFin, outArray){
	var boolDebugSelectionneParagraphe=false;
	var boolCasParticulier=false;//Permetde résoudre le cas limite : 2paragrapses application de titre sans selection et curseur sur la première lettre 	
	var ArrBaliseParagraphe = new Array("P", "H");
	// Si strMilieu ne correspond pas a un paragraphe (ie commence par <p ou <hn) alors on recherche des tags de paragraphe dans debut et fin
	var intTmpPosBaliseDansStrMilieu = -1;
	var nomPremiereBaliseOuvrante = "";
	var nomDerniereBaliseFermante = "";
	var intPosBaliseOuvranteDansStrMilieu = strMilieu.length;
	var boolSansSelection = false;
	if (boolDebugSelectionneParagraphe){
		alert('0strDebut '+strDebut+' strMilieu '+strMilieu+' strFin '+strFin);
		
	}
	if (intPosBaliseOuvranteDansStrMilieu ==0){// Cas sans selection
		intPosBaliseOuvranteDansStrMilieu = -1;
		boolSansSelection = true;
	}
	var intPosBaliseFermanteDansStrMilieu = -1;
	
	if (!boolSansSelection){
		if (boolDebugSelectionneParagraphe){
			alert('avec selection');
		}
		for(var i=0; i< ArrBaliseParagraphe.length;i++){
			// Determination de la valeur minimale des balises ouvrantes de paragraphe
			intTmpPosBaliseDansStrMilieu = strMilieu.toUpperCase().indexOf("<"+ArrBaliseParagraphe[i].toUpperCase());
			if (intTmpPosBaliseDansStrMilieu >= 0 && intTmpPosBaliseDansStrMilieu < intPosBaliseOuvranteDansStrMilieu){
				nomPremiereBaliseOuvrante         = ArrBaliseParagraphe[i];
				intPosBaliseOuvranteDansStrMilieu = intTmpPosBaliseDansStrMilieu;
			}
			// Determination de la valeur maximale dess balises fermantes de paragraphe
			intTmpPosBaliseDansStrMilieu = strMilieu.toUpperCase().lastIndexOf("</"+ArrBaliseParagraphe[i].toUpperCase()+">");
			if (intTmpPosBaliseDansStrMilieu >= 0 && intTmpPosBaliseDansStrMilieu > intPosBaliseFermanteDansStrMilieu){
				nomDerniereBaliseFermante         = ArrBaliseParagraphe[i];
				intPosBaliseFermanteDansStrMilieu = intTmpPosBaliseDansStrMilieu;
			}
		}
	}
	var StrMilieuFinal = strMilieu;
	if (boolDebugSelectionneParagraphe){
		alert('1strDebut '+strDebut+' strMilieuFinal '+StrMilieuFinal+' strFin '+strFin);	
	}
	
	// Cas ou strMilieu ne commence pas par un tag de debut de paragraphe
	var intPosDebutParagraphe    = -1;
	var intPosMaxDebutParagraphe = -1;
	var boolPasDeModifDebut      = false;
	if (intPosBaliseOuvranteDansStrMilieu != 0 || boolSansSelection){
		if (boolDebugSelectionneParagraphe)
			alert('Cas ou strMilieu ne commence pas par un tag de debut de paragraphe');
		// Recherche de la derniere balise liee a un paragraphe dans strDebut
		for(var i=0; i< ArrBaliseParagraphe.length;i++){
			intPosDebutParagraphe = strDebut.toUpperCase().lastIndexOf("<"+ArrBaliseParagraphe[i].toUpperCase());
			if (intPosDebutParagraphe>=0 && intPosDebutParagraphe>intPosMaxDebutParagraphe){
				intPosMaxDebutParagraphe = intPosDebutParagraphe;
			}
		}
		//erreur doit etre ici, il croit que paragraphe est celui d'avant??==> erreur dans strDebut
		if (boolDebugSelectionneParagraphe)
			alert('2strDebut '+strDebut+' Lo '+strDebut.length);
				
		var intnbrP=0;
		intnbrP=CompteNombreOccurence(strDebut, "P");
		
		
		if ((StrMilieuFinal!="")&&(intnbrP!=2)){
			if (boolDebugSelectionneParagraphe)
				alert('cas particulier1');
			boolCasParticulier=false;
			StrMilieuFinal = strDebut.substring(intPosMaxDebutParagraphe , strDebut.length) + StrMilieuFinal;
		}
		else{
			if (intnbrP==2){
				if (boolDebugSelectionneParagraphe)
					alert('cas particulier');
				boolCasParticulier=true;
			}
			else{
				StrMilieuFinal = strDebut.substring(intPosMaxDebutParagraphe , strDebut.length) + StrMilieuFinal;
			}
		}
		
		if (boolDebugSelectionneParagraphe){
			alert('3strDebut '+strDebut+' strMilieuFinal '+StrMilieuFinal+' strFin '+strFin);	
		}
	}
	else{
		boolPasDeModifDebut = true;
	}
//	alert('MIL StrMilieuFinal :'+StrMilieuFinal)
	
	// Cas ou strMilieu ne finit pas par un tag de fin de paragraphe
	var intPosFinParagraphe    = -1;
	var intPosMinFinParagraphe = strFin.length;
	var boolPasDeModifFin      = false;
	
	if (intPosBaliseFermanteDansStrMilieu != strMilieu.length - ("</"+nomDerniereBaliseFermante+">").length){
		// Recherche de la premiere balise liee a un paragraphe dans strFin
		for(var i=0; i< ArrBaliseParagraphe.length;i++){
			intPosFinParagraphe = strFin.toUpperCase().indexOf("</"+ArrBaliseParagraphe[i].toUpperCase()+">");
			if (intPosFinParagraphe >=0 && intPosFinParagraphe<intPosMinFinParagraphe){
				intPosMinFinParagraphe = intPosFinParagraphe;
			}
		}
		StrMilieuFinal = StrMilieuFinal + strFin.substring(0, intPosMinFinParagraphe + nomDerniereBaliseFermante.length+4);
		if (boolDebugSelectionneParagraphe){
			alert('4strDebut '+strDebut+' strMilieuFinal '+StrMilieuFinal+' strFin '+strFin);	
		}
		//alert('FIN StrMilieuFinal : '+StrMilieuFinal+'\nstrDebut : '+strDebut+ '\nstrFin.substring(0, intPosMinFinParagraphe + nomDerniereBaliseFermante.length+1) : '+strFin.substring(0, intPosMinFinParagraphe + nomDerniereBaliseFermante.length+1))
	}
	else{
		boolPasDeModifFin = true;
	}
	
	var strDebutFinal = strDebut;
	if (boolDebugSelectionneParagraphe){
		alert('5strDebutFinal '+strDebutFinal+' StrMilieuFinal '+StrMilieuFinal+' strFin '+strFin);	
	}
	if (!boolPasDeModifDebut){
	//	if (!boolPasDeModifDebut){
	//		strDebutFinal = strDebut.substring(0, intPosMaxDebutParagraphe);
	//	}	
			
		if (!boolCasParticulier){//pas cas particulier
			if (boolDebugSelectionneParagraphe){
				alert('pas cas particulier2');
			}
			strDebutFinal = strDebut.substring(0, intPosMaxDebutParagraphe);
		}
		
		if (boolDebugSelectionneParagraphe){
			alert('6strDebutFinal '+strDebutFinal+' StrMilieuFinal '+StrMilieuFinal+' strFin '+strFin);	
		}
	}
	var strFinFinal   = strFin;
	if (boolDebugSelectionneParagraphe){
		alert('7strDebutFinal '+strDebutFinal+' StrMilieuFinal '+StrMilieuFinal+' strFinFinal '+strFinFinal);	
	}
	
	if (!boolPasDeModifFin){
//		strFinFinal   = strFin.substring(strFin.toUpperCase().indexOf("<"+nomDerniereBaliseFermante) + (strFin.toUpperCase().indexOf(">", strFin.toUpperCase().indexOf("<"+nomDerniereBaliseFermante)) - strFin.toUpperCase().indexOf("<"+nomDerniereBaliseFermante)) + 1, strFin.length);
		strFinFinal   = strFin.substring(intPosMinFinParagraphe + nomDerniereBaliseFermante.length+4, strFinFinal.length);
		if (boolDebugSelectionneParagraphe){
			alert('8strDebutFinal '+strDebutFinal+' StrMilieuFinal '+StrMilieuFinal+' strFinFinal '+strFinFinal);	
		}
	}
	else if (trim(nomDerniereBaliseFermante)==""){
		strFinFinal = "";
		alert('else if');
	}
	var strBaliseP    = strDebut.substring(intPosMaxDebutParagraphe, intPosMaxDebutParagraphe + nomDerniereBaliseFermante.length);
	if (boolDebugSelectionneParagraphe){
		alert('8strDebutFinal '+strDebutFinal+' StrMilieuFinal '+StrMilieuFinal+' strFinFinal '+strFinFinal);	
	}
	outArray["debut"]    = strDebutFinal;
	outArray["milieu"]   = StrMilieuFinal;
	outArray["fin"]      = strFinFinal;
	
	outArray["baliseP"]  = strBaliseP;
}

// Fonction verifant l'imbrication des styles.
function VerifieImbrication(IFrameChoisie,StrTexte, StrHtmlSelectionne, PosDebut, strErreurImbrication, StrStyle){
	// Verification de la presence de le fonction JS avec les styles a exclure (cree dynamiquement en PHP)
	var debugVerifieImbrication=false;
	var nbrElementImbrique=0;
	//InsereStyle(IFrameChoisie);
	/*
		Rajout Maroane
		09/03/2006
		pour empecher : <SPAN class="wysiwyg_h3 ">cfb<SPAN class="test">mar</SPAN>oane</SPAN>
	*/
	testNoeud=HasAncestorNode (IFrameChoisie, 'SPAN');
	if (testNoeud){
		if (debugVerifieImbrication==true){
			alert('imbrication');
		}
		alert(strErreurImbrication);//voir pour plus erreur
		return false;
	}
	/*
		Fin rajout Maroane
	*/
	if (!window.CreeTableauElementInterdit){
		return true;
	}
	if (debugVerifieImbrication==true){
		alert('debut fonction imbrication');
		//alert ('testNoeud'+testNoeud);
	}
	var ArrEltAProteger = CreeTableauElementInterdit();
	
	// Definition des attributs a tester
	var NomAttributATester = new Array("div", "p");
	
	// Dans certains cas, on ne teste pas les span
	var MotCleAlignement   = 'Alignement';
	var HnATraiter         = StrStyle.toUpperCase().lastIndexOf("H")>=0 && StrStyle.length == 2;
	var AlignementATraiter = StrStyle.lastIndexOf(MotCleAlignement)>=0;
	if (debugVerifieImbrication==true){
		//alert('HnATraiter*'+HnATraiter+'*AlignementATraiter*'+AlignementATraiter);

	}
	// Dans le cas ou on n'ajoute pas de Hn => test de l'attribut SPAN
	if (!HnATraiter && !AlignementATraiter){
		if (debugVerifieImbrication==true){
			alert ('span');
		}
		NomAttributATester.push("span");
	}
	for(var i=0;i<ArrEltAProteger.length;i++){
		if (ArrEltAProteger[i].toUpperCase().indexOf("H")>=0 && trim(ArrEltAProteger[i].toUpperCase()).length == 2){
			NomAttributATester.push(ArrEltAProteger[i]);
		}
	}
	
	// Suppression des styles ouverts en debut de paragraphe
	StrHtmlSelectionne = trim(StrHtmlSelectionne);
	while(StrHtmlSelectionne.indexOf("<")==0){
		var intPosFermerture = StrHtmlSelectionne.indexOf(">") + 1;
		PosDebut = PosDebut + intPosFermerture;
		StrHtmlSelectionne = StrHtmlSelectionne.substring(intPosFermerture, StrHtmlSelectionne.length);
	}
	// Creation dynamique du tableau avec les elements
	var TableauElementHtml = new Array();
	var ElementImbrique    = false;
	var j = 0;
	
	// Pour tous les attributs a tester...
	for(var i=0; i< NomAttributATester.length && !ElementImbrique;i++){
		// Creation d'une colonne
		TableauElementHtml[NomAttributATester[i]] = new Array();
		// Creation du tableau avec l'element html courant selectionne
		TableauElementHtml[NomAttributATester[i]] = CreeTableauStyleOuvert(StrTexte, StrHtmlSelectionne, PosDebut, NomAttributATester[i]);
	// ... Pour tous les tag ouverts ...
		for(j=0; j< TableauElementHtml[NomAttributATester[i]].length && !ElementImbrique ;j++){
	// ... Pour toutes les chaines a interdire...
			for(k=0; k< ArrEltAProteger.length &&!ElementImbrique ; k++){
	// ... Verifier si le tag ne possede pas cet element.
				if(TableauElementHtml[NomAttributATester[i]][j].indexOf(ArrEltAProteger[k], 0)>0){
					ElementImbrique = true;
				}				
			}

		}
	}
	
	if (ElementImbrique) {
		//alert('Vous ne pouvez imbriquer des styles complexes.');
		nbrElementImbrique=nbrElementImbrique+1;
		alert(strErreurImbrication);
	}
	
	var testSpan = RechercheMot('SPAN',StrHtmlSelectionne);
	if((testSpan!=-1)&&(nbrElementImbrique==0)){
		ElementImbrique=true;
		//alert('testSpan');
		alert(strErreurImbrication);
	}
	if (debugVerifieImbrication){
		alert ('fin imbrication');
	}
	
	return !ElementImbrique;
}




// Fonction rajoutant les liens


function AjouteLien(IFrameChoisie, racineabsolue, strcallby){
	test_balise=false;
	// Appel de la pop-up IE
	
	
	var theselection = IFrameChoisie.document.selection;
	objRange         = theselection.createRange();

	var estUneImage = false;
	if (theselection.type == 'Control')
	{
		objRange = objRange(0)
		estUneImage = true;
	}
	
	var objRangeLength = objRange.htmlText.length;
	if (objRangeLength > 80)
	{
		alert("Votre selection est supérieure à 80 caratères !");
		return;
	}
	
	// la source est passée à un parseur XML dans PHP=> les quotes autour des paramètres sont requises
	StrSource = AjouteAttQuotes(objRange.htmlText);
	if (estUneImage)
	{
		StrSource = objRange.outerHTML;
		StrSource = AjouteAttQuotes(StrSource);
	}

	var textAreaRange    = IFrameChoisie.document.body.createTextRange();
	var rangeSelectionne = theselection.createRange();
	// Texte HTML avant la selection
	var arrResultatAvant = new Array();
	getAvantTexteRangeSelectionne(textAreaRange, rangeSelectionne, arrResultatAvant);
	var StrHtmlDebut     = arrResultatAvant["chaine"];
	
	var arrResultatApres = new Array();
	getApresTexteRangeSelectionne(textAreaRange, rangeSelectionne, arrResultatApres);
	var StrHtmlApres     = arrResultatApres["chaine"];

	
	StrHtmlSelectionne=objRange.htmlText;

	
	if (CompteNombreOccurence(StrHtmlSelectionne, "<A")>1)
	{	
				alert("Votre selection imbrique déja plusieurs liens !");
				return;
			}
	if (CompteNombreOccurence(StrHtmlSelectionne, "<TD")>0)
	{	
				alert("Votre lien ne peut inclure de colonnes !");
				return;
			}
 
      
        if (CompteNombreOccurence(StrHtmlSelectionne, "<P")>1)
	{	
				alert("Votre lien ne peut inclure plusieurs paragraphes !");
				return;
			}
	
	
	

//	window.open(racineabsolue+ "/commun/dialoggenerique.php?callby=" + strcallby +"&page=5&textehtml="+escape(StrSource));
	var result = showModalDialog(racineabsolue+ "/commun/dialoggenerique.php?callby=" + strcallby +"&page=5&textehtml="+escape(StrSource), "", "resizable:no;dialogHeight:160px;dialogWidth:500px");
	if (result != null && estUneImage)
	{
		objRange.outerHTML = result;
	}
	else if (result != null)
	{
	      StrSource=StrSource.replace (/<\/?A[^>]*>/gi, "");
	       StrSource=StrSource.replace (/<\/?P[^>]*>/gi, "");
	        result= result.replace(/x55x/,StrSource);
		IFrameChoisie.focus ();
		objRange.pasteHTML(result);
	}
}

function RemplaceParagraphe(strChaineATraiter, arrElementARemplacer, strChaineDeRemplacement, boolTagEstComplet){
//StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheFermerture, "</"+BaliseFin+">", true);
	var debugRemplaceParagraphe=false;

	var strOutChaine = strChaineATraiter;
	if (debugRemplaceParagraphe==true){
		alert ('strOutChaine '+strOutChaine);
		alert ('arrElementARemplacer '+arrElementARemplacer);
		alert ('strChaineDeRemplacement '+strChaineDeRemplacement);
	}
	
	for(var i=0;i<arrElementARemplacer.length;i++){
		if (!boolTagEstComplet){
			var expReg = new RegExp ('('+arrElementARemplacer[i]+'[1-6]{0,1}(\\s+[^>]*)?>)', "gi");
		}
		else{
			var expReg = new RegExp (arrElementARemplacer[i]+'[1-6]{0,1}>', "gi");
		}
//		alert('expReg : '+expReg+'\n strChaineDeRemplacement : '+strChaineDeRemplacement+'\nstrOutChaine : '+strOutChaine)
		strOutChaine = strOutChaine.replace(expReg, strChaineDeRemplacement);
//		alert('strOutChaine apr : '+strOutChaine);
	}
	
	return strOutChaine;
}
function SupprimeBaliseOuvertureEtFermertureParagraphe(StrHtmlSelectionne, ArrRetour){
	// Tableau avec les tags definissant les paragraphes
	var debugSupprime=false;
	
	var ArrBaliseParagraphe = new Array("P", "H");
	var strOutChaine       = StrHtmlSelectionne;
	
	// Recherche de la premiere balise de paragraphe ouvrante
	var intTmpPosBaliseDebutDansStrHtmlSelectionne = -1;
	var intTmpPosBaliseFinDansStrHtmlSelectionne   = -1
	var nomPremiereBaliseOuvrante    = "";
	var nomDerniereBaliseFermante    = "";
	var intPosBaliseOuvrante = StrHtmlSelectionne.length;
	if (intPosBaliseOuvrante ==0){// Cas sans selection
		intPosBaliseOuvrante = -1;
	}
	var intPosBaliseFermante = -1;
	
	// Determination de la valeur minimale des balises ouvrantes de paragraphe
	for(var i=0; i< ArrBaliseParagraphe.length;i++){
		intTmpPosBaliseDebutDansStrHtmlSelectionne = StrHtmlSelectionne.toUpperCase().indexOf("<"+ArrBaliseParagraphe[i].toUpperCase());
		intTmpPosBaliseFinDansStrHtmlSelectionne   = StrHtmlSelectionne.toUpperCase().lastIndexOf("</"+ArrBaliseParagraphe[i].toUpperCase());
		if (intTmpPosBaliseDebutDansStrHtmlSelectionne >= 0 && intTmpPosBaliseDebutDansStrHtmlSelectionne < intPosBaliseOuvrante){
			nomPremiereBaliseOuvrante = ArrBaliseParagraphe[i].toUpperCase();
			intPosBaliseOuvrante      = intTmpPosBaliseDebutDansStrHtmlSelectionne;
		}
		if (intTmpPosBaliseFinDansStrHtmlSelectionne >= 0 && intTmpPosBaliseFinDansStrHtmlSelectionne > intPosBaliseFermante){
			nomDerniereBaliseFermante = ArrBaliseParagraphe[i].toUpperCase();
			intPosBaliseFermante      = intTmpPosBaliseFinDansStrHtmlSelectionne;
		}
	}
	if (debugSupprime==true){
		alert('intTmpPosBaliseDebutDansStrHtmlSelectionne*'+intTmpPosBaliseDebutDansStrHtmlSelectionne+'*nomPremiereBaliseOuvrante*'+nomPremiereBaliseOuvrante+'*');
		alert('intPosBaliseOuvrante*'+intPosBaliseOuvrante+'*nomPremiereBaliseOuvrante*'+nomPremiereBaliseOuvrante+'*');
		
	}
	
	// Determination des positions des balises ouvrantes
	var intPosDebutBaliseOuvrante = 0;
	var boolExisteBaliseOuvrante  = true;
	if (nomPremiereBaliseOuvrante!=""){
		intPosDebutBaliseOuvrante = strOutChaine.toUpperCase().indexOf("<"+nomPremiereBaliseOuvrante.toUpperCase());
		boolExisteBaliseOuvrante = true;
	}
	else{
		boolExisteBaliseOuvrante = false;
	}
	if (debugSupprime==true){
		//alert('intTmpPosBaliseDebutDansStrHtmlSelectionne*'+intTmpPosBaliseDebutDansStrHtmlSelectionne+'*nomPremiereBaliseOuvrante*'+nomPremiereBaliseOuvrante+'*');
		alert('intPosDebutBaliseOuvrante*'+intPosDebutBaliseOuvrante+'*boolExisteBaliseOuvrante*'+boolExisteBaliseOuvrante+'*');
		
	}
	if (intPosDebutBaliseOuvrante <0 || nomPremiereBaliseOuvrante ==""){
		intPosDebutBaliseOuvrante = 0;
	}
	if (debugSupprime==true){
		//alert('intTmpPosBaliseDebutDansStrHtmlSelectionne*'+intTmpPosBaliseDebutDansStrHtmlSelectionne+'*nomPremiereBaliseOuvrante*'+nomPremiereBaliseOuvrante+'*');
		alert('intPosDebutBaliseOuvrante*'+intPosDebutBaliseOuvrante+'*');
		
	}
	var intPosFinBaliseOuvrante   = strOutChaine.toUpperCase().indexOf(">", intPosDebutBaliseOuvrante);
	
	// Recuperation des balises de debut de paragraphe
	if (intPosDebutBaliseOuvrante<intPosFinBaliseOuvrante && boolExisteBaliseOuvrante){
		ArrRetour["baliseOuvrante"] = strOutChaine.substring(intPosDebutBaliseOuvrante, intPosFinBaliseOuvrante + 1);
	}
	else{
		ArrRetour["baliseOuvrante"] = "";
	}
	
	// Recuperation des balises de fin  de paragraphe
	var intFinBaliseFermante      = strOutChaine.indexOf(">", intPosBaliseFermante);
	if (intPosBaliseFermante<0){
		intPosBaliseFermante = strOutChaine.length;
	}
	if (nomDerniereBaliseFermante!="" && intFinBaliseFermante == strOutChaine.length - 1){
		ArrRetour["baliseFermante"] = strOutChaine.substring(intPosBaliseFermante, intFinBaliseFermante +1);
	}
	else{
		ArrRetour["baliseFermante"] = "";
	}
	// Gestion des cas au limite
	if (intPosFinBaliseOuvrante>0){
		intPosFinBaliseOuvrante++;
	}
	else{
		intPosFinBaliseOuvrante = 0;
	}
	if (intPosBaliseFermante<=0){
		intPosBaliseFermante = strOutChaine.length;
	}
	// Remise a 0 de intPosFinBaliseOuvrante s'il est superieur a intPosBaliseFermante car 
	if (intPosFinBaliseOuvrante >= intPosBaliseFermante){
		intPosFinBaliseOuvrante = 0;
	}
//	alert('intPosBaliseFermante  '+ intPosBaliseFermante + '\n'+intPosFinBaliseOuvrante + '\nstrOutChaine : '+strOutChaine + '\n strOutChaine.substring(intPosFinBaliseOuvrante, intPosBaliseFermante); ' + strOutChaine.substring(intPosFinBaliseOuvrante, intPosBaliseFermante)+'\nArrRetour["baliseFermante"] : '+ArrRetour["baliseFermante"]+'\n ArrRetour["baliseOuvrante"] : '+ArrRetour["baliseOuvrante"])
	if (debugSupprime==true){
		alert ('strOutChaine'+strOutChaine);		
	}
	if (test_balise){
		strOutChaine = strOutChaine.substring(intPosFinBaliseOuvrante, intPosBaliseFermante);
	}
	//test=RechercheMot('SPAN',strOutChaine);
		
	if (debugSupprime==true){
		alert ('strOutChaine'+strOutChaine);		
	}
	return strOutChaine;
}
// -->

// modifie du code non XHTML (retourné par InnerHTML) afin de rajouter des quotes aux attributs qui n'en n'ont pas
function AjouteAttQuotes(StrInput)
{
	BoolDansBalise = false;
	BoolDansValeurParam = false;
	StrTypeParam = "";
	StrOutput = "";

	if (StrInput == undefined)
		return StrOutput;
	for (i=0; i<StrInput.length; i++)
	{
		StrChar = StrInput.charAt(i);
		
		switch (StrChar)
		{
			case "<":
				if (!BoolDansValeurParam)
				{
					BoolDansBalise = true;
				}
				StrOutput += StrChar;
			break;
			case ">":
				if (!BoolDansValeurParam)
				{
					BoolDansBalise = false;
				}
				else
				{
					if (StrTypeParam == "nue")
					{
						StrOutput += "\"";
						BoolDansValeurParam = false;
						BoolDansBalise = false;
					}
				}
				StrOutput += StrChar;
			break;
			case "=":
				StrOutput += StrChar;
				if (BoolDansBalise && !BoolDansValeurParam)
				{
					BoolDansValeurParam = true;

					StrCharSuivant = StrInput.charAt(i+1);	// existe car innerHTML ferme tjrs les balises
					if (StrCharSuivant == "\"")
					{
						StrTypeParam = "quote";
						StrOutput += StrCharSuivant;
						i++;
					}
					else
					{
						StrTypeParam = "nue";
						StrOutput += "\"";
					}
				}
			break;
			case "\"":
				if (BoolDansValeurParam)
				{
					BoolDansValeurParam = false;
				}
				StrOutput += StrChar;
			break;
			case " ":
				if (BoolDansValeurParam && StrTypeParam == "nue")
				{
					BoolDansValeurParam = false;
					StrOutput += "\"";
				}
				StrOutput += StrChar;
			break;
			default:
				StrOutput += StrChar;
			break;
		}
	}
	return StrOutput;
}

// Cette ouvre une popup permettant de choisir les caractérisitques du tableau
function InsereTableau (nomchamp, racineabsolue, strcallby) 
{
	
	var result = showModalDialog(racineabsolue+ "/commun/dialoggenerique.php?callby=" + strcallby +"&page=6", "", "resizable:no;srollbar:no;dialogHeight:225px;dialogWidth:610px");
	if (result != null)
	{
		eval(nomchamp + "_iframe").focus ();
		var objSelection = eval(nomchamp + "_iframe").document.selection.createRange();
		objSelection.pasteHTML(result);
	}
}

// Rajout d'un style CSS au tableau
// strAlertAucunTD contient le message dans le cas ou on n'as pas de TD
function AddStyleTD(IFrameChoisie, nameOfStyle, modeEdition, strAlertAucunTD)
//		AddStyleTD({$StrNom}_iframe, {$StrNom}_slTabWysiwyg.value, {$StrNom}_mode, '$StrAlertAucunTD')
//		AddStyleComplet({$StrNom}_iframe,'{$ArrTaillePolice[0]['StrCss']}', {$StrNom}_mode, '$strErreurImbrication', '$StrAlertAucunMot')"
{
	// focus sinon l'utilisateur ne peut plus éditer le contenu du tableau
	boolDebugAddStyleTD=false;
	if (boolDebugAddStyleTD){
		alert ('add style td ');
	}
	
	IFrameChoisie.focus();
	
	if (HasAncestorNode(IFrameChoisie, "TD"))
	{
		if (boolDebugAddStyleTD)
			alert ('td');
		objTD = MoveToAncestorNode(IFrameChoisie, "TD");
		objTD.className = nameOfStyle;
		if (boolDebugAddStyleTD)
			alert ('objTD*'+objTD);
	}
	else if(HasAncestorNode(IFrameChoisie, "TH"))
	{
		if (boolDebugAddStyleTD)
			alert ('th');
		objTH = MoveToAncestorNode(IFrameChoisie, "TH");
		objTH.className = nameOfStyle;
	}
	else if(HasAncestorNode(IFrameChoisie, "P")){
		if (boolDebugAddStyleTD)
			alert ('p');
		//objTH = MoveToAncestorNode(IFrameChoisie, "P");
		//objTH.className = nameOfStyle;
		
		objP = MoveToAncestorNode(IFrameChoisie, "P");
		objP.className = nameOfStyle;
	}
	/*
	else if(HasAncestorNode(IFrameChoisie, "SPAN")){
		alert ('span');
		
	}
	*/
	else
	{
	
		/*
		alert ('aucun');
		AddP(IFrameChoisie,nameOfStyle);
		alert ('rajout style');
		
		alert ('toto');
		alert ('fin rajout style');
		
		
		
		alert ('fin aucun');
		*/
	}
}

// retourne un tag de type 'nodeTagName' s'il correspond à celui sélectionné ou un parent
// The "nodeTagName" parameter must be UPPER CASE.
function HasAncestorNode (nomchamp, nodeTagName)
{
	var objSelection = eval(nomchamp).document.selection;
	var oRange = objSelection.createRange() ;

	var oContainer ;

	if ( objSelection.type == "Control" )
	{
		if ( oRange && oRange.item )
			oContainer = oRange.item(0) ;
	}
	else
	{
		oContainer = oRange.parentElement() ;
	}

	while ( oContainer )
	{
		if ( oContainer.tagName == nodeTagName ) return true ;
		oContainer = oContainer.parentNode ;
	}

	return false ;
}

// The "nodeTagName" parameter must be UPPER CASE.
function MoveToAncestorNode (nomchamp, nodeTagName)
{
	var objSelection = eval(nomchamp).document.selection;
	var oNode ;
	var boolMoveTo=false;
	if ( objSelection.type == "Control" )
	{
		var oRange = objSelection.createRange() ;
		for ( i = 0 ; i < oRange.length ; i++ )
		{
			if (oRange(i).parentNode)
			{
				oNode = oRange(i).parentNode ;
				break ;
			}
		}
	}
	else
	{
		var oRange  = objSelection.createRange() ;
		oNode = oRange.parentElement() ;
	}

	while ( oNode && oNode.nodeName != nodeTagName )
		oNode = oNode.parentNode ;

	//alert ('toto');
	if (boolMoveTo)
		alert ('oNode element *'+oNode.nodeName+'**'+oNode.nodeTagName);
	return oNode ;
}

/*Maroane*/
function AddP(nomchamp,nameOfStyle){//pe etre enlever
	boolDebugAddP=false;
	if (boolDebugAddP){
		alert ('debutfonction addp');
	}
		
	//prevoir cas ou y a pas de style
	StrHtmlDebut="<p class=";
	//class=TabContenu_Defaut_Droite
	StrHtmlDebut=StrHtmlDebut+nameOfStyle+'>';
	StrHtmlApres='</p>';
	textAreaRange = nomchamp.document.body.createTextRange();
	
	if (boolDebugAddP){
		alert('fonction addP textAreaRange *'+textAreaRange);
	text=textAreaRange.htmlText;
	}
	if (boolDebugAddP){
		alert('fonction addP text *'+text);
	}
	
	text=StrHtmlDebut+text+StrHtmlApres;
	if (boolDebugAddP){
		alert('fonction addP Modif text *'+text);
	}
	textAreaRange.pasteHTML(text);
	
	text_fin=textAreaRange.htmlText;
	if (boolDebugAddP){
		alert ('fin fonction addP et texte '+ text_fin);
		alert ('fin');
	}	
}


/*
	Permet gestion du caractère gras
	A etendreau style italic et sous ligné
*/
function AddBold(IFrameChoisie, nameOfStyle, modeEdition,strAlertAucunMot){//peete enlever
	
	debugAddBold=false;
	if  (debugAddBold){
		alert('bold');
	}
	
	var texte     		 = TexteSelectionne(IFrameChoisie);
	if (texte==''){
		//alert ('pas de selection');
		alert (strAlertAucunMot);
		return;
	}
	//{$StrNom}_iframe.document.execCommand('bold');
	
	//texte=AppliqueStyle(StrNameOfStyle, texte, StrTotal, StrDebut);
	//ppliqueStyle(nameOfStyle, StrHtmlSelectionne, NettoieRange(textAreaRange.htmlText), StrHtmlDebut);
	
	IFrameChoisie.document.execCommand('bold');
	
	
	//onClick="if ({$StrNom}_mode) AddBold({$StrNom}_iframe,'bold', {$StrNom}_mode,'$StrAlertAucunMot')"onClick="if ({$StrNom}_mode) AddBold({$StrNom}_iframe,'bold', {$StrNom}_mode,'$StrAlertAucunMot')"
	
	//onClick="AddStyleComplet({$StrNom}_iframe,'{$GLOBALS['$StrCssGras']}', {$StrNom}_mode, '$strErreurImbrication', '$StrAlertAucunMot')"

//onClick="if ({$StrNom}_mode) AddBold({$StrNom}_iframe,'bold', {$StrNom}_mode,'$StrAlertAucunMot')"onClick="if ({$StrNom}_mode) AddBold({$StrNom}_iframe,'bold', {$StrNom}_mode,'$StrAlertAucunMot')"//extrait php fichier pour gras
}

function TexteSelectionne(IFrameChoisie){//selectionne
/*
	Entree
	Sortie : Texte selectionne
*/
	//alert ('fonction Texte Selectionne');
	IFrameChoisie.focus();
	// Selection du texte normal et HTML
	var theselection     = IFrameChoisie.document.selection;
	rangeSelectionne     = theselection.createRange();
	var texte            = rangeSelectionne.text;
	//alert ('texte fonction*'+texte+'*')
	//alert ('fin fonction Texte Selectionne');
	return texte;
}

function RechercheMot(mot,chaineCaractere){//laisse
/*
	permet de savoir si style appliqué ou pas
	Mot = mot a chercher
	Str = Dans quel chaine de carcatere 
	

*/
	debugRechercheMot=false;
	if (debugRechercheMot==true){
		alert('fonction RechercheMot');
		//alert(str+''+mot);
	}
	
	testMot=false;
	testMot=chaineCaractere.indexOf(mot,0);
	if (testMot==-1){
		if (debugRechercheMot==true){
			alert('ce mot n existe pas dans cette selection');
		}
	}
	else{
		if (debugRechercheMot==true){
			alert('ce mot existe dans cette selection');
		}
	}
	if (debugRechercheMot==true){
		alert('fin rechercheMot');
	}
	return testMot;	
}

function InsereStyle(IFrameChoisie){//pe elimiener
/*
	Permet de modifier un style à une selection de texte qui enpossède déjà
*/
	//alert('test');
	IFrameChoisie.document.execCommand('removeformat');
	IFrameChoisie.document.execCommand('unlink');
	cleanAllTags(IFrameChoisie.document.selection, IFrameChoisie);
	//alert('fin test');
}
//Function to format text in the text box
function FormatText(IFrameChoisie, command, option) {//pe eliminer
	var oRTE=IFrameChoisie;
	/*
	alert('rte :'+rte+'.');
	rte='rte';
	if (document.all) {
		oRTE = frames[rte];

		//get current selected range
		try {
			var selection = oRTE.document.selection;
		} catch (e) {
			alert('erreur :' + e);
		}
		if (selection != null) {
			rng = selection.createRange();
		}
	} else {
		oRTE = document.getElementById(rte).contentWindow;

		//get currently selected range
		var selection = oRTE.getSelection();
		rng = selection.getRangeAt(selection.rangeCount - 1).cloneRange();
	}
	*/
	try {
		oRTE.focus();
	  	
	  	oRTE.document.execCommand(command, false, option);
	  	strValeurCommande=oRTE.document.queryCommandEnabled(command);
	  	alert('strValeurCommande'+strValeurCommande);
		oRTE.focus();
	} catch (e) {
		alert('erreur fin :'+e);
	}
}
//////////BOUTON ENCADRE//////////

function styleEncadre(IFrameChoisie, nameOfStyle, modeEdition, strErreurImbrication, strErreurAucunMot){
/*
	04 MAI 2006


*/

	var boolDebugStyleEncadre=false;
	if (boolDebugStyleEncadre)
		alert ('style encadre');
	AddStyleEncadre(IFrameChoisie, "wysiwyg_encadre", modeEdition, strErreurImbrication, strErreurAucunMot);
	if (boolDebugStyleEncadre)
		alert ('style encadre');

}

function AddStyleEncadre(IFrameChoisie, nameOfStyle, modeEdition, strErreurImbrication, strErreurAucunMot){
	// Tableau de reference
	/*
	
		MAI2006
		CF ADDSTYLE COMPLET, inspiration
	
	*/
	
	var boolDebugAddStyleComplet=true;//variable qui permet d'activer les messages de debuggages
	if (boolDebugAddStyleComplet==true){
		alert ('addstyle1  ');
	}
	var ArrBaliseParagraphe = new Array("P", "H");
	test_balise=true;//nom a changer
	
	// Blindage de fonction
	if(nameOfStyle =="" || !modeEdition) 
		return;

	// focus est obligatoire car sinon il est possible que tout la page appelante soit utilisee
	IFrameChoisie.focus();
	
	// on vérifie que l'on est pas dans un tableau dans ce cas on n'applique pas le style car celui-ci buggerait
	if (HasAncestorNode(IFrameChoisie, "TABLE"))
	{
		return;
	}
	/*Permet de traiter le cas particulier sans balise P*/
	if (!HasAncestorNode(IFrameChoisie, "P"))
	{
		
		if (boolDebugAddStyleComplet==true){
			alert('pas résultat td et de P');
		}
		test_balise=false;	
	}
	
	// Definition de constantes qui seront utilisees pour determiner le type de traitement a faire
	var MotCleAlignement      = 'Alignement';
	var MotCleListeNumerique  = 'ListeNumerique';
	var MotCleListeNormal     = 'ListeNormale';
	
	// Selection du range du textArea 
	textAreaRange = IFrameChoisie.document.body.createTextRange();
	
	// Selection du texte normal et HTML
	var theselection     = IFrameChoisie.document.selection;
	rangeSelectionne     = theselection.createRange();
	var texte            = rangeSelectionne.text;
	alert (' texte '+texte);
	
	// Initilisation des balises

	//var BaliseDebut = "SPAN";
	//var BaliseFin   = "SPAN";
	
	var BaliseDebut = "div";
	var BaliseFin   = "div";

	// Definition du cas a traiter
	var AlignementATraiter = nameOfStyle.lastIndexOf(MotCleAlignement)>=0;
	var OlATraiter         = nameOfStyle.lastIndexOf(MotCleListeNumerique)>=0;
	var UlATraiter         = nameOfStyle.lastIndexOf(MotCleListeNormal)>=0;
	var HnATraiter         = (nameOfStyle.lastIndexOf("H")>=0 && nameOfStyle.length == 2);
	
	// Variable pour forcer l'imbrication
	var EstStyleSimple = false;
	//alert('style complique');
	if (nameOfStyle.toUpperCase().indexOf("GRAS")>0 || nameOfStyle.toUpperCase().indexOf("ITALI")>0 || nameOfStyle.toUpperCase().indexOf("SOULIGNE")>0 || nameOfStyle.toUpperCase().indexOf("UNDER")>0) {
		EstStyleSimple = true;
		//alert('style complique');

	}
	
	// Mot cle contenant le "pattern" a selectionner. IE ne gerant pas les paragraphes, ce cas sera traiter a part.
	var MotifASelectioner  = "";
	
	// Prefixe et suffixe a rajouter avant le colle du code HTML. Utilise lorsque l'utilisateur a selecttionne tout un paragraphe
	var strPrefixeTextHtml = "";
	var strSuffixeTextHtml = "";
	
	if (texte == "" && !(OlATraiter || UlATraiter || AlignementATraiter || HnATraiter)){
		
		alert(strErreurAucunMot)
		return;
	}
			
	// Definition d'un booleen forcant le coller
	ToutPaster = false;

	// Traitement particulier suivant le style envoye
	if (UlATraiter || OlATraiter || AlignementATraiter || HnATraiter){
		MotifASelectioner = 'paragraphe';
	}
	if (AlignementATraiter){
		BaliseDebut        = "P";
		BaliseFin          = "P";
		strPrefixeTextHtml = "";
		strSuffixeTextHtml = "";
	}
	else if (HnATraiter){
		BaliseDebut = nameOfStyle;
		BaliseFin   = nameOfStyle;
		strPrefixeTextHtml = nameOfStyle;
		strSuffixeTextHtml = nameOfStyle;
	}
	else if (OlATraiter){
		BaliseDebut        = "<LI>";
		BaliseFin          = "";
		strPrefixeTextHtml = "OL";
		strSuffixeTextHtml = "OL";
	}
	else if (UlATraiter){
		BaliseDebut        = "<LI>";
		BaliseFin          = "";
		strPrefixeTextHtml = "UL";
		strSuffixeTextHtml = "UL";
	}
	
	// Selection de tout le MotifASelectioner si c'est necessaire. Dans le cas du paragraphe => traitement sur les chaines de caractere (cf plus loin)
	if (MotifASelectioner!="" && MotifASelectioner != 'paragraphe'){
		rangeSelectionne.expand(MotifASelectioner);
	}
		
	// Recuperation de la partie avant la selection
	var arrResultatAvant = new Array();
	//getAvantTexteRangeSelectionneBis(textAreaRange, rangeSelectionne, arrResultatAvant);
	getAvantTexteRangeSelectionne(textAreaRange, rangeSelectionne, arrResultatAvant);
	var StrHtmlDebut     = arrResultatAvant["chaine"];
	if (boolDebugAddStyleComplet==true){
		alert('StrHtmlDebut*'+StrHtmlDebut);
	}	
	var intNbDeplacement = arrResultatAvant["NbDeplacement"];

	// Recuperation de la partie apres la selection
	var arrResultatApres = new Array();
	getApresTexteRangeSelectionne(textAreaRange, rangeSelectionne, arrResultatApres);
	var StrHtmlApres     = arrResultatApres["chaine"];
	if (boolDebugAddStyleComplet==true){
		alert('StrHtmlApres*'+StrHtmlApres);
	}	
	// !! Un peu de rapiecage... dans le cas la balise de fermeture n'est pas complete ie le champs est de la forme : /P>
	var nbOccurenceOuvertureInf  = CompteNombreOccurence(StrHtmlApres, "<");
	var nbOccurenceFermertureSup = CompteNombreOccurence(StrHtmlApres, ">");
	
	if (nbOccurenceFermertureSup ==  nbOccurenceOuvertureInf  + 1){
		StrHtmlApres =  "<" + StrHtmlApres;
	}
	var NbFinSpan        = arrResultatApres["nbFinSpan"];
	
	// Recuperation du texte selectionne
	
	if (boolDebugAddStyleComplet==true){
		//alert ('test**'+test +'*StrHtmlDebut*'+StrHtmlDebut+'*StrHtmlApres*'+StrHtmlApres);
		alert ('StrHtmlDebut *'+StrHtmlDebut+'* StrHtmlApres '+StrHtmlApres);
	}
	StrHtmlSelectionne = getTexteRangeSelectionne(NettoieRange(textAreaRange.htmlText), StrHtmlDebut, StrHtmlApres);
	if (boolDebugAddStyleComplet==true){	
		alert ('0 StrHtmlSelectionne *'+StrHtmlSelectionne);
	}
	resultPOuvrant = StrHtmlSelectionne.search ("<P>");
	if (boolDebugAddStyleComplet)
		alert ('resultPOuvrant '+resultPOuvrant);
	resultPFermant = StrHtmlSelectionne.search ("</P>");
	var strEval=IFrameChoisie;
	var strTextIframe=eval(strEval).document.body.innerHTML;	
	//boolHasP=HasAncestorNode(IFrameChoisie,'P');	//marchep pas bien
	boolHasP = strTextIframe.search ("</P>");
	if (boolHasP!=-1){
		if (boolDebugAddStyleComplet)
			alert ('resultPFermant '+resultPFermant);
		if ((resultPOuvrant==-1)||(resultPFermant==-1)){
			alert ('veuillez selectionner un paragraphe entier');
			return;
		}
	}
	else{
		if (strTextIframe!=StrHtmlSelectionne){
			alert ('veuillez selectionner un paragraphe entier');
			return;
			
		}
	}

	


	if (boolDebugAddStyleComplet==true){	
		alert ('1bis StrHtmlSelectionne *'+StrHtmlSelectionne);
	}
	// !! Un peu de rapiecage... 
	var intPosInf = StrHtmlApres.indexOf("<");
	if (intPosInf <0){
		intPosInf = StrHtmlApres.length - 1;
	}
	var intPosSup = StrHtmlApres.indexOf(">");
	// Si le paragraphe commence par une balise de P non ouverte(cas ou le carret est en fin d'un paragraphe)
	if (StrHtmlApres.toUpperCase().indexOf("P") == 0 && intPosInf > intPosSup ){
		StrHtmlApres =  "<"+ StrHtmlApres;
	}
	intDebutTagP = StrHtmlSelectionne.toUpperCase().indexOf("<P");
	
	if (CompteNombreOccurence(StrHtmlSelectionne, "</OL>")>0 && CompteNombreOccurence(StrHtmlSelectionne, "</UL>")>0){
		alert('Vous ne pouvez pas appliquer ce style car vous avez sélectionné la fin d\'une liste. Veuillez sélectionner moins.');
		return;
	}

	if (VerifieImbrication(IFrameChoisie,NettoieRange(textAreaRange.htmlText), StrHtmlSelectionne, StrHtmlDebut.length -1, strErreurImbrication, nameOfStyle)== false){
		return;//pour permettre changement
	}

	// Selection de tout le paragraphe
	if (MotifASelectioner == 'paragraphe'){
		
		
		if (boolDebugAddStyleComplet){
			alert (' Motif selectionner est un paragraphe ');
		}
		arrNouvellesChaines = new Array();
		if (NettoieRange(textAreaRange.htmlText.toUpperCase()).indexOf("<P") <0 && NettoieRange(textAreaRange.htmlText.toUpperCase()).indexOf("<H") <0){
			StrHtmlDebut = "<P>" + StrHtmlDebut;
			StrHtmlApres = StrHtmlApres + "</P>";
		}

		if (boolDebugAddStyleComplet==true){
			alert ('StrHtmlDebut '+StrHtmlDebut+' StrHtmlApres '+StrHtmlApres);	
		}

		SelectionneParagraphe(StrHtmlDebut, StrHtmlSelectionne, StrHtmlApres, arrNouvellesChaines);
		StrHtmlDebut        = arrNouvellesChaines["debut"];
		
		StrHtmlSelectionne  = arrNouvellesChaines["milieu"];
		
		StrHtmlApres        = arrNouvellesChaines["fin"];
		
		ToutPaster = true;
		
		if (boolDebugAddStyleComplet==true){
			alert ('StrHtmlDebut '+StrHtmlDebut+' StrHtmlSelectionne '+ StrHtmlSelectionne +' StrHtmlApres '+StrHtmlApres);	
		}
	}
	
	// Determination des tableaux de span ouverts
	var ArrStyleOuvert = CreeTableauStyleOuvert(NettoieRange(textAreaRange.htmlText), StrHtmlSelectionne, StrHtmlDebut.length -1, "SPAN");
	
	if (VerifieImbrication(IFrameChoisie,NettoieRange(textAreaRange.htmlText), StrHtmlSelectionne, StrHtmlDebut.length -1, strErreurImbrication, nameOfStyle)== false){
		//InsereStyle(IFrameChoisie);
		return;
	}

	
	//A ce moment du traitement, on a reconstitue la chaine du textarea
	//alert('__Selection__\n StrHtmlDebut : ||'+StrHtmlDebut +'||\n StrHtmlApres : ||' + StrHtmlApres + '||\n StrHtmlSelectionne : ||'+StrHtmlSelectionne+'||\n s \n Tout : '+NettoieRange(textAreaRange.htmlText)+ '\n NbFinSpan :' + NbFinSpan);
	
	// ... On commence par modifier toutes les balises de debut et de fin de paragraphe par la valeur de la nouvelle balise
	ArrBaliseParagrapheOuverture = new Array();
	ArrBaliseParagrapheFermerture = new Array();
				
	for(var i=0; i<ArrBaliseParagraphe.length;i++){
		ArrBaliseParagrapheOuverture[i]  = "<"+ArrBaliseParagraphe[i];
		ArrBaliseParagrapheFermerture[i] = "</"+ArrBaliseParagraphe[i];
	}
		
	// .... Puis Dans le cas d'un paragraphe...
	if (MotifASelectioner == 'paragraphe'){
		if (boolDebugAddStyleComplet)
			alert(' motif selection paragraphe ');
		if (CompteNombreOccurence(StrHtmlSelectionne, "<LI>")>0){
			alert("Vous ne pouvez pas imposer ce style car vous avez sélectionné une liste.")
			return;
		}
		if (HnATraiter){
			
			//StrHtmlSelectionne = SupprimeBaliseOuvertureEtFermertureParagraphe(StrHtmlSelectionne, new Array());
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheOuverture, "<"+BaliseDebut+">", false);
	//		alert('vt : '+StrHtmlSelectionne)
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheFermerture, "</"+BaliseFin+">", true);
	//		alert('ap : '+StrHtmlSelectionne)
			//textehtml = '<'+BaliseDebut+'>' + StrHtmlSelectionne + '</'+BaliseFin+'>';
			textehtml = StrHtmlSelectionne;
			if (boolDebugAddStyleComplet)
				alert('text'+textehtml);
		}
		else if (OlATraiter || UlATraiter){
			if (boolDebugAddStyleComplet)
				alert('dans le 3em if');
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheOuverture, BaliseDebut, false);
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheFermerture, BaliseFin, true);
			textehtml = '<'+strPrefixeTextHtml+ ' class="' + nameOfStyle + '">' + StrHtmlSelectionne + '</'+strSuffixeTextHtml+'>';
		}
		else if(AlignementATraiter){
			if (boolDebugAddStyleComplet)
				alert('dans le 4em if');
	//		StrHtmlSelectionne = '<'+BaliseDebut+ ' class="' + nameOfStyle + '">' + StrHtmlSelectionne + "</"+BaliseFin+">";
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheOuverture, '<'+BaliseDebut+ ' class="' + nameOfStyle + '">', false);
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheFermerture, "</"+BaliseFin+">", true);
			textehtml = StrHtmlSelectionne;
		}
	alert ('PARAGRAPHE');
	}
	else{
		alert ('pas PARAGRAPHE');
		var RajoutSpan         = (BaliseDebut.toUpperCase().indexOf("SPAN") >=0 );
		// ... Ou dans le cas d'un span...
		if (RajoutSpan){
			// Cas ou tout le texte est selectionne
			//StrHtmlApres='d';//pour ne pas rentrer dans cette condition
			if (boolDebugAddStyleComplet)
				alert ('RajoutSpan ' + RajoutSpan);
			if (StrHtmlDebut == "" && StrHtmlApres =="") {
				// Il est possible qu'un replace fasse l'affaire?
				if (!test_balise){
					if (boolDebugAddStyleComplet==true){
						alert('aucune balise et test'+test_balise);
					}
				}
				else{
					//alert ('balise en vue et test '+test_balise);
					alert("Vous ne pouvez pas sélectionner tout le texte");
					return;
				}
				
			}

			
			// Protection contre l'application d'un style sur plusieurs paragraphes
			var nbOccurenceOuverture = 0;
			var nbOccurenceFermeture = 0;
			var posBaliseOuvrante    = -1;
			var posBaliseFermante    = -1;
			var boolSurPlusieursParagraphes = false;
			for(var i=0;i<ArrBaliseParagraphe.length;i++){
				// Il est possible qu'un replace fasse l'affaire?
				nbOccurenceOuverture = CompteNombreOccurence(StrHtmlSelectionne, "<"+ArrBaliseParagraphe[i]);
				nbOccurenceFermeture = CompteNombreOccurence(StrHtmlSelectionne, "</"+ArrBaliseParagraphe[i]+">");
				posBaliseFermante = StrHtmlSelectionne.indexOf("</"+ArrBaliseParagraphe[i]+">");
				posBaliseOuvrante = StrHtmlSelectionne.indexOf("<"+ArrBaliseParagraphe[i]);
				if (nbOccurenceFermeture == nbOccurenceOuverture && posBaliseFermante < posBaliseOuvrante){
					boolSurPlusieursParagraphes = true;
				}
				if (nbOccurenceOuverture == nbOccurenceFermeture && (nbOccurenceFermeture >1 ) ){
					boolSurPlusieursParagraphes = true;
				}
				if (nbOccurenceOuverture != nbOccurenceFermeture && (nbOccurenceFermeture > 1 || nbOccurenceOuverture > 1)){
					boolSurPlusieursParagraphes = true;
				}
				if (boolSurPlusieursParagraphes){
					//alert("Vous ne pouvez pas appliquer un style sur plusieurs paragraphes.");
					//return; // A veriffier Mar1 
				}
			}
		
			var ArrBalisesParagrapheCourant = new Array();
			//alert('avant sup bliase : '+StrHtmlSelectionne);
			if (boolDebugAddStyleComplet==true){
				alert ('1 StrHtmlSelectionne *'+StrHtmlSelectionne);
			}
			while(StrHtmlSelectionne.toUpperCase().indexOf("</SPAN>")==0){
				var intPosFermerture = 7;
				StrHtmlDebut = StrHtmlDebut + StrHtmlSelectionne.substring(0, intPosFermerture);
				StrHtmlSelectionne = StrHtmlSelectionne.substring(intPosFermerture, StrHtmlSelectionne.length);
			}
			if (boolDebugAddStyleComplet==true){
				alert ('2 StrHtmlSelectionne *'+StrHtmlSelectionne);
			}
			
			HtmlSelectionne = SupprimeBaliseOuvertureEtFermertureParagraphe(StrHtmlSelectionne, ArrBalisesParagrapheCourant);				
						
			if (boolDebugAddStyleComplet==true){
				alert ('3 StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}
			//alert('avant : '+ArrBalisesParagrapheCourant["baliseOuvrante"] + '\n apres : '+ArrBalisesParagrapheCourant["baliseFermante"] + '\nStrHtmlSelectionne'+StrHtmlSelectionne);
			/*Maroane : traitement pour sortir l espace du span*/
			
			//StrHtmlSelectionne = AppliqueStyle(nameOfStyle, StrHtmlSelectionne, NettoieRange(textAreaRange.htmlText), StrHtmlDebut);
			StrHtmlSelectionne = AppliqueStyleDiv(IFrameChoisie,nameOfStyle, StrHtmlSelectionne, NettoieRange(textAreaRange.htmlText), StrHtmlDebut);
			
			if (boolDebugAddStyleComplet==true){
				alert ('25 StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}
				
			
			StrHtmlSelectionne=StrHtmlSelectionne.replace(/(\s)|(&nbsp;)/g,'##'); 
			
			StrHtmlSelectionne=StrHtmlSelectionne.replace(/(#*)<\/SPAN>/gi,"</SPAN>$1");// AM

			StrHtmlSelectionne=StrHtmlSelectionne.replace(/(##)/g," "); 

			if (boolDebugAddStyleComplet==true){				
				alert ('4 StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}
						

			//	StrHtmlSelectionne=StrHtmlSelectionne.replace(/ <P>{.w+}</P> /g,"toto $1 toto");
			//return string.replace(/(#*)<\/SPAN>/gi,"</SPAN>$1");
			//	StrChaineAEvaluer = 'StrHtmlSelectionne.replace(\"' + StrHtmlSelectionne + '\", "")';
			//	return string.replace(/&nbsp;\'>/gi," \'>");
			// 	StrHtmlSelectionne = StrHtmlSelectionne.replace (/<br\/>/gi,"<_br_/>");
			//	StrChaineAEvaluer = 'StrHtmlSelectionne.replace( / <P>{ .w+ } /g , "toto $1 toto")';	
			//	StrChaineAEvaluer = 'StrHtmlSelectionne.replace( / <P> /g , "toto ")';	

			// traitementspécial pour : sortir les P, ouvrantes et fermantes du span
			var exp= '<SPAN class=\'(.+)\'><P>(.+)</P></SPAN>'; // AM
			//var rempl='<P><SPAN class=$1 > $2 </SPAN></P> ';			
			var rempl='<SPAN class=$1 > $2 </SPAN>';		// AM	
			var expReg=new RegExp(exp, 'gi');
			var expRegC=new RegExp(); // pour «compile»
			StrHtmlSelectionne=StrHtmlSelectionne.replace(expReg, rempl);

			if (boolDebugAddStyleComplet==true){				
				alert ('5bis StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}
			//traitement spéciale pour sortir P, fermante  du span
			var exp= '(.+)</P></SPAN>'; // AM
			var rempl='$1</SPAN>';		//	AM
			var expReg=new RegExp(exp, 'gi');
			var expRegC=new RegExp(); // pour «compile»
			StrHtmlSelectionne=StrHtmlSelectionne.replace(expReg, rempl);			

			if (boolDebugAddStyleComplet==true){				
				alert ('5bisbis StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}

			
			//traitement spéciale pour sortir P, fermante  du span			
			var exp= '<SPAN class=\'(.+)\'><P>'; // AM
			var rempl='<SPAN class=$1 >';		// AM	
			var expReg=new RegExp(exp, 'gi');
			var expRegC=new RegExp(); // pour «compile»
			StrHtmlSelectionne=StrHtmlSelectionne.replace(expReg, rempl);			
			
			if (boolDebugAddStyleComplet==true){				
				alert ('5bisbisbis StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}
			
			

			/*Maroane : fin traitement */			
			
			
			//boolDebugAddStyleComplet=false;
			StrHtmlSelectionne = ArrBalisesParagrapheCourant["baliseOuvrante"] + StrHtmlSelectionne + ArrBalisesParagrapheCourant["baliseFermante"];
			if (boolDebugAddStyleComplet==true){
				alert ('5 StrHtmlSelectionne :'+StrHtmlSelectionne);
			}
			alert ('rajout de span')
		}
		else {
			alert ('pas de rajout de span')
		}
		if (boolDebugAddStyleComplet==true){
			alert ('6 StrHtmlSelectionne *'+StrHtmlSelectionne);
		}
		textehtml = StrHtmlSelectionne;
		if (boolDebugAddStyleComplet==true){
			alert ('7 texte html *'+textehtml);//avant cette variable n existe pas
		}
	}
	if (boolDebugAddStyleComplet==true)
		alert ('3texte html3*'+textehtml);
	textehtml = StrHtmlDebut + textehtml+ StrHtmlApres;

	if (boolDebugAddStyleComplet==true){
		alert ('8 texte html*'+textehtml);
		alert (' StrHtmlDebut*'+StrHtmlDebut);
		alert (' StrHtmlApres*'+StrHtmlApres);
		
	}
	//alert ('strg selec'+StrHtmlSelectionne);
	//alert('*avant paste :*'+textehtml+'*html debut*'+StrHtmlDebut+'*html apres*'+StrHtmlApres);
	textehtml = RetireSpanVide(textehtml);
	if (boolDebugAddStyleComplet==true){
		alert ('9 texte html*'+textehtml);
	}
	IFrameChoisie.document.execCommand("SelectAll");
	
	IFrameChoisie.document.execCommand("delete");
	IFrameChoisie.document.clear();
	if (boolDebugAddStyleComplet==true){
		alert ('10 textehtml '+textehtml);
	}
	
	textAreaRange.pasteHTML(textehtml);
	var strEval=IFrameChoisie;
	var strTextHtml=eval(strEval).document.body.innerHTML;
	
	alert ('remplace strTextHtml 1'+strTextHtml);
	
	
	var exp= '\n<P></P>';	
	var exp= '<P></P>';
	//alert ('exp '+exp);
	var rempl='';
	//var rempl='toto';			
	var expReg=new RegExp(exp, 'gi');
	var expRegC=new RegExp(); // pour «compile»

	strTextHtml=strTextHtml.replace(expReg, rempl);			
	
	if (boolDebugAddStyleComplet)
		alert ('remplace strTextHtml 3 '+strTextHtml);
		
	//var exp= "^<P>";
	//var exp= "^\n<P>";
	//var exp= "\w{3,3}";
	var exp= "<P>\s\n";
	alert ('exp '+exp);
	var rempl='';
	//var rempl='#';			
	var expReg=new RegExp(exp, 'gi');
	var expRegC=new RegExp(); // pour «compile»
	strTextHtml=strTextHtml.replace(expReg, rempl);					
	alert ('remplace strTextHtml 2'+strTextHtml);
	//------------

	strTextHtml=RetirePvide(strTextHtml);
	alert ('remplace strTextHtml 3'+strTextHtml);
	
	//------------	
		
	eval(strEval).document.body.innerHTML = strTextHtml ;


	textAreaRange = IFrameChoisie.document.body.createTextRange();
	workRange     = textAreaRange.duplicate();
 	workRange.setEndPoint("StartToStart", textAreaRange);
	workRange.setEndPoint("EndToStart", textAreaRange);
	var NbAvance = 0;	
	
	while(NbAvance < intNbDeplacement){
		workRange.moveEnd("character", 1);
		NbAvance++;
	}
	workRange.collapse(false);
	workRange.select();

//	alert('__Fin__\n StrHtmlDebut : '+StrHtmlDebut +'\n StrHtmlApres : ' + StrHtmlApres + '\n StrHtmlSelectionne : '+StrHtmlSelectionne+'\n s \n Tout : '+NettoieRange(textAreaRange.htmlText)+ '\n NbFinSpan :' + NbFinSpan +'\n textehtml : '+ textehtml);
	//boolDebugAddStyleComplet=false;
	if (boolDebugAddStyleComplet==true){
		alert ('Félicitation fin fonction add style');
	}
}



function AppliqueStyleDiv(IFrameChoisie,StrNameOfStyle, StrSelection, StrTotal, StrDebut){
	/*
	
		4 Avril
		cf AppliqueStyle
	
	
	*/
	
	var boolDebugAppliqueStyleDiv=false;

	// Suppression des styles ouverts en debut de paragraphe
	while(StrSelection.indexOf("</SPAN>")==0){
		var intPosFermerture = StrSelection.indexOf("</SPAN>") + 1;
		//PosDebut = PosDebut + intPosFermerture;
		StrSelection = StrSelection.substring(intPosFermerture, StrHtmlSelectionne.length);
		StrDebut = StrDebut + "</SPAN>";
	}
	// Definitions des chaines de caractere qui vont gerer le style de la selection
	var StrAAppliquerApres = "";
	var StrAAppliquerAvant = "";
	// Resultat de la fonction
	var StrResultat = "";
	// Tableau des styles ouverts (et non fermes) avant le debut de la selection
	var ArrSpanOuvertAvantDebutSelection = CreeTableauStyleOuvert(StrTotal, StrDebut, StrDebut.length - 1 , "SPAN");
	var ClePosSpanOuvertAvantSelection   = 0;
	// Tableau des styles ouverts (et non fermes) avant la fin de la selection. la difference des 2 tableaux va nous permettre de connaitre les styles ovuerts _dans_ la selection
	var ArrSpanOuvertFinSelection        = CreeTableauStyleOuvert(StrTotal, StrDebut + StrSelection, StrDebut.length - 1 + StrSelection.length - 1, "SPAN");
	// Tableau des styles ouverts (et non fermes) dans la selection 
	var ArrSpanOuvertDansSelection       = CreeTableauStyleOuvert(StrSelection, "a", StrSelection.length, "SPAN");
	
	
	// On determine si StrNameOfStyle est ouvert avant le debut de la selection
	var StyleEstPresentAvantSelection = false;
	for(var i=0; i<ArrSpanOuvertAvantDebutSelection.length && !StyleEstPresentAvantSelection; i++){
		if (ArrSpanOuvertAvantDebutSelection[i].indexOf(StrNameOfStyle)>0){
			StyleEstPresentAvantSelection = true;
			ClePosSpanOuvertAvantSelection  = i;
		}
	}
	
	// On determine si StrNameOfStyle est ouvert dans la selection
	var StyleEstPresentDansSelection = false;
	for(var o=0; o<ArrSpanOuvertDansSelection.length && !StyleEstPresentDansSelection; o++){
		if (ArrSpanOuvertDansSelection[o].indexOf(StrNameOfStyle)>0){
			StyleEstPresentDansSelection = true;
		}
	}
	
	// Traitement particulier : la selection ouvre une balise avec le style a ajouter => dans ce cas on supprime toute presence du style
	if (StyleEstPresentDansSelection){
		var arrResultat = new Array();
		arrResultat["SpanASupprimer"] = StrNameOfStyle;
		CreeTableauStyleOuvert(StrSelection, "a", StrSelection.length, "SPAN", arrResultat);
		strResultat = arrResultat["strSansSpanFermerture"];
		return strResultat;
	}
	
	// Determination des balises a mettre avant et apres le style.
	if(StyleEstPresentAvantSelection){
	 	// Dans ce cas, le style doit etre supprime
	 	StrAAppliquerApres = "<SPAN class='" +StrNameOfStyle+ "'>";
	 	StrAAppliquerAvant = "</SPAN>";
	 	if (ClePosSpanOuvertAvantSelection >=0  && ArrSpanOuvertAvantDebutSelection.length > ClePosSpanOuvertAvantSelection + 1){
	 		for(var m = ClePosSpanOuvertAvantSelection + 1; m<ArrSpanOuvertAvantDebutSelection.length;m++){
	 			 StrAAppliquerAvant = " </SPAN> " + StrAAppliquerAvant + ArrSpanOuvertAvantDebutSelection[m]+" ";
	 			 StrAAppliquerApres = " </SPAN> " + StrAAppliquerApres + ArrSpanOuvertAvantDebutSelection[m]+" ";;
	 		}
		}
	}
	else{
		// Dans ce cas, le style doit etre rajouter
		//StrAAppliquerAvant = "<SPAN class='" +StrNameOfStyle+ "'>";
		StrAAppliquerAvant = "<div class='" +StrNameOfStyle+ "'>";// A VERRIFIER Mar1
	 	//StrAAppliquerApres = "</SPAN>";
	 	StrAAppliquerApres = "</div>";// A VERRIFIER Mar1
	
		// Gestion de l'imbrication
		var IntDeltaSpanOuvert = ArrSpanOuvertAvantDebutSelection.length - ArrSpanOuvertFinSelection.length;
			// 1er cas : la selection ouvre des styles sans les refermer. exemple : exemple : <b> toto [ti<i>ti] tutu </i>aze </b> [] indique l'element selectionne ==> il faut tous les refermer!
		if (ArrSpanOuvertDansSelection.length>0){
			for (var k = 0; k < ArrSpanOuvertDansSelection.length; k++){
				StrAAppliquerApres = "</SPAN>" + StrAAppliquerApres + ArrSpanOuvertDansSelection[k];
			}
		}
			// 2eme cas : il y a plus de styles (ie de SPAN) ouvert DANS la selection qu'AVANT. exemple : <b> toto [ti<i>ti] tutu </i>aze </b> [] indique l'element selectionne
				// probablement obsolete!
		else if (IntDeltaSpanOuvert < 0){
			// Note : l'ordre croissant ne pose pas de probleme car la fin du style est identique quelque soit le style
			for (var k = ArrSpanOuvertAvantDebutSelection.length; k < ArrSpanOuvertFinSelection.length; k++){
				StrAAppliquerApres = "</SPAN>" + StrAAppliquerApres + ArrSpanOuvertFinSelection[k];
			}
		}
			// 3eme  cas : il y a plus de styles (ie de SPAN) ouvert AVANT le debut de la selection que DANS. Certains styles sont donc fermes dans la selection! exemple : <b> toto [t</b>i<i>ti] tutu <i>aze
		else if (IntDeltaSpanOuvert >0 ){
			for (var k = ArrSpanOuvertFinSelection.length; k < ArrSpanOuvertAvantDebutSelection.length; k++){
			 	// Cas particulier : le style peut etre ferme dans la selection... On ne le rouvre pas apres pas!
				if (StyleEstPresentAvantSelection && ArrSpanOuvertAvantDebutSelection[k].indexOf(StrNameOfStyle)>0){
					StrAAppliquerApres = "";
				}
				StrAAppliquerAvant = "</SPAN>" + StrAAppliquerAvant + ArrSpanOuvertAvantDebutSelection[k];
			}
		}
	}

	StrResultat = StrAAppliquerAvant + StrSelection + StrAAppliquerApres;
	if (boolDebugAppliqueStyleDiv){
		alert('add style div StrNameOfStyle : '+StrNameOfStyle+'\n StrDebut :'+StrDebut+'\n  StrSelection : '+StrSelection+'\nStrTotal : '+StrTotal+' \nIntDeltaSpanOuvert :'+IntDeltaSpanOuvert+'\n ArrSpanOuvertFinSelection.len : '+ArrSpanOuvertFinSelection.length+'\n ArrSpanOuvertAvantDebutSelection.length : '+ArrSpanOuvertAvantDebutSelection.length+'\nArrSpanOuvertDansSelection.length :'+ArrSpanOuvertDansSelection.length+' \n _ \n StrResutlat : '+StrResultat);
	}
	return StrResultat;
}
//MSH ticket#22
function AddLangueComplet(IFrameChoisie, nameOfStyle, modeEdition, strErreurImbrication, strErreurAucunMot)
{
// Tableau de reference
	
	var boolDebugAddStyleComplet=false;//variable qui permet d'activer les messages de debuggages
	if (boolDebugAddStyleComplet==true){
		alert ('addstyle1  ');
	}
	var ArrBaliseParagraphe = new Array("P", "H");

	test_balise=true;//nom a changer
	
	// Blindage de fonction
	if(nameOfStyle =="" || !modeEdition) 
		return;
	// focus est obligatoire car sinon il est possible que tout la page appelante soit utilisee
	IFrameChoisie.focus();
	
	// on vérifie que l'on est pas dans un tableau dans ce cas on n'applique pas le style car celui-ci buggerait
	if (HasAncestorNode(IFrameChoisie, "TABLE"))
	{
		return;
	}
	/*Permet de traiter le cas particulier sans balise P*/
	if (!HasAncestorNode(IFrameChoisie, "P"))
	{
		if (boolDebugAddStyleComplet==true){
			alert('pas résultat td et de P');
		}
		test_balise=false;	
	}
	// Definition de constantes qui seront utilisees pour determiner le type de traitement a faire
	var MotCleAlignement      = 'Alignement';
	var MotCleListeNumerique  = 'ListeNumerique';
	var MotCleListeNormal     = 'ListeNormale';
	
	// Selection du range du textArea 
	textAreaRange = IFrameChoisie.document.body.createTextRange();
	
	// Selection du texte normal et HTML
	var theselection     = IFrameChoisie.document.selection;
	rangeSelectionne     = theselection.createRange();
	var texte            = rangeSelectionne.text;
	
	// Initilisation des balises
	var BaliseDebut = "SPAN";
	var BaliseFin   = "SPAN";

	// Definition du cas a traiter
	var AlignementATraiter = nameOfStyle.lastIndexOf(MotCleAlignement)>=0;
	var OlATraiter         = nameOfStyle.lastIndexOf(MotCleListeNumerique)>=0;
	var UlATraiter         = nameOfStyle.lastIndexOf(MotCleListeNormal)>=0;
	var HnATraiter         = (nameOfStyle.lastIndexOf("H")>=0 && nameOfStyle.length == 2);
	
	// Variable pour forcer l'imbrication
	var EstStyleSimple = false;
	//alert('style complique');
	if (nameOfStyle.toUpperCase().indexOf("GRAS")>0 || nameOfStyle.toUpperCase().indexOf("ITALI")>0 || nameOfStyle.toUpperCase().indexOf("SOULIGNE")>0 || nameOfStyle.toUpperCase().indexOf("UNDER")>0) {
		EstStyleSimple = true;
		//alert('style complique');

	}
	
	// Mot cle contenant le "pattern" a selectionner. IE ne gerant pas les paragraphes, ce cas sera traiter a part.
	var MotifASelectioner  = "";
	
	// Prefixe et suffixe a rajouter avant le colle du code HTML. Utilise lorsque l'utilisateur a selecttionne tout un paragraphe
	var strPrefixeTextHtml = "";
	var strSuffixeTextHtml = "";
	
	if (texte == "" && !(OlATraiter || UlATraiter || AlignementATraiter || HnATraiter)){
		
		alert(strErreurAucunMot)
		return;
	}
			
	// Definition d'un booleen forcant le coller
	ToutPaster = false;

	// Traitement particulier suivant le style envoye
	if (UlATraiter || OlATraiter || AlignementATraiter || HnATraiter){
		MotifASelectioner = 'paragraphe';
	}
	if (AlignementATraiter){
		BaliseDebut        = "P";
		BaliseFin          = "P";
		strPrefixeTextHtml = "";
		strSuffixeTextHtml = "";
	}
	else if (HnATraiter){
		BaliseDebut = nameOfStyle;
		BaliseFin   = nameOfStyle;
		strPrefixeTextHtml = nameOfStyle;
		strSuffixeTextHtml = nameOfStyle;
	}
	else if (OlATraiter){
		BaliseDebut        = "<LI>";
		BaliseFin          = "";
		strPrefixeTextHtml = "OL";
		strSuffixeTextHtml = "OL";
	}
	else if (UlATraiter){
		BaliseDebut        = "<LI>";
		BaliseFin          = "";
		strPrefixeTextHtml = "UL";
		strSuffixeTextHtml = "UL";
	}
	
	// Selection de tout le MotifASelectioner si c'est necessaire. Dans le cas du paragraphe => traitement sur les chaines de caractere (cf plus loin)
	if (MotifASelectioner!="" && MotifASelectioner != 'paragraphe'){
		rangeSelectionne.expand(MotifASelectioner);
	}
		
	// Recuperation de la partie avant la selection
	var arrResultatAvant = new Array();
	getAvantTexteRangeSelectionne(textAreaRange, rangeSelectionne, arrResultatAvant);
	var StrHtmlDebut     = arrResultatAvant["chaine"];
	if (boolDebugAddStyleComplet==true){
		alert('StrHtmlDebut*'+StrHtmlDebut);
	}	
	var intNbDeplacement = arrResultatAvant["NbDeplacement"];

	// Recuperation de la partie apres la selection
	var arrResultatApres = new Array();
	getApresTexteRangeSelectionne(textAreaRange, rangeSelectionne, arrResultatApres);
	var StrHtmlApres     = arrResultatApres["chaine"];
	if (boolDebugAddStyleComplet==true){
		alert('StrHtmlApres*'+StrHtmlApres);
	}	
	// !! Un peu de rapiecage... dans le cas la balise de fermeture n'est pas complete ie le champs est de la forme : /P>
	var nbOccurenceOuvertureInf  = CompteNombreOccurence(StrHtmlApres, "<");
	var nbOccurenceFermertureSup = CompteNombreOccurence(StrHtmlApres, ">");
	
	if (nbOccurenceFermertureSup ==  nbOccurenceOuvertureInf  + 1){
		StrHtmlApres =  "<" + StrHtmlApres;
	}
	var NbFinSpan        = arrResultatApres["nbFinSpan"];
	
	// Recuperation du texte selectionne
	
	//test=textAreaRange.htmlText;
	if (boolDebugAddStyleComplet==true){
	//	alert ('test**'+test +'*StrHtmlDebut*'+StrHtmlDebut+'*StrHtmlApres*'+StrHtmlApres);
		alert ('StrHtmlDebut *'+StrHtmlDebut+'* StrHtmlApres '+StrHtmlApres);
	}
	StrHtmlSelectionne = getTexteRangeSelectionne(NettoieRange(textAreaRange.htmlText), StrHtmlDebut, StrHtmlApres);

	if (boolDebugAddStyleComplet==true){	
		alert ('0 StrHtmlSelectionne *'+StrHtmlSelectionne);
	}
	

	if (boolDebugAddStyleComplet==true){	
		alert ('1bis StrHtmlSelectionne *'+StrHtmlSelectionne);
	}
	// !! Un peu de rapiecage... 
	var intPosInf = StrHtmlApres.indexOf("<");
	if (intPosInf <0){
		intPosInf = StrHtmlApres.length - 1;
	}
	var intPosSup = StrHtmlApres.indexOf(">");
	// Si le paragraphe commence par une balise de P non ouverte(cas ou le carret est en fin d'un paragraphe)
	if (StrHtmlApres.toUpperCase().indexOf("P") == 0 && intPosInf > intPosSup ){
		StrHtmlApres =  "<"+ StrHtmlApres;
	}
	intDebutTagP = StrHtmlSelectionne.toUpperCase().indexOf("<P");
	
	if (CompteNombreOccurence(StrHtmlSelectionne, "</OL>")>0 && CompteNombreOccurence(StrHtmlSelectionne, "</UL>")>0){
		alert('Vous ne pouvez pas appliquer ce style car vous avez sélectionné la fin d\'une liste. Veuillez sélectionner moins.');
		return;
	}

	if (VerifieImbrication(IFrameChoisie,NettoieRange(textAreaRange.htmlText), StrHtmlSelectionne, StrHtmlDebut.length -1, strErreurImbrication, nameOfStyle)== false){
		//InsereStyle(IFrameChoisie);
		//alert('Pour permettre imbrication');
		return;//pour permettre changement
	}

	// Selection de tout le paragraphe
	if (MotifASelectioner == 'paragraphe'){
		
		
		if (boolDebugAddStyleComplet){
			alert (' Motif selectionner est un paragraphe ');
		}
		arrNouvellesChaines = new Array();
		if (NettoieRange(textAreaRange.htmlText.toUpperCase()).indexOf("<P") <0 && NettoieRange(textAreaRange.htmlText.toUpperCase()).indexOf("<H") <0){
			StrHtmlDebut = "<P>" + StrHtmlDebut;
			StrHtmlApres = StrHtmlApres + "</P>";
		}

		if (boolDebugAddStyleComplet==true){
			alert ('StrHtmlDebut '+StrHtmlDebut+' StrHtmlApres '+StrHtmlApres);	
		}

		SelectionneParagraphe(StrHtmlDebut, StrHtmlSelectionne, StrHtmlApres, arrNouvellesChaines);
		StrHtmlDebut        = arrNouvellesChaines["debut"];
		
		StrHtmlSelectionne  = arrNouvellesChaines["milieu"];
		
		StrHtmlApres        = arrNouvellesChaines["fin"];
		
		ToutPaster = true;
		
		if (boolDebugAddStyleComplet==true){
			alert ('StrHtmlDebut '+StrHtmlDebut+' StrHtmlSelectionne '+ StrHtmlSelectionne +' StrHtmlApres '+StrHtmlApres);	
		}
	}
	
	// Determination des tableaux de span ouverts
	var ArrStyleOuvert = CreeTableauStyleOuvert(NettoieRange(textAreaRange.htmlText), StrHtmlSelectionne, StrHtmlDebut.length -1, "SPAN");

	if (VerifieImbrication(IFrameChoisie,NettoieRange(textAreaRange.htmlText), StrHtmlSelectionne, StrHtmlDebut.length -1, strErreurImbrication, nameOfStyle)== false){
		//InsereStyle(IFrameChoisie);
		return;
	}

	
	//A ce moment du traitement, on a reconstitue la chaine du textarea
	//alert('__Selection__\n StrHtmlDebut : ||'+StrHtmlDebut +'||\n StrHtmlApres : ||' + StrHtmlApres + '||\n StrHtmlSelectionne : ||'+StrHtmlSelectionne+'||\n s \n Tout : '+NettoieRange(textAreaRange.htmlText)+ '\n NbFinSpan :' + NbFinSpan);
	
	// ... On commence par modifier toutes les balises de debut et de fin de paragraphe par la valeur de la nouvelle balise
	ArrBaliseParagrapheOuverture = new Array();
	ArrBaliseParagrapheFermerture = new Array();
				
	for(var i=0; i<ArrBaliseParagraphe.length;i++){
		ArrBaliseParagrapheOuverture[i]  = "<"+ArrBaliseParagraphe[i];
		ArrBaliseParagrapheFermerture[i] = "</"+ArrBaliseParagraphe[i];
	}
		
	// .... Puis Dans le cas d'un paragraphe...
	if (MotifASelectioner == 'paragraphe'){
		if (boolDebugAddStyleComplet)
			alert(' motif selection paragraphe ');
		if (CompteNombreOccurence(StrHtmlSelectionne, "<LI>")>0){
			alert("Vous ne pouvez pas imposer ce style car vous avez sélectionné une liste.")
			return;
		}
		if (HnATraiter){
			//StrHtmlSelectionne = SupprimeBaliseOuvertureEtFermertureParagraphe(StrHtmlSelectionne, new Array());
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheOuverture, "<"+BaliseDebut+">", false);
	//		alert('vt : '+StrHtmlSelectionne)
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheFermerture, "</"+BaliseFin+">", true);
	//		alert('ap : '+StrHtmlSelectionne)
			//textehtml = '<'+BaliseDebut+'>' + StrHtmlSelectionne + '</'+BaliseFin+'>';
			textehtml = StrHtmlSelectionne;
			if (boolDebugAddStyleComplet)
				alert('text'+textehtml);
		}
		else if (OlATraiter || UlATraiter){
			if (boolDebugAddStyleComplet)
				alert('dans le 3em if');
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheOuverture, BaliseDebut, false);
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheFermerture, BaliseFin, true);
			textehtml = '<'+strPrefixeTextHtml+ ' lang="' + nameOfStyle + '">' + StrHtmlSelectionne + '</'+strSuffixeTextHtml+'>';
		}
		else if(AlignementATraiter){
			if (boolDebugAddStyleComplet)
				alert('dans le 4em if');
	//		StrHtmlSelectionne = '<'+BaliseDebut+ ' lang="' + nameOfStyle + '">' + StrHtmlSelectionne + "</"+BaliseFin+">";
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheOuverture, '<'+BaliseDebut+ ' class="' + nameOfStyle + '">', false);
			StrHtmlSelectionne = RemplaceParagraphe(StrHtmlSelectionne, ArrBaliseParagrapheFermerture, "</"+BaliseFin+">", true);
			textehtml = StrHtmlSelectionne;
		}
	}
	else{
		var RajoutSpan = (BaliseDebut.toUpperCase().indexOf("SPAN") >=0 );
		// ... Ou dans le cas d'un span...
		
		if (RajoutSpan){
			// Cas ou tout le texte est selectionne
			//StrHtmlApres='d';//pour ne pas rentrer dans cette condition
			if (StrHtmlDebut == "" && StrHtmlApres =="") {
				// Il est possible qu'un replace fasse l'affaire?
				if (!test_balise){
					if (boolDebugAddStyleComplet==true){
						alert('aucune balise et test'+test_balise);
					}
				}
				else{
					//alert ('balise en vue et test '+test_balise);
					alert("Vous ne pouvez pas sélectionner tout le texte");
					return;
				}
				
			}

			
			// Protection contre l'application d'un style sur plusieurs paragraphes
			var nbOccurenceOuverture = 0;
			var nbOccurenceFermeture = 0;
			var posBaliseOuvrante    = -1;
			var posBaliseFermante    = -1;
			var boolSurPlusieursParagraphes = false;
			for(var i=0;i<ArrBaliseParagraphe.length;i++){
				// Il est possible qu'un replace fasse l'affaire?
				nbOccurenceOuverture = CompteNombreOccurence(StrHtmlSelectionne, "<"+ArrBaliseParagraphe[i]);
				nbOccurenceFermeture = CompteNombreOccurence(StrHtmlSelectionne, "</"+ArrBaliseParagraphe[i]+">");
				posBaliseFermante = StrHtmlSelectionne.indexOf("</"+ArrBaliseParagraphe[i]+">");
				posBaliseOuvrante = StrHtmlSelectionne.indexOf("<"+ArrBaliseParagraphe[i]);
				if (nbOccurenceFermeture == nbOccurenceOuverture && posBaliseFermante < posBaliseOuvrante){
					boolSurPlusieursParagraphes = true;
				}
				if (nbOccurenceOuverture == nbOccurenceFermeture && (nbOccurenceFermeture >1 ) ){
					boolSurPlusieursParagraphes = true;
				}
				if (nbOccurenceOuverture != nbOccurenceFermeture && (nbOccurenceFermeture > 1 || nbOccurenceOuverture > 1)){
					boolSurPlusieursParagraphes = true;
				}
				if (boolSurPlusieursParagraphes){
					alert("Vous ne pouvez pas appliquer un style sur plusieurs paragraphes.");
					return;
				}
			}
		
			var ArrBalisesParagrapheCourant = new Array();
			//alert('avant sup bliase : '+StrHtmlSelectionne);
			if (boolDebugAddStyleComplet==true){
				alert ('1 StrHtmlSelectionne *'+StrHtmlSelectionne);
			}
			while(StrHtmlSelectionne.toUpperCase().indexOf("</SPAN>")==0){
				var intPosFermerture = 7;
				StrHtmlDebut = StrHtmlDebut + StrHtmlSelectionne.substring(0, intPosFermerture);
				StrHtmlSelectionne = StrHtmlSelectionne.substring(intPosFermerture, StrHtmlSelectionne.length);
			}
			if (boolDebugAddStyleComplet==true){
				alert ('2 StrHtmlSelectionne *'+StrHtmlSelectionne);
			}
			
			HtmlSelectionne = SupprimeBaliseOuvertureEtFermertureParagraphe(StrHtmlSelectionne, ArrBalisesParagrapheCourant);				
	
			if (boolDebugAddStyleComplet==true){
				alert ('3 StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}
			StrHtmlSelectionne = AppliqueLangue(nameOfStyle, HtmlSelectionne, NettoieRange(textAreaRange.htmlText), StrHtmlDebut);
	
			StrHtmlSelectionne=StrHtmlSelectionne.replace(/(\s)|(&nbsp;)/g,'##'); 
			
			StrHtmlSelectionne=StrHtmlSelectionne.replace(/(#*)<\/SPAN>/gi,"</SPAN>$1");

			StrHtmlSelectionne=StrHtmlSelectionne.replace(/(##)/g," "); 

			if (boolDebugAddStyleComplet==true){				
				alert ('4 StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}

			// traitementspécial pour : sortir les P, ouvrantes et fermantes du span
			var exp= '<SPAN lang=\'(.+)\'><P>(.+)</P></SPAN>';
			var rempl='<SPAN lang=$1 > $2 </SPAN>';			
			var expReg=new RegExp(exp, 'gi');
			var expRegC=new RegExp(); // pour «compile»
			StrHtmlSelectionne=StrHtmlSelectionne.replace(expReg, rempl);

			if (boolDebugAddStyleComplet==true){				
				alert ('5bis StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}
			//traitement spéciale pour sortir P, fermante  du span
			var exp= '(.+)</P></SPAN>';
			var rempl='$1</SPAN>';			
			var expReg=new RegExp(exp, 'gi');
			var expRegC=new RegExp(); // pour «compile»
			StrHtmlSelectionne=StrHtmlSelectionne.replace(expReg, rempl);			

			if (boolDebugAddStyleComplet==true){				
				alert ('5bisbis StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}

			//traitement spéciale pour sortir P, fermante  du span			
			var exp= '<SPAN lang=\'(.+)\'><P>';
			var rempl='<SPAN lang=$1 >';			
			var expReg=new RegExp(exp, 'gi');
			var expRegC=new RegExp(); // pour «compile»
			StrHtmlSelectionne=StrHtmlSelectionne.replace(expReg, rempl);			
			
			if (boolDebugAddStyleComplet==true){				
				alert ('5bisbisbis StrHtmlSelectionne *'+StrHtmlSelectionne+'*');
			}
			
			//boolDebugAddStyleComplet=false;
			StrHtmlSelectionne = ArrBalisesParagrapheCourant["baliseOuvrante"] + StrHtmlSelectionne + ArrBalisesParagrapheCourant["baliseFermante"];
			if (boolDebugAddStyleComplet==true){
				alert ('5 StrHtmlSelectionne :'+StrHtmlSelectionne);
			}
		}
		if (boolDebugAddStyleComplet==true){
			alert ('6 StrHtmlSelectionne *'+StrHtmlSelectionne);
		}
		textehtml = StrHtmlSelectionne;
		if (boolDebugAddStyleComplet==true){
			alert ('7 texte html *'+textehtml);//avant cette variable n existe pas
		}
	}
	if (boolDebugAddStyleComplet==true)
		alert ('3texte html3*'+textehtml);
	textehtml = StrHtmlDebut + textehtml+ StrHtmlApres;
	if (boolDebugAddStyleComplet==true){
		alert ('8 texte html*'+textehtml);
	}
	textehtml = RetireSpanVide(textehtml);
	if (boolDebugAddStyleComplet==true){
		alert ('9 texte html*'+textehtml);
	}
	IFrameChoisie.document.execCommand("SelectAll");
	if (boolDebugAddStyleComplet==true){
		alert('avant commande delete');
	}
	IFrameChoisie.document.execCommand("delete");
	IFrameChoisie.document.clear();
	if (boolDebugAddStyleComplet==true){
		alert ('textAreaRange'+textAreaRange);
	}
	textAreaRange.pasteHTML(textehtml);
	//alert ('texte html*'+textAreaRange.htmlText+'*texte html'+textehtml);

	textAreaRange = IFrameChoisie.document.body.createTextRange();
	workRange     = textAreaRange.duplicate();
 	workRange.setEndPoint("StartToStart", textAreaRange);
	workRange.setEndPoint("EndToStart", textAreaRange);
	var NbAvance = 0;	
	// Aggrandissement du workRange jusqu'a ce qu'il arrive a RangeSelectionne
	while(NbAvance < intNbDeplacement){
		workRange.moveEnd("character", 1);
		NbAvance++;
	}
	workRange.collapse(false);
	workRange.select();

/*	if (!boolDebugAddStyleComplet==true){
		alert ('Félicitation fin fonction add span langue');
	}
*/
}

// MSH ticket #22    
function AppliqueLangue(StrNameOfStyle, StrSelection, StrTotal, StrDebut){  
	// Suppression des styles ouverts en debut de paragraphe
	while(StrSelection.indexOf("</SPAN>")==0){
		var intPosFermerture = StrSelection.indexOf("</SPAN>") + 1;
		//PosDebut = PosDebut + intPosFermerture;
		StrSelection = StrSelection.substring(intPosFermerture, StrHtmlSelectionne.length);
		StrDebut = StrDebut + "</SPAN>";
	}
	// Definitions des chaines de caractere qui vont gerer le style de la selection
	var StrAAppliquerApres = "";
	var StrAAppliquerAvant = "";
	// Resultat de la fonction
	var StrResultat = "";
	// Tableau des styles ouverts (et non fermes) avant le debut de la selection
	var ArrSpanOuvertAvantDebutSelection = CreeTableauStyleOuvert(StrTotal, StrDebut, StrDebut.length - 1 , "SPAN");
	var ClePosSpanOuvertAvantSelection   = 0;
	// Tableau des styles ouverts (et non fermes) avant la fin de la selection. la difference des 2 tableaux va nous permettre de connaitre les styles ovuerts _dans_ la selection
	var ArrSpanOuvertFinSelection        = CreeTableauStyleOuvert(StrTotal, StrDebut + StrSelection, StrDebut.length - 1 + StrSelection.length - 1, "SPAN");
	// Tableau des styles ouverts (et non fermes) dans la selection 
	var ArrSpanOuvertDansSelection       = CreeTableauStyleOuvert(StrSelection, "a", StrSelection.length, "SPAN");
	
	// On determine si StrNameOfStyle est ouvert avant le debut de la selection
	var StyleEstPresentAvantSelection = false;
	for(var i=0; i<ArrSpanOuvertAvantDebutSelection.length && !StyleEstPresentAvantSelection; i++){
		if (ArrSpanOuvertAvantDebutSelection[i].indexOf(StrNameOfStyle)>0){
			StyleEstPresentAvantSelection = true;
			ClePosSpanOuvertAvantSelection  = i;
		}
	}
	
	// On determine si StrNameOfStyle est ouvert dans la selection
	var StyleEstPresentDansSelection = false;
	for(var o=0; o<ArrSpanOuvertDansSelection.length && !StyleEstPresentDansSelection; o++){
		if (ArrSpanOuvertDansSelection[o].indexOf(StrNameOfStyle)>0){
			StyleEstPresentDansSelection = true;
		}
	}
	
	// Traitement particulier : la selection ouvre une balse avec le style a ajouter => dans ce cas on supprime toute presence du style
	if (StyleEstPresentDansSelection){
		var arrResultat = new Array();
		arrResultat["SpanASupprimer"] = StrNameOfStyle;
		CreeTableauStyleOuvert(StrSelection, "a", StrSelection.length, "SPAN", arrResultat);
		strResultat = arrResultat["strSansSpanFermerture"];
		return strResultat;
	}
	
	// Determination des balises a mettre avant et apres le style.
	if(StyleEstPresentAvantSelection){
	 	// Dans ce cas, le style doit etre supprime
	 	StrAAppliquerApres = "<SPAN lang='" +StrNameOfStyle+ "'>";
	 	 	StrAAppliquerAvant = "</SPAN>";
	 	if (ClePosSpanOuvertAvantSelection >=0  && ArrSpanOuvertAvantDebutSelection.length > ClePosSpanOuvertAvantSelection + 1){
	 		for(var m = ClePosSpanOuvertAvantSelection + 1; m<ArrSpanOuvertAvantDebutSelection.length;m++){
	 			 StrAAppliquerAvant = " </SPAN> " + StrAAppliquerAvant + ArrSpanOuvertAvantDebutSelection[m]+" ";
	 			 StrAAppliquerApres = " </SPAN> " + StrAAppliquerApres + ArrSpanOuvertAvantDebutSelection[m]+" ";;
	 		}
		}
	}
	else{
		// Dans ce cas, le style doit etre rajouter
		StrAAppliquerAvant = "<SPAN lang='" +StrNameOfStyle+ "'>";
	 	StrAAppliquerApres = "</SPAN>";
	
		// Gestion de l'imbrication
		var IntDeltaSpanOuvert = ArrSpanOuvertAvantDebutSelection.length - ArrSpanOuvertFinSelection.length;
			// 1er cas : la selection ouvre des styles sans les refermer. exemple : exemple : <b> toto [ti<i>ti] tutu </i>aze </b> [] indique l'element selectionne ==> il faut tous les refermer!
		if (ArrSpanOuvertDansSelection.length>0){
			for (var k = 0; k < ArrSpanOuvertDansSelection.length; k++){
				StrAAppliquerApres = "</SPAN>" + StrAAppliquerApres + ArrSpanOuvertDansSelection[k];
			}
		}
			// 2eme cas : il y a plus de styles (ie de SPAN) ouvert DANS la selection qu'AVANT. exemple : <b> toto [ti<i>ti] tutu </i>aze </b> [] indique l'element selectionne
				// probablement obsolete!
		else if (IntDeltaSpanOuvert < 0){
			// Note : l'ordre croissant ne pose pas de probleme car la fin du style est identique quelque soit le style
			for (var k = ArrSpanOuvertAvantDebutSelection.length; k < ArrSpanOuvertFinSelection.length; k++){
				StrAAppliquerApres = "</SPAN>" + StrAAppliquerApres + ArrSpanOuvertFinSelection[k];
			}
		}
			// 3eme  cas : il y a plus de styles (ie de SPAN) ouvert AVANT le debut de la selection que DANS. Certains styles sont donc fermes dans la selection! exemple : <b> toto [t</b>i<i>ti] tutu <i>aze
		else if (IntDeltaSpanOuvert >0 ){
			for (var k = ArrSpanOuvertFinSelection.length; k < ArrSpanOuvertAvantDebutSelection.length; k++){
			 	// Cas particulier : le style peut etre ferme dans la selection... On ne le rouvre pas apres pas!
				if (StyleEstPresentAvantSelection && ArrSpanOuvertAvantDebutSelection[k].indexOf(StrNameOfStyle)>0){
					StrAAppliquerApres = "";
				}
				StrAAppliquerAvant = "</SPAN>" + StrAAppliquerAvant + ArrSpanOuvertAvantDebutSelection[k];
			}
		}
	}

	StrResultat = StrAAppliquerAvant + StrSelection + StrAAppliquerApres;
return StrResultat;
}
