// Urdu OpenPad
// Written by Nabeel Hasan Naqvi (simunaqv [at] gmail [dot] com)
// Visit the support forums at http://www.urduweb.org/mehfil
// This code is public domain. Redistribution and use of this code, with or without modification, is permitted.

var isIE;
var isGecko;
var isSafari;
var isKonqueror;
var CurrentKeyboard;

var LAlt;
var RAlt;

var RShift;
var LShift;

var LCtrl;
var RCtrl;
var HelpArea;

var kbNormal=1;
var kbShift=2;		
var kbAlt=3;
var kbCtrl=4;
var kbAltGr=5;
var bToggleFlag=0;
var CurrentKeyboardState=1;

var currEdit=null;
var langSel=1;
var IsUrdu=1;
var bCtrlState=0;
var bAltState=0;


var CurrentKeyboard;
//var Diacritics=String.fromCharCode(0x0650)+String.fromCharCode(0x064E)+String.fromCharCode(0x064B)+String.fromCharCode(0x064F)+String.fromCharCode(0x064D)+String.fromCharCode(0x064C)+String.fromCharCode(0x0651)+String.fromCharCode(0x0652)+String.fromCharCode(0x0670);
var Diacritics=new Array(0x0650, 0x064E,0x064B, 0x064F, 0x064D, 0x064C, 0x0651, 0x0652, 0x0670);
var charSingleQuote=String.fromCharCode(39);
var charDoubleQuote=String.fromCharCode(34);
var ValidChars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'+'-=;,.[]/\\'+charSingleQuote;

function isDiacritic(c)
{
	//alert(Diacritics);
	//if(Diacritics.indexOf(c)>=0) return true;
	for(i=0; i<Diacritics.length; i++)
	{
		if(c== Diacritics[i]) 
		{
			return true;
		}
	}
	return false;
}

function charCode(strChar)
{
	return strChar.charCodeAt(0);
}

function Key(x, y,z )
{
	this.normal=0;
	this.shifted=0;
	this.alt=0;
	this.normal=x;
	if(arguments.length>1)
	{
		this.shifted= y;
	}
	
	if(arguments.length>2)
	{
		this.alt= z;
	}
}

function KeyHelp(x,y)
{
	this.normal=x;
	this.shifted=y
}


var UrduPhonetic= new Array();
UrduPhonetic['a']=new Key(0x0627, 0x0622);
UrduPhonetic['b']=new Key(0x0628, 0x0628);
UrduPhonetic['c']=new Key(0x0686, 0x062B);
UrduPhonetic['d']=new Key(0x062F, 0x0688);
UrduPhonetic['e']=new Key(0x0639, 0x0651);
UrduPhonetic['f']=new Key(0x0641, 0x64D);
UrduPhonetic['g']=new Key(0x06AF, 0x063A);
UrduPhonetic['h']=new Key(0x06BE, 0x062D);
UrduPhonetic['i']=new Key(0x06CC, 0x0670);
UrduPhonetic['j']=new Key(0x062C, 0x0636);
UrduPhonetic['k']=new Key(0x06A9, 0x062E);
UrduPhonetic['l']=new Key(0x0644, 0x0628);
UrduPhonetic['m']=new Key(0x0645, 0x64B);
UrduPhonetic['n']=new Key(0x0646, 0x06BA);
UrduPhonetic['o']=new Key(0x06C1, 0x06C3);
UrduPhonetic['p']=new Key(0x067E, 0x064F);
UrduPhonetic['q']=new Key(0x0642, 0x0628);
UrduPhonetic['r']=new Key(0x0631, 0x0691);
UrduPhonetic['s']=new Key(0x0633 , 0x0635);
UrduPhonetic['t']=new Key(0x062A , 0x0679);
UrduPhonetic['u']=new Key(0x0626 , 0x0621);
UrduPhonetic['v']=new Key(0x0637, 0x0638);
UrduPhonetic['w']=new Key(0x0648, 0x0624);
UrduPhonetic['x']=new Key(0x0634, 0x0698);
UrduPhonetic['y']=new Key(0x06D2, 0x06D2);
UrduPhonetic['z']=new Key(0x0632, 0x0630);
/*UrduPhonetic['0']=new Key(0x660, charCode(')'));
UrduPhonetic['1']=new Key(0x661, charCode('!'));
UrduPhonetic['2']=new Key(0x662, charCode('@'));
UrduPhonetic['3']=new Key(0x663, charCode('#'));
UrduPhonetic['4']=new Key(0x664, charCode('$'));
UrduPhonetic['5']=new Key(0x665, charCode('%'));
UrduPhonetic['6']=new Key(0x666, charCode('^'));
UrduPhonetic['7']=new Key(0x667, charCode('&'));
UrduPhonetic['8']=new Key(0x668, charCode('*'));
UrduPhonetic['9']=new Key(0x669, charCode('('));*/
UrduPhonetic['0']=new Key(0x0030, charCode(')'));
UrduPhonetic['1']=new Key(0x0031, charCode('!'));
UrduPhonetic['2']=new Key(0x0032, charCode('@'));
UrduPhonetic['3']=new Key(0x0033, charCode('#'));
UrduPhonetic['4']=new Key(0x0034, charCode('$'));
UrduPhonetic['5']=new Key(0x0035, charCode('%'));
UrduPhonetic['6']=new Key(0x0036, charCode('^'));
UrduPhonetic['7']=new Key(0x0037, charCode('&'));
UrduPhonetic['8']=new Key(0x0038, charCode('*'));
UrduPhonetic['9']=new Key(0x0039, charCode('('));
UrduPhonetic['=']=new Key(0x03D, 0x02B);
UrduPhonetic['-']=new Key(0x002D, 0x0640);
UrduPhonetic[',']=new Key(0x060C, 0x064E);
UrduPhonetic['.']=new Key(0x06D4, 0x0650);
UrduPhonetic['/']=new Key(0x002F, 0x061F);
UrduPhonetic['\\']=new Key(0x0674);
UrduPhonetic[';']=new Key(0x061B, 58);
UrduPhonetic['[']=new Key(0x64C);
UrduPhonetic[']']=new Key(0x0652);
UrduPhonetic[charSingleQuote]=new Key(0x2018, 0x201C);
UrduPhonetic['~']=new Key(0x2019, 0x201D);
UrduPhonetic[' ']=new Key(32);

