ಮೀಡಿಯವಿಕಿ:KnTranslit.js

ವಿಕಿಪೀಡಿಯದಿಂದ, ಇದು ಮುಕ್ತ ಹಾಗೂ ಸ್ವತಂತ್ರ ವಿಶ್ವಕೋಶ

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/*<pre>*/
/*This script is a modified version of Alex benenson's cyrillic translitarator - character translation by [[User:ಶುಶ್ರುತ]] under direction of [[User:ರವಿ]] from Telugu wikipedia*/
var amhaHash='{"k":"ಕ್","ಕ್a":"ಕ","ಕ್A":"ಕಾ","ಕa":"ಕಾ","ಕ್i":"ಕಿ","ಕ್I":"ಕೀ","ಕ್u":"ಕು","ಕ್U":"ಕೂ","ಕ್e":"ಕೆ","ಕ್E":"ಕೇ","ಕi":"ಕೈ","ಕ್o":"ಕೊ","ಕ್O":"ಕೋ","ಕu":"ಕೌ","ಕM":"ಕಂ","ಕH":"ಕಃ","ಕ್R":"ಕೃ","ಕೃu":"ಕೃ","ಕ್h":"ಖ್","K":"ಖ್","ಖ್a":"ಖ","ಖ್A":"ಖಾ","ಖa":"ಖಾ","ಖ್i":"ಖಿ","ಖ್I":"ಖೀ","ಖ್u":"ಖು","ಖ್U":"ಖೂ","ಖ್e":"ಖೆ","ಖ್E":"ಖೇ","ಖೆi":"ಖೈ","ಖ್o":"ಖೊ","ಖ್O":"ಖೋ","ಖu":"ಖೌ","ಖM":"ಖಂ","ಖH":"ಖಃ","ಖ್R":"ಖೃ","ಖೃu":"ಖೃ","g":"ಗ್","ಗ್a":"ಗ","ಗ್A":"ಗಾ","ಗa":"ಗಾ","ಗ್i":"ಗಿ","ಗ್I":"ಗೀ","ಗ್u":"ಗು","ಗ್U":"ಗೂ","ಗ್e":"ಗೆ","ಗ್E":"ಗೇ","ಗi":"ಗೈ","ಗ್o":"ಗೊ","ಗ್O":"ಗೋ","ಗu":"ಗೌ","ಗM":"ಗಂ","ಗH":"ಗಃ","ಗ್R":"ಗೃ","ಗೃu":"ಗೃ","ಗ್h":"ಘ್","G":"ಘ್","ಘ್a":"ಘ","ಘ್A":"ಘಾ","ಘa":"ಘಾ","ಘ್i":"ಘಿ","ಘ್I":"ಘೀ","ಘ್u":"ಘು","ಘ್U":"ಘೂ","ಘ್e":"ಘೆ","ಘ್E":"ಘೇ","ಘi":"ಘೈ","ಘ್o":"ಘೊ","ಘ್O":"ಘೋ","ಘu":"ಘೌ","ಘM":"ಘಂ","ಘH":"ಘಃ","ಘ್R":"ಘೃ","ಘೃu":"ಘೃ","z":"ಙ್","ಙ್a":"ಙ","ಙ್A":"ಙಾ","ಙa":"ಙಾ","ಙ್i":"ಙಿ","ಙ್I":"ಙೀ","ಙ್u":"ಙು","ಙ್U":"ಙೂ","ಙ್e":"ಙೆ","ಙ್E":"ಙೇ","ಙi":"ಙೈ","ಙ್o":"ಙೊ","ಙ್O":"ಙೋ","ಙu":"ಙೌ","ಙM":"ಙಂ","ಙH":"ಙಃ","ಙ್R":"ಙೃ","ಙೃu":"ಙೃ",'; amhaHash+='"c":"ಚ್","ಚ್a":"ಚ","ಚa":"ಚಾ","ಚ್A":"ಚಾ","ಚ್i":"ಚಿ","ಚ್I":"ಚೀ","ಚ್u":"ಚು","ಚ್U":"ಚೂ","ಚ್e":"ಚೆ","ಚ್E":"ಚೇ","ಚi":"ಚೈ","ಚ್o":"ಚೊ","ಚ್O":"ಚೋ","ಚu":"ಚೌ","ಚM":"ಚಂ","ಚH":"ಚಃ","ಚ್R":"ಚೃ","ಚೃu":"ಚೃ","C":"ಛ್","ಚ್h":"ಛ್","ಛ್a":"ಛ","ಛa":"ಛಾ","ಛ್A":"ಛಾ","ಛ್i":"ಛಿ","ಛ್I":"ಛೀ","ಛ್u":"ಛು","ಛ್U":"ಛೂ","ಛ್e":"ಛೆ","ಛ್E":"ಛೇ","ಛi":"ಛೈ","ಛ್o":"ಛೊ","ಛ್O":"ಛೋ","ಛu":"ಛೌ","ಛM":"ಛಂ","ಛH":"ಛಃ","ಛ್R":"ಛೃ","ಛೃu":"ಛೃ","j":"ಜ್","ಜ್a":"ಜ","ಜa":"ಜಾ","ಜ್A":"ಜಾ","ಜ್i":"ಜಿ","ಜ್I":"ಜೀ","ಜ್u":"ಜು","ಜ್U":"ಜೂ","ಜ್e":"ಜೆ","ಜ್E":"ಜೇ","ಜi":"ಜೈ","ಜ್o":"ಜೊ","ಜ್O":"ಜೋ","ಜu":"ಜೌ","ಜM":"ಜಂ","ಜH":"ಜಃ","ಜ್R":"ಜೃ","ಜೃu":"ಜೃ","J":"ಝ್","ಜ್h":"ಝ್","ಝ್a":"ಝ","ಝa":"ಝಾ","ಝ್A":"ಝಾ","ಝ್i":"ಝಿ","ಝ್I":"ಝೀ","ಝ್u":"ಝು","ಝ್U":"ಝೂ","ಝ್e":"ಝೆ","ಝ್E":"ಝೇ","ಝi":"ಝೈ","ಝ್o":"ಝೊ","ಝ್O":"ಝೋ","ಝu":"ಝೌ","ಝM":"ಝಂ","ಝH":"ಝಃ","ಝ್R":"ಝೃ","ಝೃu":"ಝೃ","x":"ಞ್","ಞ್a":"ಞ","ಞ್A":"ಞಾ","ಞa":"ಞಾ","ಞ್i":"ಞಿ","ಞ್I":"ಞೀ","ಞ್u":"ಞು","ಞ್U":"ಞೂ","ಞ್e":"ಞೆ","ಞ್E":"ಞೇ","ಞi":"ಞೈ","ಞ್o":"ಞೊ","ಞ್O":"ಞೋ","ಞu":"ಞೌ","ಞM":"ಞಂ","ಞH":"ಞಃ","ಞ್R":"ಞೃ","ಞೃu":"ಞೃ",'; amhaHash+='"T":"ಟ್","ಟ್a":"ಟ","ಟa":"ಟಾ","ಟ್A":"ಟಾ","ಟ್i":"ಟಿ","ಟ್I":"ಟೀ","ಟ್u":"ಟು","ಟ್U":"ಟೂ","ಟ್e":"ಟೆ","ಟ್E":"ಟೇ","ಟi":"ಟೈ","ಟ್o":"ಟೊ","ಟ್O":"ಟೋ","ಟu":"ಟೌ","ಟM":"ಟಂ","ಟH":"ಟಃ","ಟ್R":"ಟೃ","ಟೃu":"ಟೃ","ಟ್h":"ಠ್","ಠ್a":"ಠ","ಠa":"ಠಾ","ಠ್A":"ಠಾ","ಠ್i":"ಠಿ","ಠ್I":"ಠೀ","ಠ್u":"ಠು","ಠ್U":"ಠೂ","ಠ್e":"ಠೆ","ಠ್E":"ಠೇ","ಠi":"ಠೈ","ಠ್o":"ಠೊ","ಠ್O":"ಠೋ","ಠu":"ಠೌ","ಠM":"ಠಂ","ಠH":"ಠಃ","ಠ್R":"ಠೃ","ಠೃu":"ಠೃ","D":"ಡ್","ಡ್a":"ಡ","ಡa":"ಡಾ","ಡ್A":"ಡಾ","ಡ್i":"ಡಿ","ಡ್I":"ಡೀ","ಡ್u":"ಡು","ಡ್U":"ಡೂ","ಡ್e":"ಡೆ","ಡ್E":"ಡೇ","ಡi":"ಡೈ","ಡ್o":"ಡೊ","ಡ್O":"ಡೋ","ಡu":"ಡೌ","ಡM":"ಡಂ","ಡH":"ಡಃ","ಡ್R":"ಡೃ","ಡೃu":"ಡೃ","ಡ್h":"ಢ್","ಢ್a":"ಢ","ಢa":"ಢಾ","ಢ್A":"ಢಾ","ಢ್i":"ಢಿ","ಢ್I":"ಢೀ","ಢ್u":"ಢು","ಢ್U":"ಢೂ","ಢ್e":"ಢೆ","ಢ್E":"ಢೇ","ಢi":"ಢೈ","ಢ್o":"ಢೊ","ಢ್O":"ಢೋ","ಢu":"ಢೌ","ಢM":"ಢಂ","ಢH":"ಢಃ","ಢ್R":"ಢೃ","ಢೃu":"ಢೃ","N":"ಣ್","ಣ್a":"ಣ","ಣ್A":"ಣಾ","ಣa":"ಣಾ","ಣ್i":"ಣಿ","ಣ್I":"ಣೀ","ಣ್u":"ಣು","ಣ್U":"ಣೂ","ಣ್e":"ಣೆ","ಣ್E":"ಣೇ","ಣi":"ಣೈ","ಣ್o":"ಣೊ","ಣ್O":"ಣೋ","ಣu":"ಣೌ","ಣM":"ಣಂ","ಣH":"ಣಃ","ಣ್R":"ಣೃ","ಣೃu":"ಣೃ",'; amhaHash+='"t":"ತ್","ತ್a":"ತ","ತ್A":"ತಾ","ತa":"ತಾ","ತ್i":"ತಿ","ತ್I":"ತೀ","ತ್u":"ತು","ತ್U":"ತೂ","ತ್e":"ತೆ","ತ್E":"ತೇ","ತi":"ತೈ","ತ್o":"ತೊ","ತ್O":"ತೋ","ತu":"ತೌ","ತM":"ತಂ","ತH":"ತಃ","ತ್R":"ತೃ","ತೃu":"ತೃ","ತ್h":"ಥ್","ಥ್a":"ಥ","ಥ್A":"ಥಾ","ಥa":"ಥಾ","ಥ್i":"ಥಿ","ಥ್I":"ಥೀ","ಥ್u":"ಥು","ಥ್U":"ಥೂ","ಥ್e":"ಥೆ","ಥ್E":"ಥೇ","ಥi":"ಥೈ","ಥ್o":"ಥೊ","ಥ್O":"ಥೋ","ಥu":"ಥೌ","ಥM":"ಥಂ","ಥH":"ಥಃ","ಥ್R":"ಥೃ","ಥೃu":"ಥೃ","d":"ದ್","ದ್a":"ದ","ದa":"ದಾ","ದ್A":"ದಾ","ದ್i":"ದಿ","ದ್I":"ದೀ","ದ್u":"ದು","ದ್U":"ದೂ","ದ್e":"ದೆ","ದ್E":"ದೇ","ದi":"ದೈ","ದ್o":"ದೊ","ದ್O":"ದೋ","ದu":"ದೌ","ದM":"ದಂ","ದH":"ದಃ","ದ್R":"ದೃ","ದೃu":"ದೃ","ದ್h":"ಧ್","ಧ್a":"ಧ","ಧa":"ಧಾ","ಧ್A":"ಧಾ","ಧ್i":"ಧಿ","ಧ್I":"ಧೀ","ಧ್u":"ಧು","ಧ್U":"ಧೂ","ಧ್e":"ಧೆ","ಧ್E":"ಧೇ","ಧi":"ಧೈ","ಧ್o":"ಧೊ","ಧ್O":"ಧೋ","ಧu":"ಧೌ","ಧM":"ಧಂ","ಧH":"ಧಃ","ಧ್R":"ಧೃ","ಧೃu":"ಧೃ","n":"ನ್","ನ್a":"ನ","ನa":"ನಾ","ನ್A":"ನಾ","ನ್i":"ನಿ","ನ್I":"ನೀ","ನ್u":"ನು","ನ್U":"ನೂ","ನ್e":"ನೆ","ನ್E":"ನೇ","ನi":"ನೈ","ನ್o":"ನೊ","ನ್O":"ನೋ","ನu":"ನೌ","ನM":"ನಂ","ನH":"ನಃ","ನ್R":"ನೃ","ನೃu":"ನೃ",'; amhaHash+='"p":"ಪ್","ಪ್a":"ಪ","ಪa":"ಪಾ","ಪ್A":"ಪಾ","ಪ್i":"ಪಿ","ಪ್I":"ಪೀ","ಪ್u":"ಪು","ಪ್U":"ಪೂ","ಪ್e":"ಪೆ","ಪ್E":"ಪೇ","ಪi":"ಪೈ","ಪ್o":"ಪೊ","ಪ್O":"ಪೋ","ಪu":"ಪೌ","ಪM":"ಪಂ","ಪH":"ಪಃ","ಪ್R":"ಪೃ","ಪೃu":"ಪೃ","ಪೃU":"ಪೄ","P":"ಫ್","ಪ್h":"ಫ್","ಫ್a":"ಫ","ಫa":"ಫಾ","ಫ್A":"ಫಾ","ಫ್i":"ಫಿ","ಫ್I":"ಫೀ","ಫ್u":"ಫು","ಫ್U":"ಫೂ","ಫ್e":"ಫೆ","ಫ್E":"ಫೇ","ಫi":"ಫೈ","ಫ್o":"ಫೊ","ಫ್O":"ಫೋ","ಫu":"ಫೌ","ಫM":"ಫಂ","ಫH":"ಫಃ","ಫ್R":"ಫೃ","ಫೃu":"ಫೃ","f":"ಫ್","F":"ಫ್","b":"ಬ್","ಬ್a":"ಬ","ಬ್A":"ಬಾ","ಬa":"ಬಾ","ಬ್i":"ಬಿ","ಬ್I":"ಬೀ","ಬ್u":"ಬು","ಬ್U":"ಬೂ","ಬ್e":"ಬೆ","ಬ್E":"ಬೇ","ಬi":"ಬೈ","ಬ್o":"ಬೊ","ಬ್O":"ಬೋ","ಬu":"ಬೌ","ಬM":"ಬಂ","ಬH":"ಬಃ","ಬ್R":"ಬೃ","ಬೃu":"ಬೃ","B":"ಭ್","ಬ್h":"ಭ್","ಭ್a":"ಭ","ಭ್A":"ಭಾ","ಭa":"ಭಾ","ಭ್i":"ಭಿ","ಭ್I":"ಭೀ","ಭ್u":"ಭು","ಭ್U":"ಭೂ","ಭ್e":"ಭೆ","ಭ್E":"ಭೇ","ಭi":"ಭೈ","ಭ್o":"ಭೊ","ಭ್O":"ಭೋ","ಭu":"ಭೌ","ಭM":"ಭಂ","ಭH":"ಭಃ","ಭ್R":"ಭೃ","ಭೃu":"ಭೃ","m":"ಮ್","ಮ್a":"ಮ","ಮ್A":"ಮಾ","ಮa":"ಮಾ","ಮ್i":"ಮಿ","ಮ್I":"ಮೀ","ಮ್u":"ಮು","ಮ್U":"ಮೂ","ಮ್e":"ಮೆ","ಮ್E":"ಮೇ","ಮi":"ಮೈ","ಮ್o":"ಮೊ","ಮ್O":"ಮೋ","ಮu":"ಮೌ","ಮM":"ಮಂ","ಮH":"ಮಃ","ಮ್R":"ಮೃ","ಮೃu":"ಮೃ",'; amhaHash+='"y":"ಯ್","ಯ್a":"ಯ","ಯ್A":"ಯಾ","ಯa":"ಯಾ","ಯ್i":"ಯಿ","ಯ್I":"ಯೀ","ಯ್u":"ಯು","ಯ್U":"ಯೂ","ಯ್e":"ಯೆ","ಯ್E":"ಯೇ","ಯi":"ಯೈ","ಯ್o":"ಯೊ","ಯ್O":"ಯೋ","ಯu":"ಯೌ","ಯM":"ಯಂ","ಯH":"ಯಃ","ಯ್R":"ಯೃ","ಯೃu":"ಯೃ","r":"ರ್","ರ್a":"ರ","ರ್A":"ರಾ","ರa":"ರಾ","ರ್i":"ರಿ","ರ್I":"ರೀ","ರ್u":"ರು","ರ್U":"ರೂ","ರ್e":"ರೆ","ರ್E":"ರೇ","ರi":"ರೈ","ರ್o":"ರೊ","ರ್O":"ರೋ","ರu":"ರೌ","ರM":"ರಂ","ರH":"ರಃ","ರ್R":"ರೃ","ರೃu":"ರೃ","l":"ಲ್","ಲ್a":"ಲ","ಲ್A":"ಲಾ","ಲa":"ಲಾ","ಲ್i":"ಲಿ","ಲ್I":"ಲೀ","ಲ್u":"ಲು","ಲ್U":"ಲೂ","ಲ್e":"ಲೆ","ಲ್E":"ಲೇ","ಲi":"ಲೈ","ಲ್o":"ಲೊ","ಲ್O":"ಲೋ","ಲu":"ಲೌ","ಲM":"ಲಂ","ಲH":"ಲಃ","ಲ್R":"ಲೃ","ಲೃu":"ಲೃ","v":"ವ್","ವ್a":"ವ","ವa":"ವಾ","ವ್A":"ವಾ","ವ್i":"ವಿ","ವ್I":"ವೀ","ವ್u":"ವು","ವ್U":"ವೂ","ವ್e":"ವೆ","ವ್E":"ವೇ","ವi":"ವೈ","ವ್o":"ವೊ","ವ್O":"ವೋ","ವu":"ವೌ","ವM":"ವಂ","ವ್H":"ವಃ","ವ್R":"ವೃ","ವೃu":"ವೃ","V":"ವ್","w":"ವ್","W":"ವ್","S":"ಶ್","ಶ್a":"ಶ","ಶ್A":"ಶಾ","ಶa":"ಶಾ","ಶ್i":"ಶಿ","ಶ್I":"ಶೀ","ಶ್u":"ಶು","ಶ್U":"ಶೂ","ಶ್e":"ಶೆ","ಶ್E":"ಶೇ","ಶi":"ಶೈ","ಶ್o":"ಶೊ","ಶ್O":"ಶೋ","ಶu":"ಶೌ","ಶM":"ಶಂ","ಶH":"ಶಃ","ಶ್R":"ಶೃ","ಶೃu":"ಶೃ","ಸ್h":"ಶ್",'; amhaHash+='"ಶ್h":"ಷ್","ಷ್a":"ಷ","ಷ್A":"ಷಾ","ಷa":"ಷಾ","ಷ್i":"ಷಿ","ಷ್I":"ಷೀ","ಷ್u":"ಷು","ಷ್U":"ಷೂ","ಷ್e":"ಷೆ","ಷ್E":"ಷೇ","ಷi":"ಷೈ","ಷ್o":"ಷೊ","ಷ್O":"ಷೋ","ಷu":"ಷೌ","ಷM":"ಷಂ","ಷH":"ಷಃ","ಷ್R":"ಷೃ","ಷೃu":"ಷೃ","s":"ಸ್","ಸ್a":"ಸ","ಸ್A":"ಸಾ","ಸa":"ಸಾ","ಸ್i":"ಸಿ","ಸ್I":"ಸೀ","ಸ್u":"ಸು","ಸ್U":"ಸೂ","ಸ್e":"ಸೆ","ಸ್E":"ಸೇ","ಸi":"ಸೈ","ಸ್o":"ಸೊ","ಸ್O":"ಸೋ","ಸu":"ಸೌ","ಸM":"ಸಂ","ಸH":"ಸಃ","ಸ್R":"ಸೃ","ಸೃu":"ಸೃ","h":"ಹ್","ಹ್a":"ಹ","ಹ್A":"ಹಾ","ಹa":"ಹಾ","ಹ್i":"ಹಿ","ಹ್I":"ಹೀ","ಹ್u":"ಹು","ಹ್U":"ಹೂ","ಹ್e":"ಹೆ","ಹ್E":"ಹೇ","ಹi":"ಹೈ","ಹ್o":"ಹೊ","ಹ್O":"ಹೋ","ಹu":"ಹೌ","ಹM":"ಹಂ","ಹH":"ಹಃ","ಹ್R":"ಹೃ","ಹೃu":"ಹೃ","L":"ಳ್","ಳ್a":"ಳ","ಳ್A":"ಳಾ","ಳa":"ಳಾ","ಳ್i":"ಳಿ","ಳ್I":"ಳೀ","ಳ್u":"ಳು","ಳ್U":"ಳೂ","ಳ್e":"ಳೆ","ಳ್E":"ಳೇ","ಳi":"ಳೈ","ಳ್o":"ಳೊ","ಳ್O":"ಳೋ","ಳu":"ಳೌ","ಳM":"ಳಂ","ಳH":"ಳಃ","ಳ್R":"ಳೃ","ಳೃu":"ಳೃ",'; amhaHash+='"a":"ಅ","ಅa":"ಆ","A":"ಆ","i":"ಇ","I":"ಈ","u":"ಉ","U":"ಊ","R":"ಋ","ಋu":"ಋ","e":"ಎ","E":"ಏ","ಅi":"ಐ","o":"ಒ","O":"ಓ","ಅu":"ಔ","ಒu":"ಔ","M":"ಂ","H":"ಃ","1":"೧","2":"೨","3":"೩","4":"೪","5":"೫","6":"೬","7":"೭","8":"೮","9":"೯","0":"೦","\u0CCD^":"\u0CCD\u200C","\u200C^":"\u200C","&":"\u200D","़c":"\u0C58","़j":"\u0C59","@":"॰","॰M":"ఁ","^":"‍","॰n":"్","q":"","Q":""}';

