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

function replaceSelection(textarea, text)
{
var sstart, send, scrollPos;

if (typeof(document["selection"]) != "undefined") {
    var range=document.selection.createRange().text=text;
    textarea.caretPos-=text.length;
	return true;
} else if (typeof(textarea["setSelectionRange"]) != "undefined") {
	start=textarea.selectionStart;    
	send=textarea.selectionEnd;
	scrollPos=textarea.scrollTop;
	textarea.value=textarea.value.substring(0, start)+text+textarea.value.substring(send);
	if (text) {
		textarea.setSelectionRange(start+text.length, start+text.length);
    } else {
		/* textarea.setSelectionRange(start+prefix.length, start+prefix.length); */
    }
	textarea.scrollTop=scrollPos;
	return true;
}
return false;
}

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

sel=getSelection(textarea);
if (sel==false || sel=="") {
	alert('You must select the rows to sort');
	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=="") {
	alert('You must select the row to trim');
	return;
}
return replaceSelection(textarea, jQuery.trim(sel));
}

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

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

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

if (a.length==1) {
	subst=prefix+stext+suffix;
} else {
	subst="";
	for (l in a)
		subst+=prefix+a[l]+suffix+"\n";
}

return subst;
}

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) {
var sel, subst;

textarea.focus();
sel=getSelection(textarea);
if ((sel==false || sel=="") && typeof(suffix)!='undefined') {
	alert('You must make a selection first');
	return;
}
return replaceSelection(textarea, doTextSubst(prefix, suffix, sel));
}

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 addFormatingToolbar(textarea)
{
var tb=newToolbar(textarea);
if (tb==false)
	return;
addButton(tb,"heading", "Heading level 1","stock_insert-header", function() {
	doSelection(textarea, "\n=", "=\n");
});
addButton(tb,"heading", "Heading level 2","stock_insert-header2", function() {
	doSelection(textarea, "\n==", "==\n");
});
addButton(tb,"heading", "Heading level 3","stock_insert-header3", function() {
	doSelection(textarea, "\n===", "===\n");
});
addButton(tb, "strong", "Mark as Bold text","stock_text_bold", function() {
	doSelection(textarea, "'''", "'''");
});
addButton(tb,"em", "Mark as Italic text", "stock_text_italic", function() {
	doSelection(textarea, "''", "''");
});
addButton(tb,"u", "Underline", "stock_text_underlined", function() {
	doSelection(textarea, "___", "___");
});

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{{", "}}\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");
});
insertToolbar(tb, textarea);
}

function addTextareaEditingToolbars(tc) {
var textareas=document.getElementsByTagName("textarea");
for (var i=0;i<textareas.length;i++) {
	var textarea=textareas[i];
	if (textarea.className && textarea.className==tc) {
		addFormatingToolbar(textarea);
	}
}
}