var Sindhi= new Array();
Sindhi['a']=new Key(0x0627, 0x0622);
Sindhi['b']=new Key(0x0628, 0x067B);
Sindhi['c']=new Key(0x0637, 0x0638);
Sindhi['d']=new Key(0x062F, 0x068A);
Sindhi['e']=new Key(0x064A, 0x0650);
Sindhi['f']=new Key(0x0641);
Sindhi['g']=new Key(0x06AF);
Sindhi['h']=new Key(0x062C);
Sindhi['i']=new Key(0x06B3, 0x06BE);
Sindhi['j']=new Key(0x0647, 0x062D);
Sindhi['k']=new Key(0x06AA, 0x003A);
Sindhi['l']=new Key(0x0644, 0xFEFB);
Sindhi['m']=new Key(0x0645, 0x06FE);
Sindhi['n']=new Key(0x0646, 0x06BB);
Sindhi['o']=new Key(0x0648, 0x064F);
Sindhi['p']=new Key(0x067E, 0x06A6);
Sindhi['q']=new Key(0x0642, 0x064E);
Sindhi['r']=new Key(0x0631, 0x0699);
Sindhi['s']=new Key(0x0633 , 0x0634);
Sindhi['t']=new Key(0x062A , 0x067D);
Sindhi['u']=new Key(0x0639 , 0x063A);
Sindhi['v']=new Key(0x0680, 0x0621);
Sindhi['w']=new Key(0x0635, 0x0636);
Sindhi['x']=new Key(0x062E, 0x0651);
Sindhi['y']=new Key(0x067F, 0x062B);
Sindhi['z']=new Key(0x0632, 0x0630);
Sindhi['0']=new Key(0x6F0, 0x0029);
Sindhi['1']=new Key(0x6F1, 0x0670);
Sindhi['2']=new Key(0x6F2, 0x064B);
Sindhi['3']=new Key(0x6F3, 0x064C);
Sindhi['4']=new Key(0x6F4, 0x002F);
Sindhi['5']=new Key(0x6F5, 0x066A);
Sindhi['6']=new Key(0x6F6, 0x003D);
Sindhi['7']=new Key(0x6F7, 0x06FD);
Sindhi['8']=new Key(0x6F8, 0x0624);
Sindhi['9']=new Key(0x6F9, 0x0028);
Sindhi['=']=new Key(0x068C, 0x002B);
Sindhi['-']=new Key(0x068F, 0x002D);
Sindhi[',']=new Key(0x060C, 0x201C);
Sindhi['.']=new Key(0x002E, 0x201D);
Sindhi['/']=new Key(0x0626, 0x061F);
Sindhi['\\']=new Key(0x068D, 0x067A);
Sindhi[';']=new Key(0x06A9, 0x204F);
Sindhi['[']=new Key(0x0687, 0x684);
Sindhi[']']=new Key(0x0686, 0x0683);
Sindhi[charSingleQuote]=new Key(0x06B1, 0x0640);
Sindhi['~']=new Key(0x2019, 0x2018);
Sindhi[' ']=new Key(32);

var Pashto= new Array();
Pashto['a']=new Key(0x0634, 0x069A);
Pashto['b']=new Key(0x0630, 0x200C, 0x0625);
Pashto['c']=new Key(0x0632, 0x0698, 0x0655);
Pashto['d']=new Key(0x06CC , 0x064A, 0x0649);
Pashto['e']=new Key(0x062B, 0x064D, 0x20AC);
Pashto['f']=new Key(0x0628, 0x067E, 0x06BA);
Pashto['g']=new Key(0x0644, 0x0623, 0x06B7);
Pashto['h']=new Key(0x0627, 0x0622, 0x0671);
Pashto['i']=new Key(0x0647, 0x0651, 0xE659);
Pashto['j']=new Key(0x062A, 0x067C, 0x0679);
Pashto['k']=new Key(0x0646, 0x06BC, 0x003E);
Pashto['l']=new Key(0x0645, 0x0629, 0x003C);
Pashto['m']=new Key(0x0693, 0x0624, 0x0691);
Pashto['n']=new Key(0x062F, 0x0689, 0x0688);
Pashto['o']=new Key(0x062E, 0x0681, 0x0027);
Pashto['p']=new Key(0x062D, 0x0685, 0x0022);
Pashto['q']=new Key(0x0636, 0x0652, 0x00B0);
Pashto['r']=new Key(0x0642, 0x064B, 0xFD3E);
Pashto['s']=new Key(0x0633, 0x0626, 0x06D2);
Pashto['t']=new Key(0x0641 , 0x064F, 0x0656);
Pashto['u']=new Key(0x0639 , 0x064E, 0xE659);
Pashto['v']=new Key(0x0631, 0x0621, 0x0654);
Pashto['w']=new Key(0x0635, 0x064C, 0x0653);
Pashto['x']=new Key(0x06D0, 0x0637, 0x003B);
Pashto['y']=new Key(0x063A, 0x0650, 0x656);
Pashto['z']=new Key(0x06CD, 0x0638, 0x003F);
Pashto['0']=new Key(0x06F0, 0x0028, 0x200F);
Pashto['1']=new Key(0x06F1, 0x0021, 0x0060);
Pashto['2']=new Key(0x06F2, 0x066C, 0x0040);
Pashto['3']=new Key(0x06F3, 0x066B, 0x0023);
Pashto['4']=new Key(0x06F4, 0xE0B4, 0x0024);
Pashto['5']=new Key(0x06F5, 0x066A, 0x0025);
Pashto['6']=new Key(0x06F6, 0x00D7, 0x005E);
Pashto['7']=new Key(0x06F7, 0x00BB, 0x0026);
Pashto['8']=new Key(0x06F8, 0x00AB, 0x2022);
Pashto['9']=new Key(0x06F9, 0x0029, 0x200E);
Pashto['=']=new Key(0x003D, 0x002B);
Pashto['-']=new Key(0x002D, 0x0640, 0x005F);
Pashto[',']=new Key(0x0648, 0x060C, 0x002C);
Pashto['.']=new Key(0x0696, 0x002E, 0x06C7);
Pashto['/']=new Key(0x002F, 0x061F, 0x06C9);
Pashto['\\']=new Key(0x005C, 0x002A, 0x007C);
Pashto[';']=new Key(0x06A9, 0x003A, 0x0643);
Pashto['[']=new Key(0x062C, 0x005D, 0x007D);
Pashto[']']=new Key(0x0686, 0x005B, 0x007B);
Pashto[charSingleQuote]=new Key(0x06AB, 0x61B, 0x06AF);
Pashto['~']=new Key(0x200D, 0x00F7, 0x007E);
Pashto[' ']=new Key(32);