// for compatibility with bookmarklets
function cyr_translit(src) {
	return to_cyrillic(src);
}
 
var conversionHash = undefined;
var maxcyrlength = 0;
 
function getConversionHash() {
	if (conversionHash == undefined) {
		conversionHash = eval("("+amhaHash+")");
		 maxcyrlength=6;
	}
 
	return conversionHash;
}
 
 
function to_cyrillic(src, output, chunks) {
	if (src == undefined || src == "" || src == null)
		return src;
	if (output == undefined)
		output = new String();
 
	var hash = getConversionHash();
 
	var location = 0;
 
	while (location < src.length) {
		var len = Math.min(maxcyrlength, src.length - location);
		var arr = undefined;
		var sub;
		while (len > 0) {
			sub = src.substr(location, len);
			arr = hash[sub];
			if (arr != undefined) 
				break;
			else 
				len--;
		}
 
		// need this for translit on the fly
		if (chunks != undefined)
			chunks[chunks.length] = sub;
 
		if (arr == undefined) {
			output += sub;
			location ++;
		}
		else {
 
			// case analysis
			var newChar = arr;
 
			if (sub.toLowerCase() == sub.toUpperCase() && arr.length > 1 && arr[1] && (newChar.toUpperCase() != newChar.toLowerCase())) {
 
				// need translit hash to determine if previous character (and possibly the one before it) 
				// were converted and are in upper case
 
				// set prevDud to true previous is not a translated character or simply a blank
				// set prevCap to true if previous was translated and was upper case
 
				var prevCh = output.length == 0 ? null : output.substr(output.length - 1, 1);
				var prevDud = !prevCh || !getTranslitString(prevCh);
				var prevCap = (!prevDud && prevCh == prevCh.toUpperCase());
 
				// sub is caseless but result isn't. case will depend on lookbehind and lookahead
				if (prevDud || !prevCap) {
					output += newChar.toLowerCase();
					prevCap = false;
				}
				else {
					var next = " ";
					if (location + len < src.length)
						next = src.substr(location + len, 1);
 
					if (next != next.toUpperCase() && next == next.toLowerCase() ) {
						//next is lowercase (and not caseless)
						output += newChar.toLowerCase();
					}
					else if (next == next.toUpperCase() && next != next.toLowerCase() ) {
						// next is uppercase (and not caseless)
						output += newChar.toUpperCase();
					}
					else {
						// next is caseless. output case determined by the case of output[length - 2]
						var pprevCh = output.length == 1 ? null : output.substr(output.length - 2, 1);
						var pprevDud = !pprevCh || !getTranslitString(pprevCh);
						if (!pprevDud && (pprevCh == pprevCh.toUpperCase())) {
							//pre-prev is in upper case. output is also uppercase
							output += newChar.toUpperCase();
						}
						else {
						    output += newChar.toLowerCase();
						}
 
					}
				}
 
			}
			else if ((sub.toLowerCase() == sub.toUpperCase()) && (arr.length < 2 || !arr[1])) {
 
				// literal treatment of newChar
				output += newChar;
 
			}
			else if (sub != sub.toLowerCase()) {
 
				// sub not all-lowercase
				output += newChar.toUpperCase();
			}
			else {
 
 
 
				// sub is lowercase
			    output += newChar.toLowerCase();
			}
			location += len;
		}
	}
 
	return output;
}
 
 
function convertIt(src,converter){
 var resultbuffer=""; 
	for(var i=0;i<src.length;i++){
	resultbuffer=converter(resultbuffer+src[i]);
	}
        return converter(resultbuffer);
 
}
 
