//
// 한손입력기 for iPhone
// 
//  실행예제: http://www.zannavi.com/hanson/
//  다운로드: http://www.zannavi.com/work/hanson.tar.gz
//  필요한 파일들
//    - index.html: HTML 기본문서
//    - hanson.js: 자바스크립트 파일
//    - hanson_heml.html: 도움말 HTML 문서
//    - hanson_kb.png: 도움말에 사용되는 한손입력기 그림파일
//    - kb_*.png: 자판 그림파일
//
// Copyright (C) 2007 손상길 http://www.zannavi.com
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation, either version 3 of the License, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
// more details.
//
// The license can be found at http://www.gnu.org/licenses/ GNU 라이센스
// 한글번역문은 여기서 보실수 있습니다:
// http://www.gnu.org/licenses/translations.ko.html
//

var g = [];
g[0] = -1;  g[1] = -1;  g[2] = 0;
var string = [];
var buffer = "";
var index = 0;
var jaso = 0;

function keytouch( k ) {
  key = k;
  if ( ( k == 301 || k == 300 ) && buffer != "" ) {
    if ( jaso == 0 ) k = 6;
    else if ( jaso == 2 ) k = 206;
    else return;
  }
  if ( k == 0 ) {                       // input SPACE
    addstring( g );
    string[index++] = 0x20;
  } else if ( k == -2 ) {               // input RETURN
    addstring( g );
    string[index++] = 0x0D;
  } else if ( k == -1 ) {               // input BACKSPACE
    if ( buffer != "" ) {
      buffer = buffer.substr( 0, buffer.length-1 );
      g[jaso] = determine_jaso( jaso, buffer );
      string[index] = johab( g );
    } else if ( jaso == 2 ) {
      g[--jaso] = -1;
      string[index] = johab( g );
    } else deletestring( g );
  } else if ( k == 301 || k == 300 ) {  // input ACCENT
    if ( string[index-1] == 0x2E ) string[index-1] = 0x2C;          // ,
    else if ( string[index-1] == 0x2C ) string[index-1] = 0x3F;     // ?
    else if ( string[index-1] == 0x3F ) string[index-1] = 0x21;     // !
    else if ( string[index-1] == 0x21 ) string[index-1] = 0x22;     // "
    else if ( string[index-1] == 0x22 ) string[index-1] = 0x2E;     // .
  } else if ( k == 302 ) {              // input PUNCTUATION
    addstring( g );
    string[index++] = 0x2E;
  } else {
    j = Math.floor( k / 100 );
    if ( j == 2 && g[1] == -1 ) j = 0;  // jongseong->choseong, if no jungseong
    if ( j != jaso ) {
      buffer = "";
      jaso = j;
      // complete a character if the input is choseong
      if ( j == 0 ) addstring( g );
    }
    buffer = buffer + ( k % 100 );
    temp = g[jaso];
    g[jaso] = determine_jaso( jaso, buffer );
    if ( g[jaso] == -1 ) {              // ignore the current input
      g[jaso] = temp;
      buffer = buffer.substr( 0, buffer.length-1 );
    } else if ( g[jaso] == -10 ) {      // add a new choseong or jungseong
      g[jaso] = temp;
      if ( k % 100 == 6 ) {             // if input is ~, then ignore it
        buffer = buffer.substr( 0, buffer.length-1 );
      } else {
        string[index++] = johab( g );
        buffer = buffer[buffer.length-1];
        g[0] = -1;  g[1] = -1;  g[2] = 0;
        g[jaso] = determine_jaso( jaso, buffer );
      }
    }
    string[index] = johab( g );
  }
  document.getElementById('text').innerHTML = hangeul( string );
  selectButton( key );
  setTimeout( "clearButton( key )", 100 );
}