var KeyMaps= new Array();
var Keypads=new Array();

var langArray=new Array();
function raiseButton(evt) {
	//IE-Only Function
	evt = (evt) ? evt : (window.event) ? event : null;
	
	if(evt.srcElement)
	{
		var el = evt.srcElement;
		
		className = el.className;
		if (className == 'btnFlat' || className == 'btnLowered') {
			el.className = 'btnRaised';
		}
		if (className == 'btnSysFlat' || className == 'btnSysLowered') {
			if((evt.srcElement==LShift) || (evt.srcElement==RShift))
			{
				if((bToggleFlag) && (CurrentKeyboardState==kbShift))
				{
					return;
				}
				else
					el.className = 'btnSysRaised';
			}
			else if((evt.srcElement==LAlt) || (evt.srcElement==RAlt))
			{
				if((bToggleFlag) && (CurrentKeyboardState==kbAlt))
				{
					return;
				}
				else
					el.className = 'btnSysRaised';
			}
			else
					el.className = 'btnSysRaised';			
		}
	}
	else if(evt.target)
	{
		var el = evt.target;
		
		className = el.className;
		if (className == 'btnFlat' || className == 'btnLowered') {
			el.className = 'btnRaised';
		}
		
		if (className == 'btnSysFlat' || className == 'btnSysLowered') {
			if((evt.target==LShift) || (evt.target==RShift))
			{
				if((bToggleFlag) && (CurrentKeyboardState==kbShift))
				{
					return;
				}
				else
					el.className = 'btnSysRaised';
			}
			else if((evt.target==LAlt) || (evt.target==RAlt))
			{
				if((bToggleFlag) && (CurrentKeyboardState==kbAlt))
				{
					return;
				}
				else
					el.className = 'btnSysRaised';
			}
			else
				el.className = 'btnSysRaised';
		}
	}
	
}

function normalButton(evt) {
	//IE-Only Function
	evt = (evt) ? evt : (window.event) ? event : null;
	
	if(evt.srcElement)
	{

		var el = window.event.srcElement;
		
		className = el.className;
		if (className == 'btnRaised' || className == 'btnLowered') {
			el.className = 'btnFlat';
		}
		
		if (className == 'btnSysRaised' || className == 'btnSysLowered') {
		
			if((evt.srcElement==LShift) || (evt.srcElement==RShift))
			{
				if((bToggleFlag) && (CurrentKeyboardState==kbShift))
				{					
					return;
				}
				else
				{
					el.className = 'btnSysFlat';
				}
			}
			else if((evt.srcElement==LAlt) || (evt.srcElement==RAlt))
			{
				if((bToggleFlag) && (CurrentKeyboardState==kbAlt))
				{					
					return;
				}
				else
				{
					el.className = 'btnSysFlat';
				}
			}
			else
					el.className = 'btnSysFlat';			
		}
	}
	else if(evt.target)
	{
		var el = evt.target;
		
		className = el.className;
		if (className == 'btnRaised' || className == 'btnLowered') {
			el.className = 'btnFlat';
		}
		
		if (className == 'btnSysRaised' || className == 'btnSysLowered') {
			if((evt.target==LShift) || (evt.target==RShift))
			{
				if((bToggleFlag) && (CurrentKeyboardState==kbShift))
				{					
					return;
				}
				else
				{
					el.className = 'btnSysFlat';
				}
			}
			else if((evt.target==LAlt) || (evt.target==RAlt))
			{
				if((bToggleFlag) && (CurrentKeyboardState==kbAlt))
				{					
					return;
				}
				else
				{
					el.className = 'btnSysFlat';
				}
			}
			else
					el.className = 'btnSysFlat';
		}
	}
}

function lowerButton(evt) {
	//IE-Only Function
	evt = (evt) ? evt : (window.event) ? event : null;
	
	if(evt.srcElement)
	{
		var el = window.event.srcElement;
		
		className = el.className;
		if (className == 'btnFlat' || className == 'btnRaised') {
			el.className = 'btnLowered';
		}
		
		if (className == 'btnSysFlat' || className == 'btnSysRaised') {
			el.className = 'btnSysLowered';
		}
		
	}
	else if(evt.target)
	{
		var el = evt.target;
		
		className = el.className;
		if (className == 'btnFlat' || className == 'btnRaised') {
			el.className = 'btnLowered';
		}
		
		if (className == 'btnSysFlat' || className == 'btnSysRaised') {
			el.className = 'btnSysLowered';
		}
	}
}		


