﻿/* isiri2901.js - Standard Persian keyboard driver for JavaScript
 *
 * Copyright (C) 2000  Roozbeh Pournader
 * Copyright (C) 2003, 2005  Behdad Esfahbod
 * Copyright (C) 2005  Pooya Karimian
 * Copyright (C) 2005  Behnam Esfahbod
 * Copyright (C) 2005  Ehsan Akhgari
 * 
 * ChangeLog:
 * Jun 20, 2005  Ehsan Akhgari, Added HTML UI support.
 * 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.
 *
 * Licensed under GNU GPL.
 */

var isiri2901_lang = 1;	// 1: Persian, 0: English
var isiri2901_nativelang = 0;  // 1: Persian, 0: English

// Persian keyboard map based on ISIRI-2901

var isirikey = [
  0x0020, 0x0021, 0x061B, 0x066B, 0x00A4, 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,
  0x00F7, 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
];

// on Alt+Ctrl+anything, switch language
function PersianKeyDown(e)
{
  if (window.event)
    e = window.event;
  if (e.ctrlKey && e.altKey) {
    if (isiri2901_lang == 0) 
      setPersian();
    else
      setEnglish();
    try {
      e.preventDefault();
    } catch (err) {
    }
    return false;
  }
  return true;
}

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;
  }

  // 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
    if (key == 0x0020 && e.shiftKey) // Shift-space -> ZWNJ
      key = 0x200C;
    else
      key = isirikey[key - 0x0020];

    try {
      // Gecko
      e.initKeyEvent("keypress", true, true, document.defaultView, false, false, true, false, 0, key, obj);
    } catch (err) {
    try {
      // Windows
      e.keyCode = key;
    } catch (err) {
    try {
      // Opera
      var objRange = document.selection.createRange();
      objRange.text = String.fromCharCode(key);
      e.preventDefault();
      return false;
    } catch (err) {
    }}}
  }
  return true;
}


function setPersian (obj, quiet)
{
  isiri2901_lang = 1;
  if (obj) {
    obj.style.textAlign = "right";
    obj.style.direction = "rtl";
    obj.focus();
  }	
  if (!quiet)
    window.status = "Persian Keyboard (Press Ctrl+Alt+Space to change to English)";
}


function setEnglish (obj, quiet)
{
  isiri2901_lang = 0;
  if (obj) {
    obj.style.textAlign = "left";
    obj.style.direction = "ltr";
    obj.focus();
  }	
  if (!quiet)
    window.status = "English Keyboard (Press Ctrl+Alt+Space to change to Persian)";
}


function toggleDir (obj, quiet) {
  if (obj && obj.style.direction == 'ltr' || !obj && isiri2901_lang == 1)
   setPersian(obj, quiet);
  else
   setEnglish(obj, quiet);
}

function MM_findObj(n,d)
{
	var p,i,x;
	if(!d)
		d=document;
	if((p=n.indexOf("?"))>0&&parent.frames.length)
	{
		d=parent.frames[n.substring(p+1)].document;
		n=n.substring(0,p);
	}
	if(!(x=d[n])&&d.all)
		x=d.all[n];
	for(i=0;!x&&i<d.forms.length;i++)
		x=d.forms[i][n];
	for(i=0;!x&&d.layers&&i<d.layers.length;i++)
		x=MM_findObj(n,d.layers[i].document);
	if(!x&&d.getElementById)
		x=d.getElementById(n);
	return x;
}

function MM_swapImage()
{
	var i,j=0,x,a=MM_swapImage.arguments;
	document.MM_sr=new Array;
	for(i=0;i<(a.length-2);i+=3)
		if((x=MM_findObj(a[i]))!=null)
		{
			document.MM_sr[j++]=x;
			if(!x.oSrc)
				x.oSrc=x.src;x.src=a[i+2];
		}
}

function MM_swapImgRestore()
{
	var i,x,a=document.MM_sr;
	for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++)
		x.src=x.oSrc;
}

function MM_preloadImages()
{
	var d=document;
	if(d.images)
	{
		if(!d.MM_p)
			d.MM_p=new Array();
		var i,j=d.MM_p.length,a=MM_preloadImages.arguments;
		for(i=0;i<a.length;i++)
			if(a[i].indexOf("#")!=0)
			{
				d.MM_p[j]=new Image;
				d.MM_p[j++].src=a[i];
			}
	}
}

window.onload = function ()
{
	MM_preloadImages( "/images/fa.gif", "/images/en.gif" );
}

document.numImages = 0;

function insertKeyboardSelector(show_keyboard, name, noLabel)
{
	window.document.write(
		"<span dir=\"rtl\" lang=\"fa\" style=\"line-height: 16px;\">" +
		(noLabel ? "" : "&#1578;&#1594;&#1610;&#1610;&#1585; &#1586;&#1576;&#1575;&#1606;:") +
		" <a href=\"javascript: void(0);\" onclick=\"changeLanguage();return false;\"" +
		" class=\"lang_image\"><img name=\"langID_" + (document.numImages ++) +
		"\" dir=\"rtl\" src=\"/images/fa.gif\" width=\"16\"" +
		" height=\"16\" border=\"0\" title=\"&#1575;&#1606;&#1578;&#1582;&#1575;&#1576; &#1586;&#1576;&#1575;&#1606;\" /></a>" +
		((show_keyboard && typeof(window.showModalDialog) != 'undefined') ? " <a href=\"javascript: void(0);\" onclick=\"var result=window." +
		"showModalDialog('/scripts/persian_keyboard.html','','dialogWidth:430px;dialogHeight:340px;help:no;scroll:no;status:no;');setQuery('" + name + "', result);" +
		"return false;\"><img src=\"/images/keyboard.gif\" width=\"32\" height=\"16\" border=\"0\" " +
		"title=\"&#1606;&#1605;&#1575;&#1610;&#1588; &#1589;&#1601;&#1581;&#1607; &#1705;&#1604;&#1610;&#1583; &#1601;&#1575;&#1585;&#1587;&#1740;\" /></a>" : "" ) + "</span>" );
}

function updateKeyboardSelector()
{
	if (typeof(MM_swapImage) == "function")
	{
		for (var i = 0; i < document.numImages; ++ i)
		{
			MM_swapImage("langID_"+i,"","/images/"+(isiri2901_lang ? "fa" : "en")+".gif",1);
		}
	}
}

function changeLanguage()
{
	if (isiri2901_lang == 1) // Perisan
	{
		setEnglish( null, true );
	}
	else // English
	{
		setPersian( null, true );
	}
	updateKeyboardSelector();
}

function setQuery(name, val)
{
	if (val !== false && typeof(val) != 'undefined')
	{
		var obj = MM_findObj( name, document );
		if (typeof(obj) == 'object')
		{
			obj.value = val;
		}
	}
}
