	var clientPC = navigator.userAgent.toLowerCase(); // Get client info
	var clientVer = parseInt(navigator.appVersion); // Get browser version

	var is_ie = ((clientPC.indexOf("msie") != -1) && (clientPC.indexOf("opera") == -1));
	var is_nav = ((clientPC.indexOf('mozilla')!=-1) && (clientPC.indexOf('spoofer')==-1)
	                && (clientPC.indexOf('compatible') == -1) && (clientPC.indexOf('opera')==-1)
	                && (clientPC.indexOf('webtv')==-1) && (clientPC.indexOf('hotjava')==-1));
	var is_moz = 0;

	var is_win = ((clientPC.indexOf("win")!=-1) || (clientPC.indexOf("16bit") != -1));
	var is_mac = (clientPC.indexOf("mac")!=-1);

	function bbstyle(txtarea, bbopen, bbclose)
	{
		if ((clientVer >= 4) && is_ie && is_win) //Internet Explorer
		{
			theSelection = document.selection.createRange().text;
			if (!theSelection) 
			{
				txtarea.value += bbopen + bbclose;
				txtarea.focus();
				return;
			}
			document.selection.createRange().text = bbopen + theSelection + bbclose;
			txtarea.focus();
			return;
		}
		else if (txtarea.selectionEnd && (txtarea.selectionEnd - txtarea.selectionStart > 0)) //Autres navigateurs
		{
			mozWrap(txtarea, bbopen, bbclose);
			return;
		}
		else
		{
			txtarea.value += bbopen + bbclose;
		}
		storeCaret(txtarea);
	}

	function mozWrap(txtarea, open, close)
	{
		var selLength = txtarea.textLength;
		var selStart = txtarea.selectionStart;
		var selEnd = txtarea.selectionEnd;
		if (selEnd == 1 || selEnd == 2)
			selEnd = selLength;
		
		var s1 = (txtarea.value).substring(0,selStart);
		var s2 = (txtarea.value).substring(selStart, selEnd)
		var s3 = (txtarea.value).substring(selEnd, selLength);
		txtarea.value = s1 + open + s2 + close + s3;
		txtarea.focus();
		txtarea.caretPos = selStart;
		return;
	}
	
	function storeCaret(textEl) 
	{
		if (textEl.createTextRange) 
			textEl.caretPos = document.selection.createRange().duplicate();
	}
	

String.prototype.space2nbsp = function () 
{
	var reg = new RegExp(" ", "g");
	return this.replace(reg, "&nbsp;");
}

function space2nbsp_callback (str) 
{
	var reg = new RegExp(" ", "g");
	return str.replace(reg, "&nbsp;");
}

function tab2nbsp (str) 
{
	var temp = str;
	var reg = new RegExp("( {2,})");
	while(reg.test(temp))
	{
		temp = temp.replace(reg, space2nbsp_callback);
	}
	return temp;
}

function refresh_apercu(idapercu, texte)
{
	document.getElementById(idapercu).innerHTML=bbCodeTransform((tab2nbsp((texte).htmlspecialchars())).nl2br());
}

function refresh_image(blockid, imagename, bbcodeimageid)
{
	blockid.innerHTML='<img src="upload/images/'+imagename+'" alt="image non trouvée" />';
	bbcodeimageid.value='[img]'+imagename+'[/img]';
}

