function insertTags(textArea, tagOpen, tagClose, sampleText) 
{
  var selText, isSample = false;

  if (document.selection  && document.selection.createRange) { // IE/Opera

    //get current selection  
    textArea.focus();
    var range = document.selection.createRange();
    selText = range.text;
    //insert tags
    checkSelectedText();
    range.text = tagOpen + selText + tagClose;
    //mark sample text as selected
    if (isSample && range.moveStart) {
      if (window.opera)
	tagClose = tagClose.replace(/\n/g,'');
      range.moveStart('character', - tagClose.length - selText.length); 
      range.moveEnd('character', - tagClose.length); 
    }
    range.select();   

  } else if (textArea.selectionStart || textArea.selectionStart == '0') { // Mozilla

    //save textarea scroll position
    var textScroll = textArea.scrollTop;
    //get current selection
    textArea.focus();
    var startPos = textArea.selectionStart;
    var endPos = textArea.selectionEnd;
    selText = textArea.value.substring(startPos, endPos);
    //insert tags
    checkSelectedText();
    textArea.value = textArea.value.substring(0, startPos)
      + tagOpen + selText + tagClose
      + textArea.value.substring(endPos, textArea.value.length);
    //set new selection
    if (isSample) {
      textArea.selectionStart = startPos + tagOpen.length;
      textArea.selectionEnd = startPos + tagOpen.length + selText.length;
    } else {
      textArea.selectionStart = startPos + tagOpen.length + selText.length + tagClose.length;
      textArea.selectionEnd = textArea.selectionStart;
    }
    //restore textarea scroll position
    textArea.scrollTop = textScroll;
  } 

  function checkSelectedText(){
    if (!selText) {
      selText = sampleText;
      isSample = true;
    } else if (selText.charAt(selText.length - 1) == ' ') { //exclude ending space char
      selText = selText.substring(0, selText.length - 1);
      tagClose += ' ';
    } 
  }

}



function xmlToString(parentNode) 
{
  var value = parentNode.xml != undefined ? 
    _xmlToStringIE(parentNode) :
    _xmlToStringMozilla(parentNode);

  return unescape(value);
}


function _xmlToStringIE(parentNode) 
{
  var contentStr = "";
  for ( var i = 0 ; i < parentNode.childNodes.length ; i++ ) {
    var n = parentNode.childNodes[i];
    if (n.nodeType == 4) {
      contentStr += n.nodeValue;
    }
    else {
      contentStr += n.xml;
    }
  }
  return contentStr;
}


function _xmlToStringMozilla(parentNode) 
{
  var xmlSerializer = new XMLSerializer();
  var contentStr = "";
  for ( var i = 0 ; i < parentNode.childNodes.length ; i++ ) {
    var n = parentNode.childNodes[i];
    if (n.nodeType == 4) { // CDATA node
      contentStr += n.nodeValue;
    }
    else {
      contentStr += xmlSerializer.serializeToString(n);
    }
  }
  return contentStr;
}


function dispatchXMLAnswer(responseXML)
{
  var answer = responseXML.getElementsByTagName('answer')[0];
  var fields = answer.getElementsByTagName('field');

  for (var i = 0; i < fields.length; i++) {
    var destination = fields[i].getAttribute('destination');
    $(destination).innerHTML = xmlToString(fields[i]);
  }
}

