﻿/* 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  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 03, 2005  Hamid Zarrabi-Zadeh, New Keyboard Layout,
 				 Working with both UTF-8 and Arabic-1256 charsets.
 *
 * Licensed under GNU GPL.
 */
var ZWNJ = String.fromCharCode(0x200C);
var ZWJ  = String.fromCharCode(0x200D);
var PEH  = String.fromCharCode(0x067E);

var originKey = new Array (
		'1234567890-=\\',
		'qwertyuiop[]',
		'asdfghjkl;\'',
		'zxcvbnm,./', ' '
);

var mappedKey = new Array (
		'1234567890-=ژ',
		'ضصثقفغعهخحجچ',
		'شسیبلاتنمکگ',
		'ظطزرذدئو./', ' '
);

var originShiftedKey = new Array (
		'!@#$%^&*()_+|',
		'QWERTYUIOP{}',
		'ASDFGHJKL:"',
		'ZXCVBNM<>?', ' '
);

var mappedShiftedKey = new Array (
		'!,#$%×،*)(_+|',
		'ًٌٍَُِّْ][}{',
		'ؤئيإأآة»«:؛',
		'ك‡ژ‡‡‡ء><؟', ZWNJ
);

var orgkey = originKey.join('')+ originShiftedKey.join('')+ '`~';
var mapkey = mappedKey.join('')+ mappedShiftedKey.join('')+ PEH+ ZWJ;


var isiri2901_lang = 1;        // 1: Persian, 0: English
var isiri2901_nativelang = 0;  // 1: Persian, 0: English

var is_first = 0;

    function refreshLangIndicator(obj2)
    {
	    obj = document.getElementById(obj2);
	    if(obj!=null)
	        obj.innerHTML = isiri2901_lang==1 ? 'EN' : 'FA';
    }
    function toggleLang(obj, obj2)
    {
     	isiri2901_lang= 1- isiri2901_lang;
	    refreshLangIndicator(obj2);
	    is_first = 1;	    
	    document.getElementById(obj).focus();
	    is_first = 0;
    }
    function focusField (obj2)
{
	if (is_first!=1)
	{
		obj = document.getElementById(obj2);
		isiri2901_lang = obj.innerHTML == 'EN'? 1 : 0;
	}
}

// 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
];
*/

// 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;
  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];

    // changed by Hamid:
	// keyboard map (orgkey and mapkey) comes from keymap.js
    else {
      var character = String.fromCharCode(key);
      var map = orgkey.indexOf(character);
      if (map != -1)
        key = mapkey.charCodeAt(map);
	  if (key == 0x2021) // '‡'
		key = '';
    }


    try {
      // Gecko before banning fake key emission.
      e.initKeyEvent("keypress", true, true, document.defaultView, false, false, true, false, 0, key, obj);
    } catch (err) {
    try {
      // Windows
      e.keyCode = key;
    } catch (err) {
    try {
      // Try inserting at cursor position, Gecko after banning fake key emission
      pnhMozStringInsert(obj, String.fromCharCode(key));
      e.preventDefault();
    } catch (err) {
      // Everything else, simply add to the end of buffer
      obj.value += String.fromCharCode(key);
      e.preventDefault();
    }}}
  }
  return true;
}


function setPersian (obj, quiet)
{
  isiri2901_lang = 1;
  if (obj) {
    obj.style.textAlign = "right";
    obj.style.direction = "rtl";
    obj.focus();
  }
  if (!quiet)
    window.defaultStatus = "Persian Keyboard (Press Ctrl+Alt+Space to change to English)";
  refreshLangIndicator();
}


function setEnglish (obj, quiet)
{
  isiri2901_lang = 0;
  if (obj) {
    obj.style.textAlign = "left";
    obj.style.direction = "ltr";
    obj.focus();
  }
  if (!quiet)
    window.defaultStatus = "English Keyboard (Press Ctrl+Alt+Space to change to Persian)";
  refreshLangIndicator();
}


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 = 100000;
	var PosEnd = PosStart;
	PosStart = elt.selectionStart;
	PosEnd = elt.selectionEnd;
	elt.value = elt.value.slice(0,PosStart)+newtext+elt.value.slice(PosEnd);
	var newpos = PosStart+newtext.length;
	elt.selectionStart = newpos;
	elt.selectionEnd = newpos;
	elt.focus();
}

 function setDropDownValue(id,e)
  {
        var select = document.getElementById(id);
        if(select!=null)
        {
              var key;
              var obj;
              
              if (window.event)
              {
                e = window.event;
                obj = e.srcElement;
                key = e.keyCode;
              }
              else
              {
                obj = e.target;
                key = e.charCode;
              }

            var character = String.fromCharCode(key);
            var map = orgkey.indexOf(character);
            
            if (map != -1)
                key = mapkey.charCodeAt(map);
            else
                return true;
                
            if (key == 0x2021) 
                key = '';
                
            character = String.fromCharCode(key);   
        
            SelIndex = select.selectedIndex;

            for (var option = SelIndex+1; option < select.options.length; option++)
             {
                if(select[option].text.indexOf(character)==0)
                    {
                        select.selectedIndex = option;
                        return true;
                    }
             }
            for (var option = 0; option < select.options.length; option++)
             {
                if(select[option].text.indexOf(character)==0)
                    {
                        select.selectedIndex = option;
                        return true;
                    }
             }                 
        }

        return false;       
}