var translitHash = undefined;
 
function initTranslit() {
	if (translitHash == undefined) {
		translitHash = new Array();
 
		for (var i = 0; i < conversionHash.length; i++) {
			var ch = conversionHash[i][1];
			// if the translit string is not caseless, convert cyr string to upper case
			// otherwise maintain its case
			if (conversionHash[i][0].toUpperCase() != conversionHash[i][0].toLowerCase())
				ch = ch.toUpperCase();
 
			if (translitHash[ch] == undefined)
				translitHash[ch] = conversionHash[i][0];
		}
	}
}
 
 
//-- translit on-the-fly -- 
 
function replaceValue(node, value, stepback) {
	if (stepback == undefined)
		stepback = 0;
 
	if (isExplorer()) {
		var range = document.selection.createRange();
		range.moveStart("character", -stepback);
		range.text = value;
		range.collapse(false);
		range.select();
	}
	else {
		var scrollTop = node.scrollTop;
		var cursorLoc =  node.selectionStart;
		node.value = node.value.substring(0, node.selectionStart - stepback) + value + 
                node.value.substring(node.selectionEnd, node.value.length);
		node.scrollTop = scrollTop;
		node.selectionStart = cursorLoc + value.length - stepback;
		node.selectionEnd = cursorLoc + value.length - stepback;
	}
}
 
 
// compare positions
function positionIsEqual(other) {
	if (isExplorer())
		return this.position.isEqual(other.position);
	else
		return this.position == other.position;
 
}
 
