//
// Persian Keyboad Layout
// Hamid Zarrabi-Zadeh
// Dec 3, 2005
//


//------------------ global variables ---------------------

var shift = false;
var capsLock = false;
var row, col;
var textArea;
var isIE = (navigator.userAgent.indexOf('MSIE') != -1)


//------------------ main functions -----------------------


function mouseClick(e)
{
	getPosition(e);
	key = mapPosition();
	if (key == '\b')
		backAtCursor(textArea)
	else
		insertAtCursor(textArea, key);
}


function getPosition(e)
{
	if (!e) e = window.event;
	obj = isIE ? e.srcElement : e.target;

	x = isIE ? e.offsetX : e.layerX- findPosX(obj);
	y = isIE ? e.offsetY : e.layerY- findPosY(obj);

	row = parseInt(y/ 35);
	col = parseInt((x- 15* row)/ 35);

	if (row == 4 && --col >= 1 && col <= 8)
		col = 1;
}


function mapPosition()
{
	if (shift)
	{
		key = (mappedShiftedKey[row]).charAt(col-1);
		if (key && !capsLock)
			switchShiftKey();
	}
	else
		key = (mappedKey[row]).charAt(col-1);

	if (key == '‡')
		key = '';

	var ij = ''+ row+ col;
	switch (ij)
	{
		case '30': case '311': case '312': case '313': // shift
			switchShiftKey(); break;
		case '20': // caps lock
			switchCapsLock(); break;
		case '10': // tab
			key = '\t'; break;
		case '113': case '114': case '212': case '213': // enter
			key = '\n'; break;
		case '014': // backspace
			key = '\b'; break;
		case '41': // space
			key = capsLock ? ' ' : key; break;
		case '00': // ZWJ, ZWNJ
			key = shift ? ZWJ : PEH; if (shift && !capsLock) switchShiftKey(); break;
	}
	return key;
}


function switchShiftKey()
{
	obj = getObj('keyboard_image');
	if (!capsLock)
		shift = !shift;

	if (capsLock)
		obj.src = 'picture/persian-keyboard-capslock.png';
	else if (shift)
		obj.src = 'picture/persian-keyboard-shifted.png';
	else
		obj.src = 'picture/persian-keyboard.png';
}


function switchCapsLock()
{
	capsLock = !capsLock;
	shift = true;
	switchShiftKey();
}


//------------------ common functions ----------------------

function getObj(name)
{
	if (document.getElementById)
		obj = document.getElementById(name);
	else if (document.all)
		obj = document.all[name];
	return obj;
}


function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}


function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}


function insertAtCursor(myField, myValue)
{
	if (document.selection)
	{	//IE
		var temp;
		myField.focus();
		sel = document.selection.createRange();
		temp = sel.text.lenght;
		sel.text = myValue;
		if (myValue.length == 0)
		{
			sel.moveStart('character', myValue.length);
			sel.moveEnd('character', myValue.length);
		}
		else
			sel.moveStart('character', -myValue.length+ temp);
		sel.select();
	}
	else if (myField.selectionStart || myField.selectionStart=='0')
	{	//Mozilla
		var startPos = myField.selectionStart;
		var endPos = myField.selectionEnd;
		var scrollTop = myField.scrollTop;
		myField.value = myField.value.substring(0, startPos)
                      + myValue
                      + myField.value.substring(endPos, myField.value.length);
		myField.focus();
		myField.selectionStart = startPos + myValue.length;
		myField.selectionEnd = startPos + myValue.length;
		myField.scrollTop = scrollTop;
	}
	else
	{
		myField.value += myValue;
		myField.focus();
	}
}


function backAtCursor(myField)
{
	if (document.selection)
	{	//IE
		myField.focus();
		sel = document.selection.createRange();

		if (sel.text.length>0)
			sel.text = '';
		else
		{
			sel.moveStart('character', -1);
			sel.text = '';
		}
		sel.select();

	}
	else if (myField.selectionStart || myField.selectionStart == '0')
	{	//Mozilla
		var startPos = myField.selectionStart;
		var endPos = myField.selectionEnd;
		var scrollTop = myField.scrollTop;
		myField.value = myField.value.substring(0, startPos-1)
					  + myField.value.substring(endPos, myField.value.length);
		myField.focus();
		myField.selectionStart = startPos- 1;
		myField.selectionEnd = startPos- 1;
		myField.scrollTop = scrollTop;
	}
	else
	{
		myField.value = myField.value.substr(0, (myField.value.length- 1));
		myField.focus();
	}
}

