var lang = 1;	// 1: Farsi, 0: English

// Farsi keyboard map based on ISIRI-2901

var farsikey = [
   0x0020, 0x0021, 0x061B, 0x066B, 0x00A4, 0x066A, 0x060C, 0x06AF,
   0x0029, 0x0028, 0x00D7, 0x002B, 0x0648, 0x002D, 0x002E, 0x002F,
   0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667,
   0x0668, 0x0669, 0x003A, 0x0643, 0x0624, 0x003D, 0x0623, 0x061F,
   0x05F4, 0x0634, 0x0630, 0x0632, 0x064A, 0x062B, 0x0628, 0x0644,
   0x0622, 0x0647, 0x062A, 0x0646, 0x0645, 0x0621, 0x062F, 0x062E,
   0x062D, 0x0636, 0x0642, 0x0633, 0x0641, 0x0639, 0x0631, 0x0635,
   0x0637, 0x063A, 0x0638, 0x062C, 0x0698, 0x0686, 0x003A, 0x0640,
   0x067E, 0x0634, 0x0630, 0x0632, 0x064A, 0x062B, 0x0628, 0x0644,
   0x0627, 0x0647, 0x062A, 0x0646, 0x0645, 0x0626, 0x062F, 0x062E,
   0x062D, 0x0636, 0x0642, 0x0633, 0x0641, 0x0639, 0x0631, 0x0635,
   0x0637, 0x063A, 0x0638, 0x007D, 0x007C, 0x007B, 0x007E
];

var englishkey = new Array(
  63,      1568,	0x0059,	0x0048,	0x004D,	0x003C,	66,	109,	104,	102,	
  0x0049,  106,	101,	93,	112,	111,	110,	98,	118,	99,	
  115,     97,	119,	113,	120,	122,	117,	121,	1595,	1596,	
  1597,	1598,	1599,	74,	116,	114,	59,	0x0047,	108,	107,	
  105,	44,	0x0044,	100,	0x0051,	87,	0x0053,	0x0051,	0x0045,	0x0041,	
  70,	0x0058,	1619,	1620,	1621,	1622,	1623,	1623,	1625,	1626,	
  1627,	1628,	1629,	1630,	1631,	48,	49,	50,	51,	52,	
  53,	54,	55,	56,	57,	1642,	1643,	1644,	1645,	1646,	
  1647,	1648,	1649,	1650,	1651,	1652,	1653,	1654,	1655,	1656,	
  1657,	1658,	1659,	1660,	1661,	92,	1663,	1664,	1665,	1666,	
  1667,	1668,	1669,	91,	1671,	1672,	1673,	1674,	1675,	1676,	
  1677,	1678,	1679,	1680,	1681,	1682,	1683,	1684,	1685,	1686,	
  1687,	67,	1689,	1690,	1691,	1692,	1693,	1694,	1695,	1696,	
  1697,	1698,	1699,	1700,	1701,	1702,	1703,	1704,	93,	1706,	
  1707,	1708,	1709,	1710,	39,	1712,	1713,	1714,	1715,	1716,	
  1717,	1718,	1719,	1720,	1721,	1722,	1723,	1724,	1725,	1726,	
  1727,	1728,	1729,	1730,	1731,	1732,	1733,	1734,	1735,	1736,	
  1737,	1738,	1739,	100);

function isFarsiAlphabet(key){
	if (String.fromCharCode(key).match(/[ \u0621-\u064A\u06AF\u0698\u067E\u0686]/)) return true;
	return false;
}


function toFarsiNumber(key){
	if (key>=1632 && key<=1642) return key;
   	if (String.fromCharCode(key).match(/[0-9]/))
   		return 1632 + (key - 48);
	return 0;
}

function switchToEnglish(){
 lang = 0;
 window.defaultStatus = "English Mode";
// setCookie("defaultLang", lang);
}
function switchToFarsi(){
 lang = 1;
 window.defaultStatus = "Farsi Mode";
// setCookie("defaultLang", lang);
}
// on Alt+Shift, switch language
function FarsiKeyDown()
{
   if (window.event.shiftKey && window.event.altKey) { 
      if (lang == 0) switchToFarsi();
      else switchToEnglish();
      return false;
      
   }
   return true;
}

