The users that will be adding links are power users, but they understandably didn't want to insert the links manually. They also wanted to select from a list of links that are defined in a different part of the application. So, I just added a little bit of code that shows a select box with all the possible links when text is selected in the textarea. When the users selects a link option, the textarea is updated to contain the HTML code necessary to display a link that opens in a new window.
Below is the code that I use to get the selection and insert the link. It is somewhat crude, yet effective.
<script type="text/javascript"
src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
/**
* Gets the start and end position for the selection
* @param {string} pSelectArea The texatarea
* to get the selection from (jQuery selector)
* @return An object with the parameters start and end
* @type object
*/
function getSelectionRange(pSelectArea){
// if we are in IE
if(document.selection){
var tBookmark =
document.selection.createRange().getBookmark();
var tSelection =
$(pSelectArea).get(0).createTextRange();
tSelection.moveToBookmark(tBookmark);
var tBefore =
$(pSelectArea).get(0).createTextRange();
tBefore.collapse(true);
tBefore.setEndPoint("EndToStart", tSelection);
var tBeforeLength = tBefore.text.length;
var tSelectionLength = tSelection.text.length;
tSelectStart = tBeforeLength;
tSelectEnd = tBeforeLength + tSelectionLength;
}else{
tSelectStart = $(pSelectArea).get(0).selectionStart;
tSelectEnd = $(pSelectArea).get(0).selectionEnd;
}
return {start: tSelectStart, end: tSelectEnd};
}
/**
* Inserts a link into text between a start and end point
* @param {string} pText The text to insert the link into
* @param {string} pLink The link to insert
* @param {integer} pStart The starting location
* @param {integer} pEnd The ending location
* @return The new text with the link
* @type string
*/
function insertLink(pText, pLink, pStart, pEnd){
tText01 = pText.substr(0, pStart);
tText02 = "<a target='_blank' href='" + pLink + "'>";
tText03 = pText.substr(pStart, pEnd-pStart);
tText04 = "</a>";
tText05 = pText.substr(pEnd);
return tText01 + tText02 + tText03 + tText04 + tText05;
}
var selection = {start:0,end:0};
// when a selection is made grab the
// range and show the link select
$("#MY_TEXTAREA").select(function(){
selection = getSelectionRange("#MY_TEXTAREA");
$("#MY_SELECT").fadeIn(1000);
});
// when the select changes add the link
$("#MY_SELECT").change(function(){
if(selection.end>selection.start){
var tNewText = insertLink(
$("#MY_TEXTAREA").val(),
$(this).get(0).value,
selection.start, selection.end);
$("#MY_TEXTAREA").val(tNewText);
}
});
});
</script>
You can also select Insert > New Text Area from the menu.