$(document).ready(function() {

/*
 * Daniel Hagnoul
 *
 * Plugin jquery.dvjhBBCodeTextarea-1.3.2.js
 *
 * Version 1.3.2 du 17 mars 2010 (2010-03-17)
 * Version 1.0.0 du 16 mai 2009 (2009-05-16)
 *
 * ------------------------------------------
 * Usage, exemple :
 *
 *		$("a.btn").click(function(){
 *			$.dvjhBBCodeTextarea("message", $(this).attr("bbcode"));
 *			return false;
 *		});
 *
 * Options disponibles, réglages par défaut :
 *		minTagLength: 3, 	// pour [*]
 *		moveCursor: false	// déplace le curseur à la fin du contenu
 *
 * ------------------------------------------
 *
 * Wiki :http://fr.wikipedia.org/wiki/BBCode
 *
 * BBCode est l'abréviation de Bulletin Board Code, inventé à travers le langage PHP pour éviter les
 * injections HTML, utilisé pour mettre en forme les messages de forums de discussion. Par abus de
 * langage, les éléments du BBCode sont appelés balises. Le nom d'une balise est délimité par les
 * crochets [ et ], contrairement au HTML où les caractères < et > sont utilisés. Certaines balises ont
 * une propriété, aussi appelée attribut, dont la valeur est assignée à la balise elle-même à l'aide du
 * symbole =.
 *
 * ------------------------------------------
 *
 * BBcode standard : http://bohwaz.net/wiki/BBcode
 *
 * Gras: [b]
 * Italique: [i]
 * Souligné: [u]
 * Barré: [s]
 * Citation (blockquote): [quote]
 * Citation + auteur[1]: [quote=Auteur]
 * Code source: [code]
 * Liste non-ordonnée: [list]
 * Liste ordonnée: [list=L] (L=1 pour numérotée, L=a pour alphabétique)
 * Element d'une liste: [*] (Pas de tag fermant)
 * Image: [img]URI[/img]
 * Lien: [url]URI[/url] ou [url=URI]Texte du lien[/url] ou [email]bbcode@bbcode.com[/email]
 * Couleur du texte: [color=COLOR]
 * Taille du texte: [size=SIZE]
*/
(function($){
	$.dvjhBBCodeTextarea = function(id, text, options){
		var opts = $.extend(true, {}, $.dvjhBBCodeTextarea.defaults, options);
		var s = ""; //renvoie une chaine vide par défaut

		if (text.length < (opts.minTagLength - 2)) return s;

		var obj = $("#"+id);

		if (obj[0].tagName != "TEXTAREA") return s;

		//on est maintenant certain que obj[0] est bien un textarea

		var startTag = "[" + text + "]";
		var endTag = "[/" + text.split("=")[0] + "]";

		if (text == "*") endTag = "";

		if (document.selection) {
			//Internet Explorer

			var range = document.selection.createRange();
			s = range.text;

			if (s.length > 0) {
				var node = range.parentElement();

				if (node.nodeName != "TEXTAREA") {
					s = "";
				} else {
					range.text = startTag + s + endTag;

					/* Ajustement de la position du curseur */
					if (opts.moveCursor == false) {
						//le curseur reste a l'emplacement ou le texte a été selectionner
						range = document.selection.createRange();
						var pos = startTag.length + s.length + endTag.length;
						range.moveStart('character', pos);
						range.collapse();
						range.select();
					} else if (opts.moveCursor == true) {
						//le curseur va à la fin du texte
						obj.select();
						range = document.selection.createRange();
						var pos = obj.val().length;
						range.moveStart('character', pos);
						range.collapse();
						range.select();
					}
				}
			}

		} else if (obj[0].selectionStart != "undefined") {
			//Firefox

			//Firefox renvoie toujours une valeur, même si la sélection n'est pas dans this !
			var startPos = obj[0].selectionStart;
			var endPos = obj[0].selectionEnd;

			//si les valeurs sont égales la sélection n'est pas dans le textarea !
			if (startPos != endPos) {
				s = obj.val().slice(startPos, endPos);

				var scrollValue = obj.scrollTop();
				var debut = obj.val().slice(0, startPos);
				var fin = obj.val().slice(endPos);

				obj.val(debut + startTag + s + endTag + fin);

				/* Ajustement de la position du curseur */
				if (opts.moveCursor == false) {
					//le curseur reste a l'emplacement ou le texte a été selectionner
					var pos = debut.length + startTag.length + s.length + endTag.length;
					obj[0].selectionStart = pos;
					obj[0].selectionEnd = pos;
					obj.scrollTop(scrollValue);
					obj.focus();
				} else if (opts.moveCursor == true) {
					//le curseur va à la fin du texte
					obj.select();
					var pos = obj.val().length;
					obj[0].selectionStart = pos;
					obj[0].selectionEnd = pos;
					obj.scrollTop(obj.height());
					obj.focus();
				}
			}
		}

		return s;
	};

	$.dvjhBBCodeTextarea.defaults = {
		minTagLength: 3, // pour [*]
		moveCursor: false
	};

})(jQuery);



	$("a.bbBtn").click(function(){
		$.dvjhBBCodeTextarea("text", $(this).attr("bbcode"));
		return false;
	});

});
