/* New Arabic Keyboard Map  ISLAM-91 by Islam Adel
 copyright 2007 Islam Adel
you are not allowed to copy, modify or redestribute this script without the authors permission
 */


var islam91_lang = 1;        // 1: Arabic, 0: English
var islam91_nativelang = 0;  // 1: Arabic, 0: English

// Arabic keyboard map based on ISLAM-91

// & @

var islamkey = [
//not-found, 1111111111,   @@@@@@,    3333333 ,   4 44444 ,    5555555 ,  777777  ,    @@@@
0x0020, 0x0661, 0x0022, 0x0663, 0x0664, 0x0665, 0x0667, 0x0040,
// 55555,    0000000  ,  8888888,  +++++++++++,   ara.comma,  -------------,  ...................,  //////////
0x0669, 0x0660, 0x0668, 0x002B, 0x060c, 0x002D, 0x002E, 0x002F,
// zero,        one              , two              , three          , four,               five,             six,               seven
0x066A, 0x0021, 0x0621, 0x0639, 0x0023, 0x062E, 0x0637, 0x062d,
// eight,       nine          ,  ::::::::::::::::,   ;;;;;;;;;;;;;;;;;;;  , <<<<<<<<<<<<< ,  =========,  >>>>>>>>>>>>>,  ?????????,   2222222
0x002A, 0x0635, 0x003A, 0x061B, 0x003E, 0x003D, 0x003C, 0x061F, 0x0662,
// AAAAAAAA, BBBBBBBBBB, CCCCCCCCC, DDDDDDD,EEEEEEEEE, FFFFFFFFFF, GGGGGGGG, 
   0x0623, 0x0024, 0x0630, 0x0636, 0x064d, 0x064e, 0x064b,
// HHHH, IIIIIIIII, JJJJJJJJJ, KKKKKKKKK, LLLLLLLLL, MMMMMM, NNNNNN, OOOOOOO, 
0x0629, 0x0625, 0x0020, 0x0650, 0x064d, 0x005E, 0x20ac, 0x064c,
// PPPPPP,  QQQQQQ, RRRRRRRRR, SSSSSS,    TTTTTTT,   UUUUUU,  VVVVVVVVV, WWWW
0x0622, 0x005b, 0x0026, 0x0652, 0x0629, 0x0624, 0x064b, 0x005d,
// XXXXX,  YYYYYYYY, ZZZZZZZ,  [[[[[[[[[[[[[,   \\\\\\\\\\ , ]]]]]]]]]]]   ,    666666, _________,  ``````````
0x0651, 0x0626, 0x0638, 0x0029, 0x005c, 0x0028, 0x0666, 0x0640, 0x0027,
//  aaaaaaaa,   bbbbbbbb,     cccccccc  , dddddddd,     eeeeeeeee,  ffffffff,  ggggggggggg
  0x0627, 0x0628, 0x062B, 0x062F, 0x0650, 0x0641, 0x063A,
//  hhhhhhhh,  iiiiiiiiiii, jjjjjjjjjjjjjjj  ,kkkkkkkkk,  lllllllllllllll,  mmmmmmmmm,  nnnnnnnnnn, oooooooooo,
  0x0647, 0x064A, 0x062C, 0x0643, 0x0644, 0x0645, 0x0646, 0x064f,
//  pppppppp, qqqqqqqq,rrrrrrrr  ,sssssss,  ttttttttt,  uuuuuuu, vvvvvvv, wwwww,
  0x0649, 0x0642, 0x0631, 0x0633, 0x062A, 0x0648, 0x064e, 0x0648, 
//  xxxxxx, yyyyyyyyy, zzzzzzzz,        {{{{{{{{{{{[,     ||||||||||||,     }}}}}}}}}}},   ~~~~~~~~
 0x0634, 0x064A, 0x0632, 0x007D, 0x007C, 0x007B, 0x007E
];

// on Alt+Ctrl+anything, switch language
function ArabicKeyDown(e)
{
  if (window.event)
    e = window.event;
  if (e.ctrlKey && e.altKey) {
    if (islam91_lang == 0)
      setArabic();
    else
      setEnglish();
    try {
      e.preventDefault();
    } catch (err) {
    }
    return false;
  }
  return true;
}

var pk_test_ev;

function ArabicKeyPress(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) {
    islam91_nativelang = 1;
    setArabic();
  } else
    if (islam91_nativelang == 1) {
      islam91_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 (islam91_lang == 1) { //If Arabic

    // rewrite key
    var newkey;
    if (key == 0x0020 && e.shiftKey) // Shift-space -> ZWNJ
      newkey = 0x200C;
    else
      newkey = islamkey[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 setArabic (obj, quiet)
{
  islam91_lang = 1;
  if (obj) {
    obj.style.textAlign = "right";
    obj.style.direction = "rtl";
    obj.focus();
  }
  if (!quiet)
    window.defaultStatus = "Arabic Keyboard (Press Ctrl+Alt+Space to change to English)";
}


function setEnglish (obj, quiet)
{
  islam91_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 Arabic)";
}


function toggleDir (obj, quiet) {
  var isrtl = 0;
  if (obj)
    isrtl = obj.style.direction != 'ltr';
  else
    isrtl = islam91_lang;
  if (isrtl)
   setEnglish(obj, quiet);
  else
   setArabic(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();
	
}
