function getSelection(ta) {
  var bits = [ta.value,'','','']; 
  if(document.selection) {
    var vs = '#$%^%$#';
    var tr=document.selection.createRange()
    if(tr.parentElement()!=ta) return null;
    bits[2] = tr.text;
    tr.text = vs;
    fb = ta.value.split(vs);
    tr.moveStart('character',-vs.length);
    tr.text = bits[2];
    bits[1] = fb[0];
    bits[3] = fb[1];
  } else {
    if(ta.selectionStart == ta.selectionEnd) return null;
      bits=(new RegExp('([\x00-\xff]{'+ta.selectionStart+'})([\x00-\xff]{'+(ta.selectionEnd - ta.selectionStart)+'})([\x00-\xff]*)')).exec(ta.value);
  }
  return bits;
}
 
function matchPTags(str) {
  str = ' ' + str + ' ';
  ot = str.split(/\[[B|U|I].*?\]/i);
  ct = str.split(/\[\/[B|U|I].*?\]/i);
  return ot.length==ct.length;
}

function addPTag(ta,pTag) {
  bits = getSelection(ta);
  if(bits) {
    if(!matchPTags(bits[2])) {
      alert('\t\tInvalid Selection\nSelection contains unmatched opening or closing tags.');
      return;
    }
    ta.value = bits[1] + '[' + pTag + ']' + bits[2] + '[/' + pTag + ']' + bits[3];
    if (document.selection) {
      var longtext = bits[1] + bits[2];
      var strSingleLineText =  longtext.replace(new RegExp( "\r", "g"),"");
      var removeother = strSingleLineText.replace(new RegExp( "\n", "g"),"a");
      setSelectionRange(ta, removeother.length + pTag.length + 2, removeother.length + pTag.length + 2);
    } else {
      setSelectionRange(ta, bits[1].length + bits[2].length + pTag.length + 2, bits[1].length + bits[2].length + pTag.length + 2);
    }
    
  } else {
    insertAtCursorTag(ta, '[' + pTag + ']' + '[/' + pTag + ']', pTag.length + 2);
  }
  ta.focus();
}

function setSelectionRange(input, selectionStart, selectionEnd) {
  if (input.setSelectionRange) {
    input.focus();
    input.setSelectionRange(selectionStart, selectionEnd);
  }
  else if (input.createTextRange) {
    var range = input.createTextRange();
    range.collapse(true);
    range.moveEnd('character', selectionEnd);
    range.moveStart('character', selectionStart);
    range.select();
  }
}

 //  \\//  \\ 
//   //\\   \\
function insertAtCursor(myField, myValue) {
  if (document.selection) {
    myField.focus();
    sel = document.selection.createRange();
    sel.text = myValue;
    var stored_range = sel.duplicate();
    stored_range.moveToElementText( myField );
    stored_range.setEndPoint( 'EndToEnd', sel );
    var longtext = stored_range.text;
    var strSingleLineText =  longtext.replace(new RegExp( "\r", "g"),"");
    var removeother = strSingleLineText.replace(new RegExp( "\n", "g"),"a");
    selectionStarter = removeother.length - sel.text.length;
    setSelectionRange(myField, selectionStarter, selectionStarter);
  } else if (myField.selectionStart || myField.selectionStart == '0') {
    var startPos = myField.selectionStart;
    var endPos = myField.selectionEnd;
    myField.value = myField.value.substring(0, startPos)
      + myValue
      + myField.value.substring(endPos, myField.value.length);
    setSelectionRange(myField, startPos + myValue.length, startPos + myValue.length);
  } else {
    myField.value += myValue;
  }
  myField.focus();
}

function insertAtCursorTag(myField, myValue, distance) {
  if (document.selection) {
    myField.focus();
    sel = document.selection.createRange();
    sel.text = myValue;
    
    var stored_range = sel.duplicate();
    stored_range.moveToElementText( myField );
    stored_range.setEndPoint( 'EndToEnd', sel );
    var longtext = stored_range.text;
    var strSingleLineText =  longtext.replace(new RegExp( "\r", "g"),"");
    var removeother = strSingleLineText.replace(new RegExp( "\n", "g"),"a");
    selectionStarter = removeother.length - sel.text.length - distance - 1;
    setSelectionRange(myField, selectionStarter, selectionStarter);
  } else if (myField.selectionStart || myField.selectionStart == '0') {
    var startPos = myField.selectionStart;
    var endPos = myField.selectionEnd;
    myField.value = myField.value.substring(0, startPos)
      + myValue
      + myField.value.substring(endPos, myField.value.length);
    setSelectionRange(myField, startPos + distance, startPos + distance);
  } else {
    myField.value += myValue;
  }
}

function insertAtCursorCTag(myField, dattoputa, dattoputb, dattoputc) {
  if (document.selection) {
    myField.focus();
    sel = document.selection.createRange();
    sel.text = dattoputa + dattoputb + dattoputc;
    
    var stored_range = sel.duplicate();
    stored_range.moveToElementText( myField );
    stored_range.setEndPoint( 'EndToEnd', sel );
    var longtext = stored_range.text;
    var strSingleLineText =  longtext.replace(new RegExp( "\r", "g"),"");
    var removeother = strSingleLineText.replace(new RegExp( "\n", "g"),"a");
    selectionStarter = removeother.length - sel.text.length - dattoputc.length;
    setSelectionRange(myField, selectionStarter, selectionStarter);
  } else if (myField.selectionStart || myField.selectionStart == '0') {
    var startPos = myField.selectionStart;
    var endPos = myField.selectionEnd;
    myField.value = myField.value.substring(0, startPos)
      + dattoputa + dattoputb + dattoputc
      + myField.value.substring(endPos, myField.value.length);
    setSelectionRange(myField, startPos + dattoputa.length + dattoputb.length, startPos + dattoputa.length + dattoputb.length);
  } else {
    myField.value += myValue;
  }
}

function addLink(myField) {
  var url = prompt("Type the url (Example:http://www.innovusnet.com)");
  bits = getSelection(myField);
  if(url && bits) {
    var text = prompt("Optional - Type the text users will click to visit your link (Example: InnovusNet)", bits[2]);
  } else if(url) {
    var text = prompt("Optional - Type the text users will click to visit your link (Example: InnovusNet)");
  }
  if(url && text) {
    var dattoputa = '[url=' + url + ']';
    var dattoputc = '[/url]';
    insertAtCursorCTag(myField, dattoputa, text, dattoputc);
  } else if(url) {
    var myValuea = '[url]';
    var myValuec = '[/url]';
    insertAtCursorCTag(myField, myValuea, url, myValuec)
  }
}

function addMail(myField) {
  var url = prompt("Type the email address (Example:Admin@InnovusNet.com)");
  bits = getSelection(myField);
  if(url && bits) {
    var text = prompt("Optional - Type the text users will click to visit your email link (Example: InnovusNet Admin)", bits[2]);
  } else if(url) {
    var text = prompt("Optional - Type the text users will click to visit your email link (Example: InnovusNet Admin)");
  }
  if(url && text) {
    var dattoputa = '[mail=' + url + ']';
    var dattoputc = '[/mail]';
    insertAtCursorCTag(myField, dattoputa, text, dattoputc);
  } else if(url) {
    var myValuea = '[mail]';
    var myValuec = '[/mail]';
    insertAtCursorCTag(myField, myValuea, url, myValuec)
  }
}