/* isiri2901.js - Standard Persian keyboard driver for JavaScript
 *
 * Copyright (C) 2000  Roozbeh Pournader
 * Copyright (C) 2003, 2005  Behdad Esfahbod
 * Copyright (C) 2005, 2006  Pooya Karimian
 * Copyright (C) 2005  Behnam Esfahbod
 * Copyright (C) 2005  Artyom Lukanin
 *
 * ChangeLog:
 * Mar 05, 2005  Pooya Karimian, FireFox/Mozilla support added.
 * Mar 20, 2005  Behdad Esfahbod, random fixes in Firefox support.
 * Apr 14, 2005  Behnam Esfahbod, U+0654, U+0670, U+00F7 added.
 * Apr 21, 2005  Behdad Esfahbod, Minimal Opera 8.0 support added.
 *               Alt+Ctrl+anything now is known to switch language.
 * Sep 06, 2005  Artyom Lukanin, FireFox 1.0.6 support added.
 * Sep 09, 2005  Behdad Esfahbod, Added fallback support back in,
 *               removed Opera code that doesn't was not worth it.
 * Sep 09, 2005  Behdad Esfahbod, Make toggleDir() with no object
 *               passed changing language, actually work.
 * Sep 09, 2005  Added U+FDFC RIAL SIGN!
 * Sep 09, 2005  Assigned U+0653 to shift+X.
 * Dec 02, 2005  Pooya Karimian, Fixing vertical & horizontal scrolling
 * Apr 13, 2006  Pooya Karimian, initKeyEvent is back in Firefox 1.5.0.2 (FF Bug#303713)
 *
 * Licensed under GNU GPL.
 */

var isiri2901_lang = 1;        // 1: Persian, 0: English
var isiri2901_nativelang = 0;  // 1: Persian, 0: English
var changeable = 1;

// Persian keyboard map based on ISIRI-2901

var isirikey = [
0x0020, 0x0021, 0x061B, 0x066B, 0xFDFC, 0x066A, 0x060C, 0x06AF,
	0x0029, 0x0028, 0x002A, 0x002B, 0x0648, 0x002D, 0x002E, 0x002F,
	0x06F0, 0x06F1, 0x06F2, 0x06F3, 0x06F4, 0x06F5, 0x06F6, 0x06F7,
	0x06F8, 0x06F9, 0x003A, 0x06A9, 0x003E, 0x003D, 0x003C, 0x061F,
	0x066C, 0x0624, 0x200C, 0x0698, 0x064A, 0x064D, 0x0625, 0x0623,
	0x0622, 0x0651, 0x0629, 0x00BB, 0x00AB, 0x0621, 0x0654, 0x005D,
	0x005B, 0x0652, 0x064B, 0x0626, 0x064F, 0x064E, 0x0670, 0x064C,
	0x0653, 0x0650, 0x0643, 0x062C, 0x005C, 0x0686, 0x00D7, 0x0640,
	0x200D, 0x0634, 0x0630, 0x0632, 0x06CC, 0x062B, 0x0628, 0x0644,
	0x0627, 0x0647, 0x062A, 0x0646, 0x0645, 0x067E, 0x062F, 0x062E,
	0x062D, 0x0636, 0x0642, 0x0633, 0x0641, 0x0639, 0x0631, 0x0635,
	0x0637, 0x063A, 0x0638, 0x007D, 0x007C, 0x007B, 0x007E
	];

function setChangeable(c){
	if (c==0){
		changeable = 0;
	} else {
		changeable = 1;
	}
}
	// on Alt+Ctrl+anything, switch language
function PersianKeyDown(e)
{
	//setEnglish(); return true;
	if (window.event)
		e = window.event;
	//if (e.ctrlKey && e.altKey) {
	if (e.keyCode == 113 ) { // 113 - F2
		if (isiri2901_lang == 0)
			setPersian();
		else
			setEnglish();
		try {
			e.preventDefault();
		} catch (err) {
		}
		return false;
	}
	return true;
}

var pk_test_ev;

function PersianKeyPress(e)
{
	var key;
	var obj;


	if (window.event) {
		e = window.event;
		obj = e.srcElement;
		key = e.keyCode;
	} else {
		obj = e.target;
		key = e.charCode;
	}

	if (e.bubbles==false)
		return true;

	//   This cannot be used anymore, in FF 1.5.0.2, as a new event will call keypress again.
	//  Change to English, if user is using an OS non-English keyboard
	if (key >= 0x00FF) {
		isiri2901_nativelang = 1;
		setPersian();
	} else
		if (isiri2901_nativelang == 1) {
			isiri2901_nativelang = 0;
			setEnglish();
		}


	// Avoid processing if control or higher than ASCII
	// Or ctrl or alt is pressed.
	if (key < 0x0020 || key >= 0x007F || e.ctrlKey || e.altKey || e.metaKey)
		return true;

	if (isiri2901_lang == 1) { //If Persian

		// rewrite key
		var newkey;
		if (key == 0x0020 && e.shiftKey) // Shift-space -> ZWNJ
			newkey = 0x200C;
		else
			newkey = isirikey[key - 0x0020];

		if (newkey == key) 
			return true;


		try {
			// Gecko 
			var new_event=document.createEvent("KeyEvents");
			new_event.initKeyEvent("keypress", false, true, document.defaultView, false, false, false, false, 0, newkey);
			obj.dispatchEvent(new_event);
			e.preventDefault();
		} catch (err) {
			try {
				// Windows
				e.keyCode = newkey;
			} catch (err) {
				try {
					// Gecko after banning fake key emission (FF 1.0.6 to FF 1.5.0.1)
					// Try inserting at cursor position
					pnhMozStringInsert(obj, String.fromCharCode(newkey));
					e.preventDefault();
				} catch (err) {
					// Everything else, simply add to the end of buffer
					obj.value += String.fromCharCode(newkey);
					e.preventDefault();
				}}}
	}
	return true;
}


function setPersian (obj, quiet)
{
	if (!changeable) return;
	isiri2901_lang = 1;
	if (obj) {
		obj.style.textAlign = "right";
		obj.style.direction = "rtl";
		obj.focus();
	}
	if (!quiet)
		window.defaultStatus = "Persian Keyboard (Press F2 to change to English)";
}


function setEnglish (obj, quiet)
{
	if (!changeable) return;
	isiri2901_lang = 0;
	if (obj) {
		obj.style.textAlign = "left";
		obj.style.direction = "ltr";
		obj.focus();
	}
	if (!quiet)
		window.defaultStatus = "English Keyboard (Press F2 to change to Persian)";
}


function toggleDir (obj, quiet) {
	var isrtl = 0;
	if (obj)
		isrtl = obj.style.direction != 'ltr';
	else
		isrtl = isiri2901_lang;
	if (isrtl)
		setEnglish(obj, quiet);
	else
		setPersian(obj, quiet);
}

// Inserts a string at cursor
function pnhMozStringInsert(elt, newtext) {
	var posStart = elt.selectionStart;
	var posEnd = elt.selectionEnd;
	var scrollTop = elt.scrollTop;
	var scrollLeft = elt.scrollLeft;

	elt.value = elt.value.slice(0,posStart)+newtext+elt.value.slice(posEnd);
	var newpos = posStart+newtext.length;
	elt.selectionStart = newpos;
	elt.selectionEnd = newpos;	
	elt.scrollTop = scrollTop;
	elt.scrollLeft = scrollLeft;
	elt.focus();

}

