﻿function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
    var rv = -1; // Return value assumes failure.
    if (navigator.appName == 'Microsoft Internet Explorer') {
        var ua = navigator.userAgent;
        var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat(RegExp.$1);
    }
    return rv;
}

if (typeof HTMLElement != "undefined" && !HTMLElement.prototype.insertAdjacentElement) {
	HTMLElement.prototype.insertAdjacentElement = function (where,parsedNode) {
		switch (where) {
			case 'beforeBegin':
				this.parentNode.insertBefore(parsedNode,this)
				break;
			case 'afterBegin':
				this.insertBefore(parsedNode,this.firstChild);
				break;
			case 'beforeEnd':
				this.appendChild(parsedNode);
				break;
			case 'afterEnd':
				if (this.nextSibling)
					this.parentNode.insertBefore(parsedNode,this.nextSibling);
				else
					this.parentNode.appendChild(parsedNode);
				break;
		}
	}

	HTMLElement.prototype.insertAdjacentHTML = function (where,htmlStr) {
		var r = this.ownerDocument.createRange();
		r.setStartBefore(this);
		var parsedHTML = r.createContextualFragment(htmlStr);
		this.insertAdjacentElement(where,parsedHTML)
	}

	HTMLElement.prototype.insertAdjacentText = function (where,txtStr) {
		var parsedText = document.createTextNode(txtStr)
		this.insertAdjacentElement(where,parsedText)
	}
}

var FarsiType =
{
	// Farsi keyboard map based on Iran Popular Keyboard Layout
	farsiKey : [
   0x0020, // " "
   //0x0021, // "!" Shift+1
   0x0031, // "1" Shift+1
   //0x061B, // ";"
   0x06AF, // "گ" Shift+'
   //0x066B, // "," Shift+3
   0x0033, // "3" Shift3
   //0x00A4, // "¤" Shift+4
   0x0034, // "4" Shift+4
   //0x066A, // "%" Shift+5
   0x0035, // "5" Shift+5
   //0x060C, // "،" Shift+7
   0x0037, // "7" Shift+7
   0x06AF, // "گ" '
   //0x0029, // "(" Shift+9
   0x0039, // "9" Shift+9
   //0x0028, // ")" Shift+0
   0x0030, // "0" Shift+0
   //0x002A, // "*" Shift+8
   0x0038, // "8" Shift+8
   //0x002B, // "+" Shift+=
   0x003D, // "=" Shift+=
   0x0648, // "و" ,
   0x002D, // "-" Shift+-
   0x002E, // "." .
   0x002F, // "/" /
   0x0030, // "0" 0
   0x0031, // "1" 1
   0x0032, // "2" 2
   0x0033, // "3" 3
   0x0034, // "4" 4
   0x0035, // "5" 5
   0x0036, // "6" 6
   0x0037, // "7" 7
   0x0038, // "8" 8
   0x0039, // "9" 9
   //0x003A, // ":" Shift+;
   0x06A9, // "ک" Shift+;
	//0x0643,  // "ك" ;
   0x06A9, // "ک" ;
   //0x003E, // "<" Shift+,
   0x0648, // "و" Shift+,
   0x003D, // "=" =
   //0x003C, // ">" Shift+.
   0x002E, // "." Shift+.
   0x061F, // "؟" Shift+/
   //0x066C, // "،" Shift+2
   0x0032, // "2" Shift+2
   //0x0624, // "ؤ" Shift+A
   0x0634, // "ش" Shift+A
   //0x200C, // " " Shift+B
   0x0630, // "ذ" Shift+B
   0x0698, // "ژ" Shift+C
   //0x0649, // "ی" Shift+D
   0x06CC, // "ی" Shift+D
	//0x064D, // " " Shift+E
   0x062B, // "ث" Shift+E
   //0x0625, // "إ" Shift+F
   0x0628, // "ب" Shift+F
   //0x0623, // "ًٌٍأ" Shift+G
   0x0644, // "ل" Shift+G
   //0x0622, // "ًٌٍآ" Shift+H
   0x0627, // "ا" Shift+H
   //0x0651, // " " Shift+I
   0x0647, // "ه" Shift+I
   //0x0629, // "ّّة" Shift+J
   0x062A, // "ت" Shift+J
   //0x00BB, // "«" Shift+K
   0x0646, // "ن" Shift+K
   //0x00AB, // "»" Shift+L
   0x0645, // "م" Shift+L
   //0x0621, // "ء" Shift+M
   0x06CC, // "ی" Shift+M
   //0x004E, // "N" Shift+N
   0x062F, // "د" Shift+N
   //0x005D, // "[" Shift+O
   0x062E, // "خ" Shift+O
   //0x005B, // "]" Shift+P
   0x062D, // "ح" Shift+P
   //0x0652, // " " Shift+Q
   0x0636, // "ض" Shift+Q
   //0x064B, // " " Shift+R
   0x0642, // "ق" Shift+R
   //0x0626, // "ئ" Shift+S
   0x0633, // "س" Shift+S
   //0x064F, // " " Shift+T
   0x0641, // "ف" Shift+T
   //0x064E, // " " Shift+U
   0x0639, // "ع" Shift+U
   //0x0056, // "V" Shift+V
   0x0631, // "ر" Shift+V
   //0x064C, // " " Shift+W
   0x0635, // "ص" Shift+W
   //0x0058, // "X" Shift+X
   0x0637, // "ط" Shift+X
   //0x0650, // " " Shift+Y
   0x063A, // "غ" Shift+Y
   //0x0643, // "ك" Shift+Z
   0x0638, // "ظ" Shift+Z
   0x062C, // "ج" [
   0x0698, // "ژ" \
   0x0686, // "چ" ]
   //0x00D7, // "x" Shift+6
   0x0036, // "6" Shift+6
   0x0640, // "-" -
   0x067E, // "پ" ~
   0x0634, // "ش" A
   0x0630, // "ذ" B
   0x0632, // "ز" C
   //0x064A, // "ي" D
   0x06CC, // "ی" D
   0x062B, // "ث" E
   0x0628, // "ب" F
   0x0644, // "ل" G
   0x0627, // "ا" H
   0x0647, // "ه" I
   0x062A, // "ت" J
   0x0646, // "ن" K
   0x0645, // "م" L
   //0x067E, // "پ" M
   0x0621, // "ء" M
   0x062F, // "د" N
   0x062E, // "خ" O
   0x062D, // "ح" P
   0x0636, // "ض" Q
   0x0642, // "ق" R
   0x0633, // "س" S
   0x0641, // "ف" T
   0x0639, // "ع" U
   0x0631, // "ر" V
   0x0635, // "ص" W
   0x0637, // "ط" X
   0x063A, // "غ" Y
   0x0638, // "ظ" Z
   //0x007D, // "{" Shift+[
   0x062C, // "ج" Shift+[
   //0x007C, // "|" Shift+\
   0x067E, // "پ" Shift+\
   //0x007B, // "}" Shift+]
   0x0686, // "چ" Shift+]
   //0x007E // "~" Shift+~
   0x0020, // " " Shift+~
   ],
	Type : true,
	counter : 0
}

