// window.onload = initAll;

var nospace = '<span class="nospace"></span>';

var space = " ";
var brk   = "<br />";
var err   = '*';

var showkata,showroma,hiraset,kataset;

function setGroup(n) { document.fform.group[n].checked = true; }

function getGroup() {
 for (var i=0; i < document.fform.group.length; i++) {
   if (document.fform.group[i].checked) return i;
 }
 return -1;
}

function setTable(n) { document.fform.group[n].checked = true; }

function getTable() {
 for (var i=0; i < document.fform.table.length; i++) {
   if (document.fform.table[i].checked) return i;
 }
 return -1;
}

function clearKana() { document.fform.kanaline.value = '' };
function clearRoma() { document.fform.romaline.value = '' };

function typeIn(j,i,n) {
var a,b;

 if (i<0) typeInIf(j,n);
 else {
  switch(n) {
   case 0:  // Monographs (gojūon)
    a = hmono[j][i]; b = kmono[j][i];
    break;
   case 1:  // Diacritics (gojūon with (han)dakuten)
    a = hdiac[j][i]; b = kdiac[j][i];
    break;
   case 2:  // Digraphs (yōon) 
    a = hdigr[j][i]; b = kdigr[j][i];
    break;
   case 3:  // Digraphs with diacritics (yōon with (han)dakuten)
    a = hdidi[j][i]; b = kdidi[j][i];
   //  break;
   // default : ;
  }
  document.fform.hiraline.value += a;
  document.fform.kataline.value += b;
  document.fform.hiraline.focus();
  // document.fform.hiraline.select();
 }
}
            
function typeInIf(j,n) {
var a,b;

 a=b='';
 switch(n) {
  case 0:  // Monographs (gojūon)
        if (j==0) { a = hmonox[1]; b = kmonox[1]; }
   else if (j==4) { a = hirattsu;  b = katattsu;  }
   else if (j==9) { a = hmonox[0]; b = kmonox[0]; }
   else return;
   break;
  case 1:  // Diacritics (gojūon with (han)dakuten)
   return;
  case 2:  // Digraphs (yōon) 
   if (j>1) return; else {a = hdigrx[0]; b = kdigrx[0];}
   break;
  case 3:  // Digraphs with diacritics (yōon with (han)dakuten)
   if (j>1) return; else {a = hdigrx[1]; b = kdigrx[1];}
  //  break;
  // default : ;
 }
 document.fform.hiraline.value += a;
 document.fform.kataline.value += b;
 document.fform.hiraline.focus();
}

function typeIf(j,n) {
var a,b,c;

 a=b=c='';
 switch(n) {
  case 0:  // Monographs (gojūon)
   if (j==0) {
    if (showkata) { a = hmonox[1]; b = rmonox[1]; c = kmonox[1]; }
    else break;
   }
   else if (j==1) { a = dakuten;   b = nbsp;      c = a; }
   else if (j==2) { a = handaku;   b = nbsp;      c = a; }
   else if (j==3) { a = hirattsu;  b = nbsp;      c = katattsu; }
   else if (j==9) { a = hmonox[0]; b = rmonox[0]; c = kmonox[0]; }
   break;
  case 1:  // Diacritics (gojūon with (han)dakuten)
   break;
  case 2:  // Digraphs (yōon) 
   if (j>1) break; else {a = hdigrx[0]; b = rdigrx[0]; c = kdigrx[0];}
   break;
  case 3:  // Digraphs with diacritics (yōon with (han)dakuten)
   if (j>1) break; else {a = hdigrx[1]; b = rdigrx[1]; c = kdigrx[1];}
  //  break;
  // default : ;
 }
 d='';
 if ((a.length) && (b.length) && (c.length)) {
  if (showkata) d+= kataLink(n,c); else d+= hiraLink(n,a);
  if (showroma) d+= sep+romaLink(b,-1,j,n); 
 }
 else d=nospace;
 return d;
}

var lastk='';

