function GetCaretPosition (ctrl) {

	var CaretPos = 0;
	// IE Support
	if (document.selection) {

		ctrl.focus ();
		var Sel = document.selection.createRange ();

		Sel.moveStart ('character', -ctrl.value.length);

		CaretPos = Sel.text.length;
	}
	// Firefox support
	else if (ctrl.selectionStart || ctrl.selectionStart == '0')
		CaretPos = ctrl.selectionStart;

	return (CaretPos);

}


function SetCaretPosition(ctrl, pos)
{

	if(ctrl.setSelectionRange)
	{
		ctrl.focus();
		ctrl.setSelectionRange(pos,pos);
	}
	else if (ctrl.createTextRange) {
		var range = ctrl.createTextRange();
		range.collapse(true);
		range.moveEnd('character', pos);
		range.moveStart('character', pos);
		range.select();
	}
}

var BBcode = {
  // insert text
  insert: function(f, text, front_length, end_length) {
	var f = document.getElementById(f);
    if (document.selection) {
      // ie
      f.focus();
      var sel = document.selection.createRange();
      sel.text = text;
    } else if (f.selectionStart || f.selectionStart == '0') {
       // mozilla
       var startPos = f.selectionStart;
       var endPos = f.selectionEnd;
       f.value = f.value.substring(0, startPos) + text + f.value.substring(endPos, f.value.length);
	   f.setSelectionRange(startPos+front_length,startPos+text.length-end_length);
    } else {
       f.value += text;
    }
    f.focus();
  },
 
  // insert tag
  tag: function(f, t,l) {
	var f = document.getElementById(f);
    var start_tag = "[" + t + "]";
    var end_tag = "[\/" + t + "]";
 	var old_caret_pos = GetCaretPosition(f)
    if (document.selection) {
      // ie
      f.focus();
      var selected = document.selection.createRange().text;
      var sel = document.selection.createRange();
      sel.text = start_tag + selected + end_tag;
    } else if (f.selectionStart || f.selectionStart == '0') {
      // mozilla
      var startPos = f.selectionStart;
      var endPos = f.selectionEnd;
      var text = start_tag + f.value.substring( startPos, endPos ) + end_tag;
      f.value = f.value.substring(0, startPos) + text + f.value.substring(endPos, f.value.length);
	  f.setSelectionRange(startPos+start_tag.length,start_tag.length+endPos);
    } else {
      f.value += start_tag + end_tag;
	  SetCaretPosition(f, old_caret_pos+start_tag.length)
    }
    f.focus();
  },
 
  // insert an url
  url: function(f) {
    var url = prompt("Please enter the url", "http://");
    if (url) {
      var text = "[url=" + url + "]" + url + "[\/url]";
      BBcode.insert(f,text,6+url.length,6);
    }
  },

  // insert an emotion
  emo: function(f,t) {
      var text = ":" + t + ":";
      BBcode.insert(f,text,t.length+2,0);
  },

 
  // insert an image
  image: function(f) {
    var url = prompt("Please enter the image url", "http://");
    if (url) {
      var text = "[img]" + url + "[\/img]";
      BBcode.insert(f,text,5,6);
    }
  },
 
  // insert a youtube video
  yvideo: function(f) {
    var url = prompt("Please enter the youtube video url", "http://");
    if (url) {
      var text = "[youtube]" + url + "[\/youtube]";
      BBcode.insert(f,text);
    }
  },
 
  // insert a google video
  gvideo: function(f) {
    var url = prompt("Please enter the google video url", "http://");
    if (url) {
      var text = "[gvideo]" + url + "[\/gvideo]";
      BBcode.insert(f,text);
    }
  }
}