/* Author:  Muhammad Abdulla (muhammad@yulghun.com)
 * Version: 1.0 (Apr. 20, 2009)
 * License: GPL
 */


function do_convert() {
   var sf = get_src_value(); 
   var df = get_dest_value(); 

   var s = document.getElementById('stext');
   var str = "";

   if ( sf == df ) {
      set_dest_text(s.value);
      return;
   }

   str = to_unicode(sf, s.value);
   str = from_unicode(df, str);
   set_dest_text(str);
}

function to_unicode ( from, str ) {
   if ( from == 'unicode' ) {
      return str;
   } else if ( from == 'uly' ) {
      return uly2uy(str);
   } else if ( from == 'unipf' ) {
      return pf2br(str);
   } else if ( from == 'cyrillic' ) {
      return cyr2uy(str);
   } else if ( from == 'ak' ) {
      return ak2uni(str);
   }
}

function from_unicode ( to, str ) {
   if ( to == 'unicode' ) {
      return str;
   } else if ( to == 'unipf' ) {
      return br2pf(str); 
   } else if ( to == 'uly' ) {
      var s = uy2uly(str);
      s = uly2upper(s);
      return s;
   } else if ( to == 'cyrillic' ) {
      return uy2cyr(str);
   }
}

// make the first letters of sentences upper case
function uly2upper ( s ) {
   var up = true;
   var t, prev, u;

   if ( ! s || s.length == 0 ) {
      return "";
   }

   var arr = new Array( s.length ) ;

   for ( var i = 0; i < s.length ; i++ ) {
      t = s.charAt(i); 
      l = t.toLowerCase(); 
      u = t.toUpperCase(); 

      if ( l != u && up ) { // if character has upper case and upper case is requested
         arr[i] = u; 
         up = false;
      } else { // everything else
         arr[i] = t;

         if ( t == '?' || t == '!' || t == '\n' ) { // mark next letter to be in upper case for sentence ending marks.
            up = true;
         } else if ( t == ' ' && prev == '.' ) {
            up = true;
         }
      }

      prev = t;
   }

   return arr.join('');
}

function set_dest_text ( str ) {
   var d = document.getElementById('dtext');
   var f = document.getElementById('dform');
   var dform = 'text';

   if ( !d ) {
      return;
   }

   if ( f ) {
      dform = f.options[f.selectedIndex].value;
   }

   if ( dform == 'hex' ) {
      d.className = 'nonugbox';
      d.value = getNCR(str, 'hex'); 
   } else if ( dform == 'dec' ) {
      d.className = 'nonugbox';
      d.value = getNCR(str, 'dec'); 
   } else {
      var df = get_dest_value(); 
      if ( df == 'unicode' || df == 'unipf' ) {
         d.className = 'ugbox';
      } else {
         d.className = 'nonugbox';
      }
      d.value = str;
   }
}

function getNCR ( str, type ) {
   var tmp = "" ;
   var i, code, ch ;

   for ( i = 0 ; i < str.length ; i++ ) {
      code = str.charCodeAt(i) ;
      ch   = str.charAt(i) ;
      if ( code > 128 ) {
        if ( type == 'hex' ) {
           tmp += "&#X" + hex_from_dec(code) + ";" ;
        } else {
           tmp += "&#" + code + ";" ;
        }
      } else {
        tmp += ch; 
      }
   }

   return tmp ;
}

function hex_from_dec(num) {
    if (num > 65535) { return ("err!") }

    first = Math.round(num/4096 - 0.5);
    temp1 = num - first * 4096;
    second = Math.round(temp1/256 -0.5);
    temp2 = temp1 - second * 256;
    third = Math.round(temp2/16 - 0.5);
    fourth = temp2 - third * 16;

    return (""+getletter(first)+getletter(second)+getletter(third)+getletter(fourth));
}

function getletter(num) {
  if (num < 10) {
     return num;
  } else {
     if (num == 10) { return "a" }
     if (num == 11) { return "b" }
     if (num == 12) { return "c" }
     if (num == 13) { return "d" }
     if (num == 14) { return "e" }
     if (num == 15) { return "f" }
  }
}

function selchange(src)
{
   var s = document.getElementById(src);
   var d;

   if ( src == 'src' ) {
      d = document.getElementById('stext');
   } else if ( src == 'dest' ) {
      d = document.getElementById('dtext');
      if (d) {
         d.value = "";
      }
   }

   if ( !s || !d ) {
      return;
   }

   var sv = s.options[s.selectedIndex].value;

   if ( sv == 'unicode' || sv == 'unipf' ) {
      d.className = 'ugbox';

      if ( src == 'src' ) {
         imode = 0;
      }
   } else {
      d.className = 'nonugbox';
      if ( src == 'src' ) {
         imode = 1;
      }
   }
}

function get_src_value()
{
   var src = "uly";
   var d = document.getElementById("src");

   if ( d ) {
      src = d.options[d.selectedIndex].value;
   }

   return src;
}

function get_dest_value()
{
   var dest = "unicode";
   var d = document.getElementById("dest");

   if ( d ) {
      dest = d.options[d.selectedIndex].value;
   }

   return dest;
}

