/*
Farsi (Persian) Input for HTML & XHTML pages
This script returns Farsi (Persian) characters to "input" tags which have "fa" value in lang
attribute.
Also user can switch between Farsi and English by pressing "F9".
by M.R. Baratnejad
MRBaratnejad@msn.com
*/

function a_events(){
	var input_handler_kp, input_handler_ku;
	var blnAt, i, j, oForm, oInput;
	for (i = 0; i < document.forms.length; i++){
		oForm = document.forms[i];
		blnAt = false;
		for (j = 0; j < oForm.elements.length; j++){
			oInput = oForm.elements[j];
			if (oInput.getAttribute("lang") == "fa"){
				oInput.lang = "fa";
				oInput.onkeypress = fa_key;
				oInput.onkeyup = lang_sel;
			}
			else{
				if (oInput.getAttribute("lang") !== "en"){
				oInput.lang = "en";
				oInput.onkeyup = lang_sel;
				}
			}
		}
	}
	oForm = null;
	oInput = null;
}


function fa_key(e){
	e = (e) ? e : ((event) ? event : null);
	var s_prop = (e["keyCode"]) ? "keyCode" : ((e["charCode"]) ? "charCode" : ((e["which"]) ? "which" : null));
	switch (e[s_prop]){
		case 8:					// Backspace
			e[s_prop] = 8; break;
		case 9:					// Horizontal tab
			e[s_prop] = 9; break;
		case 10:					// Line feed
			e[s_prop] = 10; break;
		case 13:					// Carriage Return
			e[s_prop] = 13; break;
		case 32:					// Space | [space]
			e[s_prop] = 32; break;
		case 33:					// Exclamation mark | !
			e[s_prop] = 33; break;
		case 34:					// Quotation mark | "
			e[s_prop] = 34; break;
		case 35:					// Number sign | #
			e[s_prop] = 35; break;
		case 36:					// Dollar sign | $
			e[s_prop] = 36; break;
		case 37:					// Percent sign | %
			e[s_prop] = 1642; break;
		case 38:					// Ampersand | &
			e[s_prop] = 38; break;
		case 39:					// Apostrophe | '
			e[s_prop] = 1711; break;
		case 40:					// Left parenthesis | (
			e[s_prop] = 41; break;
		case 41:					// Right parenthesis | )
			e[s_prop] = 40; break;
		case 42:					// Asterisk | *
			e[s_prop] = 1645; break;
		case 43:					// Plus sign | +
			e[s_prop] = 43; break;
		case 44:					// Comma | ,
			e[s_prop] = 1608; break;
		case 45:					// Hyphen | -
			e[s_prop] = 45; break;
		case 46:					// Period (fullstop) | .
			e[s_prop] = 46; break;
		case 47:					// Solidus (slash) | /
			e[s_prop] = 47; break;
		case 48:					// Digit 0 | 0
			e[s_prop] = 1776; break;					//1632
		case 49:					// Digit 1 | 1
			e[s_prop] = 1777; break;					//1633
		case 50:					// Digit 2 | 2
			e[s_prop] = 1778; break;					//1634
		case 51:					// Digit 3 | 3
			e[s_prop] = 1779; break;					//1635
		case 52:					// Digit 4 | 4
			e[s_prop] = 1780; break;					//1636
		case 53:					// Digit 5 | 5
			e[s_prop] = 1781; break;					//1637
		case 54:					// Digit 6 | 6
			e[s_prop] = 1782; break;					//1638
		case 55:					// Digit 7 | 7
			e[s_prop] = 1783; break;					//1639
		case 56:					// Digit 8 | 8
			e[s_prop] = 1784; break;					//1640
		case 57:					// Digit 9 | 9
			e[s_prop] = 1785; break;					//1641
		case 58:					// Colon | :
			e[s_prop] = 58; break;
		case 59:					// Semicolon | ;
			e[s_prop] = 1705; break;
		case 60:					// Less than | <
			e[s_prop] = 60; break;
		case 61:					// Equals sign | =
			e[s_prop] = 61; break;
		case 62:					// Greater than | >
			e[s_prop] = 62; break;
		case 63:					// Question mark | ?
			e[s_prop] = 1567; break;
		case 64:					// Commercial at | @
			e[s_prop] = 64; break;
		case 65:					// Capital A | A
			if (e.shiftKey){
				e[s_prop] = 1614;
			}
			else{
				e[s_prop] = 1588;
			}
			break;
		case 66:					// Capital B | B
			if (e.shiftKey){
				e[s_prop] = 1573;
			}
			else{
				e[s_prop] = 1584;
			}
			break;
		case 67:					// Capital C | C
			if (e.shiftKey){
				e[s_prop] = 1688;
			}
			else{
				e[s_prop] = 1586;
			}
			break;
		case 68:					// Capital D | D
			if (e.shiftKey){
				e[s_prop] = 1616;
			}
			else{
				e[s_prop] = 1740;
			}
			break;
		case 69:					// Capital E | E
			if (e.shiftKey){
				e[s_prop] = 1613;
			}
			else{
				e[s_prop] = 1579;
			}
			break;
		case 70:					// Capital F | F
			if (e.shiftKey){
				e[s_prop] = 1617;
			}
			else{
				e[s_prop] = 1576;
			}
			break;
		case 71:					// Capital G | G
			if (e.shiftKey){
				e[s_prop] = 1618;
			}
			else{
				e[s_prop] = 1604;
			}
			break;
		case 72:					// Capital H | H
			if (e.shiftKey){
				e[s_prop] = 1570;
			}
			else{
				e[s_prop] = 1575;
			}
			break;
		case 73:					// Capital I | I
			if (e.shiftKey){
				e[s_prop] = 91;
			}
			else{
				e[s_prop] = 1607;
			}
			break;
		case 74:					// Capital J | J
			if (e.shiftKey){
				e[s_prop] = 1600;
			}
			else{
				e[s_prop] = 1578;
			}
			break;
		case 75:					// Capital K | K
			if (e.shiftKey){
				e[s_prop] = 171;
			}
			else{
				e[s_prop] = 1606;
			}
			break;
		case 76:					// Capital L | L
			if (e.shiftKey){
				e[s_prop] = 187;
			}
			else{
				e[s_prop] = 1605;
			}
			break;
		case 77:					// Capital M | M
			if (e.shiftKey){
				e[s_prop] = 1569;
			}
			else{
				e[s_prop] = 1574;
			}
			break;
		case 78:					// Capital N | N
			if (e.shiftKey){
				e[s_prop] = 1571;
			}
			else{
				e[s_prop] = 1583;
			}
			break;
		case 79:					// Capital O | O
			if (e.shiftKey){
				e[s_prop] = 93;
			}
			else{
				e[s_prop] = 1582;
			}
			break;
		case 80:					// Capital P | P
			if (e.shiftKey){
				e[s_prop] = 92;
			}
			else{
				e[s_prop] = 1581;
			}
			break;
		case 81:					// Capital Q | Q
			if (e.shiftKey){
				e[s_prop] = 1611;
			}
			else{
				e[s_prop] = 1590;
			}
			break;
		case 82:					// Capital R | R
			if (e.shiftKey){
				e[s_prop] = 1643;
			}
			else{
				e[s_prop] = 1602;
			}
			break;
		case 83:					// Capital S | S
			if (e.shiftKey){
				e[s_prop] = 1615;
			}
			else{
				e[s_prop] = 1587;
			}
			break;
		case 84:					// Capital T | T
			if (e.shiftKey){
				e[s_prop] = 1548;
			}
			else{
				e[s_prop] = 1601;
			}
			break;
		case 85:					// Capital U | U
			if (e.shiftKey){
				e[s_prop] = 44;
			}
			else{
				e[s_prop] = 1593;
			}
			break;
		case 86:					// Capital V | V
			if (e.shiftKey){
				e[s_prop] = 1572;
			}
			else{
				e[s_prop] = 1585;
			}
			break;
		case 87:					// Capital W | W
			if (e.shiftKey){
				e[s_prop] = 1612;
			}
			else{
				e[s_prop] = 1589;
			}
			break;
		case 88:					// Capital X | X
			if (e.shiftKey){
				e[s_prop] = 1610;
			}
			else{
				e[s_prop] = 1591;
			}
			break;
		case 89:					// Capital Y | Y
			if (e.shiftKey){
				e[s_prop] = 1563;
			}
			else{
				e[s_prop] = 1594;
			}
			break;
		case 90:					// Capital Z | Z
			if (e.shiftKey){
				e[s_prop] = 1577;
			}
			else{
				e[s_prop] = 1592;
			}
			break;
		case 91:					// Left square bracket | [
			e[s_prop] = 1580; break;
		case 92:					// Reverse solidus (backslash) | \
			e[s_prop] = 1662; break;
		case 93:					// Right square bracket | ]
			e[s_prop] = 1670; break;
		case 94:					// Caret | ^
			e[s_prop] = 94; break;
		case 95:					// Horizontal bar (Underscore) | [underscore]
			e[s_prop] = 95; break;
		case 96:					// Acute accent | `
			e[s_prop] = 247; break;
		case 97:					// Small a | a
			if (e.shiftKey){
				e[s_prop] = 1614;
			}
			else{
				e[s_prop] = 1588;
			}
			break;
		case 98:					// Small b | b
			if (e.shiftKey){
				e[s_prop] = 1573;
			}
			else{
				e[s_prop] = 1584;
			}
			break;
		case 99:					// Small c | c
			if (e.shiftKey){
				e[s_prop] = 1688;
			}
			else{
				e[s_prop] = 1586;
			}
			break;
		case 100:					// Small d | d
			if (e.shiftKey){
				e[s_prop] = 1616;
			}
			else{
				e[s_prop] = 1740;
			}
			break;
		case 101:					// Small e | e
			if (e.shiftKey){
				e[s_prop] = 1613;
			}
			else{
				e[s_prop] = 1579;
			}
			break;
		case 102:					// Small f | f
			if (e.shiftKey){
				e[s_prop] = 1617;
			}
			else{
				e[s_prop] = 1576;
			}
			break;
		case 103:					// Small g | g
			if (e.shiftKey){
				e[s_prop] = 1618;
			}
			else{
				e[s_prop] = 1604;
			}
			break;
		case 104:					// Small h | h
			if (e.shiftKey){
				e[s_prop] = 1570;
			}
			else{
				e[s_prop] = 1575;
			}
			break;
		case 105:					// Small i | i
			if (e.shiftKey){
				e[s_prop] = 91;
			}
			else{
				e[s_prop] = 1607;
			}
			break;
		case 106:					// Small j | j
			if (e.shiftKey){
				e[s_prop] = 1600;
			}
			else{
				e[s_prop] = 1578;
			}
			break;
		case 107:					// Small k | k
			if (e.shiftKey){
				e[s_prop] = 171;
			}
			else{
				e[s_prop] = 1606;
			}
			break;
		case 108:					// Small l | l
			if (e.shiftKey){
				e[s_prop] = 187;
			}
			else{
				e[s_prop] = 1605;
			}
			break;
		case 109:					// Small m | m
			if (e.shiftKey){
				e[s_prop] = 1569;
			}
			else{
				e[s_prop] = 1574;
			}
			break;
		case 110:					// Small n | n
			if (e.shiftKey){
				e[s_prop] = 1571;
			}
			else{
				e[s_prop] = 1583;
			}
			break;
		case 111:					// Small o | o
			if (e.shiftKey){
				e[s_prop] = 93;
			}
			else{
				e[s_prop] = 1582;
			}
			break;
		case 112:					// Small p | p
			if (e.shiftKey){
				e[s_prop] = 92;
			}
			else{
				e[s_prop] = 1581;
			}
			break;
		case 113:					// Small q | q
			if (e.shiftKey){
				e[s_prop] = 1611;
			}
			else{
				e[s_prop] = 1590;
			}
			break;
		case 114:					// Small r | r
			if (e.shiftKey){
				e[s_prop] = 1585;
			}
			else{
				e[s_prop] = 1602;
			}
			break;
		case 115:					// Small s | s
			if (e.shiftKey){
				e[s_prop] = 1615;
			}
			else{
				e[s_prop] = 1587;
			}
			break;
		case 116:					// Small t | t
			if (e.shiftKey){
				e[s_prop] = 1548;
			}
			else{
				e[s_prop] = 1601;
			}
			break;
		case 117:					// Small u | u
			if (e.shiftKey){
				e[s_prop] = 44;
			}
			else{
				e[s_prop] = 1593;
			}
			break;
		case 118:					// Small v | v
			if (e.shiftKey){
				e[s_prop] = 1572;
			}
			else{
				e[s_prop] = 1585;
			}
			break;
		case 119:					// Small w | w
			if (e.shiftKey){
				e[s_prop] = 1612;
			}
			else{
				e[s_prop] = 1589;
			}
			break;
		case 120:					// Small x | x
			if (e.shiftKey){
				e[s_prop] = 1610;
			}
			else{
				e[s_prop] = 1591;
			}
			break;
		case 121:					// Small y | y
			if (e.shiftKey){
				e[s_prop] = 1563;
			}
			else{
				e[s_prop] = 1594;
			}
			break;
		case 122:					// Small z | z
			if (e.shiftKey){
				e[s_prop] = 1577;
			}
			else{
				e[s_prop] = 1592;
			}
			break;
		case 123:					// Left curly brace | {
			e[s_prop] = 123; break;
		case 124:					// Vertical bar | |
			e[s_prop] = 124; break;
		case 125:					// Right curly brace | }
			e[s_prop] = 125; break;
		case 126:					// Tilde | ~
			e[s_prop] = 215; break;
		case 160:					// Nonbreaking space | 
			e[s_prop] = 160; break;
		}
		return (e[s_prop]);
}

function lang_sel(e){
	e = (e) ? e : ((event) ? event : null);
	var s_prop = (e["keyCode"]) ? "keyCode" : ((e["charCode"]) ? "charCode" : ((e["which"]) ? "which" : null));
	var objIn = (e["srcElement"]) ? e["srcElement"] : ((e["target"]) ? e["target"] : null );
	if (e[s_prop] == 120){
		if (objIn.getAttribute("lang") == "fa"){
			objIn.lang = "en";
			objIn.onkeypress = null;
		}
		else{
			objIn.lang = "fa";
			objIn.onkeypress = fa_key;
		}
	}
}


if(window.addEventListener){
	window.addEventListener('load',a_events,false);
}else if(document.addEventListener){
	document.addEventListener('load',a_events,false);
}else if(window.attachEvent){
	window.attachEvent('onload',a_events);
}