// Sergi Meseguer http://www.zigotica.com/ 

BBCODE  = {

	init : function(){
		var area = document.getElementsByTagName("textarea"); 
		for (a=0;a<area.length;a++){ 
			var hasID = (area[a].id)?1:0; 
			if(hasID==0) area[a].id = area[a].name; // if no id on textarea we take name
			var ID = area[a].id; 
			var fill = document.getElementById(ID); 
			var enhacer = document.createElement("ul");
			enhacer.id = "enhacer_" + ID; 
			enhacer.setAttribute("class", "text_tools " + area[0].className);
			
			where = fill.parentNode; 
			while (where.tagName.toUpperCase() != "LABEL") where = where.parentNode;

			where.parentNode.insertBefore(enhacer, where);

			cont =  '<li class="text_tools_strong"><a class="IR" href="javascript:BBCODE.addTag(\''+ID+'\', \'b\')"><span>Negrita</span></a></li>';
			cont += '<li class="text_tools_italic"><a class="IR" href="javascript:BBCODE.addTag(\''+ID+'\', \'i\')"><span>Cursiva</span></a></li>';
			cont += '<li class="text_tools_link"><a class="IR" href="javascript:BBCODE.addTag(\''+ID+'\', \'url\')"><span>Enlace</span></a></li>';
			cont += '<li class="text_tools_mail"><a class="IR" href="javascript:BBCODE.addTag(\''+ID+'\', \'email\')"><span>Mail</span></a></li>';
			cont += '<li class="text_tools_picture"><a class="IR" href="javascript:BBCODE.addTag(\''+ID+'\', \'img\')"><span>Imagen</span></a></li>';
			cont += '<li class="text_tools_quote"><a class="IR" href="javascript:BBCODE.addTag(\''+ID+'\', \'quote\')"><span>Cita</span></a></li>';
			cont += '<li class="text_tools_list"><a class="IR" href="javascript:BBCODE.addTag(\''+ID+'\', \'list\')"><span>Lista</span></a></li>';
			cont += '<li class="text_tools_code"><a class="IR" href="javascript:BBCODE.addTag(\''+ID+'\', \'code\')"><span>Código</span></a></li>';

			document.getElementById("enhacer_" + ID).innerHTML = cont;
		}
	},

	// caret positioning methods from http://blog.vishalon.net/Post/57.aspx
	getCaret : function(ctrl) {
		var CaretPos = 0;
		if (document.selection) {
			ctrl.focus ();
			var Sel = document.selection.createRange ();
			Sel.moveStart ('character', -ctrl.value.length);
			CaretPos = Sel.text.length;
		}
		else if (ctrl.selectionStart || ctrl.selectionStart == '0') {
			CaretPos = ctrl.selectionStart;
		}
		return (CaretPos);
	},

	setCaret : function(ctrl, pos) {
		if(ctrl.setSelectionRange)		{
			ctrl.focus();
			ctrl.setSelectionRange(pos,pos);
		}
		else if (ctrl.createTextRange) {
			var range = ctrl.createTextRange();
			range.collapse(true);
			range.moveEnd('character', pos);
			range.moveStart('character', pos);
			range.select();
		}
	},

	addTag : function(elm, tag){
		var L = (tag=="list") ? "[*]":"";
		var elm = document.getElementById(elm);
		var selected = "";
		
		var caret = BBCODE.getCaret(elm); 
	    var T = elm.value;
		
		if(tag == "url" || tag == "img" || tag == "email") {
			var my_link = prompt('Escribe ' + tag) ;
		}
		
		if(document.selection){ // IE
			var sa = caret = 0;
			var se = caret = T.length;
			selected = document.selection.createRange().text; 
		}
		else { // other
			var sa = elm.selectionStart;
			var se = elm.selectionEnd;
	    	selected = T.slice(sa,se);
		}


		if(tag == "url" || tag == "email") 
			txt = "[" + tag +"=" + my_link + "]" + selected + "[/" + tag +"]"; 
		else if (tag == "img") 
			txt = "[" + tag +"]" + my_link + "[/" + tag +"]" + selected; 
		else txt = "[" + tag + "]" + L + selected + "[/" + tag + "]"; 

		
		if (selected == "") {
		    var T0 = T.slice(0, caret);
		    var TF = T.slice(caret, T.length);
			
			elm.value = T0 + txt + TF; 
			BBCODE.setCaret(elm, parseInt(T0.length + txt.length - tag.length - 3));
		}
		
		else { // selected
	  		prev = T.slice(0,sa);
	  		post = T.slice(se, T.length);
			if(document.selection) document.selection.createRange().text = prev + txt + post;
			else elm.value = prev + txt + post;
			BBCODE.setCaret(elm, parseInt(prev.length + txt.length) );
		}
	}
}


$(document).ready(function() {
	if(document.getElementById) BBCODE.init();   
});
	 