function Position(node) {
  if (node.selectionStart != undefined)
	this.position = node.selectionStart;
  else if (document.selection && document.selection.createRange())
    this.position = document.selection.createRange();
 
  this.isEqual = positionIsEqual;
}
 
function resetState() {
	this.position = new Position(this.node);
	this.transBuffer = "";
	this.cyrBuffer = "";
}
 
function StateObject(node) {
	this.node = node;
	this.reset = resetState;
	this.cyrBuffer = "";
	this.transBuffer = "";
	this.position = new Position(node);
}
 
 
var stateHash = new Array();
 
function isExplorer() {
  return (document.selection != undefined && document.selection.createRange().isEqual != undefined);
}
 
function pressedKey(event) {
  if (isExplorer())
	return event.keyCode;
  else
    return event.which;
}
 
function translitonkey(event) {
     /*
	if ((event.keyCode == 255 && event.charCode > 0) || event.keyCode == 8) {
		return;
	}
    */
 
    if (event == undefined)
		event = window.event;
 
	var node = null;
	if (event.target)
		node = event.target;
	else if (event.srcElement)
		node = event.srcElement;
 
 
 
	// initialize state
	var state = stateHash[node];
	if (state == null) {
		state = new StateObject(node);
		stateHash[node] = state;
	}
	if ( (pressedKey(event) > 20) && !event.ctrlKey && !event.altKey && !event.metaKey) {
 
		var c = String.fromCharCode(pressedKey(event));
 
		// process input
		var result = process_translit(state, c);
		// finish up
		if (c != result.out || result.replace != 0) {
		  if (isExplorer())
			event.returnValue = false;
		  else
		    event.preventDefault();
 
		  replaceValue(node, result.out, result.replace);
 
		  state.position = new Position(node);
 
		}
	}
 
}
 