function findakut(x,t) {
var i,j,u,v;

 for (i=0;i<t.length;i++) {
  u=t[i]; v=u[0];
  for (j=0;j<v.length;j++) {if (v[j]==x) return u[1][j];}
 }
 return '';
}

function enterKana(k) {
var d,v;

 v = document.fform.kanaline.value;
 if (lastk.length) {
  if (k==dakuten) {
   d=findakut(lastk,dakut);
   if (d.length) {
    document.fform.kanaline.value = v.substr(0,v.length-1)+d;
    lastk=d;
   }
   return;
  }
  else if (k==handaku) {
   d=findakut(lastk,handa);
   if (d.length) {
    document.fform.kanaline.value = v.substr(0,v.length-1)+d;
    lastk=d;
   }
   return;
  }
 }
 document.fform.kanaline.value = v+k;
 lastk=k;
}

function hiraLink(n,x) {
var cl;

 // if ((n==0) && (x!='.') && (hiraset.indexOf(x)<0)) cl = 'hiragrey'; else if (n>1) cl='hiragana2'; else cl = 'hiragana';
 if ((n==0) && (x=='っ')) cl='hiragana2'; else if (n>1) cl='hiragana2'; else cl = 'hiragana';
 return '<span class="' + cl + '" onClick=enterKana("'+x+'")>'+x+'</span>';
}

function kataLink(n,x) {
var cl;

 // if ((n==0) && (x!='.') && (kataset.indexOf(x)<0)) cl = 'katagrey'; else if (n>1) cl='katakana2'; else cl = 'katakana';
 if ((n==0) && (x=='ッ')) cl='katakana2'; else if (n>1) cl='katakana2'; else cl = 'katakana';
 return '<span class="' + cl + '" onClick=enterKana("'+x+'")>'+x+'</span>';
}

function romaLink(c,i,j,n) { return '<span class="romaji">'+c+'</span>'; }

function getCell(n,i,j) {
var a,b,c,d;

 switch(n) {
 case 0:  // Monographs (gojūon)
  a = hmono[j][i]; b = kmono[j][i]; c = rmono[j][i]; break;
 case 1:  // Diacritics (gojūon with (han)dakuten)
  a = hdiac[j][i]; b = kdiac[j][i]; c = rdiac[j][i]; break;
 case 2:  // Digraphs (yōon) 
  a = hdigr[j][i]; b = kdigr[j][i]; c = rdigr[j][i]; break;
 case 3:  // Digraphs with diacritics (yōon with (han)dakuten)
  a = hdidi[j][i]; b = kdidi[j][i]; c = rdidi[j][i]; break;
 case 4:  // small wa,ya,yu,yo
  a = hwauo[i]; b = kwauo[i]; c = rwauo[i];      //  break;
 }
 d='';
 if ((a.length) && (b.length) && (c.length)) {
  if (showkata) d+= kataLink(n,b); else d+= hiraLink(n,a);
  if (showroma) d+= sep+romaLink(c,i,j,n); 
 }
 else d=nospace;
 return d;
}

