// Set of Characters
var textarea_bn; //active text area
var unijoy = new Array();
// the word those are use pre-character
var rashed_swap_array = new Array();
rashed_swap_array[0] = 'c'; // e kar
rashed_swap_array[1] = 'C'; //Oi Kar
rashed_swap_array[2] = 'd'; // hrossho i kar
// the word those are use before-character
var hr_post_array = new Array();
hr_post_array[0] = 'f'; // e kar
hr_post_array[1] = 'D'; //Oi Kar
hr_post_array[2] = 'X'; // hrossho i kar
hr_post_array[3] = 'Z'; // hrossho i kar
// the words which are not character
var hr_not_character = new Array();
hr_not_character[0] = 'c'; // e kar
hr_not_character[1] = 'C'; //Oi Kar
hr_not_character[2] = 'd'; // hrossho i kar
hr_not_character[3] = 'f'; // e kar
hr_not_character[4] = 'D'; //Oi Kar
hr_not_character[5] = 'X'; // hrossho i kar
hr_not_character[6] = 'Z'; // hrossho i kar
// unijoy bangla equivalents
unijoy['j'] = "\u0995"; // ko
unijoy['d'] = '\u09BF'; // hrossho i kar
unijoy['gd'] = '\u0987'; // hrossho i
unijoy['D'] = '\u09C0'; // dirgho i kar
unijoy['gD'] = '\u0988'; // dirgho i
unijoy['c'] = '\u09C7'; // e kar
unijoy['gc'] = '\u098F'; // E
unijoy['gs'] = '\u0989'; // hrossho u
unijoy['s'] = '\u09C1'; // hrossho u kar
unijoy['S'] = '\u09C2'; // dirgho u kar
unijoy['gS'] = '\u098A'; // dirgho u
unijoy['v'] = '\u09B0'; // ro
unijoy['a'] = '\u098B'; // wri
unijoy['f'] = '\u09BE'; // a kar
unijoy['gf'] = '\u0986'; //shore a
unijoy['F'] = '\u0985'; // shore ao
//unijoy['ao']='\u0985'; // shore o
unijoy['n'] = '\u09B8'; // dontyo so
unijoy['t'] = '\u099f'; // to
unijoy['J'] = '\u0996'; // Kho
//unijoy['kh'] = '\u0996'; // kho
unijoy['b'] = '\u09A8'; // dontyo no
unijoy['B'] = '\u09A3'; // murdhonyo no
unijoy['k'] = '\u09A4'; // tto
unijoy['K'] = '\u09A5'; // ttho
unijoy['e'] = '\u09A1'; // ddo
unijoy['E'] = '\u09A2'; // ddho
unijoy['h'] = '\u09AC'; // bo
unijoy['H'] = '\u09AD'; // bho
//unijoy['v']='\u09AD'; // bho
//unijoy['rh']='o'; // doye bindu ro
unijoy['p'] = '\u09DC'; // doye bindu ro
unijoy['P'] = '\u09DD'; // dhoye bindu ro
unijoy['o'] = '\u0997'; // go
unijoy['O'] = '\u0998'; // gho
//unijoy['gh']='\u0998'; // gho
unijoy['i'] = '\u09B9'; // ho
unijoy['I'] = '\u099E'; // yo
unijoy['u'] = '\u099C'; // borgio jo
unijoy['U'] = '\u099D'; // jho
//unijoy['jh']='\u099D'; // jho
unijoy['y'] = '\u099A'; // cho
unijoy['Y'] = '\u099B'; // cho
//unijoy['C']='\u099B'; // ccho
unijoy['T'] = '\u09A0'; // tho
unijoy['r'] = '\u09AA'; // po
unijoy['R'] = '\u09AB'; // fo
//unijoy['ph']='\u09AB'; // fo
unijoy['l'] = '\u09A6'; // do
unijoy['L'] = '\u09A7'; // dho
unijoy['w'] = '\u09AF'; // ontoshyo zo
unijoy['W'] = '\u09DF'; // ontostho yo
unijoy['q'] = '\u0999'; // Uma
unijoy['Q'] = '\u0982'; // uniswor
unijoy['V'] = '\u09B2'; // lo
unijoy['m'] = '\u09AE'; // mo
unijoy['M'] = '\u09B6'; // talobyo sho
unijoy['N'] = '\u09B7'; // mordhonyo sho
unijoy['gx'] = '\u0993'; //'\u09CB'; // o
unijoy['X'] = '\u09CC'; // ou kar
unijoy['gX'] = '\u0994'; // OU
//unijoy['Ou']='\u0994'; // OU
unijoy['gC'] = '\u0990'; // Oi
//unijoy['\\']='\u09CE'; // tto
//unijoy['|']='\u0983'; // bisworgo
unijoy["G"] = "\u0964"; // dari
//unijoy[".."] = "."; // fullstop
//unijoy['g'] = ' '; //'\u09CD' + '\u200c'; // hosonto
unijoy['g'] = '\u09CD'; //change by rashed
unijoy['&'] = '\u0981'; // chondrobindu
unijoy['Z'] = '\u09CD' + '\u09AF'; // jo fola
unijoy['gh'] = '\u09CD' + '\u09AC'; // bo fola
unijoy['ga'] = '\u098B'; // wri kar
unijoy['a'] = '\u09C3'; // wri
//unijoy['k'] ="\u0995" + '\u09CD'+ '\u09B8';
unijoy['rZ'] = unijoy['r'] + '\u200c' + '\u09CD' + '\u09AF';
unijoy['z'] = '\u09CD' + unijoy['v'];
unijoy['x'] = '\u09CB';
unijoy['C'] = '\u09C8'; //Oi Kar
unijoy['\\'] = '\u0983';
unijoy['|'] = '\u09CE'; // bisworgo
var carry = ''; //This variable stores each keystrokes
var carry_rashed = '';
var old_len = 0; //This stores length parsed bangla charcter
var ctrlPressed = false;
var first_letter = false;
var lastInserted;
isIE = document.all ? 1 : 0;
var switched = false;
function checkKeyDown(ev) {
//just track the control key
var e = (window.event) ? event.keyCode : ev.which;
if (e == '17') {
ctrlPressed = true;
}
}
function checkKeyUp(ev) {
//just track the control key
var e = (window.event) ? event.keyCode : ev.which;
if (e == '17') {
ctrlPressed = false;
//alert(ctrlPressed);
}
}
function parseunijoy(evnt, textarea_bn) {
// main unijoy parser
//var t = document.getElementById(textarea_bn); // the active text area
var t=textarea_bn;
var myField;
myField=t;
var e = (window.event) ? event.keyCode : evnt.which; // get the keycode
if (e == '113') {
//switch the keyboard mode
if (ctrlPressed) {
switched = !switched;
//alert("H"+switched);
return true;
}
}
if (switched) return true;
if (ctrlPressed) {
// user is pressing control, so leave the parsing
e = 0;
}
var char_e = String.fromCharCode(e); // get the character equivalent to this keycode
if (e == 8 || e == 32) {
// if space is pressed we have to clear the carry. otherwise there will be some malformed conjunctions
carry = " ";
old_len = 1;
return;
}
lastcarry = carry;
carry += "" + char_e; //append the current character pressed to the carry
carry_rashed = carry;
bangla = parseunijoyCarry(carry); // get the combined equivalent
tempBangla = parseunijoyCarry(char_e); // get the single equivalent
if (tempBangla == ".." || bangla == "..") //that means it has sibling
{
return false;
}
if (char_e == "g") {
if (carry == "gg") {
// check if it is a plus sign
insertConjunction('\u09CD' + '\u200c', old_len);
old_len = 1;
return false;
}
//otherwise this is a simple joiner
insertAtCursor("\u09CD",t); old_len = 1;
carry = "g";
return false;
}
else if (old_len == 0) //first character
{
// this is first time someone press a character
insertConjunction(bangla, 1,t);
old_len = 1;
return false;
}
else if (char_e == "A") {
//process old style ref
// if (Check_Post_Character_Exist(get_unicode_to_character_rashed(lastInserted)) == 1) {
newChar = unijoy['v'] + '\u09CD' + lastInserted;
// var myField = document.getElementById('textarea_bn');
var value_field = "";
var startPos = myField.selectionStart;
var last_fifth_one = myField.value.substring(startPos - 5, startPos - 4);
var last_forth_one = myField.value.substring(startPos - 4, startPos - 3);
var last_third_one = myField.value.substring(startPos - 3, startPos - 2);
var last_second_one = myField.value.substring(startPos - 2, startPos - 1);
var last_one = myField.value.substring(startPos - 1, startPos);
//
// if character[last] is character: gorto,
//
if (Check_Character_Exist_orNot(get_unicode_to_character_rashed(last_one)) == 0) {
// if last previous one is g then "ref" add with (g-1) located character
if (get_unicode_to_character_rashed(last_second_one) == 'g') {
newChar = unijoy['v'] + '\u09CD' + last_third_one + last_second_one + last_one;
myField.value = myField.value.substring(0, startPos - 4) + myField.value.substring(startPos - 4, startPos - 3) + newChar;
}
else {
newChar = unijoy['v'] + '\u09CD' + last_one;
myField.value = myField.value.substring(0, startPos - 2) + myField.value.substring(startPos - 2, startPos - 1) + newChar;
}
}
else {
// if last previous one is g then "ref" add with (g-1) located character: kargo
// alert(last_forth_one + ' ' + last_third_one + ' ' + last_second_one + ' ' + last_one);
if (Check_Character_Exist_orNot(get_unicode_to_character_rashed(last_second_one)) == 1) {
if (get_unicode_to_character_rashed(last_forth_one) == 'g') {
newChar = unijoy['v'] + '\u09CD'+ last_fifth_one+ last_forth_one + last_third_one + last_second_one + last_one;
myField.value = myField.value.substring(0, startPos - 6) + myField.value.substring(startPos - 6, startPos - 5) + newChar;
}
else {
newChar = unijoy['v'] + '\u09CD' + last_third_one + last_second_one + last_one;
myField.value = myField.value.substring(0, startPos - 4) + myField.value.substring(startPos - 4, startPos - 3) + newChar;
}
}
else {
// alert(last_forth_one + ' ' + last_third_one + ' ' + last_second_one + ' ' + last_one);
//example: gorde
if (get_unicode_to_character_rashed(last_third_one) == 'g') {
newChar = unijoy['v'] + '\u09CD'+last_forth_one + last_third_one + last_second_one + last_one;
myField.value = myField.value.substring(0, startPos - 5) + myField.value.substring(startPos - 5, startPos - 4) + newChar;
}
else {
newChar = unijoy['v'] + '\u09CD' + last_second_one + last_one;
myField.value = myField.value.substring(0, startPos - 3) + myField.value.substring(startPos - 3, startPos - 2) + newChar;
}
}
}
return false;
}
else if ((bangla == "" && tempBangla != "")) //that means it has no joint equivalent
{
// there is no joint equivalent - so show the single equivalent.
bangla = tempBangla;
if (bangla == "") {
// there is no available equivalent - leave as is
carry = "";
return;
}
else {
// found one equivalent
carry = char_e;
insertAtCursor(bangla,t);
old_len = bangla.length;
return false;
}
}
else if (bangla != "")//joint equivalent found
{
// we have found some joint equivalent process it
insertConjunction(bangla, old_len);
old_len = bangla.length;
return false;
}
}
function parseunijoyCarry(code) {
//this function just returns a bangla equivalent for a given keystroke
//or a conjunction
//just read the array - if found then return the bangla eq.
//otherwise return a null value
if (!unijoy[code]) //Oh my god :-( no bangla equivalent for this keystroke
{
return ''; //return a null value
}
else {
return (unijoy[code]); //voila - we've found bangla equivalent
}
}
function get_unicode_to_character_rashed(param_unicode) {
for (keyVar in unijoy) {
if (unijoy[keyVar] == param_unicode) {
return keyVar;
}
}
return '';
}
//----------------------------------------------Check the bangla pre-vowel-------
function Check_Pre_Character_Exist(p_char) {
var tag_found = 0;
for (var p_char_index = 0; p_char_index < rashed_swap_array.length; p_char_index++) {
if (rashed_swap_array[p_char_index].toString() == p_char) {
tag_found = 1;
return tag_found;
}
}
return tag_found;
}
//-----------------------------------------------------------------------------------
//----------------------------------------------Check the bangla post-character-------
function Check_Post_Character_Exist(p_char) {
var tag_found = 0;
for (var p_char_index = 0; p_char_index < hr_post_array.length; p_char_index++) {
if (hr_post_array[p_char_index].toString() == p_char) {
tag_found = 1;
return tag_found;
}
}
return tag_found;
}
//-----------------------------------------------------------------------------------
//----------------------------------------------Check the bangla post-character-------
function Check_Character_Exist_orNot(p_char) {
var tag_found = 0;
for (var p_char_index = 0; p_char_index < hr_not_character.length; p_char_index++) {
if (hr_not_character[p_char_index].toString() == p_char) {
tag_found = 1;
return tag_found;
}
}
return tag_found;
}
//-----------------------------------------------------------------------------------
function insertAtCursor(myValue,myField) {
/**
* this function inserts a character at the current cursor position in a text area
* many thanks to alex king and phpMyAdmin for this cool function
*
* This function is originally found in phpMyAdmin package and modified by Hasin Hayder to meet the requirement
*/
lastInserted = myValue;
//var myField = document.getElementById('textarea_bn');
if (document.selection) {
//alert("hello2");
myField.focus();
sel = document.selection.createRange();
sel.text = myValue;
sel.collapse(true);
sel.select();
}
//MOZILLA/NETSCAPE support
else if (myField.selectionStart || myField.selectionStart == 0) {
var startPos = myField.selectionStart;
var endPos = myField.selectionEnd;
var scrollTop = myField.scrollTop;
startPos = (startPos == -1 ? myField.value.length : startPos);
//alert(myField.value.substring(startPos - 1, startPos));
// rashed
if (Check_Pre_Character_Exist(get_unicode_to_character_rashed(myValue)) == 1) {
// if user change the cursor and give e-kar in front of any character then
if (myField.value.substring(startPos, startPos + 1) == ' '
|| myField.value.substring(startPos, startPos + 1) == '') {
myField.value = myField.value.substring(0, startPos)
+ '`'
+ myValue
+ myField.value.substring(endPos, myField.value.length);
}
else {
myField.value = myField.value.substring(0, startPos + 1)
+ myValue
+ myField.value.substring(startPos + 1);
}
}
else if (Check_Pre_Character_Exist(carry_rashed.substring(0, 1))) {
if (myField.value.substring(startPos - 2, startPos - 1) == '`') {
myField.value = myField.value.substring(0, startPos - 2)
+ myValue
+ myField.value.substring(startPos - 1, startPos)
+ myField.value.substring(endPos, myField.value.length);
}
else {
myField.value = myField.value.substring(0, startPos - 1)
+ myValue
+ myField.value.substring(startPos - 1, startPos)
+ myField.value.substring(endPos, myField.value.length);
}
}
else {
//
// if any body write like dhoy-dho then it will work
//
// if (carry_rashed.substring(0, 1) != ' '){
if (myField.value.substring(startPos - 1, startPos) != ' ') {
if (carry_rashed.substring(1, 2) == 'g') {
myField.value = myField.value.substring(0, startPos)
+ myValue
+ myField.value.substring(endPos, myField.value.length);
}
else {
if (carry_rashed.substring(0, 1) == 'g') {
if (Check_Pre_Character_Exist(get_unicode_to_character_rashed(myField.value.substring(startPos - 2, startPos - 1))) == 1) {
myField.value = myField.value.substring(0, startPos - 2)
+ myField.value.substring(startPos - 1, startPos)
+ myValue
+ myField.value.substring(startPos - 2, startPos - 1)
+ myField.value.substring(endPos, myField.value.length);
}
else {
myField.value = myField.value.substring(0, startPos)
+ myValue
+ myField.value.substring(endPos, myField.value.length);
}
}
else {
myField.value = myField.value.substring(0, startPos)
+ myValue
+ myField.value.substring(endPos, myField.value.length);
}
}
}
else {
myField.value = myField.value.substring(0, startPos)
+ myValue
+ myField.value.substring(endPos, myField.value.length);
}
}
myField.focus();
myField.selectionStart = startPos+1 + myValue.length;
myField.selectionEnd = startPos+1 + myValue.length;
myField.scrollTop = scrollTop;
} else {
var scrollTop = myField.scrollTop;
myField.value += myValue;
myField.focus();
myField.scrollTop = scrollTop;
}
}
function insertConjunction(myValue, len, myField) {
/**
* this function inserts a conjunction and removes previous single character at the current cursor position in a text area
*
* This function is derived from the original one found in phpMyAdmin package and modified by Hasin to meet our need
*/
lastInserted = myValue;
//var myField = document.getElementById(textarea_bn);
//alert(myField)
if (document.selection) {
myField.focus();
sel = document.selection.createRange();
if (myField.value.length >= len) { // here is that first conjunction bug in IE, if you use the > operator
sel.moveStart('character', -1 * (len));
//sel.moveEnd('character',-1*(len-1));
}
sel.text = myValue;
sel.collapse(true);
sel.select();
}
//MOZILLA/NETSCAPE support
else if (myField.selectionStart || myField.selectionStart == 0) {
myField.focus();
var startPos = myField.selectionStart - len;
var endPos = myField.selectionEnd;
var scrollTop = myField.scrollTop;
startPos = (startPos == -1 ? myField.value.length : startPos);
if (Check_Pre_Character_Exist(get_unicode_to_character_rashed(myField.value.substring(startPos, endPos))) == 1) {
myField.value = myField.value.substring(0, startPos - 1)
+ myValue
+ myField.value.substring(startPos, endPos)
+ myField.value.substring(endPos, myField.value.length);
}
else {
myField.value = myField.value.substring(0, startPos)
+ myValue
+ myField.value.substring(endPos, myField.value.length);
}
myField.focus();
myField.selectionStart = startPos + myValue.length;
myField.selectionEnd = startPos + myValue.length;
myField.scrollTop = scrollTop;
} else {
var scrollTop = myField.scrollTop;
myField.value += myValue;
myField.focus();
myField.scrollTop = scrollTop;
}
//document.getElementById("len").innerHTML = len;
}