function beforeKeyChange(){
   var key = window.event.keyCode;
//-------------- Field Type Check
   var fieldType = "usual";
   var nyolength;
   if (document.activeElement){
   	if (document.activeElement.type == "file") return true;
   	if (document.activeElement.getAttribute("nyotype"))
   		fieldType = document.activeElement.getAttribute("nyotype");
   	if (document.activeElement.getAttribute("nyolength"))
   		nyolength = document.activeElement.getAttribute("nyolength");
   	else
   		if (document.activeElement.getAttribute("maxlength"))
   		nyolength = document.activeElement.getAttribute("maxlength");
	if(document.activeElement.value && nyolength>0)
	   	if(document.activeElement.value.length >= nyolength){
//			window.event.keyCode = 0;
//	   		return true;
   		}
   }

   if (fieldType == "english")	return true;
   if (fieldType == "email"){
	   	if (String.fromCharCode(key).match(/[a-zA-Z0-9@._-]/)) return true;
		window.event.keyCode = 0;
   		return true;
 	}
   	
   if (fieldType == "certno"){
   		window.event.keyCode = toFarsiNumber(key);
   		return true;
   	}

   if (fieldType == "integer"){
   		window.event.keyCode = toFarsiNumber(key);
   		return true;
   	}

   if (fieldType == "real"){
	   	if (String.fromCharCode(key).match(/[.\/]/)) return true;
   		window.event.keyCode = toFarsiNumber(key);
   		return true;
   	}

   if (fieldType == "tel"){
	   	if (String.fromCharCode(key).match(/[()+-]/)) return true;
   		window.event.keyCode = toFarsiNumber(key);
   		return true;
   	}

   if (fieldType == "nationalcode" || fieldType == "postalcode"){
   		window.event.keyCode = toFarsiNumber(key);
   		if (document.activeElement.value.length>9) window.event.keyCode=0;
   		return true;
   	}
   	
   if (fieldType == "ealphabet"){
	   	if (String.fromCharCode(key).match(/[ a-zA-Z]/)) return true;
   		window.event.keyCode = 0;
   		return true;
   	}
   if (fieldType == "ealphnum"){
	   	if (String.fromCharCode(key).match(/[ a-zA-Z0-9]/)) return true;
   		window.event.keyCode = 0;
   		return true;
   	}

   if (fieldType == "link"){
   		return true;
   	}

   if (fieldType == "eusername"){
	   	if (String.fromCharCode(key).match(/[a-zA-Z0-9_.]/)) return true;
   		window.event.keyCode = 0;
   		return true;
   	}
//-------------------
}

function afterKeyChange(){
   var key = window.event.keyCode;
   var fieldType = "usual";
   var nyolength = 5000;
   if (document.activeElement){
   	if (document.activeElement.getAttribute("nyotype"))
   		fieldType = document.activeElement.getAttribute("nyotype");
   	if (document.activeElement.getAttribute("nyolength"))
   		nyolength = document.activeElement.getAttribute("nyolength");
   }

   if (fieldType == "username"){
   		if (key==32){
	   		window.event.keyCode = 0;
	   		return true;
	   	}
   			
	   	if (isFarsiAlphabet(key) || toFarsiNumber(key)) return true;
	   	if (String.fromCharCode(key).match(/[a-zA-Z0-9_.]/)) return true;
   		window.event.keyCode = 0;
   		return true;
   	}

   if (fieldType == "falphabet"){
   	if (isFarsiAlphabet(key)) return;
   	window.event.keyCode = 0;
   	return;
	}
   if (fieldType == "alphabet"){
	if (String.fromCharCode(key).match(/[ a-zA-Z]/)) return;
   	if (isFarsiAlphabet(key)) return;
   	window.event.keyCode = 0;
   	return;
   	}
}

// change the Farsi
function FarsiKeyPress()
{
	if (window.event.keyCode==13) return;
	if (beforeKeyChange()==true) return;
	var key = window.event.keyCode;

/*	if (document.activeElement){
		if (getCookie("defaultLang")==null){
			switchToFarsi();
		}
		var lang1 = getCookie("defaultLang");
		if (lang1!=lang){
			if (lang1==1) switchToFarsi();
			if (lang1==0) switchToEnglish();
		}
		
	}

*/
 	if ( lang == 0){ 
	  if((key>1400)&&(key<1741)&&englishkey[key-1567]){
	  	window.event.keyCode=englishkey[key-1567];
	 } else{
	  	switch(key){
	  		case 44:window.event.keyCode=85;break;
	  		case 91:window.event.keyCode=73;break;
	  		case 92:window.event.keyCode=80;break;
	  		case 93:window.event.keyCode=51;break;
	  		case 171:window.event.keyCode=75;break;
	  		case 187:window.event.keyCode=76;break;
	  		case 1548:window.event.keyCode=84;break;
	  		case 1563:window.event.keyCode=89;break;
	  		case 1604:window.event.keyCode=103;break;
	  	}
	  }
	afterKeyChange();
	return;
	}
	
   if (lang == 1) { //If Farsi
	   // Avoid processing if control or higher than ASCII (i.e., in Arabic Windows)
	   if (key < 0x0020 || key >= 0x00FF){
	  	switch(key){
	  		case 1740:window.event.keyCode=1610;break;
	  		case 1705:window.event.keyCode=1603;break;
	  	}
		afterKeyChange();
		return;
	   }
	   if (key == 0x0020 && window.event.shiftKey) // Shift-space -> ZWNJ
	         window.event.keyCode = 0x200C;
	   else if(key == 247)
		window.event.keyCode=1662;	   
	   else{

	       window.event.keyCode = farsikey[key - 0x0020];
	   }
   }
   afterKeyChange();
   return true;
}


// integer, real, email, english, tel, nationalcode, link, alphabet, falphabet, ealphabet
document.onkeydown=FarsiKeyDown;
document.onkeypress=FarsiKeyPress;