function loadTable(n) {
var i,j,k,c,s,x,imax,jmax;
var ksth,kgwa,kuwa,nimi;

  switch(n) {
   case 0: imax=5; jmax=hmono.length; break;  // Monographs (gojūon)
   case 1: imax=5; jmax=hdiac.length; break;  // Diacritics (gojūon with (han)dakuten)
   case 2: imax=3; jmax=hdigr.length; break;  // Digraphs (yōon) 
   case 3: imax=3; jmax=hdidi.length; break;  // Digraphs with diacritics (yōon with (han)dakuten)
   case 4: imax=4; jmax=1; break;  // small wa,ya,yu,wo
  }
  s = "<table border=1 cellpadding=0 cellspacing=0><tr>";
  for (j=0;j<jmax;j++) {
    tdclass='spacer';
    s += '<tr>';
    x = nbsp;
    switch(n) {
     case 0:
      if ((j<4) || (j==(jmax-1))) { x=typeIf(j,n); tdclass='ntsu';}
      s+='<td align="center" class="'+tdclass+'">'+x+'</td>' ;
      break;
     case 2:
     case 3:
      if (j==0) { tdclass='kata'; x=typeIf(j,n); }
      s+='<td align="center" class="'+tdclass+'">'+x+'</td>' ;
     // break;
     // case 1:
     // case 4:
    }
    for (i=0;i<imax;i++) {
     tdclass='spacer';
     switch(n) {
      case 0:
       if ((j==1)||(j==3)) {if (i==1) tdclass='kataB'; else tdclass='kata';}
       else if (j==2) {if (i==1) tdclass='sayaB'; else tdclass='saya';}
       else if (j==7) {if ((i==0)||(i==2)||(i==4)) tdclass='saya';}
       else if ((j==9)&&(i==0)) tdclass='saya';
       else if (j==8) {if (i==1) tdclass='rauoB'; else tdclass='rauo';}
       else if (j==5) {if (i==1) tdclass='bapaB'; else tdclass='bapa';}
       else if ((i==1)&((j==4)||(j==6))) tdclass='spaceB';
       break;
      case 1:
       if (j==0) {if (i==1) tdclass='kataB'; else tdclass='kata';}
       else if (j==2) tdclass='kata';
       else if (j==1)  {if (i==1) tdclass='sayaB'; else tdclass='saya';}
       else if ((j==3)||(j==4)) {if (i==1) tdclass='bapaB'; else tdclass='bapa';}
       break;
      case 2:
       if ((j==0)||(j==2)) tdclass='kata';
       else if (j==1) tdclass='saya';
       else if (j==4) tdclass='bapa';
       else if (j==6) tdclass='rauo';
       break;
      case 3:
       if (j==0) tdclass='kata';
       else if (j==1) tdclass='saya';
       else if ((j==2)||(j==3)) tdclass='bapa';
       break;
      case 4:
       tdclass='saya';
       // break;
      }
      s += '<td align="center" class="' + tdclass + '">'+getCell(n,i,j) +'</td>';
    }
    s += "</tr>\n";
  }
  s+= "</table>";
  return s;
}

function kana2roma(s) {
var a,b,c,f,h,i,j,k,l,n,r,t;

 function kanamatch(n) {
  for (j=0;j<romahiratable.length;j+=2) {
   r=romahiratable[j];
   k=r.length;
   if (k<=n) {
    if(r==s.substr(i,k)) {
     i+=k-1;
     if (i && h) t+=space;
     h = false;
     return romahiratable[j+1];
    }
   } 
  }
  for (j=0;j<romakatatable.length;j+=2) {
   r=romakatatable[j];
   k=r.length;
   if (k<=n) {
    if(r==s.substr(i,k)) {
     i+=k-1;
     if (i && !h) t+=space;
     h = true;
     return romakatatable[j+1];
    }
   } 
  }
  return s.charAt(i)+space; // err;
 }

 m=t=v='';
 l = s.length;
 f = 0;
 h = false;
 for (i=0;i<l;i++) {
  c = s.charAt(i);
  if (i) {
   if (c=='っ') {f=1; continue;}
   if (c=='ッ') {f=2; continue;}
   if (i<(l-1)) {
    if (c=='ん') {f=-1; continue;}
    if (c=='ン') {f=-2; continue;}
   }
   if ((c=='う') && (v=='o')) {t+=v; continue;}   // "oo" can be written as either (oo) or (ou)   
   // if ((c=='い') && (v=='e')) {t+=v; continue;}   // "ee" can be written as either (ee) or (ei)
   if (c=='ー') {
    h = m.length;
    // if (h) t+=m.chartAt(h-1); else t+err;
    if (h) t+=m[h-1]; else t+err;
    continue;
   }
  }
  if (i==(l-1)) m=kanamatch(1); else m=kanamatch(2);
  v = m.charAt(m.length-1);
  // if (f) {
  c = m.charAt(0);
  switch (f) {
   case -2: if (kataK.indexOf(c)>=0) t+='n'; else t+=c; break;
   case -1: if (hiraK.indexOf(c)>=0) t+='n'; else t+=c; break;
   case  1: if (hiraK.indexOf(c)>=0) t+=c; else t+=err; break;
   case  2: if (kataK.indexOf(c)>=0) t+=c; else t+=err; // break;
   // case 0: // do nothing
  }
  f=0;
  // }
  t+=m;
 }
 return t;
}

