/* 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 02, 2005  Pooya Karimian, Fixing vertical & horizontal scrolling
 *
 * 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, 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, 0x06CC, 0x064D, 0x0625, 0x0623,
  0x0622, 0x0651, 0x0629, 0x00BB, 0x00AB, 0x0621, 0x0654, 0x005D,
  0x005B, 0x0652, 0x064B, 0x0626, 0x064F, 0x064E, 0x0670, 0x064C,
  0x0653, 0x0650, 0x06A9, 0x062C, 0x067E, 0x0686, 0x00D7, 0x0640,
  0x0698, 0x0634, 0x0630, 0x0632, 0x06CC, 0x062B, 0x0628, 0x0644,
  0x0627, 0x0647, 0x062A, 0x0646, 0x0645, 0x0626, 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;
}

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)
{
  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)";
}


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)";
}


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();
	
}


function keyp_just_english_number(e)
{
	var key;
	

	if (window.event) {
		e = window.event;
		key = e.keyCode;
	} else {
		key = e.charCode;
	}

	if (key>=48 && key<=57){ // Numbers
	}
	else if(key==40){ // (
	}
	else if(key==41){ // )
	}
	else if(key==43){ // +
	}
	else if(key==45){ // -
	}
	else if(key==47){ // /
	}
	else if(key==32){ // SPACE		
	}		
	else if(key==0){ // Control Keys
	}		
	else {
		return false;
	}
	return true;
}

function keyp_identifier(e)
{
	var key;
	if (window.event) {
		e = window.event;
		key = e.keyCode;
	} else {
		key = e.charCode;
	}

	if (key>=48 && key<=57){ // Numbers
		return true;
	}
	else if (key>=65 && key<=90){ // Large characters
		return true;
	}
	else if(key==95){ // _
		return true;
	}
	else if (key>=97 && key<=122){ // Small characters
		return true;
	}
	else if(key==0){ // Control Keys
		return true;
	}		
	return false;
}

function keyp_email(e){
	var key;
	if (window.event) {
		e = window.event;
		key = e.keyCode;
	} else {
		key = e.charCode;
	}

	if(key==45){ // -
		return true;
	}
	else if(key==44){ // ,
		return true;
	}
	else if(key==46){ // .
		return true;
	}
	else if (key>=48 && key<=57){ // Numbers
		return true;
	}
	else if(key==64){ // @
		return true;
	}
	else if (key>=65 && key<=90){ // Large characters
		return true;
	}
	else if(key==95){ // _
		return true;
	}
	else if (key>=97 && key<=122){ // Small characters
		return true;
	}
	else if(key==0){ // Control Keys
		return true;
	}		
	return false;
}

function number_format(nStr)
{
	var inD='.';
	var outD='.';
	var sep=',';
	
	nStr += '';
	var dpos = nStr.indexOf(inD);
	var nStrEnd = '';
	if (dpos != -1) {
		nStrEnd = outD + nStr.substring(dpos + 1, nStr.length);
		nStr = nStr.substring(0, dpos);
	}
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(nStr)) {
		nStr = nStr.replace(rgx, '$1' + sep + '$2');
	}
	return nStr + nStrEnd;
}

function printIt(tableID) {
	var tableHTML=document.getElementById(tableID).outerHTML;
	var tableHeight=parseInt(document.getElementById(tableID).offsetHeight);
	var tableWidth=parseInt(document.getElementById(tableID).offsetWidth);
	var exWidth=70;
	var exHeight=100;
	if(tableWidth+exWidth>650)
		tableWidth=650-exWidth;
	if(tableHeight+exHeight>600)
		tableHeight=600-exHeight;
	var features="top=100,left=100,width="+(tableWidth+exWidth)+",height="+(tableHeight+exHeight)+",resizable=1,scrollbars=1";
	var printWindow= window.open('','',features);
	var topHTML="";
	var links=document.getElementsByTagName("LINK");
	var styles="";
	for(i=0;i<links.length;i++) {
		styles+=links[i].outerHTML+"\n";
	}
	topHTML+="<html>\n<head>\n";
	topHTML+="<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>";
	topHTML+=styles;
	topHTML+="</head>\n<body dir=rtl>";
	//topHTML+="<table border='0' cellpadding='0' cellspacing='0' width='100%'>\n";
	//topHTML+="<tr><td><table border='0' width='100%' cellspacing='0' cellpadding='0'><tr><td><table border='0' cellpadding='0' cellspacing='0'><tr><td><img border='0' src='/images/header/ver_2/logo.gif'></td></tr><tr><td height='5'></td></tr></table></td><td width='100%' valign='bottom'></td></tr></table></td></tr><tr><td background='/images/header/in/dot_horz_menu.gif' height='1'></td></tr><tr><td height='1' bgcolor='#FEF8E8'><table border='0' width='100%' cellspacing='0' cellpadding='0'><tr><td nowrap bgcolor='#868686' width='2'></td><td bgcolor='#DEDEDE' nowrap width='96' align='center'><img border=0' src='/images/header/in/site-title.gif'></td><td bgcolor='#E77512' nowrap width='2'></td><td width='100%'><table border='0' cellspacing='0' cellpadding='0' width='100%'><tr><td colspan='5' height='2'></td></tr><tr><td width='25' nowrap></td><td nowrap class='classchap'></td><td width='100%' align='left' valign='top'></td></tr></table></td></tr></table></td></tr><tr><td background='/images/header/in/dot_horz_menu.gif' height='1'></td></tr><tr><td height='10'></td></tr>";
	var botHTML="\n</table></body>\n</html>";
	printWindow.document.open();
	printWindow.document.write(topHTML);
	printWindow.document.write(tableHTML);
	printWindow.document.write(botHTML);
	printWindow.document.close();
	printWindow.print();
}

