		var alaem = ' .،؛,:';
        var letterYeh = "یي";
		var pishVand = ' نمی '
        var letterNoChasban = "ءاإأآؤدذرزو";
        var pasvands = " ها هایی های هایش هایم هایشان هایتان هایمان ای اید ایم اند ام";
		
		var pairedAlaemEnd = '}>])﴾»\"';
        var pairedAlaemBeg = '{<[(﴿«\"'; 
		var sanadVaseth = ' عن عنه ';
		var sanadEnd = ' سالت سألت قلت قال یقول قالوا قالا قلنا ';
		var wlast = '';
		var indexlast = -1;

		
var onCharacterKeyPress = function isCharacterKeyPress(evt) {
    if (typeof evt.which == "undefined") {
        // This is IE, which only fires keypress events for printable keys
        return true;
    } else if (typeof evt.which == "number" && evt.which > 0) {
        // In other browsers except old versions of WebKit, evt.which is
        // only greater than zero if the keypress is a printable key.
        // We need to filter out backspace and ctrl/alt/meta key combinations
        return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which != 8;
    }
    return false;
}

function isErab(c){
	 return c.match(/[\u064B-\u0652]/g);
}
function removeErab(text){	
	text = text.replace(/[\u064B-\u0652]/g, '');
	return text;
}

function isPairedChar(c){
	var index = pairedAlaemBeg.indexOf(c);
	if( index === -1 )
		return '';
	return pairedAlaemEnd[index];		
}
	
function isAlaem(c){
	//var c = String.fromCharCode(keyCode);
	return alaem.indexOf(c) !== -1;
}

function getNextWord(text, index){
	var w = '';
	if(index < 0 )
	  index = 0;
	for(var i=index; i < text.length; i++ )
	{
		var c = text[i];
		if(alaem.indexOf(text[i]) !== -1)
		  return w;
		w += text[i];
	}
	return w;
}

function getLastWord(text, index){
	var w = '';
	if(index>=text.length )
	  index = text.length-1;
	for(var i=index; i >= 0; i-- )
	{
		var c = text[i];
		if(isAlaem(text[i]))
		  return w;
		w = text[i] + w;
	}
	return w;
}

function isHalfSpaceNeed(range){

	var index = -1;
	var w1 = '', w2 = '';
	var ret = [index, w1, w2 ];
	var text = range.endContainer.data;
	var i1 = range.endOffset - ' '.length;
	//var i1 = text.length-1 - ' '.length;
	var w1 = getLastWord(text, i1);
	var w2 = '';
	if(w1 != '')
	{
		wlast = w1;
		indexlast = i1 + 1 + ' '.length;
	
		w2 = getLastWord(text, i1-w1.length-1);
	}
	if(w2 === '')
		return ret;
	var correcting = false;
	var c2Last = w2[w2.length-1];
	if(letterYeh.indexOf(c2Last) !== -1){
		if(  w2.length < 3 || pishVand.indexOf(' ' + w2) !== -1)
			correcting = true;
	}	   
	if( !correcting && letterNoChasban.indexOf(c2Last) === -1)	
	{
		if(pasvands.indexOf(' ' + w1) !== -1)
		{
			correcting = true;
		}
	}
	if(correcting){  // می شود ...
		ret[0] = range.endOffset-w1.length-1; // space position
		ret[1] = w1; // شود
		ret[2] = w2; //می 

		return ret;
	}
	else
		return ret;
}

function isTextElement(range)
{
   return range.endContainer != null && range.endContainer.nodeType === 3;
}

function unSelect(editor){
	if(!editor.selection.isCollapsed()){
		editor.selection.collapse(false);
		editor.focus();
	}	
}

function selectParag(editor){
	var range = editor.selection.getRng().cloneRange();
	var node = range.endContainer;
	while( !isValidLineTag(node) )
	{
		if( node.parentNode == null )
			break;
		node = node.parentNode;
	}
	if(node === null)
		return false;

	range.selectNodeContents(node);
	editor.selection.setRng(range);
	editor.focus();
	return true;
}

function selectWord(editor){
	//var b = tinyMCE.Env.browser.isIE();
	if (editor.selection.isCollapsed()) {
		if (tinyMCE.Env.browser.isIE()) {        // Internet Explorer			
			var range = editor.selection.getRng().cloneRange();
			var text = range.endContainer.data;
			if(text.length == 0)
				return false;

			var i1 = range.endOffset-1;
			if( i1<0 ) i1 = 0;
			if( i1 >= text.length ) i1 = text.length-1;
			var c = text[i1];
			var w = '';
			while( i1 >= 0 && !isAlaem(text[i1])){
				i1--;
            }
            if (i1 < 0) i1 = 0;
			if(isAlaem(text[i1]))
				i1++;
			w = getNextWord(text, i1);
			range.setStart(range.endContainer, i1);
			range.setEnd(range.endContainer, i1+w.length);

			editor.selection.setRng(range);
			editor.focus();
			return true;
		}
	}	
	return false;
}