function TranslitResult() {
	this.out = "";
	this.replace = 0;
}
 
function process_translit(state, c) {
	// reset state if position changed
	if (!state.position.isEqual(new Position(state.node)))
		state.reset();
 
	var result = new TranslitResult();
 
	// initial backbuffer. Add to it as characters are converted
	var backbuffer = getBackBuffer(state.node, state.cyrBuffer.length, 2);
	var chunks = new Array();
 
	state.transBuffer = state.transBuffer+ c
 
	var str = to_cyrillic(state.cyrBuffer+c, backbuffer, chunks);
 
	// remove backbuffer from output
	str = str.substr(backbuffer.length);
	result.out = str; 
	/* str is now left alone - it has the output matching contents of chunks and 
	   will be used to reinitialize backbuffers, along with chunks and state.transBuffer
	*/
 
	// get the difference between state.cyrBuffer and output
	for (var i = 0; i < Math.min(state.cyrBuffer.length, result.out.length); i++) {
		if (state.cyrBuffer.substr(i, 1) != result.out.substr(i, 1)) {
			result.replace = state.cyrBuffer.length - i;
			result.out = result.out.substr(i);
			break;
		}
	}
	if (result.replace == 0) {
               if(result.out.length<state.cyrBuffer.length)
				result.replace=state.cyrBuffer.length- result.out.length;
		result.out = result.out.substr(Math.min(state.cyrBuffer.length, result.out.length));
 
                       //    result.out+="\u0008"
 
	}
 
	// update state: backbuffer, bufferArray
	if (chunks.length > 0 && chunks[chunks.length - 1] == result.out.substr(result.out.length - 1)) {
		// no convertion took place, reset state
		state.reset();
	}
	else {
		while (state.transBuffer.length > maxcyrlength) {
			state.transBuffer = state.transBuffer.substr(chunks[0].length);
			chunks.shift();
			str = str.substr(1);
		}
		state.cyrBuffer = str;
	}
	return result;
}
 