function UpdateKeypad(kbState)
{	
	//alert(kbState);
	//alert(KeyMaps["Sindhi"]);
	switch(kbState)	
	{
		case kbNormal:
				for(key in Keypads)
				{
					if(CurrentKeyboard[Keypads[key].id])
					{
						if (document.all)
							Keypads[key].innerText=String.fromCharCode(CurrentKeyboard[Keypads[key].id].normal);	
						else if(!document.all && document.getElementById)
						{
							if (isDiacritic(CurrentKeyboard[Keypads[key].id].normal))
									Keypads[key].innerHTML=String.fromCharCode(0x0627)+String.fromCharCode(CurrentKeyboard[Keypads[key].id].normal);
							else
								Keypads[key].innerHTML=String.fromCharCode(CurrentKeyboard[Keypads[key].id].normal);
						}
					}
				}
				break;
		case kbShift:
				for(key in Keypads)
				{
					if(CurrentKeyboard[Keypads[key].id])
					{
						if (document.all)
						{
							if(CurrentKeyboard[Keypads[key].id].shifted)
								Keypads[key].innerText=String.fromCharCode(CurrentKeyboard[Keypads[key].id].shifted);	
							else 
								Keypads[key].innerText=' ';	
						}
						else if (!document.all && document.getElementById)
						{
							if(CurrentKeyboard[Keypads[key].id].shifted)
							{
								if (isDiacritic(CurrentKeyboard[Keypads[key].id].shifted))
									Keypads[key].innerHTML=String.fromCharCode(0x0627)+String.fromCharCode(CurrentKeyboard[Keypads[key].id].shifted);
								else
									Keypads[key].innerHTML=String.fromCharCode(CurrentKeyboard[Keypads[key].id].shifted);	
							}
							else 
								Keypads[key].innerHTML=' ';	
						}
					}					
				}
				break;
		case kbAlt:
				for(key in Keypads)
				{
					if(CurrentKeyboard[Keypads[key].id])
					{
						if (document.all)
						{
							if(CurrentKeyboard[Keypads[key].id].alt)
							{								
								Keypads[key].innerText=String.fromCharCode(CurrentKeyboard[Keypads[key].id].alt);	
							}
							else 
								Keypads[key].innerText=' ';	
						}
						else if (!document.all && document.getElementById)
						{
							if(CurrentKeyboard[Keypads[key].id].alt)
							{
								if (isDiacritic(CurrentKeyboard[Keypads[key].id].alt))
									Keypads[key].innerHTML=String.fromCharCode(0x0627)+String.fromCharCode(CurrentKeyboard[Keypads[key].id].alt);
								else
									Keypads[key].innerHTML=String.fromCharCode(CurrentKeyboard[Keypads[key].id].alt);	
								//Keypads[key].innerHTML=String.fromCharCode(CurrentKeyboard[Keypads[key].id].alt);	
							}
							else 
								Keypads[key].innerHTML=' ';
						}
					}
				}
				break;
	}	
}



function ToggleShift()
{
	ToggleKeyboard(kbShift);
}

function ToggleAlt()
{
	ToggleKeyboard(kbAlt);
}

function ToggleAltGr()
{
	ToggleKeyboard(kbAltGr);
}

function ToggleKeyboard(ToggleKey)
{
	bToggleFlag=!bToggleFlag
	if(bToggleFlag)
	{
		if(ToggleKey==kbShift)
		{
			RShift.className='btnSysLowered';
			LShift.className='btnSysLowered';
			CurrentKeyboardState=kbShift;
			UpdateKeypad(kbShift);
		}
		else if(ToggleKey==kbAlt)
		{
			LAlt.className='btnSysLowered';
			RAlt.className='btnSysLowered';
			CurrentKeyboardState=kbAlt;
			UpdateKeypad(kbAlt);
		}

	}
	else
	{
		if(CurrentKeyboardState == kbShift)
		{
			RShift.className='btnSysFlat';
			LShift.className='btnSysFlat';
		}
		else if(CurrentKeyboardState == kbAlt)
		{
			LAlt.className='btnSysFlat';
			RAlt.className='btnSysFlat';
		}
		
		CurrentKeyboardState = kbNormal;
		UpdateKeypad(kbNormal);
	}
}

function Downkeys(evt)
{
	evt = (evt) ? evt : (window.event) ? event : null;
	if(evt)
	{
		if(document.all)
		{
			if(evt.shiftKey )
			{
				RShift.className='btnSysLowered';
				LShift.className='btnSysLowered';
				CurrentKeyboardState=kbShift;
				UpdateKeypad(kbShift);
			}
			else if(evt.ctrlKey && evt.altKey)
			{
				RCtrl.className='btnSysLowered';
				LCtrl.className='btnSysLowered';	
				RAlt.className='btnSysLowered';
				LAlt.className='btnSysLowered';
				CurrentKeyboardState=kbAlt;
				UpdateKeypad(kbAlt);
			}			
		}
		else if(!document.all  && document.getElementById)
		{
			if(evt.ctrlKey)
			{
				if( evt.shiftKey)
				{	
					RCtrl.className='btnSysLowered';
					LCtrl.className='btnSysLowered';	
					RShift.className='btnSysLowered';
					LShift.className='btnSysLowered';
					CurrentKeyboardState=kbAlt;
					UpdateKeypad(kbAlt);						
				}
			}
			else if(evt.shiftKey )
			{
				RShift.className='btnSysLowered';
				LShift.className='btnSysLowered';
				CurrentKeyboardState=kbShift;
				UpdateKeypad(kbShift);
			}
		}
		
		/*else if (evt.ctrlKey)
		{
			RCtrl.className='btnSysLowered';
			LCtrl.className='btnSysLowered';
		}
		else if(evt.altKey)
		{
			LAlt.className='btnSysLowered';
			RAlt.className='btnSysLowered';
			CurrentKeyboardState=kbAlt;
			UpdateKeypad(kbAlt);
		}*/
		
	}
}


function isValidChar(sChar)
{
	if(ValidChars.indexOf(sChar)>=0)
	{
		return true;
	}
    return false;	
}

function processKeydown(evt)
{
	if (!langArray[currEdit.id]) return;
	evt = (evt) ? evt : ((event) ? event : null);
    if (evt) 
	{
		var charCode = (evt.charCode) ? evt.charCode : evt.keyCode;
		var idxChar=String.fromCharCode(charCode).toLowerCase();
		
		if (CurrentKeyboardState == kbAlt)
		{
			if(ValidChars.indexOf(idxChar)>=0)
			{
				alert("test");
				AddText(idxChar);
				ToggleKeyboard(kbNormal);
			}
		}
	}
}