function determine_jaso( j, b ) {
  if ( j == 0 ) {               // choseong
    switch( b ) {
      case "1"     : c =  0;  break;    // 가
      case "11"    : c =  1;  break;    // 까
      case "2"     : c =  2;  break;    // 나
      case "26"    : c =  3;  break;    // 다
      case "226"   :
      case "262"   :
      case "2262"  :
      case "2626"  : c =  4;  break;    // 따
      case "12"    :
      case "22"    : c =  5;  break;    // 라
      case "3"     : c =  6;  break;    // 마
      case "33"    :
      case "36"    : c =  7;  break;    // 바
      case "336"   :
      case "333"   :
      case "3333"  :
      case "363"   :
      case "3636"  : c =  8;  break;    // 빠
      case "4"     : c =  9;  break;    // 사
      case "44"    : c = 10;  break;    // 싸
      case "5"     : c = 11;  break;    // 아
      case "46"    : c = 12;  break;    // 자
      case "446"   :
      case "464"   :
      case "4646"  : c = 13;  break;    // 짜
      case "466"   : c = 14;  break;    // 차
      case "16"    : c = 15;  break;    // 카
      case "2266"  :
      case "266"   : c = 16;  break;    // 타
      case "366"   : c = 17;  break;    // 파
      case "55"    :
      case "56"    : c = 18;  break;    // 하
      //default      : c = -1;
      default      : c = -10;
    }
  } else if ( j == 1 ) {        // jungseong
    switch ( b ) {
      case "32"    : c =  0;  break;    // 아
      case "323"   : c =  1;  break;    // 애
      case "322"   : c =  2;  break;    // 야
      case "3223"  : c =  3;  break;    // 얘
      case "23"    : c =  4;  break;    // 어
      case "233"   : c =  5;  break;    // 에
      case "223"   : c =  6;  break;    // 여
      case "2233"  : c =  7;  break;    // 예
      case "2"     :
      case "21"    : c =  8;  break;    // 오
      case "2132"  : c =  9;  break;    // 와
      case "21323" : c = 10;  break;    // 왜
      case "213"   : c = 11;  break;    // 외
      case "22"    :
      case "221"   : c = 12;  break;    // 요
      case "12"    : c = 13;  break;    // 우
      case "1223"  : c = 14;  break;    // 워
      case "12233" : c = 15;  break;    // 웨
      case "123"   : c = 16;  break;    // 위
      case "122"   : c = 17;  break;    // 유
      case "1"     : c = 18;  break;    // 으
      case "31"    :
      case "13"    : c = 19;  break;    // 의
      case "3"     : c = 20;  break;    // 이
      default      : c = -10;
    }
  } else {                      // jongseong
    switch ( b ) {
      case ""      : c =  0;  break;
      case "1"     : c =  1;  break;    // 악
      case "11"    : c =  2;  break;    // 앆
      case "14"    : c =  3;  break;    // 앇
      case "2"     : c =  4;  break;    // 안
      case "24"    :
      case "246"   : c =  5;  break;    // 앉
      case "25"    :
      case "256"   : c =  6;  break;    // 않
      case "226"   :
      case "26"    : c =  7;  break;    // 앋
      case "12"    :
      case "22"    : c =  8;  break;    // 알
      case "121"   :
      case "221"   : c =  9;  break;    // 앍
      case "123"   :
      case "223"   : c = 10;  break;    // 앎
      case "1233"  :
      case "2233"  :
      case "1236"  :
      case "2236"  : c = 11;  break;    // 앏
      case "124"   :
      case "224"   : c = 12;  break;    // 앐
      case "122"   :
      case "1226"  :
      case "12266" :
      case "222"   :
      case "2226"  :
      case "22266" : c = 13;  break;    // 앑
      case "12336" :
      case "22336" :
      case "12366" :
      case "22366" : c = 14;  break;    // 앒
      case "125"   :
      case "1256"  :
      case "225"   :
      case "2256"  : c = 15;  break;    // 앓
      case "3"     : c = 16;  break;    // 암
      case "33"    :
      case "36"    : c = 17;  break;    // 압
      case "334"   :
      case "364"   : c = 18;  break;    // 앖
      case "4"     : c = 19;  break;    // 앗
      case "44"    : c = 20;  break;    // 았
      case "5"     : c = 21;  break;    // 앙
      case "46"    : c = 22;  break;    // 앚
      case "466"   : c = 23;  break;    // 앛
      case "16"    : c = 24;  break;    // 앜
      case "2266"  :
      case "266"   : c = 25;  break;    // 앝
      case "336"   :
      case "366"   : c = 26;  break;    // 앞
      case "55"    :
      case "56"    : c = 27;  break;    // 앟
      default      : c = -1;
    }
  }
  return c;
}

function addstring( g ) {
  //if ( g[0] >= 0 && g[1] >= 0 && g[2] >= 0 ) string[index++] = johab( g );
  string[index++] = johab( g );
  g[0] = -1;  g[1] = -1;  g[2] = 0;
  buffer = "";
  jaso = 0;
}

function deletestring( g ) {
  //if ( string[index] != "" ) string[index--] = "";
  if ( string[index] != "" ) string[index] = "";
  else string[--index] = "";
  if ( index < 0 ) index = 0;
  g[0] = -1;  g[1] = -1;  g[2] = 0;
  buffer = "";
  jaso = 0;
}

function johab( g ) {
  if ( g[0] >= 0 && g[1] >= 0 ) c = 0xAC00 + ( g[0] * 21 + g[1] ) * 28 + g[2];
  else if ( g[1] >= 0 ) c = 0x314f + g[1];
  else if ( g[0] >= 0 ) {
    switch ( g[0] ) {
      case  0: c = 0x3131; break;
      case  1: c = 0x3132; break;
      case  2: c = 0x3134; break;
      case  3: c = 0x3137; break;
      case  4: c = 0x3138; break;
      case  5: c = 0x3139; break;
      case  6: c = 0x3141; break;
      case  7: c = 0x3142; break;
      case  8: c = 0x3143; break;
      case  9: c = 0x3145; break;
      case 10: c = 0x3146; break;
      case 11: c = 0x3147; break;
      case 12: c = 0x3148; break;
      case 13: c = 0x3149; break;
      case 14: c = 0x314a; break;
      case 15: c = 0x314b; break;
      case 16: c = 0x314c; break;
      case 17: c = 0x314d; break;
      case 18: c = 0x314e; break;
      default: c = 0;
    }
  } else c = 0;
  return c;
}