FarsiType.enable_disable = function(Dis) {
	var invis, obj;

	if (!Dis.checked)  {
		FarsiType.Type = true;
		invis = 'visible';
	}
	else {
		FarsiType.Type = false;
		invis = 'hidden';
	}

	for (var i=1; i<= FarsiType.counter; i++) {
		obj = document.getElementById('FarsiType_button_' + i);
		obj.style.visibility = invis;
	}
}

FarsiType.init = function() {

	var Inputs = document.getElementsByTagName('INPUT');
	for (var i=0; i<Inputs.length; i++) {
		if (Inputs[i].type.toLowerCase() == 'text' && Inputs[i].lang.toLowerCase() == 'fa') {
			FarsiType.counter++;
			new FarsiType.KeyObject(Inputs[i], FarsiType.counter);
		}
	}

	var Areas = document.getElementsByTagName('TEXTAREA');
	for (var i=0; i<Areas.length; i++) {
		if (Areas[i].lang.toLowerCase() == 'fa') {
			FarsiType.counter++;
			new FarsiType.KeyObject(Areas[i], FarsiType.counter);
		}
	}

	var Dis = document.getElementById('disableFarsiType')
	if (Dis != null) {
		FarsiType.enable_disable (Dis);
		Dis.onclick = new Function( "FarsiType.enable_disable (this);" )
	}
}