function Upkeys(evt)
{
	if (!evt) evt = window.event;
	if (!evt.ctrlKey) bCtrlState=0;
	if (!evt.altKey) bAltState=0;
	if(CurrentKeyboardState == kbShift)
		if(!evt.shiftKey)
		{
			RShift.className='btnSysFlat';
			LShift.className='btnSysFlat';
			CurrentKeyboardState = kbNormal;
			UpdateKeypad(kbNormal);
		}
		
	if(CurrentKeyboardState == kbAlt)
	{
		if(document.all)
		{
			if(!(evt.altKey && evt.ctrlKey))
			{
				RCtrl.className='btnSysFlat';
				LCtrl.className='btnSysFlat';
				LAlt.className='btnSysFlat';
				RAlt.className='btnSysFlat';
				CurrentKeyboardState = kbNormal;
				UpdateKeypad(kbNormal);
			}
		}
		else if(!document.all  && document.getElementById)
		{
			if(!evt.ctrlKey || evt.shiftKey)
			{
				RCtrl.className='btnSysFlat';
				LCtrl.className='btnSysFlat';	
				RShift.className='btnSysFlat';
				LShift.className='btnSysFlat';
				CurrentKeyboardState=kbNormal;
				UpdateKeypad(kbNormal);
			}
		}
	}
}

	 
 function storeCaret (textEl) {
   if (textEl.createTextRange) 
	 textEl.caretPos = document.selection.createRange().duplicate();
 }

function isAlpha(ch)
 {
	 return (ch >= 'a' && ch <= 'z\uffff') || (ch >= 'A' && ch <= 'Z\uffff');
 }

function CutToClipboard()
{
   CutTxt = currEdit.selection.createRange();
   CutTxt.execCommand("Cut");
} 

function CopyToClipboard()
{
   CopiedTxt = currEdit.selection.createRange();
   CopiedTxt.execCommand("Copy");
}

function PasteFromClipboard()
{ 
   currEdit.focus();
   PastedText = currEdit.createTextRange();
   PastedText.execCommand("Paste");
}


function AddText(idx)
{

	var txt;
	if(!currEdit) return;
	switch(CurrentKeyboardState)	
	{
		case kbNormal:
			if(CurrentKeyboard[Keypads[idx].id] != null)
			{								
				txt= String.fromCharCode(CurrentKeyboard[Keypads[idx].id].normal);					
			}
			break;
		case kbShift:
			if(CurrentKeyboard[Keypads[idx].id] != null)
				if(CurrentKeyboard[Keypads[idx].id].shifted != null)
				{				
					if(CurrentKeyboard[Keypads[idx].id].shifted)
					{
						txt= String.fromCharCode(CurrentKeyboard[Keypads[idx].id].shifted);
					}
					ToggleKeyboard(kbShift);
				}
			break;
		case kbAlt:
			if(CurrentKeyboard[Keypads[idx].id] != null)
				if(CurrentKeyboard[Keypads[idx].id].alt != null)
				{				
					txt= String.fromCharCode(CurrentKeyboard[Keypads[idx].id].alt);
					ToggleKeyboard(kbAlt);
				}
			break;
	}
	
	
	if (currEdit.createTextRange && currEdit.caretPos) {      
		var caretPos = currEdit.caretPos;      
		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ?
		txt + ' ' : txt;
		currEdit.focus(caretPos);
	}
	else if (currEdit.selectionStart || currEdit.selectionStart == '0') 
	{ 
		var startPos = currEdit.selectionStart; 
		var endPos = currEdit.selectionEnd; 
		currEdit.value = currEdit.value.substring(0, startPos) 
					  + txt 
					  + currEdit.value.substring(endPos, currEdit.value.length); 
		currEdit.focus(); 
		currEdit.selectionStart = startPos + 1; 
		currEdit.selectionEnd = startPos + 1; 
	}
	else 
	{
		currEdit.value += txt;
		currEdit.focus(caretPos);	
	}
}

function processKeypresses(evt)
{ 
	 //if (!IsUrdu) return;
	 if (!langArray[currEdit.id]) return;
	 evt = (evt) ? evt : (window.event) ? event : null;
	 if (evt)
	  {
		var charCode = (evt.charCode) ? evt.charCode :
				((evt.keyCode) ? evt.keyCode :
			   ((evt.which) ? evt.which : 0));
			   var whichASC = charCode ; // key's ASCII code
		var whichChar = String.fromCharCode(whichASC); // key's character			
		var idxChar= whichChar.toLowerCase(whichChar);

		
		if(evt.keyCode)
		{
			if(CurrentKeyboardState== kbAlt)
			{
				evt.keyCode=0;
				return;
			}
			
			if (evt.shiftKey)
			{					
				if(CurrentKeyboard[Keypads[idxChar].id] != null)
				{
					if(CurrentKeyboard[Keypads[idxChar].id].shifted != null)
					{
						evt.keyCode= CurrentKeyboard[idxChar].shifted;
					}
				}
			}
			else
			{	
				if(CurrentKeyboard[Keypads[idxChar].id] != null)
				{	
						evt.keyCode= CurrentKeyboard[idxChar].normal;
				}
			}
		}
		else if (evt.which)
		{
			var txt;
			if(!currEdit) 
			{
				evt.preventDefault();
				evt.stopPropagation();
				return;
			}
									
			/*if (evt.ctrlKey)
			{
				alert("ctrl");
				switch(idxChar)
				{
					case 'l': alert("Ctrl+L");
						break;
					case 'c': alert("Ctrl+C");
						break;
					case 'x': alert("Ctrl+X");
						break;
					case 'v': alert("Ctrl+V");
						break;
				}
			}
			else if(evt.altKey)
			{			
				if(CurrentKeyboard[Keypads[idxChar].id])
				{
					if(CurrentKeyboard[Keypads[idxChar].id].alt)
					{
						txt= String.fromCharCode(CurrentKeyboard[Keypads[idxChar].id].alt);
					}
				}
			}
			else*/ 
			if(evt.shiftKey)
			{						
				if(CurrentKeyboard[Keypads[idxChar].id])
				{
					if(CurrentKeyboard[Keypads[idxChar].id].shifted)
					{
						txt= String.fromCharCode(CurrentKeyboard[Keypads[idxChar].id].shifted);
					}
				}
			}
			else
			{				
				if(CurrentKeyboard[Keypads[idxChar].id])
				{
					txt= String.fromCharCode(CurrentKeyboard[Keypads[idxChar].id].normal);
				}
			}
			
		   
		   if (currEdit.selectionStart || currEdit.selectionStart == '0') { 
			var startPos = currEdit.selectionStart; 
			var endPos = currEdit.selectionEnd; 
			currEdit.value = currEdit.value.substring(0, startPos) 
						  + txt 
						  + currEdit.value.substring(endPos, currEdit.value.length); 
			currEdit.focus(); 
			currEdit.selectionStart = startPos + 1; 
			currEdit.selectionEnd = startPos + 1; 
			} else { 
				currEdit.value  += txt; 
				currEdit.focus(); 
			}
			 
			evt.preventDefault();
			evt.stopPropagation();
		}
		else if(evt.charCode)
		{
		
			var txt;
			if(CurrentKeyboardState== kbAlt)
			{
				evt.preventDefault();
				evt.stopPropagation();
				return;
			}
			
			if(!currEdit) 
			{
				evt.preventDefault();
				evt.stopPropagation();
				return;
			}			
		
			if(evt.shiftKey)
			{						
				if(CurrentKeyboard[Keypads[idxChar].id])
				{
					if(CurrentKeyboard[Keypads[idxChar].id].shifted)
					{
						AddText(CurrentKeyboard[Keypads[idx].id].shifted);
					}
				}
			}
			else
			{				
				if(CurrentKeyboard[Keypads[idxChar].id])
				{
					AddText(CurrentKeyboard[Keypads[idx].id].normal);
				}
			}
			evt.preventDefault();
			evt.stopPropagation();				
		}
	  }		
}

