var curTab = 1; //current tab var tabText = new Array('', '', '', ''); //Latin to Arabic Array var sConvertLatin2Arabic = new Array( '(^|[^a-zêîûçş0-9\'’])([aeiouêîû])', '$1ئ$2', //insert hamza '(ئ)([uû])([^êîûçşa-z0-9])', 'و$3', //omit the inserted hamza for 'u' (=and) 'a', 'ا', 'b', 'ب', 'ch|ç', 'چ', 'c', 'ج', 'd', 'د', 'ee|ê|é', 'ێ', 'e', 'ە', 'f', 'ف', 'gh', 'غ', 'g', 'گ', 'hh', 'ح', 'sh|ş', 'ش', 'h', 'ھ', 'î|y|í', 'ی', 'j', 'ژ', 'k', 'ک', 'll', 'ڵ', 'l', 'ل', 'm', 'م', 'n', 'ن', 'o', 'ۆ', 'p', 'پ', 'q', 'ق', 'rr', 'ڕ', 'r', 'ر', 's', 'س', 't', 'ت', 'uu|û|ú', 'وو', 'u|w', 'و', 'v', 'ڤ', 'x', 'خ', 'z', 'ز', '\'|’', 'ع', '\\u003F', '؟', //question mark '\,', '،', '\;', '؛' ); var sSuffixes = new Array( '[ ]+()ئ(م|ی|ە|ین|ن|ا|ێ|ێن)($|[^ء-يٱ-ە])', //e.g. ziman a '[ ]+()(یی|یە|یا|یێ|یێن)($|[^ء-يٱ-ە])', //e.g. zana ye '([^ء-يٱ-ە])ئ(م|ی|ە|ین|ن|ا|ێ|ێن)($|[^ء-يٱ-ە])' //e.g. (ziman)a ); var sCapitalLetters = new Array( 'ê', 'Ê', 'î', 'Î', 'û', 'Û', 'ç', 'Ç', 'ş', 'Ş' ); // Arabic to Latin Array var sConvertArabic2Latin = new Array( //managing 'و' and 'ی' 'و([اێۆە])', 'w$1', //و + vowel => w (e.g. wan) 'ی([اێۆە])', 'y$1', //ی + vowel => y (e.g. yas) '([اێۆە])و', '$1w', //vowel + و => w (e.g. kew) '([اێۆە])ی', '$1y', //vowel + ی => y (e.g. bey) '(^|[^ء-يٱ-ەwy])و([^ء-يٱ-ەwy])', '$1û$2', //non-letter + 'و' + non-letter => û (=and) '(^|[^ء-يٱ-ەwy])و', '$1w', //non-letter + 'و' => w (e.g. wtar) 'یو', 'îw', //'ی' + 'و' => îw (e.g. nîw) 'یی', 'îy', //'ی' + 'ی' => îy (e.g. kanîy) 'وی', 'uy', //'و' + 'ی' => uy (e.g. buyn) 'وو', 'û', //'و' + 'و' => û (e.g. bû) 'ی', 'î', 'و', 'u', 'uu', 'û', //'و' + 'و' => û (e.g. bû) '([ء-يٱ-ەîuûwy])ڕ', '$1rr', //when 'ڕ' not at the beginning of a word => rr 'ر|ڕ', 'r', 'ش', 'ş', 'ئ', '', 'ا', 'a', 'ب', 'b', 'چ', 'ç', 'ج', 'c', 'د', 'd', 'ێ', 'ê', 'ە|ه', 'e', 'ف', 'f', 'خ|غ', 'x', 'گ', 'g', 'ح|ھ', 'h', 'ژ', 'j', 'ک', 'k', 'ڵ', 'll', 'ل', 'l', 'م', 'm', 'ن', 'n', 'ۆ', 'o', 'پ', 'p', 'ق', 'q', 'س', 's', 'ت', 't', 'ڤ', 'v', 'ز', 'z', 'ع', '\'', '', '', '؟', '?', '،', '\,', '؛', '\;', '٠|۰', '0', '١|۱', '1', '٢|۲', '2', '٣|۳', '3', '٤|۴', '4', '٥|۵', '5', '٦|۶', '6', '٧|۷', '7', '٨|۸', '8', '٩|۹', '9', '»|«', '"', 'ـ', '', //insert i where applicable 'll', 'Ľ', //temporary conversion to avoid seeing ll as 2 letters 'rr', 'Ŕ', //temporary conversion to avoid seeing rr as 2 letters '([bcçdfghjklĽmnpqrŔsştvwxz])([fjlĽmnrŔsşvwxyz])([fjlĽmnrŔsşvwxyz])([^aeêiîouûy])', '$1$2i$3$4', //e.g. grft -> grift '([aeêiîouû])([bcçdfghjklĽmnpqrŔsştvwxz])([bcçdfghjklĽmnpqrŔsştvwxz])([bcçdfghjklĽmnpqrŔsştvwxz])\\b', '$1$2$3i$4', //e.g. cejnt -> cejnit '([fjlĽrŔsşwyz])([fjlĽmnrŔsşvwxyz])([bcçdfghjklĽmnpqrŔsştvwxz])', '$1i$2$3', //e.g. wrd -> wird '([bcçdghkmnpqtvx])([fjlĽmnrŔsşvwxyz])($|[^aeêiîouû])', '$1i$2$3', //e.g. prd -> pird '([^aeêiîouû])([bcçdghkmnpqtvx])([fjlĽmnrŔsşvwxyz])($|[^aeêiîouû])', '$1$2i$3$4', //repeat the latter expression, in case skipped '(^|[^aeêiîouy])([bcçdfghjklĽmnpqrŔsştvwxz])([bcçdfghjklĽmnpqrŔsştvwxz])($|[^aeêiîouû])', '$1$2i$3$4', //e.g. ktk -> kitk '(^|[^a-zçşêîûĽŔ])([bcçdfghjklĽmnpqrŔsştvwxz])(\\s)', '$1$2i$3', //e.g. j -> ji 'Ľ', 'll', //revert the temporary conversion 'Ŕ', 'rr' //revert the temporary conversion ); var sOnsetI = new Array( '([bcçdfghjklmnpqrsştvwxz])([wy][aeêiîouû])', '$1i$2', //e.g. dyar -> diyar '(^|[^a-zêîûçş0-9\'’])([bcçdfghjklĽmnpqrŔsştvwxz])([bcçdfghjklĽmnpqrŔsştvwxz])', '$1$2i$3', //e.g. bra -> bira '([bcçdfghjklmnpqrsştvwxz][bcçdfghjklĽmnpqrŔsştvwxz])([bcçdfghjklĽmnpqrŔsştvwxz])', '$1i$2' //e.g. aşkra -> aşkira ); // Standardize Arabic scripts Array var sConvertStandardise = new Array( '{1,}', '', //omit multiple successive zero-width non-joiners 'لاَ|لأ|لآ', 'ڵا', 'لً|لَ', 'ڵ', 'ض', 'چ', 'ث', 'پ', 'ظ', 'ڤ', 'ط', 'گ', 'ىَ|يَ|یَ', 'ێ', 'رِ', 'ڕ', 'ؤ|وَ', 'ۆ', 'ي|ى', 'ی', 'ذ', 'ژ', 'ك', 'ک', // using unicode: 06D5 (Arabic letter Ae) for E // using unicode: 06BE (Arabic letter He Doachashmee) for H 'ه', 'ھ', 'ه($|[^ء-يٱ-ە])', 'ە$1', 'ە', 'ە', 'ة', 'ە', 'ه', 'ھ', // rest of هs are H '([ء-يٱ-ە])([^ء-يٱ-ە])', '$1$2' ); var sAliWeb = new Array( 'ص', 'ێ', 'أ', 'ڕ' ); var sConvertDilan = new Array( 'ص', 'ڵ', 'ث', 'ێ', 'ذ', 'ڕ' ); // Latin type Array var sConvertLatin = new Array( //typed, Hawar 'ee', 'ê', 'ii', 'î', 'uu', 'û', 'Ee|EE', 'Ê', 'Ii|II', 'Î', 'Uu|UU', 'Û', 'ch', 'ç', 'sh', 'ş', 'Ch|CH', 'Ç', 'Sh|SH', 'Ş' ); var sNumbers = new Array( '0', '٠', '1', '١', '2', '٢', '3', '٣', '4', '٤', '5', '٥', '6', '٦', '7', '٧', '8', '٨', '9', '٩' ); //Arabic type Array var sKeyboardLayouts = new Array( //English keyboard, Rojhellat keyboard, Bakur keyboard, Bashur Keyboard //numbers row '`', 'پ', '', 'ژ', '1', '١', '١', '١', '2', '٢', '٢', '٢', '3', '٣', '٣', '٣', '4', '٤', '٤', '٤', '5', '٥', '٥', '٥', '6', '٦', '٦', '٦', '7', '٧', '٧', '٧', '8', '٨', '٨', '٨', '9', '٩', '٩', '٩', '0', '٠', '٠', '٠', '-', '-', '+', '-', '=', '=', '\'', '=', //numbers row shifted '~', '~', '~', '~', '!', '!', '!', '!', '@', '@', '@', '@', '#', '#', '#', '#', '$', '$', '$', '$', '%', '%', '%', '%', '^', '÷', '^', '^', '&', '×', '&', '&', '*', '*', '*', '*', '(', ')', ')', ')', ')', '(', '(', '(', '_', 'ـ', '_', '_', '+', '+', '+', '+', //letters top row 'q', 'ڵ', 'ق', 'چ', 'w', 'ۆ', 'و', 'ص', 'e', 'ێ', 'ە', 'پ', 'r', 'ق', 'ر', 'ق', 't', 'ف', 'ت', 'ف', 'y', 'غ', 'ی', 'غ', 'u', 'ع', 'و', 'ع', 'i', 'ە', 'ئ', 'ھ', 'o', 'خ', 'ۆ', 'خ', 'p', 'ح', 'پ', 'ح', '[', 'ج', 'وو', 'ج', ']', 'چ', 'ش', 'د', '\\', 'ژ', 'چ', '\\', //letters top row shifted 'Q', 'ض', '`', 'ض', 'W', 'ص', 'وو', '}', 'E', 'ث', 'ي', 'ث', 'R', 'ك', 'ڕ', '{', 'T', 'ي', 'ط', 'ڤ', 'Y', '_', 'ێ', 'إ', 'U', '', 'ء', '', 'I', 'ه', 'ع', '÷', 'O', ',', 'ؤ', '×', 'P', '', 'ث', '؛', '{', ']', ']', '>', '}', '[', '[', '<', '|', '|', '|', '|', //letters mid row 'a', 'ش', 'ا', 'ش', 's', 'س', 'س', 'س', 'd', 'ی', 'د', 'ی', 'f', 'ب', 'ف', 'ب', 'g', 'ل', 'گ', 'ل', 'h', 'ا', 'ھ', 'ا', 'j', 'ت', 'ژ', 'ت', 'k', 'ن', 'ک', 'ن', 'l', 'م', 'ل', 'م', ';', 'ک', 'ێ', 'ک', '\'', 'گ', 'ی', 'گ', //letters mid row shifted 'A', '»', 'آ', ']', 'S', '«', 'ش', '[', 'D', 'ێ', 'ذ', 'ێ', 'F', '', 'إ', '', 'G', 'ڵ', 'غ', 'ڵ', 'H', 'ئا', 'ە', 'أ', 'J', 'ء', 'أ', 'ـ', 'K', '}', 'ك', '،', 'L', '{', 'ڵ', '/', ':', ':', ':', 'ك', '"', '؛', '"', 'ط', //letters bottom row 'z', 'ڤ', 'ز', 'ئ', 'x', 'ھ', 'خ', 'ء', 'c', 'ز', 'ج', 'ۆ', 'v', 'ر', 'ڤ', 'ر', 'b', 'ڕ', 'ب', 'لا', 'n', 'د', 'ن', 'ی', 'm', 'ئ', 'م', 'ە', ',', 'و', '،', 'و', '.', '.', '.', 'ز', '/', '/', '-', '/', //letters bottom row shifted 'Z', 'ظ', 'ض', '', 'X', 'ط', 'ص', 'وو', 'C', 'ژ', 'چ', 'ؤ', 'V', 'ڕ', 'ظ', 'ڕ', 'B', '', 'ى', 'ڵا', 'N', 'ذ', 'ة', 'آ', 'M', 'ة', 'ـ', 'ة', '<', 'ۆ', '>', ',', '>', '،', '<', '.', '?', '؟', '؟', '؟' ); function changeTab(tab) { //preserve tab text tabText[curTab - 1] = document.getElementById('txtIn').value; document.getElementById('txtIn').value = tabText[tab - 1]; //change the tab document.getElementById('tab' + curTab).className = 'unselected'; document.getElementById('tab' + tab).className = 'selected'; document.getElementById('options').style.display = document.getElementById('help').style.display = 'none'; document.getElementById('optionsButton').className = document.getElementById('helpButton').className = ''; if (tab == 5) { document.getElementById('converting').style.display = 'none'; document.getElementById('typeArabic').style.display = 'block'; } else { document.getElementById('converting').style.display = 'block'; document.getElementById('typeArabic').style.display = 'none'; } //set the options related to the picked tab switch (tab) { case 1: //Arabic to Latin document.getElementById('txtIn').dir = 'rtl'; document.getElementById('txtOut').dir = 'ltr'; break; case 2: //Latin to Arabic document.getElementById('txtIn').dir = 'ltr'; document.getElementById('txtOut').dir = 'rtl'; break; case 3: //Standardise Arabic document.getElementById('txtIn').dir = 'rtl'; document.getElementById('txtOut').dir = 'rtl'; break; case 4: //Type Latin document.getElementById('txtIn').dir = 'ltr'; document.getElementById('txtOut').dir = 'ltr'; break; } //set the passed function parameter as the current tab curTab = tab; convert(); return false; } function convert() { var s = document.getElementById('txtIn').value; switch (curTab) { case 1: //Arabic to Latin // standardize Arabic before converting Arabic to Latin if (document.getElementById('chkDilan').checked) for (i = 0; i < sConvertDilan.length; i += 2) s = s.replace(new RegExp(sConvertDilan[i], 'g'), sConvertDilan[i + 1]); if (document.getElementById('chkAliWeb').checked) for (i = 0; i < sAliWeb.length; i += 2) s = s.replace(new RegExp(sAliWeb[i], 'g'), sAliWeb[i + 1]); for (i = 0; i < sConvertStandardise.length; i += 2) s = s.replace(new RegExp(sConvertStandardise[i], 'g'), sConvertStandardise[i + 1]); //main conversion for (i = 0; i < sConvertArabic2Latin.length; i += 2) s = s.replace(new RegExp(sConvertArabic2Latin[i], 'gim'), sConvertArabic2Latin[i + 1]); s = s.replace(new RegExp('ll', 'gim'), 'Ľ').replace(new RegExp('rr', 'gim'), 'Ŕ'); //temporary conversion //add extra i's for Kurmanci texts if (!document.getElementById('chkOnsetI').checked) for (i = 0; i < sOnsetI.length; i += 2) s = s.replace(new RegExp(sOnsetI[i], 'gim'), sOnsetI[i + 1]); //e.g. bra -> bira s = s.replace(new RegExp('Ľ', 'gim'), 'll').replace(new RegExp('Ŕ', 'gim'), 'rr'); //temporary conversion //capitalise the first words of sentences if (document.getElementById('chkCapitaliseSentence').checked) s = s.replace(new RegExp('(^|\r\n|[\\.\\u003F!] [^a-zêîûçş0-9\'’]*)([a-zêîûçş])', 'gm'), function (m, p1, p2) { for (i = 0; i < sCapitalLetters.length; i += 2) p2.replace(sCapitalLetters[i], sCapitalLetters[i + 1]); return p1 + p2.toUpperCase(); }); break; case 2: //Latin to Arabic //main conversion for (i = 0; i < sConvertLatin2Arabic.length; i += 2) s = s.replace(new RegExp(sConvertLatin2Arabic[i], 'gim'), sConvertLatin2Arabic[i + 1]); //convert numbers if (document.getElementById('chkConvertNumbers').checked) for (i = 0; i < sNumbers.length; i += 2) s = s.replace(new RegExp(sNumbers[i], 'g'), sNumbers[i + 1]); //convert ii and i based on the option selected if (!document.getElementById('chkTreatI').checked) s = s.replace(new RegExp('ii', 'gi'), 'ی').replace(new RegExp('i', 'gi'), ''); else s = s.replace(new RegExp('i', 'gi'), 'ی'); //when user chooses to recoginse the dependent verb 'to be' can be separated (e.g. kurd in = kurdin) if (document.getElementById('chkConnectSuffixes').checked) for (i = 0; i < sSuffixes.length; i++) s = s.replace(new RegExp(sSuffixes[i], 'gim'), '$1$2$3'); break; case 3: //Standardise Arabic //do Dilan conversions if requested if (document.getElementById('chkDilan').checked) for (i = 0; i < sConvertDilan.length; i += 2) s = s.replace(new RegExp(sConvertDilan[i], 'g'), sConvertDilan[i + 1]); //Ali Web fonts if (document.getElementById('chkAliWeb').checked) for (i = 0; i < sAliWeb.length; i += 2) s = s.replace(new RegExp(sAliWeb[i], 'g'), sAliWeb[i + 1]); //main conversion for (i = 0; i < sConvertStandardise.length; i += 2) s = s.replace(new RegExp(sConvertStandardise[i], 'g'), sConvertStandardise[i + 1]); //convert numbers if requested if (document.getElementById('chkConvertNumbers').checked) for (i = 0; i < sNumbers.length; i += 2) s = s.replace(new RegExp(sNumbers[i], 'g'), sNumbers[i + 1]); break; case 4: //Type Latin for (i = 0; i < sConvertLatin.length; i += 2) s = s.replace(new RegExp(sConvertLatin[i], 'g'), sConvertLatin[i + 1]); break; } document.getElementById('txtOut').value = s; } function getKeyStroke(e) { //get the pressed key var c = String.fromCharCode(window.event ? e.keyCode : e.which); //which keyboard layout is selected var keybrd; if (document.getElementById('optRojhellat').checked) keybrd = 1; else if (document.getElementById('optBakur').checked) keybrd = 2 else keybrd = 3; //find a substitute for the keyboard input based on the selected keyboard layout for (i = 0; i < sKeyboardLayouts.length; i += 4) if (sKeyboardLayouts[i] == c) { document.getElementById('txtArabic').value += sKeyboardLayouts[i + keybrd]; return false; } //there's no equivalent for the pressed key so don't change it return true; } function maximise() { if (document.getElementById('wrapper').className == 'normal') { document.getElementById('wrapper').className = 'max'; document.getElementById('maximiseButton').innerHTML = 'Restore'; } else { document.getElementById('wrapper').className = 'normal'; document.getElementById('maximiseButton').innerHTML = 'Maximise'; } return false; } function showHelp() { var showOrHide = document.getElementById('help').style.display != 'block'; document.getElementById('helpButton').className = showOrHide ? 'selected' : ''; document.getElementById('optionsButton').className = ''; document.getElementById('help').style.display = showOrHide ? 'block' : 'none'; document.getElementById('converting').style.display = document.getElementById('typeArabic').style.display = document.getElementById('options').style.display = 'none'; if (showOrHide) document.getElementById('tab' + curTab).className = 'unselected'; else changeTab(curTab); return false; } function showOptions() { var showOrHide = document.getElementById('options').style.display != 'block'; document.getElementById('optionsButton').className = showOrHide ? 'selected' : ''; document.getElementById('helpButton').className = ''; document.getElementById('options').style.display = showOrHide ? 'block' : 'none'; document.getElementById('converting').style.display = document.getElementById('typeArabic').style.display = document.getElementById('help').style.display = 'none'; if (showOrHide) document.getElementById('tab' + curTab).className = 'unselected'; else changeTab(curTab); return false; }