function isLetter(keyCode){
	if ( (keyCode < 65 ) ||
		(keyCode > 90 && keyCode < 97 ) ||
		(keyCode > 122 && keyCode < 161 ) ||
		(keyCode > 1631 && keyCode < 1646 ) 
	  ){
		  return false;
  	}
	return true;
}

function getRange(editor){
	var range = editor.selection.getRng().cloneRange();
	if(editor.selection.isCollapsed()){

		var node = range.endContainer;
		while( !isValidLineTag(node) )
		{
			if( node.parentNode == null )
				break;
			node = node.parentNode;
		}
		if(node === null)
			return;

		range.selectNodeContents(node);
	}

	editor.selection.setRng(range);
	return range;
}

function removeContentErab(editor){

	var range = getRange(editor);

	var text = editor.selection.getContent();
	text = removeErab(text);

	editor.undoManager.add();
	//editor.undoManager.transact(function () {
		editor.selection.setContent(text);
	//});		
	range.collapse(false);
	editor.focus();
	return true;
}


function parseHadith(editor){
	var range = getRange(editor);
	var text = editor.selection.getContent();
	if(text.indexOf('class="tsanad"') != -1 || text.indexOf('class="thadith"') != -1){
		range.collapse(false);
		editor.focus();	
		return false;
	}

	var text2 = '';
	var sanadvalid = false;
	var w = '', w2 = '';
	for(var i=0; i < text.length; i++ )
	{
		var c = text[i];
		if(isAlaem(c)){
			w2 += c;			
			if(!sanadvalid && w != ''){
				if(sanadEnd.indexOf(' ' + w) != -1){
					text2 = '<span class=\"tsanad\">' + text2 + w2 + '</span>';
					text2 += '<span class=\"thadith\">'
					sanadvalid = true;
					w2 = '';
					w = '';
					continue;
				}
			}
			text2 += w2;
			w2 = '';
			w = '';
		}		  
		else {
			w2 += c;
			if( !isErab(c) )
				w += c;
		}
	}
	text2 += w2;
	if(sanadvalid)
		text2 += '</span>';

	editor.undoManager.add();
	//editor.undoManager.transact(function () {
		editor.selection.setContent(text2 + ' ');
	//});						
	range.collapse(false);
	editor.focus();
	return true;
}


function checkPairedChar(editor, e){
	var range = editor.selection.getRng().cloneRange();
	if( isTextElement(range)){						
		var c = isPairedChar(e.key);
		if( c!== '' ){
			if(!editor.selection.isCollapsed()){
				editor.selection.setContent( e.key + editor.selection.getContent() + c);					
				editor.focus();
				return true;
			}
			else{				
				editor.execCommand('mceInsertContent', false, e.key + c);
				//editor.selection.setContent( e.key + c);
				var range2 = editor.selection.getRng().cloneRange();
				if(range2.endContainer.nodeType == 3)
					range2.setEnd(range2.endContainer, range2.endOffset-1);
				else if(range2.endContainer.nodeType==1 && range2.endContainer.lastChild && range2.endContainer.lastChild.nodeType == 3)
					range2.setEnd(range2.endContainer.lastChild, range2.endContainer.lastChild.textContent.length-1);
				else
				 	return true;
			
				editor.selection.setRng(range2);		
				editor.focus();
				return true;	
			}
		}
	}
	return false;		
}
function setingTag2(editor, e){
	if(e.keyCode === 35 || e.key === '#'){ //'#'
		var range = editor.selection.getRng().cloneRange();
		var text = range.endContainer.data;
		var i1 = range.endOffset;
		if(i1< text.length){
			var w1 = getNextWord(text,i1)
			if(w1.length > 0){
				range.setStart(range.endContainer,i1-1);
				range.setEnd(range.endContainer, i1+w1.length+1);
				editor.selection.setRng(range);

				var t = editor.selection.getContent();
				if(t[0] === '#')
					t = t.substring(1);
				editor.selection.setContent('<span class=\"ttag\">'+t+'</span>');
				editor.focus();
				return true;			
			}
		}
		return false;
	}
	return false;
}