FarsiType.KeyObject = function(z, x) {

    z.insertAdjacentHTML("afterEnd", "<div style='display:none'><input type='button' id=FarsiType_button_" + x + " style='border: none; background-image:none;background-color:gray; font-size:10; color:white; font-family:tahoma; padding: 1px; margin: 1px; width: auto; height: auto;' value='FA' /></div>");
    z.bottelm = document.getElementById('FarsiType_button_' + x);

    z.farsi = true;
    z.style.textAlign = "right";
    z.style.direction = "rtl";
    z.bottelm.title = 'Change lang to english';

    setSelectionRange = function(input, selectionStart, selectionEnd) {
        input.focus()
        input.setSelectionRange(selectionStart, selectionEnd)
    }

    isChangeLang = function(e) {
        if (e == null) e = window.event;
        var key = e.keyCode ? e.keyCode : e.charCode;
        if (key == 119) ChangeLang();
    }

    ChangeLang = function() {
        if (z.farsi) {
            z.style.textAlign = "left";
            z.style.direction = "ltr";
            z.farsi = false;
            z.bottelm.value = "EN";
            z.bottelm.title = 'Change lang to persian'
        }
        else {
            z.style.textAlign = "right";
            z.style.direction = "rtl";
            z.farsi = true;
            z.bottelm.value = "FA";
            z.bottelm.title = 'Change lang to english'
        }
        z.focus();
    }

    Convert = function(e) {

        if (FarsiType.Type) {

            if (e == null) e = window.event;
            eElement = (e.srcElement) ? e.srcElement : e.originalTarget;

            var key = e.keyCode ? e.keyCode : e.charCode;
            if (navigator.userAgent.toLowerCase().indexOf('opera') > -1) key = e.which;

            //Gooya>>
            //Prevent Enter
            PreventSubmitOnEnter(e);

            if ((e.charCode != null) && (e.charCode != key)) return;
            if (e.ctrlKey || e.altKey || e.metaKey || key == 13 || key == 27 || key == 8) return;

            //check windows lang
            //alert(key);
            if (key > 128) {
                alert("لطفا زبان ويندوز خود را بر روي انگليسي قرار دهيد\n");
                return false;
            }

            // if Farsi
            if (z.farsi && key > 31 && key < 128) {

                //check CpasLock
                if ((key >= 65 && key <= 90) && !e.shiftKey) {
                    alert("Caps Lock\r\nروشن است. برای تایپ شدن صحیح کاراکترها لطفا کلید را خاموش کنید");
                    return false;
                }
                else if ((key >= 97 && key <= 122) && e.shiftKey) {
                    alert("Caps Lock\r\nروشن است. برای تایپ شدن صحیح کاراکترها لطفا کلید را خاموش کنید");
                    return false;
                }

                // Shift-space -> ZWNJ
                if (key == 32 && e.shiftKey)
                    key = 8204;
                else
                    key = FarsiType.farsiKey[key - 32];

                // to farsi
                try {

                    //Mozila , firefox , Chrome
                    if (navigator.appName == "Netscape") {
                        e.initKeyEvent("keypress", true, true, document.defaultView, false, false, true, false, 0, key, eElement);
                    }
                    else // IE
                    {
                        var ieVersion = getInternetExplorerVersion();
                        if (ieVersion >= 9) {
                            e.initKeyEvent("keypress", true, true, document.defaultView, false, false, true, false, 0, key, eElement);
                        }
                        else {
                            e.keyCode = key;
                        }
                    }
                }
                catch (error) {
                    try {
                        // Gecko before
                        e.initKeyEvent("keypress", true, true, document.defaultView, false, false, true, false, 0, key, eElement);
                    }
                    catch (error) {
                        try {
                            // Gecko & Opera now
                            var nScrollTop = eElement.scrollTop;
                            var nScrollLeft = eElement.scrollLeft;
                            var nScrollWidth = eElement.scrollWidth;

                            replaceString = String.fromCharCode(key);

                            var selectionStart = eElement.selectionStart;
                            var selectionEnd = eElement.selectionEnd;
                            eElement.value = eElement.value.substring(0, selectionStart) + replaceString + eElement.value.substring(selectionEnd);
                            setSelectionRange(eElement, selectionStart + replaceString.length, selectionStart + replaceString.length);

                            var nW = eElement.scrollWidth - nScrollWidth;
                            if (eElement.scrollTop == 0) { eElement.scrollTop = nScrollTop }

                            e.preventDefault()
                        }
                        catch (error) {
                            // else no farsi type!
                            alert('Sorry! no FarsiType support')
                            FarsiType.Type = false;

                            var Dis = document.getElementById('disableFarsiType')
                            if (Dis != null) {
                                Dis.disabled = true;
                                Dis.checked = true;
                            }

                            for (var i = 1; i <= FarsiType.counter; i++) {
                                document.getElementById('FarsiType_button_' + i).style.visibility = 'hidden';
                            }
                            return false;
                        }
                    }
                }
            }
        }
        return true;
    }

    z.bottelm.onmouseup = ChangeLang;
    z.onkeydown = isChangeLang;
    z.onkeypress = Convert;
}

if (window.attachEvent) {
	window.attachEvent('onload', FarsiType.init)
}
else if (window.addEventListener) {
	window.addEventListener('load', FarsiType.init, false)
}

function PreventSubmitOnEnter(e) {
    e = e || event;
    if (e.keyCode === 13) {
        // prevent default behavior for enter key (submit)
        if (e.preventDefault) {
            e.preventDefault();
        }
        else if (e.stopPropagation) {
            e.stopPropagation();
        }
        else {
            e.returnValue = false;
        }
    }
}

