// strlen : fonction pour retourner la longueur de la chaîne passée en paramètre
function strlen(object) {
	return object.length;
}

// Configuration des BBCODES, si modification, modifier aussi dans la fonction prévisualisation
	debGras = "[b]";
	finGras = "[/b]";
	debItalique = "[i]";
	finItalique = "[/i]";
	debSouligne = "[s]";
	finSouligne = "[/s]";
	debCentrer = "[c]";
	finCentrer = "[/c]";
	debUrl = "[url=]";
	finUrl = "[/url]";
	debImg = "[img]";
	finImg = "[/img]";
	debVideo = "[video]";
	finVideo = "[/video]";
	debTaille1 = "[minuscules]";
	finTaille1 = "[/minuscules]";
	debTaille2 = "[important]";
	finTaille2 = "[/important]";
	debTaille3 = "[titre]";
	finTaille3 = "[/titre]";
	debTaille4 = "[grandTitre]";
	finTaille4 = "[/grandTitre]";
	debLightbox = "[lightbox min=\"\" max=\"\" align=\"\"/]";
	

// bbcode : ajoute les bbcodes dans le formulaire de message (uniquement ajout, ni traitement, ni prévisualisation)
function bbcode(format, idZoneTxt) {
	var zoneTxt = document.getElementById(idZoneTxt);
	
	// Détermination du bbcode demandé
	var debBBcode;
	var finBBcode;
	switch (format) {
		case "gras":
			debBBcode = debGras;
			finBBcode = finGras;
		break;
		case "italique":
			debBBcode = debItalique;
			finBBcode = finItalique;
		break;
		case "souligne":
			debBBcode = debSouligne;
			finBBcode = finSouligne;
		break;
		case "centrer":
			debBBcode = debCentrer;
			finBBcode = finCentrer;
		break;
		case "url":
			debBBcode = debUrl;
			finBBcode = finUrl;
		break;
		case "image":
			debBBcode = debImg;
			finBBcode = finImg;
		break;
		case "video":
			debBBcode = debVideo;
			finBBcode = finVideo;
		break;
		case "taille1":
			debBBcode = debTaille1;
			finBBcode = finTaille1;
		break;
		case "taille2":
			debBBcode = debTaille2;
			finBBcode = finTaille2;
		break;
		case "taille3":
			debBBcode = debTaille3;
			finBBcode = finTaille3;
		break;
		case "taille4":
			debBBcode = debTaille4;
			finBBcode = finTaille4;
		break;
		case "lightbox":
			debBBcode = debLightbox;
			finBBcode = "";
		break;
	}
	
	var isMozilla = (navigator.userAgent.toLowerCase().indexOf('gecko')!=-1) ? true : false;
	if(isMozilla == true) { // si Firefox
		objectValue = zoneTxt.value;
		deb = zoneTxt.selectionStart;
		fin = zoneTxt.selectionEnd;
		objectValueDeb = objectValue.substring( 0 , zoneTxt.selectionStart );
		objectValueFin = objectValue.substring( zoneTxt.selectionEnd , zoneTxt.textLength );
		objectSelected = objectValue.substring( zoneTxt.selectionStart ,zoneTxt.selectionEnd );
		zoneTxt.value = objectValueDeb + "" + debBBcode + "" + objectSelected + "" + finBBcode + "" + objectValueFin;
		zoneTxt.selectionStart = strlen(objectValueDeb.length);
		zoneTxt.selectionEnd = strlen(objectValueDeb + "" + debBBcode + "" + objectSelected + "" + finBBcode);
		zoneTxt.focus();
		zoneTxt.setSelectionRange(
		objectValueDeb.length + format.length + 2,
		objectValueDeb.length + format.length + 2);
	} 
	else { // si IE
		var str = document.selection.createRange().text;
		if (str.length > 0) { // si du texte a été sélectionné, on place le bbcode autour de lui
			var sel = document.selection.createRange();
			sel.text = debBBcode + "" + str + "" + finBBcode;
		} else {
			zoneTxt.focus(zoneTxt.caretPos);
			zoneTxt.focus($("#"+idZoneTxt).val().length);
			zoneTxt.caretPos = document.selection.createRange().duplicate();
			var bidon = "%~%";
			var orig = zoneTxt.value;
			zoneTxt.caretPos.text = bidon;
			var i = zoneTxt.value.search(bidon);
			zoneTxt.value = orig.substr(0,i) + "" + debBBcode + "" + "" + finBBcode + "" + orig.substr(i, zoneTxt.value.length);
			var r = 0;
			for(n = 0; n < i; n++)
				{if(regexp.test(zoneTxt.value.substr(n,2)) == true){r++;}};
			pos = i + 2 + format.length - r;
			var r = zoneTxt.createTextRange();
			r.moveStart('character', pos);
			r.collapse();
			r.select();
		}
	}
}

// previsualisation : analyse le texte mis dans le formulaire pour remplacer les bbcodes par les balises html
// correspondantes, et le renvoie dans la div de prévisualisation (fonction appelée à chaque frappe dans la zone de texte)
// Si toBeSent est renseigné, on le renvoie transformé 

function previsualisation(idZoneTxt, divPrev, toBeSent) {
	if(toBeSent) {
		return previsualisationExtern(idZoneTxt, divPrev, toBeSent);
	} else {
		setTimeout(function(){previsualisationExtern(idZoneTxt, divPrev, toBeSent);},300);
	}
}