function ShowHelp(idx)
{	
	switch(CurrentKeyboardState)	
	{
		case kbNormal:
			if (Keypads[idx].id)
			if(CurrentKeyboard[Keypads[idx].id])
			{
				if (document.all)
					HelpArea.innerText= 'Keyboard:'+idx;
				else if (!document.all && document.getElementById)
					HelpArea.innerHTML= 'Keyboard:'+idx;
			//	HelpArea.innerText= '&#1662;&#1585;&#1740;&#1587; &#1705;&#1585;&#1740;&#1722; '+idx+' &#1705;&#1740; &#1576;&#1608;&#1585;&#1672; &#1662;&#1585;';
			}
			break;
		case kbShift:
		if (Keypads[idx].id)
			if(CurrentKeyboard[Keypads[idx].id])
				if(CurrentKeyboard[Keypads[idx].id].shifted)
				{			
					if (document.all)
						HelpArea.innerText= 'Keyboard: Shift+ '+idx;
					else if (!document.all && document.getElementById)
						HelpArea.innerHTML= 'Keyboard: Shift+ '+idx;
				}
			break;
		case kbAlt:
		if (Keypads[idx].id)
			if(CurrentKeyboard[Keypads[idx].id])
				if(CurrentKeyboard[Keypads[idx].id].alt)
				{
					if (document.all)
						HelpArea.innerText= 'Keyboard: Ctrl+Alt+ '+idx;
					else if (!document.all && document.getElementById)
						HelpArea.innerHTML=  'Keyboard: Ctrl+Shift+ '+idx;
				}
			break;
	}
}

function writeButton(idx, perc, btnClass, str, caption)
{
	document.writeln('<td class="'+btnClass+'" id="'+idx+'" width='+perc+'% onclick="javascript:AddText(\''+ str+ '\' );"  onmouseover="ShowHelp(\''+ str+ '\'); ">'+caption+'</td>');	
	Keypads[idx]=document.getElementById(idx);
}

function writeEmptyCell(idx, perc, btnClass, str, caption)
{
	document.writeln('<td class="'+btnClass+'" id="'+idx+'" width='+perc+'%>&nbsp;</td>');
	//Keypads[str]=document.getElementById(idx);
}

function writeButton2(idx, perc, btnClass, str, caption)
{
	document.writeln('<td class="'+btnClass+'" id="'+idx+'" width='+perc+'%  >'+caption+'</td>');
	//document.writeln('<td class="'+btnClass+'" id="'+idx+'" width='+perc+'% onmouseover="raiseButton();" onmouseup="raiseButton(); " onmouseout="normalButton(); " onmousedown="lowerButton();">'+caption+'</td>');
	Keypads[str]=document.getElementById(idx);
}