function setingTag(editor, e, range){
	if(isLetter(e.keyCode) ){
		var text = range.endContainer.data;
		var i1 = range.endOffset-1;
		if( i1 > 0 ){				
			if( text[i1-1] === '#' && text[i1-2] === ' ') {
				if( !isTagging(range.endContainer.parentNode) ){
					range.setStart(range.endContainer,i1-1);
					range.setEnd(range.endContainer, i1+1);
					editor.selection.setRng(range);

					editor.selection.setContent('<span class=\"ttag\">'+editor.selection.getContent()+'</span>');
					range.selectNodeContents(range.endContainer.nextSibling);
					range.collapse(false);

					editor.selection.setRng(range);
					editor.focus();
					return true;
				}
			}
		}
	}
	return false;
}


function endigTag(editor, e, range){
	if(isTagging(range.endContainer.parentNode)){
		var tag = range.endContainer.parentNode;
		var t = tag.innerText;
		if(t.length < 2)
			return false;
		if(t[0] === '#')
			t = t.substring(1);

		range.selectNodeContents(tag);
		editor.selection.setRng(range);

		editor.selection.setContent(t);

		if(e.keyCode == 13)
			tinyMCE.execCommand('removeformat');
		else if(tag.nextSibling)
		{
			range.setStart(tag.nextSibling,0);
			range.setEnd(tag.nextSibling,0);
			editor.selection.setRng(range);
			editor.selection.setContent( ' ' + editor.selection.getContent());			
		}

		editor.focus();
		return true;
	}
	return false;
}

function endingMarkDowns(editor, e){
	var range = editor.selection.getRng().cloneRange();
	if(e.keyCode === 13){
		if(endigTag(editor, e, range))
			return true;
	}	
	return false;
}


function checkMarkDown(editor, e){
	var range = editor.selection.getRng().cloneRange();
	if( isTextElement(range)){						
		if( editor.selection.isCollapsed() ){			
			if(e.keyCode == 32 || e.keyCode == 160 ){				
				var text = range.endContainer.data;
				var i1 = range.endOffset-1 - ' '.length;
				//var i1 = text.length-1 - ' '.length;
				var w1 = '';
				var numbering = false;
				const regex = /\d/g;
				if( i1 > 0 ){				
					if( text[i1] === '.') {
						if(regex.exec(text[i1-1]) !== null ){
							w1 = text[i1-1] +'.';
							numbering = true;
						}
					}
				}
				if(w1 === '')
					w1 = getLastWord(text,i1);
				if(w1 === '')
				   return false;
			    var index = i1-w1.length;
				if(index < 0)
					index = 0;

				// if( w1 === 'آیه' || w1 === 'آيه'){
				// 	editor.undoManager.transact(function () {
				// 		tinyMCE.execCommand('mceInsertContent', false, '-');
				// 	});					
				// 	//tinyMCE.execCommand('ayahautocomplate', true, 'ناس');
				// 	return true;
				// }
				

				if(w1 === '=' || w1 === '==' || w1 === '===' || w1 ==='*' || numbering )
				{
					if(index != 0)
						return false;
					var node = range.endContainer;
					while( !isValidLineTag(node) )
					{
					    if( node.parentNode == null )
							break;
						node = node.parentNode;
					}
					var id = "";
					if(node == null)
					{
						range.setStart(range.endContainer,index);
						range.setEnd(range.endContainer, index + w1.length);
					}
					else
					{
						range.selectNodeContents(node);
						id = node.getAttribute('id');
					}
					editor.selection.setRng(range);

					if(id != null && id != '')
					 	id = ' id="'+id+'"';
					else 
					    id = '';
					var nodefocus = range.endContainer;
					var t = editor.selection.getContent();
					if(t.length >= w1.length && t.substring(0,w1.length) === w1)
					    t = t.substring(w1.length);
					if(numbering) {
						var m = regex.exec(w1[0]);
						editor.selection.setContent('<ol start="'+w1[0]+'"><li'+id+'>'+t+'</li></ol>');
						nodefocus = range.endContainer.firstChild.firstChild;
					} 
					else if(w1 === '*') {
						editor.selection.setContent('<ul><li'+id+'>'+t+'</li></ul>');
						nodefocus = range.endContainer.firstChild.firstChild;
					}
					else
					{
						if(w1 === '=') 
							editor.selection.setContent('<h1'+id+'>'+t+'</h1>');
						if(w1 === '==') 
							editor.selection.setContent('<h2'+id+'>'+t+'</h2>');
						if(w1 === '===') 
							editor.selection.setContent('<h3'+id+'>'+t+'</h3>');
						
						nodefocus = range.endContainer.firstChild;
					}
					range.selectNodeContents(nodefocus);
					range.collapse(false);
	
					editor.selection.setRng(range);
					editor.focus();
					return true;		
				}
				else if(endigTag( editor, e, range))
					  return true;
			}
			else if(setingTag(editor, e, range) )
				return true;			
		}					
	}
	return false;	
}