function bbCodeTransform(str)
{
	newstr=str;
	
	var reg = new RegExp("", "gi");
	
	newstr = correction_bbcode(newstr);
	
	//gras
	reg.compile("\\[b([1-9]?[0-9])\\](.*)\\[/b\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<strong>$2</strong>");
	
	//italique
	reg.compile("\\[i([1-9]?[0-9])\\](.*)\\[/i\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<em>$2</em>");
	
	//souligné
	reg.compile("\\[u([1-9]?[0-9])\\](.*)\\[/u\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<span style='text-decoration: underline;'>$2</span>", "gi");
	
	
	//texte aligné à gauche
	reg.compile("\\[left([1-9]?[0-9])\\](.*)\\[/left\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<div style='text-align: left;'>$2</div>", "gi");
	
	//texte centré
	reg.compile("\\[center([1-9]?[0-9])\\](.*)\\[/center\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<div style='text-align: center;'>$2</div>", "gi");
	
	//texte aligné à droite
	reg.compile("\\[right([1-9]?[0-9])\\](.*)\\[/right\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<div style='text-align: right;'>$2</div>", "gi");
	
	//image externe
	reg.compile("\\[img([1-9]?[0-9])\\](http://.*)\\[/img\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<img src='$2' alt='$2' />");
		
	//image interne
	reg.compile("\\[img([1-9]?[0-9])\\](.*)\\[/img\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<img src='upload/images/$2' alt='$2' />");
	
	//capitale sang noir
	reg.compile("\\[sn([1-9]?[0-9])\\](.*)\\[/sn\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<span class='majuscule' style='font-size: 3em;'>$2</span>", "gi");
	
	//flottant à gauche
	reg.compile("\\[floatl([1-9]?[0-9])\\](.*)\\[/floatl\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<div style='float: left; margin-right: 10px; margin-bottom: 5px;'>$2</div>", "gi");
		
	//flottant à droite
	reg.compile("\\[floatr([1-9]?[0-9])\\](.*)\\[/floatr\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<div style='float: right; margin-left: 10px; margin-bottom: 5px;'>$2</div>", "gi");
	
	//barre de séparation
	reg.compile("\\[(hr|separation)\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<hr />", "gi");
	
	//lien
	reg.compile("\\[url([1-9]?[0-9])\\]((http://)?(.*))\\[/url\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<a href='http://$4' title='Lien vers $2'>$2</a>", "gi");
	
	//lien spécifié	
	reg.compile("\\[url([1-9]?[0-9])=\"*(.+)\"*\\](.*)\\[/url\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<a href='$2' title='Lien vers $2'>$3</a>", "gi");
		
	//mail
	reg.compile("\\[mail([1-9]?[0-9])\\](.*)\\[/mail\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<a href='mailto:$2' title='Envoyer un mail à $2'>$2</a>", "gi");
	
	//couleurs
	reg.compile("\\[color([1-9]?[0-9])=\"*(black|darkred|red|orange|brown|yellow|green|olive|cyan|blue|darkblue|indigo|violet|white|#[0-9A-Fa-f]{1,6})\"*\\](.*)\\[/color\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<span style='color: $2;'>$3</span>");
	
	//tailles
	reg.compile("\\[size([1-9]?[0-9])=\"*([1-9]?[0-9])\"*\\](.*)\\[/size\\1\\]", "gi");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<span style='font-size: $2px;'>$3</span>");
	
	//polices
	reg.compile("\\[font([1-9]?[0-9])=\"*(Arial|Arial Black|Comic Sans MS|Courier New|Georgia|Impact|Times New Roman|Trebuchet MS|Verdana)\"*\\](.*)\\[/font\\1\\]", "g");
	while(reg.test(newstr))
		newstr = newstr.replace(reg, "<span style='font-family: $2,serif;'>$3</span>");
	
	/*
	//url automatiques
	reg.compile("((http(s)?://)?(([-a-zA-Z]+\\.)([-a-zA-Z]+\\.?)+((/[-_a-zA-Z0-9%&;\.]*)*)?))", "gi");
	newstr = newstr.replace(reg, "$1<a href=\"http$4://$5\" title=\"$5\">$2</a>$9");
	*/
	
	return newstr;
}

function correction_bbcode(str)
{
	var tabtags=['b','i','u','img','left','center','right','sn','floatr','floatl','url','mail','color','size','font'];
	
	var newstr=str;
	
	var reg = new RegExp("", "i");
	
	var tag;
	var ordre;
	var nbCourant;
	var nextNb;
	
	while(tag = tabtags.pop())
	{
		ordre = new Array();
		nextNb=1;
		nbCourant=0;
		reg.compile("(\\[/?"+tag+")(=.*)?(\\])")
		while(reg.test(newstr))
		{
			tagcourant = reg.exec(newstr);
			if(tagcourant[0].charAt(1) == '/')
			{
				nbCourant = ordre.pop();
			}
			else
			{
				nbCourant=nextNb;
				nextNb++;
				ordre.push(nbCourant);
			}
			newstr = newstr.replace(reg, "$1"+nbCourant+"$2$3");
		}
	}
	
	return newstr;
}