function writeKeyboard()
{
	document.writeln('<span dir="ltr">');
	
	document.writeln('<table border="0" cellpadding="0" cellspacing="1" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber1">');
		document.writeln('<tr>');
			document.writeln('<td width="100%" class="btnHelp" id="HelpDesk">');
				document.writeln('<span lang="ur" dir="rtl">');
					document.writeln('&#1605;&#1575;&#1572;&#1587; &#1705;&#1608; &#1705;&#1587;&#1740; &#1576;&#1657;&#1606; &#1662;&#1585; &#1604;&#1575;&#1574;&#1740;&#1722;');
				document.writeln('</span>');
			document.writeln('</td>');				
		document.writeln('</tr>');
		document.writeln('<tr>');
			document.writeln('<td width="100%">');
			document.writeln('<table border="0" cellpadding="0" cellspacing="1"  bordercolor="#111111" width="100%" id="AutoNumber2" >');
				document.writeln('<tr>');
					writeButton('~', 7, "btnFlat", '~', '~');
					writeButton('1', 7, "btnFlat", '1', '1');
					writeButton('2', 7, "btnFlat", '2', '2');
					writeButton('3', 7, "btnFlat", '3', '3');
					writeButton('4', 7, "btnFlat", '4', '4');
					writeButton('5', 7, "btnFlat", '5', '5');
					writeButton('6', 7, "btnFlat", '6', '6');
					writeButton('7', 7, "btnFlat", '7', '7');
					writeButton('8', 7, "btnFlat", '8', '8');
					writeButton('9', 7, "btnFlat", '9', '9');
					writeButton('0', 7, "btnFlat", "0", "0");
					writeButton('-', 7, "btnFlat", '-', '-');
					writeButton('=', 6, "btnFlat", '=', '=');
					//writeButton('10', 10, "btnFlat", '10', '-');
				document.writeln('</tr>');
			document.writeln('</table>');
			document.writeln('</td>');
		document.writeln('</tr>');

		document.writeln('<tr>');
			document.writeln('<td width="100%">');
			document.writeln('<table border="0" cellpadding="0" cellspacing="1"  bordercolor="#111111" width="100%" id="AutoNumber2" >');
				document.writeln('<tr>');
					writeButton('q', 6, "btnFlat", 'q', 'q');
					writeButton('w', 7, "btnFlat", 'w', 'w');
					writeButton('e', 7, "btnFlat", 'e', 'e');
					writeButton('r', 8, "btnFlat", 'r', 'r');
					writeButton('t', 8, "btnFlat", 't', 't');
					writeButton('y', 8, "btnFlat", 'y', 'y');
					writeButton('u', 8, "btnFlat", 'u', 'u');
					writeButton('i', 8, "btnFlat", 'i', 'i');
					writeButton('o', 8, "btnFlat", 'o', 'o');
					writeButton('p', 8, "btnFlat", 'p', 'p');
					writeButton('[', 8, "btnFlat", '[', '[');
					writeButton(']', 8, "btnFlat", ']', ']');
					writeButton('\\', 8, "btnFlat", '\\\\', '\\\\');
				document.writeln('</tr>');
			document.writeln('</table>');
			document.writeln('</td>');
		document.writeln('</tr>');
		document.writeln('<tr>');
			document.writeln('<td width="100%">');
			document.writeln('<table border="0" cellpadding="0" cellspacing="1"  bordercolor="#111111" width="100%" id="AutoNumber3">');
				document.writeln('<tr>');
					//writeButton('14', 10, "btnFlat", '14', '-');
					writeButton('a', 10, "btnFlat", 'a', 'a');
					writeButton('s', 7, "btnFlat", 's', 's');
					writeButton('d', 7, "btnFlat", 'd', 'd');
					writeButton('f', 8, "btnFlat", 'f', 'f');
					writeButton('g', 8, "btnFlat", 'g', 'g');
					writeButton('h', 8, "btnFlat", 'h', 'h');
					writeButton('j', 8, "btnFlat", 'j', 'j');
					writeButton('k', 8, "btnFlat", 'k', 'k');
					writeButton('l', 8, "btnFlat", 'l', 'l');
					writeButton(';', 8, "btnFlat", ';', ';');
					writeButton(charSingleQuote , 8, "btnFlat", '\\\'', '\\\'');
					//writeButton('16', 8, "btnFlat", '16', 'Enter');
				document.writeln('</tr>');
			document.writeln('</table>');
			document.writeln('</td>');
		document.writeln('</tr>');
			
		document.writeln('<tr>');
			document.writeln('<td width="100%">');
			document.writeln('<table border="0" cellpadding="0" cellspacing="1"  bordercolor="#111111" width="100%" id="AutoNumber4">');
				document.writeln('<tr>');
					writeButton2('LeftShift', 7, "btnSysFlat", 'LeftShift', 'Shift');
					//writeButton('17', 7, "btnFlat", '17', '-');
					writeButton('z', 8, "btnFlat", 'z', 'z');
					writeButton('x', 8, "btnFlat", 'x', 'x');
					writeButton('c', 8, "btnFlat", 'c', 'c');
					writeButton('v', 8, "btnFlat", 'v', 'v');
					writeButton('b', 8, "btnFlat", 'b', 'b');
					writeButton('n', 9, "btnFlat", 'n', 'n');
					writeButton('m', 9, "btnFlat", 'm', 'm');
					writeButton(',', 9, "btnFlat", ',', ','); 
					writeButton('.', 9, "btnFlat", '.', '.'); 
					writeButton('/', 9, "btnFlat", '/', '/');
					writeButton2('RightShift', 8, "btnSysFlat", 'RightShift', 'Shift');
				document.writeln('</tr>');
			document.writeln('</table>');
			document.writeln('</td>');
		document.writeln('</tr>');
		
		document.writeln('<tr>');
			document.writeln('<td width="100%">');
			document.writeln('<table border="0" cellpadding="0" cellspacing="1"  bordercolor="#111111" width="100%" id="AutoNumber4">');
				document.writeln('<tr>');
					writeButton('LeftCtrl', 8, "btnSysFlat", 'LeftCtrl', 'Ctrl');
					writeEmptyCell('21', 20);
					writeButton2('AltL', 7, "btnSysFlat", 'AltL', 'Alt');
					writeButton(' ', 32, "btnFlat", ' ', 'SPACE');
					writeButton2('AltR', 6, "btnSysFlat", 'AltR', 'AltGr');				
					writeEmptyCell('23', 18);
					writeButton('RightCtrl', 9, "btnSysFlat", 'RightCtrl', 'Ctrl');
				document.writeln('</tr>');
			document.writeln('</table>');
			document.writeln('</td>');
		document.writeln('</tr>');


		
	document.writeln('</table>');

	document.writeln('</span>');
	
RShift=document.getElementById("RightShift");
LShift=document.getElementById("LeftShift");
LAlt=document.getElementById("AltL");
RAlt=document.getElementById("AltR");
LCtrl=document.getElementById("LeftCtrl");
RCtrl=document.getElementById("RightCtrl");
HelpArea=document.getElementById("HelpDesk");


setKeymap("UrduPhonetic");
//setKeymap("Sindhi");
addEvent(RShift, "click",ToggleShift);
addEvent(LShift, "click",ToggleShift);

addEvent(LAlt, "click",ToggleAlt);
addEvent(RAlt, "click",ToggleAlt);
}

	
	
function makeRaised(el) {
	with (el.style) {
		borderLeft   = "1px solid buttonhighlight";
		borderRight  = "1px solid buttonshadow";
		borderTop    = "1px solid buttonhighlight";
		borderBottom = "1px solid buttonshadow";
		padding      = "1px";
	}
}