// previsualisationExtern : externalisation de la prévisualisation avec délai afin de permettre au dernier caractère tapé d'être pris en compte
function previsualisationExtern(idZoneTxt, divPrev, toBeSent) {
	if(!toBeSent){toBeSent = null;}
	if(toBeSent == null) {
		$('#'+divPrev).empty();
		var txtPrev = $("#"+idZoneTxt).val();
		var divPrev = document.getElementById(divPrev);
	} else {
		var txtPrev = toBeSent;
	}
	var regexGras = /\[b\](.+?)\[\/b\]/gi;
	var regexItalique = /\[i\](.+?)\[\/i\]/gi;
	var regexSouligne = /\[s\](.+?)\[\/s\]/gi;
	var regexCentrer = /\[c\](.+?)\[\/c\]/gi;
	var regexUrl = /\[url=(.+?)\](.+?)\[\/url\]/gi;
	var regexImage = /\[img\](.+?)\[\/img\]/gi;
	var regexBr = /\n/g;
	var regexTaille1 = /\[minuscules\](.+?)\[\/minuscules\]/gi;
	var regexTaille2 = /\[important\](.+?)\[\/important\]/gi;
	var regexTaille3 = /\[titre\](.+?)\[\/titre\]/gi;
	var regexTaille4 = /\[grandTitre\](.+?)\[\/grandTitre\]/gi;
	var regexLightbox = /\[lightbox min="(.+?)" max="(.+?)" align="(.+?)"\/\]/gi;
	
	txtPrev = txtPrev.replace(regexGras,"<strong>$1</strong>");
	txtPrev = txtPrev.replace(regexItalique,"<em>$1</em>");
	txtPrev = txtPrev.replace(regexSouligne,"<span class=\"underline\">$1</span>");
	txtPrev = txtPrev.replace(regexCentrer,"<div class=\"center\">$1</div>");
	txtPrev = txtPrev.replace(regexUrl,"<a href=\"$1\">$2</a>");
	txtPrev = txtPrev.replace(regexImage,"<img src=\"$1\" alt=\"\" />");
	txtPrev = txtPrev.replace(regexTaille1,"<span style=\"font-size:0.8em;\">$1</span>");
	txtPrev = txtPrev.replace(regexTaille2,"<span style=\"font-size:1.2em;\">$1</span>");
	txtPrev = txtPrev.replace(regexTaille3,"<span style=\"font-size:1.4em;\">$1</span>");
	txtPrev = txtPrev.replace(regexTaille4,"<span style=\"font-size:1.6em;\">$1</span>");
	txtPrev = txtPrev.replace(regexLightbox,"<div style=\"float:$3\" class=\"pointer\"><a href=\"$2\"><img src=\"$1\" width=\"140\" /></a></div>");
	txtPrev = txtPrev.replace(regexBr,"<br />");
	
	if(toBeSent == null) {
		divPrev.innerHTML = txtPrev;
	} else {
		return txtPrev;
	}
}

//htmlToBBCode : transforme le texte qui est dans la base de données (format html) en format bbcode pour la modification
function htmlToBBCode(txt) {
	var regexGras = /<strong>(.+?)<\/strong>/gi;
	var regexItalique = /<em>(.+?)<\/em>/gi;
	var regexSouligne = /<span class="underline">(.+?)<\/span>/gi;
	var regexCentrer = /<div class="centrer">(.+?)<\/div>/gi;
	var regexUrl = /<a href="(.+?)">(.+?)<\/a>/gi;
	var regexImage = /<img src="(.+?)" alt="" \/>/gi;
	var regexBr = /<br \/>/gi;
	var regexTaille1 = /<span style="font\-size:0.8em;">(.+?)<\/span>/gi;
	var regexTaille2 = /<span style="font\-size:1.2em;">(.+?)<\/span>/gi;
	var regexTaille3 = /<span style="font\-size:1.4em;">(.+?)<\/span>/gi;
	var regexTaille4 = /<span style="font\-size:1.6em;">(.+?)<\/span>/gi;
	var regexLightbox = /<div style="float:(.+?)" class="pointer"><a href="(.+?)"><img src="(.+?)" width="140" \/><\/a><\/div>/gi;
	var regexSlashes = /\\/gi;
	
	txt = txt.replace(regexGras,"[b]$1[/b]");
	txt = txt.replace(regexItalique,"[i]$1[/i]");
	txt = txt.replace(regexSouligne,"[s]$1[/s]");
	txt = txt.replace(regexCentrer,"[c]$1[/c]");
	txt = txt.replace(regexLightbox,"[lightbox min=\"$3\" max=\"$2\" align=\"$1\"/]");
	txt = txt.replace(regexUrl,"[url=$1]$2[/url]");
	txt = txt.replace(regexImage,"[img]$1[/img]");
	txt = txt.replace(regexBr,"\n");
	txt = txt.replace(regexTaille1,"[minuscules]$1[/minuscules]");
	txt = txt.replace(regexTaille2,"[important]$1[/important]");
	txt = txt.replace(regexTaille3,"[titre]$1[/titre]");
	txt = txt.replace(regexTaille4,"[grandTitre]$1[/grandTitre]");
	txt = txt.replace(regexSlashes,"");
	
	return txt;
}
