var 영어타이핑 = "rRseEfaqQtTdwWczxvgkoiOjpuPhynbml";
var 한글타이핑 = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅛㅜㅠㅡㅣ";
var 초성모음 = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ";
var 중성모음 = "ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ";
var 종성모음 = "ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ";
function 한글조합하기(src) {
if (src == null) {
return '';
}
var result = {
사용한글자수 : src.length
}
switch (src.length) {
case 0:
result.조합된한글 = src;
break;
case 1:
result.조합된한글 = convert영한(src);
break;
case 2:
var ch1 = src.charAt(0), ch2 = src.charAt(1);
if (is자음(ch1) && is자음(ch2)) {
var 결합자음 = 자음결합하기(convert영한(ch1), convert영한(ch2));
if (결합자음) {
result.조합된한글 = 결합자음;
} else {
result = 한글조합하기(src.substring(1, 2));
}
}
else if (is자음(ch1) && is모음(ch2)) {
result.조합된한글 = combine한글(convert영한(ch1), convert영한(ch2));
}
else if (is모음(ch1) && is모음(ch2)) {
var 결합모음 = 모음결합하기(convert영한(ch1), convert영한(ch2));
if (결합모음) {
result.조합된한글 = 결합모음;
} else {
result = 한글조합하기(src.substring(1, 2));
}
} else {
result = 한글조합하기(src.substring(1, 2));
}
break;
case 3:
var ch1 = src.charAt(0), ch2 = src.charAt(1), ch3 = src.charAt(2);
if (is자음(ch1) && is모음(ch2) && is자음(ch3)) {
result.조합된한글 = combine한글(convert영한(ch1), convert영한(ch2), convert영한(ch3));
}
else if (is자음(ch1) && is모음(ch2) && is모음(ch3)) {
var 결합모음 = 모음결합하기(convert영한(ch2), convert영한(ch3));
if (결합모음) {
result.조합된한글 = combine한글(convert영한(ch1), 결합모음);
} else {
result = 한글조합하기(src.substring(1, 3));
}
} else {
result = 한글조합하기(src.substring(1, 3));
}
break;
case 4:
var ch1 = src.charAt(0), ch2 = src.charAt(1), ch3 = src.charAt(2), ch4 = src.charAt(3);
if (is자음(ch1) && is모음(ch2) && is자음(ch3) && is자음(ch4)) {
var 결합자음 = 자음결합하기(convert영한(ch3), convert영한(ch4));
if (결합자음) {
result.조합된한글 = combine한글(convert영한(ch1), convert영한(ch2), 결합자음);
} else {
result = 한글조합하기(src.substring(1, 4));
}
}
else if (is자음(ch1) && is모음(ch2) && is모음(ch3) && is자음(ch4)) {
var 결합모음 = 모음결합하기(convert영한(ch2), convert영한(ch3));
if (결합모음) {
result.조합된한글 = combine한글(convert영한(ch1), 결합모음, convert영한(ch4));
} else {
result = 한글조합하기(src.substring(1, 4));
}
} else {
result = 한글조합하기(src.substring(1, 4));
}
break;
case 5:
var ch1 = src.charAt(0), ch2 = src.charAt(1), ch3 = src.charAt(2), ch4 = src.charAt(3), ch5 = src.charAt(4);
if (is자음(ch1) && is모음(ch2) && is모음(ch3) && is자음(ch4) && is자음(ch5)) {
var 결합모음 = 모음결합하기(convert영한(ch2), convert영한(ch3));
var 결합자음 = 자음결합하기(convert영한(ch4), convert영한(ch5));
if (결합모음 && 결합자음) {
result.조합된한글 = combine한글(convert영한(ch1), 결합모음, 결합자음);
} else {
result = 한글조합하기(src.substring(1, 5));
}
} else {
result = 한글조합하기(src.substring(1, 5));
}
break;
}
return result;
}
function korToEng(src) {
var res = "";
if (src.length == 0) {
return res;
}
for (var i = 0; i < src.length; i++) {
var ch = src.charAt(i);
var nCode = ch.charCodeAt(0);
var result = '';
var 초성, 중성, 종성;
if (44032 <= nCode && nCode <= 55203) {
nCode -= 44032;
초성 = 초성모음.charAt(Math.floor(nCode / (21 * 28)));
중성 = 중성모음.charAt(Math.floor(nCode / 28) % 21);
종성 = 종성모음.charAt(nCode % 28 - 1);
res += convert한영(초성);
var 모음분해 = 모음분해하기(중성);
if (모음분해) {
res += convert한영(모음분해);
} else {
res += convert한영(중성);
}
var 자음분해 = 자음분해하기(종성);
if (자음분해) {
res += convert한영(자음분해);
} else {
res += convert한영(종성);
}
} else if (초성모음.indexOf(ch) > -1) {
res += convert한영(ch);
} else if (중성모음.indexOf(ch) > -1) {
var 모음분해 = 모음분해하기(ch);
if (모음분해) {
res += convert한영(모음분해);
} else {
res += convert한영(ch);
}
} else if (종성모음.indexOf(ch) > -1) {
var 자음분해 = 자음분해하기(ch);
if (자음분해) {
res += convert한영(자음분해);
} else {
res += convert한영(ch);
}
} else {
res += ch;
}
}
return res;
}
function convert영한(src) {
var result = '';
for (var i = 0; i < src.length; i++) {
var ch = src.charAt(i);
var index = 영어타이핑.indexOf(ch);
if (index >= 0) {
result += 한글타이핑.charAt(index);
} else {
result += ch;
}
}
return result;
}
function convert한영(src) {
var result = '';
for (var i = 0; i < src.length; i++) {
var ch = src.charAt(i);
var index = 한글타이핑.indexOf(ch);
if (index >= 0) {
result += 영어타이핑.charAt(index);
} else {
result += ch;
}
}
return result;
}
function is영어타이핑(ch) {
return 영어타이핑.indexOf(ch) >= 0;
}
function is모음(ch) {
return 영어타이핑.indexOf(ch) >= 19;
}
function is자음(ch) {
return 영어타이핑.indexOf(ch) < 19 && 영어타이핑.indexOf(ch) >= 0;
}
function engToKor(src) {
var res = "";
if (src.length == 0)
return res;
var 초성위치 = -1, 중성위치 = -1, 종성위치 = -1;
for (var i = 0; i < src.length; i++) {
var result = 한글조합하기(src.slice(Math.max(src.length - 5 - i, 0), src.length - i));
i += result.사용한글자수 - 1;
res = result.조합된한글 + res;
}
return res;
}
function combine한글(초성, 중성, 종성) {
return String.fromCharCode(44032 + 초성모음.indexOf(초성) * 21 * 28 + 중성모음.indexOf(중성) * 28 + 종성모음.indexOf(종성) + 1);
}
function 모음결합하기(ch1, ch2) {
var result = null;
if (ch1 == 'ㅗ' && ch2 == 'ㅏ') {
result = 'ㅘ';
} else if (ch1 == 'ㅗ' && ch2 == 'ㅐ') {
result = 'ㅙ';
} else if (ch1 == 'ㅗ' && ch2 == 'ㅣ') {
result = 'ㅚ';
} else if (ch1 == 'ㅜ' && ch2 == 'ㅓ') {
result = 'ㅝ';
} else if (ch1 == 'ㅜ' && ch2 == 'ㅔ') {
result = 'ㅞ';
} else if (ch1 == 'ㅜ' && ch2 == 'ㅣ') {
result = 'ㅟ';
} else if (ch1 == 'ㅡ' && ch2 == 'ㅣ') {
result = 'ㅢ';
}
return result;
}
function 모음분해하기(ch) {
switch (ch) {
case 'ㅘ':
return 'ㅗㅏ';
case 'ㅙ':
return 'ㅗㅐ';
case 'ㅚ':
return 'ㅗㅣ';
case 'ㅝ':
return 'ㅜㅓ';
case 'ㅞ':
return 'ㅜㅔ';
case 'ㅟ':
return 'ㅜㅣ';
case 'ㅢ':
return 'ㅡㅣ';
}
return null;
}
function 자음결합하기(ch1, ch2) {
var result = null;
if (ch1 == 'ㄱ' && ch2 == 'ㅅ') {
result = 'ㄳ';
} else if (ch1 == 'ㄴ' && ch2 == 'ㅈ') {
result = 'ㄵ';
} else if (ch1 == 'ㄴ' && ch2 == 'ㅎ') {
result = 'ㄶ';
} else if (ch1 == 'ㄹ' && ch2 == 'ㄱ') {
result = 'ㄺ';
} else if (ch1 == 'ㄹ' && ch2 == 'ㅁ') {
result = 'ㄻ';
} else if (ch1 == 'ㄹ' && ch2 == 'ㅂ') {
result = 'ㄼ';
} else if (ch1 == 'ㄹ' && ch2 == 'ㅅ') {
result = 'ㄽ';
} else if (ch1 == 'ㄹ' && ch2 == 'ㅌ') {
result = 'ㄾ';
} else if (ch1 == 'ㄹ' && ch2 == 'ㅍ') {
result = 'ㄿ';
} else if (ch1 == 'ㄹ' && ch2 == 'ㅎ') {
result = 'ㅀ';
} else if (ch1 == 'ㅂ' && ch2 == 'ㅅ') {
result = 'ㅄ';
}
return result;
}
function 자음분해하기(ch) {
switch (ch) {
case 'ㄳ':
return 'ㄱㅅ';
case 'ㄵ':
return 'ㄴㅈ';
case 'ㄶ':
return 'ㄴㅎ';
case 'ㄺ':
return 'ㄹㄱ';
case 'ㄻ':
return 'ㄹㅁ';
case 'ㄼ':
return 'ㄹㅂ';
case 'ㄽ':
return 'ㄹㅅ';
case 'ㄾ':
return 'ㄹㅌ';
case 'ㄿ':
return 'ㄹㅍ';
case 'ㅀ':
return 'ㄹㅎ';
case 'ㅄ':
return 'ㅂㅅ';
}
return null;
}