function getSelection(textarea)
{
if (document.selection && document.selection.createRange) {
	var range=document.selection.createRange();
	return range.text;
} else if (typeof(textarea["setSelectionRange"]) != "undefined") {
	return textarea.value.substring(textarea.selectionStart, textarea.selectionEnd);
}
return false;
}

function replaceSelection(textarea, text)
{
if (document.selection && document.selection.createRange) {
    var range=document.selection.createRange().text=text;
    textarea.caretPos-=text.length;
	return true;
} else if (typeof(textarea["setSelectionRange"]) != "undefined") {
	var sstart, send, scrollPos;

	start=textarea.selectionStart;    
	send=textarea.selectionEnd;
	scrollPos=textarea.scrollTop;

	textarea.value=textarea.value.substring(0, start)+text+textarea.value.substring(send);
	textarea.setSelectionRange(start+text.length, start+text.length);
	textarea.scrollTop=scrollPos;
	return true;
}
return false;
}

function sortSelection(textarea, reverse)
{
var sel, subst;

sel=getSelection(textarea);
if (sel==false || sel=="") {
	return;
}

subst=sel.split("\n").sort();
if (reverse)
	subst.reverse();
return replaceSelection(textarea, subst.join("\n"));
}

function trimSelection(textarea)
{
sel=getSelection(textarea);
if (sel==false || sel=="") {
	return;
}
return replaceSelection(textarea, jQuery.trim(sel));
}

function doTextSubst(prefix, suffix, stext, rows) {
var subst;
var a=stext.split("\n");

if (typeof(prefix)=='undefined' || prefix==false)
	prefix='';

if (typeof(suffix)=='undefined' || suffix==false)
	suffix='';

if (a.length==1) {
	return prefix+stext+suffix;
}
for (l in a)
	a[l]=(a[l]!='') ? prefix+a[l]+suffix : '';
return a.join("\n");
}

function doSelectionPrompt(textarea, prefix, suffix, promptmsg, pre) {
var sel, subst;

textarea.focus();
sel=getSelection(textarea);
if ((sel=="" || sel==false) && promptmsg!=null) {
	sel=prompt(promptmsg, pre ? pre : "");
	if (!sel) return;
}
return replaceSelection(textarea, doTextSubst(prefix, suffix, sel ? sel : " "));
}

function doSelection(textarea, prefix, suffix, rows) {
var sel, subst;

textarea.focus();
sel=getSelection(textarea);
if ((sel==false || sel=="") && typeof(suffix)!='undefined') {
	return;
}
return replaceSelection(textarea, doTextSubst(prefix, suffix, sel, rows));
}

function linkSelection(textarea, ltype, msg, pre)
{
textarea.focus();
sel=getSelection(textarea);

link=prompt(msg, pre ? pre : '');
if (!link)
	return;
link=jQuery.trim(link);
switch (ltype) {
	case 1:
		link=link.replace(' ','_');
		subst=doTextSubst('[['+link+' ',']]', sel ? sel : 'Link text goes here');
	break;
	case 0:
	default:
		subst=doTextSubst('['+link+' ',']', sel ? sel : 'Link text goes here');
	break;
}

return replaceSelection(textarea, subst);
}

function newFormatingToolbar(textarea)
{
var tb=newToolbar();
if (tb==false)
	return false;
addButton(tb,"heading", "Heading level 1","stock_insert-header", function() {
	doSelection(textarea, "=", "=", true);
});
addButton(tb,"heading", "Heading level 2","stock_insert-header2", function() {
	doSelection(textarea, "==", "==", true);
});
addButton(tb,"heading", "Heading level 3","stock_insert-header3", function() {
	doSelection(textarea, "===", "===", true);
});
addButton(tb, "strong", "Mark as Bold text","stock_text_bold", function() {
	doSelection(textarea, "'''", "'''", false);
});
addButton(tb,"em", "Mark as Italic text", "stock_text_italic", function() {
	doSelection(textarea, "''", "''", false);
});
addButton(tb,"u", "Underline", "stock_text_underlined", function() {
	doSelection(textarea, "___", "___", false);
});

addButton(tb,"list_bullet", "Create Bullet List", "stock_list_bullet", function() {
    doSelection(textarea, "* ");
});
addButton(tb,"list_bullet", "Create Numbered List", "stock_list_enum", function() {
    doSelection(textarea, "# ");
});

addButton(tb,"sort", "Sort ascending selected rows", "stock_sort-ascending", function() {
    sortSelection(textarea, false);
});
addButton(tb,"sort", "Sort descending selected rows", "stock_sort-descending", function() {
    sortSelection(textarea, true);
});

addButton(tb,"link", "Add URL", "stock_insert-url", function() {
    linkSelection(textarea, 0, "URL:", "http://");
});
addButton(tb,"ilink", "Internal link", "stock_hyperlink", function() {
    linkSelection(textarea, 1, "Pagename:", "");
});

addButton(tb,"template", "Add template tag", "stock_new-template", function() {
    doSelectionPrompt(textarea, "\n{{template|", "}}\n", "Template:");
});
addButton(tb,"image", "Add Image", "stock_insert_image", function() {
    doSelectionPrompt(textarea, "[[image:", "]]", "Image:");
});
addButton(tb,"attach", "Add article attachment tag", "stock_attach", function() {
    doSelection(textarea, "\n{{attachments}}\n");
});

return tb;
}

function addTextareaEditingToolbars(tc) {
$('.'+tc).each(function(i,e) { insertToolbar(newFormatingToolbar(e), e); });
}