function loading(id)
{
	document.getElementById(id).innerHTML='<img src="./images/ajax-loader.gif" alt="Chargement ..."/>';
}

function insertTag(textareaId, startTag, endTag, tagType) 
{
    var field  = document.getElementById(textareaId); 
    var scroll = field.scrollTop;
    field.focus();
    
    /* === Partie 1 : on récupère la sélection === */
    if (window.ActiveXObject) 
    {
        var textRange = document.selection.createRange();            
        var currentSelection = textRange.text;
    } 
    else 
    {
        var startSelection   = field.value.substring(0, field.selectionStart);
        var currentSelection = field.value.substring(field.selectionStart, field.selectionEnd);
        var endSelection     = field.value.substring(field.selectionEnd);               
    }
    
    /* === Partie 2 : on analyse le tagType === */
    /*
    if (tagType) 
    {
        switch (tagType) 
        {
            case "lien":
				endTag = "</lien>";
				if (currentSelection) 
				{ // Il y a une sélection
				    if (currentSelection.indexOf("http://") == 0 || currentSelection.indexOf("https://") == 0 || currentSelection.indexOf("ftp://") == 0 || currentSelection.indexOf("www.") == 0) 
				    {
				        // La sélection semble être un lien. On demande alors le libellé
				        var label = prompt("Quel est le libellé du lien ?") || "";
				        startTag = "<lien url=\"" + currentSelection + "\">";
				        currentSelection = label;
				    } 
				    else 
				    {
				        // La sélection n'est pas un lien, donc c'est le libelle. On demande alors l'URL
				        var URL = prompt("Quelle est l'url ?");
				        startTag = "<lien url=\"" + URL + "\">";
				    }
				} 
				else 
				{ // Pas de sélection, donc on demande l'URL et le libelle
				    var URL = prompt("Quelle est l'url ?") || "";
				    var label = prompt("Quel est le libellé du lien ?") || "";
				    startTag = "<lien url=\"" + URL + "\">";
				    currentSelection = label;                     
				}
				break;

            case "citation":
				endTag = "</citation>";
				if (currentSelection) 
				{ // Il y a une sélection
					if (currentSelection.length > 30) 
					{ // La longueur de la sélection est plus grande que 30. C'est certainement la citation, le pseudo fait rarement 20 caractères
						var auteur = prompt("Quel est l'auteur de la citation ?") || "";
						startTag = "<citation nom=\"" + auteur + "\">";
					} 
					else 
					{ // On a l'Auteur, on demande la citation
						var citation = prompt("Quelle est la citation ?") || "";
						startTag = "<citation nom=\"" + currentSelection + "\">";
						currentSelection = citation;    
					}
				} 
				else 
				{ // Pas de selection, donc on demande l'Auteur et la Citation
					var auteur = prompt("Quel est l'auteur de la citation ?") || "";
					var citation = prompt("Quelle est la citation ?") || "";
					startTag = "<citation nom=\"" + auteur + "\">";
					currentSelection = citation;    
				}
				break;
        }
    }
    */
    
    /* === Partie 3 : on insère le tout === */
    if (window.ActiveXObject) 
    {
        textRange.text = startTag + currentSelection + endTag;
        textRange.moveStart("character", -endTag.length - currentSelection.length);
        textRange.moveEnd("character", -endTag.length);
        textRange.select();     
    } 
    else 
    {
        field.value = startSelection + startTag + currentSelection + endTag + endSelection;
        field.focus();
        field.setSelectionRange(startSelection.length + startTag.length, startSelection.length + startTag.length + currentSelection.length);
    } 

    field.scrollTop = scroll;     
}

