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>=30) { 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>=30) { 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>=30) { 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 first;
    var tag, tagP2;

	var tagstart = '{' + sTagx + '}';
	var tagend = '{' + eTagx + '}';
	if (sTagx == '') { tagstart = ''; }
	if (eTagx == '') { tagend = ''; }
	if (justAdd != '' && sTagx == '') {
		tagstart=justAdd;
		justAdd = true;
	} else if (eTagx == '') {
		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 selectedText = el.value.substring(sStart, sEnd);

		var regex = /^\{(\w+)(?::([a-zA-Z0-9.]+))?\}/;
 	    var matched = selectedText.match(regex);
 	    if (matched == null) { first = ''; } 
 	    else { first = matched[0]; tag = matched[1]; tagP2 = matched[2]; }

		var sTagRegex = /^(\w+)(?::([\w.]+))?$/;
 	    var sTagMatch = sTagx.match(sTagRegex);

		if (
			(
				first.toLowerCase() == '{left}' ||
				first.toLowerCase() == '{center}' ||
				first.toLowerCase() == '{right}' ||
				first.toLowerCase() == '{justify}'
			) && (
				tagstart.toLowerCase() == '{left}' || 
				tagstart.toLowerCase() == '{center}' || 
				tagstart.toLowerCase() == '{right}' || 
				tagstart.toLowerCase() == '{justify}')
			) {
			var tmptagstart = first;
			var tmptagend = first.slice(0, 1) + '/' + first.slice(1);
			if (first.toLowerCase() != tagstart.toLowerCase()) {
			    var middle = el.value.substring(sStart+tmptagstart.length, sEnd-tmptagend.length);
		 		el.value = el.value.substring(0,sStart) +
					el.value.substring(sStart+tmptagstart.length, sEnd-tmptagend.length) + 
					el.value.substring(sEnd,el.value.length);
				sEnd = sStart + middle.length;
				first = '';
			}
		} else if (
			(
				first.toLowerCase() == '{sub}' ||
				first.toLowerCase() == '{super}'
			) && (
				tagstart.toLowerCase() == '{sub}' || 
				tagstart.toLowerCase() == '{super}'  
				)
			) {
			var tmptagstart = first;
			var tmptagend = first.slice(0, 1) + '/' + first.slice(1);

			if (first.toLowerCase() != tagstart.toLowerCase()) {
			    var middle = el.value.substring(sStart+tmptagstart.length, sEnd-tmptagend.length);
		 		el.value = el.value.substring(0,sStart) +
					el.value.substring(sStart+tmptagstart.length, sEnd-tmptagend.length) + 
					el.value.substring(sEnd,el.value.length);
				sEnd = sStart + middle.length;
				first = '';
			}
		} else if (tag == 'size' && tag == sTagMatch[1] && tagP2 != sTagMatch[2]) {
			var middle = el.value.substring(sStart+first.length, sEnd-tagend.length);
	 		el.value = el.value.substring(0,sStart) +
				el.value.substring(sStart+first.length, sEnd-tagend.length) + 
				el.value.substring(sEnd,el.value.length);
			sEnd = sStart + middle.length;
			first = '';
		} else if (tag == 'font' && tag == sTagMatch[1] && tagP2 != sTagMatch[2]) {
			var middle = el.value.substring(sStart+first.length, sEnd-tagend.length);
	 		el.value = el.value.substring(0,sStart) +
				el.value.substring(sStart+first.length, sEnd-tagend.length) + 
				el.value.substring(sEnd,el.value.length);
			sEnd = sStart + middle.length;
			first = '';
		} else if (tag == 'c' && tag == sTagMatch[1] && tagP2 != sTagMatch[2]) {
			var middle = el.value.substring(sStart+first.length, sEnd-tagend.length);
	 		el.value = el.value.substring(0,sStart) +
				el.value.substring(sStart+first.length, sEnd-tagend.length) + 
				el.value.substring(sEnd,el.value.length);
			sEnd = sStart + middle.length;
			first = '';
		}

		if (first.toLowerCase() == tagstart.toLowerCase()) {
	 		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);
	            } 
	        }
		$('#' + el.id).keyup();
        } 

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});

	shortcut.add("Meta+B",
		function() {formatText(myTgt, 'b', '/b'); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	shortcut.add("Meta+I",
		function() {formatText(myTgt, 'i', '/i'); },
		{'type':'keydown','propagate':false,'disable_in_input':false,'target':myTgt});
	shortcut.add("Meta+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=\'https://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});

		shortcut.add("Meta+S",
		function(){ document.getElementById('response').innerHTML='<big><b>Saving...</b></big> <img src=\'https://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=\'https://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});
		shortcut.add("Meta+S",
		function(){ document.getElementById('response').innerHTML='<big><b>Saving...</b></big> <img src=\'https://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);
	}


function strMse(event){
if(!event) var event=window.event; if (document.all){
return [event.clientX+strDocS()[0],event.clientY+strDocS()[1]]; }
return [event.pageX,event.pageY];
}

function strDocS(){
if (!document.body.scrollTop){ return [document.documentElement.scrollLeft,document.documentElement.scrollTop]; }
return [document.body.scrollLeft,document.body.scrollTop];
}

function strPos(strobj){
strlft=strobj.offsetLeft; strtop=strobj.offsetTop; while(strobj.offsetParent!=null){
strpar=strobj.offsetParent;
strlft+=strpar.offsetLeft;
strtop+=strpar.offsetTop;
strobj=strpar;
}
return [strlft,strtop]; }


var objname; var strobj; var pos_x; var pos_y;
function findWhereClickedImg(e, objname) { if (!e) var e = (window.event) ? window.event : evt; if (e.pageX || e.pageY) { posx = e.pageX; posy = e.pageY; } else if (e.clientX || e.clientY) { posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; }

pos_x = posx-strPos(objname)[0];
pos_y = posy-strPos(objname)[1];
return pos_y;
}


   var which, myNum, fsEdit;
   function toggleEditorMenu(which, myNum, fsEdit) { hideMine('colorMenu' + myNum); hideMine('sizeMenu' + myNum); hideMine('fontMenu' + myNum); hideMine('lsMenu' + myNum); hideMine('macrosMenu' + myNum); hideMine('giphySearch' + myNum); 	if (document.getElementById(which).shown!=1) { showMine(which); var element =  document.getElementById('colorMenu' + myNum); if (typeof(element) != 'undefined' && element != null) { document.getElementById('colorMenu' + myNum).shown=0; }element =  document.getElementById('sizeMenu' + myNum); if (typeof(element) != 'undefined' && element != null) { document.getElementById('sizeMenu' + myNum).shown=0; }element =  document.getElementById('fontMenu' + myNum); if (typeof(element) != 'undefined' && element != null) { document.getElementById('fontMenu' + myNum).shown=0; }element =  document.getElementById('lsMenu' + myNum); if (typeof(element) != 'undefined' && element != null) { document.getElementById('lsMenu' + myNum).shown=0; }element =  document.getElementById('macrosMenu' + myNum); if (typeof(element) != 'undefined' && element != null) { document.getElementById('macrosMenu' + myNum).shown=0; }element =  document.getElementById('giphySearch' + myNum); if (typeof(element) != 'undefined' && element != null) { document.getElementById('giphySearch' + myNum).shown=0; }document.getElementById(which).shown=1;

		if (fsEdit == 1) { element =  document.getElementById('FS_Top_Wrapper'); var height = '90px'; if (typeof(element) != 'undefined' && element != null) { if (typeof(element.origHeight) == 'undefined') { element.origHeight = element.style.height.replace("px", ""); } var num = (+element.origHeight + 30); height = num + "px"; document.getElementById('FS_Top_Wrapper').style.height=height; } element =  document.getElementById('FS_Top_Inner'); if (typeof(element) != 'undefined' && element != null) { document.getElementById('FS_Top_Inner').style.height=height; } element =  document.getElementById('FS_Textarea_Wrapper'); if (typeof(element) != 'undefined' && element != null) { document.getElementById('FS_Textarea_Wrapper').style.top=height; }   }

		}
	else {

		document.getElementById(which).shown=0; element =  document.getElementById('FS_Top_Wrapper'); var height='60px'; if (typeof(element) != 'undefined' && element != null) { if (typeof(element.origHeight) != 'undefined') { height = element.origHeight.toString() + 'px';  } document.getElementById('FS_Top_Wrapper').style.height=height; } element =  document.getElementById('FS_Top_Inner'); if (typeof(element) != 'undefined' && element != null) { document.getElementById('FS_Top_Inner').style.height=height; } element =  document.getElementById('FS_Textarea_Wrapper'); if (typeof(element) != 'undefined' && element != null) { document.getElementById('FS_Textarea_Wrapper').style.top=height; }

		}


	}