function hangeul( s ) {
  h = "";
  for ( i = 0; i < s.length ; i++ ) {
    if ( s[i] == 0x0D ) h = h + "<br>";
    if ( s[i] ) h = h + ( "&#" + s[i] + ";" );
  }
  h = h + "<br>";
  return h;
}

function selectButton( key ) {
  id = 'key' + key;
  switch( key ) {
    case   1 : file = "kb_ga_slct.png"; break;
    case   2 : file = "kb_na_slct.png"; break;
    case   3 : file = "kb_ma_slct.png"; break;
    case   4 : file = "kb_sa_slct.png"; break;
    case   5 : file = "kb_aa_slct.png"; break;
    case 300 : file = "kb_accent_slct.png"; break;
    case 301 : file = "kb_accent_slct.png"; break;
    case 101 : file = "kb_ttang_slct.png"; break;
    case 102 : file = "kb_haneul_slct.png"; break;
    case 103 : file = "kb_saram_slct.png"; break;
    case 302 : file = "kb_punc_slct.png"; break;
    case 201 : file = "kb_ga_slct.png"; break;
    case 202 : file = "kb_na_slct.png"; break;
    case 203 : file = "kb_ma_slct.png"; break;
    case 204 : file = "kb_sa_slct.png"; break;
    case 205 : file = "kb_aa_slct.png"; break;
    case  -1 : id="key_back";   file = "kb_back_slct.png"; break;
    case   0 : id="key_space";  file = "kb_space_slct.png"; break;
    case  -2 : id="key_return"; file = "kb_return_slct.png"; break;
  }
  document.getElementById( id ).src = file;
}

function clearButton( key ) {
  id = 'key' + key;
  switch( key ) {
    case   1 : file = "kb_ga.png"; break;
    case   2 : file = "kb_na.png"; break;
    case   3 : file = "kb_ma.png"; break;
    case   4 : file = "kb_sa.png"; break;
    case   5 : file = "kb_aa.png"; break;
    case 300 : file = "kb_accent.png"; break;
    case 301 : file = "kb_accent.png"; break;
    case 101 : file = "kb_ttang_bb25.png"; break;
    case 102 : file = "kb_haneul_bb25.png"; break;
    case 103 : file = "kb_saram_bb25.png"; break;
    case 302 : file = "kb_punc.png"; break;
    case 201 : file = "kb_ga_bb50.png"; break;
    case 202 : file = "kb_na_bb50.png"; break;
    case 203 : file = "kb_ma_bb50.png"; break;
    case 204 : file = "kb_sa_bb50.png"; break;
    case 205 : file = "kb_aa_bb50.png"; break;
    case  -1 : id="key_back";   file = "kb_back.png"; break;
    case   0 : id="key_space";  file = "kb_space.png"; break;
    case  -2 : id="key_return"; file = "kb_return.png"; break;
  }
  document.getElementById( id ).src = file;
}

function sendEmail() {
  var mailtoButton = document.getElementById("email");
  var message = document.getElementById("text").innerHTML;
  //subject = message.replace(/\<br\>*/ig,"");
  message = message.replace(/\<br\>/ig,"");
  message = message.replace(/[\n\r]/g,"<br/>"); // works only for iPhone
  message = encodeURIComponent(message);
  //mailtoButton.href = "mailto:?subject=" + subject + "&body=" + message;
  mailtoButton.href = "mailto:?body=" + message;
  location.href = mailtoButton.href
  return false;
}

function gotoGoogle() {
  var googleButton = document.getElementById("google");
  var message = document.getElementById("text").innerHTML;
  message = message.replace(/\<br\>/ig,"");
  message = encodeURIComponent(message);
  googleButton.href = "http://www.google.com/search?q=" + message + "&ie=UTF-8&oe=UTF-8";
  location.href = googleButton.href;
  return false;
}

function gotoNaver() {
  var NaverButton = document.getElementById("naver");
  var message = document.getElementById("text").innerHTML;
  message = message.replace(/\<br\>/ig,"");
  message = encodeURIComponent(message);
  NaverButton.href = "http://search.naver.com/search.naver?where=nexearch&sm=tab_hty&query="+message+"&x=0&y=0&hw=1";
  location.href = NaverButton.href;
  return false;
}

function gotoDaum() {
  var DaumButton = document.getElementById("daum");
  var message = document.getElementById("text").innerHTML;
  message = message.replace(/\<br\>/ig,"");
  message = encodeURIComponent(message);
  DaumButton.href = "http://search.daum.net/search?q="+message;
  location.href = DaumButton.href;
  return false;
}

function gotoDic() {
  var DicButton = document.getElementById("dic");
  var message = document.getElementById("text").innerHTML;
  message = message.replace(/\<br\>/ig,"");
  message = encodeURIComponent(message);
  DicButton.href = "http://dic.search.naver.com/search.naver?where=endic&query="+message;
//  DicButton.href = "http://engdic.daum.net/dicen/search_result_total.do?q="+message;
  location.href = DicButton.href;
  return false;
}