function makePressed(el) {
	with (el.style) {
		borderLeft   = "1px solid buttonshadow";
		borderRight  = "1px solid buttonhighlight";
		borderTop    = "1px solid buttonshadow";
		borderBottom = "1px solid buttonhighlight";
		paddingTop    = "2px";
		paddingLeft   = "2px";
		paddingBottom = "0px";
		paddingRight  = "0px";
	}
}

	
function setUrdu(sName)
{
/*	if(!currEdit) return;
	currEdit.focus();		
	IsUrdu=1;*/
	langArray[sName]=1;
	var el=document.getElementById(sName);
	el.focus(1);
	if (el.createTextRange) 
	{
		var caretPos = el.caretPos;
		el.focus(caretPos);
	}
	else if (el.selectionStart || el.selectionStart == '0')
	{
		var startPos = el.selectionStart; 
		el.focus(); 
		el.selectionStart = startPos + 1; 
		el.selectionEnd = startPos + 1;
	}
}

function setEnglish(sName)
{
/*	if(!currEdit) return;
	currEdit.focus();
	IsUrdu=0;*/
	langArray[sName]=0;
	var el=document.getElementById(sName);
	if (el.createTextRange && el.caretPos) 
	{
		var caretPos = el.caretPos;
		el.focus(caretPos);
	}
	else if (el.selectionStart || el.selectionStart == '0')
	{
		var startPos = el.selectionStart; 
		el.focus(); 
		el.selectionStart = startPos + 1; 
		el.selectionEnd = startPos + 1;
	}
}

function toggleLanguage()
{
	if(!currEdit) return;
	currEdit.focus(); 
	
	IsUrdu=!IsUrdu;
	if(IsUrdu)
	{
		makeRaised(document.getElementById("English"));
		makePressed(document.getElementById("Urdu"));
	}
	else
	{
		makeRaised(document.getElementById("Urdu"));
		makePressed(document.getElementById("English"));
	}
}
	
function addEvent(obj, evType, fn){
	
  if (obj.addEventListener)
  {
    obj.addEventListener(evType, fn, true);
    return true;
  }
  else if (obj.attachEvent)
  {
	  //alert("on"+evType);
    var r = obj.attachEvent("on"+evType, fn);	
    return r;
	
  }
  else
  {
    alert("Handler could not be attached");
  }
}

function setEditor(el)
{
	currEdit=el;
}

function makeUrduEditor(idx, pt)
{
	var el=document.getElementById(idx);	
	
	el.lang="ur";
	el.dir="rtl";
	el.onFocus= "setEditor(el)";
	el.onclick="storeCaret(el)";
	el.onkeyup="storeCaret(el)";

	el.wrap="soft";
	with(el.style)
	{
		fontFamily="Urdu Naskh Asiatype";
		fontSize=pt;
		backgroundColor="#FFFF99";
	}
	langArray[idx]=1;
	addEvent(el , "keypress",  processKeypresses);
	addEvent(el , "keydown",  processKeydown);
}


function setKeymap(keymapName)
{
	CurrentKeyboard= KeyMaps[keymapName];
	UpdateKeypad(kbNormal);
}

function biggerFont(idx)
{
	var el=document.getElementById(idx);
	
	if (el.style.fontSize == '')
				el.style.fontSize = '1em';
	
	el.style.fontSize = (parseFloat(el.style.fontSize) +1) + "px";
	return el.style.fontSize;
}

function smallerFont(idx)
{
	var el=document.getElementById(idx);

	if (el.style.fontSize == '')
				el.style.fontSize = '1em';
				
	if ((parseFloat(el.style.fontSize) - 0.1) > 0.5)			
				el.style.fontSize = (parseFloat(el.style.fontSize) - 1) + "px";
	return el.style.fontSize;
}

function setFontSize(idx, pt)
{
	var el=document.getElementById(idx);
	el.style.fontSize=pt;
}

function writeUrduEditor(sName, rows, cols, pt)
{
	if(rows>1)
		document.writeln('<TEXTAREA NAME="'+sName+'" id="'+sName+'" ROWS="'+rows+'" COLS="'+cols+'" style="font-family:Urdu Naskh Asiatype; font-size:'+pt+'; background-color: #FFFF99 " lang="ur" dir="rtl" wrap="soft" onkeypress="processKeypresses()" onclick="storeCaret(this)" onkeyup="storeCaret(this)" onFocus= "setEditor(this)"></TEXTAREA>');	
	else
		document.writeln('<input type="text" name="'+sName+'" id="'+sName+'" size="'+cols+'" style="font-family:Urdu Naskh Asiatype; font-size:'+pt+'; background-color: #FFFF99" lang="ur" dir="rtl" onkeypress="processKeypresses()" onclick="storeCaret(this)" onkeyup="storeCaret(this)" onfocus="setEditor(this)">');
	var el=document.getElementById(sName);
	langArray[sName]=1;
	if(!document.all)
	{
		addEvent(el , "keypress",  processKeypresses);
		addEvent(el , "keydown",  processKeydown);
	}
}

function AddEditor(sName)
{
	langArray[sName]=1;
}

function setFont(idx, fontName)
{
	var el=document.getElementById(idx);	
	with(el.style)
	{
		fontFamily=fontName;
	}
}

function initUrduEditor(cssPath)
{
	
	var ua = navigator.userAgent.toLowerCase();
	isIE = ((ua.indexOf("msie") != -1) && (ua.indexOf("opera") == -1) && (ua.indexOf("webtv") == -1)); 
	isGecko = (ua.indexOf("gecko") != -1);
	isSafari = (ua.indexOf("safari") != -1);
	isKonqueror = (ua.indexOf("konqueror") != -1);
	
	document.onmouseover = raiseButton;
	document.onmouseout  = normalButton;
	document.onmousedown = lowerButton;
	document.onmouseup   = raiseButton;
	
	 addEvent(document, "keydown", Downkeys);
	 addEvent(document, "keyup", Upkeys);

	 
     KeyMaps["UrduPhonetic"]=UrduPhonetic;
	 KeyMaps["Sindhi"]=Sindhi;
	 KeyMaps["Pashto"]=Pashto;
	 setKeymap("UrduPhonetic");

	var sPath='';
	if(arguments.length>0) sPath=cssPath;
	document.writeln('<style type="text/css">@import"' + sPath + 'OpenPad.css";</style>');
}