function setSelectionRange(input, selectionStart, selectionEnd) { 
  if (input.setSelectionRange) { input.select(); 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(); }
}

var thisEl;  var curVal; var chkVal; var curCaret;
function myUndo (thisEl) {
   if (!thisEl.undoValues) { return; }
   if (thisEl.undoValues.length <= 0) { return; }
   curVal=thisEl.value;
   curCaret=getCaretPos(thisEl);
   var didUndo = false;
   while (curVal == thisEl.value && thisEl.undoValues.length>0) {
	chkVal = thisEl.undoValues.pop();
	if (chkVal) { thisEl.value=chkVal[1]; setCaretPos(thisEl, chkVal[0]); didUndo = true; }
	}
   if (!didUndo) { return; }
   thisEl.undoValues.push(chkVal);
   if (!thisEl.redoValues) { thisEl.redoValues=new Array(); }
   chkVal = thisEl.redoValues.pop();
   if (chkVal) { thisEl.redoValues.push (chkVal); }
   if (!chkVal || chkVal[1] != thisEl.value) {
	thisData=Array (curCaret, curVal);
   	thisEl.redoValues.push (thisData);
	if (thisEl.redoValues.length>=20) { thisEl.redoValues.shift(); }
   	thisEl.redoValues.push (thisData);
	}
   }

function myRedo (thisEl) {
   if (!thisEl.redoValues) { return; }
   if (thisEl.redoValues.length <= 0) { return; }
   curVal=thisEl.value;
   var didRedo = false;
   while (curVal==thisEl.value && thisEl.redoValues.length>0) {
	chkVal = thisEl.redoValues.pop();
	if (chkVal) { thisEl.value=chkVal[1]; setCaretPos(thisEl, chkVal[0]); didRedo = true; }
	}
   if (!didRedo) { return; }
   thisEl.redoValues.push(chkVal);
   if (!thisEl.undoValues) { thisEl.undoValues=new Array(); }
   var uchkVal = thisEl.undoValues.pop();
   if (uchkVal) { thisEl.undoValues.push (uchkVal); }
   if (!uchkVal || uchkVal[1] != thisEl.value) {
	thisData=Array (chkVal[0], chkVal[1]);
   	thisEl.undoValues.push (thisData);
	if (thisEl.undoValues.length>=20) { thisEl.undoValues.shift(); }
	}
   }

function storeUndo (thisEl) {

   if (!thisEl.undoValues) { thisEl.undoValues=new Array(); }
   chkVal = thisEl.undoValues.pop();
   if (chkVal) { thisEl.undoValues.push (chkVal); }
   if (!chkVal || chkVal[1] != thisEl.value) {
	curCaret=getCaretPos(thisEl);
	thisData=Array (curCaret, thisEl.value);
   	thisEl.undoValues.push (thisData);
	thisEl.redoValues=new Array();
	if (!thisEl.redoValues) { thisEl.redoValues=new Array(); }
	if (thisEl.undoValues.length>=20) { thisEl.undoValues.shift(); }
	}
   }
var pos;
function setCaretPos (thisEl, pos) { setSelectionRange(thisEl, pos, pos); }
function getCaretPos(thisEl) { 
  if (thisEl.selectionStart) { return thisEl.selectionStart; } else if (document.selection) { 

    thisEl.focus(); 
    var r = document.selection.createRange(); 
    if (r == null) { return 0; } 
    var re = thisEl.createTextRange(), 
        rc = re.duplicate(); 
    re.moveToBookmark(r.getBookmark()); 
    rc.setEndPoint('EndToStart', re); 
    var breaks = lineBreakCount(rc.text + 'x');
    return rc.text.length-breaks; 
    }  
  return 0; 
}
function lineBreakCount(str){ try { return((str.match(/[^\n]*\n[^\n]*/gi).length)); } catch(e) { return 0; } }