function getBackBuffer(node, offset, count) {
 
	if (isExplorer()) { //.tagName.toUpperCase() == "EDITOR") {
 
		var range = document.selection.createRange();
		range.moveStart("character", -offset);
		var result = range.text.substr(-count);
		if (!result)
			result = "";
 
		return result;
 
	} else {
		return node.value.substring(0, node.selectionStart - offset).substr(-count);
	}
}
 
// need this for bookmarklets
function getSelectedNode() {
  if (document.activeElement)
	return document.activeElement;
  else
    if (window.getSelection && window.getSelection() && window.getSelection().rangeCount > 0) {
		var range = window.getSelection().getRangeAt(0);
		if (range.startContainer && range.startContainer.childNodes && range.startContainer.childNodes.length > range.startOffset)
			return range.startContainer.childNodes[range.startOffset]
    }
  return null;
}
 
function toggleCyrMode() {
	var node = getSelectedNode();
	if (node) {
		if (stateHash[node]) {
			if (removeKeyEventListener(node))
				delete stateHash[node];
		}
		else {
			if (addKeyEventListener(node))
				stateHash[node] = new StateObject(node);
		}
	}
}
 
function addKeyEventListener(node) {
	if (node.addEventListener)
		node.addEventListener("keypress", translitonkey, false);
	else if (node.attachEvent)
	    node.attachEvent("onkeypress", translitonkey);
	else return false;
	return true;
}
function removeKeyEventListener(node) {
	if (node.removeEventListener)
		node.removeEventListener("keypress", translitonkey, false);
	else if (node.detachEvent)
		node.detachEvent("onkeypress", translitonkey);
	else return false;
	return true;
}
 
function getSelectedText() {
	if (isExplorer()) {
		return document.selection.createRange().text;
	}
	else {
		var node = getSelectedNode();
		if (node && node.value && node.selectionStart != undefined && node.selectionEnd != undefined)
			return node.value.substring(node.selectionStart, node.selectionEnd);
	}
	return "";
}
 
/* </pre> */