function roma2hira(s) {

var a,b,h,i,j,k,l,n,r,t;

 function hiramatch(n) {
  for (j=romahiratable.length-1;j>0;j-=2) {
  r=romahiratable[j];
   k=r.length;
   if (k<=n) {
    if(r==s.substr(i,k)) {
     i+=k-1;
     return romahiratable[j-1];
    }
   } 
  }
  return err;
 }

 function hiradoubleK() {
  a = s.charAt(i);
  b = s.charAt(i+1);
  if (a==b) {
   if (hiraK.indexOf(a)>=0) return 1;
   if ((a=='m')||(a=='n')) return -1;
  }
  return 0;
 }

 t = '';
 l = s.length;
 for (i=0;i<l;i++) {
  if (s.charAt(i)==space) continue;
  else if (i==(l-1)) t+=hiramatch(1);
  else {
   x = hiradoubleK();
   if (x) {
     if (x>0) t+= 'っ'; else if (x<0) t+='ん'; else t+=err;
     continue;
   }
   else if ((i+2)==l) t+=hiramatch(2); else t+=hiramatch(3);
  }
 }
 return t;
}

function roma2kata(s) {

var a,b,h,i,j,k,l,n,r,t;

 function katamatch(n) {
  for (j=romakatatable.length-1;j>0;j-=2) {
   r=romakatatable[j];
   k=r.length;
   if (k<=n) {
    if(r==s.substr(i,k)) {
     i+=k-1;
     return romakatatable[j-1];
    }
   } 
  }
  return err;
 }
 
 function katadoubleK() {
  a = s.charAt(i);
  b = s.charAt(i+1);
  if (a==b) {
   if (kataK.indexOf(a)>=0) return 1; 
   if ((a=='m')||(a=='n')) return -1;
  }
  return 0;
 }

 function katadoubleV() {
  if (i==0) return false;
  a = s.charAt(i);
  b = s.charAt(i-1);
  if (a==b) {
   if ((a=='a')||(a=='i')||(a=='u')||(a=='e')||(a=='o')) return true;
  }
  return false;
 }
 
 t = '';
 l = s.length;
 for (i=0;i<l;i++) {
  if (s.charAt(i)==space) continue;
  else if (katadoubleV()) { t+='ー'; continue;}
  else if (i==(l-1)) t+=katamatch(1);
  else {
   x = katadoubleK();
   if (x) {
     if (x>0) t+= 'ッ'; else if (x<0) t+='ン'; else t+=err;
     continue;
   }
   else if (i==(l-2)) t+=katamatch(2); else t+=katamatch(3);
  }
 }
 return t;
}

function toKata() {
 var r = kana2roma(document.fform.kanaline.value);
 document.fform.romaline.value = r;
 document.fform.kanaline.value = roma2kata(r);
}

function toHira() {
 var r = kana2roma(document.fform.kanaline.value);
 document.fform.romaline.value = r;
 document.fform.kanaline.value = roma2hira(r);
}

function kana2roma2() { document.fform.romaline.value = kana2roma(document.fform.kanaline.value); }
function kana2roma1() { document.fform.romaline.value += kana2roma(document.fform.kanaline.value);}

function roma2kana1() {
 if (showkata) document.fform.kanaline.value += roma2kata(document.fform.romaline.value);
          else document.fform.kanaline.value += roma2hira(document.fform.romaline.value);
}

function roma2kana2() {
 if (showkata) document.fform.kanaline.value = roma2kata(document.fform.romaline.value);
          else document.fform.kanaline.value = roma2hira(document.fform.romaline.value);
}