var isTagging = function (elm) {
	return elm && elm.nodeName.toLowerCase() === 'span' && elm.className ==='ttag';
};
  
var isValidLineTag = function (elm) {
	if(elm == null)
		return false;
    var name = elm.nodeName.toLowerCase();
    return elm && (name === 'p' || name.indexOf('h')===0 || name === 'li');
};

function checkHalfSpace(editor, e){
	var range = editor.selection.getRng().cloneRange();
	if( isTextElement(range)){						
		if( editor.selection.isCollapsed() ){
            if (isAlaem(e.key) || e.keyCode == 32 || e.keyCode == 160 ){
				var ret = isHalfSpaceNeed(range);
				if(ret[0] != -1){
					var index = ret[0];
					var c = String.fromCharCode(e.keyCode);

					editor.undoManager.add();

					//var node1 = range.endContainer;
					range.setStart(range.endContainer,index+ ret[1].length + 1);
					range.setEnd(range.endContainer,index+ ret[1].length + 1);
					editor.selection.setRng(range);
					var bm = editor.selection.getBookmark(2, true);
					editor.selection.setContent(c); // درج فاصله بعد از کلمه برای حالت عادی و ctrl+z


					var isTexttype = false;
					var n1 = range.endContainer;
					while(n1 != null)
					{
						if(n1.nodeType==3)
						{
							isTexttype = true;
							break;
						}
						else 
							n1 = n1.firstChild;
					}
					if(isTexttype)
					{
						var len = index+ ret[1].length+2;
						if(len <= n1.data.length)
						{
							range.setStart(n1, len);
							range.setEnd(n1, len);		
						}
						else
							range.selectNodeContents(n1);	
					}
					else
						range.selectNodeContents(range.endContainer);

					//range.selectNodeContents(range.endContainer);
					//range.collapse(false);
					editor.selection.setRng(range);
					editor.selection.collapse(false);
					editor.focus();	
					editor.undoManager.add();
					var bm2 = editor.selection.getBookmark(2, true);	

					editor.selection.moveToBookmark(bm);
					range = editor.selection.getRng().cloneRange();
					var node = range.endContainer;
					//if(node.nodeType === 1 && node.lastChild.nodeType === 3)
					//  node = node.lastChild;

					var i2 = index-ret[2].length;
					if(i2 >= 0 && i2 < node.data.length ){
						range.setStart(node, index-ret[2].length);
						range.setEnd(node, index+ ret[1].length+1);
						editor.selection.setRng(range);	
						
						editor.selection.setContent(ret[2] +'\u200C' + ret[1]);		
					}
				
					editor.selection.moveToBookmark(bm2);
					editor.selection.collapse(false);
					editor.focus();	

					//editor.undoManager.add();

					e.preventDefault();
					return true;
				}
			}
			else
			{
				wlast = '';
				indexlast = -1;
			}
		}					
	}
	return false;	
}

function checkNemayah(editor, e){
	var range = editor.selection.getRng().cloneRange();
	if( isTextElement(range)){						
		if( editor.selection.isCollapsed() ){
			if( e.key === ':' ){

				var text = range.endContainer.data;
				var i1 = range.endOffset-1;
				var i2 = range.endOffset-2;
				if(i2 < 0)
					return false;
				var c1 = text.charCodeAt(i1);
				var c2 = text[i2];
				if( c1 != 32 && c1 != 160 )
				  return false;
				if( alaem.indexOf(c2) !== -1)
				  return false;
			
				var parent = range.endContainer.parentNode;
				if(parent != null && parent.firstChild === range.endContainer )
				{
					editor.undoManager.add();
					range.setStart(range.endContainer,0);
					range.setEnd(range.endContainer, range.endOffset-1);
					editor.selection.setRng(range);
					editor.selection.setContent('<span class=\"tnemayah\">'+ editor.selection.getContent() +'</span>' + ' :');

					//range.selectNodeContents(range.endContainer);
					range.collapse(false);
					//editor.selection.setRng(range);
					editor.focus();
					e.preventDefault();
					return true;
				}
			}
		}					
	}
	return false;	
}

function safePaste(content){

	content = content.replace(/\<br[^<>]*?\>/g, '\n');
	content = content.replace(/\<div[^<>]*?\>/g, '');
	content = content.replace(/\<\/div\>/g, '');

	content = content.replace(/\<BR[^<>]*?\>/g, '\n');
	content = content.replace(/\<DIV[^<>]*?\>/g, '');
	content = content.replace(/\<\/DIV\>/g, '');

	var pattern1 = /(\<[a-zA-Z0-9]+[^<>]*?)(id="[^<>]*")([^<>]*?\>)/g
	content = content.replace(pattern1, '$1$3');


	return content;
}