var sTagx; var eTagx; var el; var justAdd;
function formatText (el, sTagx, eTagx, justAdd) { 
	var tagstart = '{' + sTagx + '}';
	var tagend = '{' + eTagx + '}';
	if (sTagx == '') { tagstart = ''; }
	if (eTagx == '') { tagend = ''; }
	if (justAdd != '' && sTagx == '') {
		tagstart=justAdd;
		justAdd = true;
		}
	else {
		justAdd = false;
		}
	var addLenStr = tagstart + tagend; 

  	if (el.setSelectionRange) {
		el.origTop=el.scrollTop;
		var sStart = el.selectionStart;
		var sEnd = el.selectionEnd;
		var first = el.value.substring(sStart, (sStart+ tagstart.length)) ;
		if (first == tagstart) {
	 		el.value = el.value.substring(0,sStart) +
				el.value.substring(sStart+tagstart.length, sEnd-tagend.length) + 
				el.value.substring(sEnd,el.value.length);
			el.select();
			el.focus();
			el.setSelectionRange(sStart, (sEnd - addLenStr.length));
			}
		else {
	 		el.value = el.value.substring(0,sStart) + tagstart + 
				el.value.substring(sStart, sEnd) + tagend + 
				el.value.substring(sEnd,el.value.length);
			el.select();
			el.focus();
			if (!justAdd) {
				el.setSelectionRange(sStart, (sEnd + addLenStr.length));
				}
			else {
				el.setSelectionRange((sEnd + addLenStr.length), (sEnd + addLenStr.length));
				}
			}
		el.scrollTop = el.origTop;
	  	}
  	else {
		var range = document.selection.createRange();
		var drange = range.duplicate();

	        if (tagend == '') {
        	        var newText = tagstart;
			var caret = getCaretPos(el);
			setSelectionRange(el, caret, 1);
			document.selection.createRange().text = newText; 
			setCaretPos (el, caret+newText.length);
			return;
			}

		drange.moveToElementText(el);
		drange.setEndPoint("EndToEnd", range);
		var c1 =lineBreakCount(drange.text);  
		var c2 =lineBreakCount(range.text);  
		var currentPosition = (drange.text.length) - (range.text.length);
		var selectedText = document.selection.createRange().text;
		var lines = lineBreakCount(selectedText);
		var linesCurrent = lineBreakCount(drange.text);
		currentPosition = currentPosition - linesCurrent + lines;
		var endPosition = currentPosition + selectedText.length +  
                        addLenStr.length - lines;  
	        var selectedText = document.selection.createRange().text; 

        	if (selectedText != "") { 
		    var first = selectedText.substring(0,tagstart.length) ;
		    if (first == tagstart) {
			selectedText = selectedText.substring(tagstart.length, selectedText.length-tagend.length);
			tagstart = '';
			tagend = '';
			var endPosition = currentPosition + selectedText.length - lines;  
			}
        	    var newText = tagstart + selectedText + tagend; 
	            document.selection.createRange().text = newText; 

		    setSelectionRange(el, currentPosition, endPosition);
	            } 
	        }
        } 

function setupMainQuickKeys (myTgt) {
	shortcut.add("Ctrl+B",
		function() {formatText(myTgt, 'b', '/b'); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	shortcut.add("Ctrl+I",
		function() {formatText(myTgt, 'i', '/i'); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	shortcut.add("Ctrl+U",
		function() {formatText(myTgt, 'u', '/u'); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});

	$('#' + myTgt.id).keydown(function() { storeUndo(myTgt); });
	shortcut.add("Ctrl+Z",
		function() { myUndo (myTgt); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	shortcut.add("Meta+Z",
		function() { myUndo (myTgt); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	shortcut.add("Ctrl+Shift+Z",
		function() { myRedo (myTgt); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	shortcut.add("Meta+Shift+Z",
		function() { myRedo (myTgt); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});

	shortcut.add("Ctrl+Shift+X",
		function() {formatText(myTgt, 'x', '/x'); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	shortcut.add("Ctrl+Shift+L",
		function() {formatText(myTgt, 'left', '/left'); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	shortcut.add("Ctrl+Shift+C",
		function() {formatText(myTgt, 'center', '/center'); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	shortcut.add("Ctrl+Shift+R",
		function() {formatText(myTgt, 'right', '/right'); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	shortcut.add("Ctrl+Shift+J",
		function() {formatText(myTgt, 'justify', '/justify'); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	shortcut.add("Ctrl+Shift+Q",
		function() {formatText(myTgt, 'quote', '/quote'); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	shortcut.add("Ctrl+Shift+8",
		function() {formatText(myTgt, '', '', '{e:bullet}'); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	}


var myTgt; var mySaveTgt; var myRCSTgt;
function setupQuickKeysWithRCS (myTgt, mySaveTgt, myRCSTgt, mySavePostUrl, mySavePostVars) {
	if (mySaveTgt) {
		shortcut.add("Ctrl+S",
		function(){ document.getElementById('response').innerHTML='<big><b>Saving...</b></big> <img src=\'http://images.Writing.Com/imgs/writing.com/writers/load2_FFFFFF.gif\' width=16 height=16><br>';var ao2 = new AjaxO(); var myText = mySaveTgt.value; myText = myText.replace (/\+/g,'%2B'); var myRCS = myRCSTgt.value; myRCS = myRCS.replace (/\+/g,'%2B'); ao2.sndReq('post', mySavePostUrl, eval(mySavePostVars)); if (myRCS) { myRCS.value=''; } },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':document});
		}
	setupMainQuickKeys (myTgt);
	}

function setupQuickKeys (myTgt, mySaveTgt, mySavePostUrl, mySavePostVars) {

	if (mySaveTgt) {
		shortcut.add("Ctrl+S",
		function(){ document.getElementById('response').innerHTML='<big><b>Saving...</b></big> <img src=\'http://images.Writing.Com/imgs/writing.com/writers/load2_FFFFFF.gif\' width=16 height=16><br>';var ao2 = new AjaxO(); var myText = mySaveTgt.value; myText = myText.replace (/\+/g,'%2B'); ao2.sndReq('post', mySavePostUrl, eval(mySavePostVars)); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':mySaveTgt});
		}

	setupMainQuickKeys (myTgt);
	}

